diff --git a/.agents/skills b/.agents/skills new file mode 120000 index 0000000000..4ca0ec66cd --- /dev/null +++ b/.agents/skills @@ -0,0 +1 @@ +../.skills \ No newline at end of file diff --git a/.codex/hooks.json b/.codex/hooks.json deleted file mode 100644 index d689ffa1b6..0000000000 --- a/.codex/hooks.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "hooks": { - "PreToolUse": [ - { - "matcher": "Bash", - "hooks": [ - { - "type": "command", - "command": "/usr/bin/python3 \"$(git rev-parse --show-toplevel)/.codex/hooks/pre_tool_use_mcc_build_guard.py\"", - "statusMessage": "Checking MCC build command policy" - } - ] - } - ] - } -} diff --git a/.codex/hooks/pre_tool_use_mcc_build_guard.py b/.codex/hooks/pre_tool_use_mcc_build_guard.py deleted file mode 100644 index fb6d3c1b7b..0000000000 --- a/.codex/hooks/pre_tool_use_mcc_build_guard.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python3 -import json -import re -import sys - - -RAW_DOTNET_BUILD_RE = re.compile(r"(^|[\s;&|()])dotnet\s+build(\s|$)") -ABSOLUTE_DOTNET_BUILD_RE = re.compile(r"(^|[\s;&|()])/\S*dotnet\s+build(\s|$)") -RAW_DOTNET_PUBLISH_RE = re.compile(r"(^|[\s;&|()])dotnet\s+publish(\s|$)") -ABSOLUTE_DOTNET_PUBLISH_RE = re.compile(r"(^|[\s;&|()])/\S*dotnet\s+publish(\s|$)") - - -def main() -> int: - try: - payload = json.load(sys.stdin) - except json.JSONDecodeError: - return 0 - - command = payload.get("tool_input", {}).get("command", "") - if not isinstance(command, str) or not command: - return 0 - - if ABSOLUTE_DOTNET_BUILD_RE.search(command) or ABSOLUTE_DOTNET_PUBLISH_RE.search(command): - return 0 - - if RAW_DOTNET_BUILD_RE.search(command): - response = { - "hookSpecificOutput": { - "hookEventName": "PreToolUse", - "permissionDecision": "deny", - "permissionDecisionReason": ( - "Raw 'dotnet build' is blocked in this repository. " - "Use 'source tools/mcc-env.sh && mcc-build' instead so MCC temp-build routing stays active. " - "If you intentionally need the raw .NET CLI, call it by absolute path such as '/usr/bin/dotnet build ...' to bypass this guard." - ), - }, - "systemMessage": ( - "Blocked raw 'dotnet build'. Use 'source tools/mcc-env.sh && mcc-build'. " - "If you intentionally need raw .NET CLI behavior, call '/usr/bin/dotnet build ...' explicitly." - ), - } - json.dump(response, sys.stdout) - sys.stdout.write("\n") - elif RAW_DOTNET_PUBLISH_RE.search(command): - response = { - "hookSpecificOutput": { - "hookEventName": "PreToolUse", - "permissionDecision": "deny", - "permissionDecisionReason": ( - "Raw 'dotnet publish' is blocked in this repository. " - "Use 'source tools/mcc-env.sh && mcc-publish --rid ' instead so MCC publish defaults stay aligned with the repo workflow. " - "If you intentionally need the raw .NET CLI, call it by absolute path such as '/usr/bin/dotnet publish ...' to bypass this guard." - ), - }, - "systemMessage": ( - "Blocked raw 'dotnet publish'. Use 'source tools/mcc-env.sh && mcc-publish --rid '. " - "If you intentionally need raw .NET CLI behavior, call '/usr/bin/dotnet publish ...' explicitly." - ), - } - json.dump(response, sys.stdout) - sys.stdout.write("\n") - - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/.codex/skill b/.codex/skill new file mode 120000 index 0000000000..4ca0ec66cd --- /dev/null +++ b/.codex/skill @@ -0,0 +1 @@ +../.skills \ No newline at end of file diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000..7289a88fd1 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,17 @@ +.git +**/bin +**/obj +**/node_modules +docs +.skills +MCC-Skills +.claude +.agents +.codex +artifacts +configurations +plugins +data +MinecraftOfficial +**/.env +**/auth-tokens diff --git a/.github/workflows/build-and-release.yml b/.github/workflows/build-and-release.yml index 6c667ae10a..3b7e427997 100644 --- a/.github/workflows/build-and-release.yml +++ b/.github/workflows/build-and-release.yml @@ -1,246 +1,270 @@ -name: Build MCC and Documents +name: MCC 2.0 early-access release +run-name: MCC 2.0 Early Access Build ${{ inputs.build_number }} on: - push: - branches: - - master workflow_dispatch: - -env: - PROJECT: "MinecraftClient" - target-version: "net10.0" - dotnet-version: "10.0.x" - compile-flags: "--self-contained=true -c Release -p:UseAppHost=true -p:IncludeNativeLibrariesForSelfExtract=true -p:EnableCompressionInSingleFile=true -p:DebugType=Embedded -p:PublishSingleFile=true" + inputs: + build_number: + description: Early-access build number + required: true + default: '13' + type: string + +permissions: + contents: read +concurrency: + group: mcc-early-access-${{ github.ref }} + cancel-in-progress: false jobs: - determine-build: - runs-on: ubuntu-slim + plan: + runs-on: ubuntu-24.04 outputs: - skip: ${{ steps.check-skip.outputs.skip }} + tag: ${{ steps.plan.outputs.tag }} + title: ${{ steps.plan.outputs.title }} + stamp: ${{ steps.plan.outputs.stamp }} + notes: ${{ steps.plan.outputs.notes }} steps: - - name: Check skip CI - id: check-skip - run: | - LOWER=$(echo "$COMMIT_MSG" | tr '[:upper:]' '[:lower:]') - if echo "$LOWER" | grep -qE 'skip.?ci|ci.?skip'; then - echo "skip=true" >> $GITHUB_OUTPUT - else - echo "skip=false" >> $GITHUB_OUTPUT - fi - env: - COMMIT_MSG: ${{ github.event.head_commit.message }} - - fetch-translations: - strategy: - fail-fast: true - runs-on: ubuntu-latest - needs: determine-build - - if: ${{ needs.determine-build.outputs.skip != 'true' }} - - timeout-minutes: 15 - - steps: - - name: Check cache - uses: actions/cache/restore@v3 - id: cache-check - with: - path: ${{ github.workspace }}/* - key: "translation-${{ github.sha }}" - lookup-only: true - restore-keys: "translation-" - - - name: Checkout - if: steps.cache-check.outputs.cache-hit != 'true' - uses: actions/checkout@v3 - with: - fetch-depth: 0 - submodules: 'true' - - - name: Check Crowdin secrets - id: crowdin-check - run: | - if [ -z "$CROWDIN_PROJECT_ID" ] || [ -z "$CROWDIN_PERSONAL_TOKEN" ]; then - echo "available=false" >> $GITHUB_OUTPUT - else - echo "available=true" >> $GITHUB_OUTPUT - fi - env: - CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} - CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_TOKEN }} - - - name: Download translations from crowdin - uses: crowdin/github-action@v2.4.0 - if: steps.cache-check.outputs.cache-hit != 'true' && steps.crowdin-check.outputs.available == 'true' - with: - upload_sources: ${{ github.repository == 'MCCTeam/Minecraft-Console-Client' }} - upload_translations: false - download_translations: true - - localization_branch_name: l10n_master - create_pull_request: false - push_translations: false - - base_path: ${{ github.workspace }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} - CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_TOKEN }} - - - name: Save cache - uses: actions/cache/save@v3 - if: steps.cache-check.outputs.cache-hit != 'true' - with: - path: ${{ github.workspace }}/* - key: "translation-${{ github.sha }}" + - uses: actions/checkout@v5 + with: + persist-credentials: false + - id: plan + env: + BUILD_NUMBER: ${{ inputs.build_number }} + run: | + python3 - <<'PY' + import os, re + from pathlib import Path + if os.environ['GITHUB_REF'] != 'refs/heads/feat/mcc-2.0': + raise SystemExit('Run this workflow on feat/mcc-2.0.') + number = os.environ['BUILD_NUMBER'] + if not re.fullmatch(r'[1-9][0-9]{0,4}', number): + raise SystemExit('Use a positive build number with at most five digits.') + notes = f'docs/deployment/early-access-{number}.md' + if not Path(notes).is_file(): + raise SystemExit(f'Missing release notes: {notes}') + values = { + 'tag': f'v2.0.0-early-access.{number}', + 'title': f'MCC 2.0 Early Access Build {number}', + 'stamp': f'2.0.0+early-access.{number}.{os.environ["GITHUB_SHA"]}', + 'notes': notes, + } + with Path(os.environ['GITHUB_OUTPUT']).open('a') as output: + for key, value in values.items(): + output.write(f'{key}={value}\n') + PY - create-tag: - runs-on: ubuntu-slim - timeout-minutes: 5 # Wait 5 minutes in case of network issues/etc - needs: determine-build - if: ${{ needs.determine-build.outputs.skip != 'true' }} + documentation: + needs: plan + runs-on: ubuntu-24.04 steps: - - id: make-tag - run: | - TAG="$(date -u +'%Y%m%d')-${{ github.run_number }}" - echo "tag=$TAG" >> $GITHUB_OUTPUT - echo "TAG=$TAG" >> $GITHUB_ENV - - - name: Create Release Tag - uses: actions/github-script@v7 + - uses: actions/checkout@v5 with: - script: | - const tag = process.env.TAG; - try { - await github.rest.git.createRef({ - owner: context.repo.owner, - repo: context.repo.repo, - ref: `refs/tags/${tag}`, - sha: context.sha - }); - } catch(error) { - if (error.message.includes('already exists')) { - console.log(`Tag ${tag} already exists`); - } else { - throw error; - } - } - outputs: - build-tag: ${{ steps.make-tag.outputs.tag }} + persist-credentials: false + - uses: actions/setup-python@v6 + with: + python-version: '3.14' + - uses: actions/setup-node@v4 + with: + node-version: '22' + cache: npm + cache-dependency-path: docs/package-lock.json + - run: python tools/test_installers.py + - run: python tools/check_docs.py + - run: python tools/localization/generate_strings.py --check + - run: npm --prefix docs ci + - run: npm --prefix docs run docs:build + env: + NODE_OPTIONS: --max-old-space-size=6144 build: - runs-on: ubuntu-latest - # Check if we're not skipping build, tag is created, and translations successfully fetched (or skipped) - if: ${{ needs.determine-build.outputs.skip != 'true' && - needs.create-tag.result == 'success' && - (needs.fetch-translations.result == 'success' || needs.fetch-translations.result == 'skipped') - }} - needs: [determine-build, fetch-translations, create-tag] - timeout-minutes: 15 + needs: plan + timeout-minutes: 30 strategy: + fail-fast: false matrix: - target: [win-x86, win-x64, win-arm64, linux-x64, linux-arm, linux-arm64, osx-x64, osx-arm64] - + include: + - {rid: win-x86, os: windows-2025, execute: true} + - {rid: win-x64, os: windows-2025, execute: true} + - {rid: win-arm64, os: windows-11-arm, execute: true} + - {rid: osx-x64, os: macos-15-intel, execute: true} + - {rid: osx-arm64, os: macos-15, execute: true} + - {rid: linux-x64, os: ubuntu-24.04, execute: true} + - {rid: linux-arm64, os: ubuntu-24.04-arm, execute: true} + - {rid: linux-arm, os: ubuntu-24.04, execute: false} + - {rid: linux-musl-x64, os: ubuntu-24.04, execute: false} + - {rid: linux-musl-arm64, os: ubuntu-24.04, execute: false} + - {rid: linux-musl-arm, os: ubuntu-24.04, execute: false} + runs-on: ${{ matrix.os }} + defaults: + run: + shell: bash + env: + RELEASE_TAG: ${{ needs.plan.outputs.tag }} + RELEASE_STAMP: ${{ needs.plan.outputs.stamp }} + RELEASE_RID: ${{ matrix.rid }} + DOTNET_NOLOGO: true steps: - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 0 - submodules: 'true' - - - name: Get Current Date - run: | - echo date_dashed=$(date -u +'%Y-%m-%d') >> $GITHUB_ENV - - - name: Restore Translations (if available) - uses: actions/cache/restore@v3 - with: - path: ${{ github.workspace }}/* - key: "translation-${{ github.sha }}" - restore-keys: "translation-" - - - name: Setup .NET SDK - uses: actions/setup-dotnet@v4 - with: - dotnet-version: ${{ env.dotnet-version }} - - - name: Setup Environment Variables - run: | - PROJECT_PATH=${{ github.workspace }}/${{ env.PROJECT }} - FILE_EXT=${{ (startsWith(matrix.target, 'win') && '.exe') || '' }} - TARGET_OUT_PATH=$PROJECT_PATH/bin/Release/${{ env.target-version }}/${{ matrix.target }}/publish/ - - echo "project-path=$PROJECT_PATH" >> $GITHUB_ENV - echo "file-ext=$FILE_EXT" >> $GITHUB_ENV - echo "target-out-path=$TARGET_OUT_PATH" >> $GITHUB_ENV - echo "assembly-info=$PROJECT_PATH/Properties/AssemblyInfo.cs" >> $GITHUB_ENV - echo "build-version-info=${{ needs.create-tag.outputs.build-tag }}" >> $GITHUB_ENV - echo "commit=$(echo ${{ github.sha }} | cut -c 1-7)" >> $GITHUB_ENV - - - name: Setup Binaries Path - run: | - echo built-executable-path=${{ env.target-out-path }}${{ env.PROJECT }}${{ env.file-ext }} >> $GITHUB_ENV - - - name: Set Version Info - run: | - echo '' >> ${{ env.assembly-info }} - echo "[assembly: AssemblyConfiguration(\"GitHub build ${{ github.run_number }}, built on ${{ env.date_dashed }} from commit ${{ env.commit }}\")]" >> ${{ env.assembly-info }} - - - name: Inject Sentry DSN (if applicable) - if: ${{ github.repository == 'MCCTeam/Minecraft-Console-Client' }} - run: | - grep -q 'SentryDSN = "";' ${{ env.project-path }}/Program.cs || { echo "SentryDSN pattern not found in Program.cs"; exit 1; } - sed -i -e 's|SentryDSN = "";|SentryDSN = "${{ secrets.SENTRY_DSN }}";|g' ${{ env.project-path }}/Program.cs - - - name: Build Target - run: dotnet publish ${{ env.project-path }}/${{ env.PROJECT }}.csproj -f ${{ env.target-version }} -r ${{ matrix.target }} ${{ env.compile-flags }} - env: - DOTNET_NOLOGO: true - - - name: Rename Binary - run: | - mv ${{ env.built-executable-path }} ${{ env.PROJECT }}-${{ env.build-version-info }}-${{ matrix.target }}${{ env.file-ext }} - - - name: Upload Artifact - uses: actions/upload-artifact@v4 - with: - name: ${{ env.PROJECT }}-${{ env.build-version-info }}-${{ matrix.target }} - path: ${{ env.PROJECT }}-${{ env.build-version-info }}-${{ matrix.target }}${{ env.file-ext }} - if-no-files-found: error + - uses: actions/checkout@v5 + with: + persist-credentials: false + - run: git submodule update --init ConsoleInteractive + - uses: actions/setup-dotnet@v5 + with: + dotnet-version: 10.0.401 + - uses: actions/setup-python@v6 + with: + python-version: '3.14' + - name: Install x86 test runtimes + if: matrix.rid == 'win-x86' + shell: pwsh + run: | + Invoke-WebRequest https://dot.net/v1/dotnet-install.ps1 -OutFile $env:RUNNER_TEMP/dotnet-install.ps1 + foreach ($runtime in @('dotnet', 'aspnetcore')) { + & $env:RUNNER_TEMP/dotnet-install.ps1 -Channel 10.0 -Runtime $runtime -Architecture x86 -InstallDir "$env:RUNNER_TEMP/dotnet-x86" -NoPath + if (-not $?) { throw "x86 runtime installation failed" } + } + "DOTNET_ROOT_X86=$env:RUNNER_TEMP/dotnet-x86" >> $env:GITHUB_ENV + - name: Build and test on native targets + if: matrix.execute + run: | + dotnet build Mcc.slnx -c Release -p:ShouldUnsetParentConfigurationAndPlatform=false -p:InformationalVersion="$RELEASE_STAMP" -p:IncludeSourceRevisionInInformationalVersion=false + if [[ "$RELEASE_RID" == win-x86 ]]; then + dotnet test src/Mcc.Cli.Tests/Mcc.Cli.Tests.csproj -c Release --arch x86 -p:ShouldUnsetParentConfigurationAndPlatform=false -p:InformationalVersion="$RELEASE_STAMP" -p:IncludeSourceRevisionInInformationalVersion=false --logger 'trx;LogFileName=mcc.trx' --results-directory artifacts/test-results + else + dotnet test src/Mcc.Cli.Tests/Mcc.Cli.Tests.csproj -c Release --no-build --logger 'trx;LogFileName=mcc.trx' --results-directory artifacts/test-results + fi + - name: Verify every CLI test executed + if: matrix.execute + run: | + python3 - <<'PY' + import xml.etree.ElementTree as ET + from pathlib import Path + root = ET.parse('artifacts/test-results/mcc.trx').getroot() + counts = next(item.attrib for item in root.iter() if item.tag.rsplit('}', 1)[-1] == 'Counters') + for key in ('total', 'executed', 'passed'): + assert int(counts[key]) == 918, counts + assert int(counts['failed']) == 0, counts + print('All 918 CLI tests passed without skips.') + PY + - name: Publish self-contained single-file executable + run: | + dotnet publish src/Mcc.Cli/Mcc.Cli.csproj -c Release -r "$RELEASE_RID" --self-contained true -p:UseAppHost=true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -p:IncludeAllContentForSelfExtract=true -p:PublishTrimmed=false -p:DebugType=Embedded -p:ShouldUnsetParentConfigurationAndPlatform=false -p:InformationalVersion="$RELEASE_STAMP" -p:IncludeSourceRevisionInInformationalVersion=false -o artifacts/publish + cp LICENSE.md artifacts/publish/LICENSE.md + - name: Package archive and checksum + run: | + python3 tools/package-release.py artifacts/publish --tag "$RELEASE_TAG" --rid "$RELEASE_RID" --single-file --output artifacts/releases + mv artifacts/releases/SHA256SUMS "artifacts/releases/SHA256SUMS-$RELEASE_RID" + - name: Test the extracted distribution on its target + if: matrix.execute + run: | + python3 - <<'PY' + import os, subprocess + from pathlib import Path + archive = next(path for path in Path('artifacts/releases').iterdir() if path.suffix in ('.zip', '.gz')) + subprocess.run(['python3', 'tools/smoke-release.py', str(archive), '--stamp', os.environ['RELEASE_STAMP']], check=True) + PY + - uses: actions/upload-artifact@v6 + with: + name: mcc-release-${{ matrix.rid }} + path: artifacts/releases/* + if-no-files-found: error + - uses: actions/upload-artifact@v6 + if: always() && matrix.execute + with: + name: mcc-tests-${{ matrix.rid }} + path: artifacts/test-results - create-release: - runs-on: ubuntu-slim - needs: [create-tag, build] - if: ${{ needs.build.result == 'success' && needs.create-tag.result == 'success' }} + publish: + needs: [plan, documentation, build] + runs-on: ubuntu-24.04 + permissions: + contents: write + env: + GH_TOKEN: ${{ github.token }} + RELEASE_TAG: ${{ needs.plan.outputs.tag }} + RELEASE_TITLE: ${{ needs.plan.outputs.title }} + RELEASE_NOTES: ${{ needs.plan.outputs.notes }} steps: - - name: Download All Artifacts - uses: actions/download-artifact@v4 + - uses: actions/checkout@v5 with: - path: artifacts/ + fetch-depth: 0 + - uses: actions/download-artifact@v5 + with: + pattern: mcc-release-* + path: artifacts/releases merge-multiple: true - - - name: Truncate commit message for release name - id: release-name + - name: Verify the complete archive set run: | - SUBJECT=$(echo "$COMMIT_MSG" | head -n 1) - MAX=220 - TRUNCATED="${SUBJECT:0:$MAX}" - echo "name=${BUILD_TAG}: $TRUNCATED" >> $GITHUB_OUTPUT - env: - COMMIT_MSG: ${{ github.event.head_commit.message }} - BUILD_TAG: ${{ needs.create-tag.outputs.build-tag }} - - - name: Create Release - uses: ncipollo/release-action@v1.14.0 - with: - token: ${{ secrets.GITHUB_TOKEN }} - artifacts: "artifacts/**/*" - tag: ${{ needs.create-tag.outputs.build-tag }} - name: ${{ steps.release-name.outputs.name }} - generateReleaseNotes: true - artifactErrorsFailBuild: true - allowUpdates: true - makeLatest: true - omitBodyDuringUpdate: true - omitNameDuringUpdate: true - replacesArtifacts: true + python3 - <<'PY' + import hashlib, os + from pathlib import Path + directory = Path('artifacts/releases') + targets = ['win-x86', 'win-x64', 'win-arm64', 'osx-x64', 'osx-arm64', 'linux-x64', 'linux-arm64', 'linux-arm', 'linux-musl-x64', 'linux-musl-arm64', 'linux-musl-arm'] + checksums = [] + expected = set() + for target in targets: + extension = '.zip' if target.startswith('win-') else '.tar.gz' + name = f'Mcc-{os.environ["RELEASE_TAG"]}-{target}{extension}' + archive = directory / name + with archive.open('rb') as stream: + digest = hashlib.file_digest(stream, 'sha256').hexdigest() + line = f'{digest} {name}\n' + sidecar = directory / f'SHA256SUMS-{target}' + assert sidecar.read_text() == line, target + checksums.append(line) + expected.update((name, sidecar.name)) + assert {path.name for path in directory.iterdir()} == expected + (directory / 'SHA256SUMS').write_text(''.join(sorted(checksums))) + for sidecar in directory.glob('SHA256SUMS-*'): + sidecar.unlink() + PY + - name: Publish immutable early-access release + run: | + python3 - <<'PY' + import hashlib, json, os, subprocess + from pathlib import Path + def gh(*arguments): + return subprocess.check_output(['gh', *arguments], text=True) + tag = os.environ['RELEASE_TAG'] + reference = 'refs/tags/' + tag + existing = subprocess.run(['git', 'show-ref', '--verify', '--quiet', reference]) + if existing.returncode == 0: + revision = subprocess.check_output(['git', 'rev-parse', reference + '^{commit}'], text=True).strip() + assert revision == os.environ['GITHUB_SHA'], 'Release tag belongs to another commit.' + elif existing.returncode == 1: + subprocess.run(['git', 'config', 'user.name', 'github-actions[bot]'], check=True) + subprocess.run(['git', 'config', 'user.email', '41898282+github-actions[bot]@users.noreply.github.com'], check=True) + subprocess.run(['git', 'tag', '-a', tag, os.environ['GITHUB_SHA'], '-m', os.environ['RELEASE_TITLE']], check=True) + subprocess.run(['git', 'push', 'origin', reference], check=True) + else: + raise SystemExit('Cannot check the release tag.') + lookup = subprocess.run(['gh', 'release', 'view', tag, '--json', 'apiUrl'], capture_output=True, text=True) + if lookup.returncode: + if 'release not found' not in lookup.stderr.lower(): + raise SystemExit(lookup.stderr) + gh('release', 'create', tag, '--verify-tag', '--draft', '--prerelease', '--title', os.environ['RELEASE_TITLE'], '--notes-file', os.environ['RELEASE_NOTES']) + # The tag REST endpoint excludes drafts. Resolve their stable numeric API URL through gh. + endpoint = json.loads(gh('release', 'view', tag, '--json', 'apiUrl'))['apiUrl'] + release = json.loads(gh('api', endpoint)) + assets = {asset['name']: asset for asset in release['assets']} + files = sorted(Path('artifacts/releases').iterdir()) + assert not (set(assets) - {path.name for path in files}), 'Unexpected existing release assets.' + for path in files: + with path.open('rb') as stream: + digest = 'sha256:' + hashlib.file_digest(stream, 'sha256').hexdigest() + if path.name in assets: + assert assets[path.name].get('digest') == digest, 'Existing release bytes differ.' + else: + assert release['draft'], 'A published release cannot gain new assets.' + gh('release', 'upload', tag, str(path)) + uploaded = json.loads(gh('api', endpoint))['assets'] + assert len(uploaded) == 12 + for asset in uploaded: + path = Path('artifacts/releases') / asset['name'] + with path.open('rb') as stream: + digest = 'sha256:' + hashlib.file_digest(stream, 'sha256').hexdigest() + assert asset.get('digest') == digest, 'Uploaded asset checksum differs.' + gh('release', 'edit', tag, '--draft=false', '--prerelease', '--latest=false') + print(gh('release', 'view', tag, '--json', 'url', '--jq', '.url')) + PY diff --git a/.github/workflows/deploy-doc-only.yml b/.github/workflows/deploy-doc-only.yml deleted file mode 100644 index ba457093f6..0000000000 --- a/.github/workflows/deploy-doc-only.yml +++ /dev/null @@ -1,79 +0,0 @@ -name: Build Documents - -on: - schedule: - - cron: '45 0 * * *' - workflow_dispatch: - -jobs: - check-secrets: - runs-on: ubuntu-latest - outputs: - has-deploy-token: ${{ steps.check.outputs.has-deploy-token }} - steps: - - name: Check required secrets - id: check - run: | - if [ -z "$GH_PAGES_TOKEN" ]; then - echo "has-deploy-token=false" >> $GITHUB_OUTPUT - echo "::warning::GH_PAGES_TOKEN is not set, skipping documentation deployment." - else - echo "has-deploy-token=true" >> $GITHUB_OUTPUT - fi - env: - GH_PAGES_TOKEN: ${{ secrets.GH_PAGES_TOKEN }} - - Build: - runs-on: ubuntu-latest - needs: check-secrets - if: ${{ needs.check-secrets.outputs.has-deploy-token == 'true' }} - - steps: - - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 0 - submodules: 'true' - - - name: Check Crowdin secrets - id: crowdin-check - run: | - if [ -z "$CROWDIN_PROJECT_ID" ] || [ -z "$CROWDIN_PERSONAL_TOKEN" ]; then - echo "available=false" >> $GITHUB_OUTPUT - echo "::warning::Crowdin secrets not set, skipping translation download." - else - echo "available=true" >> $GITHUB_OUTPUT - fi - env: - CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} - CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_TOKEN }} - - - name: Download translations from crowdin - if: ${{ steps.crowdin-check.outputs.available == 'true' }} - uses: crowdin/github-action@v2.4.0 - with: - upload_sources: false - upload_translations: false - download_translations: true - - localization_branch_name: l10n_master - create_pull_request: false - push_translations: false - - base_path: ${{ github.workspace }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} - CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_TOKEN }} - - - name: Deploy Documentation Site - uses: jenkey2011/vuepress-deploy@master - env: - ACCESS_TOKEN: ${{ secrets.GH_PAGES_TOKEN }} - TARGET_REPO: MCCTeam/MCCTeam.github.io - TARGET_BRANCH: master - BUILD_SCRIPT: export NODE_OPTIONS=--max-old-space-size=8192 && yarn --cwd ./docs/ && yarn --cwd ./docs/ docs:build - BUILD_DIR: docs/.vuepress/dist - COMMIT_MESSAGE: Build from ${{ github.sha }} - CNAME: https://mccteam.github.io diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000000..6f627d63f2 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,31 @@ +name: Documentation +on: + push: + branches: [master, main, feat/mcc-2.0] + pull_request: + workflow_dispatch: +permissions: + contents: read +jobs: + docs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-node@v4 + with: + node-version: '22' + cache: npm + cache-dependency-path: docs/package-lock.json + - uses: actions/setup-python@v5 + with: + python-version: '3.14' + - run: python tools/test_installers.py + - run: python tools/check_docs.py + - run: npm --prefix docs ci + - run: npm --prefix docs run docs:build + env: + NODE_OPTIONS: --max-old-space-size=6144 + - uses: actions/upload-artifact@v4 + with: + name: mcc-documentation + path: docs/.vuepress/dist diff --git a/.github/workflows/mcc.yml b/.github/workflows/mcc.yml new file mode 100644 index 0000000000..034e366157 --- /dev/null +++ b/.github/workflows/mcc.yml @@ -0,0 +1,50 @@ +name: MCC CLI validation +on: + push: + branches: [master, main, feat/mcc-2.0] + pull_request: + workflow_dispatch: +permissions: + contents: read +jobs: + validate: + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v5 + - name: Initialize console dependency + run: git submodule update --init ConsoleInteractive + - uses: actions/setup-dotnet@v5 + with: + dotnet-version: 10.0.401 + - uses: actions/setup-python@v5 + with: + python-version: '3.14' + - name: Build + if: runner.os != 'Windows' + run: dotnet build Mcc.slnx -c Release -p:ShouldUnsetParentConfigurationAndPlatform=false + - name: Unit tests + if: runner.os != 'Windows' + run: dotnet test src/Mcc.Cli.Tests/Mcc.Cli.Tests.csproj -c Release --no-build --logger "trx;LogFileName=mcc.trx" --results-directory artifacts/test-results + - name: Build with Windows helper + if: runner.os == 'Windows' + shell: pwsh + run: .\tools\windows\build.ps1 + - name: Test with Windows helper + if: runner.os == 'Windows' + shell: pwsh + run: .\tools\windows\test.ps1 -NoBuild -DotnetArguments @('--logger', 'trx;LogFileName=mcc.trx', '--results-directory', 'artifacts/test-results') + - name: Smoke test Windows run helper + if: runner.os == 'Windows' + shell: pwsh + run: .\tools\windows\run.ps1 -ClientArguments @('--help-short') + - name: Check localization + run: python tools/localization/generate_strings.py --check + - uses: actions/upload-artifact@v4 + if: always() + with: + name: mcc-test-results-${{ matrix.os }} + path: artifacts/test-results diff --git a/.github/workflows/translations.yml b/.github/workflows/translations.yml new file mode 100644 index 0000000000..94f7ed8635 --- /dev/null +++ b/.github/workflows/translations.yml @@ -0,0 +1,61 @@ +name: Translations +on: + workflow_dispatch: + inputs: + upload_sources: + description: Upload the current MCC 2.0 sources to Crowdin + type: boolean + default: false +permissions: + contents: read +jobs: + translations: + runs-on: ubuntu-latest + env: + CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} + CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_TOKEN }} + steps: + - uses: actions/checkout@v5 + - run: git submodule update --init ConsoleInteractive + - name: Require Crowdin credentials + shell: bash + run: test -n "$CROWDIN_PROJECT_ID" && test -n "$CROWDIN_PERSONAL_TOKEN" + - name: Download reviewed translations + uses: crowdin/github-action@v2 + with: + upload_sources: ${{ inputs.upload_sources }} + upload_translations: false + download_translations: true + export_only_approved: true + skip_untranslated_files: true + push_translations: false + push_sources: false + create_pull_request: false + skip_ref_checkout: true + config: crowdin.yml + - uses: actions/setup-dotnet@v5 + with: + dotnet-version: 10.0.401 + - uses: actions/setup-node@v4 + with: + node-version: '22' + - uses: actions/setup-python@v5 + with: + python-version: '3.14' + - name: Compile and test translated resources + shell: bash + run: source tools/mcc-env.sh && mcc-test + - run: python tools/localization/generate_strings.py --check + - run: npm --prefix docs ci + - run: npm --prefix docs run docs:build + env: + NODE_OPTIONS: --max-old-space-size=6144 + - uses: actions/upload-artifact@v4 + with: + name: mcc-reviewed-translations + path: | + src/Mcc.Cli/**/*.*.resx + src/Mcc.Cli/bin/Release/net10.0/**/Mcc.Cli.resources.dll + docs/l10n + docs/.vuepress/ui + docs/.vuepress/dist diff --git a/.github/workflows/upload-translation-source-only.yml b/.github/workflows/upload-translation-source-only.yml deleted file mode 100644 index 91bf0d290b..0000000000 --- a/.github/workflows/upload-translation-source-only.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Upload translation sources - -on: - workflow_dispatch: - -jobs: - Sync: - runs-on: ubuntu-latest - - steps: - - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 0 - submodules: 'true' - - - name: Upload translation sources to crowdin - uses: crowdin/github-action@v1.6.0 - with: - upload_sources: true - upload_translations: false - download_translations: false - - localization_branch_name: l10n_master - create_pull_request: false - push_translations: false - - base_path: ${{ github.workspace }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} - CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_TOKEN }} diff --git a/.gitignore b/.gitignore index 8116dfed52..c1eb55e879 100644 --- a/.gitignore +++ b/.gitignore @@ -445,3 +445,16 @@ server.pid # Crowdin translation automation working directory /.crowdin-translate/ + +# MCC 2.0 generated output and private runtime state +/artifacts/ +/configurations/ +/plugins/ +/.env +**/.env + +# MCC 2.0 site and container state +/data/ +/docs/l10n/ +/docs/.vuepress/ui/*.json +!/docs/.vuepress/ui/en.json diff --git a/.gitmodules b/.gitmodules index 5ef4ed0f99..836972dbee 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,3 +2,6 @@ path = ConsoleInteractive url = https://github.com/breadbyte/ConsoleInteractive branch = main +[submodule "MCC-Skills"] + path = MCC-Skills + url = https://github.com/MCCTeam/MCC-Skills.git diff --git a/.skills/asd-ste100/LICENSE b/.skills/asd-ste100/LICENSE new file mode 100644 index 0000000000..cf3b9052d3 --- /dev/null +++ b/.skills/asd-ste100/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Dustin Yuchen Teng + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/.skills/asd-ste100/README.md b/.skills/asd-ste100/README.md new file mode 100644 index 0000000000..3d4ba0d629 --- /dev/null +++ b/.skills/asd-ste100/README.md @@ -0,0 +1,92 @@ +# ASD-STE100 Skill — Simplified Technical English for Agent Output + +A Claude Code skill that rewrites dense, ambiguous English into [ASD-STE100 Simplified Technical English](https://www.asd-ste100.org/) (STE) — the controlled-language standard the aerospace and defense industry built so aircraft maintenance instructions cannot be misread. + +This skill repurposes that same discipline for a different reader: an **AI agent** parsing another agent's output, a tool description, an error message, or an inter-agent instruction, with no human in the loop to resolve ambiguity. + +## Why STE, and Why for Agents + +STE exists because a misread instruction on an aircraft can kill people, and the intended readers were often not native English speakers with no author to call for clarification. The standard's fix: one meaning per word, active voice, simple tenses, one instruction per sentence, short sentences, no dropped words. + +An LLM agent parsing another agent's output is in a strikingly similar position — no back-channel, no way to ask "did you mean X or Y?" The same rules that keep a mechanic from misreading a torque spec keep a downstream agent from misreading a tool description or an inter-agent message. + +## Before / After + +| Before | After | +|---|---| +| "This tool will attempt to synchronize state across the various backends that have been configured, and if a conflict is detected it may resolve it automatically depending on the strategy that has been set, or otherwise it will surface the conflict for manual review." | "The tool tries to synchronize state across the configured backends. If it finds a conflict, it reads the configured strategy. If the strategy allows automatic resolution, the tool may resolve the conflict without a user. If the tool does not resolve the conflict, it reports the conflict for manual review." | +| "An error may have occurred while processing your request due to a possible mismatch in the expected data format, which could be caused by an outdated client version." | "Your request may have failed. The cause may be a data format that does not match what the server expects. An outdated client can cause this mismatch. Check your client version." | + +More examples, including illustrations of the official STE rules themselves, in [`examples/before-after.md`](examples/before-after.md). + +## What This Skill Does + +1. Picks a mode. **Strict** covers procedures, error messages, and tool descriptions. **STE-flavored** covers READMEs, PR descriptions, and explanatory prose. STE-flavored keeps the sentence discipline but not the fixed-vocabulary lockdown. +2. Reads the input English text for meaning. +3. Flags every rule violation sentence-by-sentence: ambiguous word choice, present-perfect/complex tense, passive voice with an unclear actor, multi-instruction sentences, oversized noun clusters, dropped words, sentences over length, phrasal verbs, nominalized actions, semicolons, hedge stacks, and marketing adjectives. +4. Rewrites each flagged sentence — without dropping any fact, condition, or scope qualifier from the original. If a shorter phrasing would lose required precision, it keeps the longer phrasing and flags the trade-off instead of silently simplifying. +5. Outputs the rewritten text on its own — no preamble, no mode announcement, no change summary — plus a one-line `Kept as-is:` note when it deliberately left something unsimplified. + +Ask for the reasoning ("show the diff", "which rules did it break") and it outputs a before/after table naming each rule instead. + +The structural rules it checks are mechanical — you can point at the word or punctuation mark that breaks each one. The rules that depend on ASD's dictionary are flagged as advisory rather than enforced, and the rules that need taste are left to you. + +It does **not** reproduce ASD's official ~900-word approved dictionary. The standard is free to obtain but not free to redistribute: Issue 9 permits reproduction only with ASD's written authority, or by eight listed categories of organisation that this project does not belong to. This skill applies the underlying *principle* (plainest available word, used the same way every time) rather than checking against a fixed word list. For certified STE-compliant documentation, use the real standard. + +Full rule summary and citations: [`references/writing-rules.md`](references/writing-rules.md). + +## Installation + +### Quick Install (npx skills) + +The fastest way to install this skill is the [skills CLI](https://skills.sh/) — no clone, no path setup. Run it from your project root: + +```bash +npx skills add danyuchn/asd-ste100-skill +``` + +This pulls the skill from the GitHub repo and installs it for the current project. The CLI sends anonymous install telemetry (skill name and timestamp, no personal or device information) to help rank skills on the skills.sh leaderboard. Set `DISABLE_TELEMETRY=1` to opt out. + +Update later with `npx skills update`. + +### Clone + +```bash +git clone https://github.com/danyuchn/asd-ste100-skill ~/.claude/skills/asd-ste100 +``` + +This clones the repo into `~/.claude/skills/`, making the skill available in every Claude Code project. Best for contributors and anyone who wants a live checkout that updates with `git pull`. + +## Usage + +Trigger with a request to simplify or clarify English text: + +``` +Disambiguate this tool description +Rewrite this error message so an agent can't misparse it +Apply ASD-STE100 to this instruction +``` + +Or paste text and ask Claude to "disambiguate this" / "apply STE100 to this" / "reduce ambiguity in this output." + +You get the rewritten text back and nothing else. To see which rules were applied, add "show the diff" or "explain the changes" to the request. + +## Scope + +Built for: agent-to-agent messages, tool/function descriptions, error messages, system prompts, inter-agent instructions — any English text a machine or non-native reader has to parse without a human to ask. + +Not built for: creative writing, marketing copy, or anything where voice and nuance are the point — STE is deliberately flat and literal by design. + +One limit worth stating up front: this fixes the form of a text, not its substance. A paragraph with nothing to say comes out short, clean, and still empty. + +## Sources + +- [ASD-STE100 official site](https://www.asd-ste100.org/) +- [ASD-STE100 — About STE](https://www.asd-ste100.org/about_STE.html) +- [ASD Europe — Simplified Technical English](https://www.asd-europe.org/standards-specifications/simplified-technical-english/) +- [Simplified Technical English — Wikipedia](https://en.wikipedia.org/wiki/Simplified_Technical_English) +- [TechScribe — ASD-STE100 Simplified Technical English](https://www.techscribe.co.uk/techw/asd-simplified-technical-english.htm) + +## License + +MIT — see [LICENSE](LICENSE). diff --git a/.skills/asd-ste100/SKILL.md b/.skills/asd-ste100/SKILL.md new file mode 100644 index 0000000000..3adcffcbce --- /dev/null +++ b/.skills/asd-ste100/SKILL.md @@ -0,0 +1,140 @@ +--- +name: asd-ste100 +description: "Use when English text must be parsed without a human to resolve ambiguity — tool descriptions, error messages, inter-agent instructions, system prompts, status reports — and misreading has a real cost, or when text reads as dense, hedged, or easy to misparse. Triggers: disambiguate, STE100 rewrite, apply Simplified Technical English, plain-language rewrite, controlled-language rewrite, rewrite so an agent cannot misread this. Not for creative or marketing copy." +metadata: + version: 0.4.0 +--- + +# Simplified Technical English (ASD-STE100) + +ASD-STE100 is a controlled-language standard built by the aerospace and defense industry (ASD, the AeroSpace and Defense Industries Association of Europe) to stop maintenance technicians from misreading English instructions. The standard removes the two biggest sources of misreading: words with more than one meaning, and sentences with more than one possible structure. + +This skill borrows that same discipline for a different reader: an **AI agent or a downstream system** that has to parse an English string — an error message, a tool description, an inter-agent instruction, a status report — without a human in the loop to resolve ambiguity. If a maintenance technician can misread "close the valve" as an adjective ("the valve that is near") instead of a command, so can a language model. + +## When to Use This Skill + +- An agent's output (explanation, instruction, log message, tool description) reads as dense, jargon-heavy, or ambiguous. +- Text will be consumed by another agent, a translation pipeline, or a non-native English reader, and misparsing has a real cost. +- You are writing a prompt, system message, or tool description and want to remove ambiguity before a model ever sees it. +- You want a **before/after** comparison showing exactly which rule was violated and how the rewrite fixes it. Ask for it — the default output is the rewritten text alone (see Output Format). + +This skill is not for creative or marketing copy — STE is deliberately flat and literal. Do not apply it to text where voice, nuance, or persuasion is the point. + +## Two Modes + +Pick a mode before rewriting. If the user does not say which, infer from the text type and state the choice in one line. + +**Strict** — procedures, error messages, tool and function descriptions, inter-agent instructions, safety text. Anywhere a wrong reading has a cost. Apply every rule below, including the hard length caps and one-word-one-meaning discipline. + +**STE-flavored** — READMEs, PR descriptions, changelogs, explanatory prose. Apply the structural rules in full and treat the lexical rules as advisory (see Core Rewrite Rules for that split). In practice that means keeping the sentence length caps, active voice, simple tenses, no phrasal verbs, no semicolons, no nominalization and no marketing adjectives, while dropping the one-word-one-meaning lockdown: prose needs some range, and a strict rewrite of prose reads as a personality transplant rather than a clarification. + +The two modes and the structural/lexical split are the same distinction seen from two directions. The split says which rules this skill can verify without ASD's dictionary. The modes say which of them to enforce for a given kind of text. + +## Source and Scope + +This skill encodes the **rule categories** of ASD-STE100 Issue 9 (Jan 2025): 53 writing rules across 9 sections covering word choice, grammar, sentence structure, and style, backed by a dictionary of ~900 approved words (one meaning, one part of speech each) and ~1,200 words to avoid with suggested replacements. See `references/writing-rules.md` for the full rule summary and citations. + +It does **not** reproduce ASD's ~900-word approved dictionary verbatim. ASD-STE100 is free to obtain, but it is not free to redistribute: Issue 9, page 2 states that "no reproduction or publication of it, in whole or in part, shall be made without the written authority of an officer of ASD," and grants free reproduction rights only to eight listed categories (ASD/AIA/AIAC member associations and their member companies and customers, member-state defence ministries, A4A, airworthiness authorities, and universities and research institutes for educational purposes). This project is in none of them, so the dictionary stays out of this repo. + +Instead, this skill applies the *underlying principle* (pick the plainest, most common word available and use it the same way every time) rather than checking against a fixed word list. When exact ASD-approved wording matters (e.g. actual aircraft maintenance documentation), get the standard and check word-by-word against the real dictionary. Request it from the [official downloads page](https://www.asd-ste100.org/STE_downloads.html) — note that this is a request form that emails you a link, not a direct download. + +## Core Rewrite Rules + +STE's rules divide into two kinds, and this skill can only fully deliver one of them. **Structural rules** are self-contained: they describe sentence shape, and you can apply them from the description alone. **Lexical rules** are defined entirely by the official ~900-word dictionary, which this skill deliberately does not reproduce (see Source and Scope). Without that dictionary, the lexical rules degrade from a checkable standard into a preference for plain words. + +Apply the structural rules with confidence. Apply the lexical rules as a direction of travel, and say so in your output rather than implying dictionary compliance you cannot verify. + +### Structural rules — apply these + +| Rule | Do | Don't | +|---|---|---| +| Active voice | "The agent deletes the file." | "The file is deleted (by the agent)." — unless the actor is genuinely unknown or irrelevant | +| No phrasal verbs (Rule 9.3) | "Remove the panel." / "Start the job." | "Take off the panel." / "Spin up the job." — a two-word verb has meanings the parts do not predict | +| One instruction per sentence | "Open the file. Read line 3." | "Open the file and read line 3, then check if it matches." | +| Sentence length | ≤20 words for instructions/procedures, ≤25 words for descriptions | Long compound/subordinate-clause sentences | +| No semicolons (Rule 8.1) | Split into separate sentences | Any semicolon at all — STE bans the mark outright, not only as a clause join. (Rule 8.1 permits every other standard punctuation mark. The em dash is *not* banned by STE, though it often signals a sentence that should be split.) | +| Noun clusters | ≤3 words stacked as a noun phrase ("fuel pump valve") | 4+ word noun stacks ("high pressure fuel pump inlet valve assembly") | +| No ellipsis | Keep the subject, verb, and article explicit even if it reads longer | Drop words to save space ("Files not backed up will be lost" → ambiguous which files) | +| Keep modality | "The request **may have** failed." stays "may have" | Promote a hedge to a fact ("The request failed.") or invent a certainty the source did not state | +| Paragraph limits | One topic per paragraph, ≤6 sentences | Multi-topic paragraphs | +| Lists for sequences | Use a numbered or bulleted list for 3+ steps or conditions | Bury a sequence inside one prose sentence | + +### Lexical rules — direction of travel only + +| Rule | Do | Don't | Why it is weaker here | +|---|---|---|---| +| One word, one meaning | Pick one verb for one action and reuse it every time (e.g. always "check", never mix "check"/"verify"/"confirm" for the same action) | Rotate synonyms for the same idea across a document | Consistency within a document is checkable. Which word is the *approved* one is not, without the dictionary. | +| One part of speech per word | "Apply oil to the valve" (oil = noun) | "Oil the valve" (oil = verb) | Whether "oil" is approved as a noun only is a dictionary fact. Prefer the noun form when both read equally well. Do not claim compliance. | +| Verb, not noun (Rule 3.7) | "Analyze the log." | "Perform an analysis of the log." — a noun form of an action makes the sentence longer and hides who acts | Rule 3.7 says "use an **approved** verb to describe an action." Preferring the verb form is safe to apply anywhere. Knowing which verb is the approved one needs the dictionary. | +| Domain terms | Keep necessary technical nouns/verbs, but define them once if not common English (STE allows a project-specific glossary beyond its base dictionary) | Use jargon without ever defining it | The glossary allowance is real STE, but the base dictionary it extends is absent. | + +### Simple tenses — apply with one exception + +STE permits infinitive, imperative, simple present, simple past, simple future, and past participle as adjective. It excludes present perfect and other compound forms: "we received the report", not "we have received the report". + +Aircraft manuals never need present perfect, so the exclusion costs the standard nothing. Other text is not always so lucky. "The job has completed" (and its output is available now) and "the job completed" (at some past point) are different statements, and status text frequently needs the first. **Where the compound form carries information the simple form cannot — current relevance, or a hedge as in "may have failed" — keep it and flag the departure.** Elsewhere, follow the rule. + +## Scan Checklist + +These six habits cover most of what makes machine-written English hard to parse. Each one is mechanical: you can point at the exact word or punctuation mark that breaks the rule, with no judgment call. Scan for all six before you rewrite anything. + +1. **Synonym rotation** — the same thing gets several names in one document ("the user", "the customer", "the client"). The reader cannot tell whether they are one thing or three. Fix: pick one name, use it every time. +2. **Hedge stacking** — helper verbs and qualifiers pile up until the sentence asserts nothing ("it is important to note that this may potentially help to improve"). Fix: state the claim, or delete it. +3. **Nominalization** — an action frozen into a noun ("perform an analysis of", "provides assistance to"). Fix: use the verb ("analyze", "helps"). +4. **Marketing adjectives** — words that claim quality instead of showing it: seamless, robust, powerful, cutting-edge, effortless, blazing-fast. Fix: delete, or replace with the measurement that earns the claim. +5. **Run-on sentences** — several ideas joined by semicolons or em dashes. Fix: one idea per sentence. +6. **Soft phrasal verbs** — spin up, reach out, dive into, kick off. Fix: use the single plain verb (start, contact, read, begin). + +## Process + +1. Pick the mode (Strict or STE-flavored). Say which only when the user asked for the rule table — see Output Format. +2. Read the input text once for meaning — do not start rewriting before you understand what it must still say afterward. +3. Walk it sentence by sentence. Flag every rule violation from the Core Rewrite Rules tables and every habit from the Scan Checklist. In STE-flavored mode, flag the lexical rules but do not enforce them. For a mechanical first pass over the structural rules, run `scripts/ste-lint.py` (stdin or file args, `--json` for structured output); it checks semicolons, sentence length, phrasal verbs, nominalization, marketing adjectives, synonym rotation, passive voice, and compound tenses, and by design never flags hedges or modality. `--baseline N` tolerates N hard violations (for adopting on existing docs); `--disable rule1,rule2` silences named rules. +4. Rewrite each flagged sentence to fix the violation while preserving the original meaning exactly. If a rewrite would drop necessary precision (a safety condition, a scope qualifier, a number), keep the longer phrasing and flag it instead of silently simplifying. + - **Check modality before you commit to a rewrite.** Hedges ("may", "could", "sometimes", "is likely to") carry the author's confidence, and confidence is content. A shorter sentence that upgrades a hedge to a fact is not a simplification — it is a different claim. This is the most common way a well-intentioned STE rewrite goes wrong, because hedges are exactly what a length cap tempts you to cut. + - Never add a fact the source did not state. A rewrite that reads better because it supplies a cause, a frequency, or a mechanism has stopped being a rewrite. +5. Output the rewritten text (see Output Format). Keep the mode choice and the rule analysis internal unless the user asked to see them. +6. If the input already complies, say so — do not force changes onto compliant text. + +## Output Format + +**Default: the rewritten text, and nothing else.** Most callers want a result they can paste straight into a tool description, an error string, or a prompt. Print the simplified text on its own. Do not add a preamble about this skill, a mode announcement, a violation count, a summary of what changed, a rule table, or a closing offer to explain further. + +The one permitted addition: if step 4 kept a longer phrasing on purpose, add a single line after the text, prefixed `Kept as-is:`, naming the phrase and the precision that would have been lost. Omit the line when there is nothing to report. + +**On request: the rule table.** When the user asks to see the reasoning — "show the diff", "which rules did it break", "explain the changes", "before/after" — output this table instead: + +```markdown +| Rule violated | Original | Simplified | +|---|---|---| +| Present perfect tense | "We have received your request." | "We received your request." | +| Noun cluster (4+ words) | "the agent task queue priority handler" | "the handler that sets task-queue priority" | + +Mode: Strict. 7 violations found. +``` + +Follow the table with a one-line note on anything you deliberately did **not** simplify, and why (usually: simplifying would lose required precision). + +## Boundaries + +**Will:** +- Rewrite ambiguous or dense English into short, single-meaning, active-voice sentences. +- Return the rewritten text alone by default, and name the rules it applied when the user asks. +- Preserve every fact, condition, and scope qualifier in the original. +- Preserve the strength of every hedge, and add no claim the source did not make. +- Suggest a one-line glossary entry for domain terms that must stay. + +**Will not:** +- Reproduce ASD's official ~900-word dictionary as if it were memorized verbatim — always treat the official download as the source of truth for exact approved wording. +- Simplify creative, marketing, or persuasive copy where voice and nuance are the point. +- Silently drop a safety condition, exception, or scope qualifier to shorten a sentence — it will flag the trade-off instead. +- Convert "may have failed" into "failed", or "could be caused by X" into "X is the cause" — losing a hedge changes the claim. +- Guarantee an aerospace/defense-grade STE-compliant document. This is a general-purpose clarity tool inspired by STE, not a certified STE authoring tool. +- Make weak content true or useful. STE fixes the *form* of a text, not its substance. A hollow paragraph rewritten under these rules becomes a clean, short, well-punctuated hollow paragraph. If the text has nothing to say, no rewrite fixes that — say so instead of polishing it. +- Shorten past the point of clarity. Cutting words is not the goal. Removing ambiguity is the goal. Past a certain point compression starts costing the reader time rather than saving it, so stop when the sentence is unambiguous, not when it is shortest. + +## Additional Resources + +- **`references/writing-rules.md`** — fuller summary of the 9 rule sections and dictionary structure, with citations to the official standard and secondary sources. +- **`examples/before-after.md`** — worked examples, including official STE examples and agent-output examples built for this skill. +- **`scripts/ste-lint.py`** — deterministic, stdlib-only linter for the structural rules, plus a synonym-rotation check (one word, one meaning) scoped per file. Exit 1 when hard violations exceed `--baseline` (default 0); advisory findings (passive voice, compound tenses) never fail the run; `--disable` silences named rules. It never flags hedges or modality: those are content, not style, and `--selftest` asserts that "may have failed" passes clean. diff --git a/.skills/asd-ste100/examples/before-after.md b/.skills/asd-ste100/examples/before-after.md new file mode 100644 index 0000000000..88eebf30f2 --- /dev/null +++ b/.skills/asd-ste100/examples/before-after.md @@ -0,0 +1,92 @@ +# Before / After Examples + +## Part 1 — Official STE Examples + +These illustrate real ASD-STE100 rules, drawn from public secondary sources (see `references/writing-rules.md`). They are paraphrased illustrations of the rule, not quotes from the standard itself. + +| Rule | Before | After | Why | +|---|---|---|---| +| One meaning per word | "Verify the system." / "Check the connections." / "Confirm receipt." | "Make sure the system is correct." (one approved term used consistently) | Three near-synonyms force the reader to guess whether they mean the same action. | +| One part of speech per word | "Oil the valve." | "Apply oil to the valve." | If "oil" is approved only as a noun, using it as a verb breaks the one-word-one-role guarantee. | +| Precise verb meaning | "Follow the safety instructions." | "Obey the safety instructions." | "Follow" can mean "come after" or "obey" — STE picks the unambiguous one. | +| Simple tense only | "We have received the technical reports from HQ." | "We received the technical reports from HQ." | Present perfect adds a second parse ("received, and still relevant now?") that simple past avoids. | +| Verb, not noun | "Perform an inspection of the filter." | "Inspect the filter." | The noun form hides the action and adds a filler verb that carries no meaning. | +| No phrasal verbs | "Take off the access panel." | "Remove the access panel." | "Take off" also means "depart" and "deduct" — the two words together do not predict the meaning. | + +## Part 2 — Applied to Agent Output + +These are original examples built for this skill's actual use case: rewriting AI agent output so another agent, a translation layer, or a non-native reader can parse it without ambiguity. They are illustrations, not quotes from any real system. + +Word counts below are whitespace-separated tokens (`text.split()`), punctuation not counted separately. A different tokenizer will produce a different number. + +### Example A — Tool description + +**Before:** +> This tool will attempt to synchronize state across the various backends that have been configured, and if a conflict is detected it may resolve it automatically depending on the strategy that has been set, or otherwise it will surface the conflict for manual review. + +**Violations flagged:** +- Two instructions in one sentence (sync + resolve/surface). +- Present perfect in the relative clauses ("have been configured", "has been set"). +- 44 words, far over the 25-word descriptive cap. + +Note what is *not* flagged: "will attempt to" and "may resolve". Those are hedges, not violations. The tool is not promised to succeed, and the rewrite must not promise it either. + +**After:** +> The tool tries to synchronize state across the configured backends. If it finds a conflict, it reads the configured strategy. If the strategy allows automatic resolution, the tool may resolve the conflict without a user. If the tool does not resolve the conflict, it reports the conflict for manual review. + +The last sentence branches on whether the conflict was resolved, not on what the strategy allows. That is what "or otherwise" meant in the original: the fallback covers a permitted resolution that still did not happen. + +### Example B — Error message + +**Before:** +> An error may have occurred while processing your request due to a possible mismatch in the expected data format, which could be caused by an outdated client version. + +**Violations flagged:** +- One sentence carrying three separate claims (an error occurred, a format mismatch, a client version). +- 28 words, over the descriptive cap. + +Not flagged: "may have occurred" and "could be caused by". The message is written by a system that does not know what went wrong. Both hedges are accurate reporting of that ignorance. + +**After:** +> Your request may have failed. The cause may be a data format that does not match what the server expects. An outdated client can cause this mismatch. Check your client version. + +**This example is the reason the modality rule exists.** An earlier version of this file rewrote the first sentence as "The request failed", and the third as "an outdated client **is the most common cause**". Both read better. Both are wrong: the first asserts a failure the system only suspects, and the second invents a frequency claim that appears nowhere in the input. A rewrite that supplies a cause, a frequency, or a mechanism has stopped being a rewrite. + +Note also that "may have failed" keeps a compound verb form that the simple-tense rule would otherwise remove. **When the tense rule and the modality rule conflict, modality wins** — dropping the auxiliary here would delete the uncertainty along with the tense. + +### Example C — Inter-agent instruction + +**Before:** +> Once the upstream job has completed and assuming no errors were raised, the downstream agent should proceed to consume the output artifact, though it is worth noting that partial artifacts are sometimes produced under timeout conditions. + +**Violations flagged:** +- Present perfect ("has completed") and subordinate-clause stacking ("assuming...", "though it is worth noting..."). +- One sentence, three separate facts (completion condition, next action, edge-case warning). +- 36 words, over the 20-word instruction cap. + +**After:** +> Wait for the upstream job to finish with no errors. Then read the output artifact. Warning: a timeout can produce a partial artifact. Check that the artifact is complete before you use it. + +Two deliberate calls worth stating rather than hiding: +- "should proceed to consume" became the imperative "read". STE permits this for instructions, where a recommendation addressed to the executing agent is a command. Do not make the same move in descriptive text. +- The final sentence is **new**. The original warned about partial artifacts without saying what to do about it. Adding the check makes the warning actionable, but it is added content, so it is called out here rather than passed off as a rewrite. If the source's silence was deliberate, drop the sentence. + +### Example D — README prose (STE-flavored mode) + +**Before:** +> Our caching layer is designed to slot seamlessly into your existing stack with minimal friction and no vendor lock-in; it leverages semantic similarity to dramatically reduce the cache misses that traditionally plague LLM workloads. + +**Violations flagged:** +- Marketing adjectives and claims without measurement ("seamlessly", "minimal friction", "dramatically"). +- Semicolon joining two separate ideas. +- Nominalization and soft phrasing ("is designed to slot into", "leverages"). +- 34 words, over the 25-word descriptive cap. + +**After:** +> A normal cache matches requests by exact text, so a small change in wording causes a cache miss. This cache compares the meaning of a new prompt against the prompts it already holds. It runs alongside your current stack and stores no data outside it. + +Flavored mode kept the explanatory rhythm and did not force one fixed term per concept. It still cut the marketing adjectives, the semicolon, and the length. + +## How to Read These Examples + +Part 1 shows the actual rules this skill is built on. Part 2 shows the transfer: the same discipline — one meaning per word, active voice, simple tense, one instruction per sentence, explicit conditions instead of buried subordinate clauses — makes machine-to-machine and cross-language text safer to parse, not just aircraft manuals. diff --git a/.skills/asd-ste100/references/writing-rules.md b/.skills/asd-ste100/references/writing-rules.md new file mode 100644 index 0000000000..9e291425b0 --- /dev/null +++ b/.skills/asd-ste100/references/writing-rules.md @@ -0,0 +1,59 @@ +# ASD-STE100 Writing Rules — Summary and Sources + +This file summarizes the public, official description of ASD-STE100 (Simplified Technical English). It paraphrases rule *categories*. It does not reproduce the standard's text or its ~900-word dictionary verbatim. For the authoritative document, request the free download at the official site. + +## What ASD-STE100 Is + +ASD-STE100 is a controlled natural language, first released in 1986 (as AECMA Document PSC-85-16598) by what is now ASD (the AeroSpace and Defense Industries Association of Europe). It was built at the request of European airlines — most staffed by non-native English speakers — who needed maintenance documentation that could not be misread, because a misread instruction on an aircraft can kill people. The standard is maintained by the Simplified Technical English Maintenance Group (STEMG) and has been free to download since Issue 6 (2013). The current edition is Issue 9 (January 2025). + +## Structure + +- **53 writing rules across 9 sections** covering word choice, grammar, sentence structure, and style. +- **A dictionary** of roughly 900 approved words, each restricted to one meaning and one part of speech, plus roughly 1,200 words to avoid with suggested replacements. +- **A terminology allowance**: organizations may define their own dictionary of approved technical nouns and verbs beyond the base ~900 words, for domain-specific vocabulary the base dictionary can't cover. + +## Rule Categories (Paraphrased) + +**Word choice** +- Use approved words only in their approved meaning and part of speech. +- Each word maps to exactly one meaning — don't rely on context to disambiguate a word that has several dictionary senses. +- Prefer the plainer, shorter, more common word over a formal or rare synonym. +- Use an approved verb for an action, not a noun derived from that verb (Rule 3.7). +- Do not make phrasal verbs by putting a verb and a preposition together (Rule 9.3). Their meaning is not predictable from the parts, and non-native readers and translation systems both mishandle them. + +**Verb forms** +- Permitted forms: infinitive, imperative, simple present, simple past, simple future, and past participle used only as an adjective. +- No present perfect, past perfect, or other compound/auxiliary constructions. "We have received" is not allowed. "We received" is allowed. +- "-ing" forms are permitted only as a technical noun or as part of a technical noun, not as a verb form. + +**Voice** +- Active voice is required for procedures and instructions. +- Passive voice is allowed only in descriptive text, and only when the actor performing the action is genuinely unknown or irrelevant to the reader. + +**Sentence structure** +- One instruction per sentence. +- Maximum ~20 words per sentence for procedures and instructions. Maximum ~25 words for descriptive text. +- Do not omit sentence parts (verb, subject, article) just to shorten the sentence — the standard explicitly warns that this creates ambiguity rather than clarity. +- Noun clusters (strings of nouns stacked as a modifier) are capped at 3 words. +- Semicolons are not permitted at all (Rule 8.1): "You can use all standard English punctuation marks but not the semicolon (;)." Write separate sentences instead. Every other standard mark, including the em dash, remains permitted. + +**Paragraph and document structure** +- One topic per paragraph. +- Maximum ~6 sentences per paragraph. +- Use vertical (numbered or bulleted) lists for sequences, conditions, or complex enumerations instead of burying them in prose. + +**Safety instructions** +- Safety-critical instructions must open with a clear command or condition, not be buried mid-sentence. + +## Why This Skill Repurposes STE for Agent Output + +STE was designed to eliminate ambiguity for a reader who cannot ask a follow-up question — a technician on a tarmac, working from a manual, with no author to call. An AI agent parsing another agent's output, a tool description, or a system message is in the same position: no back-channel to resolve "does this passive-voice sentence mean the caller does X, or the callee does X?" The same rule set that protects an airline mechanic from a misread torque spec protects a downstream agent from a misread instruction. + +## Sources + +- [ASD-STE100 official site](https://www.asd-ste100.org/) +- [ASD-STE100 — About STE](https://www.asd-ste100.org/about_STE.html) +- [ASD Europe — Simplified Technical English](https://www.asd-europe.org/standards-specifications/simplified-technical-english/) +- [Simplified Technical English — Wikipedia](https://en.wikipedia.org/wiki/Simplified_Technical_English) +- [TechScribe — ASD-STE100 Simplified Technical English](https://www.techscribe.co.uk/techw/asd-simplified-technical-english.htm) +- [SKYbrary — Simplified Technical English (STE)](https://skybrary.aero/articles/simplified-technical-english-ste) diff --git a/.skills/asd-ste100/scripts/ste-lint.py b/.skills/asd-ste100/scripts/ste-lint.py new file mode 100644 index 0000000000..491b16e7d7 --- /dev/null +++ b/.skills/asd-ste100/scripts/ste-lint.py @@ -0,0 +1,203 @@ +#!/usr/bin/env python3 +"""Deterministic linter for the structural STE rules in SKILL.md. + +Checks only rules verifiable without ASD's dictionary. Deliberately never +flags hedges or modality (may/might/could): the skill treats confidence as +content, and a linter that pressures hedges out would rewrite claims. + +Usage: + ste-lint.py FILE [FILE ...] + echo "text" | ste-lint.py [--json] + ste-lint.py --baseline 5 FILE # pass unless hard violations exceed 5 + ste-lint.py --disable passive-voice,present-perfect FILE + ste-lint.py --selftest + +Exit 1 when hard ("advisory-free") violations exceed the baseline (default 0). +Advisory findings (passive voice, compound tenses) never fail the run. +""" +import json +import re +import sys + +# ponytail: regex heuristics, not a parser. No noun-cluster rule — needs POS +# tagging to avoid constant false positives; add spaCy-backed rule if ever needed. +# No ellipsis rule by owner's choice: technical writing sometimes earns one. +RULES = [ + ("semicolon", "advisory-free", + re.compile(r";"), + "STE bans the semicolon (Rule 8.1). Split into separate sentences."), + ("phrasal-verb", "advisory-free", + re.compile(r"\b(spin(?:ning|s)? up|spun up|reach(?:ing|es|ed)? out|div(?:e|es|ing|ed) into|dove into|kick(?:ing|s|ed)? off|circl(?:e|es|ing|ed) back|touch(?:ing|es|ed)? base)\b", re.I), + "Soft phrasal verb. Use the single plain verb (start, contact, read, begin)."), + ("marketing-adjective", "advisory-free", + re.compile(r"\b(seamless(?:ly)?|robust(?:ly)?|cutting-edge|effortless(?:ly)?|blazing[- ]fast|world-class|state-of-the-art|game-chang(?:ing|er))\b", re.I), + "Marketing adjective. Delete, or replace with the measurement that earns the claim."), + ("nominalization", "advisory-free", + re.compile(r"\b(perform|performs|performed|conduct|conducts|conducted|carry out|carries out|carried out)\s+(?:a|an|the)\s+\w+(?:tion|sion|ment|ance|ence|ysis)\b", re.I), + "Action frozen into a noun. Use the verb (analyze, not perform an analysis of)."), + ("passive-voice", "advisory", + re.compile(r"\b(is|are|was|were|been|being)\s+(\w+ed|given|taken|made|done|found|seen|known|shown|written|built|sent|set|run|read|kept|held|left|put)\b(?!\s+(?:to|for|by)\s+\w+ing)", re.I), + "Possible passive voice. Name the actor and use an active verb, unless the actor is unknown or irrelevant."), + ("present-perfect", "advisory", + # modal + perfect infinitive ("may have failed") is a protected hedge, not present perfect + re.compile(r"(?"): + findings = [] + words_total = 0 + in_fence = False + # first occurrence of each synonym-group member: (group_idx, base) -> (line, col, match) + seen_synonyms = {} + for lineno, line in enumerate(text.splitlines(), 1): + if CODE_FENCE.match(line.strip()): + in_fence = not in_fence + continue + if in_fence: + continue + line = INLINE_CODE.sub("", line) + words_total += len(line.split()) + for rule_id, level, pattern, msg in RULES: + for m in pattern.finditer(line): + findings.append({"file": filename, "line": lineno, "col": m.start() + 1, + "rule": rule_id, "level": level, + "match": m.group(0), "message": msg}) + for gi, group in enumerate(SYNONYM_GROUPS): + for base in group: + if (gi, base) in seen_synonyms: + continue + m = _word_re(base).search(line) + if m: + seen_synonyms[(gi, base)] = (lineno, m.start() + 1, m.group(0)) + for sent in re.split(r"(?<=[.!?])\s+", line): + n = len(sent.split()) + if n > MAX_WORDS: + findings.append({"file": filename, "line": lineno, "col": 1, + "rule": "long-sentence", "level": "advisory-free", + "match": f"{n} words", + "message": f"Sentence has {n} words (cap {MAX_WORDS}). Split it."}) + # synonym rotation: flag each member after the first, at its first occurrence + for gi, group in enumerate(SYNONYM_GROUPS): + present = [(seen_synonyms[(gi, b)], b) for b in group if (gi, b) in seen_synonyms] + if len(present) > 1: + present.sort() # document order + first_base = present[0][1] + for (lineno, col, match), base in present[1:]: + findings.append({"file": filename, "line": lineno, "col": col, + "rule": "synonym-rotation", "level": "advisory-free", + "match": match, + "message": f"'{base}' and '{first_base}' name the same action. Pick one and use it every time."}) + findings.sort(key=lambda f: (f["line"], f["col"])) + return findings, words_total + + +def report(findings, words_total, as_json, hard_count, baseline): + rate = round(len(findings) * 100 / words_total, 1) if words_total else 0.0 + if as_json: + print(json.dumps({"violations": findings, "count": len(findings), + "hard_count": hard_count, "baseline": baseline, + "words": words_total, "per_100_words": rate}, indent=2)) + return + for f in findings: + print(f"{f['file']}:{f['line']}:{f['col']} {f['rule']}: {f['message']} [{f['match']}]") + print(f"\n{len(findings)} violations ({hard_count} hard, baseline {baseline}), " + f"{words_total} words, {rate} per 100 words") + print("Hedges/modality (may, might, could) are never flagged: confidence is content.") + + +def selftest(): + bad = ("The panel is removed; spin up the job. " + "Perform an analysis of the seamless log. " + "We have received the report.") + findings, _ = lint(bad) + rules = {f["rule"] for f in findings} + for expected in ("semicolon", "phrasal-verb", "nominalization", + "marketing-adjective", "passive-voice", "present-perfect"): + assert expected in rules, expected + # hedges must never be flagged, including modal + perfect infinitive + findings, _ = lint("The request may have failed. It could be a timeout. " + "The disk might have filled.") + assert findings == [], findings + # code blocks skipped + findings, _ = lint("```\nx = a; y = b\n```") + assert findings == [] + findings, _ = lint(("word " * 30).strip() + ".") + assert any(f["rule"] == "long-sentence" for f in findings) + # synonym rotation: second member flagged, first named as the keeper + findings, _ = lint("Check the config file. Then verify the output. Verify twice.") + rot = [f for f in findings if f["rule"] == "synonym-rotation"] + assert len(rot) == 1 and "'verify' and 'check'" in rot[0]["message"], rot + # single consistent term: no flag + findings, _ = lint("Check the config. Check the output.") + assert not any(f["rule"] == "synonym-rotation" for f in findings) + # per-file labels + findings, _ = lint("a; b", filename="x.md") + assert findings[0]["file"] == "x.md" + print("selftest OK") + + +def main(argv): + if "--selftest" in argv: + selftest() + return 0 + as_json = "--json" in argv + baseline = 0 + disabled = set() + paths = [] + i = 0 + while i < len(argv): + a = argv[i] + if a == "--baseline": + i += 1 + baseline = int(argv[i]) + elif a == "--disable": + i += 1 + disabled = set(argv[i].split(",")) + elif not a.startswith("--"): + paths.append(a) + i += 1 + + findings, words_total = [], 0 + if paths: + for p in paths: + f, w = lint(open(p, encoding="utf-8").read(), filename=p) + findings.extend(f) + words_total += w + else: + findings, words_total = lint(sys.stdin.read()) + + findings = [f for f in findings if f["rule"] not in disabled] + hard_count = sum(1 for f in findings if f["level"] == "advisory-free") + report(findings, words_total, as_json, hard_count, baseline) + return 1 if hard_count > baseline else 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff --git a/.skills/beacon-scripting b/.skills/beacon-scripting new file mode 120000 index 0000000000..286d347c42 --- /dev/null +++ b/.skills/beacon-scripting @@ -0,0 +1 @@ +../MCC-Skills/skills/beacon-scripting \ No newline at end of file diff --git a/.skills/csharp-best-practices b/.skills/csharp-best-practices new file mode 120000 index 0000000000..38f8c4679c --- /dev/null +++ b/.skills/csharp-best-practices @@ -0,0 +1 @@ +../MCC-Skills/skills/csharp-best-practices \ No newline at end of file diff --git a/.skills/csharp-best-practices/SKILL.md b/.skills/csharp-best-practices/SKILL.md deleted file mode 100644 index c5b168d7cf..0000000000 --- a/.skills/csharp-best-practices/SKILL.md +++ /dev/null @@ -1,1165 +0,0 @@ ---- -name: dotnet-csharp-best-practices -description: > - C# coding conventions, idiomatic patterns, performance, and async best practices for both .NET 8 (C# 12) and .NET 10 (C# 14). Use when writing, reviewing, refactoring, or designing C# code — including async code that uses Task, Task, ValueTask, CancellationToken, Task.WhenAll/WhenAny, Task.Run, ConfigureAwait, async void, or fire-and-forget. Trigger on `.Result`, `.Wait()`, deadlocks, cancellation propagation, ASP.NET Core background work, UI responsiveness, exception flow, and performance-sensitive async API design. -metadata: - category: technique - platform: ".NET 8 (C# 12) and .NET 10 (C# 14)" - triggers: - - c# - - csharp - - .net - - .net 8 - - .net 10 - - async - - task - - valuetask - - cancellationtoken - - configureawait - - .result - - .wait() - - async void - - fire-and-forget - - task.run - - whenall - - whenany - - asp.net core - - deadlock ---- - -# C# Best Practices — .NET 8 + .NET 10 - -Target: **.NET 8 (C# 12)** *and* **.NET 10 (C# 14)**, nullable enabled. GrECo has no .NET 9 projects. - -## Step 0 — Detect the target framework - -**Before** emitting code, follow `../../references/detect-target-framework.md`. The detection result decides which examples below apply: - -- `net8.0` → emit the **.NET 8 / C# 12** code block in every side-by-side pair; **never** use the C# 14-only syntax (`field`, `extension(...)`, `?.` assignment, partial constructors) or .NET 10-only APIs (`HybridCache`, `AddValidation`, EF Core named filters, first-party `Microsoft.AspNetCore.OpenApi`, Identity passkeys). -- `net10.0` → prefer the **.NET 10 / C# 14** code block. -- Multi-target (`net8.0;net10.0`) → emit the .NET 8 version, or wrap .NET 10-only code in `#if NET10_0_OR_GREATER`. -- Unknown → ask the user. - -Sources: [MS C# Conventions](https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/coding-style/coding-conventions) · [.NET Runtime Style](https://github.com/dotnet/runtime/blob/main/docs/coding-guidelines/coding-style.md) · [C# language versioning](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-versioning) · [C# 14 What's New](https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-14) · [C# 12 What's New](https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-12) - -## Naming - -| Element | Style | Example | -|---|---|---| -| Type, method, property, const, enum member | PascalCase | `PacketHandler`, `MaxRetries`, `GameMode.Survival` | -| Interface | `I` + PascalCase | `IChatBot` | -| Private instance field | `_camelCase` | `_handler` | -| Private static field | `s_camelCase` | `s_defaultTimeout` | -| Thread-static field | `t_camelCase` | `t_cachedBuffer` | -| Local, parameter | camelCase | `packetId` | -| Type parameter | `T` + PascalCase | `TResult` | -| Namespace | PascalCase | `SomeNamespace.SomeClasses` | -| Async methods | Suffix `Async` | `ConnectAsync()`, `ReadPacketAsync()` | - -```csharp -// CORRECT: naming conventions -private readonly Dictionary _entities = new(); -private static readonly TimeSpan s_reconnectDelay = TimeSpan.FromSeconds(5); -public int PacketCount { get; private set; } -public async Task ConnectAsync(CancellationToken ct) { } -``` - -```csharp -// WRONG: naming violations -private Dictionary entities = new(); // missing _ -private static TimeSpan reconnectDelay; // missing s_ -public int packet_count { get; set; } // snake_case -public async Task Connect(CancellationToken ct) { } // missing Async suffix -``` - -## C# 14 Features (.NET 10 only — with .NET 8 / C# 12 fallbacks) - -Every feature in this section requires `net10.0`. On `net8.0` use the fallback shown alongside. Authoritative reference: [C# 14 what's new](https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-14). - -### Extension Members - -Declare extension methods, properties, and operators inside `extension(...)` blocks. - -```csharp -// .NET 10 / C# 14 — extension property + method -public static class EntityExtensions -{ - extension(Entity entity) - { - public bool IsAlive => entity.Health > 0; - public void Heal(int amount) => entity.Health = Math.Min(entity.Health + amount, 20); - } - extension(IEnumerable items) - { - public bool IsEmpty => !items.GetEnumerator().MoveNext(); - } -} -``` - -```csharp -// .NET 8 / C# 12 — classic static extension class (only option) -public static class EntityExtensions -{ - public static bool IsAlive(this Entity entity) => entity.Health > 0; - public static void Heal(this Entity entity, int amount) - => entity.Health = Math.Min(entity.Health + amount, 20); - - public static bool IsEmpty(this IEnumerable items) - => !items.GetEnumerator().MoveNext(); -} -// Extension properties do not exist in C# 12 — expose them as methods or compute inline. -``` - -### `field` Keyword in Properties - -Access the auto-generated backing field without declaring it. - -```csharp -// .NET 10 / C# 14 — field keyword -public string DisplayName => field ??= ComputeDisplayName(); - -public bool IsConnected -{ - get; - set - { - if (field == value) return; - field = value; - OnPropertyChanged(); - } -} -``` - -```csharp -// .NET 8 / C# 12 — manual backing field (only option) -private string? _displayName; -public string DisplayName => _displayName ??= ComputeDisplayName(); - -private bool _isConnected; -public bool IsConnected -{ - get => _isConnected; - set - { - if (_isConnected == value) return; - _isConnected = value; - OnPropertyChanged(); - } -} -``` - -### Null-Conditional Assignment - -```csharp -// .NET 10 / C# 14 — assign / compound-assign through ?. -player?.Health = 20; -connection?.OnDisconnect += HandleDisconnect; -inventory?[slot] = newItem; -``` - -```csharp -// .NET 8 / C# 12 — manual null check -if (player is not null) player.Health = 20; -if (connection is not null) connection.OnDisconnect += HandleDisconnect; -if (inventory is not null) inventory[slot] = newItem; -``` - -### Simple Lambda Parameters with Modifiers - -```csharp -// .NET 10 / C# 14 — modifiers without explicit types -TryParse parse = (text, out result) => int.TryParse(text, out result); -ProcessSpan((scoped span) => span.Length); -``` - -```csharp -// .NET 8 / C# 12 — full parameter types required when modifiers are present -TryParse parse = (string text, out int result) => int.TryParse(text, out result); -ProcessSpan((scoped ReadOnlySpan span) => span.Length); -``` - -### First-Class Span Types - -```csharp -// .NET 10 / C# 14 — implicit T[] → ReadOnlySpan -int[] data = [1, 2, 3]; -bool found = data.StartsWith(1); // ReadOnlySpan extension auto-resolves -ReadOnlySpan span = stackalloc byte[4]; -``` - -```csharp -// .NET 8 / C# 12 — call .AsSpan() explicitly at the boundary -int[] data = [1, 2, 3]; -bool found = data.AsSpan().StartsWith(stackalloc int[] { 1 }); // explicit conversion -ReadOnlySpan span = stackalloc byte[4]; // stackalloc → ReadOnlySpan already works -``` - -### Unbound Generics in `nameof` - -```csharp -// .NET 10 / C# 14 -string name = nameof(Dictionary<,>); // "Dictionary" -string prop = nameof(List<>.Count); // "Count" -``` - -```csharp -// .NET 8 / C# 12 — pick any closed type argument -string name = nameof(Dictionary); // "Dictionary" -string prop = nameof(List.Count); // "Count" -``` - -### Partial Events and Constructors - -```csharp -// .NET 10 / C# 14 — partial constructor for source-gen interop -partial class ServerConnection -{ - partial ServerConnection(string host, int port); -} -partial class ServerConnection -{ - partial ServerConnection(string host, int port) { /* generated body */ } -} -``` - -```csharp -// .NET 8 / C# 12 — partial constructors do not exist. -// Either declare a regular constructor and call a private generated helper, -// or put the constructor body in a single file: -partial class ServerConnection -{ - public ServerConnection(string host, int port) => InitGenerated(host, port); - private partial void InitGenerated(string host, int port); // partial methods are C# 9+ -} -partial class ServerConnection -{ - private partial void InitGenerated(string host, int port) { /* generated body */ } -} -``` - -### `#:` Ignored Directives / file-based programs - -C# 14 / .NET 10 SDK only — no .NET 8 equivalent. `dotnet run app.cs` requires the .NET 10 SDK. - -```csharp -// .NET 10 only — file-based program with inline package reference -#!/usr/bin/dotnet run -#:package System.CommandLine@2.0.0-* -Console.WriteLine("Hello"); -``` - -```csharp -// .NET 8 — create a full project (dotnet new console -f net8.0) and reference -// System.CommandLine in the .csproj. There is no inline-package syntax. -``` - -## C# 13 Features — require .NET 9+ (NOT available on .NET 8) - -GrECo has no .NET 9 projects, so the only way to use C# 13 features in production is to be on .NET 10. On .NET 8, use the .NET 8 fallback shown below. - -### `Lock` Object - -```csharp -// .NET 10 / C# 13+ — dedicated System.Threading.Lock type -private readonly Lock _gate = new(); -public void Enqueue(ChatMessage msg) { lock (_gate) _queue.Add(msg); } -``` - -```csharp -// .NET 8 / C# 12 — lock on a plain object reference (the only option) -private readonly object _gate = new(); -public void Enqueue(ChatMessage msg) { lock (_gate) _queue.Add(msg); } -``` - -### `params` Collections (`params ReadOnlySpan`) - -The runtime overloads accepting `params ReadOnlySpan` ship in the .NET 9 BCL. On .NET 8 use `params T[]`. - -```csharp -// .NET 10 / C# 13+ — params span avoids the array allocation -public void Log(params ReadOnlySpan messages) -{ - foreach (var msg in messages) Console.WriteLine(msg); -} -``` - -```csharp -// .NET 8 / C# 12 — params array (one heap allocation per call) -public void Log(params string[] messages) -{ - foreach (var msg in messages) Console.WriteLine(msg); -} -``` - -### Partial Properties - -```csharp -// .NET 10 / C# 13+ — partial property for source generators -partial class Config -{ - public partial string Host { get; set; } -} -partial class Config -{ - public partial string Host { get => _host; set => _host = value; } - private string _host = ""; -} -``` - -```csharp -// .NET 8 / C# 12 — partial properties do not exist; declare a normal property -// and let the source generator emit the backing field or a helper method. -partial class Config -{ - public string Host { get; set; } = ""; -} -``` - -## C# 12 Features (.NET 8+ — available on both targets) - -### Primary Constructors - -Use for simple parameter capture. Parameters are `camelCase`, mutable — assign to `readonly` fields when immutability matters. - -```csharp -// CORRECT: primary constructor captures dependencies -public class ChatLogger(string logFilePath, bool appendMode) : ChatBot -{ - private readonly StreamWriter _writer = new(logFilePath, appendMode); - public override void GetText(string text) => _writer.WriteLine(text); -} -``` - -```csharp -// WRONG: verbose constructor boilerplate for simple capture -public class ChatLogger : ChatBot -{ - private readonly StreamWriter _writer; - public ChatLogger(string logFilePath, bool appendMode) - { - _writer = new StreamWriter(logFilePath, appendMode); - } - public override void GetText(string text) => _writer.WriteLine(text); -} -``` - -### Collection Expressions - -Use `[...]` and `..` spread for arrays, lists, spans. - -```csharp -// CORRECT: collection expressions (C# 12) -int[] ids = [1, 2, 3]; -List names = ["Steve", "Alex"]; -ReadOnlySpan header = [0xFE, 0x01]; // no heap alloc -int[] combined = [..firstArray, ..secondArray, 42]; -IReadOnlyList empty = []; -``` - -```csharp -// WRONG: verbose initialization -int[] ids = new int[] { 1, 2, 3 }; -var names = new List { "Steve", "Alex" }; -ReadOnlySpan header = new byte[] { 0xFE, 0x01 }; // allocates -var combined = firstArray.Concat(secondArray).Append(42).ToArray(); -``` - -### Type Aliases - -```csharp -// CORRECT: alias complex types for readability -using Coordinate = (int X, int Y, int Z); -using PacketMap = System.Collections.Generic.Dictionary>; -``` - -### Default Lambda Parameters - -```csharp -// CORRECT: C# 12 -var greet = (string name, string prefix = "Player") => $"{prefix} {name}"; -``` - -## Modern Syntax (C# 10–14) - -### File-Scoped Namespaces - -```csharp -// CORRECT: file-scoped namespace — one per file, less nesting -namespace SomeNamespace.SomeClasses; - -public class SomeClass : SomeInterface { } -``` - -```csharp -// WRONG: block-scoped namespace adds unnecessary nesting -namespace SomeNamespace.SomeClasses -{ - public class SomeClass : SomeInterface { } -} -``` - -### Target-Typed `new` - -Use when the type is obvious from the left-hand side. - -```csharp -// CORRECT: target-typed new -private readonly Dictionary _scores = new(); -List entities = new(capacity: 256); -``` - -```csharp -// WRONG: redundant type name -private readonly Dictionary _scores = new Dictionary(); -``` - -### Pattern Matching - -Prefer patterns over type-casting chains and complex boolean logic. - -```csharp -// CORRECT: is-pattern with declaration and property patterns -if (entity is Player { Health: > 0 } player) - SendMessage($"{player.Name} is alive"); -``` - -```csharp -// WRONG: manual cast and multi-step check -if (entity is Player) -{ - var player = (Player)entity; - if (player.Health > 0) - SendMessage($"{player.Name} is alive"); -} -``` - -```csharp -// CORRECT: switch expression -public string GetStatusLabel(GameMode mode) => mode switch -{ - GameMode.Survival => "Survival", - GameMode.Creative => "Creative", - GameMode.Adventure => "Adventure", - GameMode.Spectator => "Spectator", - _ => throw new ArgumentOutOfRangeException(nameof(mode)) -}; -``` - -```csharp -// WRONG: switch statement with returns -public string GetStatusLabel(GameMode mode) -{ - switch (mode) - { - case GameMode.Survival: return "Survival"; - case GameMode.Creative: return "Creative"; - default: throw new ArgumentOutOfRangeException(nameof(mode)); - } -} -``` - -```csharp -// CORRECT: property patterns for compound conditions -if (response is { StatusCode: >= 200 and < 300, Content.Length: > 0 }) - ProcessResponse(response); -``` - -```csharp -// WRONG: multiple chained conditions -if (response != null && response.StatusCode >= 200 - && response.StatusCode < 300 && response.Content != null - && response.Content.Length > 0) - ProcessResponse(response); -``` - -```csharp -// CORRECT: relational, logical, and list patterns -if (health is > 0 and <= 6) LogToConsole("Low health!"); -if (args is [var command, var target, ..]) ProcessCommand(command, target); -``` - -### Raw String Literals - -Use for JSON, regex, multi-line strings. - -```csharp -// CORRECT: raw string literal -string json = """ - { "username": "Steve", "action": "connect" } - """; -string pattern = """<\w+>"""; -``` - -```csharp -// WRONG: escaped quotes -string json = "{ \"username\": \"Steve\", \"action\": \"connect\" }"; -``` - -### Records - -Use `record` for immutable data carriers and DTOs. Use `record struct` for small value types. - -```csharp -// CORRECT: record for data carrier -public record PlayerInfo(string Name, Guid Uuid, GameMode Mode); -public record struct ChunkCoord(int X, int Z); -var updated = info with { Mode = GameMode.Creative }; -``` - -```csharp -// WRONG: full class for a simple data carrier -public class PlayerInfo -{ - public string Name { get; set; } = string.Empty; - public Guid Uuid { get; set; } - public GameMode Mode { get; set; } -} -``` - -```csharp -// CORRECT: compact constructor for record validation -public record OrderItem(string ProductId, int Quantity, decimal UnitPrice) -{ - public OrderItem - { - ArgumentException.ThrowIfNullOrWhiteSpace(ProductId); - ArgumentOutOfRangeException.ThrowIfNegativeOrZero(Quantity); - ArgumentOutOfRangeException.ThrowIfNegative(UnitPrice); - } -} -``` - -### Required Members - -```csharp -// CORRECT: required + init enforces initialization without constructor boilerplate -public class ServerConfig -{ - public required string Host { get; init; } - public required int Port { get; init; } - public string? Password { get; init; } -} -var config = new ServerConfig { Host = "mc.example.com", Port = 25565 }; -``` - -## Nullable Reference Types - -Project has nullable enabled. Follow these rules: - -```csharp -// CORRECT: guard at API boundaries with .NET 8 throw helpers -public void Connect(string host, IProtocolHandler handler) -{ - ArgumentNullException.ThrowIfNull(handler); - ArgumentException.ThrowIfNullOrEmpty(host); -} -``` - -```csharp -// WRONG: manual null checks -if (handler == null) throw new ArgumentNullException(nameof(handler)); -if (string.IsNullOrWhiteSpace(host)) - throw new ArgumentException("Host is required", nameof(host)); -``` - -```csharp -// CORRECT: 'is not null' pattern -if (currentPlayer is not null) - currentPlayer.Update(); -``` - -```csharp -// WRONG: comparison operator for null check -if (currentPlayer != null) - currentPlayer.Update(); -``` - -```csharp -// CORRECT: explicit nullable handling -public Entity? FindEntity(int id) -{ - return _entities.TryGetValue(id, out var entity) ? entity : null; -} - -// CORRECT: null-coalescing / null-conditional -string name = player?.CustomName ?? player?.Name ?? "Unknown"; - -// CORRECT: null-forgiving only when proven safe (after ThrowIfNull or equivalent) -string val = GetRequiredValue()!; - -// CORRECT: annotate return values -[return: MaybeNull] -public T Find(Predicate match) { } - -[MemberNotNull(nameof(_connection))] -private void EnsureConnected() { } -``` - -```csharp -// WRONG: hiding nullability with null-forgiving -public string GetName(Player? player) -{ - return player!.Name; // hides potential NullReferenceException -} -``` - -## Async / Await - - -1. correctness and cancellation semantics -2. context-specific API design (library vs app, UI vs ASP.NET Core) -3. concurrency behavior and failure handling -4. performance tuning only when the hot path is real - - -Treat blanket advice as suspect. Separate official runtime behavior from expert interpretation and from your own recommendation for the case at hand. - -### Review defaults - -Start from these defaults unless case-specific evidence says otherwise: - -| Topic | Default judgment | -|---|---| -| Blocking on async (`.Result`, `.Wait`, `GetAwaiter().GetResult()`) | usually a defect or interop boundary smell | -| `async void` | only acceptable for event handlers | -| `ValueTask` | avoid by default; justify with measurements or a very hot path | -| `ConfigureAwait(false)` | good library default, not an app-wide default | -| `Task.Run` | use to offload CPU work when needed, not to fake async I/O | -| Fire-and-forget | assume unsafe until lifecycle, scope, and exception handling are explicit | -| `Task.WhenAll` | prefer for independent concurrent operations | -| `Task.WhenAny` | always inspect the winner task and define what happens to losers | -| Cancellation | accept and propagate the token until the point of no cancellation | -| Method naming | `Async` suffix for awaitable-returning methods (unless an interface/event contract dictates otherwise) | - -### Concrete patterns - -```csharp -// CORRECT: propagate CancellationToken through every async I/O call -public async Task FetchDataAsync(Uri uri, CancellationToken ct = default) -{ - using var response = await _httpClient.GetAsync(uri, ct); - return await response.Content.ReadAsStringAsync(ct); -} -``` - -```csharp -// WRONG: CancellationToken not passed downstream -public async Task FetchDataAsync(Uri uri) -{ - using var response = await _httpClient.GetAsync(uri, default); - return await response.Content.ReadAsStringAsync(default); -} -``` - -```csharp -// CORRECT: ValueTask when result is often available synchronously and the call is on a hot path -public ValueTask GetCachedCountAsync() -{ - if (_cache.TryGetValue("count", out int count)) - return ValueTask.FromResult(count); - return new ValueTask(LoadCountFromDbAsync()); -} - -// Note: do not await the same ValueTask twice, do not call AsTask() multiple times, -// and do not mix consumption techniques on the same instance — undefined behavior. -``` - -```csharp -// WRONG: Task allocates unnecessarily when result is cached -public async Task GetCachedCountAsync() -{ - if (_cache.TryGetValue("count", out int count)) - return count; // allocates a Task - return await LoadCountFromDbAsync(); -} -``` - -```csharp -// CORRECT: async Task for async event handlers exposed as awaitable -public async Task HandleEventAsync(GameEvent e, CancellationToken ct) - => await notificationService.SendAsync(e.PlayerId, ct); -``` - -```csharp -// WRONG: async void — exceptions are unobservable, cannot be awaited -public async void HandleEvent(GameEvent e) - => await notificationService.SendAsync(e.PlayerId, default); -``` - -```csharp -// CORRECT: await the result -var packet = await reader.ReadPacketAsync(ct); -``` - -```csharp -// WRONG: .Result / .Wait() / GetAwaiter().GetResult() — deadlocks and thread pool starvation -var packet = reader.ReadPacketAsync(ct).Result; -var packet2 = reader.ReadPacketAsync(ct).GetAwaiter().GetResult(); -``` - -```csharp -// CORRECT: ConfigureAwait(false) in general-purpose library code -var data = await stream.ReadAsync(buffer, ct).ConfigureAwait(false); -``` - -```csharp -// CORRECT: Task.WhenAll for independent concurrent I/O -var userTask = repo.GetUserAsync(id, ct); -var ordersTask = repo.GetOrdersAsync(id, ct); -await Task.WhenAll(userTask, ordersTask); -return new Dashboard(await userTask, await ordersTask); -``` - -```csharp -// CORRECT: IAsyncEnumerable for streaming -public async IAsyncEnumerable ReadChatStreamAsync( - [EnumeratorCancellation] CancellationToken ct = default) -{ - while (!ct.IsCancellationRequested) - yield return await _reader.ReadNextAsync(ct); -} - -// CORRECT: await using for async disposal -await using var conn = new McConnection(host, port); -``` - -### Common traps - -- Calling `.Result`, `.Wait()`, or `GetAwaiter().GetResult()` inside normal async-capable code -- Recommending `ConfigureAwait(false)` everywhere because "it is .NET Core" or "it prevents deadlocks" -- Recommending `Task.Run` inside ASP.NET Core request code just to make code "more async" — request code already runs on the thread pool -- Recommending `ValueTask` for every hot-looking method without checking completion behavior, call frequency, or single-consumer assumptions -- Ignoring cancellation after plumbing a `CancellationToken` (accepting it but never checking or propagating) -- Using `Task.WhenAny` without awaiting the returned winner task or handling the remaining tasks -- Treating fire-and-forget as harmless when it touches scoped services, `HttpContext`, or unobserved failures -- Awaiting the same `ValueTask` twice, or mixing `AsTask()` with `await` on the same instance - -### Rationalization traps - -| Rationalization | Better reasoning | -|---|---| -| "It works, so `.Result` is fine." | Lack of failure under one context does not make blocking safe or scalable. | -| "`ValueTask` is always faster." | It trades simplicity for niche allocation wins and stricter consumption rules. | -| "`ConfigureAwait(false)` everywhere is modern guidance." | Library and app code have different constraints. Blanket rules are weak. | -| "`Task.Run` makes server code asynchronous." | It only queues work; it does not turn blocking I/O into true async I/O. | -| "Fire-and-forget is okay because logging exists." | Logging does not solve scope lifetime, shutdown, retries, or error propagation. | - -### Hard boundaries - -- Do not endorse sync-over-async as a normal design choice -- Do not suggest `async void` except for event handlers -- Do not suggest `ValueTask` unless single-consumer / hot-path / measurement constraints are met -- Do not claim `ConfigureAwait(false)` is always needed or always unnecessary -- Do not approve fire-and-forget unless ownership, exception handling, and lifetime are explicit - -### Output contract for review and design - -When you review or design async code, label your reasoning: - -- **Fact** — official runtime or API behavior -- **Expert guidance** — interpretation from strong experts (Stephen Toub, Stephen Cleary, Andrew Arnott) when it adds design meaning -- **Synthesis** — your recommendation for this exact case - -Do not present contextual advice as a universal law. - -### References for deep async work - -Load on demand: - -- [references/async-core-guidance.md](references/async-core-guidance.md) — fact / expert / synthesis for `Task` vs `ValueTask`, blocking, cancellation, exception flow, `WhenAll` / `WhenAny` -- [references/async-context-and-tradeoffs.md](references/async-context-and-tradeoffs.md) — library vs app, UI vs ASP.NET Core, `Task.Run` boundaries, fire-and-forget alternatives, `ConfigureAwait` strong vs weak recommendations, throttling -- [references/async-source-notes.md](references/async-source-notes.md) — source attribution and authority breakdown - -## LINQ - -### Prefer Method Syntax for Most Operations - -```csharp -// CORRECT: method syntax for common operations -var onlinePlayers = players - .Where(p => p.IsOnline) - .OrderBy(p => p.Name) - .Select(p => new PlayerListItem(p.Id, p.Name)) - .ToList(); -``` - -```csharp -// AVOID: query syntax for simple operations -var onlinePlayers = ( - from p in players - where p.IsOnline - orderby p.Name - select new PlayerListItem(p.Id, p.Name) -).ToList(); -``` - -### Use Query Syntax for Joins - -```csharp -// CORRECT: query syntax makes joins readable -var results = - from entity in entities - join player in players on entity.OwnerId equals player.Id - where entity.Health > 0 - select new { entity.Name, player.Name }; -``` - -```csharp -// AVOID: method syntax for complex joins is hard to read -var results = entities - .Join(players, - e => e.OwnerId, - p => p.Id, - (e, p) => new { e, p }) - .Where(x => x.e.Health > 0) - .Select(x => new { x.e.Name, PlayerName = x.p.Name }); -``` - -### Materialize to Avoid Multiple Enumeration - -```csharp -// CORRECT: materialize once, iterate many times -var online = players.Where(p => p.IsOnline).ToList(); -Console.WriteLine(online.Count); -foreach (var p in online) { } -``` - -```csharp -// WRONG: enumerates the query twice -var filtered = players.Where(p => p.IsOnline); -Console.WriteLine(filtered.Count()); // first enumeration -foreach (var p in filtered) { } // second enumeration -``` - -### Use Any() Over Count() > 0 - -```csharp -// CORRECT: short-circuits on first match -if (entities.Any(e => e.IsHostile)) - TriggerAlert(); -``` - -```csharp -// WRONG: counts the entire collection -if (entities.Count(e => e.IsHostile) > 0) - TriggerAlert(); -``` - -### Prefer FirstOrDefault with Null Handling - -```csharp -// CORRECT: explicit null handling -var target = players.FirstOrDefault(p => p.Name == name) - ?? throw new InvalidOperationException($"Player '{name}' not found"); -``` - -### TryGetNonEnumeratedCount - -```csharp -// CORRECT: avoid full enumeration just to get count (.NET 6+) -if (source.TryGetNonEnumeratedCount(out int count)) - buffer = new Entity[count]; -``` - -### Avoid LINQ in Hot Paths - -```csharp -// CORRECT: manual loop with Span in performance-critical code -Span data = stackalloc byte[256]; -int found = 0; -for (int i = 0; i < data.Length; i++) - if (data[i] == target) found++; -``` - -```csharp -// AVOID: LINQ allocates enumerators and delegates on hot paths -int found = data.ToArray().Count(b => b == target); -``` - -## Performance (.NET 8+ — works on both targets) - -All APIs below ship in .NET 8 and continued unchanged in .NET 10. For benchmarks and rationale see Stephen Toub's deep dives: -[Performance Improvements in .NET 8](https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-8/) · -[Performance Improvements in .NET 10](https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-10/) (covers JIT array-interface devirtualisation that speeds up many LINQ paths in .NET 10). - -### Span\ / Memory\ - -```csharp -// CORRECT: zero-allocation slicing -ReadOnlySpan command = input.AsSpan()[1..]; // skip '/' - -// CORRECT: stack-allocated parsing -public static int ParseVarInt(ReadOnlySpan data, out int bytesRead) -{ - int result = 0; bytesRead = 0; byte cur; - do { cur = data[bytesRead]; result |= (cur & 0x7F) << (bytesRead * 7); bytesRead++; } - while ((cur & 0x80) != 0); - return result; -} -``` - -### FrozenDictionary / FrozenSet (.NET 8) - -Build once, read many — ~50% faster lookups than Dictionary. - -```csharp -// CORRECT: FrozenDictionary for read-heavy lookup tables (palettes, protocol maps) -using System.Collections.Frozen; -private static readonly FrozenDictionary s_blockNames = - new Dictionary { [0] = "air", [1] = "stone" }.ToFrozenDictionary(); -``` - -### SearchValues\ (.NET 8) - -Hardware-accelerated set search. - -```csharp -// CORRECT: precompute once, scan with SIMD -private static readonly SearchValues s_separators = SearchValues.Create(" \t\n\r,;"); -int idx = input.AsSpan().IndexOfAny(s_separators); -``` - -### CompositeFormat (.NET 8) - -Parse format string once, reuse. - -```csharp -// CORRECT: avoids re-parsing the format string each call -private static readonly CompositeFormat s_logFmt = CompositeFormat.Parse("[{0:HH:mm:ss}] {1}: {2}"); -string msg = string.Format(CultureInfo.InvariantCulture, s_logFmt, DateTime.Now, player, text); -``` - -### ArrayPool / stackalloc - -```csharp -// CORRECT: rent from pool for temporary buffers -byte[] buf = ArrayPool.Shared.Rent(4096); -try { int n = stream.Read(buf.AsSpan(0, 4096)); ProcessPacket(buf.AsSpan(0, n)); } -finally { ArrayPool.Shared.Return(buf); } - -// CORRECT: stackalloc for small, fixed-size buffers (< 512 bytes) -Span header = stackalloc byte[5]; -``` - -## String Handling - -```csharp -// CORRECT: explicit StringComparison — always -bool match = name.Equals("Steve", StringComparison.OrdinalIgnoreCase); -int idx = text.IndexOf("hello", StringComparison.Ordinal); -``` - -```csharp -// WRONG: allocates a lowered copy -bool match = name.ToLower() == "steve"; -``` - -```csharp -// CORRECT: string.Create for perf-critical formatting -string hex = string.Create(data.Length * 2, data, static (span, bytes) => -{ - for (int i = 0; i < bytes.Length; i++) - bytes[i].TryFormat(span[(i * 2)..], out _, "X2"); -}); - -// CORRECT: StringBuilder for loops -var sb = new StringBuilder(256); -foreach (var item in inventory) - sb.Append(item.Name).Append(" x").Append(item.Count).AppendLine(); -``` - -```csharp -// WRONG: O(n²) string concatenation in loop -string combined = ""; -foreach (var s in items) combined += s + ", "; -``` - -## Collections — Choosing the Right Type - -| Scenario | Type | Notes | -|---|---|---| -| General key-value | `Dictionary` | O(1) lookup | -| Build once, read many | `FrozenDictionary` | .NET 8+; faster reads | -| Thread-safe | `ConcurrentDictionary` | Lock-free reads | -| Immutable snapshots | `ImmutableDictionary` | Persistent structure | -| Membership test | `HashSet` / `FrozenSet` | FrozenSet for static | -| Priority queue | `PriorityQueue` | .NET 6+ | -| Synchronization | `System.Threading.Lock` / `lock(object)` | `Lock` is .NET 9+ only — on .NET 8 use `private readonly object _gate = new();` | -| Producer-consumer | `Channel` | Over `BlockingCollection` | -| Temp buffer | `ArrayPool` / `stackalloc` | Zero/low alloc | - -## Error Handling - -```csharp -// CORRECT: Try* pattern for expected failures -if (int.TryParse(input, out int value)) ProcessValue(value); -if (_registry.TryGetValue(packetId, out var handler)) handler.Invoke(data); -``` - -```csharp -// WRONG: using exceptions for control flow -try { return dict[key]; } -catch (KeyNotFoundException) { return null; } // use TryGetValue -``` - -```csharp -// CORRECT: exception filters (catch-when) -try { await ConnectAsync(ct); } -catch (SocketException ex) when (ex.SocketErrorCode == SocketError.ConnectionRefused) -{ - LogToConsole("Connection refused, retrying..."); -} -``` - -```csharp -// CORRECT: throw helpers (smaller IL, better inlining) -ArgumentNullException.ThrowIfNull(handler); -ArgumentOutOfRangeException.ThrowIfNegative(timeout); -ArgumentOutOfRangeException.ThrowIfGreaterThan(timeout, MaxTimeout); -ObjectDisposedException.ThrowIf(_disposed, this); -``` - -```csharp -// WRONG: generic exceptions -throw new Exception($"Entity {id} not found"); -``` - -```csharp -// CORRECT: specific, meaningful exception types -throw new EntityNotFoundException(id); -// or use null-coalescing with throw -return await FindEntityAsync(id, ct) - ?? throw new EntityNotFoundException(id); -``` - -```csharp -// AVOID: catching Exception without filtering -try { DoWork(); } -catch (Exception) { /* swallowed */ } -``` - -## Warning Suppression - -```csharp -// CORRECT: fix the warning by handling null properly -public string GetDisplayName(Player? player) -{ - return player?.DisplayName ?? "Unknown"; -} -``` - -```csharp -// WRONG: suppressing nullable warning with pragma -#pragma warning disable CS8602 -public string GetDisplayName(Player? player) -{ - return player.DisplayName; // NullReferenceException at runtime -} -#pragma warning restore CS8602 -``` - -```csharp -// WRONG: suppressing with attribute -[SuppressMessage("Usage", "CA1062:Validate arguments of public methods")] -public void Process(Packet packet) -{ - // missing null check -} -``` - -Project-wide `.editorconfig` is the only acceptable place for warning policy: - -```text -# .editorconfig - project-wide policy decisions only -dotnet_diagnostic.CA2007.severity = none -``` - -## Resource Management - -```csharp -// CORRECT: using declaration — disposed at end of scope -using var stream = new FileStream(path, FileMode.Open); -using var reader = new StreamReader(stream); - -// CORRECT: IAsyncDisposable -await using var conn = await CreateConnectionAsync(); -``` - -```csharp -// CORRECT: Dispose pattern -public class PacketReader : IDisposable -{ - private Stream? _stream; - private bool _disposed; - public void Dispose() - { - if (_disposed) return; - _stream?.Dispose(); _stream = null; _disposed = true; - } -} -``` - -## Security - -```csharp -// CORRECT: secure random for tokens -byte[] token = RandomNumberGenerator.GetBytes(32); - -// CORRECT: constant-time comparison for secrets -bool valid = CryptographicOperations.FixedTimeEquals(expected, actual); - -// CORRECT: validate external input -if (Uri.TryCreate(userInput, UriKind.Absolute, out var uri) - && uri.Scheme is "http" or "https") - await FetchAsync(uri); -``` - -```csharp -// WRONG: predictable random for security-sensitive values -var rng = new Random(); - -// WRONG: timing side-channel on secret comparison -bool eq = secret1.SequenceEqual(secret2); -``` - -## Miscellaneous Idioms - -```csharp -// CORRECT: var when type is obvious from RHS -var entities = new Dictionary(); -var timer = Stopwatch.StartNew(); - -// CORRECT: explicit type when var would be unclear -Stream responseStream = GetResponse(); -int count = items.Count; - -// CORRECT: expression-bodied members for one-liners -public override string ToString() => $"[{X}, {Y}, {Z}]"; -public bool IsAlive => Health > 0; - -// CORRECT: discards for unused values -_ = int.TryParse(s, out int result); -(_, int y, _) = GetCoordinates(); - -// CORRECT: nameof for resilient refactoring -throw new ArgumentException("Invalid value", nameof(packetId)); -LogToConsole($"{nameof(AutoEat)}: eating {item.Name}"); - -// .NET 10 / C# 14 — unbound generic in nameof -string typeName10 = nameof(Dictionary<,>); // "Dictionary" -// .NET 8 / C# 12 — use any closed generic instead -string typeName8 = nameof(Dictionary); // "Dictionary" - -// CORRECT: static lambdas prevent accidental closure allocations -list.Sort(static (a, b) => a.Id.CompareTo(b.Id)); - -// CORRECT: index/range operators -var last = items[^1]; -var slice = data[3..^1]; - -// CORRECT: tuple deconstruction -var (x, y, z) = GetPosition(); - -// CORRECT: string interpolation with alignment and format specifiers -LogToConsole($"Health: {health,6:F1} | Hunger: {hunger,6:F1}"); -``` diff --git a/.skills/csharp-best-practices/references/async-context-and-tradeoffs.md b/.skills/csharp-best-practices/references/async-context-and-tradeoffs.md deleted file mode 100644 index f6bdaedb79..0000000000 --- a/.skills/csharp-best-practices/references/async-context-and-tradeoffs.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -description: >- - Context-specific async guidance for library code, ui apps, asp.net core, - background work, task.run, configureawait, and performance-sensitive design. -metadata: - tags: [configureawait, task.run, asp.net core, ui, library, performance] - source: mixed ---- - -# Context and Tradeoffs - -## Library code versus app code - -### General-purpose library code -- Prefer APIs that expose true async for I/O-bound work. -- Do not add async wrappers around purely compute-bound methods just to look modern. Expose sync compute APIs and let callers decide whether to offload. -- `ConfigureAwait(false)` is a strong default when the library does not need the caller’s context. -- Avoid ambient assumptions about a UI thread, request context, or test framework behavior. - -### App code -- Prefer the style that fits the app model. -- UI code often needs the original context after `await`. -- ASP.NET Core request code normally does not need `Task.Run` just to stay responsive, because it already runs on thread pool threads. -- Do not present “ASP.NET Core has no synchronization context” as proof that every `ConfigureAwait(false)` discussion is obsolete. - -## `Task.Run` boundaries - -### Good uses -- Offload CPU-bound work so a UI thread can stay responsive. -- Offload CPU work from a caller when that scheduling boundary is deliberate. - -### Weak uses -- Wrapping synchronous I/O to pretend it is true async I/O. -- Calling `Task.Run` and immediately awaiting it in ASP.NET Core request handling when no CPU offload goal exists. -- Using `Task.Run` to hide blocking APIs instead of fixing the underlying API choice. - -## Fire-and-forget - -### Assume unsafe until proven otherwise -A background task needs answers for all of these: -- Who owns its lifetime? -- How are exceptions observed? -- How does shutdown cancel it? -- Does it touch scoped services or request-bound objects? -- Does work need retries, backpressure, or queueing? - -### Safer alternatives -- Await the task normally. -- Queue work to an owned background component. -- In ASP.NET Core, prefer hosted services or a dedicated background queue pattern for long-lived work. -- If scoped services are required in background processing, create an explicit scope instead of capturing request scope objects. - -## `ConfigureAwait` - -### Strong recommendation -- In general-purpose libraries, use `ConfigureAwait(false)` unless the continuation must run in the captured context. - -### Weak recommendation -- “Always use it in app code.” -- “Never use it on .NET Core.” -- “Use it once at the first await and you are done.” - -### Review note -If code after the `await` needs a specific context, say so explicitly. If it does not, the recommendation depends on whether the code is app-level or general-purpose library code. - -## Performance guidance - -### Correctness first -Do not trade API clarity for speculative micro-optimizations. - -### `ValueTask` is performance-specialized -Recommend it only when most of these are true: -1. the method is called very frequently -2. it often completes synchronously or from a reusable source -3. allocation reduction matters on measurements -4. consumers can respect single-consumer semantics -5. task combinator ergonomics are not central to the API - -### Throttling and concurrency control -- `Task.WhenAll` expresses concurrency; it does not limit it. -- For bounded concurrency, use an async gate such as `SemaphoreSlim.WaitAsync`, or platform helpers such as `Parallel.ForEachAsync` when the workload fits. -- Always define what happens to remaining work after the first completion or first failure. diff --git a/.skills/csharp-best-practices/references/async-core-guidance.md b/.skills/csharp-best-practices/references/async-core-guidance.md deleted file mode 100644 index 114ad50d0e..0000000000 --- a/.skills/csharp-best-practices/references/async-core-guidance.md +++ /dev/null @@ -1,105 +0,0 @@ ---- -description: >- - Source-backed core guidance for task, valuetask, cancellation, exception flow, - blocking, and concurrency in c# async code reviews and implementations. -metadata: - tags: [csharp, async, task, valuetask, cancellation, exceptions, concurrency] - source: mixed ---- - -# Core Guidance - -## Facts from official .NET documentation - -### 1. Return types and `async void` -- Async methods should normally return `Task` or `Task`. -- `async void` is intended for event handlers; callers cannot await it and exception handling differs. -- TAP methods that return awaitable types conventionally use the `Async` suffix. - -### 2. Blocking on async -- `Task.Result` is blocking. Prefer `await` in most cases. -- Blocking can deadlock in context-bound environments and reduces scalability even when it does not deadlock. -- `await` on a faulted task rethrows one exception directly; `.Wait()` and `.Result` wrap failures in `AggregateException`. - -### 3. `Task` versus `ValueTask` -- Default to `Task` or `Task` unless there is a demonstrated reason not to. -- `ValueTask` has stricter usage rules. A given instance should generally be awaited only once. -- Do not await the same `ValueTask` multiple times, call `AsTask()` multiple times, or mix consumption techniques on the same instance. -- For synchronously successful `Task`-returning methods, `Task.CompletedTask` is the normal zero-result completion value. - -### 4. Cancellation -- If a TAP method supports cancellation, expose a `CancellationToken`. -- Pass the token to nested operations that should participate in cancellation. -- If an async method throws `OperationCanceledException` associated with the method’s token, the returned task transitions to `Canceled`. -- After a method has completed its work successfully, do not report cancellation instead of success. - -### 5. Exception flow and task combinators -- `Task.WhenAll` does not block the calling thread. -- If any supplied task faults, the `WhenAll` task faults and aggregates the unwrapped exceptions from the component tasks. -- If none fault and at least one is canceled, the `WhenAll` task is canceled. -- `Task.WhenAny` returns a task that completes successfully with the first completed task as its result, even when that winning task itself is faulted or canceled. -- After `WhenAny`, await the returned winner task to propagate its outcome. -- The remaining tasks continue unless you cancel or otherwise handle them. - -## Expert guidance that is strong and technically grounded - -### Stephen Toub -- Use `ConfigureAwait(false)` as the general default for general-purpose library code, because library code should not depend on an app model’s context. -- App-level code is different. UI code often needs the captured context. ASP.NET Core also changes the deadlock discussion because it does not install the classic ASP.NET style synchronization context, but that does not make blanket `ConfigureAwait` advice strong. -- `ValueTask` exists mainly to avoid allocations on frequently synchronous success paths. It is not a general replacement for `Task` because `Task` is more flexible for multiple awaits, caching, and combinators. - -### Andrew Arnott -- Propagate the token until the point of no cancellation. -- Validate arguments before cancellation checks when argument validation should always run. -- Prefer catching `OperationCanceledException` rather than `TaskCanceledException` in general-purpose logic. -- Keep `CancellationToken` last in the parameter list; make it optional mainly on public APIs, not necessarily on internal methods. - -### Stephen Cleary -- “Async all the way” is a strong design guideline, not an absolute law of physics. Sync bridges exist, but they are specialized boundary decisions, not a normal code review recommendation. -- `async void` and sync-over-async both create real observability and composition problems even when a sample appears to work. - -## Naming and testability - -### Naming -- TAP methods that return awaitable types conventionally use the `Async` suffix. Do not force renames when an interface, base class, or event pattern already dictates the name. - -### Testability -- Favor awaitable APIs over hidden work so tests can await completion, assert faults, and drive cancellation deterministically. -- Prefer explicit background components, injected clocks, and owned queues over ad hoc fire-and-forget logic that tests cannot observe. - -## Synthesis for agents - -### Code review defaults -- Treat `.Result`, `.Wait()`, and `GetAwaiter().GetResult()` as likely defects unless the code is a deliberate sync boundary and the caller explicitly cannot be async. -- Prefer `Task`/`Task` for API design. Require an explicit reason before recommending `ValueTask`. -- Require cancellation behavior to be coherent: accepted, propagated, and not silently dropped. -- Prefer `await Task.WhenAll(...)` for independent operations started before awaiting. -- Treat `Task.WhenAny(...)` as incomplete until the winner is awaited and losers are canceled, observed, or intentionally left running. - -### Minimal examples - -#### Avoid sync-over-async -```csharp -// bad -var user = client.GetUserAsync(id).Result; - -// better -var user = await client.GetUserAsync(id); -``` - -#### Use `Task.WhenAll` for parallel I/O -```csharp -var userTask = repo.GetUserAsync(id, ct); -var ordersTask = repo.GetOrdersAsync(id, ct); -await Task.WhenAll(userTask, ordersTask); -return new Dashboard(await userTask, await ordersTask); -``` - -#### Be conservative with `ValueTask` -```csharp -// default -Task GetAsync(string key, CancellationToken ct); - -// specialized hot path only when justified -ValueTask TryGetCachedAsync(string key); -``` diff --git a/.skills/csharp-best-practices/references/async-source-notes.md b/.skills/csharp-best-practices/references/async-source-notes.md deleted file mode 100644 index 0d34589d1d..0000000000 --- a/.skills/csharp-best-practices/references/async-source-notes.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -description: >- - Authority notes and citations for the c# async best practices skill, separating - official documentation, expert interpretation, and synthesized guidance. -metadata: - tags: [sources, citations, authority, notes] - source: external ---- - -# Source Notes - -## Official facts - -- Microsoft Learn, "Implementing the Task-based Asynchronous Pattern" - - https://learn.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/implementing-the-task-based-asynchronous-pattern - - Return types, cancellation behavior, `Task.Run` boundaries, and TAP implementation guidance. -- Microsoft Learn, "Consuming the Task-based Asynchronous Pattern" - - https://learn.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern - - `await`, `WhenAll`, `WhenAny`, cancellation propagation, and exception behavior. -- Microsoft Learn, "Async return types" - - https://learn.microsoft.com/en-us/dotnet/csharp/asynchronous-programming/async-return-types - - `Task`, `Task`, `async void`, generalized async return types. -- Microsoft Learn, `ValueTask` API reference - - https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.valuetask - - single-consumer warnings and default-to-`Task` guidance. -- Microsoft Learn, ASP.NET Core best practices - - https://learn.microsoft.com/en-us/aspnet/core/fundamentals/best-practices - - avoid blocking calls, avoid unnecessary `Task.Run`, background-work cautions. -- Microsoft Learn, hosted services in ASP.NET Core - - https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services - - safe long-lived background work and cancellation during shutdown. - -## Expert guidance used only when technically grounded - -- Stephen Toub, ".NET Blog: ConfigureAwait FAQ" - - https://devblogs.microsoft.com/dotnet/configureawait-faq/ - - best source for context capture semantics and library-vs-app guidance. -- Stephen Toub, ".NET Blog: Understanding the Whys, Whats, and Whens of ValueTask" - - https://devblogs.microsoft.com/dotnet/understanding-the-whys-whats-and-whens-of-valuetask/ - - performance rationale and tradeoffs behind `ValueTask`. -- Stephen Toub, ".NET Blog: Await, and UI, and deadlocks! Oh my!" - - https://devblogs.microsoft.com/dotnet/await-and-ui-and-deadlocks-oh-my/ - - canonical deadlock explanation for context-bound code. -- Stephen Toub, ".NET Blog: Task Exception Handling in .NET 4.5" - - https://devblogs.microsoft.com/dotnet/task-exception-handling-in-net-4-5/ - - explains `await` versus blocking exception shape and why `WhenAll` matters. -- Andrew Arnott, "Recommended patterns for CancellationToken" - - https://devblogs.microsoft.com/premier-developer/recommended-patterns-for-cancellationtoken/ - - practical cancellation design heuristics; useful, but not treated as a language/runtime spec. -- Stephen Cleary, "Async/Await - Best Practices in Asynchronous Programming" - - https://learn.microsoft.com/en-us/archive/msdn-magazine/2013/march/async-await-best-practices-in-asynchronous-programming - - useful design interpretation, but older and treated as contextual guidance rather than current official policy. - -## Where the skill is intentionally cautious - -- `ConfigureAwait`: strong guidance exists for libraries, weaker guidance for app code. Blanket rules are rejected. -- `Task.Run`: valid for deliberate CPU offload, weak as a server-side patch for blocking I/O. -- `ValueTask`: supported and useful, but easy to misuse. The skill defaults to `Task` unless evidence is present. -- Fire-and-forget: acceptable only with explicit ownership and lifecycle design, especially in server code. diff --git a/.skills/csharp-solid-principles b/.skills/csharp-solid-principles new file mode 120000 index 0000000000..72d330712d --- /dev/null +++ b/.skills/csharp-solid-principles @@ -0,0 +1 @@ +../MCC-Skills/skills/csharp-solid-principles \ No newline at end of file diff --git a/.skills/dmcbk-marketplace-authoring b/.skills/dmcbk-marketplace-authoring new file mode 120000 index 0000000000..86484684bf --- /dev/null +++ b/.skills/dmcbk-marketplace-authoring @@ -0,0 +1 @@ +../MCC-Skills/skills/dmcbk-marketplace-authoring \ No newline at end of file diff --git a/.skills/dmcbk-plugin-authoring b/.skills/dmcbk-plugin-authoring new file mode 120000 index 0000000000..6f9c6198df --- /dev/null +++ b/.skills/dmcbk-plugin-authoring @@ -0,0 +1 @@ +../MCC-Skills/skills/dmcbk-plugin-authoring \ No newline at end of file diff --git a/.skills/dotnet-performance-profiling-and-optimization b/.skills/dotnet-performance-profiling-and-optimization new file mode 120000 index 0000000000..b1af7a7227 --- /dev/null +++ b/.skills/dotnet-performance-profiling-and-optimization @@ -0,0 +1 @@ +../MCC-Skills/skills/dotnet-performance-profiling-and-optimization \ No newline at end of file diff --git a/.skills/dotnet-performance-profiling-and-optimization/SKILL.md b/.skills/dotnet-performance-profiling-and-optimization/SKILL.md deleted file mode 100644 index ec1da9a2c9..0000000000 --- a/.skills/dotnet-performance-profiling-and-optimization/SKILL.md +++ /dev/null @@ -1,342 +0,0 @@ ---- -name: dotnet-performance-profiling-and-optimization -description: >- - Use when a .NET process is slow, hung, memory-heavy, or deadlocked, or when - analyzing C#/ASP.NET Core code for performance anti-patterns across memory, - async, LINQ, database, JSON, caching, DI, concurrency, HttpClient, exceptions, - response, strings, startup, and metrics. -metadata: - category: technique - triggers: - - dotnet-counters - - dotnet-trace - - dotnet-dump - - dotnet-gcdump - - dotnet-stack - - benchmarkdotnet - - allocations - - gc pressure - - memory leak - - hot path - - linq - - stackalloc - - span - - boxing - - heap - - latency - - throughput - - slow - - hang - - deadlock - - optimize - - performance - - async - - caching - - di lifetime - - ef core - - cosmosdb - - json serialization - - httpclient - - middleware -version: 1.1.0 -platform: ".NET 8 and .NET 10 (no .NET 9 projects in scope)" ---- - -# .NET Performance: Diagnostic & Code Review - -Unified C#/.NET performance skill targeting **.NET 8 and .NET 10**. Two modes: live process diagnostics (Mode A) and static code optimization review with fixes (Mode B). - -## Step 0 — Detect the target framework - -Before recommending APIs, follow `../../references/detect-target-framework.md`. Many .NET 9+ APIs (`HybridCache`, `MemoryExtensions.Split` for spans, `Dictionary.GetAlternateLookup`, `params ReadOnlySpan`) do **not** exist on .NET 8 — the references below mark the floor for each pattern, and you must downgrade to the .NET 8 fallback when the target is `net8.0`. Stephen Toub's posts are the primary benchmark source: -[Performance Improvements in .NET 8](https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-8/) · -[Performance Improvements in .NET 10](https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-10/). - -## References - -Load on demand: -- [references/memory-model-gc.md](references/memory-model-gc.md) — stack vs heap, generations, LOH, boxing, GC tuning -- [references/code-patterns.md](references/code-patterns.md) — LINQ, Span/Memory, stackalloc, structs, boxing, pooling, strings (conceptual framing) -- [references/categories.md](references/categories.md) — 14 optimization category definitions with checks and grep patterns (Mode B spine) -- [references/grep-patterns.md](references/grep-patterns.md) — consolidated anti-pattern grep library for Phase 1 scanning -- [references/measurement-guide.md](references/measurement-guide.md) — BenchmarkDotNet, k6, dotnet-counters, KPI targets, CI/CD - -Pattern catalogs (with measured impact numbers, ❌/✅ pairs, and per-topic Detection recipes): -- [references/critical-patterns.md](references/critical-patterns.md) — 17 🔴 patterns: deadlocks, order-of-magnitude regressions, excessive allocations -- [references/async-patterns.md](references/async-patterns.md) — sync-over-async, ValueTask hot paths, Channels, false sharing -- [references/memory-and-strings.md](references/memory-and-strings.md) — `u8` literals, `Span.Split`/`TryWrite`, compound `+=`, chained `.Replace()` -- [references/collections-and-linq.md](references/collections-and-linq.md) — `FrozenDictionary`, `GetAlternateLookup`, `CollectionsMarshal.GetValueRefOrAddDefault`, hoisting static data -- [references/regex-patterns.md](references/regex-patterns.md) — `[GeneratedRegex]`, `IsMatch`, `EnumerateMatches`, `NonBacktracking` -- [references/io-and-serialization.md](references/io-and-serialization.md) — `HttpCompletionOption.ResponseHeadersRead`, `useAsync` `FileStream`, `Memory` overloads -- [references/structural-patterns.md](references/structural-patterns.md) — sealed-class devirtualization (absence pattern, scale-based severity) - -Reference loading guide for Mode B by signal: - -| Signal in Code | Load | -|---|---| -| `async`, `await`, `Task`, `ValueTask` | `async-patterns.md` | -| `Span<`, `Memory<`, `stackalloc`, `string.Substring`, `+=` in loops, `params` | `memory-and-strings.md` | -| `Regex`, `[GeneratedRegex]`, `Regex.Match`, `RegexOptions.Compiled` | `regex-patterns.md` | -| `Dictionary<`, `List<`, `.ToList()`, LINQ chains, `static readonly Dictionary<` | `collections-and-linq.md` | -| `JsonSerializer`, `HttpClient`, `Stream`, `FileStream` | `io-and-serialization.md` | -| Any code review on a hot path | always check `critical-patterns.md` first | -| Codebase-wide scans (sealed classes, static `Dictionary` → `FrozenDictionary`) | `structural-patterns.md` | - -## Iron Rule - -**Always measure first, change second, and re-measure third.** - -Never claim an optimization without before/after evidence from the same scenario. - -| Rationalization | Reality | -|---|---| -| "This is obviously slow" | The runtime, JIT, and libraries often invalidate intuition. | -| "struct means stack" | Value types are stored inline — not always on the stack. | -| "All LINQ is slow" | .NET 9+ improved many LINQ paths. Measure before rewriting. | -| "GC.Collect will fix it" | Forced collection treats symptoms, not cause. | -| "Too small to matter" | MEDIUM+ impact is cumulative across the request pipeline. | -| "I'll change the DI lifetime while I'm here" | DI lifetime changes require explicit user approval. | -| "Need to refactor to optimize" | Optimization fixes must be surgical. Refactoring is a separate task. | -| "Tests pass so fix is correct" | Tests passing = behavior preserved. Still verify the metric improved. | - -## Mode Selection - -| Situation | Mode | -|---|---| -| Live process: slow, high CPU/memory, hung, deadlocked, GC pauses | **A – Diagnostic** | -| Asking how GC, heap, boxing, or LINQ overhead works in .NET | **A – Diagnostic** (conceptual) | -| Code to analyze for anti-patterns, then fix | **B – Code Review** | -| Both a running process AND code to fix | Start with **A**, then **B** on hot paths identified | - -**Not for:** Visual Studio, Rider, PerfView, speedscope, or GUI-first workflows. - ---- - -## Mode A: Diagnostic (Live Process) - -### Investigation Order - -1. **`dotnet-counters`** — always start here for live triage. -2. **`dotnet-stack`** — immediately if process is stuck, hung, or deadlocked. -3. **`dotnet-trace`** — if CPU or allocation hot paths matter. -4. **`dotnet-gcdump`** — if heap growth matters more than call paths. -5. **`dotnet-dump`** — if SOS heap inspection or postmortem analysis is needed. -6. After live evidence identifies a candidate routine, apply patterns from [references/code-patterns.md](references/code-patterns.md) and [references/memory-model-gc.md](references/memory-model-gc.md). -7. Use BenchmarkDotNet if the change is isolated and needs microbenchmark comparison. -8. Re-run the original live capture to prove the real workload improved. - -### CLI Tool Selection - -| Question | Tool | What it answers | -|---|---|---| -| Is the process allocating, GCing, or saturating CPU? | `dotnet-counters` | Live counters and trend direction | -| Is the process hung or deadlocked right now? | `dotnet-stack` | Current managed stack snapshot | -| Which call paths consume CPU or allocate heavily? | `dotnet-trace` | Sampled execution and runtime events | -| Which object types dominate managed heap? | `dotnet-gcdump` | Heap composition and type totals | -| Need SOS heap inspection or thread state? | `dotnet-dump` | Full dump plus CLI analysis | -| Did a code change improve an isolated routine? | BenchmarkDotNet | Reproducible microbenchmark comparison | - -### Minimal CLI Commands - -```bash -dotnet-counters monitor -p --counters System.Runtime -dotnet-counters monitor -n --counters System.Runtime,Microsoft.AspNetCore.Hosting -dotnet-stack report -p -dotnet-trace collect -p --duration 00:00:30 -dotnet-trace report topN -dotnet-gcdump collect -p -dotnet-gcdump report -dotnet-dump collect -p --type Heap -dotnet-dump analyze -c "dumpheap -stat" -c "exit" -``` - -Minimal BenchmarkDotNet pattern: -```csharp -[MemoryDiagnoser] -[SimpleJob(RuntimeMoniker.Net90)] -public class CandidateBench -{ - [Benchmark(Baseline = true)] - public int Original() => OriginalImpl(); - - [Benchmark] - public int Candidate() => CandidateImpl(); -} -``` -```bash -dotnet run -c Release -``` - -### Reference Loading Guide - -| User question | Load first | -|---|---| -| "How do stack and heap really work in .NET?" | `references/memory-model-gc.md` | -| "Why is GC pausing or why is LOH churn hurting us?" | `references/memory-model-gc.md` | -| "How should I optimize this LINQ?" | `references/code-patterns.md` | -| "Can I move this to the stack with stackalloc or Span?" | `references/code-patterns.md` | -| "Should this be a struct, ref struct, readonly struct, or class?" | Both | -| "Why is this boxing?" | `references/code-patterns.md` | - -### Diagnostic Output - -Report: measured symptom + evidence (counter values, trace hotspots, heap stats) · chosen tool and why · relevant tradeoff (allocation vs copy, deferred vs eager, stack vs pool) · before/after result, or explicitly state if still unverified. - ---- - -## Mode B: Code Review (Static Analysis) - -### Target - -`$ARGUMENTS` is the optimization target: -- **File path**: Analyze that file and its close dependencies. -- **Directory**: Analyze all C# files in that directory. -- **"all"**: Scan the solution with Grep, deep-dive the worst offenders. -- **`--fix`** anywhere: Skip confirmation and apply fixes after analysis. -- **Empty**: Check `git diff --name-only HEAD~5 -- '*.cs'` for recently changed files. If none, ask the user. - -### Phase 1: Discovery - -1. **Glob** to find `.cs` files matching the target. -2. **Read** file contents. For files under 500 lines, read the whole file first — visual inspection catches patterns faster than grep, then grep confirms counts. -3. **Detect signals** in the code (async, Span, Regex, Dictionary, JsonSerializer, etc.) and **load matching pattern catalogs** from the per-topic references listed at the top of this file. -4. **Grep** for anti-patterns. Run the recipes in [references/grep-patterns.md](references/grep-patterns.md) plus the per-topic Detection sections in the catalogs you loaded. -5. **Emit a scan execution checklist** before classifying — list each recipe and the hit count. **0 hits is valid and valuable** (confirms good practice). - -### Phase 2: Analysis (Read-Only) - -Check each file against all 14 categories. Record per finding: **file path, line number, current pattern, recommended pattern, impact level, category**. - -Read [references/categories.md](references/categories.md) for detailed check definitions. - -#### Compound Allocation Check - -Single-line grep recipes miss multi-allocation patterns. After running scan recipes, look for: - -1. **Branched `.Replace()` chains** — methods that call `.Replace()` across multiple `if/else` branches. Report total allocation count across all branches, not just per-line. -2. **Cross-method chaining** — public method A calls B (which does 3 regex replaces) then calls C (which allocates). Report the total chain cost as one finding, not per-method. -3. **Compound `+=` with embedded allocating calls** — `result += $"...{Foo().ToLower()}"` is 2+ allocations (interpolation + `ToLower` + concatenation). Flag the compound cost, not just `.ToLower()`. -4. **`string.Format` specificity** — distinguish resource-loaded format strings (not fixable) from compile-time literal format strings (fixable with interpolation). Enumerate only the actionable sites. - -#### Cross-File Consistency Check - -If an optimized pattern is found in one file, check whether sibling files (same directory, same interface, same base class) use the un-optimized equivalent. Flag as MEDIUM with the optimized file as evidence. - -#### Verify-the-Inverse Rule - -For absence patterns (e.g., unsealed classes, static `Dictionary` not converted to `FrozenDictionary`, `RegexOptions.Compiled` not migrated to `[GeneratedRegex]`), always count both sides and report the **N-of-M ratio**, not just the count of bad cases. The ratio determines severity: - -- 0/185 sealed → systematic codebase-wide issue -- 12/15 sealed → consistency fix on the remaining 3 -- 50/100 sealed → mid-migration; flag the laggards - -| # | Category | Code | Focus | -|---|---|---|---| -| 1 | Memory Allocation | MEM | Span, ArrayPool, pooling, stackalloc, string optimization, collections | -| 2 | Async Anti-Patterns | ASYNC | Blocking, ValueTask, CancellationToken, IAsyncEnumerable, Channel | -| 3 | LINQ Inefficiencies | LINQ | Count vs Any, multiple enumeration, filter/project order | -| 4 | Database | DB | EF Core, CosmosDB patterns, N+1, partition keys, RU cost | -| 5 | JSON Serialization | JSON | Options reuse, source generators, serializer boundaries | -| 6 | Caching | CACHE | HybridCache, stampede protection, output cache, size limits | -| 7 | DI Lifetimes | DI | Captive dependencies, lifetime mismatches, IOptions patterns | -| 8 | Concurrency | CONC | Lock contention, throttling, thread safety, Channel patterns | -| 9 | HttpClient | HTTP | IHttpClientFactory, resilience, response disposal | -| 10 | Exception Control Flow | EXC | Try/catch for expected paths, broad catches | -| 11 | Response Optimization | RESP | Compression, pagination, ETags | -| 12 | String Optimization | STR | Concatenation loops, ToLower/ToUpper, String.Format | -| 13 | Startup & Pipeline | STARTUP | Middleware ordering, compression, health checks, PGO | -| 14 | Metrics & Observability | METRICS | IMeterFactory, histograms, tag cardinality, OpenTelemetry | - -### Phase 3: Report - -``` -## Performance Analysis Report - -### Summary -- Files analyzed: N -- Total findings: N -- Critical (HIGH): N | Moderate (MEDIUM): N | Minor (LOW): N - -### Findings by Category - -#### [CATEGORY_NAME] (N findings) - -| # | Impact | File:Line | Issue | Recommendation | -|---|--------|-----------|-------|----------------| -| 1 | HIGH | `path/File.cs:42` | Current anti-pattern | Recommended fix | - -### Prioritized Action List -1. [HIGH] Fix blocking async calls in X — thread pool starvation risk -2. [MEDIUM] Switch to ArrayPool in Z — reduces GC pressure on upload path -``` - -**Impact levels:** -- **HIGH**: Measurable gain, prevents starvation, fixes correctness, reduces P95 latency. Examples: blocking async, missing CancellationToken, N+1 queries, captive dependencies. -- **MEDIUM**: Reduces allocations, GC pressure, or unnecessary work. Examples: ArrayPool, StringBuilder, FrozenDictionary. -- **LOW**: Minor improvements, cold-path optimizations. Examples: initial collection capacity, Count() vs Any(). - -**Scale-based severity escalation.** When the same anti-pattern appears across many instances, escalate: - -- 1–10 instances → report at the pattern's base severity -- 11–50 instances → escalate LOW patterns to MEDIUM -- 50+ instances → MEDIUM with elevated priority; flag as a codebase-wide systematic issue - -Always report **exact counts from scan recipes**, not estimates. Group findings by severity (HIGH → MEDIUM → LOW), not by file. Merge related findings that share the same fix (e.g., all `.ToLower()` calls in one finding, not split per file). - -### Phase 4: Optimization (Apply Fixes) - -After presenting the report: -- If `--fix` in `$ARGUMENTS`, proceed directly. -- Otherwise ask: "Would you like me to apply these optimizations? I'll work one category at a time, starting with HIGH impact. You can specify categories or findings (e.g., 'fix ASYNC and MEM' or 'fix #1, #3')." - -**Before any fix:** -1. **Read actual code context** around the grep match — false positives exist (`.Result` in `Task.FromResult` is NOT blocking). -2. Confirm the finding is real. If uncertain, flag as "needs manual review." - -**Applying fixes:** -1. One category at a time, highest impact first. Use Edit tool with brief before/after summary. -2. After each category: `dotnet build --no-restore` -3. After all changes: `dotnet test` -4. If build or tests fail, diagnose before continuing. - ---- - -## Analyzer Radar - -- `CA1826`, `CA1827`, `CA1829`, `CA1836`, `CA1851`, `CA1860` — LINQ and enumeration -- `CA1845`, `CA1846`, `CA1858` — string and span-friendly APIs -- `CA1834`, `CA1865`–`CA1867` — StringBuilder char overloads -- `CA1870` — cached `SearchValues` - -These are clues, not goals. Apply where measured hot paths justify it. - -## Pattern Guardrails - -- Do not say "put it on the stack" as a blanket goal. Explain lifetime, copies, boxing, and escape rules. -- Do not suggest `stackalloc` for unbounded sizes, large buffers, or loop-carried allocations. -- Do not recommend `Span` for data that crosses `await`, escapes to the heap, or lives in object fields — use `Memory`. -- Do not recommend converting every `class` to a `struct` — large, mutable, or frequently boxed types often get worse. -- Do not blanket-rewrite LINQ to loops — use analyzer-backed fixes first. -- Do not recommend pooling without ownership rules — returned pooled arrays must not be reused by the caller. -- Do not recommend `GC.Collect()` except for rare justified lifecycle boundaries with measurement. - -## Red Flags — STOP and Confirm - -Stop and ask before: -- Changing `Program.cs` or the middleware pipeline -- Adding a new NuGet package -- Changing any DI service lifetime registration -- Replacing the serializer in the HTTP pipeline -- Modifying API response shapes or route patterns -- Changing error handling patterns - -## Constraints - -- NEVER add NuGet packages without user approval -- NEVER change DI lifetimes without explaining implications and getting confirmation -- NEVER modify `Program.cs` or middleware pipeline without explicit approval -- NEVER change API contracts, route patterns, or response shapes -- ALWAYS preserve existing tests; update only if behavior intentionally changes -- ALWAYS use the Grep tool for searches, never bash `grep` or `find` - -Consult the project's CLAUDE.md or AGENTS.md for project-specific rules and constraints. diff --git a/.skills/dotnet-performance-profiling-and-optimization/references/async-patterns.md b/.skills/dotnet-performance-profiling-and-optimization/references/async-patterns.md deleted file mode 100644 index 88cb211f2a..0000000000 --- a/.skills/dotnet-performance-profiling-and-optimization/references/async-patterns.md +++ /dev/null @@ -1,112 +0,0 @@ -# Async & Concurrency Patterns - -### Don't Expose Async Wrappers for Sync Methods -🟡 **AVOID** wrapping sync methods with `Task.Run` in libraries | .NET Core+ - -❌ -```csharp -public Task ComputeHashAsync(byte[] data) => - Task.Run(() => ComputeHash(data)); -``` -✅ -```csharp -public int ComputeHash(byte[] data) { /* CPU-bound work */ } -// Consumer decides: var hash = await Task.Run(() => lib.ComputeHash(data)); -``` - -**Impact: Eliminates unnecessary thread pool queue/dequeue overhead per call.** - -### Don't Expose Sync Wrappers for Async Methods -🟡 **AVOID** creating sync wrappers that block on async implementations | .NET Core+ - -❌ -```csharp -public string GetData() => GetDataAsync().Result; -``` -✅ -```csharp -public async Task GetDataAsync() { /* ... */ } -``` - -**Impact: Prevents deadlocks and thread pool starvation from hidden sync-over-async blocking.** - -### Use ValueTask for Hot Paths with Frequent Sync Completion -🟡 **DO** use `ValueTask` on hot paths where sync completion is common | .NET Core 2.1+ - -❌ -```csharp -public async Task ReadAsync(Memory buffer) -{ - if (_bufferedCount > 0) - return ReadFromBuffer(buffer.Span); - return await ReadAsyncCore(buffer); -} -``` -✅ -```csharp -public ValueTask ReadAsync(Memory buffer) -{ - if (_bufferedCount > 0) - return new ValueTask(ReadFromBuffer(buffer.Span)); - return new ValueTask(ReadAsyncCore(buffer)); -} -``` - -**Impact: Eliminates Task\ allocation on synchronous completion — the struct stores results inline.** - -### Use Channels for Producer/Consumer -🟡 **DO** use `System.Threading.Channels` for producer-consumer patterns | .NET Core 3.0+ - -❌ -```csharp -var queue = new BlockingCollection(); -var item = queue.Take(); -``` -✅ -```csharp -var channel = Channel.CreateUnbounded(); - -// Producer -await channel.Writer.WriteAsync(item); - -// Consumer -await foreach (var item in channel.Reader.ReadAllAsync()) - Process(item); -``` - -**Impact: ~25% faster, ~95% fewer GC collections vs manual approaches.** - -### Avoid False Sharing with Thread-Local State -🟡 **AVOID** adjacent mutable fields written by different threads | .NET 7+ - -❌ -```csharp -class SharedCounters -{ - public long Counter1; - public long Counter2; -} -``` -✅ -```csharp -[StructLayout(LayoutKind.Explicit, Size = 128)] -struct PaddedCounter -{ - [FieldOffset(0)] public long Value; -} -``` - -**Impact: Eliminates cross-core cache invalidation — can improve multi-threaded throughput by 10x+.** - -## Detection - -Scan recipes for async anti-patterns. Run these and report exact counts. - -```bash -# async void methods (correctness issue — crashes on exception) -grep -rn --include='*.cs' 'async void' --exclude-dir=bin --exclude-dir=obj . | grep -v 'event' | wc -l -``` - -### Patterns Requiring Manual Review - -- **Sync-over-async** (`.Result`, `.Wait()`): `.Result` matches any property named Result — needs type context to confirm it's `Task.Result` diff --git a/.skills/dotnet-performance-profiling-and-optimization/references/categories.md b/.skills/dotnet-performance-profiling-and-optimization/references/categories.md deleted file mode 100644 index a04416a4c7..0000000000 --- a/.skills/dotnet-performance-profiling-and-optimization/references/categories.md +++ /dev/null @@ -1,297 +0,0 @@ -# Optimization Category Definitions - -Complete check definitions for all 14 optimization categories. Each category lists specific checks to perform, with grep patterns at the end for automated scanning. - ---- - -## Category 1: Memory Allocation (MEM) - -Checks: - -- **Unnecessary string allocations**: `Substring()` calls that could use `Span` or `AsSpan()`. String concatenation with `+` inside loops (should use `StringBuilder` or `string.Create`). -- **Missing ArrayPool/MemoryPool usage**: `new byte[...]` for temporary buffers, especially in I/O paths. Should use `ArrayPool.Shared.Rent()` with try/finally Return. -- **Large Object Heap triggers**: Allocations of objects >= 85,000 bytes (arrays, large strings, `MemoryStream` without `RecyclableMemoryStream`). -- **Missing object pooling**: Frequently created/disposed objects (like `StringBuilder`) that could use `ObjectPool`. -- **Record class vs record struct**: Small, immutable DTOs that are `record class` but could be `readonly record struct` to avoid heap allocation. -- **Boxing**: Value types cast to `object` or non-generic interfaces. Structs without `IEquatable`. -- **Collection inefficiencies**: `new List()` or `new Dictionary()` without initial capacity when size is known or estimable. Double-lookup patterns (`TryGetValue` + indexer set) that could use `CollectionsMarshal.GetValueRefOrAddDefault`. Read-only dictionaries populated once that could be `FrozenDictionary` (.NET 8+). -- **stackalloc for small buffers**: Flag `new byte[N]` where N <= 256 in synchronous methods. Recommend `Span buffer = stackalloc byte[N]` for short-lived stack allocation with zero GC pressure. -- **string.Create for pre-sized construction**: When output string length is known at call time, `string.Create(length, state, action)` avoids intermediate allocations by writing directly into the final buffer. -- **Interpolated strings in logging** *(Impact: LOW — only matters when the log level is inactive at runtime)*: `_logger.LogXxx($"...")` allocates the interpolated string even when the log level is disabled. Use structured logging parameters `_logger.LogXxx("Message {Param}", value)` or the `[LoggerMessage]` source generator for high-frequency hot paths. -- **ReadOnlySpan for string parsing**: Flag `.Split()` and `.Substring()` in hot paths where `AsSpan()` slicing avoids allocation. Common in string parsing, normalization, and URL handling. -- **CollectionsMarshal.GetValueRefOrAddDefault**: Flag the TryGetValue + indexer set double-lookup pattern. Single-lookup alternative reduces dictionary operations by 50%. -- **RecyclableMemoryStream**: Flag `new MemoryStream()` in I/O-heavy paths (blob upload/download, log writes). `Microsoft.IO.RecyclableMemoryStream` pools internal buffers and avoids LOH fragmentation. - -Grep patterns: -``` -\.Substring\( -new byte\[ -new MemoryStream\(\) -new StringBuilder\(\) -new List<.*>\(\) -new Dictionary<.*>\(\) -_logger\.Log(Debug|Trace|Information|Warning|Error|Critical)\(\$" -\.Split\( -``` - ---- - -## Category 2: Async Anti-Patterns (ASYNC) - -Checks: - -- **Blocking async calls**: `.Result`, `.Wait()`, `.GetAwaiter().GetResult()` -- causes thread pool starvation. CRITICAL finding. -- **async void**: Methods declared `async void` (except event handlers) -- swallows exceptions and cannot be awaited. -- **Missing CancellationToken**: Async methods that do not accept or propagate `CancellationToken`. Every async method should have `CancellationToken cancellationToken = default`. -- **Missing ValueTask**: Methods that frequently return cached/synchronous results but use `Task` instead of `ValueTask`. Look for `if (cache.TryGetValue(...)) return Task.FromResult(...)`. Benchmark data: ValueTask 7.41ns/0B vs Task 15.23ns/72B. -- **Sequential awaits that could parallelize**: Multiple independent `await` calls in sequence that could use `Task.WhenAll`. -- **Async over sync**: Methods that use `Task.Run` to wrap synchronous code in an ASP.NET Core context (unnecessary and wastes a thread). -- **ConfigureAwait(false) in library projects**: LOW/INFO level. Not required in ASP.NET Core (no sync context), but recommended if library assemblies may be reused outside ASP.NET Core. -- **IAsyncEnumerable opportunities**: Methods returning `Task>` where the caller iterates sequentially. If the caller processes items one-by-one, `IAsyncEnumerable` reduces memory and improves time-to-first-byte. -- **Channel verification**: Verify `BoundedChannelOptions` has `SingleReader`/`SingleWriter` hints set for performance. Verify `CancellationToken` is propagated on `WriteAsync` and `ReadAllAsync`. - -Grep patterns: -``` -\.Result[^s] -\.Wait\(\) -\.GetAwaiter\(\)\.GetResult\(\) -async void -Task\.Run\( -\.WriteAsync\([^,]*\) -``` - ---- - -## Category 3: LINQ Inefficiencies (LINQ) - -Checks: - -- **Count() > 0 or Count() == 0**: Should use `Any()` or `!Any()`. `Count()` may enumerate the entire collection. -- **Multiple enumeration**: An `IEnumerable` variable used more than once without materializing. -- **Filter after projection**: `.Select(...).Where(...)` -- should filter first, then project. -- **ToList() too early**: `.ToList().Where(...)` or `.ToList().Select(...)` -- materializes before filtering. -- **OrderBy before Where**: Sorting the full collection before filtering it down. - -Grep patterns: -``` -\.Count\(\) [><=!] -\.ToList\(\)\.Where\( -\.ToList\(\)\.Select\( -\.Select\(.*\)\.Where\( -\.OrderBy.*\.Where\( -``` - ---- - -## Category 4: Database (DB) - -Check for both EF Core and CosmosDB patterns depending on what the project uses. Consult the project's CLAUDE.md or AGENTS.md for the data access strategy. - -Checks: - -- **N+1 queries**: Loops that call the database inside each iteration. -- **Missing AsNoTracking**: EF Core read-only queries without `.AsNoTracking()`. -- **Missing compiled queries**: Frequently executed EF Core queries on hot paths without `EF.CompileAsyncQuery`. -- **Full entity loading**: Fetching entire entities when only a few fields are needed (should project to DTOs). -- **Missing AsSplitQuery**: EF Core queries with multiple `.Include()` calls without `.AsSplitQuery()`. -- **CosmosDB partition key misuse**: Operations not specifying the partition key, or using cross-partition queries unnecessarily. -- **CosmosDB point reads**: Using queries instead of `ReadItemAsync` when both `id` and partition key are known. -- **RU cost awareness**: Flag discarded `ItemResponse` without logging `RequestCharge`. Recommend tracking RU cost via metrics for cost visibility. -- **Cross-partition query detection**: `GetItemLinqQueryable()` without partition key option leads to fan-out queries. Verify all LINQ queryables specify the partition key. -- **Indexing policy review**: Flag if queries filter on fields that likely lack composite indexes. -- **Redundant round-trips**: Flag patterns where a query fetches an ID, then a separate point read fetches the full document. Recommend a single query. -- **EnableContentResponseOnWrite = false**: On write operations where the response body is not needed, setting this option reduces RU cost. - -Grep patterns: -``` -\.Include\(.*\.Include\( -await.*foreach.*await.*Async -ReadItemAsync -GetItemQueryIterator -GetItemLinqQueryable -\.RequestCharge -``` - ---- - -## Category 5: JSON Serialization (JSON) - -Checks: - -- **New JsonSerializerOptions per call**: `new JsonSerializerOptions { ... }` inside method bodies -- rebuilds the metadata cache every time. Should use a static readonly instance. -- **Missing source generators**: High-throughput serialization paths without `[JsonSerializable]` source generation context. -- **Newtonsoft.Json in hot paths**: If the project uses Newtonsoft.Json for MVC, flag any hot-path internal serialization that could benefit from `System.Text.Json` with source generators. NEVER suggest replacing the controller/DTO serializer without checking the project's documented constraints. -- **System.Text.Json source generators for internal serialization**: Internal paths (database serialization, audit logs, blob metadata) that don't affect API contracts are candidates for `System.Text.Json` with source generators. -- **JsonSerializerSettings singleton**: Flag `new JsonSerializerSettings()` in method bodies. The contract resolver cache is rebuilt each time. Use a static readonly instance or inject via DI. -- **CosmosDB SDK serializer**: The Cosmos SDK supports custom serializers. `CosmosSystemTextJsonSerializer` with source generators reduces allocation on read/write operations. - -Grep patterns: -``` -new JsonSerializerOptions -JsonConvert\.Serialize -JsonConvert\.Deserialize -new JsonSerializer -new JsonSerializerSettings -``` - ---- - -## Category 6: Caching (CACHE) - -Checks: - -- **Repeated expensive calls without caching**: Service methods that call external APIs on every request without caching the result. -- **Missing HybridCache pattern**: Look for manual cache-aside patterns that could use `HybridCache` for built-in stampede protection, two-level caching (L1 memory + L2 distributed), and tag invalidation. **HybridCache requires .NET 10 (or .NET 9) — the `Microsoft.Extensions.Caching.Hybrid` package does not target .NET 8.** On .NET 8 implement `IMemoryCache` (L1) + `IDistributedCache` (L2) manually with a `SemaphoreSlim` keyed by cache key for stampede protection. See [HybridCache GA announcement](https://devblogs.microsoft.com/dotnet/hybrid-cache-is-now-ga/). -- **Static data fetched repeatedly**: Configuration, taxonomies, or lookup data fetched from external APIs that rarely changes. -- **Missing output caching**: Read-only GET endpoints that return the same data for all callers -- candidates for `[OutputCache]`. -- **HybridCache upgrade path (.NET 10 only)**: Manual L1+L2 caching with `SemaphoreSlim` stampede protection can migrate to `HybridCache` `GetOrCreateAsync` with built-in stampede protection and tag invalidation **when the project target is `net10.0`**. On `net8.0` the manual pattern is the correct end state, not a stepping stone. -- **Cache stampede detection**: Cache-aside without locking -- `TryGetValue` followed by expensive call followed by `Set` without `SemaphoreSlim` or equivalent stampede guard. -- **Tag-based invalidation with RemoveByTagAsync**: When using HybridCache, group related entries by tag for efficient bulk invalidation instead of tracking individual keys. -- **IMemoryCache size limits**: Flag `AddMemoryCache()` without `SizeLimit` in `MemoryCacheOptions`. Unbounded in-memory cache can grow until the process runs out of memory. - -Grep patterns: -``` -GetAsync\( -SendAsync\( -_cache\.TryGetValue -DistributedCache -AddMemoryCache\(\) -``` - ---- - -## Category 7: DI Lifetime Issues (DI) - -Consult the project's CLAUDE.md or AGENTS.md for the expected DI lifetime registrations. - -Checks: - -- **Transient services that should be Singleton**: Stateless, thread-safe services registered as Transient that have no per-request state (could be Singleton for zero allocation). -- **Scoped injected into Singleton**: A Scoped service captured in a Singleton constructor -- captive dependency bug. -- **IOptions vs IOptionsMonitor vs IOptionsSnapshot**: `IOptions` in Singleton services that need to react to config changes should use `IOptionsMonitor`. `IOptionsSnapshot` in Singleton is a captive dependency. - ---- - -## Category 8: Concurrency Issues (CONC) - -Checks: - -- **Lock contention**: `lock` statements that guard async operations (should use `SemaphoreSlim`). -- **Missing throttling**: Unbounded parallel calls to external APIs without `SemaphoreSlim` or concurrency limits. -- **Thread-unsafe patterns**: Shared mutable state without synchronization. `HttpContext` accessed from background threads. -- **Channel usage patterns**: If the project uses `Channel` for background tasks, verify `SingleReader`/`SingleWriter` hints are set correctly for performance. - -Grep patterns: -``` -lock\s*\( -new SemaphoreSlim -HttpContext.*Task\.Run -``` - ---- - -## Category 9: HttpClient Misuse (HTTP) - -Checks: - -- **new HttpClient()**: Direct instantiation instead of `IHttpClientFactory`. Causes socket exhaustion and DNS caching issues. -- **Missing resilience**: HTTP calls without retry/circuit-breaker policies. Verify `Microsoft.Extensions.Http.Resilience` or Polly is applied to external API clients. -- **Missing response disposal**: `HttpResponseMessage` not disposed after reading. - -Grep patterns: -``` -new HttpClient\( -new HttpClient\b -``` - ---- - -## Category 10: Exception-Driven Control Flow (EXC) - -Checks: - -- **Try/catch for expected paths**: Using exceptions for normal control flow (e.g., catching `KeyNotFoundException` instead of `TryGetValue`, catching `FormatException` instead of `TryParse`). -- **Broad catch blocks**: `catch (Exception)` that swallow errors or use exceptions as branching logic. -- **Exception allocation in hot paths**: Throwing exceptions on paths that execute frequently. - -Grep patterns: -``` -catch\s*\(Exception\b -catch\s*\(KeyNotFoundException -catch\s*\(FormatException -catch\s*\(InvalidOperationException -``` - ---- - -## Category 11: Response Optimization (RESP) - -Checks: - -- **Missing compression**: No response compression middleware, or JSON responses served uncompressed. -- **Missing pagination**: Endpoints returning unbounded collections. -- **Missing ETags for conditional requests**: GET endpoints without ETag support where the data has a natural version (e.g., database ETags or row versions). - ---- - -## Category 12: String Optimization (STR) - -Checks: - -- **String concatenation in loops**: `+=` on strings inside `for`/`foreach`/`while` loops. -- **String.Format in hot paths**: Could use interpolated string handlers or `StringBuilder`. -- **Repeated string operations**: Multiple `ToLower()`/`ToUpper()` calls on the same value. Should use `StringComparison.OrdinalIgnoreCase` instead. - -Grep patterns: -``` -\+= " -\+= \$" -\.ToLower\(\) -\.ToUpper\(\) -String\.Format\( -``` - ---- - -## Category 13: Startup & Pipeline Optimization (STARTUP) - -Checks: - -- **Middleware ordering**: Verify Program.cs follows the recommended sequence: ExceptionHandler, ResponseCompression, OutputCache, Routing, RateLimiter, CORS, Authentication, Authorization, MapControllers. Incorrect ordering degrades performance (e.g., compression after routing skips static responses). -- **Response compression**: Flag missing `AddResponseCompression`/`UseResponseCompression`. Without it, all JSON responses are uncompressed. Recommend Brotli (optimal ratio) + GZip (compatibility) providers with `EnableForHttps = true`. -- **Health check optimization**: `.ShortCircuit()` (.NET 8+) bypasses the entire middleware pipeline for health endpoints. `.DisableHttpMetrics()` prevents health check traffic from skewing request duration metrics. -- **PGO/ReadyToRun**: Check .csproj for `true` (dynamic PGO for runtime hot-path optimization) and `true` (pre-compiled code for faster startup). Both should be present for production builds. -- **Warm-up pattern**: `ApplicationStarted` callback to warm expensive singletons (database connections, cache, external API health). Cold-start latency without warm-up can spike P99 for the first requests after deployment. - -Grep patterns: -``` -UseResponseCompression -AddResponseCompression -ShortCircuit -AddOutputCache -UseOutputCache -TieredPGO -PublishReadyToRun -ApplicationStarted -``` - ---- - -## Category 14: Metrics & Observability (METRICS) - -Checks: - -- **IMeterFactory vs static new Meter()**: Services should inject `IMeterFactory` from DI rather than using `new Meter(...)`. `IMeterFactory` enables testability with `MetricCollector` and proper meter lifecycle management. -- **Missing histograms**: If the project only has `Counter` instruments, recommend `Histogram` for request processing duration, external API latency, and database query duration. Histograms enable percentile analysis (P50/P95/P99). -- **Tag cardinality**: Verify metric tags have bounded cardinality. NEVER use request IDs, user IDs, or unbounded strings as metric tags. Tags like `operation_name`, `status_code`, `endpoint` are acceptable (bounded). Unbounded tags cause metric explosion and memory issues. -- **OpenTelemetry AddMeter() registration**: Verify custom meter names are registered with `.AddMeter("YourMeterName")` in the OpenTelemetry metrics configuration. Without this, custom counters are silently dropped. - -Grep patterns: -``` -new Meter\( -CreateCounter -CreateHistogram -AddMeter -\.Record\( -\.Add\( -``` diff --git a/.skills/dotnet-performance-profiling-and-optimization/references/code-patterns.md b/.skills/dotnet-performance-profiling-and-optimization/references/code-patterns.md deleted file mode 100644 index 743b29f422..0000000000 --- a/.skills/dotnet-performance-profiling-and-optimization/references/code-patterns.md +++ /dev/null @@ -1,384 +0,0 @@ ---- -description: Code-level performance patterns for csharp-dotnet-cli-optimization. -metadata: - tags: [linq, span, stackalloc, boxing, pooling, strings, analyzers] ---- - -# Code Patterns - -> **See also:** for pattern-by-pattern detection recipes with measured impact numbers and ❌/✅ pairs, see the topic catalogs: [critical-patterns.md](critical-patterns.md), [async-patterns.md](async-patterns.md), [memory-and-strings.md](memory-and-strings.md), [collections-and-linq.md](collections-and-linq.md), [regex-patterns.md](regex-patterns.md), [io-and-serialization.md](io-and-serialization.md), [structural-patterns.md](structural-patterns.md). This file covers the conceptual framing (when/why), those files cover the catalog (what/how-much). - -Use this reference after a profile or benchmark identifies a hot path. Do not apply these patterns speculatively. - -## Table Of Contents - -- [LINQ And Enumeration](#linq-and-enumeration) -- [Stack Allocation, Span, And Memory](#stack-allocation-span-and-memory) -- [Structs, Boxing, And Copies](#structs-boxing-and-copies) -- [Buffer Reuse And Advanced Helpers](#buffer-reuse-and-advanced-helpers) -- [Strings](#strings) -- [What Not To Suggest](#what-not-to-suggest) - -## LINQ And Enumeration - -### Property or indexer over LINQ when the concrete collection is known - -Wrong: - -```csharp -if (items.Count() > 0) -{ - return items.First(); -} -``` - -Better: - -```csharp -if (items.Count > 0) -{ - return items[0]; -} -``` - -Use `Count`, `Length`, `IsEmpty`, or an indexer when you already have a concrete collection with that API. Relevant analyzers: `CA1826`, `CA1829`, `CA1836`, `CA1860`. - -### `Any()` over `Count() > 0` when all you know is `IEnumerable` - -Wrong: - -```csharp -if (source.Count() != 0) -{ - Process(source); -} -``` - -Better: - -```csharp -if (source.Any()) -{ - Process(source); -} -``` - -Relevant analyzer: `CA1827`. - -### Avoid multiple enumeration of deferred queries - -Wrong: - -```csharp -var query = source.Where(Filter); -return query.Count() + query.Last().Id; -``` - -Better: - -```csharp -var materialized = source.Where(Filter).ToArray(); -return materialized.Length + materialized[^1].Id; -``` - -Materialize once only when you truly need multiple passes or random access and can afford the extra memory. Relevant analyzer: `CA1851`. - -### Avoid premature materialization - -Wrong: - -```csharp -var projected = source.ToList().Select(Map); -``` - -Better: - -```csharp -var projected = source.Select(Map); -``` - -Keep deferred execution unless you need a snapshot, repeated traversal, indexing, or a boundary between expensive stages. - -### Do not blanket-rewrite LINQ to loops - -- .NET 10 improved many LINQ operations substantially through JIT array-interface devirtualisation — operations like `Skip`/`Take`/`Sum` on arrays and `ReadOnlyCollection` got roughly 50% faster *for free*. See Stephen Toub, [Performance Improvements in .NET 10](https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-10/). -- On `net8.0` LINQ has the historical performance characteristics described in [Performance Improvements in .NET 8](https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-8/) — fast paths exist for `Count`, `ToList`, `ToArray` on `ICollection`, but indexed access via `ElementAt`/`Skip`/`Take` is not as cheap as on .NET 10. -- Start with analyzer-backed fixes and measurement. -- Replace LINQ with hand-written loops only when a benchmark or trace shows that the remaining cost matters — on either target. - -### Use `TryGetNonEnumeratedCount` when count is optional - -```csharp -if (source.TryGetNonEnumeratedCount(out int count)) -{ - LogCount(count); -} -``` - -This avoids forcing enumeration when the underlying type already knows its size. - -## Stack Allocation, Span, And Memory - -### `stackalloc` only for small, bounded, temporary buffers - -Wrong: - -```csharp -for (int i = 0; i < items.Length; i++) -{ - Span buffer = stackalloc byte[4096]; - Use(buffer); -} -``` - -Better: - -```csharp -Span buffer = stackalloc byte[256]; -for (int i = 0; i < items.Length; i++) -{ - buffer.Clear(); - Use(buffer); -} -``` - -Guidance: - -- keep sizes conservative -- avoid `stackalloc` inside loops -- initialize the memory before use -- fall back to heap or pooling for larger or variable-sized buffers - -### Prefer span-based APIs over substring copies - -Wrong: - -```csharp -int.TryParse(line.Substring(7), out int value); -``` - -Better: - -```csharp -int.TryParse(line.AsSpan(7), out int value); -``` - -Relevant analyzers: `CA1845`, `CA1846`. - -### Use `Span` for sync work and `Memory` for async or heap-stored state - -Wrong: - -```csharp -// Wrong: Span cannot cross await safely. -public async Task ReadAsync(Span buffer) -{ - await socket.ReceiveAsync(buffer); - return buffer[0]; -} -``` - -Better: - -```csharp -public async Task ReadAsync(Memory buffer) -{ - await socket.ReceiveAsync(buffer); - return buffer.Span[0]; -} -``` - -`Span` is stack-only. If the lifetime crosses `await`, callbacks, or object storage, move to `Memory`. - -### `ref struct` is for stack-bound wrappers, not a general optimization badge - -- Use `ref struct` when the type itself contains spans or must never escape to the heap. -- Do not use it if you need arrays of that type, boxing, interface conversions, or heap fields. - -## Structs, Boxing, And Copies - -### Use `readonly struct` or `readonly record struct` for small immutable values - -Wrong: - -```csharp -public struct Measurement -{ - public double A; - public double B; - public void Normalize() => A /= B; -} -``` - -Better: - -```csharp -public readonly record struct Measurement(double A, double B); -``` - -Prefer value types for small, copyable, data-only values. Avoid large, mutable structs. - -### Pass large structs by `in` - -Wrong: - -```csharp -double Distance(Vector4 value) => value.X + value.Y + value.Z + value.W; -``` - -Better: - -```csharp -double Distance(in Vector4 value) => value.X + value.Y + value.Z + value.W; -``` - -This avoids copying large struct values on each call. - -### Avoid boxing in hot paths - -Wrong: - -```csharp -object boxed = valueStruct; -``` - -Wrong: - -```csharp -IFormattable f = valueStruct; -``` - -Better: - -```csharp -Use(in valueStruct); -``` - -Boxing allocates a heap object and copies the value. Interface conversions can box too. - -### Mark readonly members on structs - -- Non-readonly instance members on a readonly receiver can trigger defensive copies. -- Mark the whole struct `readonly` when possible, or mark readonly members explicitly. - -## Buffer Reuse And Advanced Helpers - -### Use `ArrayPool` when the buffer is too large or variable for `stackalloc` - -Wrong: - -```csharp -byte[] temp = new byte[inputLength]; -``` - -Better: - -```csharp -byte[] temp = ArrayPool.Shared.Rent(inputLength); -try -{ - Use(temp); -} -finally -{ - ArrayPool.Shared.Return(temp); -} -``` - -Rules: - -- return to the same pool once -- never use the buffer after return -- rented arrays may be larger than requested -- rented arrays are not guaranteed to be zeroed - -### Prevent accidental closure capture - -Wrong: - -```csharp -return values.Select(v => v * 2).ToArray(); -``` - -Better when no capture is needed: - -```csharp -return values.Select(static v => v * 2).ToArray(); -``` - -Use `static` lambdas or static local functions to prevent capture when the delegate does not need outer state. - -### Cache `SearchValues` for repeated searches - -Wrong: - -```csharp -int index = text.IndexOfAny(":/?&=".AsSpan()); -``` - -Better: - -```csharp -private static readonly SearchValues s_delims = - SearchValues.Create(":/?&=".AsSpan()); -``` - -```csharp -int index = text.IndexOfAny(s_delims); -``` - -Relevant analyzer: `CA1870`. - -### `CollectionsMarshal.AsSpan` is advanced and ownership-sensitive - -```csharp -Span span = CollectionsMarshal.AsSpan(list); -``` - -Use this only when: - -- you own the `List` -- you will not add or remove items while the span is in use -- a measured hot path justifies bypassing normal list APIs - -## Strings - -### `StartsWith` over `IndexOf(...) == 0` - -Wrong: - -```csharp -return text.IndexOf("abc", StringComparison.Ordinal) == 0; -``` - -Better: - -```csharp -return text.StartsWith("abc", StringComparison.Ordinal); -``` - -Relevant analyzer: `CA1858`. - -### `Append(char)` over `Append("x")` - -Wrong: - -```csharp -builder.Append("]"); -``` - -Better: - -```csharp -builder.Append(']'); -``` - -Relevant analyzers: `CA1834`, `CA1865-CA1867`. - -## What Not To Suggest - -- Do not suggest unsafe code first. -- Do not suggest pooling tiny objects by default. -- Do not suggest `stackalloc` because "heap bad, stack good". -- Do not suggest converting APIs to `Span` if the lifetime model does not fit. -- Do not suggest loop rewrites without a profile or benchmark showing LINQ still matters after simpler fixes. diff --git a/.skills/dotnet-performance-profiling-and-optimization/references/collections-and-linq.md b/.skills/dotnet-performance-profiling-and-optimization/references/collections-and-linq.md deleted file mode 100644 index 09c58b0642..0000000000 --- a/.skills/dotnet-performance-profiling-and-optimization/references/collections-and-linq.md +++ /dev/null @@ -1,217 +0,0 @@ -# Collections & LINQ Patterns - -### Use FrozenDictionary/FrozenSet for Read-Heavy Lookup Tables -🟡 **DO** use `FrozenDictionary`/`FrozenSet` for collections created once and read many times | .NET 8+ - -❌ -```csharp -private static readonly Dictionary s_statusCodes = new() -{ - ["OK"] = 200, ["NotFound"] = 404, ["InternalServerError"] = 500 -}; -``` -✅ -```csharp -private static readonly FrozenDictionary s_statusCodes = - new Dictionary - { - ["OK"] = 200, ["NotFound"] = 404, ["InternalServerError"] = 500 - }.ToFrozenDictionary(); -``` - -**Impact: ~50% faster lookups than Dictionary, ~14x faster than ImmutableDictionary.** - -### Use Dictionary Alternate Lookup for Span-Based Keys -🟡 **DO** use `GetAlternateLookup>()` to avoid string allocation on lookups | **.NET 10 (or .NET 9) only — NOT available on .NET 8** - -❌ (allocates on every lookup; the only option on .NET 8) -```csharp -string key = headerLine.Substring(0, colonIndex); -if (s_dict.TryGetValue(key, out int value)) { /* ... */ } -``` -✅ .NET 10 / C# 14 -```csharp -var lookup = s_dict.GetAlternateLookup>(); -ReadOnlySpan key = headerLine.AsSpan(0, colonIndex); -if (lookup.TryGetValue(key, out int value)) { } -``` -✅ .NET 8 fallback — keep the allocation but minimise it -```csharp -// On net8.0 GetAlternateLookup does not exist (added in .NET 9 BCL). -// Pre-intern frequent keys, or accept the allocation. If the hot path is -// truly critical, store keys as ReadOnlyMemory and write a custom -// IEqualityComparer that compares against a span via string.Compare. -string key = headerLine.Substring(0, colonIndex); -if (s_dict.TryGetValue(key, out int value)) { /* ... */ } -``` - -**Impact: Avoids string allocation per lookup on .NET 10 — especially valuable in parser/protocol hot paths.** - -### Use CollectionsMarshal.GetValueRefOrNullRef for Lookup-and-Update -🟡 **DO** use `CollectionsMarshal.GetValueRefOrAddDefault` for dictionary update patterns | .NET 6+ - -❌ -```csharp -_counts.TryGetValue(key, out int count); -_counts[key] = count + 1; -``` -✅ -```csharp -ref int count = ref CollectionsMarshal.GetValueRefOrAddDefault(_counts, key, out _); -count++; -``` - -**Impact: ~48% faster for lookup-and-update patterns (95µs → 49µs).** - -### Use Collection Expressions [] for Zero-Allocation Span Creation -🟡 **DO** use collection expressions for `Span` targets | C# 12 / .NET 8+ - -❌ -```csharp -int[] values = new int[] { a, b, c, d }; -``` -✅ -```csharp -Span values = [a, b, c, d]; -ReadOnlySpan daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; -``` - -**Impact: Zero heap allocation for span-targeted collection expressions.** - -### Use EnsureCapacity on List/Stack/Queue Before Bulk Adds -🟡 **DO** call `EnsureCapacity` before bulk insertions | .NET 6+ - -❌ -```csharp -var list = new List(); -for (int i = 0; i < 10000; i++) - list.Add(i); -``` -✅ -```csharp -var list = new List(); -list.EnsureCapacity(10000); -for (int i = 0; i < 10000; i++) - list.Add(i); -``` - -**Impact: Reduces reallocations and array copies during bulk operations.** - -### Use TryGetNonEnumeratedCount for Pre-Sizing -🟡 **DO** use `TryGetNonEnumeratedCount` to pre-size destination collections | .NET 6+ - -❌ -```csharp -var results = new List(); -foreach (var item in source) - results.Add(Transform(item)); -``` -✅ -```csharp -var results = source.TryGetNonEnumeratedCount(out int count) - ? new List(count) - : new List(); -foreach (var item in source) - results.Add(Transform(item)); -``` - -**Impact: Avoids O(n) enumeration for counting; eliminates resizing allocations.** - -### Hoist Static Data Out of Method Bodies -🟡 **AVOID** creating collections with static/deterministic data inside method bodies | .NET Core+ - -❌ -```csharp -public string Convert(long number) -{ - var groupsMap = new Dictionary> - { - { 1_000_000_000, n => $"{Convert(n)} billion" }, - { 1_000_000, n => $"{Convert(n)} million" }, - { 1_000, n => $"{Convert(n)} thousand" }, - }; -} -``` -✅ -```csharp -private static readonly FrozenDictionary> s_groupsMap = - new Dictionary> - { - { 1_000_000_000, n => $"{Convert(n)} billion" }, - { 1_000_000, n => $"{Convert(n)} million" }, - { 1_000, n => $"{Convert(n)} thousand" }, - }.ToFrozenDictionary(); - -public string Convert(long number) -{ - // ... use s_groupsMap -} -``` - -**Impact: Eliminates collection + internal storage + closure allocations per call. For a Dictionary with N entries, saves ~N+3 allocations per invocation.** - -### Add Overloads to Avoid params Array Allocation -🟡 **DO** add 1- and 2-argument overloads for methods that accept `params T[]`. On .NET 10 also expose a `params ReadOnlySpan` overload | works on .NET 8 and .NET 10 - -❌ (single `params T[]` overload allocates a new array on every call, including the common 1-argument case) -```csharp -public static string Transform(this string input, params IStringTransformer[] transformers) => - transformers.Aggregate(input, (current, t) => t.Transform(current)); - -"hello".Transform(To.TitleCase); -``` -✅ Option A — explicit overloads for common arities (works on .NET 8 and .NET 10) -```csharp -public static string Transform(this string input, IStringTransformer transformer) => - transformer.Transform(input); - -public static string Transform(this string input, IStringTransformer t1, IStringTransformer t2) => - t2.Transform(t1.Transform(input)); - -public static string Transform(this string input, params IStringTransformer[] transformers) => - transformers.Aggregate(input, (current, t) => t.Transform(current)); -``` -✅ Option B — `.NET 10 / C# 14` adds a span overload (eliminates the allocation for all arities) -```csharp -public static string Transform(this string input, params ReadOnlySpan transformers) -{ - foreach (var t in transformers) - input = t.Transform(input); - return input; -} -``` -⚠️ Option B does **not** compile on `net8.0`: `params ReadOnlySpan` requires C# 13 (default on .NET 9+). On .NET 8 ship only Option A. - -**Impact: Option A eliminates the array allocation for 1- and 2-argument calls on every target. Option B eliminates it for all arities on .NET 10.** - -## Detection - -Scan recipes for collection and LINQ anti-patterns. Run these and report exact counts. - -```bash -# Static Dictionary not using FrozenDictionary (read-only after init) -grep -rn --include='*.cs' 'static readonly Dictionary<' --exclude-dir=bin --exclude-dir=obj . | wc -l - -# Static FrozenDictionary (already optimized — verify the inverse) -grep -rn --include='*.cs' 'static readonly FrozenDictionary<' --exclude-dir=bin --exclude-dir=obj . | wc -l - -# Per-call List allocation (inside method bodies, not static/readonly fields) -grep -rn --include='*.cs' 'new List<' --exclude-dir=bin --exclude-dir=obj . | grep -v 'static\|readonly' | wc -l - -# Per-call Dictionary allocation (inside method bodies, not static/readonly fields) -grep -rn --include='*.cs' 'new Dictionary<' --exclude-dir=bin --exclude-dir=obj . | grep -v 'static\|readonly' | wc -l - -# StringComparer.CurrentCulture usage (almost always wrong in library code — use Ordinal) -grep -rn --include='*.cs' 'StringComparer.CurrentCulture' --exclude-dir=bin --exclude-dir=obj . | wc -l - -# LINQ chains in extension/hot-path files (.Select, .Where, .Cast, .Take, .Aggregate) -grep -rn --include='*.cs' -E '\.(Select|Where|Cast|Take|Aggregate)\(' --exclude-dir=bin --exclude-dir=obj . | wc -l -``` - -For the LINQ chain recipe: any hit in a file whose name ends in `Extensions.cs`, `Formatter.cs`, or implements a method called from a public extension method is a hot-path candidate. Inspect each hit in these files and flag LINQ chains that allocate delegates, enumerators, or intermediate collections on every call. Hits in localization converters or one-time initialization are lower priority. - -### Patterns Requiring Manual Review - -- **ContainsKey + indexer double-lookup**: Requires verifying the same key is used in a subsequent indexer access — multi-line/multi-statement context -- **LINQ on hot paths**: The LINQ chain recipe above catches call sites, but distinguishing hot-path from cold-path requires context. Prioritize hits in `*Extensions.cs` and `*Formatter.cs` files, which are typically called on every user invocation -- **`new Dictionary/List<` in method bodies vs fields**: The grep heuristic (`grep -v 'static\|readonly'`) catches most cases but may include false positives from field initializers without `static`/`readonly` — spot-check flagged lines diff --git a/.skills/dotnet-performance-profiling-and-optimization/references/critical-patterns.md b/.skills/dotnet-performance-profiling-and-optimization/references/critical-patterns.md deleted file mode 100644 index c25a6e43ae..0000000000 --- a/.skills/dotnet-performance-profiling-and-optimization/references/critical-patterns.md +++ /dev/null @@ -1,288 +0,0 @@ -# Critical .NET Performance Anti-Patterns - -17 patterns that cause deadlocks, order-of-magnitude regressions, or excessive allocations. - -## Async / Tasks - -### Never Block on Async (Sync-over-Async) -🔴 **AVOID** | .NET Core+ - -❌ -```csharp -public string GetData() - => GetDataAsync().Result; -``` -✅ -```csharp -public async Task GetDataAsync() - => await GetDataInternalAsync(); -``` -**Impact: Deadlocks or thread pool starvation; wastes threads, destroys scalability.** - -### Never Await a ValueTask Multiple Times -🔴 **AVOID** | .NET Core 2.1+ - -❌ -```csharp -ValueTask vt = SomeMethodAsync(); -int a = await vt; -int b = await vt; -``` -✅ -```csharp -int result = await SomeMethodAsync(); -``` -**Impact: Undefined behavior — silent data corruption or exceptions.** - -## Memory / Allocation - -### Use Span\ / AsSpan Instead of Substring for Slicing -🔴 **DO** | .NET Core 2.1+ - -❌ -```csharp -string sub = input.Substring(5, 10); -``` -✅ -```csharp -ReadOnlySpan sub = input.AsSpan(5, 10); -``` -**Impact: Eliminates per-slice allocations; 2-4x faster via vectorization.** - -### Use ArrayPool\ for Temporary Buffers -🔴 **DO** | .NET Core+ - -❌ -```csharp -byte[] buf = new byte[4096]; -``` -✅ -```csharp -byte[] buf = ArrayPool.Shared.Rent(4096); -Process(buf); -ArrayPool.Shared.Return(buf); -``` -**Impact: Dramatically reduces GC pressure for buffer-heavy workloads.** - -### Avoid stackalloc in Loops -🔴 **AVOID** | .NET 5+ - -❌ -```csharp -for (int i = 0; i < 10_000; i++) - Span buf = stackalloc byte[1024]; -``` -✅ -```csharp -Span buf = stackalloc byte[1024]; -for (int i = 0; i < 10_000; i++) { Process(buf); } -``` -**Impact: StackOverflowException — unrecoverable, no catch possible.** - -### Avoid Boxing Value Types -🔴 **AVOID** | .NET 6+ - -❌ -```csharp -string s = string.Format("{0}.{1}", major, minor); -``` -✅ -```csharp -string s = $"{major}.{minor}"; -``` -**Impact: When replacing `string.Format` with C# 10+ interpolation, typical improvements are ~40% faster with significantly less allocation. Actual gains vary by call site.** - -## Strings - -### Use StringComparison.Ordinal for Non-Linguistic Comparisons -🔴 **DO** | .NET Core+ - -❌ -```csharp -bool found = text.IndexOf("Content-Type") >= 0; -``` -✅ -```csharp -bool found = text.Contains("Content-Type", StringComparison.Ordinal); -``` -**Impact: 2-3x faster; OrdinalIgnoreCase hash codes ~3.3x faster.** - -### Use AsSpan Instead of Substring -🔴 **DO** | .NET Core 2.1+ - -❌ -```csharp -int val = int.Parse(str.Substring(5, 3)); -``` -✅ -```csharp -int val = int.Parse(str.AsSpan(5, 3)); -``` -**Impact: Eliminates one string allocation per parse operation.** - -## Regular Expressions - -### Use Source-Generated Regex [GeneratedRegex] -🔴 **ALWAYS** use `[GeneratedRegex]` for all static regex patterns | .NET 7+ - -❌ -```csharp -private static readonly Regex s_re = - new(@"\w+@\w+\.\w+", RegexOptions.Compiled); -``` -✅ -```csharp -[GeneratedRegex(@"\w+@\w+\.\w+")] -private static partial Regex EmailRegex(); -``` -**Impact: Always beneficial or neutral for static patterns — near-zero startup, better throughput, and required for AOT/trimming scenarios.** - -### Avoid Nested Quantifiers (Catastrophic Backtracking) -🔴 **AVOID** | .NET Core+ - -❌ -```csharp -var r = new Regex(@"^(\w+)+$"); -``` -✅ -```csharp -var r = new Regex(@"^\w+$", RegexOptions.NonBacktracking); -``` -**Impact: Can hang process indefinitely on crafted input.** - -### Use TryGetValue Instead of ContainsKey + Indexer -🔴 **DO** | .NET Core+ - -❌ -```csharp -if (dict.ContainsKey(key)) - Use(dict[key]); -``` -✅ -```csharp -if (dict.TryGetValue(key, out var value)) - Use(value); -``` -**Impact: ~2x faster (50% reduction in lookup time).** - -### Avoid LINQ in Hot Paths -🔴 **AVOID** | .NET Core+ - -❌ -```csharp -bool found = items.Any(x => x.Name == target); -``` -✅ -```csharp -bool found = false; -foreach (var item in items) - if (item.Name == target) { found = true; break; } -``` -**Impact: Eliminates 1-3 allocations per call; measurable in tight loops.** - -### Don't Iterate IEnumerable Multiple Times -🔴 **AVOID** | .NET Core+ - -❌ -```csharp -foreach (Type t in types) { Validate(t); } -_types = types.ToArray(); -``` -✅ -```csharp -Type[] arr = types.ToArray(); -foreach (Type t in arr) { Validate(t); } -_types = arr; -``` -**Impact: Halves enumeration cost; prevents bugs from re-executing deferred queries.** - -## JSON Serialization - -### Use System.Text.Json Source Generator -🔴 **DO** | .NET 6+ - -❌ -```csharp -string json = JsonSerializer.Serialize(post); -``` -✅ -```csharp -[JsonSerializable(typeof(BlogPost))] -internal partial class AppJsonCtx : JsonSerializerContext { } -string json = JsonSerializer.Serialize(post, AppJsonCtx.Default.BlogPost); -``` -**Impact: 37-44% faster; enables trimming and Native AOT.** - -### Cache JsonSerializerOptions -🔴 **DO** | .NET 5+ - -❌ -```csharp -JsonSerializer.Serialize(obj, new JsonSerializerOptions()); -``` -✅ -```csharp -private static readonly JsonSerializerOptions s_opts = new(); -JsonSerializer.Serialize(obj, s_opts); -``` -**Impact: Up to 592x slower without caching (.NET 6); always cache or use defaults.** - -## Networking - -### Reuse HttpClient Instances -🔴 **DO** | .NET Core 2.1+ - -❌ -```csharp -using var client = new HttpClient(); -await client.GetStringAsync(url); -``` -✅ -```csharp -private static readonly HttpClient s_http = new(new SocketsHttpHandler -{ PooledConnectionLifetime = TimeSpan.FromMinutes(5) }); -await s_http.GetStringAsync(url); -``` -**Impact: Prevents socket exhaustion; 6-12x faster concurrent HTTPS.** - -## General - -### Use SearchValues\ for Repeated Set Searches -🔴 **DO** | .NET 8+ (works on both targets; .NET 10 adds multi-string overloads) - -❌ -```csharp -int pos = text.IndexOfAny("ABCDEF".ToCharArray()); -``` -✅ (.NET 8 and .NET 10 — `SearchValues` is the same API on both) -```csharp -private static readonly SearchValues s_hex = SearchValues.Create("ABCDEF"); -int pos = text.AsSpan().IndexOfAny(s_hex); -``` -✅ (.NET 10 only — multi-string `SearchValues`) -```csharp -private static readonly SearchValues s_keywords = - SearchValues.Create(["error", "warning", "fatal"], StringComparison.OrdinalIgnoreCase); -int pos = log.AsSpan().IndexOfAny(s_keywords); // SearchValues overload is .NET 9+ BCL -``` -On `net8.0` use a `SearchValues` with the first letter of each keyword and then fall back to `string.IndexOf(StringComparison.Ordinal)`. - -**Impact: 2-10x faster for chars (both targets); 10-30x faster for multi-string on .NET 10.** - -## Detection - -Scan recipes for critical anti-patterns. Run these and report exact counts of issues found in each case. - -```bash -# .IndexOf(string) without StringComparison (culture-aware, 2-3x slower) -grep -rn --include='*.cs' -E '\.IndexOf\("[^"]+"\)' --exclude-dir=bin --exclude-dir=obj . | wc -l - -# .Substring( calls (allocates new string — consider AsSpan) -grep -rn --include='*.cs' '\.Substring(' --exclude-dir=bin --exclude-dir=obj . | wc -l - -# .StartsWith/.EndsWith without StringComparison (culture-aware, 2-3x slower) -grep -rn --include='*.cs' -E '\.(StartsWith|EndsWith)\("[^"]+"\)' --exclude-dir=bin --exclude-dir=obj . | wc -l - -# .Contains(string) without StringComparison — NOTE: will also match collection .Contains() calls; filter to string receivers -grep -rn --include='*.cs' -E '\.Contains\("[^"]+"\)' --exclude-dir=bin --exclude-dir=obj . | wc -l -``` diff --git a/.skills/dotnet-performance-profiling-and-optimization/references/grep-patterns.md b/.skills/dotnet-performance-profiling-and-optimization/references/grep-patterns.md deleted file mode 100644 index 9b38163fff..0000000000 --- a/.skills/dotnet-performance-profiling-and-optimization/references/grep-patterns.md +++ /dev/null @@ -1,165 +0,0 @@ -# Anti-Pattern Grep Library - -Consolidated grep patterns for automated scanning. Run these with the Grep tool using `type: "cs"` filter. - -All patterns use ripgrep regex syntax. Run during Phase 1 (Discovery) broad scan. - -> **See also:** each topic catalog ([critical-patterns.md](critical-patterns.md), [async-patterns.md](async-patterns.md), [memory-and-strings.md](memory-and-strings.md), [collections-and-linq.md](collections-and-linq.md), [regex-patterns.md](regex-patterns.md), [io-and-serialization.md](io-and-serialization.md), [structural-patterns.md](structural-patterns.md)) has its own Detection section with topic-specific recipes and ratio-counting guidance. This file is the consolidated cross-cutting library; load topic files when their signals are present. - ---- - -## ASYNC anti-patterns (CRITICAL) - -``` -\.Result\b -\.Wait\(\) -\.GetAwaiter\(\)\.GetResult\(\) -async void\b -Task\.Run\( -\.WriteAsync\([^,]*\) -``` - -**False positive note**: `.Result` matches `Task.FromResult` -- verify actual blocking before flagging. - ---- - -## Memory anti-patterns (MEM) - -``` -new byte\[\d{4,}\] -new byte\[ -new MemoryStream\(\) -\.Substring\( -new StringBuilder\(\) -new List<.*>\(\) -new Dictionary<.*>\(\) -_logger\.Log(Debug|Trace|Information|Warning|Error|Critical)\(\$" -\.Split\( -``` - ---- - -## LINQ anti-patterns - -``` -\.Count\(\)\s*[><=!] -\.ToList\(\)\.Where\( -\.ToList\(\)\.Select\( -\.Select\(.*\)\.Where\( -\.OrderBy.*\.Where\( -``` - ---- - -## Database / CosmosDB anti-patterns (DB) - -``` -\.Include\(.*\.Include\( -await.*foreach.*await.*Async -ReadItemAsync -GetItemQueryIterator -GetItemLinqQueryable -\.RequestCharge -``` - ---- - -## JSON anti-patterns - -``` -new JsonSerializerOptions -new JsonSerializerSettings -JsonConvert\.Serialize -JsonConvert\.Deserialize -new JsonSerializer -``` - ---- - -## Caching anti-patterns (CACHE) - -``` -GetAsync\( -SendAsync\( -_cache\.TryGetValue -DistributedCache -AddMemoryCache\(\) -``` - ---- - -## HttpClient misuse (HTTP) - -``` -new HttpClient\( -new HttpClient\b -``` - ---- - -## Exception control flow (EXC) - -``` -catch\s*\(Exception\b -catch\s*\(KeyNotFoundException -catch\s*\(FormatException -catch\s*\(InvalidOperationException -``` - ---- - -## String anti-patterns (STR) - -``` -\+= " -\+= \$" -\.ToLower\(\) -\.ToUpper\(\) -String\.Format\( -``` - ---- - -## Concurrency anti-patterns (CONC) - -``` -lock\s*\( -new SemaphoreSlim -HttpContext.*Task\.Run -``` - ---- - -## Startup & Pipeline (STARTUP) - -``` -UseResponseCompression -AddResponseCompression -ShortCircuit -AddOutputCache -UseOutputCache -TieredPGO -PublishReadyToRun -ApplicationStarted -``` - ---- - -## Metrics & Observability (METRICS) - -``` -new Meter\( -CreateCounter -CreateHistogram -AddMeter -``` - ---- - -## CancellationToken coverage - -``` -async Task[<\s].*\)\s*$ -``` - -This pattern finds async methods whose signature ends without a CancellationToken parameter. Verify each match -- some may be interface implementations where the token is propagated differently. diff --git a/.skills/dotnet-performance-profiling-and-optimization/references/io-and-serialization.md b/.skills/dotnet-performance-profiling-and-optimization/references/io-and-serialization.md deleted file mode 100644 index 8ff904c5ff..0000000000 --- a/.skills/dotnet-performance-profiling-and-optimization/references/io-and-serialization.md +++ /dev/null @@ -1,124 +0,0 @@ -# I/O, Serialization & General Patterns - -### Use HttpCompletionOption.ResponseHeadersRead for Streaming -🟡 **DO** use `ResponseHeadersRead` when downloading large responses | .NET Core 3.0+ - -❌ -```csharp -var response = await client.GetAsync(uri); -``` -✅ -```csharp -using var response = await client.GetAsync(uri, HttpCompletionOption.ResponseHeadersRead); -using var stream = await response.Content.ReadAsStreamAsync(); -await stream.CopyToAsync(destinationStream); -``` - -**Impact: ~2x faster for large downloads (10MB+), dramatically reduced memory usage.** - -### Use Async FileStream Operations -🟡 **DO** use `FileStream` with `useAsync: true` for scalable file I/O | .NET 6+ - -❌ -```csharp -using var fs = new FileStream(path, FileMode.Open); -``` -✅ -```csharp -await using var fs = new FileStream(path, FileMode.Open, FileAccess.Read, - FileShare.Read, bufferSize: 4096, useAsync: true); - -byte[] buffer = new byte[1024]; -while (await fs.ReadAsync(buffer) != 0) { /* process */ } -``` - -**Impact: Up to 3x faster async reads; allocation reduced from megabytes to hundreds of bytes.** - -### Use Memory\ Overloads for Stream.ReadAsync/WriteAsync -🟡 **DO** use `Memory`-based stream overloads instead of `byte[]` overloads | .NET 5+ - -❌ -```csharp -await stream.ReadAsync(buffer, 0, buffer.Length); -await stream.WriteAsync(buffer, 0, buffer.Length); -``` -✅ -```csharp -await stream.ReadAsync(buffer.AsMemory()); -await stream.WriteAsync(buffer.AsMemory()); -``` - -**Impact: Eliminates ~72 KB allocation per 1,000 read/write pairs on NetworkStream.** - -### Use Span-Based TryFormat for Number Formatting -🟡 **DO** use `TryFormat` to format numbers into `Span` buffers | .NET Core 2.1+ - -❌ -```csharp -string formatted = value.ToString(); -destination.Write(formatted); -``` -✅ -```csharp -Span buffer = stackalloc char[20]; -if (value.TryFormat(buffer, out int charsWritten)) - destination.Write(buffer[..charsWritten]); -``` - -**Impact: Int32.ToString() ~2x faster in .NET Core 2.1, Int32 parsing ~5x faster in .NET Core 3.0.** - -### Use static readonly for Runtime Devirtualization -🟡 **DO** store implementations in `static readonly` fields for JIT devirtualization | .NET Core 3.0+ - -❌ -```csharp -private static Base s_impl = new DerivedImpl(); -s_impl.Process(); -``` -✅ -```csharp -private static readonly Base s_impl = new DerivedImpl(); -s_impl.Process(); - -private static readonly bool s_feature = - Environment.GetEnvironmentVariable("Feature") == "1"; -``` - -**Impact: Virtual call eliminated entirely — can be inlined to zero overhead. Dead code elimination in tier 1.** - -### Avoid Explicit Static Constructors — Use Field Initializers -🟡 **AVOID** explicit `static` constructors when field initializers suffice | .NET Core 3.0+ - -❌ -```csharp -class Foo -{ - static readonly int s_value; - static Foo() { s_value = ComputeValue(); } -} -``` -✅ -```csharp -class Foo -{ - static readonly int s_value = ComputeValue(); -} -``` - -**Impact: Enables better JIT optimization and reduces potential lock overhead on static method access.** - -## Detection - -Scan recipes for I/O and serialization anti-patterns. Run these and report exact counts. - -```bash -# new HttpClient() (socket exhaustion risk) -grep -rn --include='*.cs' 'new HttpClient(' --exclude-dir=bin --exclude-dir=obj . | wc -l - -# new JsonSerializerOptions() not cached (592x slower in .NET 6) -grep -rn --include='*.cs' 'new JsonSerializerOptions' --exclude-dir=bin --exclude-dir=obj . | grep -v 'static\|readonly' | wc -l -``` - -### Patterns Requiring Manual Review - -- **`JsonSerializer.Serialize/Deserialize` without source-gen context**: Can't determine from grep if a context parameter is passed diff --git a/.skills/dotnet-performance-profiling-and-optimization/references/measurement-guide.md b/.skills/dotnet-performance-profiling-and-optimization/references/measurement-guide.md deleted file mode 100644 index 9e67e8cde2..0000000000 --- a/.skills/dotnet-performance-profiling-and-optimization/references/measurement-guide.md +++ /dev/null @@ -1,193 +0,0 @@ ---- -description: >- - Performance measurement guide for dotnet-performance skill. Covers tool - selection per category, KPI targets, BenchmarkDotNet, k6 load testing, - CI/CD integration, and live process CLI commands. -metadata: - tags: [measurement, benchmarkdotnet, k6, dotnet-counters, kpi] ---- - -# Measurement Guide - -How to measure performance before and after applying optimizations. Never optimize without baseline data. - ---- - -## Tool Selection Decision Table - -Map each optimization category to the appropriate measurement tools: - -| Category | Primary Tool | Secondary Tool | What to Measure | -|---|---|---|---| -| MEM | `dotnet-counters` (gc-heap-size, alloc-rate) | `dotnet-gcdump` comparison | Allocation rate reduction, GC collection frequency | -| ASYNC | `dotnet-counters` (threadpool-queue-length, thread-count) | App Insights dependency tracking | Thread pool starvation, blocked threads | -| LINQ | BenchmarkDotNet `[MemoryDiagnoser]` | `dotnet-trace` hot path | Allocation per operation, throughput | -| DB | `response.RequestCharge` logging | App Insights DB dependency | RU cost per operation, query latency | -| JSON | BenchmarkDotNet serialization benchmark | `dotnet-counters` alloc-rate | Throughput (ops/sec), bytes allocated | -| CACHE | App Insights dependency duration | Custom hit ratio counter | Cache hit rate, dependency call reduction | -| DI | `dotnet-counters` alloc-rate | Load test comparison | Object creation overhead | -| CONC | `dotnet-counters` (monitor-lock-contention-count) | `dotnet-trace` contention events | Lock wait time, throughput under load | -| HTTP | `dotnet-counters` Microsoft.AspNetCore.Hosting | k6/NBomber load test | Request duration, throughput | -| EXC | `dotnet-counters` exception-count | App Insights exceptions | Exception rate per interval | -| RESP | Network tab / curl with timing | k6 response size check | Response size (bytes), transfer time | -| STR | BenchmarkDotNet `[MemoryDiagnoser]` | `dotnet-counters` alloc-rate | String allocations per operation | -| STARTUP | Startup time measurement | `dotnet-trace` startup events | Time to first request, cold start latency | -| METRICS | `MetricCollector` in tests | Prometheus/Grafana dashboard | Metric emission, cardinality | - ---- - -## KPI Targets - -Standard targets for ASP.NET Core APIs. Use as thresholds when evaluating optimization impact: - -| Metric | Target | Red Flag | -|---|---|---| -| P50 response time | < 100ms | > 200ms | -| P95 response time | < 500ms | > 1000ms | -| P99 response time | < 1000ms | > 2000ms | -| Error rate (5xx) | < 0.1% | > 1% | -| CPU utilization | < 70% sustained | > 85% | -| Memory working set | < 80% | > 90% | -| Thread pool queue length | < 10 sustained | > 50 | -| GC time percentage | < 10% | > 20% | -| Allocation rate | Trend down after optimization | Sustained increase | - ---- - -## BenchmarkDotNet Guidance - -Use for micro-optimizations on hot paths (MEM, LINQ, JSON, STR categories). - -**When to benchmark**: Hot-path changes where the difference is in nanoseconds or bytes allocated. Not needed for architectural changes (caching, DI lifetime) — use load testing instead. - -**Minimum setup**: -```csharp -[MemoryDiagnoser] -[SimpleJob(RuntimeMoniker.Net90)] -public class MyBenchmark -{ - [Benchmark(Baseline = true)] - public void Original() { /* original code */ } - - [Benchmark] - public void Optimized() { /* optimized code */ } -} -``` - -**Run command**: `dotnet run -c Release --project path/to/benchmark` - -**Common pitfalls**: -- Running in Debug mode (JIT optimizations disabled, results meaningless) -- Not returning computed values (JIT eliminates dead code) -- Ignoring allocation metrics (throughput may improve but allocations increase) -- Benchmarking with a debugger attached -- Including setup costs in the measured method - ---- - -## Load Testing - -For HIGH-impact optimizations, perform before/after load testing to validate real-world improvement. - -**k6 template**: -```javascript -import http from 'k6/http'; -import { check, sleep } from 'k6'; - -export const options = { - stages: [ - { duration: '30s', target: 20 }, - { duration: '1m', target: 20 }, - { duration: '10s', target: 0 }, - ], - thresholds: { - http_req_duration: ['p(50)<100', 'p(95)<500', 'p(99)<1000'], - http_req_failed: ['rate<0.01'], - }, -}; - -export default function () { - const res = http.get('http://localhost:5000/your-endpoint'); - check(res, { - 'status is 200': (r) => r.status === 200, - 'p95 under 500ms': (r) => r.timings.duration < 500, - }); - sleep(1); -} -``` - -**While load testing, monitor simultaneously**: -```bash -dotnet-counters monitor -n --counters System.Runtime,Microsoft.AspNetCore.Hosting -``` - ---- - -## CI/CD Integration - -For PR regression detection, use `benchmark-action/github-action-benchmark`: - -```yaml -- uses: benchmark-action/github-action-benchmark@v1 - with: - tool: 'benchmarkdotnet' - output-file-path: BenchmarkDotNet.Artifacts/results/*.json - alert-threshold: '150%' - comment-on-alert: true - fail-on-alert: true -``` - -This fails the PR if any benchmark regresses by more than 50% compared to the baseline. - ---- - -## Code Review Mode: Quick Reference Commands - -```bash -# Baseline runtime health -dotnet-counters monitor -n --counters System.Runtime - -# ASP.NET Core request metrics -dotnet-counters monitor -n --counters Microsoft.AspNetCore.Hosting - -# Full monitoring (runtime + HTTP + custom meters) -dotnet-counters monitor -n --counters System.Runtime,Microsoft.AspNetCore.Hosting,Microsoft.AspNetCore.Server.Kestrel - -# GC heap snapshot for before/after comparison -dotnet-gcdump collect -n -o before.gcdump -# ... apply optimization ... -dotnet-gcdump collect -n -o after.gcdump - -# 30-second CPU trace -dotnet-trace collect -n --duration 00:00:30 -dotnet-trace convert trace.nettrace --format speedscope -``` - ---- - -## Diagnostic Mode: Full CLI Commands - -When profiling a live process (Mode A), use these commands by investigation stage: - -```bash -# Stage 1: Live triage -dotnet-counters monitor -p --counters System.Runtime -dotnet-counters monitor -n --counters System.Runtime,Microsoft.AspNetCore.Hosting,Microsoft.AspNetCore.Server.Kestrel - -# Stage 2: Stuck/hung process — get stacks immediately -dotnet-stack report -p - -# Stage 3: CPU + allocation hot paths -dotnet-trace collect -p --duration 00:00:30 -dotnet-trace report topN - -# Stage 4: Heap composition -dotnet-gcdump collect -p -o before.gcdump -# ... apply optimization ... -dotnet-gcdump collect -p -o after.gcdump -dotnet-gcdump report - -# Stage 5: Full dump for SOS analysis -dotnet-dump collect -p --type Heap -dotnet-dump analyze -c "dumpheap -stat" -c "exit" -``` diff --git a/.skills/dotnet-performance-profiling-and-optimization/references/memory-and-strings.md b/.skills/dotnet-performance-profiling-and-optimization/references/memory-and-strings.md deleted file mode 100644 index 3f1be338ae..0000000000 --- a/.skills/dotnet-performance-profiling-and-optimization/references/memory-and-strings.md +++ /dev/null @@ -1,223 +0,0 @@ -# Memory & String Patterns - -### Use ReadOnlySpan\ for Constant Byte Data -🟡 **DO** assign constant byte arrays to `ReadOnlySpan` | .NET 5+ - -❌ -```csharp -byte[] data = new byte[] { 0x48, 0x65, 0x6C, 0x6C, 0x6F }; -``` -✅ -```csharp -ReadOnlySpan data = [0x48, 0x65, 0x6C, 0x6C, 0x6F]; -ReadOnlySpan primes = [2, 3, 5, 7, 11, 13]; -``` - -**Impact: ~100x faster access than static byte[] field, zero allocation.** - -### Use stackalloc for Small Temporary Buffers -🟡 **DO** use `stackalloc` for small, fixed-size temporary buffers | .NET Core+ - -❌ -```csharp -char[] buffer = new char[64]; -guid.TryFormat(buffer, out int written); -``` -✅ -```csharp -Span buffer = stackalloc char[64]; -guid.TryFormat(buffer, out int written); -``` - -**Impact: Zero heap allocation, no GC pressure, instant alloc/dealloc.** - -### Use Span.TryWrite for Allocation-Free Interpolation -🟡 **DO** use `MemoryExtensions.TryWrite` to format into `Span` buffers | .NET 6+ - -❌ -```csharp -string formatted = $"Date: {dt:R}"; -destination.Write(formatted); -``` -✅ -```csharp -Span buffer = stackalloc char[64]; -buffer.TryWrite($"Date: {dt:R}", out int charsWritten); -``` - -**Impact: Zero heap allocation for formatting operations.** - -### Use Span.Split() for Zero-Allocation Splitting -🟡 **DO** use `MemoryExtensions.Split` for allocation-free string splitting | **.NET 10 (or .NET 9) only — NOT available on .NET 8** - -❌ (allocates `string[]` — the only built-in option on .NET 8) -```csharp -string[] parts = input.Split(','); -``` -✅ .NET 10 -```csharp -foreach (Range range in input.AsSpan().Split(',')) -{ - ReadOnlySpan segment = input.AsSpan(range); -} -``` -✅ .NET 8 fallback — manual `IndexOf` loop on the span (no allocation) -```csharp -ReadOnlySpan remaining = input.AsSpan(); -while (!remaining.IsEmpty) -{ - int idx = remaining.IndexOf(','); - ReadOnlySpan segment = idx < 0 ? remaining : remaining[..idx]; - // ... use segment ... - remaining = idx < 0 ? default : remaining[(idx + 1)..]; -} -``` - -**Impact: 208 bytes → 0 bytes per split, 2x faster on .NET 10. The manual .NET 8 loop is also zero-allocation but more verbose.** - -### Use UTF8 String Literals (u8 suffix) -🟡 **DO** use the `u8` suffix for compile-time UTF8 `ReadOnlySpan` | .NET 7+ - -❌ -```csharp -byte[] header = Encoding.UTF8.GetBytes("Content-Type"); -``` -✅ -```csharp -ReadOnlySpan header = "Content-Type"u8; -``` - -**Impact: 17ns → 0.006ns — eliminates runtime transcoding entirely.** - -### Use ReadOnlySpan\ Pattern Matching with switch -🟡 **DO** use `switch` on `ReadOnlySpan` for allocation-free string matching | C# 11+ - -❌ -```csharp -switch (attr.Value.Trim()) { case "preserve": /* ... */ break; } -``` -✅ -```csharp -switch (attr.Value.AsSpan().Trim()) -{ - case "preserve": return Preserve; - case "default": return Default; -} -``` - -**Impact: Eliminates string allocation from Trim() in switch-based dispatch.** - -### Use params ReadOnlySpan\ to Eliminate Array Allocations -🟡 **DO** add `params ReadOnlySpan` overloads to library methods | **.NET 10 (or .NET 9) only — requires C# 13** - -❌ (the only option on .NET 8 — accept the array allocation, or add explicit 1/2/3-argument overloads) -```csharp -public static void Log(params string[] messages) { /* ... */ } -Log("Starting", "Processing", "Done"); -``` -✅ .NET 10 -```csharp -public static void Log(params ReadOnlySpan messages) { /* ... */ } -Log("Starting", "Processing", "Done"); -``` -✅ .NET 8 fallback — keep `params string[]` and add fixed-arity overloads for the hot common cases -```csharp -public static void Log(string m) { /* ... */ } -public static void Log(string m1, string m2) { /* ... */ } -public static void Log(string m1, string m2, string m3) { /* ... */ } -public static void Log(params string[] messages) { /* fallback for 4+ args */ } -``` - -**Impact: Eliminates params array allocation on .NET 10. On .NET 8 fixed-arity overloads cover the hot 1–3 argument cases.** - -### Avoid Chained String-Returning Operations -🟡 **AVOID** chains of 3+ string-returning method calls that each allocate intermediates | .NET Core+ - -**Pattern 1: Chained .Replace() calls** - -❌ -```csharp -string result = input.Replace("a", "b").Replace("c", "d").Replace("e", "f"); -``` -✅ -```csharp -var sb = new StringBuilder(input.Length); -// single pass replacing all patterns -``` - -**Pattern 2: Chained Regex.Replace() calls** - -❌ -```csharp -public static string Underscore(this string input) => - Regex3.Replace(Regex2.Replace(Regex1.Replace(input, "$1_$2"), "$1_$2"), "_").ToLower(); -``` -✅ -```csharp -return string.Create(totalLength, state, (span, s) => { /* write directly */ }); -``` - -**Pattern 3: += string concatenation in loops** - -❌ -```csharp -string result = ""; -foreach (var part in parts) - result += separator + part; -``` -✅ -```csharp -var sb = new StringBuilder(); -foreach (var part in parts) - sb.Append(separator).Append(part); -return sb.ToString(); -``` - -**Impact: Eliminates N-1 intermediate string allocations per chain. For `+=` in loops, eliminates O(n²) total allocation.** - -### Cache char.ToString() for Known Character Sets -🟡 **DO** cache `char.ToString()` results when the set of characters is small and known | .NET Core+ - -❌ -```csharp -return symbol.ToString(); - -foreach (var prefix in UnitPrefixes) - input = input.Replace(prefix.Value.Name, prefix.Key.ToString()); -``` -✅ -```csharp -private static readonly FrozenDictionary s_charStrings = - new Dictionary - { - ['k'] = "k", ['M'] = "M", ['G'] = "G", - }.ToFrozenDictionary(); - -return s_charStrings[symbol]; -``` - -**Impact: Eliminates one string allocation per char.ToString() call. Significant when called in loops or on hot paths.** - -## Detection - -Scan recipes for memory and string anti-patterns. Run these and report exact counts. - -```bash -# .ToLower()/.ToUpper() without culture parameter (allocates + culture-sensitive) -grep -rn --include='*.cs' -E '\.(ToLower|ToUpper)\(\)' --exclude-dir=bin --exclude-dir=obj . | wc -l - -# Chained .Replace( calls (3+ on one line — intermediate string allocations) -grep -rn --include='*.cs' '\.Replace(.*\.Replace(.*\.Replace(' --exclude-dir=bin --exclude-dir=obj . | wc -l - -# params in method signatures (array allocation per call) -grep -rn --include='*.cs' 'params ' --exclude-dir=bin --exclude-dir=obj . | wc -l - -# LINQ on strings — .All/.Any on IEnumerable (replace with foreach loop) -grep -rn --include='*.cs' -E '\.(All|Any)\(char\.' --exclude-dir=bin --exclude-dir=obj . | wc -l -``` - -### Patterns Requiring Manual Review - -- **Boxing via string.Format**: Can't determine argument types from grep — needs type analysis -- **`+=` string concatenation in loops**: `+=` matches all types (int, list, event, string) — needs type context to confirm string -- **`char.ToString()`**: Requires knowing the variable type is `char` — not reliably greppable diff --git a/.skills/dotnet-performance-profiling-and-optimization/references/memory-model-gc.md b/.skills/dotnet-performance-profiling-and-optimization/references/memory-model-gc.md deleted file mode 100644 index f64f6d8198..0000000000 --- a/.skills/dotnet-performance-profiling-and-optimization/references/memory-model-gc.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -description: CLR memory model and GC guidance for csharp-dotnet-cli-optimization. -metadata: - tags: [clr, gc, heap, stack, loh, memory-model] ---- - -# CLR Memory Model And GC - -Use this reference when the user asks why allocations, boxing, heap growth, GC pauses, or stack-based techniques behave the way they do. - -## Core Model - -- Reference types allocate objects on the managed heap. Local variables and fields hold references to those objects. -- Value types store their data directly. A value type local is often stored in stack storage, but value types also live inline inside object fields and array elements. -- "`struct` means stack" is false. The useful distinction is inline storage plus copy semantics, not "stack forever". -- Boxing converts a value type to `object` or an interface by allocating a new heap object and copying the value into it. -- `ref struct` types, including `Span` and `ReadOnlySpan`, are stack-constrained wrappers that can't escape to the managed heap. -- `Memory` and `ReadOnlyMemory` are the heap-storable counterparts when data must live across `await`, callbacks, or object fields. - -## How The GC Works - -- The GC is generational: gen0 for young objects, gen1 as a buffer, gen2 for long-lived survivors. -- The large object heap (LOH) is used for allocations at or above 85,000 bytes by default. -- Background GC is enabled by default. It reduces pause impact for full collections but does not make them free. -- Server GC and workstation GC are process-level choices. The defaults are usually right unless measurement says otherwise. -- On modern 64-bit Windows and Linux, the GC internally uses regions, but the optimization model for application code is still about generations, allocation rate, survivor rate, LOH churn, and pinning. - -## What Usually Makes GC Expensive - -- High allocation rate on hot paths -- Objects surviving long enough to promote into older generations -- Large transient allocations that churn the LOH -- Excessive pinning that increases fragmentation -- Finalizers on objects that should have been deterministic `Dispose` calls instead - -## Wrong vs Better - -| Wrong | Better | Why | -|---|---|---| -| Assume a `struct` is always stack allocated | Explain whether it will be copied, boxed, stored inline, or escape | That is what actually drives cost | -| Allocate large temporary arrays repeatedly | Reuse, pool, or redesign the algorithm if measurement shows LOH churn | LOH allocations are cleared and collected with gen2 work | -| Call `GC.Collect()` to "fix" memory pressure | Lower allocation rate and object lifetime first | Forced GC usually adds pause time and hides the real problem | -| Pin many buffers for long periods | Minimize pin count and pin duration | Pinning can fragment the heap | -| Use finalizers for routine cleanup | Use `IDisposable`, `using`, and `SafeHandle` for unmanaged resources | Finalization is slower and delays reclamation | - -## GC Configuration Rules - -- Treat GC configuration changes as process-wide tuning, not local fixes. -- Prefer runtime defaults unless counters and traces show a clear reason to change them. -- Choose server GC for throughput-oriented workloads only after measurement. -- Use low-latency modes sparingly and for bounded windows. They reduce GC intrusiveness by letting memory grow and can increase fragmentation. -- If you are tuning in containers or hard memory limits, treat heap hard-limit settings as operational controls, not code-level optimizations. - -## Bad vs Good Examples - -Bad: - -```csharp -for (int i = 0; i < 10_000; i++) -{ - DoWork(new byte[200_000]); -} -GC.Collect(); -``` - -Better: - -```csharp -byte[] buffer = ArrayPool.Shared.Rent(200_000); -try -{ - for (int i = 0; i < 10_000; i++) - { - DoWork(buffer); - } -} -finally -{ - ArrayPool.Shared.Return(buffer); -} -``` - -Bad: - -```csharp -public sealed class NativeThing -{ - ~NativeThing() => ReleaseHandle(); -} -``` - -Better: - -```csharp -public sealed class NativeThing : IDisposable -{ - public void Dispose() - { - ReleaseHandle(); - GC.SuppressFinalize(this); - } -} -``` - -## Practical Heuristics - -- If counters show rising allocation rate and frequent gen0 collections, start by eliminating short-lived allocations. -- If gen2 collections or LOH size are the problem, look for survivor growth, pinned buffers, and large transient objects. -- If a change turns classes into structs, verify both allocation wins and copy costs. -- If the process is memory-constrained, inspect runtime GC settings before changing code blindly. - -## What Not To Claim - -- Do not claim that moving code to `struct` always reduces memory. -- Do not claim that stack allocation is always faster than pooling. -- Do not claim that background GC removes pause concerns. -- Do not claim that the GC is the problem unless counters, traces, or dumps support that diagnosis. diff --git a/.skills/dotnet-performance-profiling-and-optimization/references/regex-patterns.md b/.skills/dotnet-performance-profiling-and-optimization/references/regex-patterns.md deleted file mode 100644 index 940a1b6687..0000000000 --- a/.skills/dotnet-performance-profiling-and-optimization/references/regex-patterns.md +++ /dev/null @@ -1,95 +0,0 @@ -# Regex Patterns - -### Choose the Right Regex Engine Mode -🟡 **DO** use `[GeneratedRegex]` for all static regex patterns, but never remove `NonBacktracking` if present | .NET 7+ - -❌ -```csharp -var r = new Regex(dynamicPattern, RegexOptions.Compiled); -``` -✅ -```csharp -[GeneratedRegex("pattern")] -private static partial Regex MyRegex(); - -var safe = new Regex(untrustedPattern, RegexOptions.NonBacktracking); - -var oneOff = new Regex("pattern"); -``` - -**Impact: Source generator is always beneficial for static patterns. NonBacktracking prevents O(2^N) worst case — never remove it if present.** - -### Use IsMatch When You Only Need a Boolean Result -🟡 **DO** use `IsMatch` instead of `Match(...).Success` | .NET 7+ - -❌ -```csharp -bool found = Regex.Match(input, pattern).Success; -``` -✅ -```csharp -bool found = Regex.IsMatch(input, pattern); -``` - -**Impact: Avoids Match object allocation; with NonBacktracking, ~3x faster by skipping capture computation.** - -### Use Regex.Count/EnumerateMatches Instead of Matches -🟡 **DO** use `Count()` and `EnumerateMatches()` for allocation-free match processing | .NET 7+ - -❌ -```csharp -int count = 0; -Match m = regex.Match(text); -while (m.Success) { count++; m = m.NextMatch(); } -``` -✅ -```csharp -int count = regex.Count(text); - -foreach (ValueMatch m in Regex.EnumerateMatches(text, @"\b\w+\b")) -{ - ReadOnlySpan word = text.AsSpan(m.Index, m.Length); -} -``` - -**Impact: ~3x faster than Match/NextMatch with NonBacktracking. Zero allocations for both Count and EnumerateMatches.** - -### Use Span-Based Regex APIs for Allocation-Free Matching -🟡 **DO** use `ReadOnlySpan` overloads for regex matching on spans | .NET 7+ - -❌ -```csharp -string sub = largeBuffer.Substring(start, length); -bool found = Regex.IsMatch(sub, pattern); -``` -✅ -```csharp -ReadOnlySpan text = largeBuffer.AsSpan(start, length); -foreach (ValueMatch m in Regex.EnumerateMatches(text, @"\b\w+\b")) -{ - ReadOnlySpan word = text.Slice(m.Index, m.Length); -} -``` - -**Impact: Eliminates string allocations when working with spans — particularly valuable in high-throughput parsing pipelines.** - -## Detection - -Scan recipes for regex anti-patterns. Run these and report exact counts. - -```bash -# Compiled regex count (startup cost budget — compare ratio to GeneratedRegex) -grep -rn --include='*.cs' 'RegexOptions.Compiled' --exclude-dir=bin --exclude-dir=obj . | wc -l - -# GeneratedRegex count (already optimized — verify the inverse) -grep -rn --include='*.cs' 'GeneratedRegex' --exclude-dir=bin --exclude-dir=obj . | wc -l - -# Uncached new Regex() calls (construction cost per call) -grep -rn --include='*.cs' 'new Regex(' --exclude-dir=bin --exclude-dir=obj . | wc -l -``` - -When `RegexOptions.Compiled` appears inside a class constructor or field initializer of an instantiated class (not a static singleton), count how many instances of that class are created at startup to determine total compiled regex budget. For example, if a `Rule` class compiles a regex in its constructor and 122 rules are registered, that is 122 compiled regexes at startup. - -### Patterns Requiring Manual Review - -- **`new Regex(` uncached**: Field assignment may span multiple lines — grep on one line is unreliable. Verify that matched instances are stored in `static readonly` fields or `[GeneratedRegex]`. diff --git a/.skills/dotnet-performance-profiling-and-optimization/references/structural-patterns.md b/.skills/dotnet-performance-profiling-and-optimization/references/structural-patterns.md deleted file mode 100644 index 9cf41b2849..0000000000 --- a/.skills/dotnet-performance-profiling-and-optimization/references/structural-patterns.md +++ /dev/null @@ -1,38 +0,0 @@ -# Structural Patterns - -Patterns detected by the **absence** of a keyword or interface. These require codebase-wide counting scans, not single-file matching. - -### Seal Classes for Devirtualization -🟡 **DO** seal all leaf classes (those not subclassed) | .NET Core 3.0+ - -Sealing lets the JIT devirtualize/inline virtual calls and use pointer comparison for type checks. Every non-abstract, non-static class that is not subclassed should be sealed. - -**Detection:** This is an absence pattern — scan for classes that are NOT sealed. - -```bash -# Count unsealed (non-abstract, non-static) classes -grep -rn --include='*.cs' -E '^\s*((public|internal|private|protected|file)\s+)?(partial\s+)?class ' --exclude-dir=bin --exclude-dir=obj . | grep -v 'sealed' | grep -v 'abstract' | grep -v 'static' | wc -l - -# Count already-sealed classes (verify the inverse) -grep -rn --include='*.cs' 'sealed class' --exclude-dir=bin --exclude-dir=obj . | wc -l -``` - -**Exclusions:** Do not seal classes that are subclassed elsewhere in the codebase. Identifying base classes requires manual review — grep for `: ClassName` patterns and cross-reference, but expect false positives from interface implementations and generic constraints. - -❌ -```csharp -internal class MyHandler : Base -{ public override int Run() => 42; } -``` -✅ -```csharp -internal sealed class MyHandler : Base -{ public override int Run() => 42; } -``` - -**Impact: Virtual calls up to 500x faster; type checks ~25x faster. Severity scales with count.** - -**Scale-based severity:** -- 1-10 unsealed leaf classes → ℹ️ Info -- 11-50 unsealed leaf classes → 🟡 Moderate -- 50+ unsealed leaf classes → 🟡 Moderate (elevated priority) diff --git a/.skills/dotnet-security-review b/.skills/dotnet-security-review new file mode 120000 index 0000000000..25d4a3d0c0 --- /dev/null +++ b/.skills/dotnet-security-review @@ -0,0 +1 @@ +../MCC-Skills/skills/dotnet-security-review \ No newline at end of file diff --git a/.skills/dotnet-security-review/SKILL.md b/.skills/dotnet-security-review/SKILL.md deleted file mode 100644 index f4b1f81196..0000000000 --- a/.skills/dotnet-security-review/SKILL.md +++ /dev/null @@ -1,145 +0,0 @@ ---- -name: dotnet-security-review -description: >- - Performs a systematic C#/ASP.NET Core security code review on .NET 8 (C# 12) - and .NET 10 (C# 14) codebases. Covers OWASP Top 10, authentication/authorization - audit, input validation, cryptography, dependency vulnerabilities, security - headers, middleware pipeline, and CI/CD security posture. -metadata: - platform: ".NET 8 and .NET 10 (no .NET 9 projects in scope)" ---- - -# Security Code Review for C# / ASP.NET Core (.NET 8 + .NET 10) - -You are a security auditor performing a thorough, evidence-based code review. Every finding MUST include file path, line number, severity, impact, and a concrete fix. - -## Step 0 — Detect the target framework - -Before scoring findings, follow `../../references/detect-target-framework.md`. The security guidance below applies to **both** .NET 8 and .NET 10 unless explicitly marked. A few items are .NET 10-only — when reviewing a .NET 8 project, don't recommend them as "fixes": - -- **ASP.NET Core Identity passkeys** (`AddPasskeys()`) — .NET 10 only. On .NET 8, recommend external IdP / `Fido2NetLib` or password+TOTP. -- **Minimal-API built-in validation** (`AddValidation()`) — .NET 10 only. On .NET 8, FluentValidation + `IEndpointFilter` is the safe equivalent. -- **First-party `Microsoft.AspNetCore.OpenApi`** — .NET 9+ only. On .NET 8 the project should use `Swashbuckle.AspNetCore`; flag missing OpenAPI security schemes accordingly. -- **`HybridCache`** — .NET 9+ only. On .NET 8 verify `IDistributedCache` configurations (encryption-at-rest, key prefixing, TLS to Redis) directly. -- The C# 14 `field` keyword, `extension(...)` blocks, null-conditional assignment, and partial constructors **do not compile on net8.0** — never propose security fixes that introduce them on a .NET 8 project. - -All cryptography, JWT, authorization-policy, header, and middleware guidance applies identically on both targets. - -## Target Selection - -The user's arguments are in `$ARGUMENTS`. - -- If `$ARGUMENTS` contains a file path or directory, review that target. -- If `$ARGUMENTS` is "all", review the entire codebase starting from the solution root. -- If `$ARGUMENTS` is empty, run `git diff --name-only HEAD~5` to find recently changed `.cs` files. If none, ask the user what to review. - -When reviewing a directory or "all", use Glob to find `**/*.cs` files, then prioritize: -1. Controllers, filters, middleware (`*Controller.cs`, `*Filter.cs`, `Program.cs`) -2. Auth handlers and delegating handlers (`*Handler.cs`, `*DelegatingHandler.cs`) -3. Service implementations handling external input or secrets -4. Repository and data access code -5. Configuration and DI registration (`*Extensions.cs`, `*Options.cs`) -6. Validators - -## Review Process - -Execute each phase sequentially. Use the Read tool for files and the Grep tool for pattern searches. NEVER use bash `grep` or `rg` -- always use the Grep tool. - -### Phase 1: Automated Pattern Scanning - -Read `references/scanning-patterns.md` for the full pattern catalog. Run all Grep searches in parallel across `.cs` files in the target scope. Each pattern targets a specific vulnerability class: injection, deserialization, cryptography, async anti-patterns, data exposure, SSRF, missing controls, ReDoS, log injection, open redirect, cookie security, file upload, claims safety, and thread safety. - -### Phase 2: File-by-File Deep Review - -Read `references/deep-review-categories.md` for the complete checklist (Categories A through L). For each file in scope (or top ~20 most security-relevant files when reviewing "all"), check all applicable categories: - -- **A**: Authentication & Authorization (JWT validation, auth schemes, IDOR) -- **B**: Input Validation -- **C**: Error Handling & Information Leakage -- **D**: Cryptography & Secrets -- **E**: Data Protection & PII -- **F**: Concurrency & State Safety -- **G**: CancellationToken Propagation -- **H**: HTTP Client Security (resilience handlers, DNS refresh) -- **I**: Configuration Security -- **J**: Logging & Monitoring Security -- **K**: Output Encoding & Response Security -- **L**: Supply Chain & Build Security - -### Phase 3: Architecture & Project-Specific Checks - -Read `references/architecture-checks.md` for checks tailored to common ASP.NET Core project patterns. These cover endpoint authorization verification, anonymous endpoint abuse potential, OTP/MFA security, exception handling coverage, optimistic concurrency, state expiry, blob storage SAS security, message queue security, JSON serialization settings, background task queue safety, rate limiting, security headers, middleware ordering, and NuGet audit configuration. - -Read the project's CLAUDE.md or AGENTS.md for project-specific architecture details to inform these checks. - -### Phase 4: Dependency Vulnerability Check - -Read `references/dependencies-and-headers.md` (Phase 4 section) for dependency scanning patterns. Check `.csproj` files for known-vulnerable versions and NuGet audit configuration. - -### Phase 5: Security Headers & Middleware Pipeline - -Read `references/dependencies-and-headers.md` (Phase 5 section) for the 14-item headers checklist and middleware ordering verification. - -## Output Format - -### Security Review Report - -**Scope:** [files/directories reviewed] -**Date:** [current date] -**Risk Summary:** [X CRITICAL, Y HIGH, Z MEDIUM, W LOW, V INFO] - -#### Findings - -For each finding: - -**[SEVERITY] [SHORT-TITLE]** -- **Location:** `file/path.cs:LINE` -- **Category:** [OWASP category or security domain] -- **Description:** [What the vulnerability is and why it matters] -- **Impact:** [What an attacker could achieve] -- **Recommendation:** [Specific fix with code example] - -#### Summary Table - -| # | Severity | Category | File | Description | -|---|----------|----------|------|-------------| -| 1 | CRITICAL | ... | ... | ... | - -#### Recommendations - -1. Immediate fixes (CRITICAL/HIGH) -2. Short-term improvements (MEDIUM) -3. Long-term hardening (LOW/INFO) -4. Tooling recommendations (NuGet audit, SAST integration, etc.) - -## Severity - -Use standard severity: CRITICAL > HIGH > MEDIUM > LOW > INFO. CRITICAL = actively exploitable, HIGH = significant with effort, MEDIUM = increased attack surface, LOW = minor improvement, INFO = hardening suggestion. - -## Anti-Rationalization Table - -| Rationalization | Reality | -|---|---| -| "This is just a test file" | Test code handling secrets or auth IS production-relevant. Report as INFO. | -| "Probably a false positive" | ALWAYS read surrounding code before dismissing. If you cannot prove it safe, report it. | -| "The framework handles this" | Verify the protection is actually enabled and configured. Defaults can be overridden. | -| "Internal API, not public-facing" | Internal APIs are attacked via SSRF, supply chain, lateral movement. | -| "No one would exploit this" | Threat models change. Report it; let the team decide risk acceptance. | - -## Red Flags - -STOP and investigate deeper if you encounter any of these: -- Any endpoint without an explicit auth attribute (`[Authorize]` or `[AllowAnonymous]`) -- Any `catch` block returning raw exception data to the client -- Any hardcoded key, token, password, or connection string literal -- Any `new HttpClient()` (should use `IHttpClientFactory`) -- Any `TypeNameHandling` value other than `None` - -## Important Guidelines - -1. Only report real findings with evidence (file path and line number). Do not speculate. -2. If a pattern search returns no results, note "No issues found" and move on. -3. For false positives (e.g., `System.Random` in tests, not production), note as INFO with explanation. -4. Prioritize production code over test code. -5. When reviewing "all", cap the report at the 30 most significant findings. -6. ALWAYS verify context before reporting -- a pattern match alone is not a finding. Read the surrounding code. diff --git a/.skills/dotnet-security-review/references/architecture-checks.md b/.skills/dotnet-security-review/references/architecture-checks.md deleted file mode 100644 index 361c9fd0e4..0000000000 --- a/.skills/dotnet-security-review/references/architecture-checks.md +++ /dev/null @@ -1,134 +0,0 @@ -# Architecture & Project-Specific Checks Reference -# Phase 3 checks for common ASP.NET Core project patterns. Read the project's CLAUDE.md -# or AGENTS.md for project-specific details (endpoint list, service names, DI registrations) -# to inform these checks. - -## Check 1: Endpoint Auth Matrix Verification - -Cross-reference the controller's actual `[Authorize]`/`[AllowAnonymous]` attributes against the project's documented auth requirements. Read CLAUDE.md or AGENTS.md for the expected auth matrix. Any mismatch is CRITICAL. - -For projects with multiple auth schemes (e.g., Azure AD + custom JWT), verify each endpoint uses the correct scheme/policy. - -## Check 2: Anonymous Endpoint Abuse Potential - -For each `[AllowAnonymous]` endpoint, verify: -- Rate limiting or throttling exists for sensitive operations (e.g., code generation, login attempts) -- Enumeration attacks are mitigated (IDs are GUIDs or non-sequential, not auto-increment) -- No state modification without prior authentication or verification (e.g., OTP first) - -## Check 3: OTP / MFA Security Review - -If the project implements OTP or MFA, read the service implementation and verify: -- Code length is sufficient (6+ characters) -- Codes are generated with `RandomNumberGenerator` -- Hash is SHA-256 or stronger (not MD5/SHA1) -- Expiry is enforced (typically 5-10 minutes) -- Wrong attempt counter increments correctly and triggers lockout after a threshold -- No timing side-channel in hash comparison - -## Check 4: Exception Handling Coverage - -Grep for `throw new` statements. Verify that all thrown exceptions are either: -- The project's structured error type (e.g., `ApiException`, `DomainException`, or the project's custom base exception), OR -- Known typed exceptions for external service failures - -Any unstructured exception thrown from handler/service code may bypass error filters and leak internal details. - -## Check 5: Optimistic Concurrency on State Writes - -If using a database with optimistic concurrency (ETags, row versions): -- Verify every write/update operation passes the concurrency token -- Verify the concurrency token store/tracking mechanism is consulted on every read/write cycle - -## Check 6: Expired State Handling - -If the project uses application-level state expiry (not DB TTL): -- Verify expired records are deleted or excluded on read (not returned to callers) -- Verify callers cannot act on expired data - -## Check 7: Blob Storage SAS URL Security - -If the project generates SAS URLs for blob storage: -- SAS token expiry is short-lived (minutes, not days) -- Permission is read-only (not write/delete) -- Scoped to the specific blob (not container-level) - -## Check 8: Message Queue Security - -If the project uses message queues (Service Bus, RabbitMQ, etc.): -- Messages do not contain secrets or unnecessary PII -- Queue connections use managed identity or connection strings from secret stores - -## Check 9: JSON Serialization Settings - -Check that `TypeNameHandling` is set to `None` (default) and not `Auto`/`All` anywhere. This applies to both Newtonsoft.Json and any custom serializer configuration. - -## Check 10: Background Task Queue Safety - -If the project uses a background task queue: -- Bounded capacity prevents unbounded memory growth -- Backpressure is handled correctly (not silently dropping critical events like audit logs) -- Task failures are observed and logged/metered - -## Check 11: Custom Token / JWT Security - -If the project issues its own JWTs (not just validating external tokens): -- **Algorithm**: HMAC-SHA256 or stronger (RSA for distributed validation) -- **Signing key source**: Key loaded from configuration/secret store, NOT hardcoded -- **Signing key length**: Minimum 256 bits (32 bytes) for HMAC-SHA256 -- **Token expiry**: Appropriately capped (tokens should not outlive the session/resource they protect) -- **Claims validation**: Custom claims (e.g., resource IDs) are validated against route parameters by an authorization handler -- **TokenValidationParameters**: `ValidateIssuer`, `ValidateAudience`, `ValidateLifetime`, `ValidateIssuerSigningKey` all `true` -- **ClockSkew**: Tightened from default 5 minutes to 2 minutes or less - -## Check 12: Response Data Sanitization - -If the project sanitizes response data (e.g., stripping internal paths or fields): -- Sanitization handles malformed input gracefully (does not throw/crash) -- Only known sensitive fields are stripped (no over-stripping that breaks functionality) -- Sanitization is applied on every code path returning the data (not just the happy path) - -## Check 13: Rate Limiting - -Verify rate limiting posture: -- Grep for `AddRateLimiter` and `UseRateLimiter` -- if absent, note as finding -- Application-level throttling exists for sensitive operations (e.g., SMS/code generation resend limits) -- Brute force protection exists for verification endpoints (wrong attempt lockout) -- **Recommendation**: Add ASP.NET Core `System.Threading.RateLimiting` middleware for IP-based throttling on public endpoints - -## Check 14: Security Headers Completeness - -Check Program.cs / middleware for these headers (report missing ones): -- `X-Content-Type-Options: nosniff` -- `X-Frame-Options: DENY` -- `Referrer-Policy: strict-origin-when-cross-origin` -- `Permissions-Policy: camera=(), microphone=(), geolocation=()` -- `X-XSS-Protection: 0` (disable legacy XSS filter; CSP is the modern replacement) -- `Content-Security-Policy` (at minimum for APIs: `default-src 'none'`) -- `Server` header removed -- `X-Powered-By` header removed - -## Check 15: Middleware Pipeline Ordering - -Read Program.cs and verify correct middleware order: -1. `UseExceptionHandler` (outermost -- catches everything) -2. `UseHsts` (non-development only) -3. `UseHttpsRedirection` -4. Security headers middleware -5. `UseRateLimiter` (if present) -6. `UseRouting` (if explicit) -7. `UseCors` -8. `UseAuthentication` -9. `UseAuthorization` -10. `MapControllers` / endpoints - -Authentication MUST come before Authorization. CORS MUST come before Authentication. ExceptionHandler MUST be first. - -## Check 16: NuGet Audit & Build Security - -Check for build-level security configuration: -- Does `Directory.Build.props` exist? If so, verify `NuGetAudit`, `NuGetAuditMode`, `NuGetAuditLevel` settings. -- Are Roslyn security analyzer packages referenced? (`SecurityCodeScan.VS2019`, `SonarAnalyzer.CSharp`, `Meziantou.Analyzer`) -- Are `AnalysisLevel` / `AnalysisMode` set in `.csproj` or `Directory.Build.props`? -- Run Grep for floating versions: `Version="[^"]*\*"` in `.csproj` files -- Recommend `dotnet list package --vulnerable --include-transitive` as a CI step diff --git a/.skills/dotnet-security-review/references/deep-review-categories.md b/.skills/dotnet-security-review/references/deep-review-categories.md deleted file mode 100644 index 64f5926f43..0000000000 --- a/.skills/dotnet-security-review/references/deep-review-categories.md +++ /dev/null @@ -1,107 +0,0 @@ -# Deep Review Categories Reference -# File-by-file review checklist for Phase 2. For each file in scope (or top ~20 most -# security-relevant files when reviewing "all"), read the file and check each applicable category. - -## Category A: Authentication & Authorization - -1. Every controller action has either `[Authorize]` (class or method level) or `[AllowAnonymous]` explicitly. -2. No IDOR: when accessing resources by ID, verify the handler checks that the caller owns or is authorized to access that resource. -3. JWT validation settings are strict: issuer, audience, lifetime, algorithm all validated. -4. Token acquisition uses correct flow: app tokens for backend-to-backend, OBO only where user context is needed. -5. No `[AllowAnonymous]` on endpoints that modify sensitive state without alternative authentication (e.g., OTP verification first). -6. **Multiple auth scheme verification**: If the project uses multiple auth schemes (e.g., Azure AD + custom JWT), verify correct scheme is applied per endpoint. No scheme confusion between internal and client-facing endpoints. -7. **JWT `alg:none` rejection**: Verify `TokenValidationParameters` does NOT allow `alg:none`. All schemes must validate the signing algorithm (`ValidateIssuerSigningKey = true`). -8. **HMAC signing key minimum length**: If using HMAC-SHA256 for JWT signing, the key must be at least 256 bits (32 bytes). Check options validation. -9. **Structured error responses on auth failure**: `OnChallenge` (401) and `OnForbidden` (403) events should return structured JSON error responses, not default HTML/empty responses. - -## Category B: Input Validation - -1. All DTOs accepted by handlers have corresponding FluentValidation validators registered. -2. Route parameters are validated for format before use (e.g., GUID format, positive integers). -3. File uploads are validated for content type, size, and extension (not just extension). -4. No unvalidated user input flows into file paths, URLs, SQL, commands, or log messages. -5. Phone numbers, emails, and other PII are validated and normalized before processing. - -## Category C: Error Handling & Information Leakage - -1. All expected errors use a structured error type -- never return raw exception details to clients. -2. Exception filters catch known exception types and return only safe error payloads. -3. Unknown exceptions are wrapped as generic 500 errors without stack traces or internal details. -4. Error messages returned to clients do not reveal internal architecture, database schema, or file paths. -5. Catch blocks never silently swallow exceptions -- they must log or rethrow. - -## Category D: Cryptography & Secrets - -1. OTP/MFA codes use `RandomNumberGenerator` (not `System.Random`). -2. Hash comparison uses constant-time comparison to prevent timing attacks. -3. Hash storage uses a secure algorithm (SHA-256 minimum; bcrypt/Argon2 for passwords). -4. No secrets, connection strings, or API keys appear in source code or `appsettings.json` committed to git. -5. Options validation (`ValidateOnStart()`) is configured to reject placeholder secrets in production. - -## Category E: Data Protection & PII - -1. Sensitive fields (phone numbers, etc.) are masked before returning to unauthenticated callers. -2. PII (names, addresses, phone numbers, emails) is not logged in full -- use masking. -3. Sensitive internal fields (hash values, internal IDs) are excluded from API responses. -4. Blob/file storage SAS URLs have appropriate expiry times and permissions (read-only, short-lived). -5. Audit logs do not contain raw PII that violates data protection requirements. - -## Category F: Concurrency & State Safety - -1. Database state mutations use optimistic concurrency (ETags, row versions, or equivalent). -2. Concurrency exceptions are caught and retried appropriately in handlers. -3. Multi-step validation flows (OTP, MFA) handle concurrent attempts correctly. -4. Counter increments (e.g., wrong attempt counts) are atomic or protected against race conditions. -5. Scheduled/delayed operations do not race with in-progress workflows. - -## Category G: CancellationToken Propagation - -1. Every `async` method in the call chain accepts `CancellationToken cancellationToken = default`. -2. The token is passed to every awaited call: HTTP calls, DB queries, blob operations, queue sends. -3. The controller passes `HttpContext.RequestAborted` to handlers. -4. Missing propagation is a DoS vector (abandoned requests hold resources). - -## Category H: HTTP Client Security - -1. HttpClient instances have timeouts configured (not infinite). -2. Delegating handlers do not log tokens or authorization headers. -3. SSL/TLS validation is not disabled (`ServerCertificateCustomValidationCallback` returning true). -4. Retry policies do not retry on authentication failures (401/403). -5. External API clients have adequate timeout and error handling even without resilience middleware. -6. **Standard resilience handler**: Verify `AddStandardResilienceHandler()` or equivalent resilience pipeline is configured on named HttpClients. -7. **Retry-After header respect**: Retry policies should honor `Retry-After` headers from downstream APIs to avoid cascading failures. -8. **DNS refresh**: Verify `SocketsHttpHandler.PooledConnectionLifetime` is set (recommended 2-5 min) to handle DNS changes. - -## Category I: Configuration Security - -1. CORS policy does not use `AllowAnyOrigin()` in production. -2. Swagger UI is disabled in production (or restricted to authorized users). -3. Health check endpoints do not expose sensitive information. -4. `X-Powered-By` and `Server` headers are removed. -5. HTTPS redirection and HSTS are configured for production. - -## Category J: Logging & Monitoring Security - -1. Authentication events are logged (both success and failure) for audit trail. -2. Authorization failures are logged with sufficient context (user, endpoint, reason). -3. Input validation failures are logged (not just returned as 400 responses). -4. Structured logging used throughout -- no string interpolation in log method calls (use message templates). -5. Sensitive data (passwords, tokens, PII, hash values) is NEVER logged at any log level. -6. Correlation IDs are included in all error log entries for traceability. -7. Log output is not accessible to API clients (no endpoint returns log data). - -## Category K: Output Encoding & Response Security - -1. No internal file paths, class names, or assembly names leak in API responses (check error messages, headers). -2. Razor templates are verified for `@Html.Raw()` usage -- must be justified and input-sanitized. -3. `TypeNameHandling.None` verified for Newtonsoft.Json serialization (prevents type injection). -4. `Content-Type` headers are explicitly set on all responses (no browser MIME-sniffing). -5. Response sanitization logic handles malformed input gracefully (no crashes on invalid JSON/data). - -## Category L: Supply Chain & Build Security - -1. `Directory.Build.props` exists with NuGet audit settings (`NuGetAudit`, `NuGetAuditMode`, `NuGetAuditLevel`). -2. Package versions are pinned (no floating versions like `Version="1.*"`). -3. `AnalysisLevel` and `AnalysisMode` are set to `latest-Recommended` / `Recommended` in build configuration. -4. Security analyzers included in packages (SecurityCodeScan, SonarAnalyzer.CSharp, or Meziantou.Analyzer). -5. No known-vulnerable version ranges in `.csproj` files (check Newtonsoft.Json >= 13.0.1, Microsoft.Identity.Web >= 2.x, System.Text.Json >= 8.0.5). diff --git a/.skills/dotnet-security-review/references/dependencies-and-headers.md b/.skills/dotnet-security-review/references/dependencies-and-headers.md deleted file mode 100644 index 03bc671e2b..0000000000 --- a/.skills/dotnet-security-review/references/dependencies-and-headers.md +++ /dev/null @@ -1,92 +0,0 @@ -# Dependencies & Headers Reference -# Combined Phase 4 (dependency vulnerability checks) and Phase 5 (headers/middleware) content. - -## Phase 4: Dependency Vulnerability Check - -### Automated Grep Checks - -Run these Grep patterns against `.csproj` files to detect known-vulnerable version ranges: - -| Pattern | Risk | -|---------|------| -| `Newtonsoft\.Json.*Version="([0-9]+)` where major < 13 | CVEs in Newtonsoft.Json < 13.0.1 | -| `Newtonsoft\.Json.*Version="13\.0\.0"` | Pre-patch 13.x | -| `Microsoft\.Identity\.Web.*Version="1\."` | CVEs in Microsoft.Identity.Web < 2.x | -| `System\.Text\.Json.*Version="[0-7]\.\|Version="8\.0\.[0-4]"` | CVEs in System.Text.Json < 8.0.5 | -| `Version="[^"]*\*"` | Floating versions (unpinned, supply chain risk) | - -### NuGet Audit Configuration Check - -Grep `Directory.Build.props` and `.csproj` files for: -- `true` -- should be present -- `all` -- audits transitive dependencies -- `low` -- catches all severity levels -- `` containing `NU1903;NU1904` -- fails build on high/critical vulnerabilities - -### ReDoS in Validators - -Check all `Regex` and `.Matches()` calls in validators: -- Pattern: `new Regex\((?!.*RegexOptions\.NonBacktracking)` -- missing NonBacktracking flag (.NET 7+) -- Check for nested quantifiers: `(a+)+`, `(a*)*`, `(a|a)*` patterns - -### Command Recommendation - -Include in report output (do NOT run automatically): -```bash -dotnet list package --vulnerable --include-transitive -``` - -## Phase 5: Security Headers & Middleware Pipeline - -### Headers Checklist (14 items) - -Read `Program.cs` and any middleware configuration files. Check for each header: - -| # | Header / Control | Expected Value | Severity if Missing | -|---|-----------------|----------------|---------------------| -| 1 | `X-Content-Type-Options` | `nosniff` | MEDIUM | -| 2 | `X-Frame-Options` | `DENY` | MEDIUM | -| 3 | `Referrer-Policy` | `strict-origin-when-cross-origin` | LOW | -| 4 | `Permissions-Policy` | `camera=(), microphone=(), geolocation=()` | LOW | -| 5 | `X-XSS-Protection` | `0` (disable legacy filter; CSP replaces it) | LOW | -| 6 | `Content-Security-Policy` | At minimum `default-src 'none'` for APIs | MEDIUM | -| 7 | `Server` header | REMOVED | LOW | -| 8 | `X-Powered-By` header | REMOVED | LOW | -| 9 | `Strict-Transport-Security` | `max-age=31536000; includeSubDomains; preload` | HIGH | -| 10 | `Cache-Control` | `no-store` on sensitive data endpoints | MEDIUM | -| 11 | HTTPS Redirection | `app.UseHttpsRedirection()` present | HIGH | -| 12 | HSTS | `app.UseHsts()` in non-development | HIGH | -| 13 | Rate Limiting | `app.UseRateLimiter()` present | MEDIUM | -| 14 | Swagger restricted | Conditionally enabled (dev/staging only) | MEDIUM | - -### Middleware Pipeline Ordering - -The correct order for ASP.NET Core middleware is critical. Misordering can bypass security controls. - -**Expected order:** -``` -1. app.UseExceptionHandler(...) // Outermost: catches all unhandled exceptions -2. app.UseHsts() // HSTS (non-development only) -3. app.UseHttpsRedirection() // Force HTTPS -4. Security headers middleware // Custom: X-Content-Type-Options, etc. -5. app.UseRateLimiter() // Throttle before routing (if present) -6. app.UseRouting() // (implicit in .NET 8+ with MapControllers) -7. app.UseCors(...) // CORS before auth (preflight must not require auth) -8. app.UseAuthentication() // Identify the caller -9. app.UseAuthorization() // Enforce access rules -10. app.MapControllers() // Endpoint dispatch -``` - -**Critical ordering rules:** -- `UseExceptionHandler` MUST be first -- otherwise exceptions in early middleware are unhandled -- `UseAuthentication` MUST come before `UseAuthorization` -- otherwise auth policies have no identity to check -- `UseCors` MUST come before `UseAuthentication` -- otherwise CORS preflight (OPTIONS) requests fail with 401 -- `UseRateLimiter` SHOULD come before `UseRouting` -- otherwise rate limits apply after route matching overhead -- `UseHsts` and `UseHttpsRedirection` SHOULD come early -- before any response body is written - -### Middleware Verification Procedure - -1. Read `Program.cs` from the `var app = builder.Build()` line to `app.Run()` -2. List every `app.Use*` and `app.Map*` call in order -3. Compare against expected order above -4. Report any misordering as MEDIUM severity diff --git a/.skills/dotnet-security-review/references/scanning-patterns.md b/.skills/dotnet-security-review/references/scanning-patterns.md deleted file mode 100644 index 926b9d6972..0000000000 --- a/.skills/dotnet-security-review/references/scanning-patterns.md +++ /dev/null @@ -1,116 +0,0 @@ -# Scanning Patterns Reference -# Automated Grep patterns organized by vulnerability class for Phase 1 scanning. -# Run all searches in parallel across .cs files in the target scope. - -## Injection Vulnerabilities - -| ID | Pattern | Target | -|----|---------|--------| -| INJ-1 | `\$".*SELECT\|INSERT\|UPDATE\|DELETE\|DROP\|EXEC` | SQL injection via string interpolation | -| INJ-2 | `string\.Format.*SELECT\|INSERT\|UPDATE\|DELETE` | SQL injection via string.Format | -| INJ-3 | `\.FromSqlRaw\(.*\$"\|\.FromSqlRaw\(.*string\.Format` | EF Core raw SQL injection | -| INJ-4 | `ExecuteSqlRaw\(.*\$"\|ExecuteSqlRaw\(.*string\.Format` | EF Core command injection | -| INJ-5 | `Process\.Start\|ProcessStartInfo` | Command injection | -| INJ-6 | `DirectorySearcher\|LdapConnection` | LDAP injection (check for string concat) | -| INJ-7 | `XmlDocument\|XmlReader\|XDocument` | XXE (verify secure settings) | -| INJ-8 | `Path\.Combine.*Request\|Path\.Combine.*user\|\.\.\/\|\.\.\\` | Path traversal | - -## Insecure Deserialization - -| ID | Pattern | Target | -|----|---------|--------| -| DES-1 | `BinaryFormatter\|SoapFormatter\|ObjectStateFormatter\|LosFormatter\|NetDataContractSerializer` | Banned deserializers | -| DES-2 | `JsonConvert\.DeserializeObject.*TypeNameHandling` | Newtonsoft type handling | -| DES-3 | `TypeNameHandling\s*=\s*TypeNameHandling\.(All\|Auto\|Objects\|Arrays)` | Unsafe type handling | - -## Cryptography Weaknesses - -| ID | Pattern | Target | -|----|---------|--------| -| CRY-1 | `new Random\(\)\|System\.Random` | Insecure randomness (should be RandomNumberGenerator) | -| CRY-2 | `MD5\.Create\|SHA1\.Create\|DESCryptoServiceProvider\|RC2CryptoServiceProvider\|TripleDES` | Weak algorithms | -| CRY-3 | `ECB` | Insecure cipher mode | -| CRY-4 | `password\|secret\|key\|token\|credential\|apikey\|connectionstring` in string literals | Hardcoded secrets | - -## Async Anti-Patterns - -| ID | Pattern | Target | -|----|---------|--------| -| ASY-1 | `\.Result[^s]\|\.Result$` | Sync-over-async deadlock risk | -| ASY-2 | `\.Wait\(\)` | Sync-over-async deadlock risk | -| ASY-3 | `\.GetAwaiter\(\)\.GetResult\(\)` | Sync-over-async | -| ASY-4 | `Task\.Run\(` | Thread pool abuse in ASP.NET context | - -## Sensitive Data Exposure - -| ID | Pattern | Target | -|----|---------|--------| -| EXP-1 | `_logger\.Log.*password\|_logger\.Log.*secret\|_logger\.Log.*token\|_logger\.Log.*apiKey` (case insensitive) | Logging secrets | -| EXP-2 | `Console\.Write.*password\|Console\.Write.*secret\|Console\.Write.*token` | Console output of secrets | -| EXP-3 | `Html\.Raw\(` | XSS via unencoded HTML | -| EXP-4 | `Exception\.ToString\(\)\|Exception\.StackTrace\|Exception\.Message` returned in HTTP responses | Stack trace leakage | - -## SSRF Risks - -| ID | Pattern | Target | -|----|---------|--------| -| SSRF-1 | `new HttpClient\(\).*\+\|HttpClient.*GetAsync\(.*\+\|HttpClient.*PostAsync\(.*\+` | User-controlled URLs | -| SSRF-2 | `new Uri\(.*Request\|new Uri\(.*user\|new Uri\(.*input` | Unvalidated URI construction | -| SSRF-3 | `HttpClient.*GetAsync\(.*[^"]\)\|HttpClient.*PostAsync\(.*[^"]\)` | Non-literal URLs in HTTP calls | -| SSRF-4 | `new Uri\([^"]*\)` | Dynamic URI construction | -| SSRF-5 | `IPAddress\.Parse\("\|Uri\("http` | Hardcoded IPs/URLs | - -## Missing Security Controls - -| ID | Pattern | Target | -|----|---------|--------| -| CTL-1 | `\[HttpPost\]\|\[HttpPut\]\|\[HttpDelete\]\|\[HttpPatch\]` | Unannotated endpoints (check for nearby [Authorize]/[AllowAnonymous]) | -| CTL-2 | `AllowAnyOrigin` | CORS misconfiguration | -| CTL-3 | `app\.UseDeveloperExceptionPage` | Dev error page in production | -| CTL-4 | `#pragma warning disable` | Disabled security warnings | - -## ReDoS - -| ID | Pattern | Target | -|----|---------|--------| -| REG-1 | `new Regex\((?!.*RegexOptions\.NonBacktracking)` | Regex without NonBacktracking (ReDoS risk in .NET 7+) | - -## Log Injection - -| ID | Pattern | Target | -|----|---------|--------| -| LOG-1 | `_logger\.Log.*(Request\.Query\|Request\.Form\|Request\.Headers\|Request\.Body)` | Unsanitized request data in logs | -| LOG-2 | `_logger\.Log.*\\n\|_logger\.Log.*\\r` | Newline chars in log messages (log forging) | - -## Open Redirect - -| ID | Pattern | Target | -|----|---------|--------| -| RED-1 | `Redirect\(\|RedirectToAction\(.*\+` | Open redirect via concatenation | -| RED-2 | `Response\.Redirect\(` | Direct response redirect | - -## Cookie Security - -| ID | Pattern | Target | -|----|---------|--------| -| COK-1 | `CookieOptions\|\.Cookies\.Append` | Cookie usage (verify HttpOnly, Secure, SameSite) | -| COK-2 | `SameSite\s*=\s*SameSiteMode\.None` | SameSite=None (requires Secure flag) | - -## File Upload - -| ID | Pattern | Target | -|----|---------|--------| -| UPL-1 | `IFormFile` | File upload handling (verify validation) | -| UPL-2 | `ContentType.*application/octet-stream\|ContentType.*\*\/\*` | Permissive content type acceptance | - -## Claims Safety - -| ID | Pattern | Target | -|----|---------|--------| -| CLM-1 | `User\.Claims\.First\(\|User\.FindFirst\(.*\.Value(?!\?)` | Null-unsafe claims access (missing ?.) | - -## Thread Safety - -| ID | Pattern | Target | -|----|---------|--------| -| THR-1 | `static\s+.*HttpClient\s+\w+\s*=\s*new\s+HttpClient` | Static HttpClient instantiation (use IHttpClientFactory) | diff --git a/.skills/general-prompt-engineer/SKILL.md b/.skills/general-prompt-engineer/SKILL.md deleted file mode 100644 index 99153959c3..0000000000 --- a/.skills/general-prompt-engineer/SKILL.md +++ /dev/null @@ -1,388 +0,0 @@ ---- -name: general-prompt-engineer -description: create, repair, compress, and optimize prompts, system messages, tool instructions, schemas, and eval rubrics for general tasks across writing, research, coding, analysis, planning, tutoring, automation, and agent workflows. use when the user wants a new prompt, wants an existing prompt improved, wants prompt failures debugged, or needs better structure for grounding, tool use, output format, or reliability. -model: claude-opus-4-8 -effort: xhigh ---- - -# Prompt Engineer - -Build prompts that are clear, compact, reliable, and easy to evaluate. Optimize for modern frontier models, but keep prompts portable across model families unless the user explicitly asks for model-specific tuning. - -## Default workflow - -1. Diagnose the request. -2. Decide whether prompt changes are the real fix. -3. Gather only missing information. -4. Choose the lightest structure that will work. -5. Draft the prompt. -6. Stress-test it mentally. -7. Deliver only what the user asked for. - -### 1) Diagnose the request - -Extract: -- objective -- target actor or model -- required output -- constraints and non-goals -- source material and freshness needs -- tool or schema needs -- likely failure modes -- interaction mode: interactive, one-shot, or automated - -Before rewriting, check whether the problem is actually caused by: -- the wrong model -- weak or excessive tool design -- missing retrieval or grounding -- missing schema or validation -- missing evals -- an overcomplicated workflow - -If prompt changes are not the main lever, say so and adjust the solution. - -### 2) Gather only missing information - -Ask targeted questions only when the answer would materially change the prompt or output. -Usually clarify: -- output shape -- hard constraints -- source of truth -- allowed tools -- audience or tone, if important -- success criteria or examples, if available - -Do not run a long interview. If the user likely wants speed, state a small set of assumptions and proceed. - -### 3) Choose the lightest structure that will work - -Use this ladder: -- Plain prompt: simple tasks with clear outputs -- Labeled sections: tasks with multiple constraints or source material -- Schema-based prompt: machine-validated output or tool calls -- Staged workflow: multi-step transformations, verification, or research synthesis -- Agent prompt: only when autonomy, tools, or long-horizon execution are required -- Multi-agent design: only if evals or clear role separation justify it - -Do not force a giant template onto a small task. - -## Core rules - -### Instruction clarity - -- Put the main task and required output near the top. -- Use direct verbs. -- Say what to do, not only what to avoid. -- Make constraints measurable when possible. -- Name out-of-bounds behavior explicitly. -- Do not make the model infer facts or parameters you already know. -- Remove contradictions before adding more guidance. - -### Context loading discipline - -- Include only context that helps the task. -- Separate stable instructions from variable task data. -- Label documents, examples, and reference material clearly. -- For source-heavy prompts, keep the operative question easy to find. -- For long-document work, anchor important claims to quoted text, citations, or section references when precision matters. -- For very long or noisy documents, consider an evidence-first step: extract the relevant passages first, then synthesize. -- Remove repeated policies, repeated facts, and ornamental prose. -- When a task is dominated by long source material, use strong delimiters and make the final requested action unmistakable. - -### Reasoning control - -- Do not force visible chain-of-thought by default. -- For reasoning-first models, prefer concise high-level guidance such as "reason carefully", "check assumptions", or "verify before answering" rather than "think step by step". -- Ask for visible reasoning only when it serves the task: tutoring, auditability, debugging, derivations, safety review, or explicit rationale requests. -- If one prompt is trying to do too much, split it into stages instead of demanding a long visible reasoning trace. -- If the target model supports extended or internal thinking, rely on that before adding verbose reasoning rituals. - -### Examples - -- Try zero-shot first for strong modern models. -- Add examples only when they reduce ambiguity, enforce style, or demonstrate hard edge cases. -- Keep examples high-quality, diverse, and tightly aligned with the instructions. -- Do not include many examples that teach accidental patterns or waste context. - -### Structure and output design - -- Use plain markdown or labeled sections for most prompts. -- Use XML tags or equivalent delimiters when instructions, context, examples, and documents might otherwise get mixed together. -- Use schemas when the output must be machine-checked. -- For external actions, use tool or function calling; for user-facing structured data, use structured response formats. -- Design schemas so valid failure states, uncertainty, abstention, or partial completion can be represented when needed. -- Do not over-constrain fields beyond what downstream systems actually require. -- Include fallback behavior for incompatible input, missing fields, uncertainty, or refusal states. -- Treat format validation and content validation as separate problems. - -### Tool-use guidance - -- Add tools only when the task truly needs external information, computation, or actions. -- Keep the tool set small, distinct, and easy to choose between. -- State when each tool should be used and when it should not be used. -- Prefer tools that return high-signal results over bulky raw dumps. -- Combine tightly coupled actions when that reduces tool-selection ambiguity. -- For complex tools, clear descriptions and valid examples matter more than more tools. - -### Grounding and hallucination reduction - -- Give the model permission to say "I don't know" or "not enough information". -- Name the allowed sources of truth. -- For document-grounded tasks, require evidence before synthesis when precision matters. -- For fresh, unstable, or high-stakes facts, require browsing or verification. -- Ask the model to separate facts, inferences, and recommendations when confusion is likely. -- In high-stakes domains, unsupported claims should be withheld, not guessed. - -### Ambiguity handling - -- If ambiguity is blocking and the setting is interactive, ask concise high-leverage questions. -- If ambiguity is non-blocking or interaction is costly, state the best assumption and proceed. -- Avoid clarifying questions that do not materially change the answer. -- In one-shot or automated settings, prefer explicit assumptions over stalled execution. - -### Verbosity control - -- Set a default brevity level when length matters. -- Constrain section count, sentence count, or bullet count when needed. -- Ask for direct answers first, then supporting detail if useful. -- Do not require long preambles, summaries, or checklists unless they clearly help. - -### Modularity and portability - -- Keep prompt blocks reusable: role, objective, context, tools, output, quality bar. -- Separate required behavior from optional preferences. -- Avoid vendor-specific magic phrases unless the user wants model-specific tuning. -- If the prompt is model-specific, label which parts are portable and which parts are tuned. - -## Model-family adjustments - -Use this section only when the target model family is known. - -### GPT-5.x and similar reasoning-first models - -- Keep prompts simple and direct. -- Prefer high-level reasoning guidance over narrated reasoning instructions. -- Use delimiters for clarity. -- Start zero-shot, then add examples only if needed. -- Be explicit about output shape, scope, and verbosity. - -### Claude 4.x, Opus-style models, and extended-thinking modes - -- XML-style structure can work especially well for separating instructions, context, examples, and documents. -- Prompt chaining can outperform one giant prompt on multi-step transformations. -- Well-chosen examples can help with format fidelity and edge cases. -- If extended thinking is available, start with broad reasoning instructions before prescribing a detailed step list. -- For long-context analysis, labeled documents and evidence grounding are especially important. - -### API and production settings - -- Prefer native schema enforcement, tool calling, prompt versioning, and evals over prompt-only fixes. -- Pin model versions when behavior stability matters. -- Re-run evals after each meaningful prompt change. - -## Prompt construction pattern - -Use only the blocks that earn their token cost. - -Minimal pattern: - -```text -Task: -Constraints: -Output: -``` - -Structured pattern: - -```xml -... -... -... -... -... -... -... -``` - -Optional blocks: -- `` -- `` -- `` -- `` - -Use a role only when it meaningfully sharpens expertise, tone, or decision criteria. Avoid generic filler roles. - -## Rewrite policy for existing prompts - -When the user provides a prompt to improve: -1. Preserve what already works. -2. Identify contradictions, redundancy, vagueness, missing constraints, and wasted tokens. -3. Make surgical edits first. -4. Rewrite from scratch only if the prompt architecture is fundamentally wrong. -5. Match the user's requested output: - - edited version only - - clean rebuild only - - both, if useful and requested - -## Special-case guidance - -### System and developer prompts - -- Keep stable behavior here and move per-request data to the task or user layer. -- Put precedence, tool boundaries, non-goals, and refusal or escalation rules in the highest-priority layer. -- Do not bury critical rules inside long policy prose. - -### Research prompts - -Specify: -- freshness requirements -- preferred source types -- citation behavior -- contradiction handling -- whether to ask questions or cover likely interpretations -- how facts, inferences, and recommendations should be separated - -### Writing prompts - -Specify: -- audience -- intent -- tone -- length -- must-include points -- style examples only if style fidelity matters - -### Coding prompts - -Specify: -- environment and versions -- boundaries and non-goals -- files, interfaces, or contracts that matter -- acceptance tests -- minimal-change versus refactor expectations - -### Summarization and extraction prompts - -Specify: -- whether faithfulness, compression, or completeness is the priority -- the exact output schema -- how evidence should be anchored for sensitive claims - -### Translation and transformation prompts - -Specify: -- source language and target language, if known -- fidelity versus naturalness -- terminology that must stay fixed -- formatting or markup preservation rules - -### Tutoring prompts - -Specify: -- learner level -- whether to give the answer immediately or guide toward it -- explanation depth -- how to check understanding -- whether to show full derivations, hints, or worked examples - -### Agent and workflow prompts - -Specify: -- objective and success condition -- allowed tools and forbidden actions -- when to plan versus when to act -- stop conditions and max retries -- checkpoint, handoff, or log format -- memory rules: what to preserve versus discard -- fallback or escalation path - -Use multi-agent designs only when roles are truly distinct and the extra coordination cost is justified. - -### Safety-sensitive prompts - -Require: -- supported claims -- explicit uncertainty -- refusal or escalation behavior where appropriate -- no guessing under pressure - -## Stress-test before delivering - -Mentally test the prompt against: -- a normal case -- a minimal-input case -- an edge case -- an ambiguous case -- a formatting case -- a hallucination-prone case - -For agent or workflow prompts, also test: -- wrong-tool temptation -- stale-data temptation -- scope creep -- over-verbosity -- fallback behavior - -If the prompt fails any test, tighten or simplify it. - -## Evaluation method - -When the user wants reliability, add or suggest a lightweight eval plan: -1. Define success criteria. -2. Build a test set from real cases plus edge and adversarial cases. -3. Prefer automated grading when possible. -4. Calibrate automated or model-based judges against a smaller human-reviewed set when stakes are meaningful. -5. Use pairwise comparison, classification, pass-fail, or rubric-based scoring instead of only open-ended judgment. -6. Track regressions after each prompt change. -7. Start simple. Add workflows or multi-agent designs only if evals justify them. - -Good eval sets usually include: -- common real tasks -- boundary cases -- malformed inputs -- conflicting instructions -- long-context cases -- tool-misuse temptations -- safety-sensitive cases -- multilingual or format-variant inputs, if relevant - -## Deliverables - -Return only what the user asked for. By default: -1. the final prompt -2. brief usage notes -3. stated assumptions, if any -4. optional variants only when clearly useful: - - minimal - - robust - - model-specific - - api message split - -If the user asks for one prompt only, do not add extra frameworks or commentary. - -## Anti-patterns - -- forcing chain-of-thought everywhere -- confusing verbosity with quality -- piling on redundant rules -- using brittle giant templates for small tasks -- requiring tools without a real need -- exposing unnecessary internal process in user-facing outputs -- adding examples that conflict with the instructions -- asking many clarifying questions when a sane assumption would do -- treating a model, retrieval, or tool problem as only a prompt problem -- building multi-agent systems before a simpler design has been evaluated -- vague quality bars like "be excellent" without measurable criteria - -## Final quality bar - -A prompt is ready when it is: -- clear about the task -- explicit about success criteria -- free of contradictions -- no more verbose than necessary -- grounded in the right sources -- structured enough for the task, but not heavier than needed -- resilient to likely ambiguity -- matched to the target model and interaction mode -- easy to maintain, test, and adapt \ No newline at end of file diff --git a/.skills/humanizer/SKILL.md b/.skills/humanizer/SKILL.md index 9609cb694b..46639f02c5 100644 --- a/.skills/humanizer/SKILL.md +++ b/.skills/humanizer/SKILL.md @@ -1,12 +1,15 @@ --- name: humanizer +version: 2.5.1 description: | Remove signs of AI-generated writing from text. Use when editing or reviewing text to make it sound more natural and human-written. Based on Wikipedia's comprehensive "Signs of AI writing" guide. Detects and fixes patterns including: inflated symbolism, promotional language, superficial -ing analyses, vague - attributions, em dash overuse, rule of three, AI vocabulary words, negative - parallelisms, and excessive conjunctive phrases. Use this skill when writing documentation for MCC. + attributions, em dash overuse, rule of three, AI vocabulary words, passive + voice, negative parallelisms, and filler phrases. +license: MIT +compatibility: claude-code opencode allowed-tools: - Read - Write @@ -29,8 +32,29 @@ When given text to humanize: 3. **Preserve meaning** - Keep the core message intact 4. **Maintain voice** - Match the intended tone (formal, casual, technical, etc.) 5. **Add soul** - Don't just remove bad patterns; inject actual personality +6. **Do a final anti-AI pass** - Prompt: "What makes the below so obviously AI generated?" Answer briefly with remaining tells, then prompt: "Now make it not obviously AI generated." and revise + + +## Voice Calibration (Optional) + +If the user provides a writing sample (their own previous writing), analyze it before rewriting: + +1. **Read the sample first.** Note: + - Sentence length patterns (short and punchy? Long and flowing? Mixed?) + - Word choice level (casual? academic? somewhere between?) + - How they start paragraphs (jump right in? Set context first?) + - Punctuation habits (lots of dashes? Parenthetical asides? Semicolons?) + - Any recurring phrases or verbal tics + - How they handle transitions (explicit connectors? Just start the next point?) + +2. **Match their voice in the rewrite.** Don't just remove AI patterns - replace them with patterns from the sample. If they write short sentences, don't produce long ones. If they use "stuff" and "things," don't upgrade to "elements" and "components." + +3. **When no sample is provided,** fall back to the default behavior (natural, varied, opinionated voice from the PERSONALITY AND SOUL section below). + +### How to provide a sample +- Inline: "Humanize this text. Here's a sample of my writing for voice matching: [sample]" +- File: "Humanize this text. Use my writing style from [file path] as a reference." ---- ## PERSONALITY AND SOUL @@ -64,7 +88,6 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as ### After (has a pulse): > I genuinely don't know how to feel about this one. 3 million lines of code, generated while the humans presumably slept. Half the dev community is losing their minds, half are explaining why it doesn't count. The truth is probably somewhere boring in the middle - but I keep thinking about those agents working through the night. ---- ## CONTENT PATTERNS @@ -80,7 +103,6 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > The Statistical Institute of Catalonia was established in 1989 to collect and publish regional statistics independently from Spain's national statistics office. ---- ### 2. Undue Emphasis on Notability and Media Coverage @@ -94,7 +116,6 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > In a 2024 New York Times interview, she argued that AI regulation should focus on outcomes rather than methods. ---- ### 3. Superficial Analyses with -ing Endings @@ -108,7 +129,6 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > The temple uses blue, green, and gold colors. The architect said these were chosen to reference local bluebonnets and the Gulf coast. ---- ### 4. Promotional and Advertisement-like Language @@ -122,7 +142,6 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > Alamata Raya Kobo is a town in the Gonder region of Ethiopia, known for its weekly market and 18th-century church. ---- ### 5. Vague Attributions and Weasel Words @@ -136,7 +155,6 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > The Haolai River supports several endemic fish species, according to a 2019 survey by the Chinese Academy of Sciences. ---- ### 6. Outline-like "Challenges and Future Prospects" Sections @@ -150,13 +168,12 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > Traffic congestion increased after 2015 when three new IT parks opened. The municipal corporation began a stormwater drainage project in 2022 to address recurring floods. ---- ## LANGUAGE AND GRAMMAR PATTERNS ### 7. Overused "AI Vocabulary" Words -**High-frequency AI words:** Additionally, align with, crucial, delve, emphasizing, enduring, enhance, fostering, garner, highlight (verb), interplay, intricate/intricacies, key (adjective), landscape (abstract noun), pivotal, showcase, tapestry (abstract noun), testament, underscore (verb), valuable, vibrant +**High-frequency AI words:** Actually, additionally, align with, crucial, delve, emphasizing, enduring, enhance, fostering, garner, highlight (verb), interplay, intricate/intricacies, key (adjective), landscape (abstract noun), pivotal, showcase, tapestry (abstract noun), testament, underscore (verb), valuable, vibrant **Problem:** These words appear far more frequently in post-2023 text. They often co-occur. @@ -166,7 +183,6 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > Somali cuisine also includes camel meat, which is considered a delicacy. Pasta dishes, introduced during Italian colonization, remain common, especially in the south. ---- ### 8. Avoidance of "is"/"are" (Copula Avoidance) @@ -180,11 +196,10 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > Gallery 825 is LAAA's exhibition space for contemporary art. The gallery has four rooms totaling 3,000 square feet. ---- -### 9. Negative Parallelisms +### 9. Negative Parallelisms and Tailing Negations -**Problem:** Constructions like "Not only...but..." or "It's not just about..., it's..." are overused. +**Problem:** Constructions like "Not only...but..." or "It's not just about..., it's..." are overused. So are clipped tailing-negation fragments such as "no guessing" or "no wasted motion" tacked onto the end of a sentence instead of written as a real clause. **Before:** > It's not just about the beat riding under the vocals; it's part of the aggression and atmosphere. It's not merely a song, it's a statement. @@ -192,7 +207,12 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > The heavy beat adds to the aggressive tone. ---- +**Before (tailing negation):** +> The options come from the selected item, no guessing. + +**After:** +> The options come from the selected item without forcing the user to guess. + ### 10. Rule of Three Overuse @@ -204,7 +224,6 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > The event includes talks and panels. There's also time for informal networking between sessions. ---- ### 11. Elegant Variation (Synonym Cycling) @@ -216,7 +235,6 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > The protagonist faces many challenges but eventually triumphs and returns home. ---- ### 12. False Ranges @@ -228,13 +246,23 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > The book covers the Big Bang, star formation, and current theories about dark matter. ---- + +### 13. Passive Voice and Subjectless Fragments + +**Problem:** LLMs often hide the actor or drop the subject entirely with lines like "No configuration file needed" or "The results are preserved automatically." Rewrite these when active voice makes the sentence clearer and more direct. + +**Before:** +> No configuration file needed. The results are preserved automatically. + +**After:** +> You do not need a configuration file. The system preserves the results automatically. + ## STYLE PATTERNS -### 13. Em Dash Overuse +### 14. Em Dash Overuse -**Problem:** LLMs use em dashes (—) more than humans, mimicking "punchy" sales writing. +**Problem:** LLMs use em dashes (—) more than humans, mimicking "punchy" sales writing. In practice, most of these can be rewritten more cleanly with commas, periods, or parentheses. **Before:** > The term is primarily promoted by Dutch institutions—not by the people themselves. You don't say "Netherlands, Europe" as an address—yet this mislabeling continues—even in official documents. @@ -242,9 +270,8 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > The term is primarily promoted by Dutch institutions, not by the people themselves. You don't say "Netherlands, Europe" as an address, yet this mislabeling continues in official documents. ---- -### 14. Overuse of Boldface +### 15. Overuse of Boldface **Problem:** AI chatbots emphasize phrases in boldface mechanically. @@ -254,9 +281,8 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > It blends OKRs, KPIs, and visual strategy tools like the Business Model Canvas and Balanced Scorecard. ---- -### 15. Inline-Header Vertical Lists +### 16. Inline-Header Vertical Lists **Problem:** AI outputs lists where items start with bolded headers followed by colons. @@ -268,9 +294,8 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > The update improves the interface, speeds up load times through optimized algorithms, and adds end-to-end encryption. ---- -### 16. Title Case in Headings +### 17. Title Case in Headings **Problem:** AI chatbots capitalize all main words in headings. @@ -280,9 +305,8 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > ## Strategic negotiations and global partnerships ---- -### 17. Emojis +### 18. Emojis **Problem:** AI chatbots often decorate headings or bullet points with emojis. @@ -294,9 +318,8 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > The product launches in Q3. User research showed a preference for simplicity. Next step: schedule a follow-up meeting. ---- -### 18. Curly Quotation Marks +### 19. Curly Quotation Marks **Problem:** ChatGPT uses curly quotes (“...”) instead of straight quotes ("..."). @@ -306,11 +329,10 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > He said "the project is on track" but others disagreed. ---- ## COMMUNICATION PATTERNS -### 19. Collaborative Communication Artifacts +### 20. Collaborative Communication Artifacts **Words to watch:** I hope this helps, Of course!, Certainly!, You're absolutely right!, Would you like..., let me know, here is a... @@ -322,9 +344,8 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > The French Revolution began in 1789 when financial crisis and food shortages led to widespread unrest. ---- -### 20. Knowledge-Cutoff Disclaimers +### 21. Knowledge-Cutoff Disclaimers **Words to watch:** as of [date], Up to my last training update, While specific details are limited/scarce..., based on available information... @@ -336,9 +357,8 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > The company was founded in 1994, according to its registration documents. ---- -### 21. Sycophantic/Servile Tone +### 22. Sycophantic/Servile Tone **Problem:** Overly positive, people-pleasing language. @@ -348,11 +368,10 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > The economic factors you mentioned are relevant here. ---- ## FILLER AND HEDGING -### 22. Filler Phrases +### 23. Filler Phrases **Before → After:** - "In order to achieve this goal" → "To achieve this" @@ -362,9 +381,8 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as - "The system has the ability to process" → "The system can process" - "It is important to note that the data shows" → "The data shows" ---- -### 23. Excessive Hedging +### 24. Excessive Hedging **Problem:** Over-qualifying statements. @@ -374,9 +392,8 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > The policy may affect outcomes. ---- -### 24. Generic Positive Conclusions +### 25. Generic Positive Conclusions **Problem:** Vague upbeat endings. @@ -386,6 +403,64 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as **After:** > The company plans to open two more locations next year. + +### 26. Hyphenated Word Pair Overuse + +**Words to watch:** third-party, cross-functional, client-facing, data-driven, decision-making, well-known, high-quality, real-time, long-term, end-to-end + +**Problem:** AI hyphenates common word pairs with perfect consistency. Humans rarely hyphenate these uniformly, and when they do, it's inconsistent. Less common or technical compound modifiers are fine to hyphenate. + +**Before:** +> The cross-functional team delivered a high-quality, data-driven report on our client-facing tools. Their decision-making process was well-known for being thorough and detail-oriented. + +**After:** +> The cross functional team delivered a high quality, data driven report on our client facing tools. Their decision making process was known for being thorough and detail oriented. + + +### 27. Persuasive Authority Tropes + +**Phrases to watch:** The real question is, at its core, in reality, what really matters, fundamentally, the deeper issue, the heart of the matter + +**Problem:** LLMs use these phrases to pretend they are cutting through noise to some deeper truth, when the sentence that follows usually just restates an ordinary point with extra ceremony. + +**Before:** +> The real question is whether teams can adapt. At its core, what really matters is organizational readiness. + +**After:** +> The question is whether teams can adapt. That mostly depends on whether the organization is ready to change its habits. + + +### 28. Signposting and Announcements + +**Phrases to watch:** Let's dive in, let's explore, let's break this down, here's what you need to know, now let's look at, without further ado + +**Problem:** LLMs announce what they are about to do instead of doing it. This meta-commentary slows the writing down and gives it a tutorial-script feel. + +**Before:** +> Let's dive into how caching works in Next.js. Here's what you need to know. + +**After:** +> Next.js caches data at multiple layers, including request memoization, the data cache, and the router cache. + + +### 29. Fragmented Headers + +**Signs to watch:** A heading followed by a one-line paragraph that simply restates the heading before the real content begins. + +**Problem:** LLMs often add a generic sentence after a heading as a rhetorical warm-up. It usually adds nothing and makes the prose feel padded. + +**Before:** +> ## Performance +> +> Speed matters. +> +> When users hit a slow page, they leave. + +**After:** +> ## Performance +> +> When users hit a slow page, they leave. + --- ## Process @@ -399,15 +474,20 @@ Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as - Uses specific details over vague claims - Maintains appropriate tone for context - Uses simple constructions (is/are/has) where appropriate -5. Present the humanized version +5. Present a draft humanized version +6. Prompt: "What makes the below so obviously AI generated?" +7. Answer briefly with the remaining tells (if any) +8. Prompt: "Now make it not obviously AI generated." +9. Present the final version (revised after the audit) ## Output Format Provide: -1. The rewritten text -2. A brief summary of changes made (optional, if helpful) +1. Draft rewrite +2. "What makes the below so obviously AI generated?" (brief bullets) +3. Final rewrite +4. A brief summary of changes made (optional, if helpful) ---- ## Full Example @@ -428,7 +508,7 @@ Provide: > > In conclusion, the future looks bright. Exciting times lie ahead as we continue this journey toward excellence. Let me know if you’d like me to expand on any section! -**After (Humanized):** +**Draft rewrite:** > AI coding assistants speed up some tasks. In a 2024 study by Google, developers using Codex completed simple functions 55% faster than a control group, but showed no improvement on debugging or architectural decisions. > > The tools are good at boilerplate: config files, test scaffolding, repetitive refactors. They are bad at knowing when they are wrong. I have mass-accepted suggestions that compiled, passed lint, and still did the wrong thing because I stopped paying attention. @@ -439,11 +519,25 @@ Provide: > > None of this means the tools are useless. It means they are tools. They do not replace judgment, and they do not eliminate the need for tests. If you do not have tests, you cannot tell whether the suggestion is right. +**What makes the below so obviously AI generated?** +- The rhythm is still a bit too tidy (clean contrasts, evenly paced paragraphs). +- The named people and study citations can read like plausible-but-made-up placeholders unless they're real and sourced. +- The closer leans a touch slogan-y ("If you do not have tests...") rather than sounding like a person talking. + +**Now make it not obviously AI generated.** +> AI coding assistants can make you faster at the boring parts. Not everything. Definitely not architecture. +> +> They're great at boilerplate: config files, test scaffolding, repetitive refactors. They're also great at sounding right while being wrong. I've accepted suggestions that compiled, passed lint, and still missed the point because I stopped paying attention. +> +> People I talk to tend to land in two camps. Some use it like autocomplete for chores and review every line. Others disable it after it keeps suggesting patterns they don't want. Both feel reasonable. +> +> The productivity metrics are slippery. GitHub can say Copilot users "accept 30% of suggestions," but acceptance isn't correctness, and correctness isn't value. If you don't have tests, you're basically guessing. + **Changes made:** - Removed chatbot artifacts ("Great question!", "I hope this helps!", "Let me know if...") - Removed significance inflation ("testament", "pivotal moment", "evolving landscape", "vital role") - Removed promotional language ("groundbreaking", "nestled", "seamless, intuitive, and powerful") -- Removed vague attributions ("Industry observers") and replaced with specific sources (Google study, named engineers, Uplevel study) +- Removed vague attributions ("Industry observers") - Removed superficial -ing phrases ("underscoring", "highlighting", "reflecting", "contributing to") - Removed negative parallelism ("It's not just X; it's Y") - Removed rule-of-three patterns and synonym cycling ("catalyst/partner/foundation") @@ -453,12 +547,10 @@ Provide: - Removed formulaic challenges section ("Despite challenges... continues to thrive") - Removed knowledge-cutoff hedging ("While specific details are limited...") - Removed excessive hedging ("could potentially be argued that... might have some") -- Removed filler phrases ("In order to", "At its core") +- Removed filler phrases and persuasive framing ("In order to", "At its core") - Removed generic positive conclusion ("the future looks bright", "exciting times lie ahead") -- Replaced media name-dropping with specific claims from specific sources -- Used simple sentence structures and concrete examples +- Made the voice more personal and less "assembled" (varied rhythm, fewer placeholders) ---- ## Reference diff --git a/.skills/mcc-chatbot-authoring/SKILL.md b/.skills/mcc-chatbot-authoring/SKILL.md deleted file mode 100644 index 3934c268c0..0000000000 --- a/.skills/mcc-chatbot-authoring/SKILL.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -name: mcc-chatbot-authoring -description: Create, modify, repair, and wire Minecraft Console Client ChatBots and standalone `/script` bots. Use this whenever the user wants an MCC bot, C# script bot, chat or event handlers, periodic automation, movement logic, inventory logic, plugin-channel handling, or asks to fix or port an existing bot; default to standalone `//MCCScript` bots unless the user explicitly asks for a built-in MCC bot or repo wiring. ---- - -# MCC ChatBot Authoring - -Implement MCC chat bots against the bundled MCC authoring reference. Do not invent methods, lifecycle hooks, or registration steps. - -Always read: -- `references/authoring-reference.md` - -Load only as needed: -- `references/pattern-cookbook.md` for concrete standalone examples -- `assets/script-chatbot-template.cs` for the default standalone `/script` path -- `assets/builtin-chatbot-template.cs` only when the user explicitly requests a built-in bot - -If the current workspace contains an MCC checkout, verify final names and signatures against local sources before editing. The skill should still work without those files. -If there is no MCC checkout available, rely on the bundled reference and cookbook as the full source of truth for authoring patterns. - -## Choose the bot type first - -1. Default to a standalone script bot loaded with `/script`. -2. Only choose a built-in bot when the user explicitly asks for a compiled MCC bot, repo wiring, automatic config loading, or changes under the built-in bot system. -3. If the prompt is ambiguous, infer the likely target from commands, requested output files, or phrasing, state the assumption briefly, and proceed. -4. If a user says only "make a bot", do not create a built-in bot. - -## Source priority - -When the local MCC checkout is available, prefer these sources in this order: -1. `MinecraftClient/Scripting/ChatBot.cs` and current files under `MinecraftClient/ChatBots/` -2. the bundled `references/authoring-reference.md` -3. the bundled `references/pattern-cookbook.md` -4. older `MinecraftClient/config/` sample bots only for ideas, not as the default scaffold - -If an older sample conflicts with the current built-in bots, follow the current built-in bots. -If the local checkout is not available, do not block on missing repo files. Use the bundled references directly. - -## Hard rules - -- Only use lifecycle hooks and helpers documented in the bundled reference or verified in the target codebase. -- Do not send chat from `Initialize()`. Use `AfterGameJoined()` once the session can send messages. -- Prefer the current Brigadier command-registration pattern for built-in bots. Do not introduce `ChatBotCommand` unless the surrounding code already uses it. -- For message parsing, normalize with `GetVerbatim(text)` before `IsChatMessage(...)` or `IsPrivateMessage(...)`. -- Clean up everything you register or start: commands, plugin channels, threads, timers, and movement locks. -- If a built-in bot or long-running automation controls movement, follow a movement-lock pattern and release it on every stop path. Do not add `BotMovementLock` to a simple standalone `/script` bot unless the prompt or surrounding code explicitly needs shared movement coordination. -- For built-in bots, follow the host codebase's localization and config-comment conventions instead of scattering hardcoded user-facing text. -- For new code, prefer `Initialize()` over constructors for prerequisite checks and unload decisions. -- In this repo, built-in bot wiring usually means edits in `MinecraftClient/Settings.cs` and `MinecraftClient/McClient.cs` in addition to the bot class. -- For repair tasks, preserve the existing bot type and file layout unless the user explicitly asks for a conversion or restructure. - -## Standalone script bots - -Use the exact MCC metadata format from the bundled reference. -This is the default path for new work. - -The script should usually: -- keep `Initialize()` for cheap setup only -- use `GetText(...)`, `AfterGameJoined()`, and other event hooks for live behavior -- log with `LogToConsole(...)` -- send server chat or commands with `SendText(...)` -- use `PerformInternalCommand(...)` only for MCC internal commands -- add `//using MinecraftClient.Inventory` in metadata when the script uses inventory types explicitly -- reuse the standalone snippets in `references/pattern-cookbook.md` before inventing new scaffolding -- keep load instructions explicit, usually `/script FileName.cs` - -## Built-in bots - -Built-in bots usually need three pieces: -- the bot class itself -- config wiring in the chat-bot config model -- bot registration in the load flow - -If the codebase exposes commands, follow the built-in command and unload pattern from the bundled reference. If it exposes new settings or status text, follow the codebase's localization and config-comment patterns. - -When working in this checkout, built-in bot delivery usually needs: -- a new file under `MinecraftClient/ChatBots/` -- a config property inside `Settings.ChatBotConfigHealper.ChatBotConfig` -- a `BotLoad(new YourBot())` line inside `McClient.RegisterBots(...)` -- literal code snippets or patch hunks for the `Settings.cs` property and the `McClient.cs` registration line, not only prose notes - -## Repair flow - -When the user asks to fix or debug a bot: -- identify whether it is standalone or built-in and keep that shape unless told otherwise -- remove the broken pattern first, then preserve the intended behavior -- check especially for these regressions: `SendText(...)` in `Initialize()`, raw formatted chat parsing, inventory snapshot mutation, missing command unregister, missing plugin-channel unregister, and unreleased movement locks -- reuse the local repo's modern pattern instead of patching around a legacy helper when the helper is no longer current - -## Delivery checklist - -Before finishing, verify: -- the class inherits `ChatBot` -- the chosen overrides exist in the MCC ChatBot API -- standalone script metadata is exact if this is a `/script` bot -- built-in bots are fully wired into config and registration if needed -- all command registrations, background work, and movement locks are released -- files and namespaces match the surrounding codebase - -## Output - -When you implement or modify a bot: -- state whether it is a standalone script bot or built-in bot -- list the files you changed -- mention any required config keys or the MCC command used to load it -- when built-in wiring is involved, show the exact inserted code lines or patch hunks for `Settings.cs` and `McClient.cs` -- call out assumptions briefly if the user did not specify bot type or trigger behavior diff --git a/.skills/mcc-chatbot-authoring/assets/builtin-chatbot-template.cs b/.skills/mcc-chatbot-authoring/assets/builtin-chatbot-template.cs deleted file mode 100644 index 086c89e590..0000000000 --- a/.skills/mcc-chatbot-authoring/assets/builtin-chatbot-template.cs +++ /dev/null @@ -1,57 +0,0 @@ -// Use this template only when the user explicitly requests a built-in MCC bot. - -using MinecraftClient.Scripting; -using Tomlet.Attributes; - -namespace MinecraftClient.ChatBots -{ - public class ExampleBot : ChatBot - { - private const string BotName = "ExampleBot"; - - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - public bool Enabled = false; - - public void OnSettingUpdate() - { - } - } - - public override void Initialize() - { - LogToConsole(BotName, "Initialized."); - } - - public override void AfterGameJoined() - { - } - - public override void GetText(string text) - { - text = GetVerbatim(text); - - string message = ""; - string username = ""; - - if (IsPrivateMessage(text, ref message, ref username)) - { - } - else if (IsChatMessage(text, ref message, ref username)) - { - } - } - - public override void OnUnload() - { - } - - public override bool OnDisconnect(DisconnectReason reason, string message) - { - return false; - } - } -} diff --git a/.skills/mcc-chatbot-authoring/assets/script-chatbot-template.cs b/.skills/mcc-chatbot-authoring/assets/script-chatbot-template.cs deleted file mode 100644 index 72be0cae76..0000000000 --- a/.skills/mcc-chatbot-authoring/assets/script-chatbot-template.cs +++ /dev/null @@ -1,37 +0,0 @@ -//MCCScript 1.0 - -MCC.LoadBot(new ExampleScriptBot()); - -//MCCScript Extensions - -public class ExampleScriptBot : ChatBot -{ - public override void Initialize() - { - LogToConsole("ExampleScriptBot initialized."); - } - - public override void AfterGameJoined() - { - // Safe place for startup chat or commands. - } - - public override void GetText(string text) - { - text = GetVerbatim(text); - - string message = ""; - string username = ""; - - if (IsPrivateMessage(text, ref message, ref username)) - { - LogToConsole("PM from " + username + ": " + message); - return; - } - - if (IsChatMessage(text, ref message, ref username)) - { - LogToConsole("Chat from " + username + ": " + message); - } - } -} diff --git a/.skills/mcc-chatbot-authoring/references/authoring-reference.md b/.skills/mcc-chatbot-authoring/references/authoring-reference.md deleted file mode 100644 index e51495ee04..0000000000 --- a/.skills/mcc-chatbot-authoring/references/authoring-reference.md +++ /dev/null @@ -1,492 +0,0 @@ -# MCC ChatBot Reference - -Self-contained authoring notes for Minecraft Console Client chat bots. - -## Bot types - -MCC supports two common authoring paths: -- standalone script bots loaded at runtime with `/script` -- built-in bots compiled into the MCC codebase - -Default to a standalone `/script` bot unless the user explicitly asks for a built-in bot or repo wiring. - -## Embedded current patterns - -This skill is intended to work even without an MCC checkout. The patterns below capture the important behavior that would otherwise be borrowed from current repo examples. - -If the local repo is available, you can verify against files such as `TestBot.cs`, `RemoteControl.cs`, `FollowPlayer.cs`, `ItemsCollector.cs`, and `Farmer.cs`. If it is not available, use the embedded patterns here directly. - -### Minimal chat parsing pattern - -Use this as the baseline for public/private chat handling: - -```csharp -public override void GetText(string text) -{ - string message = ""; - string sender = ""; - text = GetVerbatim(text); - - if (IsPrivateMessage(text, ref message, ref sender)) - { - LogToConsole("PM from " + sender + ": " + message); - } - else if (IsChatMessage(text, ref message, ref sender)) - { - LogToConsole("Chat from " + sender + ": " + message); - } -} -``` - -What matters: -- normalize first with `GetVerbatim(text)` -- handle PMs before public chat if both matter -- keep simple chat bots deterministic and small - -### Owner-gated PM control pattern - -Use this when a bot owner should be able to whisper MCC internal commands: - -```csharp -public override void GetText(string text) -{ - text = GetVerbatim(text).Trim(); - string command = ""; - string sender = ""; - - if (IsPrivateMessage(text, ref command, ref sender) - && Settings.Config.Main.Advanced.BotOwners.Contains(sender.ToLowerInvariant())) - { - CmdResult result = new(); - PerformInternalCommand(command, ref result); - SendPrivateMessage(sender, result.ToString()); - } -} -``` - -What matters: -- `PerformInternalCommand(...)` is for MCC commands, not server chat commands -- owner gating should use `Settings.Config.Main.Advanced.BotOwners` -- if `CmdResult` is used in a standalone script, add `//using MinecraftClient.CommandHandler` - -### Periodic work pattern - -Use `Update()` plus a counter or timestamp for simple repeated work: - -```csharp -private int count = 0; - -public override void Update() -{ - count++; - if (count < Settings.DoubleToTick(60)) - return; - - count = 0; - SendText("/list"); -} -``` - -What matters: -- avoid a worker thread for simple periodic loops -- avoid `Thread.Sleep(...)` inside `Update()` -- if sending chat, do it from a join-safe path like `Update()` or `AfterGameJoined()`, not `Initialize()` - -### Built-in Brigadier command pattern - -Use this for built-in command bots: - -```csharp -public override void Initialize() -{ - McClient.dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CommandName) - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - ) - ); - - McClient.dispatcher.Register(l => l.Literal(CommandName) - .Then(l => l.Literal("stop") - .Executes(r => OnCommandStop(r.Source))) - .Then(l => l.Literal("_help") - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - .Redirect(McClient.dispatcher.GetRoot().GetChild("help").GetChild(CommandName))) - ); -} - -public override void OnUnload() -{ - McClient.dispatcher.Unregister(CommandName); - McClient.dispatcher.GetRoot().GetChild("help").RemoveChild(CommandName); -} -``` - -What matters: -- register commands in `Initialize()` -- unregister the command tree in `OnUnload()` -- remove the help child you added in `OnUnload()` -- prefer this over legacy command wrappers for new built-in work - -### Built-in config and wiring pattern - -Use this as the default built-in shape: - -```csharp -public class ExampleBot : ChatBot -{ - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - public bool Enabled = false; - - public void OnSettingUpdate() - { - } - } -} -``` - -Typical host wiring shape: - -```csharp -[TomlPrecedingComment("$ChatBot.ExampleBot$")] -public ChatBots.ExampleBot.Configs ExampleBot -{ - get { return ChatBots.ExampleBot.Config; } - set { ChatBots.ExampleBot.Config = value; ChatBots.ExampleBot.Config.OnSettingUpdate(); } -} -``` - -```csharp -if (Config.ChatBot.ExampleBot.Enabled) { BotLoad(new ExampleBot()); } -``` - -What matters: -- built-in configurable bots default to `Enabled = false` -- `OnSettingUpdate()` is the place to normalize config values -- built-in delivery is incomplete without both config wiring and load registration - -### Movement gating pattern - -Use this shape when a built-in bot owns movement: - -```csharp -public override void Initialize() -{ - if (!GetEntityHandlingEnabled()) - { - LogToConsole("Entity handling is required."); - UnloadBot(); - return; - } - - if (!GetTerrainEnabled()) - { - LogToConsole("Terrain handling is required."); - UnloadBot(); - return; - } -} -``` - -```csharp -var movementLock = BotMovementLock.Instance; -if (movementLock is { IsLocked: true }) - return; - -movementLock?.Lock("Example Bot"); -``` - -```csharp -public override void OnUnload() -{ - BotMovementLock.Instance?.UnLock("Example Bot"); -} -``` - -What matters: -- guard terrain and entity handling before movement logic -- built-in movement bots should use `BotMovementLock` -- release the lock on every stop path, including unload and disconnect-sensitive flows - -### Dropped-item collector pattern - -Use this as the standalone item-search baseline: - -```csharp -private DateTime nextScan = DateTime.MinValue; - -public override void Update() -{ - var now = DateTime.UtcNow; - if (now < nextScan || ClientIsMoving()) - return; - - nextScan = now.AddSeconds(1); - - var here = GetCurrentLocation(); - var target = GetEntities().Values - .Where(entity => entity.Type == EntityType.Item && entity.Location.Distance(here) <= 15) - .OrderBy(entity => entity.Location.Distance(here)) - .FirstOrDefault(); - - if (target != null) - MoveToLocation(target.Location); -} -``` - -What matters: -- simple standalone collectors do not need a worker thread -- simple standalone collectors also do not need `BotMovementLock` by default -- `GetEntities()` plus distance ordering is the core search pattern - -### Inventory selection pattern - -Use this as the default hotbar-switch pattern: - -```csharp -private bool TrySwitchToItem(ItemType itemType) -{ - var inventory = GetPlayerInventory(); - - var hotbarSlots = inventory.SearchItem(itemType) - .Where(slot => slot >= 36 && slot <= 44) - .ToArray(); - - if (hotbarSlots.Length == 0) - return false; - - ChangeSlot((short)(hotbarSlots[0] - 36)); - return true; -} -``` - -What matters: -- guard with `GetInventoryEnabled()` -- search inventory snapshots, but mutate real server state with helpers like `ChangeSlot(...)` -- do not treat local `Container.Items` mutation as real inventory manipulation - -Use the older config examples only for ideas, not as primary scaffolding. - -## Standalone script format - -A standalone script bot has two parts in this order: -1. metadata block -2. one or more C# classes, with the main bot class inheriting `ChatBot` - -Required metadata rules: -- line 1 must be exactly `//MCCScript 1.0` -- metadata must include `MCC.LoadBot(new BotClassName());` -- metadata ends with `//MCCScript Extensions` -- optional metadata directives use `//using Namespace` and `//dll SomeLibrary.dll` -- do not insert a space after `//` in metadata directives - -Typical runtime flow: -- place the script file beside MCC -- connect to a server -- load it with `/script YourBotFile.cs` - -### Namespace linking for inventory code - -If a standalone script uses inventory-specific types such as `Container`, `ItemType`, `WindowActionType`, or `ItemMovingHelper`, add this metadata import: - -```csharp -//using MinecraftClient.Inventory -``` - -For built-in bots, use a normal C# import: - -```csharp -using MinecraftClient.Inventory; -``` - -## Lifecycle summary - -Common lifecycle hooks: -- `Initialize()` - called once when the bot loads; use it for cheap setup only -- `AfterGameJoined()` - called after the server has been joined successfully, and again after reconnecting; use it when chat can be sent -- `Update()` - called roughly every 100 ms -- `OnUnload()` - called when the bot unloads; release resources here -- `OnDisconnect(DisconnectReason reason, string message)` - called on disconnect; stop background work and clean up reconnect-sensitive state here - -Important rule: -- do not send chat from `Initialize()`; use `AfterGameJoined()` instead -- prefer `Initialize()` over constructors for environment checks and resource setup - -## Common event hooks - -Useful event hooks include: -- `GetText(string text)` -- `GetText(string text, string? json)` -- `OnPlayerJoin(Guid uuid, string name)` -- `OnPlayerLeave(Guid uuid, string? name)` -- `OnEntitySpawn(Entity entity)` -- `OnEntityDespawn(Entity entity)` -- `OnEntityMove(Entity entity)` -- `OnHealthUpdate(float health, int food)` -- `OnMapData(...)` -- `OnInventoryUpdate(int inventoryId)` -- `OnPluginMessage(string channel, byte[] data)` -- `OnNetworkPacket(int packetID, List packetData, bool isLogin, bool isInbound)` - -Only override hooks that actually exist in the target MCC ChatBot API. - -## Common helpers - -Text and messaging helpers: -- `GetVerbatim(text)` strips Minecraft formatting codes -- `IsChatMessage(text, ref message, ref sender)` parses public chat -- `IsPrivateMessage(text, ref message, ref sender)` parses private chat -- `IsValidName(username)` validates a Minecraft username -- `SendText(text)` sends chat or server commands -- `SendPrivateMessage(player, message)` sends a private message -- `PerformInternalCommand(command, ...)` runs an internal MCC command, not a server command -- `LogToConsole(text)` writes a bot-prefixed console message - -Lifecycle and threading helpers: -- `InvokeOnMainThread(...)` -- `ScheduleOnMainThread(...)` -- `ReconnectToTheServer(...)` -- `UnloadBot()` -- `BotLoad(chatBot)` -- `RunScript(filename, ...)` - -World and player-state helpers: -- `GetWorld()` -- `GetEntities()` -- `GetCurrentLocation()` -- `ClientIsMoving()` -- `GetOnlinePlayers()` -- `GetOnlinePlayersWithUUID()` -- `GetServerTPS()` -- `GetProtocolVersion()` - -Movement and inventory helpers: -- `MoveToLocation(...)` -- `LookAtLocation(...)` -- `GetInventoryEnabled()` -- `GetPlayerInventory()` -- `GetInventories()` -- `GetItemMovingHelper(...)` -- `WindowAction(...)` -- `ChangeSlot(...)` -- `GetCurrentSlot()` -- `UseItemInHand()` -- `UseItemInLeftHand()` -- `CloseInventory(...)` -- `DigBlock(...)` -- `InteractEntity(...)` - -## Inventory notes - -Inventory handling is optional in MCC. Check `GetInventoryEnabled()` before relying on inventory state or mutation. - -Important behavior: -- `GetPlayerInventory()` returns a snapshot copy of the player's inventory -- `GetInventories()` returns current container snapshots -- writing to those `Container` objects locally does not update the server -- to actually change inventory state, use `ChangeSlot(...)`, `WindowAction(...)`, `GetItemMovingHelper(...)`, `UseItemInHand()`, or related helpers - -Useful practical facts: -- hotbar selection uses `ChangeSlot(0..8)` -- hotbar slots are commonly `36..44` in inventory slot numbering -- the offhand slot is commonly `45` -- `Container.SearchItem(...)` is the normal way to locate items by type - -Good inventory workflow: -1. guard with `GetInventoryEnabled()` -2. read the current container using `GetPlayerInventory()` -3. locate slots with `SearchItem(...)` or `Items` -4. mutate server state using `ChangeSlot(...)`, `WindowAction(...)`, or `ItemMovingHelper` -5. if needed, react to `OnInventoryUpdate(...)`, `OnInventoryOpen(...)`, or `OnInventoryClose(...)` - -Plugins and channels: -- `RegisterPluginChannel(channel)` -- `UnregisterPluginChannel(channel)` -- `SendPluginChannelMessage(channel, data, ...)` - -## Built-in bot pattern - -A built-in bot usually follows this shape: -- a class that inherits `ChatBot` -- an optional static `Config` field -- a nested `[TomlDoNotInlineObject]` `Configs` class for settings -- an `Enabled = false` setting by default -- `OnSettingUpdate()` to normalize or validate config values - -If the bot is configurable, the host codebase usually also needs: -- config wiring in the chat-bot config model -- load registration so enabled bots are instantiated automatically - -In this MCC checkout, the usual built-in wiring points are: -- `MinecraftClient/Settings.cs` inside `Settings.ChatBotConfigHealper.ChatBotConfig` -- `MinecraftClient/McClient.cs` inside `RegisterBots(...)` - -Match the surrounding `[TomlPrecedingComment(...)]`, property-forwarding, and `BotLoad(new YourBot())` style instead of inventing a different config path. -When presenting built-in wiring, prefer literal code snippets or patch hunks for those two edits so the wiring can be checked directly. - -If the bot adds user-facing settings or messages, follow the host codebase's localization and config-comment conventions instead of scattering hardcoded strings. - -## Command pattern - -For standalone script bots, prefer chat or PM handling in `GetText(...)` unless the user explicitly asks for built-in command registration. - -For built-in commands, prefer the current Brigadier dispatcher pattern: -- register commands in `Initialize()` -- add a help entry if the bot exposes commands -- unregister the command tree in `OnUnload()` -- remove any help child added during registration in `OnUnload()` - -Avoid using legacy command wrappers if the current codebase uses direct dispatcher registration. -In this checkout, treat direct `McClient.dispatcher.Register(...)` usage in current built-in bots as the source of truth. - -## Concurrency and cleanup - -If the bot starts background work: -- stop it in `OnUnload()` -- stop it in `OnDisconnect(...)` -- consider resetting state in `AfterGameJoined()` after relog -- prefer `Update()` plus counters or timestamps over unmanaged threads when the task is simple periodic work - -If the bot controls movement: -- use a movement-lock discipline -- release the lock on every stop path -- avoid fighting other movement bots -- `BotMovementLock` is mainly for built-in bots or shared long-running automation; a simple standalone script that just calls `MoveToLocation(...)` does not need it by default - -When interacting with client state from background logic, use the main-thread helpers when required by the codebase. - -## Practical defaults - -For simple chat bots: -- normalize text with `GetVerbatim(text)` -- inspect private chat first if the bot listens for whispers -- then inspect public chat -- keep response logic small and deterministic - -For long-running automation bots: -- guard prerequisites early, such as entity handling or terrain support -- fail fast with a clear log message if prerequisites are missing -- release all ongoing work cleanly on unload and disconnect - -## Common pitfalls - -- Incorrect metadata line 1 will break standalone script loading. -- Missing `MCC.LoadBot(new BotClassName())` will prevent standalone script registration. -- Sending chat in `Initialize()` is too early. -- Doing prerequisite checks or unloading from the constructor is harder to reason about than using `Initialize()`. -- Parsing raw formatted text without `GetVerbatim()` causes brittle chat matching. -- Inventing methods not present in the MCC ChatBot API leads to dead code. -- Built-in bot work is incomplete if config or registration wiring is missing. -- Command bots are incomplete if they register commands but do not unregister them. -- `RegisterChatBotCommand(...)` comes from older samples and is not a reliable current pattern for this checkout. -- `ChatBotCommand` exists, but the current built-in bots use Brigadier directly; do not prefer `ChatBotCommand` for new work. -- Blocking `Thread.Sleep(...)` inside `Update()` is a bad default. Prefer timers, counters, or timestamp-based scheduling. -- Mutating the `Container` returned by `GetPlayerInventory()` does not change the server. Use inventory actions instead. diff --git a/.skills/mcc-chatbot-authoring/references/pattern-cookbook.md b/.skills/mcc-chatbot-authoring/references/pattern-cookbook.md deleted file mode 100644 index 4d17c85cf3..0000000000 --- a/.skills/mcc-chatbot-authoring/references/pattern-cookbook.md +++ /dev/null @@ -1,330 +0,0 @@ -# MCC Pattern Cookbook - -Concrete patterns for standalone MCC `/script` bots. Use these before inventing new scaffolding. - -## Periodic task without threads - -Use `Update()` plus a timestamp or counter. This comes from the old `sample-script-with-task.cs` example and still holds up well. - -```csharp -public class PeriodicTaskBot : ChatBot -{ - private DateTime nextRun = DateTime.MinValue; - - public override void Update() - { - var now = DateTime.UtcNow; - if (now < nextRun) - return; - - nextRun = now.AddSeconds(30); - LogDebugToConsole("Running periodic task"); - SendText("/ping"); - } -} -``` - -Why this pattern is good: -- stays on MCC's normal tick flow -- avoids background threads for simple periodic work -- keeps the bot responsive to unload and disconnect - -## Chat and PM handling - -This combines the useful parts of `TestBot`, `sample-script-pm-forwarder.cs`, and `RemoteControl.cs`. - -```csharp -public override void GetText(string text) -{ - text = GetVerbatim(text); - - string message = ""; - string sender = ""; - - if (IsPrivateMessage(text, ref message, ref sender)) - { - LogToConsole("PM from " + sender + ": " + message); - return; - } - - if (IsChatMessage(text, ref message, ref sender)) - { - LogToConsole("Chat from " + sender + ": " + message); - } -} -``` - -Owner-gated internal command handling: - -Add `//using MinecraftClient.CommandHandler` in the script metadata if you use `CmdResult`. - -```csharp -public override void GetText(string text) -{ - text = GetVerbatim(text).Trim(); - - string command = ""; - string sender = ""; - - if (IsPrivateMessage(text, ref command, ref sender) - && Settings.Config.Main.Advanced.BotOwners.Contains(sender.ToLowerInvariant())) - { - CmdResult result = new(); - PerformInternalCommand(command, ref result); - SendPrivateMessage(sender, result.ToString()); - } -} -``` - -## Movement with prerequisite checks - -Modern movement code should copy the guard style from current built-in bots, not the older constructor-heavy scripts. - -```csharp -public override void Initialize() -{ - if (!GetEntityHandlingEnabled() || !GetTerrainEnabled()) - { - LogToConsole("Entity handling and terrain handling are required."); - UnloadBot(); - } -} -``` - -Simple "look at nearest player" logic adapted from `AutoLook.cs`: - -```csharp -private Entity? trackedPlayer = null; - -public override void OnEntitySpawn(Entity entity) -{ - TryTrack(entity); -} - -public override void OnEntityDespawn(Entity entity) -{ - if (trackedPlayer != null && entity.ID == trackedPlayer.ID) - trackedPlayer = null; -} - -public override void OnEntityMove(Entity entity) -{ - if (!TryTrack(entity)) - return; - - LookAtLocation(entity.Location); -} - -private bool TryTrack(Entity entity) -{ - if (entity.Type != EntityType.Player) - return false; - - if (trackedPlayer == null) - { - trackedPlayer = entity; - return true; - } - - if (GetCurrentLocation().Distance(entity.Location) < GetCurrentLocation().Distance(trackedPlayer.Location)) - trackedPlayer = entity; - - return trackedPlayer.ID == entity.ID; -} -``` - -## Search for dropped items and move to them - -This is the safest pattern to preserve from `ItemsCollector.cs` for standalone scripts. - -```csharp -public class NearbyItemsBot : ChatBot -{ - private DateTime nextScan = DateTime.MinValue; - - public override void Initialize() - { - if (!GetEntityHandlingEnabled() || !GetTerrainEnabled()) - { - LogToConsole("Entity handling and terrain handling are required."); - UnloadBot(); - } - } - - public override void Update() - { - var now = DateTime.UtcNow; - if (now < nextScan || ClientIsMoving()) - return; - - nextScan = now.AddSeconds(1); - - var here = GetCurrentLocation(); - var target = GetEntities().Values - .Where(entity => entity.Type == EntityType.Item && entity.Location.Distance(here) <= 15) - .OrderBy(entity => entity.Location.Distance(here)) - .FirstOrDefault(); - - if (target != null) - MoveToLocation(target.Location); - } -} -``` - -Why this version is better than older farming scripts: -- no unmanaged worker thread -- no busy wait loop around movement -- uses the current `GetEntities()` pattern - -## Search for blocks or crops in the world - -The old sugar cane and mining scripts still contain a useful search idea: use `GetWorld().FindBlock(...)`, then filter and sort. - -```csharp -var targets = GetWorld() - .FindBlock(GetCurrentLocation(), Material.SugarCane, 16) - .Where(block => - GetWorld().GetBlock(new Location(block.X, block.Y - 1, block.Z)).Type == Material.SugarCane) - .OrderBy(block => block.Distance(GetCurrentLocation())) - .ToList(); -``` - -Use this as a search primitive. Then decide separately how to move, dig, or harvest. - -## Inventory access and manipulation - -If a standalone script uses inventory types directly, add this import in the metadata block: - -```csharp -//using MinecraftClient.Inventory -``` - -For built-in bots, add: - -```csharp -using MinecraftClient.Inventory; -``` - -Always guard inventory logic first: - -```csharp -public override void Initialize() -{ - if (!GetInventoryEnabled()) - { - LogToConsole("Inventory handling is required."); - UnloadBot(); - } -} -``` - -Important rule: -- `GetPlayerInventory()` returns a snapshot copy, so editing its `Items` dictionary does not change the server -- actual changes must go through `ChangeSlot(...)`, `WindowAction(...)`, `GetItemMovingHelper(...)`, `UseItemInHand()`, and related helpers - -### Search inventory for an item - -This combines the useful current logic from `Farmer.cs` and `AutoEat.cs`. - -```csharp -private bool TrySwitchToItem(ItemType itemType) -{ - var inventory = GetPlayerInventory(); - - if (inventory.Items.TryGetValue(GetCurrentSlot() - 36, out var held) && held.Type == itemType) - return true; - - var hotbarSlots = inventory.SearchItem(itemType) - .Where(slot => slot >= 36 && slot <= 44) - .ToArray(); - - if (hotbarSlots.Length == 0) - return false; - - ChangeSlot((short)(hotbarSlots[0] - 36)); - return true; -} -``` - -Use this for simple hotbar selection. For deeper inventory reshuffling, built-in bots usually need more helper logic. - -### Move an item into the hotbar - -Use this when the item exists in inventory but is not already on the hotbar. - -```csharp -private bool TryMoveItemToHotbar(ItemType itemType, short targetHotbarSlot = 0) -{ - var inventory = GetPlayerInventory(); - var matches = inventory.SearchItem(itemType); - - if (matches.Length == 0) - return false; - - var targetInventorySlot = 36 + targetHotbarSlot; - - if (matches[0] >= 36 && matches[0] <= 44) - { - ChangeSlot((short)(matches[0] - 36)); - return true; - } - - var movingHelper = GetItemMovingHelper(inventory); - movingHelper.Swap(matches[0], targetInventorySlot); - ChangeSlot(targetHotbarSlot); - return true; -} -``` - -Why this pattern is good: -- it reads the current snapshot first -- it does not pretend local `Container` edits affect the server -- it uses the item-moving helper for real inventory manipulation - -### Drop or click items with window actions - -Use `WindowAction(...)` when the bot needs direct inventory clicks or dropping behavior. - -```csharp -private void DropAllOfType(ItemType itemType) -{ - var inventory = GetPlayerInventory(); - - foreach (int slot in inventory.SearchItem(itemType)) - WindowAction(0, slot, WindowActionType.DropItemStack); -} -``` - -Use this pattern carefully: -- verify the correct inventory ID first -- prefer reacting to `OnInventoryUpdate(...)` for larger inventory workflows -- for crafting or chest workflows, use `GetInventories()` and `CloseInventory(...)` as needed - -## Built-in command bot pattern - -Only use this when the user explicitly asks for a built-in bot. - -```csharp -public override void Initialize() -{ - McClient.dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CommandName) - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - ) - ); - - McClient.dispatcher.Register(l => l.Literal(CommandName) - .Then(l => l.Literal("_help") - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - .Redirect(McClient.dispatcher.GetRoot().GetChild("help").GetChild(CommandName))) - ); -} - -public override void OnUnload() -{ - McClient.dispatcher.Unregister(CommandName); - McClient.dispatcher.GetRoot().GetChild("help").RemoveChild(CommandName); -} -``` - -Use a built-in bot only when the user explicitly asks for compiled MCC behavior or repo wiring. diff --git a/.skills/mcc-dev-workflow/SKILL.md b/.skills/mcc-dev-workflow/SKILL.md deleted file mode 100644 index 0661489209..0000000000 --- a/.skills/mcc-dev-workflow/SKILL.md +++ /dev/null @@ -1,362 +0,0 @@ ---- -name: mcc-dev-workflow -description: Build, run, and debug Minecraft Console Client (MCC) against a real local Minecraft Java server on Linux, macOS, or WSL. Use this whenever the user wants to compile MCC, start or inspect a local test server, connect MCC to a server, debug protocol or login issues, validate a code change end-to-end, or run MCC commands on a real server instead of guessing from static code. ---- - -# MCC Development Workflow - -Use this skill when the task needs a real local server loop, not just code reading. - -## Defaults - -- Solution: `MinecraftClient.sln` -- Runtime target: `.NET 10` / `net10.0` -- Environment: Linux, macOS, or WSL with Java, tmux, python3, and dotnet available -- Default server root after `source tools/mcc-env.sh`: `${MCC_SERVERS:-/MinecraftOfficial/downloads}` -- Default validation target when the user does not specify a version: `1.21.11` - -## Console modes - -MCC supports two console modes selectable via `ConsoleMode` in `[Console.General]`: - -| Mode | Backend | Best for | -|------|---------|----------| -| `classic` | `ClassicConsoleBackend` (ConsoleInteractive) | Normal use, legacy CI/scripts, `FileInput` mode | -| `tui` | `TuiConsoleBackend` (Avalonia/Consolonia) | Full-screen TUI with scrollable log, command input, popup inventory | - -Both modes support the same commands and input/output through `ConsoleIO.Backend`. The mode is determined at startup from config; `BasicIO` CLI arg overrides to simple stdio. - -## Core rules - -- Prefer a real local server over static reasoning for protocol, login, movement, inventory, entity, or command-path work. -- Treat tmux `mc-*` sessions as shared state. Do not run multi-version server workflows in parallel unless the harness explicitly isolates them. -- For scripted or repeatable runs, use a generated temporary config. Do not edit the repo-root `MinecraftClient.ini` as part of the test loop. -- A server log line containing `Done (` means startup finished. It does not guarantee that RCON is ready on the first attempt. Retry early `mc-rcon` commands. -- When instructions, docs, and code disagree, trust current code and current tool behavior first. - -## Shared server, isolated MCC sessions - -- `mc-*` commands operate on the shared local Minecraft server. -- `mcc-*` commands operate on one MCC client session. -- The default `session` is the current worktree name. -- The default username is derived from `session`, unless you pass `--username`. -- Session files live under `${TMPDIR:-/tmp}/mcc-debug//`. -- `MCC_SERVERS` stays the shared server-root override. - -Keep shared servers running by default. Do not stop or reset them unless the user explicitly asks for that, or you need to switch server versions. - -Two worktrees can debug against one shared server like this: - -```bash -# worktree A -cd ~/Minecraft/Minecraft-Console-Client -source tools/mcc-env.sh -mc-start 1.21.11 -mcc-debug -v 1.21.11 --file-input - -# worktree B -cd ~/Minecraft/Minecraft-Console-Client-foo -source tools/mcc-env.sh -mcc-debug -v 1.21.11 --file-input - -# from each worktree, mcc-* targets that worktree's default session -mcc-state -``` - -If you want two MCC sessions from the same worktree, pass `--session NAME` explicitly. - -## tmpfs build mode - -Use this on machines with enough RAM when you want worktree-isolated builds outside the repo tree: - -```bash -source tools/mcc-env.sh -export MCC_BUILD_MODE=tmpfs -mcc-build -mcc-build-clean -``` - -`MCC_BUILD_MODE=tmpfs` redirects build output to `/dev/shm/mcc-build//` on Linux, or `${TMPDIR:-/tmp}/mcc-build//` if `/dev/shm` is unavailable. - -## Preflight and reset - -Before scripted runs, especially on macOS or in a reused tmux environment: - -```bash -source tools/mcc-env.sh -mcc-preflight 1.21.11 -mc-reset-test-env 1.21.11 -``` - -`mcc-preflight` checks Java, tmux, dotnet, python3, and server directories. It also resolves common Homebrew Java paths on macOS. `mc-reset-test-env` clears stale tmux sessions and stale `stdin.pipe` files before they turn into misleading startup failures. - -## Build - -```bash -source tools/mcc-env.sh -mcc-build -``` - -Use `mcc-build` for normal local development so any `MCC_BUILD_MODE=tmpfs` routing stays active. Only use raw `dotnet build` when you are intentionally debugging the build system itself. - -## Server management - -Interactive shell: - -```bash -source tools/mcc-env.sh -SESSION="$(_mcc_resolve_session)" -USERNAME="$(_mcc_resolve_username "$SESSION")" -mc-start 1.21.11 -mc-log 1.21.11 100 -mc-rcon "op $USERNAME" -mc-stop 1.21.11 -``` - -Non-interactive shell: - -```bash -tools/start-server.sh 1.21.11 -tools/mc-rcon.sh "op mcc_smoke_a" -``` - -If the servers live outside the repo, set `MCC_SERVERS` before sourcing or invoking the tools: - -```bash -export MCC_SERVERS=/home/anon/Minecraft/Servers -source tools/mcc-env.sh -``` - -## One-step debug session (recommended) - -The `tools/mcc-debug.sh` script handles build, server startup, config preparation, and MCC launch in one step: - -```bash -source tools/mcc-env.sh - -# Classic mode with FileInput (script-driven debugging): -mcc-debug -v 1.21.11 --file-input - -# Classic mode interactive (attach via tmux): -mcc-debug -v 1.21.11 - -# TUI mode: -mcc-debug -v 1.21.11 -m tui - -# With debug messages enabled from start: -mcc-debug -v 1.21.11 --file-input --debug-on - -# Skip build (already built): -mcc-debug -v 1.21.11 --file-input --no-build -``` - -### What mcc-debug.sh does - -1. Builds MCC (unless `--no-build`) -2. Creates a clean temp config at `${TMPDIR:-/tmp}/mcc-debug//MinecraftClient.debug.ini` -3. Ensures server is running (starts if not, waits for `Done (`) -4. Launches MCC in a session-scoped tmux session and session-scoped log/input/pid files - -### After launch - -- **FileInput mode**: drive MCC via `mcc-cmd --session smoke-a "debug state"`, or just `mcc-cmd "debug state"` from the same worktree -- **Interactive/TUI mode**: attach with `tmux attach -t mcc-` -- **Logs**: `mcc-log-mcc --session smoke-a` or `tail -f "${TMPDIR:-/tmp}/mcc-debug//mcc-debug.log"` -- **Server RCON**: grant op or gamemode to the username derived from that session - -## Debug commands (in-game) - -### `/debug [on|off]` - -Toggles debug logging. Now correctly syncs both `Settings.Config.Logging.DebugMessages` and `McClient.Log.DebugEnabled`. - -### `/debug state` - -Prints a one-shot summary of MCC's internal state: - -``` -=== MCC Debug State === -Server: localhost:25565 -Username: mcc_smoke_a -Protocol: 774 -GameMode: 1 -Health: 20.0 -Food: 20 -Location: 0.50, 80.00, 0.50 -TPS: 20.0 -Console: ClassicConsoleBackend (or TuiConsoleBackend) -Features: Terrain Inventory Entity -Debug: ON -Bots (3): AutoFishing, FileInputBot, ScriptScheduler -Players: 2 online -``` - -This works in both classic and TUI modes. - -## Classic mode debugging - -### Agent workflow (FileInput mode) - -For agents calling MCC commands programmatically: - -```bash -source tools/mcc-env.sh -SESSION="smoke-a" -mcc-debug -v 1.21.11 --file-input --session "$SESSION" --no-build - -# Send commands: -mcc-cmd --session "$SESSION" "debug state" -mcc-cmd --session "$SESSION" "inventory player list" -mcc-cmd --session "$SESSION" "entity" - -# Check results: -mcc-log-mcc --session "$SESSION" - -# Stop: -mcc-cmd --session "$SESSION" "quit" -mcc-kill --session "$SESSION" -mc-stop 1.21.11 -``` - -### Interactive workflow - -```bash -source tools/mcc-env.sh -SESSION="live-a" -mcc-debug -v 1.21.11 --session "$SESSION" - -# In another terminal: -tmux attach -t "mcc-$SESSION" -# Type commands directly in MCC console -``` - -## TUI mode debugging - -TUI mode runs Consolonia full-screen in a tmux session. Key differences: - -1. **No pipe/redirect**: TUI needs a real tty. Cannot `| tee` or redirect stdout. -2. **Log output is in-screen**: all output appears in the scrollable log area. -3. **Keyboard shortcuts**: PageUp/PageDown scroll, ESC exits. -4. **`/debug state`**: the primary way to inspect internal state since external log tailing is not available. -5. **Dialog windows**: `/inventui` opens as an overlay dialog instead of a separate screen. - -### Agent workflow for TUI mode - -```bash -source tools/mcc-env.sh -SESSION="tui-a" -mcc-debug -v 1.21.11 -m tui --session "$SESSION" --no-build - -# Cannot use mcc-cmd (no FileInput); must use tmux send-keys: -tmux send-keys -t "mcc-$SESSION" "/debug state" Enter - -# Read TUI screen: -tmux capture-pane -t "mcc-$SESSION" -p -S -30 - -# Stop: -tmux send-keys -t "mcc-$SESSION" Escape -``` - -**Caveat with tmux send-keys and Consolonia**: When sending text containing `/`, the Enter key may need to be sent separately: -```bash -tmux send-keys -t "mcc-$SESSION" "/inventory player list" -tmux send-keys -t "mcc-$SESSION" Enter -``` - -## mcc-env.sh quick reference - -After `source tools/mcc-env.sh`: - -| Function | Description | -|----------|-------------| -| `mc-start VER` | Start MC server in tmux | -| `mc-stop VER` | Graceful stop via stdin pipe | -| `mc-log VER [N]` | Capture last N lines of server output | -| `mc-rcon "CMD"` | Send RCON command | -| `mc-kill VER` | Force-kill server tmux session | -| `mc-list` | List running MC server sessions | -| `mc-wait-ready VER [SEC]` | Wait for server `Done (` | -| `mc-wait-stop VER [SEC]` | Wait for server shutdown, with force-kill fallback | -| `mc-reset-test-env [--all|VER...]` | Reset shared tmux server state and stale pipes | -| `mcc-build` | Build MCC | -| `mcc-publish --rid ` | Publish MCC with the repo's CI-like defaults | -| `mcc-build-clean` | Clear the current worktree's build output | -| `mcc-run [--session NAME] [--username NAME] [--port PORT]` | Convenience wrapper for `mcc-debug --file-input --no-build` | -| `mcc-tui [--session NAME] [--username NAME] [--port PORT]` | Convenience wrapper for `mcc-debug -m tui --no-build` | -| `mcc-cmd [--session NAME] "CMD"` | Append a command to one session's input file | -| `mcc-kill [--session NAME]` | Kill one MCC process and session | -| `mcc-debug [OPTS]` | One-step debug session (see above) | -| `mcc-log-mcc [--session NAME]` | Tail one MCC debug log | -| `mcc-state [--session NAME]` | Send `debug state` and print the last 30 log lines | -| `mcc-preflight [VER...]` | Verify Java, tmux, dotnet, python3, and server dirs | - -## Temporary config recipe - -```bash -source tools/mcc-env.sh -SESSION="smoke-a" -USERNAME="$(_mcc_resolve_username "$SESSION")" -CFG="$(_mcc_session_root "$SESSION")/MinecraftClient.debug.ini" -mkdir -p "$(_mcc_session_root "$SESSION")" -bash "$MCC_REPO/.skills/mcc-integration-testing/scripts/prepare_offline_mcc_config.sh" \ - "$CFG" \ - "1.21.11" \ - "$USERNAME" -``` - -For TUI mode, also add: -```bash -sed -i 's/ConsoleMode = "classic"/ConsoleMode = "tui"/' "$CFG" -``` - -## Verify connection and a basic command - -MCC output should include: - -- `[MCC] Server was successfully joined.` - -Server output should include the session-derived username, for example: - -- `mcc_smoke_a joined the game` - -Basic command check: - -```bash -mcc-cmd --session smoke-a "inventory player list" -``` - -If a scripted run fails before MCC joins, check for a harness problem before assuming a product regression. Missing `mcc.log`, a pre-join `Connection refused`, or a server that never reached `Done (` usually means shared-state cleanup or startup failed. - -## Typical debug loop - -1. `source tools/mcc-env.sh` -2. `mcc-debug -v 1.21.11 --file-input` (or `-m tui`) -3. Confirm `Server was successfully joined` in log -4. `mcc-cmd "debug state"` to verify MCC state -5. Run test commands -6. Inspect log output -7. `mcc-cmd "quit"` and `mc-stop 1.21.11` -8. Edit code, rebuild, repeat - -## Debugging tips - -- **`/debug state` is your primary diagnostic tool** in both modes. Use it first to verify connection, mode, and feature flags. -- **`/debug on` now correctly enables debug logging** at runtime. Previous versions had a bug where `Log.DebugEnabled` was not synced. -- Protocol mismatches usually show up as a version line such as `Server version : 1.21.11 (protocol vNNN)` before the failure. -- If an early `mc-rcon` command fails, retry it before assuming the server setup is broken. -- If a supposedly isolated run behaves strangely, check `tmux list-sessions` and kill stale `mc-*` sessions first. -- Legacy `1.8` and `1.8.9` servers may need `use-native-transport=false` in `server.properties` on some Linux environments. -- For timing-sensitive work, do not trust wall-clock intuition. Use a real server run and capture evidence from logs or test scripts. -- **TUI mode tip**: if the terminal becomes unresponsive after a crash, run `stty sane && reset` to restore it. -- **tmux capture trick**: `tmux capture-pane -t mcc- -p -S -50` captures the last 50 lines of a tmux session without attaching. - -## Tool files - -| File | Purpose | -|------|---------| -| `tools/mcc-env.sh` | Shell functions for server/MCC management | -| `tools/mcc-debug.sh` | One-step debug session launcher | -| `tools/mcc-log-tail.sh` | Log tailing for MCC and/or server | -| `tools/start-server.sh` | Server lifecycle in tmux | -| `tools/mc-rcon.sh` | RCON command sender | -| `tools/run-creative-e2e.sh` | Full creative mode end-to-end test | diff --git a/.skills/mcc-dev-workflow/evals/evals.json b/.skills/mcc-dev-workflow/evals/evals.json deleted file mode 100644 index 7d86331ee5..0000000000 --- a/.skills/mcc-dev-workflow/evals/evals.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "skill_name": "mcc-dev-workflow", - "evals": [ - { - "id": 1, - "prompt": "Build MCC, start the local 1.21.11 vanilla server from an MCC_SERVERS root, connect MCC with a temporary config, and verify a successful join plus one inventory command.", - "expected_output": "The workflow uses a real local server, a temp MCC config, and concrete log evidence for both the join and the MCC command.", - "files": [], - "expectations": [ - "The workflow uses a real local 1.21.11 server instead of only reading code.", - "The workflow uses MCC_SERVERS-aware tooling or documents the server root explicitly.", - "The workflow uses a temporary MCC config instead of relying on the repo-root config.", - "The result includes join evidence from MCC output and the server log." - ] - }, - { - "id": 2, - "prompt": "Debug a flaky local MCC startup on 1.21.11 by checking for stale tmux server sessions, waiting for server readiness, and retrying early RCON commands before blaming protocol code.", - "expected_output": "The response treats tmux sessions as shared state, distinguishes server startup from RCON readiness, and uses the real local workflow rather than pure speculation.", - "files": [], - "expectations": [ - "The workflow checks or mentions stale mc-* tmux sessions.", - "The workflow distinguishes Done from RCON readiness.", - "The workflow retries or advises retrying early RCON commands.", - "The workflow keeps the debugging loop grounded in real local commands." - ] - }, - { - "id": 3, - "prompt": "Run a repeatable local MCC debug loop for 1.21.11 that compiles the client, connects with movement, inventory, and entity handling enabled, and leaves enough evidence to inspect a regression afterward.", - "expected_output": "The response follows a real build-run-test-inspect loop and captures enough log evidence to support follow-up debugging.", - "files": [], - "expectations": [ - "The workflow builds MCC before the run.", - "The workflow enables terrain, inventory, and entity handling for the scripted run.", - "The workflow captures or points to concrete log locations.", - "The workflow prefers a temp config for repeatability." - ] - } - ] -} diff --git a/.skills/mcc-integration-testing/SKILL.md b/.skills/mcc-integration-testing/SKILL.md deleted file mode 100644 index 9f70a8043e..0000000000 --- a/.skills/mcc-integration-testing/SKILL.md +++ /dev/null @@ -1,323 +0,0 @@ ---- -name: mcc-integration-testing -description: >- - Use when proving MCC behavior on a real local Minecraft server, validating - runtime or protocol changes end-to-end, exercising movement, physics, - inventory, entity, chat, or terrain behavior, or running a single-version or - cross-version regression sweep. -metadata: - category: discipline - triggers: - - integration test - - real server - - local server - - regression sweep - - rcon - - tmux - - offline mode - - online mode - - movement - - physics - - inventory - - entity - - terrain - - chat ---- - -# MCC Integration Testing - -Use this skill when the task is "prove it on a real server", not just "reason about whether it should work." - -Read [references/online-mode.md](references/online-mode.md) when the user asks for Microsoft login, device-code auth, or an online-mode server run. Use [references/command-matrix.md](references/command-matrix.md) for stable MCC-side and RCON-side commands. - -## Iron Law - -Only say MCC was integration tested when MCC ran against a real local server and the claim is backed by real MCC output plus real server logs. - -Calling build-only, reasoning-only, or join-only work "integration tested" is a rules violation, not shorthand. - -These do not count as end-to-end proof: - -- static reasoning, source comparison, or build success -- join or login success by itself -- a long-lived idle connection by itself -- a grep that only says there were no errors -- testing one shared-route version and silently claiming adjacent versions also passed - -If the environment cannot run a real server, say so and report the result as unexecuted or inferred, not integration tested. - -## Default target - -- Use `1.21.11-Vanilla` unless the user asks for a different version or a version matrix. -- Use `MCC_SERVERS` if it is set. Otherwise the default server root is `MinecraftOfficial/downloads`. - -## Guardrails - -- Use a real local server. -- Launch MCC against an explicit `localhost:` target for repeatable local tests. -- Keep version matrices sequential in shared local environments. The tmux server harness is shared state by default. -- Prefer generated temporary MCC configs for scripted runs so one test does not contaminate the next. -- Default to offline auth in generated temp configs. Do not trust the repo-root `MinecraftClient.ini` account defaults. -- If the user explicitly asks for Microsoft online login, honor that request and generate the temp config for Microsoft auth instead of offline mode. -- For Microsoft auth, prefer an interactive TTY launch with `BasicIO-NoColor` so the device code is easy to read and relay to the user. -- Do not use file-input mode during Microsoft auth. Launch interactively first, complete login, then switch to scripted control only if needed. -- For online-mode tests, prefer a clean temp config with no join-time bots or scheduled tasks. Inherited `ScriptScheduler` or `DiscordRpc` settings can pollute the session and send unintended chat right after login. -- Legacy and modern command syntax differ. Do not assume one server-command profile fits every version. -- Use actual MCC output and actual server logs for assertions. Do not invent success strings. -- Treat server `Done` as startup progress, not RCON readiness. Retry the first RCON command before assuming the setup is broken. -- Run preflight before scripted test loops. On macOS, Java may be installed but not exported on PATH in the shell the harness uses. -- If a change touches shared routing or a version range, test at least one adjacent version that shares that path, or explicitly mark adjacent versions as unexecuted and inferred. -- For palette or version-content changes, probe at least one neighboring or existing item, entity, or block. Do not only check the headline addition. -- Separate product failures from harness failures. Missing logs, stale tmux state, stale `stdin.pipe`, or pre-join `Connection refused` errors are usually environment problems until proven otherwise. - -## Choose the test mode - -### 1. Single-version deep smoke - -Use this when one supported version is enough and you want broad coverage: - -```bash -.skills/mcc-integration-testing/scripts/run_full_spectrum_test.sh 1.21.11-Vanilla -``` - -This covers join, chat, slash commands, internal MCC commands, creative inventory, entity handling, sounds, particles, TNT, kill/respawn, and log assertions. - -### 2. Ordered creative-mode E2E - -Use this when the user asks for a regression sweep in a strict scenario order such as: - -- connect -- send messages -- send commands -- receive messages -- movement -- physics -- mobs -- effects -- inventory - -Broad validation should usually cover `connect-test`, `item-test`, `entity-test`, `terrain-test`, and `chat-test`. - -Command: - -```bash -MCC_SERVERS=/home/anon/Minecraft/Servers bash tools/run-creative-e2e.sh 1.21.11-Vanilla 1.21.11 modern -``` - -For legacy targets such as `1.8` or `1.8.9`, switch the final argument to `legacy` and pass the pinned MC version. - -### 3. Timing or cadence validation - -Use this for TPS, movement-cadence, or packet-cadence work: - -- `MinecraftClient/config/sample-script-tick-counter.cs` -- `MinecraftClient/config/sample-script-packet-capture.cs` - -Run them against a real server with a temp config and summarize counts from the captured logs. - -### 4. Structured components test - -Use this after touching any `StructuredComponents` code (registries, component -parsers, subcomponents, codec helpers) to prove every component type in a -version parses on the wire without error: - -```bash -bash tools/run-structured-components-test.sh 1.21.11 -``` - -Run a single version (fast, ~2 min) or a matrix: - -```bash -for v in 1.20.6 1.21 1.21.2 1.21.5 1.21.11 26.1; do - bash tools/run-structured-components-test.sh "$v" -done -``` - -The script gives items with every registered component via RCON `/give`, reads -them back with `inventory player list`, and asserts no parse errors in the MCC -log. Version-gated components (v1212+, v1215+, v12111+, v261) are tested only -on the versions that support them. See `SC_Integration_Test_Report.md` for a -reference run across all 6 version groups. - -### 6. Dialog integration test - -Use this after touching any dialog system code (packet handling, NBT parsing, -models, TUI, command dispatch, the state machine in `DialogManager`, or the -codec in `DialogNbtParser`). Tests all 5 dialog types, button actions (close, -run_command, show_dialog), cancel/dismiss, click-label, and body content: - -```bash -tools/run-dialog-test.sh 26.1 -``` - -The script starts the server if needed, generates a temp MCC config, launches -MCC with file-input mode (requires both `MCC_FILE_INPUT=1` and -`MCC_INPUT_FILE=` env vars), sends inline SNBT dialogs via RCON, and -asserts 29 checks against the MCC log. - -Key requirements that differ from other test modes: - -- FileInputBot is loaded only when `MCC_FILE_INPUT=1` is set in the - environment. The `[ChatBot.FileInput]` config section is ignored at load - time. -- The input file path is controlled by `MCC_INPUT_FILE`, *not* by the config - `File` setting. -- Dialogs use inline SNBT syntax through `ResourceOrIdArgument`, e.g.: - `dialog show {type:"minecraft:notice", title:{text:"Hello"}}` -- The `ActionButton.CODEC` flattens `CommonButtonData` fields (`label`, - `tooltip`, `width`) into the same object as `action` — no `button` wrapper. - -### 5. Full inventory regression sweep - -Use this when touching inventory snapshots, player/container slot sync, creative inventory, item-slot serialization, packet palettes, game-mode updates, or block-use paths that open containers: - -```bash -tools/run-inventory-full-sweep.sh --versions "1.21.10 1.21.11" -``` - -Default coverage includes: - -- player inventory listing and inventory discovery -- creative give/delete -- inventory search -- player right/left click stack split and merge -- player drop one and drop all -- chest open via `useblock` -- container listing and close -- mirrored player slots in container windows -- shift-click and shift-right-click transfer -- container right/left click, cursor stack, drop one, and drop all -- creative middle-click command path -- log scan for packet parse failures, queue-empty crashes, unhandled exceptions, and disconnects - -The script writes `summary.tsv` under `RUN_ROOT` and per-version logs under `/tmp/mcc-debug/inventory-full-/mcc-debug.log`. - -When a matrix has existing PASS rows, do not rerun them unless a later code change affects that row or the user asks for a full rerun. Derive remaining rows from summaries: - -```bash -awk 'FNR>1 && $2=="PASS" {print $1}' /tmp/mcc-inventory-full-sweep/*/summary.tsv | sort -V | uniq -``` - -## Preconditions - -Before running any scenario: - -0. run preflight and clear stale shared state when the environment is reused -1. configure the target server for offline testing -2. ensure `eula=true` -3. ensure RCON is enabled -4. build MCC unless the task explicitly reuses a fresh build - -Preflight and reset helpers: - -```bash -.skills/mcc-integration-testing/scripts/preflight_test_env.sh 1.21.11-Vanilla -.skills/mcc-integration-testing/scripts/reset_shared_test_state.sh 1.21.11-Vanilla -``` - -Offline configuration helper: - -```bash -.skills/mcc-integration-testing/scripts/ensure_offline_server.sh 1.21.11-Vanilla -``` - -By default, the config helper prepares offline auth. To opt into another auth mode for a specific run, set: - -```bash -MCC_TEST_ACCOUNT_TYPE=microsoft -MCC_TEST_PASSWORD= -``` - -Optionally override the login name with the fourth argument to the config helper. - -## Scripts and tools - -- `.skills/mcc-integration-testing/scripts/ensure_offline_server.sh` - - configures persistent offline mode and RCON -- `.skills/mcc-integration-testing/scripts/preflight_test_env.sh` - - verifies Java, tmux, dotnet, python3, server directories, and resolves common Java PATH issues -- `.skills/mcc-integration-testing/scripts/reset_shared_test_state.sh` - - clears stale tmux sessions and stale `stdin.pipe` files before a rerun -- `.skills/mcc-integration-testing/scripts/prepare_offline_mcc_config.sh` - - generates a clean temporary MCC config, prepares offline login by default, disables noisy bots, and can switch to Microsoft auth when explicitly requested -- `.skills/mcc-integration-testing/scripts/get_server_port.sh` - - resolves the actual local server port from `server.properties` or the latest server log -- `.skills/mcc-integration-testing/scripts/run_full_spectrum_test.sh` - - single-version deep smoke with built-in assertions -- `.skills/mcc-integration-testing/scripts/summarize_test_run.sh` - - summarize the latest full-spectrum run -- `tools/run-creative-e2e.sh` - - ordered creative-mode E2E regression scenario -- `tools/run-inventory-full-sweep.sh` - - full inventory command/API sweep across one or more versions -- `tools/run-structured-components-test.sh` - - exercises every structured component via RCON `/give` across versions 1.20.6-26.1 -- `tools/run-dialog-test.sh` - - dialog integration test: all 5 types, run_command/show_dialog actions, - cancel/dismiss/click-label, body content; 29 assertions on MCC log - -## Evidence Discipline - -In every report, separate: - -- `Executed`: exact scripts, commands, versions, auth mode, and whether the run was sequential or single-version -- `Observed`: exact MCC output, exact server-log evidence, and the saved log directory -- `Inferred`: conclusions not directly shown by that run's runtime evidence -- `Harness issues`: setup or runner problems such as missing Java on PATH, stale tmux sessions, stale `stdin.pipe`, missing log artifacts, or failed config generation - -Never upgrade inferred claims to observed facts. Absence of errors is supporting evidence only; pair it with a positive assertion for the feature under test. - -## Red Flags - -Stop and fix the test plan if you are about to: - -- claim movement, inventory, entity, terrain, physics, or chat coverage from join success alone -- reuse repo-root `MinecraftClient.ini` or another user-local stateful config -- run multi-version tests in parallel in a shared tmux or shared server environment -- let inherited bots, schedulers, or other user-local noise send chat or commands during validation - -## What to report back - -Always summarize: - -- which version or versions were tested -- which port or ports were used -- which auth mode and scenario were used -- whether the run was sequential or single-version -- the exact scripts or commands executed -- pass or fail per major phase -- concrete evidence from MCC and server logs -- the saved log directory -- what was not executed and what remains inferred -- which adjacent versions were not run but were mentioned - -## When Not to Use - -- build-only verification -- static protocol or source comparison with no real server run -- documentation or prompt work -- code review requests that do not ask for executed runtime proof - -## Troubleshooting - -- If the first RCON command fails, retry it before assuming the setup is broken. -- If Java is installed but the harness still says it is missing, run `preflight_test_env.sh`. This resolves common Homebrew Java paths on macOS. -- If MCC reaches Microsoft device-code login during an offline test, stop and inspect the generated temp config before retrying. -- If the user explicitly requests Microsoft online login, set `MCC_TEST_ACCOUNT_TYPE=microsoft` before launching the harness. -- If the user explicitly requests Microsoft online login, use `BasicIO-NoColor` in a real TTY, relay the device code from the TUI, and avoid pressing empty Enter at any auth prompt. -- If the online-mode session sends unexpected chat or commands right after join, inspect inherited bot settings first. `ChatBot.ScriptScheduler` tasks and `ChatBot.DiscordRpc` are common sources of test noise in user-local configs. -- If `dotnet run` cannot see an existing Microsoft session, check whether `SessionCache.db` and `ProfileKeyCache.ini` need to be synced from `MinecraftClient/bin/Release/net10.0/` to the repo root. -- If Microsoft auth keeps prompting even with a valid session cache, verify `Account.Login` matches the cached username exactly. -- If MCC reports `Connection refused`, verify the launched target matches the server's actual `server-port`. -- If MCC reports `Connection refused` immediately after a server start, also check for stale shared state: old tmux sessions, a stale `stdin.pipe`, or a server that never actually reached `Done (`. -- If multiple versions are being tested, do not start them in parallel unless the harness isolates tmux sessions and input files. -- If a test assertion fails, inspect the real MCC output before changing the code or weakening the assertion. -- If an older server behaves oddly on Linux, check `use-native-transport=false` in `server.properties`. -- If a matrix row fails before producing `mcc.log` or a command transcript, treat it as a harness failure, fix the environment, and rerun that row before drawing product conclusions. -- If creative inventory commands report "You must be in Creative gamemode" after RCON switched the player, inspect game-mode update parsing before assuming creative inventory is broken. Modern servers can update local game mode through game event reason `3`. -- If an inventory row crashes with `Queue empty` or `Failed to process incoming packet`, inspect packet palette routing before changing inventory code. A single shifted packet ID can make a healthy inventory feature look broken. -- For chest-open failures, separate product and harness causes. The player may be standing inside the chest or suffocating on older servers. Stand beside the chest, put a floor under the player, and retry `useblock`. -- For shared local servers, a `Done` log line does not prove RCON is ready. Retry setup commands and verify the actual RCON port from `server.properties`. -- If `tools/run-dialog-test.sh` fails with "FileInput Watching: .../mcc_input.txt" pointing to the wrong directory, the `MCC_INPUT_FILE` env var was not set in the tmux command. FileInputBot ignores the config `File` setting entirely. -- If inline SNBT dialogs fail on the server side (`Failed to parse structure: No key ...`), check whether `ActionButton.CODEC` fields are flat (no `button` wrapper) and whether the dialog type fields match the 26.1 server (`label` not `text` in `CommonButtonData`). -- If a dialog integration test fails on "Server showed custom dialog", the dialog packet (id=0x8C in 26.1 play phase) may not have been sent. Verify the RCON command succeeded and the server printed "Displayed dialog to ...". diff --git a/.skills/mcc-integration-testing/evals/evals.json b/.skills/mcc-integration-testing/evals/evals.json deleted file mode 100644 index 251abc583f..0000000000 --- a/.skills/mcc-integration-testing/evals/evals.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "skill_name": "mcc-integration-testing", - "evals": [ - { - "id": 1, - "prompt": "Run a real 1.21.11 MCC regression test in creative mode covering connect, send messages, send commands, receive messages, movement, physics, mobs, effects, and inventory, in that order.", - "expected_output": "The workflow uses the ordered creative-mode E2E harness on a real server, reports pass or fail for each phase, and points to the saved logs.", - "files": [], - "expectations": [ - "The workflow uses a real 1.21.11 server.", - "The workflow uses the ordered creative E2E harness instead of improvising the whole scenario.", - "The result reports phase-by-phase outcomes in the requested order.", - "The result includes the log directory for the run." - ] - }, - { - "id": 2, - "prompt": "Validate that MCC still works after a runtime or protocol change by running a deep single-version 1.21.11 integration test with chat, creative inventory, entity tracking, sounds, particles, TNT, and kill/respawn coverage.", - "expected_output": "The workflow uses the full-spectrum test runner on a real server and returns a concise pass or fail summary backed by MCC and server log evidence.", - "files": [], - "expectations": [ - "The workflow builds MCC before the scenario unless a fresh build is explicitly reused.", - "The workflow uses the full-spectrum runner instead of only manual spot checks.", - "The result includes evidence from both MCC output and server logs.", - "The result points to the saved run directory." - ] - }, - { - "id": 3, - "prompt": "Validate a timing-sensitive MCC change on a real 1.21.11 server by collecting tick-rate and outbound packet-cadence evidence, then summarize the results clearly.", - "expected_output": "The response uses a real server, a temp config, and the provided sample scripts to capture tick-rate and packet evidence instead of relying on intuition.", - "files": [], - "expectations": [ - "The workflow uses the real 1.21.11 server.", - "The workflow uses the tick counter and packet capture scripts or clearly equivalent targeted instrumentation.", - "The workflow keeps the run isolated with a temp config.", - "The summary reports concrete counts or cadence evidence." - ] - } - ] -} diff --git a/.skills/mcc-integration-testing/references/command-matrix.md b/.skills/mcc-integration-testing/references/command-matrix.md deleted file mode 100644 index 782bc74590..0000000000 --- a/.skills/mcc-integration-testing/references/command-matrix.md +++ /dev/null @@ -1,91 +0,0 @@ -# Command Matrix - -This skill uses a fixed set of stable commands for local offline integration testing. - -## MCC-side commands via `mcc-cmd` - -- `health` -- `list` -- `inventory player list` -- `/gamemode creative` -- `inventory creativegive 36 Diamond 16` -- `inventory creativegive 37 IronSword 1` -- `inventory creativegive 38 GoldenApple 8` -- `inventory creativeclear 38` -- `entity` -- `/time query daytime` -- `look up` -- `look down` -- `look east` -- `/gamemode survival` -- `respawn` -- `/tp MCCBot 0 -60 0` -- `smoke_test_from_mcc_full_spectrum` -- `integration_test_chat_response` - -Notes: -- Lines starting with `/` are sent to the server as chat/commands. -- Non-slash lines are treated as MCC internal commands first, then fall back to chat. - -## Server-side commands via `mc-rcon` - -- `op MCCBot` -- `gamerule sendCommandFeedback true` -- `gamerule logAdminCommands true` -- `time set day` -- `weather clear` -- `say Hello from the server console` -- `msg MCCBot This is a private whisper` -- `effect give MCCBot minecraft:speed 30 1` -- `effect give MCCBot minecraft:regeneration 10 1` -- `kill MCCBot` - -## Representative entity coverage - -- `execute as MCCBot at @s run summon minecraft:cow ~2 ~ ~` -- `execute as MCCBot at @s run summon minecraft:zombie ~4 ~ ~` -- `execute as MCCBot at @s run summon minecraft:creeper ~6 ~ ~` -- `execute as MCCBot at @s run summon minecraft:skeleton ~8 ~ ~` -- `execute as MCCBot at @s run summon minecraft:villager ~-2 ~ ~` -- `execute as MCCBot at @s run summon minecraft:allay ~-4 ~ ~` -- `execute as MCCBot at @s run summon minecraft:armor_stand ~ ~ ~2` -- `execute as MCCBot at @s run summon minecraft:item_display ~-6 ~ ~ {item:{id:"minecraft:diamond",count:1}}` -- `execute as MCCBot at @s run summon minecraft:spider ~10 ~ ~` -- `execute as MCCBot at @s run summon minecraft:pig ~-8 ~ ~` - -## Block placement coverage - -- `execute as MCCBot at @s run fill ~1 ~ ~1 ~3 ~2 ~3 minecraft:stone` -- `execute as MCCBot at @s run setblock ~5 ~ ~5 minecraft:chest` -- `execute as MCCBot at @s run setblock ~5 ~1 ~5 minecraft:furnace` -- `execute as MCCBot at @s run setblock ~6 ~ ~5 minecraft:crafting_table` - -## Dimension change coverage - -- `execute in minecraft:the_nether run tp MCCBot 0 64 0` -- `execute in minecraft:overworld run tp MCCBot 0 -60 0` - -## Representative particle coverage - -- `execute as MCCBot at @s run particle minecraft:happy_villager ~ ~1 ~ 0.5 0.5 0.5 0 12 force` -- `execute as MCCBot at @s run particle minecraft:end_rod ~ ~1 ~ 0.5 0.5 0.5 0.01 20 force` -- `execute as MCCBot at @s run particle minecraft:explosion ~ ~1 ~ 0 0 0 0 1 force` -- `execute as MCCBot at @s run particle minecraft:totem_of_undying ~ ~1 ~ 0.5 0.5 0.5 0.1 20 force` -- `execute as MCCBot at @s run particle minecraft:flame ~ ~1 ~ 0.2 0.2 0.2 0.02 30 force` -- `execute as MCCBot at @s run particle minecraft:heart ~ ~2 ~ 0.3 0.3 0.3 0 5 force` - -## Representative sound coverage - -- `execute as MCCBot at @s run playsound minecraft:entity.lightning_bolt.thunder master MCCBot ~ ~ ~ 1 1 0` -- `execute as MCCBot at @s run playsound minecraft:block.note_block.bell master MCCBot ~ ~ ~ 1 1 0` -- `execute as MCCBot at @s run playsound minecraft:entity.experience_orb.pickup master MCCBot ~ ~ ~ 1 1 0` - -## Explosion coverage - -- `execute as MCCBot at @s run summon minecraft:tnt ~3 ~ ~` -- `execute as MCCBot at @s run summon minecraft:tnt ~6 ~ ~` - -## Kill and respawn cycle - -- `kill MCCBot` (via RCON, requires survival mode) -- `respawn` (via MCC command after death) diff --git a/.skills/mcc-integration-testing/references/online-mode.md b/.skills/mcc-integration-testing/references/online-mode.md deleted file mode 100644 index fdd0bedae5..0000000000 --- a/.skills/mcc-integration-testing/references/online-mode.md +++ /dev/null @@ -1,48 +0,0 @@ -# Online-Mode Notes - -Use this flow only when the user explicitly asks for Microsoft login or wants to validate against an online-mode server. - -## Launch mode - -- Prefer `BasicIO-NoColor` in a real TTY so the Microsoft device-code prompt is easy to read and copy. -- Do not use `MCC_FILE_INPUT=1` during the auth step. It is for scripted command injection, not interactive login. -- Avoid `nohup`. Use `tmux` for long-running sessions that still need a TTY. -- Start from a clean temp config when possible. If the temp config is copied from a user-local `MinecraftClient.ini`, inspect `ChatBot.ScriptScheduler` and `ChatBot.DiscordRpc` before the run. - -## Session cache behavior - -- `dotnet run --project MinecraftClient ...` uses the repo root for `SessionCache.db` and `ProfileKeyCache.ini`. -- The compiled binary under `MinecraftClient/bin//net10.0/` uses that output directory instead. -- If a session exists in one location and not the other, sync the cache files before assuming login is broken. - -## Account settings - -- `Account.Login` must be populated for MCC to look up a cached Microsoft session. -- The cached key is the username form MCC stored, typically the lowercase username, not necessarily the email address. -- MCC rewrites `MinecraftClient.ini` on clean exit, so generate a temp config per run and do not edit it while MCC is still running. - -## Auth prompt handling - -- Do not send a bare Enter to dismiss `Password(invisible):` or `Paste your code here:` prompts. That can trigger offline fallback. -- For interactive online-mode runs, wait for the device code prompt and relay the code to the user exactly as shown. -- After the user completes login, continue the test in the same TTY session or restart into file-driven mode if the workflow requires automation. - -## Join-time noise - -- Real user configs may contain enabled bots or task lists that were harmless in offline testing but are noisy in online-mode validation. -- The most common examples are: - - `ChatBot.ScriptScheduler` task lists that send `/hello`, `/login ...`, or other automatic commands on login or on an interval - - `ChatBot.DiscordRpc`, which is not harmful to server state but adds log noise and extra background activity -- If the goal is protocol or feature validation, suppress these before the run or treat their output as non-test noise. - -## Server settings - -- For realistic online-mode testing, keep `online-mode=true`. -- Keep `enforce-secure-profile=true` unless the test explicitly targets insecure-profile behavior. - -## Command reminders - -- With `InternalCmdChar = "slash"`: - - `/health`, `/pos`, `/inventory`, `/entity` are MCC internal commands. - - `/send /list` and `/send /give ...` are server commands. - - bare text is regular chat sent to the server. diff --git a/.skills/mcc-integration-testing/scripts/common.sh b/.skills/mcc-integration-testing/scripts/common.sh deleted file mode 100755 index ac5c0250bf..0000000000 --- a/.skills/mcc-integration-testing/scripts/common.sh +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/env bash - -sed_in_place() { - if [[ "$(uname)" == "Darwin" ]]; then - sed -i '' "$@" - else - sed -i "$@" - fi -} - -ensure_java_in_path() { - if command -v java >/dev/null 2>&1 && java -version >/dev/null 2>&1; then - return 0 - fi - - local candidate - for candidate in \ - "${JAVA_BIN:-}" \ - "/opt/homebrew/opt/openjdk/bin/java" \ - "/usr/local/opt/openjdk/bin/java" \ - "/usr/lib/jvm/default-java/bin/java" - do - [[ -z "$candidate" ]] && continue - if [[ -x "$candidate" ]]; then - export PATH="$(dirname "$candidate"):$PATH" - export JAVA_BIN="$candidate" - if java -version >/dev/null 2>&1; then - return 0 - fi - fi - done - - echo "java was not found on PATH. Install Java or set JAVA_BIN." >&2 - return 1 -} - -server_session_name() { - printf 'mc-%s\n' "${1//./_}" -} - -server_running() { - local version="$1" - mc-list | grep -Fq "$(server_session_name "$version")" -} - -wait_for_server_ready() { - local version="$1" - local timeout="${2:-60}" - local elapsed=0 - - while (( elapsed < timeout )); do - if mc-log "$version" 250 2>/dev/null | grep -Fq "Done ("; then - return 0 - fi - sleep 1 - ((elapsed += 1)) - done - - echo "Timed out waiting for $version to become ready" >&2 - return 1 -} - -wait_for_server_stop() { - local version="$1" - local timeout="${2:-60}" - local elapsed=0 - - while (( elapsed < timeout )); do - if ! server_running "$version"; then - return 0 - fi - sleep 1 - ((elapsed += 1)) - done - - mc-kill "$version" --confirm >/dev/null 2>&1 || true - - if ! server_running "$version"; then - return 0 - fi - - echo "Timed out waiting for $version to stop" >&2 - return 1 -} - -disable_noisy_bots_in_ini() { - local ini_file="$1" - local section - - for section in \ - ScriptScheduler \ - DiscordRpc \ - AntiAFK \ - AutoDig \ - AutoAttack \ - PlayerListLogger \ - ReplayCapture - do - sed_in_place "/^\\[ChatBot\\.${section}\\]/,/^\\[/ { s/^Enabled = true/Enabled = false/; }" "$ini_file" - done -} - -remove_stale_stdin_pipe() { - local version="$1" - local pipe_path="$MCC_SERVERS/$version/stdin.pipe" - - if [[ -e "$pipe_path" ]] && ! server_running "$version"; then - rm -f "$pipe_path" - fi -} diff --git a/.skills/mcc-integration-testing/scripts/ensure_offline_server.sh b/.skills/mcc-integration-testing/scripts/ensure_offline_server.sh deleted file mode 100755 index 8ede375b4f..0000000000 --- a/.skills/mcc-integration-testing/scripts/ensure_offline_server.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" -# shellcheck source=tools/mcc-env.sh -source "$REPO_ROOT/tools/mcc-env.sh" -# shellcheck source=.skills/mcc-integration-testing/scripts/common.sh -source "$SCRIPT_DIR/common.sh" - -VERSION="${1:-1.21.11-Vanilla}" -SERVER_DIR="${MCC_SERVERS:?}/$VERSION" -PROPS_FILE="$SERVER_DIR/server.properties" -SESSION_NAME="mc-${VERSION//./_}" - -if [[ ! -d "$SERVER_DIR" ]]; then - echo "Server directory not found: $SERVER_DIR" >&2 - exit 1 -fi - -if [[ ! -f "$SERVER_DIR/eula.txt" ]] || ! grep -Eq '^eula=true$' "$SERVER_DIR/eula.txt"; then - echo "Missing accepted EULA in $SERVER_DIR/eula.txt" >&2 - exit 1 -fi - -server_running() { - mc-list | grep -Fq "$SESSION_NAME" -} - -upsert_property() { - local key="$1" - local value="$2" - - if grep -Eq "^${key}=" "$PROPS_FILE"; then - sed_in_place "s#^${key}=.*#${key}=${value}#" "$PROPS_FILE" - else - printf '%s=%s\n' "$key" "$value" >> "$PROPS_FILE" - fi -} - -if [[ ! -f "$PROPS_FILE" ]]; then - mc-start "$VERSION" - wait_for_server_ready "$VERSION" - mc-stop "$VERSION" --confirm - wait_for_server_stop "$VERSION" -fi - -if server_running; then - mc-stop "$VERSION" --confirm - wait_for_server_stop "$VERSION" -fi - -upsert_property "online-mode" "false" -upsert_property "enforce-secure-profile" "false" -upsert_property "enable-rcon" "true" -upsert_property "rcon.port" "25575" -upsert_property "rcon.password" "test123" - -echo "Configured $VERSION for persistent offline testing" diff --git a/.skills/mcc-integration-testing/scripts/get_server_port.sh b/.skills/mcc-integration-testing/scripts/get_server_port.sh deleted file mode 100644 index 95bceb1aed..0000000000 --- a/.skills/mcc-integration-testing/scripts/get_server_port.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -if [[ $# -ne 1 ]]; then - echo "Usage: $0 " >&2 - exit 1 -fi - -REPO_ROOT="$(cd "$(dirname "$0")/../../.." && pwd)" -SERVER_DIR_NAME="$1" -SERVERS_ROOT="${MCC_SERVERS:-$REPO_ROOT/MinecraftOfficial/downloads}" -SERVER_DIR="$SERVERS_ROOT/$SERVER_DIR_NAME" -PROPS_FILE="$SERVER_DIR/server.properties" -LATEST_LOG="$SERVER_DIR/logs/latest.log" - -if [[ -f "$PROPS_FILE" ]]; then - PORT_LINE="$(grep -E '^server-port=' "$PROPS_FILE" | tail -n 1 || true)" - if [[ -n "$PORT_LINE" ]]; then - PORT="${PORT_LINE#server-port=}" - if [[ "$PORT" =~ ^[0-9]+$ ]]; then - printf '%s\n' "$PORT" - exit 0 - fi - fi -fi - -if [[ -f "$LATEST_LOG" ]]; then - PORT="$(sed -n 's/.*Starting Minecraft server on .*:\([0-9][0-9]*\).*/\1/p' "$LATEST_LOG" | tail -n 1)" - if [[ -n "$PORT" ]]; then - printf '%s\n' "$PORT" - exit 0 - fi -fi - -printf '25565\n' diff --git a/.skills/mcc-integration-testing/scripts/preflight_test_env.sh b/.skills/mcc-integration-testing/scripts/preflight_test_env.sh deleted file mode 100755 index 223760262d..0000000000 --- a/.skills/mcc-integration-testing/scripts/preflight_test_env.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" -# shellcheck source=tools/mcc-env.sh -source "$REPO_ROOT/tools/mcc-env.sh" -# shellcheck source=.skills/mcc-integration-testing/scripts/common.sh -source "$SCRIPT_DIR/common.sh" - -usage() { - cat <<'EOF' -Usage: preflight_test_env.sh [server-dir...] - -Checks the local MCC test environment and resolves common Java path issues. -EOF -} - -if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then - usage - exit 0 -fi - -ensure_java_in_path -command -v tmux >/dev/null 2>&1 || { echo "tmux was not found on PATH." >&2; exit 1; } -command -v dotnet >/dev/null 2>&1 || { echo "dotnet was not found on PATH." >&2; exit 1; } -command -v python3 >/dev/null 2>&1 || { echo "python3 was not found on PATH." >&2; exit 1; } - -if [[ ! -d "$MCC_SERVERS" ]]; then - echo "Server root not found: $MCC_SERVERS" >&2 - exit 1 -fi - -for server_dir in "$@"; do - [[ -z "$server_dir" ]] && continue - if [[ ! -d "$MCC_SERVERS/$server_dir" ]]; then - echo "Server directory not found: $MCC_SERVERS/$server_dir" >&2 - exit 1 - fi - - remove_stale_stdin_pipe "$server_dir" -done - -printf 'MCC_REPO=%s\n' "$MCC_REPO" -printf 'MCC_SERVERS=%s\n' "$MCC_SERVERS" -printf 'JAVA=%s\n' "$(command -v java)" -printf 'TMUX=%s\n' "$(command -v tmux)" -printf 'DOTNET=%s\n' "$(command -v dotnet)" diff --git a/.skills/mcc-integration-testing/scripts/prepare_offline_mcc_config.sh b/.skills/mcc-integration-testing/scripts/prepare_offline_mcc_config.sh deleted file mode 100644 index 1e30f6739c..0000000000 --- a/.skills/mcc-integration-testing/scripts/prepare_offline_mcc_config.sh +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" -# shellcheck source=.skills/mcc-integration-testing/scripts/common.sh -source "$SCRIPT_DIR/common.sh" - -usage() { - cat <<'EOF' >&2 -Usage: - prepare_offline_mcc_config.sh [login] - prepare_offline_mcc_config.sh [login] -EOF -} - -if [[ $# -lt 2 || $# -gt 4 ]]; then - usage - exit 1 -fi - -TEMPLATE_INI="" -OUTPUT_INI="" -MC_VERSION="" -LOGIN_NAME="" - -if [[ $# -ge 3 && -f "$1" ]]; then - TEMPLATE_INI="$1" - OUTPUT_INI="$2" - MC_VERSION="$3" - LOGIN_NAME="${4:-MCCBot}" -else - OUTPUT_INI="$1" - MC_VERSION="$2" - LOGIN_NAME="${3:-MCCBot}" -fi - -ACCOUNT_TYPE="${MCC_TEST_ACCOUNT_TYPE:-mojang}" -PASSWORD_VALUE="${MCC_TEST_PASSWORD-}" - -if [[ "$ACCOUNT_TYPE" != "mojang" && "$ACCOUNT_TYPE" != "microsoft" && "$ACCOUNT_TYPE" != "yggdrasil" ]]; then - echo "Unsupported MCC_TEST_ACCOUNT_TYPE: $ACCOUNT_TYPE" >&2 - exit 1 -fi - -if [[ -z "${MCC_TEST_PASSWORD+x}" ]]; then - if [[ "$ACCOUNT_TYPE" == "mojang" ]]; then - PASSWORD_VALUE="-" - else - PASSWORD_VALUE="" - fi -fi - -generate_template_ini() { - local template_root - template_root="$(mktemp -d "${TMPDIR:-/tmp}/mcc-config-template.XXXXXX")" - - if [[ ! -f "$REPO_ROOT/MinecraftClient/bin/Release/net10.0/MinecraftClient.dll" ]]; then - dotnet build "$REPO_ROOT/MinecraftClient.sln" -c Release -v quiet --nologo >/dev/null - fi - - ( - cd "$template_root" - dotnet run --project "$REPO_ROOT/MinecraftClient" -c Release --no-build -- --help >/dev/null 2>&1 - ) - - if [[ ! -f "$template_root/MinecraftClient.ini" ]]; then - echo "Failed to generate a temporary MCC config template." >&2 - exit 1 - fi - - TEMPLATE_INI="$template_root/MinecraftClient.ini" -} - -if [[ -z "$TEMPLATE_INI" ]]; then - generate_template_ini -fi - -mkdir -p "$(dirname "$OUTPUT_INI")" -cp "$TEMPLATE_INI" "$OUTPUT_INI" - -sed_in_place \ - -e "s#^Account = .*#Account = { Login = \"$LOGIN_NAME\", Password = \"$PASSWORD_VALUE\" }#" \ - -e "s#^AccountType = .*#AccountType = \"$ACCOUNT_TYPE\"#" \ - -e "s#^MinecraftVersion = \"[^\"]*\"\\(.*\\)\$#MinecraftVersion = \"$MC_VERSION\"\\1#" \ - -e 's#^TerrainAndMovements = false#TerrainAndMovements = true#' \ - -e 's#^InventoryHandling = false#InventoryHandling = true#' \ - -e 's#^EntityHandling = false#EntityHandling = true#' \ - -e 's#^AutoRespawn = false#AutoRespawn = true#' \ - "$OUTPUT_INI" - -disable_noisy_bots_in_ini "$OUTPUT_INI" - -grep -Fq "AccountType = \"$ACCOUNT_TYPE\"" "$OUTPUT_INI" || { - echo "Failed to enforce account type $ACCOUNT_TYPE in $OUTPUT_INI" >&2 - exit 1 -} - -if [[ "$ACCOUNT_TYPE" == "mojang" ]]; then - grep -Eq '^Account = \{ Login = ".*", Password = "-" \}' "$OUTPUT_INI" || { - echo "Failed to enforce offline account in $OUTPUT_INI" >&2 - exit 1 - } -fi - -printf '%s\n' "$OUTPUT_INI" diff --git a/.skills/mcc-integration-testing/scripts/reset_shared_test_state.sh b/.skills/mcc-integration-testing/scripts/reset_shared_test_state.sh deleted file mode 100755 index eab7c6941c..0000000000 --- a/.skills/mcc-integration-testing/scripts/reset_shared_test_state.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" -# shellcheck source=tools/mcc-env.sh -source "$REPO_ROOT/tools/mcc-env.sh" -# shellcheck source=.skills/mcc-integration-testing/scripts/common.sh -source "$SCRIPT_DIR/common.sh" - -usage() { - cat <<'EOF' -Usage: reset_shared_test_state.sh [--all | ...] - -Kills shared server tmux test sessions and removes stale server stdin pipes. -EOF -} - -if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then - usage - exit 0 -fi - -kill_named_session() { - local session_name="$1" - tmux kill-session -t "$session_name" 2>/dev/null || true -} - -if [[ $# -eq 0 || "${1:-}" == "--all" ]]; then - while IFS= read -r session_name; do - [[ -z "$session_name" ]] && continue - kill_named_session "$session_name" - done < <(tmux list-sessions 2>/dev/null | awk -F: '/^mc-/{print $1}' || true) - - while IFS= read -r pipe_path; do - [[ -z "$pipe_path" ]] && continue - rm -f "$pipe_path" - done < <(find "$MCC_SERVERS" -maxdepth 2 -name 'stdin.pipe' 2>/dev/null || true) -else - for version in "$@"; do - kill_named_session "$(server_session_name "$version")" - remove_stale_stdin_pipe "$version" - done -fi diff --git a/.skills/mcc-integration-testing/scripts/run_achievements_matrix.sh b/.skills/mcc-integration-testing/scripts/run_achievements_matrix.sh deleted file mode 100755 index 65ff7d3fd9..0000000000 --- a/.skills/mcc-integration-testing/scripts/run_achievements_matrix.sh +++ /dev/null @@ -1,168 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" -# shellcheck source=tools/mcc-env.sh -source "$REPO_ROOT/tools/mcc-env.sh" - -RUN_ROOT="${TMPDIR:-/tmp}/mcc-achievements/matrix" -RUN_ID="$(date +%Y%m%d-%H%M%S)" -MATRIX_DIR="$RUN_ROOT/$RUN_ID" -RESULTS_TSV="$MATRIX_DIR/results.tsv" -BUILD_LOG="$MATRIX_DIR/build.log" -REPORT_MD="$MATRIX_DIR/report.md" -PRECHECK_TXT="$MATRIX_DIR/preflight.txt" - -mkdir -p "$MATRIX_DIR" - -write_row() { - local fields=("$@") - - while (( ${#fields[@]} < 14 )); do - fields+=("") - done - - printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \ - "${fields[0]}" "${fields[1]}" "${fields[2]}" "${fields[3]}" "${fields[4]}" "${fields[5]}" "${fields[6]}" \ - "${fields[7]}" "${fields[8]}" "${fields[9]}" "${fields[10]}" "${fields[11]}" "${fields[12]}" \ - "${fields[13]}" >> "$RESULTS_TSV" -} - -resolve_server_dir() { - local version="$1" - local candidate - - for candidate in "$version" "$version-Vanilla"; do - if [[ -d "$MCC_SERVERS/$candidate" ]]; then - printf '%s\n' "$candidate" - return 0 - fi - done - - return 1 -} - -run_version() { - local version="$1" - local profile="$2" - local family="$3" - local server_dir="$4" - local summary_env - - if bash "$SCRIPT_DIR/run_achievements_test.sh" --no-build "$server_dir" "$version" "$profile"; then - : - fi - - summary_env="${TMPDIR:-/tmp}/mcc-achievements/$server_dir/latest/summary.env" - if [[ ! -f "$summary_env" ]]; then - write_row "$version" "$server_dir" "unknown" "$family" "❌" "❌" "❌" "❌" "❌ Fail" \ - "Summary file was not produced." "" "" "" - return - fi - - # shellcheck disable=SC1090 - source "$summary_env" - - if [[ -n "${MCC_LOG:-}" && ! -f "$MCC_LOG" ]]; then - NOTE="Harness failure: MCC log was not produced." - VERDICT="❌ Fail" - fi - - if [[ -n "${COMMAND_LOG:-}" && ! -f "$COMMAND_LOG" ]]; then - NOTE="Harness failure: command transcript was not produced." - VERDICT="❌ Fail" - fi - - write_row "$VERSION" "$SERVER_DIR" "$PORT" "$FAMILY" "$INITIAL_STATUS" "$GRANT_STATUS" "$REVOKE_STATUS" \ - "$API_STATUS" "$VERDICT" "$NOTE" "$RUN_DIR" "$MCC_LOG" "$COPIED_SERVER_LOG" "$COMMAND_LOG" -} - -{ - printf 'MCC_SERVERS=%s\n' "$MCC_SERVERS" - printf 'RUN_DIR=%s\n' "$MATRIX_DIR" - printf 'DATE=%s\n' "$(date -u '+%Y-%m-%d %H:%M:%S UTC')" -} > "$PRECHECK_TXT" - -printf 'Version\tServerDir\tPort\tFamily\tInitial\tGrant\tRevoke\tAPI\tVerdict\tNote\tRunDir\tMccLog\tServerLog\tCommandLog\n' > "$RESULTS_TSV" - -JAVA_OK="yes" -TMUX_OK="yes" -DOTNET_OK="yes" -BUILD_OK="yes" - -if ! command -v dotnet >/dev/null 2>&1; then - DOTNET_OK="no" -fi - -if ! command -v java >/dev/null 2>&1 || ! java -version >/dev/null 2>&1; then - JAVA_OK="no" -fi - -if ! command -v tmux >/dev/null 2>&1; then - TMUX_OK="no" -fi - -if [[ "$DOTNET_OK" == "yes" ]]; then - bash "$SCRIPT_DIR/preflight_test_env.sh" >/dev/null 2>&1 || true - if ! dotnet build "$REPO_ROOT/MinecraftClient.sln" -c Release > "$BUILD_LOG" 2>&1; then - BUILD_OK="no" - fi -else - : > "$BUILD_LOG" -fi - -{ - printf 'MCC_SERVERS=%s\n' "$MCC_SERVERS" - printf 'RUN_DIR=%s\n' "$MATRIX_DIR" - printf 'DATE=%s\n' "$(date -u '+%Y-%m-%d %H:%M:%S UTC')" - printf 'dotnet=%s\n' "$DOTNET_OK" - printf 'java=%s\n' "$JAVA_OK" - printf 'tmux=%s\n' "$TMUX_OK" - printf 'build=%s\n' "$BUILD_OK" -} > "$PRECHECK_TXT" - -while IFS='|' read -r version profile family; do - [[ -z "$version" ]] && continue - - if [[ "$DOTNET_OK" != "yes" ]]; then - write_row "$version" "" "" "$family" "❌" "❌" "❌" "❌" "❌ Fail" \ - "dotnet is not available on PATH." - continue - fi - - if [[ "$BUILD_OK" != "yes" ]]; then - write_row "$version" "" "" "$family" "❌" "❌" "❌" "❌" "❌ Fail" \ - "dotnet build failed. See $BUILD_LOG." - continue - fi - - if [[ "$JAVA_OK" != "yes" || "$TMUX_OK" != "yes" ]]; then - write_row "$version" "" "" "$family" "❌" "❌" "❌" "❌" "❌ Fail" \ - "java or tmux is not available, so live server execution was blocked." - continue - fi - - if ! server_dir="$(resolve_server_dir "$version")"; then - write_row "$version" "" "" "$family" "❌" "❌" "❌" "❌" "⚠️ Partial" \ - "Server directory for $version was not found under $MCC_SERVERS." - continue - fi - - run_version "$version" "$profile" "$family" "$server_dir" -done <<'EOF' -1.8|legacy|Legacy 🧱 -1.11.2|legacy|Legacy 🧱 -1.12.2|modern|First advancements 🌱 -1.19.4|modern|Stable modern ✅ -1.20|modern|Telemetry edge 1 ⚠️ -1.20.2|modern|Telemetry edge 2 ⚠️ -1.20.4|modern|End of 1.20.x ⚠️ -1.20.6|modern|Post-1.20.6 🔧 -1.21.2|modern|1.21.2 family 🔧 -1.21.11|modern|showAdvancements 🆕 -26.1|modern|Latest supported 🚀 -EOF - -bash "$SCRIPT_DIR/summarize_achievements_matrix.sh" "$MATRIX_DIR" > "$REPORT_MD" -printf '%s\n' "$MATRIX_DIR" diff --git a/.skills/mcc-integration-testing/scripts/run_achievements_test.sh b/.skills/mcc-integration-testing/scripts/run_achievements_test.sh deleted file mode 100755 index 1484acd6ed..0000000000 --- a/.skills/mcc-integration-testing/scripts/run_achievements_test.sh +++ /dev/null @@ -1,399 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" -# shellcheck source=tools/mcc-env.sh -source "$REPO_ROOT/tools/mcc-env.sh" -# shellcheck source=.skills/mcc-integration-testing/scripts/common.sh -source "$SCRIPT_DIR/common.sh" - -usage() { - cat <<'EOF' -Usage: run_achievements_test.sh [--no-build] - -Examples: - .skills/mcc-integration-testing/scripts/run_achievements_test.sh --no-build 1.8 1.8 legacy - .skills/mcc-integration-testing/scripts/run_achievements_test.sh --no-build 1.21.11-Vanilla 1.21.11 modern -EOF -} - -DO_BUILD=true - -while [[ $# -gt 0 ]]; do - case "$1" in - --no-build) DO_BUILD=false; shift ;; - --build) DO_BUILD=true; shift ;; - -h|--help) usage; exit 0 ;; - *) break ;; - esac -done - -if [[ $# -ne 3 ]]; then - usage >&2 - exit 1 -fi - -SERVER_DIR="$1" -MC_VERSION="$2" -PROFILE="$3" -SESSION_NAME="achievements-${SERVER_DIR//[^a-zA-Z0-9]/_}-${PROFILE}" -TEST_USERNAME="$(_mcc_resolve_username "$SESSION_NAME")" - -if [[ "$PROFILE" != "legacy" && "$PROFILE" != "modern" ]]; then - echo "Unsupported profile: $PROFILE" >&2 - exit 1 -fi - -RUN_ROOT="${TMPDIR:-/tmp}/mcc-achievements" -RUN_ID="$(date +%Y%m%d-%H%M%S)" -RUN_DIR="$RUN_ROOT/$SERVER_DIR/$RUN_ID" -LATEST_LINK="$RUN_ROOT/$SERVER_DIR/latest" -MCC_LOG="$RUN_DIR/mcc.log" -BUILD_LOG="$RUN_DIR/build.log" -SERVER_TMUX_LOG="$RUN_DIR/server-tmux.log" -SERVER_FILE_LOG="$RUN_DIR/server-latest.log" -COMMAND_LOG="$RUN_DIR/commands.log" -SUMMARY_ENV="$RUN_DIR/summary.env" -PROBE_SCRIPT="$RUN_DIR/achievement_probe.cs" -CFG="$RUN_DIR/MinecraftClient.$MC_VERSION.ini" -INPUT_FILE="$(_mcc_session_input_file "$SESSION_NAME")" -SERVER_LOG_FILE="$MCC_SERVERS/$SERVER_DIR/logs/latest.log" -TARGET_ID="minecraft:story/root" -TARGET_COMMAND_GRANT="advancement grant $TEST_USERNAME only minecraft:story/root" -TARGET_COMMAND_REVOKE="advancement revoke $TEST_USERNAME only minecraft:story/root" -TARGET_TYPE="Modern 🌱" -PORT="unknown" -MCC_PID="" - -INITIAL_STATUS="❌" -GRANT_STATUS="❌" -REVOKE_STATUS="❌" -API_STATUS="❌" -VERDICT="❌ Fail" -NOTE="Run did not complete." -EXECUTED="yes" - -if [[ "$PROFILE" == "legacy" ]]; then - TARGET_ID="achievement.openInventory" - TARGET_COMMAND_GRANT="achievement give achievement.openInventory $TEST_USERNAME" - TARGET_COMMAND_REVOKE="achievement take achievement.openInventory $TEST_USERNAME" - TARGET_TYPE="Legacy 🧱" -fi - -mkdir -p "$RUN_DIR" - -write_summary() { - { - printf 'VERSION=%q\n' "$MC_VERSION" - printf 'SERVER_DIR=%q\n' "$SERVER_DIR" - printf 'PROFILE=%q\n' "$PROFILE" - printf 'FAMILY=%q\n' "$TARGET_TYPE" - printf 'PORT=%q\n' "$PORT" - printf 'RUN_DIR=%q\n' "$RUN_DIR" - printf 'MCC_LOG=%q\n' "$MCC_LOG" - printf 'SERVER_LOG=%q\n' "$RUN_DIR/server-latest.log" - printf 'SERVER_FILE_LOG=%q\n' "$SERVER_LOG_FILE" - printf 'SERVER_TMUX_LOG=%q\n' "$SERVER_TMUX_LOG" - printf 'COPIED_SERVER_LOG=%q\n' "$RUN_DIR/server-latest.log" - printf 'COMMAND_LOG=%q\n' "$COMMAND_LOG" - printf 'SUMMARY_ENV=%q\n' "$SUMMARY_ENV" - printf 'TARGET_ID=%q\n' "$TARGET_ID" - printf 'INITIAL_STATUS=%q\n' "$INITIAL_STATUS" - printf 'GRANT_STATUS=%q\n' "$GRANT_STATUS" - printf 'REVOKE_STATUS=%q\n' "$REVOKE_STATUS" - printf 'API_STATUS=%q\n' "$API_STATUS" - printf 'VERDICT=%q\n' "$VERDICT" - printf 'NOTE=%q\n' "$NOTE" - printf 'EXECUTED=%q\n' "$EXECUTED" - } > "$SUMMARY_ENV" -} - -capture_server_logs() { - mc-log "$SERVER_DIR" 400 > "$SERVER_TMUX_LOG" 2>/dev/null || true - if [[ -f "$SERVER_LOG_FILE" ]]; then - cp "$SERVER_LOG_FILE" "$RUN_DIR/server-latest.log" 2>/dev/null || true - fi -} - -cleanup() { - capture_server_logs - - if [[ -n "${MCC_PID:-}" ]] && kill -0 "$MCC_PID" 2>/dev/null; then - echo "quit" >> "$INPUT_FILE" 2>/dev/null || true - sleep 2 - kill "$MCC_PID" 2>/dev/null || true - wait "$MCC_PID" 2>/dev/null || true - fi - - mc-stop "$SERVER_DIR" --confirm >/dev/null 2>&1 || true - wait_for_server_stop "$SERVER_DIR" 20 >/dev/null 2>&1 || true - ln -sfn "$RUN_DIR" "$LATEST_LINK" - write_summary -} -trap cleanup EXIT - -log_step() { - printf '[%s] %s\n' "$(date '+%H:%M:%S')" "$1" | tee -a "$COMMAND_LOG" -} - -fail() { - NOTE="$1" - VERDICT="❌ Fail" - exit 1 -} - -wait_for_file_pattern() { - local file="$1" - local pattern="$2" - local description="$3" - local timeout="${4:-60}" - local elapsed=0 - - while (( elapsed < timeout )); do - if [[ -f "$file" ]] && grep -Fq "$pattern" "$file"; then - return 0 - fi - sleep 1 - ((elapsed += 1)) - done - - echo "Timed out waiting for: $description" >&2 - return 1 -} - -write_probe_script() { - cat > "$PROBE_SCRIPT" < updated, IReadOnlyList removedIds, bool reset) - { - LogToConsole($"[ACH_TEST] event reset={reset} updated={updated.Count} removed={removedIds.Count}"); - DumpState("event"); - } - - private void DumpState(string origin) - { - Achievement[] all = GetAchievements(); - Achievement[] unlocked = GetUnlockedAchievements(); - Achievement[] locked = GetLockedAchievements(); - Achievement? target = null; - - foreach (Achievement entry in all) - { - if (entry.Id == TargetId) - { - target = entry; - break; - } - } - - string titleState = "missing"; - string completionState = "missing"; - - if (target is not null) - { - titleState = target.Title is null ? "null" : "present"; - completionState = target.IsCompleted ? "done" : "todo"; - } - - LogToConsole($"[ACH_TEST] snapshot origin={origin} all={all.Length} unlocked={unlocked.Length} locked={locked.Length}"); - LogToConsole($"[ACH_TEST] target_state origin={origin} id={TargetId} title={titleState} completed={completionState}"); - } -} -EOF -} - -run_server_command() { - local cmd="$1" - local attempt - - log_step "SERVER> $cmd" - for attempt in 1 2 3 4 5; do - if mc-rcon "$cmd" >/dev/null 2>&1; then - sleep 1 - return 0 - fi - sleep 1 - done - - fail "Server command failed: $cmd" -} - -run_mcc_command() { - local name="$1" - local cmd="$2" - local delay="${3:-2}" - local start_line=0 - local end_line=0 - - if [[ -f "$MCC_LOG" ]]; then - start_line="$(wc -l < "$MCC_LOG")" - fi - - log_step "MCC> $cmd" - echo "$cmd" >> "$INPUT_FILE" - sleep "$delay" - - if [[ -f "$MCC_LOG" ]]; then - end_line="$(wc -l < "$MCC_LOG")" - fi - - if (( end_line > start_line )); then - sed -n "$((start_line + 1)),$((end_line))p" "$MCC_LOG" > "$RUN_DIR/$name.mcc.log" - else - : > "$RUN_DIR/$name.mcc.log" - fi -} - -assert_pattern() { - local file="$1" - local pattern="$2" - local description="$3" - - grep -Fq "$pattern" "$file" || fail "$description" -} - -if $DO_BUILD; then - log_step "BUILD> dotnet build MinecraftClient.sln -c Release" - mcc-build > "$BUILD_LOG" 2>&1 || fail "dotnet build failed." -else - : > "$BUILD_LOG" -fi - -bash "$SCRIPT_DIR/preflight_test_env.sh" "$SERVER_DIR" >/dev/null || fail "Test environment preflight failed." -bash "$SCRIPT_DIR/reset_shared_test_state.sh" "$SERVER_DIR" >/dev/null || fail "Failed to reset shared test state." - -if [[ ! -d "$MCC_SERVERS/$SERVER_DIR" ]]; then - fail "Server directory not found: $MCC_SERVERS/$SERVER_DIR" -fi - -bash "$SCRIPT_DIR/prepare_offline_mcc_config.sh" "$CFG" "$MC_VERSION" "$TEST_USERNAME" >/dev/null || fail "Failed to prepare temporary MCC config." -PORT="$(bash "$SCRIPT_DIR/get_server_port.sh" "$SERVER_DIR")" - -"$SCRIPT_DIR/ensure_offline_server.sh" "$SERVER_DIR" -write_probe_script - -if [[ "$PROFILE" == "legacy" && -f "$MCC_SERVERS/$SERVER_DIR/server.properties" ]]; then - sed_in_place 's/^use-native-transport=.*/use-native-transport=false/' "$MCC_SERVERS/$SERVER_DIR/server.properties" -fi - -mkdir -p "$(dirname "$INPUT_FILE")" -: > "$INPUT_FILE" -rm -f "$MCC_LOG" - -log_step "Starting server $SERVER_DIR on port $PORT" -mc-start "$SERVER_DIR" >/dev/null -wait_for_server_ready "$SERVER_DIR" || fail "Server did not become ready." - -log_step "Starting MCC for $MC_VERSION" -( - cd "$REPO_ROOT" - MCC_FILE_INPUT=1 MCC_INPUT_FILE="$INPUT_FILE" dotnet run --project MinecraftClient -c Release --no-build -- \ - "$CFG" \ - "$TEST_USERNAME" \ - - \ - "localhost:$PORT" \ - "--accounttype=mojang" \ - "--minecraftversion=$MC_VERSION" \ - "--terrainandmovements=true" \ - "--inventoryhandling=true" \ - "--entityhandling=true" \ - "--autorespawn=true" \ - "--debugmessages=true" \ - > "$MCC_LOG" 2>&1 -) & -MCC_PID=$! - -wait_for_file_pattern "$MCC_LOG" "Server was successfully joined." "MCC join success" 90 || fail "MCC failed to join." -wait_for_file_pattern "$SERVER_LOG_FILE" "$TEST_USERNAME joined the game" "server join entry" 30 || fail "Server never logged the join." - -run_server_command "op $TEST_USERNAME" -run_server_command "gamerule sendCommandFeedback true" -if [[ "$PROFILE" == "modern" ]]; then - run_server_command "gamerule logAdminCommands true" -fi -run_server_command "time set day" -run_server_command "weather clear" - -run_mcc_command "load_probe" "script $PROBE_SCRIPT" 3 -wait_for_file_pattern "$MCC_LOG" "[ACH_TEST] probe initialized" "probe startup" 30 || fail "Probe script did not initialize." - -run_mcc_command "baseline_debug" "debug state" 2 -run_mcc_command "baseline_all" "achievement" 2 -run_mcc_command "baseline_locked" "achievement locked" 2 -run_mcc_command "baseline_unlocked" "achievement unlocked" 2 - -run_server_command "$TARGET_COMMAND_GRANT" -sleep 3 -run_mcc_command "after_grant_all" "achievement" 2 -run_mcc_command "after_grant_unlocked" "achievement unlocked" 2 - -run_server_command "$TARGET_COMMAND_REVOKE" -sleep 3 -run_mcc_command "after_revoke_all" "achievement" 2 -run_mcc_command "after_revoke_locked" "achievement locked" 2 - -assert_pattern "$MCC_LOG" "Achievements/Advancements:" "Achievement command header never appeared." - -if ! grep -Fq "No achievements/advancements received yet." "$RUN_DIR/baseline_all.mcc.log"; then - INITIAL_STATUS="✅" -fi - -if grep -Fq "$TARGET_ID" "$RUN_DIR/after_grant_unlocked.mcc.log" && grep -Fq "[DONE]" "$RUN_DIR/after_grant_unlocked.mcc.log"; then - GRANT_STATUS="✅" -fi - -if [[ "$PROFILE" == "legacy" ]]; then - if grep -Fq "$TARGET_ID" "$RUN_DIR/after_revoke_locked.mcc.log" && grep -Fq "[TODO]" "$RUN_DIR/after_revoke_locked.mcc.log"; then - REVOKE_STATUS="✅" - fi -else - if grep -Fq "$TARGET_ID" "$RUN_DIR/after_revoke_locked.mcc.log" && grep -Fq "[TODO]" "$RUN_DIR/after_revoke_locked.mcc.log"; then - REVOKE_STATUS="✅" - elif [[ "$GRANT_STATUS" == "✅" ]] && ! grep -Fq "$TARGET_ID" "$RUN_DIR/after_revoke_all.mcc.log"; then - REVOKE_STATUS="✅" - fi -fi - -if grep -Fq "[ACH_TEST] event" "$MCC_LOG" && grep -Fq "target_state origin=event id=$TARGET_ID title=" "$MCC_LOG"; then - API_STATUS="✅" -fi - -case "$INITIAL_STATUS|$GRANT_STATUS|$REVOKE_STATUS|$API_STATUS" in - "✅|✅|✅|✅") - VERDICT="✅ Pass" - NOTE="All planned achievement checks passed." - ;; - *"✅"*) - VERDICT="⚠️ Partial" - NOTE="At least one achievement phase passed, but the matrix did not fully clear." - ;; - *) - VERDICT="❌ Fail" - NOTE="Achievement checks did not produce the expected evidence." - ;; -esac - -run_mcc_command "quit" "quit" 2 -NOTE="$NOTE Artifacts saved in $RUN_DIR." diff --git a/.skills/mcc-integration-testing/scripts/run_full_spectrum_test.sh b/.skills/mcc-integration-testing/scripts/run_full_spectrum_test.sh deleted file mode 100755 index 181862a8cd..0000000000 --- a/.skills/mcc-integration-testing/scripts/run_full_spectrum_test.sh +++ /dev/null @@ -1,336 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" -# shellcheck source=tools/mcc-env.sh -source "$REPO_ROOT/tools/mcc-env.sh" -# shellcheck source=.skills/mcc-integration-testing/scripts/common.sh -source "$SCRIPT_DIR/common.sh" - -VERSION="${1:-1.21.11-Vanilla}" -MC_VERSION="${VERSION%-Vanilla}" -if [[ "$MC_VERSION" == "$VERSION" ]]; then - MC_VERSION="$VERSION" -fi -RUN_ROOT="${TMPDIR:-/tmp}/mcc-integration-testing" -RUN_ID="$(date +%Y%m%d-%H%M%S)" -RUN_DIR="$RUN_ROOT/$RUN_ID" -SERVER_LOG_FILE="$MCC_SERVERS/$VERSION/logs/latest.log" -SESSION_NAME="full-spectrum-${MC_VERSION//[^a-zA-Z0-9]/_}" -TEST_USERNAME="$(_mcc_resolve_username "$SESSION_NAME")" -MCC_LOG="$(_mcc_session_log_file "$SESSION_NAME")" -PID_FILE="$(_mcc_session_pid_file "$SESSION_NAME")" -MCC_TMUX_SESSION="$(_mcc_tmux_session_name "$SESSION_NAME")" -BUILD_LOG="$RUN_DIR/build.log" -SERVER_TMUX_LOG="$RUN_DIR/server-tmux.log" -SERVER_FILE_LOG="$RUN_DIR/server-latest.log" -INPUT_FILE="$(_mcc_session_input_file "$SESSION_NAME")" -CFG="$RUN_DIR/MinecraftClient.$MC_VERSION.ini" - -mkdir -p "$RUN_DIR" - -cleanup() { - mcc-cmd --session "$SESSION_NAME" "quit" >/dev/null 2>&1 || true - sleep 2 - mcc-kill --session "$SESSION_NAME" >/dev/null 2>&1 || true - - mc-stop "$VERSION" --confirm >/dev/null 2>&1 || true - wait_for_server_stop "$VERSION" 20 >/dev/null 2>&1 || true -} -trap cleanup EXIT - -prepare_config() { - bash "$SCRIPT_DIR/prepare_offline_mcc_config.sh" "$CFG" "$MC_VERSION" "$TEST_USERNAME" >/dev/null -} - -wait_for_server_log_pattern() { - local pattern="$1" - local description="$2" - local timeout="${3:-60}" - local elapsed=0 - - while (( elapsed < timeout )); do - if [[ -f "$SERVER_LOG_FILE" ]] && grep -Fq "$pattern" "$SERVER_LOG_FILE"; then - return 0 - fi - sleep 1 - ((elapsed += 1)) - done - - echo "Timed out waiting for server log: $description" >&2 - return 1 -} - -capture_server_logs() { - mc-log "$VERSION" 400 > "$SERVER_TMUX_LOG" 2>/dev/null || true - if [[ -f "$SERVER_LOG_FILE" ]]; then - cp "$SERVER_LOG_FILE" "$SERVER_FILE_LOG" - fi -} - -wait_for_file_pattern() { - local file="$1" - local pattern="$2" - local description="$3" - local timeout="${4:-60}" - local elapsed=0 - - while (( elapsed < timeout )); do - if [[ -f "$file" ]] && grep -Fq "$pattern" "$file"; then - return 0 - fi - sleep 1 - ((elapsed += 1)) - done - - echo "Timed out waiting for: $description" >&2 - return 1 -} - -fail() { - capture_server_logs - echo "FAIL: $1" >&2 - echo "Run directory: $RUN_DIR" >&2 - exit 1 -} - -assert_contains() { - local file="$1" - local pattern="$2" - local description="$3" - - grep -Fq "$pattern" "$file" || fail "$description" -} - -assert_not_contains() { - local file="$1" - local pattern="$2" - local description="$3" - - if grep -Fq "$pattern" "$file"; then - fail "$description" - fi -} - -run_server_command() { - local cmd="$1" - local attempt - echo "SERVER> $cmd" - for attempt in 1 2 3 4 5; do - if mc-rcon "$cmd" >/dev/null 2>&1; then - return 0 - fi - sleep 1 - done - fail "Server command failed: $cmd" -} - -run_mcc_command() { - local cmd="$1" - echo "MCC> $cmd" - mcc-cmd --session "$SESSION_NAME" "$cmd" - sleep 2 -} - -start_mcc_session() { - local -a mcc_args=("$CFG" "$TEST_USERNAME" "-" "localhost:$SERVER_PORT") - local mcc_args_cmd - mcc_args_cmd="$(printf '%q ' "${mcc_args[@]}")" - - tmux kill-session -t "$MCC_TMUX_SESSION" 2>/dev/null || true - rm -f "$PID_FILE" - tmux new-session -d -s "$MCC_TMUX_SESSION" -x 160 -y 50 \ - "cd '$REPO_ROOT' && printf '%s\n' \"\$\$\" > '$PID_FILE' && exec env MCC_FILE_INPUT=1 MCC_INPUT_FILE='$INPUT_FILE' dotnet run --project MinecraftClient -c Release --no-build -- $mcc_args_cmd > '$MCC_LOG' 2>&1" - - for _ in $(seq 1 25); do - if [[ -s "$PID_FILE" ]]; then - return 0 - fi - sleep 0.2 - done - - fail "Failed to capture MCC PID for session $SESSION_NAME" -} - -bash "$SCRIPT_DIR/preflight_test_env.sh" "$VERSION" >/dev/null -bash "$SCRIPT_DIR/reset_shared_test_state.sh" "$VERSION" >/dev/null -"$SCRIPT_DIR/ensure_offline_server.sh" "$VERSION" -mcc-reset-session --session "$SESSION_NAME" >/dev/null -echo "Building MCC..." -mcc-build > "$BUILD_LOG" 2>&1 || fail "mcc-build failed" -prepare_config -SERVER_PORT="$(bash "$SCRIPT_DIR/get_server_port.sh" "$VERSION")" -if [[ -z "$SERVER_PORT" ]]; then - fail "Failed to resolve server port" -fi - -mkdir -p "$(dirname "$INPUT_FILE")" "$(dirname "$MCC_LOG")" -: > "$INPUT_FILE" -rm -f "$MCC_LOG" - -echo "Starting server..." -mc-start "$VERSION" >/dev/null -wait_for_server_ready "$VERSION" || fail "Server did not become ready" - -echo "Starting MCC..." -start_mcc_session - -wait_for_file_pattern "$MCC_LOG" "Server was successfully joined." "MCC join success" 90 || fail "MCC failed to join" -wait_for_server_log_pattern "$TEST_USERNAME joined the game" "server join entry" 30 || fail "Server never logged the join" - -run_server_command "op $TEST_USERNAME" -run_server_command "gamerule sendCommandFeedback true" -run_server_command "gamerule logAdminCommands true" -run_server_command "time set day" -run_server_command "weather clear" -sleep 2 - -# ── Phase 1: Basic status and info commands ── -run_mcc_command "health" -run_mcc_command "list" -run_mcc_command "inventory player list" -run_mcc_command "/gamemode creative" -run_mcc_command "inventory creativegive 36 Diamond 16" -run_mcc_command "inventory player list" -run_mcc_command "entity" -run_mcc_command "/time query daytime" -run_mcc_command "smoke_test_from_mcc_full_spectrum" - -# ── Phase 2: Movement and look commands ── -run_mcc_command "/tp $TEST_USERNAME 0 -60 0" -sleep 3 -run_mcc_command "look up" -sleep 1 -run_mcc_command "look down" -sleep 1 -run_mcc_command "look east" -sleep 1 - -# ── Phase 3: Advanced inventory operations ── -run_mcc_command "inventory creativegive 37 IronSword 1" -run_mcc_command "inventory creativegive 38 GoldenApple 8" -run_mcc_command "inventory player list" -run_mcc_command "inventory creativeclear 38" -run_mcc_command "inventory player list" - -# ── Phase 4: Block placement and interaction ── -run_server_command "execute as $TEST_USERNAME at @s run fill ~1 ~ ~1 ~3 ~2 ~3 minecraft:stone" -sleep 2 -run_server_command "execute as $TEST_USERNAME at @s run setblock ~5 ~ ~5 minecraft:chest" -sleep 1 -run_server_command "execute as $TEST_USERNAME at @s run setblock ~5 ~1 ~5 minecraft:furnace" -sleep 1 -run_server_command "execute as $TEST_USERNAME at @s run setblock ~6 ~ ~5 minecraft:crafting_table" -sleep 1 - -# ── Phase 5: Entity spawning (expanded coverage) ── -run_server_command "execute as $TEST_USERNAME at @s run summon minecraft:cow ~2 ~ ~" -run_server_command "execute as $TEST_USERNAME at @s run summon minecraft:zombie ~4 ~ ~" -run_server_command "execute as $TEST_USERNAME at @s run summon minecraft:creeper ~6 ~ ~" -run_server_command "execute as $TEST_USERNAME at @s run summon minecraft:skeleton ~8 ~ ~" -run_server_command "execute as $TEST_USERNAME at @s run summon minecraft:villager ~-2 ~ ~" -run_server_command "execute as $TEST_USERNAME at @s run summon minecraft:allay ~-4 ~ ~" -run_server_command "execute as $TEST_USERNAME at @s run summon minecraft:armor_stand ~ ~ ~2" -run_server_command "execute as $TEST_USERNAME at @s run summon minecraft:item_display ~-6 ~ ~ {item:{id:\"minecraft:diamond\",count:1}}" -run_server_command "execute as $TEST_USERNAME at @s run summon minecraft:spider ~10 ~ ~" -run_server_command "execute as $TEST_USERNAME at @s run summon minecraft:pig ~-8 ~ ~" - -sleep 2 -run_mcc_command "entity" - -# ── Phase 6: Effects and environment ── -run_server_command "effect give $TEST_USERNAME minecraft:speed 30 1" -sleep 2 -run_mcc_command "health" -run_server_command "effect give $TEST_USERNAME minecraft:regeneration 10 1" -sleep 2 -run_mcc_command "health" - -# ── Phase 7: Gamemode cycling ── -run_mcc_command "/gamemode survival" -sleep 2 -run_mcc_command "health" -run_mcc_command "/gamemode creative" -sleep 2 - -# ── Phase 8: Dimension change (nether) ── -run_server_command "execute in minecraft:the_nether run tp $TEST_USERNAME 0 64 0" -sleep 4 -run_mcc_command "health" -run_server_command "execute in minecraft:overworld run tp $TEST_USERNAME 0 -60 0" -sleep 4 - -# ── Phase 9: Server chat and whisper ── -run_server_command "say Hello from the server console" -sleep 2 -run_server_command "msg $TEST_USERNAME This is a private whisper" -sleep 2 -run_mcc_command "integration_test_chat_response" - -# ── Phase 10: Particles, sounds, and explosions ── -run_server_command "execute as $TEST_USERNAME at @s run particle minecraft:happy_villager ~ ~1 ~ 0.5 0.5 0.5 0 12 force" -run_server_command "execute as $TEST_USERNAME at @s run particle minecraft:end_rod ~ ~1 ~ 0.5 0.5 0.5 0.01 20 force" -run_server_command "execute as $TEST_USERNAME at @s run particle minecraft:explosion ~ ~1 ~ 0 0 0 0 1 force" -run_server_command "execute as $TEST_USERNAME at @s run particle minecraft:totem_of_undying ~ ~1 ~ 0.5 0.5 0.5 0.1 20 force" -run_server_command "execute as $TEST_USERNAME at @s run particle minecraft:flame ~ ~1 ~ 0.2 0.2 0.2 0.02 30 force" -run_server_command "execute as $TEST_USERNAME at @s run particle minecraft:heart ~ ~2 ~ 0.3 0.3 0.3 0 5 force" - -run_server_command "execute as $TEST_USERNAME at @s run playsound minecraft:entity.lightning_bolt.thunder master $TEST_USERNAME ~ ~ ~ 1 1 0" -run_server_command "execute as $TEST_USERNAME at @s run playsound minecraft:block.note_block.bell master $TEST_USERNAME ~ ~ ~ 1 1 0" -run_server_command "execute as $TEST_USERNAME at @s run playsound minecraft:entity.experience_orb.pickup master $TEST_USERNAME ~ ~ ~ 1 1 0" - -run_server_command "execute as $TEST_USERNAME at @s run summon minecraft:tnt ~3 ~ ~" -sleep 2 -run_server_command "execute as $TEST_USERNAME at @s run summon minecraft:tnt ~6 ~ ~" - -# ── Phase 11: Kill and respawn cycle ── -run_mcc_command "/gamemode survival" -sleep 2 -run_server_command "kill $TEST_USERNAME" -sleep 4 -run_mcc_command "respawn" -sleep 4 -run_mcc_command "health" -run_mcc_command "/gamemode creative" -sleep 2 - -sleep 6 -capture_server_logs - -# ── Assertions: MCC log ── -assert_contains "$MCC_LOG" "Server was successfully joined." "MCC never joined the server" -assert_contains "$MCC_LOG" "[FileInput] > inventory player list" "Inventory command was not executed" -assert_contains "$MCC_LOG" "[FileInput] > entity" "Entity command was not executed" -assert_contains "$MCC_LOG" "[FileInput] > /gamemode creative" "Creative mode command was not executed from MCC" -assert_contains "$MCC_LOG" "Requested Diamond x16 in slot #36" "Creative inventory give did not succeed" -assert_contains "$MCC_LOG" "smoke_test_from_mcc_full_spectrum" "Client-originated chat was not observed" -assert_contains "$MCC_LOG" "[FileInput] > look up" "Look command was not executed" -assert_contains "$MCC_LOG" "[FileInput] > /gamemode survival" "Survival mode switch was not executed" -assert_contains "$MCC_LOG" "[FileInput] > respawn" "Respawn command was not executed" -assert_contains "$MCC_LOG" "[FileInput] > health" "Health command was not executed" -assert_contains "$MCC_LOG" "integration_test_chat_response" "Chat response test message was not observed" -assert_not_contains "$MCC_LOG" "Please enable InventoryHandling" "Inventory handling is still disabled" -assert_not_contains "$MCC_LOG" "Please enable EntityHandling" "Entity handling is still disabled" -assert_not_contains "$MCC_LOG" "You must be in Creative gamemode" "Creative mode was not active when creativegive ran" -assert_not_contains "$MCC_LOG" "Failed to load settings" "MCC failed to reload its config" -assert_not_contains "$MCC_LOG" "NullReferenceException" "A NullReferenceException occurred during the test" - -# ── Assertions: Server log ── -assert_contains "$SERVER_FILE_LOG" "$TEST_USERNAME joined the game" "Server never saw $TEST_USERNAME join" -assert_contains "$SERVER_FILE_LOG" "smoke_test_from_mcc_full_spectrum" "Server never received the client chat message" -assert_contains "$SERVER_FILE_LOG" "Displaying particle minecraft:happy_villager" "Particle events were not recorded on the server" -assert_contains "$SERVER_FILE_LOG" "Played sound minecraft:block.note_block.bell to $TEST_USERNAME" "Sound events were not recorded on the server" -assert_contains "$SERVER_FILE_LOG" "Summoned new Primed TNT" "TNT summon did not occur on the server" -assert_contains "$SERVER_FILE_LOG" "integration_test_chat_response" "Server never received the chat response test message" -assert_contains "$SERVER_FILE_LOG" "Hello from the server console" "Server say command was not logged" -assert_contains "$SERVER_FILE_LOG" "Killed $TEST_USERNAME" "Server kill command did not execute" -assert_not_contains "$SERVER_FILE_LOG" "Sending unknown packet 'clientbound/minecraft:disconnect'" "Server hit the disconnect packet regression during the test" - -cat <&2 - return 1 -} - -wait_for_server_log_pattern() { - local pattern="$1" - local description="$2" - local timeout="${3:-60}" - local elapsed=0 - - while (( elapsed < timeout )); do - if [[ -f "$SERVER_LOG_FILE" ]] && grep -Fq "$pattern" "$SERVER_LOG_FILE"; then - return 0 - fi - sleep 1 - ((elapsed += 1)) - done - - echo "Timed out waiting for server log: $description" >&2 - return 1 -} - -capture_server_logs() { - mc-log "$VERSION" 400 > "$SERVER_TMUX_LOG" 2>/dev/null || true - if [[ -f "$SERVER_LOG_FILE" ]]; then - cp "$SERVER_LOG_FILE" "$SERVER_FILE_LOG" - fi -} - -fail() { - capture_server_logs - echo "FAIL: $1" >&2 - echo "Run directory: $RUN_DIR" >&2 - exit 1 -} - -cleanup() { - mcc-cmd --session "$SESSION_A" "quit" >/dev/null 2>&1 || true - mcc-cmd --session "$SESSION_B" "quit" >/dev/null 2>&1 || true - sleep 1 - mcc-kill --session "$SESSION_A" >/dev/null 2>&1 || true - mcc-kill --session "$SESSION_B" >/dev/null 2>&1 || true - mc-stop "$VERSION" --confirm >/dev/null 2>&1 || true - wait_for_server_stop "$VERSION" 20 >/dev/null 2>&1 || true -} -trap cleanup EXIT - -assert_session_alive() { - local session="$1" - local pid_file="$2" - if [[ -s "$pid_file" ]]; then - local pid - pid="$(tr -cd '0-9' < "$pid_file")" - if [[ -n "$pid" ]] && kill -0 "$pid" 2>/dev/null; then - return 0 - fi - fi - - tmux has-session -t "$(_mcc_tmux_session_name "$session")" 2>/dev/null -} - -assert_server_alive() { - server_running "$VERSION" || fail "Shared server session is not alive" -} - -start_file_input_session() { - local session="$1" - local username="$2" - local port="$3" - bash "$REPO_ROOT/tools/mcc-debug.sh" \ - --version "$VERSION" \ - --port "$port" \ - --file-input \ - --no-build \ - --session "$session" \ - --username "$username" >/dev/null -} - -bash "$SCRIPT_DIR/preflight_test_env.sh" "$VERSION" >/dev/null -bash "$SCRIPT_DIR/reset_shared_test_state.sh" "$VERSION" >/dev/null -"$SCRIPT_DIR/ensure_offline_server.sh" "$VERSION" >/dev/null -mcc-reset-session --session "$SESSION_A" >/dev/null -mcc-reset-session --session "$SESSION_B" >/dev/null - -echo "Building MCC..." -mcc-build > "$BUILD_LOG" 2>&1 || fail "mcc-build failed" - -echo "Starting shared server..." -mc-start "$VERSION" >/dev/null -wait_for_server_ready "$VERSION" || fail "Server did not become ready" -SERVER_PORT="$(bash "$SCRIPT_DIR/get_server_port.sh" "$VERSION")" -if [[ -z "$SERVER_PORT" ]]; then - fail "Failed to resolve server port" -fi - -echo "Starting MCC session A..." -start_file_input_session "$SESSION_A" "$USERNAME_A" "$SERVER_PORT" -echo "Starting MCC session B..." -start_file_input_session "$SESSION_B" "$USERNAME_B" "$SERVER_PORT" - -wait_for_file_pattern "$LOG_A" "Server was successfully joined." "session A join success" 90 || fail "Session A failed to join" -wait_for_file_pattern "$LOG_B" "Server was successfully joined." "session B join success" 90 || fail "Session B failed to join" -wait_for_server_log_pattern "$USERNAME_A joined the game" "server join for session A" 30 || fail "Server never logged $USERNAME_A join" -wait_for_server_log_pattern "$USERNAME_B joined the game" "server join for session B" 30 || fail "Server never logged $USERNAME_B join" - -echo "Sending debug state to both sessions..." -mcc-cmd --session "$SESSION_A" "debug state" -mcc-cmd --session "$SESSION_B" "debug state" -sleep 2 -wait_for_file_pattern "$LOG_A" "[FileInput] > debug state" "session A debug state command" 20 || fail "Session A did not consume debug state" -wait_for_file_pattern "$LOG_B" "[FileInput] > debug state" "session B debug state command" 20 || fail "Session B did not consume debug state" - -echo "Killing session A..." -mcc-kill --session "$SESSION_A" >/dev/null 2>&1 || true -sleep 2 - -assert_session_alive "$SESSION_B" "$PID_B_FILE" || fail "Session B is not alive after killing session A" -assert_server_alive - -echo "Verifying session B still responds..." -mcc-cmd --session "$SESSION_B" "health" -wait_for_file_pattern "$LOG_B" "[FileInput] > health" "session B health command after session A kill" 20 || fail "Session B stopped responding after session A kill" - -if [[ -s "$PID_A_FILE" ]]; then - pid_a="$(tr -cd '0-9' < "$PID_A_FILE")" - if [[ -n "$pid_a" ]] && kill -0 "$pid_a" 2>/dev/null; then - fail "Session A is still alive after mcc-kill" - fi -fi - -capture_server_logs - -cat <" >&2 - exit 1 -fi - -MATRIX_DIR="$1" -RESULTS_TSV="$MATRIX_DIR/results.tsv" -PRECHECK_TXT="$MATRIX_DIR/preflight.txt" -BUILD_LOG="$MATRIX_DIR/build.log" - -if [[ ! -f "$RESULTS_TSV" ]]; then - echo "Missing results file: $RESULTS_TSV" >&2 - exit 1 -fi - -echo "# Achievements Matrix Report" -echo -echo "## Executed" -echo -if [[ -f "$PRECHECK_TXT" ]]; then - echo '```text' - cat "$PRECHECK_TXT" - echo '```' -fi -echo -echo "- Matrix artifacts: \`$MATRIX_DIR\`" -echo "- Results TSV: \`$RESULTS_TSV\`" -echo "- Build log: \`$BUILD_LOG\`" -echo "- Execution mode: sequential" -echo "- Auth mode: offline" -echo -echo "## Observed" -echo -echo "| Version | Port | Family | Initial snapshot | Grant | Revoke | API callback | Verdict |" -echo "|---|---:|---|---|---|---|---|---|" -awk -F '\t' 'NR > 1 { - printf("| `%s` | `%s` | %s | %s | %s | %s | %s | %s |\n", - $1, $3, $4, $5, $6, $7, $8, $9); -}' "$RESULTS_TSV" - -echo -echo "## Artifact Links" -echo -awk -F '\t' 'NR > 1 { - printf("- `%s`: run=`%s`, mcc=`%s`, server=`%s`, commands=`%s`\n", $1, $11, $12, $13, $14); - printf(" note: %s\n", $10); -}' "$RESULTS_TSV" - -echo -echo "## Inferred" -echo -echo "- Only rows with real MCC and server-log artifacts count as executed proof." -echo "- Rows blocked by missing Java, tmux, or server directories are environment-limited, not product pass results." -echo "- Rows with missing MCC or command-log artifacts should be treated as harness failures until rerun confirms a product issue." diff --git a/.skills/mcc-integration-testing/scripts/summarize_test_run.sh b/.skills/mcc-integration-testing/scripts/summarize_test_run.sh deleted file mode 100755 index ac8efacff4..0000000000 --- a/.skills/mcc-integration-testing/scripts/summarize_test_run.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env zsh -set -euo pipefail - -RUN_ROOT="${TMPDIR:-/tmp}/mcc-integration-testing" -RUN_DIR="${1:-$(find "$RUN_ROOT" -mindepth 1 -maxdepth 1 -type d | sort | tail -n 1)}" - -if [[ -z "${RUN_DIR:-}" ]] || [[ ! -d "$RUN_DIR" ]]; then - echo "Run directory not found" >&2 - exit 1 -fi - -MCC_LOG="$RUN_DIR/mcc.log" -SERVER_LOG="$RUN_DIR/server-latest.log" -BUILD_LOG="$RUN_DIR/build.log" - -echo "Run directory: $RUN_DIR" -echo -echo "Build result:" -grep -E "Warning\(s\)|Error\(s\)|Time Elapsed" "$BUILD_LOG" || true -echo -echo "MCC highlights:" -grep -E "Server was successfully joined|FileInput|smoke_test_from_mcc_full_spectrum|There are [0-9]+ of a max|health|Creative" "$MCC_LOG" || true -echo -echo "Server highlights:" -grep -E "joined the game|Made .* a server operator|game mode|smoke_test_from_mcc_full_spectrum|summon|particle|playsound|tnt" "$SERVER_LOG" || true diff --git a/.skills/mcc-version-adaptation/SKILL.md b/.skills/mcc-version-adaptation/SKILL.md deleted file mode 100644 index 54b1c782b4..0000000000 --- a/.skills/mcc-version-adaptation/SKILL.md +++ /dev/null @@ -1,351 +0,0 @@ ---- -name: mcc-version-adaptation -description: Adapt MCC palettes and protocol handling for a new Minecraft version. Use when the user wants to add support for a new MC version, compare version registries, update item/entity/block/metadata palettes, or fix protocol mismatches between MC versions. ---- - -# MCC Version Adaptation - -Systematic workflow for updating Minecraft Console Client to support a new Minecraft version, focusing on palette/registry changes and entity metadata. - -## Prerequisites - -- Decompiled server source for both the old and new MC versions in `$MCC_REPO/MinecraftOfficial/-decompiled/` -- If missing, decompile and download server.jar: - ```bash - $MCC_REPO/tools/decompile.sh --version - ``` - This auto-downloads `MinecraftDecompiler.jar` if needed, produces the decompiled source, and downloads `server.jar` into `$MCC_SERVERS//`. -- `tools/decompile.sh` depends on official mappings. For older versions where it refuses to decompile, fall back to a raw Java decompiler such as `cfr-decompiler` against `$MCC_SERVERS//server.jar`. That fallback is good enough for packet inspection and registration order checks even when the output is obfuscated. -- A test server of the target version in `$MCC_SERVERS//` (see `mcc-dev-workflow` skill) - -## Step 0: Generate Server Reports (CRITICAL since 1.21.9) - -**Before** analyzing decompiled source, generate authoritative registry data from the server jar: - -```bash -cd /tmp && java -DbundlerMainClass=net.minecraft.data.Main \ - -jar $MCC_SERVERS//server.jar \ - --reports --output /tmp/mc_reports -``` - -This produces `/tmp/mc_reports/reports/` containing: -- `registries.json` — all registries with **actual protocol_id** for each entry -- `blocks.json` — all blocks with **block state IDs** -- `packets.json` — packet protocol definitions - -**Why this matters**: Since MC 1.21.9, some items and blocks are registered outside `Items.java`/`Blocks.java` field declarations (via block registration callbacks or other paths). The decompiled source alone will **miss** these entries. The server data generator is the only authoritative source for protocol IDs. - -### Validation check -Compare server registry counts against decompiled source counts: -```bash -python3 -c " -import json -with open('/tmp/mc_reports/reports/registries.json') as f: - data = json.load(f) -for reg in ['minecraft:item', 'minecraft:entity_type', 'minecraft:block']: - print(f'{reg}: {len(data[reg][\"entries\"])} entries') -" -``` - -If server counts differ from decompiled Java source counts, the palette **must** be generated from server data, not from Java source. - -## Step 1: Run Registry Diff - -```bash -python3 $MCC_REPO/tools/diff_registries.py -``` - -This compares five registries and reports which need palette updates: - -| Registry | MCC File | When to Update | -|----------|----------|----------------| -| Items.java | `ItemPalettes/ItemPaletteXXX.cs` | New/removed/reordered items | -| EntityType.java | `EntityPalettes/EntityPaletteXXX.cs` | New/removed/reordered entity types | -| Blocks.java | `BlockPalettes/BlockPaletteXXX.cs` | New/removed/reordered blocks | -| DataComponents.java | `StructuredComponents/StructuredComponentsRegistryXXX.cs` | New/reordered components | -| EntityDataSerializers.java | `EntityMetadataPalettes/EntityMetadataPaletteXXX.cs` | New/reordered serializer types | - -**Important**: diff_registries.py compares decompiled Java source. If Step 0 revealed count mismatches, the diff output may undercount. Always cross-reference with server registries.json. - -## Step 2: Generate Updated Palettes - -For registries marked "PALETTE UPDATE NEEDED": - -### Item Palette - -**Preferred method** (accurate since 1.21.9): -```bash -python3 $MCC_REPO/tools/gen_item_palette.py --from-registry /tmp/mc_reports/reports/registries.json -# e.g., gen_item_palette.py --from-registry /tmp/mc_reports/reports/registries.json 1219 -``` - -**Legacy method** (works for versions where Items.java has all items): -```bash -python3 $MCC_REPO/tools/gen_item_palette.py -# e.g., gen_item_palette.py 1.21.1 121 -``` - -- If new items are reported missing from `ItemType.cs`, add them to the enum in alphabetical order. -- The script auto-generates the C# palette file. - -### Block Palette - -**Preferred method** (accurate since 1.21.9): -```bash -python3 $MCC_REPO/tools/gen_block_palette.py /tmp/mc_reports/reports/blocks.json -# e.g., gen_block_palette.py /tmp/mc_reports/reports/blocks.json 1219 -``` - -**Legacy method** (manual creation from decompiled Blocks.java): Follow the pattern of existing palette files, using `register("name", ...)` call order from the decompiled source. Only reliable when Blocks.java contains all blocks. - -If new blocks are reported missing from `Material.cs`, add them to the enum in alphabetical order. - -### Entity Palette - -```bash -python3 $MCC_REPO/tools/gen_entity_palette.py /tmp/mc_reports/reports/registries.json -# e.g., gen_entity_palette.py /tmp/mc_reports/reports/registries.json 1219 -``` - -If new entity types are reported missing from `EntityType.cs`, add them to the enum in alphabetical order. - -### Entity Metadata Palette -```bash -python3 $MCC_REPO/tools/gen_entity_metadata_palette.py -# e.g., gen_entity_metadata_palette.py 1.20.6 1206 -``` -- If new serializer types appear as UNMAPPED, add them to both: - 1. The script's `FIELD_TO_ENUM` dictionary - 2. MCC's `EntityMetaDataType.cs` enum - 3. `DataTypes.cs` read logic (add a `case` to consume the correct bytes) - -### DataComponents / StructuredComponents -Compare `DataComponents.java` registration order. If new components appear, update `StructuredComponentsRegistryXXX.cs`. For new component types, implement corresponding reader in `StructuredComponents/Components/`. - -## Step 3: Update Version Routing - -After creating palette files, update version selection logic: - -| Palette Type | Routing Location | -|-------------|-----------------| -| Item | `Protocol18.cs` → `itemPalette` switch expression | -| Entity | `Protocol18.cs` → `entityPalette` switch expression | -| Block | `Protocol18.cs` → `blockPalette` initialization | -| EntityMetadata | `EntityMetadataPalette.cs` → `GetPalette()` switch | -| DataComponents | `StructuredComponentsRegistry.cs` → factory/routing | -| Packet | `PacketType18Handler.cs` → `GetTypeHandler()` switch | - -Pattern: add a new `>= MC_X_Y_Z_Version => new XxxPaletteXYZ()` case. - -Also update: -- `Protocol18.cs`: add `MC_X_Y_Z_Version = ` constant -- `Protocol18.cs`: update all `> MC_prev_Version` upper-bound checks to `> MC_X_Y_Z_Version` -- `ProtocolHandler.cs`: add version string → protocol mapping, protocol → version mapping, add to supported list -- `Program.cs`: update `MCHighestVersion` - -## Step 4: Check Packet Changes - -Compare `GameProtocols.java` and `ConfigurationProtocols.java` between versions. - -Common patterns: -- **New clientbound packets inserted mid-list**: All subsequent packet IDs shift. Requires a new `PacketPalette` class. -- **New packets appended at end**: Only need to add new enum values and entries in the palette. -- **Packet renames** (same slot): Update MCC's packet type enum name but no ID change. - -When packet changes are detected: -1. Add new packet type enum values to `PacketTypesIn.cs`, `PacketTypesOut.cs`, `ConfigurationPacketTypesIn.cs`, `ConfigurationPacketTypesOut.cs` -2. Create new `PacketPaletteXXX.cs` based on the previous one, adjusting IDs -3. Update `PacketType18Handler.cs` routing - -Use scriptable comparisons instead of eyeballing long packet tables. The packet ID is the registration index in `GameProtocols.java`: - -```bash -python3 - <<'PY' -import re -for ver in ["1.21.10", "1.21.11", "26.1"]: - path=f"MinecraftOfficial/{ver}-decompiled/net/minecraft/network/protocol/game/GameProtocols.java" - text=open(path).read() - start=text.index("CLIENTBOUND_TEMPLATE") - names=[m.group(1) for m in re.finditer(r"\.addPacket\(([^,]+),", text[start:])] - print("==", ver, len(names)) - for i, name in enumerate(names): - print(f"0x{i:02X}", name) -PY -``` - -For focused diffs: - -```bash -python3 - <<'PY' -import re -def packets(ver, marker): - text=open(f"MinecraftOfficial/{ver}-decompiled/net/minecraft/network/protocol/game/GameProtocols.java").read() - start=text.index(marker) - return [m.group(1) for m in re.finditer(r"\.addPacket\(([^,]+),", text[start:])] -left, right = "1.21.10", "1.21.11" -a, b = packets(left, "CLIENTBOUND_TEMPLATE"), packets(right, "CLIENTBOUND_TEMPLATE") -for i in range(max(len(a), len(b))): - x = a[i] if i < len(a) else "" - y = b[i] if i < len(b) else "" - if x != y: - print(f"0x{i:02X}: {left}={x} | {right}={y}") -PY -``` - -Do the same for `SERVERBOUND_TEMPLATE`. Clientbound and serverbound can change independently. Do not inherit a newer palette just because one side looks similar. For example, `1.21.11` used the same play packet order as `1.21.9/1.21.10` for the tested inventory path, while `26.1` had additional shifts. - -## Step 5: Check Variant Encoding Changes - -For entity types that use variant serializers (Cat, Wolf, Frog, Painting), check if the codec changed between versions by inspecting: - -- `EntityDataSerializers.java` — look at how each `*_VARIANT` field is constructed -- Key codecs: - - `ByteBufCodecs.holderRegistry()` → wire format: `VarInt(registry_id)` - - `ByteBufCodecs.holder()` → wire format: `VarInt(id+1)` for registered, `VarInt(0) + inline_data` for direct -- If codec changed, update `DataTypes.cs` entity metadata reading logic accordingly. - -## Step 6: Handle New EntityDataSerializer Types - -When new serializer types are added (detected in Step 1): - -1. Add enum value to `EntityMetaDataType.cs` with XML doc comment -2. Add read logic in `DataTypes.cs` `ReadNextMetadata()`: - - Determine byte consumption from the decompiled codec - - Simple enum types (like CopperGolemState, WeatheringCopperState): `ReadNextVarInt(cache)` - - Composite types (like ResolvableProfile): analyze the STREAM_CODEC chain in decompiled source -3. Create the new palette file (Step 2) -4. Update palette routing (Step 3) - -## Step 7: Check SpawnEntity / Other Packet Format Changes - -Compare key packet codec classes between versions. Known changes: -- **1.21.9+**: `SpawnEntity` velocity fields changed from `short / 8000.0` to `LpVec3` format (VarLong-packed fixed-point). Gate reading in `DataTypes.ReadNextEntity()` by version. - -When in doubt, compare the relevant packet class (e.g. `ClientboundAddEntityPacket.java`) between versions. - -## Step 8: Update Block Collision Shapes (Physics Engine) - -MCC's physics engine uses block collision shape data from PrismarineJS `minecraft-data` to perform accurate AABB collision detection (stored in `MinecraftClient/Physics/BlockShapeData.json`, embedded as a resource). - -When a new MC version introduces new blocks or changes block shapes, update this data: - -```bash -# Download and compact collision shapes for the target version -python3 $MCC_REPO/tools/gen_block_shapes.py -# e.g. python3 tools/gen_block_shapes.py 1.21.11 -``` - -If network is slow or unreliable, download the file manually and convert: -```bash -# Manual download -curl -L -o /tmp/bcs.json \ - "https://raw.githubusercontent.com/PrismarineJS/minecraft-data/master/data/pc//blockCollisionShapes.json" - -# Then compact from local file -python3 $MCC_REPO/tools/gen_block_shapes.py --from-file /tmp/bcs.json -``` - -Output: `MinecraftClient/Physics/BlockShapeData.json` (embedded via `MinecraftClient.csproj`) - -The JSON maps block names (snake_case) → collision shape IDs → AABB coordinates. At runtime, `BlockShapes.cs` maps MCC's block state IDs to these AABBs using the block palette. - -**When to update**: Whenever new blocks are added that have non-trivial collision shapes (e.g., new slab variants, stairs, fences). If only items or entities changed, this step can be skipped. - -**Data source**: PrismarineJS `minecraft-data` repo, path: `data/pc//blockCollisionShapes.json`. Version availability can be checked via `data/dataPaths.json`. - -## Step 9: Update Minimap Block Color Map - -Regenerate the block-to-MapColor mapping used by the TUI minimap. This maps each block's `Material` enum to the RGB color from Minecraft's official `MapColor` table. - -```bash -python3 $MCC_REPO/tools/gen_block_color_map.py $MCC_REPO/MinecraftOfficial/-decompiled -# e.g. python3 tools/gen_block_color_map.py MinecraftOfficial/26.1-rc-2-decompiled -``` - -Output: `MinecraftClient/Tui/MinimapBlockColors.json` (embedded as a resource via `.csproj`). - -The script parses `MapColor.java`, `DyeColor.java`, and `Blocks.java` from the decompiled source to extract each block's assigned map color. Blocks not matched to a known `Material` enum value are skipped. - -**When to update**: Whenever new blocks are added or existing blocks change their `mapColor()` assignment. If only items or entities changed, this step can be skipped. - -## Step 10: Update Minimap Entity Categories - -Regenerate the entity-to-MobCategory mapping used by the TUI minimap for classifying entities as hostile, passive, neutral, or non-living. - -```bash -python3 $MCC_REPO/tools/gen_entity_category_map.py $MCC_REPO/MinecraftOfficial/-decompiled -# e.g. python3 tools/gen_entity_category_map.py MinecraftOfficial/26.1-rc-2-decompiled -``` - -Output: `MinecraftClient/Tui/MinimapEntityCategories.json` (embedded as a resource via `.csproj`). - -The script parses `EntityType.java` to extract each entity's `MobCategory` assignment, then maps Minecraft's categories to MCC minimap categories: -- `MONSTER` -> hostile (with neutral overrides for conditionally hostile mobs like Enderman, Spider, Wolf) -- `CREATURE`/`AMBIENT`/`AXOLOTLS`/`WATER_*` -> passive -- `MISC` -> non_living (with passive overrides for Villager, WanderingTrader, ZombieHorse) - -The script maintains manual override lists for "neutral" mobs (attack only when provoked) since Minecraft has no machine-readable flag for this behavior. Review and update the `NEUTRAL_OVERRIDES` and `PASSIVE_OVERRIDES` sets in the script when new conditionally-hostile or misclassified mobs are added. - -**When to update**: Whenever new entity types are added. If only blocks or items changed, this step can be skipped. - -## Step 11: Compile and Verify - -```bash -dotnet build $MCC_REPO/MinecraftClient.sln -c Release -``` - -Then connect to a test server of the target version (see `mcc-dev-workflow` skill) and verify: -- Successful connection -- `/give` new items → check inventory for correct identification -- `/give` existing items (diamond_sword, etc.) → verify no ID shift -- Summon new entities → check type and health -- Summon variant entities (wolf, cat, frog) → no metadata parse errors -- Place new blocks → `dig` reports correct block type -- Teleport to distant chunks → terrain loads without errors -- Chat commands work normally - -**Always verify basic existing items first** (e.g. diamond_sword) to catch palette ID shift bugs early. If an existing item shows as the wrong type, the palette is using wrong protocol IDs. - -## Key Source Files Reference - -| Decompiled Java Source | Purpose | -|----------------------|---------| -| `world/item/Items.java` | Item registry (field declaration order ≈ ID, **but not always since 1.21.9**) | -| `world/entity/EntityType.java` | Entity type registry (`register()` call order = ID) | -| `world/level/block/Blocks.java` | Block registry (`register()` call order ≈ ID, **but not always since 1.21.9**) | -| `core/component/DataComponents.java` | Data component registry | -| `network/syncher/EntityDataSerializers.java` | Entity metadata type registry (static block order = ID) | -| `network/protocol/game/GameProtocols.java` | Play packet registration order (= packet IDs) | -| `network/protocol/configuration/ConfigurationProtocols.java` | Config packet registration order | - -| Server Data Generator Output | Purpose | -|-----|---------| -| `registries.json` | **Authoritative** protocol_id for all registries | -| `blocks.json` | **Authoritative** block state IDs | -| `packets.json` | Packet protocol definitions | - -## Common Pitfalls - -- **Source field order ≠ runtime registry ID (since 1.21.9)**: Some items/blocks are registered via callbacks (e.g., block items registered by `Blocks.java` during block registration) rather than in `Items.java` field declarations. Always validate palette counts against server `registries.json`. If counts differ, **use server data generator output instead of decompiled source**. -- **ID order matters**: IDs are determined by registration order, not alphabetical. Always use server data generator as ground truth. -- **Cross-version jumps**: When MCC skips versions (e.g., 1.20.4→1.20.6), registries from ALL intermediate versions may have changed. Always diff against the actual last-supported version, not the latest palette. -- **EntityMetadata type shifts**: A single new serializer type shifts all subsequent IDs, causing widespread metadata parse failures. Symptoms: entity rendering glitches, disconnections, or silent data corruption. -- **CUT_STANDSTONE_SLAB**: This is an intentional typo in Minecraft source (should be SANDSTONE). MCC's `ItemType.cs` uses `CutSandstoneSlab` — the gen script handles this via the OVERRIDES dict. -- **Item/block renames across versions**: Some items/blocks get renamed (e.g., `DRY_SHORT_GRASS` → `SHORT_DRY_GRASS`, `CHAIN` → `IRON_CHAIN`). Keep old enum values for backward compatibility with older palettes, and add new ones for the new version. -- **Packet ID cascading shifts**: Even one inserted mid-list clientbound packet shifts ALL subsequent IDs. Always create a new PacketPalette for protocol changes. -- **Test existing items first**: After palette changes, always verify existing items (diamond_sword, stone, etc.) before testing new ones. If they show as wrong items, the palette has a systemic ID offset bug. - -## Reusable Scripts - -All scripts are in `$MCC_REPO/tools/`. See `tools/README.md` for detailed usage. - -| Script | Purpose | Input | -|--------|---------|-------| -| `diff_registries.py` | Compare registries between versions | Decompiled source | -| `gen_item_palette.py` | Generate ItemPalette C# | Decompiled source OR registries.json | -| `gen_block_palette.py` | Generate BlockPalette C# | blocks.json | -| `gen_entity_palette.py` | Generate EntityPalette C# | registries.json | -| `gen_entity_metadata_palette.py` | Generate EntityMetadataPalette C# | Decompiled source | -| `gen_block_shapes.py` | Download & compact block collision shapes | PrismarineJS minecraft-data | -| `gen_block_color_map.py` | Generate minimap block color JSON | Decompiled source (MapColor/DyeColor/Blocks) | -| `gen_entity_category_map.py` | Generate minimap entity category JSON | Decompiled source (EntityType.java) | diff --git a/.skills/mermaid-diagrams/SKILL.md b/.skills/mermaid-diagrams/SKILL.md deleted file mode 100644 index 2d7ca5a5ef..0000000000 --- a/.skills/mermaid-diagrams/SKILL.md +++ /dev/null @@ -1,211 +0,0 @@ ---- -name: mermaid-diagrams -description: Creating and refining Mermaid diagrams with live reload. Use when users want flowcharts, sequence diagrams, class diagrams, ER diagrams, state diagrams, or any other Mermaid visualization. Provides best practices for syntax, styling, and the iterative workflow using mermaid_preview and mermaid_save tools. -allowed-tools: mcp__mermaid__mermaid_preview, mcp__mermaid__mermaid_save ---- - -# Mermaid Diagram Expert - -You are an expert at creating, refining, and optimizing Mermaid diagrams using the MCP server tools. - -## Core Workflow - -1. **Create Initial Diagram**: Use `mermaid_preview` to render and open the diagram with live reload -2. **Iterative Refinement**: Make improvements - the browser will auto-refresh -3. **Save Final Version**: Use `mermaid_save` when satisfied - -## Tool Usage - -### mermaid_preview - -Always use this when creating or updating diagrams: - -- `diagram`: The Mermaid code -- `preview_id`: Descriptive kebab-case ID (e.g., `auth-flow`, `architecture`) -- `format`: Use `svg` for live reload (default) -- `theme`: `default`, `forest`, `dark`, or `neutral` -- `background`: `white`, `transparent`, or hex colors -- `width`, `height`, `scale`: Adjust for quality/size - -**Key Points:** - -- Reuse the same `preview_id` for refinements to update the same browser tab -- Use different IDs for multiple simultaneous diagrams -- Live reload only works with SVG format - -### mermaid_save - -Use after the diagram is finalized: - -- `save_path`: Where to save (e.g., `./docs/diagram.svg`) -- `preview_id`: Must match the preview ID used earlier -- `format`: Must match format from preview - -## Diagram Types - -### Flowcharts (`graph` or `flowchart`) - -Direction: `LR`, `TB`, `RL`, `BT` - -```mermaid -graph LR - A[Start] --> B{Decision} - B -->|Yes| C[Action] - B -->|No| D[End] - - style A fill:#e1f5ff - style C fill:#d4edda -``` - -### Sequence Diagrams (`sequenceDiagram`) - -⚠️ **Do NOT use `style` statements** - not supported - -```mermaid -sequenceDiagram - participant User - participant App - participant API - - User->>App: Login - App->>API: Authenticate - API-->>App: Token - App-->>User: Success -``` - -### Class Diagrams (`classDiagram`) - -```mermaid -classDiagram - class User { - +String name - +String email - +login() - } - class Order { - +int id - +Date created - } - User "1" --> "*" Order -``` - -### Entity Relationship (`erDiagram`) - -```mermaid -erDiagram - USER ||--o{ ORDER : places - ORDER ||--|{ LINE_ITEM : contains - - USER { - int id PK - string email - string name - } -``` - -### State Diagrams (`stateDiagram-v2`) - -```mermaid -stateDiagram-v2 - [*] --> Idle - Idle --> Processing : start - Processing --> Complete : finish - Complete --> [*] -``` - -### Gantt Charts (`gantt`) - -```mermaid -gantt - title Project Timeline - section Phase 1 - Task 1 :a1, 2024-01-01, 30d - Task 2 :after a1, 20d -``` - -## Best Practices - -### Preview IDs - -- Use descriptive names: `architecture`, `auth-flow`, `data-model` -- Keep the same ID during refinements -- Use different IDs for concurrent diagrams - -### Themes & Styling - -- `default`: Clean, professional -- `forest`: Green tones -- `dark`: Dark background -- `neutral`: Grayscale - -Use `transparent` background for docs, `white` for standalone - -### Common Patterns - -**System Architecture:** - -```mermaid -graph TB - Client[Web App] - API[API Gateway] - DB[(Database)] - - Client --> API --> DB -``` - -**Authentication Flow:** - -```mermaid -sequenceDiagram - User->>App: Login Request - App->>Auth: Validate - Auth-->>App: JWT Token - App-->>User: Access Granted -``` - -## User Interaction - -When a user requests a diagram: - -1. **Clarify if needed**: What type? What level of detail? -2. **Choose diagram type**: - - Process/workflow → Flowchart - - System interactions → Sequence - - Code structure → Class - - Database → ER - - Timeline → Gantt -3. **Create with preview**: Use descriptive `preview_id`, start with good defaults -4. **Iterate**: Keep same `preview_id`, explain changes -5. **Save**: Ask where/what format, use `mermaid_save` - -## Proactive Behavior - -- Always preview diagrams, don't just generate code -- Use sensible defaults without asking -- Reuse preview_id for refinements -- Suggest improvements when you see opportunities -- Explain your diagram type choice briefly - -## Common Issues - -**Syntax errors**: Check quotes, arrow syntax, keywords -**Layout issues**: Try different directions (LR vs TB) -**Text overlap**: Increase dimensions or shorten labels -**Colors not working**: Verify CSS color format; remember sequence diagrams don't support styles - -## Example Interaction - -**User**: "Create an auth flow diagram" - -**You**: "I'll create a sequence diagram showing the authentication flow." -[Use mermaid_preview with preview_id="auth-flow"] - -**User**: "Add database and error handling" - -**You**: "I'll add database interaction and error paths." -[Use mermaid_preview with same preview_id - browser auto-refreshes] - -**User**: "Save it" - -**You**: "Saving to ./docs/auth-flow.svg" -[Use mermaid_save] diff --git a/.skills/skill-creator/LICENSE.txt b/.skills/skill-creator/LICENSE.txt deleted file mode 100644 index 7a4a3ea242..0000000000 --- a/.skills/skill-creator/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/.skills/skill-creator/SKILL.md b/.skills/skill-creator/SKILL.md deleted file mode 100644 index 942bfe8960..0000000000 --- a/.skills/skill-creator/SKILL.md +++ /dev/null @@ -1,479 +0,0 @@ ---- -name: skill-creator -description: Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, update or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. ---- - -# Skill Creator - -A skill for creating new skills and iteratively improving them. - -At a high level, the process of creating a skill goes like this: - -- Decide what you want the skill to do and roughly how it should do it -- Write a draft of the skill -- Create a few test prompts and run claude-with-access-to-the-skill on them -- Help the user evaluate the results both qualitatively and quantitatively - - While the runs happen in the background, draft some quantitative evals if there aren't any (if there are some, you can either use as is or modify if you feel something needs to change about them). Then explain them to the user (or if they already existed, explain the ones that already exist) - - Use the `eval-viewer/generate_review.py` script to show the user the results for them to look at, and also let them look at the quantitative metrics -- Rewrite the skill based on feedback from the user's evaluation of the results (and also if there are any glaring flaws that become apparent from the quantitative benchmarks) -- Repeat until you're satisfied -- Expand the test set and try again at larger scale - -Your job when using this skill is to figure out where the user is in this process and then jump in and help them progress through these stages. So for instance, maybe they're like "I want to make a skill for X". You can help narrow down what they mean, write a draft, write the test cases, figure out how they want to evaluate, run all the prompts, and repeat. - -On the other hand, maybe they already have a draft of the skill. In this case you can go straight to the eval/iterate part of the loop. - -Of course, you should always be flexible and if the user is like "I don't need to run a bunch of evaluations, just vibe with me", you can do that instead. - -Then after the skill is done (but again, the order is flexible), you can also run the skill description improver, which we have a whole separate script for, to optimize the triggering of the skill. - -Cool? Cool. - -## Communicating with the user - -The skill creator is liable to be used by people across a wide range of familiarity with coding jargon. If you haven't heard (and how could you, it's only very recently that it started), there's a trend now where the power of Claude is inspiring plumbers to open up their terminals, parents and grandparents to google "how to install npm". On the other hand, the bulk of users are probably fairly computer-literate. - -So please pay attention to context cues to understand how to phrase your communication! In the default case, just to give you some idea: - -- "evaluation" and "benchmark" are borderline, but OK -- for "JSON" and "assertion" you want to see serious cues from the user that they know what those things are before using them without explaining them - -It's OK to briefly explain terms if you're in doubt, and feel free to clarify terms with a short definition if you're unsure if the user will get it. - ---- - -## Creating a skill - -### Capture Intent - -Start by understanding the user's intent. The current conversation might already contain a workflow the user wants to capture (e.g., they say "turn this into a skill"). If so, extract answers from the conversation history first — the tools used, the sequence of steps, corrections the user made, input/output formats observed. The user may need to fill the gaps, and should confirm before proceeding to the next step. - -1. What should this skill enable Claude to do? -2. When should this skill trigger? (what user phrases/contexts) -3. What's the expected output format? -4. Should we set up test cases to verify the skill works? Skills with objectively verifiable outputs (file transforms, data extraction, code generation, fixed workflow steps) benefit from test cases. Skills with subjective outputs (writing style, art) often don't need them. Suggest the appropriate default based on the skill type, but let the user decide. - -### Interview and Research - -Proactively ask questions about edge cases, input/output formats, example files, success criteria, and dependencies. Wait to write test prompts until you've got this part ironed out. - -Check available MCPs - if useful for research (searching docs, finding similar skills, looking up best practices), research in parallel via subagents if available, otherwise inline. Come prepared with context to reduce burden on the user. - -### Write the SKILL.md - -Based on the user interview, fill in these components: - -- **name**: Skill identifier -- **description**: When to trigger, what it does. This is the primary triggering mechanism - include both what the skill does AND specific contexts for when to use it. All "when to use" info goes here, not in the body. Note: currently Claude has a tendency to "undertrigger" skills -- to not use them when they'd be useful. To combat this, please make the skill descriptions a little bit "pushy". So for instance, instead of "How to build a simple fast dashboard to display internal Anthropic data.", you might write "How to build a simple fast dashboard to display internal Anthropic data. Make sure to use this skill whenever the user mentions dashboards, data visualization, internal metrics, or wants to display any kind of company data, even if they don't explicitly ask for a 'dashboard.'" -- **compatibility**: Required tools, dependencies (optional, rarely needed) -- **the rest of the skill :)** - -### Skill Writing Guide - -#### Anatomy of a Skill - -``` -skill-name/ -├── SKILL.md (required) -│ ├── YAML frontmatter (name, description required) -│ └── Markdown instructions -└── Bundled Resources (optional) - ├── scripts/ - Executable code for deterministic/repetitive tasks - ├── references/ - Docs loaded into context as needed - └── assets/ - Files used in output (templates, icons, fonts) -``` - -#### Progressive Disclosure - -Skills use a three-level loading system: -1. **Metadata** (name + description) - Always in context (~100 words) -2. **SKILL.md body** - In context whenever skill triggers (<500 lines ideal) -3. **Bundled resources** - As needed (unlimited, scripts can execute without loading) - -These word counts are approximate and you can feel free to go longer if needed. - -**Key patterns:** -- Keep SKILL.md under 500 lines; if you're approaching this limit, add an additional layer of hierarchy along with clear pointers about where the model using the skill should go next to follow up. -- Reference files clearly from SKILL.md with guidance on when to read them -- For large reference files (>300 lines), include a table of contents - -**Domain organization**: When a skill supports multiple domains/frameworks, organize by variant: -``` -cloud-deploy/ -├── SKILL.md (workflow + selection) -└── references/ - ├── aws.md - ├── gcp.md - └── azure.md -``` -Claude reads only the relevant reference file. - -#### Principle of Lack of Surprise - -This goes without saying, but skills must not contain malware, exploit code, or any content that could compromise system security. A skill's contents should not surprise the user in their intent if described. Don't go along with requests to create misleading skills or skills designed to facilitate unauthorized access, data exfiltration, or other malicious activities. Things like a "roleplay as an XYZ" are OK though. - -#### Writing Patterns - -Prefer using the imperative form in instructions. - -**Defining output formats** - You can do it like this: -```markdown -## Report structure -ALWAYS use this exact template: -# [Title] -## Executive summary -## Key findings -## Recommendations -``` - -**Examples pattern** - It's useful to include examples. You can format them like this (but if "Input" and "Output" are in the examples you might want to deviate a little): -```markdown -## Commit message format -**Example 1:** -Input: Added user authentication with JWT tokens -Output: feat(auth): implement JWT-based authentication -``` - -### Writing Style - -Try to explain to the model why things are important in lieu of heavy-handed musty MUSTs. Use theory of mind and try to make the skill general and not super-narrow to specific examples. Start by writing a draft and then look at it with fresh eyes and improve it. - -### Test Cases - -After writing the skill draft, come up with 2-3 realistic test prompts — the kind of thing a real user would actually say. Share them with the user: [you don't have to use this exact language] "Here are a few test cases I'd like to try. Do these look right, or do you want to add more?" Then run them. - -Save test cases to `evals/evals.json`. Don't write assertions yet — just the prompts. You'll draft assertions in the next step while the runs are in progress. - -```json -{ - "skill_name": "example-skill", - "evals": [ - { - "id": 1, - "prompt": "User's task prompt", - "expected_output": "Description of expected result", - "files": [] - } - ] -} -``` - -See `references/schemas.md` for the full schema (including the `assertions` field, which you'll add later). - -## Running and evaluating test cases - -This section is one continuous sequence — don't stop partway through. Do NOT use `/skill-test` or any other testing skill. - -Put results in `-workspace/` as a sibling to the skill directory. Within the workspace, organize results by iteration (`iteration-1/`, `iteration-2/`, etc.) and within that, each test case gets a directory (`eval-0/`, `eval-1/`, etc.). Don't create all of this upfront — just create directories as you go. - -### Step 1: Spawn all runs (with-skill AND baseline) in the same turn - -For each test case, spawn two subagents in the same turn — one with the skill, one without. This is important: don't spawn the with-skill runs first and then come back for baselines later. Launch everything at once so it all finishes around the same time. - -**With-skill run:** - -``` -Execute this task: -- Skill path: -- Task: -- Input files: -- Save outputs to: /iteration-/eval-/with_skill/outputs/ -- Outputs to save: -``` - -**Baseline run** (same prompt, but the baseline depends on context): -- **Creating a new skill**: no skill at all. Same prompt, no skill path, save to `without_skill/outputs/`. -- **Improving an existing skill**: the old version. Before editing, snapshot the skill (`cp -r /skill-snapshot/`), then point the baseline subagent at the snapshot. Save to `old_skill/outputs/`. - -Write an `eval_metadata.json` for each test case (assertions can be empty for now). Give each eval a descriptive name based on what it's testing — not just "eval-0". Use this name for the directory too. If this iteration uses new or modified eval prompts, create these files for each new eval directory — don't assume they carry over from previous iterations. - -```json -{ - "eval_id": 0, - "eval_name": "descriptive-name-here", - "prompt": "The user's task prompt", - "assertions": [] -} -``` - -### Step 2: While runs are in progress, draft assertions - -Don't just wait for the runs to finish — you can use this time productively. Draft quantitative assertions for each test case and explain them to the user. If assertions already exist in `evals/evals.json`, review them and explain what they check. - -Good assertions are objectively verifiable and have descriptive names — they should read clearly in the benchmark viewer so someone glancing at the results immediately understands what each one checks. Subjective skills (writing style, design quality) are better evaluated qualitatively — don't force assertions onto things that need human judgment. - -Update the `eval_metadata.json` files and `evals/evals.json` with the assertions once drafted. Also explain to the user what they'll see in the viewer — both the qualitative outputs and the quantitative benchmark. - -### Step 3: As runs complete, capture timing data - -When each subagent task completes, you receive a notification containing `total_tokens` and `duration_ms`. Save this data immediately to `timing.json` in the run directory: - -```json -{ - "total_tokens": 84852, - "duration_ms": 23332, - "total_duration_seconds": 23.3 -} -``` - -This is the only opportunity to capture this data — it comes through the task notification and isn't persisted elsewhere. Process each notification as it arrives rather than trying to batch them. - -### Step 4: Grade, aggregate, and launch the viewer - -Once all runs are done: - -1. **Grade each run** — spawn a grader subagent (or grade inline) that reads `agents/grader.md` and evaluates each assertion against the outputs. Save results to `grading.json` in each run directory. The grading.json expectations array must use the fields `text`, `passed`, and `evidence` (not `name`/`met`/`details` or other variants) — the viewer depends on these exact field names. For assertions that can be checked programmatically, write and run a script rather than eyeballing it — scripts are faster, more reliable, and can be reused across iterations. - -2. **Aggregate into benchmark** — run the aggregation script from the skill-creator directory: - ```bash - python -m scripts.aggregate_benchmark /iteration-N --skill-name - ``` - This produces `benchmark.json` and `benchmark.md` with pass_rate, time, and tokens for each configuration, with mean ± stddev and the delta. If generating benchmark.json manually, see `references/schemas.md` for the exact schema the viewer expects. -Put each with_skill version before its baseline counterpart. - -3. **Do an analyst pass** — read the benchmark data and surface patterns the aggregate stats might hide. See `agents/analyzer.md` (the "Analyzing Benchmark Results" section) for what to look for — things like assertions that always pass regardless of skill (non-discriminating), high-variance evals (possibly flaky), and time/token tradeoffs. - -4. **Launch the viewer** with both qualitative outputs and quantitative data: - ```bash - nohup python /eval-viewer/generate_review.py \ - /iteration-N \ - --skill-name "my-skill" \ - --benchmark /iteration-N/benchmark.json \ - > /dev/null 2>&1 & - VIEWER_PID=$! - ``` - For iteration 2+, also pass `--previous-workspace /iteration-`. - - **Cowork / headless environments:** If `webbrowser.open()` is not available or the environment has no display, use `--static ` to write a standalone HTML file instead of starting a server. Feedback will be downloaded as a `feedback.json` file when the user clicks "Submit All Reviews". After download, copy `feedback.json` into the workspace directory for the next iteration to pick up. - -Note: please use generate_review.py to create the viewer; there's no need to write custom HTML. - -5. **Tell the user** something like: "I've opened the results in your browser. There are two tabs — 'Outputs' lets you click through each test case and leave feedback, 'Benchmark' shows the quantitative comparison. When you're done, come back here and let me know." - -### What the user sees in the viewer - -The "Outputs" tab shows one test case at a time: -- **Prompt**: the task that was given -- **Output**: the files the skill produced, rendered inline where possible -- **Previous Output** (iteration 2+): collapsed section showing last iteration's output -- **Formal Grades** (if grading was run): collapsed section showing assertion pass/fail -- **Feedback**: a textbox that auto-saves as they type -- **Previous Feedback** (iteration 2+): their comments from last time, shown below the textbox - -The "Benchmark" tab shows the stats summary: pass rates, timing, and token usage for each configuration, with per-eval breakdowns and analyst observations. - -Navigation is via prev/next buttons or arrow keys. When done, they click "Submit All Reviews" which saves all feedback to `feedback.json`. - -### Step 5: Read the feedback - -When the user tells you they're done, read `feedback.json`: - -```json -{ - "reviews": [ - {"run_id": "eval-0-with_skill", "feedback": "the chart is missing axis labels", "timestamp": "..."}, - {"run_id": "eval-1-with_skill", "feedback": "", "timestamp": "..."}, - {"run_id": "eval-2-with_skill", "feedback": "perfect, love this", "timestamp": "..."} - ], - "status": "complete" -} -``` - -Empty feedback means the user thought it was fine. Focus your improvements on the test cases where the user had specific complaints. - -Kill the viewer server when you're done with it: - -```bash -kill $VIEWER_PID 2>/dev/null -``` - ---- - -## Improving the skill - -This is the heart of the loop. You've run the test cases, the user has reviewed the results, and now you need to make the skill better based on their feedback. - -### How to think about improvements - -1. **Generalize from the feedback.** The big picture thing that's happening here is that we're trying to create skills that can be used a million times (maybe literally, maybe even more who knows) across many different prompts. Here you and the user are iterating on only a few examples over and over again because it helps move faster. The user knows these examples in and out and it's quick for them to assess new outputs. But if the skill you and the user are codeveloping works only for those examples, it's useless. Rather than put in fiddly overfitty changes, or oppressively constrictive MUSTs, if there's some stubborn issue, you might try branching out and using different metaphors, or recommending different patterns of working. It's relatively cheap to try and maybe you'll land on something great. - -2. **Keep the prompt lean.** Remove things that aren't pulling their weight. Make sure to read the transcripts, not just the final outputs — if it looks like the skill is making the model waste a bunch of time doing things that are unproductive, you can try getting rid of the parts of the skill that are making it do that and seeing what happens. - -3. **Explain the why.** Try hard to explain the **why** behind everything you're asking the model to do. Today's LLMs are *smart*. They have good theory of mind and when given a good harness can go beyond rote instructions and really make things happen. Even if the feedback from the user is terse or frustrated, try to actually understand the task and why the user is writing what they wrote, and what they actually wrote, and then transmit this understanding into the instructions. If you find yourself writing ALWAYS or NEVER in all caps, or using super rigid structures, that's a yellow flag — if possible, reframe and explain the reasoning so that the model understands why the thing you're asking for is important. That's a more humane, powerful, and effective approach. - -4. **Look for repeated work across test cases.** Read the transcripts from the test runs and notice if the subagents all independently wrote similar helper scripts or took the same multi-step approach to something. If all 3 test cases resulted in the subagent writing a `create_docx.py` or a `build_chart.py`, that's a strong signal the skill should bundle that script. Write it once, put it in `scripts/`, and tell the skill to use it. This saves every future invocation from reinventing the wheel. - -This task is pretty important (we are trying to create billions a year in economic value here!) and your thinking time is not the blocker; take your time and really mull things over. I'd suggest writing a draft revision and then looking at it anew and making improvements. Really do your best to get into the head of the user and understand what they want and need. - -### The iteration loop - -After improving the skill: - -1. Apply your improvements to the skill -2. Rerun all test cases into a new `iteration-/` directory, including baseline runs. If you're creating a new skill, the baseline is always `without_skill` (no skill) — that stays the same across iterations. If you're improving an existing skill, use your judgment on what makes sense as the baseline: the original version the user came in with, or the previous iteration. -3. Launch the reviewer with `--previous-workspace` pointing at the previous iteration -4. Wait for the user to review and tell you they're done -5. Read the new feedback, improve again, repeat - -Keep going until: -- The user says they're happy -- The feedback is all empty (everything looks good) -- You're not making meaningful progress - ---- - -## Advanced: Blind comparison - -For situations where you want a more rigorous comparison between two versions of a skill (e.g., the user asks "is the new version actually better?"), there's a blind comparison system. Read `agents/comparator.md` and `agents/analyzer.md` for the details. The basic idea is: give two outputs to an independent agent without telling it which is which, and let it judge quality. Then analyze why the winner won. - -This is optional, requires subagents, and most users won't need it. The human review loop is usually sufficient. - ---- - -## Description Optimization - -The description field in SKILL.md frontmatter is the primary mechanism that determines whether Claude invokes a skill. After creating or improving a skill, offer to optimize the description for better triggering accuracy. - -### Step 1: Generate trigger eval queries - -Create 20 eval queries — a mix of should-trigger and should-not-trigger. Save as JSON: - -```json -[ - {"query": "the user prompt", "should_trigger": true}, - {"query": "another prompt", "should_trigger": false} -] -``` - -The queries must be realistic and something a Claude Code or Claude.ai user would actually type. Not abstract requests, but requests that are concrete and specific and have a good amount of detail. For instance, file paths, personal context about the user's job or situation, column names and values, company names, URLs. A little bit of backstory. Some might be in lowercase or contain abbreviations or typos or casual speech. Use a mix of different lengths, and focus on edge cases rather than making them clear-cut (the user will get a chance to sign off on them). - -Bad: `"Format this data"`, `"Extract text from PDF"`, `"Create a chart"` - -Good: `"ok so my boss just sent me this xlsx file (its in my downloads, called something like 'Q4 sales final FINAL v2.xlsx') and she wants me to add a column that shows the profit margin as a percentage. The revenue is in column C and costs are in column D i think"` - -For the **should-trigger** queries (8-10), think about coverage. You want different phrasings of the same intent — some formal, some casual. Include cases where the user doesn't explicitly name the skill or file type but clearly needs it. Throw in some uncommon use cases and cases where this skill competes with another but should win. - -For the **should-not-trigger** queries (8-10), the most valuable ones are the near-misses — queries that share keywords or concepts with the skill but actually need something different. Think adjacent domains, ambiguous phrasing where a naive keyword match would trigger but shouldn't, and cases where the query touches on something the skill does but in a context where another tool is more appropriate. - -The key thing to avoid: don't make should-not-trigger queries obviously irrelevant. "Write a fibonacci function" as a negative test for a PDF skill is too easy — it doesn't test anything. The negative cases should be genuinely tricky. - -### Step 2: Review with user - -Present the eval set to the user for review using the HTML template: - -1. Read the template from `assets/eval_review.html` -2. Replace the placeholders: - - `__EVAL_DATA_PLACEHOLDER__` → the JSON array of eval items (no quotes around it — it's a JS variable assignment) - - `__SKILL_NAME_PLACEHOLDER__` → the skill's name - - `__SKILL_DESCRIPTION_PLACEHOLDER__` → the skill's current description -3. Write to a temp file (e.g., `/tmp/eval_review_.html`) and open it: `open /tmp/eval_review_.html` -4. The user can edit queries, toggle should-trigger, add/remove entries, then click "Export Eval Set" -5. The file downloads to `~/Downloads/eval_set.json` — check the Downloads folder for the most recent version in case there are multiple (e.g., `eval_set (1).json`) - -This step matters — bad eval queries lead to bad descriptions. - -### Step 3: Run the optimization loop - -Tell the user: "This will take some time — I'll run the optimization loop in the background and check on it periodically." - -Save the eval set to the workspace, then run in the background: - -```bash -python -m scripts.run_loop \ - --eval-set \ - --skill-path \ - --model \ - --max-iterations 5 \ - --verbose -``` - -Use the model ID from your system prompt (the one powering the current session) so the triggering test matches what the user actually experiences. - -While it runs, periodically tail the output to give the user updates on which iteration it's on and what the scores look like. - -This handles the full optimization loop automatically. It splits the eval set into 60% train and 40% held-out test, evaluates the current description (running each query 3 times to get a reliable trigger rate), then calls Claude with extended thinking to propose improvements based on what failed. It re-evaluates each new description on both train and test, iterating up to 5 times. When it's done, it opens an HTML report in the browser showing the results per iteration and returns JSON with `best_description` — selected by test score rather than train score to avoid overfitting. - -### How skill triggering works - -Understanding the triggering mechanism helps design better eval queries. Skills appear in Claude's `available_skills` list with their name + description, and Claude decides whether to consult a skill based on that description. The important thing to know is that Claude only consults skills for tasks it can't easily handle on its own — simple, one-step queries like "read this PDF" may not trigger a skill even if the description matches perfectly, because Claude can handle them directly with basic tools. Complex, multi-step, or specialized queries reliably trigger skills when the description matches. - -This means your eval queries should be substantive enough that Claude would actually benefit from consulting a skill. Simple queries like "read file X" are poor test cases — they won't trigger skills regardless of description quality. - -### Step 4: Apply the result - -Take `best_description` from the JSON output and update the skill's SKILL.md frontmatter. Show the user before/after and report the scores. - ---- - -### Package and Present (only if `present_files` tool is available) - -Check whether you have access to the `present_files` tool. If you don't, skip this step. If you do, package the skill and present the .skill file to the user: - -```bash -python -m scripts.package_skill -``` - -After packaging, direct the user to the resulting `.skill` file path so they can install it. - ---- - -## Claude.ai-specific instructions - -In Claude.ai, the core workflow is the same (draft → test → review → improve → repeat), but because Claude.ai doesn't have subagents, some mechanics change. Here's what to adapt: - -**Running test cases**: No subagents means no parallel execution. For each test case, read the skill's SKILL.md, then follow its instructions to accomplish the test prompt yourself. Do them one at a time. This is less rigorous than independent subagents (you wrote the skill and you're also running it, so you have full context), but it's a useful sanity check — and the human review step compensates. Skip the baseline runs — just use the skill to complete the task as requested. - -**Reviewing results**: If you can't open a browser (e.g., Claude.ai's VM has no display, or you're on a remote server), skip the browser reviewer entirely. Instead, present results directly in the conversation. For each test case, show the prompt and the output. If the output is a file the user needs to see (like a .docx or .xlsx), save it to the filesystem and tell them where it is so they can download and inspect it. Ask for feedback inline: "How does this look? Anything you'd change?" - -**Benchmarking**: Skip the quantitative benchmarking — it relies on baseline comparisons which aren't meaningful without subagents. Focus on qualitative feedback from the user. - -**The iteration loop**: Same as before — improve the skill, rerun the test cases, ask for feedback — just without the browser reviewer in the middle. You can still organize results into iteration directories on the filesystem if you have one. - -**Description optimization**: This section requires the `claude` CLI tool (specifically `claude -p`) which is only available in Claude Code. Skip it if you're on Claude.ai. - -**Blind comparison**: Requires subagents. Skip it. - -**Packaging**: The `package_skill.py` script works anywhere with Python and a filesystem. On Claude.ai, you can run it and the user can download the resulting `.skill` file. - ---- - -## Cowork-Specific Instructions - -If you're in Cowork, the main things to know are: - -- You have subagents, so the main workflow (spawn test cases in parallel, run baselines, grade, etc.) all works. (However, if you run into severe problems with timeouts, it's OK to run the test prompts in series rather than parallel.) -- You don't have a browser or display, so when generating the eval viewer, use `--static ` to write a standalone HTML file instead of starting a server. Then proffer a link that the user can click to open the HTML in their browser. -- For whatever reason, the Cowork setup seems to disincline Claude from generating the eval viewer after running the tests, so just to reiterate: whether you're in Cowork or in Claude Code, after running tests, you should always generate the eval viewer for the human to look at examples before revising the skill yourself and trying to make corrections, using `generate_review.py` (not writing your own boutique html code). Sorry in advance but I'm gonna go all caps here: GENERATE THE EVAL VIEWER *BEFORE* evaluating inputs yourself. You want to get them in front of the human ASAP! -- Feedback works differently: since there's no running server, the viewer's "Submit All Reviews" button will download `feedback.json` as a file. You can then read it from there (you may have to request access first). -- Packaging works — `package_skill.py` just needs Python and a filesystem. -- Description optimization (`run_loop.py` / `run_eval.py`) should work in Cowork just fine since it uses `claude -p` via subprocess, not a browser, but please save it until you've fully finished making the skill and the user agrees it's in good shape. - ---- - -## Reference files - -The agents/ directory contains instructions for specialized subagents. Read them when you need to spawn the relevant subagent. - -- `agents/grader.md` — How to evaluate assertions against outputs -- `agents/comparator.md` — How to do blind A/B comparison between two outputs -- `agents/analyzer.md` — How to analyze why one version beat another - -The references/ directory has additional documentation: -- `references/schemas.md` — JSON structures for evals.json, grading.json, etc. - ---- - -Repeating one more time the core loop here for emphasis: - -- Figure out what the skill is about -- Draft or edit the skill -- Run claude-with-access-to-the-skill on test prompts -- With the user, evaluate the outputs: - - Create benchmark.json and run `eval-viewer/generate_review.py` to help the user review them - - Run quantitative evals -- Repeat until you and the user are satisfied -- Package the final skill and return it to the user. - -Please add steps to your TodoList, if you have such a thing, to make sure you don't forget. If you're in Cowork, please specifically put "Create evals JSON and run `eval-viewer/generate_review.py` so human can review test cases" in your TodoList to make sure it happens. - -Good luck! diff --git a/.skills/skill-creator/agents/analyzer.md b/.skills/skill-creator/agents/analyzer.md deleted file mode 100644 index 14e41d6068..0000000000 --- a/.skills/skill-creator/agents/analyzer.md +++ /dev/null @@ -1,274 +0,0 @@ -# Post-hoc Analyzer Agent - -Analyze blind comparison results to understand WHY the winner won and generate improvement suggestions. - -## Role - -After the blind comparator determines a winner, the Post-hoc Analyzer "unblids" the results by examining the skills and transcripts. The goal is to extract actionable insights: what made the winner better, and how can the loser be improved? - -## Inputs - -You receive these parameters in your prompt: - -- **winner**: "A" or "B" (from blind comparison) -- **winner_skill_path**: Path to the skill that produced the winning output -- **winner_transcript_path**: Path to the execution transcript for the winner -- **loser_skill_path**: Path to the skill that produced the losing output -- **loser_transcript_path**: Path to the execution transcript for the loser -- **comparison_result_path**: Path to the blind comparator's output JSON -- **output_path**: Where to save the analysis results - -## Process - -### Step 1: Read Comparison Result - -1. Read the blind comparator's output at comparison_result_path -2. Note the winning side (A or B), the reasoning, and any scores -3. Understand what the comparator valued in the winning output - -### Step 2: Read Both Skills - -1. Read the winner skill's SKILL.md and key referenced files -2. Read the loser skill's SKILL.md and key referenced files -3. Identify structural differences: - - Instructions clarity and specificity - - Script/tool usage patterns - - Example coverage - - Edge case handling - -### Step 3: Read Both Transcripts - -1. Read the winner's transcript -2. Read the loser's transcript -3. Compare execution patterns: - - How closely did each follow their skill's instructions? - - What tools were used differently? - - Where did the loser diverge from optimal behavior? - - Did either encounter errors or make recovery attempts? - -### Step 4: Analyze Instruction Following - -For each transcript, evaluate: -- Did the agent follow the skill's explicit instructions? -- Did the agent use the skill's provided tools/scripts? -- Were there missed opportunities to leverage skill content? -- Did the agent add unnecessary steps not in the skill? - -Score instruction following 1-10 and note specific issues. - -### Step 5: Identify Winner Strengths - -Determine what made the winner better: -- Clearer instructions that led to better behavior? -- Better scripts/tools that produced better output? -- More comprehensive examples that guided edge cases? -- Better error handling guidance? - -Be specific. Quote from skills/transcripts where relevant. - -### Step 6: Identify Loser Weaknesses - -Determine what held the loser back: -- Ambiguous instructions that led to suboptimal choices? -- Missing tools/scripts that forced workarounds? -- Gaps in edge case coverage? -- Poor error handling that caused failures? - -### Step 7: Generate Improvement Suggestions - -Based on the analysis, produce actionable suggestions for improving the loser skill: -- Specific instruction changes to make -- Tools/scripts to add or modify -- Examples to include -- Edge cases to address - -Prioritize by impact. Focus on changes that would have changed the outcome. - -### Step 8: Write Analysis Results - -Save structured analysis to `{output_path}`. - -## Output Format - -Write a JSON file with this structure: - -```json -{ - "comparison_summary": { - "winner": "A", - "winner_skill": "path/to/winner/skill", - "loser_skill": "path/to/loser/skill", - "comparator_reasoning": "Brief summary of why comparator chose winner" - }, - "winner_strengths": [ - "Clear step-by-step instructions for handling multi-page documents", - "Included validation script that caught formatting errors", - "Explicit guidance on fallback behavior when OCR fails" - ], - "loser_weaknesses": [ - "Vague instruction 'process the document appropriately' led to inconsistent behavior", - "No script for validation, agent had to improvise and made errors", - "No guidance on OCR failure, agent gave up instead of trying alternatives" - ], - "instruction_following": { - "winner": { - "score": 9, - "issues": [ - "Minor: skipped optional logging step" - ] - }, - "loser": { - "score": 6, - "issues": [ - "Did not use the skill's formatting template", - "Invented own approach instead of following step 3", - "Missed the 'always validate output' instruction" - ] - } - }, - "improvement_suggestions": [ - { - "priority": "high", - "category": "instructions", - "suggestion": "Replace 'process the document appropriately' with explicit steps: 1) Extract text, 2) Identify sections, 3) Format per template", - "expected_impact": "Would eliminate ambiguity that caused inconsistent behavior" - }, - { - "priority": "high", - "category": "tools", - "suggestion": "Add validate_output.py script similar to winner skill's validation approach", - "expected_impact": "Would catch formatting errors before final output" - }, - { - "priority": "medium", - "category": "error_handling", - "suggestion": "Add fallback instructions: 'If OCR fails, try: 1) different resolution, 2) image preprocessing, 3) manual extraction'", - "expected_impact": "Would prevent early failure on difficult documents" - } - ], - "transcript_insights": { - "winner_execution_pattern": "Read skill -> Followed 5-step process -> Used validation script -> Fixed 2 issues -> Produced output", - "loser_execution_pattern": "Read skill -> Unclear on approach -> Tried 3 different methods -> No validation -> Output had errors" - } -} -``` - -## Guidelines - -- **Be specific**: Quote from skills and transcripts, don't just say "instructions were unclear" -- **Be actionable**: Suggestions should be concrete changes, not vague advice -- **Focus on skill improvements**: The goal is to improve the losing skill, not critique the agent -- **Prioritize by impact**: Which changes would most likely have changed the outcome? -- **Consider causation**: Did the skill weakness actually cause the worse output, or is it incidental? -- **Stay objective**: Analyze what happened, don't editorialize -- **Think about generalization**: Would this improvement help on other evals too? - -## Categories for Suggestions - -Use these categories to organize improvement suggestions: - -| Category | Description | -|----------|-------------| -| `instructions` | Changes to the skill's prose instructions | -| `tools` | Scripts, templates, or utilities to add/modify | -| `examples` | Example inputs/outputs to include | -| `error_handling` | Guidance for handling failures | -| `structure` | Reorganization of skill content | -| `references` | External docs or resources to add | - -## Priority Levels - -- **high**: Would likely change the outcome of this comparison -- **medium**: Would improve quality but may not change win/loss -- **low**: Nice to have, marginal improvement - ---- - -# Analyzing Benchmark Results - -When analyzing benchmark results, the analyzer's purpose is to **surface patterns and anomalies** across multiple runs, not suggest skill improvements. - -## Role - -Review all benchmark run results and generate freeform notes that help the user understand skill performance. Focus on patterns that wouldn't be visible from aggregate metrics alone. - -## Inputs - -You receive these parameters in your prompt: - -- **benchmark_data_path**: Path to the in-progress benchmark.json with all run results -- **skill_path**: Path to the skill being benchmarked -- **output_path**: Where to save the notes (as JSON array of strings) - -## Process - -### Step 1: Read Benchmark Data - -1. Read the benchmark.json containing all run results -2. Note the configurations tested (with_skill, without_skill) -3. Understand the run_summary aggregates already calculated - -### Step 2: Analyze Per-Assertion Patterns - -For each expectation across all runs: -- Does it **always pass** in both configurations? (may not differentiate skill value) -- Does it **always fail** in both configurations? (may be broken or beyond capability) -- Does it **always pass with skill but fail without**? (skill clearly adds value here) -- Does it **always fail with skill but pass without**? (skill may be hurting) -- Is it **highly variable**? (flaky expectation or non-deterministic behavior) - -### Step 3: Analyze Cross-Eval Patterns - -Look for patterns across evals: -- Are certain eval types consistently harder/easier? -- Do some evals show high variance while others are stable? -- Are there surprising results that contradict expectations? - -### Step 4: Analyze Metrics Patterns - -Look at time_seconds, tokens, tool_calls: -- Does the skill significantly increase execution time? -- Is there high variance in resource usage? -- Are there outlier runs that skew the aggregates? - -### Step 5: Generate Notes - -Write freeform observations as a list of strings. Each note should: -- State a specific observation -- Be grounded in the data (not speculation) -- Help the user understand something the aggregate metrics don't show - -Examples: -- "Assertion 'Output is a PDF file' passes 100% in both configurations - may not differentiate skill value" -- "Eval 3 shows high variance (50% ± 40%) - run 2 had an unusual failure that may be flaky" -- "Without-skill runs consistently fail on table extraction expectations (0% pass rate)" -- "Skill adds 13s average execution time but improves pass rate by 50%" -- "Token usage is 80% higher with skill, primarily due to script output parsing" -- "All 3 without-skill runs for eval 1 produced empty output" - -### Step 6: Write Notes - -Save notes to `{output_path}` as a JSON array of strings: - -```json -[ - "Assertion 'Output is a PDF file' passes 100% in both configurations - may not differentiate skill value", - "Eval 3 shows high variance (50% ± 40%) - run 2 had an unusual failure", - "Without-skill runs consistently fail on table extraction expectations", - "Skill adds 13s average execution time but improves pass rate by 50%" -] -``` - -## Guidelines - -**DO:** -- Report what you observe in the data -- Be specific about which evals, expectations, or runs you're referring to -- Note patterns that aggregate metrics would hide -- Provide context that helps interpret the numbers - -**DO NOT:** -- Suggest improvements to the skill (that's for the improvement step, not benchmarking) -- Make subjective quality judgments ("the output was good/bad") -- Speculate about causes without evidence -- Repeat information already in the run_summary aggregates diff --git a/.skills/skill-creator/agents/comparator.md b/.skills/skill-creator/agents/comparator.md deleted file mode 100644 index 80e00eb45d..0000000000 --- a/.skills/skill-creator/agents/comparator.md +++ /dev/null @@ -1,202 +0,0 @@ -# Blind Comparator Agent - -Compare two outputs WITHOUT knowing which skill produced them. - -## Role - -The Blind Comparator judges which output better accomplishes the eval task. You receive two outputs labeled A and B, but you do NOT know which skill produced which. This prevents bias toward a particular skill or approach. - -Your judgment is based purely on output quality and task completion. - -## Inputs - -You receive these parameters in your prompt: - -- **output_a_path**: Path to the first output file or directory -- **output_b_path**: Path to the second output file or directory -- **eval_prompt**: The original task/prompt that was executed -- **expectations**: List of expectations to check (optional - may be empty) - -## Process - -### Step 1: Read Both Outputs - -1. Examine output A (file or directory) -2. Examine output B (file or directory) -3. Note the type, structure, and content of each -4. If outputs are directories, examine all relevant files inside - -### Step 2: Understand the Task - -1. Read the eval_prompt carefully -2. Identify what the task requires: - - What should be produced? - - What qualities matter (accuracy, completeness, format)? - - What would distinguish a good output from a poor one? - -### Step 3: Generate Evaluation Rubric - -Based on the task, generate a rubric with two dimensions: - -**Content Rubric** (what the output contains): -| Criterion | 1 (Poor) | 3 (Acceptable) | 5 (Excellent) | -|-----------|----------|----------------|---------------| -| Correctness | Major errors | Minor errors | Fully correct | -| Completeness | Missing key elements | Mostly complete | All elements present | -| Accuracy | Significant inaccuracies | Minor inaccuracies | Accurate throughout | - -**Structure Rubric** (how the output is organized): -| Criterion | 1 (Poor) | 3 (Acceptable) | 5 (Excellent) | -|-----------|----------|----------------|---------------| -| Organization | Disorganized | Reasonably organized | Clear, logical structure | -| Formatting | Inconsistent/broken | Mostly consistent | Professional, polished | -| Usability | Difficult to use | Usable with effort | Easy to use | - -Adapt criteria to the specific task. For example: -- PDF form → "Field alignment", "Text readability", "Data placement" -- Document → "Section structure", "Heading hierarchy", "Paragraph flow" -- Data output → "Schema correctness", "Data types", "Completeness" - -### Step 4: Evaluate Each Output Against the Rubric - -For each output (A and B): - -1. **Score each criterion** on the rubric (1-5 scale) -2. **Calculate dimension totals**: Content score, Structure score -3. **Calculate overall score**: Average of dimension scores, scaled to 1-10 - -### Step 5: Check Assertions (if provided) - -If expectations are provided: - -1. Check each expectation against output A -2. Check each expectation against output B -3. Count pass rates for each output -4. Use expectation scores as secondary evidence (not the primary decision factor) - -### Step 6: Determine the Winner - -Compare A and B based on (in priority order): - -1. **Primary**: Overall rubric score (content + structure) -2. **Secondary**: Assertion pass rates (if applicable) -3. **Tiebreaker**: If truly equal, declare a TIE - -Be decisive - ties should be rare. One output is usually better, even if marginally. - -### Step 7: Write Comparison Results - -Save results to a JSON file at the path specified (or `comparison.json` if not specified). - -## Output Format - -Write a JSON file with this structure: - -```json -{ - "winner": "A", - "reasoning": "Output A provides a complete solution with proper formatting and all required fields. Output B is missing the date field and has formatting inconsistencies.", - "rubric": { - "A": { - "content": { - "correctness": 5, - "completeness": 5, - "accuracy": 4 - }, - "structure": { - "organization": 4, - "formatting": 5, - "usability": 4 - }, - "content_score": 4.7, - "structure_score": 4.3, - "overall_score": 9.0 - }, - "B": { - "content": { - "correctness": 3, - "completeness": 2, - "accuracy": 3 - }, - "structure": { - "organization": 3, - "formatting": 2, - "usability": 3 - }, - "content_score": 2.7, - "structure_score": 2.7, - "overall_score": 5.4 - } - }, - "output_quality": { - "A": { - "score": 9, - "strengths": ["Complete solution", "Well-formatted", "All fields present"], - "weaknesses": ["Minor style inconsistency in header"] - }, - "B": { - "score": 5, - "strengths": ["Readable output", "Correct basic structure"], - "weaknesses": ["Missing date field", "Formatting inconsistencies", "Partial data extraction"] - } - }, - "expectation_results": { - "A": { - "passed": 4, - "total": 5, - "pass_rate": 0.80, - "details": [ - {"text": "Output includes name", "passed": true}, - {"text": "Output includes date", "passed": true}, - {"text": "Format is PDF", "passed": true}, - {"text": "Contains signature", "passed": false}, - {"text": "Readable text", "passed": true} - ] - }, - "B": { - "passed": 3, - "total": 5, - "pass_rate": 0.60, - "details": [ - {"text": "Output includes name", "passed": true}, - {"text": "Output includes date", "passed": false}, - {"text": "Format is PDF", "passed": true}, - {"text": "Contains signature", "passed": false}, - {"text": "Readable text", "passed": true} - ] - } - } -} -``` - -If no expectations were provided, omit the `expectation_results` field entirely. - -## Field Descriptions - -- **winner**: "A", "B", or "TIE" -- **reasoning**: Clear explanation of why the winner was chosen (or why it's a tie) -- **rubric**: Structured rubric evaluation for each output - - **content**: Scores for content criteria (correctness, completeness, accuracy) - - **structure**: Scores for structure criteria (organization, formatting, usability) - - **content_score**: Average of content criteria (1-5) - - **structure_score**: Average of structure criteria (1-5) - - **overall_score**: Combined score scaled to 1-10 -- **output_quality**: Summary quality assessment - - **score**: 1-10 rating (should match rubric overall_score) - - **strengths**: List of positive aspects - - **weaknesses**: List of issues or shortcomings -- **expectation_results**: (Only if expectations provided) - - **passed**: Number of expectations that passed - - **total**: Total number of expectations - - **pass_rate**: Fraction passed (0.0 to 1.0) - - **details**: Individual expectation results - -## Guidelines - -- **Stay blind**: DO NOT try to infer which skill produced which output. Judge purely on output quality. -- **Be specific**: Cite specific examples when explaining strengths and weaknesses. -- **Be decisive**: Choose a winner unless outputs are genuinely equivalent. -- **Output quality first**: Assertion scores are secondary to overall task completion. -- **Be objective**: Don't favor outputs based on style preferences; focus on correctness and completeness. -- **Explain your reasoning**: The reasoning field should make it clear why you chose the winner. -- **Handle edge cases**: If both outputs fail, pick the one that fails less badly. If both are excellent, pick the one that's marginally better. diff --git a/.skills/skill-creator/agents/grader.md b/.skills/skill-creator/agents/grader.md deleted file mode 100644 index 558ab05c0a..0000000000 --- a/.skills/skill-creator/agents/grader.md +++ /dev/null @@ -1,223 +0,0 @@ -# Grader Agent - -Evaluate expectations against an execution transcript and outputs. - -## Role - -The Grader reviews a transcript and output files, then determines whether each expectation passes or fails. Provide clear evidence for each judgment. - -You have two jobs: grade the outputs, and critique the evals themselves. A passing grade on a weak assertion is worse than useless — it creates false confidence. When you notice an assertion that's trivially satisfied, or an important outcome that no assertion checks, say so. - -## Inputs - -You receive these parameters in your prompt: - -- **expectations**: List of expectations to evaluate (strings) -- **transcript_path**: Path to the execution transcript (markdown file) -- **outputs_dir**: Directory containing output files from execution - -## Process - -### Step 1: Read the Transcript - -1. Read the transcript file completely -2. Note the eval prompt, execution steps, and final result -3. Identify any issues or errors documented - -### Step 2: Examine Output Files - -1. List files in outputs_dir -2. Read/examine each file relevant to the expectations. If outputs aren't plain text, use the inspection tools provided in your prompt — don't rely solely on what the transcript says the executor produced. -3. Note contents, structure, and quality - -### Step 3: Evaluate Each Assertion - -For each expectation: - -1. **Search for evidence** in the transcript and outputs -2. **Determine verdict**: - - **PASS**: Clear evidence the expectation is true AND the evidence reflects genuine task completion, not just surface-level compliance - - **FAIL**: No evidence, or evidence contradicts the expectation, or the evidence is superficial (e.g., correct filename but empty/wrong content) -3. **Cite the evidence**: Quote the specific text or describe what you found - -### Step 4: Extract and Verify Claims - -Beyond the predefined expectations, extract implicit claims from the outputs and verify them: - -1. **Extract claims** from the transcript and outputs: - - Factual statements ("The form has 12 fields") - - Process claims ("Used pypdf to fill the form") - - Quality claims ("All fields were filled correctly") - -2. **Verify each claim**: - - **Factual claims**: Can be checked against the outputs or external sources - - **Process claims**: Can be verified from the transcript - - **Quality claims**: Evaluate whether the claim is justified - -3. **Flag unverifiable claims**: Note claims that cannot be verified with available information - -This catches issues that predefined expectations might miss. - -### Step 5: Read User Notes - -If `{outputs_dir}/user_notes.md` exists: -1. Read it and note any uncertainties or issues flagged by the executor -2. Include relevant concerns in the grading output -3. These may reveal problems even when expectations pass - -### Step 6: Critique the Evals - -After grading, consider whether the evals themselves could be improved. Only surface suggestions when there's a clear gap. - -Good suggestions test meaningful outcomes — assertions that are hard to satisfy without actually doing the work correctly. Think about what makes an assertion *discriminating*: it passes when the skill genuinely succeeds and fails when it doesn't. - -Suggestions worth raising: -- An assertion that passed but would also pass for a clearly wrong output (e.g., checking filename existence but not file content) -- An important outcome you observed — good or bad — that no assertion covers at all -- An assertion that can't actually be verified from the available outputs - -Keep the bar high. The goal is to flag things the eval author would say "good catch" about, not to nitpick every assertion. - -### Step 7: Write Grading Results - -Save results to `{outputs_dir}/../grading.json` (sibling to outputs_dir). - -## Grading Criteria - -**PASS when**: -- The transcript or outputs clearly demonstrate the expectation is true -- Specific evidence can be cited -- The evidence reflects genuine substance, not just surface compliance (e.g., a file exists AND contains correct content, not just the right filename) - -**FAIL when**: -- No evidence found for the expectation -- Evidence contradicts the expectation -- The expectation cannot be verified from available information -- The evidence is superficial — the assertion is technically satisfied but the underlying task outcome is wrong or incomplete -- The output appears to meet the assertion by coincidence rather than by actually doing the work - -**When uncertain**: The burden of proof to pass is on the expectation. - -### Step 8: Read Executor Metrics and Timing - -1. If `{outputs_dir}/metrics.json` exists, read it and include in grading output -2. If `{outputs_dir}/../timing.json` exists, read it and include timing data - -## Output Format - -Write a JSON file with this structure: - -```json -{ - "expectations": [ - { - "text": "The output includes the name 'John Smith'", - "passed": true, - "evidence": "Found in transcript Step 3: 'Extracted names: John Smith, Sarah Johnson'" - }, - { - "text": "The spreadsheet has a SUM formula in cell B10", - "passed": false, - "evidence": "No spreadsheet was created. The output was a text file." - }, - { - "text": "The assistant used the skill's OCR script", - "passed": true, - "evidence": "Transcript Step 2 shows: 'Tool: Bash - python ocr_script.py image.png'" - } - ], - "summary": { - "passed": 2, - "failed": 1, - "total": 3, - "pass_rate": 0.67 - }, - "execution_metrics": { - "tool_calls": { - "Read": 5, - "Write": 2, - "Bash": 8 - }, - "total_tool_calls": 15, - "total_steps": 6, - "errors_encountered": 0, - "output_chars": 12450, - "transcript_chars": 3200 - }, - "timing": { - "executor_duration_seconds": 165.0, - "grader_duration_seconds": 26.0, - "total_duration_seconds": 191.0 - }, - "claims": [ - { - "claim": "The form has 12 fillable fields", - "type": "factual", - "verified": true, - "evidence": "Counted 12 fields in field_info.json" - }, - { - "claim": "All required fields were populated", - "type": "quality", - "verified": false, - "evidence": "Reference section was left blank despite data being available" - } - ], - "user_notes_summary": { - "uncertainties": ["Used 2023 data, may be stale"], - "needs_review": [], - "workarounds": ["Fell back to text overlay for non-fillable fields"] - }, - "eval_feedback": { - "suggestions": [ - { - "assertion": "The output includes the name 'John Smith'", - "reason": "A hallucinated document that mentions the name would also pass — consider checking it appears as the primary contact with matching phone and email from the input" - }, - { - "reason": "No assertion checks whether the extracted phone numbers match the input — I observed incorrect numbers in the output that went uncaught" - } - ], - "overall": "Assertions check presence but not correctness. Consider adding content verification." - } -} -``` - -## Field Descriptions - -- **expectations**: Array of graded expectations - - **text**: The original expectation text - - **passed**: Boolean - true if expectation passes - - **evidence**: Specific quote or description supporting the verdict -- **summary**: Aggregate statistics - - **passed**: Count of passed expectations - - **failed**: Count of failed expectations - - **total**: Total expectations evaluated - - **pass_rate**: Fraction passed (0.0 to 1.0) -- **execution_metrics**: Copied from executor's metrics.json (if available) - - **output_chars**: Total character count of output files (proxy for tokens) - - **transcript_chars**: Character count of transcript -- **timing**: Wall clock timing from timing.json (if available) - - **executor_duration_seconds**: Time spent in executor subagent - - **total_duration_seconds**: Total elapsed time for the run -- **claims**: Extracted and verified claims from the output - - **claim**: The statement being verified - - **type**: "factual", "process", or "quality" - - **verified**: Boolean - whether the claim holds - - **evidence**: Supporting or contradicting evidence -- **user_notes_summary**: Issues flagged by the executor - - **uncertainties**: Things the executor wasn't sure about - - **needs_review**: Items requiring human attention - - **workarounds**: Places where the skill didn't work as expected -- **eval_feedback**: Improvement suggestions for the evals (only when warranted) - - **suggestions**: List of concrete suggestions, each with a `reason` and optionally an `assertion` it relates to - - **overall**: Brief assessment — can be "No suggestions, evals look solid" if nothing to flag - -## Guidelines - -- **Be objective**: Base verdicts on evidence, not assumptions -- **Be specific**: Quote the exact text that supports your verdict -- **Be thorough**: Check both transcript and output files -- **Be consistent**: Apply the same standard to each expectation -- **Explain failures**: Make it clear why evidence was insufficient -- **No partial credit**: Each expectation is pass or fail, not partial diff --git a/.skills/skill-creator/assets/eval_review.html b/.skills/skill-creator/assets/eval_review.html deleted file mode 100644 index 938ff32aed..0000000000 --- a/.skills/skill-creator/assets/eval_review.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Eval Set Review - __SKILL_NAME_PLACEHOLDER__ - - - - - - -

Eval Set Review: __SKILL_NAME_PLACEHOLDER__

-

Current description: __SKILL_DESCRIPTION_PLACEHOLDER__

- -
- - -
- - - - - - - - - - -
QueryShould TriggerActions
- -

- - - - diff --git a/.skills/skill-creator/eval-viewer/generate_review.py b/.skills/skill-creator/eval-viewer/generate_review.py deleted file mode 100644 index 7fa5978631..0000000000 --- a/.skills/skill-creator/eval-viewer/generate_review.py +++ /dev/null @@ -1,471 +0,0 @@ -#!/usr/bin/env python3 -"""Generate and serve a review page for eval results. - -Reads the workspace directory, discovers runs (directories with outputs/), -embeds all output data into a self-contained HTML page, and serves it via -a tiny HTTP server. Feedback auto-saves to feedback.json in the workspace. - -Usage: - python generate_review.py [--port PORT] [--skill-name NAME] - python generate_review.py --previous-feedback /path/to/old/feedback.json - -No dependencies beyond the Python stdlib are required. -""" - -import argparse -import base64 -import json -import mimetypes -import os -import re -import signal -import subprocess -import sys -import time -import webbrowser -from functools import partial -from http.server import HTTPServer, BaseHTTPRequestHandler -from pathlib import Path - -# Files to exclude from output listings -METADATA_FILES = {"transcript.md", "user_notes.md", "metrics.json"} - -# Extensions we render as inline text -TEXT_EXTENSIONS = { - ".txt", ".md", ".json", ".csv", ".py", ".js", ".ts", ".tsx", ".jsx", - ".yaml", ".yml", ".xml", ".html", ".css", ".sh", ".rb", ".go", ".rs", - ".java", ".c", ".cpp", ".h", ".hpp", ".sql", ".r", ".toml", -} - -# Extensions we render as inline images -IMAGE_EXTENSIONS = {".png", ".jpg", ".jpeg", ".gif", ".svg", ".webp"} - -# MIME type overrides for common types -MIME_OVERRIDES = { - ".svg": "image/svg+xml", - ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", - ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation", -} - - -def get_mime_type(path: Path) -> str: - ext = path.suffix.lower() - if ext in MIME_OVERRIDES: - return MIME_OVERRIDES[ext] - mime, _ = mimetypes.guess_type(str(path)) - return mime or "application/octet-stream" - - -def find_runs(workspace: Path) -> list[dict]: - """Recursively find directories that contain an outputs/ subdirectory.""" - runs: list[dict] = [] - _find_runs_recursive(workspace, workspace, runs) - runs.sort(key=lambda r: (r.get("eval_id", float("inf")), r["id"])) - return runs - - -def _find_runs_recursive(root: Path, current: Path, runs: list[dict]) -> None: - if not current.is_dir(): - return - - outputs_dir = current / "outputs" - if outputs_dir.is_dir(): - run = build_run(root, current) - if run: - runs.append(run) - return - - skip = {"node_modules", ".git", "__pycache__", "skill", "inputs"} - for child in sorted(current.iterdir()): - if child.is_dir() and child.name not in skip: - _find_runs_recursive(root, child, runs) - - -def build_run(root: Path, run_dir: Path) -> dict | None: - """Build a run dict with prompt, outputs, and grading data.""" - prompt = "" - eval_id = None - - # Try eval_metadata.json - for candidate in [run_dir / "eval_metadata.json", run_dir.parent / "eval_metadata.json"]: - if candidate.exists(): - try: - metadata = json.loads(candidate.read_text()) - prompt = metadata.get("prompt", "") - eval_id = metadata.get("eval_id") - except (json.JSONDecodeError, OSError): - pass - if prompt: - break - - # Fall back to transcript.md - if not prompt: - for candidate in [run_dir / "transcript.md", run_dir / "outputs" / "transcript.md"]: - if candidate.exists(): - try: - text = candidate.read_text() - match = re.search(r"## Eval Prompt\n\n([\s\S]*?)(?=\n##|$)", text) - if match: - prompt = match.group(1).strip() - except OSError: - pass - if prompt: - break - - if not prompt: - prompt = "(No prompt found)" - - run_id = str(run_dir.relative_to(root)).replace("/", "-").replace("\\", "-") - - # Collect output files - outputs_dir = run_dir / "outputs" - output_files: list[dict] = [] - if outputs_dir.is_dir(): - for f in sorted(outputs_dir.iterdir()): - if f.is_file() and f.name not in METADATA_FILES: - output_files.append(embed_file(f)) - - # Load grading if present - grading = None - for candidate in [run_dir / "grading.json", run_dir.parent / "grading.json"]: - if candidate.exists(): - try: - grading = json.loads(candidate.read_text()) - except (json.JSONDecodeError, OSError): - pass - if grading: - break - - return { - "id": run_id, - "prompt": prompt, - "eval_id": eval_id, - "outputs": output_files, - "grading": grading, - } - - -def embed_file(path: Path) -> dict: - """Read a file and return an embedded representation.""" - ext = path.suffix.lower() - mime = get_mime_type(path) - - if ext in TEXT_EXTENSIONS: - try: - content = path.read_text(errors="replace") - except OSError: - content = "(Error reading file)" - return { - "name": path.name, - "type": "text", - "content": content, - } - elif ext in IMAGE_EXTENSIONS: - try: - raw = path.read_bytes() - b64 = base64.b64encode(raw).decode("ascii") - except OSError: - return {"name": path.name, "type": "error", "content": "(Error reading file)"} - return { - "name": path.name, - "type": "image", - "mime": mime, - "data_uri": f"data:{mime};base64,{b64}", - } - elif ext == ".pdf": - try: - raw = path.read_bytes() - b64 = base64.b64encode(raw).decode("ascii") - except OSError: - return {"name": path.name, "type": "error", "content": "(Error reading file)"} - return { - "name": path.name, - "type": "pdf", - "data_uri": f"data:{mime};base64,{b64}", - } - elif ext == ".xlsx": - try: - raw = path.read_bytes() - b64 = base64.b64encode(raw).decode("ascii") - except OSError: - return {"name": path.name, "type": "error", "content": "(Error reading file)"} - return { - "name": path.name, - "type": "xlsx", - "data_b64": b64, - } - else: - # Binary / unknown — base64 download link - try: - raw = path.read_bytes() - b64 = base64.b64encode(raw).decode("ascii") - except OSError: - return {"name": path.name, "type": "error", "content": "(Error reading file)"} - return { - "name": path.name, - "type": "binary", - "mime": mime, - "data_uri": f"data:{mime};base64,{b64}", - } - - -def load_previous_iteration(workspace: Path) -> dict[str, dict]: - """Load previous iteration's feedback and outputs. - - Returns a map of run_id -> {"feedback": str, "outputs": list[dict]}. - """ - result: dict[str, dict] = {} - - # Load feedback - feedback_map: dict[str, str] = {} - feedback_path = workspace / "feedback.json" - if feedback_path.exists(): - try: - data = json.loads(feedback_path.read_text()) - feedback_map = { - r["run_id"]: r["feedback"] - for r in data.get("reviews", []) - if r.get("feedback", "").strip() - } - except (json.JSONDecodeError, OSError, KeyError): - pass - - # Load runs (to get outputs) - prev_runs = find_runs(workspace) - for run in prev_runs: - result[run["id"]] = { - "feedback": feedback_map.get(run["id"], ""), - "outputs": run.get("outputs", []), - } - - # Also add feedback for run_ids that had feedback but no matching run - for run_id, fb in feedback_map.items(): - if run_id not in result: - result[run_id] = {"feedback": fb, "outputs": []} - - return result - - -def generate_html( - runs: list[dict], - skill_name: str, - previous: dict[str, dict] | None = None, - benchmark: dict | None = None, -) -> str: - """Generate the complete standalone HTML page with embedded data.""" - template_path = Path(__file__).parent / "viewer.html" - template = template_path.read_text() - - # Build previous_feedback and previous_outputs maps for the template - previous_feedback: dict[str, str] = {} - previous_outputs: dict[str, list[dict]] = {} - if previous: - for run_id, data in previous.items(): - if data.get("feedback"): - previous_feedback[run_id] = data["feedback"] - if data.get("outputs"): - previous_outputs[run_id] = data["outputs"] - - embedded = { - "skill_name": skill_name, - "runs": runs, - "previous_feedback": previous_feedback, - "previous_outputs": previous_outputs, - } - if benchmark: - embedded["benchmark"] = benchmark - - data_json = json.dumps(embedded) - - return template.replace("/*__EMBEDDED_DATA__*/", f"const EMBEDDED_DATA = {data_json};") - - -# --------------------------------------------------------------------------- -# HTTP server (stdlib only, zero dependencies) -# --------------------------------------------------------------------------- - -def _kill_port(port: int) -> None: - """Kill any process listening on the given port.""" - try: - result = subprocess.run( - ["lsof", "-ti", f":{port}"], - capture_output=True, text=True, timeout=5, - ) - for pid_str in result.stdout.strip().split("\n"): - if pid_str.strip(): - try: - os.kill(int(pid_str.strip()), signal.SIGTERM) - except (ProcessLookupError, ValueError): - pass - if result.stdout.strip(): - time.sleep(0.5) - except subprocess.TimeoutExpired: - pass - except FileNotFoundError: - print("Note: lsof not found, cannot check if port is in use", file=sys.stderr) - -class ReviewHandler(BaseHTTPRequestHandler): - """Serves the review HTML and handles feedback saves. - - Regenerates the HTML on each page load so that refreshing the browser - picks up new eval outputs without restarting the server. - """ - - def __init__( - self, - workspace: Path, - skill_name: str, - feedback_path: Path, - previous: dict[str, dict], - benchmark_path: Path | None, - *args, - **kwargs, - ): - self.workspace = workspace - self.skill_name = skill_name - self.feedback_path = feedback_path - self.previous = previous - self.benchmark_path = benchmark_path - super().__init__(*args, **kwargs) - - def do_GET(self) -> None: - if self.path == "/" or self.path == "/index.html": - # Regenerate HTML on each request (re-scans workspace for new outputs) - runs = find_runs(self.workspace) - benchmark = None - if self.benchmark_path and self.benchmark_path.exists(): - try: - benchmark = json.loads(self.benchmark_path.read_text()) - except (json.JSONDecodeError, OSError): - pass - html = generate_html(runs, self.skill_name, self.previous, benchmark) - content = html.encode("utf-8") - self.send_response(200) - self.send_header("Content-Type", "text/html; charset=utf-8") - self.send_header("Content-Length", str(len(content))) - self.end_headers() - self.wfile.write(content) - elif self.path == "/api/feedback": - data = b"{}" - if self.feedback_path.exists(): - data = self.feedback_path.read_bytes() - self.send_response(200) - self.send_header("Content-Type", "application/json") - self.send_header("Content-Length", str(len(data))) - self.end_headers() - self.wfile.write(data) - else: - self.send_error(404) - - def do_POST(self) -> None: - if self.path == "/api/feedback": - length = int(self.headers.get("Content-Length", 0)) - body = self.rfile.read(length) - try: - data = json.loads(body) - if not isinstance(data, dict) or "reviews" not in data: - raise ValueError("Expected JSON object with 'reviews' key") - self.feedback_path.write_text(json.dumps(data, indent=2) + "\n") - resp = b'{"ok":true}' - self.send_response(200) - except (json.JSONDecodeError, OSError, ValueError) as e: - resp = json.dumps({"error": str(e)}).encode() - self.send_response(500) - self.send_header("Content-Type", "application/json") - self.send_header("Content-Length", str(len(resp))) - self.end_headers() - self.wfile.write(resp) - else: - self.send_error(404) - - def log_message(self, format: str, *args: object) -> None: - # Suppress request logging to keep terminal clean - pass - - -def main() -> None: - parser = argparse.ArgumentParser(description="Generate and serve eval review") - parser.add_argument("workspace", type=Path, help="Path to workspace directory") - parser.add_argument("--port", "-p", type=int, default=3117, help="Server port (default: 3117)") - parser.add_argument("--skill-name", "-n", type=str, default=None, help="Skill name for header") - parser.add_argument( - "--previous-workspace", type=Path, default=None, - help="Path to previous iteration's workspace (shows old outputs and feedback as context)", - ) - parser.add_argument( - "--benchmark", type=Path, default=None, - help="Path to benchmark.json to show in the Benchmark tab", - ) - parser.add_argument( - "--static", "-s", type=Path, default=None, - help="Write standalone HTML to this path instead of starting a server", - ) - args = parser.parse_args() - - workspace = args.workspace.resolve() - if not workspace.is_dir(): - print(f"Error: {workspace} is not a directory", file=sys.stderr) - sys.exit(1) - - runs = find_runs(workspace) - if not runs: - print(f"No runs found in {workspace}", file=sys.stderr) - sys.exit(1) - - skill_name = args.skill_name or workspace.name.replace("-workspace", "") - feedback_path = workspace / "feedback.json" - - previous: dict[str, dict] = {} - if args.previous_workspace: - previous = load_previous_iteration(args.previous_workspace.resolve()) - - benchmark_path = args.benchmark.resolve() if args.benchmark else None - benchmark = None - if benchmark_path and benchmark_path.exists(): - try: - benchmark = json.loads(benchmark_path.read_text()) - except (json.JSONDecodeError, OSError): - pass - - if args.static: - html = generate_html(runs, skill_name, previous, benchmark) - args.static.parent.mkdir(parents=True, exist_ok=True) - args.static.write_text(html) - print(f"\n Static viewer written to: {args.static}\n") - sys.exit(0) - - # Kill any existing process on the target port - port = args.port - _kill_port(port) - handler = partial(ReviewHandler, workspace, skill_name, feedback_path, previous, benchmark_path) - try: - server = HTTPServer(("127.0.0.1", port), handler) - except OSError: - # Port still in use after kill attempt — find a free one - server = HTTPServer(("127.0.0.1", 0), handler) - port = server.server_address[1] - - url = f"http://localhost:{port}" - print(f"\n Eval Viewer") - print(f" ─────────────────────────────────") - print(f" URL: {url}") - print(f" Workspace: {workspace}") - print(f" Feedback: {feedback_path}") - if previous: - print(f" Previous: {args.previous_workspace} ({len(previous)} runs)") - if benchmark_path: - print(f" Benchmark: {benchmark_path}") - print(f"\n Press Ctrl+C to stop.\n") - - webbrowser.open(url) - - try: - server.serve_forever() - except KeyboardInterrupt: - print("\nStopped.") - server.server_close() - - -if __name__ == "__main__": - main() diff --git a/.skills/skill-creator/eval-viewer/viewer.html b/.skills/skill-creator/eval-viewer/viewer.html deleted file mode 100644 index 6d8e96348a..0000000000 --- a/.skills/skill-creator/eval-viewer/viewer.html +++ /dev/null @@ -1,1325 +0,0 @@ - - - - - - Eval Review - - - - - - - -
-
-
-

Eval Review:

-
Review each output and leave feedback below. Navigate with arrow keys or buttons. When done, copy feedback and paste into Claude Code.
-
-
-
- - - - - -
-
- -
-
Prompt
-
-
-
-
- - -
-
Output
-
-
No output files found
-
-
- - - - - - - - -
-
Your Feedback
-
- - - -
-
-
- - -
- - -
-
-
No benchmark data available. Run a benchmark to see quantitative results here.
-
-
-
- - -
-
-

Review Complete

-

Your feedback has been saved. Go back to your Claude Code session and tell Claude you're done reviewing.

-
- -
-
-
- - -
- - - - diff --git a/.skills/skill-creator/references/schemas.md b/.skills/skill-creator/references/schemas.md deleted file mode 100644 index b6eeaa2d4a..0000000000 --- a/.skills/skill-creator/references/schemas.md +++ /dev/null @@ -1,430 +0,0 @@ -# JSON Schemas - -This document defines the JSON schemas used by skill-creator. - ---- - -## evals.json - -Defines the evals for a skill. Located at `evals/evals.json` within the skill directory. - -```json -{ - "skill_name": "example-skill", - "evals": [ - { - "id": 1, - "prompt": "User's example prompt", - "expected_output": "Description of expected result", - "files": ["evals/files/sample1.pdf"], - "expectations": [ - "The output includes X", - "The skill used script Y" - ] - } - ] -} -``` - -**Fields:** -- `skill_name`: Name matching the skill's frontmatter -- `evals[].id`: Unique integer identifier -- `evals[].prompt`: The task to execute -- `evals[].expected_output`: Human-readable description of success -- `evals[].files`: Optional list of input file paths (relative to skill root) -- `evals[].expectations`: List of verifiable statements - ---- - -## history.json - -Tracks version progression in Improve mode. Located at workspace root. - -```json -{ - "started_at": "2026-01-15T10:30:00Z", - "skill_name": "pdf", - "current_best": "v2", - "iterations": [ - { - "version": "v0", - "parent": null, - "expectation_pass_rate": 0.65, - "grading_result": "baseline", - "is_current_best": false - }, - { - "version": "v1", - "parent": "v0", - "expectation_pass_rate": 0.75, - "grading_result": "won", - "is_current_best": false - }, - { - "version": "v2", - "parent": "v1", - "expectation_pass_rate": 0.85, - "grading_result": "won", - "is_current_best": true - } - ] -} -``` - -**Fields:** -- `started_at`: ISO timestamp of when improvement started -- `skill_name`: Name of the skill being improved -- `current_best`: Version identifier of the best performer -- `iterations[].version`: Version identifier (v0, v1, ...) -- `iterations[].parent`: Parent version this was derived from -- `iterations[].expectation_pass_rate`: Pass rate from grading -- `iterations[].grading_result`: "baseline", "won", "lost", or "tie" -- `iterations[].is_current_best`: Whether this is the current best version - ---- - -## grading.json - -Output from the grader agent. Located at `/grading.json`. - -```json -{ - "expectations": [ - { - "text": "The output includes the name 'John Smith'", - "passed": true, - "evidence": "Found in transcript Step 3: 'Extracted names: John Smith, Sarah Johnson'" - }, - { - "text": "The spreadsheet has a SUM formula in cell B10", - "passed": false, - "evidence": "No spreadsheet was created. The output was a text file." - } - ], - "summary": { - "passed": 2, - "failed": 1, - "total": 3, - "pass_rate": 0.67 - }, - "execution_metrics": { - "tool_calls": { - "Read": 5, - "Write": 2, - "Bash": 8 - }, - "total_tool_calls": 15, - "total_steps": 6, - "errors_encountered": 0, - "output_chars": 12450, - "transcript_chars": 3200 - }, - "timing": { - "executor_duration_seconds": 165.0, - "grader_duration_seconds": 26.0, - "total_duration_seconds": 191.0 - }, - "claims": [ - { - "claim": "The form has 12 fillable fields", - "type": "factual", - "verified": true, - "evidence": "Counted 12 fields in field_info.json" - } - ], - "user_notes_summary": { - "uncertainties": ["Used 2023 data, may be stale"], - "needs_review": [], - "workarounds": ["Fell back to text overlay for non-fillable fields"] - }, - "eval_feedback": { - "suggestions": [ - { - "assertion": "The output includes the name 'John Smith'", - "reason": "A hallucinated document that mentions the name would also pass" - } - ], - "overall": "Assertions check presence but not correctness." - } -} -``` - -**Fields:** -- `expectations[]`: Graded expectations with evidence -- `summary`: Aggregate pass/fail counts -- `execution_metrics`: Tool usage and output size (from executor's metrics.json) -- `timing`: Wall clock timing (from timing.json) -- `claims`: Extracted and verified claims from the output -- `user_notes_summary`: Issues flagged by the executor -- `eval_feedback`: (optional) Improvement suggestions for the evals, only present when the grader identifies issues worth raising - ---- - -## metrics.json - -Output from the executor agent. Located at `/outputs/metrics.json`. - -```json -{ - "tool_calls": { - "Read": 5, - "Write": 2, - "Bash": 8, - "Edit": 1, - "Glob": 2, - "Grep": 0 - }, - "total_tool_calls": 18, - "total_steps": 6, - "files_created": ["filled_form.pdf", "field_values.json"], - "errors_encountered": 0, - "output_chars": 12450, - "transcript_chars": 3200 -} -``` - -**Fields:** -- `tool_calls`: Count per tool type -- `total_tool_calls`: Sum of all tool calls -- `total_steps`: Number of major execution steps -- `files_created`: List of output files created -- `errors_encountered`: Number of errors during execution -- `output_chars`: Total character count of output files -- `transcript_chars`: Character count of transcript - ---- - -## timing.json - -Wall clock timing for a run. Located at `/timing.json`. - -**How to capture:** When a subagent task completes, the task notification includes `total_tokens` and `duration_ms`. Save these immediately — they are not persisted anywhere else and cannot be recovered after the fact. - -```json -{ - "total_tokens": 84852, - "duration_ms": 23332, - "total_duration_seconds": 23.3, - "executor_start": "2026-01-15T10:30:00Z", - "executor_end": "2026-01-15T10:32:45Z", - "executor_duration_seconds": 165.0, - "grader_start": "2026-01-15T10:32:46Z", - "grader_end": "2026-01-15T10:33:12Z", - "grader_duration_seconds": 26.0 -} -``` - ---- - -## benchmark.json - -Output from Benchmark mode. Located at `benchmarks//benchmark.json`. - -```json -{ - "metadata": { - "skill_name": "pdf", - "skill_path": "/path/to/pdf", - "executor_model": "claude-sonnet-4-20250514", - "analyzer_model": "most-capable-model", - "timestamp": "2026-01-15T10:30:00Z", - "evals_run": [1, 2, 3], - "runs_per_configuration": 3 - }, - - "runs": [ - { - "eval_id": 1, - "eval_name": "Ocean", - "configuration": "with_skill", - "run_number": 1, - "result": { - "pass_rate": 0.85, - "passed": 6, - "failed": 1, - "total": 7, - "time_seconds": 42.5, - "tokens": 3800, - "tool_calls": 18, - "errors": 0 - }, - "expectations": [ - {"text": "...", "passed": true, "evidence": "..."} - ], - "notes": [ - "Used 2023 data, may be stale", - "Fell back to text overlay for non-fillable fields" - ] - } - ], - - "run_summary": { - "with_skill": { - "pass_rate": {"mean": 0.85, "stddev": 0.05, "min": 0.80, "max": 0.90}, - "time_seconds": {"mean": 45.0, "stddev": 12.0, "min": 32.0, "max": 58.0}, - "tokens": {"mean": 3800, "stddev": 400, "min": 3200, "max": 4100} - }, - "without_skill": { - "pass_rate": {"mean": 0.35, "stddev": 0.08, "min": 0.28, "max": 0.45}, - "time_seconds": {"mean": 32.0, "stddev": 8.0, "min": 24.0, "max": 42.0}, - "tokens": {"mean": 2100, "stddev": 300, "min": 1800, "max": 2500} - }, - "delta": { - "pass_rate": "+0.50", - "time_seconds": "+13.0", - "tokens": "+1700" - } - }, - - "notes": [ - "Assertion 'Output is a PDF file' passes 100% in both configurations - may not differentiate skill value", - "Eval 3 shows high variance (50% ± 40%) - may be flaky or model-dependent", - "Without-skill runs consistently fail on table extraction expectations", - "Skill adds 13s average execution time but improves pass rate by 50%" - ] -} -``` - -**Fields:** -- `metadata`: Information about the benchmark run - - `skill_name`: Name of the skill - - `timestamp`: When the benchmark was run - - `evals_run`: List of eval names or IDs - - `runs_per_configuration`: Number of runs per config (e.g. 3) -- `runs[]`: Individual run results - - `eval_id`: Numeric eval identifier - - `eval_name`: Human-readable eval name (used as section header in the viewer) - - `configuration`: Must be `"with_skill"` or `"without_skill"` (the viewer uses this exact string for grouping and color coding) - - `run_number`: Integer run number (1, 2, 3...) - - `result`: Nested object with `pass_rate`, `passed`, `total`, `time_seconds`, `tokens`, `errors` -- `run_summary`: Statistical aggregates per configuration - - `with_skill` / `without_skill`: Each contains `pass_rate`, `time_seconds`, `tokens` objects with `mean` and `stddev` fields - - `delta`: Difference strings like `"+0.50"`, `"+13.0"`, `"+1700"` -- `notes`: Freeform observations from the analyzer - -**Important:** The viewer reads these field names exactly. Using `config` instead of `configuration`, or putting `pass_rate` at the top level of a run instead of nested under `result`, will cause the viewer to show empty/zero values. Always reference this schema when generating benchmark.json manually. - ---- - -## comparison.json - -Output from blind comparator. Located at `/comparison-N.json`. - -```json -{ - "winner": "A", - "reasoning": "Output A provides a complete solution with proper formatting and all required fields. Output B is missing the date field and has formatting inconsistencies.", - "rubric": { - "A": { - "content": { - "correctness": 5, - "completeness": 5, - "accuracy": 4 - }, - "structure": { - "organization": 4, - "formatting": 5, - "usability": 4 - }, - "content_score": 4.7, - "structure_score": 4.3, - "overall_score": 9.0 - }, - "B": { - "content": { - "correctness": 3, - "completeness": 2, - "accuracy": 3 - }, - "structure": { - "organization": 3, - "formatting": 2, - "usability": 3 - }, - "content_score": 2.7, - "structure_score": 2.7, - "overall_score": 5.4 - } - }, - "output_quality": { - "A": { - "score": 9, - "strengths": ["Complete solution", "Well-formatted", "All fields present"], - "weaknesses": ["Minor style inconsistency in header"] - }, - "B": { - "score": 5, - "strengths": ["Readable output", "Correct basic structure"], - "weaknesses": ["Missing date field", "Formatting inconsistencies", "Partial data extraction"] - } - }, - "expectation_results": { - "A": { - "passed": 4, - "total": 5, - "pass_rate": 0.80, - "details": [ - {"text": "Output includes name", "passed": true} - ] - }, - "B": { - "passed": 3, - "total": 5, - "pass_rate": 0.60, - "details": [ - {"text": "Output includes name", "passed": true} - ] - } - } -} -``` - ---- - -## analysis.json - -Output from post-hoc analyzer. Located at `/analysis.json`. - -```json -{ - "comparison_summary": { - "winner": "A", - "winner_skill": "path/to/winner/skill", - "loser_skill": "path/to/loser/skill", - "comparator_reasoning": "Brief summary of why comparator chose winner" - }, - "winner_strengths": [ - "Clear step-by-step instructions for handling multi-page documents", - "Included validation script that caught formatting errors" - ], - "loser_weaknesses": [ - "Vague instruction 'process the document appropriately' led to inconsistent behavior", - "No script for validation, agent had to improvise" - ], - "instruction_following": { - "winner": { - "score": 9, - "issues": ["Minor: skipped optional logging step"] - }, - "loser": { - "score": 6, - "issues": [ - "Did not use the skill's formatting template", - "Invented own approach instead of following step 3" - ] - } - }, - "improvement_suggestions": [ - { - "priority": "high", - "category": "instructions", - "suggestion": "Replace 'process the document appropriately' with explicit steps", - "expected_impact": "Would eliminate ambiguity that caused inconsistent behavior" - } - ], - "transcript_insights": { - "winner_execution_pattern": "Read skill -> Followed 5-step process -> Used validation script", - "loser_execution_pattern": "Read skill -> Unclear on approach -> Tried 3 different methods" - } -} -``` diff --git a/.skills/skill-creator/scripts/__init__.py b/.skills/skill-creator/scripts/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/.skills/skill-creator/scripts/aggregate_benchmark.py b/.skills/skill-creator/scripts/aggregate_benchmark.py deleted file mode 100644 index 3e66e8c105..0000000000 --- a/.skills/skill-creator/scripts/aggregate_benchmark.py +++ /dev/null @@ -1,401 +0,0 @@ -#!/usr/bin/env python3 -""" -Aggregate individual run results into benchmark summary statistics. - -Reads grading.json files from run directories and produces: -- run_summary with mean, stddev, min, max for each metric -- delta between with_skill and without_skill configurations - -Usage: - python aggregate_benchmark.py - -Example: - python aggregate_benchmark.py benchmarks/2026-01-15T10-30-00/ - -The script supports two directory layouts: - - Workspace layout (from skill-creator iterations): - / - └── eval-N/ - ├── with_skill/ - │ ├── run-1/grading.json - │ └── run-2/grading.json - └── without_skill/ - ├── run-1/grading.json - └── run-2/grading.json - - Legacy layout (with runs/ subdirectory): - / - └── runs/ - └── eval-N/ - ├── with_skill/ - │ └── run-1/grading.json - └── without_skill/ - └── run-1/grading.json -""" - -import argparse -import json -import math -import sys -from datetime import datetime, timezone -from pathlib import Path - - -def calculate_stats(values: list[float]) -> dict: - """Calculate mean, stddev, min, max for a list of values.""" - if not values: - return {"mean": 0.0, "stddev": 0.0, "min": 0.0, "max": 0.0} - - n = len(values) - mean = sum(values) / n - - if n > 1: - variance = sum((x - mean) ** 2 for x in values) / (n - 1) - stddev = math.sqrt(variance) - else: - stddev = 0.0 - - return { - "mean": round(mean, 4), - "stddev": round(stddev, 4), - "min": round(min(values), 4), - "max": round(max(values), 4) - } - - -def load_run_results(benchmark_dir: Path) -> dict: - """ - Load all run results from a benchmark directory. - - Returns dict keyed by config name (e.g. "with_skill"/"without_skill", - or "new_skill"/"old_skill"), each containing a list of run results. - """ - # Support both layouts: eval dirs directly under benchmark_dir, or under runs/ - runs_dir = benchmark_dir / "runs" - if runs_dir.exists(): - search_dir = runs_dir - elif list(benchmark_dir.glob("eval-*")): - search_dir = benchmark_dir - else: - print(f"No eval directories found in {benchmark_dir} or {benchmark_dir / 'runs'}") - return {} - - results: dict[str, list] = {} - - for eval_idx, eval_dir in enumerate(sorted(search_dir.glob("eval-*"))): - metadata_path = eval_dir / "eval_metadata.json" - if metadata_path.exists(): - try: - with open(metadata_path) as mf: - eval_id = json.load(mf).get("eval_id", eval_idx) - except (json.JSONDecodeError, OSError): - eval_id = eval_idx - else: - try: - eval_id = int(eval_dir.name.split("-")[1]) - except ValueError: - eval_id = eval_idx - - # Discover config directories dynamically rather than hardcoding names - for config_dir in sorted(eval_dir.iterdir()): - if not config_dir.is_dir(): - continue - # Skip non-config directories (inputs, outputs, etc.) - if not list(config_dir.glob("run-*")): - continue - config = config_dir.name - if config not in results: - results[config] = [] - - for run_dir in sorted(config_dir.glob("run-*")): - run_number = int(run_dir.name.split("-")[1]) - grading_file = run_dir / "grading.json" - - if not grading_file.exists(): - print(f"Warning: grading.json not found in {run_dir}") - continue - - try: - with open(grading_file) as f: - grading = json.load(f) - except json.JSONDecodeError as e: - print(f"Warning: Invalid JSON in {grading_file}: {e}") - continue - - # Extract metrics - result = { - "eval_id": eval_id, - "run_number": run_number, - "pass_rate": grading.get("summary", {}).get("pass_rate", 0.0), - "passed": grading.get("summary", {}).get("passed", 0), - "failed": grading.get("summary", {}).get("failed", 0), - "total": grading.get("summary", {}).get("total", 0), - } - - # Extract timing — check grading.json first, then sibling timing.json - timing = grading.get("timing", {}) - result["time_seconds"] = timing.get("total_duration_seconds", 0.0) - timing_file = run_dir / "timing.json" - if result["time_seconds"] == 0.0 and timing_file.exists(): - try: - with open(timing_file) as tf: - timing_data = json.load(tf) - result["time_seconds"] = timing_data.get("total_duration_seconds", 0.0) - result["tokens"] = timing_data.get("total_tokens", 0) - except json.JSONDecodeError: - pass - - # Extract metrics if available - metrics = grading.get("execution_metrics", {}) - result["tool_calls"] = metrics.get("total_tool_calls", 0) - if not result.get("tokens"): - result["tokens"] = metrics.get("output_chars", 0) - result["errors"] = metrics.get("errors_encountered", 0) - - # Extract expectations — viewer requires fields: text, passed, evidence - raw_expectations = grading.get("expectations", []) - for exp in raw_expectations: - if "text" not in exp or "passed" not in exp: - print(f"Warning: expectation in {grading_file} missing required fields (text, passed, evidence): {exp}") - result["expectations"] = raw_expectations - - # Extract notes from user_notes_summary - notes_summary = grading.get("user_notes_summary", {}) - notes = [] - notes.extend(notes_summary.get("uncertainties", [])) - notes.extend(notes_summary.get("needs_review", [])) - notes.extend(notes_summary.get("workarounds", [])) - result["notes"] = notes - - results[config].append(result) - - return results - - -def aggregate_results(results: dict) -> dict: - """ - Aggregate run results into summary statistics. - - Returns run_summary with stats for each configuration and delta. - """ - run_summary = {} - configs = list(results.keys()) - - for config in configs: - runs = results.get(config, []) - - if not runs: - run_summary[config] = { - "pass_rate": {"mean": 0.0, "stddev": 0.0, "min": 0.0, "max": 0.0}, - "time_seconds": {"mean": 0.0, "stddev": 0.0, "min": 0.0, "max": 0.0}, - "tokens": {"mean": 0, "stddev": 0, "min": 0, "max": 0} - } - continue - - pass_rates = [r["pass_rate"] for r in runs] - times = [r["time_seconds"] for r in runs] - tokens = [r.get("tokens", 0) for r in runs] - - run_summary[config] = { - "pass_rate": calculate_stats(pass_rates), - "time_seconds": calculate_stats(times), - "tokens": calculate_stats(tokens) - } - - # Calculate delta between the first two configs (if two exist) - if len(configs) >= 2: - primary = run_summary.get(configs[0], {}) - baseline = run_summary.get(configs[1], {}) - else: - primary = run_summary.get(configs[0], {}) if configs else {} - baseline = {} - - delta_pass_rate = primary.get("pass_rate", {}).get("mean", 0) - baseline.get("pass_rate", {}).get("mean", 0) - delta_time = primary.get("time_seconds", {}).get("mean", 0) - baseline.get("time_seconds", {}).get("mean", 0) - delta_tokens = primary.get("tokens", {}).get("mean", 0) - baseline.get("tokens", {}).get("mean", 0) - - run_summary["delta"] = { - "pass_rate": f"{delta_pass_rate:+.2f}", - "time_seconds": f"{delta_time:+.1f}", - "tokens": f"{delta_tokens:+.0f}" - } - - return run_summary - - -def generate_benchmark(benchmark_dir: Path, skill_name: str = "", skill_path: str = "") -> dict: - """ - Generate complete benchmark.json from run results. - """ - results = load_run_results(benchmark_dir) - run_summary = aggregate_results(results) - - # Build runs array for benchmark.json - runs = [] - for config in results: - for result in results[config]: - runs.append({ - "eval_id": result["eval_id"], - "configuration": config, - "run_number": result["run_number"], - "result": { - "pass_rate": result["pass_rate"], - "passed": result["passed"], - "failed": result["failed"], - "total": result["total"], - "time_seconds": result["time_seconds"], - "tokens": result.get("tokens", 0), - "tool_calls": result.get("tool_calls", 0), - "errors": result.get("errors", 0) - }, - "expectations": result["expectations"], - "notes": result["notes"] - }) - - # Determine eval IDs from results - eval_ids = sorted(set( - r["eval_id"] - for config in results.values() - for r in config - )) - - benchmark = { - "metadata": { - "skill_name": skill_name or "", - "skill_path": skill_path or "", - "executor_model": "", - "analyzer_model": "", - "timestamp": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"), - "evals_run": eval_ids, - "runs_per_configuration": 3 - }, - "runs": runs, - "run_summary": run_summary, - "notes": [] # To be filled by analyzer - } - - return benchmark - - -def generate_markdown(benchmark: dict) -> str: - """Generate human-readable benchmark.md from benchmark data.""" - metadata = benchmark["metadata"] - run_summary = benchmark["run_summary"] - - # Determine config names (excluding "delta") - configs = [k for k in run_summary if k != "delta"] - config_a = configs[0] if len(configs) >= 1 else "config_a" - config_b = configs[1] if len(configs) >= 2 else "config_b" - label_a = config_a.replace("_", " ").title() - label_b = config_b.replace("_", " ").title() - - lines = [ - f"# Skill Benchmark: {metadata['skill_name']}", - "", - f"**Model**: {metadata['executor_model']}", - f"**Date**: {metadata['timestamp']}", - f"**Evals**: {', '.join(map(str, metadata['evals_run']))} ({metadata['runs_per_configuration']} runs each per configuration)", - "", - "## Summary", - "", - f"| Metric | {label_a} | {label_b} | Delta |", - "|--------|------------|---------------|-------|", - ] - - a_summary = run_summary.get(config_a, {}) - b_summary = run_summary.get(config_b, {}) - delta = run_summary.get("delta", {}) - - # Format pass rate - a_pr = a_summary.get("pass_rate", {}) - b_pr = b_summary.get("pass_rate", {}) - lines.append(f"| Pass Rate | {a_pr.get('mean', 0)*100:.0f}% ± {a_pr.get('stddev', 0)*100:.0f}% | {b_pr.get('mean', 0)*100:.0f}% ± {b_pr.get('stddev', 0)*100:.0f}% | {delta.get('pass_rate', '—')} |") - - # Format time - a_time = a_summary.get("time_seconds", {}) - b_time = b_summary.get("time_seconds", {}) - lines.append(f"| Time | {a_time.get('mean', 0):.1f}s ± {a_time.get('stddev', 0):.1f}s | {b_time.get('mean', 0):.1f}s ± {b_time.get('stddev', 0):.1f}s | {delta.get('time_seconds', '—')}s |") - - # Format tokens - a_tokens = a_summary.get("tokens", {}) - b_tokens = b_summary.get("tokens", {}) - lines.append(f"| Tokens | {a_tokens.get('mean', 0):.0f} ± {a_tokens.get('stddev', 0):.0f} | {b_tokens.get('mean', 0):.0f} ± {b_tokens.get('stddev', 0):.0f} | {delta.get('tokens', '—')} |") - - # Notes section - if benchmark.get("notes"): - lines.extend([ - "", - "## Notes", - "" - ]) - for note in benchmark["notes"]: - lines.append(f"- {note}") - - return "\n".join(lines) - - -def main(): - parser = argparse.ArgumentParser( - description="Aggregate benchmark run results into summary statistics" - ) - parser.add_argument( - "benchmark_dir", - type=Path, - help="Path to the benchmark directory" - ) - parser.add_argument( - "--skill-name", - default="", - help="Name of the skill being benchmarked" - ) - parser.add_argument( - "--skill-path", - default="", - help="Path to the skill being benchmarked" - ) - parser.add_argument( - "--output", "-o", - type=Path, - help="Output path for benchmark.json (default: /benchmark.json)" - ) - - args = parser.parse_args() - - if not args.benchmark_dir.exists(): - print(f"Directory not found: {args.benchmark_dir}") - sys.exit(1) - - # Generate benchmark - benchmark = generate_benchmark(args.benchmark_dir, args.skill_name, args.skill_path) - - # Determine output paths - output_json = args.output or (args.benchmark_dir / "benchmark.json") - output_md = output_json.with_suffix(".md") - - # Write benchmark.json - with open(output_json, "w") as f: - json.dump(benchmark, f, indent=2) - print(f"Generated: {output_json}") - - # Write benchmark.md - markdown = generate_markdown(benchmark) - with open(output_md, "w") as f: - f.write(markdown) - print(f"Generated: {output_md}") - - # Print summary - run_summary = benchmark["run_summary"] - configs = [k for k in run_summary if k != "delta"] - delta = run_summary.get("delta", {}) - - print(f"\nSummary:") - for config in configs: - pr = run_summary[config]["pass_rate"]["mean"] - label = config.replace("_", " ").title() - print(f" {label}: {pr*100:.1f}% pass rate") - print(f" Delta: {delta.get('pass_rate', '—')}") - - -if __name__ == "__main__": - main() diff --git a/.skills/skill-creator/scripts/generate_report.py b/.skills/skill-creator/scripts/generate_report.py deleted file mode 100644 index 959e30a001..0000000000 --- a/.skills/skill-creator/scripts/generate_report.py +++ /dev/null @@ -1,326 +0,0 @@ -#!/usr/bin/env python3 -"""Generate an HTML report from run_loop.py output. - -Takes the JSON output from run_loop.py and generates a visual HTML report -showing each description attempt with check/x for each test case. -Distinguishes between train and test queries. -""" - -import argparse -import html -import json -import sys -from pathlib import Path - - -def generate_html(data: dict, auto_refresh: bool = False, skill_name: str = "") -> str: - """Generate HTML report from loop output data. If auto_refresh is True, adds a meta refresh tag.""" - history = data.get("history", []) - holdout = data.get("holdout", 0) - title_prefix = html.escape(skill_name + " \u2014 ") if skill_name else "" - - # Get all unique queries from train and test sets, with should_trigger info - train_queries: list[dict] = [] - test_queries: list[dict] = [] - if history: - for r in history[0].get("train_results", history[0].get("results", [])): - train_queries.append({"query": r["query"], "should_trigger": r.get("should_trigger", True)}) - if history[0].get("test_results"): - for r in history[0].get("test_results", []): - test_queries.append({"query": r["query"], "should_trigger": r.get("should_trigger", True)}) - - refresh_tag = ' \n' if auto_refresh else "" - - html_parts = [""" - - - -""" + refresh_tag + """ """ + title_prefix + """Skill Description Optimization - - - - - - -

""" + title_prefix + """Skill Description Optimization

-
- Optimizing your skill's description. This page updates automatically as Claude tests different versions of your skill's description. Each row is an iteration — a new description attempt. The columns show test queries: green checkmarks mean the skill triggered correctly (or correctly didn't trigger), red crosses mean it got it wrong. The "Train" score shows performance on queries used to improve the description; the "Test" score shows performance on held-out queries the optimizer hasn't seen. When it's done, Claude will apply the best-performing description to your skill. -
-"""] - - # Summary section - best_test_score = data.get('best_test_score') - best_train_score = data.get('best_train_score') - html_parts.append(f""" -
-

Original: {html.escape(data.get('original_description', 'N/A'))}

-

Best: {html.escape(data.get('best_description', 'N/A'))}

-

Best Score: {data.get('best_score', 'N/A')} {'(test)' if best_test_score else '(train)'}

-

Iterations: {data.get('iterations_run', 0)} | Train: {data.get('train_size', '?')} | Test: {data.get('test_size', '?')}

-
-""") - - # Legend - html_parts.append(""" -
- Query columns: - Should trigger - Should NOT trigger - Train - Test -
-""") - - # Table header - html_parts.append(""" -
- - - - - - - -""") - - # Add column headers for train queries - for qinfo in train_queries: - polarity = "positive-col" if qinfo["should_trigger"] else "negative-col" - html_parts.append(f' \n') - - # Add column headers for test queries (different color) - for qinfo in test_queries: - polarity = "positive-col" if qinfo["should_trigger"] else "negative-col" - html_parts.append(f' \n') - - html_parts.append(""" - - -""") - - # Find best iteration for highlighting - if test_queries: - best_iter = max(history, key=lambda h: h.get("test_passed") or 0).get("iteration") - else: - best_iter = max(history, key=lambda h: h.get("train_passed", h.get("passed", 0))).get("iteration") - - # Add rows for each iteration - for h in history: - iteration = h.get("iteration", "?") - train_passed = h.get("train_passed", h.get("passed", 0)) - train_total = h.get("train_total", h.get("total", 0)) - test_passed = h.get("test_passed") - test_total = h.get("test_total") - description = h.get("description", "") - train_results = h.get("train_results", h.get("results", [])) - test_results = h.get("test_results", []) - - # Create lookups for results by query - train_by_query = {r["query"]: r for r in train_results} - test_by_query = {r["query"]: r for r in test_results} if test_results else {} - - # Compute aggregate correct/total runs across all retries - def aggregate_runs(results: list[dict]) -> tuple[int, int]: - correct = 0 - total = 0 - for r in results: - runs = r.get("runs", 0) - triggers = r.get("triggers", 0) - total += runs - if r.get("should_trigger", True): - correct += triggers - else: - correct += runs - triggers - return correct, total - - train_correct, train_runs = aggregate_runs(train_results) - test_correct, test_runs = aggregate_runs(test_results) - - # Determine score classes - def score_class(correct: int, total: int) -> str: - if total > 0: - ratio = correct / total - if ratio >= 0.8: - return "score-good" - elif ratio >= 0.5: - return "score-ok" - return "score-bad" - - train_class = score_class(train_correct, train_runs) - test_class = score_class(test_correct, test_runs) - - row_class = "best-row" if iteration == best_iter else "" - - html_parts.append(f""" - - - - -""") - - # Add result for each train query - for qinfo in train_queries: - r = train_by_query.get(qinfo["query"], {}) - did_pass = r.get("pass", False) - triggers = r.get("triggers", 0) - runs = r.get("runs", 0) - - icon = "✓" if did_pass else "✗" - css_class = "pass" if did_pass else "fail" - - html_parts.append(f' \n') - - # Add result for each test query (with different background) - for qinfo in test_queries: - r = test_by_query.get(qinfo["query"], {}) - did_pass = r.get("pass", False) - triggers = r.get("triggers", 0) - runs = r.get("runs", 0) - - icon = "✓" if did_pass else "✗" - css_class = "pass" if did_pass else "fail" - - html_parts.append(f' \n') - - html_parts.append(" \n") - - html_parts.append(""" -
IterTrainTestDescription{html.escape(qinfo["query"])}{html.escape(qinfo["query"])}
{iteration}{train_correct}/{train_runs}{test_correct}/{test_runs}{html.escape(description)}{icon}{triggers}/{runs}{icon}{triggers}/{runs}
-
-""") - - html_parts.append(""" - - -""") - - return "".join(html_parts) - - -def main(): - parser = argparse.ArgumentParser(description="Generate HTML report from run_loop output") - parser.add_argument("input", help="Path to JSON output from run_loop.py (or - for stdin)") - parser.add_argument("-o", "--output", default=None, help="Output HTML file (default: stdout)") - parser.add_argument("--skill-name", default="", help="Skill name to include in the report title") - args = parser.parse_args() - - if args.input == "-": - data = json.load(sys.stdin) - else: - data = json.loads(Path(args.input).read_text()) - - html_output = generate_html(data, skill_name=args.skill_name) - - if args.output: - Path(args.output).write_text(html_output) - print(f"Report written to {args.output}", file=sys.stderr) - else: - print(html_output) - - -if __name__ == "__main__": - main() diff --git a/.skills/skill-creator/scripts/improve_description.py b/.skills/skill-creator/scripts/improve_description.py deleted file mode 100644 index a270777b9a..0000000000 --- a/.skills/skill-creator/scripts/improve_description.py +++ /dev/null @@ -1,248 +0,0 @@ -#!/usr/bin/env python3 -"""Improve a skill description based on eval results. - -Takes eval results (from run_eval.py) and generates an improved description -using Claude with extended thinking. -""" - -import argparse -import json -import re -import sys -from pathlib import Path - -import anthropic - -from scripts.utils import parse_skill_md - - -def improve_description( - client: anthropic.Anthropic, - skill_name: str, - skill_content: str, - current_description: str, - eval_results: dict, - history: list[dict], - model: str, - test_results: dict | None = None, - log_dir: Path | None = None, - iteration: int | None = None, -) -> str: - """Call Claude to improve the description based on eval results.""" - failed_triggers = [ - r for r in eval_results["results"] - if r["should_trigger"] and not r["pass"] - ] - false_triggers = [ - r for r in eval_results["results"] - if not r["should_trigger"] and not r["pass"] - ] - - # Build scores summary - train_score = f"{eval_results['summary']['passed']}/{eval_results['summary']['total']}" - if test_results: - test_score = f"{test_results['summary']['passed']}/{test_results['summary']['total']}" - scores_summary = f"Train: {train_score}, Test: {test_score}" - else: - scores_summary = f"Train: {train_score}" - - prompt = f"""You are optimizing a skill description for a Claude Code skill called "{skill_name}". A "skill" is sort of like a prompt, but with progressive disclosure -- there's a title and description that Claude sees when deciding whether to use the skill, and then if it does use the skill, it reads the .md file which has lots more details and potentially links to other resources in the skill folder like helper files and scripts and additional documentation or examples. - -The description appears in Claude's "available_skills" list. When a user sends a query, Claude decides whether to invoke the skill based solely on the title and on this description. Your goal is to write a description that triggers for relevant queries, and doesn't trigger for irrelevant ones. - -Here's the current description: - -"{current_description}" - - -Current scores ({scores_summary}): - -""" - if failed_triggers: - prompt += "FAILED TO TRIGGER (should have triggered but didn't):\n" - for r in failed_triggers: - prompt += f' - "{r["query"]}" (triggered {r["triggers"]}/{r["runs"]} times)\n' - prompt += "\n" - - if false_triggers: - prompt += "FALSE TRIGGERS (triggered but shouldn't have):\n" - for r in false_triggers: - prompt += f' - "{r["query"]}" (triggered {r["triggers"]}/{r["runs"]} times)\n' - prompt += "\n" - - if history: - prompt += "PREVIOUS ATTEMPTS (do NOT repeat these — try something structurally different):\n\n" - for h in history: - train_s = f"{h.get('train_passed', h.get('passed', 0))}/{h.get('train_total', h.get('total', 0))}" - test_s = f"{h.get('test_passed', '?')}/{h.get('test_total', '?')}" if h.get('test_passed') is not None else None - score_str = f"train={train_s}" + (f", test={test_s}" if test_s else "") - prompt += f'\n' - prompt += f'Description: "{h["description"]}"\n' - if "results" in h: - prompt += "Train results:\n" - for r in h["results"]: - status = "PASS" if r["pass"] else "FAIL" - prompt += f' [{status}] "{r["query"][:80]}" (triggered {r["triggers"]}/{r["runs"]})\n' - if h.get("note"): - prompt += f'Note: {h["note"]}\n' - prompt += "\n\n" - - prompt += f""" - -Skill content (for context on what the skill does): - -{skill_content} - - -Based on the failures, write a new and improved description that is more likely to trigger correctly. When I say "based on the failures", it's a bit of a tricky line to walk because we don't want to overfit to the specific cases you're seeing. So what I DON'T want you to do is produce an ever-expanding list of specific queries that this skill should or shouldn't trigger for. Instead, try to generalize from the failures to broader categories of user intent and situations where this skill would be useful or not useful. The reason for this is twofold: - -1. Avoid overfitting -2. The list might get loooong and it's injected into ALL queries and there might be a lot of skills, so we don't want to blow too much space on any given description. - -Concretely, your description should not be more than about 100-200 words, even if that comes at the cost of accuracy. - -Here are some tips that we've found to work well in writing these descriptions: -- The skill should be phrased in the imperative -- "Use this skill for" rather than "this skill does" -- The skill description should focus on the user's intent, what they are trying to achieve, vs. the implementation details of how the skill works. -- The description competes with other skills for Claude's attention — make it distinctive and immediately recognizable. -- If you're getting lots of failures after repeated attempts, change things up. Try different sentence structures or wordings. - -I'd encourage you to be creative and mix up the style in different iterations since you'll have multiple opportunities to try different approaches and we'll just grab the highest-scoring one at the end. - -Please respond with only the new description text in tags, nothing else.""" - - response = client.messages.create( - model=model, - max_tokens=16000, - thinking={ - "type": "enabled", - "budget_tokens": 10000, - }, - messages=[{"role": "user", "content": prompt}], - ) - - # Extract thinking and text from response - thinking_text = "" - text = "" - for block in response.content: - if block.type == "thinking": - thinking_text = block.thinking - elif block.type == "text": - text = block.text - - # Parse out the tags - match = re.search(r"(.*?)", text, re.DOTALL) - description = match.group(1).strip().strip('"') if match else text.strip().strip('"') - - # Log the transcript - transcript: dict = { - "iteration": iteration, - "prompt": prompt, - "thinking": thinking_text, - "response": text, - "parsed_description": description, - "char_count": len(description), - "over_limit": len(description) > 1024, - } - - # If over 1024 chars, ask the model to shorten it - if len(description) > 1024: - shorten_prompt = f"Your description is {len(description)} characters, which exceeds the hard 1024 character limit. Please rewrite it to be under 1024 characters while preserving the most important trigger words and intent coverage. Respond with only the new description in tags." - shorten_response = client.messages.create( - model=model, - max_tokens=16000, - thinking={ - "type": "enabled", - "budget_tokens": 10000, - }, - messages=[ - {"role": "user", "content": prompt}, - {"role": "assistant", "content": text}, - {"role": "user", "content": shorten_prompt}, - ], - ) - - shorten_thinking = "" - shorten_text = "" - for block in shorten_response.content: - if block.type == "thinking": - shorten_thinking = block.thinking - elif block.type == "text": - shorten_text = block.text - - match = re.search(r"(.*?)", shorten_text, re.DOTALL) - shortened = match.group(1).strip().strip('"') if match else shorten_text.strip().strip('"') - - transcript["rewrite_prompt"] = shorten_prompt - transcript["rewrite_thinking"] = shorten_thinking - transcript["rewrite_response"] = shorten_text - transcript["rewrite_description"] = shortened - transcript["rewrite_char_count"] = len(shortened) - description = shortened - - transcript["final_description"] = description - - if log_dir: - log_dir.mkdir(parents=True, exist_ok=True) - log_file = log_dir / f"improve_iter_{iteration or 'unknown'}.json" - log_file.write_text(json.dumps(transcript, indent=2)) - - return description - - -def main(): - parser = argparse.ArgumentParser(description="Improve a skill description based on eval results") - parser.add_argument("--eval-results", required=True, help="Path to eval results JSON (from run_eval.py)") - parser.add_argument("--skill-path", required=True, help="Path to skill directory") - parser.add_argument("--history", default=None, help="Path to history JSON (previous attempts)") - parser.add_argument("--model", required=True, help="Model for improvement") - parser.add_argument("--verbose", action="store_true", help="Print thinking to stderr") - args = parser.parse_args() - - skill_path = Path(args.skill_path) - if not (skill_path / "SKILL.md").exists(): - print(f"Error: No SKILL.md found at {skill_path}", file=sys.stderr) - sys.exit(1) - - eval_results = json.loads(Path(args.eval_results).read_text()) - history = [] - if args.history: - history = json.loads(Path(args.history).read_text()) - - name, _, content = parse_skill_md(skill_path) - current_description = eval_results["description"] - - if args.verbose: - print(f"Current: {current_description}", file=sys.stderr) - print(f"Score: {eval_results['summary']['passed']}/{eval_results['summary']['total']}", file=sys.stderr) - - client = anthropic.Anthropic() - new_description = improve_description( - client=client, - skill_name=name, - skill_content=content, - current_description=current_description, - eval_results=eval_results, - history=history, - model=args.model, - ) - - if args.verbose: - print(f"Improved: {new_description}", file=sys.stderr) - - # Output as JSON with both the new description and updated history - output = { - "description": new_description, - "history": history + [{ - "description": current_description, - "passed": eval_results["summary"]["passed"], - "failed": eval_results["summary"]["failed"], - "total": eval_results["summary"]["total"], - "results": eval_results["results"], - }], - } - print(json.dumps(output, indent=2)) - - -if __name__ == "__main__": - main() diff --git a/.skills/skill-creator/scripts/package_skill.py b/.skills/skill-creator/scripts/package_skill.py deleted file mode 100644 index f48eac4446..0000000000 --- a/.skills/skill-creator/scripts/package_skill.py +++ /dev/null @@ -1,136 +0,0 @@ -#!/usr/bin/env python3 -""" -Skill Packager - Creates a distributable .skill file of a skill folder - -Usage: - python utils/package_skill.py [output-directory] - -Example: - python utils/package_skill.py skills/public/my-skill - python utils/package_skill.py skills/public/my-skill ./dist -""" - -import fnmatch -import sys -import zipfile -from pathlib import Path -from scripts.quick_validate import validate_skill - -# Patterns to exclude when packaging skills. -EXCLUDE_DIRS = {"__pycache__", "node_modules"} -EXCLUDE_GLOBS = {"*.pyc"} -EXCLUDE_FILES = {".DS_Store"} -# Directories excluded only at the skill root (not when nested deeper). -ROOT_EXCLUDE_DIRS = {"evals"} - - -def should_exclude(rel_path: Path) -> bool: - """Check if a path should be excluded from packaging.""" - parts = rel_path.parts - if any(part in EXCLUDE_DIRS for part in parts): - return True - # rel_path is relative to skill_path.parent, so parts[0] is the skill - # folder name and parts[1] (if present) is the first subdir. - if len(parts) > 1 and parts[1] in ROOT_EXCLUDE_DIRS: - return True - name = rel_path.name - if name in EXCLUDE_FILES: - return True - return any(fnmatch.fnmatch(name, pat) for pat in EXCLUDE_GLOBS) - - -def package_skill(skill_path, output_dir=None): - """ - Package a skill folder into a .skill file. - - Args: - skill_path: Path to the skill folder - output_dir: Optional output directory for the .skill file (defaults to current directory) - - Returns: - Path to the created .skill file, or None if error - """ - skill_path = Path(skill_path).resolve() - - # Validate skill folder exists - if not skill_path.exists(): - print(f"❌ Error: Skill folder not found: {skill_path}") - return None - - if not skill_path.is_dir(): - print(f"❌ Error: Path is not a directory: {skill_path}") - return None - - # Validate SKILL.md exists - skill_md = skill_path / "SKILL.md" - if not skill_md.exists(): - print(f"❌ Error: SKILL.md not found in {skill_path}") - return None - - # Run validation before packaging - print("🔍 Validating skill...") - valid, message = validate_skill(skill_path) - if not valid: - print(f"❌ Validation failed: {message}") - print(" Please fix the validation errors before packaging.") - return None - print(f"✅ {message}\n") - - # Determine output location - skill_name = skill_path.name - if output_dir: - output_path = Path(output_dir).resolve() - output_path.mkdir(parents=True, exist_ok=True) - else: - output_path = Path.cwd() - - skill_filename = output_path / f"{skill_name}.skill" - - # Create the .skill file (zip format) - try: - with zipfile.ZipFile(skill_filename, 'w', zipfile.ZIP_DEFLATED) as zipf: - # Walk through the skill directory, excluding build artifacts - for file_path in skill_path.rglob('*'): - if not file_path.is_file(): - continue - arcname = file_path.relative_to(skill_path.parent) - if should_exclude(arcname): - print(f" Skipped: {arcname}") - continue - zipf.write(file_path, arcname) - print(f" Added: {arcname}") - - print(f"\n✅ Successfully packaged skill to: {skill_filename}") - return skill_filename - - except Exception as e: - print(f"❌ Error creating .skill file: {e}") - return None - - -def main(): - if len(sys.argv) < 2: - print("Usage: python utils/package_skill.py [output-directory]") - print("\nExample:") - print(" python utils/package_skill.py skills/public/my-skill") - print(" python utils/package_skill.py skills/public/my-skill ./dist") - sys.exit(1) - - skill_path = sys.argv[1] - output_dir = sys.argv[2] if len(sys.argv) > 2 else None - - print(f"📦 Packaging skill: {skill_path}") - if output_dir: - print(f" Output directory: {output_dir}") - print() - - result = package_skill(skill_path, output_dir) - - if result: - sys.exit(0) - else: - sys.exit(1) - - -if __name__ == "__main__": - main() diff --git a/.skills/skill-creator/scripts/quick_validate.py b/.skills/skill-creator/scripts/quick_validate.py deleted file mode 100644 index ed8e1dddce..0000000000 --- a/.skills/skill-creator/scripts/quick_validate.py +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bin/env python3 -""" -Quick validation script for skills - minimal version -""" - -import sys -import os -import re -import yaml -from pathlib import Path - -def validate_skill(skill_path): - """Basic validation of a skill""" - skill_path = Path(skill_path) - - # Check SKILL.md exists - skill_md = skill_path / 'SKILL.md' - if not skill_md.exists(): - return False, "SKILL.md not found" - - # Read and validate frontmatter - content = skill_md.read_text() - if not content.startswith('---'): - return False, "No YAML frontmatter found" - - # Extract frontmatter - match = re.match(r'^---\n(.*?)\n---', content, re.DOTALL) - if not match: - return False, "Invalid frontmatter format" - - frontmatter_text = match.group(1) - - # Parse YAML frontmatter - try: - frontmatter = yaml.safe_load(frontmatter_text) - if not isinstance(frontmatter, dict): - return False, "Frontmatter must be a YAML dictionary" - except yaml.YAMLError as e: - return False, f"Invalid YAML in frontmatter: {e}" - - # Define allowed properties - ALLOWED_PROPERTIES = {'name', 'description', 'license', 'allowed-tools', 'metadata', 'compatibility'} - - # Check for unexpected properties (excluding nested keys under metadata) - unexpected_keys = set(frontmatter.keys()) - ALLOWED_PROPERTIES - if unexpected_keys: - return False, ( - f"Unexpected key(s) in SKILL.md frontmatter: {', '.join(sorted(unexpected_keys))}. " - f"Allowed properties are: {', '.join(sorted(ALLOWED_PROPERTIES))}" - ) - - # Check required fields - if 'name' not in frontmatter: - return False, "Missing 'name' in frontmatter" - if 'description' not in frontmatter: - return False, "Missing 'description' in frontmatter" - - # Extract name for validation - name = frontmatter.get('name', '') - if not isinstance(name, str): - return False, f"Name must be a string, got {type(name).__name__}" - name = name.strip() - if name: - # Check naming convention (kebab-case: lowercase with hyphens) - if not re.match(r'^[a-z0-9-]+$', name): - return False, f"Name '{name}' should be kebab-case (lowercase letters, digits, and hyphens only)" - if name.startswith('-') or name.endswith('-') or '--' in name: - return False, f"Name '{name}' cannot start/end with hyphen or contain consecutive hyphens" - # Check name length (max 64 characters per spec) - if len(name) > 64: - return False, f"Name is too long ({len(name)} characters). Maximum is 64 characters." - - # Extract and validate description - description = frontmatter.get('description', '') - if not isinstance(description, str): - return False, f"Description must be a string, got {type(description).__name__}" - description = description.strip() - if description: - # Check for angle brackets - if '<' in description or '>' in description: - return False, "Description cannot contain angle brackets (< or >)" - # Check description length (max 1024 characters per spec) - if len(description) > 1024: - return False, f"Description is too long ({len(description)} characters). Maximum is 1024 characters." - - # Validate compatibility field if present (optional) - compatibility = frontmatter.get('compatibility', '') - if compatibility: - if not isinstance(compatibility, str): - return False, f"Compatibility must be a string, got {type(compatibility).__name__}" - if len(compatibility) > 500: - return False, f"Compatibility is too long ({len(compatibility)} characters). Maximum is 500 characters." - - return True, "Skill is valid!" - -if __name__ == "__main__": - if len(sys.argv) != 2: - print("Usage: python quick_validate.py ") - sys.exit(1) - - valid, message = validate_skill(sys.argv[1]) - print(message) - sys.exit(0 if valid else 1) \ No newline at end of file diff --git a/.skills/skill-creator/scripts/run_eval.py b/.skills/skill-creator/scripts/run_eval.py deleted file mode 100644 index e58c70bea3..0000000000 --- a/.skills/skill-creator/scripts/run_eval.py +++ /dev/null @@ -1,310 +0,0 @@ -#!/usr/bin/env python3 -"""Run trigger evaluation for a skill description. - -Tests whether a skill's description causes Claude to trigger (read the skill) -for a set of queries. Outputs results as JSON. -""" - -import argparse -import json -import os -import select -import subprocess -import sys -import time -import uuid -from concurrent.futures import ProcessPoolExecutor, as_completed -from pathlib import Path - -from scripts.utils import parse_skill_md - - -def find_project_root() -> Path: - """Find the project root by walking up from cwd looking for .claude/. - - Mimics how Claude Code discovers its project root, so the command file - we create ends up where claude -p will look for it. - """ - current = Path.cwd() - for parent in [current, *current.parents]: - if (parent / ".claude").is_dir(): - return parent - return current - - -def run_single_query( - query: str, - skill_name: str, - skill_description: str, - timeout: int, - project_root: str, - model: str | None = None, -) -> bool: - """Run a single query and return whether the skill was triggered. - - Creates a command file in .claude/commands/ so it appears in Claude's - available_skills list, then runs `claude -p` with the raw query. - Uses --include-partial-messages to detect triggering early from - stream events (content_block_start) rather than waiting for the - full assistant message, which only arrives after tool execution. - """ - unique_id = uuid.uuid4().hex[:8] - clean_name = f"{skill_name}-skill-{unique_id}" - project_commands_dir = Path(project_root) / ".claude" / "commands" - command_file = project_commands_dir / f"{clean_name}.md" - - try: - project_commands_dir.mkdir(parents=True, exist_ok=True) - # Use YAML block scalar to avoid breaking on quotes in description - indented_desc = "\n ".join(skill_description.split("\n")) - command_content = ( - f"---\n" - f"description: |\n" - f" {indented_desc}\n" - f"---\n\n" - f"# {skill_name}\n\n" - f"This skill handles: {skill_description}\n" - ) - command_file.write_text(command_content) - - cmd = [ - "claude", - "-p", query, - "--output-format", "stream-json", - "--verbose", - "--include-partial-messages", - ] - if model: - cmd.extend(["--model", model]) - - # Remove CLAUDECODE env var to allow nesting claude -p inside a - # Claude Code session. The guard is for interactive terminal conflicts; - # programmatic subprocess usage is safe. - env = {k: v for k, v in os.environ.items() if k != "CLAUDECODE"} - - process = subprocess.Popen( - cmd, - stdout=subprocess.PIPE, - stderr=subprocess.DEVNULL, - cwd=project_root, - env=env, - ) - - triggered = False - start_time = time.time() - buffer = "" - # Track state for stream event detection - pending_tool_name = None - accumulated_json = "" - - try: - while time.time() - start_time < timeout: - if process.poll() is not None: - remaining = process.stdout.read() - if remaining: - buffer += remaining.decode("utf-8", errors="replace") - break - - ready, _, _ = select.select([process.stdout], [], [], 1.0) - if not ready: - continue - - chunk = os.read(process.stdout.fileno(), 8192) - if not chunk: - break - buffer += chunk.decode("utf-8", errors="replace") - - while "\n" in buffer: - line, buffer = buffer.split("\n", 1) - line = line.strip() - if not line: - continue - - try: - event = json.loads(line) - except json.JSONDecodeError: - continue - - # Early detection via stream events - if event.get("type") == "stream_event": - se = event.get("event", {}) - se_type = se.get("type", "") - - if se_type == "content_block_start": - cb = se.get("content_block", {}) - if cb.get("type") == "tool_use": - tool_name = cb.get("name", "") - if tool_name in ("Skill", "Read"): - pending_tool_name = tool_name - accumulated_json = "" - else: - return False - - elif se_type == "content_block_delta" and pending_tool_name: - delta = se.get("delta", {}) - if delta.get("type") == "input_json_delta": - accumulated_json += delta.get("partial_json", "") - if clean_name in accumulated_json: - return True - - elif se_type in ("content_block_stop", "message_stop"): - if pending_tool_name: - return clean_name in accumulated_json - if se_type == "message_stop": - return False - - # Fallback: full assistant message - elif event.get("type") == "assistant": - message = event.get("message", {}) - for content_item in message.get("content", []): - if content_item.get("type") != "tool_use": - continue - tool_name = content_item.get("name", "") - tool_input = content_item.get("input", {}) - if tool_name == "Skill" and clean_name in tool_input.get("skill", ""): - triggered = True - elif tool_name == "Read" and clean_name in tool_input.get("file_path", ""): - triggered = True - return triggered - - elif event.get("type") == "result": - return triggered - finally: - # Clean up process on any exit path (return, exception, timeout) - if process.poll() is None: - process.kill() - process.wait() - - return triggered - finally: - if command_file.exists(): - command_file.unlink() - - -def run_eval( - eval_set: list[dict], - skill_name: str, - description: str, - num_workers: int, - timeout: int, - project_root: Path, - runs_per_query: int = 1, - trigger_threshold: float = 0.5, - model: str | None = None, -) -> dict: - """Run the full eval set and return results.""" - results = [] - - with ProcessPoolExecutor(max_workers=num_workers) as executor: - future_to_info = {} - for item in eval_set: - for run_idx in range(runs_per_query): - future = executor.submit( - run_single_query, - item["query"], - skill_name, - description, - timeout, - str(project_root), - model, - ) - future_to_info[future] = (item, run_idx) - - query_triggers: dict[str, list[bool]] = {} - query_items: dict[str, dict] = {} - for future in as_completed(future_to_info): - item, _ = future_to_info[future] - query = item["query"] - query_items[query] = item - if query not in query_triggers: - query_triggers[query] = [] - try: - query_triggers[query].append(future.result()) - except Exception as e: - print(f"Warning: query failed: {e}", file=sys.stderr) - query_triggers[query].append(False) - - for query, triggers in query_triggers.items(): - item = query_items[query] - trigger_rate = sum(triggers) / len(triggers) - should_trigger = item["should_trigger"] - if should_trigger: - did_pass = trigger_rate >= trigger_threshold - else: - did_pass = trigger_rate < trigger_threshold - results.append({ - "query": query, - "should_trigger": should_trigger, - "trigger_rate": trigger_rate, - "triggers": sum(triggers), - "runs": len(triggers), - "pass": did_pass, - }) - - passed = sum(1 for r in results if r["pass"]) - total = len(results) - - return { - "skill_name": skill_name, - "description": description, - "results": results, - "summary": { - "total": total, - "passed": passed, - "failed": total - passed, - }, - } - - -def main(): - parser = argparse.ArgumentParser(description="Run trigger evaluation for a skill description") - parser.add_argument("--eval-set", required=True, help="Path to eval set JSON file") - parser.add_argument("--skill-path", required=True, help="Path to skill directory") - parser.add_argument("--description", default=None, help="Override description to test") - parser.add_argument("--num-workers", type=int, default=10, help="Number of parallel workers") - parser.add_argument("--timeout", type=int, default=30, help="Timeout per query in seconds") - parser.add_argument("--runs-per-query", type=int, default=3, help="Number of runs per query") - parser.add_argument("--trigger-threshold", type=float, default=0.5, help="Trigger rate threshold") - parser.add_argument("--model", default=None, help="Model to use for claude -p (default: user's configured model)") - parser.add_argument("--verbose", action="store_true", help="Print progress to stderr") - args = parser.parse_args() - - eval_set = json.loads(Path(args.eval_set).read_text()) - skill_path = Path(args.skill_path) - - if not (skill_path / "SKILL.md").exists(): - print(f"Error: No SKILL.md found at {skill_path}", file=sys.stderr) - sys.exit(1) - - name, original_description, content = parse_skill_md(skill_path) - description = args.description or original_description - project_root = find_project_root() - - if args.verbose: - print(f"Evaluating: {description}", file=sys.stderr) - - output = run_eval( - eval_set=eval_set, - skill_name=name, - description=description, - num_workers=args.num_workers, - timeout=args.timeout, - project_root=project_root, - runs_per_query=args.runs_per_query, - trigger_threshold=args.trigger_threshold, - model=args.model, - ) - - if args.verbose: - summary = output["summary"] - print(f"Results: {summary['passed']}/{summary['total']} passed", file=sys.stderr) - for r in output["results"]: - status = "PASS" if r["pass"] else "FAIL" - rate_str = f"{r['triggers']}/{r['runs']}" - print(f" [{status}] rate={rate_str} expected={r['should_trigger']}: {r['query'][:70]}", file=sys.stderr) - - print(json.dumps(output, indent=2)) - - -if __name__ == "__main__": - main() diff --git a/.skills/skill-creator/scripts/run_loop.py b/.skills/skill-creator/scripts/run_loop.py deleted file mode 100644 index 36f9b4e054..0000000000 --- a/.skills/skill-creator/scripts/run_loop.py +++ /dev/null @@ -1,332 +0,0 @@ -#!/usr/bin/env python3 -"""Run the eval + improve loop until all pass or max iterations reached. - -Combines run_eval.py and improve_description.py in a loop, tracking history -and returning the best description found. Supports train/test split to prevent -overfitting. -""" - -import argparse -import json -import random -import sys -import tempfile -import time -import webbrowser -from pathlib import Path - -import anthropic - -from scripts.generate_report import generate_html -from scripts.improve_description import improve_description -from scripts.run_eval import find_project_root, run_eval -from scripts.utils import parse_skill_md - - -def split_eval_set(eval_set: list[dict], holdout: float, seed: int = 42) -> tuple[list[dict], list[dict]]: - """Split eval set into train and test sets, stratified by should_trigger.""" - random.seed(seed) - - # Separate by should_trigger - trigger = [e for e in eval_set if e["should_trigger"]] - no_trigger = [e for e in eval_set if not e["should_trigger"]] - - # Shuffle each group - random.shuffle(trigger) - random.shuffle(no_trigger) - - # Calculate split points - n_trigger_test = max(1, int(len(trigger) * holdout)) - n_no_trigger_test = max(1, int(len(no_trigger) * holdout)) - - # Split - test_set = trigger[:n_trigger_test] + no_trigger[:n_no_trigger_test] - train_set = trigger[n_trigger_test:] + no_trigger[n_no_trigger_test:] - - return train_set, test_set - - -def run_loop( - eval_set: list[dict], - skill_path: Path, - description_override: str | None, - num_workers: int, - timeout: int, - max_iterations: int, - runs_per_query: int, - trigger_threshold: float, - holdout: float, - model: str, - verbose: bool, - live_report_path: Path | None = None, - log_dir: Path | None = None, -) -> dict: - """Run the eval + improvement loop.""" - project_root = find_project_root() - name, original_description, content = parse_skill_md(skill_path) - current_description = description_override or original_description - - # Split into train/test if holdout > 0 - if holdout > 0: - train_set, test_set = split_eval_set(eval_set, holdout) - if verbose: - print(f"Split: {len(train_set)} train, {len(test_set)} test (holdout={holdout})", file=sys.stderr) - else: - train_set = eval_set - test_set = [] - - client = anthropic.Anthropic() - history = [] - exit_reason = "unknown" - - for iteration in range(1, max_iterations + 1): - if verbose: - print(f"\n{'='*60}", file=sys.stderr) - print(f"Iteration {iteration}/{max_iterations}", file=sys.stderr) - print(f"Description: {current_description}", file=sys.stderr) - print(f"{'='*60}", file=sys.stderr) - - # Evaluate train + test together in one batch for parallelism - all_queries = train_set + test_set - t0 = time.time() - all_results = run_eval( - eval_set=all_queries, - skill_name=name, - description=current_description, - num_workers=num_workers, - timeout=timeout, - project_root=project_root, - runs_per_query=runs_per_query, - trigger_threshold=trigger_threshold, - model=model, - ) - eval_elapsed = time.time() - t0 - - # Split results back into train/test by matching queries - train_queries_set = {q["query"] for q in train_set} - train_result_list = [r for r in all_results["results"] if r["query"] in train_queries_set] - test_result_list = [r for r in all_results["results"] if r["query"] not in train_queries_set] - - train_passed = sum(1 for r in train_result_list if r["pass"]) - train_total = len(train_result_list) - train_summary = {"passed": train_passed, "failed": train_total - train_passed, "total": train_total} - train_results = {"results": train_result_list, "summary": train_summary} - - if test_set: - test_passed = sum(1 for r in test_result_list if r["pass"]) - test_total = len(test_result_list) - test_summary = {"passed": test_passed, "failed": test_total - test_passed, "total": test_total} - test_results = {"results": test_result_list, "summary": test_summary} - else: - test_results = None - test_summary = None - - history.append({ - "iteration": iteration, - "description": current_description, - "train_passed": train_summary["passed"], - "train_failed": train_summary["failed"], - "train_total": train_summary["total"], - "train_results": train_results["results"], - "test_passed": test_summary["passed"] if test_summary else None, - "test_failed": test_summary["failed"] if test_summary else None, - "test_total": test_summary["total"] if test_summary else None, - "test_results": test_results["results"] if test_results else None, - # For backward compat with report generator - "passed": train_summary["passed"], - "failed": train_summary["failed"], - "total": train_summary["total"], - "results": train_results["results"], - }) - - # Write live report if path provided - if live_report_path: - partial_output = { - "original_description": original_description, - "best_description": current_description, - "best_score": "in progress", - "iterations_run": len(history), - "holdout": holdout, - "train_size": len(train_set), - "test_size": len(test_set), - "history": history, - } - live_report_path.write_text(generate_html(partial_output, auto_refresh=True, skill_name=name)) - - if verbose: - def print_eval_stats(label, results, elapsed): - pos = [r for r in results if r["should_trigger"]] - neg = [r for r in results if not r["should_trigger"]] - tp = sum(r["triggers"] for r in pos) - pos_runs = sum(r["runs"] for r in pos) - fn = pos_runs - tp - fp = sum(r["triggers"] for r in neg) - neg_runs = sum(r["runs"] for r in neg) - tn = neg_runs - fp - total = tp + tn + fp + fn - precision = tp / (tp + fp) if (tp + fp) > 0 else 1.0 - recall = tp / (tp + fn) if (tp + fn) > 0 else 1.0 - accuracy = (tp + tn) / total if total > 0 else 0.0 - print(f"{label}: {tp+tn}/{total} correct, precision={precision:.0%} recall={recall:.0%} accuracy={accuracy:.0%} ({elapsed:.1f}s)", file=sys.stderr) - for r in results: - status = "PASS" if r["pass"] else "FAIL" - rate_str = f"{r['triggers']}/{r['runs']}" - print(f" [{status}] rate={rate_str} expected={r['should_trigger']}: {r['query'][:60]}", file=sys.stderr) - - print_eval_stats("Train", train_results["results"], eval_elapsed) - if test_summary: - print_eval_stats("Test ", test_results["results"], 0) - - if train_summary["failed"] == 0: - exit_reason = f"all_passed (iteration {iteration})" - if verbose: - print(f"\nAll train queries passed on iteration {iteration}!", file=sys.stderr) - break - - if iteration == max_iterations: - exit_reason = f"max_iterations ({max_iterations})" - if verbose: - print(f"\nMax iterations reached ({max_iterations}).", file=sys.stderr) - break - - # Improve the description based on train results - if verbose: - print(f"\nImproving description...", file=sys.stderr) - - t0 = time.time() - # Strip test scores from history so improvement model can't see them - blinded_history = [ - {k: v for k, v in h.items() if not k.startswith("test_")} - for h in history - ] - new_description = improve_description( - client=client, - skill_name=name, - skill_content=content, - current_description=current_description, - eval_results=train_results, - history=blinded_history, - model=model, - log_dir=log_dir, - iteration=iteration, - ) - improve_elapsed = time.time() - t0 - - if verbose: - print(f"Proposed ({improve_elapsed:.1f}s): {new_description}", file=sys.stderr) - - current_description = new_description - - # Find the best iteration by TEST score (or train if no test set) - if test_set: - best = max(history, key=lambda h: h["test_passed"] or 0) - best_score = f"{best['test_passed']}/{best['test_total']}" - else: - best = max(history, key=lambda h: h["train_passed"]) - best_score = f"{best['train_passed']}/{best['train_total']}" - - if verbose: - print(f"\nExit reason: {exit_reason}", file=sys.stderr) - print(f"Best score: {best_score} (iteration {best['iteration']})", file=sys.stderr) - - return { - "exit_reason": exit_reason, - "original_description": original_description, - "best_description": best["description"], - "best_score": best_score, - "best_train_score": f"{best['train_passed']}/{best['train_total']}", - "best_test_score": f"{best['test_passed']}/{best['test_total']}" if test_set else None, - "final_description": current_description, - "iterations_run": len(history), - "holdout": holdout, - "train_size": len(train_set), - "test_size": len(test_set), - "history": history, - } - - -def main(): - parser = argparse.ArgumentParser(description="Run eval + improve loop") - parser.add_argument("--eval-set", required=True, help="Path to eval set JSON file") - parser.add_argument("--skill-path", required=True, help="Path to skill directory") - parser.add_argument("--description", default=None, help="Override starting description") - parser.add_argument("--num-workers", type=int, default=10, help="Number of parallel workers") - parser.add_argument("--timeout", type=int, default=30, help="Timeout per query in seconds") - parser.add_argument("--max-iterations", type=int, default=5, help="Max improvement iterations") - parser.add_argument("--runs-per-query", type=int, default=3, help="Number of runs per query") - parser.add_argument("--trigger-threshold", type=float, default=0.5, help="Trigger rate threshold") - parser.add_argument("--holdout", type=float, default=0.4, help="Fraction of eval set to hold out for testing (0 to disable)") - parser.add_argument("--model", required=True, help="Model for improvement") - parser.add_argument("--verbose", action="store_true", help="Print progress to stderr") - parser.add_argument("--report", default="auto", help="Generate HTML report at this path (default: 'auto' for temp file, 'none' to disable)") - parser.add_argument("--results-dir", default=None, help="Save all outputs (results.json, report.html, log.txt) to a timestamped subdirectory here") - args = parser.parse_args() - - eval_set = json.loads(Path(args.eval_set).read_text()) - skill_path = Path(args.skill_path) - - if not (skill_path / "SKILL.md").exists(): - print(f"Error: No SKILL.md found at {skill_path}", file=sys.stderr) - sys.exit(1) - - name, _, _ = parse_skill_md(skill_path) - - # Set up live report path - if args.report != "none": - if args.report == "auto": - timestamp = time.strftime("%Y%m%d_%H%M%S") - live_report_path = Path(tempfile.gettempdir()) / f"skill_description_report_{skill_path.name}_{timestamp}.html" - else: - live_report_path = Path(args.report) - # Open the report immediately so the user can watch - live_report_path.write_text("

Starting optimization loop...

") - webbrowser.open(str(live_report_path)) - else: - live_report_path = None - - # Determine output directory (create before run_loop so logs can be written) - if args.results_dir: - timestamp = time.strftime("%Y-%m-%d_%H%M%S") - results_dir = Path(args.results_dir) / timestamp - results_dir.mkdir(parents=True, exist_ok=True) - else: - results_dir = None - - log_dir = results_dir / "logs" if results_dir else None - - output = run_loop( - eval_set=eval_set, - skill_path=skill_path, - description_override=args.description, - num_workers=args.num_workers, - timeout=args.timeout, - max_iterations=args.max_iterations, - runs_per_query=args.runs_per_query, - trigger_threshold=args.trigger_threshold, - holdout=args.holdout, - model=args.model, - verbose=args.verbose, - live_report_path=live_report_path, - log_dir=log_dir, - ) - - # Save JSON output - json_output = json.dumps(output, indent=2) - print(json_output) - if results_dir: - (results_dir / "results.json").write_text(json_output) - - # Write final HTML report (without auto-refresh) - if live_report_path: - live_report_path.write_text(generate_html(output, auto_refresh=False, skill_name=name)) - print(f"\nReport: {live_report_path}", file=sys.stderr) - - if results_dir and live_report_path: - (results_dir / "report.html").write_text(generate_html(output, auto_refresh=False, skill_name=name)) - - if results_dir: - print(f"Results saved to: {results_dir}", file=sys.stderr) - - -if __name__ == "__main__": - main() diff --git a/.skills/skill-creator/scripts/utils.py b/.skills/skill-creator/scripts/utils.py deleted file mode 100644 index 51b6a07dd5..0000000000 --- a/.skills/skill-creator/scripts/utils.py +++ /dev/null @@ -1,47 +0,0 @@ -"""Shared utilities for skill-creator scripts.""" - -from pathlib import Path - - - -def parse_skill_md(skill_path: Path) -> tuple[str, str, str]: - """Parse a SKILL.md file, returning (name, description, full_content).""" - content = (skill_path / "SKILL.md").read_text() - lines = content.split("\n") - - if lines[0].strip() != "---": - raise ValueError("SKILL.md missing frontmatter (no opening ---)") - - end_idx = None - for i, line in enumerate(lines[1:], start=1): - if line.strip() == "---": - end_idx = i - break - - if end_idx is None: - raise ValueError("SKILL.md missing frontmatter (no closing ---)") - - name = "" - description = "" - frontmatter_lines = lines[1:end_idx] - i = 0 - while i < len(frontmatter_lines): - line = frontmatter_lines[i] - if line.startswith("name:"): - name = line[len("name:"):].strip().strip('"').strip("'") - elif line.startswith("description:"): - value = line[len("description:"):].strip() - # Handle YAML multiline indicators (>, |, >-, |-) - if value in (">", "|", ">-", "|-"): - continuation_lines: list[str] = [] - i += 1 - while i < len(frontmatter_lines) and (frontmatter_lines[i].startswith(" ") or frontmatter_lines[i].startswith("\t")): - continuation_lines.append(frontmatter_lines[i].strip()) - i += 1 - description = " ".join(continuation_lines) - continue - else: - description = value.strip('"').strip("'") - i += 1 - - return name, description, content diff --git a/.skills/writing-skills/SKILL.md b/.skills/writing-skills/SKILL.md deleted file mode 100644 index 514e2c4fed..0000000000 --- a/.skills/writing-skills/SKILL.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -name: writing-skills -description: "Use when creating, updating, or improving agent skills." ---- - -# Writing Skills (Excellence) - -Dispatcher for skill creation excellence. Use the decision tree below to find the right template and standards. - -## Quick Decision Tree - -### What do you need to do? - -1. **Create a NEW skill:** - - Is it simple (single file, <200 lines)? -> [Tier 1 Architecture](references/tier-1-simple/README.md) - - Is it complex (multi-concept, 200-1000 lines)? -> [Tier 2 Architecture](references/tier-2-expanded/README.md) - - Is it a massive platform (10+ products, AWS, Convex)? -> [Tier 3 Architecture](references/tier-3-platform/README.md) - -2. **Improve an EXISTING skill:** - - Fix "it's too long" -> [Modularize (Tier 3)](references/templates/tier-3-platform.md) - - Fix "AI ignores rules" -> [Anti-Rationalization](references/anti-rationalization/README.md) - - Fix "users can't find it" -> [CSO (Search Optimization)](references/cso/README.md) - -3. **Verify Compliance:** - - Check metadata/naming -> [Standards](references/standards/README.md) - - Add tests -> [Testing Guide](references/testing/README.md) - -## Component Index - -| Component | Purpose | -|-----------|---------| -| **[CSO](references/cso/README.md)** | "SEO for LLMs". How to write descriptions that trigger. | -| **[Standards](references/standards/README.md)** | File naming, YAML frontmatter, directory structure. | -| **[Anti-Rationalization](references/anti-rationalization/README.md)**| How to write rules that agents won't ignore. | -| **[Testing](references/testing/README.md)** | How to ensure your skill actually works. | - -## Templates - -- [Technique Skill](references/templates/technique.md) (How-to) -- [Reference Skill](references/templates/reference.md) (Docs) -- [Discipline Skill](references/templates/discipline.md) (Rules) -- [Pattern Skill](references/templates/pattern.md) (Design Patterns) - -## When to Use -- Creating a NEW skill from scratch -- Improving an EXISTING skill that agents ignore -- Debugging why a skill isn't being triggered -- Standardizing skills across a team - -## How It Works - -1. **Identify goal** -> Use decision tree above -2. **Select template** -> From `references/templates/` -3. **Apply CSO** -> Optimize description for discovery -4. **Add anti-rationalization** -> For discipline skills -5. **Test** -> RED-GREEN-REFACTOR cycle - -## Quick Example - -```yaml ---- -name: my-technique -description: Use when [specific symptom occurs]. -metadata: - category: technique - triggers: error-text, symptom, tool-name ---- - -# My Technique - -## When to Use -- [Symptom A] -- [Error message] -``` - -## Common Mistakes - -| Mistake | Fix | -|---------|-----| -| Description summarizes workflow | Use "Use when..." triggers only | -| No `metadata.triggers` | Add 3+ keywords | -| Generic name ("helper") | Use gerund (`creating-skills`) | -| Long monolithic SKILL.md | Split into `references/` | - -See [gotchas.md](gotchas.md) for more. - -## Pre-Deploy Checklist - -Before deploying any skill: - -- [ ] `name` field matches directory name exactly -- [ ] `SKILL.md` filename is ALL CAPS -- [ ] Description starts with "Use when..." -- [ ] `metadata.triggers` has 3+ keywords -- [ ] Total lines < 500 (use `references/` for more) -- [ ] No `@` force-loading in cross-references -- [ ] Tested with real scenarios diff --git a/.skills/writing-skills/examples.md b/.skills/writing-skills/examples.md deleted file mode 100644 index 3f0ee6817a..0000000000 --- a/.skills/writing-skills/examples.md +++ /dev/null @@ -1,236 +0,0 @@ -# Skill Templates & Examples - -Complete, copy-paste templates for each skill type. - ---- - -## Template: Technique Skill - -For how-to guides that teach a specific method. - -```markdown ---- -name: technique-name -description: >- - Use when [specific symptom]. -metadata: - category: technique - triggers: error-text, symptom, tool-name ---- - -# Technique Name - -## Overview - -[1-2 sentence core principle] - -## When to Use - -- [Symptom A] -- [Symptom B] -- [Error message text] - -**NOT for:** -- [When to avoid] - -## The Problem - -\`\`\`javascript -// Bad example -function badCode() { - // problematic pattern -} -\`\`\` - -## The Solution - -\`\`\`javascript -// Good example -function goodCode() { - // improved pattern -} -\`\`\` - -## Step-by-Step - -1. [First step] -2. [Second step] -3. [Final step] - -## Quick Reference - -| Scenario | Approach | -|----------|----------| -| Case A | Solution A | -| Case B | Solution B | - -## Common Mistakes - -**Mistake 1:** [Description] -- Wrong: \`bad code\` -- Right: \`good code\` -``` - ---- - -## Template: Reference Skill - -For documentation, APIs, and lookup tables. - -```markdown ---- -name: reference-name -description: >- - Use when working with [domain]. -metadata: - category: reference - triggers: tool, api, specific-terms ---- - -# Reference Name - -## Quick Reference - -| Command | Purpose | -|---------|---------| -| \`cmd1\` | Does X | -| \`cmd2\` | Does Y | - -## Common Patterns - -**Pattern A:** -\`\`\`bash -example command -\`\`\` - -**Pattern B:** -\`\`\`bash -another example -\`\`\` - -## Detailed Docs - -For more options, run \`--help\` or see: -- patterns.md -- [examples.md](examples.md) -``` - ---- - -## Template: Discipline Skill - -For rules that agents must follow. Requires anti-rationalization techniques. - -```markdown ---- -name: discipline-name -description: >- - Use when [BEFORE violation]. -metadata: - category: discipline - triggers: new feature, code change, implementation ---- - -# Rule Name - -## Iron Law - -**[SINGLE SENTENCE ABSOLUTE RULE]** - -Violating the letter IS violating the spirit. - -## The Rule - -1. ALWAYS [step 1] -2. NEVER [step 2] -3. [Step 3] - -## Violations - -[Action before rule]? **Delete it. Start over.** - -**No exceptions:** -- Don't keep it as "reference" -- Don't "adapt" it -- Delete means delete - -## Common Rationalizations - -| Excuse | Reality | -|--------|---------| -| "Too simple" | Simple code breaks. Rule takes 30 seconds. | -| "I'll do it after" | After = never. Do it now. | -| "Spirit not ritual" | The ritual IS the spirit. | - -## Red Flags - STOP - -- [Flag 1] -- [Flag 2] -- "This is different because..." - -**All mean:** Delete. Start over. - -## Valid Exceptions - -- [Exception 1] -- [Exception 2] - -**Everything else:** Follow the rule. -``` - ---- - -## Template: Pattern Skill - -For mental models and design patterns. - -```markdown ---- -name: pattern-name -description: >- - Use when [recognizable symptom]. -metadata: - category: pattern - triggers: complexity, hard-to-follow, nested ---- - -# Pattern Name - -## The Pattern - -[1-2 sentence core idea] - -## Recognition Signs - -- [Sign that pattern applies] -- [Another sign] -- [Code smell] - -## Before - -\`\`\`typescript -// Complex/problematic -function before() { - // nested, confusing -} -\`\`\` - -## After - -\`\`\`typescript -// Clean/improved -function after() { - // flat, clear -} -\`\`\` - -## When NOT to Use - -- [Over-engineering case] -- [Simple case that doesn't need it] - -## Impact - -**Before:** [Problem metric] -**After:** [Improved metric] -``` diff --git a/.skills/writing-skills/gotchas.md b/.skills/writing-skills/gotchas.md deleted file mode 100644 index df68732201..0000000000 --- a/.skills/writing-skills/gotchas.md +++ /dev/null @@ -1,175 +0,0 @@ ---- -description: Common pitfalls and tribal knowledge for skill creation. -metadata: - tags: [gotchas, troubleshooting, mistakes] ---- - -# Skill Writing Gotchas - -Tribal knowledge to avoid common mistakes. - -## YAML Frontmatter - -### Invalid Syntax - -```yaml -# BAD: Mixed list and map -metadata: - references: - triggers: a, b, c - - item1 - - item2 - -# GOOD: Consistent structure -metadata: - triggers: a, b, c - references: - - item1 - - item2 -``` - -### Multiline Description - -```yaml -# BAD: Line breaks create parsing errors -description: Use when creating skills. - Also for updating. - -# GOOD: Use YAML multiline syntax -description: >- - Use when creating or updating skills. - Triggers: new skill, update skill -``` - -## Naming - -### Directory Must Match `name` Field - -``` -# BAD -directory: my-skill/ -name: mySkill # Mismatch! - -# GOOD -directory: my-skill/ -name: my-skill # Exact match -``` - -### SKILL.md Must Be ALL CAPS - -``` -# BAD -skill.md -Skill.md - -# GOOD -SKILL.md -``` - -## Discovery - -### Description = Triggers, NOT Workflow - -```yaml -# BAD: Agent reads this and skips the full skill -description: Analyzes code, finds bugs, suggests fixes - -# GOOD: Agent reads full skill to understand workflow -description: Use when debugging errors or reviewing code quality -``` - -### Pre-Violation Triggers for Discipline Skills - -```yaml -# BAD: Triggers AFTER violation -description: Use when you forgot to write tests - -# GOOD: Triggers BEFORE violation -description: Use when implementing any feature, before writing code -``` - -## Token Efficiency - -### Skill Loaded Every Conversation = Token Drain - -- Frequently-loaded skills: <200 words -- All others: <500 words -- Move details to `references/` files - -### Don't Duplicate CLI Help - -```markdown -# BAD: 50 lines documenting all flags - -# GOOD: One line -Run `mytool --help` for all options. -``` - -## Anti-Rationalization (Discipline Skills Only) - -### Agents Are Smart at Finding Loopholes - -```markdown -# BAD: Trust agents will "get the spirit" -Write test before code. - -# GOOD: Close every loophole explicitly -Write test before code. - -**No exceptions:** -- Don't keep code as "reference" -- Don't "adapt" existing code -- Delete means delete -``` - -### Build Rationalization Table - -Every excuse from baseline testing goes in the table: - -| Excuse | Reality | -|--------|---------| -| "Too simple to test" | Simple code breaks. Test takes 30 seconds. | -| "I'll test after" | Tests-after prove nothing immediately. | - -## Cross-References - -### Keep References One Level Deep - -```markdown -# BAD: Nested chain (A -> B -> C) -See [patterns.md] -> which links to [advanced.md] -> which links to [deep.md] - -# GOOD: Flat (A -> B, A -> C) -See [patterns.md] and [advanced.md] -``` - -### Never Force-Load with @ - -```markdown -# BAD: Burns context immediately -@skills/my-skill/SKILL.md - -# GOOD: Agent loads when needed -See [my-skill] for details. -``` - -## Tier Selection - -### Don't Overthink Tier Choice - -```markdown -# BAD: Starting with Tier 3 "just in case" -# Result: Wasted effort, empty reference files - -# GOOD: Start with Tier 1, upgrade when needed -# Can always add references/ later -``` - -### Signals You Need to Upgrade - -| Signal | Action | -|--------|--------| -| SKILL.md > 200 lines | -> Tier 2 | -| 3+ related sub-topics | -> Tier 2 | -| 10+ products/services | -> Tier 3 | -| "I need X" vs "I want Y" | -> Tier 3 decision trees | diff --git a/.skills/writing-skills/persuasion-principles.md b/.skills/writing-skills/persuasion-principles.md deleted file mode 100644 index 311e57d4aa..0000000000 --- a/.skills/writing-skills/persuasion-principles.md +++ /dev/null @@ -1,86 +0,0 @@ -# Persuasion Principles for Skill Design - -## Overview - -LLMs respond to the same persuasion principles as humans. Understanding this psychology helps you design more effective skills - not to manipulate, but to ensure critical practices are followed even under pressure. - -**Research foundation:** Meincke et al. (2025) tested 7 persuasion principles with N=28,000 AI conversations. Persuasion techniques more than doubled compliance rates (33% to 72%, p < .001). - -## The Seven Principles - -### 1. Authority -**What it is:** Deference to expertise, credentials, or official sources. - -**How it works in skills:** -- Imperative language: "YOU MUST", "Never", "Always" -- Non-negotiable framing: "No exceptions" -- Eliminates decision fatigue and rationalization - -**When to use:** -- Discipline-enforcing skills (TDD, verification requirements) -- Safety-critical practices -- Established best practices - -### 2. Commitment -**What it is:** Consistency with prior actions, statements, or public declarations. - -**How it works in skills:** -- Require announcements: "Announce skill usage" -- Force explicit choices: "Choose A, B, or C" -- Use tracking: TodoWrite for checklists - -### 3. Scarcity -**What it is:** Urgency from time limits or limited availability. - -**How it works in skills:** -- Time-bound requirements: "Before proceeding" -- Sequential dependencies: "Immediately after X" -- Prevents procrastination - -### 4. Social Proof -**What it is:** Conformity to what others do or what's considered normal. - -**How it works in skills:** -- Universal patterns: "Every time", "Always" -- Failure modes: "X without Y = failure" -- Establishes norms - -### 5. Unity -**What it is:** Shared identity, "we-ness", in-group belonging. - -**How it works in skills:** -- Collaborative language: "our codebase", "we're colleagues" -- Shared goals: "we both want quality" - -### 6. Reciprocity -**What it is:** Obligation to return benefits received. -- Use sparingly - can feel manipulative -- Rarely needed in skills - -### 7. Liking -**What it is:** Preference for cooperating with those we like. -- **DON'T USE for compliance** -- Conflicts with honest feedback culture - -## Principle Combinations by Skill Type - -| Skill Type | Use | Avoid | -|------------|-----|-------| -| Discipline-enforcing | Authority + Commitment + Social Proof | Liking, Reciprocity | -| Guidance/technique | Moderate Authority + Unity | Heavy authority | -| Collaborative | Unity + Commitment | Authority, Liking | -| Reference | Clarity only | All persuasion | - -## Ethical Use - -**Legitimate:** -- Ensuring critical practices are followed -- Creating effective documentation -- Preventing predictable failures - -**The test:** Would this technique serve the user's genuine interests if they fully understood it? - -## Research Citations - -**Cialdini, R. B. (2021).** *Influence: The Psychology of Persuasion (New and Expanded).* Harper Business. -**Meincke, L., et al. (2025).** Call Me A Jerk: Persuading AI to Comply with Objectionable Requests. University of Pennsylvania. diff --git a/.skills/writing-skills/references/anti-rationalization/README.md b/.skills/writing-skills/references/anti-rationalization/README.md deleted file mode 100644 index 92ee74e4ae..0000000000 --- a/.skills/writing-skills/references/anti-rationalization/README.md +++ /dev/null @@ -1,85 +0,0 @@ -# Anti-Rationalization Guide - -Techniques for bulletproofing skills against agent rationalization. - -## The Problem - -Discipline-enforcing skills face a unique challenge: smart agents under pressure will find loopholes. - -## Technique 1: Close Every Loophole Explicitly - -Don't just state the rule - forbid specific workarounds. - -### Bad Example -```markdown -Write code before test? Delete it. -``` - -### Good Example -```markdown -Write code before test? Delete it. Start over. - -**No exceptions**: -- Don't keep it as "reference" -- Don't "adapt" it while writing tests -- Don't look at it -- Delete means delete -``` - -## Technique 2: Address "Spirit vs Letter" Arguments - -Add foundational principle early: - -```markdown -**Violating the letter of the rules is violating the spirit of the rules.** -``` - -## Technique 3: Build Rationalization Table - -| Excuse | Reality | -|--------|---------| -| "Too simple to test" | Simple code breaks. Test takes 30 seconds. | -| "I'll test after" | Tests passing immediately prove nothing. | -| "Spirit not ritual" | The letter IS the spirit. | - -## Technique 4: Create Red Flags List - -```markdown -## Red Flags - STOP and Start Over -- Code before test -- "I already manually tested it" -- "This is different because..." - -**All of these mean**: Delete code. Start over. -``` - -## Technique 5: Use Strong Language - -```markdown -# Weak (invites rationalization) -You should write tests first. - -# Strong (no wiggle room) -ALWAYS write test first. -NEVER write code before test. -``` - -## Technique 6: Provide Escape Hatch for Legitimate Cases - -```markdown -## When NOT to Use -- Spike solutions (throwaway exploratory code) -- One-time scripts deleting in 1 hour - -**Everything else**: Follow the rule. No exceptions. -``` - -## Complete Bulletproofing Checklist - -- [ ] Forbidden each specific workaround explicitly? -- [ ] Added "spirit vs letter" principle? -- [ ] Built rationalization table from baseline tests? -- [ ] Created red flags list? -- [ ] Used strong language (ALWAYS/NEVER)? -- [ ] Provided explicit escape hatch? -- [ ] Description includes pre-violation symptoms? diff --git a/.skills/writing-skills/references/cso/README.md b/.skills/writing-skills/references/cso/README.md deleted file mode 100644 index f8b6bd31b9..0000000000 --- a/.skills/writing-skills/references/cso/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# CSO Guide - Claude Search Optimization - -Advanced techniques for making skills discoverable by agents. - -## The Discovery Problem - -You have 100+ skills. Agent receives a task. How does it find the RIGHT skill? - -**Answer**: The `description` field. - -## Critical Rule: Description = Triggers, NOT Workflow - -### The Trap - -When description summarizes workflow, agents take a shortcut. - -**Real example that failed**: - -```yaml -# Agent did ONE review instead of TWO -description: Code review between tasks - -# Skill body had flowchart showing TWO reviews -``` - -**Why it failed**: Agent read description, thought "code review between tasks means one review", never read the flowchart. - -**Fix**: - -```yaml -# Agent now reads full skill and follows flowchart -description: Use when executing implementation plans with independent tasks -``` - -### The Pattern - -```yaml -# BAD: Workflow summary -description: Analyzes git diff, generates commit message in conventional format - -# GOOD: Trigger conditions only -description: Use when generating commit messages or reviewing staged changes -``` - -## Token Efficiency - -**Target word counts**: -- Frequently-loaded skills: <200 words total -- Other skills: <500 words - -## Keyword Strategy - -### Error Messages -Include EXACT error text users will see. - -### Symptoms -Use words users naturally say: "flaky", "hangs", "slow", "timeout", "race condition" - -### Tools & Commands -Actual names, not descriptions: "pytest", not "Python testing" - -### Synonyms -Cover multiple ways to describe same thing: timeout/hang/freeze - -## Description Template - -```yaml -description: "Use when [SPECIFIC TRIGGER]." -metadata: - triggers: [error1], [symptom2], [tool3] -``` - -## Third Person Rule - -```yaml -# BAD: First person -description: "I can help you with async tests" - -# GOOD: Third person -description: "Handles async tests with race conditions" -``` - -## Verification Checklist - -- [ ] Description starts with "Use when..."? -- [ ] Description is <500 characters? -- [ ] Description lists ONLY triggers, not workflow? -- [ ] Includes 3+ keywords (errors/symptoms/tools)? -- [ ] Third person throughout? -- [ ] Name uses gerund or verb-first format? diff --git a/.skills/writing-skills/references/standards/README.md b/.skills/writing-skills/references/standards/README.md deleted file mode 100644 index 31d10a814f..0000000000 --- a/.skills/writing-skills/references/standards/README.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -description: Standards and naming rules for creating agent skills. -metadata: - tags: [standards, naming, yaml, structure] ---- - -# Skill Development Guide - -## Directory Structure - -``` -skills/ - {skill-name}/ # kebab-case, matches `name` field - SKILL.md # Required: main skill definition - references/ # Optional: supporting documentation - README.md # Sub-topic entry point - *.md # Additional files -``` - -## Naming Rules - -| Element | Rule | Example | -|---------|------|---------| -| Directory | kebab-case, 1-64 chars | `react-best-practices` | -| `SKILL.md` | ALL CAPS, exact filename | `SKILL.md` (not `skill.md`) | -| `name` field | Must match directory name | `name: react-best-practices` | - -## SKILL.md Structure - -```markdown ---- -name: {skill-name} -description: >- - Use when [trigger condition]. -metadata: - category: technique - triggers: keyword1, keyword2, error-text ---- - -# Skill Title - -Brief description of what this skill does. - -## When to Use -- Symptom or situation A -- Symptom or situation B - -## How It Works -Step-by-step instructions or reference content. - -## Examples -Concrete usage examples. - -## Common Mistakes -What to avoid and why. -``` - -## Description Best Practices - -```yaml -# BAD: Workflow summary -description: Analyzes code, finds bugs, suggests fixes - -# GOOD: Trigger conditions only -description: Use when debugging errors or reviewing code quality. -``` - -**Rules:** -- Start with "Use when..." -- Keep under 500 characters -- Use third person - -## Context Efficiency - -| Guideline | Reason | -|-----------|--------| -| Keep SKILL.md < 500 lines | Reduces context consumption | -| Put details in supporting files | Agent reads only what's needed | -| Use tables for reference data | More compact than prose | - -## Verification Checklist - -- [ ] `name` matches directory name? -- [ ] `SKILL.md` is ALL CAPS? -- [ ] Description starts with "Use when..."? -- [ ] Under 500 lines? -- [ ] Tested with real scenarios? diff --git a/.skills/writing-skills/references/standards/metadata-standard.md b/.skills/writing-skills/references/standards/metadata-standard.md deleted file mode 100644 index e3fadddb4d..0000000000 --- a/.skills/writing-skills/references/standards/metadata-standard.md +++ /dev/null @@ -1,39 +0,0 @@ -# SKILL.md Metadata Standard - -Official frontmatter fields. - -## Required Fields - -```yaml ---- -name: skill-name -description: >- - Use when [trigger condition]. ---- -``` - -| Field | Rules | -|-------|-------| -| `name` | 1-64 chars, lowercase, hyphens only, must match directory name | -| `description` | 1-1024 chars, should describe when to use | - -## Optional Fields - -```yaml ---- -name: skill-name -description: Purpose and triggers. -metadata: - category: "reference" - version: "1.0.0" ---- -``` - -## Name Validation - -```regex -^[a-z0-9]+(-[a-z0-9]+)*$ -``` - -**Valid**: `my-skill`, `git-release`, `tdd` -**Invalid**: `My-Skill`, `my_skill`, `-my-skill` diff --git a/.skills/writing-skills/references/templates/discipline.md b/.skills/writing-skills/references/templates/discipline.md deleted file mode 100644 index ed54e4b42a..0000000000 --- a/.skills/writing-skills/references/templates/discipline.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -name: discipline-name -description: >- - Use when [BEFORE violation]. -metadata: - category: discipline - triggers: new feature, code change, implementation ---- - -# Rule Name - -## Iron Law - -**[SINGLE SENTENCE ABSOLUTE RULE]** - -Violating the letter IS violating the spirit. - -## The Rule - -1. ALWAYS [step 1] -2. NEVER [step 2] -3. [Step 3] - -## Violations - -[Action before rule]? **Delete it. Start over.** - -**No exceptions:** -- Don't keep it as "reference" -- Don't "adapt" it -- Delete means delete - -## Common Rationalizations - -| Excuse | Reality | -|--------|---------| -| "Too simple" | Simple code breaks. Rule takes 30 seconds. | -| "I'll do it after" | After = never. Do it now. | -| "Spirit not ritual" | The ritual IS the spirit. | - -## Red Flags - STOP - -- [Flag 1] -- [Flag 2] -- "This is different because..." - -**All mean:** Delete. Start over. - -## Valid Exceptions - -- [Exception 1] -- [Exception 2] - -**Everything else:** Follow the rule. diff --git a/.skills/writing-skills/references/templates/pattern.md b/.skills/writing-skills/references/templates/pattern.md deleted file mode 100644 index 777bc26906..0000000000 --- a/.skills/writing-skills/references/templates/pattern.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -name: pattern-name -description: >- - Use when [recognizable symptom]. -metadata: - category: pattern - triggers: complexity, hard-to-follow, nested ---- - -# Pattern Name - -## The Pattern - -[1-2 sentence core idea] - -## Recognition Signs - -- [Sign that pattern applies] -- [Another sign] -- [Code smell] - -## Before - -```typescript -// Complex/problematic -function before() { - // nested, confusing -} -``` - -## After - -```typescript -// Clean/improved -function after() { - // flat, clear -} -``` - -## When NOT to Use - -- [Over-engineering case] -- [Simple case that doesn't need it] - -## Impact - -**Before:** [Problem metric] -**After:** [Improved metric] diff --git a/.skills/writing-skills/references/templates/reference.md b/.skills/writing-skills/references/templates/reference.md deleted file mode 100644 index 66342eee1d..0000000000 --- a/.skills/writing-skills/references/templates/reference.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -name: reference-name -description: >- - Use when working with [domain]. -metadata: - category: reference - triggers: tool, api, specific-terms ---- - -# Reference Name - -## Quick Reference - -| Command | Purpose | -|---------|---------| -| `cmd1` | Does X | -| `cmd2` | Does Y | - -## Common Patterns - -**Pattern A:** -```bash -example command -``` - -**Pattern B:** -```bash -another example -``` - -## Detailed Docs - -For more options, run `--help` or see: -- patterns.md -- examples.md diff --git a/.skills/writing-skills/references/templates/technique.md b/.skills/writing-skills/references/templates/technique.md deleted file mode 100644 index 336c62a78e..0000000000 --- a/.skills/writing-skills/references/templates/technique.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -name: technique-name -description: Use when [specific symptom]. -metadata: - category: technique - triggers: error-text, symptom, tool-name ---- - -# Technique Name - -## Overview - -[1-2 sentence core principle] - -## When to Use - -- [Symptom A] -- [Symptom B] -- [Error message text] - -**NOT for:** -- [When to avoid] - -## The Problem - -```javascript -// Bad example -function badCode() { - // problematic pattern -} -``` - -## The Solution - -```javascript -// Good example -function goodCode() { - // improved pattern -} -``` - -## Step-by-Step - -1. [First step] -2. [Second step] -3. [Final step] - -## Quick Reference - -| Scenario | Approach | -|----------|----------| -| Case A | Solution A | -| Case B | Solution B | - -## Common Mistakes - -**Mistake 1:** [Description] -- Wrong: `bad code` -- Right: `good code` diff --git a/.skills/writing-skills/references/templates/tier-3-platform.md b/.skills/writing-skills/references/templates/tier-3-platform.md deleted file mode 100644 index 4863345e82..0000000000 --- a/.skills/writing-skills/references/templates/tier-3-platform.md +++ /dev/null @@ -1,17 +0,0 @@ -# Platform Name Skill - -Template for complex Tier 3 skills. - -## Structure - -``` -skill/ - SKILL.md # Dispatcher - references/ - topic/ - README.md # Overview - api.md # API Reference - config.md # Configuration - patterns.md # Recipes - gotchas.md # Critical Errors -``` diff --git a/.skills/writing-skills/references/testing/README.md b/.skills/writing-skills/references/testing/README.md deleted file mode 100644 index e089340401..0000000000 --- a/.skills/writing-skills/references/testing/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# Testing Guide - TDD for Skills - -Complete methodology for testing skills using RED-GREEN-REFACTOR cycle. - -## Testing All Skill Types - -### Discipline-Enforcing Skills (rules/requirements) - -**Test with**: -- Academic questions: Do they understand the rules? -- Pressure scenarios: Do they comply under stress? -- Multiple pressures combined: time + sunk cost + exhaustion - -**Success criteria**: Agent follows rule under maximum pressure - -### Technique Skills (how-to guides) - -**Test with**: -- Application scenarios: Can they apply the technique correctly? -- Variation scenarios: Do they handle edge cases? -- Missing information tests: Do instructions have gaps? - -**Success criteria**: Agent successfully applies technique to new scenario - -### Pattern Skills (mental models) - -**Test with**: -- Recognition scenarios: Do they recognize when pattern applies? -- Counter-examples: Do they know when NOT to apply? - -**Success criteria**: Agent correctly identifies when/how to apply pattern - -### Reference Skills (documentation/APIs) - -**Test with**: -- Retrieval scenarios: Can they find the right information? -- Gap testing: Are common use cases covered? - -**Success criteria**: Agent finds and correctly applies reference information - -## Pressure Types for Testing - -| Pressure | Example | -|----------|---------| -| Time | "You have 5 minutes to complete this task" | -| Sunk cost | "You already spent 2 hours on this" | -| Authority | "Senior developer said to skip tests" | -| Exhaustion | "This is the 10th task today" | - -## Complete Test Checklist - -**Baseline (RED)**: -- [ ] Designed 3+ pressure scenarios -- [ ] Ran scenarios WITHOUT skill -- [ ] Documented verbatim agent responses - -**Implementation (GREEN)**: -- [ ] Skill addresses SPECIFIC baseline failures -- [ ] Re-ran scenarios WITH skill -- [ ] Agent complied in all scenarios - -**Bulletproofing (REFACTOR)**: -- [ ] Tested with combined pressures -- [ ] Found and documented new rationalizations -- [ ] Added explicit counters -- [ ] Re-tested until no more loopholes diff --git a/.skills/writing-skills/references/tier-1-simple/README.md b/.skills/writing-skills/references/tier-1-simple/README.md deleted file mode 100644 index 6f049adf7b..0000000000 --- a/.skills/writing-skills/references/tier-1-simple/README.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -description: When to use Tier 1 (Simple) skill architecture. -metadata: - tags: [tier-1, simple, single-file] ---- - -# Tier 1: Simple Skills - -Single-file skills for focused, specific purposes. - -## When to Use - -- **Single concept**: One technique, one pattern, one reference -- **Under 200 lines**: Can fit comfortably in one file -- **No complex decision logic**: User knows exactly what they need -- **Frequently loaded**: Needs minimal token footprint - -## Structure - -``` -my-skill/ - SKILL.md # Everything in one file -``` - -## Checklist - -- [ ] Fits in <200 lines -- [ ] Single focused purpose -- [ ] No need for `references/` directory -- [ ] Description uses "Use when..." pattern diff --git a/.skills/writing-skills/references/tier-2-expanded/README.md b/.skills/writing-skills/references/tier-2-expanded/README.md deleted file mode 100644 index 9e31e8f7b0..0000000000 --- a/.skills/writing-skills/references/tier-2-expanded/README.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -description: When to use Tier 2 (Expanded) skill architecture. -metadata: - tags: [tier-2, expanded, multi-file] ---- - -# Tier 2: Expanded Skills - -Multi-file skills for complex topics with multiple sub-concepts. - -## When to Use - -- **Multiple related concepts**: Needs separation of concerns -- **200-1000 lines total**: Too big for one file -- **Needs reference files**: Patterns, examples, troubleshooting -- **Cross-linking**: Users need to navigate between sub-topics - -## Structure - -``` -my-skill/ - SKILL.md # Overview + navigation - references/ - core/ - README.md # Main concept - patterns/ - README.md # Usage patterns - troubleshooting/ - README.md # Common issues -``` - -## Progressive Disclosure - -1. **Metadata** (~100 tokens): Name + description loaded at startup -2. **SKILL.md** (<500 lines): Decision tree + index -3. **References** (as needed): Loaded only when user navigates - -## Key Differences from Tier 1 - -| Aspect | Tier 1 | Tier 2 | -|--------|--------|--------| -| Files | 1 | 5-20 | -| Total lines | <200 | 200-1000 | -| Decision logic | None | Simple tree | -| Token cost | Minimal | Medium (progressive) | - -## Checklist - -- [ ] SKILL.md has clear navigation links -- [ ] Each `references/` subdir has README.md -- [ ] No circular references between files -- [ ] Decision tree points to specific files diff --git a/.skills/writing-skills/references/tier-3-platform/README.md b/.skills/writing-skills/references/tier-3-platform/README.md deleted file mode 100644 index 224c709dcf..0000000000 --- a/.skills/writing-skills/references/tier-3-platform/README.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -description: When to use Tier 3 (Platform) skill architecture for large platforms. -metadata: - tags: [tier-3, platform, enterprise] ---- - -# Tier 3: Platform Skills - -Enterprise-grade skills for entire platforms (AWS, Cloudflare, Convex, etc). - -## When to Use - -- **Entire platform**: 10+ products/services -- **1000+ lines total**: Would overwhelm context if monolithic -- **Complex decision logic**: Users start with "I need X" not "I want product Y" - -## The 5-File Pattern - -Each product directory has exactly 5 files: - -| File | Purpose | When to Load | -|------|---------|--------------| -| `README.md` | Overview, when to use | Always first | -| `api.md` | Runtime APIs, methods | Implementing features | -| `configuration.md` | Config, environment | Setting up | -| `patterns.md` | Common workflows | Best practices | -| `gotchas.md` | Pitfalls, limits | Debugging | - -## Decision Trees - -```markdown -Need to store data? - Simple key-value -> kv/ - Relational queries -> d1/ - Large files/blobs -> r2/ - Per-user state -> durable-objects/ -``` - -## Progressive Disclosure in Action - -- **Startup**: Only name + description (~100 tokens) -- **Activation**: SKILL.md with trees (<5000 tokens) -- **Navigation**: One product's 5 files (as needed) - -## Checklist - -- [ ] SKILL.md contains ONLY decision trees + index -- [ ] Each product has exactly 5 files -- [ ] Decision trees cover all "I need X" scenarios -- [ ] Cross-references stay one level deep -- [ ] Every product has `gotchas.md` diff --git a/.skills/writing-skills/testing-skills-with-subagents.md b/.skills/writing-skills/testing-skills-with-subagents.md deleted file mode 100644 index 7abecfca93..0000000000 --- a/.skills/writing-skills/testing-skills-with-subagents.md +++ /dev/null @@ -1,85 +0,0 @@ -# Testing Skills With Subagents - -**Load this reference when:** creating or editing skills, before deployment, to verify they work under pressure and resist rationalization. - -## Overview - -**Testing skills is just TDD applied to process documentation.** - -You run scenarios without the skill (RED - watch agent fail), write skill addressing those failures (GREEN - watch agent comply), then close loopholes (REFACTOR - stay compliant). - -**Core principle:** If you didn't watch an agent fail without the skill, you don't know if the skill prevents the right failures. - -## When to Use - -Test skills that: -- Enforce discipline (TDD, testing requirements) -- Have compliance costs (time, effort, rework) -- Could be rationalized away ("just this once") -- Contradict immediate goals (speed over quality) - -Don't test: -- Pure reference skills (API docs, syntax guides) -- Skills without rules to violate -- Skills agents have no incentive to bypass - -## TDD Mapping for Skill Testing - -| TDD Phase | Skill Testing | What You Do | -|-----------|---------------|-------------| -| **RED** | Baseline test | Run scenario WITHOUT skill, watch agent fail | -| **Verify RED** | Capture rationalizations | Document exact failures verbatim | -| **GREEN** | Write skill | Address specific baseline failures | -| **Verify GREEN** | Pressure test | Run scenario WITH skill, verify compliance | -| **REFACTOR** | Plug holes | Find new rationalizations, add counters | -| **Stay GREEN** | Re-verify | Test again, ensure still compliant | - -## RED Phase: Baseline Testing (Watch It Fail) - -**Goal:** Run test WITHOUT the skill - watch agent fail, document exact failures. - -**Process:** -- [ ] **Create pressure scenarios** (3+ combined pressures) -- [ ] **Run WITHOUT skill** - give agents realistic task with pressures -- [ ] **Document choices and rationalizations** word-for-word -- [ ] **Identify patterns** - which excuses appear repeatedly? -- [ ] **Note effective pressures** - which scenarios trigger violations? - -## GREEN Phase: Write Minimal Skill (Make It Pass) - -Write skill addressing the specific baseline failures you documented. Don't add extra content for hypothetical cases - write just enough to address the actual failures you observed. - -Run same scenarios WITH skill. Agent should now comply. - -If agent still fails: skill is unclear or incomplete. Revise and re-test. - -## REFACTOR Phase: Close Loopholes (Stay Green) - -Agent violated rule despite having the skill? Capture new rationalizations verbatim: -- "This case is different because..." -- "I'm following the spirit not the letter" -- "Being pragmatic means adapting" -- "Deleting X hours is wasteful" - -**Document every excuse.** These become your rationalization table. - -## Testing Checklist (TDD for Skills) - -**RED Phase:** -- [ ] Created pressure scenarios (3+ combined pressures) -- [ ] Ran scenarios WITHOUT skill (baseline) -- [ ] Documented agent failures and rationalizations verbatim - -**GREEN Phase:** -- [ ] Wrote skill addressing specific baseline failures -- [ ] Ran scenarios WITH skill -- [ ] Agent now complies - -**REFACTOR Phase:** -- [ ] Identified NEW rationalizations from testing -- [ ] Added explicit counters for each loophole -- [ ] Updated rationalization table -- [ ] Updated red flags list -- [ ] Re-tested - agent still complies -- [ ] Meta-tested to verify clarity -- [ ] Agent follows rule under maximum pressure diff --git a/AGENTS.md b/AGENTS.md index fbeaf096fb..8b94780e4b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,127 +1,109 @@ # AGENTS.md -## Project -- Minecraft Console Client (MCC) is a cross-platform text/TUI client for Minecraft Java Edition. -- Primary scope: connect to servers, send chat and commands, receive text, automate gameplay/admin tasks, and extend behavior through built-in bots or runtime C# scripts. -- Secondary scope: protocol/version adaptation tooling, docs site, legacy GUI wrapper, and debug tooling. -- Decompiled server source for both the old and new MC versions in `$MCC_REPO/MinecraftOfficial/-decompiled/` - -## Build / Run -- Init submodules first: `git submodule update --init --recursive` -- Build for local development: `source tools/mcc-env.sh && mcc-build` -- Publish (matches CI shape): `source tools/mcc-env.sh && mcc-publish --rid ` -- Run/debug from source: `source tools/mcc-env.sh && mcc-debug -v 1.21.11 --file-input` -- Docs: `cd docs && npm install && npm run docs:dev` or `npm run docs:build` -- Docker: `cd Docker && docker build -t minecraft-console-client:latest .` -- Tests: no dedicated test project is present in the main solution. -- Current state: the solution builds after submodule init, but the underlying .NET build emits many analyzer and NuGet vulnerability warnings; treat them as real. -- Server roots: `tools/` helpers look for server jars under `MinecraftOfficial/downloads//` by default, but also support an external root via the `MCC_SERVERS` environment variable. -- Multi-version testing: tmux-based local server sessions are shared state. Run cross-version test matrices sequentially unless you have explicit per-version isolation. A server logging `Done` does not guarantee immediate RCON availability; retry RCON setup commands. -- Automated test configs: for repeated or matrix test runs, prefer generating a temporary MCC config per run instead of reusing the repo-root `MinecraftClient.ini`, to avoid leaking state between runs. -- For agent-driven local development, prefer `mcc-build`, `mcc-publish`, `mcc-build-clean`, `mcc-debug`, `mcc-run`, and `mcc-tui` over raw `dotnet build`, `dotnet publish`, or `dotnet run`, so worktree-local temp build routing stays active. - -## Architecture -- `Program` bootstraps console I/O, TOML config, auth/session state, MC version selection, Forge detection, then creates `McClient`. -- `McClient` is the live session runtime: TCP client, selected protocol handler, Brigadier command dispatcher, loaded bots, world/inventory/entity state, queued chat, movement/pathing, reconnect flow. -- `Protocol/` is the network/auth boundary. `ProtocolHandler` maps Minecraft versions to protocol numbers and selects either `Protocol16Handler` (1.4.6-1.6.4) or `Protocol18Handler` (1.7.2+). -- `Scripting/ChatBot` is the extension boundary. Built-in bots and `/script` C# bots share the same event/tick API. -- Main runtime flow: console input -> internal Brigadier command or server chat; packets -> protocol handler -> `McClient` state update -> bot events; `OnUpdate()` (20 TPS) drives bot ticks, delayed work, chat cooldowns, movement, and main-thread tasks. - -## Technology Stack -- Main app: C#, .NET 10, nullable enabled. -- Command system: `Brigadier.NET`. -- Config: TOML via `Samboy063.Tomlet`. -- Runtime scripting: Roslyn (`Microsoft.CodeAnalysis.CSharp`) with in-memory compilation. -- Networking/auth: custom Minecraft protocol handlers, DNS SRV lookup (`DnsClient`), Forge/session/profile-key support. -- Integrations: `DSharpPlus`, `Telegram.Bot`, `MessagePack`, `Magick.NET`, `Sentry`. -- Docs site: VuePress 2 (`docs/package.json`). -- Tooling: Docker, GitHub Actions, Python 3.10+ scripts under `tools/` for palette/version generation. -- Legacy UI: `MinecraftClientGUI` is a separate .NET Framework 4.0 WinForms wrapper, not the main runtime. - -## Version Support -Feature columns mean: -- Inventory: `/inventory` plus inventory/container bot APIs -- Movement: terrain handling, `/move`, and movement/pathing bots -- Entity: entity tracking and entity-driven bot events - -| Minecraft | Protocol path | Inventory | Movement | Entity | Notes | -| --- | --- | --- | --- | --- | --- | -| 1.4.6-1.6.4 | `Protocol16Handler` | No | No | No | Core login/chat only | -| 1.7.2-1.7.10 | `Protocol18Handler` | No | Yes | No | Pre-1.8 special case | -| 1.8-1.9.4 | `Protocol18Handler` | Partial / docs conflict | Yes | Yes | Runtime gates allow 1.8+, but docs still warn inventory is unsupported through 1.9 | -| 1.10-1.12.2 | `Protocol18Handler` | Yes | Yes | Yes | Pre-flattening palettes | -| 1.13-1.19.2 | `Protocol18Handler` | Yes | Yes | Yes | Flattened block/item/entity palettes | -| 1.19.3-1.20.4 | `Protocol18Handler` | Yes | Yes | Yes | Newer chat/signing and palette splits | -| 1.20.6-1.21.4 | `Protocol18Handler` | Yes | Yes | Yes | Registry-driven world/attribute handling | -| 1.21.5-1.21.8 | `Protocol18Handler` | Yes | Yes | Yes | 1.21.7/1.21.8 reuse 1.21.6 block/entity palettes in code | -| 1.21.9-1.21.10 | `Protocol18Handler` | Yes | Yes | Yes | Version tools prefer server data reports since 1.21.9 | -| 1.21.11 | `Protocol18Handler` | Yes | Yes | Yes | Own entity/item/metadata palettes; blocks reuse 1.21.9 palette | -| 26.1 | `Protocol18Handler` | Yes | Yes | Yes | New Minecraft version naming scheme | -| 26.2 | `Protocol18Handler` | Yes | Yes | Yes | Latest coded support; own item/block/entity palettes, reuses 26.1 packet IDs and metadata serializers | - -Notes: -- Declared code range is `1.4.6` to `26.2`. -- Human docs are stale in places and sometimes stop at older ranges; prefer code when docs and code disagree. -- Movement/pathing limits called out in docs still apply: no swimming, no knockback. The `Physics/` engine adds vanilla-accurate collision and movement but some edge cases remain. - -## Module Map -### Core Runtime - -| Module | What It Owns | Important Files | -| --- | --- | --- | -| `MinecraftClient/` | Main `net10.0` runtime assembly and the best starting point. `Program.cs` owns startup, config load/writeback, CLI handling, auth/version selection, update/data-generation entrypoints, and restart/failure flow. `McClient.cs` owns the live session runtime: protocol handler ownership, command dispatch, bot lifecycle, world/inventory/entity state, queued chat, movement ticks, reconnect/disconnect logic, and the main-thread invoke queue. `Settings.cs` defines the TOML schema and runtime/internal overrides used across the app. | `Program.cs`, `McClient.cs`, `Settings.cs`, `ConsoleIO.cs`, `Command.cs`, `UpgradeHelper.cs`, `AutoTimeout.cs` | -| `MinecraftClient/Protocol/` | Network/auth/session boundary. `ProtocolHandler.cs` does DNS SRV lookup, server ping/version detection, MC-version to protocol mapping, and handler selection. `Protocol16.cs` and `Protocol18.cs` implement the packet flow for legacy and modern versions. `Protocol18Terrain.cs` decodes chunk sections/biomes into `World`. `DataTypes.cs` is the low-level reader/writer layer for VarInts, metadata, NBT-like structures, and packet fields. `Message/`, `ProfileKey/`, `Session/`, `Handlers/Forge/`, `Handlers/PacketPalettes/`, `Handlers/Packet/`, and `Handlers/StructuredComponents/` cover chat/signing, cached auth, Forge, packet IDs, packet-level parsing, and 1.20.6+ item components with versioned registries under `StructuredComponents/Registries/`. | `Protocol/ProtocolHandler.cs`, `Protocol/Handlers/Protocol16.cs`, `Protocol/Handlers/Protocol18.cs`, `Protocol/Handlers/Protocol18Terrain.cs`, `Protocol/Handlers/DataTypes.cs`, `Protocol/Message/ChatParser.cs`, `Protocol/MicrosoftAuthentication.cs`, `Protocol/MojangAPI.cs` | -| `MinecraftClient/Mapping/` | World model, terrain storage, movement logic, and versioned block/entity metadata. `World.cs` stores chunk columns, dimension data, and 1.20.6+ registry-derived dimension/attribute mappings. `Chunk*`, `Block.cs`, and `Location.cs` are the terrain primitives. `Movement.cs` contains step generation, gravity/on-ground checks, and path execution support. `Material.cs` plus `BlockPalettes/*.cs` map block-state IDs to MCC materials. `Entity.cs`, `EntityType.cs`, `EntityPalettes/*.cs`, `EntityMetadataPalette.cs`, and `EntityMetadataPalettes/*.cs` do the same for entities and metadata serializers. | `Mapping/World.cs`, `Mapping/ChunkColumn.cs`, `Mapping/Chunk.cs`, `Mapping/Block.cs`, `Mapping/Location.cs`, `Mapping/Movement.cs`, `Mapping/RaycastHelper.cs`, `Mapping/Material.cs`, `Mapping/Entity.cs`, `Mapping/EntityType.cs` | -| `MinecraftClient/Inventory/` | Inventory/container snapshots, item decoding, and versioned item registries. `Container.cs` models player inventories and server windows, including slot contents and container properties. `Item.cs` bridges older NBT-based items with 1.20.6+ structured components. `ItemType.cs` plus `ItemPalettes/*.cs` provide version-specific item ID mapping. Enchantment, effects, and villager-trade files add higher-level semantics on top of raw inventory data. | `Inventory/Container.cs`, `Inventory/ContainerType.cs`, `Inventory/Item.cs`, `Inventory/ItemMovingHelper.cs`, `Inventory/ItemType.cs`, `Inventory/ItemPalettes/*.cs`, `Inventory/EnchantmentMapping.cs`, `Inventory/VillagerTrade.cs` | -| `MinecraftClient/Physics/` | Vanilla-accurate per-tick physics engine. `PlayerPhysics.cs` mirrors vanilla `Entity.move()`, `LivingEntity.aiStep()/travel()`, and `Player.travel()` logic at 20 TPS, handling ground/air/water/lava/creative-fly travel, jumping, sprint-jump boost, climbing, sneak-edge-detection, friction, drag, gravity, slow-falling, and levitation. `CollisionDetector.cs` resolves full AABB collisions against the block world including step-up, mirroring vanilla axis-separated resolution. `BlockShapes.cs` maps block-state IDs to collision AABBs using PrismarineJS data from `BlockShapeData.json`. `Vec3d.cs` and `Aabb.cs` provide the geometric primitives. `MovementInput.cs` captures player input state. | `Physics/PlayerPhysics.cs`, `Physics/PhysicsConsts.cs`, `Physics/CollisionDetector.cs`, `Physics/BlockShapes.cs`, `Physics/BlockShapeData.json`, `Physics/Vec3d.cs`, `Physics/Aabb.cs`, `Physics/MovementInput.cs` | - -### Commands And Extensions - -| Module | What It Owns | Important Files | -| --- | --- | --- | -| `MinecraftClient/Commands/` and `MinecraftClient/CommandHandler/` | Internal MCC command system built on Brigadier. Commands are discovered by reflection from `MinecraftClient.Commands` in `McClient.LoadCommands()`. Each file in `Commands/` registers one internal command. `ArgumentType/*.cs` provides typed Brigadier arguments and completion sources for accounts, bots, items, locations, scripts, inventories, and more. `Patch/*.cs` carries MCC-specific Brigadier extensions, and `CmdResult.cs` is the command execution result object. | `Command.cs`, `Commands/*.cs`, `CommandHandler/MccArguments.cs`, `CommandHandler/CmdResult.cs`, `CommandHandler/ArgumentType/*.cs`, `CommandHandler/Patch/*.cs` | -| `MinecraftClient/ChatBots/` | Built-in bots and bridges loaded from config through `McClient.RegisterBots()`. The folder mixes gameplay automation (`AutoAttack`, `AutoDig`, `AutoEat`, `AutoFishing`, `Farmer`), utility/logging bots (`ChatLog`, `PlayerListLogger`, `Alerts`), bridges (`DiscordBridge`, `TelegramBridge`, `RemoteControl`), and tooling like `ScriptScheduler`, `Map`, and `ReplayCapture`. | `ChatBots/AutoRelog.cs`, `ChatBots/Farmer.cs`, `ChatBots/FollowPlayer.cs`, `ChatBots/ItemsCollector.cs`, `ChatBots/Map.cs`, `ChatBots/RemoteControl.cs`, `ChatBots/ScriptScheduler.cs`, `ChatBots/DiscordBridge.cs`, `ChatBots/TelegramBridge.cs`, `ChatBots/ReplayCapture.cs` | -| `MinecraftClient/Scripting/` | Shared extension boundary for compiled bots and runtime C# scripts. `ChatBot.cs` is the main bot API and lifecycle surface. Built-in bots and `/script` bots use the same event model. `CSharpRunner.cs` parses `//MCCScript` files, compiles them with Roslyn, caches assemblies, and executes them through `CSharpAPI`. `DynamicRun/Builder/*` handles in-memory compilation/load-context plumbing, while `BotMovementLock.cs` coordinates movement ownership between automation pieces. | `Scripting/ChatBot.cs`, `Scripting/CSharpRunner.cs`, `Scripting/BotMovementLock.cs`, `Scripting/AssemblyResolver.cs`, `Scripting/DynamicRun/Builder/Compiler.cs`, `Scripting/DynamicRun/Builder/CompileRunner.cs` | -| `MinecraftClient/config/` | Sample runtime assets excluded from compilation. This is the examples/staging area for end-user scripts and standalone bots. `sample-script*.cs` shows supported `/script` patterns (basic, chatbot, world access, HTTP requests, tasks, PM forwarding, extended), while `config/ChatBots/*.cs` are copy/adapt examples rather than built-in bots. | `config/README.md`, `config/sample-script.cs`, `config/sample-script-with-chatbot.cs`, `config/sample-script-with-world-access.cs`, `config/sample-script-with-http-request.cs`, `config/sample-script-with-task.cs`, `config/ChatBots/*.cs` | -| `ConsoleInteractive/` | Required git submodule for richer line editing and console UI. MCC uses the submodule's `ConsoleReader`, `ConsoleWriter`, and suggestion UI from `ConsoleIO.cs` and `McClient.cs` when `BasicIO` is not enabled. | `ConsoleInteractive/README.md`, `ConsoleInteractive/ConsoleInteractive/ConsoleInteractive.sln` | - -### Support And Tooling - -| Module | What It Owns | Important Files | -| --- | --- | --- | -| `MinecraftClient/Logger/`, `MinecraftClient/Proxy/`, `MinecraftClient/Crypto/`, `MinecraftClient/Resources/`, `MinecraftClient/WinAPI/` | Support subsystems under the main app. Logging supports console/file output plus regex filtering. `ProxyHandler.cs` routes update/login/in-game traffic through HTTP or SOCKS proxies. `Crypto/` implements the stream ciphers needed for online-mode protocol encryption. `Resources/` contains UI strings, generated translation accessors, config help text, icons, and embedded Minecraft asset data. `WinAPI/` contains small Windows-only console helpers. | `Logger/FilteredLogger.cs`, `Logger/FileLogLogger.cs`, `Proxy/ProxyHandler.cs`, `Crypto/CryptoHandler.cs`, `Crypto/AesCfb8Stream.cs`, `Resources/Translations/Translations.resx`, `Resources/ConfigComments/ConfigComments.resx`, `Resources/en_us.json`, `WinAPI/ConsoleIcon.cs` | -| `docs/` | VuePress documentation site. `.vuepress/config.ts` sets bundler, theme, plugins, and redirects. `.vuepress/configs/**` holds locale and nav wiring. `guide/*.md` contains the user-facing install, usage, bot, and scripting docs. | `docs/.vuepress/config.ts`, `docs/.vuepress/configs/**`, `docs/guide/README.md`, `docs/guide/configuration.md`, `docs/guide/chat-bots.md`, `docs/guide/creating-bots.md`, `docs/guide/creating-text-script.md`, `docs/guide/ai-assisted-development.md` | -| `tools/` | Python helpers for Minecraft version adaptation and palette generation. `README.md` is the authoritative workflow. `diff_registries.py` compares versions and validates decompiled data against server reports. The `gen_*` scripts emit the versioned palette source files consumed by `Protocol/`, `Mapping/`, `Inventory/`, and `Physics/`. | `tools/README.md`, `tools/diff_registries.py`, `tools/gen_block_palette.py`, `tools/gen_item_palette.py`, `tools/gen_entity_palette.py`, `tools/gen_entity_metadata_palette.py`, `tools/gen_block_shapes.py`, `tools/gen_command_argument_registry.py` | -| `DebugTools/` | Standalone packet/proxy debugging utilities for inspecting traffic and compression behavior outside the main client runtime. | `DebugTools/MinecraftClientProxy/Program.cs`, `DebugTools/MinecraftClientProxy/PacketProxy.cs`, `DebugTools/MinecraftClientProxy/ZlibUtils.cs` | -| `MinecraftClientGUI/` | Legacy Windows GUI wrapper around the console app. WinForms shell that launches and communicates with the console executable; not part of the main `net10.0` runtime path. | `MinecraftClientGUI/Program.cs`, `MinecraftClientGUI/Form1.cs`, `MinecraftClientGUI/Form1.Designer.cs`, `MinecraftClientGUI/MinecraftClient.cs` | - -## Engineering Guidance - -Read `docs/guide/ai-assisted-development.md` before starting development work on MCC. It documents the full build-run-test loop, local server harness, repository tools, and standard workflows. - -### DO -- Keep startup/config/auth logic in `Program` and connection runtime logic in `McClient` or `Protocol/*`. -- Update version support holistically: protocol constants, version mapping, packet palette, block palette, item palette, entity palette, metadata palette, and routing switches. -- Use `tools/` and authoritative server data reports when adapting to new Minecraft versions. -- Guard optional subsystems with `GetTerrainEnabled()`, `GetInventoryEnabled()`, and `GetEntityHandlingEnabled()` before using them. -- For built-in bots, wire all pieces together: bot class, `Settings.ChatBotConfigHealper`, and `McClient.RegisterBots()`. -- Keep `Initialize()` for setup/prereq checks and `AfterGameJoined()` for sending chat or commands. -- Normalize inbound chat with `GetVerbatim()` before `IsChatMessage()` / `IsPrivateMessage()`. -- Clean up commands, plugin channels, threads, timers, and movement locks in `OnUnload()`. -- Prefer nullable-aware code, pattern matching, `ArgumentNullException.ThrowIfNull`, `Try*` APIs for expected failures, and `InvokeOnMainThread()` for cross-thread state changes. -- Use modern C# 14 features. -- Use provided skills proactively depending on the context, read their descriptions to determine when to use them. -- All user-facing text (log messages, command output, TUI labels, notifications, help text, error messages) **must** go through the translation system: add entries to `Translations.resx` + `Translations.Designer.cs`, then reference `Translations.key_name` in code. Never hardcode user-visible strings directly in `.cs` files. Use `string.Format(Translations.key, ...)` for parameterized messages. Translation keys follow dot-delimited naming: `..` (e.g. `cmd.inventory.tui_opened`, `tui.inventory.controls`). Pure technical identifiers (class names, protocol constants, color codes) are exempt. - -### DON'T -- Don't update only `MCVer2ProtocolVersion()` or only one palette file when adding a new Minecraft version. -- Don't send chat in `Initialize()`. -- Don't mutate inventory snapshots and expect server-side effects; use handler APIs/window actions. -- Don't bypass Brigadier with ad hoc command parsing. -- Never modify `ConsoleInteractive/`; treat it as an external required submodule. -- Don't start background workers when `Update()` or delayed tasks are sufficient; if you must, stop them on unload/disconnect. -- Don't leave movement locks, plugin channels, or dispatcher registrations behind. -- Don't trust older docs over current code for supported versions or feature gates. When AGENTS.md, skills, and older docs disagree, prefer current code and current tool behavior, then update the stale source. -- Don't hardcode user-facing strings (messages, labels, help text) directly in source code; always use `Translations.*` resources so the text can be localized. -- Never use "—" ("em dash"), unless specifically being instructed to do so! -- Never generate MCC config files (`.ini`) in the repo root. When `dotnet run --project MinecraftClient -- --help` is used to generate a config template, it writes `MinecraftClient.ini` to the current directory. Always run this command from a system temp directory (e.g. `mktemp -d`) or use `prepare_offline_mcc_config.sh` which already handles output routing. +## Project and ownership + +MCC 2.0 is a cross-platform console and terminal UI client for Minecraft Java Edition. It hosts DMCBK, which uses UMPK for the protocol and game engine. + +- Active solution: `Mcc.slnx`. +- Host implementation: `src/Mcc.Cli/`. Host tests: `src/Mcc.Cli.Tests/`. +- DMCBK packages: `0.1.0-preview.8`. UMPK packages: `0.9.0-beta.7`. +- Restore libraries through NuGet. Do not add sibling project references or copy DMCBK, UMPK or official plugin implementations into this repository. +- The legacy client, GUI, debug tools, Docker setup and old skills were removed. Current Docker files and skills target MCC 2.0. +- MCC code uses MIT. Preserve external dependencies' licenses and attribution. + +## Local skills + +Initialize the shared skills with `git submodule update --init MCC-Skills`. + +| Skill | Use for | +| --- | --- | +| `.skills/beacon-scripting/SKILL.md` | Beacon syntax, examples and script checks | +| `.skills/dmcbk-plugin-authoring/SKILL.md` | Plugin contracts, lifecycle, packaging and tests | +| `.skills/dmcbk-marketplace-authoring/SKILL.md` | Schema-2 catalogues, assets and release procedures | +| `.skills/csharp-best-practices/SKILL.md` | C# implementation, naming and async review | +| `.skills/csharp-solid-principles/SKILL.md` | Design, refactoring and API boundaries | +| `.skills/dotnet-performance-profiling-and-optimization/SKILL.md` | Measured performance diagnosis | +| `.skills/dotnet-security-review/SKILL.md` | Security and dependency review | +| `.skills/asd-ste100/SKILL.md` | Clear procedures, diagnostics and agent instructions | +| `.skills/humanizer/SKILL.md` | Natural, direct prose | + +Seven `.skills` entries link to the pinned [MCC Skills](https://github.com/MCCTeam/MCC-Skills) submodule under `MCC-Skills/skills`. ASD-STE100 and Humanizer remain local. `.claude/skills`, `.agents/skills`, `.codex/skill` and `.codex/skills` link to `.skills`. + +Read the relevant `SKILL.md` before applying a skill. Resolve relative references from its directory. Edit shared skills in MCC Skills rather than creating another local copy. + +## Build, run and test + +Use .NET SDK `10.0.401` from `global.json`. + +```bash +git submodule update --init ConsoleInteractive MCC-Skills +source tools/mcc-env.sh +mcc-build +mcc-test +python3 tools/localization/generate_strings.py --check +mcc-publish --rid linux-x64 +``` + +Windows development should use WSL when practical. Native PowerShell helpers live in `tools/windows/`: build, test, run, publish and clean. Read that directory's README. These helpers restore the caller's directory and propagate failures. + +`mcc-publish` creates a local distribution without uploading it. The development helper uses `PublishSingleFile=false`. Release builds use `PublishSingleFile=true` with `IncludeNativeLibrariesForSelfExtract=true` and `IncludeAllContentForSelfExtract=true` so source plugins can access extracted compilation references. Keep trimming disabled for plugin hosts. + +`mcc-run` starts the new CLI. `mcc-tui` starts its TUI. Both use a temporary working directory by default. Set `MCC_RUN_ROOT` to select a persistent directory. Pass absolute paths for configurations and scripts because these helpers change the working directory. + +```bash +mcc-run --configurations /absolute/path/to/configurations +mcc-tui --configurations /absolute/path/to/configurations +mcc-run --help +``` + +Set `MCC_BUILD_MODE=tmpfs` to route build output outside the checkout. Use `NuGet.Local.Config` only for unpublished packages in `artifacts/packages`; set `RestoreConfigFile` to its absolute path. Use a fresh `NUGET_PACKAGES` cache when replacing a package at the same version. + +`.github/workflows/mcc.yml` builds and tests the CLI on Linux, Windows and macOS. Documentation and artifact-only translation validation use docs.yml and translations.yml. Neither workflow creates commits or pushes translations. + +## Architecture and source layout + +Feature folders and namespaces must match under `Mcc.Cli`; the enclosing `src` folder is not part of the namespace. See [src/README.md](src/README.md) for architecture and [src/Mcc.Cli/README.md](src/Mcc.Cli/README.md) for the implementation map. + +| Path | Responsibility | +| --- | --- | +| `Program.cs`, `Startup/` | Composition, arguments, help, guided login and idle startup. | +| `Hosting/` | Host state, lifetime and classic DMCBK adapters. | +| `Configuration/` | Console settings, TOML overrides and environment files. | +| `Input/`, `Commands/`, `Logging/` | File input, host commands and logging. | +| `Presentation/` | Console chat, ANSI, glyphs, maps, status and Markdown. | +| `BeaconTooling/`, `Plugins/` | Beacon CLI adapters, plugin prompts and validation. | +| `Diagnostics/` | Session reports and packet capture. | +| `Localization/`, `Resources/` | MCC-owned translations and accessors. | +| `Tui/` | Terminal UI adapters, presentation and feature views. | +| `ConsoleInteractive/` | External submodule. Do not modify its source. | + +DMCBK owns client lifecycle, commands, typed configuration, Beacon, plugins and marketplace transactions. UMPK owns protocol support, world data, physics and pathfinding. Official plugins belong to [Marketplace](https://github.com/MCCTeam/Marketplace). + +## Runtime and localization + +- Configuration uses `client.toml`, `accounts.toml`, `servers.toml` and `console.toml`. +- Keep console and TUI settings in MCC and portable settings in DMCBK. +- Do not generate runtime configuration or authentication caches in the repository root. +- Keep credentials, `.env`, installed plugins and artifacts out of Git. +- Beacon scripts use `.bcn`. Marketplace indexes, manifests and locks require schema 2. +- Automated runs use `MCC_FILE_INPUT=1` and an absolute `MCC_INPUT_FILE`. Do not use a synthetic terminal against public servers. +- Use temporary configurations for each test. Shared server matrices run sequentially unless ports and storage are isolated. +- All new user-visible text must use resources: `Localization/Resources/MccStrings.resx` or `Resources/TextResources.resx`. +- Regenerate accessors with `python3 tools/localization/generate_strings.py`; verify with `--check`. Do not edit generated code or depend on removed client resources. + +## Engineering rules + +- Use nullable-aware C# and the configured language version. Prefer `Try*` APIs for expected failures. +- Use explicit imports and keep host adapters independent of protocol internals. +- Route classic output through `HostConsole` to keep the input prompt synchronized. +- Use DMCBK command registration and typed presentation values. Keep terminal formatting in MCC. +- Dispose subscriptions, timers and plugin resources on session end or shutdown. +- Update tests and documentation when behavior changes; run the CLI tests before completion. +- Do not modify `ConsoleInteractive/` or add library source dependencies. +- The documentation describes MCC 2.0. Check source and examples before changing a guide. Run tools/check_docs.py and the documentation build. +- Read the relevant skill in `.skills` before use. See [agent skills](docs/contributing/agent-skills.md) for setup and revision updates. +- Use Humanizer for prose and ASD-STE100 principles for instructions. Keep translated code and placeholders unchanged. +- Container files are Dockerfile and compose.yml. Do not put runtime secrets in images. +- Run tools/test_installers.py when changing installers or release packaging. +- Do not use em dashes unless the user requests them. +- Do not commit or push until the user gives explicit approval. diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index 23562a5fe3..0000000000 --- a/CLAUDE.md +++ /dev/null @@ -1 +0,0 @@ -Read @AGENTS.md \ No newline at end of file diff --git a/DebugTools/MccMcpSampleClient/MccMcpSampleClient.csproj b/DebugTools/MccMcpSampleClient/MccMcpSampleClient.csproj deleted file mode 100644 index 0edf5faa2b..0000000000 --- a/DebugTools/MccMcpSampleClient/MccMcpSampleClient.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - Exe - net10.0 - enable - enable - - - - - - - diff --git a/DebugTools/MccMcpSampleClient/Program.cs b/DebugTools/MccMcpSampleClient/Program.cs deleted file mode 100644 index 15ac2b70c5..0000000000 --- a/DebugTools/MccMcpSampleClient/Program.cs +++ /dev/null @@ -1,773 +0,0 @@ -using System.Diagnostics; -using System.Text.Json; -using ModelContextProtocol.Client; -using ModelContextProtocol.Protocol; - -string endpoint = Environment.GetEnvironmentVariable("MCC_MCP_ENDPOINT") ?? "http://127.0.0.1:33333/mcp"; -bool useStdio = string.Equals(Environment.GetEnvironmentVariable("MCC_MCP_USE_STDIO"), "1", StringComparison.Ordinal); -string? mcpAuthToken = Environment.GetEnvironmentVariable("MCC_MCP_AUTH_TOKEN"); -string repoRoot = FindRepoRoot(); -string rconScript = Path.Combine(repoRoot, "tools", "mc-rcon.sh"); -string rconPort = Environment.GetEnvironmentVariable("MCC_RCON_PORT") ?? "25575"; -string rconPassword = Environment.GetEnvironmentVariable("MCC_RCON_PASSWORD") ?? "test123"; -bool skipSetup = string.Equals(Environment.GetEnvironmentVariable("MCC_MCP_SKIP_SETUP"), "1", StringComparison.Ordinal); -bool runLocalSetup = !useStdio && !skipSetup && IsLocalEndpoint(endpoint) && File.Exists(rconScript); -var executed = new List(); -var checks = new List(); - -try -{ - await using McpClient client = useStdio - ? await McpClient.CreateAsync(new StdioClientTransport(CreateStdioOptions())) - : await McpClient.CreateAsync(new HttpClientTransport(new HttpClientTransportOptions - { - Endpoint = new Uri(endpoint), - TransportMode = HttpTransportMode.AutoDetect, - AdditionalHeaders = string.IsNullOrWhiteSpace(mcpAuthToken) - ? null - : new Dictionary { ["Authorization"] = $"Bearer {mcpAuthToken}" } - })); - - ToolEnvelope initialWorldState = await CallSuccessAsync(client, executed, "mcc_world_state"); - JsonElement initialWorldData = RequireData(initialWorldState); - string botName = ReadString(initialWorldData, "username") ?? "MCCBot"; - Coordinate initialLocation = ReadCoordinate(initialWorldData, "location"); - - long setupBaseline = 0; - if (runLocalSetup) - { - ToolEnvelope baselineEvents = await CallSuccessAsync(client, executed, "mcc_recent_events", new Dictionary - { - ["afterId"] = 0L, - ["maxCount"] = 1 - }); - setupBaseline = ReadInt64(RequireData(baselineEvents), "latestId"); - - await PrepareWorldAsync(rconScript, rconPort, rconPassword, botName, initialLocation); - await Task.Delay(1500); - } - - ToolEnvelope worldState = await WaitForPredicateAsync( - client, - executed, - "mcc_world_state", - null, - envelope => - { - if (!envelope.Success || envelope.Data is not JsonElement data) - return false; - - return data.TryGetProperty("loadedChunkCount", out JsonElement loaded) - && loaded.TryGetInt32(out int loadedChunkCount) - && loadedChunkCount >= 0 - && HasNonNullProperty(data, "worldAge") - && HasNonNullProperty(data, "timeOfDay"); - }, - "mcc_world_state never reported chunk/time state."); - - JsonElement worldData = RequireData(worldState); - Coordinate worldLocation = ReadCoordinate(worldData, "location"); - string dimension = RequireString(worldData, "dimension"); - int loadedChunkCount = ReadInt32(worldData, "loadedChunkCount"); - int pendingChunkCount = ReadInt32(worldData, "pendingChunkCount"); - int totalChunkCount = ReadInt32(worldData, "totalChunkCount"); - double loadRatio = ReadDouble(worldData, "loadRatio"); - _ = RequireString(worldData, "host"); - _ = ReadInt32(worldData, "port"); - _ = RequireString(worldData, "username"); - _ = ReadInt32(worldData, "protocol"); - _ = ReadDouble(worldData, "tps"); - Ensure(!string.IsNullOrWhiteSpace(dimension), "mcc_world_state returned an empty dimension."); - Ensure(loadedChunkCount + pendingChunkCount == totalChunkCount, "mcc_world_state chunk counters are inconsistent."); - Ensure(loadRatio is >= 0 and <= 1, "mcc_world_state loadRatio is out of range."); - Ensure(HasNonNullProperty(worldData, "worldAge"), "mcc_world_state.worldAge is null."); - Ensure(HasNonNullProperty(worldData, "timeOfDay"), "mcc_world_state.timeOfDay is null."); - if (runLocalSetup || useStdio) - { - Ensure(HasNonNullProperty(worldData, "rainLevel"), "mcc_world_state.rainLevel is null after setup."); - Ensure(HasNonNullProperty(worldData, "thunderLevel"), "mcc_world_state.thunderLevel is null after setup."); - } - checks.Add("mcc_world_state"); - - ToolEnvelope chunkStatus = await CallSuccessAsync(client, executed, "mcc_chunk_status"); - JsonElement chunkData = RequireData(chunkStatus); - JsonElement chunk = RequireProperty(chunkData, "chunk"); - _ = ReadInt32(chunk, "x"); - _ = ReadInt32(chunk, "z"); - Ensure(ReadBoolean(chunkData, "loaded"), "mcc_chunk_status reported the current chunk as unloaded."); - Ensure(ReadInt32(chunkData, "loadedChunkCount") + ReadInt32(chunkData, "pendingChunkCount") == ReadInt32(chunkData, "totalChunkCount"), - "mcc_chunk_status chunk counters are inconsistent."); - checks.Add("mcc_chunk_status"); - - await CallSuccessAsync(client, executed, "mcc_look_direction", new Dictionary { ["direction"] = "Down" }); - ToolEnvelope raycast = await CallSuccessAsync(client, executed, "mcc_raycast_block", new Dictionary - { - ["maxDistance"] = 8.0, - ["includeNeighbors"] = true - }); - JsonElement raycastData = RequireData(raycast); - Ensure(ReadBoolean(raycastData, "hit"), "mcc_raycast_block did not report a hit after looking down."); - JsonElement raycastBlock = RequireProperty(raycastData, "block"); - Ensure(!string.Equals(RequireString(raycastBlock, "material"), "Air", StringComparison.OrdinalIgnoreCase), - "mcc_raycast_block hit Air instead of a solid block."); - Ensure(RequireProperty(raycastData, "neighbors").ValueKind == JsonValueKind.Object, - "mcc_raycast_block did not include neighbors when requested."); - checks.Add("mcc_raycast_block"); - - ToolEnvelope pathPreview = await CallSuccessAsync(client, executed, "mcc_path_preview", new Dictionary - { - ["x"] = Math.Floor(worldLocation.X) + 2, - ["y"] = worldLocation.Y, - ["z"] = Math.Floor(worldLocation.Z), - ["allowUnsafe"] = false, - ["timeoutMs"] = 2000, - ["maxWaypoints"] = 32 - }); - JsonElement pathData = RequireData(pathPreview); - Ensure(ReadBoolean(pathData, "pathFound"), "mcc_path_preview did not find a path to a nearby target."); - Ensure(RequireProperty(pathData, "waypoints").GetArrayLength() > 0, "mcc_path_preview returned no waypoints."); - checks.Add("mcc_path_preview"); - - ToolEnvelope stoneSearch = await WaitForPredicateAsync( - client, - executed, - "mcc_inventory_search", - new Dictionary - { - ["query"] = "Stone", - ["maxCount"] = 20, - ["exactMatch"] = true, - ["includeContainers"] = false - }, - envelope => envelope.Success && envelope.Data is JsonElement data && ReadInt32(data, "count") > 0, - "mcc_inventory_search never found Stone in the player inventory."); - Ensure(ContainsItemType(RequireData(stoneSearch), "Stone"), "mcc_inventory_search results did not include Stone."); - - ToolEnvelope swordSearch = await WaitForPredicateAsync( - client, - executed, - "mcc_inventory_search", - new Dictionary - { - ["query"] = "DiamondSword", - ["maxCount"] = 20, - ["exactMatch"] = true, - ["includeContainers"] = false - }, - envelope => envelope.Success && envelope.Data is JsonElement data && ReadInt32(data, "count") > 0, - "mcc_inventory_search never found DiamondSword in the player inventory."); - Ensure(ContainsItemType(RequireData(swordSearch), "DiamondSword"), "mcc_inventory_search results did not include DiamondSword."); - checks.Add("mcc_inventory_search"); - - ToolEnvelope selectItem = await CallSuccessAsync(client, executed, "mcc_select_item", new Dictionary - { - ["itemType"] = "DiamondSword", - ["preferLowestSlot"] = true - }); - JsonElement selectData = RequireData(selectItem); - int selectedSlot = ReadInt32(selectData, "selectedSlot"); - - ToolEnvelope playerStats = await CallSuccessAsync(client, executed, "mcc_player_stats"); - JsonElement playerStatsData = RequireData(playerStats); - Ensure(ReadInt32(playerStatsData, "currentSlot") == selectedSlot, "mcc_select_item did not update mcc_player_stats.currentSlot."); - _ = ReadInt32(playerStatsData, "playerEntityId"); - _ = ReadInt32(playerStatsData, "level"); - _ = ReadInt32(playerStatsData, "totalExperience"); - _ = ReadCoordinate(playerStatsData, "location"); - checks.Add("mcc_select_item"); - checks.Add("mcc_player_stats"); - - ToolEnvelope playersDetailed = await CallSuccessAsync(client, executed, "mcc_players_detailed", new Dictionary - { - ["includeSelf"] = true, - ["includeCoordinates"] = true - }); - JsonElement playersData = RequireData(playersDetailed); - JsonElement selfPlayer = FindPlayer(RequireProperty(playersData, "players"), botName); - _ = RequireString(selfPlayer, "uuid"); - _ = ReadInt32(selfPlayer, "ping"); - _ = ReadInt32(selfPlayer, "entityId"); - _ = ReadDouble(selfPlayer, "x"); - _ = ReadDouble(selfPlayer, "y"); - _ = ReadDouble(selfPlayer, "z"); - checks.Add("mcc_players_detailed"); - - ToolEnvelope statusEffects = await CallSuccessAsync(client, executed, "mcc_status_effects"); - Ensure(RequireProperty(RequireData(statusEffects), "effects").ValueKind == JsonValueKind.Array, - "mcc_status_effects.effects is not an array."); - checks.Add("mcc_status_effects"); - - ToolEnvelope animation = await CallSuccessAsync(client, executed, "mcc_animation", new Dictionary - { - ["hand"] = "MainHand" - }); - Ensure(ReadBoolean(RequireData(animation), "success"), "mcc_animation did not report success."); - - ToolEnvelope sneakOn = await CallSuccessAsync(client, executed, "mcc_toggle_sneak", new Dictionary { ["enabled"] = true }); - Ensure(ReadBoolean(RequireData(sneakOn), "enabled"), "mcc_toggle_sneak(true) did not report enabled=true."); - - ToolEnvelope sprintOn = await CallSuccessAsync(client, executed, "mcc_toggle_sprint", new Dictionary { ["enabled"] = true }); - Ensure(ReadBoolean(RequireData(sprintOn), "enabled"), "mcc_toggle_sprint(true) did not report enabled=true."); - - await CallSuccessAsync(client, executed, "mcc_look_angles", new Dictionary - { - ["yaw"] = 45.0f, - ["pitch"] = -15.0f - }); - ToolEnvelope updatedStats = await CallSuccessAsync(client, executed, "mcc_player_stats"); - JsonElement updatedStatsData = RequireData(updatedStats); - Ensure(Math.Abs(ReadDouble(updatedStatsData, "yaw") - 45.0) < 0.01, "mcc_look_angles did not update yaw."); - Ensure(Math.Abs(ReadDouble(updatedStatsData, "pitch") - (-15.0)) < 0.01, "mcc_look_angles did not update pitch."); - checks.Add("mcc_animation"); - checks.Add("mcc_toggle_sneak"); - checks.Add("mcc_toggle_sprint"); - checks.Add("mcc_look_direction"); - checks.Add("mcc_look_angles"); - - ToolEnvelope nearestEntity = await WaitForPredicateAsync( - client, - executed, - "mcc_entity_nearest", - new Dictionary - { - ["typeFilter"] = "ArmorStand", - ["radius"] = 16.0, - ["includePlayers"] = false - }, - envelope => envelope.Success, - "mcc_entity_nearest never found a nearby ArmorStand."); - JsonElement nearestData = RequireData(nearestEntity); - int entityId = ReadInt32(nearestData, "id"); - Ensure(string.Equals(RequireString(nearestData, "type"), "ArmorStand", StringComparison.OrdinalIgnoreCase), - "mcc_entity_nearest did not return an ArmorStand."); - - ToolEnvelope attackEntity = await CallSuccessAsync(client, executed, "mcc_entity_attack", new Dictionary - { - ["entityId"] = entityId - }); - Ensure(ReadBoolean(RequireData(attackEntity), "success"), "mcc_entity_attack did not report success."); - checks.Add("mcc_entity_nearest"); - checks.Add("mcc_entity_attack"); - - long recentSetupAfterId = runLocalSetup ? setupBaseline : 0; - if (runLocalSetup || useStdio) - { - ToolEnvelope setupEvents = await WaitForRecentEventTypesAsync( - client, - executed, - recentSetupAfterId, - "weather_rain", - "title", - "actionbar"); - JsonElement setupEventsData = RequireData(setupEvents); - Ensure(GetEventTypes(setupEventsData).Contains("weather_rain", StringComparer.OrdinalIgnoreCase), "mcc_recent_events did not include weather_rain."); - Ensure(GetEventTypes(setupEventsData).Contains("title", StringComparer.OrdinalIgnoreCase), "mcc_recent_events did not include title."); - Ensure(GetEventTypes(setupEventsData).Contains("actionbar", StringComparer.OrdinalIgnoreCase), "mcc_recent_events did not include actionbar."); - } - - ToolEnvelope actionbarEvents = await CallSuccessAsync(client, executed, "mcc_recent_events", new Dictionary - { - ["afterId"] = 0L, - ["maxCount"] = 20, - ["typeFilter"] = "actionbar" - }); - JsonElement actionbarData = RequireData(actionbarEvents); - Ensure(ReadInt32(actionbarData, "count") > 0, "mcc_recent_events typeFilter=actionbar returned no events."); - Ensure(AllEventsMatchType(actionbarData, "actionbar"), "mcc_recent_events typeFilter returned mixed event types."); - - long inventoryBaseline = ReadInt64(actionbarData, "latestId"); - int chestX = (int)Math.Floor(worldLocation.X) + 2; - int chestY = (int)Math.Floor(worldLocation.Y); - int chestZ = (int)Math.Floor(worldLocation.Z); - ToolEnvelope openContainer = await WaitForPredicateAsync( - client, - executed, - "mcc_container_open_at", - new Dictionary - { - ["x"] = chestX, - ["y"] = chestY, - ["z"] = chestZ, - ["timeoutMs"] = 3000, - ["closeCurrent"] = true - }, - envelope => envelope.Success, - "mcc_open_container_at never opened the nearby chest."); - JsonElement inventoryInfo = RequireProperty(RequireData(openContainer), "inventory"); - int openedInventoryId = ReadInt32(inventoryInfo, "id"); - ToolEnvelope closeContainer = await CallSuccessAsync(client, executed, "mcc_container_close", new Dictionary - { - ["inventoryId"] = openedInventoryId, - ["timeoutMs"] = 3000 - }); - Ensure(ReadBoolean(RequireData(closeContainer), "closed"), "mcc_close_container did not close the chest."); - - ToolEnvelope inventoryEvents = await WaitForRecentEventTypesAsync( - client, - executed, - inventoryBaseline, - "inventory_open", - "inventory_close"); - JsonElement inventoryEventsData = RequireData(inventoryEvents); - Ensure(GetEventTypes(inventoryEventsData).Contains("inventory_open", StringComparer.OrdinalIgnoreCase), "mcc_recent_events did not include inventory_open."); - Ensure(GetEventTypes(inventoryEventsData).Contains("inventory_close", StringComparer.OrdinalIgnoreCase), "mcc_recent_events did not include inventory_close."); - checks.Add("mcc_recent_events"); - - if (runLocalSetup) - { - long deathBaseline = ReadInt64(inventoryEventsData, "latestId"); - await RunRconCommandAsync(rconScript, rconPort, rconPassword, $"kill {botName}"); - ToolEnvelope deathEvents = await WaitForRecentEventTypesAsync(client, executed, deathBaseline, "death"); - Ensure(GetEventTypes(RequireData(deathEvents)).Contains("death", StringComparer.OrdinalIgnoreCase), - "mcc_recent_events never reported death after the RCON kill."); - - long respawnBaseline = ReadInt64(RequireData(deathEvents), "latestId"); - ToolEnvelope respawn = await CallSuccessAsync(client, executed, "mcc_respawn"); - Ensure(ReadBoolean(RequireData(respawn), "success"), "mcc_respawn did not report success."); - ToolEnvelope respawnEvents = await WaitForRecentEventTypesAsync(client, executed, respawnBaseline, "respawn"); - Ensure(GetEventTypes(RequireData(respawnEvents)).Contains("respawn", StringComparer.OrdinalIgnoreCase), - "mcc_recent_events never reported respawn after mcc_respawn."); - checks.Add("mcc_respawn"); - } - else - { - long respawnBaseline = ReadInt64(RequireData(inventoryEvents), "latestId"); - ToolEnvelope respawn = await CallSuccessAsync(client, executed, "mcc_respawn"); - Ensure(ReadBoolean(RequireData(respawn), "success"), "mcc_respawn did not report success."); - ToolEnvelope respawnEvents = await WaitForRecentEventTypesAsync(client, executed, respawnBaseline, "respawn"); - Ensure(GetEventTypes(RequireData(respawnEvents)).Contains("respawn", StringComparer.OrdinalIgnoreCase), - "mcc_recent_events never reported respawn after mcc_respawn."); - checks.Add("mcc_respawn"); - } - - ToolEnvelope loadedBots = await CallSuccessAsync(client, executed, "mcc_loaded_bots"); - JsonElement bots = RequireProperty(RequireData(loadedBots), "bots"); - Ensure(ContainsBot(bots, "McpServer"), "mcc_loaded_bots did not include McpServer."); - checks.Add("mcc_loaded_bots"); - - ToolEnvelope disconnect = await CallSuccessAsync(client, executed, "mcc_disconnect"); - Ensure(ReadBoolean(RequireData(disconnect), "disconnecting"), "mcc_disconnect did not report disconnecting=true."); - checks.Add("mcc_disconnect"); - - if (!useStdio) - { - await AssertDisconnectStopsEndpointAsync(client, executed); - } - - Console.WriteLine(JsonSerializer.Serialize(new - { - success = true, - endpoint, - useStdio, - runLocalSetup, - checks, - executed - }, new JsonSerializerOptions { WriteIndented = true })); - - Environment.ExitCode = 0; -} -catch (Exception ex) -{ - Console.WriteLine(JsonSerializer.Serialize(new - { - success = false, - endpoint, - useStdio, - runLocalSetup, - error = ex.Message, - checks, - executed - }, new JsonSerializerOptions { WriteIndented = true })); - Environment.ExitCode = 1; -} - -static async Task PrepareWorldAsync(string rconScript, string rconPort, string rconPassword, string botName, Coordinate location) -{ - string[] commands = - [ - $"op {botName}", - $"gamemode creative {botName}", - $"tp {botName} 0 80 0", - $"item replace entity {botName} hotbar.0 with minecraft:stone 32", - $"item replace entity {botName} hotbar.1 with minecraft:diamond_sword 1", - $"execute as {botName} at @s run setblock ~2 ~ ~ minecraft:chest", - $"execute as {botName} at @s run summon minecraft:armor_stand ~2 ~ ~1", - "weather clear", - "weather rain", - $"title {botName} title {{\"text\":\"mcp_title\"}}", - $"title {botName} actionbar {{\"text\":\"mcp_actionbar\"}}" - ]; - - foreach (string command in commands) - { - await RunRconCommandAsync(rconScript, rconPort, rconPassword, command); - } -} - -static async Task RunRconCommandAsync(string rconScript, string rconPort, string rconPassword, string command) -{ - ProcessStartInfo startInfo = new("bash") - { - RedirectStandardOutput = true, - RedirectStandardError = true - }; - startInfo.ArgumentList.Add(rconScript); - startInfo.ArgumentList.Add(command); - startInfo.ArgumentList.Add(rconPort); - startInfo.ArgumentList.Add(rconPassword); - - using Process process = Process.Start(startInfo) ?? throw new InvalidOperationException("Failed to start mc-rcon.sh."); - string stdout = await process.StandardOutput.ReadToEndAsync(); - string stderr = await process.StandardError.ReadToEndAsync(); - await process.WaitForExitAsync(); - if (process.ExitCode != 0) - { - throw new InvalidOperationException( - $"RCON command failed ({command}): {(string.IsNullOrWhiteSpace(stderr) ? stdout : stderr).Trim()}"); - } -} - -static async Task CallSuccessAsync( - McpClient client, - List executed, - string toolName, - IReadOnlyDictionary? args = null) -{ - ToolEnvelope envelope = await CallToolAsync(client, executed, toolName, args); - if (!envelope.Success) - { - throw new InvalidOperationException( - $"{toolName} failed with errorCode={envelope.ErrorCode ?? ""} message={envelope.Message ?? ""}."); - } - - return envelope; -} - -static async Task WaitForPredicateAsync( - McpClient client, - List executed, - string toolName, - IReadOnlyDictionary? args, - Func predicate, - string failureMessage, - int maxAttempts = 12, - int delayMs = 400) -{ - ToolEnvelope? lastEnvelope = null; - for (int attempt = 0; attempt < maxAttempts; attempt++) - { - ToolEnvelope envelope = await CallToolAsync(client, executed, toolName, args); - lastEnvelope = envelope; - if (predicate(envelope)) - return envelope; - - await Task.Delay(delayMs); - } - - throw new InvalidOperationException( - $"{failureMessage} Last result: success={lastEnvelope?.Success}, errorCode={lastEnvelope?.ErrorCode ?? ""}."); -} - -static async Task WaitForRecentEventTypesAsync( - McpClient client, - List executed, - long afterId, - params string[] expectedTypes) -{ - HashSet expected = expectedTypes.ToHashSet(StringComparer.OrdinalIgnoreCase); - ToolEnvelope? lastEnvelope = null; - - for (int attempt = 0; attempt < 12; attempt++) - { - ToolEnvelope envelope = await CallSuccessAsync(client, executed, "mcc_recent_events", new Dictionary - { - ["afterId"] = afterId, - ["maxCount"] = 100 - }); - lastEnvelope = envelope; - JsonElement data = RequireData(envelope); - HashSet actual = GetEventTypes(data); - if (expected.All(actual.Contains)) - return envelope; - - await Task.Delay(400); - } - - throw new InvalidOperationException( - $"mcc_recent_events never reported: {string.Join(", ", expectedTypes)} after event id {afterId}. Last latestId={ReadInt64(RequireData(lastEnvelope!), "latestId")}."); -} - -static async Task CallToolAsync( - McpClient client, - List executed, - string toolName, - IReadOnlyDictionary? args = null) -{ - CallToolResult result = await client.CallToolAsync(toolName, args); - string responseJson = ExtractResponseJson(result); - JsonElement root = JsonDocument.Parse(responseJson).RootElement.Clone(); - JsonElement? data = root.TryGetProperty("data", out JsonElement dataElement) ? dataElement.Clone() : null; - bool success = root.TryGetProperty("success", out JsonElement successElement) - && successElement.ValueKind == JsonValueKind.True; - string? errorCode = ReadString(root, "errorCode"); - string? message = ReadString(root, "message"); - - executed.Add(new - { - tool = toolName, - arguments = args, - isError = result.IsError, - success, - errorCode, - message, - response = root - }); - - return new ToolEnvelope(toolName, result.IsError ?? false, success, errorCode, message, root, data); -} - -static async Task AssertDisconnectStopsEndpointAsync(McpClient client, List executed) -{ - for (int attempt = 0; attempt < 15; attempt++) - { - try - { - await CallToolAsync(client, executed, "mcc_world_state"); - } - catch - { - return; - } - - await Task.Delay(300); - } - - throw new InvalidOperationException("The MCP endpoint still responded after mcc_disconnect."); -} - -static string ExtractResponseJson(CallToolResult result) -{ - if (result.Content is null) - throw new InvalidOperationException("Tool response did not contain any content blocks."); - - foreach (ContentBlock content in result.Content) - { - if (content is TextContentBlock text && !string.IsNullOrWhiteSpace(text.Text)) - return text.Text; - } - - throw new InvalidOperationException("Tool response did not contain a text payload."); -} - -static JsonElement RequireData(ToolEnvelope envelope) -{ - if (envelope.Data is JsonElement data) - return data; - - throw new InvalidOperationException($"{envelope.ToolName} returned no data payload."); -} - -static JsonElement RequireProperty(JsonElement element, string propertyName) -{ - if (element.TryGetProperty(propertyName, out JsonElement property)) - return property; - - throw new InvalidOperationException($"Missing required property '{propertyName}'."); -} - -static string RequireString(JsonElement element, string propertyName) -{ - string? value = ReadString(element, propertyName); - if (!string.IsNullOrWhiteSpace(value)) - return value; - - throw new InvalidOperationException($"Property '{propertyName}' is missing or empty."); -} - -static string? ReadString(JsonElement element, string propertyName) -{ - return element.TryGetProperty(propertyName, out JsonElement property) && property.ValueKind == JsonValueKind.String - ? property.GetString() - : null; -} - -static int ReadInt32(JsonElement element, string propertyName) -{ - JsonElement property = RequireProperty(element, propertyName); - if (property.TryGetInt32(out int value)) - return value; - - throw new InvalidOperationException($"Property '{propertyName}' is not an Int32."); -} - -static long ReadInt64(JsonElement element, string propertyName) -{ - JsonElement property = RequireProperty(element, propertyName); - if (property.TryGetInt64(out long value)) - return value; - - throw new InvalidOperationException($"Property '{propertyName}' is not an Int64."); -} - -static double ReadDouble(JsonElement element, string propertyName) -{ - JsonElement property = RequireProperty(element, propertyName); - if (property.TryGetDouble(out double value)) - return value; - - throw new InvalidOperationException($"Property '{propertyName}' is not a Double."); -} - -static bool ReadBoolean(JsonElement element, string propertyName) -{ - JsonElement property = RequireProperty(element, propertyName); - return property.ValueKind switch - { - JsonValueKind.True => true, - JsonValueKind.False => false, - _ => throw new InvalidOperationException($"Property '{propertyName}' is not a Boolean.") - }; -} - -static bool HasNonNullProperty(JsonElement element, string propertyName) -{ - return element.TryGetProperty(propertyName, out JsonElement property) && property.ValueKind != JsonValueKind.Null; -} - -static Coordinate ReadCoordinate(JsonElement element, string propertyName) -{ - JsonElement coordinate = RequireProperty(element, propertyName); - return new Coordinate( - ReadDouble(coordinate, "x"), - ReadDouble(coordinate, "y"), - ReadDouble(coordinate, "z")); -} - -static JsonElement FindPlayer(JsonElement players, string playerName) -{ - foreach (JsonElement player in players.EnumerateArray()) - { - string? name = ReadString(player, "name"); - if (string.Equals(name, playerName, StringComparison.OrdinalIgnoreCase)) - return player; - } - - throw new InvalidOperationException($"Could not find player '{playerName}' in mcc_players_detailed."); -} - -static bool ContainsItemType(JsonElement searchData, string itemType) -{ - JsonElement matches = RequireProperty(searchData, "matches"); - foreach (JsonElement match in matches.EnumerateArray()) - { - if (string.Equals(ReadString(match, "itemType"), itemType, StringComparison.OrdinalIgnoreCase)) - return true; - } - - return false; -} - -static bool ContainsBot(JsonElement bots, string botName) -{ - foreach (JsonElement bot in bots.EnumerateArray()) - { - if (string.Equals(ReadString(bot, "name"), botName, StringComparison.OrdinalIgnoreCase)) - return true; - } - - return false; -} - -static HashSet GetEventTypes(JsonElement recentEventsData) -{ - JsonElement events = RequireProperty(recentEventsData, "events"); - return events.EnumerateArray() - .Select(entry => RequireString(entry, "type")) - .ToHashSet(StringComparer.OrdinalIgnoreCase); -} - -static bool AllEventsMatchType(JsonElement recentEventsData, string type) -{ - JsonElement events = RequireProperty(recentEventsData, "events"); - foreach (JsonElement entry in events.EnumerateArray()) - { - if (!string.Equals(RequireString(entry, "type"), type, StringComparison.OrdinalIgnoreCase)) - return false; - } - - return true; -} - -static void Ensure(bool condition, string message) -{ - if (!condition) - throw new InvalidOperationException(message); -} - -static bool IsLocalEndpoint(string endpoint) -{ - if (!Uri.TryCreate(endpoint, UriKind.Absolute, out Uri? uri)) - return false; - - return string.Equals(uri.Host, "localhost", StringComparison.OrdinalIgnoreCase) - || string.Equals(uri.Host, "127.0.0.1", StringComparison.OrdinalIgnoreCase) - || string.Equals(uri.Host, "::1", StringComparison.OrdinalIgnoreCase); -} - -static string FindRepoRoot() -{ - string current = Directory.GetCurrentDirectory(); - DirectoryInfo? directory = new(current); - - while (directory is not null) - { - if (File.Exists(Path.Combine(directory.FullName, "MinecraftClient.sln"))) - return directory.FullName; - - directory = directory.Parent; - } - - return current; -} - -static StdioClientTransportOptions CreateStdioOptions() -{ - string? stdioBin = Environment.GetEnvironmentVariable("MCC_MCP_STDIO_BIN"); - if (!string.IsNullOrWhiteSpace(stdioBin)) - { - return new StdioClientTransportOptions - { - Name = "MCC MCP Stdio Harness", - Command = stdioBin, - Arguments = [], - ShutdownTimeout = TimeSpan.FromSeconds(5) - }; - } - - return new StdioClientTransportOptions - { - Name = "MCC MCP Stdio Harness", - Command = "dotnet", - Arguments = - [ - "run", - "--project", - "DebugTools/MccMcpStdioHarness", - "-c", - "Release", - "--no-build" - ], - ShutdownTimeout = TimeSpan.FromSeconds(5) - }; -} - -internal readonly record struct Coordinate(double X, double Y, double Z); - -internal sealed record ToolEnvelope( - string ToolName, - bool IsError, - bool Success, - string? ErrorCode, - string? Message, - JsonElement Root, - JsonElement? Data); diff --git a/DebugTools/MccMcpStdioHarness/MccMcpStdioHarness.csproj b/DebugTools/MccMcpStdioHarness/MccMcpStdioHarness.csproj deleted file mode 100644 index c45c4f2c17..0000000000 --- a/DebugTools/MccMcpStdioHarness/MccMcpStdioHarness.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - Exe - net10.0 - enable - enable - - - - - - - - - - - diff --git a/DebugTools/MccMcpStdioHarness/Program.cs b/DebugTools/MccMcpStdioHarness/Program.cs deleted file mode 100644 index 1b90ddbb40..0000000000 --- a/DebugTools/MccMcpStdioHarness/Program.cs +++ /dev/null @@ -1,984 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using MinecraftClient.Mcp; -using ModelContextProtocol.Server; - -var builder = Host.CreateApplicationBuilder(args); -builder.Logging.AddConsole(options => -{ - options.LogToStandardErrorThreshold = LogLevel.Trace; -}); - -builder.Services.AddSingleton(new MccMcpConfig()); -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); -builder.Services.AddMcpServer() - .WithStdioServerTransport() - .WithTools() - .WithPrompts(); - -await builder.Build().RunAsync(); - -internal sealed class DeterministicCapabilities : IMccMcpCapabilities -{ - private static double C(double value) => Math.Round(value, 2, MidpointRounding.AwayFromZero); - - private readonly List recentEvents = []; - private long nextEventId = 1; - private double playerX = C(0.5); - private double playerY = C(80.0); - private double playerZ = C(0.5); - private float yaw; - private float pitch; - private int currentSlot = 1; - private bool sneaking; - private bool sprinting; - private float health = 20.0f; - private bool disconnecting; - - public DeterministicCapabilities() - { - AddRecentEvent("player_join", new { name = "HarnessBot" }); - AddRecentEvent("inventory_open", new { inventoryId = 1, type = "Generic_9x3", title = "Chest" }); - AddRecentEvent("weather_rain", new { level = 1.0 }); - AddRecentEvent("title", new { text = "mcp_title" }); - AddRecentEvent("actionbar", new { text = "mcp_actionbar" }); - } - - public MccMcpResult GetSessionStatus() => - MccMcpResult.Ok(new - { - connected = !disconnecting, - host = "deterministic.local", - port = 25565, - username = "HarnessBot", - location = new { x = playerX, y = playerY, z = playerZ } - }); - - public MccMcpResult GetServerInfo() => - MccMcpResult.Ok(new - { - host = "deterministic.local", - port = 25565, - tps = 20.0 - }); - - public MccMcpResult GetPlayerState() => - MccMcpResult.Ok(new - { - nickname = "HarnessBot", - username = "HarnessBot", - health, - saturation = 20, - gamemode = 1, - currentSlot, - yaw, - pitch, - location = new { x = playerX, y = playerY, z = playerZ }, - effects = new object[0] - }); - - public MccMcpResult GetWorldState() => - MccMcpResult.Ok(new - { - connected = !disconnecting, - host = "deterministic.local", - port = 25565, - username = "HarnessBot", - protocol = 769, - terrainEnabled = true, - inventoryEnabled = true, - entityHandlingEnabled = true, - location = new { x = playerX, y = playerY, z = playerZ }, - tps = 20.0, - dimension = "minecraft:overworld", - loadedChunkCount = 9, - pendingChunkCount = 0, - totalChunkCount = 9, - loadRatio = 1.0, - worldAge = 12000L, - timeOfDay = 6000L, - rainLevel = 1.0, - thunderLevel = 0.0 - }); - - public MccMcpResult GetChunkStatus(double? x, double? y, double? z) - { - double resolvedX = x ?? playerX; - double resolvedY = y ?? playerY; - double resolvedZ = z ?? playerZ; - int chunkX = (int)Math.Floor(resolvedX) >> 4; - int chunkZ = (int)Math.Floor(resolvedZ) >> 4; - - return MccMcpResult.Ok(new - { - location = new { x = C(resolvedX), y = C(resolvedY), z = C(resolvedZ) }, - chunk = new { x = chunkX, z = chunkZ }, - loaded = true, - fullyLoaded = true, - loadedChunkCount = 9, - pendingChunkCount = 0, - totalChunkCount = 9, - loadRatio = 1.0 - }); - } - - public MccMcpResult RaycastBlock(double maxDistance, bool includeNeighbors) - { - object? neighbors = includeNeighbors - ? new - { - north = new { x = 0, y = 79, z = -1, material = "Air", typeLabel = "Air" }, - south = new { x = 0, y = 79, z = 1, material = "Air", typeLabel = "Air" }, - east = new { x = 1, y = 79, z = 0, material = "Air", typeLabel = "Air" }, - west = new { x = -1, y = 79, z = 0, material = "Air", typeLabel = "Air" }, - above = new { x = 0, y = 80, z = 0, material = "Air", typeLabel = "Air" }, - below = new { x = 0, y = 78, z = 0, material = "Stone", typeLabel = "Stone" } - } - : null; - - return MccMcpResult.Ok(new - { - hit = true, - maxDistance, - playerLocation = new { x = playerX, y = playerY, z = playerZ }, - eyeLocation = new { x = playerX, y = C(playerY + 1.62), z = playerZ }, - location = new { x = 0, y = 79, z = 0 }, - block = new { material = "Stone", typeLabel = "Stone", blockId = 1, blockMeta = 0 }, - distance = 1.12, - eyeDistance = 2.03, - neighbors - }); - } - - public MccMcpResult PreviewPath(double x, double y, double z, bool allowUnsafe, int maxOffset, int minOffset, int timeoutMs, int maxWaypoints) - { - object[] waypoints = - [ - new { x = playerX, y = playerY, z = playerZ }, - new { x = C((playerX + x) / 2), y = C((playerY + y) / 2), z = C((playerZ + z) / 2) }, - new { x = C(x), y = C(y), z = C(z) } - ]; - - return MccMcpResult.Ok(new - { - pathFound = true, - exactReachable = true, - target = new { x = C(x), y = C(y), z = C(z) }, - startLocation = new { x = playerX, y = playerY, z = playerZ }, - finalWaypoint = new { x = C(x), y = C(y), z = C(z) }, - finalDistance = 0.0, - waypointCount = waypoints.Length, - truncated = waypoints.Length > Math.Max(1, maxWaypoints), - waypoints = waypoints.Take(Math.Max(1, maxWaypoints)).ToArray(), - allowUnsafe, - maxOffset, - minOffset, - timeoutMs = timeoutMs <= 0 ? 5000 : timeoutMs - }); - } - - public MccMcpResult GetPlayersList() => - MccMcpResult.Ok(new - { - players = new[] { "HarnessBot", "PlayerOne" } - }); - - public MccMcpResult GetPlayersDetailed(bool includeSelf, bool includeCoordinates) - { - List players = []; - if (includeSelf) - { - players.Add(new - { - name = "HarnessBot", - uuid = Guid.Parse("11111111-1111-1111-1111-111111111111"), - ping = 5, - gamemode = 1, - listed = true, - displayName = "HarnessBot", - entityId = 1, - x = includeCoordinates ? playerX : (double?)null, - y = includeCoordinates ? playerY : (double?)null, - z = includeCoordinates ? playerZ : (double?)null - }); - } - - players.Add(new - { - name = "PlayerOne", - uuid = Guid.Parse("22222222-2222-2222-2222-222222222222"), - ping = 12, - gamemode = 1, - listed = true, - displayName = "PlayerOne", - entityId = 2, - x = includeCoordinates ? C(3.5) : (double?)null, - y = includeCoordinates ? C(80.0) : (double?)null, - z = includeCoordinates ? C(0.5) : (double?)null - }); - - return MccMcpResult.Ok(new - { - count = players.Count, - players = players.ToArray() - }); - } - - public MccMcpResult GetPlayerStats() => - MccMcpResult.Ok(new - { - health, - saturation = 20, - level = 12, - totalExperience = 245, - gamemode = 1, - playerEntityId = 1, - currentSlot, - yaw, - pitch, - sneaking, - sprinting, - location = new { x = playerX, y = playerY, z = playerZ }, - tps = 20.0 - }); - - public MccMcpResult GetStatusEffects() => - MccMcpResult.Ok(new - { - count = 0, - effects = Array.Empty() - }); - - public MccMcpResult GetRecentEvents(long afterId, int maxCount, string? typeFilter) - { - RecentEvent[] events = recentEvents - .Where(e => e.Id > afterId) - .Where(e => string.IsNullOrWhiteSpace(typeFilter) || string.Equals(e.Type, typeFilter, StringComparison.OrdinalIgnoreCase)) - .Take(Math.Max(1, maxCount)) - .ToArray(); - - return MccMcpResult.Ok(new - { - afterId, - latestId = recentEvents.Count > 0 ? recentEvents[^1].Id : 0, - count = events.Length, - events = events.Select(e => new - { - id = e.Id, - timestampUtc = e.TimestampUtc, - type = e.Type, - data = e.Data - }).ToArray() - }); - } - - public MccMcpResult GetLoadedBots() => - MccMcpResult.Ok(new - { - count = 2, - bots = new object[] - { - new { name = "McpServer", fullTypeName = "MinecraftClient.ChatBots.McpServer", isScript = false }, - new { name = "HarnessScript", fullTypeName = "MinecraftClient.ChatBots.Script", isScript = true } - } - }); - - public MccMcpResult GetChatHistory(int maxCount, bool includeJson) => - MccMcpResult.Ok(new - { - count = 2, - entries = new object[] - { - new { timestampUtc = DateTimeOffset.UtcNow.AddSeconds(-10), kind = "chat", text = " hello", sender = "PlayerOne", message = "hello", json = includeJson ? "{}" : null }, - new { timestampUtc = DateTimeOffset.UtcNow.AddSeconds(-5), kind = "system", text = "HarnessBot joined the game", sender = (string?)null, message = (string?)null, json = includeJson ? "{}" : null } - } - }); - - public MccMcpResult GetInternalCommands() => - MccMcpResult.Ok(new - { - count = 4, - commands = new[] - { - new { name = "debug", usage = "debug [on|off|state]", description = "Toggle debug or print state." }, - new { name = "move", usage = "move ", description = "Move to location." }, - new { name = "useitem", usage = "useitem [x] [y] [z]", description = "Use current held item." }, - new { name = "dig", usage = "dig [duration]", description = "Dig block at location." } - } - }); - - public MccMcpResult GetMaterialsList(string? filter, int maxCount) => - MccMcpResult.Ok(new - { - total = 3, - count = 3, - filter, - materials = new[] - { - new { name = "Air", typeLabel = "Air" }, - new { name = "GrassBlock", typeLabel = "Grass Block" }, - new { name = "OakLog", typeLabel = "Oak Log" } - } - }); - - public MccMcpResult GetBlockTypesList(string? filter, int maxCount) => - MccMcpResult.Ok(new - { - total = 3, - count = 3, - filter, - blockTypes = new[] - { - new { name = "Air", typeLabel = "Air" }, - new { name = "GrassBlock", typeLabel = "Grass Block" }, - new { name = "OakLog", typeLabel = "Oak Log" } - } - }); - - public MccMcpResult GetEntityTypesList(string? filter, int maxCount) => - MccMcpResult.Ok(new - { - total = 3, - count = 3, - filter, - entityTypes = new[] - { - new { name = "Player", typeLabel = "Player" }, - new { name = "Item", typeLabel = "Item" }, - new { name = "Villager", typeLabel = "Villager" } - } - }); - - public MccMcpResult SendChat(string text) => - MccMcpResult.Ok(new { echoed = text }); - - public MccMcpResult QuitClient() => - MccMcpResult.Ok(new { quitting = true }); - - public MccMcpResult DisconnectClient() - { - disconnecting = true; - AddRecentEvent("disconnect", new { reason = "requested", message = "Disconnect requested by test client." }); - return MccMcpResult.Ok(new { disconnecting = true }); - } - - public MccMcpResult RunInternalCommand(string command) => - MccMcpResult.Ok(new { command, status = "Done", output = "deterministic" }); - - public MccMcpResult UseItemOnHand() => - MccMcpResult.Ok(new { success = true, action = "use_item_on_hand" }); - - public MccMcpResult ChangeHotbarSlot(int slot) - { - currentSlot = slot; - return MccMcpResult.Ok(new { success = true, slot }); - } - - public MccMcpResult SelectHotbarItem(string itemType, bool preferLowestSlot) - { - currentSlot = string.Equals(itemType, "DiamondSword", StringComparison.OrdinalIgnoreCase) ? 2 : 1; - return MccMcpResult.Ok(new - { - success = true, - itemType, - inventorySlot = currentSlot - 1, - selectedSlot = currentSlot, - count = string.Equals(itemType, "DiamondSword", StringComparison.OrdinalIgnoreCase) ? 1 : 32, - preferLowestSlot - }); - } - - public MccMcpResult UseItemOnBlock(double x, double y, double z) => - MccMcpResult.Ok(new { success = true, x = C(x), y = C(y), z = C(z), action = "useitem" }); - - public MccMcpResult DigBlock(double x, double y, double z, double durationSeconds) => - MccMcpResult.Ok(new - { - success = true, - target = new { x = C(x), y = C(y), z = C(z) }, - beforeBlock = new { material = "OakLog", typeLabel = "Oak Log", blockId = 137, blockMeta = 0 }, - afterBlock = new { material = "Air", typeLabel = "Air", blockId = 0, blockMeta = 0 }, - commandAccepted = true, - changed = true, - destroyed = true, - attempts = 1, - attemptedDurationsSeconds = new[] { durationSeconds > 0 ? durationSeconds : 1.5 }, - distance = 1.5, - playerLocation = new { x = C(0.5), y = C(80.0), z = C(0.5) } - }); - - public MccMcpResult PlaceBlock(int x, int y, int z, string face, string hand, bool lookAtBlock) => - MccMcpResult.Ok(new { success = true, x, y, z, face, hand, lookAtBlock, action = "place_block" }); - - public MccMcpResult InteractEntity(int entityId, string interaction, string hand) => - MccMcpResult.Ok(new { success = true, entityId, interaction, hand }); - - public MccMcpResult AttackEntity(int entityId) => - MccMcpResult.Ok(new { success = true, entityId, interaction = "Attack" }); - - public MccMcpResult FindNearestEntity(string? typeFilter, string? nameFilter, double radius, bool includePlayers) - { - bool wantsArmorStand = string.IsNullOrWhiteSpace(typeFilter) - || string.Equals(typeFilter, "ArmorStand", StringComparison.OrdinalIgnoreCase) - || string.Equals(typeFilter, "Armor Stand", StringComparison.OrdinalIgnoreCase); - - if (wantsArmorStand && radius >= 4.0) - { - return MccMcpResult.Ok(new - { - id = 7, - type = "ArmorStand", - typeLabel = "Armor Stand", - uuid = Guid.Parse("33333333-3333-3333-3333-333333333333"), - name = "Armor Stand", - customName = (string?)null, - x = C(2.5), - y = C(80.0), - z = C(0.5), - distance = 2.0, - health = 20.0f, - pose = "Standing", - latency = 0 - }); - } - - if (includePlayers && radius >= 3.0) - { - return MccMcpResult.Ok(new - { - id = 2, - type = "Player", - typeLabel = "Player", - uuid = Guid.Parse("22222222-2222-2222-2222-222222222222"), - name = string.IsNullOrWhiteSpace(nameFilter) ? "PlayerOne" : nameFilter, - customName = (string?)null, - x = C(3.5), - y = C(80.0), - z = C(0.5), - distance = 3.0, - health = 20.0f, - pose = "Standing", - latency = 12 - }); - } - - return MccMcpResult.Fail("invalid_state", data: new { typeFilter, nameFilter, radius, includePlayers }); - } - - public MccMcpResult ScanNearbyBlocks(int radius, int maxCount, string? materialFilter) => - MccMcpResult.Ok(new - { - center = new { x = 0, y = 79, z = 0 }, - radius, - count = 1, - blocks = new[] - { - new { x = 0, y = 79, z = 0, material = materialFilter ?? "GrassBlock", blockId = 9, blockMeta = 0, distance = 0.0 } - } - }); - - public MccMcpResult FindBlocks(string? query, int radius, int maxCount, bool exactMatch) => - MccMcpResult.Ok(new - { - center = new { x = 0, y = 79, z = 0 }, - radius, - query, - exactMatch, - count = 2, - blocks = new object[] - { - new { x = 1, y = 79, z = 0, material = "GrassBlock", typeLabel = "Grass Block", blockId = 9, blockMeta = 0, distance = 1.0 }, - new { x = 2, y = 79, z = 0, material = "Dirt", typeLabel = "Dirt", blockId = 10, blockMeta = 0, distance = 2.0 } - } - }); - - public MccMcpResult IsPlayerNearby(string? playerName, double radius, bool includeSelf) => - MccMcpResult.Ok(new - { - radius, - playerName, - includeSelf, - anyNearby = true, - count = 1, - players = new object[] - { - new - { - entityId = 1, - uuid = Guid.Empty, - name = "PlayerOne", - customName = (string?)null, - x = C(3.5), - y = C(80.0), - z = C(0.5), - distance = 3.0, - latency = 5 - } - } - }); - - public MccMcpResult LocatePlayer(string playerName, bool includeSelf) => - MccMcpResult.Ok(new - { - playerName, - matchedName = "PlayerOne", - entityId = 1, - uuid = Guid.Empty, - x = C(3.5), - y = C(80.0), - z = C(0.5), - distance = 3.0 - }); - - public MccMcpResult CanReachPosition(double x, double y, double z, bool allowUnsafe, int maxOffset, int minOffset, int timeoutMs) => - MccMcpResult.Ok(new - { - reachable = true, - exactReachable = true, - target = new { x = C(x), y = C(y), z = C(z) }, - startLocation = new { x = C(0.5), y = C(80.0), z = C(0.5) }, - finalWaypoint = new { x = C(x), y = C(y), z = C(z) }, - finalDistance = 0.0, - waypointCount = 4, - allowUnsafe, - maxOffset, - minOffset, - timeoutMs = timeoutMs <= 0 ? 5000 : timeoutMs - }); - - public MccMcpResult MoveTo(double x, double y, double z, bool allowUnsafe, bool allowDirectTeleport, int maxOffset, int minOffset, int timeoutMs) => - MccMcpResult.Ok(new - { - pathFound = true, - arrived = true, - tolerance = 1.5, - verifyWaitMs = 250, - target = new { x = C(x), y = C(y), z = C(z) }, - startLocation = new { x = C(0.5), y = C(80.0), z = C(0.5) }, - finalLocation = new { x = C(x), y = C(y), z = C(z) }, - finalDistance = 0.0, - distanceMoved = 3.0, - allowUnsafe, - allowDirectTeleport, - maxOffset, - minOffset, - timeoutMs - }); - - public MccMcpResult MoveToPlayer(string playerName, bool allowUnsafe, bool allowDirectTeleport, int maxOffset, int minOffset, int timeoutMs) => - MccMcpResult.Ok(new - { - pathFound = true, - arrived = true, - tolerance = 1.5, - verifyWaitMs = 250, - target = new - { - playerName = "PlayerOne", - entityId = 1, - x = C(3.5), - y = C(80.0), - z = C(0.5) - }, - startLocation = new { x = C(0.5), y = C(80.0), z = C(0.5) }, - finalLocation = new { x = C(3.5), y = C(80.0), z = C(0.5) }, - finalDistance = 0.0, - distanceMoved = 3.0, - allowUnsafe, - allowDirectTeleport, - maxOffset, - minOffset, - timeoutMs - }); - - public MccMcpResult LookAt(double x, double y, double z) => - MccMcpResult.Ok(new { looked = true, x = C(x), y = C(y), z = C(z) }); - - public MccMcpResult LookDirection(string direction) - { - switch (direction.Trim().ToLowerInvariant()) - { - case "up": - yaw = 0.0f; - pitch = -90.0f; - break; - case "down": - yaw = 0.0f; - pitch = 90.0f; - break; - case "north": - yaw = 180.0f; - pitch = 0.0f; - break; - case "south": - yaw = 0.0f; - pitch = 0.0f; - break; - case "east": - yaw = -90.0f; - pitch = 0.0f; - break; - case "west": - yaw = 90.0f; - pitch = 0.0f; - break; - } - - return MccMcpResult.Ok(new { success = true, direction, yaw, pitch }); - } - - public MccMcpResult LookAngles(float yaw, float pitch) - { - this.yaw = yaw; - this.pitch = pitch; - return MccMcpResult.Ok(new { success = true, yaw, pitch }); - } - - public MccMcpResult PlayAnimation(string hand) => - MccMcpResult.Ok(new { success = true, hand }); - - public MccMcpResult ToggleSneak(bool enabled) - { - sneaking = enabled; - return MccMcpResult.Ok(new { success = true, enabled = sneaking }); - } - - public MccMcpResult ToggleSprint(bool enabled) - { - sprinting = enabled; - return MccMcpResult.Ok(new { success = true, enabled = sprinting }); - } - - public MccMcpResult ListInventories() => - MccMcpResult.Ok(new - { - count = 2, - inventories = new object[] - { - new { id = 0, type = "PlayerInventory", title = "Player Inventory", slotCount = 46, nonEmptySlots = 1, active = false }, - new { id = 1, type = "Generic_9x3", title = "Chest", slotCount = 63, nonEmptySlots = 2, active = true } - } - }); - - public MccMcpResult GetInventorySnapshot(int inventoryId) => - MccMcpResult.Ok(new - { - id = inventoryId, - type = inventoryId == 0 ? "PlayerInventory" : "Generic_9x3", - title = inventoryId == 0 ? "Player Inventory" : "Chest", - slotCount = inventoryId == 0 ? 46 : 63, - slots = new[] - { - new { slot = 0, type = "Stone", count = 64 } - } - }); - - public MccMcpResult SearchInventories(string query, int maxCount, bool exactMatch, bool includeContainers) - { - List matches = []; - - if (query.Contains("stone", StringComparison.OrdinalIgnoreCase)) - { - matches.Add(new - { - inventoryId = 0, - inventoryType = "PlayerInventory", - inventoryTitle = "Player Inventory", - slot = 0, - itemType = "Stone", - typeLabel = "Stone", - count = 32, - isPlayerInventory = true, - hotbarSlot = 1 - }); - } - - if (query.Contains("diamond", StringComparison.OrdinalIgnoreCase) || query.Contains("sword", StringComparison.OrdinalIgnoreCase)) - { - matches.Add(new - { - inventoryId = 0, - inventoryType = "PlayerInventory", - inventoryTitle = "Player Inventory", - slot = 1, - itemType = "DiamondSword", - typeLabel = "Diamond Sword", - count = 1, - isPlayerInventory = true, - hotbarSlot = 2 - }); - } - - if (includeContainers) - { - matches.Add(new - { - inventoryId = 1, - inventoryType = "Generic_9x3", - inventoryTitle = "Chest", - slot = 0, - itemType = "Stone", - typeLabel = "Stone", - count = 16, - isPlayerInventory = false, - hotbarSlot = (int?)null - }); - } - - object[] result = matches.Take(Math.Max(1, maxCount)).ToArray(); - return MccMcpResult.Ok(new - { - query, - exactMatch, - includeContainers, - count = result.Length, - matches = result - }); - } - - public MccMcpResult OpenContainerAt(int x, int y, int z, int timeoutMs, bool closeCurrent) - { - AddRecentEvent("inventory_open", new { inventoryId = 1, type = "Generic_9x3", title = "Chest", x, y, z }); - return MccMcpResult.Ok(new - { - success = true, - openAccepted = true, - opened = true, - timeoutMs = timeoutMs <= 0 ? 5000 : timeoutMs, - x, - y, - z, - block = new { material = "Chest", typeLabel = "Chest", blockId = 0, blockMeta = 0 }, - inventory = new { id = 1, type = "Generic_9x3", title = "Chest", slotCount = 63, nonEmptySlots = 2 } - }); - } - - public MccMcpResult CloseContainer(int inventoryId, int timeoutMs) - { - int resolvedInventoryId = inventoryId <= 0 ? 1 : inventoryId; - AddRecentEvent("inventory_close", new { inventoryId = resolvedInventoryId }); - return MccMcpResult.Ok(new - { - success = true, - closed = true, - inventoryId = resolvedInventoryId, - timeoutMs = timeoutMs <= 0 ? 5000 : timeoutMs - }); - } - - public MccMcpResult InventoryWindowAction(int inventoryId, int slotId, string actionType) => - MccMcpResult.Ok(new { success = true, inventoryId, slotId, actionType }); - - public MccMcpResult DropInventoryItem(string itemType, int count, int inventoryId, bool preferStack) => - MccMcpResult.Ok(new - { - success = true, - itemType, - requestedCount = count, - droppedCount = count, - beforeCount = 64, - afterCount = Math.Max(0, 64 - count), - inventoryId, - touchedSlots = new[] { 36 }, - preferStack - }); - - public MccMcpResult DepositContainerItem(string itemType, int count, int inventoryId, bool preferLargestStack) => - MccMcpResult.Ok(new - { - success = true, - direction = "deposit", - itemType, - requestedCount = count, - movedCount = count, - beforePlayerCount = 64, - afterPlayerCount = Math.Max(0, 64 - count), - beforeContainerCount = 0, - afterContainerCount = count, - inventoryId = inventoryId <= 0 ? 1 : inventoryId, - containerType = "Generic_9x3", - touchedSourceSlots = new[] { 36 }, - touchedTargetSlots = new[] { 0 } - }); - - public MccMcpResult WithdrawContainerItem(string itemType, int count, int inventoryId, bool preferLargestStack) => - MccMcpResult.Ok(new - { - success = true, - direction = "withdraw", - itemType, - requestedCount = count, - movedCount = count, - beforePlayerCount = 0, - afterPlayerCount = count, - beforeContainerCount = 64, - afterContainerCount = Math.Max(0, 64 - count), - inventoryId = inventoryId <= 0 ? 1 : inventoryId, - containerType = "Generic_9x3", - touchedSourceSlots = new[] { 0 }, - touchedTargetSlots = new[] { 36 } - }); - - public MccMcpResult QueryEntities(int maxCount) => - MccMcpResult.Ok(new - { - count = 1, - entities = new[] - { - new { id = 1, type = "Player", x = C(0.5), y = C(80.0), z = C(0.5) } - } - }); - - public MccMcpResult ListEntities(int maxCount, string? typeFilter, double radius) => - MccMcpResult.Ok(new - { - totalTracked = 1, - count = 1, - entities = new[] - { - new - { - id = 1, - type = "Player", - typeLabel = "Player", - uuid = Guid.Empty, - name = "HarnessBot", - customName = (string?)null, - x = C(0.5), - y = C(80.0), - z = C(0.5), - distance = 0.0, - health = 20.0f, - pose = "Standing", - latency = 5 - } - } - }); - - public MccMcpResult GetEntityInfo(int entityId, bool includeMetadata, bool includeEquipment, bool includeEffects) => - MccMcpResult.Ok(new - { - id = entityId, - type = "Player", - typeLabel = "Player", - uuid = Guid.Empty, - name = "HarnessBot", - customName = (string?)null, - customNameVisible = false, - x = C(0.5), - y = C(80.0), - z = C(0.5), - yaw = 0.0f, - pitch = 0.0f, - health = 20.0f, - pose = "Standing", - latency = 5, - objectData = -1, - metadata = includeMetadata ? new { flags = 0 } : null, - equipment = includeEquipment ? new[] { new { slot = 0, type = "Stone", count = 1 } } : null, - activeEffects = includeEffects ? new object[0] : null - }); - - public MccMcpResult FindSigns(string text, bool exactMatch, int radius, int maxCount, bool includeBackText) => - MccMcpResult.Ok(new - { - text, - exactMatch, - radius, - includeBackText, - count = 1, - signs = new[] - { - new - { - x = 2, - y = 80, - z = 1, - material = "OakSign", - typeLabel = "Oak Sign", - distance = 1.8, - isWaxed = false, - frontText = new[] { "home", "storage" }, - backText = includeBackText ? new[] { "north wall" } : Array.Empty(), - matchedLines = new[] { text } - } - } - }); - - public MccMcpResult ListItemEntities(string? itemType, double radius, int maxCount) => - MccMcpResult.Ok(new - { - itemType = itemType ?? "OakLog", - radius, - count = 1, - items = new[] - { - new - { - entityId = 99, - itemType = "OakLog", - typeLabel = "Oak Log", - count = 3, - x = C(2.5), - y = C(80.0), - z = C(1.5), - distance = 2.24 - } - } - }); - - public MccMcpResult PickupItems(string itemType, double radius, int maxItems, bool allowUnsafe, int timeoutMs) => - MccMcpResult.Ok(new - { - itemType, - radius, - maxItems, - allowUnsafe, - timeoutMs = timeoutMs <= 0 ? 2500 : timeoutMs, - attempted = 1, - successfulPickups = 1, - collectedCount = 3, - initialInventoryCount = 0, - finalInventoryCount = 3, - remainingNearby = 0, - attempts = new object[] - { - new - { - entityId = 99, - itemType, - typeLabel = "Oak Log", - expectedCount = 3, - target = new { x = C(2.5), y = C(80.0), z = C(1.5) }, - pathFound = true, - arrived = true, - entityGone = true, - inventoryDelta = 3, - startLocation = new { x = C(0.5), y = C(80.0), z = C(0.5) }, - finalLocation = new { x = C(2.5), y = C(80.0), z = C(1.5) }, - finalDistance = 0.0 - } - } - }); - - public MccMcpResult Respawn() - { - health = 20.0f; - AddRecentEvent("respawn", new { location = new { x = playerX, y = playerY, z = playerZ } }); - return MccMcpResult.Ok(new { success = true, respawned = true }); - } - - public MccMcpResult GetWorldBlockAt(int x, int y, int z) => - MccMcpResult.Ok(new { x, y, z, material = "Air", blockId = 0, blockMeta = 0 }); - - private void AddRecentEvent(string type, object? data) - { - recentEvents.Add(new RecentEvent(nextEventId++, DateTimeOffset.UtcNow, type, data)); - if (recentEvents.Count > 100) - recentEvents.RemoveAt(0); - } - - private sealed record RecentEvent(long Id, DateTimeOffset TimestampUtc, string Type, object? Data); -} diff --git a/DebugTools/MccMcpWebPlayground/Api/MccPlaygroundEndpoints.cs b/DebugTools/MccMcpWebPlayground/Api/MccPlaygroundEndpoints.cs deleted file mode 100644 index ec3e0f8371..0000000000 --- a/DebugTools/MccMcpWebPlayground/Api/MccPlaygroundEndpoints.cs +++ /dev/null @@ -1,36 +0,0 @@ -using DebugTools.MccMcpWebPlayground.Contracts; -using DebugTools.MccMcpWebPlayground.Harness; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Options; - -namespace DebugTools.MccMcpWebPlayground.Api; - -public static class MccPlaygroundEndpoints -{ - public static IEndpointRouteBuilder MapMccPlaygroundEndpoints(this IEndpointRouteBuilder endpoints) - { - RouteGroupBuilder api = endpoints.MapGroup("/api"); - - api.MapGet("/health", () => Results.Ok(new { ok = true })); - - api.MapGet("/config", (IOptions options) => - { - MccWebHarnessOptions harnessOptions = options.Value; - return Results.Ok(new MccConfigResponse( - Model: harnessOptions.ResolveModel(), - OpenRouterBaseUrl: harnessOptions.ResolveOpenRouterBaseUrl(), - McpEndpoint: harnessOptions.ResolveMcpEndpoint(), - HasApiKey: harnessOptions.HasApiKeyConfigured(), - ExposeInventoryWindowAction: harnessOptions.ExposeInventoryWindowAction, - ExposeInternalCommandTool: harnessOptions.ExposeInternalCommandTool)); - }); - - api.MapPost("/chat/stream", (ChatStreamRequest request, IMccAgentRunService runService, HttpContext httpContext, CancellationToken cancellationToken) => - { - return TypedResults.ServerSentEvents(runService.StreamAsync(request, httpContext, cancellationToken)); - }) - .WithRequestTimeout("mcc-stream"); - - return endpoints; - } -} diff --git a/DebugTools/MccMcpWebPlayground/Contracts/MccContracts.cs b/DebugTools/MccMcpWebPlayground/Contracts/MccContracts.cs deleted file mode 100644 index 2257e1b170..0000000000 --- a/DebugTools/MccMcpWebPlayground/Contracts/MccContracts.cs +++ /dev/null @@ -1,94 +0,0 @@ -using System.Text.Json.Serialization; - -namespace DebugTools.MccMcpWebPlayground.Contracts; - -public sealed class ChatStreamRequest -{ - public List? Messages { get; set; } -} - -public sealed class ChatMessage -{ - public string Role { get; set; } = string.Empty; - public string Content { get; set; } = string.Empty; -} - -public sealed record MccConfigResponse( - string? Model, - string OpenRouterBaseUrl, - string McpEndpoint, - bool HasApiKey, - bool ExposeInventoryWindowAction, - bool ExposeInternalCommandTool); - -public sealed record MccStreamEnvelope(string RunId, long Sequence, string Kind, object Data); - -public sealed record MccRunStartedData(string Model, string McpEndpoint, DateTimeOffset StartedAtUtc); - -public sealed record MccGuidanceLoadedData( - string SourceTool, - string CanonicalPromptName, - string GuidanceVersion, - MccCapabilityStatus CapabilityStatus); - -public sealed record MccStateSummaryData( - int TurnCount, - int ToolCallCount, - bool SoftFinish, - int DirectAnswerAttempts, - IReadOnlyList OpenVerification, - IReadOnlyList RecentEvidence, - string? CompactionSummary); - -public sealed record MccToolCalledData(string CallId, string Name, string ArgumentsJson, bool Advanced, bool Sensitive); - -public sealed record MccToolResultData( - string CallId, - string Name, - bool IsError, - bool Success, - string? ErrorCode, - string Summary, - string RawText, - string EvidenceId); - -public sealed record MccVerificationEventData(string ObligationId, string ToolName, string Kind, string Description); - -public sealed record MccBudgetData( - int TurnCount, - int MaxTurns, - int ToolCallCount, - int MaxToolCalls, - double ElapsedSeconds, - int MaxWallClockSeconds); - -public sealed record MccErrorData(string Code, string Message, string? Detail = null); - -public sealed record MccFinalPayload( - string Status, - string Headline, - string AnswerMarkdown, - IReadOnlyList VerifiedFacts, - IReadOnlyList OpenIssues, - IReadOnlyList EvidenceIds, - string? NextAction); - -public sealed record MccSubmitFinalArgs( - string Status, - string Headline, - string AnswerMarkdown, - IReadOnlyList VerifiedFacts, - IReadOnlyList OpenIssues, - IReadOnlyList EvidenceIds, - string? NextAction); - -public sealed record MccCapabilityStatus( - [property: JsonPropertyName("sessionStatus")] bool SessionStatus, - [property: JsonPropertyName("chatAndCommands")] bool ChatAndCommands, - [property: JsonPropertyName("movement")] bool Movement, - [property: JsonPropertyName("inventory")] bool Inventory, - [property: JsonPropertyName("entityWorld")] bool EntityWorld); - -public sealed record MccEvidenceView(string Id, string ToolName, string Summary, bool IsError); - -public sealed record MccVerificationObligationView(string Id, string ToolName, string Kind, string Description); diff --git a/DebugTools/MccMcpWebPlayground/Harness/MccAgentRunService.cs b/DebugTools/MccMcpWebPlayground/Harness/MccAgentRunService.cs deleted file mode 100644 index 332593893c..0000000000 --- a/DebugTools/MccMcpWebPlayground/Harness/MccAgentRunService.cs +++ /dev/null @@ -1,852 +0,0 @@ -using System.Globalization; -using System.Runtime.CompilerServices; -using System.Net.ServerSentEvents; -using System.Text; -using System.Text.Json; -using DebugTools.MccMcpWebPlayground.Contracts; -using DebugTools.MccMcpWebPlayground.Infrastructure.Mcp; -using DebugTools.MccMcpWebPlayground.Infrastructure.OpenRouter; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Options; -using ModelContextProtocol.Client; -using ModelContextProtocol.Protocol; - -namespace DebugTools.MccMcpWebPlayground.Harness; - -public interface IMccAgentRunService -{ - IAsyncEnumerable> StreamAsync(ChatStreamRequest request, HttpContext httpContext, CancellationToken cancellationToken); -} - -public sealed class MccAgentRunService : IMccAgentRunService -{ - private readonly MccMcpSessionFactory sessionFactory; - private readonly MccGuidanceSource guidanceSource; - private readonly MccPromptComposer promptComposer; - private readonly MccContextCompressor contextCompressor; - private readonly MccFinalizer finalizer; - private readonly OpenRouterChatClient openRouterChatClient; - private readonly MccWebHarnessOptions options; - - public MccAgentRunService( - MccMcpSessionFactory sessionFactory, - MccGuidanceSource guidanceSource, - MccPromptComposer promptComposer, - MccContextCompressor contextCompressor, - MccFinalizer finalizer, - OpenRouterChatClient openRouterChatClient, - IOptions options) - { - this.sessionFactory = sessionFactory; - this.guidanceSource = guidanceSource; - this.promptComposer = promptComposer; - this.contextCompressor = contextCompressor; - this.finalizer = finalizer; - this.openRouterChatClient = openRouterChatClient; - this.options = options.Value; - } - - public async IAsyncEnumerable> StreamAsync( - ChatStreamRequest request, - HttpContext httpContext, - [EnumeratorCancellation] CancellationToken cancellationToken) - { - using CancellationTokenSource linkedCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, httpContext.RequestAborted); - CancellationToken linkedToken = linkedCts.Token; - - string runId = Guid.NewGuid().ToString("n"); - long sequence = 0; - - string? model = options.ResolveModel(); - if (string.IsNullOrWhiteSpace(model)) - { - yield return CreateEvent(runId, ref sequence, "error", new MccErrorData("configuration_error", "OPENROUTER_MODEL or MccWebHarness:Model must be configured.")); - yield break; - } - - if (!options.HasApiKeyConfigured()) - { - yield return CreateEvent(runId, ref sequence, "error", new MccErrorData("configuration_error", "OPENROUTER_API_KEY is not set.")); - yield break; - } - - List baseConversationMessages = NormalizeConversation(request.Messages); - string userRequest = ExtractUserRequest(request.Messages); - if (string.IsNullOrWhiteSpace(userRequest)) - { - yield return CreateEvent(runId, ref sequence, "error", new MccErrorData("invalid_request", "No user message was provided.")); - yield break; - } - - await using McpClient client = await sessionFactory.CreateAsync(linkedToken); - MccGuidanceBundle guidance = await guidanceSource.LoadAsync(client, linkedToken); - - MccRunState runState = new() - { - RunId = runId, - UserRequest = userRequest, - BaseConversationMessages = baseConversationMessages, - ConfiguredModel = model, - Guidance = guidance - }; - - yield return CreateEvent(runId, ref sequence, "run_started", new MccRunStartedData(model, options.ResolveMcpEndpoint(), runState.StartedAtUtc)); - yield return CreateEvent(runId, ref sequence, "guidance_loaded", new MccGuidanceLoadedData( - guidance.SourceToolName, - guidance.CanonicalPromptName, - guidance.GuidanceVersion, - guidance.CapabilityStatus)); - - IList tools = await client.ListToolsAsync(cancellationToken: linkedToken); - MccToolCatalog catalog = MccToolPolicy.BuildCatalog(tools, options, finalizer.BuildSubmitToolSchema()); - - while (!linkedToken.IsCancellationRequested) - { - runState.TurnCount++; - contextCompressor.CompactIfNeeded(runState); - yield return CreateEvent(runId, ref sequence, "state_summary", BuildStateSummary(runState, options)); - - if (runState.IsSoftFinish(options, DateTimeOffset.UtcNow)) - { - yield return CreateEvent(runId, ref sequence, "budget", BuildBudgetData(runState)); - } - - if (runState.IsHardStop(options, DateTimeOffset.UtcNow)) - break; - - MccModelTurn? turn = null; - Exception? providerException = null; - try - { - turn = await openRouterChatClient.CreateTurnAsync( - promptComposer.Compose(runState), - catalog.ModelVisibleTools, - options, - linkedToken); - } - catch (Exception ex) - { - providerException = ex; - } - - if (providerException is not null || turn is null) - { - yield return CreateEvent(runId, ref sequence, "error", new MccErrorData("provider_error", "OpenRouter request failed.", providerException?.Message)); - yield return CreateEvent(runId, ref sequence, "final", finalizer.BuildHardStopResult(runState, options)); - yield break; - } - - runState.RoutedModel = turn.ModelId; - runState.RoutedProvider = turn.RoutedProvider; - - if (turn.ToolCalls.Count == 0) - { - runState.DirectAnswerAttempts++; - string content = string.IsNullOrWhiteSpace(turn.AssistantContent) ? "(empty assistant turn)" : turn.AssistantContent.Trim(); - runState.ToolConversationMessages.Add(new Dictionary - { - ["role"] = "assistant", - ["content"] = content - }); - - if (runState.DirectAnswerAttempts >= 4) - { - yield return CreateEvent(runId, ref sequence, "error", new MccErrorData( - "model_protocol_error", - "The model kept returning plain assistant text instead of using tools or mcc_submit_final.", - content)); - yield return CreateEvent(runId, ref sequence, "final", finalizer.BuildHardStopResult(runState, options)); - yield break; - } - - runState.ToolConversationMessages.Add(new Dictionary - { - ["role"] = "user", - ["content"] = "The previous plain assistant text was not accepted by this harness. On your next turn, you must either call the relevant MCC tools or call mcc_submit_final. Do not answer with plain assistant text again." - }); - continue; - } - - Dictionary assistantMessage = new() - { - ["role"] = "assistant", - ["content"] = turn.AssistantContent, - ["tool_calls"] = turn.ToolCalls.Select(call => new Dictionary - { - ["id"] = call.CallId, - ["type"] = "function", - ["function"] = new Dictionary - { - ["name"] = call.Name, - ["arguments"] = call.ArgumentsJson - } - }).ToArray() - }; - runState.ToolConversationMessages.Add(assistantMessage); - - foreach (MccModelToolCall toolCall in turn.ToolCalls) - { - MccToolProfile profile = MccToolPolicy.GetProfile(toolCall.Name); - yield return CreateEvent(runId, ref sequence, "tool_called", new MccToolCalledData( - toolCall.CallId, - toolCall.Name, - toolCall.ArgumentsJson, - profile.Risk == MccToolRisk.EscapeHatch, - profile.Risk == MccToolRisk.Sensitive)); - - if (toolCall.Name.Equals("mcc_submit_final", StringComparison.OrdinalIgnoreCase)) - { - MccFinalizationValidation validation = finalizer.Validate(runState, toolCall.ArgumentsJson); - if (validation.Accepted) - { - yield return CreateEvent(runId, ref sequence, "final", validation.Payload!); - yield break; - } - - string localResultText = JsonSerializer.Serialize(new - { - success = false, - errorCode = "invalid_final_submission", - message = validation.ErrorText - }); - runState.ToolConversationMessages.Add(BuildToolMessage(toolCall.CallId, localResultText)); - yield return CreateEvent(runId, ref sequence, "tool_result", new MccToolResultData( - toolCall.CallId, - toolCall.Name, - IsError: true, - Success: false, - ErrorCode: "invalid_final_submission", - Summary: validation.ErrorText ?? "Invalid final submission.", - RawText: localResultText, - EvidenceId: string.Empty)); - continue; - } - - if (MccToolPolicy.RequiresExplicitUserIntent(toolCall.Name) && !MccToolPolicy.HasExplicitUserIntent(runState.UserRequest, toolCall.Name)) - { - string localResultText = JsonSerializer.Serialize(new - { - success = false, - errorCode = "explicit_user_intent_required", - message = $"Tool '{toolCall.Name}' requires explicit user intent." - }); - runState.ToolConversationMessages.Add(BuildToolMessage(toolCall.CallId, localResultText)); - yield return CreateEvent(runId, ref sequence, "tool_result", new MccToolResultData( - toolCall.CallId, - toolCall.Name, - IsError: true, - Success: false, - ErrorCode: "explicit_user_intent_required", - Summary: $"Tool '{toolCall.Name}' requires explicit user intent.", - RawText: localResultText, - EvidenceId: string.Empty)); - continue; - } - - if (!catalog.ToolsByName.TryGetValue(toolCall.Name, out MccToolCatalogEntry? entry)) - { - string unknownToolText = JsonSerializer.Serialize(new - { - success = false, - errorCode = "unknown_tool", - message = $"Unknown tool '{toolCall.Name}'." - }); - runState.ToolConversationMessages.Add(BuildToolMessage(toolCall.CallId, unknownToolText)); - yield return CreateEvent(runId, ref sequence, "tool_result", new MccToolResultData( - toolCall.CallId, - toolCall.Name, - IsError: true, - Success: false, - ErrorCode: "unknown_tool", - Summary: $"Unknown tool '{toolCall.Name}'.", - RawText: unknownToolText, - EvidenceId: string.Empty)); - continue; - } - - CallToolResult? result = null; - Exception? toolException = null; - try - { - Dictionary arguments = MccJsonArguments.Parse(toolCall.ArgumentsJson); - result = await client.CallToolAsync(toolCall.Name, arguments, cancellationToken: linkedToken); - } - catch (Exception ex) - { - toolException = ex; - } - - if (toolException is not null || result is null) - { - string failedText = JsonSerializer.Serialize(new - { - success = false, - errorCode = "tool_call_failed", - message = toolException?.Message - }); - runState.ToolConversationMessages.Add(BuildToolMessage(toolCall.CallId, failedText)); - yield return CreateEvent(runId, ref sequence, "tool_result", new MccToolResultData( - toolCall.CallId, - toolCall.Name, - IsError: true, - Success: false, - ErrorCode: "tool_call_failed", - Summary: toolException?.Message ?? "Tool call failed.", - RawText: failedText, - EvidenceId: string.Empty)); - continue; - } - - runState.ToolCallCount++; - MccNormalizedToolResult normalized = MccMcpJson.Normalize(result); - MccEvidenceRecord evidence = CreateEvidence(runState, toolCall.Name, normalized); - runState.Evidence.Add(evidence); - runState.ToolExecutions.Add(new MccToolExecutionRecord - { - CallId = toolCall.CallId, - ToolName = toolCall.Name, - ArgumentsJson = toolCall.ArgumentsJson, - Evidence = evidence - }); - - runState.ToolConversationMessages.Add(BuildToolMessage(toolCall.CallId, normalized.Text)); - - foreach (MccVerificationObligation obligation in CreateObligations(runState, evidence, toolCall.ArgumentsJson)) - { - runState.VerificationObligations.Add(obligation); - yield return CreateEvent(runId, ref sequence, "verification_required", new MccVerificationEventData( - obligation.Id, - obligation.ToolName, - obligation.Kind, - obligation.Description)); - - if (obligation.Cleared) - { - yield return CreateEvent(runId, ref sequence, "verification_cleared", new MccVerificationEventData( - obligation.Id, - obligation.ToolName, - obligation.Kind, - obligation.Description)); - } - } - - foreach (MccVerificationObligation cleared in TryClearObligationsFromEvidence(runState, evidence)) - { - yield return CreateEvent(runId, ref sequence, "verification_cleared", new MccVerificationEventData( - cleared.Id, - cleared.ToolName, - cleared.Kind, - cleared.Description)); - } - - yield return CreateEvent(runId, ref sequence, "tool_result", new MccToolResultData( - toolCall.CallId, - toolCall.Name, - evidence.IsError, - evidence.Success, - evidence.ErrorCode, - evidence.Summary, - evidence.RawText, - evidence.Id)); - } - } - - yield return CreateEvent(runId, ref sequence, "final", finalizer.BuildHardStopResult(runState, options)); - } - - private static List NormalizeConversation(List? incoming) - { - List messages = []; - if (incoming is null) - return messages; - - foreach (ChatMessage message in incoming) - { - if (string.IsNullOrWhiteSpace(message.Role) || string.IsNullOrWhiteSpace(message.Content)) - continue; - - string role = message.Role.Trim().ToLowerInvariant(); - if (role is not ("user" or "assistant" or "system")) - continue; - - messages.Add(new Dictionary - { - ["role"] = role, - ["content"] = message.Content.Trim() - }); - } - - return messages; - } - - private static string ExtractUserRequest(List? incoming) - { - return incoming? - .LastOrDefault(message => string.Equals(message.Role, "user", StringComparison.OrdinalIgnoreCase) - && !string.IsNullOrWhiteSpace(message.Content)) - ?.Content - ?.Trim() - ?? string.Empty; - } - - private static Dictionary BuildToolMessage(string callId, string content) - { - return new Dictionary - { - ["role"] = "tool", - ["tool_call_id"] = callId, - ["content"] = content - }; - } - - private static MccStateSummaryData BuildStateSummary(MccRunState runState, MccWebHarnessOptions options) - { - return new MccStateSummaryData( - TurnCount: runState.TurnCount, - ToolCallCount: runState.ToolCallCount, - SoftFinish: runState.IsSoftFinish(options, DateTimeOffset.UtcNow), - DirectAnswerAttempts: runState.DirectAnswerAttempts, - OpenVerification: runState.OpenObligations - .Select(obligation => new MccVerificationObligationView(obligation.Id, obligation.ToolName, obligation.Kind, obligation.Description)) - .ToArray(), - RecentEvidence: runState.Evidence - .TakeLast(6) - .Select(evidence => new MccEvidenceView(evidence.Id, evidence.ToolName, evidence.Summary, evidence.IsError)) - .ToArray(), - CompactionSummary: runState.CompactionSummary); - } - - private MccBudgetData BuildBudgetData(MccRunState runState) - { - return new MccBudgetData( - TurnCount: runState.TurnCount, - MaxTurns: options.MaxTurns, - ToolCallCount: runState.ToolCallCount, - MaxToolCalls: options.MaxToolCalls, - ElapsedSeconds: (DateTimeOffset.UtcNow - runState.StartedAtUtc).TotalSeconds, - MaxWallClockSeconds: options.MaxWallClockSeconds); - } - - private static MccEvidenceRecord CreateEvidence(MccRunState runState, string toolName, MccNormalizedToolResult result) - { - string summary = SummarizeEvidence(toolName, result); - return new MccEvidenceRecord - { - Id = runState.NextEvidenceId(), - ToolName = toolName, - Summary = summary, - RawText = result.Text, - IsError = result.IsError, - Success = result.Success, - ErrorCode = result.ErrorCode, - Root = result.Root, - Data = result.Data - }; - } - - private static string SummarizeEvidence(string toolName, MccNormalizedToolResult result) - { - if (result.Data is JsonElement data) - { - if ((toolName.Equals("mcc_move_to", StringComparison.OrdinalIgnoreCase) || toolName.Equals("mcc_move_to_player", StringComparison.OrdinalIgnoreCase)) - && TryReadBool(data, "arrived", out bool arrived)) - { - return arrived - ? $"movement verified; arrived={arrived}" - : $"movement not yet verified; arrived={arrived}"; - } - - if (toolName.Equals("mcc_dig_block", StringComparison.OrdinalIgnoreCase)) - { - bool destroyed = TryReadBool(data, "destroyed", out bool destroyedValue) && destroyedValue; - bool changed = TryReadBool(data, "changed", out bool changedValue) && changedValue; - return $"dig result changed={changed} destroyed={destroyed}"; - } - - if (toolName.Equals("mcc_items_pickup", StringComparison.OrdinalIgnoreCase)) - { - int successful = TryReadInt(data, "successfulPickups", out int successfulValue) ? successfulValue : 0; - int collected = TryReadInt(data, "collectedCount", out int collectedValue) ? collectedValue : 0; - return $"pickup result successfulPickups={successful} collectedCount={collected}"; - } - - if (toolName.Equals("mcc_container_open_at", StringComparison.OrdinalIgnoreCase) - && TryReadBool(data, "opened", out bool opened)) - { - return $"container open result opened={opened}"; - } - - if (toolName is "mcc_container_deposit_item" or "mcc_container_withdraw_item" or "mcc_inventory_drop_item") - { - int moved = TryReadInt(data, "movedCount", out int movedValue) - ? movedValue - : TryReadInt(data, "droppedCount", out int droppedValue) ? droppedValue : 0; - return $"{toolName} movedCount={moved}"; - } - } - - string prefix = result.IsError ? "error" : "ok"; - return $"{prefix}: {Truncate(result.Text.Replace('\n', ' '), 180)}"; - } - - private List CreateObligations(MccRunState runState, MccEvidenceRecord evidence, string argumentsJson) - { - List obligations = []; - JsonElement metadata = ParseArgumentsToJson(argumentsJson); - - if (evidence.ToolName.Equals("mcc_move_to", StringComparison.OrdinalIgnoreCase)) - { - MccVerificationObligation obligation = new() - { - Id = runState.NextObligationId(), - ToolName = evidence.ToolName, - Kind = "movement", - Description = "Verify final player location for the requested move target.", - SourceEvidenceId = evidence.Id, - Metadata = BuildMoveMetadata(evidence, metadata), - Cleared = IsMovementVerified(evidence) - }; - obligations.Add(obligation); - return obligations; - } - - if (evidence.ToolName.Equals("mcc_move_to_player", StringComparison.OrdinalIgnoreCase)) - { - MccVerificationObligation obligation = new() - { - Id = runState.NextObligationId(), - ToolName = evidence.ToolName, - Kind = "movement", - Description = "Verify final proximity to the requested player target.", - SourceEvidenceId = evidence.Id, - Metadata = BuildMoveToPlayerMetadata(evidence, metadata), - Cleared = IsMovementVerified(evidence) - }; - obligations.Add(obligation); - return obligations; - } - - if (evidence.ToolName.Equals("mcc_container_open_at", StringComparison.OrdinalIgnoreCase)) - { - obligations.Add(new MccVerificationObligation - { - Id = runState.NextObligationId(), - ToolName = evidence.ToolName, - Kind = "container", - Description = "Verify that the target container is open and active.", - SourceEvidenceId = evidence.Id, - Metadata = null, - Cleared = IsContainerOpenVerified(evidence) - }); - return obligations; - } - - if (evidence.ToolName is "mcc_container_deposit_item" or "mcc_container_withdraw_item" or "mcc_inventory_drop_item") - { - obligations.Add(new MccVerificationObligation - { - Id = runState.NextObligationId(), - ToolName = evidence.ToolName, - Kind = "inventory", - Description = "Verify the requested inventory delta.", - SourceEvidenceId = evidence.Id, - Metadata = evidence.Data, - Cleared = IsInventoryVerified(evidence) - }); - return obligations; - } - - if (evidence.ToolName.Equals("mcc_items_pickup", StringComparison.OrdinalIgnoreCase)) - { - obligations.Add(new MccVerificationObligation - { - Id = runState.NextObligationId(), - ToolName = evidence.ToolName, - Kind = "pickup", - Description = "Verify that the requested dropped items were picked up.", - SourceEvidenceId = evidence.Id, - Metadata = evidence.Data, - Cleared = IsPickupVerified(evidence) - }); - return obligations; - } - - if (evidence.ToolName.Equals("mcc_dig_block", StringComparison.OrdinalIgnoreCase)) - { - obligations.Add(new MccVerificationObligation - { - Id = runState.NextObligationId(), - ToolName = evidence.ToolName, - Kind = "block_change", - Description = "Verify that the target block changed state after digging.", - SourceEvidenceId = evidence.Id, - Metadata = evidence.Data, - Cleared = IsDigVerified(evidence) - }); - } - - return obligations; - } - - private List TryClearObligationsFromEvidence(MccRunState runState, MccEvidenceRecord evidence) - { - List cleared = []; - foreach (MccVerificationObligation obligation in runState.OpenObligations) - { - if (obligation.Cleared) - continue; - - if (obligation.Kind == "movement" && TryClearMovementObligation(obligation, evidence)) - { - obligation.Cleared = true; - obligation.ClearedByEvidenceId = evidence.Id; - cleared.Add(obligation); - continue; - } - - if (obligation.Kind == "block_change" && TryClearDigObligation(obligation, evidence)) - { - obligation.Cleared = true; - obligation.ClearedByEvidenceId = evidence.Id; - cleared.Add(obligation); - } - } - - return cleared; - } - - private static bool TryClearMovementObligation(MccVerificationObligation obligation, MccEvidenceRecord evidence) - { - if (evidence.ToolName.Equals("mcc_player_state", StringComparison.OrdinalIgnoreCase) - && evidence.Data is JsonElement data - && data.TryGetProperty("location", out JsonElement location) - && obligation.Metadata is JsonElement metadata) - { - if (obligation.ToolName.Equals("mcc_move_to", StringComparison.OrdinalIgnoreCase) - && metadata.TryGetProperty("x", out JsonElement targetX) - && metadata.TryGetProperty("y", out JsonElement targetY) - && metadata.TryGetProperty("z", out JsonElement targetZ)) - { - double tolerance = metadata.TryGetProperty("tolerance", out JsonElement toleranceElement) && toleranceElement.TryGetDouble(out double tol) ? tol : 1.5; - return TryReadDouble(location, "x", out double x) - && TryReadDouble(location, "y", out double y) - && TryReadDouble(location, "z", out double z) - && Distance(x, y, z, targetX.GetDouble(), targetY.GetDouble(), targetZ.GetDouble()) <= tolerance; - } - } - - if (evidence.ToolName.Equals("mcc_player_locate", StringComparison.OrdinalIgnoreCase) - && obligation.ToolName.Equals("mcc_move_to_player", StringComparison.OrdinalIgnoreCase) - && evidence.Data is JsonElement playerData - && obligation.Metadata is JsonElement playerMetadata) - { - string? expectedName = playerMetadata.TryGetProperty("playerName", out JsonElement nameElement) ? nameElement.GetString() : null; - string? matchedName = playerData.TryGetProperty("matchedName", out JsonElement matchedNameElement) ? matchedNameElement.GetString() : null; - if (!string.IsNullOrWhiteSpace(expectedName) && !string.Equals(expectedName, matchedName, StringComparison.OrdinalIgnoreCase)) - return false; - - if (TryReadDouble(playerData, "distance", out double distance)) - { - double tolerance = playerMetadata.TryGetProperty("tolerance", out JsonElement toleranceElement) && toleranceElement.TryGetDouble(out double tol) ? tol : 2.0; - return distance <= tolerance; - } - } - - return false; - } - - private static bool TryClearDigObligation(MccVerificationObligation obligation, MccEvidenceRecord evidence) - { - if (!evidence.ToolName.Equals("mcc_world_block_at", StringComparison.OrdinalIgnoreCase) - || evidence.Data is not JsonElement data - || obligation.Metadata is not JsonElement metadata) - { - return false; - } - - if (!metadata.TryGetProperty("target", out JsonElement target) - || !TryReadDouble(target, "x", out double x) - || !TryReadDouble(target, "y", out double y) - || !TryReadDouble(target, "z", out double z)) - { - return false; - } - - return TryReadInt(data, "x", out int blockX) - && TryReadInt(data, "y", out int blockY) - && TryReadInt(data, "z", out int blockZ) - && Math.Abs(blockX - x) < 0.5 - && Math.Abs(blockY - y) < 0.5 - && Math.Abs(blockZ - z) < 0.5 - && data.TryGetProperty("block", out JsonElement block) - && block.TryGetProperty("material", out JsonElement material) - && !string.Equals(material.GetString(), "Air", StringComparison.OrdinalIgnoreCase); - } - - private static bool IsMovementVerified(MccEvidenceRecord evidence) - { - if (evidence.Data is not JsonElement data) - return false; - - if (TryReadBool(data, "arrived", out bool arrived) && arrived) - return true; - - if (TryReadDouble(data, "finalDistance", out double finalDistance)) - { - double tolerance = TryReadDouble(data, "tolerance", out double tol) ? tol : 1.5; - return finalDistance <= tolerance; - } - - return false; - } - - private static bool IsContainerOpenVerified(MccEvidenceRecord evidence) - { - return evidence.Data is JsonElement data - && TryReadBool(data, "opened", out bool opened) - && opened; - } - - private static bool IsInventoryVerified(MccEvidenceRecord evidence) - { - if (evidence.Data is not JsonElement data) - return false; - - if (TryReadInt(data, "requestedCount", out int requestedCount) - && TryReadInt(data, "movedCount", out int movedCount)) - { - return movedCount == requestedCount; - } - - if (TryReadInt(data, "requestedCount", out requestedCount) - && TryReadInt(data, "droppedCount", out int droppedCount)) - { - return droppedCount == requestedCount; - } - - return evidence.Success; - } - - private static bool IsPickupVerified(MccEvidenceRecord evidence) - { - if (evidence.Data is not JsonElement data) - return false; - - return (TryReadInt(data, "successfulPickups", out int successfulPickups) && successfulPickups > 0) - || (TryReadInt(data, "collectedCount", out int collectedCount) && collectedCount > 0); - } - - private static bool IsDigVerified(MccEvidenceRecord evidence) - { - if (evidence.Data is not JsonElement data) - return false; - - return (TryReadBool(data, "destroyed", out bool destroyed) && destroyed) - || (TryReadBool(data, "changed", out bool changed) && changed); - } - - private static JsonElement? BuildMoveMetadata(MccEvidenceRecord evidence, JsonElement arguments) - { - if (evidence.Data is not JsonElement data) - return null; - - double x = TryReadDoubleFromArguments(arguments, "x", out double targetX) - ? targetX - : data.TryGetProperty("target", out JsonElement target) && TryReadDouble(target, "x", out double fromDataX) ? fromDataX : 0; - double y = TryReadDoubleFromArguments(arguments, "y", out double targetY) - ? targetY - : data.TryGetProperty("target", out target) && TryReadDouble(target, "y", out double fromDataY) ? fromDataY : 0; - double z = TryReadDoubleFromArguments(arguments, "z", out double targetZ) - ? targetZ - : data.TryGetProperty("target", out target) && TryReadDouble(target, "z", out double fromDataZ) ? fromDataZ : 0; - double tolerance = TryReadDouble(data, "tolerance", out double tol) ? tol : 1.5; - - return JsonSerializer.SerializeToElement(new - { - x, - y, - z, - tolerance - }); - } - - private static JsonElement? BuildMoveToPlayerMetadata(MccEvidenceRecord evidence, JsonElement arguments) - { - string? playerName = arguments.TryGetProperty("playerName", out JsonElement property) ? property.GetString() : null; - double tolerance = evidence.Data is JsonElement data && TryReadDouble(data, "tolerance", out double tol) ? tol : 2.0; - return JsonSerializer.SerializeToElement(new - { - playerName, - tolerance - }); - } - - private static JsonElement ParseArgumentsToJson(string argumentsJson) - { - try - { - using JsonDocument document = JsonDocument.Parse(string.IsNullOrWhiteSpace(argumentsJson) ? "{}" : argumentsJson); - return document.RootElement.Clone(); - } - catch - { - using JsonDocument document = JsonDocument.Parse("{}"); - return document.RootElement.Clone(); - } - } - - private static bool TryReadBool(JsonElement element, string propertyName, out bool value) - { - value = false; - return element.TryGetProperty(propertyName, out JsonElement property) - && property.ValueKind is JsonValueKind.True or JsonValueKind.False - && ((value = property.GetBoolean()) || !value || true); - } - - private static bool TryReadInt(JsonElement element, string propertyName, out int value) - { - value = 0; - return element.TryGetProperty(propertyName, out JsonElement property) && property.TryGetInt32(out value); - } - - private static bool TryReadDouble(JsonElement element, string propertyName, out double value) - { - value = 0; - return element.TryGetProperty(propertyName, out JsonElement property) && property.TryGetDouble(out value); - } - - private static bool TryReadDoubleFromArguments(JsonElement element, string propertyName, out double value) - { - value = 0; - if (!element.TryGetProperty(propertyName, out JsonElement property)) - return false; - - return property.ValueKind == JsonValueKind.Number - ? property.TryGetDouble(out value) - : property.ValueKind == JsonValueKind.String && double.TryParse(property.GetString(), out value); - } - - private static double Distance(double x1, double y1, double z1, double x2, double y2, double z2) - { - double dx = x1 - x2; - double dy = y1 - y2; - double dz = z1 - z2; - return Math.Sqrt(dx * dx + dy * dy + dz * dz); - } - - private static string Truncate(string text, int maxLength) - { - return string.IsNullOrEmpty(text) || text.Length <= maxLength ? text : text[..maxLength] + "..."; - } - - private static SseItem CreateEvent(string runId, ref long sequence, string kind, T data) - { - sequence++; - return new SseItem( - new MccStreamEnvelope(runId, sequence, kind, data!), - kind) - { - EventId = sequence.ToString(CultureInfo.InvariantCulture) - }; - } -} diff --git a/DebugTools/MccMcpWebPlayground/Harness/MccContextCompressor.cs b/DebugTools/MccMcpWebPlayground/Harness/MccContextCompressor.cs deleted file mode 100644 index 1d131bda2c..0000000000 --- a/DebugTools/MccMcpWebPlayground/Harness/MccContextCompressor.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace DebugTools.MccMcpWebPlayground.Harness; - -public sealed class MccContextCompressor -{ - public void CompactIfNeeded(MccRunState runState) - { - if (runState.Evidence.Count <= 6) - return; - - IReadOnlyList olderEvidence = runState.Evidence - .Take(Math.Max(0, runState.Evidence.Count - 6)) - .ToArray(); - - if (olderEvidence.Count == 0) - return; - - runState.CompactionSummary = string.Join('\n', olderEvidence - .TakeLast(8) - .Select(record => $"- {record.Id} {record.ToolName}: {record.Summary}")); - } -} diff --git a/DebugTools/MccMcpWebPlayground/Harness/MccFinalizer.cs b/DebugTools/MccMcpWebPlayground/Harness/MccFinalizer.cs deleted file mode 100644 index 88978bc6f6..0000000000 --- a/DebugTools/MccMcpWebPlayground/Harness/MccFinalizer.cs +++ /dev/null @@ -1,221 +0,0 @@ -using System.Text.Json; -using System.Text.Json.Nodes; -using DebugTools.MccMcpWebPlayground.Contracts; - -namespace DebugTools.MccMcpWebPlayground.Harness; - -public sealed class MccFinalizer -{ - private static readonly string[] AllowedStatuses = ["completed", "partial", "blocked", "clarification_needed", "failed"]; - - public object BuildSubmitToolSchema() - { - return new Dictionary - { - ["type"] = "function", - ["function"] = new Dictionary - { - ["name"] = "mcc_submit_final", - ["description"] = "Submit the final result for this MCC run. Use completed only when no required verification obligations remain open.", - ["parameters"] = new JsonObject - { - ["type"] = "object", - ["additionalProperties"] = false, - ["properties"] = new JsonObject - { - ["status"] = new JsonObject - { - ["type"] = "string", - ["enum"] = new JsonArray(AllowedStatuses.Select(status => JsonValue.Create(status)).ToArray()) - }, - ["headline"] = new JsonObject { ["type"] = "string" }, - ["answerMarkdown"] = new JsonObject { ["type"] = "string" }, - ["verifiedFacts"] = new JsonObject - { - ["type"] = "array", - ["items"] = new JsonObject { ["type"] = "string" } - }, - ["openIssues"] = new JsonObject - { - ["type"] = "array", - ["items"] = new JsonObject { ["type"] = "string" } - }, - ["evidenceIds"] = new JsonObject - { - ["type"] = "array", - ["items"] = new JsonObject { ["type"] = "string" } - }, - ["nextAction"] = new JsonObject - { - ["type"] = new JsonArray("string", "null") - } - }, - ["required"] = new JsonArray("status", "headline", "answerMarkdown", "verifiedFacts", "openIssues", "evidenceIds", "nextAction") - } - } - }; - } - - public MccFinalizationValidation Validate(MccRunState runState, string argumentsJson) - { - try - { - using JsonDocument document = JsonDocument.Parse(string.IsNullOrWhiteSpace(argumentsJson) ? "{}" : argumentsJson); - JsonElement root = document.RootElement; - MccSubmitFinalArgs submission = new( - Status: ReadRequiredString(root, "status"), - Headline: ReadRequiredString(root, "headline"), - AnswerMarkdown: ReadRequiredString(root, "answerMarkdown"), - VerifiedFacts: ReadStringArray(root, "verifiedFacts"), - OpenIssues: ReadStringArray(root, "openIssues"), - EvidenceIds: ReadStringArray(root, "evidenceIds"), - NextAction: ReadNullableString(root, "nextAction")); - - string normalizedStatus = submission.Status.Trim().ToLowerInvariant(); - if (!AllowedStatuses.Contains(normalizedStatus, StringComparer.Ordinal)) - return MccFinalizationValidation.Reject("Invalid final status."); - - if (string.IsNullOrWhiteSpace(submission.Headline) || string.IsNullOrWhiteSpace(submission.AnswerMarkdown)) - return MccFinalizationValidation.Reject("headline and answerMarkdown are required."); - - Dictionary evidenceById = runState.Evidence.ToDictionary(record => record.Id, StringComparer.OrdinalIgnoreCase); - Dictionary evidenceAliasByCallId = new(StringComparer.OrdinalIgnoreCase); - foreach (MccToolExecutionRecord execution in runState.ToolExecutions) - { - evidenceAliasByCallId[execution.CallId] = execution.Evidence.Id; - - int suffixSeparator = execution.CallId.LastIndexOf('_'); - if (suffixSeparator >= 0 && suffixSeparator < execution.CallId.Length - 1) - evidenceAliasByCallId[execution.CallId[(suffixSeparator + 1)..]] = execution.Evidence.Id; - } - - List normalizedEvidenceIds = []; - foreach (string evidenceId in submission.EvidenceIds) - { - string normalizedEvidenceId = evidenceAliasByCallId.TryGetValue(evidenceId, out string? mappedEvidenceId) - ? mappedEvidenceId - : evidenceId; - - if (!evidenceById.ContainsKey(normalizedEvidenceId)) - return MccFinalizationValidation.Reject($"Unknown evidence id '{evidenceId}'."); - - if (!normalizedEvidenceIds.Contains(normalizedEvidenceId, StringComparer.OrdinalIgnoreCase)) - normalizedEvidenceIds.Add(normalizedEvidenceId); - } - - if (normalizedStatus == "completed" && runState.OpenObligations.Count > 0) - return MccFinalizationValidation.Reject("completed is invalid while verification obligations remain open."); - - if (!AreVerifiedFactsGrounded(submission.VerifiedFacts, normalizedEvidenceIds, evidenceById)) - return MccFinalizationValidation.Reject("verifiedFacts must be grounded in the referenced evidence."); - - return MccFinalizationValidation.Accept(new MccFinalPayload( - normalizedStatus, - submission.Headline.Trim(), - submission.AnswerMarkdown.Trim(), - submission.VerifiedFacts, - submission.OpenIssues, - normalizedEvidenceIds, - string.IsNullOrWhiteSpace(submission.NextAction) ? null : submission.NextAction.Trim())); - } - catch (Exception ex) - { - return MccFinalizationValidation.Reject($"Invalid mcc_submit_final payload: {ex.Message}"); - } - } - - public MccFinalPayload BuildHardStopResult(MccRunState runState, MccWebHarnessOptions options) - { - IReadOnlyList openIssues = runState.OpenObligations.Count > 0 - ? runState.OpenObligations.Select(obligation => obligation.Description).ToArray() - : ["The harness reached its execution budget before the run was explicitly finalized."]; - - IReadOnlyList evidenceIds = runState.Evidence.TakeLast(4).Select(record => record.Id).ToArray(); - IReadOnlyList verifiedFacts = runState.Evidence - .TakeLast(4) - .Where(record => record.Success) - .Select(record => record.Summary) - .ToArray(); - - return new MccFinalPayload( - Status: runState.OpenObligations.Count > 0 ? "partial" : "blocked", - Headline: "Run stopped before explicit completion", - AnswerMarkdown: "I could not finish the request within the current harness budget. I am returning the strongest verified state captured so far.", - VerifiedFacts: verifiedFacts, - OpenIssues: openIssues, - EvidenceIds: evidenceIds, - NextAction: "Retry with a fresh run if you want me to continue from the latest verified state."); - } - - private static bool AreVerifiedFactsGrounded( - IReadOnlyList verifiedFacts, - IReadOnlyList evidenceIds, - IReadOnlyDictionary evidenceById) - { - if (verifiedFacts.Count == 0) - return true; - - if (evidenceIds.Count == 0) - return false; - - string evidenceCorpus = string.Join(' ', evidenceIds - .Where(evidenceById.ContainsKey) - .Select(id => evidenceById[id].Summary)) - .ToLowerInvariant(); - - foreach (string fact in verifiedFacts) - { - HashSet factTokens = fact.Split(' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) - .Select(token => token.Trim().Trim(',', '.', ':', ';', '!', '?', '"', '\'')) - .Where(token => token.Length >= 4) - .Select(token => token.ToLowerInvariant()) - .ToHashSet(StringComparer.Ordinal); - - if (factTokens.Count == 0) - continue; - - int matches = factTokens.Count(token => evidenceCorpus.Contains(token, StringComparison.Ordinal)); - if (matches < Math.Min(2, factTokens.Count)) - return false; - } - - return true; - } - - private static string ReadRequiredString(JsonElement root, string propertyName) - { - string? value = ReadNullableString(root, propertyName); - if (string.IsNullOrWhiteSpace(value)) - throw new InvalidOperationException($"{propertyName} is required."); - - return value.Trim(); - } - - private static string? ReadNullableString(JsonElement root, string propertyName) - { - if (!root.TryGetProperty(propertyName, out JsonElement property)) - return null; - - return property.ValueKind == JsonValueKind.Null ? null : property.GetString(); - } - - private static string[] ReadStringArray(JsonElement root, string propertyName) - { - if (!root.TryGetProperty(propertyName, out JsonElement property) || property.ValueKind != JsonValueKind.Array) - return []; - - return property.EnumerateArray() - .Where(item => item.ValueKind == JsonValueKind.String) - .Select(item => item.GetString()) - .Where(item => !string.IsNullOrWhiteSpace(item)) - .Cast() - .ToArray(); - } -} - -public sealed record MccFinalizationValidation(bool Accepted, string? ErrorText, MccFinalPayload? Payload) -{ - public static MccFinalizationValidation Accept(MccFinalPayload payload) => new(true, null, payload); - - public static MccFinalizationValidation Reject(string errorText) => new(false, errorText, null); -} diff --git a/DebugTools/MccMcpWebPlayground/Harness/MccGuidanceSource.cs b/DebugTools/MccMcpWebPlayground/Harness/MccGuidanceSource.cs deleted file mode 100644 index a302e3f0da..0000000000 --- a/DebugTools/MccMcpWebPlayground/Harness/MccGuidanceSource.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System.Text.Json; -using DebugTools.MccMcpWebPlayground.Contracts; -using DebugTools.MccMcpWebPlayground.Infrastructure.Mcp; -using ModelContextProtocol.Client; -using ModelContextProtocol.Protocol; - -namespace DebugTools.MccMcpWebPlayground.Harness; - -public sealed class MccGuidanceSource -{ - public const string SourceToolName = "mcc_agent_guidance"; - public const string CanonicalPromptName = "mcc_operator_guide"; - - public async Task LoadAsync(McpClient client, CancellationToken cancellationToken) - { - CallToolResult result = await client.CallToolAsync(SourceToolName, new Dictionary(), cancellationToken: cancellationToken); - MccNormalizedToolResult normalized = MccMcpJson.Normalize(result); - JsonElement data = normalized.Data ?? throw new InvalidOperationException("mcc_agent_guidance did not return data."); - - string[] bestPractices = ReadStringArray(data, "bestPractices"); - string[] exampleTitles = data.TryGetProperty("exampleScenarios", out JsonElement examples) - && examples.ValueKind == JsonValueKind.Array - ? examples.EnumerateArray() - .Select(example => example.TryGetProperty("title", out JsonElement title) ? title.GetString() : null) - .Where(title => !string.IsNullOrWhiteSpace(title)) - .Cast() - .ToArray() - : []; - - MccCapabilityStatus capabilityStatus = data.TryGetProperty("capabilityStatus", out JsonElement capabilityJson) - ? JsonSerializer.Deserialize(capabilityJson.GetRawText()) ?? new MccCapabilityStatus(false, false, false, false, false) - : new MccCapabilityStatus(false, false, false, false, false); - - return new MccGuidanceBundle( - SourceToolName, - CanonicalPromptName, - SkillName: ReadString(data, "skillName") ?? "mcc-mcp-operator", - GuidanceVersion: ReadString(data, "guidanceVersion") ?? "unknown", - SystemPrompt: ReadString(data, "systemPrompt") ?? throw new InvalidOperationException("mcc_agent_guidance did not return systemPrompt."), - BestPractices: bestPractices, - ExampleScenarioTitles: exampleTitles, - CapabilityStatus: capabilityStatus); - } - - private static string? ReadString(JsonElement element, string propertyName) - { - return element.TryGetProperty(propertyName, out JsonElement property) && property.ValueKind == JsonValueKind.String - ? property.GetString() - : null; - } - - private static string[] ReadStringArray(JsonElement element, string propertyName) - { - return element.TryGetProperty(propertyName, out JsonElement property) && property.ValueKind == JsonValueKind.Array - ? property.EnumerateArray() - .Where(item => item.ValueKind == JsonValueKind.String) - .Select(item => item.GetString()) - .Where(item => !string.IsNullOrWhiteSpace(item)) - .Cast() - .ToArray() - : []; - } -} diff --git a/DebugTools/MccMcpWebPlayground/Harness/MccPromptComposer.cs b/DebugTools/MccMcpWebPlayground/Harness/MccPromptComposer.cs deleted file mode 100644 index b9cb465015..0000000000 --- a/DebugTools/MccMcpWebPlayground/Harness/MccPromptComposer.cs +++ /dev/null @@ -1,86 +0,0 @@ -namespace DebugTools.MccMcpWebPlayground.Harness; - -public sealed class MccPromptComposer -{ - private const string HarnessContract = """ -You are operating Minecraft Console Client through MCC MCP tools. - -Rules: -- Use tool results and the run-state summary as the source of truth. -- Execute tools sequentially. -- End the run only with mcc_submit_final. -- status=completed is valid only when no required verification obligations remain open. -- If the task is blocked or partial, say exactly what is verified and what remains unverified. -- Do not repeat the same failing stateful action with the same arguments. -- mcc_quit_client requires explicit user intent. -- Prefer structured high-level tools. Avoid escape hatches unless they are explicitly exposed and necessary. -"""; - - public List Compose(MccRunState runState) - { - List messages = - [ - BuildSystemMessage(HarnessContract), - BuildSystemMessage(runState.Guidance.SystemPrompt), - BuildSystemMessage(BuildStateSummary(runState)), - .. runState.BaseConversationMessages - ]; - - if (!string.IsNullOrWhiteSpace(runState.CompactionSummary)) - { - messages.Add(BuildSystemMessage($""" -Older verified evidence summary -{runState.CompactionSummary} -""")); - } - - foreach (object message in runState.ToolConversationMessages.TakeLast(12)) - messages.Add(message); - - return messages; - } - - private static Dictionary BuildSystemMessage(string text) - { - return new Dictionary - { - ["role"] = "system", - ["content"] = text - }; - } - - private static string BuildStateSummary(MccRunState runState) - { - string evidence = runState.Evidence.Count == 0 - ? "- none yet" - : string.Join('\n', runState.Evidence.TakeLast(6).Select(record => - $"- {record.Id} {record.ToolName}: {record.Summary}")); - - string obligations = runState.OpenObligations.Count == 0 - ? "- none" - : string.Join('\n', runState.OpenObligations.Select(obligation => - $"- {obligation.Id} {obligation.ToolName}/{obligation.Kind}: {obligation.Description}")); - - string bestPractices = runState.Guidance.BestPractices.Length == 0 - ? "- use verified MCC state before claiming success" - : string.Join('\n', runState.Guidance.BestPractices.Take(4).Select(item => $"- {item}")); - - return $""" -Current run state -- turnCount: {runState.TurnCount} -- toolCallCount: {runState.ToolCallCount} -- directAnswerAttempts: {runState.DirectAnswerAttempts} -- routedModel: {runState.RoutedModel ?? runState.ConfiguredModel} -- routedProvider: {runState.RoutedProvider ?? "unknown"} - -Outstanding verification -{obligations} - -Recent evidence -{evidence} - -Guidance highlights -{bestPractices} -"""; - } -} diff --git a/DebugTools/MccMcpWebPlayground/Harness/MccRunState.cs b/DebugTools/MccMcpWebPlayground/Harness/MccRunState.cs deleted file mode 100644 index f226c8b3a3..0000000000 --- a/DebugTools/MccMcpWebPlayground/Harness/MccRunState.cs +++ /dev/null @@ -1,103 +0,0 @@ -using System.Text.Json; -using DebugTools.MccMcpWebPlayground.Contracts; - -namespace DebugTools.MccMcpWebPlayground.Harness; - -public sealed class MccRunState -{ - private int evidenceCounter; - private int obligationCounter; - - public required string RunId { get; init; } - public required string UserRequest { get; init; } - public required List BaseConversationMessages { get; init; } - public required string ConfiguredModel { get; init; } - public required MccGuidanceBundle Guidance { get; init; } - public DateTimeOffset StartedAtUtc { get; init; } = DateTimeOffset.UtcNow; - - public List ToolConversationMessages { get; } = []; - public List Evidence { get; } = []; - public List ToolExecutions { get; } = []; - public List VerificationObligations { get; } = []; - public string? CompactionSummary { get; set; } - public string? RoutedModel { get; set; } - public string? RoutedProvider { get; set; } - public int TurnCount { get; set; } - public int ToolCallCount { get; set; } - public int DirectAnswerAttempts { get; set; } - - public string NextEvidenceId() => $"e{++evidenceCounter:0000}"; - - public string NextObligationId() => $"v{++obligationCounter:0000}"; - - public bool IsSoftFinish(MccWebHarnessOptions options, DateTimeOffset nowUtc) - { - TimeSpan elapsed = nowUtc - StartedAtUtc; - return (options.MaxTurns - TurnCount) <= options.SoftFinishRemainingTurns - || (options.MaxToolCalls - ToolCallCount) <= options.SoftFinishRemainingToolCalls - || (options.MaxWallClockSeconds - (int)elapsed.TotalSeconds) <= options.SoftFinishRemainingSeconds; - } - - public bool IsHardStop(MccWebHarnessOptions options, DateTimeOffset nowUtc) - { - TimeSpan elapsed = nowUtc - StartedAtUtc; - return TurnCount >= options.MaxTurns - || ToolCallCount >= options.MaxToolCalls - || elapsed.TotalSeconds >= options.MaxWallClockSeconds; - } - - public IReadOnlyList OpenObligations => - VerificationObligations.Where(obligation => !obligation.Cleared).ToArray(); -} - -public sealed record MccGuidanceBundle( - string SourceToolName, - string CanonicalPromptName, - string SkillName, - string GuidanceVersion, - string SystemPrompt, - string[] BestPractices, - string[] ExampleScenarioTitles, - MccCapabilityStatus CapabilityStatus); - -public sealed class MccEvidenceRecord -{ - public required string Id { get; init; } - public required string ToolName { get; init; } - public required string Summary { get; init; } - public required string RawText { get; init; } - public required bool IsError { get; init; } - public required bool Success { get; init; } - public string? ErrorCode { get; init; } - public JsonElement? Root { get; init; } - public JsonElement? Data { get; init; } -} - -public sealed class MccToolExecutionRecord -{ - public required string CallId { get; init; } - public required string ToolName { get; init; } - public required string ArgumentsJson { get; init; } - public required MccEvidenceRecord Evidence { get; init; } -} - -public sealed class MccVerificationObligation -{ - public required string Id { get; init; } - public required string ToolName { get; init; } - public required string Kind { get; init; } - public required string Description { get; init; } - public required string SourceEvidenceId { get; init; } - public JsonElement? Metadata { get; init; } - public bool Cleared { get; set; } - public string? ClearedByEvidenceId { get; set; } -} - -public sealed record MccNormalizedToolResult( - string Text, - bool IsError, - bool Success, - string? ErrorCode, - string? Message, - JsonElement? Root, - JsonElement? Data); diff --git a/DebugTools/MccMcpWebPlayground/Harness/MccToolPolicy.cs b/DebugTools/MccMcpWebPlayground/Harness/MccToolPolicy.cs deleted file mode 100644 index e8a9bd772b..0000000000 --- a/DebugTools/MccMcpWebPlayground/Harness/MccToolPolicy.cs +++ /dev/null @@ -1,133 +0,0 @@ -using System.Collections.Frozen; -using System.Text.Json.Nodes; -using ModelContextProtocol.Client; - -namespace DebugTools.MccMcpWebPlayground.Harness; - -public enum MccToolRisk -{ - ReadOnly, - Stateful, - Sensitive, - EscapeHatch -} - -public sealed record MccToolProfile( - string Name, - MccToolRisk Risk, - bool VisibleByDefault, - bool RequiresExplicitUserIntent); - -public sealed record MccToolCatalogEntry(McpClientTool Tool, MccToolProfile Profile); - -public sealed class MccToolCatalog -{ - public required Dictionary ToolsByName { get; init; } - public required IReadOnlyList ModelVisibleTools { get; init; } -} - -public static class MccToolPolicy -{ - private static readonly FrozenDictionary Profiles = - new Dictionary(StringComparer.OrdinalIgnoreCase) - { - ["mcc_agent_guidance"] = new("mcc_agent_guidance", MccToolRisk.ReadOnly, false, false), - ["mcc_inventory_window_action"] = new("mcc_inventory_window_action", MccToolRisk.EscapeHatch, false, false), - ["mcc_run_internal_command"] = new("mcc_run_internal_command", MccToolRisk.EscapeHatch, false, false), - ["mcc_quit_client"] = new("mcc_quit_client", MccToolRisk.Sensitive, true, true) - }.ToFrozenDictionary(StringComparer.OrdinalIgnoreCase); - - public static MccToolProfile GetProfile(string toolName) - { - return Profiles.TryGetValue(toolName, out MccToolProfile? profile) - ? profile - : new MccToolProfile(toolName, MccToolRisk.Stateful, true, false); - } - - public static MccToolCatalog BuildCatalog(IList tools, MccWebHarnessOptions options, object submitFinalTool) - { - Dictionary toolsByName = tools.ToDictionary( - tool => tool.Name, - tool => new MccToolCatalogEntry(tool, GetProfile(tool.Name)), - StringComparer.OrdinalIgnoreCase); - - List visibleTools = []; - foreach (MccToolCatalogEntry entry in toolsByName.Values.OrderBy(entry => entry.Tool.Name, StringComparer.OrdinalIgnoreCase)) - { - if (!IsVisible(entry.Profile, options)) - continue; - - visibleTools.Add(ToOpenRouterTool(entry.Tool, entry.Profile)); - } - - visibleTools.Add(submitFinalTool); - - return new MccToolCatalog - { - ToolsByName = toolsByName, - ModelVisibleTools = visibleTools - }; - } - - public static bool RequiresExplicitUserIntent(string toolName) - { - return GetProfile(toolName).RequiresExplicitUserIntent; - } - - public static bool HasExplicitUserIntent(string userRequest, string toolName) - { - if (!RequiresExplicitUserIntent(toolName)) - return true; - - string request = userRequest.Trim().ToLowerInvariant(); - return toolName.Equals("mcc_quit_client", StringComparison.OrdinalIgnoreCase) - && (request.Contains("quit mcc", StringComparison.Ordinal) - || request.Contains("close mcc", StringComparison.Ordinal) - || request.Contains("stop mcc", StringComparison.Ordinal) - || request.Contains("exit mcc", StringComparison.Ordinal) - || request.Contains("quit the client", StringComparison.Ordinal) - || request.Contains("stop the client", StringComparison.Ordinal)); - } - - private static bool IsVisible(MccToolProfile profile, MccWebHarnessOptions options) - { - if (!profile.VisibleByDefault) - { - if (profile.Name.Equals("mcc_inventory_window_action", StringComparison.OrdinalIgnoreCase)) - return options.ExposeInventoryWindowAction; - - if (profile.Name.Equals("mcc_run_internal_command", StringComparison.OrdinalIgnoreCase)) - return options.ExposeInternalCommandTool; - - return false; - } - - return true; - } - - private static object ToOpenRouterTool(McpClientTool tool, MccToolProfile profile) - { - JsonNode parameters = JsonNode.Parse(tool.JsonSchema.GetRawText()) ?? new JsonObject - { - ["type"] = "object", - ["properties"] = new JsonObject() - }; - - string description = tool.Description ?? string.Empty; - if (profile.Risk == MccToolRisk.Sensitive) - description = $"{description} Requires explicit user intent."; - else if (profile.Risk == MccToolRisk.EscapeHatch) - description = $"{description} Advanced escape hatch; prefer higher-level tools first."; - - return new Dictionary - { - ["type"] = "function", - ["function"] = new Dictionary - { - ["name"] = tool.Name, - ["description"] = description, - ["parameters"] = parameters - } - }; - } -} diff --git a/DebugTools/MccMcpWebPlayground/Harness/MccWebHarnessOptions.cs b/DebugTools/MccMcpWebPlayground/Harness/MccWebHarnessOptions.cs deleted file mode 100644 index 0855c47168..0000000000 --- a/DebugTools/MccMcpWebPlayground/Harness/MccWebHarnessOptions.cs +++ /dev/null @@ -1,58 +0,0 @@ -namespace DebugTools.MccMcpWebPlayground.Harness; - -public sealed class MccWebHarnessOptions -{ - public const string SectionName = "MccWebHarness"; - - public string? Model { get; set; } - public string OpenRouterBaseUrl { get; set; } = "https://openrouter.ai/api/v1"; - public string McpEndpoint { get; set; } = "http://127.0.0.1:33333/mcp"; - public int MaxTurns { get; set; } = 48; - public int MaxToolCalls { get; set; } = 120; - public int MaxWallClockSeconds { get; set; } = 240; - public int SoftFinishRemainingTurns { get; set; } = 3; - public int SoftFinishRemainingToolCalls { get; set; } = 8; - public int SoftFinishRemainingSeconds { get; set; } = 30; - public bool RequireProviderParameters { get; set; } = true; - public bool AllowFallbacks { get; set; } - public bool DisableParallelToolCalls { get; set; } = true; - public bool ExposeInventoryWindowAction { get; set; } - public bool ExposeInternalCommandTool { get; set; } - - public string? ResolveModel() - { - return FirstNonEmpty(Environment.GetEnvironmentVariable("OPENROUTER_MODEL"), Model); - } - - public string ResolveOpenRouterBaseUrl() - { - return FirstNonEmpty(Environment.GetEnvironmentVariable("OPENROUTER_BASE_URL"), OpenRouterBaseUrl) - ?? "https://openrouter.ai/api/v1"; - } - - public string ResolveMcpEndpoint() - { - return FirstNonEmpty(Environment.GetEnvironmentVariable("MCC_MCP_ENDPOINT"), McpEndpoint) - ?? "http://127.0.0.1:33333/mcp"; - } - - public string? ResolveMcpAuthToken() - { - return Environment.GetEnvironmentVariable("MCC_MCP_AUTH_TOKEN"); - } - - public string? ResolveApiKey() - { - return Environment.GetEnvironmentVariable("OPENROUTER_API_KEY"); - } - - public bool HasApiKeyConfigured() - { - return !string.IsNullOrWhiteSpace(ResolveApiKey()); - } - - private static string? FirstNonEmpty(params string?[] candidates) - { - return candidates.FirstOrDefault(candidate => !string.IsNullOrWhiteSpace(candidate))?.Trim(); - } -} diff --git a/DebugTools/MccMcpWebPlayground/Infrastructure/Mcp/MccMcpSessionFactory.cs b/DebugTools/MccMcpWebPlayground/Infrastructure/Mcp/MccMcpSessionFactory.cs deleted file mode 100644 index 8775bb2c1d..0000000000 --- a/DebugTools/MccMcpWebPlayground/Infrastructure/Mcp/MccMcpSessionFactory.cs +++ /dev/null @@ -1,200 +0,0 @@ -using System.Text; -using System.Text.Json; -using System.Reflection; -using DebugTools.MccMcpWebPlayground.Harness; -using Microsoft.Extensions.Options; -using ModelContextProtocol.Client; -using ModelContextProtocol.Protocol; - -namespace DebugTools.MccMcpWebPlayground.Infrastructure.Mcp; - -public sealed class MccMcpSessionFactory -{ - private readonly MccWebHarnessOptions options; - - public MccMcpSessionFactory(IOptions options) - { - this.options = options.Value; - } - - public async Task CreateAsync(CancellationToken cancellationToken) - { - string endpoint = options.ResolveMcpEndpoint(); - string? token = options.ResolveMcpAuthToken(); - - return await McpClient.CreateAsync(new HttpClientTransport(new HttpClientTransportOptions - { - Endpoint = new Uri(endpoint), - TransportMode = HttpTransportMode.AutoDetect, - AdditionalHeaders = string.IsNullOrWhiteSpace(token) - ? null - : new Dictionary - { - ["Authorization"] = $"Bearer {token}" - } - }), cancellationToken: cancellationToken); - } -} - -public static class MccMcpJson -{ - public static MccNormalizedToolResult Normalize(CallToolResult result) - { - JsonElement? structuredRoot = TryReadStructuredContent(result); - string text = ReadToolResultText(result, structuredRoot); - try - { - using JsonDocument document = JsonDocument.Parse(text); - JsonElement parsedRoot = document.RootElement.Clone(); - JsonElement root = ShouldPreferStructuredRoot(parsedRoot, structuredRoot) - ? structuredRoot!.Value - : parsedRoot; - JsonElement? data = root.TryGetProperty("data", out JsonElement dataElement) - ? dataElement.Clone() - : ShouldTreatRootAsData(root) ? root.Clone() : structuredRoot; - bool success = root.TryGetProperty("success", out JsonElement successElement) - ? successElement.ValueKind != JsonValueKind.False - : result.IsError != true; - string? errorCode = root.TryGetProperty("errorCode", out JsonElement errorCodeElement) && errorCodeElement.ValueKind == JsonValueKind.String - ? errorCodeElement.GetString() - : null; - string? message = root.TryGetProperty("message", out JsonElement messageElement) && messageElement.ValueKind == JsonValueKind.String - ? messageElement.GetString() - : null; - bool isError = result.IsError == true || !success || !string.IsNullOrWhiteSpace(errorCode); - - return new MccNormalizedToolResult(text, isError, success, errorCode, message, root, data); - } - catch - { - bool isError = result.IsError == true; - return new MccNormalizedToolResult(text, isError, !isError, null, null, structuredRoot, structuredRoot); - } - } - - private static string ReadToolResultText(CallToolResult result, JsonElement? structuredRoot) - { - if (result.Content is null) - return structuredRoot?.GetRawText() ?? (result.IsError == true ? "{\"success\":false}" : "{\"success\":true}"); - - StringBuilder builder = new(); - foreach (ContentBlock block in result.Content) - { - if (block is TextContentBlock text && !string.IsNullOrWhiteSpace(text.Text)) - { - if (builder.Length > 0) - builder.Append('\n'); - builder.Append(text.Text); - } - } - - return builder.Length > 0 - ? builder.ToString() - : structuredRoot?.GetRawText() - ?? JsonSerializer.Serialize(new { success = result.IsError != true, isError = result.IsError }); - } - - private static JsonElement? TryReadStructuredContent(CallToolResult result) - { - PropertyInfo? property = typeof(CallToolResult).GetProperty("StructuredContent", BindingFlags.Instance | BindingFlags.Public); - if (property?.GetValue(result) is not { } value) - return null; - - return value switch - { - JsonElement json when json.ValueKind != JsonValueKind.Undefined && json.ValueKind != JsonValueKind.Null => json.Clone(), - JsonDocument document => document.RootElement.Clone(), - string text when !string.IsNullOrWhiteSpace(text) => TryParseJson(text), - _ => TrySerializeToJson(value) - }; - } - - private static JsonElement? TrySerializeToJson(object value) - { - try - { - return JsonSerializer.SerializeToElement(value); - } - catch - { - return null; - } - } - - private static JsonElement? TryParseJson(string text) - { - try - { - using JsonDocument document = JsonDocument.Parse(text); - return document.RootElement.Clone(); - } - catch - { - return null; - } - } - - private static bool ShouldPreferStructuredRoot(JsonElement parsedRoot, JsonElement? structuredRoot) - { - if (structuredRoot is null) - return false; - - if (parsedRoot.ValueKind != JsonValueKind.Object) - return true; - - return !parsedRoot.EnumerateObject().Any(property => - !property.NameEquals("success") && - !property.NameEquals("isError")); - } - - private static bool ShouldTreatRootAsData(JsonElement root) - { - if (root.ValueKind != JsonValueKind.Object) - return false; - - return root.EnumerateObject().Any(property => - !property.NameEquals("success") && - !property.NameEquals("isError") && - !property.NameEquals("errorCode") && - !property.NameEquals("message")); - } -} - -public static class MccJsonArguments -{ - public static Dictionary Parse(string rawJson) - { - try - { - using JsonDocument document = JsonDocument.Parse(string.IsNullOrWhiteSpace(rawJson) ? "{}" : rawJson); - if (document.RootElement.ValueKind != JsonValueKind.Object) - return new Dictionary(); - - Dictionary values = new(StringComparer.OrdinalIgnoreCase); - foreach (JsonProperty property in document.RootElement.EnumerateObject()) - values[property.Name] = Convert(property.Value); - return values; - } - catch - { - return new Dictionary(); - } - } - - private static object? Convert(JsonElement element) - { - return element.ValueKind switch - { - JsonValueKind.Null => null, - JsonValueKind.True => true, - JsonValueKind.False => false, - JsonValueKind.Number => element.TryGetInt64(out long i64) - ? i64 - : element.TryGetDouble(out double d) ? d : element.GetRawText(), - JsonValueKind.String => element.GetString(), - JsonValueKind.Array => element.EnumerateArray().Select(Convert).ToArray(), - JsonValueKind.Object => element.EnumerateObject().ToDictionary(property => property.Name, property => Convert(property.Value)), - _ => element.GetRawText() - }; - } -} diff --git a/DebugTools/MccMcpWebPlayground/Infrastructure/OpenRouter/OpenRouterChatClient.cs b/DebugTools/MccMcpWebPlayground/Infrastructure/OpenRouter/OpenRouterChatClient.cs deleted file mode 100644 index 24d9a0805b..0000000000 --- a/DebugTools/MccMcpWebPlayground/Infrastructure/OpenRouter/OpenRouterChatClient.cs +++ /dev/null @@ -1,120 +0,0 @@ -using System.Net.Http.Headers; -using System.Text; -using System.Text.Json; -using DebugTools.MccMcpWebPlayground.Harness; - -namespace DebugTools.MccMcpWebPlayground.Infrastructure.OpenRouter; - -public sealed class OpenRouterChatClient -{ - private readonly IHttpClientFactory httpClientFactory; - - public OpenRouterChatClient(IHttpClientFactory httpClientFactory) - { - this.httpClientFactory = httpClientFactory; - } - - public async Task CreateTurnAsync( - List messages, - IReadOnlyList tools, - MccWebHarnessOptions options, - CancellationToken cancellationToken) - { - string apiKey = options.ResolveApiKey() ?? throw new InvalidOperationException("OPENROUTER_API_KEY is not configured."); - string model = options.ResolveModel() ?? throw new InvalidOperationException("Model is not configured."); - - using HttpClient client = httpClientFactory.CreateClient("openrouter"); - client.BaseAddress = new Uri(options.ResolveOpenRouterBaseUrl().TrimEnd('/') + "/"); - client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey); - client.DefaultRequestHeaders.TryAddWithoutValidation("HTTP-Referer", "https://localhost/mcc-mcp-web-playground"); - client.DefaultRequestHeaders.TryAddWithoutValidation("X-Title", "MCC MCP Web Playground"); - - Dictionary payload = new() - { - ["model"] = model, - ["messages"] = messages, - ["tools"] = tools, - ["tool_choice"] = "auto", - ["provider"] = new Dictionary - { - ["allow_fallbacks"] = options.AllowFallbacks, - ["require_parameters"] = options.RequireProviderParameters - } - }; - - if (ShouldSendParallelToolCallsParameter(model)) - payload["parallel_tool_calls"] = !options.DisableParallelToolCalls; - - using HttpResponseMessage response = await client.PostAsync( - "chat/completions", - new StringContent(JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json"), - cancellationToken); - - string body = await response.Content.ReadAsStringAsync(cancellationToken); - if (!response.IsSuccessStatusCode) - throw new InvalidOperationException($"OpenRouter returned HTTP {(int)response.StatusCode}: {body}"); - - using JsonDocument document = JsonDocument.Parse(body); - if (!document.RootElement.TryGetProperty("choices", out JsonElement choices) - || choices.ValueKind != JsonValueKind.Array - || choices.GetArrayLength() == 0) - { - throw new InvalidOperationException("OpenRouter did not return any choices."); - } - - JsonElement message = choices[0].GetProperty("message"); - string assistantContent = message.TryGetProperty("content", out JsonElement contentElement) - ? contentElement.GetString() ?? string.Empty - : string.Empty; - - List toolCalls = []; - if (message.TryGetProperty("tool_calls", out JsonElement toolCallsElement) && toolCallsElement.ValueKind == JsonValueKind.Array) - { - foreach (JsonElement toolCall in toolCallsElement.EnumerateArray()) - { - if (!toolCall.TryGetProperty("id", out JsonElement idElement) - || !toolCall.TryGetProperty("function", out JsonElement functionElement) - || !functionElement.TryGetProperty("name", out JsonElement nameElement)) - { - continue; - } - - toolCalls.Add(new MccModelToolCall( - CallId: idElement.GetString() ?? Guid.NewGuid().ToString("n"), - Name: nameElement.GetString() ?? string.Empty, - ArgumentsJson: functionElement.TryGetProperty("arguments", out JsonElement argumentsElement) - ? argumentsElement.GetString() ?? "{}" - : "{}")); - } - } - - string modelId = document.RootElement.TryGetProperty("model", out JsonElement modelElement) - ? modelElement.GetString() ?? model - : model; - - string? routedProvider = response.Headers.TryGetValues("x-openrouter-provider", out IEnumerable? providerValues) - ? providerValues.FirstOrDefault() - : null; - - return new MccModelTurn(modelId, routedProvider, assistantContent, toolCalls); - } - - private static bool ShouldSendParallelToolCallsParameter(string model) - { - // Some OpenRouter model families reject tool-enabled requests when the parallel_tool_calls - // parameter is present at all, even if it is explicitly set to false. The harness still - // executes all returned tool calls sequentially, so omitting the transport hint for those - // families preserves the intended runtime behavior while keeping the stricter flag for - // compatible models. - return !model.StartsWith("minimax/", StringComparison.OrdinalIgnoreCase) - && !model.StartsWith("google/gemini-", StringComparison.OrdinalIgnoreCase); - } -} - -public sealed record MccModelTurn( - string ModelId, - string? RoutedProvider, - string AssistantContent, - IReadOnlyList ToolCalls); - -public sealed record MccModelToolCall(string CallId, string Name, string ArgumentsJson); diff --git a/DebugTools/MccMcpWebPlayground/MccMcpWebPlayground.csproj b/DebugTools/MccMcpWebPlayground/MccMcpWebPlayground.csproj deleted file mode 100644 index 24ed1bd516..0000000000 --- a/DebugTools/MccMcpWebPlayground/MccMcpWebPlayground.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - net10.0 - enable - enable - true - - - - - - - diff --git a/DebugTools/MccMcpWebPlayground/Program.cs b/DebugTools/MccMcpWebPlayground/Program.cs deleted file mode 100644 index 17060301be..0000000000 --- a/DebugTools/MccMcpWebPlayground/Program.cs +++ /dev/null @@ -1,40 +0,0 @@ -using DebugTools.MccMcpWebPlayground.Api; -using DebugTools.MccMcpWebPlayground.Harness; -using DebugTools.MccMcpWebPlayground.Infrastructure.Mcp; -using DebugTools.MccMcpWebPlayground.Infrastructure.OpenRouter; -using Microsoft.AspNetCore.Http.Timeouts; - -var builder = WebApplication.CreateBuilder(args); - -builder.Services.AddOptions() - .Bind(builder.Configuration.GetSection(MccWebHarnessOptions.SectionName)); - -builder.Services.AddRequestTimeouts(options => -{ - options.AddPolicy("mcc-stream", new RequestTimeoutPolicy - { - Timeout = TimeSpan.FromMinutes(10) - }); -}); - -builder.Services.AddHttpClient("openrouter", client => -{ - client.Timeout = TimeSpan.FromMinutes(15); -}); - -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); -builder.Services.AddScoped(); - -var app = builder.Build(); - -app.UseRequestTimeouts(); -app.UseDefaultFiles(); -app.UseStaticFiles(); -app.MapMccPlaygroundEndpoints(); - -app.Run(); diff --git a/DebugTools/MccMcpWebPlayground/Properties/launchSettings.json b/DebugTools/MccMcpWebPlayground/Properties/launchSettings.json deleted file mode 100644 index 3701e48f59..0000000000 --- a/DebugTools/MccMcpWebPlayground/Properties/launchSettings.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/launchsettings.json", - "profiles": { - "http": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "applicationUrl": "http://localhost:5295", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "https": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "applicationUrl": "https://localhost:7104;http://localhost:5295", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/DebugTools/MccMcpWebPlayground/appsettings.Development.json b/DebugTools/MccMcpWebPlayground/appsettings.Development.json deleted file mode 100644 index 6cde4d2748..0000000000 --- a/DebugTools/MccMcpWebPlayground/appsettings.Development.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "MccWebHarness": { - "AllowFallbacks": false, - "DisableParallelToolCalls": true, - "ExposeInventoryWindowAction": false, - "ExposeInternalCommandTool": false - } -} diff --git a/DebugTools/MccMcpWebPlayground/appsettings.json b/DebugTools/MccMcpWebPlayground/appsettings.json deleted file mode 100644 index 869684a510..0000000000 --- a/DebugTools/MccMcpWebPlayground/appsettings.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "MccWebHarness": { - "OpenRouterBaseUrl": "https://openrouter.ai/api/v1", - "McpEndpoint": "http://127.0.0.1:33333/mcp", - "MaxTurns": 48, - "MaxToolCalls": 120, - "MaxWallClockSeconds": 240, - "SoftFinishRemainingTurns": 3, - "SoftFinishRemainingToolCalls": 8, - "SoftFinishRemainingSeconds": 30, - "RequireProviderParameters": true, - "AllowFallbacks": false, - "DisableParallelToolCalls": true, - "ExposeInventoryWindowAction": false, - "ExposeInternalCommandTool": false - }, - "AllowedHosts": "*" -} diff --git a/DebugTools/MccMcpWebPlayground/wwwroot/app.js b/DebugTools/MccMcpWebPlayground/wwwroot/app.js deleted file mode 100644 index 14cd9c0e06..0000000000 --- a/DebugTools/MccMcpWebPlayground/wwwroot/app.js +++ /dev/null @@ -1,310 +0,0 @@ -const html = document.documentElement; -const statusEl = document.getElementById("status"); -const sendBtn = document.getElementById("send"); -const stopBtn = document.getElementById("stop"); -const clearBtn = document.getElementById("clear"); -const clearChatBtn = document.getElementById("clear-chat-btn"); -const clearToolsBtn = document.getElementById("clear-tools-btn"); -const promptEl = document.getElementById("prompt"); -const chatEl = document.getElementById("chat"); -const toolsEl = document.getElementById("tools"); -const emptyStateEl = document.getElementById("empty-state"); -const toolsEmptyStateEl = document.getElementById("tools-empty-state"); -const typingIndicatorEl = document.getElementById("typing-indicator"); -const themeToggleBtn = document.getElementById("theme-toggle"); -const themeToggleIconEl = document.getElementById("theme-toggle-icon"); - -let history = []; -let activeAssistantBody = null; -let abortController = null; - -stopBtn.disabled = true; - -loadTheme(); -loadConfig(); - -themeToggleBtn.addEventListener("click", () => { - const next = html.getAttribute("data-theme") === "dark" ? "light" : "dark"; - setTheme(next); -}); - -sendBtn.addEventListener("click", sendPrompt); -stopBtn.addEventListener("click", () => abortController?.abort()); - -clearBtn.addEventListener("click", () => { - history = []; - removeAllMessages(); - removeAllTimelineEvents(); - promptEl.value = ""; - activeAssistantBody = null; - updateEmptyStates(); -}); - -clearChatBtn.addEventListener("click", () => { - history = []; - removeAllMessages(); - promptEl.value = ""; - activeAssistantBody = null; - updateEmptyStates(); -}); - -clearToolsBtn.addEventListener("click", () => { - removeAllTimelineEvents(); - updateEmptyStates(); -}); - -promptEl.addEventListener("keydown", (event) => { - if (event.key === "Enter" && !event.shiftKey) { - event.preventDefault(); - sendPrompt(); - } -}); - -async function loadConfig() { - try { - const response = await fetch("/api/config"); - if (!response.ok) { - throw new Error(`HTTP ${response.status}`); - } - - const config = await response.json(); - const modelLabel = config.model ? config.model : "Model not configured"; - statusEl.textContent = config.hasApiKey ? modelLabel : `${modelLabel} / missing OPENROUTER_API_KEY`; - } catch (error) { - statusEl.textContent = `Config error: ${error.message}`; - } -} - -async function sendPrompt() { - const prompt = promptEl.value.trim(); - if (!prompt || abortController) { - return; - } - - history.push({ role: "user", content: prompt }); - addMessage("user", prompt); - promptEl.value = ""; - activeAssistantBody = addMessage("assistant", ""); - setBusy(true); - - abortController = new AbortController(); - - try { - const response = await fetch("/api/chat/stream", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ messages: history }), - signal: abortController.signal - }); - - if (!response.ok || !response.body) { - throw new Error(`HTTP ${response.status}`); - } - - const reader = response.body.getReader(); - const decoder = new TextDecoder(); - let buffer = ""; - let finalAssistantText = ""; - - while (true) { - const { value, done } = await reader.read(); - if (done) { - break; - } - - buffer += decoder.decode(value, { stream: true }); - buffer = parseSseChunk(buffer, (eventName, envelope) => { - addTimelineEvent(eventName, envelope); - - if (eventName === "error") { - const errorMessage = envelope.data?.message ?? "Unknown error"; - addMessage("error", errorMessage); - } - - if (eventName === "final") { - finalAssistantText = formatFinalText(envelope.data); - activeAssistantBody.textContent = finalAssistantText; - } - - if (eventName === "state_summary") { - const turnCount = envelope.data?.turnCount ?? "?"; - const toolCallCount = envelope.data?.toolCallCount ?? "?"; - statusEl.textContent = `Running turn ${turnCount}, tools ${toolCallCount}`; - } - }); - } - - if (finalAssistantText.trim().length > 0) { - history.push({ role: "assistant", content: finalAssistantText }); - } - } catch (error) { - if (error.name !== "AbortError") { - addMessage("error", `Request failed: ${error.message}`); - addTimelineEvent("error", { - kind: "error", - data: { - code: "request_failed", - message: error.message - } - }); - } - } finally { - abortController = null; - activeAssistantBody = null; - setBusy(false); - } -} - -function parseSseChunk(buffer, onEvent) { - let blockIndex; - while ((blockIndex = buffer.indexOf("\n\n")) >= 0) { - const rawBlock = buffer.slice(0, blockIndex); - buffer = buffer.slice(blockIndex + 2); - - let eventName = "message"; - let dataText = ""; - for (const line of rawBlock.split("\n")) { - if (line.startsWith("event:")) { - eventName = line.slice(6).trim(); - } else if (line.startsWith("data:")) { - dataText += line.slice(5).trim(); - } - } - - if (!dataText) { - continue; - } - - try { - onEvent(eventName, JSON.parse(dataText)); - } catch (error) { - onEvent("error", { - kind: "error", - data: { - code: "invalid_sse_payload", - message: "Failed to parse SSE payload.", - detail: dataText - } - }); - } - } - - return buffer; -} - -function addMessage(role, content) { - const wrapper = document.createElement("div"); - wrapper.className = `message ${role}`; - - const label = document.createElement("div"); - label.className = "message-label"; - label.textContent = role; - - const body = document.createElement("div"); - body.className = "message-body"; - body.textContent = content; - - wrapper.append(label, body); - chatEl.insertBefore(wrapper, typingIndicatorEl); - chatEl.scrollTop = chatEl.scrollHeight; - updateEmptyStates(); - return body; -} - -function addTimelineEvent(kind, envelope) { - const event = document.createElement("div"); - event.className = `timeline-event kind-${kind}`; - - const label = document.createElement("div"); - label.className = "timeline-label"; - label.textContent = kind.replaceAll("_", " "); - - const body = document.createElement("div"); - body.className = "timeline-body-text"; - body.textContent = JSON.stringify(envelope.data ?? envelope, null, 2); - - event.append(label, body); - toolsEl.appendChild(event); - toolsEl.scrollTop = toolsEl.scrollHeight; - updateEmptyStates(); -} - -function formatFinalText(data) { - if (!data) { - return "The run completed without a final payload."; - } - - const lines = []; - if (data.headline) { - lines.push(data.headline); - lines.push(""); - } - - if (data.answerMarkdown) { - lines.push(data.answerMarkdown); - } - - if (Array.isArray(data.verifiedFacts) && data.verifiedFacts.length > 0) { - lines.push(""); - lines.push("Verified facts:"); - for (const fact of data.verifiedFacts) { - lines.push(`- ${fact}`); - } - } - - if (Array.isArray(data.openIssues) && data.openIssues.length > 0) { - lines.push(""); - lines.push("Open issues:"); - for (const issue of data.openIssues) { - lines.push(`- ${issue}`); - } - } - - if (data.nextAction) { - lines.push(""); - lines.push(`Next action: ${data.nextAction}`); - } - - return lines.join("\n"); -} - -function setBusy(busy) { - sendBtn.disabled = busy; - stopBtn.disabled = !busy; - promptEl.disabled = busy; - typingIndicatorEl.classList.toggle("visible", busy); - statusEl.classList.toggle("busy", busy); - if (!busy) { - loadConfig(); - } else { - statusEl.textContent = "Streaming run..."; - } -} - -function removeAllMessages() { - for (const message of chatEl.querySelectorAll(".message")) { - message.remove(); - } -} - -function removeAllTimelineEvents() { - for (const event of toolsEl.querySelectorAll(".timeline-event")) { - event.remove(); - } -} - -function updateEmptyStates() { - emptyStateEl.style.display = chatEl.querySelectorAll(".message").length === 0 ? "" : "none"; - toolsEmptyStateEl.style.display = toolsEl.querySelectorAll(".timeline-event").length === 0 ? "" : "none"; -} - -function loadTheme() { - const theme = localStorage.getItem("mcc-playground-theme") || "dark"; - setTheme(theme); -} - -function setTheme(theme) { - html.setAttribute("data-theme", theme); - themeToggleIconEl.textContent = theme === "dark" ? "◎" : "◐"; - localStorage.setItem("mcc-playground-theme", theme); -} diff --git a/DebugTools/MccMcpWebPlayground/wwwroot/index.html b/DebugTools/MccMcpWebPlayground/wwwroot/index.html deleted file mode 100644 index 71a9d992e4..0000000000 --- a/DebugTools/MccMcpWebPlayground/wwwroot/index.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - MCC MCP Playground - - - - - -
-
-
-
-
MCC MCP Playground
-
Canonical guidance bootstrap, typed run state, verified completion
-
-
-
-
Booting...
- -
-
- -
-
-
-

Conversation

-
- -
-
-
-
-

No messages yet.

-

Ask the harness to inspect or act through MCC's MCP server.

-
-
- -
-
-
- -
-
-

Run Timeline

-
- -
-
-
-
-

No run events yet.

-

Typed SSE events will appear here as the harness runs.

-
-
-
-
- -
-
- -
- -
- - - - diff --git a/DebugTools/MccMcpWebPlayground/wwwroot/site.css b/DebugTools/MccMcpWebPlayground/wwwroot/site.css deleted file mode 100644 index 66621a6746..0000000000 --- a/DebugTools/MccMcpWebPlayground/wwwroot/site.css +++ /dev/null @@ -1,383 +0,0 @@ -:root { - --bg: #07111e; - --bg-alt: #0b1828; - --panel: rgba(10, 21, 36, 0.88); - --panel-strong: rgba(8, 18, 30, 0.96); - --border: rgba(111, 179, 255, 0.18); - --text: #dce9ff; - --text-dim: #8ca4c8; - --text-soft: #607695; - --accent: #75e7c7; - --accent-strong: #4ad3ff; - --warning: #ffcc66; - --danger: #ff7b8b; - --shadow: 0 20px 60px rgba(0, 0, 0, 0.3); -} - -[data-theme="light"] { - --bg: #edf4ff; - --bg-alt: #dfeaff; - --panel: rgba(255, 255, 255, 0.88); - --panel-strong: rgba(255, 255, 255, 0.96); - --border: rgba(28, 89, 164, 0.14); - --text: #172843; - --text-dim: #4d6383; - --text-soft: #7d90ad; - --accent: #0f936d; - --accent-strong: #006cbb; - --warning: #a56700; - --danger: #ba2741; - --shadow: 0 20px 60px rgba(61, 89, 138, 0.12); -} - -*, -*::before, -*::after { - box-sizing: border-box; -} - -html, -body { - margin: 0; - min-height: 100%; -} - -body { - display: grid; - grid-template-rows: auto 1fr auto; - gap: 16px; - padding: 18px; - color: var(--text); - font-family: "Space Mono", monospace; - background: - radial-gradient(circle at top left, rgba(74, 211, 255, 0.12), transparent 35%), - radial-gradient(circle at right center, rgba(117, 231, 199, 0.08), transparent 40%), - linear-gradient(160deg, var(--bg), var(--bg-alt)); -} - -button, -textarea { - font: inherit; -} - -.topbar, -.panel, -.composer { - border: 1px solid var(--border); - border-radius: 18px; - background: var(--panel); - backdrop-filter: blur(18px); - box-shadow: var(--shadow); -} - -.topbar { - display: flex; - align-items: center; - justify-content: space-between; - gap: 16px; - padding: 18px 20px; -} - -.brand { - display: flex; - align-items: center; - gap: 14px; -} - -.brand-dot { - width: 12px; - height: 12px; - border-radius: 999px; - background: linear-gradient(135deg, var(--accent), var(--accent-strong)); - box-shadow: 0 0 18px rgba(117, 231, 199, 0.55); -} - -.brand-title { - font-family: "Syne", sans-serif; - font-size: 1rem; - font-weight: 800; - letter-spacing: 0.08em; - text-transform: uppercase; -} - -.brand-title span { - color: var(--accent); -} - -.brand-subtitle { - margin-top: 4px; - color: var(--text-dim); - font-size: 0.74rem; -} - -.topbar-actions { - display: flex; - align-items: center; - gap: 10px; -} - -.status-pill { - padding: 8px 12px; - border-radius: 999px; - border: 1px solid var(--border); - color: var(--text-dim); - font-size: 0.72rem; - white-space: nowrap; -} - -.status-pill.busy { - color: var(--accent-strong); - border-color: rgba(74, 211, 255, 0.4); -} - -.icon-button, -.ghost-button, -.primary-button { - border-radius: 12px; - border: 1px solid var(--border); - background: rgba(255, 255, 255, 0.02); - color: var(--text); - padding: 10px 14px; - cursor: pointer; - transition: transform 0.15s ease, border-color 0.15s ease, background 0.15s ease; -} - -.icon-button:hover, -.ghost-button:hover, -.primary-button:hover { - transform: translateY(-1px); - border-color: rgba(117, 231, 199, 0.4); -} - -.primary-button { - background: linear-gradient(135deg, var(--accent), var(--accent-strong)); - color: #06101a; - font-weight: 700; -} - -.layout { - min-height: 0; - display: grid; - grid-template-columns: 1.2fr 0.9fr; - gap: 16px; -} - -.panel { - display: flex; - flex-direction: column; - min-height: 0; - overflow: hidden; -} - -.panel-header { - display: flex; - align-items: center; - justify-content: space-between; - gap: 12px; - padding: 16px 18px; - border-bottom: 1px solid var(--border); -} - -.panel-header h1 { - margin: 0; - font-family: "Syne", sans-serif; - font-size: 0.82rem; - text-transform: uppercase; - letter-spacing: 0.08em; -} - -.panel-body { - min-height: 0; - overflow: auto; - padding: 18px; -} - -.chat-body, -.timeline-body { - display: flex; - flex-direction: column; - gap: 12px; -} - -.message, -.timeline-event { - border-radius: 16px; - border: 1px solid var(--border); - padding: 14px 16px; - background: var(--panel-strong); -} - -.message.user { - background: rgba(74, 211, 255, 0.09); -} - -.message.assistant { - background: rgba(117, 231, 199, 0.06); -} - -.message.error { - background: rgba(255, 123, 139, 0.08); - border-color: rgba(255, 123, 139, 0.2); -} - -.message-label, -.timeline-label { - margin-bottom: 8px; - color: var(--text-dim); - font-size: 0.7rem; - letter-spacing: 0.08em; - text-transform: uppercase; -} - -.message-body, -.timeline-body-text { - white-space: pre-wrap; - word-break: break-word; - line-height: 1.6; - font-size: 0.82rem; -} - -.timeline-event.kind-tool_called { - border-left: 4px solid var(--accent-strong); -} - -.timeline-event.kind-tool_result { - border-left: 4px solid var(--accent); -} - -.timeline-event.kind-error { - border-left: 4px solid var(--danger); -} - -.timeline-event.kind-budget { - border-left: 4px solid var(--warning); -} - -.timeline-event.kind-final { - border-left: 4px solid var(--accent); -} - -.empty-state { - padding: 30px 18px; - text-align: center; - color: var(--text-soft); - border: 1px dashed var(--border); - border-radius: 14px; -} - -.typing-indicator { - display: none; - gap: 6px; - align-items: center; - padding: 10px 4px 0; -} - -.typing-indicator.visible { - display: flex; -} - -.typing-indicator span { - width: 8px; - height: 8px; - border-radius: 999px; - background: var(--accent-strong); - animation: bounce 1s ease-in-out infinite; -} - -.typing-indicator span:nth-child(2) { - animation-delay: 0.16s; -} - -.typing-indicator span:nth-child(3) { - animation-delay: 0.32s; -} - -@keyframes bounce { - 0%, 80%, 100% { - transform: translateY(0); - opacity: 0.45; - } - 40% { - transform: translateY(-5px); - opacity: 1; - } -} - -.composer { - padding: 16px 18px; -} - -.composer-row { - display: flex; -} - -#prompt { - width: 100%; - min-height: 78px; - max-height: 240px; - resize: vertical; - border-radius: 16px; - border: 1px solid var(--border); - background: rgba(0, 0, 0, 0.12); - color: var(--text); - padding: 14px 16px; -} - -#prompt:focus { - outline: 2px solid rgba(74, 211, 255, 0.35); - border-color: rgba(74, 211, 255, 0.45); -} - -.composer-footer { - margin-top: 14px; - display: flex; - align-items: center; - justify-content: space-between; - gap: 12px; -} - -.composer-hint { - color: var(--text-dim); - font-size: 0.74rem; -} - -kbd { - padding: 2px 6px; - border-radius: 6px; - border: 1px solid var(--border); - background: rgba(255, 255, 255, 0.03); - font-size: 0.74rem; -} - -.composer-actions { - display: flex; - gap: 10px; -} - -@media (max-width: 980px) { - .layout { - grid-template-columns: 1fr; - } - - body { - padding: 12px; - } - - .topbar, - .composer { - padding: 14px; - } - - .composer-footer { - flex-direction: column; - align-items: stretch; - } - - .composer-actions { - justify-content: stretch; - } - - .composer-actions > button { - flex: 1; - } -} diff --git a/DebugTools/MinecraftClientProxy.sln b/DebugTools/MinecraftClientProxy.sln deleted file mode 100644 index 042c5c69c4..0000000000 --- a/DebugTools/MinecraftClientProxy.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MinecraftClientProxy", "MinecraftClientProxy\MinecraftClientProxy.csproj", "{025E4E4C-F38B-46F6-8492-61B732018B1E}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x86 = Debug|x86 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {025E4E4C-F38B-46F6-8492-61B732018B1E}.Debug|x86.ActiveCfg = Debug|x86 - {025E4E4C-F38B-46F6-8492-61B732018B1E}.Debug|x86.Build.0 = Debug|x86 - {025E4E4C-F38B-46F6-8492-61B732018B1E}.Release|x86.ActiveCfg = Release|x86 - {025E4E4C-F38B-46F6-8492-61B732018B1E}.Release|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/DebugTools/MinecraftClientProxy/Compression/CRC32.cs b/DebugTools/MinecraftClientProxy/Compression/CRC32.cs deleted file mode 100644 index c24160522c..0000000000 --- a/DebugTools/MinecraftClientProxy/Compression/CRC32.cs +++ /dev/null @@ -1,814 +0,0 @@ -// CRC32.cs -// ------------------------------------------------------------------ -// -// Copyright (c) 2011 Dino Chiesa. -// All rights reserved. -// -// This code module is part of DotNetZip, a zipfile class library. -// -// ------------------------------------------------------------------ -// -// This code is licensed under the Microsoft Public License. -// See the file License.txt for the license details. -// More info on: http://dotnetzip.codeplex.com -// -// ------------------------------------------------------------------ -// -// Last Saved: <2011-August-02 18:25:54> -// -// ------------------------------------------------------------------ -// -// This module defines the CRC32 class, which can do the CRC32 algorithm, using -// arbitrary starting polynomials, and bit reversal. The bit reversal is what -// distinguishes this CRC-32 used in BZip2 from the CRC-32 that is used in PKZIP -// files, or GZIP files. This class does both. -// -// ------------------------------------------------------------------ - - -using System; -using Interop = System.Runtime.InteropServices; - -namespace Ionic.Crc -{ - /// - /// Computes a CRC-32. The CRC-32 algorithm is parameterized - you - /// can set the polynomial and enable or disable bit - /// reversal. This can be used for GZIP, BZip2, or ZIP. - /// - /// - /// This type is used internally by DotNetZip; it is generally not used - /// directly by applications wishing to create, read, or manipulate zip - /// archive files. - /// - - [Interop.GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000C")] - [Interop.ComVisible(true)] -#if !NETCF - [Interop.ClassInterface(Interop.ClassInterfaceType.AutoDispatch)] -#endif - public class CRC32 - { - /// - /// Indicates the total number of bytes applied to the CRC. - /// - public Int64 TotalBytesRead - { - get - { - return _TotalBytesRead; - } - } - - /// - /// Indicates the current CRC for all blocks slurped in. - /// - public Int32 Crc32Result - { - get - { - return unchecked((Int32)(~_register)); - } - } - - /// - /// Returns the CRC32 for the specified stream. - /// - /// The stream over which to calculate the CRC32 - /// the CRC32 calculation - public Int32 GetCrc32(System.IO.Stream input) - { - return GetCrc32AndCopy(input, null); - } - - /// - /// Returns the CRC32 for the specified stream, and writes the input into the - /// output stream. - /// - /// The stream over which to calculate the CRC32 - /// The stream into which to deflate the input - /// the CRC32 calculation - public Int32 GetCrc32AndCopy(System.IO.Stream input, System.IO.Stream output) - { - if (input == null) - throw new Exception("The input stream must not be null."); - - unchecked - { - byte[] buffer = new byte[BUFFER_SIZE]; - int readSize = BUFFER_SIZE; - - _TotalBytesRead = 0; - int count = input.Read(buffer, 0, readSize); - if (output != null) output.Write(buffer, 0, count); - _TotalBytesRead += count; - while (count > 0) - { - SlurpBlock(buffer, 0, count); - count = input.Read(buffer, 0, readSize); - if (output != null) output.Write(buffer, 0, count); - _TotalBytesRead += count; - } - - return (Int32)(~_register); - } - } - - - /// - /// Get the CRC32 for the given (word,byte) combo. This is a - /// computation defined by PKzip for PKZIP 2.0 (weak) encryption. - /// - /// The word to start with. - /// The byte to combine it with. - /// The CRC-ized result. - public Int32 ComputeCrc32(Int32 W, byte B) - { - return _InternalComputeCrc32((UInt32)W, B); - } - - internal Int32 _InternalComputeCrc32(UInt32 W, byte B) - { - return (Int32)(crc32Table[(W ^ B) & 0xFF] ^ (W >> 8)); - } - - - /// - /// Update the value for the running CRC32 using the given block of bytes. - /// This is useful when using the CRC32() class in a Stream. - /// - /// block of bytes to slurp - /// starting point in the block - /// how many bytes within the block to slurp - public void SlurpBlock(byte[] block, int offset, int count) - { - if (block == null) - throw new Exception("The data buffer must not be null."); - - // bzip algorithm - for (int i = 0; i < count; i++) - { - int x = offset + i; - byte b = block[x]; - if (this.reverseBits) - { - UInt32 temp = (_register >> 24) ^ b; - _register = (_register << 8) ^ crc32Table[temp]; - } - else - { - UInt32 temp = (_register & 0x000000FF) ^ b; - _register = (_register >> 8) ^ crc32Table[temp]; - } - } - _TotalBytesRead += count; - } - - - /// - /// Process one byte in the CRC. - /// - /// the byte to include into the CRC . - public void UpdateCRC(byte b) - { - if (this.reverseBits) - { - UInt32 temp = (_register >> 24) ^ b; - _register = (_register << 8) ^ crc32Table[temp]; - } - else - { - UInt32 temp = (_register & 0x000000FF) ^ b; - _register = (_register >> 8) ^ crc32Table[temp]; - } - } - - /// - /// Process a run of N identical bytes into the CRC. - /// - /// - /// - /// This method serves as an optimization for updating the CRC when a - /// run of identical bytes is found. Rather than passing in a buffer of - /// length n, containing all identical bytes b, this method accepts the - /// byte value and the length of the (virtual) buffer - the length of - /// the run. - /// - /// - /// the byte to include into the CRC. - /// the number of times that byte should be repeated. - public void UpdateCRC(byte b, int n) - { - while (n-- > 0) - { - if (this.reverseBits) - { - uint temp = (_register >> 24) ^ b; - _register = (_register << 8) ^ crc32Table[(temp >= 0) - ? temp - : (temp + 256)]; - } - else - { - UInt32 temp = (_register & 0x000000FF) ^ b; - _register = (_register >> 8) ^ crc32Table[(temp >= 0) - ? temp - : (temp + 256)]; - - } - } - } - - - - private static uint ReverseBits(uint data) - { - unchecked - { - uint ret = data; - ret = (ret & 0x55555555) << 1 | (ret >> 1) & 0x55555555; - ret = (ret & 0x33333333) << 2 | (ret >> 2) & 0x33333333; - ret = (ret & 0x0F0F0F0F) << 4 | (ret >> 4) & 0x0F0F0F0F; - ret = (ret << 24) | ((ret & 0xFF00) << 8) | ((ret >> 8) & 0xFF00) | (ret >> 24); - return ret; - } - } - - private static byte ReverseBits(byte data) - { - unchecked - { - uint u = (uint)data * 0x00020202; - uint m = 0x01044010; - uint s = u & m; - uint t = (u << 2) & (m << 1); - return (byte)((0x01001001 * (s + t)) >> 24); - } - } - - - - private void GenerateLookupTable() - { - crc32Table = new UInt32[256]; - unchecked - { - UInt32 dwCrc; - byte i = 0; - do - { - dwCrc = i; - for (byte j = 8; j > 0; j--) - { - if ((dwCrc & 1) == 1) - { - dwCrc = (dwCrc >> 1) ^ dwPolynomial; - } - else - { - dwCrc >>= 1; - } - } - if (reverseBits) - { - crc32Table[ReverseBits(i)] = ReverseBits(dwCrc); - } - else - { - crc32Table[i] = dwCrc; - } - i++; - } while (i!=0); - } - -#if VERBOSE - Console.WriteLine(); - Console.WriteLine("private static readonly UInt32[] crc32Table = {"); - for (int i = 0; i < crc32Table.Length; i+=4) - { - Console.Write(" "); - for (int j=0; j < 4; j++) - { - Console.Write(" 0x{0:X8}U,", crc32Table[i+j]); - } - Console.WriteLine(); - } - Console.WriteLine("};"); - Console.WriteLine(); -#endif - } - - - private uint gf2_matrix_times(uint[] matrix, uint vec) - { - uint sum = 0; - int i=0; - while (vec != 0) - { - if ((vec & 0x01)== 0x01) - sum ^= matrix[i]; - vec >>= 1; - i++; - } - return sum; - } - - private void gf2_matrix_square(uint[] square, uint[] mat) - { - for (int i = 0; i < 32; i++) - square[i] = gf2_matrix_times(mat, mat[i]); - } - - - - /// - /// Combines the given CRC32 value with the current running total. - /// - /// - /// This is useful when using a divide-and-conquer approach to - /// calculating a CRC. Multiple threads can each calculate a - /// CRC32 on a segment of the data, and then combine the - /// individual CRC32 values at the end. - /// - /// the crc value to be combined with this one - /// the length of data the CRC value was calculated on - public void Combine(int crc, int length) - { - uint[] even = new uint[32]; // even-power-of-two zeros operator - uint[] odd = new uint[32]; // odd-power-of-two zeros operator - - if (length == 0) - return; - - uint crc1= ~_register; - uint crc2= (uint) crc; - - // put operator for one zero bit in odd - odd[0] = this.dwPolynomial; // the CRC-32 polynomial - uint row = 1; - for (int i = 1; i < 32; i++) - { - odd[i] = row; - row <<= 1; - } - - // put operator for two zero bits in even - gf2_matrix_square(even, odd); - - // put operator for four zero bits in odd - gf2_matrix_square(odd, even); - - uint len2 = (uint) length; - - // apply len2 zeros to crc1 (first square will put the operator for one - // zero byte, eight zero bits, in even) - do { - // apply zeros operator for this bit of len2 - gf2_matrix_square(even, odd); - - if ((len2 & 1)== 1) - crc1 = gf2_matrix_times(even, crc1); - len2 >>= 1; - - if (len2 == 0) - break; - - // another iteration of the loop with odd and even swapped - gf2_matrix_square(odd, even); - if ((len2 & 1)==1) - crc1 = gf2_matrix_times(odd, crc1); - len2 >>= 1; - - - } while (len2 != 0); - - crc1 ^= crc2; - - _register= ~crc1; - - //return (int) crc1; - return; - } - - - /// - /// Create an instance of the CRC32 class using the default settings: no - /// bit reversal, and a polynomial of 0xEDB88320. - /// - public CRC32() : this(false) - { - } - - /// - /// Create an instance of the CRC32 class, specifying whether to reverse - /// data bits or not. - /// - /// - /// specify true if the instance should reverse data bits. - /// - /// - /// - /// In the CRC-32 used by BZip2, the bits are reversed. Therefore if you - /// want a CRC32 with compatibility with BZip2, you should pass true - /// here. In the CRC-32 used by GZIP and PKZIP, the bits are not - /// reversed; Therefore if you want a CRC32 with compatibility with - /// those, you should pass false. - /// - /// - public CRC32(bool reverseBits) : - this( unchecked((int)0xEDB88320), reverseBits) - { - } - - - /// - /// Create an instance of the CRC32 class, specifying the polynomial and - /// whether to reverse data bits or not. - /// - /// - /// The polynomial to use for the CRC, expressed in the reversed (LSB) - /// format: the highest ordered bit in the polynomial value is the - /// coefficient of the 0th power; the second-highest order bit is the - /// coefficient of the 1 power, and so on. Expressed this way, the - /// polynomial for the CRC-32C used in IEEE 802.3, is 0xEDB88320. - /// - /// - /// specify true if the instance should reverse data bits. - /// - /// - /// - /// - /// In the CRC-32 used by BZip2, the bits are reversed. Therefore if you - /// want a CRC32 with compatibility with BZip2, you should pass true - /// here for the reverseBits parameter. In the CRC-32 used by - /// GZIP and PKZIP, the bits are not reversed; Therefore if you want a - /// CRC32 with compatibility with those, you should pass false for the - /// reverseBits parameter. - /// - /// - public CRC32(int polynomial, bool reverseBits) - { - this.reverseBits = reverseBits; - this.dwPolynomial = (uint) polynomial; - this.GenerateLookupTable(); - } - - /// - /// Reset the CRC-32 class - clear the CRC "remainder register." - /// - /// - /// - /// Use this when employing a single instance of this class to compute - /// multiple, distinct CRCs on multiple, distinct data blocks. - /// - /// - public void Reset() - { - _register = 0xFFFFFFFFU; - } - - // private member vars - private UInt32 dwPolynomial; - private Int64 _TotalBytesRead; - private bool reverseBits; - private UInt32[] crc32Table; - private const int BUFFER_SIZE = 8192; - private UInt32 _register = 0xFFFFFFFFU; - } - - - /// - /// A Stream that calculates a CRC32 (a checksum) on all bytes read, - /// or on all bytes written. - /// - /// - /// - /// - /// This class can be used to verify the CRC of a ZipEntry when - /// reading from a stream, or to calculate a CRC when writing to a - /// stream. The stream should be used to either read, or write, but - /// not both. If you intermix reads and writes, the results are not - /// defined. - /// - /// - /// - /// This class is intended primarily for use internally by the - /// DotNetZip library. - /// - /// - public class CrcCalculatorStream : System.IO.Stream, System.IDisposable - { - private static readonly Int64 UnsetLengthLimit = -99; - - internal System.IO.Stream _innerStream; - private CRC32 _Crc32; - private Int64 _lengthLimit = -99; - private bool _leaveOpen; - - /// - /// The default constructor. - /// - /// - /// - /// Instances returned from this constructor will leave the underlying - /// stream open upon Close(). The stream uses the default CRC32 - /// algorithm, which implies a polynomial of 0xEDB88320. - /// - /// - /// The underlying stream - public CrcCalculatorStream(System.IO.Stream stream) - : this(true, CrcCalculatorStream.UnsetLengthLimit, stream, null) - { - } - - /// - /// The constructor allows the caller to specify how to handle the - /// underlying stream at close. - /// - /// - /// - /// The stream uses the default CRC32 algorithm, which implies a - /// polynomial of 0xEDB88320. - /// - /// - /// The underlying stream - /// true to leave the underlying stream - /// open upon close of the CrcCalculatorStream; false otherwise. - public CrcCalculatorStream(System.IO.Stream stream, bool leaveOpen) - : this(leaveOpen, CrcCalculatorStream.UnsetLengthLimit, stream, null) - { - } - - /// - /// A constructor allowing the specification of the length of the stream - /// to read. - /// - /// - /// - /// The stream uses the default CRC32 algorithm, which implies a - /// polynomial of 0xEDB88320. - /// - /// - /// Instances returned from this constructor will leave the underlying - /// stream open upon Close(). - /// - /// - /// The underlying stream - /// The length of the stream to slurp - public CrcCalculatorStream(System.IO.Stream stream, Int64 length) - : this(true, length, stream, null) - { - if (length < 0) - throw new ArgumentException("length"); - } - - /// - /// A constructor allowing the specification of the length of the stream - /// to read, as well as whether to keep the underlying stream open upon - /// Close(). - /// - /// - /// - /// The stream uses the default CRC32 algorithm, which implies a - /// polynomial of 0xEDB88320. - /// - /// - /// The underlying stream - /// The length of the stream to slurp - /// true to leave the underlying stream - /// open upon close of the CrcCalculatorStream; false otherwise. - public CrcCalculatorStream(System.IO.Stream stream, Int64 length, bool leaveOpen) - : this(leaveOpen, length, stream, null) - { - if (length < 0) - throw new ArgumentException("length"); - } - - /// - /// A constructor allowing the specification of the length of the stream - /// to read, as well as whether to keep the underlying stream open upon - /// Close(), and the CRC32 instance to use. - /// - /// - /// - /// The stream uses the specified CRC32 instance, which allows the - /// application to specify how the CRC gets calculated. - /// - /// - /// The underlying stream - /// The length of the stream to slurp - /// true to leave the underlying stream - /// open upon close of the CrcCalculatorStream; false otherwise. - /// the CRC32 instance to use to calculate the CRC32 - public CrcCalculatorStream(System.IO.Stream stream, Int64 length, bool leaveOpen, - CRC32 crc32) - : this(leaveOpen, length, stream, crc32) - { - if (length < 0) - throw new ArgumentException("length"); - } - - - // This ctor is private - no validation is done here. This is to allow the use - // of a (specific) negative value for the _lengthLimit, to indicate that there - // is no length set. So we validate the length limit in those ctors that use an - // explicit param, otherwise we don't validate, because it could be our special - // value. - private CrcCalculatorStream - (bool leaveOpen, Int64 length, System.IO.Stream stream, CRC32 crc32) - : base() - { - _innerStream = stream; - _Crc32 = crc32 ?? new CRC32(); - _lengthLimit = length; - _leaveOpen = leaveOpen; - } - - - /// - /// Gets the total number of bytes run through the CRC32 calculator. - /// - /// - /// - /// This is either the total number of bytes read, or the total number of - /// bytes written, depending on the direction of this stream. - /// - public Int64 TotalBytesSlurped - { - get { return _Crc32.TotalBytesRead; } - } - - /// - /// Provides the current CRC for all blocks slurped in. - /// - /// - /// - /// The running total of the CRC is kept as data is written or read - /// through the stream. read this property after all reads or writes to - /// get an accurate CRC for the entire stream. - /// - /// - public Int32 Crc - { - get { return _Crc32.Crc32Result; } - } - - /// - /// Indicates whether the underlying stream will be left open when the - /// CrcCalculatorStream is Closed. - /// - /// - /// - /// Set this at any point before calling . - /// - /// - public bool LeaveOpen - { - get { return _leaveOpen; } - set { _leaveOpen = value; } - } - - /// - /// Read from the stream - /// - /// the buffer to read - /// the offset at which to start - /// the number of bytes to read - /// the number of bytes actually read - public override int Read(byte[] buffer, int offset, int count) - { - int bytesToRead = count; - - // Need to limit the # of bytes returned, if the stream is intended to have - // a definite length. This is especially useful when returning a stream for - // the uncompressed data directly to the application. The app won't - // necessarily read only the UncompressedSize number of bytes. For example - // wrapping the stream returned from OpenReader() into a StreadReader() and - // calling ReadToEnd() on it, We can "over-read" the zip data and get a - // corrupt string. The length limits that, prevents that problem. - - if (_lengthLimit != CrcCalculatorStream.UnsetLengthLimit) - { - if (_Crc32.TotalBytesRead >= _lengthLimit) return 0; // EOF - Int64 bytesRemaining = _lengthLimit - _Crc32.TotalBytesRead; - if (bytesRemaining < count) bytesToRead = (int)bytesRemaining; - } - int n = _innerStream.Read(buffer, offset, bytesToRead); - if (n > 0) _Crc32.SlurpBlock(buffer, offset, n); - return n; - } - - /// - /// Write to the stream. - /// - /// the buffer from which to write - /// the offset at which to start writing - /// the number of bytes to write - public override void Write(byte[] buffer, int offset, int count) - { - if (count > 0) _Crc32.SlurpBlock(buffer, offset, count); - _innerStream.Write(buffer, offset, count); - } - - /// - /// Indicates whether the stream supports reading. - /// - public override bool CanRead - { - get { return _innerStream.CanRead; } - } - - /// - /// Indicates whether the stream supports seeking. - /// - /// - /// - /// Always returns false. - /// - /// - public override bool CanSeek - { - get { return false; } - } - - /// - /// Indicates whether the stream supports writing. - /// - public override bool CanWrite - { - get { return _innerStream.CanWrite; } - } - - /// - /// Flush the stream. - /// - public override void Flush() - { - _innerStream.Flush(); - } - - /// - /// Returns the length of the underlying stream. - /// - public override long Length - { - get - { - if (_lengthLimit == CrcCalculatorStream.UnsetLengthLimit) - return _innerStream.Length; - else return _lengthLimit; - } - } - - /// - /// The getter for this property returns the total bytes read. - /// If you use the setter, it will throw - /// . - /// - public override long Position - { - get { return _Crc32.TotalBytesRead; } - set { throw new NotSupportedException(); } - } - - /// - /// Seeking is not supported on this stream. This method always throws - /// - /// - /// N/A - /// N/A - /// N/A - public override long Seek(long offset, System.IO.SeekOrigin origin) - { - throw new NotSupportedException(); - } - - /// - /// This method always throws - /// - /// - /// N/A - public override void SetLength(long value) - { - throw new NotSupportedException(); - } - - - void IDisposable.Dispose() - { - Close(); - } - - /// - /// Closes the stream. - /// - public override void Close() - { - base.Close(); - if (!_leaveOpen) - _innerStream.Close(); - } - - } - -} diff --git a/DebugTools/MinecraftClientProxy/Compression/Deflate.cs b/DebugTools/MinecraftClientProxy/Compression/Deflate.cs deleted file mode 100644 index 040d6102f5..0000000000 --- a/DebugTools/MinecraftClientProxy/Compression/Deflate.cs +++ /dev/null @@ -1,1879 +0,0 @@ -// Deflate.cs -// ------------------------------------------------------------------ -// -// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation. -// All rights reserved. -// -// This code module is part of DotNetZip, a zipfile class library. -// -// ------------------------------------------------------------------ -// -// This code is licensed under the Microsoft Public License. -// See the file License.txt for the license details. -// More info on: http://dotnetzip.codeplex.com -// -// ------------------------------------------------------------------ -// -// last saved (in emacs): -// Time-stamp: <2011-August-03 19:52:15> -// -// ------------------------------------------------------------------ -// -// This module defines logic for handling the Deflate or compression. -// -// This code is based on multiple sources: -// - the original zlib v1.2.3 source, which is Copyright (C) 1995-2005 Jean-loup Gailly. -// - the original jzlib, which is Copyright (c) 2000-2003 ymnk, JCraft,Inc. -// -// However, this code is significantly different from both. -// The object model is not the same, and many of the behaviors are different. -// -// In keeping with the license for these other works, the copyrights for -// jzlib and zlib are here. -// -// ----------------------------------------------------------------------- -// Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in -// the documentation and/or other materials provided with the distribution. -// -// 3. The names of the authors may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, -// INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// ----------------------------------------------------------------------- -// -// This program is based on zlib-1.1.3; credit to authors -// Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) -// and contributors of zlib. -// -// ----------------------------------------------------------------------- - - -using System; - -namespace Ionic.Zlib -{ - - internal enum BlockState - { - NeedMore = 0, // block not completed, need more input or more output - BlockDone, // block flush performed - FinishStarted, // finish started, need only more output at next deflate - FinishDone // finish done, accept no more input or output - } - - internal enum DeflateFlavor - { - Store, - Fast, - Slow - } - - internal sealed class DeflateManager - { - private static readonly int MEM_LEVEL_MAX = 9; - private static readonly int MEM_LEVEL_DEFAULT = 8; - - internal delegate BlockState CompressFunc(FlushType flush); - - internal class Config - { - // Use a faster search when the previous match is longer than this - internal int GoodLength; // reduce lazy search above this match length - - // Attempt to find a better match only when the current match is - // strictly smaller than this value. This mechanism is used only for - // compression levels >= 4. For levels 1,2,3: MaxLazy is actually - // MaxInsertLength. (See DeflateFast) - - internal int MaxLazy; // do not perform lazy search above this match length - - internal int NiceLength; // quit search above this match length - - // To speed up deflation, hash chains are never searched beyond this - // length. A higher limit improves compression ratio but degrades the speed. - - internal int MaxChainLength; - - internal DeflateFlavor Flavor; - - private Config(int goodLength, int maxLazy, int niceLength, int maxChainLength, DeflateFlavor flavor) - { - this.GoodLength = goodLength; - this.MaxLazy = maxLazy; - this.NiceLength = niceLength; - this.MaxChainLength = maxChainLength; - this.Flavor = flavor; - } - - public static Config Lookup(CompressionLevel level) - { - return Table[(int)level]; - } - - - static Config() - { - Table = new Config[] { - new Config(0, 0, 0, 0, DeflateFlavor.Store), - new Config(4, 4, 8, 4, DeflateFlavor.Fast), - new Config(4, 5, 16, 8, DeflateFlavor.Fast), - new Config(4, 6, 32, 32, DeflateFlavor.Fast), - - new Config(4, 4, 16, 16, DeflateFlavor.Slow), - new Config(8, 16, 32, 32, DeflateFlavor.Slow), - new Config(8, 16, 128, 128, DeflateFlavor.Slow), - new Config(8, 32, 128, 256, DeflateFlavor.Slow), - new Config(32, 128, 258, 1024, DeflateFlavor.Slow), - new Config(32, 258, 258, 4096, DeflateFlavor.Slow), - }; - } - - private static readonly Config[] Table; - } - - - private CompressFunc DeflateFunction; - - private static readonly System.String[] _ErrorMessage = new System.String[] - { - "need dictionary", - "stream end", - "", - "file error", - "stream error", - "data error", - "insufficient memory", - "buffer error", - "incompatible version", - "" - }; - - // preset dictionary flag in zlib header - private static readonly int PRESET_DICT = 0x20; - - private static readonly int INIT_STATE = 42; - private static readonly int BUSY_STATE = 113; - private static readonly int FINISH_STATE = 666; - - // The deflate compression method - private static readonly int Z_DEFLATED = 8; - - private static readonly int STORED_BLOCK = 0; - private static readonly int STATIC_TREES = 1; - private static readonly int DYN_TREES = 2; - - // The three kinds of block type - private static readonly int Z_BINARY = 0; - private static readonly int Z_ASCII = 1; - private static readonly int Z_UNKNOWN = 2; - - private static readonly int Buf_size = 8 * 2; - - private static readonly int MIN_MATCH = 3; - private static readonly int MAX_MATCH = 258; - - private static readonly int MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1); - - private static readonly int HEAP_SIZE = (2 * InternalConstants.L_CODES + 1); - - private static readonly int END_BLOCK = 256; - - internal ZlibCodec _codec; // the zlib encoder/decoder - internal int status; // as the name implies - internal byte[] pending; // output still pending - waiting to be compressed - internal int nextPending; // index of next pending byte to output to the stream - internal int pendingCount; // number of bytes in the pending buffer - - internal sbyte data_type; // UNKNOWN, BINARY or ASCII - internal int last_flush; // value of flush param for previous deflate call - - internal int w_size; // LZ77 window size (32K by default) - internal int w_bits; // log2(w_size) (8..16) - internal int w_mask; // w_size - 1 - - //internal byte[] dictionary; - internal byte[] window; - - // Sliding window. Input bytes are read into the second half of the window, - // and move to the first half later to keep a dictionary of at least wSize - // bytes. With this organization, matches are limited to a distance of - // wSize-MAX_MATCH bytes, but this ensures that IO is always - // performed with a length multiple of the block size. - // - // To do: use the user input buffer as sliding window. - - internal int window_size; - // Actual size of window: 2*wSize, except when the user input buffer - // is directly used as sliding window. - - internal short[] prev; - // Link to older string with same hash index. To limit the size of this - // array to 64K, this link is maintained only for the last 32K strings. - // An index in this array is thus a window index modulo 32K. - - internal short[] head; // Heads of the hash chains or NIL. - - internal int ins_h; // hash index of string to be inserted - internal int hash_size; // number of elements in hash table - internal int hash_bits; // log2(hash_size) - internal int hash_mask; // hash_size-1 - - // Number of bits by which ins_h must be shifted at each input - // step. It must be such that after MIN_MATCH steps, the oldest - // byte no longer takes part in the hash key, that is: - // hash_shift * MIN_MATCH >= hash_bits - internal int hash_shift; - - // Window position at the beginning of the current output block. Gets - // negative when the window is moved backwards. - - internal int block_start; - - Config config; - internal int match_length; // length of best match - internal int prev_match; // previous match - internal int match_available; // set if previous match exists - internal int strstart; // start of string to insert into.....???? - internal int match_start; // start of matching string - internal int lookahead; // number of valid bytes ahead in window - - // Length of the best match at previous step. Matches not greater than this - // are discarded. This is used in the lazy match evaluation. - internal int prev_length; - - // Insert new strings in the hash table only if the match length is not - // greater than this length. This saves time but degrades compression. - // max_insert_length is used only for compression levels <= 3. - - internal CompressionLevel compressionLevel; // compression level (1..9) - internal CompressionStrategy compressionStrategy; // favor or force Huffman coding - - - internal short[] dyn_ltree; // literal and length tree - internal short[] dyn_dtree; // distance tree - internal short[] bl_tree; // Huffman tree for bit lengths - - internal Tree treeLiterals = new Tree(); // desc for literal tree - internal Tree treeDistances = new Tree(); // desc for distance tree - internal Tree treeBitLengths = new Tree(); // desc for bit length tree - - // number of codes at each bit length for an optimal tree - internal short[] bl_count = new short[InternalConstants.MAX_BITS + 1]; - - // heap used to build the Huffman trees - internal int[] heap = new int[2 * InternalConstants.L_CODES + 1]; - - internal int heap_len; // number of elements in the heap - internal int heap_max; // element of largest frequency - - // The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - // The same heap array is used to build all trees. - - // Depth of each subtree used as tie breaker for trees of equal frequency - internal sbyte[] depth = new sbyte[2 * InternalConstants.L_CODES + 1]; - - internal int _lengthOffset; // index for literals or lengths - - - // Size of match buffer for literals/lengths. There are 4 reasons for - // limiting lit_bufsize to 64K: - // - frequencies can be kept in 16 bit counters - // - if compression is not successful for the first block, all input - // data is still in the window so we can still emit a stored block even - // when input comes from standard input. (This can also be done for - // all blocks if lit_bufsize is not greater than 32K.) - // - if compression is not successful for a file smaller than 64K, we can - // even emit a stored file instead of a stored block (saving 5 bytes). - // This is applicable only for zip (not gzip or zlib). - // - creating new Huffman trees less frequently may not provide fast - // adaptation to changes in the input data statistics. (Take for - // example a binary file with poorly compressible code followed by - // a highly compressible string table.) Smaller buffer sizes give - // fast adaptation but have of course the overhead of transmitting - // trees more frequently. - - internal int lit_bufsize; - - internal int last_lit; // running index in l_buf - - // Buffer for distances. To simplify the code, d_buf and l_buf have - // the same number of elements. To use different lengths, an extra flag - // array would be necessary. - - internal int _distanceOffset; // index into pending; points to distance data?? - - internal int opt_len; // bit length of current block with optimal trees - internal int static_len; // bit length of current block with static trees - internal int matches; // number of string matches in current block - internal int last_eob_len; // bit length of EOB code for last block - - // Output buffer. bits are inserted starting at the bottom (least - // significant bits). - internal short bi_buf; - - // Number of valid bits in bi_buf. All bits above the last valid bit - // are always zero. - internal int bi_valid; - - - internal DeflateManager() - { - dyn_ltree = new short[HEAP_SIZE * 2]; - dyn_dtree = new short[(2 * InternalConstants.D_CODES + 1) * 2]; // distance tree - bl_tree = new short[(2 * InternalConstants.BL_CODES + 1) * 2]; // Huffman tree for bit lengths - } - - - // lm_init - private void _InitializeLazyMatch() - { - window_size = 2 * w_size; - - // clear the hash - workitem 9063 - Array.Clear(head, 0, hash_size); - //for (int i = 0; i < hash_size; i++) head[i] = 0; - - config = Config.Lookup(compressionLevel); - SetDeflater(); - - strstart = 0; - block_start = 0; - lookahead = 0; - match_length = prev_length = MIN_MATCH - 1; - match_available = 0; - ins_h = 0; - } - - // Initialize the tree data structures for a new zlib stream. - private void _InitializeTreeData() - { - treeLiterals.dyn_tree = dyn_ltree; - treeLiterals.staticTree = StaticTree.Literals; - - treeDistances.dyn_tree = dyn_dtree; - treeDistances.staticTree = StaticTree.Distances; - - treeBitLengths.dyn_tree = bl_tree; - treeBitLengths.staticTree = StaticTree.BitLengths; - - bi_buf = 0; - bi_valid = 0; - last_eob_len = 8; // enough lookahead for inflate - - // Initialize the first block of the first file: - _InitializeBlocks(); - } - - internal void _InitializeBlocks() - { - // Initialize the trees. - for (int i = 0; i < InternalConstants.L_CODES; i++) - dyn_ltree[i * 2] = 0; - for (int i = 0; i < InternalConstants.D_CODES; i++) - dyn_dtree[i * 2] = 0; - for (int i = 0; i < InternalConstants.BL_CODES; i++) - bl_tree[i * 2] = 0; - - dyn_ltree[END_BLOCK * 2] = 1; - opt_len = static_len = 0; - last_lit = matches = 0; - } - - // Restore the heap property by moving down the tree starting at node k, - // exchanging a node with the smallest of its two sons if necessary, stopping - // when the heap property is re-established (each father smaller than its - // two sons). - internal void pqdownheap(short[] tree, int k) - { - int v = heap[k]; - int j = k << 1; // left son of k - while (j <= heap_len) - { - // Set j to the smallest of the two sons: - if (j < heap_len && _IsSmaller(tree, heap[j + 1], heap[j], depth)) - { - j++; - } - // Exit if v is smaller than both sons - if (_IsSmaller(tree, v, heap[j], depth)) - break; - - // Exchange v with the smallest son - heap[k] = heap[j]; k = j; - // And continue down the tree, setting j to the left son of k - j <<= 1; - } - heap[k] = v; - } - - internal static bool _IsSmaller(short[] tree, int n, int m, sbyte[] depth) - { - short tn2 = tree[n * 2]; - short tm2 = tree[m * 2]; - return (tn2 < tm2 || (tn2 == tm2 && depth[n] <= depth[m])); - } - - - // Scan a literal or distance tree to determine the frequencies of the codes - // in the bit length tree. - internal void scan_tree(short[] tree, int max_code) - { - int n; // iterates over all tree elements - int prevlen = -1; // last emitted length - int curlen; // length of current code - int nextlen = (int)tree[0 * 2 + 1]; // length of next code - int count = 0; // repeat count of the current code - int max_count = 7; // max repeat count - int min_count = 4; // min repeat count - - if (nextlen == 0) - { - max_count = 138; min_count = 3; - } - tree[(max_code + 1) * 2 + 1] = (short)0x7fff; // guard //?? - - for (n = 0; n <= max_code; n++) - { - curlen = nextlen; nextlen = (int)tree[(n + 1) * 2 + 1]; - if (++count < max_count && curlen == nextlen) - { - continue; - } - else if (count < min_count) - { - bl_tree[curlen * 2] = (short)(bl_tree[curlen * 2] + count); - } - else if (curlen != 0) - { - if (curlen != prevlen) - bl_tree[curlen * 2]++; - bl_tree[InternalConstants.REP_3_6 * 2]++; - } - else if (count <= 10) - { - bl_tree[InternalConstants.REPZ_3_10 * 2]++; - } - else - { - bl_tree[InternalConstants.REPZ_11_138 * 2]++; - } - count = 0; prevlen = curlen; - if (nextlen == 0) - { - max_count = 138; min_count = 3; - } - else if (curlen == nextlen) - { - max_count = 6; min_count = 3; - } - else - { - max_count = 7; min_count = 4; - } - } - } - - // Construct the Huffman tree for the bit lengths and return the index in - // bl_order of the last bit length code to send. - internal int build_bl_tree() - { - int max_blindex; // index of last bit length code of non zero freq - - // Determine the bit length frequencies for literal and distance trees - scan_tree(dyn_ltree, treeLiterals.max_code); - scan_tree(dyn_dtree, treeDistances.max_code); - - // Build the bit length tree: - treeBitLengths.build_tree(this); - // opt_len now includes the length of the tree representations, except - // the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - - // Determine the number of bit length codes to send. The pkzip format - // requires that at least 4 bit length codes be sent. (appnote.txt says - // 3 but the actual value used is 4.) - for (max_blindex = InternalConstants.BL_CODES - 1; max_blindex >= 3; max_blindex--) - { - if (bl_tree[Tree.bl_order[max_blindex] * 2 + 1] != 0) - break; - } - // Update opt_len to include the bit length tree and counts - opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; - - return max_blindex; - } - - - // Send the header for a block using dynamic Huffman trees: the counts, the - // lengths of the bit length codes, the literal tree and the distance tree. - // IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - internal void send_all_trees(int lcodes, int dcodes, int blcodes) - { - int rank; // index in bl_order - - send_bits(lcodes - 257, 5); // not +255 as stated in appnote.txt - send_bits(dcodes - 1, 5); - send_bits(blcodes - 4, 4); // not -3 as stated in appnote.txt - for (rank = 0; rank < blcodes; rank++) - { - send_bits(bl_tree[Tree.bl_order[rank] * 2 + 1], 3); - } - send_tree(dyn_ltree, lcodes - 1); // literal tree - send_tree(dyn_dtree, dcodes - 1); // distance tree - } - - // Send a literal or distance tree in compressed form, using the codes in - // bl_tree. - internal void send_tree(short[] tree, int max_code) - { - int n; // iterates over all tree elements - int prevlen = -1; // last emitted length - int curlen; // length of current code - int nextlen = tree[0 * 2 + 1]; // length of next code - int count = 0; // repeat count of the current code - int max_count = 7; // max repeat count - int min_count = 4; // min repeat count - - if (nextlen == 0) - { - max_count = 138; min_count = 3; - } - - for (n = 0; n <= max_code; n++) - { - curlen = nextlen; nextlen = tree[(n + 1) * 2 + 1]; - if (++count < max_count && curlen == nextlen) - { - continue; - } - else if (count < min_count) - { - do - { - send_code(curlen, bl_tree); - } - while (--count != 0); - } - else if (curlen != 0) - { - if (curlen != prevlen) - { - send_code(curlen, bl_tree); count--; - } - send_code(InternalConstants.REP_3_6, bl_tree); - send_bits(count - 3, 2); - } - else if (count <= 10) - { - send_code(InternalConstants.REPZ_3_10, bl_tree); - send_bits(count - 3, 3); - } - else - { - send_code(InternalConstants.REPZ_11_138, bl_tree); - send_bits(count - 11, 7); - } - count = 0; prevlen = curlen; - if (nextlen == 0) - { - max_count = 138; min_count = 3; - } - else if (curlen == nextlen) - { - max_count = 6; min_count = 3; - } - else - { - max_count = 7; min_count = 4; - } - } - } - - // Output a block of bytes on the stream. - // IN assertion: there is enough room in pending_buf. - private void put_bytes(byte[] p, int start, int len) - { - Array.Copy(p, start, pending, pendingCount, len); - pendingCount += len; - } - -#if NOTNEEDED - private void put_byte(byte c) - { - pending[pendingCount++] = c; - } - internal void put_short(int b) - { - unchecked - { - pending[pendingCount++] = (byte)b; - pending[pendingCount++] = (byte)(b >> 8); - } - } - internal void putShortMSB(int b) - { - unchecked - { - pending[pendingCount++] = (byte)(b >> 8); - pending[pendingCount++] = (byte)b; - } - } -#endif - - internal void send_code(int c, short[] tree) - { - int c2 = c * 2; - send_bits((tree[c2] & 0xffff), (tree[c2 + 1] & 0xffff)); - } - - internal void send_bits(int value, int length) - { - int len = length; - unchecked - { - if (bi_valid > (int)Buf_size - len) - { - //int val = value; - // bi_buf |= (val << bi_valid); - - bi_buf |= (short)((value << bi_valid) & 0xffff); - //put_short(bi_buf); - pending[pendingCount++] = (byte)bi_buf; - pending[pendingCount++] = (byte)(bi_buf >> 8); - - - bi_buf = (short)((uint)value >> (Buf_size - bi_valid)); - bi_valid += len - Buf_size; - } - else - { - // bi_buf |= (value) << bi_valid; - bi_buf |= (short)((value << bi_valid) & 0xffff); - bi_valid += len; - } - } - } - - // Send one empty static block to give enough lookahead for inflate. - // This takes 10 bits, of which 7 may remain in the bit buffer. - // The current inflate code requires 9 bits of lookahead. If the - // last two codes for the previous block (real code plus EOB) were coded - // on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode - // the last real code. In this case we send two empty static blocks instead - // of one. (There are no problems if the previous block is stored or fixed.) - // To simplify the code, we assume the worst case of last real code encoded - // on one bit only. - internal void _tr_align() - { - send_bits(STATIC_TREES << 1, 3); - send_code(END_BLOCK, StaticTree.lengthAndLiteralsTreeCodes); - - bi_flush(); - - // Of the 10 bits for the empty block, we have already sent - // (10 - bi_valid) bits. The lookahead for the last real code (before - // the EOB of the previous block) was thus at least one plus the length - // of the EOB plus what we have just sent of the empty static block. - if (1 + last_eob_len + 10 - bi_valid < 9) - { - send_bits(STATIC_TREES << 1, 3); - send_code(END_BLOCK, StaticTree.lengthAndLiteralsTreeCodes); - bi_flush(); - } - last_eob_len = 7; - } - - - // Save the match info and tally the frequency counts. Return true if - // the current block must be flushed. - internal bool _tr_tally(int dist, int lc) - { - pending[_distanceOffset + last_lit * 2] = unchecked((byte) ( (uint)dist >> 8 ) ); - pending[_distanceOffset + last_lit * 2 + 1] = unchecked((byte)dist); - pending[_lengthOffset + last_lit] = unchecked((byte)lc); - last_lit++; - - if (dist == 0) - { - // lc is the unmatched char - dyn_ltree[lc * 2]++; - } - else - { - matches++; - // Here, lc is the match length - MIN_MATCH - dist--; // dist = match distance - 1 - dyn_ltree[(Tree.LengthCode[lc] + InternalConstants.LITERALS + 1) * 2]++; - dyn_dtree[Tree.DistanceCode(dist) * 2]++; - } - - if ((last_lit & 0x1fff) == 0 && (int)compressionLevel > 2) - { - // Compute an upper bound for the compressed length - int out_length = last_lit << 3; - int in_length = strstart - block_start; - int dcode; - for (dcode = 0; dcode < InternalConstants.D_CODES; dcode++) - { - out_length = (int)(out_length + (int)dyn_dtree[dcode * 2] * (5L + Tree.ExtraDistanceBits[dcode])); - } - out_length >>= 3; - if ((matches < (last_lit / 2)) && out_length < in_length / 2) - return true; - } - - return (last_lit == lit_bufsize - 1) || (last_lit == lit_bufsize); - // dinoch - wraparound? - // We avoid equality with lit_bufsize because of wraparound at 64K - // on 16 bit machines and because stored blocks are restricted to - // 64K-1 bytes. - } - - - - // Send the block data compressed using the given Huffman trees - internal void send_compressed_block(short[] ltree, short[] dtree) - { - int distance; // distance of matched string - int lc; // match length or unmatched char (if dist == 0) - int lx = 0; // running index in l_buf - int code; // the code to send - int extra; // number of extra bits to send - - if (last_lit != 0) - { - do - { - int ix = _distanceOffset + lx * 2; - distance = ((pending[ix] << 8) & 0xff00) | - (pending[ix + 1] & 0xff); - lc = (pending[_lengthOffset + lx]) & 0xff; - lx++; - - if (distance == 0) - { - send_code(lc, ltree); // send a literal byte - } - else - { - // literal or match pair - // Here, lc is the match length - MIN_MATCH - code = Tree.LengthCode[lc]; - - // send the length code - send_code(code + InternalConstants.LITERALS + 1, ltree); - extra = Tree.ExtraLengthBits[code]; - if (extra != 0) - { - // send the extra length bits - lc -= Tree.LengthBase[code]; - send_bits(lc, extra); - } - distance--; // dist is now the match distance - 1 - code = Tree.DistanceCode(distance); - - // send the distance code - send_code(code, dtree); - - extra = Tree.ExtraDistanceBits[code]; - if (extra != 0) - { - // send the extra distance bits - distance -= Tree.DistanceBase[code]; - send_bits(distance, extra); - } - } - - // Check that the overlay between pending and d_buf+l_buf is ok: - } - while (lx < last_lit); - } - - send_code(END_BLOCK, ltree); - last_eob_len = ltree[END_BLOCK * 2 + 1]; - } - - - - // Set the data type to ASCII or BINARY, using a crude approximation: - // binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise. - // IN assertion: the fields freq of dyn_ltree are set and the total of all - // frequencies does not exceed 64K (to fit in an int on 16 bit machines). - internal void set_data_type() - { - int n = 0; - int ascii_freq = 0; - int bin_freq = 0; - while (n < 7) - { - bin_freq += dyn_ltree[n * 2]; n++; - } - while (n < 128) - { - ascii_freq += dyn_ltree[n * 2]; n++; - } - while (n < InternalConstants.LITERALS) - { - bin_freq += dyn_ltree[n * 2]; n++; - } - data_type = (sbyte)(bin_freq > (ascii_freq >> 2) ? Z_BINARY : Z_ASCII); - } - - - - // Flush the bit buffer, keeping at most 7 bits in it. - internal void bi_flush() - { - if (bi_valid == 16) - { - pending[pendingCount++] = (byte)bi_buf; - pending[pendingCount++] = (byte)(bi_buf >> 8); - bi_buf = 0; - bi_valid = 0; - } - else if (bi_valid >= 8) - { - //put_byte((byte)bi_buf); - pending[pendingCount++] = (byte)bi_buf; - bi_buf >>= 8; - bi_valid -= 8; - } - } - - // Flush the bit buffer and align the output on a byte boundary - internal void bi_windup() - { - if (bi_valid > 8) - { - pending[pendingCount++] = (byte)bi_buf; - pending[pendingCount++] = (byte)(bi_buf >> 8); - } - else if (bi_valid > 0) - { - //put_byte((byte)bi_buf); - pending[pendingCount++] = (byte)bi_buf; - } - bi_buf = 0; - bi_valid = 0; - } - - // Copy a stored block, storing first the length and its - // one's complement if requested. - internal void copy_block(int buf, int len, bool header) - { - bi_windup(); // align on byte boundary - last_eob_len = 8; // enough lookahead for inflate - - if (header) - unchecked - { - //put_short((short)len); - pending[pendingCount++] = (byte)len; - pending[pendingCount++] = (byte)(len >> 8); - //put_short((short)~len); - pending[pendingCount++] = (byte)~len; - pending[pendingCount++] = (byte)(~len >> 8); - } - - put_bytes(window, buf, len); - } - - internal void flush_block_only(bool eof) - { - _tr_flush_block(block_start >= 0 ? block_start : -1, strstart - block_start, eof); - block_start = strstart; - _codec.flush_pending(); - } - - // Copy without compression as much as possible from the input stream, return - // the current block state. - // This function does not insert new strings in the dictionary since - // uncompressible data is probably not useful. This function is used - // only for the level=0 compression option. - // NOTE: this function should be optimized to avoid extra copying from - // window to pending_buf. - internal BlockState DeflateNone(FlushType flush) - { - // Stored blocks are limited to 0xffff bytes, pending is limited - // to pending_buf_size, and each stored block has a 5 byte header: - - int max_block_size = 0xffff; - int max_start; - - if (max_block_size > pending.Length - 5) - { - max_block_size = pending.Length - 5; - } - - // Copy as much as possible from input to output: - while (true) - { - // Fill the window as much as possible: - if (lookahead <= 1) - { - _fillWindow(); - if (lookahead == 0 && flush == FlushType.None) - return BlockState.NeedMore; - if (lookahead == 0) - break; // flush the current block - } - - strstart += lookahead; - lookahead = 0; - - // Emit a stored block if pending will be full: - max_start = block_start + max_block_size; - if (strstart == 0 || strstart >= max_start) - { - // strstart == 0 is possible when wraparound on 16-bit machine - lookahead = (int)(strstart - max_start); - strstart = (int)max_start; - - flush_block_only(false); - if (_codec.AvailableBytesOut == 0) - return BlockState.NeedMore; - } - - // Flush if we may have to slide, otherwise block_start may become - // negative and the data will be gone: - if (strstart - block_start >= w_size - MIN_LOOKAHEAD) - { - flush_block_only(false); - if (_codec.AvailableBytesOut == 0) - return BlockState.NeedMore; - } - } - - flush_block_only(flush == FlushType.Finish); - if (_codec.AvailableBytesOut == 0) - return (flush == FlushType.Finish) ? BlockState.FinishStarted : BlockState.NeedMore; - - return flush == FlushType.Finish ? BlockState.FinishDone : BlockState.BlockDone; - } - - - // Send a stored block - internal void _tr_stored_block(int buf, int stored_len, bool eof) - { - send_bits((STORED_BLOCK << 1) + (eof ? 1 : 0), 3); // send block type - copy_block(buf, stored_len, true); // with header - } - - // Determine the best encoding for the current block: dynamic trees, static - // trees or store, and output the encoded block to the zip file. - internal void _tr_flush_block(int buf, int stored_len, bool eof) - { - int opt_lenb, static_lenb; // opt_len and static_len in bytes - int max_blindex = 0; // index of last bit length code of non zero freq - - // Build the Huffman trees unless a stored block is forced - if (compressionLevel > 0) - { - // Check if the file is ascii or binary - if (data_type == Z_UNKNOWN) - set_data_type(); - - // Construct the literal and distance trees - treeLiterals.build_tree(this); - - treeDistances.build_tree(this); - - // At this point, opt_len and static_len are the total bit lengths of - // the compressed block data, excluding the tree representations. - - // Build the bit length tree for the above two trees, and get the index - // in bl_order of the last bit length code to send. - max_blindex = build_bl_tree(); - - // Determine the best encoding. Compute first the block length in bytes - opt_lenb = (opt_len + 3 + 7) >> 3; - static_lenb = (static_len + 3 + 7) >> 3; - - if (static_lenb <= opt_lenb) - opt_lenb = static_lenb; - } - else - { - opt_lenb = static_lenb = stored_len + 5; // force a stored block - } - - if (stored_len + 4 <= opt_lenb && buf != -1) - { - // 4: two words for the lengths - // The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - // Otherwise we can't have processed more than WSIZE input bytes since - // the last block flush, because compression would have been - // successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - // transform a block into a stored block. - _tr_stored_block(buf, stored_len, eof); - } - else if (static_lenb == opt_lenb) - { - send_bits((STATIC_TREES << 1) + (eof ? 1 : 0), 3); - send_compressed_block(StaticTree.lengthAndLiteralsTreeCodes, StaticTree.distTreeCodes); - } - else - { - send_bits((DYN_TREES << 1) + (eof ? 1 : 0), 3); - send_all_trees(treeLiterals.max_code + 1, treeDistances.max_code + 1, max_blindex + 1); - send_compressed_block(dyn_ltree, dyn_dtree); - } - - // The above check is made mod 2^32, for files larger than 512 MB - // and uLong implemented on 32 bits. - - _InitializeBlocks(); - - if (eof) - { - bi_windup(); - } - } - - // Fill the window when the lookahead becomes insufficient. - // Updates strstart and lookahead. - // - // IN assertion: lookahead < MIN_LOOKAHEAD - // OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - // At least one byte has been read, or avail_in == 0; reads are - // performed for at least two bytes (required for the zip translate_eol - // option -- not supported here). - private void _fillWindow() - { - int n, m; - int p; - int more; // Amount of free space at the end of the window. - - do - { - more = (window_size - lookahead - strstart); - - // Deal with !@#$% 64K limit: - if (more == 0 && strstart == 0 && lookahead == 0) - { - more = w_size; - } - else if (more == -1) - { - // Very unlikely, but possible on 16 bit machine if strstart == 0 - // and lookahead == 1 (input done one byte at time) - more--; - - // If the window is almost full and there is insufficient lookahead, - // move the upper half to the lower one to make room in the upper half. - } - else if (strstart >= w_size + w_size - MIN_LOOKAHEAD) - { - Array.Copy(window, w_size, window, 0, w_size); - match_start -= w_size; - strstart -= w_size; // we now have strstart >= MAX_DIST - block_start -= w_size; - - // Slide the hash table (could be avoided with 32 bit values - // at the expense of memory usage). We slide even when level == 0 - // to keep the hash table consistent if we switch back to level > 0 - // later. (Using level 0 permanently is not an optimal usage of - // zlib, so we don't care about this pathological case.) - - n = hash_size; - p = n; - do - { - m = (head[--p] & 0xffff); - head[p] = (short)((m >= w_size) ? (m - w_size) : 0); - } - while (--n != 0); - - n = w_size; - p = n; - do - { - m = (prev[--p] & 0xffff); - prev[p] = (short)((m >= w_size) ? (m - w_size) : 0); - // If n is not on any hash chain, prev[n] is garbage but - // its value will never be used. - } - while (--n != 0); - more += w_size; - } - - if (_codec.AvailableBytesIn == 0) - return; - - // If there was no sliding: - // strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - // more == window_size - lookahead - strstart - // => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - // => more >= window_size - 2*WSIZE + 2 - // In the BIG_MEM or MMAP case (not yet supported), - // window_size == input_size + MIN_LOOKAHEAD && - // strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - // Otherwise, window_size == 2*WSIZE so more >= 2. - // If there was sliding, more >= WSIZE. So in all cases, more >= 2. - - n = _codec.read_buf(window, strstart + lookahead, more); - lookahead += n; - - // Initialize the hash value now that we have some input: - if (lookahead >= MIN_MATCH) - { - ins_h = window[strstart] & 0xff; - ins_h = (((ins_h) << hash_shift) ^ (window[strstart + 1] & 0xff)) & hash_mask; - } - // If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - // but this is not important since only literal bytes will be emitted. - } - while (lookahead < MIN_LOOKAHEAD && _codec.AvailableBytesIn != 0); - } - - // Compress as much as possible from the input stream, return the current - // block state. - // This function does not perform lazy evaluation of matches and inserts - // new strings in the dictionary only for unmatched strings or for short - // matches. It is used only for the fast compression options. - internal BlockState DeflateFast(FlushType flush) - { - // short hash_head = 0; // head of the hash chain - int hash_head = 0; // head of the hash chain - bool bflush; // set if current block must be flushed - - while (true) - { - // Make sure that we always have enough lookahead, except - // at the end of the input file. We need MAX_MATCH bytes - // for the next match, plus MIN_MATCH bytes to insert the - // string following the next match. - if (lookahead < MIN_LOOKAHEAD) - { - _fillWindow(); - if (lookahead < MIN_LOOKAHEAD && flush == FlushType.None) - { - return BlockState.NeedMore; - } - if (lookahead == 0) - break; // flush the current block - } - - // Insert the string window[strstart .. strstart+2] in the - // dictionary, and set hash_head to the head of the hash chain: - if (lookahead >= MIN_MATCH) - { - ins_h = (((ins_h) << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; - - // prev[strstart&w_mask]=hash_head=head[ins_h]; - hash_head = (head[ins_h] & 0xffff); - prev[strstart & w_mask] = head[ins_h]; - head[ins_h] = unchecked((short)strstart); - } - - // Find the longest match, discarding those <= prev_length. - // At this point we have always match_length < MIN_MATCH - - if (hash_head != 0L && ((strstart - hash_head) & 0xffff) <= w_size - MIN_LOOKAHEAD) - { - // To simplify the code, we prevent matches with the string - // of window index 0 (in particular we have to avoid a match - // of the string with itself at the start of the input file). - if (compressionStrategy != CompressionStrategy.HuffmanOnly) - { - match_length = longest_match(hash_head); - } - // longest_match() sets match_start - } - if (match_length >= MIN_MATCH) - { - // check_match(strstart, match_start, match_length); - - bflush = _tr_tally(strstart - match_start, match_length - MIN_MATCH); - - lookahead -= match_length; - - // Insert new strings in the hash table only if the match length - // is not too large. This saves time but degrades compression. - if (match_length <= config.MaxLazy && lookahead >= MIN_MATCH) - { - match_length--; // string at strstart already in hash table - do - { - strstart++; - - ins_h = ((ins_h << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; - // prev[strstart&w_mask]=hash_head=head[ins_h]; - hash_head = (head[ins_h] & 0xffff); - prev[strstart & w_mask] = head[ins_h]; - head[ins_h] = unchecked((short)strstart); - - // strstart never exceeds WSIZE-MAX_MATCH, so there are - // always MIN_MATCH bytes ahead. - } - while (--match_length != 0); - strstart++; - } - else - { - strstart += match_length; - match_length = 0; - ins_h = window[strstart] & 0xff; - - ins_h = (((ins_h) << hash_shift) ^ (window[strstart + 1] & 0xff)) & hash_mask; - // If lookahead < MIN_MATCH, ins_h is garbage, but it does not - // matter since it will be recomputed at next deflate call. - } - } - else - { - // No match, output a literal byte - - bflush = _tr_tally(0, window[strstart] & 0xff); - lookahead--; - strstart++; - } - if (bflush) - { - flush_block_only(false); - if (_codec.AvailableBytesOut == 0) - return BlockState.NeedMore; - } - } - - flush_block_only(flush == FlushType.Finish); - if (_codec.AvailableBytesOut == 0) - { - if (flush == FlushType.Finish) - return BlockState.FinishStarted; - else - return BlockState.NeedMore; - } - return flush == FlushType.Finish ? BlockState.FinishDone : BlockState.BlockDone; - } - - // Same as above, but achieves better compression. We use a lazy - // evaluation for matches: a match is finally adopted only if there is - // no better match at the next window position. - internal BlockState DeflateSlow(FlushType flush) - { - // short hash_head = 0; // head of hash chain - int hash_head = 0; // head of hash chain - bool bflush; // set if current block must be flushed - - // Process the input block. - while (true) - { - // Make sure that we always have enough lookahead, except - // at the end of the input file. We need MAX_MATCH bytes - // for the next match, plus MIN_MATCH bytes to insert the - // string following the next match. - - if (lookahead < MIN_LOOKAHEAD) - { - _fillWindow(); - if (lookahead < MIN_LOOKAHEAD && flush == FlushType.None) - return BlockState.NeedMore; - - if (lookahead == 0) - break; // flush the current block - } - - // Insert the string window[strstart .. strstart+2] in the - // dictionary, and set hash_head to the head of the hash chain: - - if (lookahead >= MIN_MATCH) - { - ins_h = (((ins_h) << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; - // prev[strstart&w_mask]=hash_head=head[ins_h]; - hash_head = (head[ins_h] & 0xffff); - prev[strstart & w_mask] = head[ins_h]; - head[ins_h] = unchecked((short)strstart); - } - - // Find the longest match, discarding those <= prev_length. - prev_length = match_length; - prev_match = match_start; - match_length = MIN_MATCH - 1; - - if (hash_head != 0 && prev_length < config.MaxLazy && - ((strstart - hash_head) & 0xffff) <= w_size - MIN_LOOKAHEAD) - { - // To simplify the code, we prevent matches with the string - // of window index 0 (in particular we have to avoid a match - // of the string with itself at the start of the input file). - - if (compressionStrategy != CompressionStrategy.HuffmanOnly) - { - match_length = longest_match(hash_head); - } - // longest_match() sets match_start - - if (match_length <= 5 && (compressionStrategy == CompressionStrategy.Filtered || - (match_length == MIN_MATCH && strstart - match_start > 4096))) - { - - // If prev_match is also MIN_MATCH, match_start is garbage - // but we will ignore the current match anyway. - match_length = MIN_MATCH - 1; - } - } - - // If there was a match at the previous step and the current - // match is not better, output the previous match: - if (prev_length >= MIN_MATCH && match_length <= prev_length) - { - int max_insert = strstart + lookahead - MIN_MATCH; - // Do not insert strings in hash table beyond this. - - // check_match(strstart-1, prev_match, prev_length); - - bflush = _tr_tally(strstart - 1 - prev_match, prev_length - MIN_MATCH); - - // Insert in hash table all strings up to the end of the match. - // strstart-1 and strstart are already inserted. If there is not - // enough lookahead, the last two strings are not inserted in - // the hash table. - lookahead -= (prev_length - 1); - prev_length -= 2; - do - { - if (++strstart <= max_insert) - { - ins_h = (((ins_h) << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; - //prev[strstart&w_mask]=hash_head=head[ins_h]; - hash_head = (head[ins_h] & 0xffff); - prev[strstart & w_mask] = head[ins_h]; - head[ins_h] = unchecked((short)strstart); - } - } - while (--prev_length != 0); - match_available = 0; - match_length = MIN_MATCH - 1; - strstart++; - - if (bflush) - { - flush_block_only(false); - if (_codec.AvailableBytesOut == 0) - return BlockState.NeedMore; - } - } - else if (match_available != 0) - { - - // If there was no match at the previous position, output a - // single literal. If there was a match but the current match - // is longer, truncate the previous match to a single literal. - - bflush = _tr_tally(0, window[strstart - 1] & 0xff); - - if (bflush) - { - flush_block_only(false); - } - strstart++; - lookahead--; - if (_codec.AvailableBytesOut == 0) - return BlockState.NeedMore; - } - else - { - // There is no previous match to compare with, wait for - // the next step to decide. - - match_available = 1; - strstart++; - lookahead--; - } - } - - if (match_available != 0) - { - bflush = _tr_tally(0, window[strstart - 1] & 0xff); - match_available = 0; - } - flush_block_only(flush == FlushType.Finish); - - if (_codec.AvailableBytesOut == 0) - { - if (flush == FlushType.Finish) - return BlockState.FinishStarted; - else - return BlockState.NeedMore; - } - - return flush == FlushType.Finish ? BlockState.FinishDone : BlockState.BlockDone; - } - - - internal int longest_match(int cur_match) - { - int chain_length = config.MaxChainLength; // max hash chain length - int scan = strstart; // current string - int match; // matched string - int len; // length of current match - int best_len = prev_length; // best match length so far - int limit = strstart > (w_size - MIN_LOOKAHEAD) ? strstart - (w_size - MIN_LOOKAHEAD) : 0; - - int niceLength = config.NiceLength; - - // Stop when cur_match becomes <= limit. To simplify the code, - // we prevent matches with the string of window index 0. - - int wmask = w_mask; - - int strend = strstart + MAX_MATCH; - byte scan_end1 = window[scan + best_len - 1]; - byte scan_end = window[scan + best_len]; - - // The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - // It is easy to get rid of this optimization if necessary. - - // Do not waste too much time if we already have a good match: - if (prev_length >= config.GoodLength) - { - chain_length >>= 2; - } - - // Do not look for matches beyond the end of the input. This is necessary - // to make deflate deterministic. - if (niceLength > lookahead) - niceLength = lookahead; - - do - { - match = cur_match; - - // Skip to next match if the match length cannot increase - // or if the match length is less than 2: - if (window[match + best_len] != scan_end || - window[match + best_len - 1] != scan_end1 || - window[match] != window[scan] || - window[++match] != window[scan + 1]) - continue; - - // The check at best_len-1 can be removed because it will be made - // again later. (This heuristic is not always a win.) - // It is not necessary to compare scan[2] and match[2] since they - // are always equal when the other bytes match, given that - // the hash keys are equal and that HASH_BITS >= 8. - scan += 2; match++; - - // We check for insufficient lookahead only every 8th comparison; - // the 256th check will be made at strstart+258. - do - { - } - while (window[++scan] == window[++match] && - window[++scan] == window[++match] && - window[++scan] == window[++match] && - window[++scan] == window[++match] && - window[++scan] == window[++match] && - window[++scan] == window[++match] && - window[++scan] == window[++match] && - window[++scan] == window[++match] && scan < strend); - - len = MAX_MATCH - (int)(strend - scan); - scan = strend - MAX_MATCH; - - if (len > best_len) - { - match_start = cur_match; - best_len = len; - if (len >= niceLength) - break; - scan_end1 = window[scan + best_len - 1]; - scan_end = window[scan + best_len]; - } - } - while ((cur_match = (prev[cur_match & wmask] & 0xffff)) > limit && --chain_length != 0); - - if (best_len <= lookahead) - return best_len; - return lookahead; - } - - - private bool Rfc1950BytesEmitted = false; - private bool _WantRfc1950HeaderBytes = true; - internal bool WantRfc1950HeaderBytes - { - get { return _WantRfc1950HeaderBytes; } - set { _WantRfc1950HeaderBytes = value; } - } - - - internal int Initialize(ZlibCodec codec, CompressionLevel level) - { - return Initialize(codec, level, ZlibConstants.WindowBitsMax); - } - - internal int Initialize(ZlibCodec codec, CompressionLevel level, int bits) - { - return Initialize(codec, level, bits, MEM_LEVEL_DEFAULT, CompressionStrategy.Default); - } - - internal int Initialize(ZlibCodec codec, CompressionLevel level, int bits, CompressionStrategy compressionStrategy) - { - return Initialize(codec, level, bits, MEM_LEVEL_DEFAULT, compressionStrategy); - } - - internal int Initialize(ZlibCodec codec, CompressionLevel level, int windowBits, int memLevel, CompressionStrategy strategy) - { - _codec = codec; - _codec.Message = null; - - // validation - if (windowBits < 9 || windowBits > 15) - throw new ZlibException("windowBits must be in the range 9..15."); - - if (memLevel < 1 || memLevel > MEM_LEVEL_MAX) - throw new ZlibException(String.Format("memLevel must be in the range 1.. {0}", MEM_LEVEL_MAX)); - - _codec.dstate = this; - - w_bits = windowBits; - w_size = 1 << w_bits; - w_mask = w_size - 1; - - hash_bits = memLevel + 7; - hash_size = 1 << hash_bits; - hash_mask = hash_size - 1; - hash_shift = ((hash_bits + MIN_MATCH - 1) / MIN_MATCH); - - window = new byte[w_size * 2]; - prev = new short[w_size]; - head = new short[hash_size]; - - // for memLevel==8, this will be 16384, 16k - lit_bufsize = 1 << (memLevel + 6); - - // Use a single array as the buffer for data pending compression, - // the output distance codes, and the output length codes (aka tree). - // orig comment: This works just fine since the average - // output size for (length,distance) codes is <= 24 bits. - pending = new byte[lit_bufsize * 4]; - _distanceOffset = lit_bufsize; - _lengthOffset = (1 + 2) * lit_bufsize; - - // So, for memLevel 8, the length of the pending buffer is 65536. 64k. - // The first 16k are pending bytes. - // The middle slice, of 32k, is used for distance codes. - // The final 16k are length codes. - - this.compressionLevel = level; - this.compressionStrategy = strategy; - - Reset(); - return ZlibConstants.Z_OK; - } - - - internal void Reset() - { - _codec.TotalBytesIn = _codec.TotalBytesOut = 0; - _codec.Message = null; - //strm.data_type = Z_UNKNOWN; - - pendingCount = 0; - nextPending = 0; - - Rfc1950BytesEmitted = false; - - status = (WantRfc1950HeaderBytes) ? INIT_STATE : BUSY_STATE; - _codec._Adler32 = Adler.Adler32(0, null, 0, 0); - - last_flush = (int)FlushType.None; - - _InitializeTreeData(); - _InitializeLazyMatch(); - } - - - internal int End() - { - if (status != INIT_STATE && status != BUSY_STATE && status != FINISH_STATE) - { - return ZlibConstants.Z_STREAM_ERROR; - } - // Deallocate in reverse order of allocations: - pending = null; - head = null; - prev = null; - window = null; - // free - // dstate=null; - return status == BUSY_STATE ? ZlibConstants.Z_DATA_ERROR : ZlibConstants.Z_OK; - } - - - private void SetDeflater() - { - switch (config.Flavor) - { - case DeflateFlavor.Store: - DeflateFunction = DeflateNone; - break; - case DeflateFlavor.Fast: - DeflateFunction = DeflateFast; - break; - case DeflateFlavor.Slow: - DeflateFunction = DeflateSlow; - break; - } - } - - - internal int SetParams(CompressionLevel level, CompressionStrategy strategy) - { - int result = ZlibConstants.Z_OK; - - if (compressionLevel != level) - { - Config newConfig = Config.Lookup(level); - - // change in the deflate flavor (Fast vs slow vs none)? - if (newConfig.Flavor != config.Flavor && _codec.TotalBytesIn != 0) - { - // Flush the last buffer: - result = _codec.Deflate(FlushType.Partial); - } - - compressionLevel = level; - config = newConfig; - SetDeflater(); - } - - // no need to flush with change in strategy? Really? - compressionStrategy = strategy; - - return result; - } - - - internal int SetDictionary(byte[] dictionary) - { - int length = dictionary.Length; - int index = 0; - - if (dictionary == null || status != INIT_STATE) - throw new ZlibException("Stream error."); - - _codec._Adler32 = Adler.Adler32(_codec._Adler32, dictionary, 0, dictionary.Length); - - if (length < MIN_MATCH) - return ZlibConstants.Z_OK; - if (length > w_size - MIN_LOOKAHEAD) - { - length = w_size - MIN_LOOKAHEAD; - index = dictionary.Length - length; // use the tail of the dictionary - } - Array.Copy(dictionary, index, window, 0, length); - strstart = length; - block_start = length; - - // Insert all strings in the hash table (except for the last two bytes). - // s->lookahead stays null, so s->ins_h will be recomputed at the next - // call of fill_window. - - ins_h = window[0] & 0xff; - ins_h = (((ins_h) << hash_shift) ^ (window[1] & 0xff)) & hash_mask; - - for (int n = 0; n <= length - MIN_MATCH; n++) - { - ins_h = (((ins_h) << hash_shift) ^ (window[(n) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; - prev[n & w_mask] = head[ins_h]; - head[ins_h] = (short)n; - } - return ZlibConstants.Z_OK; - } - - - - internal int Deflate(FlushType flush) - { - int old_flush; - - if (_codec.OutputBuffer == null || - (_codec.InputBuffer == null && _codec.AvailableBytesIn != 0) || - (status == FINISH_STATE && flush != FlushType.Finish)) - { - _codec.Message = _ErrorMessage[ZlibConstants.Z_NEED_DICT - (ZlibConstants.Z_STREAM_ERROR)]; - throw new ZlibException(String.Format("Something is fishy. [{0}]", _codec.Message)); - } - if (_codec.AvailableBytesOut == 0) - { - _codec.Message = _ErrorMessage[ZlibConstants.Z_NEED_DICT - (ZlibConstants.Z_BUF_ERROR)]; - throw new ZlibException("OutputBuffer is full (AvailableBytesOut == 0)"); - } - - old_flush = last_flush; - last_flush = (int)flush; - - // Write the zlib (rfc1950) header bytes - if (status == INIT_STATE) - { - int header = (Z_DEFLATED + ((w_bits - 8) << 4)) << 8; - int level_flags = (((int)compressionLevel - 1) & 0xff) >> 1; - - if (level_flags > 3) - level_flags = 3; - header |= (level_flags << 6); - if (strstart != 0) - header |= PRESET_DICT; - header += 31 - (header % 31); - - status = BUSY_STATE; - //putShortMSB(header); - unchecked - { - pending[pendingCount++] = (byte)(header >> 8); - pending[pendingCount++] = (byte)header; - } - // Save the adler32 of the preset dictionary: - if (strstart != 0) - { - pending[pendingCount++] = (byte)((_codec._Adler32 & 0xFF000000) >> 24); - pending[pendingCount++] = (byte)((_codec._Adler32 & 0x00FF0000) >> 16); - pending[pendingCount++] = (byte)((_codec._Adler32 & 0x0000FF00) >> 8); - pending[pendingCount++] = (byte)(_codec._Adler32 & 0x000000FF); - } - _codec._Adler32 = Adler.Adler32(0, null, 0, 0); - } - - // Flush as much pending output as possible - if (pendingCount != 0) - { - _codec.flush_pending(); - if (_codec.AvailableBytesOut == 0) - { - //System.out.println(" avail_out==0"); - // Since avail_out is 0, deflate will be called again with - // more output space, but possibly with both pending and - // avail_in equal to zero. There won't be anything to do, - // but this is not an error situation so make sure we - // return OK instead of BUF_ERROR at next call of deflate: - last_flush = -1; - return ZlibConstants.Z_OK; - } - - // Make sure there is something to do and avoid duplicate consecutive - // flushes. For repeated and useless calls with Z_FINISH, we keep - // returning Z_STREAM_END instead of Z_BUFF_ERROR. - } - else if (_codec.AvailableBytesIn == 0 && - (int)flush <= old_flush && - flush != FlushType.Finish) - { - // workitem 8557 - // - // Not sure why this needs to be an error. pendingCount == 0, which - // means there's nothing to deflate. And the caller has not asked - // for a FlushType.Finish, but... that seems very non-fatal. We - // can just say "OK" and do nothing. - - // _codec.Message = z_errmsg[ZlibConstants.Z_NEED_DICT - (ZlibConstants.Z_BUF_ERROR)]; - // throw new ZlibException("AvailableBytesIn == 0 && flush<=old_flush && flush != FlushType.Finish"); - - return ZlibConstants.Z_OK; - } - - // User must not provide more input after the first FINISH: - if (status == FINISH_STATE && _codec.AvailableBytesIn != 0) - { - _codec.Message = _ErrorMessage[ZlibConstants.Z_NEED_DICT - (ZlibConstants.Z_BUF_ERROR)]; - throw new ZlibException("status == FINISH_STATE && _codec.AvailableBytesIn != 0"); - } - - // Start a new block or continue the current one. - if (_codec.AvailableBytesIn != 0 || lookahead != 0 || (flush != FlushType.None && status != FINISH_STATE)) - { - BlockState bstate = DeflateFunction(flush); - - if (bstate == BlockState.FinishStarted || bstate == BlockState.FinishDone) - { - status = FINISH_STATE; - } - if (bstate == BlockState.NeedMore || bstate == BlockState.FinishStarted) - { - if (_codec.AvailableBytesOut == 0) - { - last_flush = -1; // avoid BUF_ERROR next call, see above - } - return ZlibConstants.Z_OK; - // If flush != Z_NO_FLUSH && avail_out == 0, the next call - // of deflate should use the same flush parameter to make sure - // that the flush is complete. So we don't have to output an - // empty block here, this will be done at next call. This also - // ensures that for a very small output buffer, we emit at most - // one empty block. - } - - if (bstate == BlockState.BlockDone) - { - if (flush == FlushType.Partial) - { - _tr_align(); - } - else - { - // FlushType.Full or FlushType.Sync - _tr_stored_block(0, 0, false); - // For a full flush, this empty block will be recognized - // as a special marker by inflate_sync(). - if (flush == FlushType.Full) - { - // clear hash (forget the history) - for (int i = 0; i < hash_size; i++) - head[i] = 0; - } - } - _codec.flush_pending(); - if (_codec.AvailableBytesOut == 0) - { - last_flush = -1; // avoid BUF_ERROR at next call, see above - return ZlibConstants.Z_OK; - } - } - } - - if (flush != FlushType.Finish) - return ZlibConstants.Z_OK; - - if (!WantRfc1950HeaderBytes || Rfc1950BytesEmitted) - return ZlibConstants.Z_STREAM_END; - - // Write the zlib trailer (adler32) - pending[pendingCount++] = (byte)((_codec._Adler32 & 0xFF000000) >> 24); - pending[pendingCount++] = (byte)((_codec._Adler32 & 0x00FF0000) >> 16); - pending[pendingCount++] = (byte)((_codec._Adler32 & 0x0000FF00) >> 8); - pending[pendingCount++] = (byte)(_codec._Adler32 & 0x000000FF); - //putShortMSB((int)(SharedUtils.URShift(_codec._Adler32, 16))); - //putShortMSB((int)(_codec._Adler32 & 0xffff)); - - _codec.flush_pending(); - - // If avail_out is zero, the application will call deflate again - // to flush the rest. - - Rfc1950BytesEmitted = true; // write the trailer only once! - - return pendingCount != 0 ? ZlibConstants.Z_OK : ZlibConstants.Z_STREAM_END; - } - - } -} diff --git a/DebugTools/MinecraftClientProxy/Compression/GZipStream.cs b/DebugTools/MinecraftClientProxy/Compression/GZipStream.cs deleted file mode 100644 index 7f6b9248c5..0000000000 --- a/DebugTools/MinecraftClientProxy/Compression/GZipStream.cs +++ /dev/null @@ -1,1033 +0,0 @@ -// GZipStream.cs -// ------------------------------------------------------------------ -// -// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation. -// All rights reserved. -// -// This code module is part of DotNetZip, a zipfile class library. -// -// ------------------------------------------------------------------ -// -// This code is licensed under the Microsoft Public License. -// See the file License.txt for the license details. -// More info on: http://dotnetzip.codeplex.com -// -// ------------------------------------------------------------------ -// -// last saved (in emacs): -// Time-stamp: <2011-August-08 18:14:39> -// -// ------------------------------------------------------------------ -// -// This module defines the GZipStream class, which can be used as a replacement for -// the System.IO.Compression.GZipStream class in the .NET BCL. NB: The design is not -// completely OO clean: there is some intelligence in the ZlibBaseStream that reads the -// GZip header. -// -// ------------------------------------------------------------------ - - -using System; -using System.IO; - -namespace Ionic.Zlib -{ - /// - /// A class for compressing and decompressing GZIP streams. - /// - /// - /// - /// - /// The GZipStream is a Decorator on a - /// . It adds GZIP compression or decompression to any - /// stream. - /// - /// - /// - /// Like the System.IO.Compression.GZipStream in the .NET Base Class Library, the - /// Ionic.Zlib.GZipStream can compress while writing, or decompress while - /// reading, but not vice versa. The compression method used is GZIP, which is - /// documented in IETF RFC - /// 1952, "GZIP file format specification version 4.3". - /// - /// - /// A GZipStream can be used to decompress data (through Read()) or - /// to compress data (through Write()), but not both. - /// - /// - /// - /// If you wish to use the GZipStream to compress data, you must wrap it - /// around a write-able stream. As you call Write() on the GZipStream, the - /// data will be compressed into the GZIP format. If you want to decompress data, - /// you must wrap the GZipStream around a readable stream that contains an - /// IETF RFC 1952-compliant stream. The data will be decompressed as you call - /// Read() on the GZipStream. - /// - /// - /// - /// Though the GZIP format allows data from multiple files to be concatenated - /// together, this stream handles only a single segment of GZIP format, typically - /// representing a single file. - /// - /// - /// - /// This class is similar to and . - /// ZlibStream handles RFC1950-compliant streams. - /// handles RFC1951-compliant streams. This class handles RFC1952-compliant streams. - /// - /// - /// - /// - /// - /// - public class GZipStream : System.IO.Stream - { - // GZip format - // source: http://tools.ietf.org/html/rfc1952 - // - // header id: 2 bytes 1F 8B - // compress method 1 byte 8= DEFLATE (none other supported) - // flag 1 byte bitfield (See below) - // mtime 4 bytes time_t (seconds since jan 1, 1970 UTC of the file. - // xflg 1 byte 2 = max compress used , 4 = max speed (can be ignored) - // OS 1 byte OS for originating archive. set to 0xFF in compression. - // extra field length 2 bytes optional - only if FEXTRA is set. - // extra field varies - // filename varies optional - if FNAME is set. zero terminated. ISO-8859-1. - // file comment varies optional - if FCOMMENT is set. zero terminated. ISO-8859-1. - // crc16 1 byte optional - present only if FHCRC bit is set - // compressed data varies - // CRC32 4 bytes - // isize 4 bytes data size modulo 2^32 - // - // FLG (FLaGs) - // bit 0 FTEXT - indicates file is ASCII text (can be safely ignored) - // bit 1 FHCRC - there is a CRC16 for the header immediately following the header - // bit 2 FEXTRA - extra fields are present - // bit 3 FNAME - the zero-terminated filename is present. encoding; ISO-8859-1. - // bit 4 FCOMMENT - a zero-terminated file comment is present. encoding: ISO-8859-1 - // bit 5 reserved - // bit 6 reserved - // bit 7 reserved - // - // On consumption: - // Extra field is a bunch of nonsense and can be safely ignored. - // Header CRC and OS, likewise. - // - // on generation: - // all optional fields get 0, except for the OS, which gets 255. - // - - - - /// - /// The comment on the GZIP stream. - /// - /// - /// - /// - /// The GZIP format allows for each file to optionally have an associated - /// comment stored with the file. The comment is encoded with the ISO-8859-1 - /// code page. To include a comment in a GZIP stream you create, set this - /// property before calling Write() for the first time on the - /// GZipStream. - /// - /// - /// - /// When using GZipStream to decompress, you can retrieve this property - /// after the first call to Read(). If no comment has been set in the - /// GZIP bytestream, the Comment property will return null - /// (Nothing in VB). - /// - /// - public String Comment - { - get - { - return _Comment; - } - set - { - if (_disposed) throw new ObjectDisposedException("GZipStream"); - _Comment = value; - } - } - - /// - /// The FileName for the GZIP stream. - /// - /// - /// - /// - /// - /// The GZIP format optionally allows each file to have an associated - /// filename. When compressing data (through Write()), set this - /// FileName before calling Write() the first time on the GZipStream. - /// The actual filename is encoded into the GZIP bytestream with the - /// ISO-8859-1 code page, according to RFC 1952. It is the application's - /// responsibility to insure that the FileName can be encoded and decoded - /// correctly with this code page. - /// - /// - /// - /// When decompressing (through Read()), you can retrieve this value - /// any time after the first Read(). In the case where there was no filename - /// encoded into the GZIP bytestream, the property will return null (Nothing - /// in VB). - /// - /// - public String FileName - { - get { return _FileName; } - set - { - if (_disposed) throw new ObjectDisposedException("GZipStream"); - _FileName = value; - if (_FileName == null) return; - if (_FileName.IndexOf("/") != -1) - { - _FileName = _FileName.Replace("/", "\\"); - } - if (_FileName.EndsWith("\\")) - throw new Exception("Illegal filename"); - if (_FileName.IndexOf("\\") != -1) - { - // trim any leading path - _FileName = Path.GetFileName(_FileName); - } - } - } - - /// - /// The last modified time for the GZIP stream. - /// - /// - /// - /// GZIP allows the storage of a last modified time with each GZIP entry. - /// When compressing data, you can set this before the first call to - /// Write(). When decompressing, you can retrieve this value any time - /// after the first call to Read(). - /// - public DateTime? LastModified; - - /// - /// The CRC on the GZIP stream. - /// - /// - /// This is used for internal error checking. You probably don't need to look at this property. - /// - public int Crc32 { get { return _Crc32; } } - - private int _headerByteCount; - internal ZlibBaseStream _baseStream; - bool _disposed; - bool _firstReadDone; - string _FileName; - string _Comment; - int _Crc32; - - - /// - /// Create a GZipStream using the specified CompressionMode. - /// - /// - /// - /// - /// When mode is CompressionMode.Compress, the GZipStream will use the - /// default compression level. - /// - /// - /// - /// As noted in the class documentation, the CompressionMode (Compress - /// or Decompress) also establishes the "direction" of the stream. A - /// GZipStream with CompressionMode.Compress works only through - /// Write(). A GZipStream with - /// CompressionMode.Decompress works only through Read(). - /// - /// - /// - /// - /// - /// This example shows how to use a GZipStream to compress data. - /// - /// using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) - /// { - /// using (var raw = System.IO.File.Create(outputFile)) - /// { - /// using (Stream compressor = new GZipStream(raw, CompressionMode.Compress)) - /// { - /// byte[] buffer = new byte[WORKING_BUFFER_SIZE]; - /// int n; - /// while ((n= input.Read(buffer, 0, buffer.Length)) != 0) - /// { - /// compressor.Write(buffer, 0, n); - /// } - /// } - /// } - /// } - /// - /// - /// Dim outputFile As String = (fileToCompress & ".compressed") - /// Using input As Stream = File.OpenRead(fileToCompress) - /// Using raw As FileStream = File.Create(outputFile) - /// Using compressor As Stream = New GZipStream(raw, CompressionMode.Compress) - /// Dim buffer As Byte() = New Byte(4096) {} - /// Dim n As Integer = -1 - /// Do While (n <> 0) - /// If (n > 0) Then - /// compressor.Write(buffer, 0, n) - /// End If - /// n = input.Read(buffer, 0, buffer.Length) - /// Loop - /// End Using - /// End Using - /// End Using - /// - /// - /// - /// - /// This example shows how to use a GZipStream to uncompress a file. - /// - /// private void GunZipFile(string filename) - /// { - /// if (!filename.EndsWith(".gz)) - /// throw new ArgumentException("filename"); - /// var DecompressedFile = filename.Substring(0,filename.Length-3); - /// byte[] working = new byte[WORKING_BUFFER_SIZE]; - /// int n= 1; - /// using (System.IO.Stream input = System.IO.File.OpenRead(filename)) - /// { - /// using (Stream decompressor= new Ionic.Zlib.GZipStream(input, CompressionMode.Decompress, true)) - /// { - /// using (var output = System.IO.File.Create(DecompressedFile)) - /// { - /// while (n !=0) - /// { - /// n= decompressor.Read(working, 0, working.Length); - /// if (n > 0) - /// { - /// output.Write(working, 0, n); - /// } - /// } - /// } - /// } - /// } - /// } - /// - /// - /// - /// Private Sub GunZipFile(ByVal filename as String) - /// If Not (filename.EndsWith(".gz)) Then - /// Throw New ArgumentException("filename") - /// End If - /// Dim DecompressedFile as String = filename.Substring(0,filename.Length-3) - /// Dim working(WORKING_BUFFER_SIZE) as Byte - /// Dim n As Integer = 1 - /// Using input As Stream = File.OpenRead(filename) - /// Using decompressor As Stream = new Ionic.Zlib.GZipStream(input, CompressionMode.Decompress, True) - /// Using output As Stream = File.Create(UncompressedFile) - /// Do - /// n= decompressor.Read(working, 0, working.Length) - /// If n > 0 Then - /// output.Write(working, 0, n) - /// End IF - /// Loop While (n > 0) - /// End Using - /// End Using - /// End Using - /// End Sub - /// - /// - /// - /// The stream which will be read or written. - /// Indicates whether the GZipStream will compress or decompress. - public GZipStream(Stream stream, CompressionMode mode) - : this(stream, mode, CompressionLevel.Default, false) - { - } - - /// - /// Create a GZipStream using the specified CompressionMode and - /// the specified CompressionLevel. - /// - /// - /// - /// - /// The CompressionMode (Compress or Decompress) also establishes the - /// "direction" of the stream. A GZipStream with - /// CompressionMode.Compress works only through Write(). A - /// GZipStream with CompressionMode.Decompress works only - /// through Read(). - /// - /// - /// - /// - /// - /// - /// This example shows how to use a GZipStream to compress a file into a .gz file. - /// - /// - /// using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) - /// { - /// using (var raw = System.IO.File.Create(fileToCompress + ".gz")) - /// { - /// using (Stream compressor = new GZipStream(raw, - /// CompressionMode.Compress, - /// CompressionLevel.BestCompression)) - /// { - /// byte[] buffer = new byte[WORKING_BUFFER_SIZE]; - /// int n; - /// while ((n= input.Read(buffer, 0, buffer.Length)) != 0) - /// { - /// compressor.Write(buffer, 0, n); - /// } - /// } - /// } - /// } - /// - /// - /// - /// Using input As Stream = File.OpenRead(fileToCompress) - /// Using raw As FileStream = File.Create(fileToCompress & ".gz") - /// Using compressor As Stream = New GZipStream(raw, CompressionMode.Compress, CompressionLevel.BestCompression) - /// Dim buffer As Byte() = New Byte(4096) {} - /// Dim n As Integer = -1 - /// Do While (n <> 0) - /// If (n > 0) Then - /// compressor.Write(buffer, 0, n) - /// End If - /// n = input.Read(buffer, 0, buffer.Length) - /// Loop - /// End Using - /// End Using - /// End Using - /// - /// - /// The stream to be read or written while deflating or inflating. - /// Indicates whether the GZipStream will compress or decompress. - /// A tuning knob to trade speed for effectiveness. - public GZipStream(Stream stream, CompressionMode mode, CompressionLevel level) - : this(stream, mode, level, false) - { - } - - /// - /// Create a GZipStream using the specified CompressionMode, and - /// explicitly specify whether the stream should be left open after Deflation - /// or Inflation. - /// - /// - /// - /// - /// This constructor allows the application to request that the captive stream - /// remain open after the deflation or inflation occurs. By default, after - /// Close() is called on the stream, the captive stream is also - /// closed. In some cases this is not desired, for example if the stream is a - /// memory stream that will be re-read after compressed data has been written - /// to it. Specify true for the parameter to leave - /// the stream open. - /// - /// - /// - /// The (Compress or Decompress) also - /// establishes the "direction" of the stream. A GZipStream with - /// CompressionMode.Compress works only through Write(). A GZipStream - /// with CompressionMode.Decompress works only through Read(). - /// - /// - /// - /// The GZipStream will use the default compression level. If you want - /// to specify the compression level, see . - /// - /// - /// - /// See the other overloads of this constructor for example code. - /// - /// - /// - /// - /// - /// The stream which will be read or written. This is called the "captive" - /// stream in other places in this documentation. - /// - /// - /// Indicates whether the GZipStream will compress or decompress. - /// - /// - /// - /// true if the application would like the base stream to remain open after - /// inflation/deflation. - /// - public GZipStream(Stream stream, CompressionMode mode, bool leaveOpen) - : this(stream, mode, CompressionLevel.Default, leaveOpen) - { - } - - /// - /// Create a GZipStream using the specified CompressionMode and the - /// specified CompressionLevel, and explicitly specify whether the - /// stream should be left open after Deflation or Inflation. - /// - /// - /// - /// - /// - /// This constructor allows the application to request that the captive stream - /// remain open after the deflation or inflation occurs. By default, after - /// Close() is called on the stream, the captive stream is also - /// closed. In some cases this is not desired, for example if the stream is a - /// memory stream that will be re-read after compressed data has been written - /// to it. Specify true for the parameter to - /// leave the stream open. - /// - /// - /// - /// As noted in the class documentation, the CompressionMode (Compress - /// or Decompress) also establishes the "direction" of the stream. A - /// GZipStream with CompressionMode.Compress works only through - /// Write(). A GZipStream with CompressionMode.Decompress works only - /// through Read(). - /// - /// - /// - /// - /// - /// This example shows how to use a GZipStream to compress data. - /// - /// using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) - /// { - /// using (var raw = System.IO.File.Create(outputFile)) - /// { - /// using (Stream compressor = new GZipStream(raw, CompressionMode.Compress, CompressionLevel.BestCompression, true)) - /// { - /// byte[] buffer = new byte[WORKING_BUFFER_SIZE]; - /// int n; - /// while ((n= input.Read(buffer, 0, buffer.Length)) != 0) - /// { - /// compressor.Write(buffer, 0, n); - /// } - /// } - /// } - /// } - /// - /// - /// Dim outputFile As String = (fileToCompress & ".compressed") - /// Using input As Stream = File.OpenRead(fileToCompress) - /// Using raw As FileStream = File.Create(outputFile) - /// Using compressor As Stream = New GZipStream(raw, CompressionMode.Compress, CompressionLevel.BestCompression, True) - /// Dim buffer As Byte() = New Byte(4096) {} - /// Dim n As Integer = -1 - /// Do While (n <> 0) - /// If (n > 0) Then - /// compressor.Write(buffer, 0, n) - /// End If - /// n = input.Read(buffer, 0, buffer.Length) - /// Loop - /// End Using - /// End Using - /// End Using - /// - /// - /// The stream which will be read or written. - /// Indicates whether the GZipStream will compress or decompress. - /// true if the application would like the stream to remain open after inflation/deflation. - /// A tuning knob to trade speed for effectiveness. - public GZipStream(Stream stream, CompressionMode mode, CompressionLevel level, bool leaveOpen) - { - _baseStream = new ZlibBaseStream(stream, mode, level, ZlibStreamFlavor.GZIP, leaveOpen); - } - - #region Zlib properties - - /// - /// This property sets the flush behavior on the stream. - /// - virtual public FlushType FlushMode - { - get { return (this._baseStream._flushMode); } - set { - if (_disposed) throw new ObjectDisposedException("GZipStream"); - this._baseStream._flushMode = value; - } - } - - /// - /// The size of the working buffer for the compression codec. - /// - /// - /// - /// - /// The working buffer is used for all stream operations. The default size is - /// 1024 bytes. The minimum size is 128 bytes. You may get better performance - /// with a larger buffer. Then again, you might not. You would have to test - /// it. - /// - /// - /// - /// Set this before the first call to Read() or Write() on the - /// stream. If you try to set it afterwards, it will throw. - /// - /// - public int BufferSize - { - get - { - return this._baseStream._bufferSize; - } - set - { - if (_disposed) throw new ObjectDisposedException("GZipStream"); - if (this._baseStream._workingBuffer != null) - throw new ZlibException("The working buffer is already set."); - if (value < ZlibConstants.WorkingBufferSizeMin) - throw new ZlibException(String.Format("Don't be silly. {0} bytes?? Use a bigger buffer, at least {1}.", value, ZlibConstants.WorkingBufferSizeMin)); - this._baseStream._bufferSize = value; - } - } - - - /// Returns the total number of bytes input so far. - virtual public long TotalIn - { - get - { - return this._baseStream._z.TotalBytesIn; - } - } - - /// Returns the total number of bytes output so far. - virtual public long TotalOut - { - get - { - return this._baseStream._z.TotalBytesOut; - } - } - - #endregion - - #region Stream methods - - /// - /// Dispose the stream. - /// - /// - /// - /// This may or may not result in a Close() call on the captive - /// stream. See the constructors that have a leaveOpen parameter - /// for more information. - /// - /// - /// This method may be invoked in two distinct scenarios. If disposing - /// == true, the method has been called directly or indirectly by a - /// user's code, for example via the public Dispose() method. In this - /// case, both managed and unmanaged resources can be referenced and - /// disposed. If disposing == false, the method has been called by the - /// runtime from inside the object finalizer and this method should not - /// reference other objects; in that case only unmanaged resources must - /// be referenced or disposed. - /// - /// - /// - /// indicates whether the Dispose method was invoked by user code. - /// - protected override void Dispose(bool disposing) - { - try - { - if (!_disposed) - { - if (disposing && (this._baseStream != null)) - { - this._baseStream.Close(); - this._Crc32 = _baseStream.Crc32; - } - _disposed = true; - } - } - finally - { - base.Dispose(disposing); - } - } - - - /// - /// Indicates whether the stream can be read. - /// - /// - /// The return value depends on whether the captive stream supports reading. - /// - public override bool CanRead - { - get - { - if (_disposed) throw new ObjectDisposedException("GZipStream"); - return _baseStream._stream.CanRead; - } - } - - /// - /// Indicates whether the stream supports Seek operations. - /// - /// - /// Always returns false. - /// - public override bool CanSeek - { - get { return false; } - } - - - /// - /// Indicates whether the stream can be written. - /// - /// - /// The return value depends on whether the captive stream supports writing. - /// - public override bool CanWrite - { - get - { - if (_disposed) throw new ObjectDisposedException("GZipStream"); - return _baseStream._stream.CanWrite; - } - } - - /// - /// Flush the stream. - /// - public override void Flush() - { - if (_disposed) throw new ObjectDisposedException("GZipStream"); - _baseStream.Flush(); - } - - /// - /// Reading this property always throws a . - /// - public override long Length - { - get { throw new NotImplementedException(); } - } - - /// - /// The position of the stream pointer. - /// - /// - /// - /// Setting this property always throws a . Reading will return the total bytes - /// written out, if used in writing, or the total bytes read in, if used in - /// reading. The count may refer to compressed bytes or uncompressed bytes, - /// depending on how you've used the stream. - /// - public override long Position - { - get - { - if (this._baseStream._streamMode == Ionic.Zlib.ZlibBaseStream.StreamMode.Writer) - return this._baseStream._z.TotalBytesOut + _headerByteCount; - if (this._baseStream._streamMode == Ionic.Zlib.ZlibBaseStream.StreamMode.Reader) - return this._baseStream._z.TotalBytesIn + this._baseStream._gzipHeaderByteCount; - return 0; - } - - set { throw new NotImplementedException(); } - } - - /// - /// Read and decompress data from the source stream. - /// - /// - /// - /// With a GZipStream, decompression is done through reading. - /// - /// - /// - /// - /// byte[] working = new byte[WORKING_BUFFER_SIZE]; - /// using (System.IO.Stream input = System.IO.File.OpenRead(_CompressedFile)) - /// { - /// using (Stream decompressor= new Ionic.Zlib.GZipStream(input, CompressionMode.Decompress, true)) - /// { - /// using (var output = System.IO.File.Create(_DecompressedFile)) - /// { - /// int n; - /// while ((n= decompressor.Read(working, 0, working.Length)) !=0) - /// { - /// output.Write(working, 0, n); - /// } - /// } - /// } - /// } - /// - /// - /// The buffer into which the decompressed data should be placed. - /// the offset within that data array to put the first byte read. - /// the number of bytes to read. - /// the number of bytes actually read - public override int Read(byte[] buffer, int offset, int count) - { - if (_disposed) throw new ObjectDisposedException("GZipStream"); - int n = _baseStream.Read(buffer, offset, count); - - // Console.WriteLine("GZipStream::Read(buffer, off({0}), c({1}) = {2}", offset, count, n); - // Console.WriteLine( Util.FormatByteArray(buffer, offset, n) ); - - if (!_firstReadDone) - { - _firstReadDone = true; - FileName = _baseStream._GzipFileName; - Comment = _baseStream._GzipComment; - } - return n; - } - - - - /// - /// Calling this method always throws a . - /// - /// irrelevant; it will always throw! - /// irrelevant; it will always throw! - /// irrelevant! - public override long Seek(long offset, SeekOrigin origin) - { - throw new NotImplementedException(); - } - - /// - /// Calling this method always throws a . - /// - /// irrelevant; this method will always throw! - public override void SetLength(long value) - { - throw new NotImplementedException(); - } - - /// - /// Write data to the stream. - /// - /// - /// - /// - /// If you wish to use the GZipStream to compress data while writing, - /// you can create a GZipStream with CompressionMode.Compress, and a - /// writable output stream. Then call Write() on that GZipStream, - /// providing uncompressed data as input. The data sent to the output stream - /// will be the compressed form of the data written. - /// - /// - /// - /// A GZipStream can be used for Read() or Write(), but not - /// both. Writing implies compression. Reading implies decompression. - /// - /// - /// - /// The buffer holding data to write to the stream. - /// the offset within that data array to find the first byte to write. - /// the number of bytes to write. - public override void Write(byte[] buffer, int offset, int count) - { - if (_disposed) throw new ObjectDisposedException("GZipStream"); - if (_baseStream._streamMode == Ionic.Zlib.ZlibBaseStream.StreamMode.Undefined) - { - //Console.WriteLine("GZipStream: First write"); - if (_baseStream._wantCompress) - { - // first write in compression, therefore, emit the GZIP header - _headerByteCount = EmitHeader(); - } - else - { - throw new InvalidOperationException(); - } - } - - _baseStream.Write(buffer, offset, count); - } - #endregion - - - internal static readonly System.DateTime _unixEpoch = new System.DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); -#if SILVERLIGHT || NETCF - internal static readonly System.Text.Encoding iso8859dash1 = new Ionic.Encoding.Iso8859Dash1Encoding(); -#else - internal static readonly System.Text.Encoding iso8859dash1 = System.Text.Encoding.GetEncoding("iso-8859-1"); -#endif - - - private int EmitHeader() - { - byte[] commentBytes = (Comment == null) ? null : iso8859dash1.GetBytes(Comment); - byte[] filenameBytes = (FileName == null) ? null : iso8859dash1.GetBytes(FileName); - - int cbLength = (Comment == null) ? 0 : commentBytes.Length + 1; - int fnLength = (FileName == null) ? 0 : filenameBytes.Length + 1; - - int bufferLength = 10 + cbLength + fnLength; - byte[] header = new byte[bufferLength]; - int i = 0; - // ID - header[i++] = 0x1F; - header[i++] = 0x8B; - - // compression method - header[i++] = 8; - byte flag = 0; - if (Comment != null) - flag ^= 0x10; - if (FileName != null) - flag ^= 0x8; - - // flag - header[i++] = flag; - - // mtime - if (!LastModified.HasValue) LastModified = DateTime.Now; - System.TimeSpan delta = LastModified.Value - _unixEpoch; - Int32 timet = (Int32)delta.TotalSeconds; - Array.Copy(BitConverter.GetBytes(timet), 0, header, i, 4); - i += 4; - - // xflg - header[i++] = 0; // this field is totally useless - // OS - header[i++] = 0xFF; // 0xFF == unspecified - - // extra field length - only if FEXTRA is set, which it is not. - //header[i++]= 0; - //header[i++]= 0; - - // filename - if (fnLength != 0) - { - Array.Copy(filenameBytes, 0, header, i, fnLength - 1); - i += fnLength - 1; - header[i++] = 0; // terminate - } - - // comment - if (cbLength != 0) - { - Array.Copy(commentBytes, 0, header, i, cbLength - 1); - i += cbLength - 1; - header[i++] = 0; // terminate - } - - _baseStream._stream.Write(header, 0, header.Length); - - return header.Length; // bytes written - } - - - - /// - /// Compress a string into a byte array using GZip. - /// - /// - /// - /// Uncompress it with . - /// - /// - /// - /// - /// - /// - /// A string to compress. The string will first be encoded - /// using UTF8, then compressed. - /// - /// - /// The string in compressed form - public static byte[] CompressString(String s) - { - using (var ms = new MemoryStream()) - { - System.IO.Stream compressor = - new GZipStream(ms, CompressionMode.Compress, CompressionLevel.BestCompression); - ZlibBaseStream.CompressString(s, compressor); - return ms.ToArray(); - } - } - - - /// - /// Compress a byte array into a new byte array using GZip. - /// - /// - /// - /// Uncompress it with . - /// - /// - /// - /// - /// - /// - /// A buffer to compress. - /// - /// - /// The data in compressed form - public static byte[] CompressBuffer(byte[] b) - { - using (var ms = new MemoryStream()) - { - System.IO.Stream compressor = - new GZipStream( ms, CompressionMode.Compress, CompressionLevel.BestCompression ); - - ZlibBaseStream.CompressBuffer(b, compressor); - return ms.ToArray(); - } - } - - - /// - /// Uncompress a GZip'ed byte array into a single string. - /// - /// - /// - /// - /// - /// - /// A buffer containing GZIP-compressed data. - /// - /// - /// The uncompressed string - public static String UncompressString(byte[] compressed) - { - using (var input = new MemoryStream(compressed)) - { - Stream decompressor = new GZipStream(input, CompressionMode.Decompress); - return ZlibBaseStream.UncompressString(compressed, decompressor); - } - } - - - /// - /// Uncompress a GZip'ed byte array into a byte array. - /// - /// - /// - /// - /// - /// - /// A buffer containing data that has been compressed with GZip. - /// - /// - /// The data in uncompressed form - public static byte[] UncompressBuffer(byte[] compressed) - { - using (var input = new System.IO.MemoryStream(compressed)) - { - System.IO.Stream decompressor = - new GZipStream( input, CompressionMode.Decompress ); - - return ZlibBaseStream.UncompressBuffer(compressed, decompressor); - } - } - - - } -} diff --git a/DebugTools/MinecraftClientProxy/Compression/InfTree.cs b/DebugTools/MinecraftClientProxy/Compression/InfTree.cs deleted file mode 100644 index 0ddb30e446..0000000000 --- a/DebugTools/MinecraftClientProxy/Compression/InfTree.cs +++ /dev/null @@ -1,436 +0,0 @@ -// Inftree.cs -// ------------------------------------------------------------------ -// -// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation. -// All rights reserved. -// -// This code module is part of DotNetZip, a zipfile class library. -// -// ------------------------------------------------------------------ -// -// This code is licensed under the Microsoft Public License. -// See the file License.txt for the license details. -// More info on: http://dotnetzip.codeplex.com -// -// ------------------------------------------------------------------ -// -// last saved (in emacs): -// Time-stamp: <2009-October-28 12:43:54> -// -// ------------------------------------------------------------------ -// -// This module defines classes used in decompression. This code is derived -// from the jzlib implementation of zlib. In keeping with the license for jzlib, -// the copyright to that code is below. -// -// ------------------------------------------------------------------ -// -// Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in -// the documentation and/or other materials provided with the distribution. -// -// 3. The names of the authors may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, -// INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// ----------------------------------------------------------------------- -// -// This program is based on zlib-1.1.3; credit to authors -// Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) -// and contributors of zlib. -// -// ----------------------------------------------------------------------- - - - -using System; -namespace Ionic.Zlib -{ - - sealed class InfTree - { - - private const int MANY = 1440; - - private const int Z_OK = 0; - private const int Z_STREAM_END = 1; - private const int Z_NEED_DICT = 2; - private const int Z_ERRNO = - 1; - private const int Z_STREAM_ERROR = - 2; - private const int Z_DATA_ERROR = - 3; - private const int Z_MEM_ERROR = - 4; - private const int Z_BUF_ERROR = - 5; - private const int Z_VERSION_ERROR = - 6; - - internal const int fixed_bl = 9; - internal const int fixed_bd = 5; - - //UPGRADE_NOTE: Final was removed from the declaration of 'fixed_tl'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" - internal static readonly int[] fixed_tl = new int[]{96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, 115, 82, 7, 31, 0, 8, 112, 0, 8, 48, 0, 9, 192, 80, 7, 10, 0, 8, 96, 0, 8, 32, 0, 9, 160, 0, 8, 0, 0, 8, 128, 0, 8, 64, 0, 9, 224, 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, 9, 144, 83, 7, 59, 0, 8, 120, 0, 8, 56, 0, 9, 208, 81, 7, 17, 0, 8, 104, 0, 8, 40, 0, 9, 176, 0, 8, 8, 0, 8, 136, 0, 8, 72, 0, 9, 240, 80, 7, 4, 0, 8, 84, 0, 8, 20, 85, 8, 227, 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9, 200, 81, 7, 13, 0, 8, 100, 0, 8, 36, 0, 9, 168, 0, 8, 4, 0, 8, 132, 0, 8, 68, 0, 9, 232, 80, 7, 8, 0, 8, 92, 0, 8, 28, 0, 9, 152, 84, 7, 83, 0, 8, 124, 0, 8, 60, 0, 9, 216, 82, 7, 23, 0, 8, 108, 0, 8, 44, 0, 9, 184, 0, 8, 12, 0, 8, 140, 0, 8, 76, 0, 9, 248, 80, 7, 3, 0, 8, 82, 0, 8, 18, 85, 8, 163, 83, 7, 35, 0, 8, 114, 0, 8, 50, 0, 9, 196, 81, 7, 11, 0, 8, 98, 0, 8, 34, 0, 9, 164, 0, 8, 2, 0, 8, 130, 0, 8, 66, 0, 9, 228, 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, 9, 148, 84, 7, 67, 0, 8, 122, 0, 8, 58, 0, 9, 212, 82, 7, 19, 0, 8, 106, 0, 8, 42, 0, 9, 180, 0, 8, 10, 0, 8, 138, 0, 8, 74, 0, 9, 244, 80, 7, 5, 0, 8, 86, 0, 8, 22, 192, 8, 0, 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 204, 81, 7, 15, 0, 8, 102, 0, 8, 38, 0, 9, 172, 0, 8, 6, 0, 8, 134, 0, 8, 70, 0, 9, 236, 80, 7, 9, 0, 8, 94, 0, 8, 30, 0, 9, 156, 84, 7, 99, 0, 8, 126, 0, 8, 62, 0, 9, 220, 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, 9, 188, 0, 8, 14, 0, 8, 142, 0, 8, 78, 0, 9, 252, 96, 7, 256, 0, 8, 81, 0, 8, 17, 85, 8, 131, 82, 7, 31, 0, 8, 113, 0, 8, 49, 0, 9, 194, 80, 7, 10, 0, 8, 97, 0, 8, 33, 0, 9, 162, 0, 8, 1, 0, 8, 129, 0, 8, 65, 0, 9, 226, 80, 7, 6, 0, 8, 89, 0, 8, 25, 0, 9, 146, 83, 7, 59, 0, 8, 121, 0, 8, 57, 0, 9, 210, 81, 7, 17, 0, 8, 105, 0, 8, 41, 0, 9, 178, 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, 9, 242, 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, 8, 258, 83, 7, 43, 0, 8, 117, 0, 8, 53, 0, 9, 202, 81, 7, 13, 0, 8, 101, 0, 8, 37, 0, 9, 170, 0, 8, 5, 0, 8, 133, 0, 8, 69, 0, 9, 234, 80, 7, 8, 0, 8, 93, 0, 8, 29, 0, 9, 154, 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 218, 82, 7, 23, 0, 8, 109, 0, 8, 45, 0, 9, 186, - 0, 8, 13, 0, 8, 141, 0, 8, 77, 0, 9, 250, 80, 7, 3, 0, 8, 83, 0, 8, 19, 85, 8, 195, 83, 7, 35, 0, 8, 115, 0, 8, 51, 0, 9, 198, 81, 7, 11, 0, 8, 99, 0, 8, 35, 0, 9, 166, 0, 8, 3, 0, 8, 131, 0, 8, 67, 0, 9, 230, 80, 7, 7, 0, 8, 91, 0, 8, 27, 0, 9, 150, 84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 214, 82, 7, 19, 0, 8, 107, 0, 8, 43, 0, 9, 182, 0, 8, 11, 0, 8, 139, 0, 8, 75, 0, 9, 246, 80, 7, 5, 0, 8, 87, 0, 8, 23, 192, 8, 0, 83, 7, 51, 0, 8, 119, 0, 8, 55, 0, 9, 206, 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, 174, 0, 8, 7, 0, 8, 135, 0, 8, 71, 0, 9, 238, 80, 7, 9, 0, 8, 95, 0, 8, 31, 0, 9, 158, 84, 7, 99, 0, 8, 127, 0, 8, 63, 0, 9, 222, 82, 7, 27, 0, 8, 111, 0, 8, 47, 0, 9, 190, 0, 8, 15, 0, 8, 143, 0, 8, 79, 0, 9, 254, 96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, 115, 82, 7, 31, 0, 8, 112, 0, 8, 48, 0, 9, 193, 80, 7, 10, 0, 8, 96, 0, 8, 32, 0, 9, 161, 0, 8, 0, 0, 8, 128, 0, 8, 64, 0, 9, 225, 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, 9, 145, 83, 7, 59, 0, 8, 120, 0, 8, 56, 0, 9, 209, 81, 7, 17, 0, 8, 104, 0, 8, 40, 0, 9, 177, 0, 8, 8, 0, 8, 136, 0, 8, 72, 0, 9, 241, 80, 7, 4, 0, 8, 84, 0, 8, 20, 85, 8, 227, 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9, 201, 81, 7, 13, 0, 8, 100, 0, 8, 36, 0, 9, 169, 0, 8, 4, 0, 8, 132, 0, 8, 68, 0, 9, 233, 80, 7, 8, 0, 8, 92, 0, 8, 28, 0, 9, 153, 84, 7, 83, 0, 8, 124, 0, 8, 60, 0, 9, 217, 82, 7, 23, 0, 8, 108, 0, 8, 44, 0, 9, 185, 0, 8, 12, 0, 8, 140, 0, 8, 76, 0, 9, 249, 80, 7, 3, 0, 8, 82, 0, 8, 18, 85, 8, 163, 83, 7, 35, 0, 8, 114, 0, 8, 50, 0, 9, 197, 81, 7, 11, 0, 8, 98, 0, 8, 34, 0, 9, 165, 0, 8, 2, 0, 8, 130, 0, 8, 66, 0, 9, 229, 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, 9, 149, 84, 7, 67, 0, 8, 122, 0, 8, 58, 0, 9, 213, 82, 7, 19, 0, 8, 106, 0, 8, 42, 0, 9, 181, 0, 8, 10, 0, 8, 138, 0, 8, 74, 0, 9, 245, 80, 7, 5, 0, 8, 86, 0, 8, 22, 192, 8, 0, 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 205, 81, 7, 15, 0, 8, 102, 0, 8, 38, 0, 9, 173, 0, 8, 6, 0, 8, 134, 0, 8, 70, 0, 9, 237, 80, 7, 9, 0, 8, 94, 0, 8, 30, 0, 9, 157, 84, 7, 99, 0, 8, 126, 0, 8, 62, 0, 9, 221, 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, 9, 189, 0, 8, - 14, 0, 8, 142, 0, 8, 78, 0, 9, 253, 96, 7, 256, 0, 8, 81, 0, 8, 17, 85, 8, 131, 82, 7, 31, 0, 8, 113, 0, 8, 49, 0, 9, 195, 80, 7, 10, 0, 8, 97, 0, 8, 33, 0, 9, 163, 0, 8, 1, 0, 8, 129, 0, 8, 65, 0, 9, 227, 80, 7, 6, 0, 8, 89, 0, 8, 25, 0, 9, 147, 83, 7, 59, 0, 8, 121, 0, 8, 57, 0, 9, 211, 81, 7, 17, 0, 8, 105, 0, 8, 41, 0, 9, 179, 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, 9, 243, 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, 8, 258, 83, 7, 43, 0, 8, 117, 0, 8, 53, 0, 9, 203, 81, 7, 13, 0, 8, 101, 0, 8, 37, 0, 9, 171, 0, 8, 5, 0, 8, 133, 0, 8, 69, 0, 9, 235, 80, 7, 8, 0, 8, 93, 0, 8, 29, 0, 9, 155, 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 219, 82, 7, 23, 0, 8, 109, 0, 8, 45, 0, 9, 187, 0, 8, 13, 0, 8, 141, 0, 8, 77, 0, 9, 251, 80, 7, 3, 0, 8, 83, 0, 8, 19, 85, 8, 195, 83, 7, 35, 0, 8, 115, 0, 8, 51, 0, 9, 199, 81, 7, 11, 0, 8, 99, 0, 8, 35, 0, 9, 167, 0, 8, 3, 0, 8, 131, 0, 8, 67, 0, 9, 231, 80, 7, 7, 0, 8, 91, 0, 8, 27, 0, 9, 151, 84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 215, 82, 7, 19, 0, 8, 107, 0, 8, 43, 0, 9, 183, 0, 8, 11, 0, 8, 139, 0, 8, 75, 0, 9, 247, 80, 7, 5, 0, 8, 87, 0, 8, 23, 192, 8, 0, 83, 7, 51, 0, 8, 119, 0, 8, 55, 0, 9, 207, 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, 175, 0, 8, 7, 0, 8, 135, 0, 8, 71, 0, 9, 239, 80, 7, 9, 0, 8, 95, 0, 8, 31, 0, 9, 159, 84, 7, 99, 0, 8, 127, 0, 8, 63, 0, 9, 223, 82, 7, 27, 0, 8, 111, 0, 8, 47, 0, 9, 191, 0, 8, 15, 0, 8, 143, 0, 8, 79, 0, 9, 255}; - //UPGRADE_NOTE: Final was removed from the declaration of 'fixed_td'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" - internal static readonly int[] fixed_td = new int[]{80, 5, 1, 87, 5, 257, 83, 5, 17, 91, 5, 4097, 81, 5, 5, 89, 5, 1025, 85, 5, 65, 93, 5, 16385, 80, 5, 3, 88, 5, 513, 84, 5, 33, 92, 5, 8193, 82, 5, 9, 90, 5, 2049, 86, 5, 129, 192, 5, 24577, 80, 5, 2, 87, 5, 385, 83, 5, 25, 91, 5, 6145, 81, 5, 7, 89, 5, 1537, 85, 5, 97, 93, 5, 24577, 80, 5, 4, 88, 5, 769, 84, 5, 49, 92, 5, 12289, 82, 5, 13, 90, 5, 3073, 86, 5, 193, 192, 5, 24577}; - - // Tables for deflate from PKZIP's appnote.txt. - //UPGRADE_NOTE: Final was removed from the declaration of 'cplens'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" - internal static readonly int[] cplens = new int[]{3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; - - // see note #13 above about 258 - //UPGRADE_NOTE: Final was removed from the declaration of 'cplext'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" - internal static readonly int[] cplext = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; - - //UPGRADE_NOTE: Final was removed from the declaration of 'cpdist'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" - internal static readonly int[] cpdist = new int[]{1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577}; - - //UPGRADE_NOTE: Final was removed from the declaration of 'cpdext'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" - internal static readonly int[] cpdext = new int[]{0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; - - // If BMAX needs to be larger than 16, then h and x[] should be uLong. - internal const int BMAX = 15; // maximum bit length of any code - - internal int[] hn = null; // hufts used in space - internal int[] v = null; // work area for huft_build - internal int[] c = null; // bit length count table - internal int[] r = null; // table entry for structure assignment - internal int[] u = null; // table stack - internal int[] x = null; // bit offsets, then code stack - - private int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[] t, int[] m, int[] hp, int[] hn, int[] v) - { - // Given a list of code lengths and a maximum table size, make a set of - // tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR - // if the given code set is incomplete (the tables are still built in this - // case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of - // lengths), or Z_MEM_ERROR if not enough memory. - - int a; // counter for codes of length k - int f; // i repeats in table every f entries - int g; // maximum code length - int h; // table level - int i; // counter, current code - int j; // counter - int k; // number of bits in current code - int l; // bits per table (returned in m) - int mask; // (1 << w) - 1, to avoid cc -O bug on HP - int p; // pointer into c[], b[], or v[] - int q; // points to current table - int w; // bits before this table == (l * h) - int xp; // pointer into x - int y; // number of dummy codes added - int z; // number of entries in current table - - // Generate counts for each bit length - - p = 0; i = n; - do - { - c[b[bindex + p]]++; p++; i--; // assume all entries <= BMAX - } - while (i != 0); - - if (c[0] == n) - { - // null input--all zero length codes - t[0] = - 1; - m[0] = 0; - return Z_OK; - } - - // Find minimum and maximum length, bound *m by those - l = m[0]; - for (j = 1; j <= BMAX; j++) - if (c[j] != 0) - break; - k = j; // minimum code length - if (l < j) - { - l = j; - } - for (i = BMAX; i != 0; i--) - { - if (c[i] != 0) - break; - } - g = i; // maximum code length - if (l > i) - { - l = i; - } - m[0] = l; - - // Adjust last length count to fill out codes, if needed - for (y = 1 << j; j < i; j++, y <<= 1) - { - if ((y -= c[j]) < 0) - { - return Z_DATA_ERROR; - } - } - if ((y -= c[i]) < 0) - { - return Z_DATA_ERROR; - } - c[i] += y; - - // Generate starting offsets into the value table for each length - x[1] = j = 0; - p = 1; xp = 2; - while (--i != 0) - { - // note that i == g from above - x[xp] = (j += c[p]); - xp++; - p++; - } - - // Make a table of values in order of bit lengths - i = 0; p = 0; - do - { - if ((j = b[bindex + p]) != 0) - { - v[x[j]++] = i; - } - p++; - } - while (++i < n); - n = x[g]; // set n to length of v - - // Generate the Huffman codes and for each, make the table entries - x[0] = i = 0; // first Huffman code is zero - p = 0; // grab values in bit order - h = - 1; // no tables yet--level -1 - w = - l; // bits decoded == (l * h) - u[0] = 0; // just to keep compilers happy - q = 0; // ditto - z = 0; // ditto - - // go through the bit lengths (k already is bits in shortest code) - for (; k <= g; k++) - { - a = c[k]; - while (a-- != 0) - { - // here i is the Huffman code of length k bits for value *p - // make tables up to required level - while (k > w + l) - { - h++; - w += l; // previous table always l bits - // compute minimum size table less than or equal to l bits - z = g - w; - z = (z > l)?l:z; // table size upper limit - if ((f = 1 << (j = k - w)) > a + 1) - { - // try a k-w bit table - // too few codes for k-w bit table - f -= (a + 1); // deduct codes from patterns left - xp = k; - if (j < z) - { - while (++j < z) - { - // try smaller tables up to z bits - if ((f <<= 1) <= c[++xp]) - break; // enough codes to use up j bits - f -= c[xp]; // else deduct codes from patterns - } - } - } - z = 1 << j; // table entries for j-bit table - - // allocate new table - if (hn[0] + z > MANY) - { - // (note: doesn't matter for fixed) - return Z_DATA_ERROR; // overflow of MANY - } - u[h] = q = hn[0]; // DEBUG - hn[0] += z; - - // connect to last table, if there is one - if (h != 0) - { - x[h] = i; // save pattern for backing up - r[0] = (sbyte) j; // bits in this table - r[1] = (sbyte) l; // bits to dump before this table - j = SharedUtils.URShift(i, (w - l)); - r[2] = (int) (q - u[h - 1] - j); // offset to this table - Array.Copy(r, 0, hp, (u[h - 1] + j) * 3, 3); // connect to last table - } - else - { - t[0] = q; // first table is returned result - } - } - - // set up table entry in r - r[1] = (sbyte) (k - w); - if (p >= n) - { - r[0] = 128 + 64; // out of values--invalid code - } - else if (v[p] < s) - { - r[0] = (sbyte) (v[p] < 256?0:32 + 64); // 256 is end-of-block - r[2] = v[p++]; // simple code is just the value - } - else - { - r[0] = (sbyte) (e[v[p] - s] + 16 + 64); // non-simple--look up in lists - r[2] = d[v[p++] - s]; - } - - // fill code-like entries with r - f = 1 << (k - w); - for (j = SharedUtils.URShift(i, w); j < z; j += f) - { - Array.Copy(r, 0, hp, (q + j) * 3, 3); - } - - // backwards increment the k-bit code i - for (j = 1 << (k - 1); (i & j) != 0; j = SharedUtils.URShift(j, 1)) - { - i ^= j; - } - i ^= j; - - // backup over finished tables - mask = (1 << w) - 1; // needed on HP, cc -O bug - while ((i & mask) != x[h]) - { - h--; // don't need to update q - w -= l; - mask = (1 << w) - 1; - } - } - } - // Return Z_BUF_ERROR if we were given an incomplete table - return y != 0 && g != 1?Z_BUF_ERROR:Z_OK; - } - - internal int inflate_trees_bits(int[] c, int[] bb, int[] tb, int[] hp, ZlibCodec z) - { - int result; - initWorkArea(19); - hn[0] = 0; - result = huft_build(c, 0, 19, 19, null, null, tb, bb, hp, hn, v); - - if (result == Z_DATA_ERROR) - { - z.Message = "oversubscribed dynamic bit lengths tree"; - } - else if (result == Z_BUF_ERROR || bb[0] == 0) - { - z.Message = "incomplete dynamic bit lengths tree"; - result = Z_DATA_ERROR; - } - return result; - } - - internal int inflate_trees_dynamic(int nl, int nd, int[] c, int[] bl, int[] bd, int[] tl, int[] td, int[] hp, ZlibCodec z) - { - int result; - - // build literal/length tree - initWorkArea(288); - hn[0] = 0; - result = huft_build(c, 0, nl, 257, cplens, cplext, tl, bl, hp, hn, v); - if (result != Z_OK || bl[0] == 0) - { - if (result == Z_DATA_ERROR) - { - z.Message = "oversubscribed literal/length tree"; - } - else if (result != Z_MEM_ERROR) - { - z.Message = "incomplete literal/length tree"; - result = Z_DATA_ERROR; - } - return result; - } - - // build distance tree - initWorkArea(288); - result = huft_build(c, nl, nd, 0, cpdist, cpdext, td, bd, hp, hn, v); - - if (result != Z_OK || (bd[0] == 0 && nl > 257)) - { - if (result == Z_DATA_ERROR) - { - z.Message = "oversubscribed distance tree"; - } - else if (result == Z_BUF_ERROR) - { - z.Message = "incomplete distance tree"; - result = Z_DATA_ERROR; - } - else if (result != Z_MEM_ERROR) - { - z.Message = "empty distance tree with lengths"; - result = Z_DATA_ERROR; - } - return result; - } - - return Z_OK; - } - - internal static int inflate_trees_fixed(int[] bl, int[] bd, int[][] tl, int[][] td, ZlibCodec z) - { - bl[0] = fixed_bl; - bd[0] = fixed_bd; - tl[0] = fixed_tl; - td[0] = fixed_td; - return Z_OK; - } - - private void initWorkArea(int vsize) - { - if (hn == null) - { - hn = new int[1]; - v = new int[vsize]; - c = new int[BMAX + 1]; - r = new int[3]; - u = new int[BMAX]; - x = new int[BMAX + 1]; - } - else - { - if (v.Length < vsize) - { - v = new int[vsize]; - } - Array.Clear(v,0,vsize); - Array.Clear(c,0,BMAX+1); - r[0]=0; r[1]=0; r[2]=0; - // for(int i=0; i -// -// ------------------------------------------------------------------ -// -// This module defines classes for decompression. This code is derived -// from the jzlib implementation of zlib, but significantly modified. -// The object model is not the same, and many of the behaviors are -// different. Nonetheless, in keeping with the license for jzlib, I am -// reproducing the copyright to that code here. -// -// ------------------------------------------------------------------ -// -// Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in -// the documentation and/or other materials provided with the distribution. -// -// 3. The names of the authors may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, -// INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// ----------------------------------------------------------------------- -// -// This program is based on zlib-1.1.3; credit to authors -// Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) -// and contributors of zlib. -// -// ----------------------------------------------------------------------- - - -using System; -namespace Ionic.Zlib -{ - sealed class InflateBlocks - { - private const int MANY = 1440; - - // Table for deflate from PKZIP's appnote.txt. - internal static readonly int[] border = new int[] { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; - - private enum InflateBlockMode - { - TYPE = 0, // get type bits (3, including end bit) - LENS = 1, // get lengths for stored - STORED = 2, // processing stored block - TABLE = 3, // get table lengths - BTREE = 4, // get bit lengths tree for a dynamic block - DTREE = 5, // get length, distance trees for a dynamic block - CODES = 6, // processing fixed or dynamic block - DRY = 7, // output remaining window bytes - DONE = 8, // finished last block, done - BAD = 9, // ot a data error--stuck here - } - - private InflateBlockMode mode; // current inflate_block mode - - internal int left; // if STORED, bytes left to copy - - internal int table; // table lengths (14 bits) - internal int index; // index into blens (or border) - internal int[] blens; // bit lengths of codes - internal int[] bb = new int[1]; // bit length tree depth - internal int[] tb = new int[1]; // bit length decoding tree - - internal InflateCodes codes = new InflateCodes(); // if CODES, current state - - internal int last; // true if this block is the last block - - internal ZlibCodec _codec; // pointer back to this zlib stream - - // mode independent information - internal int bitk; // bits in bit buffer - internal int bitb; // bit buffer - internal int[] hufts; // single malloc for tree space - internal byte[] window; // sliding window - internal int end; // one byte after sliding window - internal int readAt; // window read pointer - internal int writeAt; // window write pointer - internal System.Object checkfn; // check function - internal uint check; // check on output - - internal InfTree inftree = new InfTree(); - - internal InflateBlocks(ZlibCodec codec, System.Object checkfn, int w) - { - _codec = codec; - hufts = new int[MANY * 3]; - window = new byte[w]; - end = w; - this.checkfn = checkfn; - mode = InflateBlockMode.TYPE; - Reset(); - } - - internal uint Reset() - { - uint oldCheck = check; - mode = InflateBlockMode.TYPE; - bitk = 0; - bitb = 0; - readAt = writeAt = 0; - - if (checkfn != null) - _codec._Adler32 = check = Adler.Adler32(0, null, 0, 0); - return oldCheck; - } - - - internal int Process(int r) - { - int t; // temporary storage - int b; // bit buffer - int k; // bits in bit buffer - int p; // input data pointer - int n; // bytes available there - int q; // output window write pointer - int m; // bytes to end of window or read pointer - - // copy input/output information to locals (UPDATE macro restores) - - p = _codec.NextIn; - n = _codec.AvailableBytesIn; - b = bitb; - k = bitk; - - q = writeAt; - m = (int)(q < readAt ? readAt - q - 1 : end - q); - - - // process input based on current state - while (true) - { - switch (mode) - { - case InflateBlockMode.TYPE: - - while (k < (3)) - { - if (n != 0) - { - r = ZlibConstants.Z_OK; - } - else - { - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; - writeAt = q; - return Flush(r); - } - - n--; - b |= (_codec.InputBuffer[p++] & 0xff) << k; - k += 8; - } - t = (int)(b & 7); - last = t & 1; - - switch ((uint)t >> 1) - { - case 0: // stored - b >>= 3; k -= (3); - t = k & 7; // go to byte boundary - b >>= t; k -= t; - mode = InflateBlockMode.LENS; // get length of stored block - break; - - case 1: // fixed - int[] bl = new int[1]; - int[] bd = new int[1]; - int[][] tl = new int[1][]; - int[][] td = new int[1][]; - InfTree.inflate_trees_fixed(bl, bd, tl, td, _codec); - codes.Init(bl[0], bd[0], tl[0], 0, td[0], 0); - b >>= 3; k -= 3; - mode = InflateBlockMode.CODES; - break; - - case 2: // dynamic - b >>= 3; k -= 3; - mode = InflateBlockMode.TABLE; - break; - - case 3: // illegal - b >>= 3; k -= 3; - mode = InflateBlockMode.BAD; - _codec.Message = "invalid block type"; - r = ZlibConstants.Z_DATA_ERROR; - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; - writeAt = q; - return Flush(r); - } - break; - - case InflateBlockMode.LENS: - - while (k < (32)) - { - if (n != 0) - { - r = ZlibConstants.Z_OK; - } - else - { - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; - writeAt = q; - return Flush(r); - } - ; - n--; - b |= (_codec.InputBuffer[p++] & 0xff) << k; - k += 8; - } - - if ((((~b) >> 16) & 0xffff) != (b & 0xffff)) - { - mode = InflateBlockMode.BAD; - _codec.Message = "invalid stored block lengths"; - r = ZlibConstants.Z_DATA_ERROR; - - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; - writeAt = q; - return Flush(r); - } - left = (b & 0xffff); - b = k = 0; // dump bits - mode = left != 0 ? InflateBlockMode.STORED : (last != 0 ? InflateBlockMode.DRY : InflateBlockMode.TYPE); - break; - - case InflateBlockMode.STORED: - if (n == 0) - { - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; - writeAt = q; - return Flush(r); - } - - if (m == 0) - { - if (q == end && readAt != 0) - { - q = 0; m = (int)(q < readAt ? readAt - q - 1 : end - q); - } - if (m == 0) - { - writeAt = q; - r = Flush(r); - q = writeAt; m = (int)(q < readAt ? readAt - q - 1 : end - q); - if (q == end && readAt != 0) - { - q = 0; m = (int)(q < readAt ? readAt - q - 1 : end - q); - } - if (m == 0) - { - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; - writeAt = q; - return Flush(r); - } - } - } - r = ZlibConstants.Z_OK; - - t = left; - if (t > n) - t = n; - if (t > m) - t = m; - Array.Copy(_codec.InputBuffer, p, window, q, t); - p += t; n -= t; - q += t; m -= t; - if ((left -= t) != 0) - break; - mode = last != 0 ? InflateBlockMode.DRY : InflateBlockMode.TYPE; - break; - - case InflateBlockMode.TABLE: - - while (k < (14)) - { - if (n != 0) - { - r = ZlibConstants.Z_OK; - } - else - { - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; - writeAt = q; - return Flush(r); - } - - n--; - b |= (_codec.InputBuffer[p++] & 0xff) << k; - k += 8; - } - - table = t = (b & 0x3fff); - if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) - { - mode = InflateBlockMode.BAD; - _codec.Message = "too many length or distance symbols"; - r = ZlibConstants.Z_DATA_ERROR; - - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; - writeAt = q; - return Flush(r); - } - t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); - if (blens == null || blens.Length < t) - { - blens = new int[t]; - } - else - { - Array.Clear(blens, 0, t); - // for (int i = 0; i < t; i++) - // { - // blens[i] = 0; - // } - } - - b >>= 14; - k -= 14; - - - index = 0; - mode = InflateBlockMode.BTREE; - goto case InflateBlockMode.BTREE; - - case InflateBlockMode.BTREE: - while (index < 4 + (table >> 10)) - { - while (k < (3)) - { - if (n != 0) - { - r = ZlibConstants.Z_OK; - } - else - { - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; - writeAt = q; - return Flush(r); - } - - n--; - b |= (_codec.InputBuffer[p++] & 0xff) << k; - k += 8; - } - - blens[border[index++]] = b & 7; - - b >>= 3; k -= 3; - } - - while (index < 19) - { - blens[border[index++]] = 0; - } - - bb[0] = 7; - t = inftree.inflate_trees_bits(blens, bb, tb, hufts, _codec); - if (t != ZlibConstants.Z_OK) - { - r = t; - if (r == ZlibConstants.Z_DATA_ERROR) - { - blens = null; - mode = InflateBlockMode.BAD; - } - - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; - writeAt = q; - return Flush(r); - } - - index = 0; - mode = InflateBlockMode.DTREE; - goto case InflateBlockMode.DTREE; - - case InflateBlockMode.DTREE: - while (true) - { - t = table; - if (!(index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))) - { - break; - } - - int i, j, c; - - t = bb[0]; - - while (k < t) - { - if (n != 0) - { - r = ZlibConstants.Z_OK; - } - else - { - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; - writeAt = q; - return Flush(r); - } - - n--; - b |= (_codec.InputBuffer[p++] & 0xff) << k; - k += 8; - } - - t = hufts[(tb[0] + (b & InternalInflateConstants.InflateMask[t])) * 3 + 1]; - c = hufts[(tb[0] + (b & InternalInflateConstants.InflateMask[t])) * 3 + 2]; - - if (c < 16) - { - b >>= t; k -= t; - blens[index++] = c; - } - else - { - // c == 16..18 - i = c == 18 ? 7 : c - 14; - j = c == 18 ? 11 : 3; - - while (k < (t + i)) - { - if (n != 0) - { - r = ZlibConstants.Z_OK; - } - else - { - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; - writeAt = q; - return Flush(r); - } - - n--; - b |= (_codec.InputBuffer[p++] & 0xff) << k; - k += 8; - } - - b >>= t; k -= t; - - j += (b & InternalInflateConstants.InflateMask[i]); - - b >>= i; k -= i; - - i = index; - t = table; - if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || (c == 16 && i < 1)) - { - blens = null; - mode = InflateBlockMode.BAD; - _codec.Message = "invalid bit length repeat"; - r = ZlibConstants.Z_DATA_ERROR; - - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; - writeAt = q; - return Flush(r); - } - - c = (c == 16) ? blens[i - 1] : 0; - do - { - blens[i++] = c; - } - while (--j != 0); - index = i; - } - } - - tb[0] = -1; - { - int[] bl = new int[] { 9 }; // must be <= 9 for lookahead assumptions - int[] bd = new int[] { 6 }; // must be <= 9 for lookahead assumptions - int[] tl = new int[1]; - int[] td = new int[1]; - - t = table; - t = inftree.inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), blens, bl, bd, tl, td, hufts, _codec); - - if (t != ZlibConstants.Z_OK) - { - if (t == ZlibConstants.Z_DATA_ERROR) - { - blens = null; - mode = InflateBlockMode.BAD; - } - r = t; - - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; - writeAt = q; - return Flush(r); - } - codes.Init(bl[0], bd[0], hufts, tl[0], hufts, td[0]); - } - mode = InflateBlockMode.CODES; - goto case InflateBlockMode.CODES; - - case InflateBlockMode.CODES: - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; - writeAt = q; - - r = codes.Process(this, r); - if (r != ZlibConstants.Z_STREAM_END) - { - return Flush(r); - } - - r = ZlibConstants.Z_OK; - p = _codec.NextIn; - n = _codec.AvailableBytesIn; - b = bitb; - k = bitk; - q = writeAt; - m = (int)(q < readAt ? readAt - q - 1 : end - q); - - if (last == 0) - { - mode = InflateBlockMode.TYPE; - break; - } - mode = InflateBlockMode.DRY; - goto case InflateBlockMode.DRY; - - case InflateBlockMode.DRY: - writeAt = q; - r = Flush(r); - q = writeAt; m = (int)(q < readAt ? readAt - q - 1 : end - q); - if (readAt != writeAt) - { - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; - writeAt = q; - return Flush(r); - } - mode = InflateBlockMode.DONE; - goto case InflateBlockMode.DONE; - - case InflateBlockMode.DONE: - r = ZlibConstants.Z_STREAM_END; - bitb = b; - bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; - writeAt = q; - return Flush(r); - - case InflateBlockMode.BAD: - r = ZlibConstants.Z_DATA_ERROR; - - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; - writeAt = q; - return Flush(r); - - - default: - r = ZlibConstants.Z_STREAM_ERROR; - - bitb = b; bitk = k; - _codec.AvailableBytesIn = n; - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; - writeAt = q; - return Flush(r); - } - } - } - - - internal void Free() - { - Reset(); - window = null; - hufts = null; - } - - internal void SetDictionary(byte[] d, int start, int n) - { - Array.Copy(d, start, window, 0, n); - readAt = writeAt = n; - } - - // Returns true if inflate is currently at the end of a block generated - // by Z_SYNC_FLUSH or Z_FULL_FLUSH. - internal int SyncPoint() - { - return mode == InflateBlockMode.LENS ? 1 : 0; - } - - // copy as much as possible from the sliding window to the output area - internal int Flush(int r) - { - int nBytes; - - for (int pass = 0; pass < 2; pass++) - { - if (pass == 0) - { - // compute number of bytes to copy as far as end of window - nBytes = (int)((readAt <= writeAt ? writeAt : end) - readAt); - } - else - { - // compute bytes to copy - nBytes = writeAt - readAt; - } - - // workitem 8870 - if (nBytes == 0) - { - if (r == ZlibConstants.Z_BUF_ERROR) - r = ZlibConstants.Z_OK; - return r; - } - - if (nBytes > _codec.AvailableBytesOut) - nBytes = _codec.AvailableBytesOut; - - if (nBytes != 0 && r == ZlibConstants.Z_BUF_ERROR) - r = ZlibConstants.Z_OK; - - // update counters - _codec.AvailableBytesOut -= nBytes; - _codec.TotalBytesOut += nBytes; - - // update check information - if (checkfn != null) - _codec._Adler32 = check = Adler.Adler32(check, window, readAt, nBytes); - - // copy as far as end of window - Array.Copy(window, readAt, _codec.OutputBuffer, _codec.NextOut, nBytes); - _codec.NextOut += nBytes; - readAt += nBytes; - - // see if more to copy at beginning of window - if (readAt == end && pass == 0) - { - // wrap pointers - readAt = 0; - if (writeAt == end) - writeAt = 0; - } - else pass++; - } - - // done - return r; - } - } - - - internal static class InternalInflateConstants - { - // And'ing with mask[n] masks the lower n bits - internal static readonly int[] InflateMask = new int[] { - 0x00000000, 0x00000001, 0x00000003, 0x00000007, - 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f, - 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, - 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff }; - } - - - sealed class InflateCodes - { - // waiting for "i:"=input, - // "o:"=output, - // "x:"=nothing - private const int START = 0; // x: set up for LEN - private const int LEN = 1; // i: get length/literal/eob next - private const int LENEXT = 2; // i: getting length extra (have base) - private const int DIST = 3; // i: get distance next - private const int DISTEXT = 4; // i: getting distance extra - private const int COPY = 5; // o: copying bytes in window, waiting for space - private const int LIT = 6; // o: got literal, waiting for output space - private const int WASH = 7; // o: got eob, possibly still output waiting - private const int END = 8; // x: got eob and all data flushed - private const int BADCODE = 9; // x: got error - - internal int mode; // current inflate_codes mode - - // mode dependent information - internal int len; - - internal int[] tree; // pointer into tree - internal int tree_index = 0; - internal int need; // bits needed - - internal int lit; - - // if EXT or COPY, where and how much - internal int bitsToGet; // bits to get for extra - internal int dist; // distance back to copy from - - internal byte lbits; // ltree bits decoded per branch - internal byte dbits; // dtree bits decoder per branch - internal int[] ltree; // literal/length/eob tree - internal int ltree_index; // literal/length/eob tree - internal int[] dtree; // distance tree - internal int dtree_index; // distance tree - - internal InflateCodes() - { - } - - internal void Init(int bl, int bd, int[] tl, int tl_index, int[] td, int td_index) - { - mode = START; - lbits = (byte)bl; - dbits = (byte)bd; - ltree = tl; - ltree_index = tl_index; - dtree = td; - dtree_index = td_index; - tree = null; - } - - internal int Process(InflateBlocks blocks, int r) - { - int j; // temporary storage - int tindex; // temporary pointer - int e; // extra bits or operation - int b = 0; // bit buffer - int k = 0; // bits in bit buffer - int p = 0; // input data pointer - int n; // bytes available there - int q; // output window write pointer - int m; // bytes to end of window or read pointer - int f; // pointer to copy strings from - - ZlibCodec z = blocks._codec; - - // copy input/output information to locals (UPDATE macro restores) - p = z.NextIn; - n = z.AvailableBytesIn; - b = blocks.bitb; - k = blocks.bitk; - q = blocks.writeAt; m = q < blocks.readAt ? blocks.readAt - q - 1 : blocks.end - q; - - // process input and output based on current state - while (true) - { - switch (mode) - { - // waiting for "i:"=input, "o:"=output, "x:"=nothing - case START: // x: set up for LEN - if (m >= 258 && n >= 10) - { - blocks.bitb = b; blocks.bitk = k; - z.AvailableBytesIn = n; - z.TotalBytesIn += p - z.NextIn; - z.NextIn = p; - blocks.writeAt = q; - r = InflateFast(lbits, dbits, ltree, ltree_index, dtree, dtree_index, blocks, z); - - p = z.NextIn; - n = z.AvailableBytesIn; - b = blocks.bitb; - k = blocks.bitk; - q = blocks.writeAt; m = q < blocks.readAt ? blocks.readAt - q - 1 : blocks.end - q; - - if (r != ZlibConstants.Z_OK) - { - mode = (r == ZlibConstants.Z_STREAM_END) ? WASH : BADCODE; - break; - } - } - need = lbits; - tree = ltree; - tree_index = ltree_index; - - mode = LEN; - goto case LEN; - - case LEN: // i: get length/literal/eob next - j = need; - - while (k < j) - { - if (n != 0) - r = ZlibConstants.Z_OK; - else - { - blocks.bitb = b; blocks.bitk = k; - z.AvailableBytesIn = n; - z.TotalBytesIn += p - z.NextIn; - z.NextIn = p; - blocks.writeAt = q; - return blocks.Flush(r); - } - n--; - b |= (z.InputBuffer[p++] & 0xff) << k; - k += 8; - } - - tindex = (tree_index + (b & InternalInflateConstants.InflateMask[j])) * 3; - - b >>= (tree[tindex + 1]); - k -= (tree[tindex + 1]); - - e = tree[tindex]; - - if (e == 0) - { - // literal - lit = tree[tindex + 2]; - mode = LIT; - break; - } - if ((e & 16) != 0) - { - // length - bitsToGet = e & 15; - len = tree[tindex + 2]; - mode = LENEXT; - break; - } - if ((e & 64) == 0) - { - // next table - need = e; - tree_index = tindex / 3 + tree[tindex + 2]; - break; - } - if ((e & 32) != 0) - { - // end of block - mode = WASH; - break; - } - mode = BADCODE; // invalid code - z.Message = "invalid literal/length code"; - r = ZlibConstants.Z_DATA_ERROR; - - blocks.bitb = b; blocks.bitk = k; - z.AvailableBytesIn = n; - z.TotalBytesIn += p - z.NextIn; - z.NextIn = p; - blocks.writeAt = q; - return blocks.Flush(r); - - - case LENEXT: // i: getting length extra (have base) - j = bitsToGet; - - while (k < j) - { - if (n != 0) - r = ZlibConstants.Z_OK; - else - { - blocks.bitb = b; blocks.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - blocks.writeAt = q; - return blocks.Flush(r); - } - n--; b |= (z.InputBuffer[p++] & 0xff) << k; - k += 8; - } - - len += (b & InternalInflateConstants.InflateMask[j]); - - b >>= j; - k -= j; - - need = dbits; - tree = dtree; - tree_index = dtree_index; - mode = DIST; - goto case DIST; - - case DIST: // i: get distance next - j = need; - - while (k < j) - { - if (n != 0) - r = ZlibConstants.Z_OK; - else - { - blocks.bitb = b; blocks.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - blocks.writeAt = q; - return blocks.Flush(r); - } - n--; b |= (z.InputBuffer[p++] & 0xff) << k; - k += 8; - } - - tindex = (tree_index + (b & InternalInflateConstants.InflateMask[j])) * 3; - - b >>= tree[tindex + 1]; - k -= tree[tindex + 1]; - - e = (tree[tindex]); - if ((e & 0x10) != 0) - { - // distance - bitsToGet = e & 15; - dist = tree[tindex + 2]; - mode = DISTEXT; - break; - } - if ((e & 64) == 0) - { - // next table - need = e; - tree_index = tindex / 3 + tree[tindex + 2]; - break; - } - mode = BADCODE; // invalid code - z.Message = "invalid distance code"; - r = ZlibConstants.Z_DATA_ERROR; - - blocks.bitb = b; blocks.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - blocks.writeAt = q; - return blocks.Flush(r); - - - case DISTEXT: // i: getting distance extra - j = bitsToGet; - - while (k < j) - { - if (n != 0) - r = ZlibConstants.Z_OK; - else - { - blocks.bitb = b; blocks.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - blocks.writeAt = q; - return blocks.Flush(r); - } - n--; b |= (z.InputBuffer[p++] & 0xff) << k; - k += 8; - } - - dist += (b & InternalInflateConstants.InflateMask[j]); - - b >>= j; - k -= j; - - mode = COPY; - goto case COPY; - - case COPY: // o: copying bytes in window, waiting for space - f = q - dist; - while (f < 0) - { - // modulo window size-"while" instead - f += blocks.end; // of "if" handles invalid distances - } - while (len != 0) - { - if (m == 0) - { - if (q == blocks.end && blocks.readAt != 0) - { - q = 0; m = q < blocks.readAt ? blocks.readAt - q - 1 : blocks.end - q; - } - if (m == 0) - { - blocks.writeAt = q; r = blocks.Flush(r); - q = blocks.writeAt; m = q < blocks.readAt ? blocks.readAt - q - 1 : blocks.end - q; - - if (q == blocks.end && blocks.readAt != 0) - { - q = 0; m = q < blocks.readAt ? blocks.readAt - q - 1 : blocks.end - q; - } - - if (m == 0) - { - blocks.bitb = b; blocks.bitk = k; - z.AvailableBytesIn = n; - z.TotalBytesIn += p - z.NextIn; - z.NextIn = p; - blocks.writeAt = q; - return blocks.Flush(r); - } - } - } - - blocks.window[q++] = blocks.window[f++]; m--; - - if (f == blocks.end) - f = 0; - len--; - } - mode = START; - break; - - case LIT: // o: got literal, waiting for output space - if (m == 0) - { - if (q == blocks.end && blocks.readAt != 0) - { - q = 0; m = q < blocks.readAt ? blocks.readAt - q - 1 : blocks.end - q; - } - if (m == 0) - { - blocks.writeAt = q; r = blocks.Flush(r); - q = blocks.writeAt; m = q < blocks.readAt ? blocks.readAt - q - 1 : blocks.end - q; - - if (q == blocks.end && blocks.readAt != 0) - { - q = 0; m = q < blocks.readAt ? blocks.readAt - q - 1 : blocks.end - q; - } - if (m == 0) - { - blocks.bitb = b; blocks.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - blocks.writeAt = q; - return blocks.Flush(r); - } - } - } - r = ZlibConstants.Z_OK; - - blocks.window[q++] = (byte)lit; m--; - - mode = START; - break; - - case WASH: // o: got eob, possibly more output - if (k > 7) - { - // return unused byte, if any - k -= 8; - n++; - p--; // can always return one - } - - blocks.writeAt = q; r = blocks.Flush(r); - q = blocks.writeAt; m = q < blocks.readAt ? blocks.readAt - q - 1 : blocks.end - q; - - if (blocks.readAt != blocks.writeAt) - { - blocks.bitb = b; blocks.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - blocks.writeAt = q; - return blocks.Flush(r); - } - mode = END; - goto case END; - - case END: - r = ZlibConstants.Z_STREAM_END; - blocks.bitb = b; blocks.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - blocks.writeAt = q; - return blocks.Flush(r); - - case BADCODE: // x: got error - - r = ZlibConstants.Z_DATA_ERROR; - - blocks.bitb = b; blocks.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - blocks.writeAt = q; - return blocks.Flush(r); - - default: - r = ZlibConstants.Z_STREAM_ERROR; - - blocks.bitb = b; blocks.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - blocks.writeAt = q; - return blocks.Flush(r); - } - } - } - - - // Called with number of bytes left to write in window at least 258 - // (the maximum string length) and number of input bytes available - // at least ten. The ten bytes are six bytes for the longest length/ - // distance pair plus four bytes for overloading the bit buffer. - - internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int td_index, InflateBlocks s, ZlibCodec z) - { - int t; // temporary pointer - int[] tp; // temporary pointer - int tp_index; // temporary pointer - int e; // extra bits or operation - int b; // bit buffer - int k; // bits in bit buffer - int p; // input data pointer - int n; // bytes available there - int q; // output window write pointer - int m; // bytes to end of window or read pointer - int ml; // mask for literal/length tree - int md; // mask for distance tree - int c; // bytes to copy - int d; // distance back to copy from - int r; // copy source pointer - - int tp_index_t_3; // (tp_index+t)*3 - - // load input, output, bit values - p = z.NextIn; n = z.AvailableBytesIn; b = s.bitb; k = s.bitk; - q = s.writeAt; m = q < s.readAt ? s.readAt - q - 1 : s.end - q; - - // initialize masks - ml = InternalInflateConstants.InflateMask[bl]; - md = InternalInflateConstants.InflateMask[bd]; - - // do until not enough input or output space for fast loop - do - { - // assume called with m >= 258 && n >= 10 - // get literal/length code - while (k < (20)) - { - // max bits for literal/length code - n--; - b |= (z.InputBuffer[p++] & 0xff) << k; k += 8; - } - - t = b & ml; - tp = tl; - tp_index = tl_index; - tp_index_t_3 = (tp_index + t) * 3; - if ((e = tp[tp_index_t_3]) == 0) - { - b >>= (tp[tp_index_t_3 + 1]); k -= (tp[tp_index_t_3 + 1]); - - s.window[q++] = (byte)tp[tp_index_t_3 + 2]; - m--; - continue; - } - do - { - - b >>= (tp[tp_index_t_3 + 1]); k -= (tp[tp_index_t_3 + 1]); - - if ((e & 16) != 0) - { - e &= 15; - c = tp[tp_index_t_3 + 2] + ((int)b & InternalInflateConstants.InflateMask[e]); - - b >>= e; k -= e; - - // decode distance base of block to copy - while (k < 15) - { - // max bits for distance code - n--; - b |= (z.InputBuffer[p++] & 0xff) << k; k += 8; - } - - t = b & md; - tp = td; - tp_index = td_index; - tp_index_t_3 = (tp_index + t) * 3; - e = tp[tp_index_t_3]; - - do - { - - b >>= (tp[tp_index_t_3 + 1]); k -= (tp[tp_index_t_3 + 1]); - - if ((e & 16) != 0) - { - // get extra bits to add to distance base - e &= 15; - while (k < e) - { - // get extra bits (up to 13) - n--; - b |= (z.InputBuffer[p++] & 0xff) << k; k += 8; - } - - d = tp[tp_index_t_3 + 2] + (b & InternalInflateConstants.InflateMask[e]); - - b >>= e; k -= e; - - // do the copy - m -= c; - if (q >= d) - { - // offset before dest - // just copy - r = q - d; - if (q - r > 0 && 2 > (q - r)) - { - s.window[q++] = s.window[r++]; // minimum count is three, - s.window[q++] = s.window[r++]; // so unroll loop a little - c -= 2; - } - else - { - Array.Copy(s.window, r, s.window, q, 2); - q += 2; r += 2; c -= 2; - } - } - else - { - // else offset after destination - r = q - d; - do - { - r += s.end; // force pointer in window - } - while (r < 0); // covers invalid distances - e = s.end - r; - if (c > e) - { - // if source crosses, - c -= e; // wrapped copy - if (q - r > 0 && e > (q - r)) - { - do - { - s.window[q++] = s.window[r++]; - } - while (--e != 0); - } - else - { - Array.Copy(s.window, r, s.window, q, e); - q += e; r += e; e = 0; - } - r = 0; // copy rest from start of window - } - } - - // copy all or what's left - if (q - r > 0 && c > (q - r)) - { - do - { - s.window[q++] = s.window[r++]; - } - while (--c != 0); - } - else - { - Array.Copy(s.window, r, s.window, q, c); - q += c; r += c; c = 0; - } - break; - } - else if ((e & 64) == 0) - { - t += tp[tp_index_t_3 + 2]; - t += (b & InternalInflateConstants.InflateMask[e]); - tp_index_t_3 = (tp_index + t) * 3; - e = tp[tp_index_t_3]; - } - else - { - z.Message = "invalid distance code"; - - c = z.AvailableBytesIn - n; c = (k >> 3) < c ? k >> 3 : c; n += c; p -= c; k -= (c << 3); - - s.bitb = b; s.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - s.writeAt = q; - - return ZlibConstants.Z_DATA_ERROR; - } - } - while (true); - break; - } - - if ((e & 64) == 0) - { - t += tp[tp_index_t_3 + 2]; - t += (b & InternalInflateConstants.InflateMask[e]); - tp_index_t_3 = (tp_index + t) * 3; - if ((e = tp[tp_index_t_3]) == 0) - { - b >>= (tp[tp_index_t_3 + 1]); k -= (tp[tp_index_t_3 + 1]); - s.window[q++] = (byte)tp[tp_index_t_3 + 2]; - m--; - break; - } - } - else if ((e & 32) != 0) - { - c = z.AvailableBytesIn - n; c = (k >> 3) < c ? k >> 3 : c; n += c; p -= c; k -= (c << 3); - - s.bitb = b; s.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - s.writeAt = q; - - return ZlibConstants.Z_STREAM_END; - } - else - { - z.Message = "invalid literal/length code"; - - c = z.AvailableBytesIn - n; c = (k >> 3) < c ? k >> 3 : c; n += c; p -= c; k -= (c << 3); - - s.bitb = b; s.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - s.writeAt = q; - - return ZlibConstants.Z_DATA_ERROR; - } - } - while (true); - } - while (m >= 258 && n >= 10); - - // not enough input or output--restore pointers and return - c = z.AvailableBytesIn - n; c = (k >> 3) < c ? k >> 3 : c; n += c; p -= c; k -= (c << 3); - - s.bitb = b; s.bitk = k; - z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; - s.writeAt = q; - - return ZlibConstants.Z_OK; - } - } - - - internal sealed class InflateManager - { - // preset dictionary flag in zlib header - private const int PRESET_DICT = 0x20; - - private const int Z_DEFLATED = 8; - - private enum InflateManagerMode - { - METHOD = 0, // waiting for method byte - FLAG = 1, // waiting for flag byte - DICT4 = 2, // four dictionary check bytes to go - DICT3 = 3, // three dictionary check bytes to go - DICT2 = 4, // two dictionary check bytes to go - DICT1 = 5, // one dictionary check byte to go - DICT0 = 6, // waiting for inflateSetDictionary - BLOCKS = 7, // decompressing blocks - CHECK4 = 8, // four check bytes to go - CHECK3 = 9, // three check bytes to go - CHECK2 = 10, // two check bytes to go - CHECK1 = 11, // one check byte to go - DONE = 12, // finished check, done - BAD = 13, // got an error--stay here - } - - private InflateManagerMode mode; // current inflate mode - internal ZlibCodec _codec; // pointer back to this zlib stream - - // mode dependent information - internal int method; // if FLAGS, method byte - - // if CHECK, check values to compare - internal uint computedCheck; // computed check value - internal uint expectedCheck; // stream check value - - // if BAD, inflateSync's marker bytes count - internal int marker; - - // mode independent information - //internal int nowrap; // flag for no wrapper - private bool _handleRfc1950HeaderBytes = true; - internal bool HandleRfc1950HeaderBytes - { - get { return _handleRfc1950HeaderBytes; } - set { _handleRfc1950HeaderBytes = value; } - } - internal int wbits; // log2(window size) (8..15, defaults to 15) - - internal InflateBlocks blocks; // current inflate_blocks state - - public InflateManager() { } - - public InflateManager(bool expectRfc1950HeaderBytes) - { - _handleRfc1950HeaderBytes = expectRfc1950HeaderBytes; - } - - internal int Reset() - { - _codec.TotalBytesIn = _codec.TotalBytesOut = 0; - _codec.Message = null; - mode = HandleRfc1950HeaderBytes ? InflateManagerMode.METHOD : InflateManagerMode.BLOCKS; - blocks.Reset(); - return ZlibConstants.Z_OK; - } - - internal int End() - { - if (blocks != null) - blocks.Free(); - blocks = null; - return ZlibConstants.Z_OK; - } - - internal int Initialize(ZlibCodec codec, int w) - { - _codec = codec; - _codec.Message = null; - blocks = null; - - // handle undocumented nowrap option (no zlib header or check) - //nowrap = 0; - //if (w < 0) - //{ - // w = - w; - // nowrap = 1; - //} - - // set window size - if (w < 8 || w > 15) - { - End(); - throw new ZlibException("Bad window size."); - - //return ZlibConstants.Z_STREAM_ERROR; - } - wbits = w; - - blocks = new InflateBlocks(codec, - HandleRfc1950HeaderBytes ? this : null, - 1 << w); - - // reset state - Reset(); - return ZlibConstants.Z_OK; - } - - - internal int Inflate(FlushType flush) - { - int b; - - if (_codec.InputBuffer == null) - throw new ZlibException("InputBuffer is null. "); - - // int f = (flush == FlushType.Finish) - // ? ZlibConstants.Z_BUF_ERROR - // : ZlibConstants.Z_OK; - - // workitem 8870 - int f = ZlibConstants.Z_OK; - int r = ZlibConstants.Z_BUF_ERROR; - - while (true) - { - switch (mode) - { - case InflateManagerMode.METHOD: - if (_codec.AvailableBytesIn == 0) return r; - r = f; - _codec.AvailableBytesIn--; - _codec.TotalBytesIn++; - if (((method = _codec.InputBuffer[_codec.NextIn++]) & 0xf) != Z_DEFLATED) - { - mode = InflateManagerMode.BAD; - _codec.Message = String.Format("unknown compression method (0x{0:X2})", method); - marker = 5; // can't try inflateSync - break; - } - if ((method >> 4) + 8 > wbits) - { - mode = InflateManagerMode.BAD; - _codec.Message = String.Format("invalid window size ({0})", (method >> 4) + 8); - marker = 5; // can't try inflateSync - break; - } - mode = InflateManagerMode.FLAG; - break; - - - case InflateManagerMode.FLAG: - if (_codec.AvailableBytesIn == 0) return r; - r = f; - _codec.AvailableBytesIn--; - _codec.TotalBytesIn++; - b = (_codec.InputBuffer[_codec.NextIn++]) & 0xff; - - if ((((method << 8) + b) % 31) != 0) - { - mode = InflateManagerMode.BAD; - _codec.Message = "incorrect header check"; - marker = 5; // can't try inflateSync - break; - } - - mode = ((b & PRESET_DICT) == 0) - ? InflateManagerMode.BLOCKS - : InflateManagerMode.DICT4; - break; - - case InflateManagerMode.DICT4: - if (_codec.AvailableBytesIn == 0) return r; - r = f; - _codec.AvailableBytesIn--; - _codec.TotalBytesIn++; - expectedCheck = (uint)((_codec.InputBuffer[_codec.NextIn++] << 24) & 0xff000000); - mode = InflateManagerMode.DICT3; - break; - - case InflateManagerMode.DICT3: - if (_codec.AvailableBytesIn == 0) return r; - r = f; - _codec.AvailableBytesIn--; - _codec.TotalBytesIn++; - expectedCheck += (uint)((_codec.InputBuffer[_codec.NextIn++] << 16) & 0x00ff0000); - mode = InflateManagerMode.DICT2; - break; - - case InflateManagerMode.DICT2: - - if (_codec.AvailableBytesIn == 0) return r; - r = f; - _codec.AvailableBytesIn--; - _codec.TotalBytesIn++; - expectedCheck += (uint)((_codec.InputBuffer[_codec.NextIn++] << 8) & 0x0000ff00); - mode = InflateManagerMode.DICT1; - break; - - - case InflateManagerMode.DICT1: - if (_codec.AvailableBytesIn == 0) return r; - r = f; - _codec.AvailableBytesIn--; _codec.TotalBytesIn++; - expectedCheck += (uint)(_codec.InputBuffer[_codec.NextIn++] & 0x000000ff); - _codec._Adler32 = expectedCheck; - mode = InflateManagerMode.DICT0; - return ZlibConstants.Z_NEED_DICT; - - - case InflateManagerMode.DICT0: - mode = InflateManagerMode.BAD; - _codec.Message = "need dictionary"; - marker = 0; // can try inflateSync - return ZlibConstants.Z_STREAM_ERROR; - - - case InflateManagerMode.BLOCKS: - r = blocks.Process(r); - if (r == ZlibConstants.Z_DATA_ERROR) - { - mode = InflateManagerMode.BAD; - marker = 0; // can try inflateSync - break; - } - - if (r == ZlibConstants.Z_OK) r = f; - - if (r != ZlibConstants.Z_STREAM_END) - return r; - - r = f; - computedCheck = blocks.Reset(); - if (!HandleRfc1950HeaderBytes) - { - mode = InflateManagerMode.DONE; - return ZlibConstants.Z_STREAM_END; - } - mode = InflateManagerMode.CHECK4; - break; - - case InflateManagerMode.CHECK4: - if (_codec.AvailableBytesIn == 0) return r; - r = f; - _codec.AvailableBytesIn--; - _codec.TotalBytesIn++; - expectedCheck = (uint)((_codec.InputBuffer[_codec.NextIn++] << 24) & 0xff000000); - mode = InflateManagerMode.CHECK3; - break; - - case InflateManagerMode.CHECK3: - if (_codec.AvailableBytesIn == 0) return r; - r = f; - _codec.AvailableBytesIn--; _codec.TotalBytesIn++; - expectedCheck += (uint)((_codec.InputBuffer[_codec.NextIn++] << 16) & 0x00ff0000); - mode = InflateManagerMode.CHECK2; - break; - - case InflateManagerMode.CHECK2: - if (_codec.AvailableBytesIn == 0) return r; - r = f; - _codec.AvailableBytesIn--; - _codec.TotalBytesIn++; - expectedCheck += (uint)((_codec.InputBuffer[_codec.NextIn++] << 8) & 0x0000ff00); - mode = InflateManagerMode.CHECK1; - break; - - case InflateManagerMode.CHECK1: - if (_codec.AvailableBytesIn == 0) return r; - r = f; - _codec.AvailableBytesIn--; _codec.TotalBytesIn++; - expectedCheck += (uint)(_codec.InputBuffer[_codec.NextIn++] & 0x000000ff); - if (computedCheck != expectedCheck) - { - mode = InflateManagerMode.BAD; - _codec.Message = "incorrect data check"; - marker = 5; // can't try inflateSync - break; - } - mode = InflateManagerMode.DONE; - return ZlibConstants.Z_STREAM_END; - - case InflateManagerMode.DONE: - return ZlibConstants.Z_STREAM_END; - - case InflateManagerMode.BAD: - throw new ZlibException(String.Format("Bad state ({0})", _codec.Message)); - - default: - throw new ZlibException("Stream error."); - - } - } - } - - - - internal int SetDictionary(byte[] dictionary) - { - int index = 0; - int length = dictionary.Length; - if (mode != InflateManagerMode.DICT0) - throw new ZlibException("Stream error."); - - if (Adler.Adler32(1, dictionary, 0, dictionary.Length) != _codec._Adler32) - { - return ZlibConstants.Z_DATA_ERROR; - } - - _codec._Adler32 = Adler.Adler32(0, null, 0, 0); - - if (length >= (1 << wbits)) - { - length = (1 << wbits) - 1; - index = dictionary.Length - length; - } - blocks.SetDictionary(dictionary, index, length); - mode = InflateManagerMode.BLOCKS; - return ZlibConstants.Z_OK; - } - - - private static readonly byte[] mark = new byte[] { 0, 0, 0xff, 0xff }; - - internal int Sync() - { - int n; // number of bytes to look at - int p; // pointer to bytes - int m; // number of marker bytes found in a row - long r, w; // temporaries to save total_in and total_out - - // set up - if (mode != InflateManagerMode.BAD) - { - mode = InflateManagerMode.BAD; - marker = 0; - } - if ((n = _codec.AvailableBytesIn) == 0) - return ZlibConstants.Z_BUF_ERROR; - p = _codec.NextIn; - m = marker; - - // search - while (n != 0 && m < 4) - { - if (_codec.InputBuffer[p] == mark[m]) - { - m++; - } - else if (_codec.InputBuffer[p] != 0) - { - m = 0; - } - else - { - m = 4 - m; - } - p++; n--; - } - - // restore - _codec.TotalBytesIn += p - _codec.NextIn; - _codec.NextIn = p; - _codec.AvailableBytesIn = n; - marker = m; - - // return no joy or set up to restart on a new block - if (m != 4) - { - return ZlibConstants.Z_DATA_ERROR; - } - r = _codec.TotalBytesIn; - w = _codec.TotalBytesOut; - Reset(); - _codec.TotalBytesIn = r; - _codec.TotalBytesOut = w; - mode = InflateManagerMode.BLOCKS; - return ZlibConstants.Z_OK; - } - - - // Returns true if inflate is currently at the end of a block generated - // by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP - // implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH - // but removes the length bytes of the resulting empty stored block. When - // decompressing, PPP checks that at the end of input packet, inflate is - // waiting for these length bytes. - internal int SyncPoint(ZlibCodec z) - { - return blocks.SyncPoint(); - } - } -} diff --git a/DebugTools/MinecraftClientProxy/Compression/Tree.cs b/DebugTools/MinecraftClientProxy/Compression/Tree.cs deleted file mode 100644 index 88eaa4babc..0000000000 --- a/DebugTools/MinecraftClientProxy/Compression/Tree.cs +++ /dev/null @@ -1,423 +0,0 @@ -// Tree.cs -// ------------------------------------------------------------------ -// -// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation. -// All rights reserved. -// -// This code module is part of DotNetZip, a zipfile class library. -// -// ------------------------------------------------------------------ -// -// This code is licensed under the Microsoft Public License. -// See the file License.txt for the license details. -// More info on: http://dotnetzip.codeplex.com -// -// ------------------------------------------------------------------ -// -// last saved (in emacs): -// Time-stamp: <2009-October-28 13:29:50> -// -// ------------------------------------------------------------------ -// -// This module defines classes for zlib compression and -// decompression. This code is derived from the jzlib implementation of -// zlib. In keeping with the license for jzlib, the copyright to that -// code is below. -// -// ------------------------------------------------------------------ -// -// Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in -// the documentation and/or other materials provided with the distribution. -// -// 3. The names of the authors may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, -// INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// ----------------------------------------------------------------------- -// -// This program is based on zlib-1.1.3; credit to authors -// Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) -// and contributors of zlib. -// -// ----------------------------------------------------------------------- - - -using System; - -namespace Ionic.Zlib -{ - sealed class Tree - { - private static readonly int HEAP_SIZE = (2 * InternalConstants.L_CODES + 1); - - // extra bits for each length code - internal static readonly int[] ExtraLengthBits = new int[] - { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, - 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 - }; - - // extra bits for each distance code - internal static readonly int[] ExtraDistanceBits = new int[] - { - 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, - 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 - }; - - // extra bits for each bit length code - internal static readonly int[] extra_blbits = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7}; - - internal static readonly sbyte[] bl_order = new sbyte[]{16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - - - // The lengths of the bit length codes are sent in order of decreasing - // probability, to avoid transmitting the lengths for unused bit - // length codes. - - internal const int Buf_size = 8 * 2; - - // see definition of array dist_code below - //internal const int DIST_CODE_LEN = 512; - - private static readonly sbyte[] _dist_code = new sbyte[] - { - 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 0, 0, 16, 17, 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, - 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 - }; - - internal static readonly sbyte[] LengthCode = new sbyte[] - { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, - 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, - 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 - }; - - - internal static readonly int[] LengthBase = new int[] - { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, - 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 0 - }; - - - internal static readonly int[] DistanceBase = new int[] - { - 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192, - 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 - }; - - - /// - /// Map from a distance to a distance code. - /// - /// - /// No side effects. _dist_code[256] and _dist_code[257] are never used. - /// - internal static int DistanceCode(int dist) - { - return (dist < 256) - ? _dist_code[dist] - : _dist_code[256 + SharedUtils.URShift(dist, 7)]; - } - - internal short[] dyn_tree; // the dynamic tree - internal int max_code; // largest code with non zero frequency - internal StaticTree staticTree; // the corresponding static tree - - // Compute the optimal bit lengths for a tree and update the total bit length - // for the current block. - // IN assertion: the fields freq and dad are set, heap[heap_max] and - // above are the tree nodes sorted by increasing frequency. - // OUT assertions: the field len is set to the optimal bit length, the - // array bl_count contains the frequencies for each bit length. - // The length opt_len is updated; static_len is also updated if stree is - // not null. - internal void gen_bitlen(DeflateManager s) - { - short[] tree = dyn_tree; - short[] stree = staticTree.treeCodes; - int[] extra = staticTree.extraBits; - int base_Renamed = staticTree.extraBase; - int max_length = staticTree.maxLength; - int h; // heap index - int n, m; // iterate over the tree elements - int bits; // bit length - int xbits; // extra bits - short f; // frequency - int overflow = 0; // number of elements with bit length too large - - for (bits = 0; bits <= InternalConstants.MAX_BITS; bits++) - s.bl_count[bits] = 0; - - // In a first pass, compute the optimal bit lengths (which may - // overflow in the case of the bit length tree). - tree[s.heap[s.heap_max] * 2 + 1] = 0; // root of the heap - - for (h = s.heap_max + 1; h < HEAP_SIZE; h++) - { - n = s.heap[h]; - bits = tree[tree[n * 2 + 1] * 2 + 1] + 1; - if (bits > max_length) - { - bits = max_length; overflow++; - } - tree[n * 2 + 1] = (short) bits; - // We overwrite tree[n*2+1] which is no longer needed - - if (n > max_code) - continue; // not a leaf node - - s.bl_count[bits]++; - xbits = 0; - if (n >= base_Renamed) - xbits = extra[n - base_Renamed]; - f = tree[n * 2]; - s.opt_len += f * (bits + xbits); - if (stree != null) - s.static_len += f * (stree[n * 2 + 1] + xbits); - } - if (overflow == 0) - return ; - - // This happens for example on obj2 and pic of the Calgary corpus - // Find the first bit length which could increase: - do - { - bits = max_length - 1; - while (s.bl_count[bits] == 0) - bits--; - s.bl_count[bits]--; // move one leaf down the tree - s.bl_count[bits + 1] = (short) (s.bl_count[bits + 1] + 2); // move one overflow item as its brother - s.bl_count[max_length]--; - // The brother of the overflow item also moves one step up, - // but this does not affect bl_count[max_length] - overflow -= 2; - } - while (overflow > 0); - - for (bits = max_length; bits != 0; bits--) - { - n = s.bl_count[bits]; - while (n != 0) - { - m = s.heap[--h]; - if (m > max_code) - continue; - if (tree[m * 2 + 1] != bits) - { - s.opt_len = (int) (s.opt_len + ((long) bits - (long) tree[m * 2 + 1]) * (long) tree[m * 2]); - tree[m * 2 + 1] = (short) bits; - } - n--; - } - } - } - - // Construct one Huffman tree and assigns the code bit strings and lengths. - // Update the total bit length for the current block. - // IN assertion: the field freq is set for all tree elements. - // OUT assertions: the fields len and code are set to the optimal bit length - // and corresponding code. The length opt_len is updated; static_len is - // also updated if stree is not null. The field max_code is set. - internal void build_tree(DeflateManager s) - { - short[] tree = dyn_tree; - short[] stree = staticTree.treeCodes; - int elems = staticTree.elems; - int n, m; // iterate over heap elements - int max_code = -1; // largest code with non zero frequency - int node; // new node being created - - // Construct the initial heap, with least frequent element in - // heap[1]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - // heap[0] is not used. - s.heap_len = 0; - s.heap_max = HEAP_SIZE; - - for (n = 0; n < elems; n++) - { - if (tree[n * 2] != 0) - { - s.heap[++s.heap_len] = max_code = n; - s.depth[n] = 0; - } - else - { - tree[n * 2 + 1] = 0; - } - } - - // The pkzip format requires that at least one distance code exists, - // and that at least one bit should be sent even if there is only one - // possible code. So to avoid special checks later on we force at least - // two codes of non zero frequency. - while (s.heap_len < 2) - { - node = s.heap[++s.heap_len] = (max_code < 2?++max_code:0); - tree[node * 2] = 1; - s.depth[node] = 0; - s.opt_len--; - if (stree != null) - s.static_len -= stree[node * 2 + 1]; - // node is 0 or 1 so it does not have extra bits - } - this.max_code = max_code; - - // The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - // establish sub-heaps of increasing lengths: - - for (n = s.heap_len / 2; n >= 1; n--) - s.pqdownheap(tree, n); - - // Construct the Huffman tree by repeatedly combining the least two - // frequent nodes. - - node = elems; // next internal node of the tree - do - { - // n = node of least frequency - n = s.heap[1]; - s.heap[1] = s.heap[s.heap_len--]; - s.pqdownheap(tree, 1); - m = s.heap[1]; // m = node of next least frequency - - s.heap[--s.heap_max] = n; // keep the nodes sorted by frequency - s.heap[--s.heap_max] = m; - - // Create a new node father of n and m - tree[node * 2] = unchecked((short) (tree[n * 2] + tree[m * 2])); - s.depth[node] = (sbyte) (System.Math.Max((byte) s.depth[n], (byte) s.depth[m]) + 1); - tree[n * 2 + 1] = tree[m * 2 + 1] = (short) node; - - // and insert the new node in the heap - s.heap[1] = node++; - s.pqdownheap(tree, 1); - } - while (s.heap_len >= 2); - - s.heap[--s.heap_max] = s.heap[1]; - - // At this point, the fields freq and dad are set. We can now - // generate the bit lengths. - - gen_bitlen(s); - - // The field len is now set, we can generate the bit codes - gen_codes(tree, max_code, s.bl_count); - } - - // Generate the codes for a given tree and bit counts (which need not be - // optimal). - // IN assertion: the array bl_count contains the bit length statistics for - // the given tree and the field len is set for all tree elements. - // OUT assertion: the field code is set for all tree elements of non - // zero code length. - internal static void gen_codes(short[] tree, int max_code, short[] bl_count) - { - short[] next_code = new short[InternalConstants.MAX_BITS + 1]; // next code value for each bit length - short code = 0; // running code value - int bits; // bit index - int n; // code index - - // The distribution counts are first used to generate the code values - // without bit reversal. - for (bits = 1; bits <= InternalConstants.MAX_BITS; bits++) - unchecked { - next_code[bits] = code = (short) ((code + bl_count[bits - 1]) << 1); - } - - // Check that the bit counts in bl_count are consistent. The last code - // must be all ones. - //Assert (code + bl_count[MAX_BITS]-1 == (1<>= 1; //SharedUtils.URShift(code, 1); - res <<= 1; - } - while (--len > 0); - return res >> 1; - } - } -} diff --git a/DebugTools/MinecraftClientProxy/Compression/Zlib.cs b/DebugTools/MinecraftClientProxy/Compression/Zlib.cs deleted file mode 100644 index b5604d4a75..0000000000 --- a/DebugTools/MinecraftClientProxy/Compression/Zlib.cs +++ /dev/null @@ -1,546 +0,0 @@ -// Zlib.cs -// ------------------------------------------------------------------ -// -// Copyright (c) 2009-2011 Dino Chiesa and Microsoft Corporation. -// All rights reserved. -// -// This code module is part of DotNetZip, a zipfile class library. -// -// ------------------------------------------------------------------ -// -// This code is licensed under the Microsoft Public License. -// See the file License.txt for the license details. -// More info on: http://dotnetzip.codeplex.com -// -// ------------------------------------------------------------------ -// -// Last Saved: <2011-August-03 19:52:28> -// -// ------------------------------------------------------------------ -// -// This module defines classes for ZLIB compression and -// decompression. This code is derived from the jzlib implementation of -// zlib, but significantly modified. The object model is not the same, -// and many of the behaviors are new or different. Nonetheless, in -// keeping with the license for jzlib, the copyright to that code is -// included below. -// -// ------------------------------------------------------------------ -// -// The following notice applies to jzlib: -// -// Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in -// the documentation and/or other materials provided with the distribution. -// -// 3. The names of the authors may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, -// INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// ----------------------------------------------------------------------- -// -// jzlib is based on zlib-1.1.3. -// -// The following notice applies to zlib: -// -// ----------------------------------------------------------------------- -// -// Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler -// -// The ZLIB software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. -// -// Jean-loup Gailly jloup@gzip.org -// Mark Adler madler@alumni.caltech.edu -// -// ----------------------------------------------------------------------- - - - -using System; -using Interop=System.Runtime.InteropServices; - -namespace Ionic.Zlib -{ - - /// - /// Describes how to flush the current deflate operation. - /// - /// - /// The different FlushType values are useful when using a Deflate in a streaming application. - /// - public enum FlushType - { - /// No flush at all. - None = 0, - - /// Closes the current block, but doesn't flush it to - /// the output. Used internally only in hypothetical - /// scenarios. This was supposed to be removed by Zlib, but it is - /// still in use in some edge cases. - /// - Partial, - - /// - /// Use this during compression to specify that all pending output should be - /// flushed to the output buffer and the output should be aligned on a byte - /// boundary. You might use this in a streaming communication scenario, so that - /// the decompressor can get all input data available so far. When using this - /// with a ZlibCodec, AvailableBytesIn will be zero after the call if - /// enough output space has been provided before the call. Flushing will - /// degrade compression and so it should be used only when necessary. - /// - Sync, - - /// - /// Use this during compression to specify that all output should be flushed, as - /// with FlushType.Sync, but also, the compression state should be reset - /// so that decompression can restart from this point if previous compressed - /// data has been damaged or if random access is desired. Using - /// FlushType.Full too often can significantly degrade the compression. - /// - Full, - - /// Signals the end of the compression/decompression stream. - Finish, - } - - - /// - /// The compression level to be used when using a DeflateStream or ZlibStream with CompressionMode.Compress. - /// - public enum CompressionLevel - { - /// - /// None means that the data will be simply stored, with no change at all. - /// If you are producing ZIPs for use on Mac OSX, be aware that archives produced with CompressionLevel.None - /// cannot be opened with the default zip reader. Use a different CompressionLevel. - /// - None= 0, - /// - /// Same as None. - /// - Level0 = 0, - - /// - /// The fastest but least effective compression. - /// - BestSpeed = 1, - - /// - /// A synonym for BestSpeed. - /// - Level1 = 1, - - /// - /// A little slower, but better, than level 1. - /// - Level2 = 2, - - /// - /// A little slower, but better, than level 2. - /// - Level3 = 3, - - /// - /// A little slower, but better, than level 3. - /// - Level4 = 4, - - /// - /// A little slower than level 4, but with better compression. - /// - Level5 = 5, - - /// - /// The default compression level, with a good balance of speed and compression efficiency. - /// - Default = 6, - /// - /// A synonym for Default. - /// - Level6 = 6, - - /// - /// Pretty good compression! - /// - Level7 = 7, - - /// - /// Better compression than Level7! - /// - Level8 = 8, - - /// - /// The "best" compression, where best means greatest reduction in size of the input data stream. - /// This is also the slowest compression. - /// - BestCompression = 9, - - /// - /// A synonym for BestCompression. - /// - Level9 = 9, - } - - /// - /// Describes options for how the compression algorithm is executed. Different strategies - /// work better on different sorts of data. The strategy parameter can affect the compression - /// ratio and the speed of compression but not the correctness of the compresssion. - /// - public enum CompressionStrategy - { - /// - /// The default strategy is probably the best for normal data. - /// - Default = 0, - - /// - /// The Filtered strategy is intended to be used most effectively with data produced by a - /// filter or predictor. By this definition, filtered data consists mostly of small - /// values with a somewhat random distribution. In this case, the compression algorithm - /// is tuned to compress them better. The effect of Filtered is to force more Huffman - /// coding and less string matching; it is a half-step between Default and HuffmanOnly. - /// - Filtered = 1, - - /// - /// Using HuffmanOnly will force the compressor to do Huffman encoding only, with no - /// string matching. - /// - HuffmanOnly = 2, - } - - - /// - /// An enum to specify the direction of transcoding - whether to compress or decompress. - /// - public enum CompressionMode - { - /// - /// Used to specify that the stream should compress the data. - /// - Compress= 0, - /// - /// Used to specify that the stream should decompress the data. - /// - Decompress = 1, - } - - - /// - /// A general purpose exception class for exceptions in the Zlib library. - /// - [Interop.GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000E")] - public class ZlibException : System.Exception - { - /// - /// The ZlibException class captures exception information generated - /// by the Zlib library. - /// - public ZlibException() - : base() - { - } - - /// - /// This ctor collects a message attached to the exception. - /// - /// the message for the exception. - public ZlibException(System.String s) - : base(s) - { - } - } - - - internal class SharedUtils - { - /// - /// Performs an unsigned bitwise right shift with the specified number - /// - /// Number to operate on - /// Ammount of bits to shift - /// The resulting number from the shift operation - public static int URShift(int number, int bits) - { - return (int)((uint)number >> bits); - } - -#if NOT - /// - /// Performs an unsigned bitwise right shift with the specified number - /// - /// Number to operate on - /// Ammount of bits to shift - /// The resulting number from the shift operation - public static long URShift(long number, int bits) - { - return (long) ((UInt64)number >> bits); - } -#endif - - /// - /// Reads a number of characters from the current source TextReader and writes - /// the data to the target array at the specified index. - /// - /// - /// The source TextReader to read from - /// Contains the array of characteres read from the source TextReader. - /// The starting index of the target array. - /// The maximum number of characters to read from the source TextReader. - /// - /// - /// The number of characters read. The number will be less than or equal to - /// count depending on the data available in the source TextReader. Returns -1 - /// if the end of the stream is reached. - /// - public static System.Int32 ReadInput(System.IO.TextReader sourceTextReader, byte[] target, int start, int count) - { - // Returns 0 bytes if not enough space in target - if (target.Length == 0) return 0; - - char[] charArray = new char[target.Length]; - int bytesRead = sourceTextReader.Read(charArray, start, count); - - // Returns -1 if EOF - if (bytesRead == 0) return -1; - - for (int index = start; index < start + bytesRead; index++) - target[index] = (byte)charArray[index]; - - return bytesRead; - } - - - internal static byte[] ToByteArray(System.String sourceString) - { - return System.Text.UTF8Encoding.UTF8.GetBytes(sourceString); - } - - - internal static char[] ToCharArray(byte[] byteArray) - { - return System.Text.UTF8Encoding.UTF8.GetChars(byteArray); - } - } - - internal static class InternalConstants - { - internal static readonly int MAX_BITS = 15; - internal static readonly int BL_CODES = 19; - internal static readonly int D_CODES = 30; - internal static readonly int LITERALS = 256; - internal static readonly int LENGTH_CODES = 29; - internal static readonly int L_CODES = (LITERALS + 1 + LENGTH_CODES); - - // Bit length codes must not exceed MAX_BL_BITS bits - internal static readonly int MAX_BL_BITS = 7; - - // repeat previous bit length 3-6 times (2 bits of repeat count) - internal static readonly int REP_3_6 = 16; - - // repeat a zero length 3-10 times (3 bits of repeat count) - internal static readonly int REPZ_3_10 = 17; - - // repeat a zero length 11-138 times (7 bits of repeat count) - internal static readonly int REPZ_11_138 = 18; - - } - - internal sealed class StaticTree - { - internal static readonly short[] lengthAndLiteralsTreeCodes = new short[] { - 12, 8, 140, 8, 76, 8, 204, 8, 44, 8, 172, 8, 108, 8, 236, 8, - 28, 8, 156, 8, 92, 8, 220, 8, 60, 8, 188, 8, 124, 8, 252, 8, - 2, 8, 130, 8, 66, 8, 194, 8, 34, 8, 162, 8, 98, 8, 226, 8, - 18, 8, 146, 8, 82, 8, 210, 8, 50, 8, 178, 8, 114, 8, 242, 8, - 10, 8, 138, 8, 74, 8, 202, 8, 42, 8, 170, 8, 106, 8, 234, 8, - 26, 8, 154, 8, 90, 8, 218, 8, 58, 8, 186, 8, 122, 8, 250, 8, - 6, 8, 134, 8, 70, 8, 198, 8, 38, 8, 166, 8, 102, 8, 230, 8, - 22, 8, 150, 8, 86, 8, 214, 8, 54, 8, 182, 8, 118, 8, 246, 8, - 14, 8, 142, 8, 78, 8, 206, 8, 46, 8, 174, 8, 110, 8, 238, 8, - 30, 8, 158, 8, 94, 8, 222, 8, 62, 8, 190, 8, 126, 8, 254, 8, - 1, 8, 129, 8, 65, 8, 193, 8, 33, 8, 161, 8, 97, 8, 225, 8, - 17, 8, 145, 8, 81, 8, 209, 8, 49, 8, 177, 8, 113, 8, 241, 8, - 9, 8, 137, 8, 73, 8, 201, 8, 41, 8, 169, 8, 105, 8, 233, 8, - 25, 8, 153, 8, 89, 8, 217, 8, 57, 8, 185, 8, 121, 8, 249, 8, - 5, 8, 133, 8, 69, 8, 197, 8, 37, 8, 165, 8, 101, 8, 229, 8, - 21, 8, 149, 8, 85, 8, 213, 8, 53, 8, 181, 8, 117, 8, 245, 8, - 13, 8, 141, 8, 77, 8, 205, 8, 45, 8, 173, 8, 109, 8, 237, 8, - 29, 8, 157, 8, 93, 8, 221, 8, 61, 8, 189, 8, 125, 8, 253, 8, - 19, 9, 275, 9, 147, 9, 403, 9, 83, 9, 339, 9, 211, 9, 467, 9, - 51, 9, 307, 9, 179, 9, 435, 9, 115, 9, 371, 9, 243, 9, 499, 9, - 11, 9, 267, 9, 139, 9, 395, 9, 75, 9, 331, 9, 203, 9, 459, 9, - 43, 9, 299, 9, 171, 9, 427, 9, 107, 9, 363, 9, 235, 9, 491, 9, - 27, 9, 283, 9, 155, 9, 411, 9, 91, 9, 347, 9, 219, 9, 475, 9, - 59, 9, 315, 9, 187, 9, 443, 9, 123, 9, 379, 9, 251, 9, 507, 9, - 7, 9, 263, 9, 135, 9, 391, 9, 71, 9, 327, 9, 199, 9, 455, 9, - 39, 9, 295, 9, 167, 9, 423, 9, 103, 9, 359, 9, 231, 9, 487, 9, - 23, 9, 279, 9, 151, 9, 407, 9, 87, 9, 343, 9, 215, 9, 471, 9, - 55, 9, 311, 9, 183, 9, 439, 9, 119, 9, 375, 9, 247, 9, 503, 9, - 15, 9, 271, 9, 143, 9, 399, 9, 79, 9, 335, 9, 207, 9, 463, 9, - 47, 9, 303, 9, 175, 9, 431, 9, 111, 9, 367, 9, 239, 9, 495, 9, - 31, 9, 287, 9, 159, 9, 415, 9, 95, 9, 351, 9, 223, 9, 479, 9, - 63, 9, 319, 9, 191, 9, 447, 9, 127, 9, 383, 9, 255, 9, 511, 9, - 0, 7, 64, 7, 32, 7, 96, 7, 16, 7, 80, 7, 48, 7, 112, 7, - 8, 7, 72, 7, 40, 7, 104, 7, 24, 7, 88, 7, 56, 7, 120, 7, - 4, 7, 68, 7, 36, 7, 100, 7, 20, 7, 84, 7, 52, 7, 116, 7, - 3, 8, 131, 8, 67, 8, 195, 8, 35, 8, 163, 8, 99, 8, 227, 8 - }; - - internal static readonly short[] distTreeCodes = new short[] { - 0, 5, 16, 5, 8, 5, 24, 5, 4, 5, 20, 5, 12, 5, 28, 5, - 2, 5, 18, 5, 10, 5, 26, 5, 6, 5, 22, 5, 14, 5, 30, 5, - 1, 5, 17, 5, 9, 5, 25, 5, 5, 5, 21, 5, 13, 5, 29, 5, - 3, 5, 19, 5, 11, 5, 27, 5, 7, 5, 23, 5 }; - - internal static readonly StaticTree Literals; - internal static readonly StaticTree Distances; - internal static readonly StaticTree BitLengths; - - internal short[] treeCodes; // static tree or null - internal int[] extraBits; // extra bits for each code or null - internal int extraBase; // base index for extra_bits - internal int elems; // max number of elements in the tree - internal int maxLength; // max bit length for the codes - - private StaticTree(short[] treeCodes, int[] extraBits, int extraBase, int elems, int maxLength) - { - this.treeCodes = treeCodes; - this.extraBits = extraBits; - this.extraBase = extraBase; - this.elems = elems; - this.maxLength = maxLength; - } - static StaticTree() - { - Literals = new StaticTree(lengthAndLiteralsTreeCodes, Tree.ExtraLengthBits, InternalConstants.LITERALS + 1, InternalConstants.L_CODES, InternalConstants.MAX_BITS); - Distances = new StaticTree(distTreeCodes, Tree.ExtraDistanceBits, 0, InternalConstants.D_CODES, InternalConstants.MAX_BITS); - BitLengths = new StaticTree(null, Tree.extra_blbits, 0, InternalConstants.BL_CODES, InternalConstants.MAX_BL_BITS); - } - } - - - - /// - /// Computes an Adler-32 checksum. - /// - /// - /// The Adler checksum is similar to a CRC checksum, but faster to compute, though less - /// reliable. It is used in producing RFC1950 compressed streams. The Adler checksum - /// is a required part of the "ZLIB" standard. Applications will almost never need to - /// use this class directly. - /// - /// - /// - public sealed class Adler - { - // largest prime smaller than 65536 - private static readonly uint BASE = 65521; - // NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 - private static readonly int NMAX = 5552; - - -#pragma warning disable 3001 -#pragma warning disable 3002 - - /// - /// Calculates the Adler32 checksum. - /// - /// - /// - /// This is used within ZLIB. You probably don't need to use this directly. - /// - /// - /// - /// To compute an Adler32 checksum on a byte array: - /// - /// var adler = Adler.Adler32(0, null, 0, 0); - /// adler = Adler.Adler32(adler, buffer, index, length); - /// - /// - public static uint Adler32(uint adler, byte[] buf, int index, int len) - { - if (buf == null) - return 1; - - uint s1 = (uint) (adler & 0xffff); - uint s2 = (uint) ((adler >> 16) & 0xffff); - - while (len > 0) - { - int k = len < NMAX ? len : NMAX; - len -= k; - while (k >= 16) - { - //s1 += (buf[index++] & 0xff); s2 += s1; - s1 += buf[index++]; s2 += s1; - s1 += buf[index++]; s2 += s1; - s1 += buf[index++]; s2 += s1; - s1 += buf[index++]; s2 += s1; - s1 += buf[index++]; s2 += s1; - s1 += buf[index++]; s2 += s1; - s1 += buf[index++]; s2 += s1; - s1 += buf[index++]; s2 += s1; - s1 += buf[index++]; s2 += s1; - s1 += buf[index++]; s2 += s1; - s1 += buf[index++]; s2 += s1; - s1 += buf[index++]; s2 += s1; - s1 += buf[index++]; s2 += s1; - s1 += buf[index++]; s2 += s1; - s1 += buf[index++]; s2 += s1; - s1 += buf[index++]; s2 += s1; - k -= 16; - } - if (k != 0) - { - do - { - s1 += buf[index++]; - s2 += s1; - } - while (--k != 0); - } - s1 %= BASE; - s2 %= BASE; - } - return (uint)((s2 << 16) | s1); - } -#pragma warning restore 3001 -#pragma warning restore 3002 - - } - -} diff --git a/DebugTools/MinecraftClientProxy/Compression/ZlibBaseStream.cs b/DebugTools/MinecraftClientProxy/Compression/ZlibBaseStream.cs deleted file mode 100644 index b085c0cb3c..0000000000 --- a/DebugTools/MinecraftClientProxy/Compression/ZlibBaseStream.cs +++ /dev/null @@ -1,627 +0,0 @@ -// ZlibBaseStream.cs -// ------------------------------------------------------------------ -// -// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation. -// All rights reserved. -// -// This code module is part of DotNetZip, a zipfile class library. -// -// ------------------------------------------------------------------ -// -// This code is licensed under the Microsoft Public License. -// See the file License.txt for the license details. -// More info on: http://dotnetzip.codeplex.com -// -// ------------------------------------------------------------------ -// -// last saved (in emacs): -// Time-stamp: <2011-August-06 21:22:38> -// -// ------------------------------------------------------------------ -// -// This module defines the ZlibBaseStream class, which is an intnernal -// base class for DeflateStream, ZlibStream and GZipStream. -// -// ------------------------------------------------------------------ - -using System; -using System.IO; - -namespace Ionic.Zlib -{ - - internal enum ZlibStreamFlavor { ZLIB = 1950, DEFLATE = 1951, GZIP = 1952 } - - internal class ZlibBaseStream : System.IO.Stream - { - protected internal ZlibCodec _z = null; // deferred init... new ZlibCodec(); - - protected internal StreamMode _streamMode = StreamMode.Undefined; - protected internal FlushType _flushMode; - protected internal ZlibStreamFlavor _flavor; - protected internal CompressionMode _compressionMode; - protected internal CompressionLevel _level; - protected internal bool _leaveOpen; - protected internal byte[] _workingBuffer; - protected internal int _bufferSize = ZlibConstants.WorkingBufferSizeDefault; - protected internal byte[] _buf1 = new byte[1]; - - protected internal System.IO.Stream _stream; - protected internal CompressionStrategy Strategy = CompressionStrategy.Default; - - // workitem 7159 - Ionic.Crc.CRC32 crc; - protected internal string _GzipFileName; - protected internal string _GzipComment; - protected internal DateTime _GzipMtime; - protected internal int _gzipHeaderByteCount; - - internal int Crc32 { get { if (crc == null) return 0; return crc.Crc32Result; } } - - public ZlibBaseStream(System.IO.Stream stream, - CompressionMode compressionMode, - CompressionLevel level, - ZlibStreamFlavor flavor, - bool leaveOpen) - : base() - { - this._flushMode = FlushType.None; - //this._workingBuffer = new byte[WORKING_BUFFER_SIZE_DEFAULT]; - this._stream = stream; - this._leaveOpen = leaveOpen; - this._compressionMode = compressionMode; - this._flavor = flavor; - this._level = level; - // workitem 7159 - if (flavor == ZlibStreamFlavor.GZIP) - { - this.crc = new Ionic.Crc.CRC32(); - } - } - - - protected internal bool _wantCompress - { - get - { - return (this._compressionMode == CompressionMode.Compress); - } - } - - private ZlibCodec z - { - get - { - if (_z == null) - { - bool wantRfc1950Header = (this._flavor == ZlibStreamFlavor.ZLIB); - _z = new ZlibCodec(); - if (this._compressionMode == CompressionMode.Decompress) - { - _z.InitializeInflate(wantRfc1950Header); - } - else - { - _z.Strategy = Strategy; - _z.InitializeDeflate(this._level, wantRfc1950Header); - } - } - return _z; - } - } - - - - private byte[] workingBuffer - { - get - { - if (_workingBuffer == null) - _workingBuffer = new byte[_bufferSize]; - return _workingBuffer; - } - } - - - - public override void Write(System.Byte[] buffer, int offset, int count) - { - // workitem 7159 - // calculate the CRC on the unccompressed data (before writing) - if (crc != null) - crc.SlurpBlock(buffer, offset, count); - - if (_streamMode == StreamMode.Undefined) - _streamMode = StreamMode.Writer; - else if (_streamMode != StreamMode.Writer) - throw new ZlibException("Cannot Write after Reading."); - - if (count == 0) - return; - - // first reference of z property will initialize the private var _z - z.InputBuffer = buffer; - _z.NextIn = offset; - _z.AvailableBytesIn = count; - bool done = false; - do - { - _z.OutputBuffer = workingBuffer; - _z.NextOut = 0; - _z.AvailableBytesOut = _workingBuffer.Length; - int rc = (_wantCompress) - ? _z.Deflate(_flushMode) - : _z.Inflate(_flushMode); - if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END) - throw new ZlibException((_wantCompress ? "de" : "in") + "flating: " + _z.Message); - - //if (_workingBuffer.Length - _z.AvailableBytesOut > 0) - _stream.Write(_workingBuffer, 0, _workingBuffer.Length - _z.AvailableBytesOut); - - done = _z.AvailableBytesIn == 0 && _z.AvailableBytesOut != 0; - - // If GZIP and de-compress, we're done when 8 bytes remain. - if (_flavor == ZlibStreamFlavor.GZIP && !_wantCompress) - done = (_z.AvailableBytesIn == 8 && _z.AvailableBytesOut != 0); - - } - while (!done); - } - - - - private void finish() - { - if (_z == null) return; - - if (_streamMode == StreamMode.Writer) - { - bool done = false; - do - { - _z.OutputBuffer = workingBuffer; - _z.NextOut = 0; - _z.AvailableBytesOut = _workingBuffer.Length; - int rc = (_wantCompress) - ? _z.Deflate(FlushType.Finish) - : _z.Inflate(FlushType.Finish); - - if (rc != ZlibConstants.Z_STREAM_END && rc != ZlibConstants.Z_OK) - { - string verb = (_wantCompress ? "de" : "in") + "flating"; - if (_z.Message == null) - throw new ZlibException(String.Format("{0}: (rc = {1})", verb, rc)); - else - throw new ZlibException(verb + ": " + _z.Message); - } - - if (_workingBuffer.Length - _z.AvailableBytesOut > 0) - { - _stream.Write(_workingBuffer, 0, _workingBuffer.Length - _z.AvailableBytesOut); - } - - done = _z.AvailableBytesIn == 0 && _z.AvailableBytesOut != 0; - // If GZIP and de-compress, we're done when 8 bytes remain. - if (_flavor == ZlibStreamFlavor.GZIP && !_wantCompress) - done = (_z.AvailableBytesIn == 8 && _z.AvailableBytesOut != 0); - - } - while (!done); - - Flush(); - - // workitem 7159 - if (_flavor == ZlibStreamFlavor.GZIP) - { - if (_wantCompress) - { - // Emit the GZIP trailer: CRC32 and size mod 2^32 - int c1 = crc.Crc32Result; - _stream.Write(BitConverter.GetBytes(c1), 0, 4); - int c2 = (Int32)(crc.TotalBytesRead & 0x00000000FFFFFFFF); - _stream.Write(BitConverter.GetBytes(c2), 0, 4); - } - else - { - throw new ZlibException("Writing with decompression is not supported."); - } - } - } - // workitem 7159 - else if (_streamMode == StreamMode.Reader) - { - if (_flavor == ZlibStreamFlavor.GZIP) - { - if (!_wantCompress) - { - // workitem 8501: handle edge case (decompress empty stream) - if (_z.TotalBytesOut == 0L) - return; - - // Read and potentially verify the GZIP trailer: - // CRC32 and size mod 2^32 - byte[] trailer = new byte[8]; - - // workitems 8679 & 12554 - if (_z.AvailableBytesIn < 8) - { - // Make sure we have read to the end of the stream - Array.Copy(_z.InputBuffer, _z.NextIn, trailer, 0, _z.AvailableBytesIn); - int bytesNeeded = 8 - _z.AvailableBytesIn; - int bytesRead = _stream.Read(trailer, - _z.AvailableBytesIn, - bytesNeeded); - if (bytesNeeded != bytesRead) - { - throw new ZlibException(String.Format("Missing or incomplete GZIP trailer. Expected 8 bytes, got {0}.", - _z.AvailableBytesIn + bytesRead)); - } - } - else - { - Array.Copy(_z.InputBuffer, _z.NextIn, trailer, 0, trailer.Length); - } - - Int32 crc32_expected = BitConverter.ToInt32(trailer, 0); - Int32 crc32_actual = crc.Crc32Result; - Int32 isize_expected = BitConverter.ToInt32(trailer, 4); - Int32 isize_actual = (Int32)(_z.TotalBytesOut & 0x00000000FFFFFFFF); - - if (crc32_actual != crc32_expected) - throw new ZlibException(String.Format("Bad CRC32 in GZIP trailer. (actual({0:X8})!=expected({1:X8}))", crc32_actual, crc32_expected)); - - if (isize_actual != isize_expected) - throw new ZlibException(String.Format("Bad size in GZIP trailer. (actual({0})!=expected({1}))", isize_actual, isize_expected)); - - } - else - { - throw new ZlibException("Reading with compression is not supported."); - } - } - } - } - - - private void end() - { - if (z == null) - return; - if (_wantCompress) - { - _z.EndDeflate(); - } - else - { - _z.EndInflate(); - } - _z = null; - } - - - public override void Close() - { - if (_stream == null) return; - try - { - finish(); - } - finally - { - end(); - if (!_leaveOpen) _stream.Close(); - _stream = null; - } - } - - public override void Flush() - { - _stream.Flush(); - } - - public override System.Int64 Seek(System.Int64 offset, System.IO.SeekOrigin origin) - { - throw new NotImplementedException(); - //_outStream.Seek(offset, origin); - } - public override void SetLength(System.Int64 value) - { - _stream.SetLength(value); - } - - -#if NOT - public int Read() - { - if (Read(_buf1, 0, 1) == 0) - return 0; - // calculate CRC after reading - if (crc!=null) - crc.SlurpBlock(_buf1,0,1); - return (_buf1[0] & 0xFF); - } -#endif - - private bool nomoreinput = false; - - - - private string ReadZeroTerminatedString() - { - var list = new System.Collections.Generic.List(); - bool done = false; - do - { - // workitem 7740 - int n = _stream.Read(_buf1, 0, 1); - if (n != 1) - throw new ZlibException("Unexpected EOF reading GZIP header."); - else - { - if (_buf1[0] == 0) - done = true; - else - list.Add(_buf1[0]); - } - } while (!done); - byte[] a = list.ToArray(); - return GZipStream.iso8859dash1.GetString(a, 0, a.Length); - } - - - private int _ReadAndValidateGzipHeader() - { - int totalBytesRead = 0; - // read the header on the first read - byte[] header = new byte[10]; - int n = _stream.Read(header, 0, header.Length); - - // workitem 8501: handle edge case (decompress empty stream) - if (n == 0) - return 0; - - if (n != 10) - throw new ZlibException("Not a valid GZIP stream."); - - if (header[0] != 0x1F || header[1] != 0x8B || header[2] != 8) - throw new ZlibException("Bad GZIP header."); - - Int32 timet = BitConverter.ToInt32(header, 4); - _GzipMtime = GZipStream._unixEpoch.AddSeconds(timet); - totalBytesRead += n; - if ((header[3] & 0x04) == 0x04) - { - // read and discard extra field - n = _stream.Read(header, 0, 2); // 2-byte length field - totalBytesRead += n; - - Int16 extraLength = (Int16)(header[0] + header[1] * 256); - byte[] extra = new byte[extraLength]; - n = _stream.Read(extra, 0, extra.Length); - if (n != extraLength) - throw new ZlibException("Unexpected end-of-file reading GZIP header."); - totalBytesRead += n; - } - if ((header[3] & 0x08) == 0x08) - _GzipFileName = ReadZeroTerminatedString(); - if ((header[3] & 0x10) == 0x010) - _GzipComment = ReadZeroTerminatedString(); - if ((header[3] & 0x02) == 0x02) - Read(_buf1, 0, 1); // CRC16, ignore - - return totalBytesRead; - } - - - - public override System.Int32 Read(System.Byte[] buffer, System.Int32 offset, System.Int32 count) - { - // According to MS documentation, any implementation of the IO.Stream.Read function must: - // (a) throw an exception if offset & count reference an invalid part of the buffer, - // or if count < 0, or if buffer is null - // (b) return 0 only upon EOF, or if count = 0 - // (c) if not EOF, then return at least 1 byte, up to bytes - - if (_streamMode == StreamMode.Undefined) - { - if (!this._stream.CanRead) throw new ZlibException("The stream is not readable."); - // for the first read, set up some controls. - _streamMode = StreamMode.Reader; - // (The first reference to _z goes through the private accessor which - // may initialize it.) - z.AvailableBytesIn = 0; - if (_flavor == ZlibStreamFlavor.GZIP) - { - _gzipHeaderByteCount = _ReadAndValidateGzipHeader(); - // workitem 8501: handle edge case (decompress empty stream) - if (_gzipHeaderByteCount == 0) - return 0; - } - } - - if (_streamMode != StreamMode.Reader) - throw new ZlibException("Cannot Read after Writing."); - - if (count == 0) return 0; - if (nomoreinput && _wantCompress) return 0; // workitem 8557 - if (buffer == null) throw new ArgumentNullException("buffer"); - if (count < 0) throw new ArgumentOutOfRangeException("count"); - if (offset < buffer.GetLowerBound(0)) throw new ArgumentOutOfRangeException("offset"); - if ((offset + count) > buffer.GetLength(0)) throw new ArgumentOutOfRangeException("count"); - - int rc = 0; - - // set up the output of the deflate/inflate codec: - _z.OutputBuffer = buffer; - _z.NextOut = offset; - _z.AvailableBytesOut = count; - - // This is necessary in case _workingBuffer has been resized. (new byte[]) - // (The first reference to _workingBuffer goes through the private accessor which - // may initialize it.) - _z.InputBuffer = workingBuffer; - - do - { - // need data in _workingBuffer in order to deflate/inflate. Here, we check if we have any. - if ((_z.AvailableBytesIn == 0) && (!nomoreinput)) - { - // No data available, so try to Read data from the captive stream. - _z.NextIn = 0; - _z.AvailableBytesIn = _stream.Read(_workingBuffer, 0, _workingBuffer.Length); - if (_z.AvailableBytesIn == 0) - nomoreinput = true; - - } - // we have data in InputBuffer; now compress or decompress as appropriate - rc = (_wantCompress) - ? _z.Deflate(_flushMode) - : _z.Inflate(_flushMode); - - if (nomoreinput && (rc == ZlibConstants.Z_BUF_ERROR)) - return 0; - - if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END) - throw new ZlibException(String.Format("{0}flating: rc={1} msg={2}", (_wantCompress ? "de" : "in"), rc, _z.Message)); - - if ((nomoreinput || rc == ZlibConstants.Z_STREAM_END) && (_z.AvailableBytesOut == count)) - break; // nothing more to read - } - //while (_z.AvailableBytesOut == count && rc == ZlibConstants.Z_OK); - while (_z.AvailableBytesOut > 0 && !nomoreinput && rc == ZlibConstants.Z_OK); - - - // workitem 8557 - // is there more room in output? - if (_z.AvailableBytesOut > 0) - { - if (rc == ZlibConstants.Z_OK && _z.AvailableBytesIn == 0) - { - // deferred - } - - // are we completely done reading? - if (nomoreinput) - { - // and in compression? - if (_wantCompress) - { - // no more input data available; therefore we flush to - // try to complete the read - rc = _z.Deflate(FlushType.Finish); - - if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END) - throw new ZlibException(String.Format("Deflating: rc={0} msg={1}", rc, _z.Message)); - } - } - } - - - rc = (count - _z.AvailableBytesOut); - - // calculate CRC after reading - if (crc != null) - crc.SlurpBlock(buffer, offset, rc); - - return rc; - } - - - - public override System.Boolean CanRead - { - get { return this._stream.CanRead; } - } - - public override System.Boolean CanSeek - { - get { return this._stream.CanSeek; } - } - - public override System.Boolean CanWrite - { - get { return this._stream.CanWrite; } - } - - public override System.Int64 Length - { - get { return _stream.Length; } - } - - public override long Position - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - internal enum StreamMode - { - Writer, - Reader, - Undefined, - } - - - public static void CompressString(String s, Stream compressor) - { - byte[] uncompressed = System.Text.Encoding.UTF8.GetBytes(s); - using (compressor) - { - compressor.Write(uncompressed, 0, uncompressed.Length); - } - } - - public static void CompressBuffer(byte[] b, Stream compressor) - { - // workitem 8460 - using (compressor) - { - compressor.Write(b, 0, b.Length); - } - } - - public static String UncompressString(byte[] compressed, Stream decompressor) - { - // workitem 8460 - byte[] working = new byte[1024]; - var encoding = System.Text.Encoding.UTF8; - using (var output = new MemoryStream()) - { - using (decompressor) - { - int n; - while ((n = decompressor.Read(working, 0, working.Length)) != 0) - { - output.Write(working, 0, n); - } - } - - // reset to allow read from start - output.Seek(0, SeekOrigin.Begin); - var sr = new StreamReader(output, encoding); - return sr.ReadToEnd(); - } - } - - public static byte[] UncompressBuffer(byte[] compressed, Stream decompressor) - { - // workitem 8460 - byte[] working = new byte[1024]; - using (var output = new MemoryStream()) - { - using (decompressor) - { - int n; - while ((n = decompressor.Read(working, 0, working.Length)) != 0) - { - output.Write(working, 0, n); - } - } - return output.ToArray(); - } - } - - } - - -} diff --git a/DebugTools/MinecraftClientProxy/Compression/ZlibCodec.cs b/DebugTools/MinecraftClientProxy/Compression/ZlibCodec.cs deleted file mode 100644 index c8fdd7fdf8..0000000000 --- a/DebugTools/MinecraftClientProxy/Compression/ZlibCodec.cs +++ /dev/null @@ -1,717 +0,0 @@ -// ZlibCodec.cs -// ------------------------------------------------------------------ -// -// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation. -// All rights reserved. -// -// This code module is part of DotNetZip, a zipfile class library. -// -// ------------------------------------------------------------------ -// -// This code is licensed under the Microsoft Public License. -// See the file License.txt for the license details. -// More info on: http://dotnetzip.codeplex.com -// -// ------------------------------------------------------------------ -// -// last saved (in emacs): -// Time-stamp: <2009-November-03 15:40:51> -// -// ------------------------------------------------------------------ -// -// This module defines a Codec for ZLIB compression and -// decompression. This code extends code that was based the jzlib -// implementation of zlib, but this code is completely novel. The codec -// class is new, and encapsulates some behaviors that are new, and some -// that were present in other classes in the jzlib code base. In -// keeping with the license for jzlib, the copyright to the jzlib code -// is included below. -// -// ------------------------------------------------------------------ -// -// Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in -// the documentation and/or other materials provided with the distribution. -// -// 3. The names of the authors may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, -// INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// ----------------------------------------------------------------------- -// -// This program is based on zlib-1.1.3; credit to authors -// Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) -// and contributors of zlib. -// -// ----------------------------------------------------------------------- - - -using System; -using Interop=System.Runtime.InteropServices; - -namespace Ionic.Zlib -{ - /// - /// Encoder and Decoder for ZLIB and DEFLATE (IETF RFC1950 and RFC1951). - /// - /// - /// - /// This class compresses and decompresses data according to the Deflate algorithm - /// and optionally, the ZLIB format, as documented in RFC 1950 - ZLIB and RFC 1951 - DEFLATE. - /// - [Interop.GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000D")] - [Interop.ComVisible(true)] -#if !NETCF - [Interop.ClassInterface(Interop.ClassInterfaceType.AutoDispatch)] -#endif - sealed public class ZlibCodec - { - /// - /// The buffer from which data is taken. - /// - public byte[] InputBuffer; - - /// - /// An index into the InputBuffer array, indicating where to start reading. - /// - public int NextIn; - - /// - /// The number of bytes available in the InputBuffer, starting at NextIn. - /// - /// - /// Generally you should set this to InputBuffer.Length before the first Inflate() or Deflate() call. - /// The class will update this number as calls to Inflate/Deflate are made. - /// - public int AvailableBytesIn; - - /// - /// Total number of bytes read so far, through all calls to Inflate()/Deflate(). - /// - public long TotalBytesIn; - - /// - /// Buffer to store output data. - /// - public byte[] OutputBuffer; - - /// - /// An index into the OutputBuffer array, indicating where to start writing. - /// - public int NextOut; - - /// - /// The number of bytes available in the OutputBuffer, starting at NextOut. - /// - /// - /// Generally you should set this to OutputBuffer.Length before the first Inflate() or Deflate() call. - /// The class will update this number as calls to Inflate/Deflate are made. - /// - public int AvailableBytesOut; - - /// - /// Total number of bytes written to the output so far, through all calls to Inflate()/Deflate(). - /// - public long TotalBytesOut; - - /// - /// used for diagnostics, when something goes wrong! - /// - public System.String Message; - - internal DeflateManager dstate; - internal InflateManager istate; - - internal uint _Adler32; - - /// - /// The compression level to use in this codec. Useful only in compression mode. - /// - public CompressionLevel CompressLevel = CompressionLevel.Default; - - /// - /// The number of Window Bits to use. - /// - /// - /// This gauges the size of the sliding window, and hence the - /// compression effectiveness as well as memory consumption. It's best to just leave this - /// setting alone if you don't know what it is. The maximum value is 15 bits, which implies - /// a 32k window. - /// - public int WindowBits = ZlibConstants.WindowBitsDefault; - - /// - /// The compression strategy to use. - /// - /// - /// This is only effective in compression. The theory offered by ZLIB is that different - /// strategies could potentially produce significant differences in compression behavior - /// for different data sets. Unfortunately I don't have any good recommendations for how - /// to set it differently. When I tested changing the strategy I got minimally different - /// compression performance. It's best to leave this property alone if you don't have a - /// good feel for it. Or, you may want to produce a test harness that runs through the - /// different strategy options and evaluates them on different file types. If you do that, - /// let me know your results. - /// - public CompressionStrategy Strategy = CompressionStrategy.Default; - - - /// - /// The Adler32 checksum on the data transferred through the codec so far. You probably don't need to look at this. - /// - public int Adler32 { get { return (int)_Adler32; } } - - - /// - /// Create a ZlibCodec. - /// - /// - /// If you use this default constructor, you will later have to explicitly call - /// InitializeInflate() or InitializeDeflate() before using the ZlibCodec to compress - /// or decompress. - /// - public ZlibCodec() { } - - /// - /// Create a ZlibCodec that either compresses or decompresses. - /// - /// - /// Indicates whether the codec should compress (deflate) or decompress (inflate). - /// - public ZlibCodec(CompressionMode mode) - { - if (mode == CompressionMode.Compress) - { - int rc = InitializeDeflate(); - if (rc != ZlibConstants.Z_OK) throw new ZlibException("Cannot initialize for deflate."); - } - else if (mode == CompressionMode.Decompress) - { - int rc = InitializeInflate(); - if (rc != ZlibConstants.Z_OK) throw new ZlibException("Cannot initialize for inflate."); - } - else throw new ZlibException("Invalid ZlibStreamFlavor."); - } - - /// - /// Initialize the inflation state. - /// - /// - /// It is not necessary to call this before using the ZlibCodec to inflate data; - /// It is implicitly called when you call the constructor. - /// - /// Z_OK if everything goes well. - public int InitializeInflate() - { - return InitializeInflate(this.WindowBits); - } - - /// - /// Initialize the inflation state with an explicit flag to - /// govern the handling of RFC1950 header bytes. - /// - /// - /// - /// By default, the ZLIB header defined in RFC 1950 is expected. If - /// you want to read a zlib stream you should specify true for - /// expectRfc1950Header. If you have a deflate stream, you will want to specify - /// false. It is only necessary to invoke this initializer explicitly if you - /// want to specify false. - /// - /// - /// whether to expect an RFC1950 header byte - /// pair when reading the stream of data to be inflated. - /// - /// Z_OK if everything goes well. - public int InitializeInflate(bool expectRfc1950Header) - { - return InitializeInflate(this.WindowBits, expectRfc1950Header); - } - - /// - /// Initialize the ZlibCodec for inflation, with the specified number of window bits. - /// - /// The number of window bits to use. If you need to ask what that is, - /// then you shouldn't be calling this initializer. - /// Z_OK if all goes well. - public int InitializeInflate(int windowBits) - { - this.WindowBits = windowBits; - return InitializeInflate(windowBits, true); - } - - /// - /// Initialize the inflation state with an explicit flag to govern the handling of - /// RFC1950 header bytes. - /// - /// - /// - /// If you want to read a zlib stream you should specify true for - /// expectRfc1950Header. In this case, the library will expect to find a ZLIB - /// header, as defined in RFC - /// 1950, in the compressed stream. If you will be reading a DEFLATE or - /// GZIP stream, which does not have such a header, you will want to specify - /// false. - /// - /// - /// whether to expect an RFC1950 header byte pair when reading - /// the stream of data to be inflated. - /// The number of window bits to use. If you need to ask what that is, - /// then you shouldn't be calling this initializer. - /// Z_OK if everything goes well. - public int InitializeInflate(int windowBits, bool expectRfc1950Header) - { - this.WindowBits = windowBits; - if (dstate != null) throw new ZlibException("You may not call InitializeInflate() after calling InitializeDeflate()."); - istate = new InflateManager(expectRfc1950Header); - return istate.Initialize(this, windowBits); - } - - /// - /// Inflate the data in the InputBuffer, placing the result in the OutputBuffer. - /// - /// - /// You must have set InputBuffer and OutputBuffer, NextIn and NextOut, and AvailableBytesIn and - /// AvailableBytesOut before calling this method. - /// - /// - /// - /// private void InflateBuffer() - /// { - /// int bufferSize = 1024; - /// byte[] buffer = new byte[bufferSize]; - /// ZlibCodec decompressor = new ZlibCodec(); - /// - /// Console.WriteLine("\n============================================"); - /// Console.WriteLine("Size of Buffer to Inflate: {0} bytes.", CompressedBytes.Length); - /// MemoryStream ms = new MemoryStream(DecompressedBytes); - /// - /// int rc = decompressor.InitializeInflate(); - /// - /// decompressor.InputBuffer = CompressedBytes; - /// decompressor.NextIn = 0; - /// decompressor.AvailableBytesIn = CompressedBytes.Length; - /// - /// decompressor.OutputBuffer = buffer; - /// - /// // pass 1: inflate - /// do - /// { - /// decompressor.NextOut = 0; - /// decompressor.AvailableBytesOut = buffer.Length; - /// rc = decompressor.Inflate(FlushType.None); - /// - /// if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END) - /// throw new Exception("inflating: " + decompressor.Message); - /// - /// ms.Write(decompressor.OutputBuffer, 0, buffer.Length - decompressor.AvailableBytesOut); - /// } - /// while (decompressor.AvailableBytesIn > 0 || decompressor.AvailableBytesOut == 0); - /// - /// // pass 2: finish and flush - /// do - /// { - /// decompressor.NextOut = 0; - /// decompressor.AvailableBytesOut = buffer.Length; - /// rc = decompressor.Inflate(FlushType.Finish); - /// - /// if (rc != ZlibConstants.Z_STREAM_END && rc != ZlibConstants.Z_OK) - /// throw new Exception("inflating: " + decompressor.Message); - /// - /// if (buffer.Length - decompressor.AvailableBytesOut > 0) - /// ms.Write(buffer, 0, buffer.Length - decompressor.AvailableBytesOut); - /// } - /// while (decompressor.AvailableBytesIn > 0 || decompressor.AvailableBytesOut == 0); - /// - /// decompressor.EndInflate(); - /// } - /// - /// - /// - /// The flush to use when inflating. - /// Z_OK if everything goes well. - public int Inflate(FlushType flush) - { - if (istate == null) - throw new ZlibException("No Inflate State!"); - return istate.Inflate(flush); - } - - - /// - /// Ends an inflation session. - /// - /// - /// Call this after successively calling Inflate(). This will cause all buffers to be flushed. - /// After calling this you cannot call Inflate() without a intervening call to one of the - /// InitializeInflate() overloads. - /// - /// Z_OK if everything goes well. - public int EndInflate() - { - if (istate == null) - throw new ZlibException("No Inflate State!"); - int ret = istate.End(); - istate = null; - return ret; - } - - /// - /// I don't know what this does! - /// - /// Z_OK if everything goes well. - public int SyncInflate() - { - if (istate == null) - throw new ZlibException("No Inflate State!"); - return istate.Sync(); - } - - /// - /// Initialize the ZlibCodec for deflation operation. - /// - /// - /// The codec will use the MAX window bits and the default level of compression. - /// - /// - /// - /// int bufferSize = 40000; - /// byte[] CompressedBytes = new byte[bufferSize]; - /// byte[] DecompressedBytes = new byte[bufferSize]; - /// - /// ZlibCodec compressor = new ZlibCodec(); - /// - /// compressor.InitializeDeflate(CompressionLevel.Default); - /// - /// compressor.InputBuffer = System.Text.ASCIIEncoding.ASCII.GetBytes(TextToCompress); - /// compressor.NextIn = 0; - /// compressor.AvailableBytesIn = compressor.InputBuffer.Length; - /// - /// compressor.OutputBuffer = CompressedBytes; - /// compressor.NextOut = 0; - /// compressor.AvailableBytesOut = CompressedBytes.Length; - /// - /// while (compressor.TotalBytesIn != TextToCompress.Length && compressor.TotalBytesOut < bufferSize) - /// { - /// compressor.Deflate(FlushType.None); - /// } - /// - /// while (true) - /// { - /// int rc= compressor.Deflate(FlushType.Finish); - /// if (rc == ZlibConstants.Z_STREAM_END) break; - /// } - /// - /// compressor.EndDeflate(); - /// - /// - /// - /// Z_OK if all goes well. You generally don't need to check the return code. - public int InitializeDeflate() - { - return _InternalInitializeDeflate(true); - } - - /// - /// Initialize the ZlibCodec for deflation operation, using the specified CompressionLevel. - /// - /// - /// The codec will use the maximum window bits (15) and the specified - /// CompressionLevel. It will emit a ZLIB stream as it compresses. - /// - /// The compression level for the codec. - /// Z_OK if all goes well. - public int InitializeDeflate(CompressionLevel level) - { - this.CompressLevel = level; - return _InternalInitializeDeflate(true); - } - - - /// - /// Initialize the ZlibCodec for deflation operation, using the specified CompressionLevel, - /// and the explicit flag governing whether to emit an RFC1950 header byte pair. - /// - /// - /// The codec will use the maximum window bits (15) and the specified CompressionLevel. - /// If you want to generate a zlib stream, you should specify true for - /// wantRfc1950Header. In this case, the library will emit a ZLIB - /// header, as defined in RFC - /// 1950, in the compressed stream. - /// - /// The compression level for the codec. - /// whether to emit an initial RFC1950 byte pair in the compressed stream. - /// Z_OK if all goes well. - public int InitializeDeflate(CompressionLevel level, bool wantRfc1950Header) - { - this.CompressLevel = level; - return _InternalInitializeDeflate(wantRfc1950Header); - } - - - /// - /// Initialize the ZlibCodec for deflation operation, using the specified CompressionLevel, - /// and the specified number of window bits. - /// - /// - /// The codec will use the specified number of window bits and the specified CompressionLevel. - /// - /// The compression level for the codec. - /// the number of window bits to use. If you don't know what this means, don't use this method. - /// Z_OK if all goes well. - public int InitializeDeflate(CompressionLevel level, int bits) - { - this.CompressLevel = level; - this.WindowBits = bits; - return _InternalInitializeDeflate(true); - } - - /// - /// Initialize the ZlibCodec for deflation operation, using the specified - /// CompressionLevel, the specified number of window bits, and the explicit flag - /// governing whether to emit an RFC1950 header byte pair. - /// - /// - /// The compression level for the codec. - /// whether to emit an initial RFC1950 byte pair in the compressed stream. - /// the number of window bits to use. If you don't know what this means, don't use this method. - /// Z_OK if all goes well. - public int InitializeDeflate(CompressionLevel level, int bits, bool wantRfc1950Header) - { - this.CompressLevel = level; - this.WindowBits = bits; - return _InternalInitializeDeflate(wantRfc1950Header); - } - - private int _InternalInitializeDeflate(bool wantRfc1950Header) - { - if (istate != null) throw new ZlibException("You may not call InitializeDeflate() after calling InitializeInflate()."); - dstate = new DeflateManager(); - dstate.WantRfc1950HeaderBytes = wantRfc1950Header; - - return dstate.Initialize(this, this.CompressLevel, this.WindowBits, this.Strategy); - } - - /// - /// Deflate one batch of data. - /// - /// - /// You must have set InputBuffer and OutputBuffer before calling this method. - /// - /// - /// - /// private void DeflateBuffer(CompressionLevel level) - /// { - /// int bufferSize = 1024; - /// byte[] buffer = new byte[bufferSize]; - /// ZlibCodec compressor = new ZlibCodec(); - /// - /// Console.WriteLine("\n============================================"); - /// Console.WriteLine("Size of Buffer to Deflate: {0} bytes.", UncompressedBytes.Length); - /// MemoryStream ms = new MemoryStream(); - /// - /// int rc = compressor.InitializeDeflate(level); - /// - /// compressor.InputBuffer = UncompressedBytes; - /// compressor.NextIn = 0; - /// compressor.AvailableBytesIn = UncompressedBytes.Length; - /// - /// compressor.OutputBuffer = buffer; - /// - /// // pass 1: deflate - /// do - /// { - /// compressor.NextOut = 0; - /// compressor.AvailableBytesOut = buffer.Length; - /// rc = compressor.Deflate(FlushType.None); - /// - /// if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END) - /// throw new Exception("deflating: " + compressor.Message); - /// - /// ms.Write(compressor.OutputBuffer, 0, buffer.Length - compressor.AvailableBytesOut); - /// } - /// while (compressor.AvailableBytesIn > 0 || compressor.AvailableBytesOut == 0); - /// - /// // pass 2: finish and flush - /// do - /// { - /// compressor.NextOut = 0; - /// compressor.AvailableBytesOut = buffer.Length; - /// rc = compressor.Deflate(FlushType.Finish); - /// - /// if (rc != ZlibConstants.Z_STREAM_END && rc != ZlibConstants.Z_OK) - /// throw new Exception("deflating: " + compressor.Message); - /// - /// if (buffer.Length - compressor.AvailableBytesOut > 0) - /// ms.Write(buffer, 0, buffer.Length - compressor.AvailableBytesOut); - /// } - /// while (compressor.AvailableBytesIn > 0 || compressor.AvailableBytesOut == 0); - /// - /// compressor.EndDeflate(); - /// - /// ms.Seek(0, SeekOrigin.Begin); - /// CompressedBytes = new byte[compressor.TotalBytesOut]; - /// ms.Read(CompressedBytes, 0, CompressedBytes.Length); - /// } - /// - /// - /// whether to flush all data as you deflate. Generally you will want to - /// use Z_NO_FLUSH here, in a series of calls to Deflate(), and then call EndDeflate() to - /// flush everything. - /// - /// Z_OK if all goes well. - public int Deflate(FlushType flush) - { - if (dstate == null) - throw new ZlibException("No Deflate State!"); - return dstate.Deflate(flush); - } - - /// - /// End a deflation session. - /// - /// - /// Call this after making a series of one or more calls to Deflate(). All buffers are flushed. - /// - /// Z_OK if all goes well. - public int EndDeflate() - { - if (dstate == null) - throw new ZlibException("No Deflate State!"); - //dinoch Tue, 03 Nov 2009 15:39 (test this) - //int ret = dstate.End(); - dstate = null; - return ZlibConstants.Z_OK; //ret; - } - - /// - /// Reset a codec for another deflation session. - /// - /// - /// Call this to reset the deflation state. For example if a thread is deflating - /// non-consecutive blocks, you can call Reset() after the Deflate(Sync) of the first - /// block and before the next Deflate(None) of the second block. - /// - /// Z_OK if all goes well. - public void ResetDeflate() - { - if (dstate == null) - throw new ZlibException("No Deflate State!"); - dstate.Reset(); - } - - - /// - /// Set the CompressionStrategy and CompressionLevel for a deflation session. - /// - /// the level of compression to use. - /// the strategy to use for compression. - /// Z_OK if all goes well. - public int SetDeflateParams(CompressionLevel level, CompressionStrategy strategy) - { - if (dstate == null) - throw new ZlibException("No Deflate State!"); - return dstate.SetParams(level, strategy); - } - - - /// - /// Set the dictionary to be used for either Inflation or Deflation. - /// - /// The dictionary bytes to use. - /// Z_OK if all goes well. - public int SetDictionary(byte[] dictionary) - { - if (istate != null) - return istate.SetDictionary(dictionary); - - if (dstate != null) - return dstate.SetDictionary(dictionary); - - throw new ZlibException("No Inflate or Deflate state!"); - } - - // Flush as much pending output as possible. All deflate() output goes - // through this function so some applications may wish to modify it - // to avoid allocating a large strm->next_out buffer and copying into it. - // (See also read_buf()). - internal void flush_pending() - { - int len = dstate.pendingCount; - - if (len > AvailableBytesOut) - len = AvailableBytesOut; - if (len == 0) - return; - - if (dstate.pending.Length <= dstate.nextPending || - OutputBuffer.Length <= NextOut || - dstate.pending.Length < (dstate.nextPending + len) || - OutputBuffer.Length < (NextOut + len)) - { - throw new ZlibException(String.Format("Invalid State. (pending.Length={0}, pendingCount={1})", - dstate.pending.Length, dstate.pendingCount)); - } - - Array.Copy(dstate.pending, dstate.nextPending, OutputBuffer, NextOut, len); - - NextOut += len; - dstate.nextPending += len; - TotalBytesOut += len; - AvailableBytesOut -= len; - dstate.pendingCount -= len; - if (dstate.pendingCount == 0) - { - dstate.nextPending = 0; - } - } - - // Read a new buffer from the current input stream, update the adler32 - // and total number of bytes read. All deflate() input goes through - // this function so some applications may wish to modify it to avoid - // allocating a large strm->next_in buffer and copying from it. - // (See also flush_pending()). - internal int read_buf(byte[] buf, int start, int size) - { - int len = AvailableBytesIn; - - if (len > size) - len = size; - if (len == 0) - return 0; - - AvailableBytesIn -= len; - - if (dstate.WantRfc1950HeaderBytes) - { - _Adler32 = Adler.Adler32(_Adler32, InputBuffer, NextIn, len); - } - Array.Copy(InputBuffer, NextIn, buf, start, len); - NextIn += len; - TotalBytesIn += len; - return len; - } - - } -} diff --git a/DebugTools/MinecraftClientProxy/Compression/ZlibConstants.cs b/DebugTools/MinecraftClientProxy/Compression/ZlibConstants.cs deleted file mode 100644 index 6a473afcc1..0000000000 --- a/DebugTools/MinecraftClientProxy/Compression/ZlibConstants.cs +++ /dev/null @@ -1,127 +0,0 @@ -// ZlibConstants.cs -// ------------------------------------------------------------------ -// -// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation. -// All rights reserved. -// -// This code module is part of DotNetZip, a zipfile class library. -// -// ------------------------------------------------------------------ -// -// This code is licensed under the Microsoft Public License. -// See the file License.txt for the license details. -// More info on: http://dotnetzip.codeplex.com -// -// ------------------------------------------------------------------ -// -// last saved (in emacs): -// Time-stamp: <2009-November-03 18:50:19> -// -// ------------------------------------------------------------------ -// -// This module defines constants used by the zlib class library. This -// code is derived from the jzlib implementation of zlib, but -// significantly modified. In keeping with the license for jzlib, the -// copyright to that code is included here. -// -// ------------------------------------------------------------------ -// -// Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in -// the documentation and/or other materials provided with the distribution. -// -// 3. The names of the authors may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, -// INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// ----------------------------------------------------------------------- -// -// This program is based on zlib-1.1.3; credit to authors -// Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) -// and contributors of zlib. -// -// ----------------------------------------------------------------------- - - -using System; - -namespace Ionic.Zlib -{ - /// - /// A bunch of constants used in the Zlib interface. - /// - public static class ZlibConstants - { - /// - /// The maximum number of window bits for the Deflate algorithm. - /// - public const int WindowBitsMax = 15; // 32K LZ77 window - - /// - /// The default number of window bits for the Deflate algorithm. - /// - public const int WindowBitsDefault = WindowBitsMax; - - /// - /// indicates everything is A-OK - /// - public const int Z_OK = 0; - - /// - /// Indicates that the last operation reached the end of the stream. - /// - public const int Z_STREAM_END = 1; - - /// - /// The operation ended in need of a dictionary. - /// - public const int Z_NEED_DICT = 2; - - /// - /// There was an error with the stream - not enough data, not open and readable, etc. - /// - public const int Z_STREAM_ERROR = -2; - - /// - /// There was an error with the data - not enough data, bad data, etc. - /// - public const int Z_DATA_ERROR = -3; - - /// - /// There was an error with the working buffer. - /// - public const int Z_BUF_ERROR = -5; - - /// - /// The size of the working buffer used in the ZlibCodec class. Defaults to 8192 bytes. - /// -#if NETCF - public const int WorkingBufferSizeDefault = 8192; -#else - public const int WorkingBufferSizeDefault = 16384; -#endif - /// - /// The minimum size of the working buffer used in the ZlibCodec class. Currently it is 128 bytes. - /// - public const int WorkingBufferSizeMin = 1024; - } - -} diff --git a/DebugTools/MinecraftClientProxy/Compression/ZlibStream.cs b/DebugTools/MinecraftClientProxy/Compression/ZlibStream.cs deleted file mode 100644 index 4d01f8fd17..0000000000 --- a/DebugTools/MinecraftClientProxy/Compression/ZlibStream.cs +++ /dev/null @@ -1,725 +0,0 @@ -// ZlibStream.cs -// ------------------------------------------------------------------ -// -// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation. -// All rights reserved. -// -// This code module is part of DotNetZip, a zipfile class library. -// -// ------------------------------------------------------------------ -// -// This code is licensed under the Microsoft Public License. -// See the file License.txt for the license details. -// More info on: http://dotnetzip.codeplex.com -// -// ------------------------------------------------------------------ -// -// last saved (in emacs): -// Time-stamp: <2011-July-31 14:53:33> -// -// ------------------------------------------------------------------ -// -// This module defines the ZlibStream class, which is similar in idea to -// the System.IO.Compression.DeflateStream and -// System.IO.Compression.GZipStream classes in the .NET BCL. -// -// ------------------------------------------------------------------ - -using System; -using System.IO; - -namespace Ionic.Zlib -{ - - /// - /// Represents a Zlib stream for compression or decompression. - /// - /// - /// - /// - /// The ZlibStream is a Decorator on a . It adds ZLIB compression or decompression to any - /// stream. - /// - /// - /// Using this stream, applications can compress or decompress data via - /// stream Read() and Write() operations. Either compresssion or - /// decompression can occur through either reading or writing. The compression - /// format used is ZLIB, which is documented in IETF RFC 1950, "ZLIB Compressed - /// Data Format Specification version 3.3". This implementation of ZLIB always uses - /// DEFLATE as the compression method. (see IETF RFC 1951, "DEFLATE - /// Compressed Data Format Specification version 1.3.") - /// - /// - /// The ZLIB format allows for varying compression methods, window sizes, and dictionaries. - /// This implementation always uses the DEFLATE compression method, a preset dictionary, - /// and 15 window bits by default. - /// - /// - /// - /// This class is similar to , except that it adds the - /// RFC1950 header and trailer bytes to a compressed stream when compressing, or expects - /// the RFC1950 header and trailer bytes when decompressing. It is also similar to the - /// . - /// - /// - /// - /// - public class ZlibStream : System.IO.Stream - { - internal ZlibBaseStream _baseStream; - bool _disposed; - - /// - /// Create a ZlibStream using the specified CompressionMode. - /// - /// - /// - /// - /// When mode is CompressionMode.Compress, the ZlibStream - /// will use the default compression level. The "captive" stream will be - /// closed when the ZlibStream is closed. - /// - /// - /// - /// - /// - /// This example uses a ZlibStream to compress a file, and writes the - /// compressed data to another file. - /// - /// using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) - /// { - /// using (var raw = System.IO.File.Create(fileToCompress + ".zlib")) - /// { - /// using (Stream compressor = new ZlibStream(raw, CompressionMode.Compress)) - /// { - /// byte[] buffer = new byte[WORKING_BUFFER_SIZE]; - /// int n; - /// while ((n= input.Read(buffer, 0, buffer.Length)) != 0) - /// { - /// compressor.Write(buffer, 0, n); - /// } - /// } - /// } - /// } - /// - /// - /// Using input As Stream = File.OpenRead(fileToCompress) - /// Using raw As FileStream = File.Create(fileToCompress & ".zlib") - /// Using compressor As Stream = New ZlibStream(raw, CompressionMode.Compress) - /// Dim buffer As Byte() = New Byte(4096) {} - /// Dim n As Integer = -1 - /// Do While (n <> 0) - /// If (n > 0) Then - /// compressor.Write(buffer, 0, n) - /// End If - /// n = input.Read(buffer, 0, buffer.Length) - /// Loop - /// End Using - /// End Using - /// End Using - /// - /// - /// - /// The stream which will be read or written. - /// Indicates whether the ZlibStream will compress or decompress. - public ZlibStream(System.IO.Stream stream, CompressionMode mode) - : this(stream, mode, CompressionLevel.Default, false) - { - } - - /// - /// Create a ZlibStream using the specified CompressionMode and - /// the specified CompressionLevel. - /// - /// - /// - /// - /// - /// When mode is CompressionMode.Decompress, the level parameter is ignored. - /// The "captive" stream will be closed when the ZlibStream is closed. - /// - /// - /// - /// - /// - /// This example uses a ZlibStream to compress data from a file, and writes the - /// compressed data to another file. - /// - /// - /// using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) - /// { - /// using (var raw = System.IO.File.Create(fileToCompress + ".zlib")) - /// { - /// using (Stream compressor = new ZlibStream(raw, - /// CompressionMode.Compress, - /// CompressionLevel.BestCompression)) - /// { - /// byte[] buffer = new byte[WORKING_BUFFER_SIZE]; - /// int n; - /// while ((n= input.Read(buffer, 0, buffer.Length)) != 0) - /// { - /// compressor.Write(buffer, 0, n); - /// } - /// } - /// } - /// } - /// - /// - /// - /// Using input As Stream = File.OpenRead(fileToCompress) - /// Using raw As FileStream = File.Create(fileToCompress & ".zlib") - /// Using compressor As Stream = New ZlibStream(raw, CompressionMode.Compress, CompressionLevel.BestCompression) - /// Dim buffer As Byte() = New Byte(4096) {} - /// Dim n As Integer = -1 - /// Do While (n <> 0) - /// If (n > 0) Then - /// compressor.Write(buffer, 0, n) - /// End If - /// n = input.Read(buffer, 0, buffer.Length) - /// Loop - /// End Using - /// End Using - /// End Using - /// - /// - /// - /// The stream to be read or written while deflating or inflating. - /// Indicates whether the ZlibStream will compress or decompress. - /// A tuning knob to trade speed for effectiveness. - public ZlibStream(System.IO.Stream stream, CompressionMode mode, CompressionLevel level) - : this(stream, mode, level, false) - { - } - - /// - /// Create a ZlibStream using the specified CompressionMode, and - /// explicitly specify whether the captive stream should be left open after - /// Deflation or Inflation. - /// - /// - /// - /// - /// - /// When mode is CompressionMode.Compress, the ZlibStream will use - /// the default compression level. - /// - /// - /// - /// This constructor allows the application to request that the captive stream - /// remain open after the deflation or inflation occurs. By default, after - /// Close() is called on the stream, the captive stream is also - /// closed. In some cases this is not desired, for example if the stream is a - /// that will be re-read after - /// compression. Specify true for the parameter to leave the stream - /// open. - /// - /// - /// - /// See the other overloads of this constructor for example code. - /// - /// - /// - /// - /// The stream which will be read or written. This is called the - /// "captive" stream in other places in this documentation. - /// Indicates whether the ZlibStream will compress or decompress. - /// true if the application would like the stream to remain - /// open after inflation/deflation. - public ZlibStream(System.IO.Stream stream, CompressionMode mode, bool leaveOpen) - : this(stream, mode, CompressionLevel.Default, leaveOpen) - { - } - - /// - /// Create a ZlibStream using the specified CompressionMode - /// and the specified CompressionLevel, and explicitly specify - /// whether the stream should be left open after Deflation or Inflation. - /// - /// - /// - /// - /// - /// This constructor allows the application to request that the captive - /// stream remain open after the deflation or inflation occurs. By - /// default, after Close() is called on the stream, the captive - /// stream is also closed. In some cases this is not desired, for example - /// if the stream is a that will be - /// re-read after compression. Specify true for the parameter to leave the stream open. - /// - /// - /// - /// When mode is CompressionMode.Decompress, the level parameter is - /// ignored. - /// - /// - /// - /// - /// - /// - /// This example shows how to use a ZlibStream to compress the data from a file, - /// and store the result into another file. The filestream remains open to allow - /// additional data to be written to it. - /// - /// - /// using (var output = System.IO.File.Create(fileToCompress + ".zlib")) - /// { - /// using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) - /// { - /// using (Stream compressor = new ZlibStream(output, CompressionMode.Compress, CompressionLevel.BestCompression, true)) - /// { - /// byte[] buffer = new byte[WORKING_BUFFER_SIZE]; - /// int n; - /// while ((n= input.Read(buffer, 0, buffer.Length)) != 0) - /// { - /// compressor.Write(buffer, 0, n); - /// } - /// } - /// } - /// // can write additional data to the output stream here - /// } - /// - /// - /// Using output As FileStream = File.Create(fileToCompress & ".zlib") - /// Using input As Stream = File.OpenRead(fileToCompress) - /// Using compressor As Stream = New ZlibStream(output, CompressionMode.Compress, CompressionLevel.BestCompression, True) - /// Dim buffer As Byte() = New Byte(4096) {} - /// Dim n As Integer = -1 - /// Do While (n <> 0) - /// If (n > 0) Then - /// compressor.Write(buffer, 0, n) - /// End If - /// n = input.Read(buffer, 0, buffer.Length) - /// Loop - /// End Using - /// End Using - /// ' can write additional data to the output stream here. - /// End Using - /// - /// - /// - /// The stream which will be read or written. - /// - /// Indicates whether the ZlibStream will compress or decompress. - /// - /// - /// true if the application would like the stream to remain open after - /// inflation/deflation. - /// - /// - /// - /// A tuning knob to trade speed for effectiveness. This parameter is - /// effective only when mode is CompressionMode.Compress. - /// - public ZlibStream(System.IO.Stream stream, CompressionMode mode, CompressionLevel level, bool leaveOpen) - { - _baseStream = new ZlibBaseStream(stream, mode, level, ZlibStreamFlavor.ZLIB, leaveOpen); - } - - #region Zlib properties - - /// - /// This property sets the flush behavior on the stream. - /// Sorry, though, not sure exactly how to describe all the various settings. - /// - virtual public FlushType FlushMode - { - get { return (this._baseStream._flushMode); } - set - { - if (_disposed) throw new ObjectDisposedException("ZlibStream"); - this._baseStream._flushMode = value; - } - } - - /// - /// The size of the working buffer for the compression codec. - /// - /// - /// - /// - /// The working buffer is used for all stream operations. The default size is - /// 1024 bytes. The minimum size is 128 bytes. You may get better performance - /// with a larger buffer. Then again, you might not. You would have to test - /// it. - /// - /// - /// - /// Set this before the first call to Read() or Write() on the - /// stream. If you try to set it afterwards, it will throw. - /// - /// - public int BufferSize - { - get - { - return this._baseStream._bufferSize; - } - set - { - if (_disposed) throw new ObjectDisposedException("ZlibStream"); - if (this._baseStream._workingBuffer != null) - throw new ZlibException("The working buffer is already set."); - if (value < ZlibConstants.WorkingBufferSizeMin) - throw new ZlibException(String.Format("Don't be silly. {0} bytes?? Use a bigger buffer, at least {1}.", value, ZlibConstants.WorkingBufferSizeMin)); - this._baseStream._bufferSize = value; - } - } - - /// Returns the total number of bytes input so far. - virtual public long TotalIn - { - get { return this._baseStream._z.TotalBytesIn; } - } - - /// Returns the total number of bytes output so far. - virtual public long TotalOut - { - get { return this._baseStream._z.TotalBytesOut; } - } - - #endregion - - #region System.IO.Stream methods - - /// - /// Dispose the stream. - /// - /// - /// - /// This may or may not result in a Close() call on the captive - /// stream. See the constructors that have a leaveOpen parameter - /// for more information. - /// - /// - /// This method may be invoked in two distinct scenarios. If disposing - /// == true, the method has been called directly or indirectly by a - /// user's code, for example via the public Dispose() method. In this - /// case, both managed and unmanaged resources can be referenced and - /// disposed. If disposing == false, the method has been called by the - /// runtime from inside the object finalizer and this method should not - /// reference other objects; in that case only unmanaged resources must - /// be referenced or disposed. - /// - /// - /// - /// indicates whether the Dispose method was invoked by user code. - /// - protected override void Dispose(bool disposing) - { - try - { - if (!_disposed) - { - if (disposing && (this._baseStream != null)) - this._baseStream.Close(); - _disposed = true; - } - } - finally - { - base.Dispose(disposing); - } - } - - - /// - /// Indicates whether the stream can be read. - /// - /// - /// The return value depends on whether the captive stream supports reading. - /// - public override bool CanRead - { - get - { - if (_disposed) throw new ObjectDisposedException("ZlibStream"); - return _baseStream._stream.CanRead; - } - } - - /// - /// Indicates whether the stream supports Seek operations. - /// - /// - /// Always returns false. - /// - public override bool CanSeek - { - get { return false; } - } - - /// - /// Indicates whether the stream can be written. - /// - /// - /// The return value depends on whether the captive stream supports writing. - /// - public override bool CanWrite - { - get - { - if (_disposed) throw new ObjectDisposedException("ZlibStream"); - return _baseStream._stream.CanWrite; - } - } - - /// - /// Flush the stream. - /// - public override void Flush() - { - if (_disposed) throw new ObjectDisposedException("ZlibStream"); - _baseStream.Flush(); - } - - /// - /// Reading this property always throws a . - /// - public override long Length - { - get { throw new NotSupportedException(); } - } - - /// - /// The position of the stream pointer. - /// - /// - /// - /// Setting this property always throws a . Reading will return the total bytes - /// written out, if used in writing, or the total bytes read in, if used in - /// reading. The count may refer to compressed bytes or uncompressed bytes, - /// depending on how you've used the stream. - /// - public override long Position - { - get - { - if (this._baseStream._streamMode == Ionic.Zlib.ZlibBaseStream.StreamMode.Writer) - return this._baseStream._z.TotalBytesOut; - if (this._baseStream._streamMode == Ionic.Zlib.ZlibBaseStream.StreamMode.Reader) - return this._baseStream._z.TotalBytesIn; - return 0; - } - - set { throw new NotSupportedException(); } - } - - /// - /// Read data from the stream. - /// - /// - /// - /// - /// - /// If you wish to use the ZlibStream to compress data while reading, - /// you can create a ZlibStream with CompressionMode.Compress, - /// providing an uncompressed data stream. Then call Read() on that - /// ZlibStream, and the data read will be compressed. If you wish to - /// use the ZlibStream to decompress data while reading, you can create - /// a ZlibStream with CompressionMode.Decompress, providing a - /// readable compressed data stream. Then call Read() on that - /// ZlibStream, and the data will be decompressed as it is read. - /// - /// - /// - /// A ZlibStream can be used for Read() or Write(), but - /// not both. - /// - /// - /// - /// - /// - /// The buffer into which the read data should be placed. - /// - /// - /// the offset within that data array to put the first byte read. - /// - /// the number of bytes to read. - /// - /// the number of bytes read - public override int Read(byte[] buffer, int offset, int count) - { - if (_disposed) throw new ObjectDisposedException("ZlibStream"); - return _baseStream.Read(buffer, offset, count); - } - - /// - /// Calling this method always throws a . - /// - /// - /// The offset to seek to.... - /// IF THIS METHOD ACTUALLY DID ANYTHING. - /// - /// - /// The reference specifying how to apply the offset.... IF - /// THIS METHOD ACTUALLY DID ANYTHING. - /// - /// - /// nothing. This method always throws. - public override long Seek(long offset, System.IO.SeekOrigin origin) - { - throw new NotSupportedException(); - } - - /// - /// Calling this method always throws a . - /// - /// - /// The new value for the stream length.... IF - /// THIS METHOD ACTUALLY DID ANYTHING. - /// - public override void SetLength(long value) - { - throw new NotSupportedException(); - } - - /// - /// Write data to the stream. - /// - /// - /// - /// - /// - /// If you wish to use the ZlibStream to compress data while writing, - /// you can create a ZlibStream with CompressionMode.Compress, - /// and a writable output stream. Then call Write() on that - /// ZlibStream, providing uncompressed data as input. The data sent to - /// the output stream will be the compressed form of the data written. If you - /// wish to use the ZlibStream to decompress data while writing, you - /// can create a ZlibStream with CompressionMode.Decompress, and a - /// writable output stream. Then call Write() on that stream, - /// providing previously compressed data. The data sent to the output stream - /// will be the decompressed form of the data written. - /// - /// - /// - /// A ZlibStream can be used for Read() or Write(), but not both. - /// - /// - /// The buffer holding data to write to the stream. - /// the offset within that data array to find the first byte to write. - /// the number of bytes to write. - public override void Write(byte[] buffer, int offset, int count) - { - if (_disposed) throw new ObjectDisposedException("ZlibStream"); - _baseStream.Write(buffer, offset, count); - } - #endregion - - - /// - /// Compress a string into a byte array using ZLIB. - /// - /// - /// - /// Uncompress it with . - /// - /// - /// - /// - /// - /// - /// - /// A string to compress. The string will first be encoded - /// using UTF8, then compressed. - /// - /// - /// The string in compressed form - public static byte[] CompressString(String s) - { - using (var ms = new MemoryStream()) - { - Stream compressor = - new ZlibStream(ms, CompressionMode.Compress, CompressionLevel.BestCompression); - ZlibBaseStream.CompressString(s, compressor); - return ms.ToArray(); - } - } - - - /// - /// Compress a byte array into a new byte array using ZLIB. - /// - /// - /// - /// Uncompress it with . - /// - /// - /// - /// - /// - /// - /// A buffer to compress. - /// - /// - /// The data in compressed form - public static byte[] CompressBuffer(byte[] b) - { - using (var ms = new MemoryStream()) - { - Stream compressor = - new ZlibStream( ms, CompressionMode.Compress, CompressionLevel.BestCompression ); - - ZlibBaseStream.CompressBuffer(b, compressor); - return ms.ToArray(); - } - } - - - /// - /// Uncompress a ZLIB-compressed byte array into a single string. - /// - /// - /// - /// - /// - /// - /// A buffer containing ZLIB-compressed data. - /// - /// - /// The uncompressed string - public static String UncompressString(byte[] compressed) - { - using (var input = new MemoryStream(compressed)) - { - Stream decompressor = - new ZlibStream(input, CompressionMode.Decompress); - - return ZlibBaseStream.UncompressString(compressed, decompressor); - } - } - - - /// - /// Uncompress a ZLIB-compressed byte array into a byte array. - /// - /// - /// - /// - /// - /// - /// A buffer containing ZLIB-compressed data. - /// - /// - /// The data in uncompressed form - public static byte[] UncompressBuffer(byte[] compressed) - { - using (var input = new MemoryStream(compressed)) - { - Stream decompressor = - new ZlibStream( input, CompressionMode.Decompress ); - - return ZlibBaseStream.UncompressBuffer(compressed, decompressor); - } - } - - } - - -} diff --git a/DebugTools/MinecraftClientProxy/MinecraftClientProxy.csproj b/DebugTools/MinecraftClientProxy/MinecraftClientProxy.csproj deleted file mode 100644 index 7a820e4e68..0000000000 --- a/DebugTools/MinecraftClientProxy/MinecraftClientProxy.csproj +++ /dev/null @@ -1,70 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {025E4E4C-F38B-46F6-8492-61B732018B1E} - Exe - Properties - MinecraftClientProxy - MinecraftClientProxy - v4.0 - Client - 512 - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/DebugTools/MinecraftClientProxy/PacketProxy.cs b/DebugTools/MinecraftClientProxy/PacketProxy.cs deleted file mode 100644 index fb09890437..0000000000 --- a/DebugTools/MinecraftClientProxy/PacketProxy.cs +++ /dev/null @@ -1,309 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Net.Sockets; -using System.Threading; - -namespace MinecraftClient.Protocol.Handlers -{ - class PacketProxy - { - private int compression_treshold = 0; - private bool handshake_phase = true; - private bool login_phase = true; - TcpClient client; - TcpClient server; - - public PacketProxy(TcpClient client, TcpClient server) - { - this.client = client; - this.server = server; - } - - public void Run() - { - Thread t = new Thread(() => - { - try - { - do { Thread.Sleep(100); } - while (Update(true)); - } - catch (System.IO.IOException) { } - catch (SocketException) { } - catch (ObjectDisposedException) { } - }); - t.Name = "UpdaterServer"; - t.Start(); - - t = new Thread(() => - { - try - { - do { Thread.Sleep(100); } - while (Update(false)); - } - catch (System.IO.IOException) { } - catch (SocketException) { } - catch (ObjectDisposedException) { } - }); - t.Name = "UpdaterClient"; - t.Start(); - } - - private bool Update(bool server) - { - TcpClient c = server ? this.server : this.client; - if (c.Client == null || !c.Connected) { return false; } - try - { - while (c.Client.Available > 0) - { - int packetID = 0; - byte[] packetData = new byte[] { }; - byte[] packetRawData = new byte[] { }; - readNextPacket(c, ref packetID, ref packetData, ref packetRawData); - handlePacket(packetID, (byte[])packetData.Clone(), server); - (server ? this.client : this.server).Client.Send(packetRawData); - } - } - catch (SocketException) { return false; } - return true; - } - - private void readNextPacket(TcpClient c, ref int packetID, ref byte[] packetData, ref byte[] packetRawData) - { - int size = readNextVarIntRAW(c); - packetData = readDataRAW(c, size); - packetRawData = concatBytes(getVarInt(size), packetData); - - if (compression_treshold > 0) - { - int size_uncompressed = readNextVarInt(ref packetData); - if (size_uncompressed != 0) - packetData = ZlibUtils.Decompress(packetData, size_uncompressed); - } - - packetID = readNextVarInt(ref packetData); - } - - private void handlePacket(int packetID, byte[] packetData, bool server) - { - //Console.WriteLine((server ? "[S -> C] 0x" : "[C -> S] 0x") + packetID.ToString("x2")); - if (login_phase) - { - if (server) - { - switch (packetID) - { - case 0x00: - Console.WriteLine("[S -> C] Login rejected"); - break; - case 0x01: - Console.WriteLine("[S -> C] Encryption request"); - Console.WriteLine(@"[WARNING] ENCRYPTION IS NOT SUPPORTED BY PROXY !!"); - break; - case 0x02: - login_phase = false; - Console.WriteLine("[S -> C] Login successfull"); - break; - case 0x03: - compression_treshold = readNextVarInt(ref packetData); - Console.WriteLine("[S -> C] Compression Treshold: " + compression_treshold); - break; - } - } - else - { - switch (packetID) - { - case 0x00: - Console.WriteLine("[C -> S] " + (handshake_phase ? "Handshake" : "Login request")); - handshake_phase = false; - break; - } - } - } - else - { - if (!server) - { - double x, y, z; - bool g; - switch (packetID) - { - //Do debug work here - case 0x0C: - x = readNextDouble(ref packetData); - y = readNextDouble(ref packetData); - z = readNextDouble(ref packetData); - g = readNextBool(ref packetData); - Console.WriteLine("[C -> S] Location: " + x + ", " + y + ", " + z + ", " + g); - break; - case 0x0D: - x = readNextDouble(ref packetData); - y = readNextDouble(ref packetData); - z = readNextDouble(ref packetData); - readNextDouble(ref packetData); //skip 2 floats: look yaw & pitch - g = readNextBool(ref packetData); - Console.WriteLine("[C -> S] Location: " + x + ", " + y + ", " + z + ", (look)" + ", " + g); - break; - case 0x09: - byte window = readNextByte(ref packetData); - short slot = readNextShort(ref packetData); - byte button = readNextByte(ref packetData); - short action = readNextShort(ref packetData); - int mode = readNextVarInt(ref packetData); - bool slotPresent = readNextBool(ref packetData); - int itemId = -1; - byte itemCount = 0; - if (slotPresent) - { - itemId = readNextVarInt(ref packetData); - itemCount = readNextByte(ref packetData); - } - Console.WriteLine("[C -> S] Window #" + window + " click: #" + slot + " button " + button + " action " + action + " mode " + mode + " item " + itemId + " x" + itemCount); - break; - } - } - } - } - - public void Dispose() - { - try - { - client.Close(); - server.Close(); - } - catch { } - } - - private byte[] readDataRAW(TcpClient c, int offset) - { - if (offset > 0) - { - try - { - byte[] cache = new byte[offset]; - Receive(c, cache, 0, offset, SocketFlags.None); - return cache; - } - catch (OutOfMemoryException) { } - } - return new byte[] { }; - } - - private byte[] readData(int offset, ref byte[] cache) - { - List read = new List(); - List list = new List(cache); - while (offset > 0 && list.Count > 0) - { - read.Add(list[0]); - list.RemoveAt(0); - offset--; - } - cache = list.ToArray(); - return read.ToArray(); - } - - private string readNextString(ref byte[] cache) - { - int length = readNextVarInt(ref cache); - if (length > 0) - { - return Encoding.UTF8.GetString(readData(length, ref cache)); - } - else return ""; - } - - private bool readNextBool(ref byte[] cache) - { - byte[] rawValue = readData(1, ref cache); - return rawValue[0] != 0; - } - - private byte readNextByte(ref byte[] cache) - { - byte[] rawValue = readData(1, ref cache); - return rawValue[0]; - } - - private short readNextShort(ref byte[] cache) - { - byte[] rawValue = readData(2, ref cache); - Array.Reverse(rawValue); //Endianness - return BitConverter.ToInt16(rawValue, 0); - } - - private double readNextDouble(ref byte[] cache) - { - byte[] rawValue = readData(8, ref cache); - Array.Reverse(rawValue); //Endianness - return BitConverter.ToDouble(rawValue, 0); - } - - private int readNextVarIntRAW(TcpClient c) - { - int i = 0; - int j = 0; - int k = 0; - byte[] tmp = new byte[1]; - while (true) - { - Receive(c, tmp, 0, 1, SocketFlags.None); - k = tmp[0]; - i |= (k & 0x7F) << j++ * 7; - if (j > 5) throw new OverflowException("VarInt too big"); - if ((k & 0x80) != 128) break; - } - return i; - } - - private int readNextVarInt(ref byte[] cache) - { - int i = 0; - int j = 0; - int k = 0; - byte[] tmp = new byte[1]; - while (true) - { - tmp = readData(1, ref cache); - k = tmp[0]; - i |= (k & 0x7F) << j++ * 7; - if (j > 5) throw new OverflowException("VarInt too big"); - if ((k & 0x80) != 128) break; - } - return i; - } - - private static byte[] getVarInt(int paramInt) - { - List bytes = new List(); - while ((paramInt & -128) != 0) - { - bytes.Add((byte)(paramInt & 127 | 128)); - paramInt = (int)(((uint)paramInt) >> 7); - } - bytes.Add((byte)paramInt); - return bytes.ToArray(); - } - - private static byte[] concatBytes(params byte[][] bytes) - { - List result = new List(); - foreach (byte[] array in bytes) - result.AddRange(array); - return result.ToArray(); - } - - private void Receive(TcpClient c, byte[] buffer, int start, int offset, SocketFlags f) - { - int read = 0; - while (read < offset) - read += c.Client.Receive(buffer, start + read, offset - read, f); - } - } -} diff --git a/DebugTools/MinecraftClientProxy/Program.cs b/DebugTools/MinecraftClientProxy/Program.cs deleted file mode 100644 index e9cb23672e..0000000000 --- a/DebugTools/MinecraftClientProxy/Program.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Net.Sockets; -using System.Net; -using MinecraftClient.Protocol.Handlers; - -namespace MinecraftClientProxy -{ - class Program - { - static void Main(string[] args) - { - Console.WriteLine("Waiting for client on port 25565..."); - TcpListener listener = new TcpListener(IPAddress.Any, 25565); - listener.Start(); - TcpClient client = listener.AcceptTcpClient(); - - Console.WriteLine("Connecting to server on port 25566..."); - TcpClient server = new TcpClient("localhost", 25566); - - Console.WriteLine("Starting proxy...\n"); - new PacketProxy(client, server).Run(); - - Console.ReadLine(); - } - } -} diff --git a/DebugTools/MinecraftClientProxy/Properties/AssemblyInfo.cs b/DebugTools/MinecraftClientProxy/Properties/AssemblyInfo.cs deleted file mode 100644 index 4acf90ae2a..0000000000 --- a/DebugTools/MinecraftClientProxy/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("MinecraftClientProxy")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("MinecraftClientProxy")] -[assembly: AssemblyCopyright("Copyright © 2015-2016 ORelio")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("0a3e2a48-94e9-4b02-96dd-5884585c561e")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/DebugTools/MinecraftClientProxy/ZlibUtils.cs b/DebugTools/MinecraftClientProxy/ZlibUtils.cs deleted file mode 100644 index 915aa2d29f..0000000000 --- a/DebugTools/MinecraftClientProxy/ZlibUtils.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Ionic.Zlib; - -namespace MinecraftClient.Protocol.Handlers -{ - /// - /// Quick Zlib compression handling for network packet compression. - /// Note: Underlying compression handling is taken from the DotNetZip Library. - /// This library is open source and provided under the Microsoft Public License. - /// More info about DotNetZip at dotnetzip.codeplex.com. - /// - - public static class ZlibUtils - { - /// - /// Decompress a byte array into another byte array of the specified size - /// - /// Data to decompress - /// Size of the data once decompressed - /// Decompressed data as a byte array - - public static byte[] Decompress(byte[] to_decompress, int size_uncompressed) - { - ZlibStream stream = new ZlibStream(new System.IO.MemoryStream(to_decompress, false), CompressionMode.Decompress); - byte[] packetData_decompressed = new byte[size_uncompressed]; - stream.Read(packetData_decompressed, 0, size_uncompressed); - stream.Close(); - return packetData_decompressed; - } - } -} diff --git a/DebugTools/README.txt b/DebugTools/README.txt deleted file mode 100644 index 7acbc0fae6..0000000000 --- a/DebugTools/README.txt +++ /dev/null @@ -1,6 +0,0 @@ -This part of the repository contains tools that may be useful for debugging - -MinecraftClientProxy - A proxy between a MCC/Vanilla client and an offline-mode server which can intercept packets - Useful to dump packets sent by a Vanilla minecraft client and compare them with packets from MCC - Example of use case: https://github.com/MCCTeam/Minecraft-Console-Client/issues/195 diff --git a/Directory.Build.props b/Directory.Build.props index 41d207620d..0ebaff3199 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,5 +1,6 @@ + MIT $(DefaultItemExcludes);**/bin/**;**/obj/** diff --git a/Docker/Dockerfile b/Docker/Dockerfile deleted file mode 100644 index 3e42aed8ff..0000000000 --- a/Docker/Dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -# Using the .NET official image for .NET 6.0 -FROM mcr.microsoft.com/dotnet/sdk:6.0 - -# If you want to use a specific build, un-comment the ENV MCC_VERSION line (remove the # from the start) -# Then replace the with a version of your choice (Example: MCC_VERSION=20220817-29) -#ENV MCC_VERSION= - -# IF you want to use a specific platform then specific the ENV MCC_PLATFORM -# For example to use arm set the environment variable: MCC_PLATFORM=linux-arm64 -# `docker run -e MCC_PLATFORM=linux-arm64 -it localhost/minecraft-console-client` - -# Copy over the script and give it execution permissions -COPY start-latest.sh /opt/start-latest.sh -RUN chmod +x /opt/start-latest.sh - -RUN apt-get update && \ - apt-get install -y unzip && \ - mkdir /opt/data - -ENTRYPOINT ["/bin/sh", "-c", "/opt/start-latest.sh"] diff --git a/Docker/docker-compose.yml b/Docker/docker-compose.yml deleted file mode 100644 index 2bc25fac27..0000000000 --- a/Docker/docker-compose.yml +++ /dev/null @@ -1,9 +0,0 @@ -version: '2' - -services: - MCC: - image: 'minecraft-console-client:latest' - container_name: 'MinecraftConsoleClient' - # You could also comment out the volumes section if you don't want to mount the volume. That is up to you. If you do so it's harder to edit the .ini file if thats something you want to do. - volumes: - - './data:/opt/data' diff --git a/Docker/start-latest.sh b/Docker/start-latest.sh deleted file mode 100644 index 01cc5847ed..0000000000 --- a/Docker/start-latest.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh - -cd /opt/data || exit 1 - -echo "platform is ${MCC_PLATFORM}" - -if [ -e "./MinecraftClient" -a -n "$MCC_SKIP_REDOWNLOAD" ]; then - echo "Skip re-download MinecraftClient" -else - # Use the provided version tag or get the latest release tag - RELEASE_TAG=${MCC_VERSION:-$(curl -s -v https://github.com/MCCTeam/Minecraft-Console-Client/releases/latest 2>&1 | grep -i location: | tr -d '\r' | cut -d/ -f8)} - - # Taken from https://stackoverflow.com/a/70369688 - ARCH=$(arch | sed s/aarch64/arm64/ | sed s/x86_64/x64/) - - # Delete the old build - [ -e MinecraftClient ] && rm -- MinecraftClient - - echo "Donwloading MinecraftClient for ${RELEASE_TAG}-${ARCH}" - - # Download the specified build or the latest one - curl -L https://github.com/MCCTeam/Minecraft-Console-Client/releases/download/${RELEASE_TAG}/MinecraftClient-${RELEASE_TAG}-${MCC_PLATFORM:=linux}-${ARCH} --output MinecraftClient -fi - -# Set Executable -chmod +x ./MinecraftClient - -# Start the Client -./MinecraftClient diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..530040bce5 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,15 @@ +# syntax=docker/dockerfile:1 +FROM mcr.microsoft.com/dotnet/sdk:10.0.401 AS build +WORKDIR /src +COPY . . +RUN test -f ConsoleInteractive/ConsoleInteractive/ConsoleInteractive/ConsoleInteractive.csproj +RUN dotnet publish src/Mcc.Cli/Mcc.Cli.csproj -c Release -o /out --self-contained false -p:PublishSingleFile=false -p:UseAppHost=false -p:ShouldUnsetParentConfigurationAndPlatform=false + +FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS runtime +WORKDIR /data +COPY --from=build /out /app +RUN mkdir -p /data/configurations /data/plugins /data/scripts && chown -R app:app /data +USER app +ENV MCC_PLUGINS=/data/plugins +ENTRYPOINT ["dotnet", "/app/Mcc.Cli.dll"] +CMD ["--configurations", "/data/configurations", "--console.General.ConsoleMode=classic"] diff --git a/LICENSE.md b/LICENSE.md index 417fbcbe92..7f2bd277d7 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,74 +1,21 @@ -# COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 - -## 1. Definitions. - -* **1.1. Contributor** means each individual or entity that creates or contributes to the creation of Modifications. -* **1.2. Contributor Version** means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor. -* **1.3. Covered Software** means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof. -* **1.4. Executable** means the Covered Software in any form other than Source Code. -* **1.5. Initial Developer** means the individual or entity that first makes Original Software available under this License. -* **1.6. Larger Work** means a work which combines Covered Software or portions thereof with code not governed by the terms of this License. -* **1.7. License** means this document. -* **1.8. Licensable** means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. -* **1.9. Modifications** means the Source Code and Executable form of any of the following: - * **A.** Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications; - * **B.** Any new file that contains any part of the Original Software or previous Modification; or - * **C.** Any new file that is contributed or otherwise made available under the terms of this License. -* **1.10. Original Software** means the Source Code and Executable form of computer software code that is originally released under this License. -* **1.11. Patent Claims** means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. -* **1.12. Source Code** means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code. -* **1.13. You (or Your)** means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, You includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, control means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. - -## 2. License Grants. - -* **2.1. The Initial Developer Grant.** Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license: - * **(a)** under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and - * **(b)** under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof). - * **(c)** The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License. - * **(d)** Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices. - -* **2.2. Contributor Grant.** Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: - * **(a)** under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and - * **(b)** under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). - * **(c)** The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party. - * **(d)** Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor. - -## 3. Distribution Obligations. - -* **3.1. Availability of Source Code.** Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange. -* **3.2. Modifications.** The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License. -* **3.3. Required Notices.** You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer. -* **3.4. Application of Additional Terms.** You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. -* **3.5. Distribution of Executable Versions.** You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipients rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. -* **3.6. Larger Works.** You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software. - -## 4. Versions of the License. - -* **4.1. New Versions.** Sun Microsystems, Inc. is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License. -* **4.2. Effect of New Versions.** You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward. -* **4.3. Modified Versions.** When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License. - -## 5. DISCLAIMER OF WARRANTY. - -COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. - -## 6. TERMINATION. -* **6.1.** This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. -* **6.2.** If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as Participant) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant. -* **6.3.** In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination. - -## 7. LIMITATION OF LIABILITY. - -UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTYS NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. - -## 8. U.S. GOVERNMENT END USERS. - -The Covered Software is a commercial item, as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of commercial computer software (as that term is defined at 48 C.F.R.  252.227-7014(a)(1)) and commercial computer software documentation as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License. - -## 9. MISCELLANEOUS. - -This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdictions conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software. - -## 10. RESPONSIBILITY FOR CLAIMS. - -As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. +MIT License + +Copyright (c) 2026 MCC Team and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/MCC-Skills b/MCC-Skills new file mode 160000 index 0000000000..7761e3a8d1 --- /dev/null +++ b/MCC-Skills @@ -0,0 +1 @@ +Subproject commit 7761e3a8d1b493f5781ddbb34d429f3c4e4ea6d5 diff --git a/Mcc.slnx b/Mcc.slnx new file mode 100644 index 0000000000..b5d7ab95d2 --- /dev/null +++ b/Mcc.slnx @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/MinecraftClient.Tests/AutoRelogRetryPolicyTests.cs b/MinecraftClient.Tests/AutoRelogRetryPolicyTests.cs deleted file mode 100644 index 8751664667..0000000000 --- a/MinecraftClient.Tests/AutoRelogRetryPolicyTests.cs +++ /dev/null @@ -1,176 +0,0 @@ -using MinecraftClient.ChatBots; -using MinecraftClient.Scripting; - -namespace MinecraftClient.Tests; - -public sealed class AutoRelogRetryPolicyTests -{ - [Fact] - public void DefaultConfigurationUsesUnlimitedRetries() - { - Assert.Equal(-1, new AutoRelog.Configs().Retries); - } - - [Fact] - public void UnlimitedRetriesNeverExhaust() - { - var policy = new AutoRelogRetryPolicy(new ManualTimeProvider()); - - for (int attempt = 1; attempt <= 100; attempt++) - { - Assert.True(policy.TryReserveAttempt(-1, out int retriesLeft)); - Assert.Equal(-1, retriesLeft); - Assert.Equal(attempt, policy.Attempts); - } - } - - [Fact] - public void ZeroRetriesDisablesReconnect() - { - var policy = new AutoRelogRetryPolicy(new ManualTimeProvider()); - - Assert.False(policy.TryReserveAttempt(0, out int retriesLeft)); - Assert.Equal(0, retriesLeft); - Assert.Equal(0, policy.Attempts); - } - - [Fact] - public void FiniteRetryLimitIsExact() - { - var policy = new AutoRelogRetryPolicy(new ManualTimeProvider()); - - Assert.True(policy.TryReserveAttempt(3, out int firstRetriesLeft)); - Assert.True(policy.TryReserveAttempt(3, out int secondRetriesLeft)); - Assert.True(policy.TryReserveAttempt(3, out int thirdRetriesLeft)); - Assert.False(policy.TryReserveAttempt(3, out int exhaustedRetriesLeft)); - - Assert.Equal(2, firstRetriesLeft); - Assert.Equal(1, secondRetriesLeft); - Assert.Equal(0, thirdRetriesLeft); - Assert.Equal(0, exhaustedRetriesLeft); - } - - [Fact] - public void RejectedRestartDoesNotConsumeRetry() - { - var policy = new AutoRelogRetryPolicy(new ManualTimeProvider()); - - Assert.True(policy.TryReserveAttempt(1, out _)); - policy.RollBackReservedAttempt(); - - Assert.True(policy.TryReserveAttempt(1, out int retriesLeft)); - Assert.Equal(0, retriesLeft); - } - - [Fact] - public void CoalescedDuplicateRollsBackOnlyItsOwnReservation() - { - var policy = new AutoRelogRetryPolicy(new ManualTimeProvider()); - - Assert.True(policy.TryReserveAttempt(2, out int firstRetriesLeft)); - Assert.True(policy.TryReserveAttempt(2, out int duplicateRetriesLeft)); - policy.RollBackReservedAttempt(); - - Assert.Equal(1, firstRetriesLeft); - Assert.Equal(0, duplicateRetriesLeft); - Assert.Equal(1, policy.Attempts); - Assert.True(policy.TryReserveAttempt(2, out int secondFailureRetriesLeft)); - Assert.Equal(0, secondFailureRetriesLeft); - Assert.False(policy.TryReserveAttempt(2, out _)); - } - - [Fact] - public void UnlimitedDuplicateRollbackKeepsUnlimitedBudget() - { - var policy = new AutoRelogRetryPolicy(new ManualTimeProvider()); - - Assert.True(policy.TryReserveAttempt(-1, out _)); - Assert.True(policy.TryReserveAttempt(-1, out _)); - policy.RollBackReservedAttempt(); - - Assert.Equal(1, policy.Attempts); - Assert.True(policy.TryReserveAttempt(-1, out int retriesLeft)); - Assert.Equal(-1, retriesLeft); - } - - [Fact] - public void StableConnectionResetsRetryBudget() - { - var timeProvider = new ManualTimeProvider(); - var policy = new AutoRelogRetryPolicy(timeProvider); - Assert.True(policy.TryReserveAttempt(1, out _)); - - policy.MarkJoined(); - timeProvider.Advance(AutoRelogRetryPolicy.StableConnectionThreshold - TimeSpan.FromMilliseconds(1)); - Assert.False(policy.ResetAfterStableConnection()); - - timeProvider.Advance(TimeSpan.FromMilliseconds(1)); - Assert.True(policy.ResetAfterStableConnection()); - Assert.Equal(0, policy.Attempts); - Assert.True(policy.TryReserveAttempt(1, out _)); - } - - [Fact] - public void TransportLossAlwaysReconnectsWhenEnabled() - { - bool reconnect = AutoRelogRetryPolicy.ShouldReconnect( - ChatBot.DisconnectReason.ConnectionLost, - "A transport-specific error without a configured phrase", - ignoreKickMessage: false, - ["Server is restarting"], - out string? matchedMessage); - - Assert.True(reconnect); - Assert.Null(matchedMessage); - } - - [Theory] - [InlineData(ChatBot.DisconnectReason.InGameKick)] - [InlineData(ChatBot.DisconnectReason.LoginRejected)] - public void ServerMessageMatchingIsCaseInsensitive(ChatBot.DisconnectReason reason) - { - bool reconnect = AutoRelogRetryPolicy.ShouldReconnect( - reason, - "THE SERVER IS RESTARTING NOW", - ignoreKickMessage: false, - ["server is restarting"], - out string? matchedMessage); - - Assert.True(reconnect); - Assert.Equal("server is restarting", matchedMessage); - } - - [Fact] - public void UserLogoutNeverReconnects() - { - Assert.False(AutoRelogRetryPolicy.ShouldReconnect( - ChatBot.DisconnectReason.UserLogout, - "Server is restarting", - ignoreKickMessage: true, - ["Server is restarting"], - out _)); - } - - [Fact] - public void IgnoreKickMessageAllowsNonmatchingServerKick() - { - Assert.True(AutoRelogRetryPolicy.ShouldReconnect( - ChatBot.DisconnectReason.InGameKick, - "Administrative removal", - ignoreKickMessage: true, - [], - out _)); - } - - private sealed class ManualTimeProvider : TimeProvider - { - private DateTimeOffset utcNow = DateTimeOffset.UnixEpoch; - - public override DateTimeOffset GetUtcNow() => utcNow; - - internal void Advance(TimeSpan duration) - { - utcNow += duration; - } - } -} diff --git a/MinecraftClient.Tests/BlockStatePropertiesTests.cs b/MinecraftClient.Tests/BlockStatePropertiesTests.cs deleted file mode 100644 index c141d58c40..0000000000 --- a/MinecraftClient.Tests/BlockStatePropertiesTests.cs +++ /dev/null @@ -1,108 +0,0 @@ -using MinecraftClient.Mapping; -using MinecraftClient.Mapping.BlockPalettes; - -namespace MinecraftClient.Tests; - -public sealed class BlockStatePropertiesTests -{ - private readonly Palette262 _palette = new(); - - [Theory] - [InlineData(32162, "north", "true", "inactive")] - [InlineData(32168, "north", "false", "unlocking")] - [InlineData(32193, "east", "false", "ejecting")] - public void VaultStatesExposeAllProperties( - int stateId, - string facing, - string ominous, - string vaultState) - { - IReadOnlyDictionary properties = _palette.GetStateProperties(stateId); - - Assert.Equal(facing, properties["facing"]); - Assert.Equal(ominous, properties["ominous"]); - Assert.Equal(vaultState, properties["vault_state"]); - } - - [Fact] - public void PropertiesUseServerReportedStateStride() - { - IReadOnlyDictionary properties = _palette.GetStateProperties(3989); - - Assert.Equal("left", properties["type"]); - Assert.Equal("north", properties["facing"]); - Assert.Equal("true", properties["waterlogged"]); - } - - [Fact] - public void StateWithoutPropertiesReturnsEmptyMap() - { - IReadOnlyDictionary properties = _palette.GetStateProperties(1); - - Assert.Empty(properties); - } - - public static TheoryData ModernPalettes => new() - { - { "1.13.2", new Palette113() }, - { "1.14.4", new Palette114() }, - { "1.15.2", new Palette115() }, - { "1.16.5", new Palette116() }, - { "1.17.1", new Palette117() }, - { "1.19.2", new Palette119() }, - { "1.19.3", new Palette1193() }, - { "1.19.4", new Palette1194() }, - { "1.20", new Palette120() }, - { "1.20.4", new Palette1204() }, - { "1.20.6", new Palette1206() }, - { "1.21.2", new Palette1212() }, - { "1.21.4", new Palette1214() }, - { "1.21.5", new Palette1215() }, - { "1.21.6", new Palette1216() }, - { "1.21.9", new Palette1219() }, - { "26.1", new Palette261() }, - { "26.2", new Palette262() } - }; - - [Theory] - [MemberData(nameof(ModernPalettes))] - public void EveryModernPaletteExposesOakLogAxis(string version, BlockPalette palette) - { - bool foundExpectedState = false; - - for (int stateId = 0; stateId <= ushort.MaxValue; stateId++) - { - if (palette.FromId(stateId) != Material.OakLog) - continue; - - IReadOnlyDictionary properties = palette.GetStateProperties(stateId); - if (properties.TryGetValue("axis", out string? axis) && axis == "x") - { - foundExpectedState = true; - break; - } - } - - Assert.True(foundExpectedState, $"Minecraft {version} did not expose oak_log[axis=x]"); - } - - [Fact] - public void LegacyPaletteExposesPackedMetadata() - { - BlockPalette previousPalette = Block.Palette; - try - { - Block.Palette = new Palette112(); - Block block = new(17, 4); - - IReadOnlyDictionary properties = block.GetStateProperties(); - - Assert.Equal(276, block.StateId); - Assert.Equal("4", properties["metadata"]); - } - finally - { - Block.Palette = previousPalette; - } - } -} diff --git a/MinecraftClient.Tests/CSharpRunnerTests.cs b/MinecraftClient.Tests/CSharpRunnerTests.cs deleted file mode 100644 index c6846997ff..0000000000 --- a/MinecraftClient.Tests/CSharpRunnerTests.cs +++ /dev/null @@ -1,14 +0,0 @@ -using MinecraftClient.Scripting; - -namespace MinecraftClient.Tests; - -public sealed class CSharpRunnerTests -{ - [Theory] - [InlineData("//using MinecraftClient.CommandHandler", "using MinecraftClient.CommandHandler;")] - [InlineData("//using MinecraftClient.CommandHandler;", "using MinecraftClient.CommandHandler;")] - public void NormalizeUsingDirectiveAddsMissingSemicolon(string directive, string expected) - { - Assert.Equal(expected, CSharpRunner.NormalizeUsingDirective(directive)); - } -} diff --git a/MinecraftClient.Tests/ChatTypeHolderTests.cs b/MinecraftClient.Tests/ChatTypeHolderTests.cs deleted file mode 100644 index eddfb43b1b..0000000000 --- a/MinecraftClient.Tests/ChatTypeHolderTests.cs +++ /dev/null @@ -1,159 +0,0 @@ -using MinecraftClient.Protocol.Handlers; -using MinecraftClient.Protocol.Message; - -namespace MinecraftClient.Tests; - -public sealed class ChatTypeHolderTests -{ - [Fact] - public void ReferenceHolderUsesOneBasedWireIdIn121AndNewer() - { - var dataTypes = new DataTypes(Protocol18Handler.MC_1_21_Version); - var packetData = new Queue(DataTypes.GetVarInt(2)); - - int chatTypeId = ChatParser.ReadChatTypeHolder( - dataTypes, - packetData, - Protocol18Handler.MC_1_21_Version, - out var directDecoration); - - Assert.Equal(1, chatTypeId); - Assert.Null(directDecoration); - Assert.Empty(packetData); - } - - [Fact] - public void RegistryIdRemainsUnchangedBefore121() - { - var dataTypes = new DataTypes(Protocol18Handler.MC_1_20_6_Version); - var packetData = new Queue(DataTypes.GetVarInt(2)); - - int chatTypeId = ChatParser.ReadChatTypeHolder( - dataTypes, - packetData, - Protocol18Handler.MC_1_20_6_Version, - out var directDecoration); - - Assert.Equal(2, chatTypeId); - Assert.Null(directDecoration); - Assert.Empty(packetData); - } - - [Fact] - public void DirectHolderConsumesChatAndNarrationDecorations() - { - var dataTypes = new DataTypes(Protocol18Handler.MC_1_21_Version); - var packetBytes = new List(); - packetBytes.AddRange(DataTypes.GetVarInt(0)); - AddDecoration(packetBytes, dataTypes, "chat.type.text", 0, 2); - AddDecoration(packetBytes, dataTypes, "chat.type.text.narrate", 0, 2); - var packetData = new Queue(packetBytes); - - int chatTypeId = ChatParser.ReadChatTypeHolder( - dataTypes, - packetData, - Protocol18Handler.MC_1_21_Version, - out var directDecoration); - - Assert.Equal(-1, chatTypeId); - Assert.NotNull(directDecoration); - Assert.Equal("chat.type.text", directDecoration.TranslationKey); - Assert.Equal( - [ChatParser.ChatTypeParameter.Sender, ChatParser.ChatTypeParameter.Content], - directDecoration.Parameters); - Assert.Empty(packetData); - } - - [Fact] - public void RegistryDecorationControlsParameterSelectionAndOrdering() - { - Dictionary? originalChatTypes = ChatParser.ChatId2Type; - try - { - ChatParser.ClearChatTypeDecorations(); - ChatParser.ChatId2Type = []; - var chatTypeData = new Dictionary - { - ["chat"] = new Dictionary - { - ["translation_key"] = "commands.message.display.outgoing", - ["parameters"] = new object[] { "target", "content" } - } - }; - ChatParser.ReadChatType(42, "example:custom_chat", chatTypeData); - var message = new ChatMessage( - "hello", - false, - 42, - Guid.Empty, - null, - "Alice", - "Bob", - DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), - null, - false); - - string rendered = ChatParser.ParseSignedChat(message); - - Assert.Equal("You whisper to Bob: hello", rendered); - } - finally - { - ChatParser.ClearChatTypeDecorations(); - ChatParser.ChatId2Type = originalChatTypes; - } - } - - [Fact] - public void UnknownTranslationKeyIsUsedAsVanillaFormatPattern() - { - Dictionary? originalChatTypes = ChatParser.ChatId2Type; - try - { - ChatParser.ClearChatTypeDecorations(); - ChatParser.ChatId2Type = []; - var chatTypeData = new Dictionary - { - ["chat"] = new Dictionary - { - ["translation_key"] = "%s", - ["parameters"] = new object[] { "sender", "content" } - } - }; - ChatParser.ReadChatType(42, "ordinary:custom_chat", chatTypeData); - var message = new ChatMessage( - "hello", - false, - 42, - Guid.Empty, - null, - "Alice » hello", - null, - DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), - null, - false); - - string rendered = ChatParser.ParseSignedChat(message); - - Assert.Equal("Alice » hello", rendered); - } - finally - { - ChatParser.ClearChatTypeDecorations(); - ChatParser.ChatId2Type = originalChatTypes; - } - } - - private static void AddDecoration( - List packetBytes, - DataTypes dataTypes, - string translationKey, - params int[] parameters) - { - packetBytes.AddRange(dataTypes.GetString(translationKey)); - packetBytes.AddRange(DataTypes.GetVarInt(parameters.Length)); - foreach (int parameter in parameters) - packetBytes.AddRange(DataTypes.GetVarInt(parameter)); - packetBytes.AddRange(dataTypes.GetNbtTag(new Dictionary())); - } -} diff --git a/MinecraftClient.Tests/McClientConnectionFailureTests.cs b/MinecraftClient.Tests/McClientConnectionFailureTests.cs deleted file mode 100644 index 3789e53148..0000000000 --- a/MinecraftClient.Tests/McClientConnectionFailureTests.cs +++ /dev/null @@ -1,122 +0,0 @@ -using MinecraftClient.Scripting; - -namespace MinecraftClient.Tests; - -public sealed class McClientConnectionFailureTests -{ - [Fact] - public void LoginRejectedClaimPreventsSyntheticConnectionLostFallback() - { - var lifecycle = new ConnectionAttemptLifecycle(); - - Assert.True(lifecycle.TryBeginDisconnect()); - Assert.True(lifecycle.IsFailureClaimed); - Assert.False(lifecycle.TryBeginDisconnect()); - - lifecycle.CompleteDisconnect(); - - Assert.True(lifecycle.IsFailureClaimed); - Assert.False(lifecycle.TryBeginDisconnect()); - } - - [Fact] - public void UnclaimedGenericFailureCanBeClaimedExactlyOnce() - { - var lifecycle = new ConnectionAttemptLifecycle(); - - Assert.False(lifecycle.IsFailureClaimed); - Assert.True(lifecycle.TryBeginDisconnect()); - Assert.False(lifecycle.TryBeginDisconnect()); - } - - [Fact] - public void HeldBotsAreRestoredBeforeFailureAndReceiveOriginalMessageOnce() - { - const string rejectionMessage = "You are not white-listed on this server!"; - var bot = new RecordingBot(); - List heldBots = [bot]; - var loadedBots = new List(); - - ConnectionAttemptLifecycle.RestoreHeldBots(heldBots, loadedBots.Add); - foreach (ChatBot loadedBot in loadedBots) - loadedBot.OnDisconnect(ChatBot.DisconnectReason.LoginRejected, rejectionMessage); - - Assert.Empty(heldBots); - Assert.Single(loadedBots); - Assert.Equal(1, bot.DisconnectCount); - Assert.Equal(ChatBot.DisconnectReason.LoginRejected, bot.LastReason); - Assert.Equal(rejectionMessage, bot.LastMessage); - } - - [Fact] - public void OfflineRouteStaysOwnedAcrossReplacementAndSuccessfulHandoff() - { - var route = new AttemptOwnedRoute(); - int activations = 0; - int deactivations = 0; - - Assert.True(route.TryActivate(7, 7, () => activations++)); - Assert.False(route.TryActivate(7, 7, () => activations++)); - Assert.True(route.TryTransfer(7, 8)); - Assert.False(route.TryDeactivate(7, () => deactivations++)); - Assert.Equal(8, route.OwnerAttempt); - Assert.True(route.TryDeactivate(8, () => deactivations++)); - - Assert.Equal(1, activations); - Assert.Equal(1, deactivations); - Assert.Equal(-1, route.OwnerAttempt); - } - - [Fact] - public void InitialConnectionAttemptCanOwnOfflineRoute() - { - var route = new AttemptOwnedRoute(); - int activations = 0; - - Assert.True(route.TryActivate(0, 0, () => activations++)); - - Assert.Equal(1, activations); - Assert.Equal(0, route.OwnerAttempt); - } - - [Fact] - public void OlderAttemptCannotTakeAnEmptyOfflineRoute() - { - var route = new AttemptOwnedRoute(); - int activations = 0; - - Assert.False(route.TryActivate(4, 5, () => activations++)); - - Assert.Equal(0, activations); - Assert.Equal(-1, route.OwnerAttempt); - } - - [Fact] - public void StaleCleanupCannotClearNewerOfflineRoute() - { - var route = new AttemptOwnedRoute(); - int deactivations = 0; - - Assert.True(route.TryActivate(10, 10, () => { })); - Assert.True(route.TryActivate(11, 11, () => { })); - Assert.False(route.TryDeactivate(10, () => deactivations++)); - - Assert.Equal(11, route.OwnerAttempt); - Assert.Equal(0, deactivations); - } - - private sealed class RecordingBot : ChatBot - { - internal int DisconnectCount { get; private set; } - internal DisconnectReason? LastReason { get; private set; } - internal string? LastMessage { get; private set; } - - public override bool OnDisconnect(DisconnectReason reason, string message) - { - DisconnectCount++; - LastReason = reason; - LastMessage = message; - return false; - } - } -} diff --git a/MinecraftClient.Tests/MinecraftClient.Tests.csproj b/MinecraftClient.Tests/MinecraftClient.Tests.csproj deleted file mode 100644 index ebf278d35e..0000000000 --- a/MinecraftClient.Tests/MinecraftClient.Tests.csproj +++ /dev/null @@ -1,22 +0,0 @@ - - - net10.0 - enable - enable - false - true - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - diff --git a/MinecraftClient.Tests/RestartCoordinatorTests.cs b/MinecraftClient.Tests/RestartCoordinatorTests.cs deleted file mode 100644 index f9c9edef7e..0000000000 --- a/MinecraftClient.Tests/RestartCoordinatorTests.cs +++ /dev/null @@ -1,302 +0,0 @@ -namespace MinecraftClient.Tests; - -public sealed class RestartCoordinatorTests -{ - [Fact] - public async Task PreparationCompletesBeforeRequestCanExecute() - { - var completed = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - bool prepared = false; - - RestartCoordinator coordinator = null!; - coordinator = new RestartCoordinator( - (request, cancellationToken) => - { - Assert.True(Volatile.Read(ref prepared)); - Assert.True(coordinator.TryBeginCommit(request, out _)); - completed.SetResult(); - return Task.CompletedTask; - }, - exception => throw new Xunit.Sdk.XunitException(exception.ToString())); - using var cleanup = coordinator; - - Assert.True(coordinator.TrySchedule( - new RestartRequest(1, TimeSpan.Zero, true), - () => - { - Volatile.Write(ref prepared, true); - return true; - })); - await completed.Task.WaitAsync(TimeSpan.FromSeconds(5)); - } - - [Fact] - public async Task RejectedPreparationDoesNotPublishOrAdvanceAttempt() - { - var completed = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - int executions = 0; - - RestartCoordinator coordinator = null!; - coordinator = new RestartCoordinator( - (request, cancellationToken) => - { - Interlocked.Increment(ref executions); - Assert.True(coordinator.TryBeginCommit(request, out _)); - completed.SetResult(); - return Task.CompletedTask; - }, - exception => throw new Xunit.Sdk.XunitException(exception.ToString())); - using var cleanup = coordinator; - - Assert.False(coordinator.TrySchedule( - new RestartRequest(2, TimeSpan.Zero, true), - () => false)); - Assert.False(coordinator.HasScheduledRestart(2)); - - Assert.True(coordinator.TrySchedule(new RestartRequest(2, TimeSpan.Zero, true))); - await completed.Task.WaitAsync(TimeSpan.FromSeconds(5)); - - Assert.Equal(1, executions); - } - - [Fact] - public async Task FaultedSourceCleanupPreventsRestartExecution() - { - var failureReported = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - int executions = 0; - - using var coordinator = new RestartCoordinator( - (_, _) => - { - Interlocked.Increment(ref executions); - return Task.CompletedTask; - }, - exception => failureReported.SetResult(exception)); - - var cleanupFailure = new InvalidOperationException("cleanup failed"); - Assert.True(coordinator.TrySchedule(new RestartRequest( - 3, - TimeSpan.Zero, - true, - SourceCleanupCompletion: Task.FromException(cleanupFailure)))); - - Exception reportedException = await failureReported.Task.WaitAsync(TimeSpan.FromSeconds(5)); - - Assert.Same(cleanupFailure, reportedException); - Assert.Equal(0, executions); - } - - [Fact] - public async Task AutomaticSameAttemptIsCoalescedWhileQueued() - { - var blockerStarted = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - var releaseBlocker = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - var queuedCompleted = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - int queuedExecutions = 0; - - RestartCoordinator coordinator = null!; - coordinator = new RestartCoordinator( - async (request, cancellationToken) => - { - if (request.ConnectionAttempt == 9) - { - blockerStarted.SetResult(); - await releaseBlocker.Task.WaitAsync(cancellationToken); - return; - } - - Interlocked.Increment(ref queuedExecutions); - Assert.True(coordinator.TryBeginCommit(request, out _)); - queuedCompleted.SetResult(); - }, - exception => throw new Xunit.Sdk.XunitException(exception.ToString())); - using var cleanup = coordinator; - - Assert.True(coordinator.TrySchedule(new RestartRequest(9, TimeSpan.Zero, true))); - await blockerStarted.Task.WaitAsync(TimeSpan.FromSeconds(5)); - - Assert.True(coordinator.TrySchedule(new RestartRequest(10, TimeSpan.Zero, true))); - Assert.False(coordinator.TrySchedule(new RestartRequest(10, TimeSpan.Zero, true))); - Assert.True(coordinator.HasScheduledRestart(10)); - - releaseBlocker.SetResult(); - await queuedCompleted.Task.WaitAsync(TimeSpan.FromSeconds(5)); - - Assert.Equal(1, queuedExecutions); - } - - [Fact] - public async Task AutomaticSameAttemptIsCoalescedDuringCallback() - { - var callbackStarted = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - var releaseCallback = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - var callbackCompleted = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - int executions = 0; - - RestartCoordinator coordinator = null!; - coordinator = new RestartCoordinator( - async (request, cancellationToken) => - { - Interlocked.Increment(ref executions); - callbackStarted.SetResult(); - await releaseCallback.Task.WaitAsync(cancellationToken); - Assert.True(coordinator.TryBeginCommit(request, out _)); - callbackCompleted.SetResult(); - }, - exception => throw new Xunit.Sdk.XunitException(exception.ToString())); - using var cleanup = coordinator; - - Assert.True(coordinator.TrySchedule(new RestartRequest(42, TimeSpan.Zero, true))); - await callbackStarted.Task.WaitAsync(TimeSpan.FromSeconds(5)); - - Assert.False(coordinator.TrySchedule(new RestartRequest(42, TimeSpan.Zero, true))); - - releaseCallback.SetResult(); - await callbackCompleted.Task.WaitAsync(TimeSpan.FromSeconds(5)); - - Assert.Equal(1, executions); - } - - [Fact] - public async Task ExplicitReplacementDuringDelayUsesLatestSnapshotWithoutAnotherExecution() - { - var callbackStarted = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - var allowCommit = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - var callbackCompleted = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - RestartRequest committedRequest = default; - int executions = 0; - - RestartCoordinator coordinator = null!; - coordinator = new RestartCoordinator( - async (request, cancellationToken) => - { - Interlocked.Increment(ref executions); - callbackStarted.SetResult(); - await allowCommit.Task.WaitAsync(cancellationToken); - Assert.True(coordinator.TryBeginCommit(request, out committedRequest)); - callbackCompleted.SetResult(); - }, - exception => throw new Xunit.Sdk.XunitException(exception.ToString())); - using var cleanup = coordinator; - - Assert.True(coordinator.TrySchedule(new RestartRequest( - 50, - TimeSpan.FromSeconds(10), - true, - CreateSettingsSnapshot("first")))); - await callbackStarted.Task.WaitAsync(TimeSpan.FromSeconds(5)); - - Assert.True(coordinator.TrySchedule(new RestartRequest( - 50, - TimeSpan.Zero, - true, - CreateSettingsSnapshot("replacement"), - ReplaceUntilCommit: true))); - - allowCommit.SetResult(); - await callbackCompleted.Task.WaitAsync(TimeSpan.FromSeconds(5)); - - Assert.Equal(1, executions); - Assert.Equal("replacement", committedRequest.SettingsSnapshot?.Account.Login); - } - - [Fact] - public async Task RejectsSameAttemptReplacementAfterCommit() - { - var commitStarted = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - var releaseCommit = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - RestartRequest committedRequest = default; - - RestartCoordinator coordinator = null!; - coordinator = new RestartCoordinator( - async (request, cancellationToken) => - { - Assert.True(coordinator.TryBeginCommit(request, out committedRequest)); - commitStarted.SetResult(); - await releaseCommit.Task.WaitAsync(cancellationToken); - }, - exception => throw new Xunit.Sdk.XunitException(exception.ToString())); - using var cleanup = coordinator; - - Assert.True(coordinator.TrySchedule(new RestartRequest( - 60, - TimeSpan.Zero, - true, - CreateSettingsSnapshot("committed")))); - await commitStarted.Task.WaitAsync(TimeSpan.FromSeconds(5)); - - Assert.False(coordinator.TrySchedule(new RestartRequest( - 60, - TimeSpan.Zero, - true, - CreateSettingsSnapshot("rejected"), - ReplaceUntilCommit: true))); - Assert.Equal("committed", committedRequest.SettingsSnapshot?.Account.Login); - - releaseCommit.SetResult(); - } - - [Fact] - public void RejectsStaleAttempt() - { - RestartCoordinator coordinator = null!; - coordinator = new RestartCoordinator( - (_, _) => Task.CompletedTask, - exception => throw new Xunit.Sdk.XunitException(exception.ToString())); - using var cleanup = coordinator; - - Assert.True(coordinator.TrySchedule(new RestartRequest(20, TimeSpan.Zero, true))); - Assert.False(coordinator.TrySchedule(new RestartRequest(19, TimeSpan.Zero, true))); - } - - [Fact] - public async Task RejectsCompletedAttempt() - { - var completed = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - RestartCoordinator coordinator = null!; - coordinator = new RestartCoordinator( - (request, cancellationToken) => - { - Assert.True(coordinator.TryBeginCommit(request, out _)); - completed.SetResult(); - return Task.CompletedTask; - }, - exception => throw new Xunit.Sdk.XunitException(exception.ToString())); - using var cleanup = coordinator; - - Assert.True(coordinator.TrySchedule(new RestartRequest(20, TimeSpan.Zero, true))); - await completed.Task.WaitAsync(TimeSpan.FromSeconds(5)); - Assert.True(SpinWait.SpinUntil(() => !coordinator.HasScheduledRestart(20), TimeSpan.FromSeconds(5))); - - Assert.False(coordinator.TrySchedule(new RestartRequest(20, TimeSpan.Zero, true))); - } - - [Fact] - public async Task TerminalStopCancelsInFlightWorkAndRejectsFurtherRestarts() - { - var callbackStarted = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - using var coordinator = new RestartCoordinator( - async (_, cancellationToken) => - { - callbackStarted.SetResult(); - await Task.Delay(Timeout.InfiniteTimeSpan, cancellationToken); - }, - exception => throw new Xunit.Sdk.XunitException(exception.ToString())); - - Assert.True(coordinator.TrySchedule(new RestartRequest(1, TimeSpan.Zero, true))); - await callbackStarted.Task.WaitAsync(TimeSpan.FromSeconds(5)); - - coordinator.Stop(); - - Assert.False(coordinator.TrySchedule(new RestartRequest(2, TimeSpan.Zero, true))); - Assert.False(coordinator.HasScheduledRestart(1)); - } - - private static RestartSettingsSnapshot CreateSettingsSnapshot(string account) - { - return new RestartSettingsSnapshot( - new Settings.MainConfigHelper.MainConfig.AccountInfoConfig(account, "-"), - "localhost", - 25565); - } -} diff --git a/MinecraftClient.Tests/SocketWrapperTests.cs b/MinecraftClient.Tests/SocketWrapperTests.cs deleted file mode 100644 index c04fb9b4d6..0000000000 --- a/MinecraftClient.Tests/SocketWrapperTests.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System.Net; -using System.Net.Sockets; -using MinecraftClient.Protocol.Handlers; - -namespace MinecraftClient.Tests; - -public sealed class SocketWrapperTests -{ - [Fact] - public async Task GracefulPeerCloseEndsReadInsteadOfSpinning() - { - var listener = new TcpListener(IPAddress.Loopback, 0); - listener.Start(); - try - { - using var client = new TcpClient(); - Task acceptTask = listener.AcceptTcpClientAsync(); - await client.ConnectAsync((IPEndPoint)listener.LocalEndpoint); - using TcpClient peer = await acceptTask; - var wrapper = new SocketWrapper(client); - - peer.Client.Shutdown(SocketShutdown.Both); - peer.Close(); - - Assert.True(SpinWait.SpinUntil(wrapper.HasDataAvailable, TimeSpan.FromSeconds(5))); - await Assert.ThrowsAsync( - () => Task.Run(() => wrapper.ReadDataRAW(1)).WaitAsync(TimeSpan.FromSeconds(5))); - } - finally - { - listener.Stop(); - } - } -} diff --git a/MinecraftClient.Tests/Usings.cs b/MinecraftClient.Tests/Usings.cs deleted file mode 100644 index c802f4480b..0000000000 --- a/MinecraftClient.Tests/Usings.cs +++ /dev/null @@ -1 +0,0 @@ -global using Xunit; diff --git a/MinecraftClient.sln b/MinecraftClient.sln deleted file mode 100644 index 3f24b2216d..0000000000 --- a/MinecraftClient.sln +++ /dev/null @@ -1,101 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.3.32901.215 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MinecraftClient", "MinecraftClient\MinecraftClient.csproj", "{1E2FACE4-F5CA-4323-9641-740C6A551770}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConsoleInteractive", "ConsoleInteractive\ConsoleInteractive\ConsoleInteractive\ConsoleInteractive.csproj", "{93DA4D71-EFAD-4493-BE21-A105AF663660}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DebugTools", "DebugTools", "{02313C6C-37F1-D66D-F235-6A4537C03113}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MccMcpStdioHarness", "DebugTools\MccMcpStdioHarness\MccMcpStdioHarness.csproj", "{F032D2BB-A0A9-4726-A58F-C02F7EA606D6}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MccMcpWebPlayground", "DebugTools\MccMcpWebPlayground\MccMcpWebPlayground.csproj", "{5F620CF6-BC7D-449A-B779-2D51985059C6}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MinecraftClient.Tests", "MinecraftClient.Tests\MinecraftClient.Tests.csproj", "{44B63F7B-30E2-47DA-B2C8-A8742BC8AE0B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {1E2FACE4-F5CA-4323-9641-740C6A551770}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1E2FACE4-F5CA-4323-9641-740C6A551770}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1E2FACE4-F5CA-4323-9641-740C6A551770}.Debug|x64.ActiveCfg = Debug|Any CPU - {1E2FACE4-F5CA-4323-9641-740C6A551770}.Debug|x64.Build.0 = Debug|Any CPU - {1E2FACE4-F5CA-4323-9641-740C6A551770}.Debug|x86.ActiveCfg = Debug|Any CPU - {1E2FACE4-F5CA-4323-9641-740C6A551770}.Debug|x86.Build.0 = Debug|Any CPU - {1E2FACE4-F5CA-4323-9641-740C6A551770}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1E2FACE4-F5CA-4323-9641-740C6A551770}.Release|Any CPU.Build.0 = Release|Any CPU - {1E2FACE4-F5CA-4323-9641-740C6A551770}.Release|x64.ActiveCfg = Release|Any CPU - {1E2FACE4-F5CA-4323-9641-740C6A551770}.Release|x64.Build.0 = Release|Any CPU - {1E2FACE4-F5CA-4323-9641-740C6A551770}.Release|x86.ActiveCfg = Release|Any CPU - {1E2FACE4-F5CA-4323-9641-740C6A551770}.Release|x86.Build.0 = Release|Any CPU - {93DA4D71-EFAD-4493-BE21-A105AF663660}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {93DA4D71-EFAD-4493-BE21-A105AF663660}.Debug|Any CPU.Build.0 = Debug|Any CPU - {93DA4D71-EFAD-4493-BE21-A105AF663660}.Debug|x64.ActiveCfg = Debug|Any CPU - {93DA4D71-EFAD-4493-BE21-A105AF663660}.Debug|x64.Build.0 = Debug|Any CPU - {93DA4D71-EFAD-4493-BE21-A105AF663660}.Debug|x86.ActiveCfg = Debug|Any CPU - {93DA4D71-EFAD-4493-BE21-A105AF663660}.Debug|x86.Build.0 = Debug|Any CPU - {93DA4D71-EFAD-4493-BE21-A105AF663660}.Release|Any CPU.ActiveCfg = Release|Any CPU - {93DA4D71-EFAD-4493-BE21-A105AF663660}.Release|Any CPU.Build.0 = Release|Any CPU - {93DA4D71-EFAD-4493-BE21-A105AF663660}.Release|x64.ActiveCfg = Release|Any CPU - {93DA4D71-EFAD-4493-BE21-A105AF663660}.Release|x64.Build.0 = Release|Any CPU - {93DA4D71-EFAD-4493-BE21-A105AF663660}.Release|x86.ActiveCfg = Release|Any CPU - {93DA4D71-EFAD-4493-BE21-A105AF663660}.Release|x86.Build.0 = Release|Any CPU - {F032D2BB-A0A9-4726-A58F-C02F7EA606D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F032D2BB-A0A9-4726-A58F-C02F7EA606D6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F032D2BB-A0A9-4726-A58F-C02F7EA606D6}.Debug|x64.ActiveCfg = Debug|Any CPU - {F032D2BB-A0A9-4726-A58F-C02F7EA606D6}.Debug|x64.Build.0 = Debug|Any CPU - {F032D2BB-A0A9-4726-A58F-C02F7EA606D6}.Debug|x86.ActiveCfg = Debug|Any CPU - {F032D2BB-A0A9-4726-A58F-C02F7EA606D6}.Debug|x86.Build.0 = Debug|Any CPU - {F032D2BB-A0A9-4726-A58F-C02F7EA606D6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F032D2BB-A0A9-4726-A58F-C02F7EA606D6}.Release|Any CPU.Build.0 = Release|Any CPU - {F032D2BB-A0A9-4726-A58F-C02F7EA606D6}.Release|x64.ActiveCfg = Release|Any CPU - {F032D2BB-A0A9-4726-A58F-C02F7EA606D6}.Release|x64.Build.0 = Release|Any CPU - {F032D2BB-A0A9-4726-A58F-C02F7EA606D6}.Release|x86.ActiveCfg = Release|Any CPU - {F032D2BB-A0A9-4726-A58F-C02F7EA606D6}.Release|x86.Build.0 = Release|Any CPU - {5F620CF6-BC7D-449A-B779-2D51985059C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5F620CF6-BC7D-449A-B779-2D51985059C6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5F620CF6-BC7D-449A-B779-2D51985059C6}.Debug|x64.ActiveCfg = Debug|Any CPU - {5F620CF6-BC7D-449A-B779-2D51985059C6}.Debug|x64.Build.0 = Debug|Any CPU - {5F620CF6-BC7D-449A-B779-2D51985059C6}.Debug|x86.ActiveCfg = Debug|Any CPU - {5F620CF6-BC7D-449A-B779-2D51985059C6}.Debug|x86.Build.0 = Debug|Any CPU - {5F620CF6-BC7D-449A-B779-2D51985059C6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5F620CF6-BC7D-449A-B779-2D51985059C6}.Release|Any CPU.Build.0 = Release|Any CPU - {5F620CF6-BC7D-449A-B779-2D51985059C6}.Release|x64.ActiveCfg = Release|Any CPU - {5F620CF6-BC7D-449A-B779-2D51985059C6}.Release|x64.Build.0 = Release|Any CPU - {5F620CF6-BC7D-449A-B779-2D51985059C6}.Release|x86.ActiveCfg = Release|Any CPU - {5F620CF6-BC7D-449A-B779-2D51985059C6}.Release|x86.Build.0 = Release|Any CPU - {44B63F7B-30E2-47DA-B2C8-A8742BC8AE0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {44B63F7B-30E2-47DA-B2C8-A8742BC8AE0B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {44B63F7B-30E2-47DA-B2C8-A8742BC8AE0B}.Debug|x64.ActiveCfg = Debug|Any CPU - {44B63F7B-30E2-47DA-B2C8-A8742BC8AE0B}.Debug|x64.Build.0 = Debug|Any CPU - {44B63F7B-30E2-47DA-B2C8-A8742BC8AE0B}.Debug|x86.ActiveCfg = Debug|Any CPU - {44B63F7B-30E2-47DA-B2C8-A8742BC8AE0B}.Debug|x86.Build.0 = Debug|Any CPU - {44B63F7B-30E2-47DA-B2C8-A8742BC8AE0B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {44B63F7B-30E2-47DA-B2C8-A8742BC8AE0B}.Release|Any CPU.Build.0 = Release|Any CPU - {44B63F7B-30E2-47DA-B2C8-A8742BC8AE0B}.Release|x64.ActiveCfg = Release|Any CPU - {44B63F7B-30E2-47DA-B2C8-A8742BC8AE0B}.Release|x64.Build.0 = Release|Any CPU - {44B63F7B-30E2-47DA-B2C8-A8742BC8AE0B}.Release|x86.ActiveCfg = Release|Any CPU - {44B63F7B-30E2-47DA-B2C8-A8742BC8AE0B}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {F032D2BB-A0A9-4726-A58F-C02F7EA606D6} = {02313C6C-37F1-D66D-F235-6A4537C03113} - {5F620CF6-BC7D-449A-B779-2D51985059C6} = {02313C6C-37F1-D66D-F235-6A4537C03113} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {6DED60F4-9CF4-4DB3-8966-582B2EBE8487} - RESX_ShowErrorsInErrorList = False - RESX_SortFileContentOnSave = False - EndGlobalSection -EndGlobal diff --git a/MinecraftClient/Achievement.cs b/MinecraftClient/Achievement.cs deleted file mode 100644 index 760e4054cd..0000000000 --- a/MinecraftClient/Achievement.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient -{ - /// - /// The type of an achievement or advancement. - /// - public enum AchievementType - { - Task, - Challenge, - Goal, - Legacy - } - - /// - /// Represents a Minecraft achievement (pre-1.12) or advancement (1.12+). - /// - /// Resource identifier, e.g. "minecraft:story/root" or "achievement.openInventory" - /// Display title (null for legacy achievements without display info) - /// Display description (null for legacy achievements without display info) - /// The frame type / achievement category - /// Whether this advancement is hidden in the UI - /// Whether all requirements have been met - /// OR-groups of criterion names; all groups must be satisfied - /// Per-criterion completion status - public record Achievement( - string Id, - string? Title, - string? Description, - AchievementType Type, - bool IsHidden, - bool IsCompleted, - IReadOnlyList> Requirements, - IReadOnlyDictionary CriteriaProgress); -} diff --git a/MinecraftClient/AutoTimeout.cs b/MinecraftClient/AutoTimeout.cs deleted file mode 100644 index 786be4db13..0000000000 --- a/MinecraftClient/AutoTimeout.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Threading; - -namespace MinecraftClient -{ - /// - /// Allow easy timeout on pieces of code - /// - /// - /// By ORelio - (c) 2014 - CDDL 1.0 - /// - public class AutoTimeout - { - /// - /// Perform the specified action with specified timeout - /// - /// Action to run - /// Maximum timeout in milliseconds - /// True if the action finished whithout timing out - public static bool Perform(Action action, int timeout) - { - return Perform(action, TimeSpan.FromMilliseconds(timeout)); - } - - /// - /// Perform the specified action with specified timeout - /// - /// Action to run - /// Maximum timeout - /// True if the action finished whithout timing out - public static bool Perform(Action action, TimeSpan timeout) - { - Thread thread = new(new ThreadStart(action)); - thread.Start(); - - bool success = thread.Join(timeout); - if (!success) - thread.Interrupt(); - - return success; - } - } -} \ No newline at end of file diff --git a/MinecraftClient/ChatBots/Alerts.cs b/MinecraftClient/ChatBots/Alerts.cs deleted file mode 100644 index f480e4892e..0000000000 --- a/MinecraftClient/ChatBots/Alerts.cs +++ /dev/null @@ -1,172 +0,0 @@ -using System; -using System.Linq; -using MinecraftClient.Scripting; -using Tomlet.Attributes; - -namespace MinecraftClient.ChatBots -{ - /// - /// This bot make the console beep on some specified words. Useful to detect when someone is talking to you, for example. - /// - public class Alerts : ChatBot - { - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] - private const string BotName = "Alerts"; - - public bool Enabled = false; - - [TomlInlineComment("$ChatBot.Alerts.Beep_Enabled$")] - public bool Beep_Enabled = true; - - [TomlInlineComment("$ChatBot.Alerts.Trigger_By_Words$")] - public bool Trigger_By_Words = false; - - [TomlInlineComment("$ChatBot.Alerts.Trigger_By_Rain$")] - public bool Trigger_By_Rain = false; - - [TomlInlineComment("$ChatBot.Alerts.Trigger_By_Thunderstorm$")] - public bool Trigger_By_Thunderstorm = false; - - [TomlInlineComment("$ChatBot.Alerts.Log_To_File$")] - public bool Log_To_File = false; - - [TomlInlineComment("$ChatBot.Alerts.Log_File$")] - public string Log_File = @"alerts-log.txt"; - - [TomlPrecedingComment("$ChatBot.Alerts.Matches$")] - public string[] Matches = new string[] { "Yourname", " whispers ", "-> me", "admin", ".com" }; - - [TomlPrecedingComment("$ChatBot.Alerts.Excludes$")] - public string[] Excludes = new string[] { "myserver.com", "Yourname>:", "Player Yourname", "Yourname joined", "Yourname left", "[Lockette] (Admin)", " Yourname:", "Yourname is" }; - - public void OnSettingUpdate() - { - Log_File ??= string.Empty; - - if (!Enabled) return; - - bool checkSuccessed = true; - - if (Trigger_By_Words) - { - if (Log_To_File) - { - try - { - System.IO.File.AppendAllText(Log_File, string.Empty); - } - catch - { - checkSuccessed = false; - LogToConsole(BotName, "Can't write logs to " + System.IO.Path.GetFullPath(Log_File)); - } - } - } - - if (!checkSuccessed) - { - LogToConsole(BotName, Translations.general_bot_unload); - Enabled = false; - } - } - } - - float curRainLevel = 0; - float curThunderLevel = 0; - const float threshold = 0.2f; - - /// - /// Process text received from the server to display alerts - /// - /// Received text - public override void GetText(string text) - { - if (Config.Trigger_By_Words) - { - //Remove color codes and convert to lowercase - text = GetVerbatim(text).ToLower(); - - //Proceed only if no exclusions are found in text - if (!Config.Excludes.Any(exclusion => text.Contains(exclusion.ToLower()))) - { - //Show an alert for each alert item found in text, if any - foreach (string alert in Config.Matches.Where(alert => text.Contains(alert.ToLower()))) - { - if (Config.Beep_Enabled) - Console.Beep(); //Text found ! - - ConsoleIO.WriteLine(text.Replace(alert, "§c" + alert + "§r")); - - if (Config.Log_To_File && Config.Log_File.Length > 0) - { - DateTime now = DateTime.Now; - string TimeStamp = "[" + now.Year + '/' + now.Month + '/' + now.Day + ' ' + now.Hour + ':' + now.Minute + ']'; - System.IO.File.AppendAllText(Config.Log_File, TimeStamp + " " + GetVerbatim(text) + "\n"); - } - } - } - } - } - - public override void OnRainLevelChange(float level) - { - if (curRainLevel < threshold && level >= threshold) - { - if (Config.Trigger_By_Rain) - { - if (Config.Beep_Enabled) - { - Console.Beep(); - Console.Beep(); - } - LogToConsole("§c" + Translations.bot_alerts_start_rain); - } - } - else if (curRainLevel >= threshold && level < threshold) - { - if (Config.Trigger_By_Rain) - { - if (Config.Beep_Enabled) - { - Console.Beep(); - } - LogToConsole("§c" + Translations.bot_alerts_end_rain); - } - } - curRainLevel = level; - } - - public override void OnThunderLevelChange(float level) - { - if (curThunderLevel < threshold && level >= threshold) - { - if (Config.Trigger_By_Thunderstorm) - { - if (Config.Beep_Enabled) - { - Console.Beep(); - Console.Beep(); - } - LogToConsole("§c" + Translations.bot_alerts_start_thunderstorm); - } - } - else if (curThunderLevel >= threshold && level < threshold) - { - if (Config.Trigger_By_Thunderstorm) - { - if (Config.Beep_Enabled) - { - Console.Beep(); - } - LogToConsole("§c" + Translations.bot_alerts_end_thunderstorm); - } - } - curThunderLevel = level; - } - } -} diff --git a/MinecraftClient/ChatBots/AntiAFK.cs b/MinecraftClient/ChatBots/AntiAFK.cs deleted file mode 100644 index 4291e8dd7a..0000000000 --- a/MinecraftClient/ChatBots/AntiAFK.cs +++ /dev/null @@ -1,190 +0,0 @@ -using System; -using MinecraftClient.Mapping; -using MinecraftClient.Scripting; -using Tomlet.Attributes; - -namespace MinecraftClient.ChatBots -{ - /// - /// This bot sends a command every 60 seconds in order to stay non-afk. - /// - public class AntiAFK : ChatBot - { - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] private const string BotName = "AntiAFK"; - - public bool Enabled = false; - - [TomlInlineComment("$ChatBot.AntiAfk.Delay$")] - public Range Delay = new(60); - - [TomlInlineComment("$ChatBot.AntiAfk.Command$")] - public string Command = "/ping"; - - [TomlInlineComment("$ChatBot.AntiAfk.Use_Sneak$")] - public bool Use_Sneak = false; - - [TomlInlineComment("$ChatBot.AntiAfk.Use_Terrain_Handling$")] - public bool Use_Terrain_Handling = false; - - [TomlInlineComment("$ChatBot.AntiAfk.Walk_Range$")] - public int Walk_Range = 5; - - [TomlInlineComment("$ChatBot.AntiAfk.Walk_Retries$")] - public int Walk_Retries = 20; - - public void OnSettingUpdate() - { - if (Walk_Range <= 0) - { - Walk_Range = 5; - LogToConsole(BotName, Translations.bot_antiafk_invalid_walk_range); - } - - Delay.min = Math.Max(1.0, Delay.min); - Delay.max = Math.Max(1.0, Delay.max); - - double maxDelaySeconds = int.MaxValue / (double)Settings.ClientTicksPerSecond; - Delay.min = Math.Min(maxDelaySeconds, Delay.min); - Delay.max = Math.Min(maxDelaySeconds, Delay.max); - - if (Delay.min > Delay.max) - { - (Delay.min, Delay.max) = (Delay.max, Delay.min); - LogToConsole(BotName, Translations.bot_antiafk_swapping); - } - - Command ??= string.Empty; - } - - public struct Range - { - public double min, max; - - public Range() - { - min = 0; - max = 0; - } - - public Range(int value) - { - min = max = value; - } - - public Range(int min, int max) - { - this.min = min; - this.max = max; - } - } - } - - private int count, nextrun = Settings.DoubleToTick(5.0); - private bool previousSneakState = false; - private readonly Random random = new(); - - /// - /// This bot sends a /ping command every X seconds in order to stay non-afk. - /// - public AntiAFK() - { - count = 0; - } - - public override void Initialize() - { - if (Config.Use_Terrain_Handling) - { - if (!GetTerrainEnabled()) - { - LogToConsole(Translations.bot_antiafk_not_using_terrain_handling); - } - else - { - var movementLock = BotMovementLock.Instance; - if (movementLock is { IsLocked: true }) - LogToConsole( - $"§§6§1§0{string.Format(Translations.bot_antiafk_may_not_move, movementLock.LockedBy)}"); - } - } - } - - public override void Update() - { - count++; - - if (count < nextrun) return; - DoAntiAfkStuff(); - count = 0; - nextrun = random.Next(Settings.DoubleToTick(Config.Delay.min), Settings.DoubleToTick(Config.Delay.max)); - } - - private void DoAntiAfkStuff() - { - var isMovementLocked = BotMovementLock.Instance; - if (Config.Use_Terrain_Handling && GetTerrainEnabled() && isMovementLocked is { IsLocked: false }) - { - var currentLocation = GetCurrentLocation(); - - var moved = false; - var useAlternativeMethod = false; - var triesCounter = 0; - - while (!moved) - { - if (triesCounter++ >= Config.Walk_Retries) - { - useAlternativeMethod = true; - break; - } - - var goal = GetRandomLocationWithinRangeXZ(currentLocation, Config.Walk_Range); - - // Prevent getting the same location - while ((currentLocation.X == goal.X) && (currentLocation.Y == goal.Y) && - (currentLocation.Z == goal.Z)) - { - LogToConsole("Same location!, generating new one"); - goal = GetRandomLocationWithinRangeXZ(currentLocation, Config.Walk_Range); - } - - if (!Movement.CheckChunkLoading(GetWorld(), currentLocation, goal)) - { - useAlternativeMethod = true; - break; - } - - moved = MoveToLocation(goal, allowUnsafe: false, allowDirectTeleport: false); - } - - if (!useAlternativeMethod && Config.Use_Sneak) - { - // Solve the case when the bot was closed in 1x2, was sneaking, but then he was freed, this will make him not sneak anymore - previousSneakState = false; - Sneak(false); - return; - } - } - - SendText(Config.Command); - if (Config.Use_Sneak) - { - Sneak(previousSneakState); - previousSneakState = !previousSneakState; - } - - count = 0; - } - - private Location GetRandomLocationWithinRangeXZ(Location currentLocation, int range) - { - return new Location(currentLocation.X + random.Next(range * -1, range), currentLocation.Y, - currentLocation.Z + random.Next(range * -1, range)); - } - } -} diff --git a/MinecraftClient/ChatBots/AutoAttack.cs b/MinecraftClient/ChatBots/AutoAttack.cs deleted file mode 100644 index f851ca0af3..0000000000 --- a/MinecraftClient/ChatBots/AutoAttack.cs +++ /dev/null @@ -1,345 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Mapping; -using MinecraftClient.Scripting; -using Tomlet.Attributes; - -namespace MinecraftClient.ChatBots -{ - /// - /// The AutoAttack bot will automatically attack any hostile mob close to the player - /// - public class AutoAttack : ChatBot - { - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] - private const string BotName = "AutoAttack"; - - public bool Enabled = false; - - [TomlInlineComment("$ChatBot.AutoAttack.Mode$")] - public AttackMode Mode = AttackMode.single; - - [TomlInlineComment("$ChatBot.AutoAttack.Priority$")] - public PriorityType Priority = PriorityType.distance; - - [TomlInlineComment("$ChatBot.AutoAttack.Cooldown_Time$")] - public CooldownConfig Cooldown_Time = new(); - - [TomlInlineComment("$ChatBot.AutoAttack.Interaction$")] - public InteractType Interaction = InteractType.Attack; - - [TomlInlineComment("$ChatBot.AutoAttack.Attack_Range$")] - public double Attack_Range = 4.0; - - [TomlInlineComment("$ChatBot.AutoAttack.Attack_Hostile$")] - public bool Attack_Hostile = true; - - [TomlInlineComment("$ChatBot.AutoAttack.Attack_Passive$")] - public bool Attack_Passive = false; - - [TomlInlineComment("$ChatBot.AutoAttack.List_Mode$")] - public ListType List_Mode = ListType.whitelist; - - [TomlInlineComment("$ChatBot.AutoAttack.Entites_List$")] - public List Entites_List = new() { EntityType.Zombie, EntityType.Cow }; - - public void OnSettingUpdate() - { - if (Cooldown_Time.Custom) - { - if (Cooldown_Time.Min <= 0) - Cooldown_Time.Min = 0.1; - if (Cooldown_Time.Max <= 0) - Cooldown_Time.Max = 0.1; - - if (Cooldown_Time.Min > Cooldown_Time.Max) - { - double temp = Cooldown_Time.Min; - Cooldown_Time.Min = Cooldown_Time.Max; - Cooldown_Time.Max = temp; - } - } - - if (Attack_Range < 1.0) - Attack_Range = 1.0; - - if (Attack_Range > 4.0) - Attack_Range = 4.0; - } - - public enum AttackMode { single, multi }; - - public enum PriorityType { distance, health }; - - public enum ListType { blacklist, whitelist }; - - public struct CooldownConfig - { - public bool Custom; - public bool RandomMode = false; - public double Min = 1.5; - public double Max = 2.5; - - public CooldownConfig() - { - Custom = false; - RandomMode = false; - Min = 1.5; - Max = 2.5; - } - } - } - - private readonly Dictionary entitiesToAttack = new(); // mobs within attack range - private int attackCooldown = 6; - private int attackCooldownCounter = 6; - private Double attackSpeed = 4; - private Double attackCooldownSeconds; - private readonly bool overrideAttackSpeed = false; - private readonly double attackRange = 4.0; - private Double serverTPS; - private float health = 100; - private readonly bool attackHostile = true; - private readonly bool attackPassive = false; - private readonly Random _random = new(); - - public AutoAttack() - { - overrideAttackSpeed = Config.Cooldown_Time.Custom; - if (Config.Cooldown_Time.Custom) - { - attackCooldownSeconds = Config.Cooldown_Time.Min; - attackCooldown = SecondsToAttackCooldownTicks(attackCooldownSeconds); - } - - attackHostile = Config.Attack_Hostile; - attackPassive = Config.Attack_Passive; - attackRange = Config.Attack_Range; - } - - public override void Initialize() - { - if (!GetEntityHandlingEnabled()) - { - LogToConsole(Translations.extra_entity_required); - LogToConsole(Translations.general_bot_unload); - UnloadBot(); - } - } - - public override void Update() - { - if (AutoEat.Eating | health == 0) - return; - - if (attackCooldownCounter == 0) - { - if (Config.Cooldown_Time.Custom && Config.Cooldown_Time.RandomMode) - { - double randomSeconds = _random.NextDouble() * (Config.Cooldown_Time.Max - Config.Cooldown_Time.Min) + Config.Cooldown_Time.Min; - attackCooldown = SecondsToAttackCooldownTicks(randomSeconds); - } - - attackCooldownCounter = attackCooldown; - if (entitiesToAttack.Count > 0) - { - if (Config.Mode == Configs.AttackMode.single) - { - int priorityEntity = 0; - if (Config.Priority == Configs.PriorityType.distance) // closest distance priority - { - double distance = 5; - foreach (var entity in entitiesToAttack) - { - var tmp = GetCurrentLocation().Distance(entity.Value.Location); - if (tmp < distance) - { - priorityEntity = entity.Key; - distance = tmp; - } - } - } - else // low health priority - { - float entityHealth = int.MaxValue; - foreach (var entity in entitiesToAttack) - { - if (entity.Value.Health < entityHealth) - { - priorityEntity = entity.Key; - entityHealth = entity.Value.Health; - } - } - } - - if (entitiesToAttack.ContainsKey(priorityEntity)) - { - // check entity distance and health again - if (ShouldAttackEntity(entitiesToAttack[priorityEntity])) - { - InteractEntity(priorityEntity, Config.Interaction); // hit the entity! - SendAnimation(Inventory.Hand.MainHand); // Arm animation - } - - - } - } - else - { - foreach (KeyValuePair entity in entitiesToAttack) - { - // check that we are in range once again. - if (ShouldAttackEntity(entity.Value)) - { - InteractEntity(entity.Key, Config.Interaction); // hit the entity! - } - - } - SendAnimation(Inventory.Hand.MainHand); // Arm animation - } - } - } - else - { - attackCooldownCounter--; - } - } - - public override void OnEntitySpawn(Entity entity) - { - ShouldAttackEntity(entity); - } - - public override void OnEntityDespawn(Entity entity) - { - if (entitiesToAttack.ContainsKey(entity.ID)) - { - entitiesToAttack.Remove(entity.ID); - } - } - - public override void OnEntityHealth(Entity entity, float health) - { - if (!IsAllowedToAttack(entity)) - return; - - if (entitiesToAttack.ContainsKey(entity.ID)) - { - entitiesToAttack[entity.ID].Health = health; - - if (entitiesToAttack[entity.ID].Health <= 0) - { - entitiesToAttack.Remove(entity.ID); - } - } - } - - private bool IsAllowedToAttack(Entity entity) - { - bool result = false; - - if (attackHostile && entity.Type.IsHostile()) - result = true; - - if (attackPassive && entity.Type.IsPassive()) - result = true; - - if (Config.Entites_List.Count > 0) - { - bool inList = Config.Entites_List.Contains(entity.Type); - if (Config.List_Mode == Configs.ListType.blacklist) - result = !inList && result; - else - result = inList; - } - - return result; - } - - public override void OnEntityMove(Entity entity) - { - ShouldAttackEntity(entity); - } - - public override void OnHealthUpdate(float health, int food) - { - this.health = health; - } - - public override void OnPlayerProperty(Dictionary prop) - { - if (overrideAttackSpeed) - return; - foreach (var attackSpeedKey in new[] { "generic.attackSpeed", "minecraft:generic.attack_speed" }) - { - // adjust auto attack cooldown for maximum attack damage - if (prop.ContainsKey(attackSpeedKey)) - { - if (attackSpeed != prop[attackSpeedKey]) - { - serverTPS = GetServerTPS(); - attackSpeed = prop[attackSpeedKey]; - attackCooldownSeconds = 1 / attackSpeed * (serverTPS / 20.0); // server tps will affect the cooldown - attackCooldown = SecondsToAttackCooldownTicks(attackCooldownSeconds); - } - } - } - } - - public override void OnServerTpsUpdate(double tps) - { - if (overrideAttackSpeed) - return; - - serverTPS = tps; - // re-calculate attack speed - attackCooldownSeconds = 1 / attackSpeed * (serverTPS / 20.0); // server tps will affect the cooldown - attackCooldown = SecondsToAttackCooldownTicks(attackCooldownSeconds); - } - - private static int SecondsToAttackCooldownTicks(double seconds) - { - seconds = Math.Min(int.MaxValue / (double)Settings.ClientTicksPerSecond, seconds); - return Math.Max(1, (int)Math.Truncate(seconds * Settings.ClientTicksPerSecond) + 1); - } - - /// - /// Checks to see if the entity should be attacked. If it should be attacked, it will add the entity - /// To a list of entities to attack every few ticks. - /// - /// The entity to handle - /// If the entity should be attacked - public bool ShouldAttackEntity(Entity entity) - { - if (!IsAllowedToAttack(entity) || entity.Health <= 0) - return false; - - bool isBeingAttacked = entitiesToAttack.ContainsKey(entity.ID); - if (GetCurrentLocation().Distance(entity.Location) <= attackRange) - { - // check to see if entity has not been marked as tracked, and if not, track it. - if (!isBeingAttacked) - { - entitiesToAttack.Add(entity.ID, entity); - } - - return true; - } - else - { - // remove marker on entity to attack it, as it is now out of range - if (isBeingAttacked) - { - entitiesToAttack.Remove(entity.ID); - } - - return false; - } - } - } -} diff --git a/MinecraftClient/ChatBots/AutoCraft.cs b/MinecraftClient/ChatBots/AutoCraft.cs deleted file mode 100644 index e0156941df..0000000000 --- a/MinecraftClient/ChatBots/AutoCraft.cs +++ /dev/null @@ -1,722 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.CommandHandler.Patch; -using MinecraftClient.Inventory; -using MinecraftClient.Mapping; -using MinecraftClient.Scripting; -using Tomlet.Attributes; -using static MinecraftClient.ChatBots.AutoCraft.Configs; - -namespace MinecraftClient.ChatBots -{ - public class AutoCraft : ChatBot - { - public const string CommandName = "autocraft"; - - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] - private const string BotName = "AutoCraft"; - - public bool Enabled = false; - - [TomlInlineComment("$ChatBot.AutoCraft.CraftingTable$")] - public LocationConfig CraftingTable = new(123, 65, 456); - - [TomlInlineComment("$ChatBot.AutoCraft.OnFailure$")] - public OnFailConfig OnFailure = OnFailConfig.abort; - - [TomlPrecedingComment("$ChatBot.AutoCraft.Recipes$")] - public RecipeConfig[] Recipes = new RecipeConfig[] - { - new RecipeConfig( - Name: "Recipe-Name-1", - Type: CraftTypeConfig.player, - Result: ItemType.StoneBricks, - Slots: new ItemType[4] { ItemType.Stone, ItemType.Stone, ItemType.Stone, ItemType.Stone } - ), - new RecipeConfig( - Name: "Recipe-Name-2", - Type: CraftTypeConfig.table, - Result: ItemType.StoneBricks, - Slots: new ItemType[9] { - ItemType.Stone, ItemType.Stone, ItemType.Null, - ItemType.Stone, ItemType.Stone, ItemType.Null, - ItemType.Null, ItemType.Null, ItemType.Null, - } - ), - }; - - [NonSerialized] - public Location _Table_Location = Location.Zero; - - public void OnSettingUpdate() - { - _Table_Location = new Location(CraftingTable.X, CraftingTable.Y, CraftingTable.Z).ToFloor(); - - List nameList = new(); - foreach (RecipeConfig recipe in Recipes) - { - if (string.IsNullOrWhiteSpace(recipe.Name)) - { - recipe.Name = new Random().NextInt64().ToString(); - LogToConsole(BotName, Translations.bot_autoCraft_exception_name_miss); - } - if (nameList.Contains(recipe.Name)) - { - LogToConsole(BotName, string.Format(Translations.bot_autoCraft_exception_duplicate, recipe.Name)); - do - { - recipe.Name = new Random().NextInt64().ToString(); - } while (nameList.Contains(recipe.Name)); - } - nameList.Add(recipe.Name); - - int fixLength = -1; - if (recipe.Type == CraftTypeConfig.player && recipe.Slots.Length != 4) - fixLength = 4; - else if (recipe.Type == CraftTypeConfig.table && recipe.Slots.Length != 9) - fixLength = 9; - - if (fixLength > 0) - { - ItemType[] Slots = new ItemType[fixLength]; - for (int i = 0; i < fixLength; ++i) - Slots[i] = (i < recipe.Slots.Length) ? recipe.Slots[i] : ItemType.Null; - recipe.Slots = Slots; - LogToConsole(BotName, Translations.bot_autocraft_invaild_slots); - } - - if (recipe.Result == ItemType.Air || recipe.Result == ItemType.Null) - { - LogToConsole(BotName, Translations.bot_autocraft_invaild_result); - } - } - } - - public struct LocationConfig - { - public double X, Y, Z; - - public LocationConfig() - { - X = 0; - Y = 0; - Z = 0; - } - - public LocationConfig(double X, double Y, double Z) - { - this.X = X; - this.Y = Y; - this.Z = Z; - } - } - - public enum OnFailConfig { abort, wait } - - public record RecipeConfig - { - public string Name = "Recipe Name"; - - public CraftTypeConfig Type = CraftTypeConfig.player; - - public ItemType Result = ItemType.Air; - - public ItemType[] Slots = new ItemType[9] { - ItemType.Null, ItemType.Null, ItemType.Null, - ItemType.Null, ItemType.Null, ItemType.Null, - ItemType.Null, ItemType.Null, ItemType.Null, - }; - - public RecipeConfig() { } - - public RecipeConfig(string Name, CraftTypeConfig Type, ItemType Result, ItemType[] Slots) - { - this.Name = Name; - this.Type = Type; - this.Result = Result; - this.Slots = Slots; - } - } - - public enum CraftTypeConfig { player, table } - } - - private bool waitingForMaterials = false; - private bool waitingForUpdate = false; - private bool waitingForTable = false; - private bool craftingFailed = false; - private int inventoryInUse = -2; - private int index = 0; - private Recipe? recipeInUse; - private readonly List actionSteps = new(); - - private int updateDebounceValue = Settings.DoubleToTick(0.2); - private int updateDebounce = 0; - private readonly int updateTimeoutValue = Settings.ClientTicksPerSecond; - private int updateTimeout = 0; - private string timeoutAction = "unspecified"; - - private void ResetVar() - { - craftingFailed = false; - waitingForTable = false; - waitingForUpdate = false; - waitingForMaterials = false; - inventoryInUse = -2; - index = 0; - recipeInUse = null; - actionSteps.Clear(); - } - - private enum ActionType - { - LeftClick, - ShiftClick, - WaitForUpdate, - ResetCraftArea, - Repeat, - CheckResult - } - - /// - /// Represent a single action step of the whole crafting process - /// - private class ActionStep - { - /// - /// The action type of this action step - /// - public ActionType ActionType; - - /// - /// For storing data needed for processing - /// - /// -2 mean not used - public int Slot = -2; - - /// - /// For storing data needed for processing - /// - /// -2 mean not used - public int InventoryID = -2; - - /// - /// For storing data needed for processing - /// - public ItemType ItemType; - - public ActionStep(ActionType actionType) - { - ActionType = actionType; - } - public ActionStep(ActionType actionType, int inventoryID) - { - ActionType = actionType; - InventoryID = inventoryID; - } - public ActionStep(ActionType actionType, int inventoryID, int slot) - { - ActionType = actionType; - Slot = slot; - InventoryID = inventoryID; - } - public ActionStep(ActionType actionType, int inventoryID, ItemType itemType) - { - ActionType = actionType; - InventoryID = inventoryID; - ItemType = itemType; - } - } - - /// - /// Represent a crafting recipe - /// - private record Recipe - { - /// - /// The results item of this recipe - /// - public ItemType ResultItem; - - /// - /// Crafting table required for this recipe, playerInventory or Crafting - /// - public ContainerType CraftingAreaType; - - /// - /// Materials needed and their position - /// - /// position start with 1, from left to right, top to bottom - public Dictionary? Materials; - - public Recipe() { } - - public Recipe(Dictionary materials, ItemType resultItem, ContainerType type) - { - Materials = materials; - ResultItem = resultItem; - CraftingAreaType = type; - } - - /// - /// Convert the position of a defined recipe from playerInventory to Crafting - /// - /// - /// Converted recipe - /// so that it can be used in crafting table - public static Recipe ConvertToCraftingTable(Recipe recipe) - { - if (recipe.CraftingAreaType == ContainerType.PlayerInventory && recipe.Materials is not null) - { - if (recipe.Materials.ContainsKey(4)) - { - recipe.Materials[5] = recipe.Materials[4]; - recipe.Materials.Remove(4); - } - if (recipe.Materials.ContainsKey(3)) - { - recipe.Materials[4] = recipe.Materials[3]; - recipe.Materials.Remove(3); - } - } - return recipe; - } - } - - public override void Initialize() - { - if (!GetInventoryEnabled()) - { - LogToConsole(Translations.extra_inventory_required); - LogToConsole(Translations.general_bot_unload); - UnloadBot(); - return; - } - - McClient.dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CommandName) - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - .Then(l => l.Literal("list") - .Executes(r => OnCommandHelp(r.Source, "list"))) - .Then(l => l.Literal("start") - .Executes(r => OnCommandHelp(r.Source, "start"))) - .Then(l => l.Literal("stop") - .Executes(r => OnCommandHelp(r.Source, "stop"))) - .Then(l => l.Literal("help") - .Executes(r => OnCommandHelp(r.Source, "help"))) - ) - ); - - McClient.dispatcher.Register(l => l.Literal(CommandName) - .Then(l => l.Literal("list") - .Executes(r => OnCommandList(r.Source))) - .Then(l => l.Literal("start") - .Then(l => l.Argument("RecipeName", MccArguments.AutoCraftRecipeName()) - .Executes(r => OnCommandStart(r.Source, Arguments.GetString(r, "RecipeName"))))) - .Then(l => l.Literal("stop") - .Executes(r => OnCommandStop(r.Source))) - .Then(l => l.Literal("_help") - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - .Redirect(McClient.dispatcher.GetRoot().GetChild("help").GetChild(CommandName))) - ); - } - - public override void OnUnload() - { - McClient.dispatcher.Unregister(CommandName); - McClient.dispatcher.GetRoot().GetChild("help").RemoveChild(CommandName); - } - - private int OnCommandHelp(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - "list" => Translations.bot_autoCraft_help_list, - "start" => Translations.bot_autoCraft_help_start, - "stop" => Translations.bot_autoCraft_help_stop, - "help" => Translations.bot_autoCraft_help_help, - _ => string.Format(Translations.bot_autoCraft_available_cmd, "load, list, reload, resetcfg, start, stop, help") - + '\n' + McClient.dispatcher.GetAllUsageString(CommandName, false), -#pragma warning restore format // @formatter:on - }); - } - - private int OnCommandList(CmdResult r) - { - StringBuilder nameList = new(); - foreach (RecipeConfig recipe in Config.Recipes) - nameList.Append(recipe.Name).Append(", "); - return r.SetAndReturn(CmdResult.Status.Done, string.Format(Translations.bot_autoCraft_cmd_list, Config.Recipes.Length, nameList.ToString())); - } - - private int OnCommandStart(CmdResult r, string name) - { - bool hasRecipe = false; - RecipeConfig? recipe = null; - foreach (RecipeConfig recipeConfig in Config.Recipes) - { - if (recipeConfig.Name == name) - { - hasRecipe = true; - recipe = recipeConfig; - break; - } - } - - if (hasRecipe) - { - ResetVar(); - PrepareCrafting(recipe!); - return r.SetAndReturn(CmdResult.Status.Done); - } - else - { - return r.SetAndReturn(CmdResult.Status.Fail, Translations.bot_autoCraft_recipe_not_exist); - } - } - - private int OnCommandStop(CmdResult r) - { - StopCrafting(); - return r.SetAndReturn(CmdResult.Status.Done, Translations.bot_autoCraft_stop); - } - - #region Core part of auto-crafting - - public override void OnInventoryUpdate(int inventoryId) - { - if ((waitingForUpdate && inventoryInUse == inventoryId) || (waitingForMaterials && inventoryInUse == inventoryId)) - { - // Because server might send us a LOT of update at once, even there is only a single slot updated. - // Using this to make sure we don't do things before inventory update finish - updateDebounce = updateDebounceValue; - } - } - - public override void OnInventoryOpen(int inventoryId) - { - if (waitingForTable) - { - if (GetInventories()[inventoryId].Type == ContainerType.Crafting) - { - waitingForTable = false; - ClearTimeout(); - // After table opened, we need to wait for server to update table inventory items - waitingForUpdate = true; - inventoryInUse = inventoryId; - PrepareCrafting(recipeInUse!); - } - } - } - - public override void Update() - { - if (updateDebounce > 0) - { - updateDebounce--; - if (updateDebounce <= 0) - InventoryUpdateFinished(); - } - if (updateTimeout > 0) - { - updateTimeout--; - if (updateTimeout <= 0) - HandleUpdateTimeout(); - } - } - - private void InventoryUpdateFinished() - { - if (waitingForUpdate || waitingForMaterials) - { - if (waitingForUpdate) - waitingForUpdate = false; - if (waitingForMaterials) - { - waitingForMaterials = false; - craftingFailed = false; - } - HandleNextStep(); - } - } - - private void OpenTable(Location location) - { - SendPlaceBlock(location, Direction.Up); - } - - /// - /// Prepare the crafting action steps by the given recipe name and start crafting - /// - /// Name of the recipe to craft - private void PrepareCrafting(RecipeConfig recipeConfig) - { - Dictionary materials = new(); - for (int i = 0; i < recipeConfig.Slots.Length; ++i) - if (recipeConfig.Slots[i] != ItemType.Null) - materials[i + 1] = recipeConfig.Slots[i]; - - ItemType ResultItem = recipeConfig.Result; - - ContainerType CraftingAreaType = - (recipeConfig.Type == CraftTypeConfig.player) ? ContainerType.PlayerInventory : ContainerType.Crafting; - - PrepareCrafting(new Recipe(materials, ResultItem, CraftingAreaType)); - } - - /// - /// Prepare the crafting action steps by the given recipe and start crafting - /// - /// Recipe to craft - private void PrepareCrafting(Recipe recipe) - { - recipeInUse = recipe; - if (recipeInUse.CraftingAreaType == ContainerType.PlayerInventory) - inventoryInUse = 0; - else - { - var inventories = GetInventories(); - foreach (var inventory in inventories) - if (inventory.Value.Type == ContainerType.Crafting) - inventoryInUse = inventory.Key; - if (inventoryInUse == -2) - { - // table required but not found. Try to open one - OpenTable(Config._Table_Location); - waitingForTable = true; - SetTimeout(Translations.bot_autoCraft_table_not_found); - return; - } - } - - if (recipe.Materials is not null) - { - foreach (KeyValuePair slot in recipe.Materials) - { - // Steps for moving items from inventory to crafting area - actionSteps.Add(new ActionStep(ActionType.LeftClick, inventoryInUse, slot.Value)); - actionSteps.Add(new ActionStep(ActionType.LeftClick, inventoryInUse, slot.Key)); - } - } - if (actionSteps.Count > 0) - { - // Wait for server to send us the crafting result - actionSteps.Add(new ActionStep(ActionType.WaitForUpdate, inventoryInUse, 0)); - // Check the crafting result is the item we want - actionSteps.Add(new ActionStep(ActionType.CheckResult, inventoryInUse, recipe.ResultItem)); - // Put item back to inventory. (Using shift-click can take all item at once) - actionSteps.Add(new ActionStep(ActionType.ShiftClick, inventoryInUse, 0)); - // We need to wait for server to update us after taking item from crafting result - actionSteps.Add(new ActionStep(ActionType.WaitForUpdate, inventoryInUse)); - // Repeat the whole process again - actionSteps.Add(new ActionStep(ActionType.Repeat)); - // Start crafting - LogToConsole(string.Format(Translations.bot_autoCraft_start, recipe.ResultItem)); - HandleNextStep(); - } - else LogToConsole(string.Format(Translations.bot_autoCraft_start_fail, recipe.ResultItem)); - } - - /// - /// Stop the crafting process by clearing crafting action steps and close the inventory - /// - private void StopCrafting() - { - actionSteps.Clear(); - // Put item back to inventory or they will be dropped - ClearCraftingArea(inventoryInUse); - // Closing inventory can make server to update our inventory - // Useful when - // - There are some items left in the crafting area - // - Resynchronize player inventory if using crafting table - if (GetInventories().ContainsKey(inventoryInUse)) - { - CloseInventory(inventoryInUse); - LogToConsole(string.Format(Translations.bot_autoCraft_close_inventory, inventoryInUse)); - } - } - - /// - /// Handle next crafting action step - /// - private void HandleNextStep() - { - while (actionSteps.Count > 0) - { - if (waitingForUpdate || waitingForMaterials || craftingFailed) break; - ActionStep step = actionSteps[index]; - index++; - switch (step.ActionType) - { - case ActionType.LeftClick: - if (step.Slot != -2) - { - WindowAction(step.InventoryID, step.Slot, WindowActionType.LeftClick); - } - else - { - int[] slots = GetInventories()[step.InventoryID].SearchItem(step.ItemType); - if (slots.Length > 0) - { - int ignoredSlot; - if (recipeInUse!.CraftingAreaType == ContainerType.PlayerInventory) - ignoredSlot = 9; - else - ignoredSlot = 10; - slots = slots.Where(slot => slot >= ignoredSlot).ToArray(); - if (slots.Length > 0) - WindowAction(step.InventoryID, slots[0], WindowActionType.LeftClick); - else - craftingFailed = true; - } - else craftingFailed = true; - } - break; - - case ActionType.ShiftClick: - if (step.Slot == 0) - { - WindowAction(step.InventoryID, step.Slot, WindowActionType.ShiftClick); - } - else craftingFailed = true; - break; - - // Compare the crafting result with the recipe result - case ActionType.CheckResult: - if (GetInventories()[step.InventoryID].Items.ContainsKey(0) - && GetInventories()[step.InventoryID].Items[0].Type == step.ItemType) - { - // OK - break; - } - else - { - // Bad, reset everything - ClearCraftingArea(step.InventoryID); - index = 0; - } - break; - - case ActionType.WaitForUpdate: - if (step.InventoryID != -2) - { - waitingForUpdate = true; - } - else craftingFailed = true; - break; - - case ActionType.ResetCraftArea: - if (step.InventoryID != -2) - ClearCraftingArea(step.InventoryID); - else - craftingFailed = true; - break; - - case ActionType.Repeat: - index = 0; - break; - } - HandleError(); - } - } - - /// - /// Handle any crafting error after a step was processed - /// - private void HandleError() - { - if (craftingFailed) - { - if (actionSteps[index - 1].ActionType == ActionType.LeftClick && actionSteps[index - 1].ItemType != ItemType.Air) - { - // Inform user the missing meterial name - LogToConsole(string.Format(Translations.bot_autoCraft_missing_material, actionSteps[index - 1].ItemType.ToString())); - } - if (Config.OnFailure == OnFailConfig.abort) - { - StopCrafting(); - LogToConsole(Translations.bot_autoCraft_aborted); - } - else - { - waitingForMaterials = true; - // Even though crafting failed, action step index will still increase - // we want to do that failed step again so decrease index by 1 - index--; - LogToConsole(Translations.bot_autoCraft_craft_fail); - } - } - } - - /// - /// Put any item left in the crafting area back to inventory - /// - /// Inventory ID to operate with - private void ClearCraftingArea(int inventoryId) - { - if (GetInventories().ContainsKey(inventoryId)) - { - var inventory = GetInventories()[inventoryId]; - int areaStart = 1; - int areaEnd = 4; - if (inventory.Type == ContainerType.Crafting) - { - areaEnd = 9; - } - List emptySlots = inventory.GetEmpytSlots().Where(s => s > 9).ToList(); - for (int i = areaStart; i <= areaEnd; i++) - { - if (inventory.Items.ContainsKey(i)) - { - if (emptySlots.Count != 0) - { - WindowAction(inventoryId, i, WindowActionType.LeftClick); - WindowAction(inventoryId, emptySlots[0], WindowActionType.LeftClick); - emptySlots.RemoveAt(0); - } - else - { - WindowAction(inventoryId, i, WindowActionType.DropItemStack); - } - } - } - } - } - - private void HandleUpdateTimeout() - { - LogToConsole(string.Format(Translations.bot_autoCraft_timeout, timeoutAction)); - } - - /// - /// Set the timeout. Used to detect the failure of open crafting table - /// - /// The reason to display if timeout - private void SetTimeout(string reason = "unspecified") - { - updateTimeout = updateTimeoutValue; - timeoutAction = reason; - } - - /// - /// Clear the timeout - /// - private void ClearTimeout() - { - updateTimeout = 0; - } - - #endregion - } -} diff --git a/MinecraftClient/ChatBots/AutoDig.cs b/MinecraftClient/ChatBots/AutoDig.cs deleted file mode 100644 index 04f3f6da94..0000000000 --- a/MinecraftClient/ChatBots/AutoDig.cs +++ /dev/null @@ -1,576 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.CommandHandler.Patch; -using MinecraftClient.Inventory; -using MinecraftClient.Mapping; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; -using MinecraftClient.Scripting; -using Tomlet.Attributes; - -namespace MinecraftClient.ChatBots -{ - public class AutoDig : ChatBot - { - public const string CommandName = "autodig"; - - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] - private const string BotName = "AutoDig"; - - public bool Enabled = false; - - [TomlInlineComment("$ChatBot.AutoDig.Auto_Tool_Switch$")] - public bool Auto_Tool_Switch = false; - - [TomlInlineComment("$ChatBot.AutoDig.Apply_Efficiency_Enchantments$")] - public bool Apply_Efficiency_Enchantments = true; - - [TomlInlineComment("$ChatBot.AutoDig.Apply_Haste_Effects$")] - public bool Apply_Haste_Effects = true; - - [TomlInlineComment("$ChatBot.AutoDig.Durability_Limit$")] - public int Durability_Limit = 2; - - [TomlInlineComment("$ChatBot.AutoDig.Drop_Low_Durability_Tools$")] - public bool Drop_Low_Durability_Tools = false; - - [TomlInlineComment("$ChatBot.AutoDig.Mode$")] - public ModeType Mode = ModeType.lookat; - - [TomlPrecedingComment("$ChatBot.AutoDig.Locations$")] - public Coordination[] Locations = new Coordination[] { new(123.5, 64, 234.5), new(124.5, 63, 235.5) }; - - [TomlInlineComment("$ChatBot.AutoDig.Location_Order$")] - public OrderType Location_Order = OrderType.distance; - - [TomlInlineComment("$ChatBot.AutoDig.Auto_Start_Delay$")] - public double Auto_Start_Delay = 3.0; - - [TomlInlineComment("$ChatBot.AutoDig.Dig_Timeout$")] - public double Dig_Timeout = 60.0; - - [TomlInlineComment("$ChatBot.AutoDig.Log_Block_Dig$")] - public bool Log_Block_Dig = true; - - [TomlInlineComment("$ChatBot.AutoDig.List_Type$")] - public ListType List_Type = ListType.whitelist; - - public List Blocks = new() { Material.Cobblestone, Material.Stone }; - - [NonSerialized] - public Location[] _Locations = Array.Empty(); - - public void OnSettingUpdate() - { - Durability_Limit = Math.Max(0, Durability_Limit); - - if (Auto_Start_Delay >= 0) - Auto_Start_Delay = Math.Max(0.1, Auto_Start_Delay); - - if (Dig_Timeout >= 0) - Dig_Timeout = Math.Max(0.1, Dig_Timeout); - - _Locations = new Location[Locations.Length]; - for (int i = 0; i < Locations.Length; ++i) - _Locations[i] = new(Locations[i].x, Locations[i].y, Locations[i].z); - } - - public enum ModeType { lookat, fixedpos, both }; - - public enum ListType { blacklist, whitelist }; - - public enum OrderType { distance, index }; - - public struct Coordination - { - public double x, y, z; - - public Coordination() - { - x = 0; - y = 0; - z = 0; - } - - public Coordination(double x, double y, double z) - { - this.x = x; this.y = y; this.z = z; - } - } - } - - private bool inventoryEnabled; - - private int counter = 0; - private readonly Lock stateLock = new(); - private State state = State.WaitJoinGame; - - bool AlreadyWaitting = false; - private Location currentDig = Location.Zero; - - private enum State - { - WaitJoinGame, - WaitingStart, - Digging, - Stopping, - } - - public override void Initialize() - { - if (!GetTerrainEnabled()) - { - LogToConsole(Translations.extra_terrainandmovement_required); - LogToConsole(Translations.general_bot_unload); - UnloadBot(); - return; - } - - inventoryEnabled = GetInventoryEnabled(); - if (!inventoryEnabled && Config.Auto_Tool_Switch) - LogToConsole(Translations.bot_autodig_no_inv_handle); - - McClient.dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CommandName) - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - .Then(l => l.Literal("start") - .Executes(r => OnCommandHelp(r.Source, "start"))) - .Then(l => l.Literal("stop") - .Executes(r => OnCommandHelp(r.Source, "stop"))) - .Then(l => l.Literal("help") - .Executes(r => OnCommandHelp(r.Source, "help"))) - ) - ); - - var cmd = McClient.dispatcher.Register(l => l.Literal(CommandName) - .Then(l => l.Literal("start") - .Executes(r => OnCommandStart(r.Source))) - .Then(l => l.Literal("stop") - .Executes(r => OnCommandStop(r.Source))) - .Then(l => l.Literal("_help") - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - .Redirect(McClient.dispatcher.GetRoot().GetChild("help").GetChild(CommandName))) - ); - - McClient.dispatcher.Register(l => l.Literal("digbot") - .Redirect(cmd) - ); - } - - public override void OnUnload() - { - McClient.dispatcher.Unregister("digbot"); - McClient.dispatcher.Unregister(CommandName); - McClient.dispatcher.GetRoot().GetChild("help").RemoveChild(CommandName); - } - - private int OnCommandHelp(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - "start" => Translations.bot_autodig_help_start, - "stop" => Translations.bot_autodig_help_stop, - "help" => Translations.bot_autodig_help_help, - _ => string.Format(Translations.bot_autodig_available_cmd, "start, stop, help") - + '\n' + McClient.dispatcher.GetAllUsageString(CommandName, false), -#pragma warning restore format // @formatter:on - }); - } - - private int OnCommandStart(CmdResult r) - { - lock (stateLock) - { - counter = 0; - state = State.WaitingStart; - } - return r.SetAndReturn(CmdResult.Status.Done, Translations.bot_autodig_start); - } - - private int OnCommandStop(CmdResult r) - { - StopDigging(); - return r.SetAndReturn(CmdResult.Status.Done, Translations.bot_autodig_stop); - } - - private void StartDigging() - { - if (Config.Auto_Start_Delay > 0) - { - double delay = Config.Auto_Start_Delay; - LogToConsole(string.Format(Translations.bot_autodig_start_delay, delay)); - lock (stateLock) - { - counter = Settings.DoubleToTick(delay); - state = State.WaitingStart; - } - } - else - { - lock (stateLock) - { - state = State.WaitJoinGame; - } - } - } - - private void StopDigging() - { - state = State.Stopping; - lock (stateLock) - { - state = State.Stopping; - } - } - - private static int GetLegacyMaxDamage(ItemType itemType) - { - return itemType switch - { - ItemType.WoodenPickaxe or ItemType.WoodenAxe or ItemType.WoodenShovel or ItemType.WoodenSword or ItemType.WoodenHoe => 59, - ItemType.StonePickaxe or ItemType.StoneAxe or ItemType.StoneShovel or ItemType.StoneSword or ItemType.StoneHoe => 131, - ItemType.IronPickaxe or ItemType.IronAxe or ItemType.IronShovel or ItemType.IronSword or ItemType.IronHoe => 250, - ItemType.GoldenPickaxe or ItemType.GoldenAxe or ItemType.GoldenShovel or ItemType.GoldenSword or ItemType.GoldenHoe => 32, - ItemType.DiamondPickaxe or ItemType.DiamondAxe or ItemType.DiamondShovel or ItemType.DiamondSword or ItemType.DiamondHoe => 1561, - ItemType.NetheritePickaxe or ItemType.NetheriteAxe or ItemType.NetheriteShovel or ItemType.NetheriteSword or ItemType.NetheriteHoe => 2031, - ItemType.Shears => 238, - _ => 0 - }; - } - - private static int GetMaxDamage(Item item) - { - if (item.Components is not null) - { - var maxDamageComponent = item.Components.OfType().FirstOrDefault(); - if (maxDamageComponent is not null) - return maxDamageComponent.MaxDamage; - } - - return GetLegacyMaxDamage(item.Type); - } - - private static int GetRemainingDurability(Item item) - { - int maxDamage = GetMaxDamage(item); - return maxDamage > 0 ? maxDamage - item.Damage : int.MaxValue; - } - - private bool HasEnoughDurability(Item item) - { - return Config.Durability_Limit <= 0 || GetRemainingDurability(item) >= Config.Durability_Limit; - } - - private bool IsBelowDurabilityLimit(Item? item) - { - return item is not null && Config.Durability_Limit > 0 && GetRemainingDurability(item) < Config.Durability_Limit; - } - - private static bool IsRecommendedTool(Item? item, ItemType[] recommendedTools) - { - return item is not null && recommendedTools.Contains(item.Type); - } - - private bool SwapToolIntoHand(int sourceSlot, int handSlot) - { - return WindowAction(0, sourceSlot, WindowActionType.LeftClick) - && WindowAction(0, handSlot, WindowActionType.LeftClick) - && WindowAction(0, sourceSlot, WindowActionType.LeftClick); - } - - private bool EnsureSuitableTool(Material blockType) - { - if (!inventoryEnabled || !Config.Auto_Tool_Switch) - return true; - - ItemType[] recommendedTools = Material2Tool.GetCorrectToolForBlock(blockType); - if (recommendedTools.Length == 0) - return true; - - Container container = GetPlayerInventory(); - int handSlot = 36 + GetCurrentSlot(); - container.Items.TryGetValue(handSlot, out Item? currentTool); - - if (currentTool is not null && IsRecommendedTool(currentTool, recommendedTools) && HasEnoughDurability(currentTool)) - return true; - - foreach (ItemType recommendedTool in recommendedTools) - { - foreach ((int slot, Item item) in container.Items) - { - if (slot == handSlot || item.Type != recommendedTool || !HasEnoughDurability(item)) - continue; - - if (!SwapToolIntoHand(slot, handSlot)) - return false; - - LogToConsole(GetTimestamp() + ": " + string.Format(Translations.bot_autodig_switch, item.GetTypeString(), slot)); - - if (Config.Drop_Low_Durability_Tools && IsBelowDurabilityLimit(currentTool) && - WindowAction(0, slot, WindowActionType.DropItemStack)) - { - LogToConsole(GetTimestamp() + ": " + string.Format(Translations.bot_autodig_drop_low_durability, currentTool!.GetTypeString(), slot)); - } - - return true; - } - } - - return !IsBelowDurabilityLimit(currentTool); - } - - private static MiningCalculator.MiningOptions GetMiningOptions() - { - return new MiningCalculator.MiningOptions - { - ApplyEfficiencyEnchantments = Config.Apply_Efficiency_Enchantments, - ApplyHasteEffects = Config.Apply_Haste_Effects - }; - } - - public override void Update() - { - lock (stateLock) - { - switch (state) - { - case State.WaitJoinGame: - break; - case State.WaitingStart: - if (--counter < 0) - { - if (DoDigging()) - { - AlreadyWaitting = false; - state = State.Digging; - } - else - { - counter = 0; - state = State.WaitingStart; - } - } - break; - case State.Digging: - if (++counter > Settings.DoubleToTick(Config.Dig_Timeout)) - { - LogToConsole(GetTimestamp() + ": " + Translations.bot_autodig_dig_timeout); - state = State.WaitingStart; - counter = 0; - } - break; - case State.Stopping: - break; - } - } - } - - private bool DoDigging() - { - if (Config.Mode == Configs.ModeType.lookat || Config.Mode == Configs.ModeType.both) - { - (bool hasBlock, Location blockLoc, Block block) = GetLookingBlock(4.5, false); - if (!hasBlock) - { - if (!AlreadyWaitting) - { - AlreadyWaitting = true; - if (Config.Log_Block_Dig) - LogToConsole(Translations.cmd_dig_too_far); - } - return false; - } - else if (block.Type == Material.Air) - { - if (!AlreadyWaitting) - { - AlreadyWaitting = true; - if (Config.Log_Block_Dig) - LogToConsole(Translations.cmd_dig_no_block); - } - return false; - } - else if ((Config.List_Type == Configs.ListType.whitelist && Config.Blocks.Contains(block.Type)) || - (Config.List_Type == Configs.ListType.blacklist && !Config.Blocks.Contains(block.Type))) - { - if (Config.Mode == Configs.ModeType.lookat || - (Config.Mode == Configs.ModeType.both && Config._Locations.Contains(blockLoc))) - { - if (!EnsureSuitableTool(block.Type)) - return false; - - if (DigBlock(blockLoc, Direction.Down, lookAtBlock: false, miningOptions: GetMiningOptions())) - { - currentDig = blockLoc; - if (Config.Log_Block_Dig) - LogToConsole(string.Format(Translations.cmd_dig_dig, blockLoc.X, blockLoc.Y, blockLoc.Z, block.GetTypeString())); - return true; - } - else - { - LogToConsole(Translations.cmd_dig_fail); - return false; - } - } - else - { - if (!AlreadyWaitting) - { - AlreadyWaitting = true; - if (Config.Log_Block_Dig) - LogToConsole(Translations.bot_autodig_not_allow); - } - return false; - } - } - else - { - if (!AlreadyWaitting) - { - AlreadyWaitting = true; - if (Config.Log_Block_Dig) - LogToConsole(Translations.bot_autodig_not_allow); - } - return false; - } - } - else if (Config.Mode == Configs.ModeType.fixedpos && Config.Location_Order == Configs.OrderType.distance) - { - Location current = GetCurrentLocation(); - - double minDistance = double.MaxValue; - Location target = Location.Zero; - Block targetBlock = Block.Air; - foreach (Location location in Config._Locations) - { - Block block = GetWorld().GetBlock(location); - if (block.Type != Material.Air && - ((Config.List_Type == Configs.ListType.whitelist && Config.Blocks.Contains(block.Type)) || - (Config.List_Type == Configs.ListType.blacklist && !Config.Blocks.Contains(block.Type)))) - { - double distance = current.Distance(location); - if (distance < minDistance) - { - minDistance = distance; - target = location; - targetBlock = block; - } - } - } - - if (minDistance <= 6.0) - { - if (!EnsureSuitableTool(targetBlock.Type)) - return false; - - if (DigBlock(target, Direction.Down, lookAtBlock: true, miningOptions: GetMiningOptions())) - { - currentDig = target; - if (Config.Log_Block_Dig) - LogToConsole(string.Format(Translations.cmd_dig_dig, target.X, target.Y, target.Z, targetBlock.GetTypeString())); - return true; - } - else - { - LogToConsole(Translations.cmd_dig_fail); - return false; - } - } - else - { - if (!AlreadyWaitting) - { - AlreadyWaitting = true; - if (Config.Log_Block_Dig) - LogToConsole(Translations.cmd_dig_no_block); - } - return false; - } - } - else if (Config.Mode == Configs.ModeType.fixedpos && Config.Location_Order == Configs.OrderType.index) - { - for (int i = 0; i < Config._Locations.Length; ++i) - { - Location blockLoc = Config._Locations[i]; - Block block = GetWorld().GetBlock(blockLoc); - if (block.Type != Material.Air && - ((Config.List_Type == Configs.ListType.whitelist && Config.Blocks.Contains(block.Type)) || - (Config.List_Type == Configs.ListType.blacklist && !Config.Blocks.Contains(block.Type)))) - { - if (!EnsureSuitableTool(block.Type)) - return false; - - if (DigBlock(blockLoc, Direction.Down, lookAtBlock: true, miningOptions: GetMiningOptions())) - { - currentDig = blockLoc; - if (Config.Log_Block_Dig) - LogToConsole(string.Format(Translations.cmd_dig_dig, blockLoc.X, blockLoc.Y, blockLoc.Z, block.GetTypeString())); - return true; - } - else - { - LogToConsole(Translations.cmd_dig_fail); - return false; - } - } - } - - if (!AlreadyWaitting) - { - AlreadyWaitting = true; - if (Config.Log_Block_Dig) - LogToConsole(Translations.cmd_dig_no_block); - } - return false; - } - return false; - } - - public override void OnBlockChange(Location location, Block block) - { - if (location == currentDig) - { - lock (stateLock) - { - if (state == State.Digging && location == currentDig) - { - currentDig = Location.Zero; - counter = 0; - state = State.WaitingStart; - } - } - } - } - - public override void AfterGameJoined() - { - StartDigging(); - } - - public override void OnRespawn() - { - StartDigging(); - } - - public override void OnDeath() - { - StopDigging(); - } - - public override bool OnDisconnect(DisconnectReason reason, string message) - { - StopDigging(); - - return base.OnDisconnect(reason, message); - } - } -} diff --git a/MinecraftClient/ChatBots/AutoDrop.cs b/MinecraftClient/ChatBots/AutoDrop.cs deleted file mode 100644 index 5a7c56cbb6..0000000000 --- a/MinecraftClient/ChatBots/AutoDrop.cs +++ /dev/null @@ -1,244 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.CommandHandler.Patch; -using MinecraftClient.Inventory; -using MinecraftClient.Scripting; -using Tomlet.Attributes; -using static MinecraftClient.ChatBots.AutoDrop.Configs; - -namespace MinecraftClient.ChatBots -{ - public class AutoDrop : ChatBot - { - public const string CommandName = "autodrop"; - - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] - private const string BotName = "AutoDrop"; - - public bool Enabled = false; - - [TomlInlineComment("$ChatBot.AutoDrop.Mode$")] - public DropMode Mode = DropMode.include; - - public List Items = new() { ItemType.Cobblestone, ItemType.Dirt }; - - public void OnSettingUpdate() { } - - public enum DropMode - { - include, // Items in list will be dropped - exclude, // Items in list will be kept - everything // Everything will be dropped - } - } - - private int updateDebounce = 0; - private readonly int updateDebounceValue = Settings.DoubleToTick(0.2); - private int inventoryUpdated = -1; - - public override void Initialize() - { - if (!GetInventoryEnabled()) - { - LogToConsole(Translations.extra_inventory_required); - LogToConsole(Translations.general_bot_unload); - UnloadBot(); - return; - } - - McClient.dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CommandName) - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - .Then(l => l.Literal("add") - .Executes(r => OnCommandHelp(r.Source, "add"))) - .Then(l => l.Literal("remove") - .Executes(r => OnCommandHelp(r.Source, "remove"))) - .Then(l => l.Literal("mode") - .Executes(r => OnCommandHelp(r.Source, "mode"))) - ) - ); - - McClient.dispatcher.Register(l => l.Literal(CommandName) - .Then(l => l.Literal("on") - .Executes(r => OnCommandEnable(r.Source, true))) - .Then(l => l.Literal("off") - .Executes(r => OnCommandEnable(r.Source, false))) - .Then(l => l.Literal("add") - .Then(l => l.Argument("ItemType", MccArguments.ItemType()) - .Executes(r => OnCommandAdd(r.Source, MccArguments.GetItemType(r, "ItemType"))))) - .Then(l => l.Literal("remove") - .Then(l => l.Argument("ItemType", MccArguments.ItemType()) - .Executes(r => OnCommandRemove(r.Source, MccArguments.GetItemType(r, "ItemType"))))) - .Then(l => l.Literal("list") - .Executes(r => OnCommandList(r.Source))) - .Then(l => l.Literal("mode") - .Then(l => l.Literal("include") - .Executes(r => OnCommandMode(r.Source, DropMode.include))) - .Then(l => l.Literal("exclude") - .Executes(r => OnCommandMode(r.Source, DropMode.exclude))) - .Then(l => l.Literal("everything") - .Executes(r => OnCommandMode(r.Source, DropMode.everything)))) - .Then(l => l.Literal("_help") - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - .Redirect(McClient.dispatcher.GetRoot().GetChild("help").GetChild(CommandName))) - ); - } - - public override void OnUnload() - { - McClient.dispatcher.Unregister(CommandName); - McClient.dispatcher.GetRoot().GetChild("help").RemoveChild(CommandName); - } - - private int OnCommandHelp(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - "add" => Translations.cmd_inventory_help_usage + ": add ", - "remove" => Translations.cmd_inventory_help_usage + ": remove ", - "mode" => Translations.bot_autoDrop_unknown_mode, - _ => string.Format(Translations.general_available_cmd, "on, off, add, remove, list, mode") - + '\n' + McClient.dispatcher.GetAllUsageString(CommandName, false), -#pragma warning restore format // @formatter:on - }); - } - - private int OnCommandEnable(CmdResult r, bool enable) - { - if (enable) - { - Config.Enabled = true; - inventoryUpdated = 0; - OnUpdateFinish(); - return r.SetAndReturn(CmdResult.Status.Done, Translations.bot_autoDrop_on); - } - else - { - Config.Enabled = false; - return r.SetAndReturn(CmdResult.Status.Done, Translations.bot_autoDrop_off); - } - } - - private int OnCommandAdd(CmdResult r, ItemType item) - { - Config.Items.Add(item); - return r.SetAndReturn(CmdResult.Status.Done, string.Format(Translations.bot_autoDrop_added, item.ToString())); - } - - private int OnCommandRemove(CmdResult r, ItemType item) - { - if (Config.Items.Contains(item)) - { - Config.Items.Remove(item); - return r.SetAndReturn(CmdResult.Status.Done, string.Format(Translations.bot_autoDrop_removed, item.ToString())); - } - else - { - return r.SetAndReturn(CmdResult.Status.Fail, Translations.bot_autoDrop_not_in_list); - } - } - - private int OnCommandList(CmdResult r) - { - if (Config.Items.Count > 0) - return r.SetAndReturn(CmdResult.Status.Done, string.Format(Translations.bot_autoDrop_list, Config.Items.Count, string.Join("\n", Config.Items))); - else - return r.SetAndReturn(CmdResult.Status.Fail, Translations.bot_autoDrop_no_item); - } - - private int OnCommandMode(CmdResult r, DropMode mode) - { - Config.Mode = mode; - inventoryUpdated = 0; - OnUpdateFinish(); - return r.SetAndReturn(CmdResult.Status.Done, string.Format(Translations.bot_autoDrop_switched, Config.Mode.ToString())); - } - - public override void Update() - { - if (updateDebounce > 0) - { - updateDebounce--; - if (updateDebounce <= 0) - { - OnUpdateFinish(); - } - } - } - - public override void OnInventoryUpdate(int inventoryId) - { - if (Config.Enabled) - { - updateDebounce = updateDebounceValue; - // Always interact container if available (larger ID) because they included player inventory (ID 0) - if (inventoryId >= inventoryUpdated) - inventoryUpdated = inventoryId; - } - } - - private void OnUpdateFinish() - { - if (inventoryUpdated != -1) - { - if (!GetInventories().ContainsKey(inventoryUpdated)) - { - // Inventory updated but no inventory ? - LogDebugToConsole(string.Format(Translations.bot_autoDrop_no_inventory, inventoryUpdated)); - return; - } - var inventory = GetInventories()[inventoryUpdated]; - var items = inventory.Items.ToDictionary(entry => entry.Key, entry => entry.Value); - if (Config.Mode == DropMode.include) - { - foreach (var item in items) - { - // Ingore crafting result slot - if (item.Key == 0) - continue; - if (Config.Items.Contains(item.Value.Type)) - { - // Drop it !! - WindowAction(inventoryUpdated, item.Key, WindowActionType.DropItemStack); - } - } - } - else if (Config.Mode == DropMode.exclude) - { - foreach (var item in items) - { - // Ingore crafting result slot - if (item.Key == 0) - continue; - if (!Config.Items.Contains(item.Value.Type)) - { - // Drop it !! - WindowAction(inventoryUpdated, item.Key, WindowActionType.DropItemStack); - } - } - } - else - { - foreach (var item in items) - { - // Ingore crafting result slot - if (item.Key == 0) - continue; - // Drop it !! - WindowAction(inventoryUpdated, item.Key, WindowActionType.DropItemStack); - } - } - inventoryUpdated = -1; - } - } - } -} diff --git a/MinecraftClient/ChatBots/AutoEat.cs b/MinecraftClient/ChatBots/AutoEat.cs deleted file mode 100644 index eb9eea075c..0000000000 --- a/MinecraftClient/ChatBots/AutoEat.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System; -using MinecraftClient.Inventory; -using MinecraftClient.Scripting; -using Tomlet.Attributes; - -namespace MinecraftClient.ChatBots -{ - public class AutoEat : ChatBot - { - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] - private const string BotName = "AutoEat"; - - public bool Enabled = false; - - public int Threshold = 6; - - public void OnSettingUpdate() - { - if (Threshold > 20) - Threshold = 20; - else if (Threshold < 0) - Threshold = 0; - } - } - - byte LastSlot = 0; - public static bool Eating = false; - private int DelayCounter = 0; - - public override void Update() - { - if (DelayCounter > 0) - { - DelayCounter--; - if (DelayCounter == 0) - { - Eating = FindFoodAndEat(); - if (!Eating) - ChangeSlot(LastSlot); - } - } - } - - public override void OnHealthUpdate(float health, int food) - { - if (health <= 0) return; // player dead - if (((food <= Config.Threshold) || (food < 20 && health < 20)) && !Eating) - { - Eating = FindFoodAndEat(); - if (!Eating) - ChangeSlot(LastSlot); - } - // keep eating until full - if (food < 20 && Eating) - { - // delay 300ms - DelayCounter = 3; - } - if (food >= 20 && Eating) - { - Eating = false; - ChangeSlot(LastSlot); - } - } - - /// - /// Try to find food in the hotbar and eat it - /// - /// True if found - public bool FindFoodAndEat() - { - Container inventory = GetPlayerInventory(); - bool found = false; - byte CurrentSlot = GetCurrentSlot(); - if (!Eating) - LastSlot = CurrentSlot; - if (inventory.Items.ContainsKey(CurrentSlot + 36) && inventory.Items[CurrentSlot + 36].Type.IsFood()) - { - // no need to change slot - found = true; - } - else - { - for (int i = 36; i <= 44; i++) - { - if (!inventory.Items.ContainsKey(i)) continue; - if (inventory.Items[i].Type.IsFood()) - { - int slot = i - 36; - ChangeSlot((short)slot); - found = true; - break; - } - } - } - if (found) UseItemInHand(); - return found; - } - } -} diff --git a/MinecraftClient/ChatBots/AutoFishing.cs b/MinecraftClient/ChatBots/AutoFishing.cs deleted file mode 100644 index cf38156181..0000000000 --- a/MinecraftClient/ChatBots/AutoFishing.cs +++ /dev/null @@ -1,767 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.CommandHandler.Patch; -using MinecraftClient.Inventory; -using MinecraftClient.Mapping; -using MinecraftClient.Scripting; -using Tomlet.Attributes; -using static MinecraftClient.ChatBots.AutoFishing.Configs; - -namespace MinecraftClient.ChatBots -{ - /// - /// The AutoFishing bot semi-automates fishing. - /// The player needs to have a fishing rod in hand, then manually send it using the UseItem command. - /// - public class AutoFishing : ChatBot - { - public const string CommandName = "autofishing"; - - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] - private const string BotName = "AutoFishing"; - - public bool Enabled = false; - - [TomlInlineComment("$ChatBot.AutoFishing.Antidespawn$")] - public bool Antidespawn = false; - - [TomlInlineComment("$ChatBot.AutoFishing.Mainhand$")] - public bool Mainhand = true; - - [TomlInlineComment("$ChatBot.AutoFishing.Auto_Start$")] - public bool Auto_Start = true; - - [TomlInlineComment("$ChatBot.AutoFishing.Cast_Delay$")] - public double Cast_Delay = 0.4; - - [TomlInlineComment("$ChatBot.AutoFishing.Fishing_Delay$")] - public double Fishing_Delay = 3.0; - - [TomlInlineComment("$ChatBot.AutoFishing.Fishing_Timeout$")] - public double Fishing_Timeout = 300.0; - - [TomlInlineComment("$ChatBot.AutoFishing.Durability_Limit$")] - public double Durability_Limit = 2; - - [TomlInlineComment("$ChatBot.AutoFishing.Auto_Rod_Switch$")] - public bool Auto_Rod_Switch = true; - - [TomlInlineComment("$ChatBot.AutoFishing.Stationary_Threshold$")] - public double Stationary_Threshold = 0.001; - - [TomlInlineComment("$ChatBot.AutoFishing.Hook_Threshold$")] - public double Hook_Threshold = 0.2; - - [TomlInlineComment("$ChatBot.AutoFishing.Enable_Velocity_Detection$")] - public bool Enable_Velocity_Detection = true; - - [TomlInlineComment("$ChatBot.AutoFishing.Velocity_Hook_Threshold$")] - public double Velocity_Hook_Threshold = -0.2; - - [TomlInlineComment("$ChatBot.AutoFishing.Enable_Sound_Detection$")] - public bool Enable_Sound_Detection = true; - - [TomlInlineComment("$ChatBot.AutoFishing.Sound_Distance$")] - public double Sound_Distance = 5.0; - - [TomlInlineComment("$ChatBot.AutoFishing.Detection_Warmup$")] - public double Detection_Warmup = 1.0; - - [TomlInlineComment("$ChatBot.AutoFishing.Log_Fish_Bobber$")] - public bool Log_Fish_Bobber = false; - - [TomlInlineComment("$ChatBot.AutoFishing.Enable_Move$")] - public bool Enable_Move = false; - - [TomlPrecedingComment("$ChatBot.AutoFishing.Movements$")] - public LocationConfig[] Movements = new LocationConfig[] - { - new LocationConfig(12.34, -23.45), - new LocationConfig(123.45, 64, -654.32, -25.14, 36.25), - new LocationConfig(-1245.63, 63.5, 1.2), - }; - - public void OnSettingUpdate() - { - if (Cast_Delay < 0) - Cast_Delay = 0; - - if (Fishing_Delay < 0) - Fishing_Delay = 0; - - if (Fishing_Timeout < 0) - Fishing_Timeout = 0; - - if (Durability_Limit < 0) - Durability_Limit = 0; - else if (Durability_Limit > 64) - Durability_Limit = 64; - - if (Stationary_Threshold < 0) - Stationary_Threshold = -Stationary_Threshold; - - if (Hook_Threshold < 0) - Hook_Threshold = -Hook_Threshold; - - if (Velocity_Hook_Threshold > 0) - Velocity_Hook_Threshold = -Velocity_Hook_Threshold; - - if (Sound_Distance < 0) - Sound_Distance = -Sound_Distance; - - if (Detection_Warmup < 0) - Detection_Warmup = 0; - } - - public struct LocationConfig - { - public Coordination? XYZ; - public Facing? facing; - - public LocationConfig() - { - XYZ = null; - facing = null; - } - - public LocationConfig(double yaw, double pitch) - { - this.XYZ = null; - this.facing = new(yaw, pitch); - } - - public LocationConfig(double x, double y, double z) - { - this.XYZ = new(x, y, z); - this.facing = null; - } - - public LocationConfig(double x, double y, double z, double yaw, double pitch) - { - this.XYZ = new(x, y, z); - this.facing = new(yaw, pitch); - } - - public struct Coordination - { - public double x, y, z; - - public Coordination() - { - x = 0; - y = 0; - z = 0; - } - - public Coordination(double x, double y, double z) - { - this.x = x; this.y = y; this.z = z; - } - } - - public struct Facing - { - public double yaw, pitch; - - public Facing() - { - yaw = 0; - pitch = 0; - } - - public Facing(double yaw, double pitch) - { - this.yaw = yaw; this.pitch = pitch; - } - } - } - } - - private int fishCount = 0; - private bool inventoryEnabled; - private int castTimeout = 12; - - private bool isFishing = false, isWaitingRod = false; - private Entity? fishingBobber; - private Location LastPos = Location.Zero; - private DateTime CaughtTime = DateTime.Now; - private DateTime BobberSpawnTime = DateTime.MinValue; - private int fishItemCounter = 15; - private Dictionary fishItemCnt = new(); - private Entity fishItem = new(-1, EntityType.Item, Location.Zero); - - private int counter = 0; - private readonly Lock stateLock = new(); - private FishingState state = FishingState.WaitJoinGame; - - private int curLocationIdx = 0, moveDir = 1; - float nextYaw = 0, nextPitch = 0; - - private enum FishingState - { - WaitJoinGame, - WaitingToCast, - CastingRod, - WaitingFishingBobber, - WaitingFishToBite, - StartMove, - WaitingMovement, - DurabilityCheck, - Stopping, - } - - public override void Initialize() - { - if (!GetEntityHandlingEnabled()) - { - LogToConsole(Translations.extra_entity_required); - state = FishingState.WaitJoinGame; - } - - inventoryEnabled = GetInventoryEnabled(); - if (!inventoryEnabled) - LogToConsole(Translations.bot_autoFish_no_inv_handle); - - McClient.dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CommandName) - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - .Then(l => l.Literal("start") - .Executes(r => OnCommandHelp(r.Source, "start"))) - .Then(l => l.Literal("stop") - .Executes(r => OnCommandHelp(r.Source, "stop"))) - .Then(l => l.Literal("status") - .Executes(r => OnCommandHelp(r.Source, "status"))) - .Then(l => l.Literal("help") - .Executes(r => OnCommandHelp(r.Source, "help"))) - ) - ); - - McClient.dispatcher.Register(l => l.Literal(CommandName) - .Then(l => l.Literal("start") - .Executes(r => OnCommandStart(r.Source))) - .Then(l => l.Literal("stop") - .Executes(r => OnCommandStop(r.Source))) - .Then(l => l.Literal("status") - .Executes(r => OnCommandStatus(r.Source)) - .Then(l => l.Literal("clear") - .Executes(r => OnCommandStatusClear(r.Source)))) - .Then(l => l.Literal("_help") - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - .Redirect(McClient.dispatcher.GetRoot().GetChild("help").GetChild(CommandName))) - ); - } - - public override void OnUnload() - { - McClient.dispatcher.Unregister(CommandName); - McClient.dispatcher.GetRoot().GetChild("help").RemoveChild(CommandName); - } - - private int OnCommandHelp(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - "start" => Translations.bot_autoFish_help_start, - "stop" => Translations.bot_autoFish_help_stop, - "status" => Translations.bot_autoFish_help_status, - "help" => Translations.bot_autoFish_help_help, - _ => string.Format(Translations.bot_autoFish_available_cmd, "start, stop, status, help") - + '\n' + McClient.dispatcher.GetAllUsageString(CommandName, false), -#pragma warning restore format // @formatter:on - }); - } - - private int OnCommandStart(CmdResult r) - { - isFishing = false; - lock (stateLock) - { - isFishing = false; - counter = 0; - state = FishingState.StartMove; - } - return r.SetAndReturn(CmdResult.Status.Done, Translations.bot_autoFish_start); - } - - private int OnCommandStop(CmdResult r) - { - isFishing = false; - lock (stateLock) - { - isFishing = false; - if (state == FishingState.WaitingFishToBite) - UseFishRod(); - state = FishingState.Stopping; - } - StopFishing(); - return r.SetAndReturn(CmdResult.Status.Done, Translations.bot_autoFish_stop); - } - - private int OnCommandStatus(CmdResult r) - { - if (fishItemCnt.Count == 0) - return r.SetAndReturn(CmdResult.Status.Done, Translations.bot_autoFish_status_info); - - List> orderedList = fishItemCnt.OrderBy(x => x.Value).ToList(); - int maxLen = orderedList[^1].Value.ToString().Length; - StringBuilder sb = new(); - sb.Append(Translations.bot_autoFish_status_info); - foreach ((ItemType type, uint cnt) in orderedList) - { - sb.Append(Environment.NewLine); - - string cntStr = cnt.ToString(); - sb.Append(' ', maxLen - cntStr.Length).Append(cntStr); - sb.Append(" x "); - sb.Append(Item.GetTypeString(type)); - } - LogToConsole(sb.ToString()); - return r.SetAndReturn(CmdResult.Status.Done); - } - - private int OnCommandStatusClear(CmdResult r) - { - fishItemCnt = new(); - return r.SetAndReturn(CmdResult.Status.Done, Translations.bot_autoFish_status_clear); - } - - private void StartFishing() - { - isFishing = false; - if (Config.Auto_Start) - { - double delay = Config.Fishing_Delay; - LogToConsole(string.Format(Translations.bot_autoFish_start_at, delay)); - lock (stateLock) - { - isFishing = false; - counter = Settings.DoubleToTick(delay); - state = FishingState.StartMove; - } - } - else - { - lock (stateLock) - { - state = FishingState.WaitJoinGame; - } - } - } - - private void StopFishing() - { - isFishing = false; - lock (stateLock) - { - isFishing = false; - state = FishingState.Stopping; - } - fishItemCounter = 15; - } - - private void UseFishRod() - { - if (Config.Mainhand) - UseItemInHand(); - else - UseItemInLeftHand(); - } - - public override void Update() - { - if (fishItemCounter < 15) - ++fishItemCounter; - - lock (stateLock) - { - switch (state) - { - case FishingState.WaitJoinGame: - break; - case FishingState.WaitingToCast: - if (AutoEat.Eating) - counter = Settings.DoubleToTick(Config.Cast_Delay); - else if (--counter < 0) - state = FishingState.CastingRod; - break; - case FishingState.CastingRod: - UseFishRod(); - counter = 0; - state = FishingState.WaitingFishingBobber; - break; - case FishingState.WaitingFishingBobber: - if (++counter > castTimeout) - { - if (castTimeout < 6000) - castTimeout *= 2; // Exponential backoff - LogToConsole(GetShortTimestamp() + ": " + string.Format(Translations.bot_autoFish_cast_timeout, castTimeout / 10.0)); - - counter = Settings.DoubleToTick(Config.Cast_Delay); - state = FishingState.WaitingToCast; - } - break; - case FishingState.WaitingFishToBite: - if (++counter > Settings.DoubleToTick(Config.Fishing_Timeout)) - { - LogToConsole(GetShortTimestamp() + ": " + Translations.bot_autoFish_fishing_timeout); - - counter = Settings.DoubleToTick(Config.Cast_Delay); - state = FishingState.WaitingToCast; - } - break; - case FishingState.StartMove: - if (--counter < 0) - { - if (Config.Enable_Move && Config.Movements.Length > 0) - { - if (GetTerrainEnabled()) - { - UpdateLocation(Config.Movements); - state = FishingState.WaitingMovement; - } - else - { - LogToConsole(Translations.extra_terrainandmovement_required); - state = FishingState.WaitJoinGame; - } - } - else - { - counter = Settings.DoubleToTick(Config.Cast_Delay); - state = FishingState.DurabilityCheck; - goto case FishingState.DurabilityCheck; - } - } - break; - case FishingState.WaitingMovement: - if (!ClientIsMoving()) - { - LookAtLocation(nextYaw, nextPitch); - LogToConsole(string.Format(Translations.bot_autoFish_update_lookat, nextYaw, nextPitch)); - - state = FishingState.DurabilityCheck; - goto case FishingState.DurabilityCheck; - } - break; - case FishingState.DurabilityCheck: - if (DurabilityCheck()) - { - counter = Settings.DoubleToTick(Config.Cast_Delay); - state = FishingState.WaitingToCast; - } - break; - case FishingState.Stopping: - break; - } - } - } - - public override void OnEntitySpawn(Entity entity) - { - if (fishItemCounter < 15 && entity.Type == EntityType.Item && Math.Abs(entity.Location.Y - LastPos.Y) < 2.2 && - Math.Abs(entity.Location.X - LastPos.X) < 0.12 && Math.Abs(entity.Location.Z - LastPos.Z) < 0.12) - { - if (Config.Log_Fish_Bobber) - LogToConsole(string.Format("Item ({0}) spawn at {1}, distance = {2:0.00}", entity.ID, entity.Location, entity.Location.Distance(LastPos))); - fishItem = entity; - } - else if (entity.Type == EntityType.FishingBobber && entity.ObjectData == GetPlayerEntityID()) - { - if (Config.Log_Fish_Bobber) - LogToConsole(string.Format("FishingBobber spawn at {0}, distance = {1:0.00}", entity.Location, GetCurrentLocation().Distance(entity.Location))); - - fishItemCounter = 15; - - LogToConsole(GetShortTimestamp() + ": " + Translations.bot_autoFish_throw); - lock (stateLock) - { - fishingBobber = entity; - LastPos = entity.Location; - isFishing = true; - BobberSpawnTime = DateTime.Now; - - castTimeout = 24; - counter = 0; - state = FishingState.WaitingFishToBite; - } - } - } - - public override void OnEntityDespawn(Entity entity) - { - if (entity is not null && fishingBobber is not null && entity.Type == EntityType.FishingBobber && entity.ID == fishingBobber!.ID) - { - if (Config.Log_Fish_Bobber) - LogToConsole(string.Format("FishingBobber despawn at {0}", entity.Location)); - - if (isFishing) - { - isFishing = false; - - if (Config.Antidespawn) - { - LogToConsole(Translations.bot_autoFish_despawn); - - lock (stateLock) - { - counter = Settings.DoubleToTick(Config.Cast_Delay); - state = FishingState.WaitingToCast; - } - } - } - } - } - - public override void OnEntityMove(Entity entity) - { - if (isFishing && entity is not null && fishingBobber!.ID == entity.ID && - state == FishingState.WaitingFishToBite) - { - Location Pos = entity.Location; - double Dx = LastPos.X - Pos.X; - double Dy = LastPos.Y - Pos.Y; - double Dz = LastPos.Z - Pos.Z; - LastPos = Pos; - - if (Config.Log_Fish_Bobber) - LogToConsole(string.Format("FishingBobber {0} Dx={1:0.000000} Dy={2:0.000000} Dz={3:0.000000}", Pos, Dx, Math.Abs(Dy), Dz)); - - if (Math.Abs(Dx) < Math.Abs(Config.Stationary_Threshold) && - Math.Abs(Dz) < Math.Abs(Config.Stationary_Threshold) && - Math.Abs(Dy) > Math.Abs(Config.Hook_Threshold)) - { - TryCatchFish(); - } - } - } - - public override void OnEntityMetadata(Entity entity, Dictionary metadata) - { - if (fishItemCounter < 15 && entity.ID == fishItem.ID && metadata.TryGetValue(8, out object? itemObj)) - { - fishItemCounter = 15; - Item item = (Item)itemObj!; - LogToConsole(string.Format(Translations.bot_autoFish_got, item.ToFullString())); - if (fishItemCnt.ContainsKey(item.Type)) - fishItemCnt[item.Type] += (uint)item.Count; - else - fishItemCnt.Add(item.Type, (uint)item.Count); - } - } - - public override void OnEntityVelocity(Entity entity, double velocityX, double velocityY, double velocityZ) - { - if (!Config.Enable_Velocity_Detection || !CanUseAdvancedDetection()) - return; - - if (fishingBobber is null || entity.ID != fishingBobber.ID) - return; - - if (velocityY <= Config.Velocity_Hook_Threshold) - TryCatchFish(); - } - - public override void OnSoundEffect(string? soundName, Location? location, int category, float volume, float pitch, - Entity? sourceEntity) - { - if (!Config.Enable_Sound_Detection || !CanUseAdvancedDetection()) - return; - - if (!IsFishingBobberSplashSound(soundName)) - return; - - Location? soundLocation = location; - if (soundLocation is null && sourceEntity is not null) - soundLocation = sourceEntity.Location; - - if (soundLocation is null || fishingBobber is null) - return; - - if (soundLocation.Value.Distance(fishingBobber.Location) <= Config.Sound_Distance) - TryCatchFish(); - } - - public override void AfterGameJoined() - { - StartFishing(); - } - - public override void OnRespawn() - { - StartFishing(); - } - - public override void OnDeath() - { - StopFishing(); - } - - public override bool OnDisconnect(DisconnectReason reason, string message) - { - StopFishing(); - - fishingBobber = null; - LastPos = Location.Zero; - CaughtTime = DateTime.Now; - BobberSpawnTime = DateTime.MinValue; - - return base.OnDisconnect(reason, message); - } - - private bool CanUseAdvancedDetection() - { - if (!isFishing || fishingBobber is null || state != FishingState.WaitingFishToBite) - return false; - - return (DateTime.Now - BobberSpawnTime).TotalSeconds >= Config.Detection_Warmup; - } - - private void TryCatchFish() - { - if (!CanUseAdvancedDetection()) - return; - - // Prevent repeated catches from multiple packets of the same bite. - if ((DateTime.Now - CaughtTime).TotalSeconds <= 1) - return; - - isFishing = false; - CaughtTime = DateTime.Now; - OnCaughtFish(); - } - - private static bool IsFishingBobberSplashSound(string? soundName) - { - return string.Equals(soundName, "minecraft:entity.fishing_bobber.splash", - StringComparison.OrdinalIgnoreCase) - || string.Equals(soundName, "entity.fishing_bobber.splash", StringComparison.OrdinalIgnoreCase) - || string.Equals(soundName, "minecraft:entity.bobber.splash", StringComparison.OrdinalIgnoreCase) - || string.Equals(soundName, "entity.bobber.splash", StringComparison.OrdinalIgnoreCase); - } - - /// - /// Called when detected a fish is caught - /// - public void OnCaughtFish() - { - ++fishCount; - if (Config.Enable_Move && Config.Movements.Length > 0) - LogToConsole(GetShortTimestamp() + ": " + string.Format(Translations.bot_autoFish_caught_at, - fishingBobber!.Location.X, fishingBobber!.Location.Y, fishingBobber!.Location.Z, fishCount)); - else - LogToConsole(GetShortTimestamp() + ": " + string.Format(Translations.bot_autoFish_caught, fishCount)); - - lock (stateLock) - { - counter = 0; - state = FishingState.StartMove; - - fishItemCounter = 0; - UseFishRod(); - } - } - - private void UpdateLocation(LocationConfig[] locationList) - { - if (curLocationIdx >= locationList.Length) - { - curLocationIdx = Math.Max(0, locationList.Length - 2); - moveDir = -1; - } - else if (curLocationIdx < 0) - { - curLocationIdx = Math.Min(locationList.Length - 1, 1); - moveDir = 1; - } - - LocationConfig curConfig = locationList[curLocationIdx]; - - if (curConfig.facing is not null) - (nextYaw, nextPitch) = ((float)curConfig.facing.Value.yaw, (float)curConfig.facing.Value.pitch); - else - (nextYaw, nextPitch) = (GetYaw(), GetPitch()); - - if (curConfig.XYZ is not null) - { - Location current = GetCurrentLocation(); - Location goal = new(curConfig.XYZ.Value.x, curConfig.XYZ.Value.y, curConfig.XYZ.Value.z); - - bool isMoveSuccessed; - if (!Movement.CheckChunkLoading(GetWorld(), current, goal)) - { - isMoveSuccessed = false; - LogToConsole(string.Format(Translations.cmd_move_chunk_not_loaded, goal.X, goal.Y, goal.Z)); - } - else - { - isMoveSuccessed = MoveToLocation(goal, allowUnsafe: false, allowDirectTeleport: false); - } - - if (!isMoveSuccessed) - { - (nextYaw, nextPitch) = (GetYaw(), GetPitch()); - LogToConsole(string.Format(Translations.cmd_move_fail, goal)); - } - else - { - LogToConsole(string.Format(Translations.cmd_move_walk, goal, current)); - } - } - - curLocationIdx += moveDir; - } - - private bool DurabilityCheck() - { - if (!inventoryEnabled) - return true; - - bool useMainHand = Config.Mainhand; - Container container = GetPlayerInventory(); - - int itemSolt = useMainHand ? GetCurrentSlot() + 36 : 45; - - if (container.Items.TryGetValue(itemSolt, out Item? handItem) && - handItem.Type == ItemType.FishingRod && (64 - handItem.Damage) >= Config.Durability_Limit) - { - isWaitingRod = false; - return true; - } - else - { - if (!isWaitingRod) - LogToConsole(GetTimestamp() + ": " + Translations.bot_autoFish_no_rod); - - if (Config.Auto_Rod_Switch) - { - foreach ((int slot, Item item) in container.Items) - { - if (item.Type == ItemType.FishingRod && (64 - item.Damage) >= Config.Durability_Limit) - { - WindowAction(0, slot, WindowActionType.LeftClick); - WindowAction(0, itemSolt, WindowActionType.LeftClick); - WindowAction(0, slot, WindowActionType.LeftClick); - LogToConsole(GetTimestamp() + ": " + string.Format(Translations.bot_autoFish_switch, slot, (64 - item.Damage))); - isWaitingRod = false; - return true; - } - } - } - - isWaitingRod = true; - return false; - } - } - } -} diff --git a/MinecraftClient/ChatBots/AutoRelog.cs b/MinecraftClient/ChatBots/AutoRelog.cs deleted file mode 100644 index 3a07f7f434..0000000000 --- a/MinecraftClient/ChatBots/AutoRelog.cs +++ /dev/null @@ -1,203 +0,0 @@ -using System; -using MinecraftClient.Scripting; -using Tomlet.Attributes; - -namespace MinecraftClient.ChatBots -{ - /// - /// This bot automatically re-join the server if kick message contains predefined string (Server is restarting ...) - /// - public class AutoRelog : ChatBot - { - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] - private const string BotName = "AutoRelog"; - - public bool Enabled = false; - - [TomlInlineComment("$ChatBot.AutoRelog.Delay$")] - public Range Delay = new(3); - - [TomlInlineComment("$ChatBot.AutoRelog.Retries$")] - public int Retries = -1; - - [TomlInlineComment("$ChatBot.AutoRelog.Ignore_Kick_Message$")] - public bool Ignore_Kick_Message = false; - - [TomlPrecedingComment("$ChatBot.AutoRelog.Kick_Messages$")] - public string[] Kick_Messages = new string[] { "Connection has been lost", "Server is restarting", "Server is full", "Too Many people" }; - - public void OnSettingUpdate() - { - Kick_Messages ??= Array.Empty(); - - if (!double.IsFinite(Delay.min)) - Delay.min = 0.1; - if (!double.IsFinite(Delay.max)) - Delay.max = 0.1; - - Delay.min = Math.Max(0.1, Delay.min); - Delay.max = Math.Max(0.1, Delay.max); - - double maxDelaySeconds = (uint.MaxValue - 1) / 1000D; - Delay.min = Math.Min(maxDelaySeconds, Delay.min); - Delay.max = Math.Min(maxDelaySeconds, Delay.max); - - if (Delay.min > Delay.max) - (Delay.min, Delay.max) = (Delay.max, Delay.min); - - if (Retries < -1) - Retries = -1; - } - - public struct Range - { - public double min, max; - - public Range() - { - min = 0; - max = 0; - } - - public Range(int value) - { - min = max = value; - } - - public Range(int min, int max) - { - this.min = min; - this.max = max; - } - } - } - - private static readonly AutoRelogRetryPolicy s_retryPolicy = new(TimeProvider.System); - private readonly long? sourceConnectionAttempt; - - /// - /// This bot automatically re-join the server if kick message contains predefined string - /// - /// Minimum delay before re-joining the server (in seconds) - /// Maximum delay before re-joining the server (in seconds) - /// Number of retries if connection fails (-1 = infinite) - public AutoRelog() : this(null) - { - } - - private AutoRelog(long? sourceConnectionAttempt) - { - this.sourceConnectionAttempt = sourceConnectionAttempt; - LogDebugToConsole(string.Format(Translations.bot_autoRelog_launch, Config.Retries)); - } - - public override void Initialize() - { - _Initialize(); - } - - public override void AfterGameJoined() - { - s_retryPolicy.MarkJoined(); - } - - public override void Update() - { - ResetRetriesAfterStableJoin(); - } - - private void _Initialize() - { - McClient.ReconnectionAttemptsLeft = Config.Retries; - if (Config.Ignore_Kick_Message) - { - LogDebugToConsole(Translations.bot_autoRelog_no_kick_msg); - } - } - - public override bool OnDisconnect(DisconnectReason reason, string message) - { - if (reason == DisconnectReason.UserLogout) - { - LogDebugToConsole(Translations.bot_autoRelog_ignore_user_logout); - return false; - } - - message = GetVerbatim(message); - LogDebugToConsole(string.Format(Translations.bot_autoRelog_disconnect_msg, message)); - - if (!AutoRelogRetryPolicy.ShouldReconnect( - reason, - message, - Config.Ignore_Kick_Message, - Config.Kick_Messages, - out string? matchedMessage)) - { - LogDebugToConsole(Translations.bot_autoRelog_reconnect_ignore); - return false; - } - - return LaunchDelayedReconnection(matchedMessage); - } - - private static void ResetRetriesAfterStableJoin() - { - if (s_retryPolicy.ResetAfterStableConnection()) - McClient.ReconnectionAttemptsLeft = Config.Retries; - } - - private static bool HasUnlimitedRetries() - { - return Config.Retries == -1; - } - - private bool LaunchDelayedReconnection(string? msg) - { - if (!s_retryPolicy.TryReserveAttempt(Config.Retries, out int retriesLeft)) - return false; - - double delay = Random.Shared.NextDouble() * (Config.Delay.max - Config.Delay.min) + Config.Delay.min; - LogDebugToConsole(string.Format(string.IsNullOrEmpty(msg) ? Translations.bot_autoRelog_reconnect_always : Translations.bot_autoRelog_reconnect, msg)); - - string retriesDisplay = HasUnlimitedRetries() - ? Translations.bot_autoRelog_retries_unlimited - : retriesLeft.ToString(); - - McClient.ReconnectionAttemptsLeft = retriesLeft; - long connectionAttempt = sourceConnectionAttempt ?? Handler.ConnectionAttempt; - if (Program.TryRestart( - connectionAttempt, - TimeSpan.FromSeconds(delay), - keepAccountAndServerSettings: true, - sourceCleanupCompletion: sourceConnectionAttempt.HasValue ? null : Handler.DisconnectCompletion)) - { - LogToConsole(string.Format(Translations.bot_autoRelog_wait_with_retries, delay, retriesDisplay)); - return true; - } - - s_retryPolicy.RollBackReservedAttempt(); - return Program.HasRestartPending(connectionAttempt); - } - - public static bool OnDisconnectStatic(DisconnectReason reason, string message) - { - return OnDisconnectStatic(reason, message, Program.CurrentConnectionAttempt); - } - - internal static bool OnDisconnectStatic(DisconnectReason reason, string message, long sourceConnectionAttempt) - { - if (Config.Enabled) - { - AutoRelog bot = new(sourceConnectionAttempt); - bot.Initialize(); - return bot.OnDisconnect(reason, message); - } - return false; - } - } -} diff --git a/MinecraftClient/ChatBots/AutoRelogRetryPolicy.cs b/MinecraftClient/ChatBots/AutoRelogRetryPolicy.cs deleted file mode 100644 index 259b707908..0000000000 --- a/MinecraftClient/ChatBots/AutoRelogRetryPolicy.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System; -using System.Threading; -using MinecraftClient.Scripting; - -namespace MinecraftClient.ChatBots -{ - internal sealed class AutoRelogRetryPolicy - { - internal static readonly TimeSpan StableConnectionThreshold = TimeSpan.FromSeconds(60); - - private readonly Lock stateLock = new(); - private readonly TimeProvider timeProvider; - private int attempts; - private DateTimeOffset? joinedAt; - - internal AutoRelogRetryPolicy(TimeProvider timeProvider) - { - ArgumentNullException.ThrowIfNull(timeProvider); - this.timeProvider = timeProvider; - } - - internal int Attempts - { - get - { - lock (stateLock) - return attempts; - } - } - - internal void MarkJoined() - { - lock (stateLock) - joinedAt = timeProvider.GetUtcNow(); - } - - internal bool ResetAfterStableConnection() - { - lock (stateLock) - { - if (attempts == 0 || joinedAt is not DateTimeOffset connectionStart) - return false; - - if (timeProvider.GetUtcNow() - connectionStart < StableConnectionThreshold) - return false; - - attempts = 0; - joinedAt = null; - return true; - } - } - - internal bool TryReserveAttempt(int retryLimit, out int retriesLeft) - { - lock (stateLock) - { - bool unlimited = retryLimit == -1; - if (!unlimited && attempts >= retryLimit) - { - retriesLeft = 0; - return false; - } - - attempts++; - joinedAt = null; - retriesLeft = unlimited ? -1 : Math.Max(0, retryLimit - attempts); - return true; - } - } - - internal void RollBackReservedAttempt() - { - lock (stateLock) - { - if (attempts > 0) - attempts--; - } - } - - internal static bool ShouldReconnect( - ChatBot.DisconnectReason reason, - string message, - bool ignoreKickMessage, - ReadOnlySpan kickMessages, - out string? matchedMessage) - { - matchedMessage = null; - - if (reason == ChatBot.DisconnectReason.UserLogout) - return false; - - if (reason == ChatBot.DisconnectReason.ConnectionLost || ignoreKickMessage) - return true; - - foreach (string candidate in kickMessages) - { - if (!string.IsNullOrEmpty(candidate) - && message.Contains(candidate, StringComparison.OrdinalIgnoreCase)) - { - matchedMessage = candidate; - return true; - } - } - - return false; - } - } -} diff --git a/MinecraftClient/ChatBots/AutoRespond.cs b/MinecraftClient/ChatBots/AutoRespond.cs deleted file mode 100644 index a9bb43eade..0000000000 --- a/MinecraftClient/ChatBots/AutoRespond.cs +++ /dev/null @@ -1,321 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Text; -using System.Text.RegularExpressions; -using MinecraftClient.CommandHandler; -using MinecraftClient.Scripting; -using Tomlet.Attributes; -using static MinecraftClient.Settings; - -namespace MinecraftClient.ChatBots -{ - /// - /// This bot automatically runs actions when a user sends a message matching a specified rule - /// - public class AutoRespond : ChatBot - { - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] - private const string BotName = "AutoRespond"; - - public bool Enabled = false; - - public string Matches_File = @"matches.ini"; - - [TomlInlineComment("$ChatBot.AutoRespond.Match_Colors$")] - public bool Match_Colors = false; - - public void OnSettingUpdate() - { - Matches_File ??= string.Empty; - - if (!Enabled) return; - - if (!File.Exists(Matches_File)) - { - LogToConsole(BotName, string.Format(Translations.bot_autoRespond_file_not_found, Path.GetFullPath(Matches_File))); - LogToConsole(BotName, Translations.general_bot_unload); - Enabled = false; - } - } - } - - private List? respondRules; - private enum MessageType { Public, Private, Other }; - - /// - /// Describe a respond rule based on a simple match or a regex - /// - private class RespondRule - { - private readonly Regex? regex; - private readonly string? match; - private readonly string? actionPublic; - private readonly string? actionPrivate; - private readonly string? actionOther; - private readonly bool ownersOnly; - private readonly TimeSpan cooldown; - private DateTime cooldownExpiration; - - /// - /// Create a respond rule from a regex and a reponse message or command - /// - /// Regex - /// Internal command to run for public messages - /// Internal command to run for private messages - /// Internal command to run for any other messages - /// Only match messages from bot owners - /// Minimal cooldown between two matches - public RespondRule(Regex regex, string? actionPublic, string? actionPrivate, string? actionOther, bool ownersOnly, TimeSpan cooldown) - { - this.regex = regex; - match = null; - this.actionPublic = actionPublic; - this.actionPrivate = actionPrivate; - this.actionOther = actionOther; - this.ownersOnly = ownersOnly; - this.cooldown = cooldown; - cooldownExpiration = DateTime.MinValue; - } - - /// - /// Create a respond rule from a match string and a reponse message or command - /// - /// Match string - /// Internal command to run for public messages - /// Internal command to run for private messages - /// Only match messages from bot owners - /// Minimal cooldown between two matches - public RespondRule(string? match, string? actionPublic, string? actionPrivate, string? actionOther, bool ownersOnly, TimeSpan cooldown) - { - regex = null; - this.match = match; - this.actionPublic = actionPublic; - this.actionPrivate = actionPrivate; - this.actionOther = actionOther; - this.ownersOnly = ownersOnly; - this.cooldown = cooldown; - cooldownExpiration = DateTime.MinValue; - } - - /// - /// Match the respond rule to the specified string and return a message or command to send if a match is detected - /// - /// Player who have sent the message - /// Message to match against the regex or match string - /// Type of the message public/private message, or other message - /// Dictionary to populate with match variables in case of Regex match - /// Internal command to run as a response to this user, or null if no match has been detected - public string? Match(string username, string message, MessageType msgType, Dictionary localVars) - { - if (DateTime.Now < cooldownExpiration) - return null; - - string? toSend = null; - - if (ownersOnly && (String.IsNullOrEmpty(username) || !Settings.Config.Main.Advanced.BotOwners.Contains(username.ToLower()))) - return null; - - switch (msgType) - { - case MessageType.Public: toSend = actionPublic; break; - case MessageType.Private: toSend = actionPrivate; break; - case MessageType.Other: toSend = actionOther; break; - } - - if (String.IsNullOrEmpty(toSend)) - return null; - - if (regex is not null) - { - if (regex.IsMatch(message)) - { - cooldownExpiration = DateTime.Now + cooldown; - Match regexMatch = regex.Match(message); - localVars["match_0"] = regexMatch.Groups[0].Value; - for (int i = regexMatch.Groups.Count - 1; i >= 1; i--) - { - toSend = toSend.Replace("$" + i, regexMatch.Groups[i].Value); - localVars["match_" + i] = regexMatch.Groups[i].Value; - } - toSend = toSend.Replace("$u", username); - localVars["match_u"] = username; - return toSend; - } - } - else if (!String.IsNullOrEmpty(match)) - { - if (message.ToLower().Contains(match.ToLower())) - { - cooldownExpiration = DateTime.Now + cooldown; - localVars["match_0"] = message; - localVars["match_u"] = username; - return toSend.Replace("$u", username); - } - } - - return null; - } - - /// - /// Get a string representation of the RespondRule - /// - /// - public override string ToString() - { - return string.Format( - Translations.bot_autoRespond_match, - match, - regex, - actionPublic, - actionPrivate, - actionOther, - ownersOnly, - (int)cooldown.TotalSeconds - ); - } - } - - /// - /// Initialize the AutoRespond bot from the matches file - /// - public override void Initialize() - { - if (File.Exists(Config.Matches_File)) - { - Regex? matchRegex = null; - string? matchString = null; - string? matchAction = null; - string? matchActionPrivate = null; - string? matchActionOther = null; - bool ownersOnly = false; - TimeSpan cooldown = TimeSpan.Zero; - respondRules = new List(); - - LogDebugToConsole(string.Format(Translations.bot_autoRespond_loading, System.IO.Path.GetFullPath(Config.Matches_File))); - - foreach (string lineRAW in File.ReadAllLines(Config.Matches_File, Encoding.UTF8)) - { - string line = lineRAW.Split('#')[0].Trim(); - if (line.Length > 0) - { - if (line[0] == '[' && line[^1] == ']') - { - switch (line[1..^1].ToLower()) - { - case "match": - CheckAddMatch(matchRegex, matchString, matchAction, matchActionPrivate, matchActionOther, ownersOnly, cooldown); - matchRegex = null; - matchString = null; - matchAction = null; - matchActionPrivate = null; - matchActionOther = null; - ownersOnly = false; - cooldown = TimeSpan.Zero; - break; - } - } - else - { - string argName = line.Split('=')[0]; - if (line.Length > (argName.Length + 1)) - { - string argValue = line[(argName.Length + 1)..]; - switch (argName.ToLower()) - { - case "regex": matchRegex = new Regex(argValue); break; - case "match": matchString = argValue; break; - case "action": matchAction = argValue; break; - case "actionprivate": matchActionPrivate = argValue; break; - case "actionother": matchActionOther = argValue; break; - case "ownersonly": ownersOnly = bool.Parse(argValue); break; - case "cooldown": cooldown = TimeSpan.FromSeconds(int.Parse(argValue, NumberStyles.Any, CultureInfo.CurrentCulture)); break; - } - } - } - } - } - CheckAddMatch(matchRegex, matchString, matchAction, matchActionPrivate, matchActionOther, ownersOnly, cooldown); - } - else - { - LogToConsole(string.Format(Translations.bot_autoRespond_file_not_found, System.IO.Path.GetFullPath(Config.Matches_File))); - UnloadBot(); //No need to keep the bot active - } - } - - /// - /// Create a new respond rule from the provided arguments, only if they are valid: at least one match and one action - /// - /// Matching regex - /// Matching string - /// Action if the matching message is public - /// Action if the matching message is private - /// Only match messages from bot owners - /// Minimal cooldown between two matches - private void CheckAddMatch(Regex? matchRegex, string? matchString, string? matchAction, string? matchActionPrivate, string? matchActionOther, bool ownersOnly, TimeSpan cooldown) - { - if (matchRegex is not null || matchString is not null || matchAction is not null || matchActionPrivate is not null || matchActionOther is not null || ownersOnly || cooldown != TimeSpan.Zero) - { - RespondRule rule = matchRegex is not null - ? new RespondRule(matchRegex, matchAction, matchActionPrivate, matchActionOther, ownersOnly, cooldown) - : new RespondRule(matchString, matchAction, matchActionPrivate, matchActionOther, ownersOnly, cooldown); - - if (matchAction is not null || matchActionPrivate is not null || matchActionOther is not null) - { - if (matchRegex is not null || matchString is not null) - { - respondRules!.Add(rule); - LogDebugToConsole(string.Format(Translations.bot_autoRespond_loaded_match, rule)); - } - else LogDebugToConsole(string.Format(Translations.bot_autoRespond_no_trigger, rule)); - } - else LogDebugToConsole(string.Format(Translations.bot_autoRespond_no_action, rule)); - } - } - - /// - /// Process messages from the server and test them against all matches - /// - /// Text from the server - public override void GetText(string text) - { - //Remove colour codes - if (!Config.Match_Colors) - text = GetVerbatim(text); - - //Get Message type - string sender = "", message = ""; - MessageType msgType = MessageType.Other; - if (IsChatMessage(text, ref message, ref sender)) - msgType = MessageType.Public; - else if (IsPrivateMessage(text, ref message, ref sender)) - msgType = MessageType.Private; - else message = text; - - //Do not process messages sent by the bot itself - if (msgType == MessageType.Other || sender != InternalConfig.Username) - { - foreach (RespondRule rule in respondRules!) - { - Dictionary localVars = new(); - string? toPerform = rule.Match(sender, message, msgType, localVars); - if (!string.IsNullOrEmpty(toPerform)) - { - CmdResult response = new(); - LogToConsole(string.Format(Translations.bot_autoRespond_match_run, toPerform)); - PerformInternalCommand(toPerform, ref response, localVars); - if (response.status != CmdResult.Status.Done || !string.IsNullOrWhiteSpace(response.result)) - LogToConsole(response); - } - } - } - } - } -} diff --git a/MinecraftClient/ChatBots/ChatLog.cs b/MinecraftClient/ChatBots/ChatLog.cs deleted file mode 100644 index b4f94135d0..0000000000 --- a/MinecraftClient/ChatBots/ChatLog.cs +++ /dev/null @@ -1,152 +0,0 @@ -using System; -using System.IO; -using System.Threading; -using MinecraftClient.CommandHandler; -using MinecraftClient.Scripting; -using Tomlet.Attributes; - -namespace MinecraftClient.ChatBots -{ - /// - /// This bot saves the received messages in a text file. - /// - - public class ChatLog : ChatBot - { - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] - private const string BotName = "ChatLog"; - - public bool Enabled = false; - - public bool Add_DateTime = true; - - public string Log_File = @"chatlog-%username%-%serverip%.txt"; - - public MessageFilter Filter = MessageFilter.messages; - - public void OnSettingUpdate() - { - Log_File ??= string.Empty; - - if (!Enabled) return; - - string Log_File_Full = Settings.Config.AppVar.ExpandVars(Log_File); - if (String.IsNullOrEmpty(Log_File_Full) || Log_File_Full.IndexOfAny(Path.GetInvalidPathChars()) >= 0) - { - LogToConsole(BotName, string.Format(Translations.bot_chatLog_invalid_file, Log_File_Full)); - LogToConsole(BotName, Translations.general_bot_unload); - Enabled = false; - } - } - - public enum MessageFilter { all, messages, chat, private_chat, internal_msg }; - } - - private bool saveOther = true; - private bool saveChat = true; - private bool savePrivate = true; - private bool saveInternal = true; - private readonly Lock logfileLock = new(); - - /// - /// This bot saves the messages received in the specified file, with some filters and date/time tagging. - /// - /// The file to save the log in - /// The kind of messages to save - /// Add a date and time before each message - - public ChatLog() - { - UpdateFilter(Config.Filter); - } - - public void UpdateFilter(Configs.MessageFilter filter) - { - switch (filter) - { - case Configs.MessageFilter.all: - saveOther = true; - savePrivate = true; - saveChat = true; - saveInternal = true; - break; - case Configs.MessageFilter.messages: - saveOther = false; - savePrivate = true; - saveChat = true; - saveInternal = false; - break; - case Configs.MessageFilter.chat: - saveOther = false; - savePrivate = false; - saveChat = true; - saveInternal = false; - break; - case Configs.MessageFilter.private_chat: - saveOther = false; - savePrivate = true; - saveChat = false; - saveInternal = false; - break; - case Configs.MessageFilter.internal_msg: - saveOther = false; - savePrivate = false; - saveChat = false; - saveInternal = true; - break; - } - } - - public override void GetText(string text) - { - text = GetVerbatim(text); - string sender = ""; - string message = ""; - - if (saveChat && IsChatMessage(text, ref message, ref sender)) - { - Save("Chat " + sender + ": " + message); - } - else if (savePrivate && IsPrivateMessage(text, ref message, ref sender)) - { - Save("Private " + sender + ": " + message); - } - else if (saveOther) - { - Save("Other: " + text); - } - } - - public override void OnInternalCommand(string commandName, string commandParams, CmdResult result) - { - if (saveInternal) - { - Save(string.Format("Internal {0}({1}): {2}", commandName, commandParams, result)); - } - } - - private void Save(string tosave) - { - if (Config.Add_DateTime) - tosave = GetTimestamp() + ' ' + tosave; - string Log_File_Full = Settings.Config.AppVar.ExpandVars(Config.Log_File); - lock (logfileLock) - { - string? directory = Path.GetDirectoryName(Log_File_Full); - if (!String.IsNullOrEmpty(directory) && !Directory.Exists(directory)) - Directory.CreateDirectory(directory); - FileStream stream = new(Log_File_Full, FileMode.OpenOrCreate); - StreamWriter writer = new(stream); - stream.Seek(0, SeekOrigin.End); - writer.WriteLine(tosave); - writer.Dispose(); - stream.Close(); - } - } - } -} diff --git a/MinecraftClient/ChatBots/DiscordBridge.cs b/MinecraftClient/ChatBots/DiscordBridge.cs deleted file mode 100644 index 3938ab6a7b..0000000000 --- a/MinecraftClient/ChatBots/DiscordBridge.cs +++ /dev/null @@ -1,529 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; -using Brigadier.NET.Builder; -using DSharpPlus; -using DSharpPlus.Entities; -using DSharpPlus.Exceptions; -using Microsoft.Extensions.Logging; -using MinecraftClient.CommandHandler; -using MinecraftClient.CommandHandler.Patch; -using MinecraftClient.Scripting; -using Tomlet.Attributes; - -namespace MinecraftClient.ChatBots -{ - public class DiscordBridge : ChatBot - { - public const string CommandName = "dscbridge"; - - private enum BridgeDirection - { - Both = 0, - Minecraft, - Discord - } - - private static DiscordBridge? instance = null; - public bool IsConnected { get; private set; } - - private DiscordClient? discordBotClient; - private DiscordChannel? discordChannel; - private BridgeDirection bridgeDirection = BridgeDirection.Both; - - private readonly ConcurrentQueue aggregationBuffer = new(); - private Timer? aggregationTimer; - - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] - private const string BotName = "DiscordBridge"; - - public bool Enabled = false; - - [TomlInlineComment("$ChatBot.DiscordBridge.Token$")] - public string Token = "your bot token here"; - - [TomlInlineComment("$ChatBot.DiscordBridge.GuildId$")] - public ulong GuildId = 1018553894831403028L; - - [TomlInlineComment("$ChatBot.DiscordBridge.ChannelId$")] - public ulong ChannelId = 1018565295654326364L; - - [TomlInlineComment("$ChatBot.DiscordBridge.OwnersIds$")] - public ulong[] OwnersIds = new[] { 978757810781323276UL }; - - [TomlInlineComment("$ChatBot.DiscordBridge.MessageSendTimeout$")] - public int Message_Send_Timeout = 3; - - [TomlInlineComment("$ChatBot.DiscordBridge.AllowOtherBotMessages$")] - public bool Allow_Other_Bot_Messages = false; - - [TomlInlineComment("$ChatBot.DiscordBridge.RelayAllMessages$")] - public bool Relay_All_Messages = false; - - [TomlInlineComment("$ChatBot.DiscordBridge.MessageAggregationInterval$")] - public double Message_Aggregation_Interval = 3.0; - - [TomlPrecedingComment("$ChatBot.DiscordBridge.Formats$")] - public string PrivateMessageFormat = "**[Private Message]** {username}: {message}"; - public string PublicMessageFormat = "{username}: {message}"; - public string TeleportRequestMessageFormat = "A new Teleport Request from **{username}**!"; - - public void OnSettingUpdate() - { - Message_Send_Timeout = Message_Send_Timeout <= 0 ? 3 : Message_Send_Timeout; - if (Message_Aggregation_Interval < 0) - Message_Aggregation_Interval = 0; - } - } - - public DiscordBridge() - { - instance = this; - } - - public override void Initialize() - { - McClient.dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CommandName) - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - ) - ); - - McClient.dispatcher.Register(l => l.Literal(CommandName) - .Then(l => l.Literal("direction") - .Then(l => l.Literal("both") - .Executes(r => OnCommandDirection(r.Source, BridgeDirection.Both))) - .Then(l => l.Literal("mc") - .Executes(r => OnCommandDirection(r.Source, BridgeDirection.Minecraft))) - .Then(l => l.Literal("discord") - .Executes(r => OnCommandDirection(r.Source, BridgeDirection.Discord))) - ) - .Then(l => l.Literal("_help") - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - .Redirect(McClient.dispatcher.GetRoot().GetChild("help").GetChild(CommandName))) - ); - - if (Config.Message_Aggregation_Interval > 0) - { - var intervalMs = (int)(Config.Message_Aggregation_Interval * 1000); - aggregationTimer = new Timer(_ => FlushAggregationBuffer(), null, intervalMs, intervalMs); - } - - Task.Run(async () => await MainAsync()); - } - - public override void OnUnload() - { - McClient.dispatcher.Unregister(CommandName); - McClient.dispatcher.GetRoot().GetChild("help").RemoveChild(CommandName); - StopAggregation(); - Disconnect(); - } - - private int OnCommandHelp(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => "dscbridge direction " - + '\n' + McClient.dispatcher.GetAllUsageString(CommandName, false), -#pragma warning restore format // @formatter:on - }); - } - - private int OnCommandDirection(CmdResult r, BridgeDirection direction) - { - string bridgeName; - switch (direction) - { - case BridgeDirection.Both: - bridgeName = Translations.bot_DiscordBridge_direction_both; - bridgeDirection = BridgeDirection.Both; - break; - - case BridgeDirection.Minecraft: - bridgeName = Translations.bot_DiscordBridge_direction_minecraft; - bridgeDirection = BridgeDirection.Minecraft; - break; - - case BridgeDirection.Discord: - bridgeName = Translations.bot_DiscordBridge_direction_discord; - bridgeDirection = BridgeDirection.Discord; - break; - - default: - goto case BridgeDirection.Both; - } - return r.SetAndReturn(CmdResult.Status.Done, string.Format(Translations.bot_DiscordBridge_direction, bridgeName)); - } - - private void FlushAggregationBuffer() - { - if (aggregationBuffer.IsEmpty || !CanSendMessages()) - return; - - var sb = new StringBuilder(); - while (aggregationBuffer.TryDequeue(out var line)) - { - if (sb.Length + line.Length + 1 > 1900) - { - SendMessage(sb.ToString()); - sb.Clear(); - } - - if (sb.Length > 0) - sb.AppendLine(); - sb.Append(line); - } - - if (sb.Length > 0) - SendMessage(sb.ToString()); - } - - private void StopAggregation() - { - if (aggregationTimer is not null) - { - aggregationTimer.Dispose(); - aggregationTimer = null; - } - - FlushAggregationBuffer(); - } - - ~DiscordBridge() - { - Disconnect(); - } - - private void Disconnect() - { - if (discordBotClient is not null) - { - try - { - if (discordChannel is not null) - discordBotClient.SendMessageAsync(discordChannel, new DiscordEmbedBuilder - { - Description = Translations.bot_DiscordBridge_disconnected, - Color = new DiscordColor(0xFF0000) - }).Wait(Config.Message_Send_Timeout * 1000); - } - catch (Exception e) - { - LogToConsole("§§4§l§f" + Translations.bot_DiscordBridge_canceled_sending); - LogDebugToConsole(e); - } - - discordBotClient.DisconnectAsync().Wait(); - IsConnected = false; - } - } - - public static DiscordBridge? GetInstance() - { - return instance; - } - - public override void GetText(string text) - { - if (!CanSendMessages()) - return; - - text = GetVerbatim(text).Trim(); - - if (string.IsNullOrEmpty(text)) - return; - - string message = ""; - string username = ""; - bool teleportRequest = false; - - if (IsPrivateMessage(text, ref message, ref username)) - message = Config.PrivateMessageFormat.Replace("{username}", username).Replace("{message}", message).Replace("{timestamp}", GetTimestamp()).Trim(); - else if (IsChatMessage(text, ref message, ref username)) - message = Config.PublicMessageFormat.Replace("{username}", username).Replace("{message}", message).Replace("{timestamp}", GetTimestamp()).Trim(); - else if (IsTeleportRequest(text, ref username)) - { - message = Config.TeleportRequestMessageFormat.Replace("{username}", username).Replace("{timestamp}", GetTimestamp()).Trim(); - teleportRequest = true; - } - else if (Config.Relay_All_Messages) - message = text; - else - return; - - if (teleportRequest) - { - var messageBuilder = new DiscordMessageBuilder() - .WithEmbed(new DiscordEmbedBuilder - { - Description = message, - Color = new DiscordColor(0x3399FF) - }) - .AddComponents(new DiscordComponent[]{ - new DiscordButtonComponent(ButtonStyle.Success, "accept_teleport", "Accept"), - new DiscordButtonComponent(ButtonStyle.Danger, "deny_teleport", "Deny") - }); - - SendMessage(messageBuilder); - return; - } - - string discordText = GetDiscordText(message); - - if (Config.Message_Aggregation_Interval > 0) - aggregationBuffer.Enqueue(discordText); - else - SendMessage(discordText); - } - - /// - /// Converts Minecraft § formatting codes to Discord Markdown equivalents - /// and strips remaining § codes. - /// Handles both properly closed formatting (§l...§r) and unclosed formatting (§l... end). - /// - private static string GetDiscordText(string text) - { - text = Regex.Replace(text, @"§l(.*?)(?:§r|$)", "**$1**"); - text = Regex.Replace(text, @"§m(.*?)(?:§r|$)", "~~$1~~"); - text = Regex.Replace(text, @"§n(.*?)(?:§r|$)", "__$1__"); - text = Regex.Replace(text, @"§o(.*?)(?:§r|$)", "*$1*"); - text = Regex.Replace(text, @"§.", ""); - return text; - } - - public void SendMessage(string message) - { - if (!CanSendMessages() || string.IsNullOrEmpty(message)) - return; - - try - { - discordBotClient!.SendMessageAsync(discordChannel, message).Wait(Config.Message_Send_Timeout * 1000); - } - catch (Exception e) - { - LogToConsole("§§4§l§f" + Translations.bot_DiscordBridge_canceled_sending); - LogDebugToConsole(e); - } - } - - public void SendMessage(DiscordMessageBuilder builder) - { - if (!CanSendMessages()) - return; - - try - { - discordBotClient!.SendMessageAsync(discordChannel, builder).Wait(Config.Message_Send_Timeout * 1000); - } - catch (Exception e) - { - LogToConsole("§§4§l§f" + Translations.bot_DiscordBridge_canceled_sending); - LogDebugToConsole(e); - } - } - - public void SendMessage(DiscordEmbedBuilder embedBuilder) - { - if (!CanSendMessages()) - return; - - try - { - discordBotClient!.SendMessageAsync(discordChannel, embedBuilder).Wait(Config.Message_Send_Timeout * 1000); - } - catch (Exception e) - { - LogToConsole("§§4§l§f" + Translations.bot_DiscordBridge_canceled_sending); - LogDebugToConsole(e); - } - } - public void SendImage(string filePath, string? text = null) - { - if (!CanSendMessages()) - return; - - try - { - using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) - { - filePath = filePath[(filePath.IndexOf(Path.DirectorySeparatorChar) + 1)..]; - var messageBuilder = new DiscordMessageBuilder(); - - if (text is not null) - messageBuilder.WithContent(text); - - messageBuilder.AddFiles(new Dictionary() { { filePath, fs } }); - - discordBotClient!.SendMessageAsync(discordChannel, messageBuilder).Wait(Config.Message_Send_Timeout * 1000); - } - } - catch (Exception e) - { - LogToConsole("§§4§l§f" + Translations.bot_DiscordBridge_canceled_sending); - LogDebugToConsole(e); - } - } - - public void SendFile(FileStream fileStream) - { - if (!CanSendMessages()) - return; - - SendMessage(new DiscordMessageBuilder().AddFile(fileStream)); - } - - private bool CanSendMessages() - { - return discordBotClient is not null && discordChannel is not null && bridgeDirection != BridgeDirection.Minecraft; - } - - async Task MainAsync() - { - try - { - if (string.IsNullOrEmpty(Config.Token.Trim())) - { - LogToConsole(Translations.bot_DiscordBridge_missing_token); - UnloadBot(); - return; - } - - discordBotClient = new DiscordClient(new DiscordConfiguration() - { - Token = Config.Token.Trim(), - TokenType = TokenType.Bot, - AutoReconnect = true, - Intents = DiscordIntents.All, - MinimumLogLevel = Settings.Config.Logging.DebugMessages ? - (LogLevel.Trace | LogLevel.Information | LogLevel.Debug | LogLevel.Critical | LogLevel.Error | LogLevel.Warning) : LogLevel.None - }); - - try - { - await discordBotClient.GetGuildAsync(Config.GuildId); - } - catch (Exception e) - { - if (e is NotFoundException) - { - LogToConsole(string.Format(Translations.bot_DiscordBridge_guild_not_found, Config.GuildId)); - UnloadBot(); - return; - } - - LogDebugToConsole("Exception when trying to find the guild:"); - LogDebugToConsole(e); - } - - try - { - discordChannel = await discordBotClient.GetChannelAsync(Config.ChannelId); - } - catch (Exception e) - { - if (e is NotFoundException) - { - LogToConsole(string.Format(Translations.bot_DiscordBridge_channel_not_found, Config.ChannelId)); - UnloadBot(); - return; - } - - LogDebugToConsole("Exception when trying to find the channel:"); - LogDebugToConsole(e); - } - - discordBotClient.MessageCreated += async (source, e) => - { - if (e.Guild.Id != Config.GuildId) - return; - - if (e.Channel.Id != Config.ChannelId) - return; - - // Always ignore own messages to prevent loops - if (e.Author.Id == discordBotClient.CurrentUser.Id) - return; - - string message = e.Message.Content.Trim(); - - if (string.IsNullOrWhiteSpace(message)) - return; - - // Relay messages from other bots when configured, but never process commands from them. - // Skip relay when direction is Discord-only (Discord -> MC disabled). - if (e.Author.IsBot) - { - if (Config.Allow_Other_Bot_Messages && bridgeDirection != BridgeDirection.Discord) - SendText(message); - return; - } - - if (!Config.OwnersIds.Contains(e.Author.Id)) - return; - - if (bridgeDirection == BridgeDirection.Discord) - { - if (!message.StartsWith(".dscbridge")) - return; - } - - if (message.StartsWith(".")) - { - message = message[1..]; - await e.Message.CreateReactionAsync(DiscordEmoji.FromName(discordBotClient, ":gear:")); - - CmdResult result = new(); - PerformInternalCommand(message, ref result); - - await e.Message.DeleteOwnReactionAsync(DiscordEmoji.FromName(discordBotClient, ":gear:")); - await e.Message.CreateReactionAsync(DiscordEmoji.FromName(discordBotClient, ":white_check_mark:")); - await e.Message.RespondAsync($"{Translations.bot_DiscordBridge_command_executed}:\n```{result}```"); - } - else SendText(message); - }; - - discordBotClient.ComponentInteractionCreated += async (s, e) => - { - if (!(e.Id.Equals("accept_teleport") || e.Id.Equals("deny_teleport"))) - return; - - string result = e.Id.Equals("accept_teleport") ? "Accepted :white_check_mark:" : "Denied :x:"; - SendText(e.Id.Equals("accept_teleport") ? "/tpaccept" : "/tpdeny"); - await e.Interaction.CreateResponseAsync(InteractionResponseType.UpdateMessage, new DiscordInteractionResponseBuilder().WithContent(result)); - }; - - await discordBotClient.ConnectAsync(); - - await discordBotClient.SendMessageAsync(discordChannel, new DiscordEmbedBuilder - { - Description = Translations.bot_DiscordBridge_connected, - Color = new DiscordColor(0x00FF00) - }); - - IsConnected = true; - LogToConsole("§§2§l§f" + Translations.bot_DiscordBridge_connected); - await Task.Delay(-1); - } - catch (Exception e) - { - LogToConsole("§§4§l§f" + Translations.bot_DiscordBridge_unknown_error); - LogToConsole(e); - return; - } - } - } -} diff --git a/MinecraftClient/ChatBots/DiscordRpc.cs b/MinecraftClient/ChatBots/DiscordRpc.cs deleted file mode 100644 index e3ab09b36d..0000000000 --- a/MinecraftClient/ChatBots/DiscordRpc.cs +++ /dev/null @@ -1,727 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.Pipes; -using System.Threading; -using DiscordRPC; -using DiscordRPC.IO; -using DiscordRPC.Logging; -using MinecraftClient.Mapping; -using MinecraftClient.Scripting; -using Tomlet.Attributes; - -namespace MinecraftClient.ChatBots -{ - /// - /// Displays a Discord Rich Presence status showing the player's - /// current Minecraft session information (server, health, dimension, etc.). - /// Requires a Discord Application ID from https://discord.com/developers/applications - /// - public class DiscordRpc : ChatBot - { - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] - private const string BotName = "DiscordRpc"; - - public bool Enabled = false; - - [TomlInlineComment("$ChatBot.DiscordRpc.ApplicationId$")] - public string ApplicationId = string.Empty; - - [TomlInlineComment("$ChatBot.DiscordRpc.PresenceDetails$")] - public string PresenceDetails = "Playing on {server_host}:{server_port}"; - - [TomlInlineComment("$ChatBot.DiscordRpc.PresenceState$")] - public string PresenceState = "{dimension} - HP: {health}/{max_health}"; - - [TomlInlineComment("$ChatBot.DiscordRpc.LargeImageKey$")] - public string LargeImageKey = "mcc_icon"; - - [TomlInlineComment("$ChatBot.DiscordRpc.LargeImageText$")] - public string LargeImageText = "Minecraft Console Client"; - - [TomlInlineComment("$ChatBot.DiscordRpc.SmallImageKey$")] - public string SmallImageKey = string.Empty; - - [TomlInlineComment("$ChatBot.DiscordRpc.SmallImageText$")] - public string SmallImageText = string.Empty; - - [TomlInlineComment("$ChatBot.DiscordRpc.ShowServerAddress$")] - public bool ShowServerAddress = true; - - [TomlInlineComment("$ChatBot.DiscordRpc.ShowCoordinates$")] - public bool ShowCoordinates = true; - - [TomlInlineComment("$ChatBot.DiscordRpc.ShowHealth$")] - public bool ShowHealth = true; - - [TomlInlineComment("$ChatBot.DiscordRpc.ShowDimension$")] - public bool ShowDimension = true; - - [TomlInlineComment("$ChatBot.DiscordRpc.ShowGamemode$")] - public bool ShowGamemode = true; - - [TomlInlineComment("$ChatBot.DiscordRpc.ShowElapsedTime$")] - public bool ShowElapsedTime = true; - - [TomlInlineComment("$ChatBot.DiscordRpc.ShowPlayerCount$")] - public bool ShowPlayerCount = true; - - [TomlInlineComment("$ChatBot.DiscordRpc.UpdateIntervalSeconds$")] - public int UpdateIntervalSeconds = 10; - - public void OnSettingUpdate() - { - ApplicationId ??= string.Empty; - PresenceDetails ??= string.Empty; - PresenceState ??= string.Empty; - LargeImageKey ??= string.Empty; - LargeImageText ??= string.Empty; - SmallImageKey ??= string.Empty; - SmallImageText ??= string.Empty; - - if (UpdateIntervalSeconds < 1) - { - UpdateIntervalSeconds = 10; - LogToConsole(BotName, Translations.bot_DiscordRpc_invalid_interval); - } - } - } - - private DiscordRpcClient? _rpcClient; - private int _tickCounter; - private int _updateIntervalTicks; - private Timestamps? _sessionTimestamps; - private float _lastHealth; - - public override void Initialize() - { - if (string.IsNullOrWhiteSpace(Config.ApplicationId)) - { - LogToConsole(Translations.bot_DiscordRpc_missing_app_id); - UnloadBot(); - return; - } - - try - { - _rpcClient = OperatingSystem.IsLinux() - ? new DiscordRpcClient(Config.ApplicationId.Trim(), client: new DiscordRpcPipeClient()) - : new DiscordRpcClient(Config.ApplicationId.Trim()); - - _rpcClient.Logger = Settings.Config.Logging.DebugMessages - ? new ConsoleLogger(LogLevel.Trace) - : new ConsoleLogger(LogLevel.None); - - _rpcClient.OnReady += (_, e) => - { - LogToConsole(string.Format(Translations.bot_DiscordRpc_connected, e.User.Username)); - }; - - _rpcClient.OnConnectionFailed += (_, e) => - { - LogToConsole(string.Format(Translations.bot_DiscordRpc_connection_failed, e.FailedPipe)); - }; - - _rpcClient.Initialize(); - _updateIntervalTicks = Settings.DoubleToTick(Config.UpdateIntervalSeconds); - - LogToConsole(Translations.bot_DiscordRpc_initialized); - } - catch (Exception e) - { - LogToConsole(string.Format(Translations.bot_DiscordRpc_init_error, e.Message)); - LogDebugToConsole(e.StackTrace ?? string.Empty); - UnloadBot(); - } - } - - public override void OnUnload() - { - if (_rpcClient is { IsDisposed: false }) - { - _rpcClient.ClearPresence(); - _rpcClient.Dispose(); - } - - _rpcClient = null; - } - - public override void AfterGameJoined() - { - if (Config.ShowElapsedTime) - _sessionTimestamps = Timestamps.Now; - - _lastHealth = Handler.GetHealth(); - _tickCounter = 0; - SetPresence(); - } - - public override void Update() - { - _tickCounter++; - if (_tickCounter < _updateIntervalTicks) - return; - - _tickCounter = 0; - SetPresence(); - } - - public override void OnHealthUpdate(float health, int food) - { - _lastHealth = health; - } - - public override bool OnDisconnect(DisconnectReason reason, string message) - { - if (_rpcClient is { IsDisposed: false }) - _rpcClient.ClearPresence(); - - return false; - } - - private void SetPresence() - { - if (_rpcClient is null or { IsDisposed: true }) - return; - - try - { - string details = ReplacePlaceholders(Config.PresenceDetails); - string state = ReplacePlaceholders(Config.PresenceState); - - var presence = new RichPresence - { - Details = TruncateForDiscord(details, 128), - State = TruncateForDiscord(state, 128) - }; - - // Assets (images) - var assets = new Assets(); - bool hasAssets = false; - - if (!string.IsNullOrWhiteSpace(Config.LargeImageKey)) - { - assets.LargeImageKey = Config.LargeImageKey.Trim(); - assets.LargeImageText = TruncateForDiscord( - ReplacePlaceholders(Config.LargeImageText), 128); - hasAssets = true; - } - - if (!string.IsNullOrWhiteSpace(Config.SmallImageKey)) - { - assets.SmallImageKey = Config.SmallImageKey.Trim(); - assets.SmallImageText = TruncateForDiscord( - ReplacePlaceholders(Config.SmallImageText), 128); - hasAssets = true; - } - - if (hasAssets) - presence.Assets = assets; - - // Timestamps - if (Config.ShowElapsedTime && _sessionTimestamps is not null) - presence.Timestamps = _sessionTimestamps; - - // Player count as party - if (Config.ShowPlayerCount) - { - string[] onlinePlayers = GetOnlinePlayers(); - int playerCount = onlinePlayers.Length; - if (playerCount > 0) - { - presence.Party = new Party - { - ID = $"mcc_{GetServerHost()}_{GetServerPort()}", - Size = playerCount, - Max = playerCount - }; - } - } - - _rpcClient.SetPresence(presence); - } - catch (Exception e) - { - LogDebugToConsole(string.Format(Translations.bot_DiscordRpc_update_error, e.Message)); - } - } - - private string ReplacePlaceholders(string template) - { - if (string.IsNullOrEmpty(template)) - return string.Empty; - - string serverHost = Config.ShowServerAddress ? GetServerHost() : "Hidden"; - int serverPort = GetServerPort(); - string serverPortStr = Config.ShowServerAddress ? serverPort.ToString() : "****"; - string username = GetUsername(); - float health = Handler.GetHealth(); - int foodLevel = Handler.GetSaturation(); - Location location = GetCurrentLocation(); - string[] onlinePlayers = GetOnlinePlayers(); - int gamemode = GetGamemode(); - int protocolVersion = GetProtocolVersion(); - - string healthStr = Config.ShowHealth ? ((int)Math.Ceiling(health)).ToString() : "?"; - string maxHealthStr = Config.ShowHealth ? "20" : "?"; - string foodStr = Config.ShowHealth ? foodLevel.ToString() : "?"; - string xStr = Config.ShowCoordinates ? ((int)location.X).ToString() : "?"; - string yStr = Config.ShowCoordinates ? ((int)location.Y).ToString() : "?"; - string zStr = Config.ShowCoordinates ? ((int)location.Z).ToString() : "?"; - - string dimensionName = Config.ShowDimension ? "Unknown" : "Hidden"; - if (Config.ShowDimension) - { - try - { - var dim = World.GetDimension(); - dimensionName = dim.Name ?? "Unknown"; - - // Clean up the dimension name for display - if (dimensionName.StartsWith("minecraft:", StringComparison.Ordinal)) - dimensionName = dimensionName["minecraft:".Length..]; - - dimensionName = dimensionName switch - { - "overworld" => "Overworld", - "the_nether" => "The Nether", - "the_end" => "The End", - _ => dimensionName - }; - } - catch - { - // World may not be available - } - } - - string gamemodeStr = Config.ShowGamemode - ? gamemode switch - { - 0 => "Survival", - 1 => "Creative", - 2 => "Adventure", - 3 => "Spectator", - _ => "Unknown" - } - : "Hidden"; - - return template - .Replace("{server_host}", serverHost) - .Replace("{server_port}", serverPortStr) - .Replace("{username}", username) - .Replace("{health}", healthStr) - .Replace("{max_health}", maxHealthStr) - .Replace("{food}", foodStr) - .Replace("{dimension}", dimensionName) - .Replace("{gamemode}", gamemodeStr) - .Replace("{x}", xStr) - .Replace("{y}", yStr) - .Replace("{z}", zStr) - .Replace("{player_count}", onlinePlayers.Length.ToString()) - .Replace("{protocol}", protocolVersion.ToString()); - } - - private static string TruncateForDiscord(string value, int maxLength) - { - if (string.IsNullOrEmpty(value)) - return string.Empty; - - return value.Length <= maxLength ? value : value[..(maxLength - 3)] + "..."; - } - - /// - /// Flatpak Discord exposes the RPC socket under app/com.discordapp.Discord, - /// but the currently published DiscordRichPresence package does not probe that path. - /// - private sealed class DiscordRpcPipeClient : INamedPipeClient - { - private const string DiscordPipePrefix = "discord-ipc-"; - private const int MaximumPipeVariations = 10; - - private static readonly string[] s_unixPackageDirectories = - [ - // Official Discord clients - "app/com.discordapp.Discord", - "snap.discord", - - // Community desktop clients / wrappers - "app/dev.vencord.Vesktop", - ".flatpak/dev.vencord.Vesktop/xdg-run", - "app/org.equicord.equibop", - "app/io.github.equicord.equibop", - "app/xyz.armcord.ArmCord", - "app/io.github.spacingbat3.webcord" - ]; - - private readonly byte[] _buffer = new byte[PipeFrame.MAX_SIZE]; - private readonly Queue _frameQueue = new(); - private readonly Lock _frameQueueLock = new(); - private readonly Lock _streamLock = new(); - - private int _connectedPipe; - private NamedPipeClientStream? _stream; - private volatile bool _isClosed = true; - private volatile bool _isDisposed; - - public ILogger Logger { get; set; } = new NullLogger(); - - public bool IsConnected - { - get - { - if (_isClosed) - return false; - - lock (_streamLock) - return _stream is { IsConnected: true }; - } - } - - [Obsolete("The connected pipe is not neccessary information.")] - public int ConnectedPipe => _connectedPipe; - - public bool Connect(int pipe) - { - Logger.Trace("DiscordRpcPipeClient.Connect({0})", pipe); - - if (_isDisposed) - throw new ObjectDisposedException(nameof(DiscordRpcPipeClient)); - - if (pipe > 9) - throw new ArgumentOutOfRangeException(nameof(pipe), "Argument cannot be greater than 9"); - - int startPipe = pipe >= 0 ? pipe : 0; - - foreach (string pipeName in GetPipeCandidates(startPipe)) - { - if (AttemptConnection(pipeName)) - { - BeginReadStream(); - return true; - } - } - - return false; - } - - public bool ReadFrame(out PipeFrame frame) - { - if (_isDisposed) - throw new ObjectDisposedException(nameof(DiscordRpcPipeClient)); - - lock (_frameQueueLock) - { - if (_frameQueue.Count == 0) - { - frame = default; - return false; - } - - frame = _frameQueue.Dequeue(); - return true; - } - } - - public bool WriteFrame(PipeFrame frame) - { - if (_isDisposed) - throw new ObjectDisposedException(nameof(DiscordRpcPipeClient)); - - if (_isClosed || !IsConnected) - { - Logger.Error("Failed to write frame because the stream is closed"); - return false; - } - - try - { - frame.WriteStream(_stream); - return true; - } - catch (IOException io) - { - Logger.Error("Failed to write frame because of a IO Exception: {0}", io.Message); - } - catch (ObjectDisposedException) - { - Logger.Warning("Failed to write frame as the stream was already disposed"); - } - catch (InvalidOperationException) - { - Logger.Warning("Failed to write frame because of a invalid operation"); - } - - return false; - } - - public void Close() - { - if (_isClosed) - { - Logger.Warning("Tried to close a already closed pipe."); - return; - } - - try - { - lock (_streamLock) - { - if (_stream is not null) - { - try - { - _stream.Flush(); - _stream.Dispose(); - } - catch - { - } - - _stream = null; - _isClosed = true; - } - else - { - Logger.Warning("Stream was closed, but no stream was available to begin with!"); - } - } - } - catch (ObjectDisposedException) - { - Logger.Warning("Tried to dispose already disposed stream"); - } - finally - { - _isClosed = true; - } - } - - public void Dispose() - { - if (_isDisposed) - return; - - if (!_isClosed) - Close(); - - lock (_streamLock) - { - _stream?.Dispose(); - _stream = null; - } - - _isDisposed = true; - } - - private bool AttemptConnection(string pipeName) - { - if (_isDisposed) - throw new ObjectDisposedException(nameof(DiscordRpcPipeClient)); - - try - { - lock (_streamLock) - { - Logger.Info("Attempting to connect to {0}", pipeName); - _stream = new NamedPipeClientStream(".", pipeName, PipeDirection.InOut, PipeOptions.Asynchronous); - _stream.Connect(0); - - Logger.Trace("Waiting for connection..."); - while (!_stream.IsConnected) - Thread.Sleep(10); - } - - Logger.Info("Connected to {0}", pipeName); - _connectedPipe = int.Parse(pipeName[(pipeName.LastIndexOf('-') + 1)..], System.Globalization.CultureInfo.InvariantCulture); - _isClosed = false; - } - catch (Exception e) - { - Logger.Error("Failed connection to {0}. {1}", pipeName, e.Message); - Close(); - } - - Logger.Trace("Done. Result: {0}", _isClosed); - return !_isClosed; - } - - private void BeginReadStream() - { - if (_isClosed) - return; - - try - { - lock (_streamLock) - { - if (_stream is not { IsConnected: true }) - return; - - Logger.Trace("Beginning Read of {0} bytes", _buffer.Length); - _stream.BeginRead(_buffer, 0, _buffer.Length, EndReadStream, _stream.IsConnected); - } - } - catch (ObjectDisposedException) - { - Logger.Warning("Attempted to start reading from a disposed pipe"); - } - catch (InvalidOperationException) - { - Logger.Warning("Attempted to start reading from a closed pipe"); - } - catch (Exception e) - { - Logger.Error("An exception occurred while starting to read a stream: {0}", e.Message); - Logger.Error(e.StackTrace); - } - } - - private void EndReadStream(IAsyncResult callback) - { - Logger.Trace("Ending Read"); - int bytes; - - try - { - lock (_streamLock) - { - if (_stream is not { IsConnected: true }) - return; - - bytes = _stream.EndRead(callback); - } - } - catch (IOException) - { - Logger.Warning("Attempted to end reading from a closed pipe"); - return; - } - catch (NullReferenceException) - { - Logger.Warning("Attempted to read from a null pipe"); - return; - } - catch (ObjectDisposedException) - { - Logger.Warning("Attempted to end reading from a disposed pipe"); - return; - } - catch (Exception e) - { - Logger.Error("An exception occurred while ending a read of a stream: {0}", e.Message); - Logger.Error(e.StackTrace); - return; - } - - Logger.Trace("Read {0} bytes", bytes); - - if (bytes > 0) - { - using MemoryStream memory = new(_buffer, 0, bytes); - try - { - PipeFrame frame = new(); - if (frame.ReadStream(memory)) - { - Logger.Trace("Read a frame: {0}", frame.Opcode); - lock (_frameQueueLock) - _frameQueue.Enqueue(frame); - } - else - { - Logger.Error("Pipe failed to read from the data received by the stream."); - Close(); - } - } - catch (Exception e) - { - Logger.Error("An exception has occurred while trying to parse the pipe data: {0}", e.Message); - Close(); - } - } - else - { - Logger.Error("Empty frame was read on {0}, aborting.", Environment.OSVersion); - Close(); - } - - if (!_isClosed && IsConnected) - { - Logger.Trace("Starting another read"); - BeginReadStream(); - } - } - - private static IEnumerable GetPipeCandidates(int startPipe) - { - if (OperatingSystem.IsWindows()) - { - for (int i = startPipe; i < MaximumPipeVariations; i++) - yield return $"{DiscordPipePrefix}{i}"; - - yield break; - } - - foreach (string runtimeDir in GetUnixRuntimeDirectories()) - { - for (int index = startPipe; index < MaximumPipeVariations; index++) - { - string pipeFileName = $"{DiscordPipePrefix}{index}"; - - foreach (string packageDirectory in s_unixPackageDirectories) - { - string packagePipe = Path.Combine(runtimeDir, packageDirectory, pipeFileName); - if (File.Exists(packagePipe)) - yield return packagePipe; - } - - string defaultPipe = Path.Combine(runtimeDir, pipeFileName); - if (File.Exists(defaultPipe)) - yield return defaultPipe; - - foreach (string packageDirectory in s_unixPackageDirectories) - { - string packagePipe = Path.Combine(runtimeDir, packageDirectory, pipeFileName); - if (!File.Exists(packagePipe)) - yield return packagePipe; - } - - if (!File.Exists(defaultPipe)) - yield return defaultPipe; - } - } - } - - private static IEnumerable GetUnixRuntimeDirectories() - { - HashSet yielded = new(StringComparer.Ordinal); - - string[] candidates = - [ - Environment.GetEnvironmentVariable("XDG_RUNTIME_DIR") ?? string.Empty, - Environment.GetEnvironmentVariable("TMPDIR") ?? string.Empty, - Environment.GetEnvironmentVariable("TMP") ?? string.Empty, - Environment.GetEnvironmentVariable("TEMP") ?? string.Empty, - Path.GetTempPath(), - "/tmp" - ]; - - foreach (string candidate in candidates) - { - if (string.IsNullOrWhiteSpace(candidate)) - continue; - - string normalized = candidate.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); - if (yielded.Add(normalized)) - yield return normalized; - } - } - } - } -} diff --git a/MinecraftClient/ChatBots/Farmer.cs b/MinecraftClient/ChatBots/Farmer.cs deleted file mode 100644 index fe33176a5c..0000000000 --- a/MinecraftClient/ChatBots/Farmer.cs +++ /dev/null @@ -1,911 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Threading; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.CommandHandler.Patch; -using MinecraftClient.Commands; -using MinecraftClient.Inventory; -using MinecraftClient.Mapping; -using MinecraftClient.Protocol.Handlers; -using MinecraftClient.Scripting; -using Tomlet.Attributes; - -namespace MinecraftClient.ChatBots -{ - public class Farmer : ChatBot - { - public const string CommandName = "farmer"; - - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] private const string BotName = "Farmer"; - - public bool Enabled = false; - - [TomlInlineComment("$ChatBot.Farmer.Delay_Between_Tasks$")] - public double Delay_Between_Tasks = 1.0; - - public void OnSettingUpdate() - { - if (Delay_Between_Tasks < 1.0) - Delay_Between_Tasks = 1.0; - } - } - - private enum State - { - SearchingForCropsToBreak = 0, - SearchingForFarmlandToPlant, - BoneMealingCrops, - CollectingItems - } - - public enum CropType - { - Beetroot, - Carrot, - Melon, - NetherWart, - Pumpkin, - Potato, - Wheat - } - - private State state = State.SearchingForCropsToBreak; - private CropType cropType = CropType.Wheat; - private int farmingRadius = 30; - private bool running = false; - private bool allowUnsafe = false; - private bool allowTeleport = false; - private bool debugEnabled = false; - - private int Delay_Between_Tasks_Millisecond => (int)Math.Round(Config.Delay_Between_Tasks * 1000); - - private const string commandDescription = - "farmer [radius:] [unsafe:] [teleport:] [debug:]|stop>"; - - public override void Initialize() - { - if (GetProtocolVersion() < Protocol18Handler.MC_1_8_Version) - { - LogToConsole(Translations.bot_farmer_not_implemented); - return; - } - - if (!GetTerrainEnabled()) - { - LogToConsole(Translations.bot_farmer_needs_terrain); - return; - } - - if (!GetInventoryEnabled()) - { - LogToConsole(Translations.bot_farmer_needs_inventory); - return; - } - - McClient.dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CommandName) - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - ) - ); - - McClient.dispatcher.Register(l => l.Literal(CommandName) - .Then(l => l.Literal("stop") - .Executes(r => OnCommandStop(r.Source))) - .Then(l => l.Literal("start") - .Then(l => l.Argument("CropType", MccArguments.FarmerCropType()) - .Executes(r => OnCommandStart(r.Source, MccArguments.GetFarmerCropType(r, "CropType"), null)) - .Then(l => l.Argument("OtherArgs", Arguments.GreedyString()) - .Executes(r => OnCommandStart(r.Source, MccArguments.GetFarmerCropType(r, "CropType"), - Arguments.GetString(r, "OtherArgs")))))) - .Then(l => l.Literal("_help") - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - .Redirect(McClient.dispatcher.GetRoot().GetChild("help").GetChild(CommandName))) - ); - } - - public override void OnUnload() - { - running = false; - BotMovementLock.Instance?.UnLock("Farmer"); - McClient.dispatcher.Unregister(CommandName); - McClient.dispatcher.GetRoot().GetChild("help").RemoveChild(CommandName); - } - - private int OnCommandHelp(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => Translations.bot_farmer_desc + ": " + commandDescription - + '\n' + McClient.dispatcher.GetAllUsageString(CommandName, false), -#pragma warning restore format // @formatter:on - }); - } - - private int OnCommandStop(CmdResult r) - { - if (!running) - { - return r.SetAndReturn(CmdResult.Status.Fail, Translations.bot_farmer_already_stopped); - } - else - { - running = false; - return r.SetAndReturn(CmdResult.Status.Done, Translations.bot_farmer_stopping); - } - } - - private int OnCommandStart(CmdResult r, CropType whatToFarm, string? otherArgs) - { - if (running) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.bot_farmer_already_running); - - if (!IsCropAvailableForProtocol(whatToFarm, GetProtocolVersion())) - return r.SetAndReturn(CmdResult.Status.Fail, - string.Format(Translations.bot_farmer_crop_unavailable, whatToFarm, "1.9")); - - var movementLock = BotMovementLock.Instance; - if (movementLock is { IsLocked: true }) - return r.SetAndReturn(CmdResult.Status.Fail, - string.Format(Translations.bot_common_movement_lock_held, "Farmer", movementLock.LockedBy)); - - var radius = 30; - - state = State.SearchingForFarmlandToPlant; - cropType = whatToFarm; - allowUnsafe = false; - allowTeleport = false; - debugEnabled = false; - - if (!string.IsNullOrWhiteSpace(otherArgs)) - { - var args = otherArgs.ToLower().Split(' ', StringSplitOptions.TrimEntries); - foreach (var currentArg in args) - { - if (!currentArg.Contains(':')) - { - LogToConsole( - $"§§6§1§0{string.Format(Translations.bot_farmer_warining_invalid_parameter, currentArg)}"); - continue; - } - - var parts = currentArg.Split(":", StringSplitOptions.TrimEntries); - - if (parts.Length != 2) - { - LogToConsole( - $"§§6§1§0{string.Format(Translations.bot_farmer_warining_invalid_parameter, currentArg)}"); - continue; - } - - switch (parts[0]) - { - case "r": - case "radius": - if (!int.TryParse(parts[1], NumberStyles.Any, CultureInfo.CurrentCulture, out radius)) - LogToConsole($"§§6§1§0{Translations.bot_farmer_invalid_radius}"); - - if (radius <= 0) - { - LogToConsole($"§§6§1§0{Translations.bot_farmer_invalid_radius}"); - radius = 30; - } - - break; - - case "f": - case "unsafe": - if (allowUnsafe) - break; - - if (parts[1].Equals("true") || parts[1].Equals("1")) - { - LogToConsole($"§§6§1§0{Translations.bot_farmer_warining_force_unsafe}"); - allowUnsafe = true; - } - else allowUnsafe = false; - - break; - - case "t": - case "teleport": - if (allowTeleport) - break; - - if (parts[1].Equals("true") || parts[1].Equals("1")) - { - LogToConsole($"§§4§1§f{Translations.bot_farmer_warining_allow_teleport}"); - allowTeleport = true; - } - else allowTeleport = false; - - break; - - case "d": - case "debug": - if (debugEnabled) - break; - - if (parts[1].Equals("true") || parts[1].Equals("1")) - { - LogToConsole("Debug enabled!"); - debugEnabled = true; - } - else debugEnabled = false; - - break; - } - } - } - - farmingRadius = radius; - running = true; - new Thread(() => MainProcess()).Start(); - - return r.SetAndReturn(CmdResult.Status.Done); - } - - public override void AfterGameJoined() - { - BotMovementLock.Instance?.UnLock("Farmer"); - running = false; - } - - public override bool OnDisconnect(DisconnectReason reason, string message) - { - BotMovementLock.Instance?.UnLock("Farmer"); - running = false; - return true; - } - - private void MainProcess() - { - var movementLock = BotMovementLock.Instance; - switch (movementLock) - { - case { IsLocked: false }: - if (!movementLock.Lock("Farmer")) - { - running = false; - LogToConsole($"§§6§1§0Farmer bot failed to obtain the movement lock for some reason!"); - LogToConsole($"§§6§1§0Disable other bots who have movement mechanics, and try again!"); - return; - } - - LogDebug($"Locked the movement for other bots!"); - break; - case { IsLocked: true }: - running = false; - LogToConsole($"§§6§1§0Farmer bot failed to obtain the movement lock for some reason!"); - LogToConsole($"§§6§1§0Disable other bots who have movement mechanics, and try again!"); - return; - } - - LogToConsole($"§§2§1§f{Translations.bot_farmer_started}"); - LogToConsole($"§§2§1§f {Translations.bot_farmer_crop_type}: {cropType}"); - LogToConsole($"§§2§1§f {Translations.bot_farmer_radius}: {farmingRadius}"); - - var itemTypes = new List - { - GetSeedItemTypeForCropType(cropType), - GetCropItemTypeForCropType(cropType) - }; - itemTypes = itemTypes.Distinct().ToList(); - - while (running) - { - // Don't do anything if the bot is currently eating, we wait for 1 second - if (AutoEat.Eating) - { - LogDebug("Eating..."); - Thread.Sleep(Delay_Between_Tasks_Millisecond); - continue; - } - - switch (state) - { - case State.SearchingForFarmlandToPlant: - LogDebug("Looking for farmland..."); - - var cropTypeToPlant = GetSeedItemTypeForCropType(cropType); - - // If we don't have any seeds on our hot bar, skip this step and try collecting some - if (!SwitchToItem(cropTypeToPlant)) - { - LogDebug("No seeds, trying to find some crops to break"); - state = State.SearchingForCropsToBreak; - Thread.Sleep(Delay_Between_Tasks_Millisecond); - continue; - } - - var farmlandToPlantOn = FindEmptyFarmland(farmingRadius); - - if (farmlandToPlantOn.Count == 0) - { - LogDebug("Could not find any farmland, trying to find some crops to break"); - state = State.SearchingForCropsToBreak; - Thread.Sleep(Delay_Between_Tasks_Millisecond); - continue; - } - - var i = 0; - foreach (var location in farmlandToPlantOn.TakeWhile(location => running)) - { - // Check only every second iteration, minor optimization xD - if (i % 2 == 0) - { - if (!HasItemOfTypeInInventory(cropTypeToPlant)) - { - LogDebug("Ran out of seeds, looking for crops to break..."); - state = State.SearchingForCropsToBreak; - Thread.Sleep(Delay_Between_Tasks_Millisecond); - continue; - } - } - - var yValue = Math.Floor(location.Y) + 1; - - // TODO: Figure out why this is not working. - // Why we need this: sometimes the server kicks the player for "invalid movement" packets. - /*if (cropType == CropType.NetherWart) - yValue = (double)(Math.Floor(location.Y) - 1.0) + (double)0.87500;*/ - - var location2 = new Location(Math.Floor(location.X) + 0.5, yValue, - Math.Floor(location.Z) + 0.5); - - if (WaitForMoveToLocation(location2)) - { - LogDebug("Moving to: " + location2); - - // Stop if we do not have any more seeds left - if (!SwitchToItem(GetSeedItemTypeForCropType(cropType))) - { - LogDebug("No seeds, trying to find some crops to break"); - break; - } - - var loc = new Location(Math.Floor(location.X), Math.Floor(location.Y), - Math.Floor(location.Z)); - LogDebug("Sending placeblock to: " + loc); - - SendPlaceBlock(loc, Direction.Up, lookAtBlock: true); - Thread.Sleep(300); - } - else LogDebug("Can't move to: " + location2); - - i++; - } - - LogDebug("Finished planting crops!"); - state = State.SearchingForCropsToBreak; - break; - - case State.SearchingForCropsToBreak: - LogDebug("Searching for crops to break..."); - - var cropsToCollect = findCrops(farmingRadius, cropType, true); - - if (cropsToCollect.Count == 0) - { - LogToConsole("No crops to break, trying to bone meal un-grown ones"); - state = State.BoneMealingCrops; - Thread.Sleep(Delay_Between_Tasks_Millisecond); - continue; - } - - // Switch to an axe for faster breaking if the bot has one in his inventory - if (cropType is CropType.Melon or CropType.Pumpkin) - { - // Start from Diamond axe, if not found, try a tier lower axe - var switched = SwitchToItem(ItemType.DiamondAxe); - - if (!switched) - switched = SwitchToItem(ItemType.IronAxe); - - if (!switched) - switched = SwitchToItem(ItemType.GoldenAxe); - - if (!switched) - SwitchToItem(ItemType.StoneAxe); - } - - foreach (var location in cropsToCollect.TakeWhile(location => running)) - { - // God damn C# rounding it to 0.94 - // This will be needed when bot bone meals carrots or potatoes which are at the first stage of growth, - // because sometimes the bot walks over crops and breaks them - // TODO: Figure out a fix - // new Location(Math.Floor(location.X) + 0.5, (double)((location.Y - 1) + (double)0.93750), Math.Floor(location.Z) + 0.5) - - if (WaitForMoveToLocation(location)) - WaitForDigBlock(location); - - // Allow some time to pickup the item - Thread.Sleep(cropType is CropType.Melon or CropType.Pumpkin ? 400 : 200); - } - - LogDebug("Finished breaking crops!"); - state = State.BoneMealingCrops; - break; - - case State.BoneMealingCrops: - // Can't be bone mealed - if (cropType == CropType.NetherWart) - { - state = State.SearchingForFarmlandToPlant; - Thread.Sleep(Delay_Between_Tasks_Millisecond); - continue; - } - - // If we don't have any bone meal on our hot bar, skip this step - if (!SwitchToItem(ItemType.BoneMeal)) - { - LogDebug("No bone meal, searching for some farmland to plant seeds on"); - state = State.SearchingForFarmlandToPlant; - Thread.Sleep(Delay_Between_Tasks_Millisecond); - continue; - } - - var cropsToBonemeal = findCrops(farmingRadius, cropType, false); - - if (cropsToBonemeal.Count == 0) - { - LogDebug("No crops to bone meal, searching for farmland to plant seeds on"); - state = State.SearchingForFarmlandToPlant; - Thread.Sleep(Delay_Between_Tasks_Millisecond); - continue; - } - - var i2 = 0; - foreach (var location in cropsToBonemeal.TakeWhile(location => running)) - { - // Check only every second iteration, minor optimization xD - if (i2 % 2 == 0) - { - if (!HasItemOfTypeInInventory(ItemType.BoneMeal)) - { - LogDebug("Ran out of Bone Meal, looking for farmland to plant on..."); - state = State.SearchingForFarmlandToPlant; - Thread.Sleep(Delay_Between_Tasks_Millisecond); - continue; - } - } - - if (WaitForMoveToLocation(location)) - { - // Stop if we do not have any more bone meal left - if (!SwitchToItem(ItemType.BoneMeal)) - { - LogDebug("No bone meal, searching for some farmland to plant seeds on..."); - break; - } - - var location2 = new Location(Math.Floor(location.X) + 0.5, location.Y, - Math.Floor(location.Z) + 0.5); - LogDebug("Trying to bone meal: " + location2); - - // Send like 4 bone meal attempts, it should do the job with 2-3, but sometimes doesn't do - for (var boneMealTimes = 0; - boneMealTimes < (cropType == CropType.Beetroot ? 6 : 5); - boneMealTimes++) - { - // TODO: Do a check if the carrot/potato is on the first growth stage - // if so, use: new Location(location.X, (double)(location.Y - 1) + (double)0.93750, location.Z) - SendPlaceBlock(location2, Direction.Down, lookAtBlock: true); - } - - Thread.Sleep(100); - } - - i2++; - } - - LogDebug("Finished bone mealing crops!"); - state = State.CollectingItems; - break; - - case State.CollectingItems: - LogDebug("Searching for items to collect..."); - - var currentLocation = GetCurrentLocation(); - var items = GetEntities() - .Where(x => - x.Value.Type == EntityType.Item && - x.Value.Location.Distance(currentLocation) <= farmingRadius && - itemTypes.Contains(x.Value.Item.Type)) - .Select(x => x.Value) - .ToList(); - items = items.OrderBy(x => x.Location.Distance(currentLocation)).ToList(); - - if (items.Any()) - { - LogDebug("Collecting items..."); - - foreach (var entity in items.TakeWhile(entity => running)) - WaitForMoveToLocation(entity.Location); - - LogDebug("Finished collecting items!"); - } - else LogDebug("No items to collect!"); - - state = State.SearchingForFarmlandToPlant; - break; - } - - LogDebug($"Waiting for {Config.Delay_Between_Tasks:0.00} seconds for next cycle."); - Thread.Sleep(Delay_Between_Tasks_Millisecond); - } - - movementLock?.UnLock("Farmer"); - LogDebug($"Unlocked the movement for other bots!"); - LogToConsole(Translations.bot_farmer_stopped); - } - - private static Material GetMaterialForCropType(CropType type) - { - return type switch - { - CropType.Beetroot => Material.Beetroots, - CropType.Carrot => Material.Carrots, - CropType.Melon => Material.Melon, - CropType.NetherWart => Material.NetherWart, - CropType.Pumpkin => Material.Pumpkin, - CropType.Potato => Material.Potatoes, - CropType.Wheat => Material.Wheat, - _ => throw new Exception("Material type for " + type.GetType().Name + " has not been mapped!") - }; - } - - private static ItemType GetSeedItemTypeForCropType(CropType type) - { - return type switch - { - CropType.Beetroot => ItemType.BeetrootSeeds, - CropType.Carrot => ItemType.Carrot, - CropType.Melon => ItemType.MelonSeeds, - CropType.NetherWart => ItemType.NetherWart, - CropType.Pumpkin => ItemType.PumpkinSeeds, - CropType.Potato => ItemType.Potato, - CropType.Wheat => ItemType.WheatSeeds, - _ => throw new Exception("Seed type for " + type.GetType().Name + " has not been mapped!") - }; - } - - private static ItemType GetCropItemTypeForCropType(CropType type) - { - return type switch - { - CropType.Beetroot => ItemType.Beetroot, - CropType.Carrot => ItemType.Carrot, - CropType.Melon => ItemType.Melon, - CropType.NetherWart => ItemType.NetherWart, - CropType.Pumpkin => ItemType.Pumpkin, - CropType.Potato => ItemType.Potato, - CropType.Wheat => ItemType.Wheat, - _ => throw new Exception("Item type for " + type.GetType().Name + " has not been mapped!") - }; - } - - private static bool IsCropAvailableForProtocol(CropType type, int protocolVersion) - { - return type switch - { - CropType.Beetroot => protocolVersion >= Protocol18Handler.MC_1_9_Version, - _ => true - }; - } - - private List FindEmptyFarmland(int radius) - { - return GetWorld() - .FindBlock(GetCurrentLocation(), - cropType == CropType.NetherWart ? Material.SoulSand : Material.Farmland, radius) - .Where(location => GetWorld().GetBlock(new Location(location.X, location.Y + 1, location.Z)).Type == - Material.Air) - .ToList(); - } - - private List findCrops(int radius, CropType cropType, bool fullyGrown) - { - var material = GetMaterialForCropType(cropType); - - // A bit of a hack to enable bone mealing melon and pumpkin stems - if (!fullyGrown && cropType is CropType.Melon or CropType.Pumpkin) - material = cropType == CropType.Melon ? Material.MelonStem : Material.PumpkinStem; - - return GetWorld() - .FindBlock(GetCurrentLocation(), material, radius) - .Where(location => - { - if (fullyGrown && material is Material.Melon or Material.Pumpkin) - return true; - - var isFullyGrown = IsCropFullyGrown(GetWorld().GetBlock(location), cropType, location); - return fullyGrown ? isFullyGrown : !isFullyGrown; - }) - .ToList(); - } - - private bool IsCropFullyGrown(Block block, CropType cropType, Location? location = null) - { - var protocolVersion = GetProtocolVersion(); - - if (protocolVersion < Protocol18Handler.MC_1_13_Version) - return IsLegacyCropFullyGrown(block, cropType, location); - - switch (cropType) - { - case CropType.Beetroot: - switch (protocolVersion) - { - case Protocol18Handler.MC_1_20_Version when block.BlockId == 12371: - case Protocol18Handler.MC_1_19_4_Version when block.BlockId == 12356: - case Protocol18Handler.MC_1_19_3_Version when block.BlockId == 11887: - case >= Protocol18Handler.MC_1_19_Version and <= Protocol18Handler.MC_1_19_2_Version - when block.BlockId == 10103: - case >= Protocol18Handler.MC_1_17_Version and <= Protocol18Handler.MC_1_18_2_Version - when block.BlockId == 9472: - case >= Protocol18Handler.MC_1_16_Version and <= Protocol18Handler.MC_1_16_5_Version - when block.BlockId == 9226: - case >= Protocol18Handler.MC_1_14_Version and <= Protocol18Handler.MC_1_15_2_Version - when block.BlockId == 8686: - case >= Protocol18Handler.MC_1_13_Version and < Protocol18Handler.MC_1_14_Version - when block.BlockId == 8162: - return true; - } - - break; - - case CropType.Carrot: - switch (protocolVersion) - { - case Protocol18Handler.MC_1_20_Version when block.BlockId == 8602: - case Protocol18Handler.MC_1_19_4_Version when block.BlockId == 8598: - case Protocol18Handler.MC_1_19_3_Version when block.BlockId == 8370: - case >= Protocol18Handler.MC_1_19_Version and <= Protocol18Handler.MC_1_19_2_Version - when block.BlockId == 6930: - case >= Protocol18Handler.MC_1_17_Version and <= Protocol18Handler.MC_1_18_2_Version - when block.BlockId == 6543: - case >= Protocol18Handler.MC_1_16_Version and <= Protocol18Handler.MC_1_16_5_Version - when block.BlockId == 6341: - case >= Protocol18Handler.MC_1_14_Version and <= Protocol18Handler.MC_1_15_2_Version - when block.BlockId == 5801: - case >= Protocol18Handler.MC_1_13_Version and < Protocol18Handler.MC_1_14_Version - when block.BlockId == 5295: - return true; - } - - break; - - // Checkin for stems and attached stems instead of Melons themselves - case CropType.Melon: - switch (protocolVersion) - { - case Protocol18Handler.MC_1_20_Version when block.BlockId is 6836 or 6820: - case Protocol18Handler.MC_1_19_4_Version when block.BlockId is 6808 or 6606: - case Protocol18Handler.MC_1_19_3_Version when block.BlockId is 6582 or 6832: - case >= Protocol18Handler.MC_1_19_Version and <= Protocol18Handler.MC_1_19_2_Version - when block.BlockId is 5166 or 5150: - case >= Protocol18Handler.MC_1_17_Version and <= Protocol18Handler.MC_1_18_2_Version - when block.BlockId is 4860 or 4844: - case >= Protocol18Handler.MC_1_16_Version and <= Protocol18Handler.MC_1_16_5_Version - when block.BlockId is 4791 or 4775: - case >= Protocol18Handler.MC_1_14_Version and <= Protocol18Handler.MC_1_15_2_Version - when block.BlockId is 4771 or 4755: - case >= Protocol18Handler.MC_1_13_Version and < Protocol18Handler.MC_1_14_Version - when block.BlockId is 4268 or 4252: - return true; - } - - break; - - case CropType.NetherWart: - switch (protocolVersion) - { - case Protocol18Handler.MC_1_20_Version when block.BlockId == 7388: - case Protocol18Handler.MC_1_19_4_Version when block.BlockId == 7384: - case Protocol18Handler.MC_1_19_3_Version when block.BlockId == 7158: - case >= Protocol18Handler.MC_1_19_Version and <= Protocol18Handler.MC_1_19_2_Version - when block.BlockId == 5718: - case >= Protocol18Handler.MC_1_17_Version and <= Protocol18Handler.MC_1_18_2_Version - when block.BlockId == 5332: - case >= Protocol18Handler.MC_1_16_Version and <= Protocol18Handler.MC_1_16_5_Version - when block.BlockId == 5135: - case >= Protocol18Handler.MC_1_14_Version and <= Protocol18Handler.MC_1_15_2_Version - when block.BlockId == 5115: - case >= Protocol18Handler.MC_1_13_Version and < Protocol18Handler.MC_1_14_Version - when block.BlockId == 4612: - return true; - } - - break; - - // Checkin for stems and attached stems instead of Pumpkins themselves - case CropType.Pumpkin: - switch (protocolVersion) - { - case Protocol18Handler.MC_1_20_Version when block.BlockId is 5849 or 6816: - case Protocol18Handler.MC_1_19_4_Version when block.BlockId is 5845 or 6824: - case Protocol18Handler.MC_1_19_3_Version when block.BlockId is 5683 or 6598: - case >= Protocol18Handler.MC_1_19_Version and <= Protocol18Handler.MC_1_19_2_Version - when block.BlockId is 5158 or 5146: - case >= Protocol18Handler.MC_1_17_Version and <= Protocol18Handler.MC_1_18_2_Version - when block.BlockId is 4852 or 4840: - case >= Protocol18Handler.MC_1_16_Version and <= Protocol18Handler.MC_1_16_5_Version - when block.BlockId is 4783 or 4771: - case >= Protocol18Handler.MC_1_14_Version and <= Protocol18Handler.MC_1_15_2_Version - when block.BlockId is 4763 or 4751: - case >= Protocol18Handler.MC_1_13_Version and < Protocol18Handler.MC_1_14_Version - when block.BlockId is 4260 or 4248: - return true; - } - - break; - - case CropType.Potato: - switch (protocolVersion) - { - case Protocol18Handler.MC_1_20_Version when block.BlockId == 8610: - case Protocol18Handler.MC_1_19_4_Version when block.BlockId == 8606: - case Protocol18Handler.MC_1_19_3_Version when block.BlockId == 8378: - case >= Protocol18Handler.MC_1_19_Version and <= Protocol18Handler.MC_1_19_2_Version - when block.BlockId == 6938: - case >= Protocol18Handler.MC_1_17_Version and <= Protocol18Handler.MC_1_18_2_Version - when block.BlockId == 6551: - case >= Protocol18Handler.MC_1_16_Version and <= Protocol18Handler.MC_1_16_5_Version - when block.BlockId == 6349: - case >= Protocol18Handler.MC_1_14_Version and <= Protocol18Handler.MC_1_15_2_Version - when block.BlockId == 5809: - case >= Protocol18Handler.MC_1_13_Version and < Protocol18Handler.MC_1_14_Version - when block.BlockId == 5303: - return true; - } - - break; - - case CropType.Wheat: - switch (protocolVersion) - { - case Protocol18Handler.MC_1_20_Version when block.BlockId == 4285: - case Protocol18Handler.MC_1_19_4_Version when block.BlockId == 4281: - case Protocol18Handler.MC_1_19_3_Version when block.BlockId == 4233: - case >= Protocol18Handler.MC_1_19_Version and <= Protocol18Handler.MC_1_19_2_Version - when block.BlockId == 3619: - case >= Protocol18Handler.MC_1_17_Version and <= Protocol18Handler.MC_1_18_2_Version - when block.BlockId == 3421: - case >= Protocol18Handler.MC_1_16_Version and <= Protocol18Handler.MC_1_16_5_Version - when block.BlockId == 3364: - case >= Protocol18Handler.MC_1_14_Version and <= Protocol18Handler.MC_1_15_2_Version - when block.BlockId == 3362: - case >= Protocol18Handler.MC_1_13_Version and < Protocol18Handler.MC_1_14_Version - when block.BlockId == 3059: - return true; - } - - break; - } - - return false; - } - - private bool IsLegacyCropFullyGrown(Block block, CropType cropType, Location? location) - { - return cropType switch - { - CropType.Beetroot => block.BlockId == 207 && block.BlockMeta >= 3, - CropType.Carrot => block.BlockId == 141 && block.BlockMeta >= 7, - CropType.Melon => block.BlockId == 105 - && (block.BlockMeta >= 7 || HasAdjacentBlock(location, Material.Melon)), - CropType.NetherWart => block.BlockId == 115 && block.BlockMeta >= 3, - CropType.Pumpkin => block.BlockId == 104 - && (block.BlockMeta >= 7 || HasAdjacentBlock(location, Material.Pumpkin)), - CropType.Potato => block.BlockId == 142 && block.BlockMeta >= 7, - CropType.Wheat => block.BlockId == 59 && block.BlockMeta >= 7, - _ => false - }; - } - - private bool HasAdjacentBlock(Location? location, Material material) - { - if (location is not Location stemLocation) - return false; - - var world = GetWorld(); - int x = (int)Math.Floor(stemLocation.X); - int y = (int)Math.Floor(stemLocation.Y); - int z = (int)Math.Floor(stemLocation.Z); - - Location[] adjacentLocations = - [ - new(x + 1, y, z), - new(x - 1, y, z), - new(x, y, z + 1), - new(x, y, z - 1) - ]; - - return adjacentLocations.Any(adjacentLocation => world.GetBlock(adjacentLocation).Type == material); - } - - // Yoinked from ReinforceZwei's AutoTree and adapted to search the whole of inventory in additon to the hotbar - private bool SwitchToItem(ItemType itemType) - { - var playerInventory = GetPlayerInventory(); - - if (playerInventory.Items.TryGetValue(GetCurrentSlot() - 36, out var value) && value.Type == itemType) - return true; // Already selected - - // Search the full inventory - var fullInventorySearch = new List(playerInventory.SearchItem(itemType)); - - // Search for the seed in the hot bar - var hotBarSearch = fullInventorySearch.Where(slot => slot is >= 36 and <= 44).ToList(); - - if (hotBarSearch.Count > 0) - { - ChangeSlot((short)(hotBarSearch[0] - 36)); - return true; - } - - if (fullInventorySearch.Count == 0) - return false; - - var movingHelper = new ItemMovingHelper(playerInventory, Handler); - movingHelper.Swap(fullInventorySearch[0], 36); - ChangeSlot(0); - - return true; - } - - // Yoinked from Daenges's Sugarcane Farmer - private bool WaitForMoveToLocation(Location pos, float tolerance = 2f) - { - if (MoveToLocation(location: pos, allowUnsafe: allowUnsafe, allowDirectTeleport: allowTeleport)) - { - LogDebug("Moving to: " + pos); - - while (GetCurrentLocation().Distance(pos) > tolerance) - Thread.Sleep(200); - - return true; - } - else LogDebug("Can't move to: " + pos); - - return false; - } - - // Yoinked from Daenges's Sugarcane Farmer - private bool WaitForDigBlock(Location block, int digTimeout = 1000) - { - if (!DigBlock(block.ToFloor(), Direction.Down)) return false; - short i = 0; // Maximum wait time of 10 sec. - while (GetWorld().GetBlock(block).Type != Material.Air && i <= digTimeout) - { - Thread.Sleep(100); - i++; - } - - return i <= digTimeout; - } - - private bool HasItemOfTypeInInventory(ItemType itemType) - { - return GetPlayerInventory().SearchItem(itemType).Length > 0; - } - - private void LogDebug(object text) - { - if (debugEnabled) - LogToConsole(text); - else LogDebugToConsole(text); - } - } -} diff --git a/MinecraftClient/ChatBots/FileInputBot.cs b/MinecraftClient/ChatBots/FileInputBot.cs deleted file mode 100644 index 7d0069e42d..0000000000 --- a/MinecraftClient/ChatBots/FileInputBot.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System; -using System.IO; -using System.Threading; -using MinecraftClient.CommandHandler; -using MinecraftClient.Scripting; - -namespace MinecraftClient.ChatBots -{ - /// - /// Debug-only ChatBot that monitors a text file for commands. - /// Write lines to the file from any external tool (e.g. Cursor Shell) - /// and this bot will execute them as MCC internal commands. - /// - /// Usage from Cursor Shell: - /// Add-Content mcc_input.txt "inventory" - /// Add-Content mcc_input.txt "send /give @s diamond_sword 1" - /// - /// Lines starting with "/" are sent as server chat; others are treated - /// as MCC internal commands (same as typing in the MCC console). - /// - public class FileInputBot : ChatBot - { - private const string BotName = "FileInput"; - private string _filePath = string.Empty; - private long _lastPosition; - private int _tickCounter; - - public override void Initialize() - { - _filePath = Path.GetFullPath( - Environment.GetEnvironmentVariable("MCC_INPUT_FILE") ?? "mcc_input.txt"); - - if (File.Exists(_filePath)) - _lastPosition = new FileInfo(_filePath).Length; - else - File.WriteAllText(_filePath, ""); - - LogToConsole(BotName, $"Watching: {_filePath}"); - LogToConsole(BotName, "Write commands to this file to execute them."); - } - - public override void Update() - { - // Poll every ~500ms while the MCC main loop runs at 20 TPS. - if (++_tickCounter < Settings.DoubleToTick(0.5)) - return; - _tickCounter = 0; - - try - { - if (!File.Exists(_filePath)) - return; - - var info = new FileInfo(_filePath); - if (info.Length <= _lastPosition) - return; - - string newContent; - using (var fs = new FileStream(_filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) - { - fs.Seek(_lastPosition, SeekOrigin.Begin); - using var reader = new StreamReader(fs); - newContent = reader.ReadToEnd(); - } - _lastPosition = info.Length; - - foreach (var rawLine in newContent.Split('\n')) - { - var line = rawLine.Trim(); - if (string.IsNullOrEmpty(line)) - continue; - - LogToConsole(BotName, $"> {line}"); - - if (line.StartsWith("/")) - { - SendText(line); - } - else - { - CmdResult result = new(); - if (PerformInternalCommand(line, ref result)) - { - if (!string.IsNullOrEmpty(result.ToString())) - LogToConsole(BotName, result.ToString()); - } - else - { - // Not an internal command — send as chat - SendText(line); - } - } - } - } - catch (IOException) - { - // File may be temporarily locked by the writer - } - catch (Exception ex) - { - LogToConsole(BotName, $"Error: {ex.Message}"); - } - } - } -} diff --git a/MinecraftClient/ChatBots/FollowPlayer.cs b/MinecraftClient/ChatBots/FollowPlayer.cs deleted file mode 100644 index 09df5f0a88..0000000000 --- a/MinecraftClient/ChatBots/FollowPlayer.cs +++ /dev/null @@ -1,241 +0,0 @@ -using System; -using System.Linq; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.CommandHandler.Patch; -using MinecraftClient.Mapping; -using MinecraftClient.Scripting; -using Tomlet.Attributes; - -namespace MinecraftClient.ChatBots -{ - public class FollowPlayer : ChatBot - { - public const string CommandName = "follow"; - - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] private const string BotName = "FollowPlayer"; - - public bool Enabled = false; - - [TomlInlineComment("$ChatBot.FollowPlayer.Update_Limit$")] - public double Update_Limit = 1.5; - - [TomlInlineComment("$ChatBot.FollowPlayer.Stop_At_Distance$")] - public double Stop_At_Distance = 3.0; - - public void OnSettingUpdate() - { - if (Update_Limit < 0) - Update_Limit = 0; - - if (Stop_At_Distance < 0) - Stop_At_Distance = 0; - } - } - - private string? _playerToFollow = null; - private int _updateCounter = 0; - private bool _unsafeEnabled = false; - - public override void Initialize() - { - if (!GetEntityHandlingEnabled()) - { - LogToConsole(Translations.extra_entity_required); - LogToConsole(Translations.general_bot_unload); - UnloadBot(); - return; - } - - if (!GetTerrainEnabled()) - { - LogToConsole(Translations.extra_terrainandmovement_required); - LogToConsole(Translations.general_bot_unload); - UnloadBot(); - return; - } - - McClient.dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CommandName) - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - ) - ); - - McClient.dispatcher.Register(l => l.Literal(CommandName) - .Then(l => l.Literal("start") - .Then(l => l.Argument("PlayerName", MccArguments.PlayerName()) - .Executes(r => OnCommandStart(r.Source, Arguments.GetString(r, "PlayerName"), takeRisk: false)) - .Then(l => l.Literal("-f") - .Executes(r => - OnCommandStart(r.Source, Arguments.GetString(r, "PlayerName"), takeRisk: true))))) - .Then(l => l.Literal("stop") - .Executes(r => OnCommandStop(r.Source))) - .Then(l => l.Literal("_help") - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - .Redirect(McClient.dispatcher.GetRoot().GetChild("help").GetChild(CommandName))) - ); - } - - public override void OnUnload() - { - BotMovementLock.Instance?.UnLock("Follow Player"); - McClient.dispatcher.Unregister(CommandName); - McClient.dispatcher.GetRoot().GetChild("help").RemoveChild(CommandName); - } - - private int OnCommandHelp(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => Translations.cmd_follow_desc + ": " + Translations.cmd_follow_usage - + '\n' + McClient.dispatcher.GetAllUsageString(CommandName, false), -#pragma warning restore format // @formatter:on - }); - } - - private int OnCommandStart(CmdResult r, string name, bool takeRisk) - { - if (!IsValidName(name)) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_follow_invalid_name); - - var player = GetEntities().Values.ToList().Find(entity => - entity.Type == EntityType.Player - && !string.IsNullOrEmpty(entity.Name) - && entity.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); - - if (player is null) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_follow_invalid_player); - - if (!CanMoveThere(player.Location)) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_follow_cant_reach_player); - - if (_playerToFollow is not null && _playerToFollow.Equals(name, StringComparison.OrdinalIgnoreCase)) - return r.SetAndReturn(CmdResult.Status.Fail, - string.Format(Translations.cmd_follow_already_following, _playerToFollow)); - - var movementLock = BotMovementLock.Instance; - if (movementLock is { IsLocked: true }) - return r.SetAndReturn(CmdResult.Status.Fail, - string.Format(Translations.bot_common_movement_lock_held, "Follow Player", movementLock.LockedBy)); - - var result = - string.Format( - _playerToFollow is not null ? Translations.cmd_follow_switched : Translations.cmd_follow_started, - player.Name!); - _playerToFollow = name.ToLower(); - - switch (movementLock) - { - case { IsLocked: false }: - if (!movementLock.Lock("Follow Player")) - { - LogToConsole($"§§6§1§0Follow Player bot failed to obtain the movement lock for some reason!"); - LogToConsole($"§§6§1§0Disable other bots who have movement mechanics, and try again!"); - return r.SetAndReturn(CmdResult.Status.Fail); - } - - break; - } - - if (!takeRisk) return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_follow_note); - _unsafeEnabled = true; - return r.SetAndReturn(CmdResult.Status.Done, - Translations.cmd_follow_note + '\n' + Translations.cmd_follow_unsafe_enabled); - } - - private int OnCommandStop(CmdResult r) - { - if (_playerToFollow is null) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_follow_already_stopped); - - var movementLock = BotMovementLock.Instance; - movementLock?.UnLock("Follow Player"); - _playerToFollow = null; - - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_follow_stopping); - } - - public override void Update() - { - _updateCounter++; - } - - public override void OnEntityMove(Entity entity) - { - if (entity.Type != EntityType.Player) - return; - - if (_playerToFollow is null || string.IsNullOrEmpty(entity.Name)) - return; - - if (_playerToFollow != entity.Name.ToLower()) - return; - - if (_updateCounter < Settings.DoubleToTick(Config.Update_Limit)) - return; - - _updateCounter = 0; - - if (!CanMoveThere(entity.Location)) - return; - - // Stop at specified distance from player (prevents pushing player around) - var distance = entity.Location.Distance(GetCurrentLocation()); - - if (distance < Config.Stop_At_Distance) - return; - - MoveToLocation(entity.Location, _unsafeEnabled); - } - - public override void OnEntitySpawn(Entity entity) - { - if (entity.Type != EntityType.Player) - return; - - if (_playerToFollow is not null && !string.IsNullOrEmpty(entity.Name) && - _playerToFollow.Equals(entity.Name, StringComparison.OrdinalIgnoreCase)) - { - LogToConsole(string.Format(Translations.cmd_follow_player_came_to_the_range, _playerToFollow)); - LogToConsole(Translations.cmd_follow_resuming); - } - } - - public override void OnEntityDespawn(Entity entity) - { - if (entity.Type != EntityType.Player) - return; - - if (_playerToFollow is not null && !string.IsNullOrEmpty(entity.Name) && - _playerToFollow.Equals(entity.Name, StringComparison.OrdinalIgnoreCase)) - { - LogToConsole(string.Format(Translations.cmd_follow_player_left_the_range, _playerToFollow)); - LogToConsole(Translations.cmd_follow_pausing); - } - } - - public override void OnPlayerLeave(Guid uuid, string? name) - { - if (_playerToFollow is not null && !string.IsNullOrEmpty(name) && - _playerToFollow.Equals(name, StringComparison.OrdinalIgnoreCase)) - { - LogToConsole(string.Format(Translations.cmd_follow_player_left, _playerToFollow)); - LogToConsole(Translations.cmd_follow_stopping); - _playerToFollow = null; - } - } - - private bool CanMoveThere(Location location) - { - var chunkColumn = GetWorld().GetChunkColumn(location); - return chunkColumn is not null && chunkColumn.FullyLoaded != false; - } - } -} \ No newline at end of file diff --git a/MinecraftClient/ChatBots/HangmanGame.cs b/MinecraftClient/ChatBots/HangmanGame.cs deleted file mode 100644 index ac04dd9ed7..0000000000 --- a/MinecraftClient/ChatBots/HangmanGame.cs +++ /dev/null @@ -1,200 +0,0 @@ -using System; -using System.Text; -using MinecraftClient.Scripting; -using Tomlet.Attributes; - -namespace MinecraftClient.ChatBots -{ - /// - /// In-Chat Hangman game - /// - - public class HangmanGame : ChatBot - { - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] - private const string BotName = "HangmanGame"; - - public bool Enabled = false; - - public bool English = true; - - public string FileWords_EN = "hangman-en.txt"; - - public string FileWords_FR = "hangman-fr.txt"; - - public void OnSettingUpdate() - { - FileWords_EN ??= string.Empty; - FileWords_FR ??= string.Empty; - } - } - - private int vie = 0; - private readonly int vie_param = 10; - private int compteur = 0; - private readonly int compteur_param = 3000; //5 minutes - private bool running = false; - private bool[] discovered = Array.Empty(); - private string word = ""; - private string letters = ""; - - public override void Update() - { - if (running) - { - if (compteur > 0) - { - compteur--; - } - else - { - SendText(Config.English ? "You took too long to try a letter." : "Temps imparti écoulé !"); - SendText(Config.English ? "Game canceled." : "Partie annulée."); - running = false; - } - } - } - - public override void GetText(string text) - { - string message = ""; - string username = ""; - text = GetVerbatim(text); - - if (IsPrivateMessage(text, ref message, ref username)) - { - if (Settings.Config.Main.Advanced.BotOwners.Contains(username.ToLower())) - { - switch (message) - { - case "start": - Start(); - break; - case "stop": - running = false; - break; - default: - break; - } - } - } - else - { - if (running && IsChatMessage(text, ref message, ref username)) - { - if (message.Length == 1) - { - char letter = message.ToUpper()[0]; - if (letter >= 'A' && letter <= 'Z') - { - if (letters.Contains(letter)) - { - SendText(Config.English ? ("Letter " + letter + " has already been tried.") : ("Le " + letter + " a déjà été proposé.")); - } - else - { - letters += letter; - compteur = compteur_param; - - if (word.Contains(letter)) - { - for (int i = 0; i < word.Length; i++) { if (word[i] == letter) { discovered[i] = true; } } - SendText(Config.English ? ("Yes, the word contains a " + letter + '!') : ("Le " + letter + " figurait bien dans le mot :)")); - } - else - { - vie--; - if (vie == 0) - { - SendText(Config.English ? "Game Over! :]" : "Perdu ! Partie terminée :]"); - SendText(Config.English ? ("The word was: " + word) : ("Le mot était : " + word)); - running = false; - } - else SendText(Config.English ? ("The " + letter + "? No.") : ("Le " + letter + " ? Non.")); - } - - if (running) - { - SendText(Config.English ? ("Mysterious word: " + WordCached + " (lives : " + vie + ")") - : ("Mot mystère : " + WordCached + " (vie : " + vie + ")")); - } - - if (Winner) - { - SendText(Config.English ? ("Congrats, " + username + '!') : ("Félicitations, " + username + " !")); - running = false; - } - } - } - } - } - } - } - - private void Start() - { - vie = vie_param; - running = true; - letters = ""; - word = Chooseword(); - compteur = compteur_param; - discovered = new bool[word.Length]; - - SendText(Config.English ? "Hangman v1.0 - By ORelio" : "Pendu v1.0 - Par ORelio"); - SendText(Config.English ? ("Mysterious word: " + WordCached + " (lives : " + vie + ")") - : ("Mot mystère : " + WordCached + " (vie : " + vie + ")")); - SendText(Config.English ? ("Try some letters ... :)") : ("Proposez une lettre ... :)")); - } - - private string Chooseword() - { - if (System.IO.File.Exists(Config.English ? Config.FileWords_EN : Config.FileWords_FR)) - { - string[] dico = System.IO.File.ReadAllLines(Config.English ? Config.FileWords_EN : Config.FileWords_FR, Encoding.UTF8); - return dico[new Random().Next(dico.Length)]; - } - else - { - LogToConsole(Config.English ? "File not found: " + Config.FileWords_EN : "Fichier introuvable : " + Config.FileWords_FR); - return Config.English ? "WORDSAREMISSING" : "DICOMANQUANT"; - } - } - - private string WordCached - { - get - { - string printed = ""; - for (int i = 0; i < word.Length; i++) - { - if (discovered[i]) - { - printed += word[i]; - } - else printed += '_'; - } - return printed; - } - } - - private bool Winner - { - get - { - for (int i = 0; i < discovered.Length; i++) - { - if (!discovered[i]) - { - return false; - } - } - return true; - } - } - } -} diff --git a/MinecraftClient/ChatBots/ItemsCollector.cs b/MinecraftClient/ChatBots/ItemsCollector.cs deleted file mode 100644 index 0c513ffb30..0000000000 --- a/MinecraftClient/ChatBots/ItemsCollector.cs +++ /dev/null @@ -1,217 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.CommandHandler.Patch; -using MinecraftClient.Inventory; -using MinecraftClient.Mapping; -using MinecraftClient.Scripting; -using Tomlet.Attributes; - -namespace MinecraftClient.ChatBots; - -public class ItemsCollector : ChatBot -{ - public const string CommandName = "itemscollector"; - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] private const string BotName = "ItemsCollector"; - - public bool Enabled = false; - - [TomlInlineComment("$ChatBot.ItemsCollector.Collect_All_Item_Types$")] - public bool Collect_All_Item_Types = true; - - [TomlInlineComment("$ChatBot.ItemsCollector.Items_Whitelist$")] - public List Items_Whitelist = new() { ItemType.Diamond, ItemType.NetheriteIngot }; - - [TomlInlineComment("$ChatBot.ItemsCollector.Delay_Between_Tasks$")] - public int Delay_Between_Tasks = 300; - - [TomlInlineComment("$ChatBot.ItemsCollector.Collection_Radius$")] - public double Collection_Radius = 30.0; - - [TomlInlineComment("$ChatBot.ItemsCollector.Always_Return_To_Start$")] - public bool Always_Return_To_Start = true; - - [TomlInlineComment("$ChatBot.ItemsCollector.Prioritize_Clusters$")] - public bool Prioritize_Clusters = false; - - public void OnSettingUpdate() - { - if (Delay_Between_Tasks < 100) - Delay_Between_Tasks = 100; - } - } - - private bool running = false; - private Thread? mainProcessThread; - - public override void Initialize() - { - if (!GetEntityHandlingEnabled()) - { - LogToConsole(Translations.extra_entity_required); - LogToConsole(Translations.general_bot_unload); - UnloadBot(); - return; - } - - if (!GetTerrainEnabled()) - { - LogToConsole(Translations.extra_terrainandmovement_required); - LogToConsole(Translations.general_bot_unload); - UnloadBot(); - return; - } - - McClient.dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CommandName) - .Executes(r => OnCommandHelp(r.Source, string.Empty))) - ); - - McClient.dispatcher.Register(l => l.Literal(CommandName) - .Then(l => l.Literal("start") - .Executes(r => OnCommandStart(r.Source))) - .Then(l => l.Literal("stop") - .Executes(r => OnCommandStop(r.Source))) - .Then(l => l.Literal("_help") - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - .Redirect(McClient.dispatcher.GetRoot().GetChild("help").GetChild(CommandName))) - ); - } - - public override void OnUnload() - { - StopTheMainProcess(); - McClient.dispatcher.Unregister(CommandName); - McClient.dispatcher.GetRoot().GetChild("help").RemoveChild(CommandName); - } - - private int OnCommandHelp(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => Translations.cmd_items_collector_desc + ": " + Translations.cmd_items_collector_usage - + '\n' + McClient.dispatcher.GetAllUsageString(CommandName, false), -#pragma warning restore format // @formatter:on - }); - } - - private int OnCommandStart(CmdResult r) - { - if (running) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_items_collector_already_collecting); - - var movementLock = BotMovementLock.Instance; - if (movementLock is { IsLocked: true }) - return r.SetAndReturn(CmdResult.Status.Fail, - string.Format(Translations.bot_common_movement_lock_held, "Items Collector", movementLock.LockedBy)); - - if (!movementLock!.Lock("Items Collector")) - { - LogToConsole($"§§6§1§0Items Collector bot failed to obtain the movement lock for some reason!"); - LogToConsole($"§§6§1§0Disable other bots who have movement mechanics, and try again!"); - return r.SetAndReturn(CmdResult.Status.Fail); - } - - StartTheMainProcess(); - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_items_collector_started); - } - - private int OnCommandStop(CmdResult r) - { - if (!running) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_items_collector_already_not_collecting); - - StopTheMainProcess(); - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_items_collector_stopping); - } - - private void StartTheMainProcess() - { - running = true; - mainProcessThread = new Thread(MainProcess); - mainProcessThread.Start(); - } - - private void StopTheMainProcess() - { - running = false; - BotMovementLock.Instance?.UnLock("Items Collector"); - } - - private void MainProcess() - { - var startingLocation = GetCurrentLocation(); - - while (running) - { - var currentLocation = GetCurrentLocation(); - var items = GetEntities() - .Where(x => - x.Value.Type == EntityType.Item && - x.Value.Location.Distance(currentLocation) <= Config.Collection_Radius && - (Config.Collect_All_Item_Types || Config.Items_Whitelist.Contains(x.Value.Item.Type))) - .Select(x => x.Value) - .ToList(); - - if (Config.Prioritize_Clusters && items.Count > 1) - { - var centroid = new Location( - items.Average(x => x.Location.X), - items.Average(x => x.Location.Y), - items.Average(x => x.Location.Z) - ); - - items = items.OrderBy(x => x.Location.Distance(centroid) / items.Count).ToList(); - } - else items = items.OrderBy(x => x.Location.Distance(currentLocation)).ToList(); - - if (items.Any()) - { - foreach (var entity in items.TakeWhile(entity => running)) - WaitForMoveToLocation(entity.Location); - } - else - { - if (startingLocation.Distance(currentLocation) > 2f && Config.Always_Return_To_Start) - WaitForMoveToLocation(startingLocation); - } - - if (!running) - break; - - Thread.Sleep(Config.Delay_Between_Tasks); - } - - LogToConsole(Translations.cmd_items_collector_stopped); - } - - public override void AfterGameJoined() - { - StopTheMainProcess(); - } - - public override bool OnDisconnect(DisconnectReason reason, string message) - { - StopTheMainProcess(); - return true; - } - - private bool WaitForMoveToLocation(Location location, float tolerance = 1f) - { - if (!MoveToLocation(location)) return false; - while (GetCurrentLocation().Distance(location) > tolerance) - Thread.Sleep(200); - - return true; - } -} \ No newline at end of file diff --git a/MinecraftClient/ChatBots/Mailer.cs b/MinecraftClient/ChatBots/Mailer.cs deleted file mode 100644 index 1d84b74f6e..0000000000 --- a/MinecraftClient/ChatBots/Mailer.cs +++ /dev/null @@ -1,471 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.IO; -using System.Linq; -using System.Threading; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.CommandHandler.Patch; -using MinecraftClient.Scripting; -using Tomlet.Attributes; - -namespace MinecraftClient.ChatBots -{ - /// - /// ChatBot for storing and delivering Mails - /// - public class Mailer : ChatBot - { - public const string CommandName = "mailer"; - - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] - private const string BotName = "Mailer"; - - public bool Enabled = false; - - public string DatabaseFile = "MailerDatabase.ini"; - - public string IgnoreListFile = "MailerIgnoreList.ini"; - - public bool PublicInteractions = false; - - public int MaxMailsPerPlayer = 10; - - public int MaxDatabaseSize = 10000; - - public int MailRetentionDays = 30; - - public void OnSettingUpdate() - { - DatabaseFile ??= string.Empty; - IgnoreListFile ??= string.Empty; - - if (!Enabled) return; - - bool checkSuccessed = true; - - if (Config.MaxDatabaseSize <= 0) - { - LogToConsole(BotName, Translations.bot_mailer_init_fail_db_size); - checkSuccessed = false; - } - - if (Config.MaxMailsPerPlayer <= 0) - { - LogToConsole(BotName, Translations.bot_mailer_init_fail_max_mails); - checkSuccessed = false; - } - - if (Config.MailRetentionDays <= 0) - { - LogToConsole(BotName, Translations.bot_mailer_init_fail_mail_retention); - checkSuccessed = false; - } - - if (!checkSuccessed) - { - LogToConsole(BotName, Translations.general_bot_unload); - Enabled = false; - } - } - } - - /// - /// Holds the list of ignored players - /// - private class IgnoreList : HashSet - { - /// - /// Read ignore list from file - /// - /// Path to the ignore list - /// Ignore list - public static IgnoreList FromFile(string filePath) - { - IgnoreList ignoreList = new(); - foreach (string line in FileMonitor.ReadAllLinesWithRetries(filePath)) - { - if (!line.StartsWith("#")) - { - string entry = line.ToLower(); - if (!ignoreList.Contains(entry)) - ignoreList.Add(entry); - } - } - return ignoreList; - } - - /// - /// Save ignore list to file - /// - /// Path to destination file - public void SaveToFile(string filePath) - { - List lines = new(); - lines.Add("#Ignored Players"); - foreach (string player in this) - lines.Add(player); - FileMonitor.WriteAllLinesWithRetries(filePath, lines); - } - } - - /// - /// Holds the Mail database: a collection of Mails sent from a player to another player - /// - private class MailDatabase : List - { - /// - /// Read mail database from file - /// - /// Path to the database - /// Mail database - public static MailDatabase FromFile(string filePath) - { - MailDatabase database = new(); - Dictionary> iniFileDict = INIFile.ParseFile(FileMonitor.ReadAllLinesWithRetries(filePath)); - foreach (KeyValuePair> iniSection in iniFileDict) - { - //iniSection.Key is "mailXX" but we don't need it here - string sender = iniSection.Value["sender"]; - string recipient = iniSection.Value["recipient"]; - string content = iniSection.Value["content"]; - DateTime timestamp = DateTime.Parse(iniSection.Value["timestamp"]); - bool anonymous = INIFile.Str2Bool(iniSection.Value["anonymous"]); - database.Add(new Mail(sender, recipient, content, anonymous, timestamp)); - } - return database; - } - - /// - /// Save mail database to file - /// - /// Path to destination file - public void SaveToFile(string filePath) - { - Dictionary> iniFileDict = new(); - int mailCount = 0; - foreach (Mail mail in this) - { - mailCount++; - Dictionary iniSection = new() - { -#pragma warning disable format // @formatter:off - ["sender"] = mail.Sender, - ["recipient"] = mail.Recipient, - ["content"] = mail.Content, - ["timestamp"] = mail.DateSent.ToString(), - ["anonymous"] = mail.Anonymous.ToString() -#pragma warning restore format // @formatter:on - }; - iniFileDict["mail" + mailCount] = iniSection; - } - FileMonitor.WriteAllLinesWithRetries(filePath, INIFile.Generate(iniFileDict, "Mail Database")); - } - } - - /// - /// Represents a Mail sent from a player to another player - /// - private class Mail - { - private readonly string sender; - private readonly string senderLower; - private readonly string recipient; - private readonly string recipientLower; - private readonly string message; - private readonly DateTime datesent; - private bool delivered; - private readonly bool anonymous; - - public Mail(string sender, string recipient, string message, bool anonymous, DateTime datesent) - { - this.sender = sender; - senderLower = sender.ToLower(); - this.recipient = recipient; - recipientLower = recipient.ToLower(); - this.message = message; - this.datesent = datesent; - delivered = false; - this.anonymous = anonymous; - } - - public string Sender { get { return sender; } } - public string SenderLowercase { get { return senderLower; } } - public string Recipient { get { return recipient; } } - public string RecipientLowercase { get { return recipientLower; } } - public string Content { get { return message; } } - public DateTime DateSent { get { return datesent; } } - public bool Delivered => delivered; - public bool Anonymous { get { return anonymous; } } - public void SetDelivered() { delivered = true; } - - public override string ToString() - { - return String.Format("{0} {1} {2} {3}", Sender, Recipient, Content, DateSent); - } - } - - // Internal variables - private int maxMessageLength = 0; - private DateTime nextMailSend = DateTime.Now; - private MailDatabase mailDatabase = new(); - private IgnoreList ignoreList = new(); - private FileMonitor? mailDbFileMonitor; - private FileMonitor? ignoreListFileMonitor; - private readonly Lock readWriteLock = new(); - - /// - /// Initialization of the Mailer bot - /// - public override void Initialize() - { - LogDebugToConsole(Translations.bot_mailer_init); - LogDebugToConsole(Translations.bot_mailer_init_db + Config.DatabaseFile); - LogDebugToConsole(Translations.bot_mailer_init_ignore + Config.IgnoreListFile); - LogDebugToConsole(Translations.bot_mailer_init_public + Config.PublicInteractions); - LogDebugToConsole(Translations.bot_mailer_init_max_mails + Config.MaxMailsPerPlayer); - LogDebugToConsole(Translations.bot_mailer_init_db_size + Config.MaxDatabaseSize); - LogDebugToConsole(Translations.bot_mailer_init_mail_retention + Config.MailRetentionDays + " days"); - - if (!File.Exists(Config.DatabaseFile)) - { - LogToConsole(string.Format(Translations.bot_mailer_create_db, Path.GetFullPath(Config.DatabaseFile))); - new MailDatabase().SaveToFile(Config.DatabaseFile); - } - - if (!File.Exists(Config.IgnoreListFile)) - { - LogToConsole(string.Format(Translations.bot_mailer_create_ignore, Path.GetFullPath(Config.IgnoreListFile))); - new IgnoreList().SaveToFile(Config.IgnoreListFile); - } - - lock (readWriteLock) - { - LogDebugToConsole(string.Format(Translations.bot_mailer_load_db, Path.GetFullPath(Config.DatabaseFile))); - mailDatabase = MailDatabase.FromFile(Config.DatabaseFile); - - LogDebugToConsole(string.Format(Translations.bot_mailer_load_ignore, Path.GetFullPath(Config.IgnoreListFile))); - ignoreList = IgnoreList.FromFile(Config.IgnoreListFile); - } - - //Initialize file monitors. In case the bot needs to unload for some reason in the future, do not forget to .Dispose() them - mailDbFileMonitor = new FileMonitor(Path.GetDirectoryName(Config.DatabaseFile)!, Path.GetFileName(Config.DatabaseFile), FileMonitorCallback); - ignoreListFileMonitor = new FileMonitor(Path.GetDirectoryName(Config.IgnoreListFile)!, Path.GetFileName(Config.IgnoreListFile), FileMonitorCallback); - - McClient.dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CommandName) - .Executes(r => OnCommandHelp(r.Source, string.Empty))) - ); - - McClient.dispatcher.Register(l => l.Literal(CommandName) - .Then(l => l.Literal("getmails") - .Executes(r => OnCommandGetMails())) - .Then(l => l.Literal("getignored") - .Executes(r => OnCommandGetIgnored())) - .Then(l => l.Literal("addignored") - .Then(l => l.Argument("username", Arguments.String()) - .Executes(r => OnCommandAddIgnored(Arguments.GetString(r, "username"))))) - .Then(l => l.Literal("removeignored") - .Then(l => l.Argument("username", Arguments.String()) - .Executes(r => OnCommandRemoveIgnored(Arguments.GetString(r, "username"))))) - .Then(l => l.Literal("_help") - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - .Redirect(McClient.dispatcher.GetRoot().GetChild("help").GetChild(CommandName))) - ); - } - - public override void OnUnload() - { - McClient.dispatcher.Unregister(CommandName); - McClient.dispatcher.GetRoot().GetChild("help").RemoveChild(CommandName); - } - - private int OnCommandHelp(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => Translations.bot_mailer_cmd_help + ": /mailer " - + '\n' + McClient.dispatcher.GetAllUsageString(CommandName, false), -#pragma warning restore format // @formatter:on - }); - } - - private int OnCommandGetMails() - { - LogToConsole(string.Format(Translations.bot_mailer_cmd_getmails, string.Join("\n", mailDatabase))); - return 1; - } - - private int OnCommandGetIgnored() - { - LogToConsole(string.Format(Translations.bot_mailer_cmd_getignored, string.Join("\n", ignoreList))); - return 1; - } - - private int OnCommandAddIgnored(string username) - { - if (IsValidName(username)) - { - username = username.ToLower(); - lock (readWriteLock) - { - if (!ignoreList.Contains(username)) - { - ignoreList.Add(username); - ignoreList.SaveToFile(Config.IgnoreListFile); - } - } - LogToConsole(string.Format(Translations.bot_mailer_cmd_ignore_added, username)); - return 1; - } - else - { - LogToConsole(string.Format(Translations.bot_mailer_cmd_ignore_invalid, "addignored")); - return 0; - } - } - - private int OnCommandRemoveIgnored(string username) - { - if (IsValidName(username)) - { - username = username.ToLower(); - lock (readWriteLock) - { - if (ignoreList.Contains(username)) - { - ignoreList.Remove(username); - ignoreList.SaveToFile(Config.IgnoreListFile); - } - } - LogToConsole(string.Format(Translations.bot_mailer_cmd_ignore_removed, username)); - return 1; - } - else - { - LogToConsole(string.Format(Translations.bot_mailer_cmd_ignore_invalid, "removeignored")); - return 0; - } - } - - /// - /// Standard settings for the bot. - /// - public override void AfterGameJoined() - { - maxMessageLength = GetMaxChatMessageLength() - - 44 // Deduct length of "/ 16CharPlayerName 16CharPlayerName mailed: " - - Settings.Config.Main.Advanced.PrivateMsgsCmdName.Length; // Deduct length of "tell" command - } - - /// - /// Process chat messages from the server - /// - public override void GetText(string text) - { - string message = ""; - string username = ""; - text = GetVerbatim(text); - - if (IsPrivateMessage(text, ref message, ref username) || (Config.PublicInteractions && IsChatMessage(text, ref message, ref username))) - { - string usernameLower = username.ToLower(); - if (!ignoreList.Contains(usernameLower)) - { - string command = message.Split(' ')[0].ToLower(); - switch (command) - { - case "mail": - case "tellonym": - if (usernameLower != GetUsername().ToLower() - && mailDatabase.Count < Config.MaxDatabaseSize - && mailDatabase.Where(mail => mail.SenderLowercase == usernameLower).Count() < Config.MaxMailsPerPlayer) - { - Queue args = new(Command.GetArgs(message)); - if (args.Count >= 2) - { - bool anonymous = (command == "tellonym"); - string recipient = args.Dequeue(); - message = string.Join(" ", args); - - if (IsValidName(recipient)) - { - if (message.Length <= maxMessageLength) - { - Mail mail = new(username, recipient, message, anonymous, DateTime.Now); - LogToConsole(string.Format(Translations.bot_mailer_saving, mail.ToString())); - lock (readWriteLock) - { - mailDatabase.Add(mail); - mailDatabase.SaveToFile(Config.DatabaseFile); - } - SendPrivateMessage(username, "Message saved!"); - } - else SendPrivateMessage(username, "Your message cannot be longer than " + maxMessageLength + " characters."); - } - else SendPrivateMessage(username, "Recipient '" + recipient + "' is not a valid player name."); - } - else SendPrivateMessage(username, "Usage: " + command + " "); - } - else SendPrivateMessage(username, "Couldn't save Message. Limit reached!"); - break; - } - } - else LogDebugToConsole(string.Format(Translations.bot_mailer_user_ignored, username)); - } - } - - /// - /// Called on each MCC tick, around 20 times per second - /// - public override void Update() - { - DateTime dateNow = DateTime.Now; - if (nextMailSend < dateNow) - { - LogDebugToConsole(string.Format(Translations.bot_mailer_process_mails, DateTime.Now)); - - // Process at most 3 mails at a time to avoid spamming. Other mails will be processed on next mail send - HashSet onlinePlayersLowercase = new(GetOnlinePlayers().Select(name => name.ToLower())); - foreach (Mail mail in mailDatabase.Where(mail => !mail.Delivered && onlinePlayersLowercase.Contains(mail.RecipientLowercase)).Take(3)) - { - string sender = mail.Anonymous ? "Anonymous" : mail.Sender; - SendPrivateMessage(mail.Recipient, sender + " mailed: " + mail.Content); - mail.SetDelivered(); - LogDebugToConsole(string.Format(Translations.bot_mailer_delivered, mail.ToString())); - } - - lock (readWriteLock) - { - mailDatabase.RemoveAll(mail => mail.Delivered); - mailDatabase.RemoveAll(mail => mail.DateSent.AddDays(Config.MailRetentionDays) < DateTime.Now); - mailDatabase.SaveToFile(Config.DatabaseFile); - } - - nextMailSend = dateNow.AddSeconds(10); - } - } - - /// - /// Called when the Mail Database or Ignore list has changed on disk - /// - /// - /// - private void FileMonitorCallback(object sender, FileSystemEventArgs e) - { - lock (readWriteLock) - { - mailDatabase = MailDatabase.FromFile(Config.DatabaseFile); - ignoreList = IgnoreList.FromFile(Config.IgnoreListFile); - } - } - } -} diff --git a/MinecraftClient/ChatBots/Map.cs b/MinecraftClient/ChatBots/Map.cs deleted file mode 100644 index a686c39a56..0000000000 --- a/MinecraftClient/ChatBots/Map.cs +++ /dev/null @@ -1,540 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Text; -using System.Threading.Tasks; -using Avalonia.Threading; -using Brigadier.NET; -using Brigadier.NET.Builder; -using ImageMagick; -using MinecraftClient.CommandHandler; -using MinecraftClient.CommandHandler.Patch; -using MinecraftClient.Mapping; -using MinecraftClient.Scripting; -using MinecraftClient.Tui; -using Tomlet.Attributes; - -namespace MinecraftClient.ChatBots -{ - public class Map : ChatBot - { - public const string CommandName = "maps"; - - public static Configs Config = new(); - - public struct QueuedMap - { - public string FileName; - public int MapId; - } - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] - private const string BotName = "Map"; - - public bool Enabled = false; - - [TomlInlineComment("$ChatBot.Map.Render_In_Console$")] - public bool Render_In_Console = true; - - [TomlInlineComment("$ChatBot.Map.Save_To_File$")] - public bool Save_To_File = false; - - [TomlInlineComment("$ChatBot.Map.Auto_Render_On_Update$")] - public bool Auto_Render_On_Update = false; - - [TomlInlineComment("$ChatBot.Map.Delete_All_On_Unload$")] - public bool Delete_All_On_Unload = true; - - [TomlInlineComment("$ChatBot.Map.Notify_On_First_Update$")] - public bool Notify_On_First_Update = true; - - [TomlInlineComment("$ChatBot.Map.Rasize_Rendered_Image$")] - public bool Rasize_Rendered_Image = false; - - [TomlInlineComment("$ChatBot.Map.Resize_To$")] - public int Resize_To = 512; - - [TomlPrecedingComment("$ChatBot.Map.Send_Rendered_To_Bridges$")] - public bool Send_Rendered_To_Discord = false; - public bool Send_Rendered_To_Telegram = false; - - public void OnSettingUpdate() - { - if (Resize_To <= 0) - Resize_To = 128; - } - } - - private readonly string baseDirectory = @"Rendered_Maps"; - - internal readonly Dictionary cachedMaps = new(); - - private readonly Queue discordQueue = new(); - - public override void Initialize() - { - if (!Directory.Exists(baseDirectory)) - Directory.CreateDirectory(baseDirectory); - - DeleteRenderedMaps(); - - McClient.dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CommandName) - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - ) - ); - - McClient.dispatcher.Register(l => l.Literal(CommandName) - .Executes(r => OnCommandList(r.Source)) - .Then(l => l.Literal("list") - .Executes(r => OnCommandList(r.Source))) - .Then(l => l.Literal("render") - .Then(l => l.Argument("MapID", MccArguments.MapBotMapId()) - .Executes(r => OnCommandRender(r.Source, Arguments.GetInteger(r, "MapID"))))) - .Then(l => l.Literal("_help") - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - .Redirect(McClient.dispatcher.GetRoot().GetChild("help").GetChild(CommandName))) - ); - } - - public override void OnUnload() - { - McClient.dispatcher.Unregister(CommandName); - McClient.dispatcher.GetRoot().GetChild("help").RemoveChild(CommandName); - DeleteRenderedMaps(); - } - - private int OnCommandHelp(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => Translations.error_usage + ": /maps >" - + '\n' + McClient.dispatcher.GetAllUsageString(CommandName, false), -#pragma warning restore format // @formatter:on - }); - } - - private int OnCommandList(CmdResult r) - { - if (cachedMaps.Count == 0) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.bot_map_no_maps); - - LogToConsole(Translations.bot_map_received); - - foreach (var (key, value) in new SortedDictionary(cachedMaps)) - LogToConsole(string.Format(Translations.bot_map_list_item, key, value.LastUpdated)); - - return r.SetAndReturn(CmdResult.Status.Done); - } - - private int OnCommandRender(CmdResult r, int mapId) - { - if (!cachedMaps.ContainsKey(mapId)) - return r.SetAndReturn(CmdResult.Status.Fail, string.Format(Translations.bot_map_cmd_not_found, mapId)); - - try - { - McMap map = cachedMaps[mapId]; - if (Config.Save_To_File) - SaveToFile(map); - - if (Config.Render_In_Console) - { - if (ConsoleIO.Backend is TuiConsoleBackend) - RenderInTui(map); - else - RenderInConsole(map); - } - - return r.SetAndReturn(CmdResult.Status.Done); - } - catch (Exception e) - { - LogDebugToConsole(e.StackTrace!); - return r.SetAndReturn(CmdResult.Status.Fail, string.Format(Translations.bot_map_failed_to_render, mapId)); - } - } - - private void DeleteRenderedMaps() - { - if (Config.Delete_All_On_Unload) - { - DirectoryInfo di = new(baseDirectory); - FileInfo[] files = di.GetFiles(); - - foreach (FileInfo file in files) - file.Delete(); - } - } - - public override void OnMapData(int mapid, byte scale, bool trackingPosition, bool locked, List icons, byte columnsUpdated, byte rowsUpdated, byte mapCoulmnX, byte mapRowZ, byte[]? colors) - { - if (columnsUpdated == 0 && cachedMaps.ContainsKey(mapid)) - return; - - if (rowsUpdated <= 0 && columnsUpdated <= 0) - return; - - McMap map = new() - { - MapId = mapid, - Scale = scale, - TrackingPosition = trackingPosition, - Locked = locked, - MapIcons = icons, - Width = columnsUpdated, - Height = rowsUpdated, - X = mapCoulmnX, - Z = mapRowZ, - Colors = colors, - LastUpdated = DateTime.Now - }; - - if (!cachedMaps.ContainsKey(mapid)) - { - cachedMaps.Add(mapid, map); - - if (Config.Notify_On_First_Update) - LogToConsole(string.Format(Translations.bot_map_received_map, map.MapId)); - } - else - { - McMap old_map = cachedMaps[mapid]; - lock (old_map) - { - for (int x = 0; x < map.Width; ++x) - for (int y = 0; y < map.Height; ++y) - old_map.Colors![(map.X + x) + (map.Z + y) * old_map.Width] = map.Colors![x + y * map.Width]; - } - map = old_map; - } - - if (Config.Auto_Render_On_Update) - { - if (Config.Save_To_File) - SaveToFile(map); - - if (Config.Render_In_Console) - { - if (ConsoleIO.Backend is TuiConsoleBackend) - RenderInTui(map); - else - RenderInConsole(map); - } - } - } - - private void SaveToFile(McMap map) - { - string fileName = baseDirectory + Path.DirectorySeparatorChar + "Map_" + map.MapId.ToString().PadLeft(5, '0') + ".bmp"; - - if (File.Exists(fileName)) - File.Delete(fileName); - - using FileStream file = File.OpenWrite(fileName); - file.Write(BitConverter.GetBytes((ushort)0x4d42)); // WORD File Header bfType: "BM" - file.Write(BitConverter.GetBytes((uint)(14 + 40 + 3 * map.Width * map.Height))); // DWORD File Header bfSize - file.Write(BitConverter.GetBytes((ushort)0)); // WORD File Header bfReserved1 - file.Write(BitConverter.GetBytes((ushort)0)); // WORD File Header bfReserved2 - file.Write(BitConverter.GetBytes((uint)54)); // DWORD File Header bfOffBits - file.Write(BitConverter.GetBytes((uint)40)); // DWORD Info Header biSize - file.Write(BitConverter.GetBytes((uint)map.Width)); // LONG Info Header biWidth - file.Write(BitConverter.GetBytes((uint)map.Height)); // LONG Info Header biHeight - file.Write(BitConverter.GetBytes((ushort)1)); // WORD Info Header biPlanes - file.Write(BitConverter.GetBytes((ushort)24)); // WORD Info Header biBitCount - file.Write(BitConverter.GetBytes((uint)0x00)); // DWORD Info Header biCompression: BI_RGB - file.Write(BitConverter.GetBytes((uint)0)); // DWORD Info Header biSizeImage - file.Write(BitConverter.GetBytes((uint)0)); // LONG Info Header biXPelsPerMeter - file.Write(BitConverter.GetBytes((uint)0)); // LONG Info Header biYPelsPerMeter - file.Write(BitConverter.GetBytes((uint)0)); // DWORD Info Header biClrUsed - file.Write(BitConverter.GetBytes((uint)0)); // DWORD Info Header biClrImportant - Span pixel = stackalloc byte[3]; - for (int y = map.Height - 1; y >= 0; --y) - { - for (int x = 0; x < map.Width; ++x) - { - ColorRGBA color = MapColors.ColorByteToRGBA(map.Colors![x + y * map.Width]); - pixel[0] = color.B; pixel[1] = color.G; pixel[2] = color.R; - file.Write(pixel); - } - } - file.Close(); - - LogToConsole(string.Format(Translations.bot_map_rendered, map.MapId, fileName)); - - if (Config.Rasize_Rendered_Image) - { - using (var image = new MagickImage(fileName)) - { - uint resizeTo = (uint)Math.Max(Config.Resize_To, 1); - var size = new MagickGeometry(resizeTo, resizeTo); - size.IgnoreAspectRatio = true; - - image.Resize(size); - image.Write(fileName); - LogToConsole(string.Format(Translations.bot_map_resized_rendered_image, map.MapId, Config.Resize_To)); - } - } - - if (Config.Send_Rendered_To_Discord || Config.Send_Rendered_To_Telegram) - { - // We need to queue up images because Discord/Telegram Bridge is not ready immediatelly - if (DiscordBridge.Config.Enabled || TelegramBridge.Config.Enabled) - discordQueue.Enqueue(new QueuedMap { FileName = fileName, MapId = map.MapId }); - } - } - - public override void Update() - { - DiscordBridge? discordBridge = DiscordBridge.GetInstance(); - TelegramBridge? telegramBridge = TelegramBridge.GetInstance(); - - if (Config.Send_Rendered_To_Discord) - { - if (discordBridge is null || (discordBridge is not null && !discordBridge.IsConnected)) - return; - } - - if (Config.Send_Rendered_To_Telegram) - { - if (telegramBridge is null || (telegramBridge is not null && !telegramBridge.IsConnected)) - return; - } - - if (discordQueue.Count > 0) - { - QueuedMap map = discordQueue.Dequeue(); - string fileName = map.FileName; - - // We must convert to a PNG in order to send to Discord, BMP does not work - string newFileName = fileName.Replace(".bmp", ".png"); - using (var image = new MagickImage(fileName)) - { - image.Write(newFileName); - - if (Config.Send_Rendered_To_Discord) - discordBridge!.SendImage(newFileName, $"> A render of the map with an id: **{map.MapId}**"); - - if (Config.Send_Rendered_To_Telegram) - telegramBridge!.SendImage(newFileName, $"A render of the map with an id: *{map.MapId}*"); - - newFileName = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + newFileName; - - if (Config.Send_Rendered_To_Discord) - LogToConsole(string.Format(Translations.bot_map_sent_to_discord, map.MapId)); - - if (Config.Send_Rendered_To_Telegram) - LogToConsole(string.Format(Translations.bot_map_sent_to_telegram, map.MapId)); - - // Wait for 2 seconds and then try until file is free for deletion - // 10 seconds timeout - Task.Run(async () => - { - await Task.Delay(2000); - - var time = Stopwatch.StartNew(); - - while (time.ElapsedMilliseconds < 10000) // 10 seconds - { - try - { - // Delete the temporary file - if (File.Exists(newFileName)) - File.Delete(newFileName); - } - catch (IOException) { } - } - }); - } - } - } - - private static void RenderInTui(McMap map) - { - var view = TuiConsoleBackend.Instance?.GetView(); - if (view is null) - return; - - Dispatcher.UIThread.Post(() => - { - if (view.HasOverlay && view.OverlayContent is MapOverlay existing) - { - existing.UpdateMap(map); - return; - } - - view.ShowOverlay(new MapOverlay(map)); - }); - } - - private static void RenderInConsole(McMap map) - { - StringBuilder sb = new(); - int safeBufWidth, safeBufHeight; - try { safeBufWidth = Console.BufferWidth; } catch { safeBufWidth = 120; } - try { safeBufHeight = Console.BufferHeight; } catch { safeBufHeight = 50; } - int consoleWidth = Math.Max(safeBufWidth, Settings.Config.Main.Advanced.MinTerminalWidth) / 2; - int consoleHeight = Math.Max(safeBufHeight, Settings.Config.Main.Advanced.MinTerminalHeight) - 1; - int scaleX = (map.Width + consoleWidth - 1) / consoleWidth; - int scaleY = (map.Height + consoleHeight - 1) / consoleHeight; - int scale = Math.Max(scaleX, scaleY); - if (scale > 1) - sb.AppendLine(string.Format(Translations.bot_map_scale, map.Width, map.Height, map.Width / scale, map.Height / scale)); - - for (int base_y = 0; base_y < map.Height; base_y += scale) - { - string lastFg = string.Empty, lagtBg = string.Empty; - for (int base_x = 0; base_x < map.Width; base_x += scale) - { - int RUL = 0, GUL = 0, BUL = 0, RUR = 0, GUR = 0, BUR = 0; - int RDL = 0, GDL = 0, BDL = 0, RDR = 0, GDR = 0, BDR = 0; - double mid = (double)(scale - 1) / 2; - for (int dy = 0; dy < scale; ++dy) - { - for (int dx = 0; dx < scale; ++dx) - { - int x = Math.Min(base_x + dx, map.Width - 1); - int y = Math.Min(base_y + dy, map.Height - 1); - ColorRGBA color = MapColors.ColorByteToRGBA(map.Colors![x + y * map.Width]); - if (dx <= mid) - { - if (dy <= mid) - { - RUL += color.R; GUL += color.G; BUL += color.B; - } - if (dy >= mid) - { - RDL += color.R; GDL += color.G; BDL += color.B; - } - } - if (dx >= mid) - { - if (dy <= mid) - { - RUR += color.R; GUR += color.G; BUR += color.B; - } - if (dy >= mid) - { - RDR += color.R; GDR += color.G; BDR += color.B; - } - } - } - } - - int pixel_cnt = ((scale + 1) / 2) * ((scale + 1) / 2); - RDL = (int)Math.Round((double)RDL / pixel_cnt); - GDL = (int)Math.Round((double)GDL / pixel_cnt); - BDL = (int)Math.Round((double)BDL / pixel_cnt); - RDR = (int)Math.Round((double)RDR / pixel_cnt); - GDR = (int)Math.Round((double)GDR / pixel_cnt); - BDR = (int)Math.Round((double)BDR / pixel_cnt); - - RUL = (int)Math.Round((double)RUL / pixel_cnt); - GUL = (int)Math.Round((double)GUL / pixel_cnt); - BUL = (int)Math.Round((double)BUL / pixel_cnt); - RUR = (int)Math.Round((double)RUR / pixel_cnt); - GUR = (int)Math.Round((double)GUR / pixel_cnt); - BUR = (int)Math.Round((double)BUR / pixel_cnt); - - string colorCode = ColorHelper.GetColorEscapeCode((byte)RUL, (byte)GUL, (byte)BUL, true); - if (lastFg != colorCode) { sb.Append(colorCode); lastFg = colorCode; } - colorCode = ColorHelper.GetColorEscapeCode((byte)RDL, (byte)GDL, (byte)BDL, false); - if (lagtBg != colorCode) { sb.Append(colorCode); lagtBg = colorCode; } - sb.Append('▀'); - - colorCode = ColorHelper.GetColorEscapeCode((byte)RUR, (byte)GUR, (byte)BUR, true); - if (lastFg != colorCode) { sb.Append(colorCode); lastFg = colorCode; } - colorCode = ColorHelper.GetColorEscapeCode((byte)RDR, (byte)GDR, (byte)BDR, false); - if (lagtBg != colorCode) { sb.Append(colorCode); lagtBg = colorCode; } - sb.Append('▀'); - } - if (base_y >= map.Height - scale) - sb.Append(ColorHelper.GetResetEscapeCode()); - else - sb.AppendLine(ColorHelper.GetResetEscapeCode()); - } - ConsoleIO.WriteLine(sb.ToString()); - } - } - - internal class McMap - { - public int MapId { get; set; } - public byte Scale { get; set; } - public bool TrackingPosition { get; set; } - public bool Locked { get; set; } - public List? MapIcons { get; set; } - public byte Width { get; set; } // rows - public byte Height { get; set; } // columns - public byte X { get; set; } - public byte Z { get; set; } - public byte[]? Colors; - public DateTime LastUpdated { get; set; } - } - - /// - /// Map packet base color palette. Colors are loaded from the embedded - /// MinimapBlockColors.json resource (map_palette section) generated by - /// tools/gen_block_color_map.py, which parses MapColor.java. - /// - internal static class MapColors - { - private static readonly Dictionary Colors; - - private static readonly byte[] ShadeMultipliers = [180, 220, 255, 135]; - - static MapColors() - { - Colors = new Dictionary(); - try - { - using var stream = System.Reflection.Assembly.GetExecutingAssembly() - .GetManifestResourceStream("MinimapBlockColors.json"); - if (stream is not null) - { - using var doc = System.Text.Json.JsonDocument.Parse(stream); - if (doc.RootElement.TryGetProperty("map_palette", out var palette)) - { - foreach (var prop in palette.EnumerateObject()) - { - if (!byte.TryParse(prop.Name, out byte id)) - continue; - var arr = prop.Value; - Colors[id] = [ - arr[0].GetByte(), - arr[1].GetByte(), - arr[2].GetByte() - ]; - } - } - } - } - catch (Exception ex) - { - ConsoleIO.WriteLogLine($"[Map] Failed to load map palette: {ex.Message}"); - } - } - - public static ColorRGBA ColorByteToRGBA(byte receivedColorId) - { - byte baseColorId = (byte)(receivedColorId >> 2); - - if (!Colors.TryGetValue(baseColorId, out byte[]? rgb)) - return new(248, 0, 248, 255, true); - - byte multiplier = ShadeMultipliers[receivedColorId & 3]; - - return new( - r: (byte)(rgb[0] * multiplier / 255), - g: (byte)(rgb[1] * multiplier / 255), - b: (byte)(rgb[2] * multiplier / 255), - a: 255 - ); - } - } -} diff --git a/MinecraftClient/ChatBots/McpServer.cs b/MinecraftClient/ChatBots/McpServer.cs deleted file mode 100644 index f9f7394d00..0000000000 --- a/MinecraftClient/ChatBots/McpServer.cs +++ /dev/null @@ -1,272 +0,0 @@ -using System; -using MinecraftClient.Mapping; -using MinecraftClient.Mcp; -using MinecraftClient.Scripting; -using Tomlet.Attributes; - -namespace MinecraftClient.ChatBots -{ - public class McpServer : ChatBot - { - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] - private const string BotName = "McpServer"; - - [TomlInlineComment("$ChatBot.McpServer.Enabled$")] - public bool Enabled = false; - - [TomlPrecedingComment("$ChatBot.McpServer.Transport$")] - public MccMcpTransportConfig Transport = new(); - - [TomlPrecedingComment("$ChatBot.McpServer.Capabilities$")] - public MccMcpCapabilityToggles Capabilities = new(); - - public void OnSettingUpdate() - { - Transport ??= new MccMcpTransportConfig(); - Capabilities ??= new MccMcpCapabilityToggles(); - - if (Transport.Port is < 1 or > 65535) - Transport.Port = 33333; - - if (string.IsNullOrWhiteSpace(Transport.BindHost)) - Transport.BindHost = "127.0.0.1"; - - if (string.IsNullOrWhiteSpace(Transport.Route)) - Transport.Route = "/mcp"; - - if (!Transport.Route.StartsWith('/')) - Transport.Route = "/" + Transport.Route; - - if (string.IsNullOrWhiteSpace(Transport.AuthTokenEnvVar)) - Transport.AuthTokenEnvVar = "MCC_MCP_AUTH_TOKEN"; - } - } - - private MccEmbeddedMcpHost? host; - - public override void Initialize() - { - Config.OnSettingUpdate(); - } - - public override void AfterGameJoined() - { - if (!Config.Enabled) - return; - - ClearStores(); - - MccMcpConfig mcpConfig = new() - { - Enabled = Config.Enabled, - Transport = Config.Transport, - Capabilities = Config.Capabilities - }; - - host ??= new MccEmbeddedMcpHost(mcpConfig, new MccMcpCapabilities(() => Config.Capabilities)); - - if (host.IsRunning) - return; - - LogToConsole(Translations.bot_mcpserver_starting); - if (!host.Start(out string? error)) - { - if (error == "missing_auth_token") - LogToConsole(string.Format(Translations.bot_mcpserver_missing_auth_token, Config.Transport.AuthTokenEnvVar)); - LogToConsole(string.Format(Translations.bot_mcpserver_start_failed, error ?? "unknown")); - return; - } - - LogToConsole(string.Format(Translations.bot_mcpserver_started, host.Endpoint)); - } - - public override bool OnDisconnect(DisconnectReason reason, string message) - { - MccObservedStateStore.AddRecentEvent("disconnect", new - { - reason = reason.ToString(), - message - }); - StopHost(); - ClearStores(); - return false; - } - - public override void OnUnload() - { - StopHost(); - ClearStores(); - } - - public override void GetText(string text, string? json) - { - string clean = GetVerbatim(text); - if (string.IsNullOrWhiteSpace(clean)) - return; - - string kind = "system"; - string? sender = null; - string? message = null; - - string parsedMessage = string.Empty; - string parsedSender = string.Empty; - if (IsPrivateMessage(clean, ref parsedMessage, ref parsedSender)) - { - kind = "private"; - sender = parsedSender; - message = parsedMessage; - } - else if (IsChatMessage(clean, ref parsedMessage, ref parsedSender)) - { - kind = "chat"; - sender = parsedSender; - message = parsedMessage; - } - - MccObservedStateStore.AddChatHistoryEntry(new MccChatHistoryEntry - { - TimestampUtc = DateTimeOffset.UtcNow, - Kind = kind, - Text = clean, - Sender = sender, - Message = message, - Json = json - }); - } - - public override void OnTimeUpdate(long WorldAge, long TimeOfDay) - { - MccObservedStateStore.SetTime(WorldAge, TimeOfDay); - } - - public override void OnRainLevelChange(float level) - { - MccObservedStateStore.SetRainLevel(level); - MccObservedStateStore.AddRecentEvent("weather_rain", new { level }); - } - - public override void OnThunderLevelChange(float level) - { - MccObservedStateStore.SetThunderLevel(level); - MccObservedStateStore.AddRecentEvent("weather_thunder", new { level }); - } - - public override void OnDeath() - { - MccObservedStateStore.AddRecentEvent("death"); - } - - public override void OnRespawn() - { - MccObservedStateStore.AddRecentEvent("respawn"); - } - - public override void OnPlayerJoin(Guid uuid, string name) - { - MccObservedStateStore.AddRecentEvent("player_join", new - { - uuid, - name - }); - } - - public override void OnPlayerLeave(Guid uuid, string? name) - { - MccObservedStateStore.AddRecentEvent("player_leave", new - { - uuid, - name - }); - } - - public override void OnInventoryOpen(int inventoryId) - { - MccObservedStateStore.AddRecentEvent("inventory_open", new { inventoryId }); - } - - public override void OnInventoryClose(int inventoryId) - { - MccObservedStateStore.AddRecentEvent("inventory_close", new { inventoryId }); - } - - public override void OnTitle(int action, string titletext, string subtitletext, string actionbartext, int fadein, int stay, int fadeout, string json) - { - if (action == 2) - { - MccObservedStateStore.AddRecentEvent("actionbar", new - { - action, - text = actionbartext, - fadein, - stay, - fadeout, - json - }); - return; - } - - if (action is 0 or 1) - { - MccObservedStateStore.AddRecentEvent("title", new - { - action, - titleText = titletext, - subtitleText = subtitletext, - fadein, - stay, - fadeout, - json - }); - } - } - - public override void OnBlockBreakAnimation(Entity entity, Location location, byte stage) - { - MccObservedStateStore.AddRecentEvent("block_break_animation", new - { - entityId = entity.ID, - entityType = entity.Type.ToString(), - stage, - location = new - { - x = location.X, - y = location.Y, - z = location.Z - } - }); - } - - public override void OnEntityAnimation(Entity entity, byte animation) - { - MccObservedStateStore.AddRecentEvent("entity_animation", new - { - entityId = entity.ID, - entityType = entity.Type.ToString(), - animation, - name = entity.Name, - customName = entity.CustomName - }); - } - - private void StopHost() - { - if (host is null || !host.IsRunning) - return; - - if (host.Stop(out string? error)) - LogToConsole(Translations.bot_mcpserver_stopped); - else - LogToConsole(string.Format(Translations.bot_mcpserver_stop_failed, error ?? "unknown")); - } - - private static void ClearStores() - { - MccObservedStateStore.ClearAll(); - } - } -} diff --git a/MinecraftClient/ChatBots/PlayerListLogger.cs b/MinecraftClient/ChatBots/PlayerListLogger.cs deleted file mode 100644 index 333ff1fd01..0000000000 --- a/MinecraftClient/ChatBots/PlayerListLogger.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using System.Text; -using MinecraftClient.Scripting; -using Tomlet.Attributes; - -namespace MinecraftClient.ChatBots -{ - /// - /// This bot sends a /list command every X seconds and save the result. - /// - - public class PlayerListLogger : ChatBot - { - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] - private const string BotName = "PlayerListLogger"; - - public bool Enabled = false; - - public string File = "playerlog.txt"; - - [TomlInlineComment("$ChatBot.PlayerListLogger.Delay$")] - public double Delay = 60; - - public void OnSettingUpdate() - { - File ??= string.Empty; - - if (Delay < 1.0) - Delay = 1.0; - } - } - - private int count = 0; - - public override void Update() - { - count++; - if (count >= Settings.DoubleToTick(Config.Delay)) - { - DateTime now = DateTime.Now; - - LogDebugToConsole("Saving Player List"); - - StringBuilder sb = new(); - sb.AppendLine(string.Format("[{0}/{1}/{2} {3}:{4}]", now.Year, now.Month, now.Day, now.Hour, now.Minute)); - sb.AppendLine(string.Join(", ", GetOnlinePlayers())).AppendLine(); - System.IO.File.AppendAllText(Settings.Config.AppVar.ExpandVars(Config.File), sb.ToString()); - - count = 0; - } - } - } -} diff --git a/MinecraftClient/ChatBots/RemoteControl.cs b/MinecraftClient/ChatBots/RemoteControl.cs deleted file mode 100644 index 301e16f85c..0000000000 --- a/MinecraftClient/ChatBots/RemoteControl.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using MinecraftClient.CommandHandler; -using MinecraftClient.Scripting; -using Tomlet.Attributes; - -namespace MinecraftClient.ChatBots -{ - /// - /// Allow to perform operations using whispers to the bot - /// - - public class RemoteControl : ChatBot - { - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] - private const string BotName = "RemoteControl"; - - public bool Enabled = false; - - public bool AutoTpaccept = true; - - public bool AutoTpaccept_Everyone = false; - - public void OnSettingUpdate() { } - } - - public override void GetText(string text) - { - text = GetVerbatim(text).Trim(); - string command = "", sender = ""; - if (IsPrivateMessage(text, ref command, ref sender) && Settings.Config.Main.Advanced.BotOwners.Contains(sender.ToLower().Trim())) - { - CmdResult response = new(); - PerformInternalCommand(command, ref response); - SendPrivateMessage(sender, response.ToString()); - } - else if (Config.AutoTpaccept - && IsTeleportRequest(text, ref sender) - && (Config.AutoTpaccept_Everyone || Settings.Config.Main.Advanced.BotOwners.Contains(sender.ToLower().Trim()))) - { - SendText("/tpaccept"); - } - } - } -} diff --git a/MinecraftClient/ChatBots/ReplayCapture.cs b/MinecraftClient/ChatBots/ReplayCapture.cs deleted file mode 100644 index 1c9b50cf74..0000000000 --- a/MinecraftClient/ChatBots/ReplayCapture.cs +++ /dev/null @@ -1,145 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.CommandHandler.Patch; -using MinecraftClient.Protocol; -using MinecraftClient.Scripting; -using Tomlet.Attributes; - -namespace MinecraftClient.ChatBots -{ - /// - /// Record and save replay file that can be used by the Replay mod (https://www.replaymod.com/) - /// - public class ReplayCapture : ChatBot - { - public const string CommandName = "replay"; - - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] - private const string BotName = "ReplayCapture"; - - public bool Enabled = false; - - [TomlInlineComment("$ChatBot.ReplayCapture.Backup_Interval$")] - public double Backup_Interval = 300.0; - - public void OnSettingUpdate() - { - if (Backup_Interval < -1) - Backup_Interval = -1; - } - } - - private ReplayHandler? replay; - private int backupCounter = -1; - - public override void Initialize() - { - SetNetworkPacketEventEnabled(true); - replay = new ReplayHandler(GetProtocolVersion(), $"{GetServerHost()}:{GetServerPort()}"); - backupCounter = Settings.DoubleToTick(Config.Backup_Interval); - - McClient.dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CommandName) - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - ) - ); - - McClient.dispatcher.Register(l => l.Literal(CommandName) - .Then(l => l.Literal("save") - .Executes(r => OnCommandSave(r.Source))) - .Then(l => l.Literal("stop") - .Executes(r => OnCommandStop(r.Source))) - .Then(l => l.Literal("_help") - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - .Redirect(McClient.dispatcher.GetRoot().GetChild("help").GetChild(CommandName))) - ); - } - - public override void OnUnload() - { - McClient.dispatcher.Unregister(CommandName); - McClient.dispatcher.GetRoot().GetChild("help").RemoveChild(CommandName); - replay?.Dispose(); - replay = null; - } - - private int OnCommandHelp(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => string.Format(Translations.general_available_cmd, "save, stop") - + '\n' + McClient.dispatcher.GetAllUsageString(CommandName, false), -#pragma warning restore format // @formatter:on - }); - } - - private int OnCommandSave(CmdResult r) - { - try - { - if (replay is { RecordRunning: true }) - { - replay.CreateBackupReplay(Path.Combine(replay.ReplayFileDirectory, replay.GetReplayDefaultName())); - return r.SetAndReturn(CmdResult.Status.Done, Translations.bot_replayCapture_created); - } - else - return r.SetAndReturn(CmdResult.Status.Fail, Translations.bot_replayCapture_restart); - } - catch (Exception e) - { - return r.SetAndReturn(CmdResult.Status.Fail, e.Message); - } - } - - private int OnCommandStop(CmdResult r) - { - try - { - if (replay is { RecordRunning: true }) - { - replay.OnShutDown(); - return r.SetAndReturn(CmdResult.Status.Done, Translations.bot_replayCapture_stopped); - } - else - return r.SetAndReturn(CmdResult.Status.Fail, Translations.bot_replayCapture_restart); - } - catch (Exception e) - { - return r.SetAndReturn(CmdResult.Status.Fail, e.Message); - } - } - - public override void OnNetworkPacket(int packetID, List packetData, bool isLogin, bool isInbound) - { - replay?.AddPacket(packetID, packetData, isLogin, isInbound); - } - - public override void Update() - { - if (Config.Backup_Interval > 0 && replay is { RecordRunning: true }) - { - if (backupCounter <= 0) - { - replay.CreateBackupReplay(replay.GetBackupReplayPath()); - backupCounter = Settings.DoubleToTick(Config.Backup_Interval); - } - else backupCounter--; - } - } - - public override bool OnDisconnect(DisconnectReason reason, string message) - { - replay?.OnShutDown(); - return base.OnDisconnect(reason, message); - } - } -} diff --git a/MinecraftClient/ChatBots/Script.cs b/MinecraftClient/ChatBots/Script.cs deleted file mode 100644 index 4f764aa4c1..0000000000 --- a/MinecraftClient/ChatBots/Script.cs +++ /dev/null @@ -1,283 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Reflection; -using System.Text; -using System.Threading; -using MinecraftClient.CommandHandler; -using MinecraftClient.Scripting; - -namespace MinecraftClient.ChatBots -{ - /// - /// Runs a list of commands - /// - - public class Script : ChatBot - { - private string? file; - private string[] lines = Array.Empty(); - private string[] args = Array.Empty(); - private int sleepticks = Settings.ClientTicksPerSecond; - private int nextline = 0; - private readonly string? owner; - private bool csharp; - private Thread? thread; - private readonly Dictionary? localVars; - private readonly string? scriptOwnerKey; - - public Script(string filename) - { - ParseArguments(filename); - } - - public Script(string filename, string? ownername, Dictionary? localVars) - : this(filename) - { - owner = ownername; - this.localVars = localVars; - } - - internal Script(string filename, string? ownername, Dictionary? localVars, string? scriptOwnerKey) - : this(filename, ownername, localVars) - { - this.scriptOwnerKey = scriptOwnerKey; - SetScriptOwnerKey(scriptOwnerKey); - } - - private void ParseArguments(string argstr) - { - List args = new(); - StringBuilder str = new(); - - bool escape = false; - bool quotes = false; - - foreach (char c in argstr) - { - if (escape) - { - if (c != '"') - str.Append('\\'); - str.Append(c); - escape = false; - } - else - { - if (c == '\\') - escape = true; - else if (c == '"') - quotes = !quotes; - else if (c == ' ' && !quotes) - { - if (str.Length > 0) - args.Add(str.ToString()); - str.Clear(); - } - else str.Append(c); - } - } - - if (str.Length > 0) - args.Add(str.ToString()); - - if (args.Count > 0) - { - file = args[0]; - args.RemoveAt(0); - this.args = args.ToArray(); - } - else file = ""; - } - - public static bool LookForScript(ref string filename) - { - //Automatically look in subfolders and try to add ".txt" file extension - char dir_slash = Path.DirectorySeparatorChar; - string[] files = new string[] - { - filename, - filename + ".txt", - filename + ".cs", - "scripts" + dir_slash + filename, - "scripts" + dir_slash + filename + ".txt", - "scripts" + dir_slash + filename + ".cs", - "config" + dir_slash + filename, - "config" + dir_slash + filename + ".txt", - "config" + dir_slash + filename + ".cs", - }; - - foreach (string possible_file in files) - { - if (System.IO.File.Exists(possible_file)) - { - filename = possible_file; - return true; - } - } - - if (Settings.Config.Logging.DebugMessages) - { - string caller = "Script"; - try - { - StackFrame frame = new(1); - MethodBase method = frame.GetMethod()!; - Type type = method.DeclaringType!; - caller = type.Name; - } - catch { } - ConsoleIO.WriteLineFormatted(string.Format(Translations.bot_script_not_found, caller, filename)); - } - - return false; - } - - public override void Initialize() - { - //Load the given file from the startup parameters - if (LookForScript(ref file!)) - { - lines = System.IO.File.ReadAllLines(file, Encoding.UTF8); - csharp = file.EndsWith(".cs"); - thread = null; - - if (!String.IsNullOrEmpty(owner)) - SendPrivateMessage(owner, string.Format(Translations.bot_script_pm_loaded, file)); - } - else - { - LogToConsole(string.Format(Translations.bot_script_file_not_found, System.IO.Path.GetFullPath(file))); - - if (!String.IsNullOrEmpty(owner)) - SendPrivateMessage(owner, string.Format(Translations.bot_script_file_not_found, file)); - - UnloadBot(); //No need to keep the bot active - } - } - - public override bool OnDisconnect(DisconnectReason reason, string message) - { - UnloadBot(); - return false; - } - - public override void Update() - { - if (csharp) //C# compiled script - { - //Initialize thread on first update - if (thread is null) - { - thread = new Thread(() => - { - try - { - CSharpRunner.Run(this, lines, args, localVars, scriptName: file!, scriptOwnerKey: scriptOwnerKey); - } - catch (CSharpException e) - { - string errorMessage = string.Format(Translations.bot_script_fail, file, e.ExceptionType); - LogToConsole(errorMessage); - if (owner is not null) - SendPrivateMessage(owner, errorMessage); - LogToConsole(e.InnerException); - } - }) - { - Name = "MCC Script - " + file - }; - thread.Start(); - } - - //Unload bot once the thread has finished running - if (thread is not null && !thread.IsAlive) - { - UnloadBot(); - } - } - else //Classic MCC script interpreter - { - if (sleepticks > 0) { sleepticks--; } - else - { - if (nextline < lines.Length) //Is there an instruction left to interpret? - { - string instruction_line = lines[nextline].Trim(); // Removes all whitespaces at start and end of current line - nextline++; //Move the cursor so that the next time the following line will be interpreted - - if (instruction_line.Length > 1) - { - if (instruction_line[0] != '#' && instruction_line[0] != '/' && instruction_line[1] != '/') - { - instruction_line = Settings.Config.AppVar.ExpandVars(instruction_line, localVars); - string instruction_name = instruction_line.Split(' ')[0]; - switch (instruction_name.ToLower()) - { - case "wait": - int ticks = Settings.ClientTicksPerSecond; - try - { - if (instruction_line[5..].Contains("to", StringComparison.OrdinalIgnoreCase) || - instruction_line[5..].Contains("-")) - { - var processedLine = instruction_line.Replace("wait", "") - .Trim() - .ToLower(); - processedLine = string.Join("", processedLine.Split(default(string[]), StringSplitOptions.RemoveEmptyEntries)); - var parts = processedLine.Contains("to") ? processedLine.Split("to") : processedLine.Split("-"); - - if (parts.Length == 2) - { - var min = Convert.ToInt32(parts[0]); - var max = Convert.ToInt32(parts[1]); - - if (min > max) - { - (min, max) = (max, min); - LogToConsole(Translations.cmd_wait_random_min_bigger); - } - - ticks = new Random().Next(min, max); - } - else ticks = Convert.ToInt32(instruction_line[5..]); - } - else ticks = Convert.ToInt32(instruction_line[5..]); - } - catch { } - sleepticks = ticks; - break; - default: - CmdResult response = new(); - if (PerformInternalCommand(instruction_line, ref response)) - { - if (instruction_name.ToLower() != "log") - { - LogToConsole(instruction_line); - } - if (response.status != CmdResult.Status.Done || !string.IsNullOrWhiteSpace(response.result)) - { - LogToConsole(response); - } - } - else - { - Update(); //Unknown command : process next line immediately - } - break; - } - } - else { Update(); } //Comment: process next line immediately - } - } - else - { - //No more instructions to interpret - UnloadBot(); - } - } - } - } - } -} diff --git a/MinecraftClient/ChatBots/ScriptScheduler.cs b/MinecraftClient/ChatBots/ScriptScheduler.cs deleted file mode 100644 index f5af44ecd7..0000000000 --- a/MinecraftClient/ChatBots/ScriptScheduler.cs +++ /dev/null @@ -1,320 +0,0 @@ -using System; -using MinecraftClient.CommandHandler; -using MinecraftClient.Scripting; -using Tomlet.Attributes; -using static MinecraftClient.ChatBots.ScriptScheduler.Configs; - -namespace MinecraftClient.ChatBots -{ - /// - /// Trigger scripts on specific events - /// - - public class ScriptScheduler : ChatBot - { - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] - private const string BotName = "ScriptScheduler"; - - public bool Enabled = false; - - public TaskConfig[] TaskList = new TaskConfig[] { - new TaskConfig( - Task_Name: "Task Name 1", - Trigger_On_First_Login: false, - Trigger_On_Login: false, - Trigger_On_Times: new(true, new TimeSpan[] { new(14, 00, 00) }), - Trigger_On_Interval: new(true, 3.6, 4.8), - Action: "send /hello" - ), - new TaskConfig( - Task_Name: "Task Name 2", - Trigger_On_First_Login: false, - Trigger_On_Login: true, - Trigger_On_Times: new(false, Array.Empty() ), - Trigger_On_Interval: new(false, 1, 10), - Action: "send /login pass" - ), - }; - - public void OnSettingUpdate() - { - foreach (TaskConfig task in TaskList) - { - task.Trigger_On_Interval.MinTime = Math.Max(0.1, task.Trigger_On_Interval.MinTime); - task.Trigger_On_Interval.MaxTime = Math.Max(0.1, task.Trigger_On_Interval.MaxTime); - if (task.Trigger_On_Interval.MinTime > task.Trigger_On_Interval.MaxTime) - (task.Trigger_On_Interval.MinTime, task.Trigger_On_Interval.MaxTime) = (task.Trigger_On_Interval.MaxTime, task.Trigger_On_Interval.MinTime); - - //Look for a valid action - if (!String.IsNullOrWhiteSpace(task.Action)) - { - //Look for a valid trigger - if (task.Trigger_On_Login - || task.Trigger_On_First_Login - || (task.Trigger_On_Times.Enable && task.Trigger_On_Times.Times.Length > 0) - || (task.Trigger_On_Interval.Enable && task.Trigger_On_Interval.MinTime > 0)) - { - if (Settings.Config.Logging.DebugMessages) - LogToConsole(BotName, string.Format(Translations.bot_scriptScheduler_loaded_task, Task2String(task))); - task.Trigger_On_Interval_Countdown = Settings.DoubleToTick(task.Trigger_On_Interval.MinTime); //Init countdown for interval - } - else - { - if (Settings.Config.Logging.DebugMessages) - LogToConsole(BotName, string.Format(Translations.bot_scriptScheduler_no_trigger, Task2String(task))); - } - } - else - { - task.Action ??= string.Empty; - if (Settings.Config.Logging.DebugMessages) - LogToConsole(BotName, string.Format(Translations.bot_scriptScheduler_no_action, Task2String(task))); - } - } - - if (Enabled && TaskList.Length == 0) - { - LogToConsole(BotName, Translations.general_bot_unload); - Enabled = false; - } - } - - public class TaskConfig - { - public string Task_Name = "Task Name (Can be empty)"; - public bool Trigger_On_First_Login = false; - public bool Trigger_On_Login = false; - public TriggerOnTimeConfig Trigger_On_Times = new(false, new TimeSpan[] { new(23, 59, 59) }); - public TriggerOnIntervalConfig Trigger_On_Interval = new(false, 1, 10); - public string Action = "send /hello"; - - [NonSerialized] - public bool Trigger_On_Time_Already_Triggered = false; - - [NonSerialized] - public int Trigger_On_Interval_Countdown = 0; - - public TaskConfig() { } - - public TaskConfig(string Task_Name, bool Trigger_On_First_Login, bool Trigger_On_Login, TriggerOnTimeConfig Trigger_On_Times, TriggerOnIntervalConfig Trigger_On_Interval, string Action) - { - this.Task_Name = Task_Name; - this.Trigger_On_First_Login = Trigger_On_First_Login; - this.Trigger_On_Login = Trigger_On_Login; - this.Trigger_On_Times = Trigger_On_Times; - this.Trigger_On_Interval = Trigger_On_Interval; - this.Action = Action; - } - - public struct TriggerOnTimeConfig - { - public bool Enable = false; - public TimeSpan[] Times; - - public TriggerOnTimeConfig() - { - Enable = false; - Times = Array.Empty(); - } - - public TriggerOnTimeConfig(bool Enable, TimeSpan[] Time) - { - this.Enable = Enable; - this.Times = Time; - } - - public TriggerOnTimeConfig(TimeSpan[] Time) - { - this.Enable = true; - this.Times = Time; - } - } - - public struct TriggerOnIntervalConfig - { - public bool Enable = false; - public double MinTime, MaxTime; - - public TriggerOnIntervalConfig() - { - Enable = false; - MinTime = 0; - MaxTime = 0; - } - - public TriggerOnIntervalConfig(double value) - { - this.Enable = true; - MinTime = MaxTime = value; - } - - public TriggerOnIntervalConfig(bool Enable, double value) - { - this.Enable = Enable; - MinTime = MaxTime = value; - } - - public TriggerOnIntervalConfig(double min, double max) - { - this.MinTime = min; - this.MaxTime = max; - } - - public TriggerOnIntervalConfig(bool Enable, double min, double max) - { - this.Enable = Enable; - this.MinTime = min; - this.MaxTime = max; - } - } - } - } - - private Random random = new(); - - private static bool firstlogin_done = false; - - private bool serverlogin_done = false; - private int verifytasks_timeleft = Settings.ClientTicksPerSecond; - private readonly int verifytasks_delay = Settings.ClientTicksPerSecond; - - public override void AfterGameJoined() - { - if (serverlogin_done) - return; - - serverlogin_done = true; - verifytasks_timeleft = verifytasks_delay; - RunLoginTasks(); - } - - public override void Update() - { - if (!serverlogin_done) - return; - - if (verifytasks_timeleft <= 0) - { - verifytasks_timeleft = verifytasks_delay; - for (int taskIndex = 0; taskIndex < Config.TaskList.Length; taskIndex++) - { - TaskConfig task = Config.TaskList[taskIndex]; - if (task.Trigger_On_Times.Enable) - { - bool matching_time_found = false; - - foreach (TimeSpan time in task.Trigger_On_Times.Times) - { - if (time.Hours == DateTime.Now.Hour && time.Minutes == DateTime.Now.Minute) - { - matching_time_found = true; - if (!task.Trigger_On_Time_Already_Triggered) - { - task.Trigger_On_Time_Already_Triggered = true; - RunTaskAction(task, taskIndex, string.Format(Translations.bot_scriptScheduler_running_time, task.Action)); - } - } - } - - if (!matching_time_found) - task.Trigger_On_Time_Already_Triggered = false; - } - } - } - else verifytasks_timeleft--; - - for (int taskIndex = 0; taskIndex < Config.TaskList.Length; taskIndex++) - { - TaskConfig task = Config.TaskList[taskIndex]; - if (task.Trigger_On_Interval.Enable) - { - if (task.Trigger_On_Interval_Countdown == 0) - { - task.Trigger_On_Interval_Countdown = random.Next( - Settings.DoubleToTick(task.Trigger_On_Interval.MinTime), Settings.DoubleToTick(task.Trigger_On_Interval.MaxTime) - ); - RunTaskAction(task, taskIndex, string.Format(Translations.bot_scriptScheduler_running_inverval, task.Action)); - } - else task.Trigger_On_Interval_Countdown--; - } - } - } - - public override bool OnDisconnect(DisconnectReason reason, string message) - { - serverlogin_done = false; - return false; - } - - private void RunLoginTasks() - { - bool isFirstLogin = !firstlogin_done; - - for (int taskIndex = 0; taskIndex < Config.TaskList.Length; taskIndex++) - { - TaskConfig task = Config.TaskList[taskIndex]; - if (task.Trigger_On_Login || (isFirstLogin && task.Trigger_On_First_Login)) - RunTaskAction(task, taskIndex, string.Format(Translations.bot_scriptScheduler_running_login, task.Action)); - } - - firstlogin_done = true; - } - - private void RunTaskAction(TaskConfig task, int taskIndex, string debugMessage) - { - LogDebugToConsole(debugMessage); - - if (TryRunOwnedScript(task, taskIndex)) - return; - - CmdResult response = new(); - PerformInternalCommand(task.Action, ref response); - if (response.status != CmdResult.Status.Done || !string.IsNullOrWhiteSpace(response.result)) - LogToConsole(response); - } - - private bool TryRunOwnedScript(TaskConfig task, int taskIndex) - { - string action = task.Action.Trim(); - const string scriptCommand = "script"; - if (!action.StartsWith(scriptCommand, StringComparison.OrdinalIgnoreCase)) - return false; - - if (action.Length == scriptCommand.Length || !char.IsWhiteSpace(action[scriptCommand.Length])) - return false; - - string scriptArgs = action[scriptCommand.Length..].Trim(); - if (string.IsNullOrWhiteSpace(scriptArgs)) - return false; - - string scriptOwnerKey = BuildScriptOwnerKey(task, taskIndex); - Handler.UnloadBotsByScriptOwnerKey(scriptOwnerKey); - Handler.BotLoad(new Script(scriptArgs, null, null, scriptOwnerKey)); - return true; - } - - private static string BuildScriptOwnerKey(TaskConfig task, int taskIndex) - { - return $"{nameof(ScriptScheduler)}:{taskIndex}:{task.Task_Name}:{task.Action.Trim()}"; - } - - private static string Task2String(TaskConfig task) - { - return string.Format( - Translations.bot_scriptScheduler_task, - task.Trigger_On_First_Login, - task.Trigger_On_Login, - task.Trigger_On_Times.Enable, - task.Trigger_On_Interval.Enable, - string.Join(", ", Array.ConvertAll(task.Trigger_On_Times.Times, time => time.ToString())), - task.Trigger_On_Interval.MinTime + '-' + task.Trigger_On_Interval.MaxTime, - task.Action - ); - } - } -} diff --git a/MinecraftClient/ChatBots/TelegramBridge.cs b/MinecraftClient/ChatBots/TelegramBridge.cs deleted file mode 100644 index f53ea28cc8..0000000000 --- a/MinecraftClient/ChatBots/TelegramBridge.cs +++ /dev/null @@ -1,400 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.CommandHandler.Patch; -using MinecraftClient.Scripting; -using Telegram.Bot; -using Telegram.Bot.Exceptions; -using Telegram.Bot.Polling; -using Telegram.Bot.Types; -using Telegram.Bot.Types.Enums; -using Tomlet.Attributes; -using File = System.IO.File; - -namespace MinecraftClient.ChatBots -{ - public class TelegramBridge : ChatBot - { - public const string CommandName = "tgbridge"; - - private enum BridgeDirection - { - Both = 0, - Minecraft, - Telegram - } - - private static TelegramBridge? instance = null; - public bool IsConnected { get; private set; } - - private TelegramBotClient? botClient; - private CancellationTokenSource? cancellationToken; - private BridgeDirection bridgeDirection = BridgeDirection.Both; - - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] - private const string BotName = "TelegramBridge"; - - public bool Enabled = false; - - [TomlInlineComment("$ChatBot.TelegramBridge.Token$")] - public string Token = "your bot token here"; - - [TomlInlineComment("$ChatBot.TelegramBridge.ChannelId$")] - public string ChannelId = ""; - - [TomlInlineComment("$ChatBot.TelegramBridge.Authorized_Chat_Ids$")] - public long[] Authorized_Chat_Ids = Array.Empty(); - - [TomlInlineComment("$ChatBot.TelegramBridge.MessageSendTimeout$")] - public int Message_Send_Timeout = 3; - - [TomlPrecedingComment("$ChatBot.TelegramBridge.Formats$")] - public string PrivateMessageFormat = "*(Private Message)* {username}: {message}"; - public string PublicMessageFormat = "{username}: {message}"; - public string TeleportRequestMessageFormat = "A new Teleport Request from **{username}**!"; - - public void OnSettingUpdate() - { - Message_Send_Timeout = Message_Send_Timeout <= 0 ? 3 : Message_Send_Timeout; - } - } - - public TelegramBridge() - { - instance = this; - } - - public override void Initialize() - { - McClient.dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CommandName) - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - ) - ); - - McClient.dispatcher.Register(l => l.Literal(CommandName) - .Then(l => l.Literal("direction") - .Then(l => l.Literal("both") - .Executes(r => OnCommandDirection(r.Source, BridgeDirection.Both))) - .Then(l => l.Literal("mc") - .Executes(r => OnCommandDirection(r.Source, BridgeDirection.Minecraft))) - .Then(l => l.Literal("telegram") - .Executes(r => OnCommandDirection(r.Source, BridgeDirection.Telegram)))) - .Then(l => l.Literal("_help") - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - .Redirect(McClient.dispatcher.GetRoot().GetChild("help").GetChild(CommandName))) - ); - - Task.Run(async () => await MainAsync()); - } - - public override void OnUnload() - { - McClient.dispatcher.Unregister(CommandName); - McClient.dispatcher.GetRoot().GetChild("help").RemoveChild(CommandName); - Disconnect(); - } - - private int OnCommandHelp(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => Translations.error_usage + ": /tgbridge direction " - + '\n' + McClient.dispatcher.GetAllUsageString(CommandName, false), -#pragma warning restore format // @formatter:on - }); - } - - private int OnCommandDirection(CmdResult r, BridgeDirection direction) - { - string bridgeName; - switch (direction) - { - case BridgeDirection.Both: - bridgeName = Translations.bot_TelegramBridge_direction_both; - bridgeDirection = BridgeDirection.Both; - break; - - case BridgeDirection.Minecraft: - bridgeName = Translations.bot_TelegramBridge_direction_minecraft; - bridgeDirection = BridgeDirection.Minecraft; - break; - - case BridgeDirection.Telegram: - bridgeName = Translations.bot_TelegramBridge_direction_Telegram; - bridgeDirection = BridgeDirection.Telegram; - break; - - default: - goto case BridgeDirection.Both; - } - return r.SetAndReturn(CmdResult.Status.Done, string.Format(Translations.bot_TelegramBridge_direction, bridgeName)); - } - - ~TelegramBridge() - { - Disconnect(); - } - - private void Disconnect() - { - if (botClient is not null) - { - try - { - SendMessage(Translations.bot_TelegramBridge_disconnected); - cancellationToken?.Cancel(); - botClient = null; - } - catch (Exception e) - { - LogToConsole("§§4§l§f" + Translations.bot_TelegramBridge_canceled_sending); - LogDebugToConsole(e); - } - - IsConnected = false; - } - } - - public static TelegramBridge? GetInstance() - { - return instance; - } - - public override void GetText(string text) - { - if (!CanSendMessages()) - return; - - text = GetVerbatim(text).Trim(); - - // Stop the crash when an empty text is recived somehow - if (string.IsNullOrEmpty(text)) - return; - - string message = ""; - string username = ""; - - if (IsPrivateMessage(text, ref message, ref username)) - message = Config.PrivateMessageFormat.Replace("{username}", username).Replace("{message}", message).Replace("{timestamp}", GetTimestamp()).Trim(); - else if (IsChatMessage(text, ref message, ref username)) - message = Config.PublicMessageFormat.Replace("{username}", username).Replace("{message}", message).Replace("{timestamp}", GetTimestamp()).Trim(); - else if (IsTeleportRequest(text, ref username)) - message = Config.TeleportRequestMessageFormat.Replace("{username}", username).Replace("{timestamp}", GetTimestamp()).Trim(); - - else message = text; - - SendRawMessage(message); - } - - public void SendMessage(string message) - { - if (!CanSendMessages() || string.IsNullOrEmpty(message)) - return; - - try - { - botClient!.SendMessage(Config.ChannelId.Trim(), message, parseMode: ParseMode.Markdown).Wait(Config.Message_Send_Timeout); - } - catch (Exception e) - { - LogToConsole("§§4§l§f" + Translations.bot_TelegramBridge_canceled_sending); - LogDebugToConsole(e); - } - } - - public void SendRawMessage(string message) - { - if (!CanSendMessages() || string.IsNullOrEmpty(message)) - return; - - try - { - botClient!.SendMessage(Config.ChannelId.Trim(), message).Wait(Config.Message_Send_Timeout); - } - catch (Exception e) - { - LogToConsole("§§4§l§f" + Translations.bot_TelegramBridge_canceled_sending); - LogDebugToConsole(e); - } - } - - public void SendImage(string filePath, string? text = null) - { - if (!CanSendMessages()) - return; - - try - { - string fileName = filePath[(filePath.IndexOf(Path.DirectorySeparatorChar) + 1)..]; - - Stream stream = File.OpenRead(filePath); - botClient!.SendDocument( - Config.ChannelId.Trim(), - document: InputFile.FromStream(stream, fileName), - caption: text, - parseMode: ParseMode.Markdown).Wait(Config.Message_Send_Timeout * 1000); - } - catch (Exception e) - { - LogToConsole("§§4§l§f" + Translations.bot_TelegramBridge_canceled_sending); - LogDebugToConsole(e); - } - } - - private bool CanSendMessages() - { - return botClient is not null && !string.IsNullOrEmpty(Config.ChannelId.Trim()) && bridgeDirection != BridgeDirection.Minecraft; - } - - async Task MainAsync() - { - try - { - if (string.IsNullOrEmpty(Config.Token.Trim())) - { - LogToConsole(Translations.bot_TelegramBridge_missing_token); - UnloadBot(); - return; - } - - if (string.IsNullOrEmpty(Config.ChannelId.Trim())) - LogToConsole("§§4§l§f" + Translations.bot_TelegramBridge_missing_channel_id); - - botClient = new TelegramBotClient(Config.Token.Trim()); - cancellationToken = new CancellationTokenSource(); - - botClient.StartReceiving( - HandleUpdateAsync, - HandlePollingErrorAsync, - new ReceiverOptions - { - // receive all update types - AllowedUpdates = Array.Empty() - }, - cancellationToken.Token - ); - - IsConnected = true; - - SendMessage($"✅ {Translations.bot_TelegramBridge_connected}"); - LogToConsole($"§§2§l§f{Translations.bot_TelegramBridge_connected}"); - - if (Config.Authorized_Chat_Ids.Length == 0) - { - SendMessage($"⚠️ *{Translations.bot_TelegramBridge_missing_authorized_channels}* ⚠️"); - LogToConsole($"§§4§l§f{Translations.bot_TelegramBridge_missing_authorized_channels}"); - return; - } - - await Task.Delay(-1); - } - catch (Exception e) - { - LogToConsole($"§§4§l§f{Translations.bot_TelegramBridge_unknown_error}"); - LogToConsole(e); - return; - } - } - - private async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken _cancellationToken) - { - // Only process Message updates: https://core.telegram.org/bots/api#message - if (update.Message is not { } message) - return; - - // Only process text messages - if (message.Text is not { } messageText) - return; - - var chatId = message.Chat.Id; - var text = message.Text; - - if (string.IsNullOrEmpty(text) || string.IsNullOrWhiteSpace(text)) - return; - - if (text.ToLower().Contains("/start")) - return; - - if (text.ToLower().Contains(".chatid")) - { - await botClient.SendMessage(chatId: chatId, - text: $"Chat ID: {chatId}", - replyParameters: message.MessageId, - cancellationToken: _cancellationToken, - parseMode: ParseMode.Markdown); - return; - } - - if (Config.Authorized_Chat_Ids.Length > 0 && !Config.Authorized_Chat_Ids.Contains(chatId)) - { - LogDebugToConsole($"Unauthorized message '{messageText}' received in a chat with with an ID: {chatId} !"); - await botClient.SendMessage( - chatId: chatId, - text: Translations.bot_TelegramBridge_unauthorized, - replyParameters: message.MessageId, - cancellationToken: _cancellationToken, - parseMode: ParseMode.Markdown); - return; - } - - LogDebugToConsole($"Received a '{messageText}' message in a chat with with an ID: {chatId} ."); - - if (bridgeDirection == BridgeDirection.Telegram) - { - if (!text.StartsWith(".dscbridge")) - return; - } - - if (text.StartsWith(".")) - { - var command = text[1..]; - - if (command.ToLower().Contains("quit") || command.ToLower().Contains("exit")) - { - await botClient.SendMessage( - chatId: chatId, - text: $"{Translations.bot_TelegramBridge_quit_disabled}", - replyParameters: message.MessageId, - cancellationToken: _cancellationToken, - parseMode: ParseMode.Markdown); - return; ; - } - - CmdResult result = new(); - PerformInternalCommand(command, ref result); - - await botClient.SendMessage( - chatId: chatId, - text: $"{Translations.bot_TelegramBridge_command_executed}:\n\n{result}", - replyParameters: message.MessageId, - cancellationToken: _cancellationToken, - parseMode: ParseMode.Markdown); - } - else SendText(text); - } - - private Task HandlePollingErrorAsync(ITelegramBotClient botClient, Exception exception, CancellationToken _cancellationToken) - { - var ErrorMessage = exception switch - { - ApiRequestException apiRequestException - => $"Telegram API Error:\n[{apiRequestException.ErrorCode}]\n{apiRequestException.Message}", - _ => exception.ToString() - }; - - LogToConsole("§§4§l§f" + ErrorMessage); - return Task.CompletedTask; - } - } -} diff --git a/MinecraftClient/ChatBots/TestBot.cs b/MinecraftClient/ChatBots/TestBot.cs deleted file mode 100644 index 8b10353564..0000000000 --- a/MinecraftClient/ChatBots/TestBot.cs +++ /dev/null @@ -1,27 +0,0 @@ -using MinecraftClient.Scripting; - -namespace MinecraftClient.ChatBots -{ - /// - /// Example of message receiving. - /// - - public class TestBot : ChatBot - { - public override void GetText(string text) - { - string message = ""; - string username = ""; - text = GetVerbatim(text); - - if (IsPrivateMessage(text, ref message, ref username)) - { - LogToConsole(string.Format(Translations.bot_testBot_told, username, message)); - } - else if (IsChatMessage(text, ref message, ref username)) - { - LogToConsole(string.Format(Translations.bot_testBot_said, username, message)); - } - } - } -} diff --git a/MinecraftClient/ClassicConsoleBackend.cs b/MinecraftClient/ClassicConsoleBackend.cs deleted file mode 100644 index 38411413ab..0000000000 --- a/MinecraftClient/ClassicConsoleBackend.cs +++ /dev/null @@ -1,235 +0,0 @@ -using System; -using System.Text.RegularExpressions; - -namespace MinecraftClient -{ - /// - /// Console backend wrapping the ConsoleInteractive library (existing behavior). - /// - public partial class ClassicConsoleBackend : IConsoleBackend - { - private static readonly (byte R, byte G, byte B, char Code)[] McStandardColors = - [ - (0, 0, 0, '0'), // black - (0, 0, 170, '1'), // dark_blue - (0, 170, 0, '2'), // dark_green - (0, 170, 170, '3'), // dark_aqua - (170, 0, 0, '4'), // dark_red - (170, 0, 170, '5'), // dark_purple - (255, 170, 0, '6'), // gold - (170, 170, 170, '7'), // gray - (85, 85, 85, '8'), // dark_gray - (85, 85, 255, '9'), // blue - (85, 255, 85, 'a'), // green - (85, 255, 255, 'b'), // aqua - (255, 85, 85, 'c'), // red - (255, 85, 255, 'd'), // light_purple - (255, 255, 85, 'e'), // yellow - (255, 255, 255, 'f'), // white - ]; - - [GeneratedRegex("§#([0-9a-fA-F]{6})")] - private static partial Regex HexColorRegex(); - - private static char NearestMcColor(byte r, byte g, byte b) - { - int bestIdx = 0; - long bestDist = long.MaxValue; - - for (int i = 0; i < McStandardColors.Length; i++) - { - var (sr, sg, sb, _) = McStandardColors[i]; - long dr = r - sr; - long dg = g - sg; - long db = b - sb; - long dist = dr * dr + dg * dg + db * db; - if (dist < bestDist) - { - bestDist = dist; - bestIdx = i; - } - } - - return McStandardColors[bestIdx].Code; - } - - private static string ResolveHexColors(string text) - { - if (string.IsNullOrEmpty(text) || !text.Contains("§#", StringComparison.Ordinal)) - return text; - - return HexColorRegex().Replace(text, match => - { - ReadOnlySpan hex = match.Groups[1].ValueSpan; - byte r = (byte)((HexVal(hex[0]) << 4) | HexVal(hex[1])); - byte g = (byte)((HexVal(hex[2]) << 4) | HexVal(hex[3])); - byte b = (byte)((HexVal(hex[4]) << 4) | HexVal(hex[5])); - return ColorHelper.GetColorEscapeCode(r, g, b, foreground: true); - }); - } - - private static int HexVal(char c) => c switch - { - >= '0' and <= '9' => c - '0', - >= 'a' and <= 'f' => c - 'a' + 10, - >= 'A' and <= 'F' => c - 'A' + 10, - _ => 0 - }; - - public event EventHandler? MessageReceived; - public event EventHandler? OnInputChange; - - public bool DisplayUserInput - { - get => ConsoleInteractive.ConsoleReader.DisplayUesrInput; - set => ConsoleInteractive.ConsoleReader.DisplayUesrInput = value; - } - - public void Init() - { - ConsoleInteractive.ConsoleWriter.Init(); - } - - public void WriteLine(string text) - { - ConsoleInteractive.ConsoleWriter.WriteLine(text); - } - - public void WriteLineFormatted(string text) - { - ConsoleInteractive.ConsoleWriter.WriteLineFormatted(ResolveHexColors(text)); - } - - public void BeginReadThread() - { - ConsoleInteractive.ConsoleReader.MessageReceived += ForwardMessage; - ConsoleInteractive.ConsoleReader.OnInputChange += ForwardInputChange; - ConsoleInteractive.ConsoleReader.BeginReadThread(); - } - - public void StopReadThread() - { - ConsoleInteractive.ConsoleReader.StopReadThread(); - ConsoleInteractive.ConsoleReader.MessageReceived -= ForwardMessage; - ConsoleInteractive.ConsoleReader.OnInputChange -= ForwardInputChange; - } - - public string RequestImmediateInput() - { - return ConsoleInteractive.ConsoleReader.RequestImmediateInput(); - } - - public string? ReadPassword() - { - ConsoleInteractive.ConsoleReader.SetInputVisible(false); - var input = ConsoleInteractive.ConsoleReader.RequestImmediateInput(); - ConsoleInteractive.ConsoleReader.SetInputVisible(true); - return input; - } - - public void ClearInputBuffer() - { - ConsoleInteractive.ConsoleReader.ClearBuffer(); - } - - public void ClearScreen() - { - Console.Clear(); - ConsoleInteractive.ConsoleSuggestion.ClearSuggestions(); - } - - public void SetInputVisible(bool visible) - { - ConsoleInteractive.ConsoleReader.SetInputVisible(visible); - } - - public void SetBackreadBufferLimit(int limit) - { - ConsoleInteractive.ConsoleBuffer.SetBackreadBufferLimit(limit); - } - - public void Shutdown() - { - ConsoleInteractive.ConsoleSuggestion.ClearSuggestions(); - } - - #region Suggestion forwarding for classic mode - - public void UpdateSuggestions( - ConsoleInteractive.ConsoleSuggestion.Suggestion[] suggestions, - Tuple range) - { - ConsoleInteractive.ConsoleSuggestion.UpdateSuggestions(suggestions, range); - } - - public void ClearSuggestions() - { - ConsoleInteractive.ConsoleSuggestion.ClearSuggestions(); - } - - public void SetSuggestionColors( - string textColor, string textBgColor, - string hlTextColor, string hlTextBgColor, - string tooltipColor, string hlTooltipColor, - string arrowColor) - { - ConsoleInteractive.ConsoleSuggestion.SetColors( - textColor, textBgColor, - hlTextColor, hlTextBgColor, - tooltipColor, hlTooltipColor, - arrowColor); - } - - public bool EnableSuggestionColor - { - get => ConsoleInteractive.ConsoleSuggestion.EnableColor; - set => ConsoleInteractive.ConsoleSuggestion.EnableColor = value; - } - - public bool Enable24bitColor - { - get => ConsoleInteractive.ConsoleSuggestion.Enable24bitColor; - set => ConsoleInteractive.ConsoleSuggestion.Enable24bitColor = value; - } - - public bool UseBasicArrow - { - get => ConsoleInteractive.ConsoleSuggestion.UseBasicArrow; - set => ConsoleInteractive.ConsoleSuggestion.UseBasicArrow = value; - } - - public int SetMaxSuggestionLength(int length) - { - return ConsoleInteractive.ConsoleSuggestion.SetMaxSuggestionLength(length); - } - - public int SetMaxSuggestionCount(int count) - { - return ConsoleInteractive.ConsoleSuggestion.SetMaxSuggestionCount(count); - } - - public bool EnableWriterColor - { - get => ConsoleInteractive.ConsoleWriter.EnableColor; - set => ConsoleInteractive.ConsoleWriter.EnableColor = value; - } - - public bool UseVT100ColorCode - { - get => ConsoleInteractive.ConsoleWriter.UseVT100ColorCode; - set => ConsoleInteractive.ConsoleWriter.UseVT100ColorCode = value; - } - - #endregion - - private void ForwardMessage(object? sender, string e) - { - MessageReceived?.Invoke(sender, e); - } - - private void ForwardInputChange(object? sender, ConsoleInteractive.ConsoleReader.Buffer buffer) - { - OnInputChange?.Invoke(sender, new ConsoleInputBuffer(buffer.Text, buffer.CursorPosition)); - } - } -} diff --git a/MinecraftClient/ColorHelper.cs b/MinecraftClient/ColorHelper.cs deleted file mode 100644 index 4c7880aa3d..0000000000 --- a/MinecraftClient/ColorHelper.cs +++ /dev/null @@ -1,207 +0,0 @@ -using System; -using static MinecraftClient.Settings.ConsoleConfigHealper.ConsoleConfig; - -namespace MinecraftClient -{ - public static class ColorHelper - { - // ANSI escape code - Colors: https://en.wikipedia.org/wiki/ANSI_escape_code#Colors - - private static readonly Tuple[] ColorMap4 = new Tuple[] - { - new(new(0, 0, 0), 40), - new(new(128, 0, 0), 41), - new(new(0, 128, 0), 42), - new(new(151, 109, 77), 43), - new(new(45, 45, 180), 44), - new(new(128, 0, 128), 45), - new(new(138, 138, 220), 46), - new(new(174, 164, 115), 47), - new(new(96, 96, 96), 100), - new(new(255, 0, 0), 101), - new(new(127, 178, 56), 102), - new(new(213, 201, 140), 103), - new(new(64, 64, 255), 104), - new(new(255, 0, 255), 105), - new(new(0, 255, 255), 106), - new(new(255, 255, 255), 107), - }; - - private static readonly Tuple[] ColorMap8 = new Tuple[] - { - new(new(0, 0, 0), 0), - new(new(128, 0, 0), 1), - new(new(0, 128, 0), 2), - new(new(128, 128, 0), 3), - new(new(0, 0, 128), 4), - new(new(128, 0, 128), 5), - new(new(0, 128, 128), 6), - new(new(192, 192, 192), 7), - new(new(128, 128, 128), 8), - new(new(255, 0, 0), 9), - new(new(0, 255, 0), 10), - new(new(255, 255, 0), 11), - new(new(0, 0, 255), 12), - new(new(255, 0, 255), 13), - new(new(0, 255, 255), 14), - new(new(255, 255, 255), 15), - new(new(8, 8, 8), 232), - new(new(18, 18, 18), 233), - new(new(28, 28, 28), 234), - new(new(38, 38, 38), 235), - new(new(48, 48, 48), 236), - new(new(58, 58, 58), 237), - new(new(68, 68, 68), 238), - new(new(78, 78, 78), 239), - new(new(88, 88, 88), 240), - new(new(98, 98, 98), 241), - new(new(108, 108, 108), 242), - new(new(118, 118, 118), 243), - new(new(128, 128, 128), 244), - new(new(138, 138, 138), 245), - new(new(148, 148, 148), 246), - new(new(158, 158, 158), 247), - new(new(168, 168, 168), 248), - new(new(178, 178, 178), 249), - new(new(188, 188, 188), 250), - new(new(198, 198, 198), 251), - new(new(208, 208, 208), 252), - new(new(218, 218, 218), 253), - new(new(228, 228, 228), 254), - new(new(238, 238, 238), 255), - }; - - private static readonly byte[] ColorMap8_Step = new byte[] { 0, 95, 135, 175, 215, 255 }; - - public static string GetColorEscapeCode(byte R, byte G, byte B, bool foreground) - { - return GetColorEscapeCode(R, G, B, foreground, Settings.Config.Console.General.ConsoleColorMode); - } - - public static string GetColorEscapeCode(byte R, byte G, byte B, bool foreground, ConsoleColorModeType colorDepth) - { - switch (colorDepth) - { - case ConsoleColorModeType.disable: - return string.Empty; - - case ConsoleColorModeType.legacy_4bit: - { - ColorRGBA color = new(R, G, B); - int best_idx = 0; - double min_distance = ColorMap4[0].Item1.Distance(color); - for (int i = 1; i < ColorMap4.Length; ++i) - { - double distance = ColorMap4[i].Item1.Distance(color); - if (distance < min_distance) - { - min_distance = distance; - best_idx = i; - } - } - if (foreground) - return $"§{best_idx:x}"; - else - return $"§§{best_idx:x}"; - } - - case ConsoleColorModeType.vt100_4bit: - { - ColorRGBA color = new(R, G, B); - int best_idx = 0; - double min_distance = ColorMap4[0].Item1.Distance(color); - for (int i = 1; i < ColorMap4.Length; ++i) - { - double distance = ColorMap4[i].Item1.Distance(color); - if (distance < min_distance) - { - min_distance = distance; - best_idx = i; - } - } - return string.Format("\u001b[{0}m", ColorMap4[best_idx].Item2 - (foreground ? 10 : 0)); - } - - case ConsoleColorModeType.vt100_8bit: - { - ColorRGBA color = new(R, G, B); - int R_idx = (int)(R <= 95 ? Math.Round(R / 95.0) : 1 + Math.Round((R - 95.0) / 40.0)); - int G_idx = (int)(G <= 95 ? Math.Round(G / 95.0) : 1 + Math.Round((G - 95.0) / 40.0)); - int B_idx = (int)(B <= 95 ? Math.Round(B / 95.0) : 1 + Math.Round((B - 95.0) / 40.0)); - - int best_idx = -1; - double min_distance = color.Distance(new ColorRGBA(ColorMap8_Step[R_idx], - ColorMap8_Step[G_idx], - ColorMap8_Step[B_idx])); - for (int i = 0; i < ColorMap8.Length; ++i) - { - double distance = ColorMap8[i].Item1.Distance(color); - if (distance < min_distance) - { - min_distance = distance; - best_idx = i; - } - } - - if (best_idx == -1) - return string.Format("\u001B[{0};5;{1}m", (foreground ? 38 : 48), 16 + (36 * R_idx) + (6 * G_idx) + B_idx); - else - return string.Format("\u001B[{0};5;{1}m", (foreground ? 38 : 48), ColorMap8[best_idx].Item2); - } - - case ConsoleColorModeType.vt100_24bit: - return string.Format("\u001B[{0};2;{1};{2};{3}m", (foreground ? 38 : 48), R, G, B); - - default: - return string.Empty; - } - } - - public static string GetResetEscapeCode() - { - return "\u001b[0m"; - } - } - - public record struct ColorRGBA - { - public byte R { get; set; } - public byte G { get; set; } - public byte B { get; set; } - public byte A { get; set; } - public bool Unknown { get; set; } = false; - - public double Distance(ColorRGBA color) - { - double r_mean = (double)(this.R + color.R) / 2.0; - double R = this.R - color.R; - double G = this.G - color.G; - double B = this.B - color.B; - return Math.Sqrt((2.0 + r_mean / 256.0) * (R * R) + 4.0 * (G * G) + (2.0 + (255 - r_mean) / 256.0) * (B * B)); - } - public ColorRGBA(byte r, byte g, byte b, byte a, bool unknown) - { - R = r; - G = g; - B = b; - A = a; - Unknown = unknown; - } - - public ColorRGBA(byte r, byte g, byte b, byte a) - { - R = r; - G = g; - B = b; - A = a; - } - - public ColorRGBA(byte r, byte g, byte b) - { - R = r; - G = g; - B = b; - A = 255; - } - } -} diff --git a/MinecraftClient/Command.cs b/MinecraftClient/Command.cs deleted file mode 100644 index e606f0dd36..0000000000 --- a/MinecraftClient/Command.cs +++ /dev/null @@ -1,147 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Brigadier.NET; -using MinecraftClient.CommandHandler; -using MinecraftClient.CommandHandler.Patch; - -namespace MinecraftClient -{ - /// - /// Represents an internal MCC command: Command name, source code and usage message - /// To add a new command, inherit from this class while adding the command class to the folder "Commands". - /// If inheriting from the 'Command' class and placed in the 'Commands' namespace, the command will be - /// automatically loaded and available in main chat prompt, scripts, remote control and command help. - /// - public abstract class Command - { - /// - /// The command name - /// - public abstract string CmdName { get; } - - /// - /// Command description with translation support. Please add your message in Translations.cs file and return mapping key in this property - /// - public abstract string CmdDesc { get; } - - /// - /// Get the translated version of command description. - /// - /// Translated command description - public string GetCmdDescTranslated() - { - char cmdChar = Settings.Config.Main.Advanced.InternalCmdChar.ToChar(); - - StringBuilder sb = new(); - string s = (string.IsNullOrEmpty(CmdUsage) || string.IsNullOrEmpty(CmdDesc)) ? string.Empty : ": "; // If either one is empty, no colon : - sb.Append("§e").Append(cmdChar).Append(CmdUsage).Append("§r").Append(s).AppendLine(CmdDesc); - sb.Append(McClient.dispatcher.GetAllUsageString(CmdName, false)); - return sb.ToString(); - } - - /// - /// Usage message, eg: 'name [args]' - /// - public abstract string CmdUsage { get; } - - /// - /// Register the command. - /// - public abstract void RegisterCommand(CommandDispatcher dispatcher); - - /// - /// Check if at least one argument has been passed to the command - /// - public static bool HasArg(string command) - { - int first_space = command.IndexOf(' '); - return (first_space > 0 && first_space < command.Length - 1); - } - - /// - /// Extract the argument string from the command - /// - /// Argument or "" if no argument - public static string GetArg(string command) - { - if (HasArg(command)) - return command[(command.IndexOf(' ') + 1)..]; - else - return string.Empty; - } - - /// - /// Extract the arguments as a string array from the command - /// - /// Argument array or empty array if no arguments - public static string[] GetArgs(string command) - { - string[] args = GetArg(command).Split(' ', StringSplitOptions.RemoveEmptyEntries); - if (args.Length == 1 && args[0] == string.Empty) - return Array.Empty(); - else - return args; - } - - /// - /// Extract arguments from a given string. Allows quotines and escaping them. - /// Similar to command line arguments in regular terminals. - /// - /// Provided arguments as a string - /// All extracted arguments in a string list - public static List ParseCommandLine(string cmdLine) - { - var args = new List(); - if (string.IsNullOrWhiteSpace(cmdLine)) return args; - - var currentArg = new StringBuilder(); - bool inQuotedArg = false; - - for (int i = 0; i < cmdLine.Length; i++) - { - if ((cmdLine[i] == '"' && i > 0 && cmdLine[i - 1] != '\\') || (cmdLine[i] == '"' && i == 0)) - { - if (inQuotedArg) - { - args.Add(currentArg.ToString()); - currentArg = new StringBuilder(); - inQuotedArg = false; - } - else - { - inQuotedArg = true; - } - } - else if (cmdLine[i] == ' ') - { - if (inQuotedArg) - { - currentArg.Append(cmdLine[i]); - } - else if (currentArg.Length > 0) - { - args.Add(currentArg.ToString()); - currentArg = new StringBuilder(); - } - } - else - { - if (cmdLine[i] == '\\' && cmdLine[i + 1] == '\"') - { - currentArg.Append('"'); - i += 1; - } - else - { - currentArg.Append(cmdLine[i]); - } - } - } - - if (currentArg.Length > 0) args.Add(currentArg.ToString()); - - return args; - } - } -} diff --git a/MinecraftClient/CommandHandler/ArgumentType/AccountNickArgumentType.cs b/MinecraftClient/CommandHandler/ArgumentType/AccountNickArgumentType.cs deleted file mode 100644 index 09d11de116..0000000000 --- a/MinecraftClient/CommandHandler/ArgumentType/AccountNickArgumentType.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Threading.Tasks; -using Brigadier.NET; -using Brigadier.NET.ArgumentTypes; -using Brigadier.NET.Context; -using Brigadier.NET.Suggestion; - -namespace MinecraftClient.CommandHandler.ArgumentType -{ - public class AccountNickArgumentType : ArgumentType - { - public override string Parse(IStringReader reader) - { - reader.SkipWhitespace(); - return reader.ReadString(); - } - - public override Task ListSuggestions(CommandContext context, SuggestionsBuilder builder) - { - var accountList = Settings.Config.Main.Advanced.AccountList; - foreach (var account in accountList) - builder.Suggest(account.Key); - return builder.BuildFuture(); - } - } -} \ No newline at end of file diff --git a/MinecraftClient/CommandHandler/ArgumentType/AutoCraftRecipeNameArgumentType.cs b/MinecraftClient/CommandHandler/ArgumentType/AutoCraftRecipeNameArgumentType.cs deleted file mode 100644 index 0d2bc0ebba..0000000000 --- a/MinecraftClient/CommandHandler/ArgumentType/AutoCraftRecipeNameArgumentType.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Threading.Tasks; -using Brigadier.NET; -using Brigadier.NET.ArgumentTypes; -using Brigadier.NET.Context; -using Brigadier.NET.Suggestion; - -namespace MinecraftClient.CommandHandler.ArgumentType -{ - public class AutoCraftRecipeNameArgumentType : ArgumentType - { - public override string Parse(IStringReader reader) - { - reader.SkipWhitespace(); - return reader.ReadString(); - } - - public override Task ListSuggestions(CommandContext context, SuggestionsBuilder builder) - { - var recipeList = Settings.Config.ChatBot.AutoCraft.Recipes; - foreach (var recipe in recipeList) - builder.Suggest(recipe.Name); - return builder.BuildFuture(); - } - } -} diff --git a/MinecraftClient/CommandHandler/ArgumentType/BotNameArgumentType.cs b/MinecraftClient/CommandHandler/ArgumentType/BotNameArgumentType.cs deleted file mode 100644 index b17bdf1c0b..0000000000 --- a/MinecraftClient/CommandHandler/ArgumentType/BotNameArgumentType.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System.Threading.Tasks; -using Brigadier.NET; -using Brigadier.NET.ArgumentTypes; -using Brigadier.NET.Context; -using Brigadier.NET.Suggestion; - -namespace MinecraftClient.CommandHandler.ArgumentType -{ - public class BotNameArgumentType : ArgumentType - { - public override string Parse(IStringReader reader) - { - reader.SkipWhitespace(); - return reader.ReadString(); - } - - public override Task ListSuggestions(CommandContext context, SuggestionsBuilder builder) - { - McClient? client = CmdResult.currentHandler; - if (client is not null) - { - var botList = client.GetLoadedChatBots(); - foreach (var bot in botList) - builder.Suggest(bot.GetType().Name); - } - return builder.BuildFuture(); - } - } -} diff --git a/MinecraftClient/CommandHandler/ArgumentType/EntityTypeArgumentType.cs b/MinecraftClient/CommandHandler/ArgumentType/EntityTypeArgumentType.cs deleted file mode 100644 index fc3ce124d6..0000000000 --- a/MinecraftClient/CommandHandler/ArgumentType/EntityTypeArgumentType.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Threading.Tasks; -using Brigadier.NET; -using Brigadier.NET.ArgumentTypes; -using Brigadier.NET.Context; -using Brigadier.NET.Exceptions; -using Brigadier.NET.Suggestion; -using MinecraftClient.Mapping; - -namespace MinecraftClient.CommandHandler.ArgumentType -{ - public class EntityTypeArgumentType : ArgumentType - { - public override EntityType Parse(IStringReader reader) - { - reader.SkipWhitespace(); - string entity = reader.ReadString(); - if (Enum.TryParse(entity, true, out EntityType entityType)) - return entityType; - else - throw CommandSyntaxException.BuiltInExceptions.LiteralIncorrect().CreateWithContext(reader, entity); - } - - public override Task ListSuggestions(CommandContext context, SuggestionsBuilder builder) - { - foreach (EntityType result in Enum.GetValues()) - { - string name = result.ToString(); - string localName = Entity.GetTypeString(result); - bool same = true; - for (int i = 0, j = 0; i < name.Length; ++i, ++j) - { - while (j < localName.Length && localName[j] == ' ') - ++j; - if (j >= localName.Length || name[i] != localName[j]) - { - same = false; - break; - } - } - if (same) - builder.Suggest(name); - else - builder.Suggest(name, new SuggestionTooltip(localName)); - } - - return builder.BuildFuture(); - } - } -} diff --git a/MinecraftClient/CommandHandler/ArgumentType/FarmerCropTypeArgumentType.cs b/MinecraftClient/CommandHandler/ArgumentType/FarmerCropTypeArgumentType.cs deleted file mode 100644 index 16ecdad42a..0000000000 --- a/MinecraftClient/CommandHandler/ArgumentType/FarmerCropTypeArgumentType.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Threading.Tasks; -using Brigadier.NET; -using Brigadier.NET.ArgumentTypes; -using Brigadier.NET.Context; -using Brigadier.NET.Exceptions; -using Brigadier.NET.Suggestion; -using static MinecraftClient.ChatBots.Farmer; - -namespace MinecraftClient.CommandHandler.ArgumentType -{ - public class FarmerCropTypeArgumentType : ArgumentType - { - public override CropType Parse(IStringReader reader) - { - reader.SkipWhitespace(); - string inputStr = reader.ReadString(); - if (Enum.TryParse(inputStr, true, out CropType cropType)) - return cropType; - else - throw CommandSyntaxException.BuiltInExceptions.LiteralIncorrect().CreateWithContext(reader, inputStr); - } - - public override Task ListSuggestions(CommandContext context, SuggestionsBuilder builder) - { - foreach (var result in Enum.GetNames(typeof(CropType))) - builder.Suggest(result); - return builder.BuildFuture(); - } - } -} diff --git a/MinecraftClient/CommandHandler/ArgumentType/HotbarSlotArgumentType.cs b/MinecraftClient/CommandHandler/ArgumentType/HotbarSlotArgumentType.cs deleted file mode 100644 index a71349b646..0000000000 --- a/MinecraftClient/CommandHandler/ArgumentType/HotbarSlotArgumentType.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Threading.Tasks; -using Brigadier.NET; -using Brigadier.NET.ArgumentTypes; -using Brigadier.NET.Context; -using Brigadier.NET.Suggestion; - -namespace MinecraftClient.CommandHandler.ArgumentType -{ - public class HotbarSlotArgumentType : ArgumentType - { - public override int Parse(IStringReader reader) - { - reader.SkipWhitespace(); - return reader.ReadInt(); - } - - public override Task ListSuggestions(CommandContext context, SuggestionsBuilder builder) - { - McClient? client = CmdResult.currentHandler; - if (client is not null) - { - Inventory.Container? inventory = client.GetInventory(0); - if (inventory is not null) - { - for (int i = 1; i <= 9; ++i) - { - if (inventory.Items.TryGetValue(i - 1 + 36, out Inventory.Item? item)) - { - string slotStr = i.ToString(); - if (slotStr.StartsWith(builder.RemainingLowerCase, StringComparison.InvariantCultureIgnoreCase)) - { - string itemDesc = item.Count == 1 ? item.GetTypeString() : string.Format("{0}x{1}", item.Count, item.GetTypeString()); - builder.Suggest(slotStr, new SuggestionTooltip(itemDesc)); - } - } - } - } - } - return builder.BuildFuture(); - } - } -} diff --git a/MinecraftClient/CommandHandler/ArgumentType/InventoryActionArgumentType.cs b/MinecraftClient/CommandHandler/ArgumentType/InventoryActionArgumentType.cs deleted file mode 100644 index 53bb43dac7..0000000000 --- a/MinecraftClient/CommandHandler/ArgumentType/InventoryActionArgumentType.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System.Threading.Tasks; -using Brigadier.NET; -using Brigadier.NET.ArgumentTypes; -using Brigadier.NET.Context; -using Brigadier.NET.Exceptions; -using Brigadier.NET.Suggestion; -using MinecraftClient.Inventory; - -namespace MinecraftClient.CommandHandler.ArgumentType -{ - public class InventoryActionArgumentType : ArgumentType - { - private WindowActionType[] SupportActions = new WindowActionType[] - { - WindowActionType.LeftClick, - WindowActionType.RightClick, - WindowActionType.MiddleClick, - WindowActionType.ShiftClick, - WindowActionType.ShiftRightClick, - }; - - public override WindowActionType Parse(IStringReader reader) - { - reader.SkipWhitespace(); - string inputStr = reader.ReadString().ToLower(); - return inputStr switch - { - "left" => WindowActionType.LeftClick, - "leftclick" => WindowActionType.LeftClick, - "right" => WindowActionType.RightClick, - "rightclick" => WindowActionType.RightClick, - "mid" => WindowActionType.MiddleClick, - "middle" => WindowActionType.MiddleClick, - "middleclick" => WindowActionType.MiddleClick, - "shift" => WindowActionType.ShiftClick, - "shiftclick" => WindowActionType.ShiftClick, - "shiftrightclick" => WindowActionType.ShiftRightClick, - _ => throw CommandSyntaxException.BuiltInExceptions.LiteralIncorrect().CreateWithContext(reader, inputStr) - }; - } - - public override Task ListSuggestions(CommandContext context, SuggestionsBuilder builder) - { - foreach (var action in SupportActions) - builder.Suggest(action.ToString()); - return builder.BuildFuture(); - } - } -} diff --git a/MinecraftClient/CommandHandler/ArgumentType/InventoryIdArgumentType.cs b/MinecraftClient/CommandHandler/ArgumentType/InventoryIdArgumentType.cs deleted file mode 100644 index d485f82aa8..0000000000 --- a/MinecraftClient/CommandHandler/ArgumentType/InventoryIdArgumentType.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Threading.Tasks; -using Brigadier.NET; -using Brigadier.NET.ArgumentTypes; -using Brigadier.NET.Context; -using Brigadier.NET.Suggestion; - -namespace MinecraftClient.CommandHandler.ArgumentType -{ - public class InventoryIdArgumentType : ArgumentType - { - public override int Parse(IStringReader reader) - { - reader.SkipWhitespace(); - return reader.ReadInt(); - } - - public override Task ListSuggestions(CommandContext context, SuggestionsBuilder builder) - { - McClient? client = CmdResult.currentHandler; - if (client is not null) - { - var invList = client.GetInventories(); - foreach (var inv in invList) - { - string invName = inv.Key.ToString(); - if (invName.StartsWith(builder.RemainingLowerCase, StringComparison.InvariantCultureIgnoreCase)) - { - string? invTitle = inv.Value.Title; - if (!string.IsNullOrWhiteSpace(invTitle)) - builder.Suggest(invName, new SuggestionTooltip(invTitle)); - else - builder.Suggest(invName); - } - } - } - return builder.BuildFuture(); - } - } -} diff --git a/MinecraftClient/CommandHandler/ArgumentType/InventorySlotArgumentType.cs b/MinecraftClient/CommandHandler/ArgumentType/InventorySlotArgumentType.cs deleted file mode 100644 index b9e019422a..0000000000 --- a/MinecraftClient/CommandHandler/ArgumentType/InventorySlotArgumentType.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using Brigadier.NET; -using Brigadier.NET.ArgumentTypes; -using Brigadier.NET.Context; -using Brigadier.NET.Suggestion; - -namespace MinecraftClient.CommandHandler.ArgumentType -{ - public class InventorySlotArgumentType : ArgumentType - { - public override int Parse(IStringReader reader) - { - reader.SkipWhitespace(); - return reader.ReadInt(); - } - - public override Task ListSuggestions(CommandContext context, SuggestionsBuilder builder) - { - McClient? client = CmdResult.currentHandler; - if (client is not null && context.Nodes.Count >= 2) - { - string invName = context.Nodes[1].Range.Get(builder.Input); - if (!int.TryParse(invName, out int invId)) - invId = invName switch - { - "creativegive" => 0, - "creativedelete" => 0, - "player" => 0, - "container" => client.GetInventories().Keys.ToList().Max(), - _ => -1, - }; - - Inventory.Container? inventory = client.GetInventory(invId); - if (inventory is not null) - { - foreach ((int slot, Inventory.Item item) in inventory.Items) - { - if (item is not null && item.Count > 0) - { - string slotStr = slot.ToString(); - if (slotStr.StartsWith(builder.RemainingLowerCase, StringComparison.InvariantCultureIgnoreCase)) - { - string itemDesc = item.Count == 1 ? item.GetTypeString() : string.Format("{0}x{1}", item.Count, item.GetTypeString()); - builder.Suggest(slotStr, new SuggestionTooltip(itemDesc)); - } - } - } - } - } - return builder.BuildFuture(); - } - } -} diff --git a/MinecraftClient/CommandHandler/ArgumentType/ItemTypeArgumentType.cs b/MinecraftClient/CommandHandler/ArgumentType/ItemTypeArgumentType.cs deleted file mode 100644 index fcd270bfa3..0000000000 --- a/MinecraftClient/CommandHandler/ArgumentType/ItemTypeArgumentType.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.Threading.Tasks; -using Brigadier.NET; -using Brigadier.NET.ArgumentTypes; -using Brigadier.NET.Context; -using Brigadier.NET.Exceptions; -using Brigadier.NET.Suggestion; -using MinecraftClient.Inventory; - -namespace MinecraftClient.CommandHandler.ArgumentType -{ - public class ItemTypeArgumentType : ArgumentType - { - public override ItemType Parse(IStringReader reader) - { - reader.SkipWhitespace(); - string entity = reader.ReadString(); - if (Enum.TryParse(entity, true, out ItemType itemType)) - return itemType; - else - throw CommandSyntaxException.BuiltInExceptions.LiteralIncorrect().CreateWithContext(reader, entity); - } - - public override Task ListSuggestions(CommandContext context, SuggestionsBuilder builder) - { - foreach (ItemType result in Enum.GetValues()) - { - if (result == ItemType.Unknown || result == ItemType.Null) - continue; - - string name = result.ToString(); - string localName = Item.GetTypeString(result); - bool same = true; - for (int i = 0, j = 0; i < name.Length; ++i, ++j) - { - while (j < localName.Length && localName[j] == ' ') - ++j; - if (j >= localName.Length || name[i] != localName[j]) - { - same = false; - break; - } - } - if (same) - builder.Suggest(name); - else - builder.Suggest(name, new SuggestionTooltip(localName)); - } - return builder.BuildFuture(); - } - } -} diff --git a/MinecraftClient/CommandHandler/ArgumentType/LocationArgumentType.cs b/MinecraftClient/CommandHandler/ArgumentType/LocationArgumentType.cs deleted file mode 100644 index fbd8a4dc6c..0000000000 --- a/MinecraftClient/CommandHandler/ArgumentType/LocationArgumentType.cs +++ /dev/null @@ -1,99 +0,0 @@ -using System; -using System.Threading.Tasks; -using Brigadier.NET; -using Brigadier.NET.ArgumentTypes; -using Brigadier.NET.Context; -using Brigadier.NET.Suggestion; -using MinecraftClient.Mapping; - -namespace MinecraftClient.CommandHandler.ArgumentType -{ - public class LocationArgumentType : ArgumentType - { - public override Location Parse(IStringReader reader) - { - int[] status = new int[3]; - double[] coords = new double[3]; - for (int i = 0; i < 3; ++i) - { - reader.SkipWhitespace(); - if (reader.Peek() == '~' || reader.Peek() == '~') - { - status[i] = 1; - reader.Next(); - if (reader.CanRead()) - { - char next = reader.Peek(); - if (char.IsDigit(next) || next == '.' || next == '-') - coords[i] = reader.ReadDouble(); - else if (next == '+') - { - reader.Next(); - coords[i] = reader.ReadDouble(); - } - else coords[i] = 0; - } - else coords[i] = 0; - } - else - { - status[i] = 0; - coords[i] = reader.ReadDouble(); - } - } - - return new Location(coords[0], coords[1], coords[2], (byte)(status[0] | status[1] << 1 | status[2] << 2)); - } - - public override Task ListSuggestions(CommandContext context, SuggestionsBuilder builder) - { - McClient? client = CmdResult.currentHandler; - string[] args = builder.Remaining.Split(' ', StringSplitOptions.TrimEntries); - if (args.Length == 0 || (args.Length == 1 && string.IsNullOrWhiteSpace(args[0]))) - { - if (client is not null) - { - Location current = client.GetCurrentLocation(); - builder.Suggest(string.Format("{0:0.00}", current.X)); - builder.Suggest(string.Format("{0:0.00} {1:0.00}", current.X, current.Y)); - builder.Suggest(string.Format("{0:0.00} {1:0.00} {2:0.00}", current.X, current.Y, current.Z)); - } - else - { - builder.Suggest("~"); - builder.Suggest("~ ~"); - builder.Suggest("~ ~ ~"); - } - } - else if (args.Length == 1 || (args.Length == 2 && string.IsNullOrWhiteSpace(args[1]))) - { - string add = args.Length == 1 ? " " : string.Empty; - if (client is not null) - { - Location current = client.GetCurrentLocation(); - builder.Suggest(string.Format("{0}{2}{1:0.00}", builder.Remaining, current.Y, add)); - builder.Suggest(string.Format("{0}{3}{1:0.00} {2:0.00}", builder.Remaining, current.Y, current.Z, add)); - } - else - { - builder.Suggest(builder.Remaining + add + "~"); - builder.Suggest(builder.Remaining + add + "~ ~"); - } - } - else if (args.Length == 2 || (args.Length == 3 && string.IsNullOrWhiteSpace(args[2]))) - { - string add = args.Length == 2 ? " " : string.Empty; - if (client is not null) - { - Location current = client.GetCurrentLocation(); - builder.Suggest(string.Format("{0}{2}{1:0.00}", builder.Remaining, current.Z, add)); - } - else - { - builder.Suggest(builder.Remaining + add + "~"); - } - } - return builder.BuildFuture(); - } - } -} diff --git a/MinecraftClient/CommandHandler/ArgumentType/MapBotMapIdArgumentType.cs b/MinecraftClient/CommandHandler/ArgumentType/MapBotMapIdArgumentType.cs deleted file mode 100644 index 7b8b9b5dee..0000000000 --- a/MinecraftClient/CommandHandler/ArgumentType/MapBotMapIdArgumentType.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Threading.Tasks; -using Brigadier.NET; -using Brigadier.NET.ArgumentTypes; -using Brigadier.NET.Context; -using Brigadier.NET.Suggestion; -using MinecraftClient.ChatBots; - -namespace MinecraftClient.CommandHandler.ArgumentType -{ - public class MapBotMapIdArgumentType : ArgumentType - { - public override int Parse(IStringReader reader) - { - reader.SkipWhitespace(); - return reader.ReadInt(); - } - - public override Task ListSuggestions(CommandContext context, SuggestionsBuilder builder) - { - McClient? client = CmdResult.currentHandler; - if (client is not null) - { - var bot = (Map?)client.GetLoadedChatBots().Find(bot => bot.GetType().Name == "Map"); - if (bot is not null) - { - var mapList = bot.cachedMaps; - foreach (var map in mapList) - { - string mapName = map.Key.ToString(); - if (mapName.StartsWith(builder.RemainingLowerCase, StringComparison.InvariantCultureIgnoreCase)) - builder.Suggest(mapName); - } - } - } - return builder.BuildFuture(); - } - } -} diff --git a/MinecraftClient/CommandHandler/ArgumentType/PlayerNameArgumentType.cs b/MinecraftClient/CommandHandler/ArgumentType/PlayerNameArgumentType.cs deleted file mode 100644 index 4a6229246c..0000000000 --- a/MinecraftClient/CommandHandler/ArgumentType/PlayerNameArgumentType.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Linq; -using System.Threading.Tasks; -using Brigadier.NET; -using Brigadier.NET.ArgumentTypes; -using Brigadier.NET.Context; -using Brigadier.NET.Suggestion; -using MinecraftClient.Mapping; - -namespace MinecraftClient.CommandHandler.ArgumentType -{ - public class PlayerNameArgumentType : ArgumentType - { - public override string Parse(IStringReader reader) - { - reader.SkipWhitespace(); - return reader.ReadString(); - } - - public override Task ListSuggestions(CommandContext context, SuggestionsBuilder builder) - { - McClient? client = CmdResult.currentHandler; - if (client is not null) - { - var entityList = client.GetEntities().Values.ToList(); - foreach (var entity in entityList) - { - if (entity.Type != EntityType.Player || string.IsNullOrWhiteSpace(entity.Name)) - continue; - builder.Suggest(entity.Name); - } - builder.Suggest(client.GetUsername()); - } - return builder.BuildFuture(); - } - } -} diff --git a/MinecraftClient/CommandHandler/ArgumentType/ScriptNameArgumentType.cs b/MinecraftClient/CommandHandler/ArgumentType/ScriptNameArgumentType.cs deleted file mode 100644 index fe77a04c37..0000000000 --- a/MinecraftClient/CommandHandler/ArgumentType/ScriptNameArgumentType.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Brigadier.NET; -using Brigadier.NET.ArgumentTypes; -using Brigadier.NET.Context; -using Brigadier.NET.Suggestion; - -namespace MinecraftClient.CommandHandler.ArgumentType -{ - public class ScriptNameArgumentType : ArgumentType - { - public override string Parse(IStringReader reader) - { - string remaining = reader.Remaining; - reader.Cursor += reader.RemainingLength; - return remaining; - } - - public override Task ListSuggestions(CommandContext context, SuggestionsBuilder builder) - { - try - { - string? dir = Path.GetDirectoryName(builder.Remaining); - if (!string.IsNullOrEmpty(dir) && Path.Exists(dir)) - { - foreach (string fileName in Directory.GetFiles(dir, "*.cs")) - builder.Suggest(fileName); - foreach (string fileName in Directory.GetFiles(dir, "*.txt")) - builder.Suggest(fileName); - } - } - catch (IOException) { } - catch (ArgumentException) { } - catch (UnauthorizedAccessException) { } - - try - { - foreach (string fileName in Directory.GetFiles("." + Path.DirectorySeparatorChar, "*.cs")) - builder.Suggest(fileName); - foreach (string fileName in Directory.GetFiles("." + Path.DirectorySeparatorChar, "*.txt")) - builder.Suggest(fileName); - } - catch (IOException) { } - catch (ArgumentException) { } - catch (UnauthorizedAccessException) { } - - return builder.BuildFuture(); - } - } -} diff --git a/MinecraftClient/CommandHandler/ArgumentType/ServerNickArgumentType.cs b/MinecraftClient/CommandHandler/ArgumentType/ServerNickArgumentType.cs deleted file mode 100644 index ae520f7ddb..0000000000 --- a/MinecraftClient/CommandHandler/ArgumentType/ServerNickArgumentType.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Threading.Tasks; -using Brigadier.NET; -using Brigadier.NET.ArgumentTypes; -using Brigadier.NET.Context; -using Brigadier.NET.Suggestion; - -namespace MinecraftClient.CommandHandler.ArgumentType -{ - public class ServerNickArgumentType : ArgumentType - { - public override string Parse(IStringReader reader) - { - reader.SkipWhitespace(); - return reader.ReadString(); - } - - public override Task ListSuggestions(CommandContext context, SuggestionsBuilder builder) - { - var serverList = Settings.Config.Main.Advanced.ServerList; - foreach (var server in serverList) - builder.Suggest(server.Key); - return builder.BuildFuture(); - } - } -} diff --git a/MinecraftClient/CommandHandler/ArgumentType/TupleArgumentType.cs b/MinecraftClient/CommandHandler/ArgumentType/TupleArgumentType.cs deleted file mode 100644 index 55157d99c8..0000000000 --- a/MinecraftClient/CommandHandler/ArgumentType/TupleArgumentType.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using Brigadier.NET; -using Brigadier.NET.ArgumentTypes; - -namespace MinecraftClient.CommandHandler.ArgumentType -{ - public class TupleArgumentType : ArgumentType> - { - public override Tuple Parse(IStringReader reader) - { - reader.SkipWhitespace(); - int int1 = reader.ReadInt(); - reader.SkipWhitespace(); - int int2 = reader.ReadInt(); - return new(int1, int2); - } - } -} diff --git a/MinecraftClient/CommandHandler/CmdResult.cs b/MinecraftClient/CommandHandler/CmdResult.cs deleted file mode 100644 index 9c4cd8405f..0000000000 --- a/MinecraftClient/CommandHandler/CmdResult.cs +++ /dev/null @@ -1,96 +0,0 @@ -using System; - -namespace MinecraftClient.CommandHandler -{ - public class CmdResult - { - public static readonly CmdResult Empty = new(); - - internal static McClient? currentHandler; - - public enum Status - { - NotRun = int.MinValue, - FailChunkNotLoad = -4, - FailNeedEntity = -3, - FailNeedInventory = -2, - FailNeedTerrain = -1, - Fail = 0, - Done = 1, - } - - public CmdResult() - { - this.status = Status.NotRun; - this.result = "Command did not run, cannot determine the result of the command."; - } - - public Status status; - - public string? result; - - public int SetAndReturn(Status status) - { - this.status = status; - this.result = status switch - { -#pragma warning disable format // @formatter:off - Status.NotRun => "Command did not run, cannot determine the result of the command.", - Status.FailChunkNotLoad => null, - Status.FailNeedEntity => Translations.extra_entity_required, - Status.FailNeedInventory => Translations.extra_inventory_required, - Status.FailNeedTerrain => Translations.extra_terrainandmovement_required, - Status.Fail => Translations.general_fail, - Status.Done => null, - _ => null, -#pragma warning restore format // @formatter:on - }; - return Convert.ToInt32(this.status); - } - - public int SetAndReturn(Status status, string? result) - { - this.status = status; - this.result = result; - return Convert.ToInt32(this.status); - } - - public int SetAndReturn(int code, string? result) - { - this.status = (Status)Enum.ToObject(typeof(Status), code); - if (!Enum.IsDefined(typeof(Status), status)) - throw new InvalidOperationException($"{code} is not a legal return value."); - this.result = result; - return code; - } - - public int SetAndReturn(bool result) - { - this.status = result ? Status.Done : Status.Fail; - this.result = result ? Translations.general_done : Translations.general_fail; - return Convert.ToInt32(this.status); - } - - public int SetAndReturn(string? result) - { - this.status = Status.Done; - this.result = result; - return Convert.ToInt32(this.status); - } - - public int SetAndReturn(string? resultstr, bool result) - { - this.status = result ? Status.Done : Status.Fail; - this.result = resultstr; - return Convert.ToInt32(this.status); - } - - public override string ToString() - { - if (result is not null) - return result; - else - return status.ToString(); - } - } -} diff --git a/MinecraftClient/CommandHandler/MccArguments.cs b/MinecraftClient/CommandHandler/MccArguments.cs deleted file mode 100644 index 78416bc109..0000000000 --- a/MinecraftClient/CommandHandler/MccArguments.cs +++ /dev/null @@ -1,119 +0,0 @@ -using System; -using Brigadier.NET.Context; -using MinecraftClient.CommandHandler.ArgumentType; - -namespace MinecraftClient.CommandHandler -{ - public static class MccArguments - { - public static LocationArgumentType Location() - { - return new LocationArgumentType(); - } - - public static Mapping.Location GetLocation(CommandContext context, string name) - { - return context.GetArgument(name); - } - - public static TupleArgumentType Tuple() - { - return new TupleArgumentType(); - } - - public static Tuple GetTuple(CommandContext context, string name) - { - return context.GetArgument>(name); - } - - public static EntityTypeArgumentType EntityType() - { - return new EntityTypeArgumentType(); - } - - public static Mapping.EntityType GetEntityType(CommandContext context, string name) - { - return context.GetArgument(name); - } - - public static ItemTypeArgumentType ItemType() - { - return new ItemTypeArgumentType(); - } - - public static Inventory.ItemType GetItemType(CommandContext context, string name) - { - return context.GetArgument(name); - } - - public static BotNameArgumentType BotName() - { - return new BotNameArgumentType(); - } - - public static ServerNickArgumentType ServerNick() - { - return new ServerNickArgumentType(); - } - - public static AccountNickArgumentType AccountNick() - { - return new AccountNickArgumentType(); - } - - public static InventoryIdArgumentType InventoryId() - { - return new InventoryIdArgumentType(); - } - - public static InventoryActionArgumentType InventoryAction() - { - return new InventoryActionArgumentType(); - } - - public static InventorySlotArgumentType InventorySlot() - { - return new InventorySlotArgumentType(); - } - - public static Inventory.WindowActionType GetInventoryAction(CommandContext context, string name) - { - return context.GetArgument(name); - } - - public static AutoCraftRecipeNameArgumentType AutoCraftRecipeName() - { - return new AutoCraftRecipeNameArgumentType(); - } - - public static FarmerCropTypeArgumentType FarmerCropType() - { - return new FarmerCropTypeArgumentType(); - } - - public static ChatBots.Farmer.CropType GetFarmerCropType(CommandContext context, string name) - { - return context.GetArgument(name); - } - - public static PlayerNameArgumentType PlayerName() - { - return new PlayerNameArgumentType(); - } - - public static MapBotMapIdArgumentType MapBotMapId() - { - return new MapBotMapIdArgumentType(); - } - - public static HotbarSlotArgumentType HotbarSlot() - { - return new HotbarSlotArgumentType(); - } - - public static ScriptNameArgumentType ScriptName() - { - return new ScriptNameArgumentType(); - } - } -} diff --git a/MinecraftClient/CommandHandler/Patch/CommandDispatcherExtensions.cs b/MinecraftClient/CommandHandler/Patch/CommandDispatcherExtensions.cs deleted file mode 100644 index 37ef9cc492..0000000000 --- a/MinecraftClient/CommandHandler/Patch/CommandDispatcherExtensions.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System.Text; -using Brigadier.NET; - -namespace MinecraftClient.CommandHandler.Patch -{ - public static class CommandDispatcherExtensions - { - /** - * This method unregisteres a previously declared command - * - * @param The name of the command to remove - */ - public static void Unregister(this CommandDispatcher commandDispatcher, string commandname) - { - commandDispatcher.GetRoot().RemoveChild(commandname); - } - - public static string GetAllUsageString(this CommandDispatcher commandDispatcher, string commandName, bool restricted) - { - char cmdChar = Settings.Config.Main.Advanced.InternalCmdChar.ToChar(); - try - { - string[] usages = commandDispatcher.GetAllUsage(commandDispatcher.GetRoot().GetChild(commandName), new(), restricted); - StringBuilder sb = new(); - sb.AppendLine("All Usages:"); - foreach (var usage in usages) - { - sb.Append(cmdChar).Append(commandName).Append(' '); - if (usage.Length > 0 && usage[0] == '_') - sb.AppendLine(usage.Replace("_help -> ", $"_help -> {cmdChar}help ")); - else - sb.AppendLine(usage); - } - sb.Remove(sb.Length - 1, 1); - return sb.ToString(); - } - catch - { - return string.Empty; - } - } - } -} \ No newline at end of file diff --git a/MinecraftClient/CommandHandler/Patch/CommandNodeExtensions.cs b/MinecraftClient/CommandHandler/Patch/CommandNodeExtensions.cs deleted file mode 100644 index 23e2a87f71..0000000000 --- a/MinecraftClient/CommandHandler/Patch/CommandNodeExtensions.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System.Collections.Generic; -using System.Reflection; -using Brigadier.NET.Tree; - -namespace MinecraftClient.CommandHandler.Patch -{ - public static class CommandNodeExtensions - { - public static void RemoveChild(this CommandNode commandNode, string name) - { - var children = (IDictionary>) - typeof(CommandNode) - .GetField("_children", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)! - .GetValue(commandNode)!; - var literals = (IDictionary>) - typeof(CommandNode) - .GetField("_literals", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)! - .GetValue(commandNode)!; - var arguments = (IDictionary>) - typeof(CommandNode) - .GetField("_arguments", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)! - .GetValue(commandNode)!; - - children.Remove(name); - literals.Remove(name); - } - } -} \ No newline at end of file diff --git a/MinecraftClient/CommandHandler/SuggestionTooltip.cs b/MinecraftClient/CommandHandler/SuggestionTooltip.cs deleted file mode 100644 index 330c63ed6a..0000000000 --- a/MinecraftClient/CommandHandler/SuggestionTooltip.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Brigadier.NET; - -namespace MinecraftClient.CommandHandler -{ - internal class SuggestionTooltip(string tooltip) : IMessage - { - public string String { get; set; } = tooltip; - } -} diff --git a/MinecraftClient/Commands/AchievementCommand.cs b/MinecraftClient/Commands/AchievementCommand.cs deleted file mode 100644 index ee99c4d7af..0000000000 --- a/MinecraftClient/Commands/AchievementCommand.cs +++ /dev/null @@ -1,106 +0,0 @@ -using System.Linq; -using System.Text; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - public class AchievementCommand : Command - { - public override string CmdName => "achievement"; - public override string CmdUsage => "achievement "; - public override string CmdDesc => Translations.cmd_achievement_desc; - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - .Then(l => l.Literal("list") - .Executes(r => GetUsage(r.Source, "list"))) - .Then(l => l.Literal("locked") - .Executes(r => GetUsage(r.Source, "locked"))) - .Then(l => l.Literal("unlocked") - .Executes(r => GetUsage(r.Source, "unlocked"))) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => ListAchievements(r.Source, null)) - .Then(l => l.Literal("list") - .Executes(r => ListAchievements(r.Source, null))) - .Then(l => l.Literal("locked") - .Executes(r => ListAchievements(r.Source, false))) - .Then(l => l.Literal("unlocked") - .Executes(r => ListAchievements(r.Source, true))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format - "list" => GetCmdDescTranslated(), - "locked" => GetCmdDescTranslated(), - "unlocked" => GetCmdDescTranslated(), - _ => GetCmdDescTranslated(), -#pragma warning restore format - }); - } - - /// null = all, true = unlocked only, false = locked only - private static int ListAchievements(CmdResult r, bool? completed) - { - McClient handler = CmdResult.currentHandler!; - - Achievement[] items = completed switch - { - true => handler.GetUnlockedAchievements(), - false => handler.GetLockedAchievements(), - null => handler.GetAchievements() - }; - - if (items.Length == 0) - { - string msg = completed switch - { - true => Translations.cmd_achievement_none_unlocked, - false => Translations.cmd_achievement_none_locked, - _ => Translations.cmd_achievement_none - }; - return r.SetAndReturn(CmdResult.Status.Done, msg); - } - - string header = completed switch - { - true => Translations.cmd_achievement_header_unlocked, - false => Translations.cmd_achievement_header_locked, - _ => Translations.cmd_achievement_header - }; - - StringBuilder sb = new(); - sb.AppendLine(header); - - foreach (Achievement a in items.OrderBy(static a => a.Id)) - { - string status = a.IsCompleted - ? Translations.cmd_achievement_done - : Translations.cmd_achievement_todo; - - string display = a.Title is not null - ? string.Format(Translations.cmd_achievement_entry_titled, status, a.Title, a.Id, a.Type) - : string.Format(Translations.cmd_achievement_entry, status, a.Id, a.Type); - - sb.AppendLine(display); - } - - handler.Log.Info(sb.ToString().TrimEnd()); - return r.SetAndReturn(CmdResult.Status.Done); - } - } -} diff --git a/MinecraftClient/Commands/Animation.cs b/MinecraftClient/Commands/Animation.cs deleted file mode 100644 index b996211cbf..0000000000 --- a/MinecraftClient/Commands/Animation.cs +++ /dev/null @@ -1,55 +0,0 @@ -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - public class Animation : Command - { - public override string CmdName { get { return "animation"; } } - public override string CmdUsage { get { return "animation "; } } - public override string CmdDesc { get { return Translations.cmd_animation_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - .Then(l => l.Literal("mainhand") - .Executes(r => GetUsage(r.Source, "mainhand"))) - .Then(l => l.Literal("offhand") - .Executes(r => GetUsage(r.Source, "offhand"))) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => DoAnimation(r.Source, mainhand: true)) - .Then(l => l.Literal("mainhand") - .Executes(r => DoAnimation(r.Source, mainhand: true))) - .Then(l => l.Literal("offhand") - .Executes(r => DoAnimation(r.Source, mainhand: false))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - "mainhand" => GetCmdDescTranslated(), - "offhand" => GetCmdDescTranslated(), - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private static int DoAnimation(CmdResult r, bool mainhand) - { - McClient handler = CmdResult.currentHandler!; - return r.SetAndReturn(handler.DoAnimation(mainhand ? 1 : 0)); - } - } -} diff --git a/MinecraftClient/Commands/Bed.cs b/MinecraftClient/Commands/Bed.cs deleted file mode 100644 index f3d4b995fb..0000000000 --- a/MinecraftClient/Commands/Bed.cs +++ /dev/null @@ -1,181 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.Mapping; -using static MinecraftClient.CommandHandler.CmdResult; - -namespace MinecraftClient.Commands -{ - public class BedCommand : Command - { - public override string CmdName { get { return "bed"; } } - public override string CmdUsage { get { return "bed leave|sleep |sleep "; } } - public override string CmdDesc { get { return Translations.cmd_bed_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - .Then(l => l.Literal("leave") - .Executes(r => GetUsage(r.Source, "leave"))) - .Then(l => l.Literal("sleep") - .Executes(r => GetUsage(r.Source, "sleep"))) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Then(l => l.Literal("leave") - .Executes(r => DoLeaveBed(r.Source))) - .Then(l => l.Literal("sleep") - .Then(l => l.Argument("Location", MccArguments.Location()) - .Executes(r => DoSleepBedWithLocation(r.Source, MccArguments.GetLocation(r, "Location")))) - .Then(l => l.Argument("Radius", Arguments.Double()) - .Executes(r => DoSleepBedWithRadius(r.Source, Arguments.GetDouble(r, "Radius"))))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - "leave" => GetCmdDescTranslated(), - "sleep" => GetCmdDescTranslated(), - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private static int DoLeaveBed(CmdResult r) - { - McClient handler = CmdResult.currentHandler!; - return r.SetAndReturn(Translations.cmd_bed_leaving, handler.SendEntityAction(Protocol.EntityActionType.LeaveBed)); - } - - private static int DoSleepBedWithRadius(CmdResult r, double radius) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetTerrainEnabled()) - return r.SetAndReturn(Status.FailNeedTerrain); - - handler.Log.Info(string.Format(Translations.cmd_bed_searching, radius)); - - Location current = handler.GetCurrentLocation(); - Location bedLocation = current; - - Material[] bedMaterialList = new Material[] - { - Material.BlackBed, - Material.BlueBed, - Material.BrownBed, - Material.CyanBed, - Material.GrayBed, - Material.GreenBed, - Material.LightBlueBed, - Material.LightGrayBed, - Material.LimeBed, - Material.MagentaBed, - Material.OrangeBed, - Material.PinkBed, - Material.PurpleBed, - Material.RedBed, - Material.WhiteBed, - Material.YellowBed - }; - - bool found = false; - foreach (Material material in bedMaterialList) - { - List beds = handler.GetWorld().FindBlock(current, material, radius); - - if (beds.Count > 0) - { - found = true; - bedLocation = beds.First(); - break; - } - } - - if (!found) - return r.SetAndReturn(Status.Fail, Translations.cmd_bed_bed_not_found); - - handler.Log.Info(string.Format(Translations.cmd_bed_found_a_bed_at, bedLocation.X, bedLocation.Y, bedLocation.Z)); - - if (!Movement.CheckChunkLoading(handler.GetWorld(), current, bedLocation)) - return r.SetAndReturn(Status.FailChunkNotLoad, - string.Format(Translations.cmd_move_chunk_not_loaded, bedLocation.X, bedLocation.Y, bedLocation.Z)); - - if (handler.MoveTo(bedLocation)) - { - Task.Factory.StartNew(() => - { - bool atTheLocation = false; - DateTime timeout = DateTime.Now.AddSeconds(60); - - while (DateTime.Now < timeout) - { - if (handler.GetCurrentLocation() == bedLocation || handler.GetCurrentLocation().Distance(bedLocation) <= 2.0) - { - atTheLocation = true; - break; - } - } - - if (!atTheLocation) - { - handler.Log.Info(string.Format(Translations.cmd_bed_failed_to_reach_in_time, bedLocation.X, bedLocation.Y, bedLocation.Z)); - return; - } - - handler.Log.Info(string.Format(Translations.cmd_bed_moving, bedLocation.X, bedLocation.Y, bedLocation.Z)); - - bool res = handler.PlaceBlock(bedLocation, Direction.Down); - - handler.Log.Info(string.Format( - Translations.cmd_bed_trying_to_use, - bedLocation.X, - bedLocation.Y, - bedLocation.Z, - res ? Translations.cmd_bed_in : Translations.cmd_bed_not_in - )); - }); - - return r.SetAndReturn(Status.Done); - } - else - { - return r.SetAndReturn(Status.Fail, Translations.cmd_bed_cant_reach_safely); - } - } - - private static int DoSleepBedWithLocation(CmdResult r, Location block) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetTerrainEnabled()) - return r.SetAndReturn(Status.FailNeedTerrain); - - block.ToAbsolute(handler.GetCurrentLocation()); - Location blockCenter = block.ToCenter(); - - if (!handler.GetWorld().GetBlock(block).Type.IsBed()) - return r.SetAndReturn(Status.Fail, - string.Format(Translations.cmd_bed_not_a_bed, blockCenter.X, blockCenter.Y, blockCenter.Z)); - - return r.SetAndReturn(Status.Done, string.Format( - Translations.cmd_bed_trying_to_use, - blockCenter.X, - blockCenter.Y, - blockCenter.Z, - handler.PlaceBlock(block, Direction.Down) ? Translations.cmd_bed_in : Translations.cmd_bed_not_in - )); - } - } -} \ No newline at end of file diff --git a/MinecraftClient/Commands/BlockInfo.cs b/MinecraftClient/Commands/BlockInfo.cs deleted file mode 100644 index 61e177d07b..0000000000 --- a/MinecraftClient/Commands/BlockInfo.cs +++ /dev/null @@ -1,96 +0,0 @@ -using System.Text; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.Mapping; -using static MinecraftClient.CommandHandler.CmdResult; - -namespace MinecraftClient.Commands -{ - public class BlockInfo : Command - { - public override string CmdName { get { return "blockinfo"; } } - public override string CmdUsage { get { return "blockinfo [-s]"; } } - public override string CmdDesc { get { return Translations.cmd_blockinfo_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - .Then(l => l.Literal("-s") - .Executes(r => GetUsage(r.Source, "-s"))) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => LogBlockInfo(r.Source, null, false)) - .Then(l => l.Literal("-s") - .Executes(r => LogBlockInfo(r.Source, null, true))) - .Then(l => l.Argument("Location", MccArguments.Location()) - .Executes(r => LogBlockInfo(r.Source, MccArguments.GetLocation(r, "Location"), false)) - .Then(l => l.Literal("-s") - .Executes(r => LogBlockInfo(r.Source, MccArguments.GetLocation(r, "Location"), true)))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - "-s" => GetCmdDescTranslated(), - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private static int LogBlockInfo(CmdResult r, Location? targetBlock, bool reportSurrounding) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetTerrainEnabled()) - return r.SetAndReturn(Status.FailNeedTerrain); - - if (targetBlock.HasValue) - targetBlock.Value.ToAbsolute(handler.GetCurrentLocation()); - else - targetBlock = handler.GetCurrentLocation(); - - Block block = handler.GetWorld().GetBlock(targetBlock.Value); - - handler.Log.Info($"{Translations.cmd_blockinfo_BlockType}: {block.GetTypeString()}"); - if (reportSurrounding) - { - StringBuilder sb = new(); - sb.AppendLine($"{Translations.cmd_blockinfo_BlocksAround}:"); - - double X = targetBlock.Value.X, Y = targetBlock.Value.Y, Z = targetBlock.Value.Z; - Block blockXPositive = handler.GetWorld().GetBlock(new Location(X + 1, Y, Z)); - Block blockXNegative = handler.GetWorld().GetBlock(new Location(X - 1, Y, Z)); - Block blockYPositive = handler.GetWorld().GetBlock(new Location(X, Y + 1, Z)); - Block blockYNegative = handler.GetWorld().GetBlock(new Location(X, Y - 1, Z)); - Block blockZPositive = handler.GetWorld().GetBlock(new Location(X, Y, Z + 1)); - Block blockZNegative = handler.GetWorld().GetBlock(new Location(X, Y, Z - 1)); - - sb.AppendLine($"[X {Translations.cmd_blockinfo_Positive}] {Translations.cmd_blockinfo_BlockType}: {blockXPositive.GetTypeString()}"); - sb.AppendLine($"[X {Translations.cmd_blockinfo_Negative}] {Translations.cmd_blockinfo_BlockType}: {blockXNegative.GetTypeString()}"); - - sb.AppendLine(" "); - - sb.AppendLine($"[Y {Translations.cmd_blockinfo_Positive}] {Translations.cmd_blockinfo_BlockType}: {blockYPositive.GetTypeString()}"); - sb.AppendLine($"[Y {Translations.cmd_blockinfo_Negative}] {Translations.cmd_blockinfo_BlockType}: {blockYNegative.GetTypeString()}"); - - sb.AppendLine(" "); - - sb.AppendLine($"[Z {Translations.cmd_blockinfo_Positive}] {Translations.cmd_blockinfo_BlockType}: {blockZPositive.GetTypeString()}"); - sb.AppendLine($"[Z {Translations.cmd_blockinfo_Negative}] {Translations.cmd_blockinfo_BlockType}: {blockZNegative.GetTypeString()}"); - - handler.Log.Info(sb.ToString()); - } - return r.SetAndReturn(Status.Done); - } - } -} diff --git a/MinecraftClient/Commands/Book.cs b/MinecraftClient/Commands/Book.cs deleted file mode 100644 index e035f27729..0000000000 --- a/MinecraftClient/Commands/Book.cs +++ /dev/null @@ -1,300 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.Inventory; -using MinecraftClient.Tui; - -namespace MinecraftClient.Commands -{ - public class Book : Command - { - private const char PageDelimiter = '\f'; - - public override string CmdName => "book"; - public override string CmdUsage => Translations.cmd_book_usage; - public override string CmdDesc => Translations.cmd_book_desc; - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - .Then(l => l.Literal("read").Executes(r => GetUsage(r.Source, "read"))) - .Then(l => l.Literal("write").Executes(r => GetUsage(r.Source, "write"))) - .Then(l => l.Literal("edit").Executes(r => GetUsage(r.Source, "edit"))) - .Then(l => l.Literal("sign").Executes(r => GetUsage(r.Source, "sign"))))); - - dispatcher.Register(l => l.Literal(CmdName) - .Then(l => l.Literal("read") - .Executes(r => ReadBook(r.Source, null)) - .Then(l => l.Argument("Page", Arguments.Integer(min: 1)) - .Executes(r => ReadBook(r.Source, Arguments.GetInteger(r, "Page"))))) - .Then(l => l.Literal("write") - .Then(l => l.Literal("text") - .Then(l => l.Argument("Text", Arguments.GreedyString()) - .Executes(r => WriteBook(r.Source, Arguments.GetString(r, "Text"))))) - .Then(l => l.Literal("file") - .Then(l => l.Argument("Path", Arguments.GreedyString()) - .Executes(r => WriteBookFromFile(r.Source, Arguments.GetString(r, "Path")))))) - .Then(l => l.Literal("edit") - .Executes(r => OpenEditor(r.Source)) - .Then(l => l.Literal("page") - .Then(l => l.Argument("Page", Arguments.Integer(min: 1)) - .Then(l => l.Argument("Text", Arguments.GreedyString()) - .Executes(r => EditPage(r.Source, Arguments.GetInteger(r, "Page"), Arguments.GetString(r, "Text")))))) - .Then(l => l.Literal("insert") - .Then(l => l.Argument("Page", Arguments.Integer(min: 1)) - .Then(l => l.Argument("Text", Arguments.GreedyString()) - .Executes(r => InsertPage(r.Source, Arguments.GetInteger(r, "Page"), Arguments.GetString(r, "Text")))))) - .Then(l => l.Literal("delete") - .Then(l => l.Argument("Page", Arguments.Integer(min: 1)) - .Executes(r => DeletePage(r.Source, Arguments.GetInteger(r, "Page")))))) - .Then(l => l.Literal("sign") - .Then(l => l.Argument("Title", Arguments.GreedyString()) - .Executes(r => SignBook(r.Source, Arguments.GetString(r, "Title"))))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName)))); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { - "read" => Translations.cmd_book_help_read, - "write" => Translations.cmd_book_help_write, - "edit" => Translations.cmd_book_help_edit, - "sign" => Translations.cmd_book_help_sign, - _ => GetCmdDescTranslated() - }); - } - - private int ReadBook(CmdResult r, int? page) - { - McClient handler = CmdResult.currentHandler!; - if (!EnsureInventory(r, handler)) - return -1; - - if (!handler.TryGetHeldBookContent(out BookContent content)) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_book_not_holding_book); - - if (page is null && BookTuiHost.TryOpen(handler, BookHand.Main, editable: false)) - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_book_tui_opened); - - handler.Log.Info(FormatBook(content, page)); - return r.SetAndReturn(CmdResult.Status.Done); - } - - private int OpenEditor(CmdResult r) - { - McClient handler = CmdResult.currentHandler!; - if (!EnsureWritable(r, handler, out _, Translations.cmd_book_cannot_edit_signed)) - return -1; - - return BookTuiHost.TryOpen(handler, BookHand.Main, editable: true) - ? r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_book_tui_opened) - : r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_book_tui_required); - } - - private int WriteBook(CmdResult r, string text) - { - McClient handler = CmdResult.currentHandler!; - if (!EnsureWritable(r, handler, out _, Translations.cmd_book_cannot_edit_signed)) - return -1; - - IReadOnlyList pages = SplitPages(text); - if (!Validate(r, handler, pages, title: null)) - return -1; - - return handler.SendBookEdit(pages) - ? r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_book_write_sent) - : r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_book_write_failed); - } - - private int WriteBookFromFile(CmdResult r, string path) - { - if (!File.Exists(path)) - return r.SetAndReturn(CmdResult.Status.Fail, string.Format(Translations.cmd_book_file_not_found, path)); - - return WriteBook(r, File.ReadAllText(path, Encoding.UTF8)); - } - - private int EditPage(CmdResult r, int page, string text) - { - McClient handler = CmdResult.currentHandler!; - if (!EnsureWritable(r, handler, out BookContent content, Translations.cmd_book_cannot_edit_signed)) - return -1; - - List pages = content.Pages.ToList(); - if (page > pages.Count) - return r.SetAndReturn(CmdResult.Status.Fail, string.Format(Translations.cmd_book_page_out_of_range, page, pages.Count)); - - pages[page - 1] = DecodeInlineText(text); - if (!Validate(r, handler, pages, title: null)) - return -1; - - return handler.SendBookEdit(pages) - ? r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_book_edit_sent) - : r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_book_write_failed); - } - - private int InsertPage(CmdResult r, int page, string text) - { - McClient handler = CmdResult.currentHandler!; - if (!EnsureWritable(r, handler, out BookContent content, Translations.cmd_book_cannot_edit_signed)) - return -1; - - List pages = content.Pages.ToList(); - if (page > pages.Count + 1) - return r.SetAndReturn(CmdResult.Status.Fail, string.Format(Translations.cmd_book_page_out_of_range, page, pages.Count)); - - pages.Insert(page - 1, DecodeInlineText(text)); - if (!Validate(r, handler, pages, title: null)) - return -1; - - return handler.SendBookEdit(pages) - ? r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_book_edit_sent) - : r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_book_write_failed); - } - - private int DeletePage(CmdResult r, int page) - { - McClient handler = CmdResult.currentHandler!; - if (!EnsureWritable(r, handler, out BookContent content, Translations.cmd_book_cannot_edit_signed)) - return -1; - - List pages = content.Pages.ToList(); - if (page > pages.Count) - return r.SetAndReturn(CmdResult.Status.Fail, string.Format(Translations.cmd_book_page_out_of_range, page, pages.Count)); - - pages.RemoveAt(page - 1); - if (pages.Count == 0) - pages.Add(string.Empty); - - if (!Validate(r, handler, pages, title: null)) - return -1; - - return handler.SendBookEdit(pages) - ? r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_book_edit_sent) - : r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_book_write_failed); - } - - private int SignBook(CmdResult r, string title) - { - McClient handler = CmdResult.currentHandler!; - if (!EnsureWritable(r, handler, out BookContent content, Translations.cmd_book_already_signed)) - return -1; - - string normalizedTitle = title.Trim(); - if (!Validate(r, handler, content.Pages, normalizedTitle)) - return -1; - - return handler.SendBookEdit(content.Pages, normalizedTitle) - ? r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_book_sign_sent) - : r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_book_write_failed); - } - - private static bool EnsureInventory(CmdResult r, McClient handler) - { - if (handler.GetInventoryEnabled()) - return true; - - r.SetAndReturn(CmdResult.Status.FailNeedInventory); - return false; - } - - private static bool EnsureWritable(CmdResult r, McClient handler, out BookContent content, string signedBookMessage) - { - content = BookContent.EmptyWritable; - if (!EnsureInventory(r, handler)) - return false; - - Item? item = handler.GetHeldBook(); - if (!BookContentHelper.IsWritableBook(item)) - { - r.SetAndReturn(CmdResult.Status.Fail, GetWritableBookFailureMessage(item, signedBookMessage)); - return false; - } - - return BookContentHelper.TryRead(item, out content); - } - - private static string GetWritableBookFailureMessage(Item? item, string signedBookMessage) - { - return BookContentHelper.TryRead(item, out BookContent content) && content.IsSigned - ? signedBookMessage - : Translations.cmd_book_not_holding_writable; - } - - private static IReadOnlyList SplitPages(string text) - { - return BookContentHelper.NormalizePages(DecodeInlineText(text).Split(PageDelimiter)); - } - - private static string DecodeInlineText(string text) - { - return text.Replace("\\f", PageDelimiter.ToString(), StringComparison.Ordinal) - .Replace("\\n", "\n", StringComparison.Ordinal); - } - - private static bool Validate(CmdResult r, McClient handler, IReadOnlyList pages, string? title) - { - BookLimits limits = BookLimits.ForProtocol(handler.GetProtocolVersion()); - - if (pages.Count > limits.MaxPages) - { - r.SetAndReturn(CmdResult.Status.Fail, string.Format(Translations.cmd_book_too_many_pages, pages.Count, limits.MaxPages)); - return false; - } - - for (int i = 0; i < pages.Count; i++) - { - if (pages[i].Length > limits.MaxPageLength) - { - r.SetAndReturn(CmdResult.Status.Fail, string.Format(Translations.cmd_book_page_too_long, i + 1, pages[i].Length, limits.MaxPageLength)); - return false; - } - } - - if (title is not null && (title.Length == 0 || title.Length > limits.MaxTitleLength)) - { - r.SetAndReturn(CmdResult.Status.Fail, string.Format(Translations.cmd_book_title_invalid, limits.MaxTitleLength)); - return false; - } - - return true; - } - - private static string FormatBook(BookContent content, int? page) - { - StringBuilder sb = new(); - sb.AppendLine(content.IsSigned - ? string.Format(Translations.cmd_book_header_signed, content.Title ?? string.Empty, content.Author ?? string.Empty) - : Translations.cmd_book_header_writable); - - if (page is not null) - { - int index = page.Value - 1; - if (index < 0 || index >= content.Pages.Count) - return string.Format(Translations.cmd_book_page_out_of_range, page.Value, content.Pages.Count); - - sb.AppendLine(string.Format(Translations.cmd_book_page_header, page.Value, content.Pages.Count)); - sb.Append(content.Pages[index]); - return sb.ToString(); - } - - for (int i = 0; i < content.Pages.Count; i++) - { - sb.AppendLine(string.Format(Translations.cmd_book_page_header, i + 1, content.Pages.Count)); - sb.AppendLine(content.Pages[i]); - } - - return sb.ToString().TrimEnd(); - } - } -} diff --git a/MinecraftClient/Commands/Bots.cs b/MinecraftClient/Commands/Bots.cs deleted file mode 100644 index 9a94615ebd..0000000000 --- a/MinecraftClient/Commands/Bots.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System; -using System.Text; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.Scripting; - -namespace MinecraftClient.Commands -{ - class Bots : Command - { - public override string CmdName { get { return "bots"; } } - public override string CmdUsage { get { return "bots [list|unload ]"; } } - public override string CmdDesc { get { return Translations.cmd_bots_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - .Then(l => l.Literal("list") - .Executes(r => GetUsage(r.Source, "list"))) - .Then(l => l.Literal("unload") - .Executes(r => GetUsage(r.Source, "unload"))) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => DoListBot(r.Source)) - .Then(l => l.Literal("list") - .Executes(r => DoListBot(r.Source))) - .Then(l => l.Literal("unload") - .Then(l => l.Argument("BotName", MccArguments.BotName()) - .Executes(r => DoUnloadBot(r.Source, Arguments.GetString(r, "BotName"))))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - "list" => GetCmdDescTranslated(), - "unload" => GetCmdDescTranslated(), - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int DoListBot(CmdResult r) - { - McClient handler = CmdResult.currentHandler!; - int length = handler.GetLoadedChatBots().Count; - if (length == 0) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_bots_noloaded); - - StringBuilder sb = new(); - for (int i = 0; i < length; i++) - { - sb.Append(handler.GetLoadedChatBots()[i].GetType().Name); - if (i != length - 1) - sb.Append(" ,"); - } - - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_bots_list + ": " + sb.ToString()); - } - - private int DoUnloadBot(CmdResult r, string botName) - { - McClient handler = CmdResult.currentHandler!; - if (botName.ToLower().Equals("all", StringComparison.OrdinalIgnoreCase)) - { - if (handler.GetLoadedChatBots().Count == 0) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_bots_noloaded); - else - { - handler.UnloadAllBots(); - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_bots_unloaded_all); - } - } - else - { - ChatBot? bot = handler.GetLoadedChatBots().Find(bot => bot.GetType().Name.ToLower() == botName.ToLower()); - if (bot is null) - return r.SetAndReturn(CmdResult.Status.Fail, string.Format(Translations.cmd_bots_notfound, botName)); - else - { - handler.BotUnLoad(bot); - return r.SetAndReturn(CmdResult.Status.Done, string.Format(Translations.cmd_bots_unloaded, botName)); - } - } - } - } -} diff --git a/MinecraftClient/Commands/ChangeSlot.cs b/MinecraftClient/Commands/ChangeSlot.cs deleted file mode 100644 index acbe2e8d3f..0000000000 --- a/MinecraftClient/Commands/ChangeSlot.cs +++ /dev/null @@ -1,53 +0,0 @@ -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using static MinecraftClient.CommandHandler.CmdResult; - -namespace MinecraftClient.Commands -{ - class ChangeSlot : Command - { - public override string CmdName { get { return "changeslot"; } } - public override string CmdUsage { get { return "changeslot <1-9>"; } } - public override string CmdDesc { get { return Translations.cmd_changeSlot_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Then(l => l.Argument("Slot", MccArguments.HotbarSlot()) - .Executes(r => DoChangeSlot(r.Source, Arguments.GetInteger(r, "Slot")))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int DoChangeSlot(CmdResult r, int slot) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetInventoryEnabled()) - return r.SetAndReturn(Status.FailNeedInventory); - - if (handler.ChangeSlot((short)(slot - 1))) - return r.SetAndReturn(Status.Done, string.Format(Translations.cmd_changeSlot_changed, slot)); - else - return r.SetAndReturn(Status.Fail, Translations.cmd_changeSlot_fail); - } - } -} diff --git a/MinecraftClient/Commands/Chunk.cs b/MinecraftClient/Commands/Chunk.cs deleted file mode 100644 index cbf821736d..0000000000 --- a/MinecraftClient/Commands/Chunk.cs +++ /dev/null @@ -1,289 +0,0 @@ -using System; -using System.Text; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.Mapping; -using static MinecraftClient.CommandHandler.CmdResult; - -namespace MinecraftClient.Commands -{ - public class Chunk : Command - { - public override string CmdName { get { return "chunk"; } } - public override string CmdUsage { get { return "chunk status [chunkX chunkZ|locationX locationY locationZ]"; } } - public override string CmdDesc { get { return Translations.cmd_chunk_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - .Then(l => l.Literal("status") - .Executes(r => GetUsage(r.Source, "status"))) - .Then(l => l.Literal("_setloading") - .Executes(r => GetUsage(r.Source, "_setloading"))) - .Then(l => l.Literal("_setloaded") - .Executes(r => GetUsage(r.Source, "_setloaded"))) - .Then(l => l.Literal("_delete") - .Executes(r => GetUsage(r.Source, "_delete"))) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Then(l => l.Literal("status") - .Executes(r => LogChunkStatus(r.Source)) - .Then(l => l.Argument("Location", MccArguments.Location()) - .Executes(r => LogChunkStatus(r.Source, pos: MccArguments.GetLocation(r, "Location")))) - .Then(l => l.Argument("Chunk", MccArguments.Tuple()) - .Executes(r => LogChunkStatus(r.Source, markedChunkPos: MccArguments.GetTuple(r, "Chunk"))))) - .Then(l => l.Literal("_setloading") - .Then(l => l.Argument("Location", MccArguments.Location()) - .Executes(r => DebugSetLoading(r.Source, pos: MccArguments.GetLocation(r, "Location")))) - .Then(l => l.Argument("Chunk", MccArguments.Tuple()) - .Executes(r => DebugSetLoading(r.Source, markedChunkPos: MccArguments.GetTuple(r, "Chunk"))))) - .Then(l => l.Literal("_setloaded") - .Then(l => l.Argument("Location", MccArguments.Location()) - .Executes(r => DebugSetLoaded(r.Source, pos: MccArguments.GetLocation(r, "Location")))) - .Then(l => l.Argument("Chunk", MccArguments.Tuple()) - .Executes(r => DebugSetLoaded(r.Source, markedChunkPos: MccArguments.GetTuple(r, "Chunk"))))) - .Then(l => l.Literal("_delete") - .Then(l => l.Argument("Location", MccArguments.Location()) - .Executes(r => DebugDelete(r.Source, pos: MccArguments.GetLocation(r, "Location")))) - .Then(l => l.Argument("Chunk", MccArguments.Tuple()) - .Executes(r => DebugDelete(r.Source, markedChunkPos: MccArguments.GetTuple(r, "Chunk"))))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - "status" => GetCmdDescTranslated(), - "_setloading" => GetCmdDescTranslated(), - "_setloaded" => GetCmdDescTranslated(), - "_delete" => GetCmdDescTranslated(), - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private static int LogChunkStatus(CmdResult r, Location? pos = null, Tuple? markedChunkPos = null) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetTerrainEnabled()) - return r.SetAndReturn(Status.FailNeedTerrain); - - World world = handler.GetWorld(); - Location current = handler.GetCurrentLocation(); - if (pos.HasValue) - pos.Value.ToAbsolute(current); - - (int markChunkX, int markChunkZ) = markedChunkPos ?? - (pos.HasValue ? new(pos.Value.ChunkX, pos.Value.ChunkZ) : new(current.ChunkX, current.ChunkZ)); - - StringBuilder sb = new(); - - sb.Append(World.GetChunkLoadingStatus(handler.GetWorld())); - sb.Append('\n'); - - sb.AppendLine(string.Format(Translations.cmd_chunk_current, current, current.ChunkX, current.ChunkZ)); - if (markedChunkPos is not null) - { - sb.Append(Translations.cmd_chunk_marked); - if (pos.HasValue) - sb.Append(string.Format("X:{0:0.00} Y:{1:0.00} Z:{2:0.00}, ", pos.Value.X, pos.Value.Y, pos.Value.Z)); - sb.AppendLine(string.Format(Translations.cmd_chunk_chunk_pos, markChunkX, markChunkZ)); ; - } - - int safeHeight; - int safeWidth; - try { safeHeight = Console.BufferHeight; } catch { safeHeight = 50; } - try { safeWidth = Console.BufferWidth; } catch { safeWidth = 120; } - int consoleHeight = Math.Max(Math.Max(safeHeight, Settings.Config.Main.Advanced.MinTerminalHeight) - 2, 25); - if (consoleHeight % 2 == 0) - --consoleHeight; - - int consoleWidth = Math.Max(Math.Max(safeWidth, Settings.Config.Main.Advanced.MinTerminalWidth) / 2, 17); - if (consoleWidth % 2 == 0) - --consoleWidth; - - int startZ = current.ChunkZ - consoleHeight, endZ = current.ChunkZ + consoleHeight; - int startX = current.ChunkX - consoleWidth, endX = current.ChunkX + consoleWidth; - - int leftMost = endX, rightMost = startX, topMost = endZ, bottomMost = startZ; - for (int z = startZ; z <= endZ; z++) - { - for (int x = startX; x <= endX; ++x) - { - if (world[x, z] is not null) - { - leftMost = Math.Min(leftMost, x); - rightMost = Math.Max(rightMost, x); - topMost = Math.Min(topMost, z); - bottomMost = Math.Max(bottomMost, z); - } - } - } - - // Include the player's location - topMost = Math.Min(topMost, current.ChunkZ); - bottomMost = Math.Max(bottomMost, current.ChunkZ); - leftMost = Math.Min(leftMost, current.ChunkX); - rightMost = Math.Max(rightMost, current.ChunkX); - - // Empty one row and one column each - --leftMost; ++rightMost; --topMost; ++bottomMost; - - // Resize according to limitations - if ((bottomMost - topMost + 1) > consoleHeight) - { - int delta = (bottomMost - topMost + 1) - consoleHeight; - if (bottomMost - (delta + 1) / 2 < current.ChunkZ + 1) - { - int bottomReduce = bottomMost - (current.ChunkZ + 1); - bottomMost -= bottomReduce; - topMost += delta - bottomReduce; - } - else if (topMost + delta / 2 > current.ChunkZ - 1) - { - int topAdd = topMost - (current.ChunkZ - 1); - topMost += topAdd; - bottomMost -= delta - topAdd; - } - else - { - topMost += delta / 2; - bottomMost -= (delta + 1) / 2; - } - } - if ((rightMost - leftMost + 1) > consoleWidth) - { - int delta = (rightMost - leftMost + 1) - consoleWidth; - if (rightMost - (delta + 1) / 2 < current.ChunkX + 1) - { - int rightReduce = rightMost - (current.ChunkX + 1); - rightMost -= rightReduce; - leftMost += delta - rightReduce; - } - else if (leftMost + delta / 2 > current.ChunkX - 1) - { - int leftAdd = leftMost - (current.ChunkX - 1); - leftMost += leftAdd; - rightMost -= delta - leftAdd; - } - else - { - leftMost += delta / 2; - rightMost -= (delta + 1) / 2; - } - } - - // Try to include the marker chunk - if (markedChunkPos is not null && - (((Math.Max(bottomMost, markChunkZ) - Math.Min(topMost, markChunkZ) + 1) > consoleHeight) || - ((Math.Max(rightMost, markChunkX) - Math.Min(leftMost, markChunkX) + 1) > consoleWidth))) - sb.AppendLine(Translations.cmd_chunk_outside); - else - { - topMost = Math.Min(topMost, markChunkZ); - bottomMost = Math.Max(bottomMost, markChunkZ); - leftMost = Math.Min(leftMost, markChunkX); - rightMost = Math.Max(rightMost, markChunkX); - } - - - // \ud83d\udd33: 🔳, \ud83d\udfe8: 🟨, \ud83d\udfe9: 🟩, \u25A1: □, \u25A3: ▣, \u25A0: ■ - string[] chunkStatusStr = Settings.Config.Main.Advanced.EnableEmoji ? - new string[] { "\ud83d\udd33", "\ud83d\udfe8", "\ud83d\udfe9" } : new string[] { "\u25A1", "\u25A3", "\u25A0" }; - - // Output - for (int z = topMost; z <= bottomMost; ++z) - { - for (int x = leftMost; x <= rightMost; ++x) - { - if (z == current.ChunkZ && x == current.ChunkX) - sb.Append("§§7"); // Player Location: background gray - else if (z == markChunkZ && x == markChunkX) - sb.Append("§§4"); // Marked chunk: background red - - ChunkColumn? chunkColumn = world[x, z]; - if (chunkColumn is null) - sb.Append(chunkStatusStr[0]); - else if (chunkColumn.FullyLoaded) - sb.Append(chunkStatusStr[2]); - else - sb.Append(chunkStatusStr[1]); - - if ((z == current.ChunkZ && x == current.ChunkX) || (z == markChunkZ && x == markChunkX)) - sb.Append("§§r"); // Reset background color - } - sb.Append('\n'); - } - - sb.Append(string.Format(Translations.cmd_chunk_icon, "§§7 §§r", "§§4 §§r", chunkStatusStr[0], chunkStatusStr[1], chunkStatusStr[2])); - handler.Log.Info(sb.ToString()); - - return r.SetAndReturn(Status.Done); - } - - private static int DebugSetLoading(CmdResult r, Location? pos = null, Tuple? markedChunkPos = null) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetTerrainEnabled()) - return r.SetAndReturn(Status.FailNeedTerrain); - - if (pos.HasValue) - pos.Value.ToAbsolute(handler.GetCurrentLocation()); - handler.Log.Info(Translations.cmd_chunk_for_debug); - (int chunkX, int chunkZ) = markedChunkPos ?? new(pos!.Value.ChunkX, pos!.Value.ChunkZ); - ChunkColumn? chunkColumn = handler.GetWorld()[chunkX, chunkZ]; - if (chunkColumn is not null) - chunkColumn.FullyLoaded = false; - - if (chunkColumn is null) - return r.SetAndReturn(Status.Fail, "Fail: chunk dosen't exist!"); - else - return r.SetAndReturn(Status.Done, string.Format("Successfully marked chunk ({0}, {1}) as loading.", chunkX, chunkZ)); - } - - private static int DebugSetLoaded(CmdResult r, Location? pos = null, Tuple? markedChunkPos = null) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetTerrainEnabled()) - return r.SetAndReturn(Status.FailNeedTerrain); - - if (pos.HasValue) - pos.Value.ToAbsolute(handler.GetCurrentLocation()); - handler.Log.Info(Translations.cmd_chunk_for_debug); - (int chunkX, int chunkZ) = markedChunkPos ?? new(pos!.Value.ChunkX, pos!.Value.ChunkZ); - ChunkColumn? chunkColumn = handler.GetWorld()[chunkX, chunkZ]; - if (chunkColumn is not null) - chunkColumn.FullyLoaded = false; - - if (chunkColumn is null) - return r.SetAndReturn(Status.Fail, "Fail: chunk dosen't exist!"); - else - return r.SetAndReturn(Status.Done, string.Format("Successfully marked chunk ({0}, {1}) as loaded.", chunkX, chunkZ)); - } - - private static int DebugDelete(CmdResult r, Location? pos = null, Tuple? markedChunkPos = null) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetTerrainEnabled()) - return r.SetAndReturn(Status.FailNeedTerrain); - - if (pos.HasValue) - pos.Value.ToAbsolute(handler.GetCurrentLocation()); - handler.Log.Info(Translations.cmd_chunk_for_debug); - (int chunkX, int chunkZ) = markedChunkPos ?? new(pos!.Value.ChunkX, pos!.Value.ChunkZ); - handler.GetWorld()[chunkX, chunkZ] = null; - - return r.SetAndReturn(Status.Done, string.Format("Successfully deleted chunk ({0}, {1}).", chunkX, chunkZ)); - } - } -} diff --git a/MinecraftClient/Commands/ClearConsole.cs b/MinecraftClient/Commands/ClearConsole.cs deleted file mode 100644 index 68ff58ccb4..0000000000 --- a/MinecraftClient/Commands/ClearConsole.cs +++ /dev/null @@ -1,45 +0,0 @@ -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - public class ClearConsole : Command - { - public override string CmdName => "clear-console"; - public override string CmdUsage => "clear-console"; - public override string CmdDesc => Translations.cmd_clear_console_desc; - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source)) - ) - ); - - var clearConsole = dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => Execute(r.Source)) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - - dispatcher.Register(l => l.Literal("cc") - .Executes(r => Execute(r.Source)) - .Redirect(clearConsole) - ); - } - - private int GetUsage(CmdResult result) - { - return result.SetAndReturn(GetCmdDescTranslated()); - } - - private int Execute(CmdResult result) - { - ConsoleIO.ClearConsole(); - return result.SetAndReturn(CmdResult.Status.Done); - } - } -} diff --git a/MinecraftClient/Commands/Connect.cs b/MinecraftClient/Commands/Connect.cs deleted file mode 100644 index 51206462b7..0000000000 --- a/MinecraftClient/Commands/Connect.cs +++ /dev/null @@ -1,99 +0,0 @@ -using System; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using static MinecraftClient.CommandHandler.CmdResult; - -namespace MinecraftClient.Commands -{ - public class Connect : Command - { - public override string CmdName { get { return "connect"; } } - public override string CmdUsage { get { return "connect [account]"; } } - public override string CmdDesc { get { return Translations.cmd_connect_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Then(l => l.Argument("ServerNick", MccArguments.ServerNick()) - .Executes(r => DoConnect(r.Source, Arguments.GetString(r, "ServerNick"), string.Empty)) - .Then(l => l.Argument("AccountNick", MccArguments.AccountNick()) - .Executes(r => DoConnect(r.Source, Arguments.GetString(r, "ServerNick"), Arguments.GetString(r, "AccountNick"))))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int DoConnect(CmdResult r, string server, string account) - { - RestartSettingsSnapshot previousSettings = Program.CaptureRestartSettings(); - if (!string.IsNullOrWhiteSpace(account) && !Settings.Config.Main.Advanced.SetAccount(account)) - return r.SetAndReturn(Status.Fail, string.Format(Translations.cmd_connect_unknown, account)); - - if (Settings.Config.Main.SetServerIP(new Settings.MainConfigHelper.MainConfig.ServerInfoConfig(server), true)) - { - if (Program.TryRestart( - Program.CurrentConnectionAttempt, - TimeSpan.Zero, - keepAccountAndServerSettings: true, - replaceUntilCommit: true)) - { - return r.SetAndReturn(Status.Done); - } - - Program.RestoreRestartSettings(previousSettings); - return r.SetAndReturn(Status.Fail); - } - else - { - Program.RestoreRestartSettings(previousSettings); - return r.SetAndReturn(Status.Fail, string.Format(Translations.cmd_connect_invalid_ip, server)); - } - } - - internal static string DoConnect(string command) - { - RestartSettingsSnapshot previousSettings = Program.CaptureRestartSettings(); - string[] args = GetArgs(command); - if (args.Length > 1 && !Settings.Config.Main.Advanced.SetAccount(args[1])) - return string.Format(Translations.cmd_connect_unknown, args[1]); - - if (Settings.Config.Main.SetServerIP(new Settings.MainConfigHelper.MainConfig.ServerInfoConfig(args[0]), true)) - { - if (Program.TryRestart( - Program.CurrentConnectionAttempt, - TimeSpan.Zero, - keepAccountAndServerSettings: true, - replaceUntilCommit: true)) - { - return string.Empty; - } - - Program.RestoreRestartSettings(previousSettings); - return Translations.general_fail; - } - else - { - Program.RestoreRestartSettings(previousSettings); - return string.Format(Translations.cmd_connect_invalid_ip, args[0]); - } - } - } -} diff --git a/MinecraftClient/Commands/ConsoleChat.cs b/MinecraftClient/Commands/ConsoleChat.cs deleted file mode 100644 index fd52a6e417..0000000000 --- a/MinecraftClient/Commands/ConsoleChat.cs +++ /dev/null @@ -1,49 +0,0 @@ -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - public class ConsoleChat : Command - { - public override string CmdName => "console-chat"; - public override string CmdUsage => "console-chat [on|off]"; - public override string CmdDesc => Translations.cmd_console_chat_desc; - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => SetChatVisibility(r.Source, null)) - .Then(l => l.Literal("on") - .Executes(r => SetChatVisibility(r.Source, true))) - .Then(l => l.Literal("off") - .Executes(r => SetChatVisibility(r.Source, false))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult result) - { - return result.SetAndReturn(GetCmdDescTranslated()); - } - - private int SetChatVisibility(CmdResult result, bool? visible) - { - ConsoleIO.ChatVisible = visible ?? !ConsoleIO.ChatVisible; - - return result.SetAndReturn( - CmdResult.Status.Done, - ConsoleIO.ChatVisible - ? Translations.cmd_console_chat_state_on - : Translations.cmd_console_chat_state_off); - } - } -} diff --git a/MinecraftClient/Commands/Debug.cs b/MinecraftClient/Commands/Debug.cs deleted file mode 100644 index 92184f1d25..0000000000 --- a/MinecraftClient/Commands/Debug.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System; -using System.Linq; -using System.Text; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.Scripting; - -namespace MinecraftClient.Commands -{ - public class Debug : Command - { - public override string CmdName { get { return "debug"; } } - public override string CmdUsage { get { return "debug [on|off|state]"; } } - public override string CmdDesc { get { return Translations.cmd_debug_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => SetDebugMode(r.Source, true)) - .Then(l => l.Literal("on") - .Executes(r => SetDebugMode(r.Source, false, true))) - .Then(l => l.Literal("off") - .Executes(r => SetDebugMode(r.Source, false, false))) - .Then(l => l.Literal("state") - .Executes(r => ShowState(r.Source))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int SetDebugMode(CmdResult r, bool flip, bool mode = false) - { - McClient handler = CmdResult.currentHandler!; - - if (flip) - Settings.Config.Logging.DebugMessages = !Settings.Config.Logging.DebugMessages; - else - Settings.Config.Logging.DebugMessages = mode; - - handler.Log.DebugEnabled = Settings.Config.Logging.DebugMessages; - - if (Settings.Config.Logging.DebugMessages) - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_debug_state_on); - else - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_debug_state_off); - } - - private int ShowState(CmdResult r) - { - McClient handler = CmdResult.currentHandler!; - var sb = new StringBuilder(); - - sb.AppendLine($"§e=== {Translations.cmd_debug_state_header} ==="); - sb.AppendLine($"§7{Translations.cmd_debug_state_server,-10}§f{handler.GetServerHost()}:{handler.GetServerPort()}"); - sb.AppendLine($"§7{Translations.cmd_debug_state_username,-10}§f{handler.GetUsername()}"); - sb.AppendLine($"§7{Translations.cmd_debug_state_protocol,-10}§f{handler.GetProtocolVersion()}"); - sb.AppendLine($"§7{Translations.cmd_debug_state_gamemode,-10}§f{handler.GetGamemode()}"); - sb.AppendLine($"§7{Translations.cmd_debug_state_health,-10}§f{handler.GetHealth():F1}"); - sb.AppendLine($"§7{Translations.cmd_debug_state_food,-10}§f{handler.GetSaturation()}"); - - var loc = handler.GetCurrentLocation(); - sb.AppendLine($"§7{Translations.cmd_debug_state_location,-10}§f{loc.X:F2}, {loc.Y:F2}, {loc.Z:F2}"); - - sb.AppendLine($"§7{Translations.cmd_debug_state_tps,-10}§f{handler.GetServerTPS():F1}"); - - sb.AppendLine($"§7{Translations.cmd_debug_state_console,-10}§f{(ConsoleIO.Backend?.GetType().Name ?? "null")}"); - - var features = new StringBuilder(); - features.Append(handler.GetTerrainEnabled() ? "§aTerrain " : "§8Terrain "); - features.Append(handler.GetInventoryEnabled() ? "§aInventory " : "§8Inventory "); - features.Append(handler.GetEntityHandlingEnabled() ? "§aEntity " : "§8Entity "); - sb.AppendLine($"§7{Translations.cmd_debug_state_features,-10}{features}"); - - sb.AppendLine($"§7{Translations.cmd_debug_state_debug,-10}§f{(Settings.Config.Logging.DebugMessages ? "§aON" : "§cOFF")}"); - - var bots = handler.GetLoadedChatBots(); - sb.AppendLine($"§7{Translations.cmd_debug_state_bots} ({bots.Count}): §f{string.Join(", ", bots.Select(b => b.GetType().Name))}"); - - var players = handler.GetOnlinePlayers(); - sb.AppendLine($"§7{Translations.cmd_debug_state_players,-10}§f{string.Format(Translations.cmd_debug_state_online, players.Length)}"); - - handler.Log.Info(sb.ToString()); - return r.SetAndReturn(CmdResult.Status.Done); - } - } -} diff --git a/MinecraftClient/Commands/Dialog.cs b/MinecraftClient/Commands/Dialog.cs deleted file mode 100644 index 826fa5926f..0000000000 --- a/MinecraftClient/Commands/Dialog.cs +++ /dev/null @@ -1,108 +0,0 @@ -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.Dialogs; -using MinecraftClient.Tui; - -namespace MinecraftClient.Commands; - -public class Dialog : Command -{ - public override string CmdName => "dialog"; - public override string CmdUsage => Translations.cmd_dialog_usage; - public override string CmdDesc => Translations.cmd_dialog_desc; - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source)))); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => Show(r.Source)) - .Then(l => l.Literal("show") - .Executes(r => Show(r.Source))) - .Then(l => l.Literal("open") - .Executes(r => Open(r.Source))) - .Then(l => l.Literal("set") - .Then(l => l.Argument("Input", Arguments.String()) - .Then(l => l.Argument("Value", Arguments.GreedyString()) - .Executes(r => SetInput(r.Source, Arguments.GetString(r, "Input"), Arguments.GetString(r, "Value")))))) - .Then(l => l.Literal("input") - .Then(l => l.Argument("Input", Arguments.String()) - .Then(l => l.Argument("Value", Arguments.GreedyString()) - .Executes(r => SetInput(r.Source, Arguments.GetString(r, "Input"), Arguments.GetString(r, "Value")))))) - .Then(l => l.Literal("click") - .Then(l => l.Argument("Index", Arguments.Integer(min: 1)) - .Executes(r => Click(r.Source, Arguments.GetInteger(r, "Index"))))) - .Then(l => l.Literal("click-label") - .Then(l => l.Argument("Label", Arguments.GreedyString()) - .Executes(r => ClickLabel(r.Source, Arguments.GetString(r, "Label"))))) - .Then(l => l.Literal("cancel") - .Executes(r => Cancel(r.Source))) - .Then(l => l.Literal("dismiss") - .Executes(r => Dismiss(r.Source))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName)))); - } - - private int GetUsage(CmdResult r) => r.SetAndReturn(GetCmdDescTranslated()); - - private static int Show(CmdResult r) - { - var handler = CmdResult.currentHandler!; - var current = handler.Dialogs.Current; - if (current is null) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.dialog_none); - - ConsoleIO.WriteLineFormatted(DialogFormatter.Render(current), acceptnewlines: true); - return r.SetAndReturn(CmdResult.Status.Done); - } - - private static int Open(CmdResult r) - { - var handler = CmdResult.currentHandler!; - var current = handler.Dialogs.Current; - if (current is null) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.dialog_none); - - if (ConsoleIO.Backend is not TuiConsoleBackend) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.dialog_tui_unavailable); - - return DialogTuiHost.TryOpen(handler, current, force: true) - ? r.SetAndReturn(CmdResult.Status.Done, Translations.dialog_tui_opened) - : r.SetAndReturn(CmdResult.Status.Fail, Translations.dialog_tui_unavailable); - } - - private static int SetInput(CmdResult r, string key, string value) - { - var result = CmdResult.currentHandler!.Dialogs.SetInput(key, value); - return r.SetAndReturn(result.Success ? CmdResult.Status.Done : CmdResult.Status.Fail, result.Message); - } - - private static int Click(CmdResult r, int index) - { - var result = CmdResult.currentHandler!.Dialogs.Click(index); - return r.SetAndReturn(result.Success ? CmdResult.Status.Done : CmdResult.Status.Fail, result.Message); - } - - private static int ClickLabel(CmdResult r, string label) - { - var result = CmdResult.currentHandler!.Dialogs.ClickLabel(label); - return r.SetAndReturn(result.Success ? CmdResult.Status.Done : CmdResult.Status.Fail, result.Message); - } - - private static int Cancel(CmdResult r) - { - var result = CmdResult.currentHandler!.Dialogs.Cancel(); - return r.SetAndReturn(result.Success ? CmdResult.Status.Done : CmdResult.Status.Fail, result.Message); - } - - private static int Dismiss(CmdResult r) - { - var result = CmdResult.currentHandler!.Dialogs.Dismiss(); - DialogTuiHost.CloseCurrent(); - return r.SetAndReturn(result.Success ? CmdResult.Status.Done : CmdResult.Status.Fail, result.Message); - } -} diff --git a/MinecraftClient/Commands/Dig.cs b/MinecraftClient/Commands/Dig.cs deleted file mode 100644 index 477e2c7742..0000000000 --- a/MinecraftClient/Commands/Dig.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.Mapping; -using static MinecraftClient.CommandHandler.CmdResult; - -namespace MinecraftClient.Commands -{ - public class Dig : Command - { - public override string CmdName { get { return "dig"; } } - public override string CmdUsage { get { return "dig "; } } - public override string CmdDesc { get { return Translations.cmd_dig_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - // TODO Get blockFace direction from arguments - .Executes(r => DigLookAt(r.Source)) - .Then(l => l.Argument("Duration", Arguments.Double()) - .Executes(r => DigLookAt(r.Source, Arguments.GetDouble(r, "Duration")))) - .Then(l => l.Argument("Location", MccArguments.Location()) - .Executes(r => DigAt(r.Source, MccArguments.GetLocation(r, "Location"))) - .Then(l => l.Argument("Duration", Arguments.Double()) - .Executes(r => DigAt(r.Source, MccArguments.GetLocation(r, "Location"), Arguments.GetDouble(r, "Duration"))))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int DigAt(CmdResult r, Location blockToBreak, double duration = 0) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetTerrainEnabled()) - return r.SetAndReturn(Status.FailNeedTerrain); - - Location current = handler.GetCurrentLocation(); - blockToBreak = blockToBreak.ToAbsolute(current); - if (blockToBreak.DistanceSquared(current.EyesLocation()) > 25) - return r.SetAndReturn(Status.Fail, Translations.cmd_dig_too_far); - Block block = handler.GetWorld().GetBlock(blockToBreak); - if (block.Type == Material.Air) - return r.SetAndReturn(Status.Fail, Translations.cmd_dig_no_block); - else if (handler.DigBlock(blockToBreak, Direction.Down, duration: duration)) - { - blockToBreak = blockToBreak.ToCenter(); - return r.SetAndReturn(Status.Done, string.Format(Translations.cmd_dig_dig, blockToBreak.X, blockToBreak.Y, blockToBreak.Z, block.GetTypeString())); - } - else - return r.SetAndReturn(Status.Fail, Translations.cmd_dig_fail); - } - - private int DigLookAt(CmdResult r, double duration = 0) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetTerrainEnabled()) - return r.SetAndReturn(Status.FailNeedTerrain); - - (bool hasBlock, Location blockLoc, Block block) = RaycastHelper.RaycastBlock(handler, 4.5, false); - if (!hasBlock) - return r.SetAndReturn(Status.Fail, Translations.cmd_dig_too_far); - else if (block.Type == Material.Air) - return r.SetAndReturn(Status.Fail, Translations.cmd_dig_no_block); - else if (handler.DigBlock(blockLoc, Direction.Down, lookAtBlock: false, duration: duration)) - return r.SetAndReturn(Status.Done, string.Format(Translations.cmd_dig_dig, blockLoc.X, blockLoc.Y, blockLoc.Z, block.GetTypeString())); - else - return r.SetAndReturn(Status.Fail, Translations.cmd_dig_fail); - } - } -} diff --git a/MinecraftClient/Commands/DropItem.cs b/MinecraftClient/Commands/DropItem.cs deleted file mode 100644 index 38cfc4b68b..0000000000 --- a/MinecraftClient/Commands/DropItem.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.Inventory; -using static MinecraftClient.CommandHandler.CmdResult; - -namespace MinecraftClient.Commands -{ - class DropItem : Command - { - public override string CmdName { get { return "dropitem"; } } - public override string CmdUsage { get { return "dropitem "; } } - public override string CmdDesc { get { return Translations.cmd_dropItem_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Then(l => l.Argument("ItemType", MccArguments.ItemType()) - .Executes(r => DoDropItem(r.Source, MccArguments.GetItemType(r, "ItemType")))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int DoDropItem(CmdResult r, ItemType itemType) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetInventoryEnabled()) - return r.SetAndReturn(Status.FailNeedTerrain); - - int inventoryId; - var inventories = handler.GetInventories(); - List availableIds = inventories.Keys.ToList(); - availableIds.Remove(0); // remove player inventory ID from list - if (availableIds.Count == 1) - inventoryId = availableIds[0]; // one container, use it - else - inventoryId = 0; - var p = inventories[inventoryId]; - int[] targetItems = p.SearchItem(itemType); - foreach (int slot in targetItems) - handler.DoWindowAction(inventoryId, slot, WindowActionType.DropItemStack); - - return r.SetAndReturn(Status.Done, string.Format(Translations.cmd_dropItem_dropped, Item.GetTypeString(itemType), inventoryId)); - } - } -} diff --git a/MinecraftClient/Commands/EffectsCommand.cs b/MinecraftClient/Commands/EffectsCommand.cs deleted file mode 100644 index 700764aaa6..0000000000 --- a/MinecraftClient/Commands/EffectsCommand.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System.Linq; -using System.Text; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - public class EffectsCommand : Command - { - public override string CmdName { get { return "effects"; } } - public override string CmdUsage { get { return "effects"; } } - public override string CmdDesc { get { return Translations.cmd_effects_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => ShowEffects(r.Source)) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int ShowEffects(CmdResult r) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetEntityHandlingEnabled()) - return r.SetAndReturn(CmdResult.Status.FailNeedEntity); - - var effects = handler.GetPlayerEffects() - .Values - .Where(effectData => !effectData.IsExpired) - .OrderBy(effectData => effectData.Effect) - .ToArray(); - - if (effects.Length == 0) - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_effects_none); - - StringBuilder response = new(); - response.AppendLine(Translations.cmd_effects_header); - foreach (var effectData in effects) - { - response.AppendLine(string.Format(Translations.cmd_effects_entry, - effectData.GetDisplayName(), effectData.GetRemainingDurationText())); - } - - return r.SetAndReturn(CmdResult.Status.Done, response.ToString().TrimEnd()); - } - } -} diff --git a/MinecraftClient/Commands/Enchant.cs b/MinecraftClient/Commands/Enchant.cs deleted file mode 100644 index 1fc361f70c..0000000000 --- a/MinecraftClient/Commands/Enchant.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System.Linq; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.Inventory; - -namespace MinecraftClient.Commands -{ - public class Enchant : Command - { - public override string CmdName { get { return "enchant"; } } - public override string CmdUsage { get { return "enchant "; } } - public override string CmdDesc { get { return Translations.cmd_enchant_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - .Then(l => l.Literal("top") - .Executes(r => GetUsage(r.Source, "top"))) - .Then(l => l.Literal("middle") - .Executes(r => GetUsage(r.Source, "middle"))) - .Then(l => l.Literal("bottom") - .Executes(r => GetUsage(r.Source, "bottom"))) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Then(l => l.Literal("top") - .Executes(r => DoEnchant(r.Source, slotId: 0))) - .Then(l => l.Literal("middle") - .Executes(r => DoEnchant(r.Source, slotId: 1))) - .Then(l => l.Literal("bottom") - .Executes(r => DoEnchant(r.Source, slotId: 2))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - "top" => GetCmdDescTranslated(), - "middle" => GetCmdDescTranslated(), - "bottom" => GetCmdDescTranslated(), - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int DoEnchant(CmdResult r, int slotId) - { - McClient handler = CmdResult.currentHandler!; - Container? enchantingTable = null; - - foreach (var (id, container) in handler.GetInventories()) - { - if (container.Type == ContainerType.Enchantment) - { - enchantingTable = container; - break; - } - } - - if (enchantingTable is null) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_enchant_enchanting_table_not_opened); - - int[] emptySlots = enchantingTable.GetEmpytSlots(); - - if (emptySlots.Contains(0)) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_enchant_enchanting_no_item); - - if (emptySlots.Contains(1)) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_enchant_enchanting_no_lapis); - - Item lapisSlot = enchantingTable.Items[1]; - - if (lapisSlot.Type != ItemType.LapisLazuli || lapisSlot.Count < 3) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_enchant_enchanting_no_lapis); - - EnchantmentData? enchantment = handler.GetLastEnchantments(); - - if (enchantment is null) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_enchant_no_enchantments); - - short requiredLevel = slotId switch - { - 0 => enchantment.TopEnchantmentLevelRequirement, - 1 => enchantment.MiddleEnchantmentLevelRequirement, - 2 => enchantment.BottomEnchantmentLevelRequirement, - _ => 9999 - }; - - if (handler.GetLevel() < requiredLevel) - return r.SetAndReturn(CmdResult.Status.Fail, string.Format(Translations.cmd_enchant_no_levels, handler.GetLevel(), requiredLevel)); - else - { - if (handler.ClickContainerButton(enchantingTable.ID, slotId)) - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_enchant_clicked); - else - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_enchant_not_clicked); - } - } - } -} diff --git a/MinecraftClient/Commands/Entitycmd.cs b/MinecraftClient/Commands/Entitycmd.cs deleted file mode 100644 index b0ed8a1be7..0000000000 --- a/MinecraftClient/Commands/Entitycmd.cs +++ /dev/null @@ -1,330 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Text; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.Inventory; -using MinecraftClient.Mapping; -using static MinecraftClient.CommandHandler.CmdResult; - -namespace MinecraftClient.Commands -{ - class Entitycmd : Command - { - public override string CmdName { get { return "entity"; } } - public override string CmdUsage { get { return "entity [near] "; } } - public override string CmdDesc { get { return string.Empty; } } - - private enum ActionType { Attack, Use, List }; - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - .Then(l => l.Literal("near") - .Executes(r => GetUsage(r.Source, "near"))) - .Then(l => l.Literal("attack") - .Executes(r => GetUsage(r.Source, "attack"))) - .Then(l => l.Literal("use") - .Executes(r => GetUsage(r.Source, "use"))) - .Then(l => l.Literal("list") - .Executes(r => GetUsage(r.Source, "list"))) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => GetFullEntityList(r.Source)) - .Then(l => l.Literal("near") - .Executes(r => GetClosetEntityList(r.Source)) - .Then(l => l.Argument("EntityID", Arguments.Integer()) - .Executes(r => OperateWithId(r.Source, Arguments.GetInteger(r, "EntityID"), ActionType.List)) - .Then(l => l.Literal("attack") - .Executes(r => OperateWithId(r.Source, Arguments.GetInteger(r, "EntityID"), ActionType.Attack))) - .Then(l => l.Literal("use") - .Executes(r => OperateWithId(r.Source, Arguments.GetInteger(r, "EntityID"), ActionType.Use))) - .Then(l => l.Literal("list") - .Executes(r => OperateWithId(r.Source, Arguments.GetInteger(r, "EntityID"), ActionType.List)))) - .Then(l => l.Argument("EntityType", MccArguments.EntityType()) - .Executes(r => OperateWithType(r.Source, true, MccArguments.GetEntityType(r, "EntityType"), ActionType.List)) - .Then(l => l.Literal("attack") - .Executes(r => OperateWithType(r.Source, near: true, MccArguments.GetEntityType(r, "EntityType"), ActionType.Attack))) - .Then(l => l.Literal("use") - .Executes(r => OperateWithType(r.Source, near: true, MccArguments.GetEntityType(r, "EntityType"), ActionType.Use))) - .Then(l => l.Literal("list") - .Executes(r => OperateWithType(r.Source, near: true, MccArguments.GetEntityType(r, "EntityType"), ActionType.List))))) - .Then(l => l.Argument("EntityID", Arguments.Integer()) - .Executes(r => OperateWithId(r.Source, Arguments.GetInteger(r, "EntityID"), ActionType.List)) - .Then(l => l.Literal("attack") - .Executes(r => OperateWithId(r.Source, Arguments.GetInteger(r, "EntityID"), ActionType.Attack))) - .Then(l => l.Literal("use") - .Executes(r => OperateWithId(r.Source, Arguments.GetInteger(r, "EntityID"), ActionType.Use))) - .Then(l => l.Literal("list") - .Executes(r => OperateWithId(r.Source, Arguments.GetInteger(r, "EntityID"), ActionType.List)))) - .Then(l => l.Argument("EntityType", MccArguments.EntityType()) - .Executes(r => OperateWithType(r.Source, true, MccArguments.GetEntityType(r, "EntityType"), ActionType.List)) - .Then(l => l.Literal("attack") - .Executes(r => OperateWithType(r.Source, near: false, MccArguments.GetEntityType(r, "EntityType"), ActionType.Attack))) - .Then(l => l.Literal("use") - .Executes(r => OperateWithType(r.Source, near: false, MccArguments.GetEntityType(r, "EntityType"), ActionType.Use))) - .Then(l => l.Literal("list") - .Executes(r => OperateWithType(r.Source, near: false, MccArguments.GetEntityType(r, "EntityType"), ActionType.List)))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - "near" => GetCmdDescTranslated(), - "attack" => GetCmdDescTranslated(), - "use" => GetCmdDescTranslated(), - "list" => GetCmdDescTranslated(), - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int GetFullEntityList(CmdResult r) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetEntityHandlingEnabled()) - return r.SetAndReturn(Status.FailNeedEntity); - - Dictionary entities = handler.GetEntities(); - StringBuilder response = new(); - response.AppendLine(Translations.cmd_entityCmd_entities); - foreach (var entity2 in entities) - response.AppendLine(GetEntityInfoShort(entity2.Value)); - response.Append(GetCmdDescTranslated()); - handler.Log.Info(response.ToString()); - - return r.SetAndReturn(Status.Done); - } - - private int GetClosetEntityList(CmdResult r) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetEntityHandlingEnabled()) - return r.SetAndReturn(Status.FailNeedEntity); - - if (TryGetClosetEntity(handler.GetEntities(), handler.GetCurrentLocation(), null, out Entity? closest)) - { - handler.Log.Info(GetEntityInfoDetailed(handler, closest)); - return r.SetAndReturn(Status.Done); - } - else - return r.SetAndReturn(Status.Fail, Translations.cmd_entityCmd_not_found); - } - - private int OperateWithId(CmdResult r, int entityID, ActionType action) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetEntityHandlingEnabled()) - return r.SetAndReturn(Status.FailNeedEntity); - - if (handler.GetEntities().TryGetValue(entityID, out Entity? entity)) - { - handler.Log.Info(InteractionWithEntity(handler, entity, action)); - return r.SetAndReturn(Status.Done); - } - else - return r.SetAndReturn(Status.Fail, Translations.cmd_entityCmd_not_found); - } - - private int OperateWithType(CmdResult r, bool near, EntityType entityType, ActionType action) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetEntityHandlingEnabled()) - return r.SetAndReturn(Status.FailNeedEntity); - - if (near) - { - if (TryGetClosetEntity(handler.GetEntities(), handler.GetCurrentLocation(), entityType, out Entity? closest)) - { - handler.Log.Info(InteractionWithEntity(handler, closest, action)); - return r.SetAndReturn(Status.Done); - } - else - return r.SetAndReturn(Status.Fail, Translations.cmd_entityCmd_not_found); - } - else - { - if (action == ActionType.Attack || action == ActionType.Use) - { - string actionst = Translations.cmd_entityCmd_attacked; - int actioncount = 0; - foreach (var entity2 in handler.GetEntities()) - { - if (entity2.Value.Type == entityType) - { - if (action == ActionType.Attack) - { - handler.InteractEntity(entity2.Key, InteractType.Attack); - actionst = Translations.cmd_entityCmd_attacked; - } - else if (action == ActionType.Use) - { - handler.InteractEntity(entity2.Key, InteractType.Interact); - actionst = Translations.cmd_entityCmd_used; - } - actioncount++; - } - } - handler.Log.Info(actioncount + " " + actionst); - return r.SetAndReturn(Status.Done); - } - else - { - StringBuilder response = new(); - response.AppendLine(Translations.cmd_entityCmd_entities); - foreach (var entity2 in handler.GetEntities()) - { - if (entity2.Value.Type == entityType) - { - response.AppendLine(GetEntityInfoShort(entity2.Value)); - } - } - response.Append(GetCmdDescTranslated()); - handler.Log.Info(response.ToString()); - return r.SetAndReturn(Status.Done); - } - } - } - - private static string GetEntityInfoShort(Entity entity) - { - int id = entity.ID; - float health = entity.Health; - int latency = entity.Latency; - string? nickname = entity.Name; - string? customname = entity.CustomName; - EntityPose pose = entity.Pose; - EntityType type = entity.Type; - Item item = entity.Item; - string location = $"X:{Math.Round(entity.Location.X, 2)}, Y:{Math.Round(entity.Location.Y, 2)}, Z:{Math.Round(entity.Location.Z, 2)}"; - - if (type == EntityType.Item || type == EntityType.ItemFrame || type == EntityType.EyeOfEnder || type == EntityType.Egg || type == EntityType.EnderPearl || type == EntityType.Potion || type == EntityType.SplashPotion || type == EntityType.LingeringPotion || type == EntityType.Fireball || type == EntityType.FireworkRocket) - return $" #{id}: {Translations.cmd_entityCmd_type}: {entity.GetTypeString()}, {Translations.cmd_entityCmd_item}: {item.GetTypeString()}, {Translations.cmd_entityCmd_location}: {location}"; - else if (type == EntityType.Player && !string.IsNullOrEmpty(nickname)) - return $" #{id}: {Translations.cmd_entityCmd_type}: {entity.GetTypeString()}, {Translations.cmd_entityCmd_nickname}: §8{nickname}§8, {Translations.cmd_entityCmd_latency}: {latency}, {Translations.cmd_entityCmd_health}: {health}, {Translations.cmd_entityCmd_pose}: {pose}, {Translations.cmd_entityCmd_location}: {location}"; - else if (type == EntityType.Player && !string.IsNullOrEmpty(customname)) - return $" #{id}: {Translations.cmd_entityCmd_type}: {entity.GetTypeString()}, {Translations.cmd_entityCmd_customname}: §8{customname.Replace("&", "§")}§8, {Translations.cmd_entityCmd_latency}: {latency}, {Translations.cmd_entityCmd_health}: {health}, {Translations.cmd_entityCmd_pose}: {pose}, {Translations.cmd_entityCmd_location}: {location}"; - else - return $" #{id}: {Translations.cmd_entityCmd_type}: {entity.GetTypeString()}, {Translations.cmd_entityCmd_health}: {health}, {Translations.cmd_entityCmd_location}: {location}"; - } - - private static string GetEntityInfoDetailed(McClient handler, Entity entity) - { - StringBuilder sb = new(); - int id = entity.ID; - float health = entity.Health; - int latency = entity.Latency; - Item item = entity.Item; - string? nickname = entity.Name; - string? customname = entity.CustomName; - EntityPose pose = entity.Pose; - EntityType type = entity.Type; - double distance = Math.Round(entity.Location.Distance(handler.GetCurrentLocation()), 2); - string location = $"X:{Math.Round(entity.Location.X, 2)}, Y:{Math.Round(entity.Location.Y, 2)}, Z:{Math.Round(entity.Location.Z, 2)}"; - - string color = "§a"; // Green - if (health < 10) - color = "§c"; // Red - else if (health < 15) - color = "§e"; // Yellow - - sb.Append($"{Translations.cmd_entityCmd_entity}: {id}\n [MCC] Type: {entity.GetTypeString()}"); - - if (!string.IsNullOrEmpty(nickname)) - sb.Append($"\n [MCC] {Translations.cmd_entityCmd_nickname}: {nickname}"); - else if (!string.IsNullOrEmpty(customname)) - sb.Append($"\n [MCC] {Translations.cmd_entityCmd_customname}: {customname.Replace("&", "§")}§8"); - - if (type == EntityType.Player) - { - sb.Append($"\n [MCC] {Translations.cmd_entityCmd_latency}: {latency}"); - } - else if (type == EntityType.Item || type == EntityType.ItemFrame || type == Mapping.EntityType.EyeOfEnder || type == Mapping.EntityType.Egg || type == Mapping.EntityType.EnderPearl || type == Mapping.EntityType.Potion || type == Mapping.EntityType.SplashPotion || type == Mapping.EntityType.LingeringPotion || type == Mapping.EntityType.Fireball || type == Mapping.EntityType.FireworkRocket) - { - string? displayName = item.DisplayName; - if (string.IsNullOrEmpty(displayName)) - sb.Append($"\n [MCC] {Translations.cmd_entityCmd_item}: {item.GetTypeString()} x{item.Count}"); - else - sb.Append($"\n [MCC] {Translations.cmd_entityCmd_item}: {item.GetTypeString()} x{item.Count} - {displayName}§8"); - } - - if (entity.Equipment is not null && entity.Equipment.Count >= 1) - { - sb.Append($"\n [MCC] {Translations.cmd_entityCmd_equipment}:"); - if (entity.Equipment.ContainsKey(0) && entity.Equipment[0] is not null) - sb.Append($"\n [MCC] {Translations.cmd_entityCmd_mainhand}: {entity.Equipment[0].GetTypeString()} x{entity.Equipment[0].Count}"); - if (entity.Equipment.ContainsKey(1) && entity.Equipment[1] is not null) - sb.Append($"\n [MCC] {Translations.cmd_entityCmd_offhand}: {entity.Equipment[1].GetTypeString()} x{entity.Equipment[1].Count}"); - if (entity.Equipment.ContainsKey(5) && entity.Equipment[5] is not null) - sb.Append($"\n [MCC] {Translations.cmd_entityCmd_helmet}: {entity.Equipment[5].GetTypeString()} x{entity.Equipment[5].Count}"); - if (entity.Equipment.ContainsKey(4) && entity.Equipment[4] is not null) - sb.Append($"\n [MCC] {Translations.cmd_entityCmd_chestplate}: {entity.Equipment[4].GetTypeString()} x{entity.Equipment[4].Count}"); - if (entity.Equipment.ContainsKey(3) && entity.Equipment[3] is not null) - sb.Append($"\n [MCC] {Translations.cmd_entityCmd_leggings}: {entity.Equipment[3].GetTypeString()} x{entity.Equipment[3].Count}"); - if (entity.Equipment.ContainsKey(2) && entity.Equipment[2] is not null) - sb.Append($"\n [MCC] {Translations.cmd_entityCmd_boots}: {entity.Equipment[2].GetTypeString()} x{entity.Equipment[2].Count}"); - } - - sb.Append($"\n [MCC] {Translations.cmd_entityCmd_pose}: {pose}"); - sb.Append($"\n [MCC] {Translations.cmd_entityCmd_health}: {color}{health}§8"); - sb.Append($"\n [MCC] {Translations.cmd_entityCmd_distance}: {distance}"); - sb.Append($"\n [MCC] {Translations.cmd_entityCmd_location}: {location}"); - - return sb.ToString(); - } - - private static bool TryGetClosetEntity(Dictionary entities, Location location, EntityType? entityType, [NotNullWhen(true)] out Entity? closest) - { - closest = null; - bool find = false; - double closest_distance = double.PositiveInfinity; - foreach (var entity in entities) - { - if (entityType.HasValue && entity.Value.Type != entityType) - continue; - - double distance = Math.Round(entity.Value.Location.Distance(location), 2); - if (distance < closest_distance) - { - find = true; - closest = entity.Value; - closest_distance = distance; - } - } - return find; - } - - private static string InteractionWithEntity(McClient handler, Entity entity, ActionType action) - { - switch (action) - { - case ActionType.Attack: - handler.InteractEntity(entity.ID, InteractType.Attack); - return Translations.cmd_entityCmd_attacked; - case ActionType.Use: - bool shouldInteractAt = entity.Type == EntityType.ArmorStand || - entity.Type == EntityType.ChestMinecart || - entity.Type == EntityType.ChestBoat; - - handler.InteractEntity(entity.ID, shouldInteractAt ? InteractType.InteractAt : InteractType.Interact); - return Translations.cmd_entityCmd_used; - case ActionType.List: - return GetEntityInfoDetailed(handler, entity); - default: - goto case ActionType.List; - } - } - } -} \ No newline at end of file diff --git a/MinecraftClient/Commands/ExecIf.cs b/MinecraftClient/Commands/ExecIf.cs deleted file mode 100644 index ca985bf4f4..0000000000 --- a/MinecraftClient/Commands/ExecIf.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; -using System.Collections.Generic; -using Brigadier.NET; -using Brigadier.NET.Builder; -using DynamicExpresso; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - class ExecIf : Command - { - public override string CmdName { get { return "execif"; } } - public override string CmdUsage { get { return "execif \"\" \"\""; } } - public override string CmdDesc { get { return Translations.cmd_execif_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Then(l => l.Argument("Condition", Arguments.String()) - .Then(l => l.Argument("Command", Arguments.String()) - .Executes(r => HandleCommand(r.Source, Arguments.GetString(r, "Condition"), Arguments.GetString(r, "Command"))))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int HandleCommand(CmdResult r, string expressionText, string resultCommand) - { - McClient handler = CmdResult.currentHandler!; - try - { - var interpreter = new Interpreter(); - interpreter.SetVariable("MCC", handler); - interpreter.SetVariable("random", new Random()); - - foreach (KeyValuePair entry in Settings.Config.AppVar.GetVariables()) - interpreter.SetVariable(entry.Key, entry.Value); - - var result = interpreter.Eval(expressionText); - handler.Log.Debug("[Execif] Result Type: " + result.GetType().Name); - - if (result) - { - CmdResult output = new(); - handler.PerformInternalCommand(resultCommand, ref output); - - return r.SetAndReturn(CmdResult.Status.Done, string.Format(Translations.cmd_execif_executed, expressionText, resultCommand, output)); - } - else - { - return r.SetAndReturn(CmdResult.Status.Done); - } - } - catch (Exception e) - { - handler.Log.Error(string.Format(Translations.cmd_execif_error, e.Message)); - return r.SetAndReturn(CmdResult.Status.Fail, string.Format(Translations.cmd_execif_error_occured, expressionText + " ---> " + resultCommand)); - } - } - } -} diff --git a/MinecraftClient/Commands/ExecMulti.cs b/MinecraftClient/Commands/ExecMulti.cs deleted file mode 100644 index 98c2fe7c7b..0000000000 --- a/MinecraftClient/Commands/ExecMulti.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - class ExecMulti : Command - { - public override string CmdName { get { return "execmulti"; } } - public override string CmdUsage { get { return "execmulti -> -> -> ..."; } } - public override string CmdDesc { get { return Translations.cmd_execmulti_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Then(l => l.Argument("Commands", Arguments.GreedyString()) - .Executes(r => HandleCommand(r.Source, Arguments.GetString(r, "Commands")))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int HandleCommand(CmdResult r, string commandsString) - { - McClient handler = CmdResult.currentHandler!; - if (commandsString.Contains("execmulti", StringComparison.OrdinalIgnoreCase) || commandsString.Contains("execif", StringComparison.OrdinalIgnoreCase)) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_execmulti_prevent); - - IEnumerable commands = commandsString.Split("->", StringSplitOptions.TrimEntries) - .ToList() - .FindAll(command => !string.IsNullOrEmpty(command)); - - foreach (string cmd in commands) - { - CmdResult output = new(); - handler.PerformInternalCommand(cmd, ref output); - handler.Log.Info(string.Format(Translations.cmd_execmulti_executed, cmd, string.Format(Translations.cmd_execmulti_result, output))); - } - - return r.SetAndReturn(CmdResult.Status.Done); - } - } -} diff --git a/MinecraftClient/Commands/Exit.cs b/MinecraftClient/Commands/Exit.cs deleted file mode 100644 index d2ac389eb0..0000000000 --- a/MinecraftClient/Commands/Exit.cs +++ /dev/null @@ -1,58 +0,0 @@ -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - public class Exit : Command - { - public override string CmdName { get { return "exit"; } } - public override string CmdUsage { get { return "exit"; } } - public override string CmdDesc { get { return Translations.cmd_exit_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - var exit = dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => DoExit(r.Source, 0)) - .Then(l => l.Argument("ExitCode", Arguments.Integer()) - .Executes(r => DoExit(r.Source, Arguments.GetInteger(r, "ExitCode")))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - - dispatcher.Register(l => l.Literal("quit") - .Executes(r => DoExit(r.Source, 0)) - .Redirect(exit) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int DoExit(CmdResult r, int code = 0) - { - Program.Exit(code); - return r.SetAndReturn(CmdResult.Status.Done); - } - - internal static string DoExit(string command) - { - Program.Exit(); - return string.Empty; - } - } -} diff --git a/MinecraftClient/Commands/Health.cs b/MinecraftClient/Commands/Health.cs deleted file mode 100644 index 21df0efdb4..0000000000 --- a/MinecraftClient/Commands/Health.cs +++ /dev/null @@ -1,45 +0,0 @@ -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - class Health : Command - { - public override string CmdName { get { return "health"; } } - public override string CmdUsage { get { return "health"; } } - public override string CmdDesc { get { return Translations.cmd_health_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => LogHealth(r.Source)) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int LogHealth(CmdResult r) - { - McClient handler = CmdResult.currentHandler!; - return r.SetAndReturn(CmdResult.Status.Done, string.Format(Translations.cmd_health_response, handler.GetHealth(), handler.GetSaturation(), handler.GetLevel(), handler.GetTotalExperience())); - } - } -} diff --git a/MinecraftClient/Commands/Help.cs b/MinecraftClient/Commands/Help.cs deleted file mode 100644 index 18dbaf3e0a..0000000000 --- a/MinecraftClient/Commands/Help.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Text; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - internal class Help : Command - { - public override string CmdName => throw new NotImplementedException(); - public override string CmdDesc => throw new NotImplementedException(); - public override string CmdUsage => throw new NotImplementedException(); - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => - l.Literal("help") - .Executes(r => LogHelp(r.Source, dispatcher)) - ); - } - - private int LogHelp(CmdResult r, CommandDispatcher dispatcher) - { - McClient handler = CmdResult.currentHandler!; - var usage = dispatcher.GetSmartUsage(dispatcher.GetRoot(), CmdResult.Empty); - StringBuilder sb = new(); - foreach (var item in usage) - sb.AppendLine(Settings.Config.Main.Advanced.InternalCmdChar.ToChar() + item.Value); - handler.Log.Info(string.Format(Translations.icmd_list, sb.ToString(), Settings.Config.Main.Advanced.InternalCmdChar.ToChar())); - return r.SetAndReturn(CmdResult.Status.Done); - } - } -} diff --git a/MinecraftClient/Commands/Inventory.cs b/MinecraftClient/Commands/Inventory.cs deleted file mode 100644 index 77c5502126..0000000000 --- a/MinecraftClient/Commands/Inventory.cs +++ /dev/null @@ -1,504 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.Inventory; -using MinecraftClient.Tui; - -namespace MinecraftClient.Commands -{ - class Inventory : Command - { - public override string CmdName { get { return "inventory"; } } - public override string CmdUsage { get { return GetBasicUsage(); } } - public override string CmdDesc { get { return Translations.cmd_inventory_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - .Then(l => l.Literal("list") - .Executes(r => GetUsage(r.Source, "list"))) - .Then(l => l.Literal("open") - .Executes(r => GetUsage(r.Source, "open"))) - .Then(l => l.Literal("close") - .Executes(r => GetUsage(r.Source, "close"))) - .Then(l => l.Literal("click") - .Executes(r => GetUsage(r.Source, "click"))) - .Then(l => l.Literal("drop") - .Executes(r => GetUsage(r.Source, "drop"))) - .Then(l => l.Literal("creativegive") - .Executes(r => GetUsage(r.Source, "creativegive"))) - .Then(l => l.Literal("creativedelete") - .Executes(r => GetUsage(r.Source, "creativedelete"))) - .Then(l => l.Literal("inventories") - .Executes(r => GetUsage(r.Source, "inventories"))) - .Then(l => l.Literal("search") - .Executes(r => GetUsage(r.Source, "search"))) - .Then(l => l.Literal("help") - .Executes(r => GetUsage(r.Source, "help"))) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => ListAllInventories(r.Source)) - .Then(l => l.Literal("creativegive") - .Then(l => l.Argument("Slot", MccArguments.InventorySlot()) - .Then(l => l.Argument("ItemType", MccArguments.ItemType()) - .Then(l => l.Argument("Count", Arguments.Integer(min: 1)) - .Executes(r => DoCreativeGive(r.Source, Arguments.GetInteger(r, "Slot"), MccArguments.GetItemType(r, "ItemType"), Arguments.GetInteger(r, "Count"))))))) - .Then(l => l.Literal("creativedelete") - .Then(l => l.Argument("Slot", MccArguments.InventorySlot()) - .Executes(r => DoCreativeDelete(r.Source, Arguments.GetInteger(r, "Slot"))))) - .Then(l => l.Literal("inventories") - .Executes(r => ListAvailableInventories(r.Source))) - .Then(l => l.Literal("search") - .Then(l => l.Argument("ItemType", MccArguments.ItemType()) - .Executes(r => SearchItem(r.Source, MccArguments.GetItemType(r, "ItemType"), null)) - .Then(l => l.Argument("Count", Arguments.Integer(0, 64)) - .Executes(r => SearchItem(r.Source, MccArguments.GetItemType(r, "ItemType"), Arguments.GetInteger(r, "Count")))))) - .Then(l => l.Argument("InventoryId", MccArguments.InventoryId()) - .Executes(r => DoOpenOrList(r.Source, Arguments.GetInteger(r, "InventoryId"))) - .Then(l => l.Literal("open") - .Executes(r => DoOpenTui(r.Source, Arguments.GetInteger(r, "InventoryId")))) - .Then(l => l.Literal("close") - .Executes(r => DoCloseAction(r.Source, Arguments.GetInteger(r, "InventoryId")))) - .Then(l => l.Literal("list") - .Executes(r => DoListAction(r.Source, Arguments.GetInteger(r, "InventoryId"))) - .Then(l => l.Argument("Slot", MccArguments.InventorySlot()) - .Executes(r => DoListAction(r.Source, Arguments.GetInteger(r, "InventoryId"), Arguments.GetInteger(r, "Slot"))))) - .Then(l => l.Literal("click") - .Then(l => l.Argument("Slot", MccArguments.InventorySlot()) - .Executes(r => DoClickAction(r.Source, Arguments.GetInteger(r, "InventoryId"), Arguments.GetInteger(r, "Slot"), WindowActionType.LeftClick)) - .Then(l => l.Argument("Action", MccArguments.InventoryAction()) - .Executes(r => DoClickAction(r.Source, Arguments.GetInteger(r, "InventoryId"), Arguments.GetInteger(r, "Slot"), MccArguments.GetInventoryAction(r, "Action")))))) - .Then(l => l.Literal("drop") - .Then(l => l.Argument("Slot", MccArguments.InventorySlot()) - .Executes(r => DoDropAction(r.Source, Arguments.GetInteger(r, "InventoryId"), Arguments.GetInteger(r, "Slot"), WindowActionType.DropItem)) - .Then(l => l.Literal("all") - .Executes(r => DoDropAction(r.Source, Arguments.GetInteger(r, "InventoryId"), Arguments.GetInteger(r, "Slot"), WindowActionType.DropItemStack)))))) - .Then(l => l.Literal("player") - .Then(l => l.Literal("list") - .Executes(r => DoListAction(r.Source, inventoryId: 0)) - .Then(l => l.Argument("Slot", MccArguments.InventorySlot()) - .Executes(r => DoListAction(r.Source, inventoryId: 0, Arguments.GetInteger(r, "Slot"))))) - .Then(l => l.Literal("click") - .Then(l => l.Argument("Slot", MccArguments.InventorySlot()) - .Executes(r => DoClickAction(r.Source, inventoryId: 0, Arguments.GetInteger(r, "Slot"), WindowActionType.LeftClick)) - .Then(l => l.Argument("Action", MccArguments.InventoryAction()) - .Executes(r => DoClickAction(r.Source, inventoryId: 0, Arguments.GetInteger(r, "Slot"), MccArguments.GetInventoryAction(r, "Action")))))) - .Then(l => l.Literal("drop") - .Then(l => l.Argument("Slot", MccArguments.InventorySlot()) - .Executes(r => DoDropAction(r.Source, inventoryId: 0, Arguments.GetInteger(r, "Slot"), WindowActionType.DropItem)) - .Then(l => l.Literal("all") - .Executes(r => DoDropAction(r.Source, inventoryId: 0, Arguments.GetInteger(r, "Slot"), WindowActionType.DropItemStack)))))) - .Then(l => l.Literal("container") - .Then(l => l.Literal("close") - .Executes(r => DoCloseAction(r.Source, inventoryId: null))) - .Then(l => l.Literal("list") - .Executes(r => DoListAction(r.Source, inventoryId: null)) - .Then(l => l.Argument("Slot", MccArguments.InventorySlot()) - .Executes(r => DoListAction(r.Source, inventoryId: null, Arguments.GetInteger(r, "Slot"))))) - .Then(l => l.Literal("click") - .Then(l => l.Argument("Slot", MccArguments.InventorySlot()) - .Executes(r => DoClickAction(r.Source, inventoryId: null, Arguments.GetInteger(r, "Slot"), WindowActionType.LeftClick)) - .Then(l => l.Argument("Action", MccArguments.InventoryAction()) - .Executes(r => DoClickAction(r.Source, inventoryId: null, Arguments.GetInteger(r, "Slot"), MccArguments.GetInventoryAction(r, "Action")))))) - .Then(l => l.Literal("drop") - .Then(l => l.Argument("Slot", MccArguments.InventorySlot()) - .Executes(r => DoDropAction(r.Source, inventoryId: null, Arguments.GetInteger(r, "Slot"), WindowActionType.DropItem)) - .Then(l => l.Literal("all") - .Executes(r => DoDropAction(r.Source, inventoryId: null, Arguments.GetInteger(r, "Slot"), WindowActionType.DropItemStack)))))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - string usageStr = ' ' + Translations.cmd_inventory_help_usage + ": "; - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - "open" => Translations.cmd_inventory_help_open + usageStr + "/inventory open", - "list" => Translations.cmd_inventory_help_list + usageStr + "/inventory > list [slot]", - "close" => Translations.cmd_inventory_help_close + usageStr + "/inventory > close", - "click" => Translations.cmd_inventory_help_click + usageStr + "/inventory > click [left|right|middle|shift|shiftright]\nDefault is left click", - "drop" => Translations.cmd_inventory_help_drop + usageStr + "/inventory > drop [all]\nAll means drop full stack", - "creativegive" => Translations.cmd_inventory_help_creativegive + usageStr + "/inventory creativegive ", - "creativedelete" => Translations.cmd_inventory_help_creativedelete + usageStr + "/inventory creativedelete ", - "inventories" => Translations.cmd_inventory_help_inventories + usageStr + "/inventory inventories", - "search" => Translations.cmd_inventory_help_search + usageStr + "/inventory search [count]", - "help" => GetCmdDescTranslated(), - "action" => Translations.cmd_inventory_help_unknown + GetAvailableActions(), - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int GetMaximumInventoryId(McClient handler) - { - List availableIds = handler.GetInventories().Keys.ToList(); - return availableIds.Max(); // use foreground container - } - - private int ListAllInventories(CmdResult r) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetInventoryEnabled()) - { - handler.Log.Info(Translations.extra_inventory_required); - return -1; - } - StringBuilder response = new(); - response.Append(Translations.cmd_inventory_inventories).Append(":\n"); - foreach ((int invId, Container inv) in handler.GetInventories()) - response.AppendLine(String.Format(" #{0}: {1}§8", invId, inv.Title)); - response.Append(CmdUsage); - handler.Log.Info(response.ToString()); - return r.SetAndReturn(CmdResult.Status.Done); - } - - private int DoCreativeGive(CmdResult r, int slot, ItemType itemType, int count) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetInventoryEnabled()) - return r.SetAndReturn(CmdResult.Status.FailNeedInventory); - - if (handler.GetGamemode() == 1) - { - if (handler.DoCreativeGive(slot, itemType, count, null)) - return r.SetAndReturn(CmdResult.Status.Done, string.Format(Translations.cmd_inventory_creative_done, itemType, count, slot)); - else - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_inventory_creative_fail); - } - else - { - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_inventory_need_creative); - } - } - - private int DoCreativeDelete(CmdResult r, int slot) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetInventoryEnabled()) - return r.SetAndReturn(CmdResult.Status.FailNeedInventory); - - if (handler.GetGamemode() == 1) - { - if (handler.DoCreativeGive(slot, ItemType.Null, 0, null)) - return r.SetAndReturn(CmdResult.Status.Done, string.Format(Translations.cmd_inventory_creative_delete, slot)); - else - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_inventory_creative_fail); - } - else - { - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_inventory_need_creative); - } - } - - private int ListAvailableInventories(CmdResult r) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetInventoryEnabled()) - return r.SetAndReturn(CmdResult.Status.FailNeedInventory); - - Dictionary inventories = handler.GetInventories(); - List availableIds = inventories.Keys.ToList(); - StringBuilder response = new(); - response.AppendLine(Translations.cmd_inventory_inventories_available); - - foreach (int id in availableIds) - response.AppendLine(String.Format(" #{0} - {1}§8", id, inventories[id].Title)); - - handler.Log.Info(response.ToString()); - return r.SetAndReturn(CmdResult.Status.Done); - } - - private int SearchItem(CmdResult r, ItemType itemType, int? itemCount) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetInventoryEnabled()) - return r.SetAndReturn(CmdResult.Status.FailNeedInventory); - - Dictionary inventories = handler.GetInventories(); - Dictionary> foundItems = new(); - - List availableInventories = inventories.Values.ToList(); - - availableInventories.ForEach(inventory => - { - inventory.Items.Values - .ToList() - .FindAll(item => item.Type == itemType && (!itemCount.HasValue || item.Count == itemCount)) - .ForEach(item => - { - if (!foundItems.ContainsKey(inventory.ID)) - { - foundItems.Add(inventory.ID, new List() { item }); - return; - } - - List invItems = foundItems[inventory.ID]; - invItems.Add(item); - foundItems.Remove(inventory.ID); - foundItems.Add(inventory.ID, invItems); - }); - }); - - if (foundItems.Count == 0) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_inventory_no_found_items); - - StringBuilder response = new(); - - response.AppendLine(Translations.cmd_inventory_found_items + ":"); - - foreach ((int invId, List itemsList) in new SortedDictionary>(foundItems)) - { - if (itemsList.Count > 0) - { - response.AppendLine(String.Format("{0} (#{1}):", inventories[invId].Title, invId)); - - foreach (Item item in itemsList) - response.AppendLine(String.Format("\t- {0}", item.ToFullString())); - - response.AppendLine(" "); - } - } - - handler.Log.Info(response.ToString()); - return r.SetAndReturn(CmdResult.Status.Done); - } - - private int DoCloseAction(CmdResult r, int? inventoryId) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetInventoryEnabled()) - return r.SetAndReturn(CmdResult.Status.FailNeedInventory); - - if (!inventoryId.HasValue) - { - inventoryId = GetMaximumInventoryId(handler); - if (inventoryId == 0) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_inventory_container_not_found); - } - - Container? inventory = handler.GetInventory(inventoryId.Value); - if (inventory is null) - return r.SetAndReturn(CmdResult.Status.Fail, string.Format(Translations.cmd_inventory_not_exist, inventoryId)); - - if (handler.CloseInventory(inventoryId.Value)) - return r.SetAndReturn(CmdResult.Status.Done, string.Format(Translations.cmd_inventory_close, inventoryId)); - else - return r.SetAndReturn(CmdResult.Status.Fail, string.Format(Translations.cmd_inventory_close_fail, inventoryId)); - } - - private int DoListAction(CmdResult r, int? inventoryId, int? slot = null) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetInventoryEnabled()) - return r.SetAndReturn(CmdResult.Status.FailNeedInventory); - - if (!inventoryId.HasValue) - { - inventoryId = GetMaximumInventoryId(handler); - if (inventoryId == 0) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_inventory_container_not_found); - } - - Container? inventory = handler.GetInventory(inventoryId.Value); - if (inventory is null) - return r.SetAndReturn(CmdResult.Status.Fail, string.Format(Translations.cmd_inventory_not_exist, inventoryId)); - - if (slot.HasValue) - { - StringBuilder single = new(); - single.Append(Translations.cmd_inventory_inventory); - single.AppendLine(String.Format(" #{0} - {1}§8", inventoryId, inventory.Title)); - - if (inventory.Items.TryGetValue(slot.Value, out Item? singleItem) && singleItem is not null) - { - int selectedHotbarSlot = handler.GetCurrentSlot() + 1; - bool isHotbar = inventory.IsHotbar(slot.Value, out int hotbar); - string hotbarString = isHotbar ? (hotbar + 1).ToString() : " "; - if ((hotbar + 1) == selectedHotbarSlot) - hotbarString = ">" + hotbarString; - single.AppendLine(String.Format("{0,2} | #{1,-2}: {2}", hotbarString, slot.Value, singleItem.ToFullString())); - } - else - { - single.AppendLine(String.Format("#{0}: _", slot.Value)); - } - - single.Remove(single.Length - 1, 1); // Remove last '\n' - handler.Log.Info(single.ToString()); - return r.SetAndReturn(CmdResult.Status.Done); - } - - StringBuilder response = new(); - response.Append(Translations.cmd_inventory_inventory); - response.AppendLine(String.Format(" #{0} - {1}§8", inventoryId, inventory.Title)); - - string? asciiArt = inventory.Type.GetAsciiArt(); - if (asciiArt is not null && Settings.Config.Main.Advanced.ShowInventoryLayout) - response.AppendLine(asciiArt); - - int selectedHotbar = handler.GetCurrentSlot() + 1; - foreach ((int itemId, Item item) in new SortedDictionary(inventory.Items)) - { - bool isHotbar = inventory.IsHotbar(itemId, out int hotbar); - string hotbarString = isHotbar ? (hotbar + 1).ToString() : " "; - if ((hotbar + 1) == selectedHotbar) - hotbarString = ">" + hotbarString; - response.AppendLine(String.Format("{0,2} | #{1,-2}: {2}", hotbarString, itemId, item.ToFullString())); - } - - if (inventoryId == 0) - response.AppendLine(string.Format(Translations.cmd_inventory_hotbar, (handler.GetCurrentSlot() + 1))); - - response.Remove(response.Length - 1, 1); // Remove last '\n' - handler.Log.Info(response.ToString()); - return r.SetAndReturn(CmdResult.Status.Done); - } - - private int DoClickAction(CmdResult r, int? inventoryId, int slot, WindowActionType actionType) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetInventoryEnabled()) - return r.SetAndReturn(CmdResult.Status.FailNeedInventory); - - if (!inventoryId.HasValue) - { - inventoryId = GetMaximumInventoryId(handler); - if (inventoryId == 0) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_inventory_container_not_found); - } - - Container? inventory = handler.GetInventory(inventoryId.Value); - if (inventory is null) - return r.SetAndReturn(CmdResult.Status.Fail, string.Format(Translations.cmd_inventory_not_exist, inventoryId)); - - string keyName = actionType switch - { - WindowActionType.LeftClick => Translations.cmd_inventory_left, - WindowActionType.RightClick => Translations.cmd_inventory_right, - WindowActionType.MiddleClick => Translations.cmd_inventory_middle, - WindowActionType.ShiftClick => Translations.cmd_inventory_shiftclick, - WindowActionType.ShiftRightClick => Translations.cmd_inventory_shiftrightclick, - _ => "unknown", - }; - - handler.Log.Info(string.Format(Translations.cmd_inventory_clicking, keyName, slot, inventoryId)); - return r.SetAndReturn(handler.DoWindowAction(inventoryId.Value, slot, actionType)); - } - - private int DoDropAction(CmdResult r, int? inventoryId, int slot, WindowActionType actionType) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetInventoryEnabled()) - return r.SetAndReturn(CmdResult.Status.FailNeedInventory); - - if (!inventoryId.HasValue) - { - inventoryId = GetMaximumInventoryId(handler); - if (inventoryId == 0) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_inventory_container_not_found); - } - - Container? inventory = handler.GetInventory(inventoryId.Value); - if (inventory is null) - return r.SetAndReturn(CmdResult.Status.Fail, string.Format(Translations.cmd_inventory_not_exist, inventoryId)); - - // check item exist - if (!inventory.Items.ContainsKey(slot)) - return r.SetAndReturn(CmdResult.Status.Fail, string.Format(Translations.cmd_inventory_no_item, slot)); - - if (handler.DoWindowAction(inventoryId.Value, slot, actionType)) - { - if (actionType == WindowActionType.DropItemStack) - return r.SetAndReturn(CmdResult.Status.Done, string.Format(Translations.cmd_inventory_drop_stack, slot)); - else - return r.SetAndReturn(CmdResult.Status.Done, string.Format(Translations.cmd_inventory_drop, slot)); - } - else - { - return r.SetAndReturn(CmdResult.Status.Fail, "Drop Failed"); - } - } - - - private int DoOpenOrList(CmdResult r, int inventoryId) - { - if (ConsoleIO.Backend is TuiConsoleBackend) - return DoOpenTui(r, inventoryId); - return DoListAction(r, inventoryId); - } - - private int DoOpenTui(CmdResult r, int inventoryId) - { - McClient handler = CmdResult.currentHandler!; - - if (!handler.GetInventoryEnabled()) - return r.SetAndReturn(CmdResult.Status.FailNeedInventory); - - if (ConsoleIO.Backend is not TuiConsoleBackend) - { - handler.Log.Warn(Translations.cmd_inventory_tui_only); - return r.SetAndReturn(CmdResult.Status.Fail); - } - - if (InventoryTuiHost.IsRunning) - { - handler.Log.Warn(Translations.cmd_inventory_tui_already_running); - return r.SetAndReturn(CmdResult.Status.Fail); - } - - var container = handler.GetInventory(inventoryId); - if (container == null) - { - string msg = string.Format(Translations.cmd_inventory_not_exist, inventoryId); - handler.Log.Warn(msg); - return r.SetAndReturn(CmdResult.Status.Fail, msg); - } - - if (!Tui.ContainerViewBase.HasTuiSupport(container.Type)) - { - handler.Log.Warn(string.Format(Translations.cmd_inventory_tui_unsupported_container, inventoryId)); - return r.SetAndReturn(CmdResult.Status.Fail); - } - - handler.Log.Info(string.Format(Translations.cmd_inventory_tui_opening, inventoryId)); - - bool success = InventoryTuiHost.Launch(handler, inventoryId); - if (success) - { - handler.Log.Info(Translations.cmd_inventory_tui_opened); - return r.SetAndReturn(CmdResult.Status.Done); - } - else - { - handler.Log.Warn(Translations.cmd_inventory_tui_launch_failed); - return r.SetAndReturn(CmdResult.Status.Fail); - } - } - - #region Methods for commands help - - private static string GetAvailableActions() - { - return Translations.cmd_inventory_help_available + ": list, close, click, drop, creativegive, creativedelete."; - } - - private static string GetBasicUsage() - { - return Translations.cmd_inventory_help_basic + ": /inventory > ."; - } - - #endregion - } -} diff --git a/MinecraftClient/Commands/List.cs b/MinecraftClient/Commands/List.cs deleted file mode 100644 index 7e991f5535..0000000000 --- a/MinecraftClient/Commands/List.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - public class List : Command - { - public override string CmdName { get { return "list"; } } - public override string CmdUsage { get { return "list"; } } - public override string CmdDesc { get { return Translations.cmd_list_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => DoListPlayers(r.Source)) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int DoListPlayers(CmdResult r) - { - McClient handler = CmdResult.currentHandler!; - return r.SetAndReturn(CmdResult.Status.Done, string.Format(Translations.cmd_list_players, String.Join(", ", handler.GetOnlinePlayers()))); - } - } -} - diff --git a/MinecraftClient/Commands/Log.cs b/MinecraftClient/Commands/Log.cs deleted file mode 100644 index 8cdf3ecff6..0000000000 --- a/MinecraftClient/Commands/Log.cs +++ /dev/null @@ -1,44 +0,0 @@ -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - public class Log : Command - { - public override string CmdName { get { return "log"; } } - public override string CmdUsage { get { return "log "; } } - public override string CmdDesc { get { return Translations.cmd_log_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Then(l => l.Argument("String", Arguments.GreedyString()) - .Executes(r => DoLog(r.Source, Arguments.GetString(r, "String")))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int DoLog(CmdResult r, string command) - { - return r.SetAndReturn(CmdResult.Status.Done, command); - } - } -} diff --git a/MinecraftClient/Commands/Look.cs b/MinecraftClient/Commands/Look.cs deleted file mode 100644 index aedc474be9..0000000000 --- a/MinecraftClient/Commands/Look.cs +++ /dev/null @@ -1,122 +0,0 @@ -using System; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.Mapping; -using static MinecraftClient.CommandHandler.CmdResult; - -namespace MinecraftClient.Commands -{ - public class Look : Command - { - public override string CmdName { get { return "look"; } } - public override string CmdUsage { get { return "look "; } } - public override string CmdDesc { get { return Translations.cmd_look_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - .Then(l => l.Literal("direction") - .Executes(r => GetUsage(r.Source, "direction"))) - .Then(l => l.Literal("angle") - .Executes(r => GetUsage(r.Source, "angle"))) - .Then(l => l.Literal("location") - .Executes(r => GetUsage(r.Source, "location"))) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => LogCurrentLooking(r.Source)) - .Then(l => l.Literal("up") - .Executes(r => LookAtDirection(r.Source, Direction.Up))) - .Then(l => l.Literal("down") - .Executes(r => LookAtDirection(r.Source, Direction.Down))) - .Then(l => l.Literal("east") - .Executes(r => LookAtDirection(r.Source, Direction.East))) - .Then(l => l.Literal("west") - .Executes(r => LookAtDirection(r.Source, Direction.West))) - .Then(l => l.Literal("north") - .Executes(r => LookAtDirection(r.Source, Direction.North))) - .Then(l => l.Literal("south") - .Executes(r => LookAtDirection(r.Source, Direction.South))) - .Then(l => l.Argument("Yaw", Arguments.Float()) - .Then(l => l.Argument("Pitch", Arguments.Float()) - .Executes(r => LookAtAngle(r.Source, Arguments.GetFloat(r, "Yaw"), Arguments.GetFloat(r, "Pitch"))))) - .Then(l => l.Argument("Location", MccArguments.Location()) - .Executes(r => LookAtLocation(r.Source, MccArguments.GetLocation(r, "Location")))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - "direction" => GetCmdDescTranslated(), - "angle" => GetCmdDescTranslated(), - "location" => GetCmdDescTranslated(), - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int LogCurrentLooking(CmdResult r) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetTerrainEnabled()) - return r.SetAndReturn(Status.FailNeedTerrain); - - const double maxDistance = 8.0; - (bool hasBlock, Location target, Block block) = RaycastHelper.RaycastBlock(handler, maxDistance, false); - if (!hasBlock) - { - return r.SetAndReturn(Status.Fail, string.Format(Translations.cmd_look_noinspection, maxDistance)); - } - else - { - Location current = handler.GetCurrentLocation(), target_center = target.ToCenter(); - return r.SetAndReturn(Status.Done, string.Format(Translations.cmd_look_inspection, block.Type, target.X, target.Y, target.Z, - current.Distance(target_center), current.EyesLocation().Distance(target_center))); - } - } - - private int LookAtDirection(CmdResult r, Direction direction) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetTerrainEnabled()) - return r.SetAndReturn(Status.FailNeedTerrain); - - handler.UpdateLocation(handler.GetCurrentLocation(), direction); - handler.SendLocationUpdate(); - return r.SetAndReturn(Status.Done, "Looking " + direction.ToString()); - } - - private int LookAtAngle(CmdResult r, float yaw, float pitch) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetTerrainEnabled()) - return r.SetAndReturn(Status.FailNeedTerrain); - - handler.UpdateLocation(handler.GetCurrentLocation(), yaw, pitch); - handler.SendLocationUpdate(); - return r.SetAndReturn(Status.Done, string.Format(Translations.cmd_look_at, yaw.ToString("0.00"), pitch.ToString("0.00"))); - } - - private int LookAtLocation(CmdResult r, Location location) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetTerrainEnabled()) - return r.SetAndReturn(Status.FailNeedTerrain); - - Location current = handler.GetCurrentLocation(); - handler.UpdateLocation(current, location); - handler.SendLocationUpdate(); - return r.SetAndReturn(Status.Done, string.Format(Translations.cmd_look_block, location)); - } - } -} diff --git a/MinecraftClient/Commands/Minimap.cs b/MinecraftClient/Commands/Minimap.cs deleted file mode 100644 index 0b6ca00f54..0000000000 --- a/MinecraftClient/Commands/Minimap.cs +++ /dev/null @@ -1,284 +0,0 @@ -using System; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.Tui; -using Avalonia.Threading; -using static MinecraftClient.CommandHandler.CmdResult; - -namespace MinecraftClient.Commands -{ - class Minimap : Command - { - public override string CmdName => "minimap"; - public override string CmdUsage => "minimap [on|off] | minimap zoom [in|out|<1-16>] | minimap names [players|hostile|neutral|passive] [on|off] | minimap names [all_on|all_off] | minimap position [top_left|top_right|center|bottom_left|bottom_right] | minimap cave [auto|on|off]"; - public override string CmdDesc => Translations.cmd_minimap_desc; - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => DoToggle(r.Source)) - .Then(l => l.Literal("on") - .Executes(r => DoOn(r.Source))) - .Then(l => l.Literal("off") - .Executes(r => DoOff(r.Source))) - .Then(l => l.Literal("zoom") - .Executes(r => DoZoomInfo(r.Source)) - .Then(l => l.Literal("in") - .Executes(r => DoZoomIn(r.Source))) - .Then(l => l.Literal("out") - .Executes(r => DoZoomOut(r.Source))) - .Then(l => l.Argument("level", Arguments.Integer(MinimapControl.MinZoom, MinimapControl.MaxZoom)) - .Executes(r => DoZoomSet(r.Source, Arguments.GetInteger(r, "level"))))) - .Then(l => l.Literal("names") - .Executes(r => DoNamesInfo(r.Source)) - .Then(l => l.Literal("all_on") - .Executes(r => DoNamesAll(r.Source, true))) - .Then(l => l.Literal("all_off") - .Executes(r => DoNamesAll(r.Source, false))) - .Then(l => l.Literal("players") - .Executes(r => DoNamesCatInfo(r.Source, MobCategory.Player)) - .Then(l => l.Literal("on") - .Executes(r => DoNamesCatSet(r.Source, MobCategory.Player, true))) - .Then(l => l.Literal("off") - .Executes(r => DoNamesCatSet(r.Source, MobCategory.Player, false)))) - .Then(l => l.Literal("hostile") - .Executes(r => DoNamesCatInfo(r.Source, MobCategory.Hostile)) - .Then(l => l.Literal("on") - .Executes(r => DoNamesCatSet(r.Source, MobCategory.Hostile, true))) - .Then(l => l.Literal("off") - .Executes(r => DoNamesCatSet(r.Source, MobCategory.Hostile, false)))) - .Then(l => l.Literal("neutral") - .Executes(r => DoNamesCatInfo(r.Source, MobCategory.Neutral)) - .Then(l => l.Literal("on") - .Executes(r => DoNamesCatSet(r.Source, MobCategory.Neutral, true))) - .Then(l => l.Literal("off") - .Executes(r => DoNamesCatSet(r.Source, MobCategory.Neutral, false)))) - .Then(l => l.Literal("passive") - .Executes(r => DoNamesCatInfo(r.Source, MobCategory.Passive)) - .Then(l => l.Literal("on") - .Executes(r => DoNamesCatSet(r.Source, MobCategory.Passive, true))) - .Then(l => l.Literal("off") - .Executes(r => DoNamesCatSet(r.Source, MobCategory.Passive, false))))) - .Then(l => l.Literal("position") - .Executes(r => DoPositionInfo(r.Source)) - .Then(l => l.Literal("top_left") - .Executes(r => DoPositionSet(r.Source, MinimapPosition.top_left))) - .Then(l => l.Literal("top_right") - .Executes(r => DoPositionSet(r.Source, MinimapPosition.top_right))) - .Then(l => l.Literal("center") - .Executes(r => DoPositionSet(r.Source, MinimapPosition.center))) - .Then(l => l.Literal("bottom_left") - .Executes(r => DoPositionSet(r.Source, MinimapPosition.bottom_left))) - .Then(l => l.Literal("bottom_right") - .Executes(r => DoPositionSet(r.Source, MinimapPosition.bottom_right)))) - .Then(l => l.Literal("cave") - .Executes(r => DoCaveInfo(r.Source)) - .Then(l => l.Literal("auto") - .Executes(r => DoCaveSet(r.Source, CaveModeOption.auto))) - .Then(l => l.Literal("on") - .Executes(r => DoCaveSet(r.Source, CaveModeOption.on))) - .Then(l => l.Literal("off") - .Executes(r => DoCaveSet(r.Source, CaveModeOption.off)))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help")?.GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string _) => - r.SetAndReturn(GetCmdDescTranslated()); - - private static MainTuiView? GetTuiView(CmdResult r) - { - if (ConsoleIO.Backend is not TuiConsoleBackend) - { - r.SetAndReturn(Status.Fail, Translations.cmd_minimap_tui_only); - return null; - } - return TuiConsoleBackend.Instance?.GetView(); - } - - private static int DoToggle(CmdResult r) - { - var view = GetTuiView(r); - if (view is null) return (int)r.status; - - bool wasVisible = view.IsMinimapVisible; - Dispatcher.UIThread.Post(() => view.ToggleMinimap()); - string msg = wasVisible - ? Translations.cmd_minimap_disabled - : Translations.cmd_minimap_enabled; - return r.SetAndReturn(Status.Done, msg); - } - - private static int DoOn(CmdResult r) - { - var view = GetTuiView(r); - if (view is null) return (int)r.status; - - Dispatcher.UIThread.Post(() => view.ShowMinimap()); - return r.SetAndReturn(Status.Done, Translations.cmd_minimap_enabled); - } - - private static int DoOff(CmdResult r) - { - var view = GetTuiView(r); - if (view is null) return (int)r.status; - - Dispatcher.UIThread.Post(() => view.HideMinimap()); - return r.SetAndReturn(Status.Done, Translations.cmd_minimap_disabled); - } - - private static int DoZoomInfo(CmdResult r) - { - var view = GetTuiView(r); - if (view is null) return (int)r.status; - - int current = view.GetMinimapZoom(); - return r.SetAndReturn(Status.Done, - string.Format(Translations.cmd_minimap_zoom_current, current, MinimapControl.MaxZoom)); - } - - private static int DoZoomIn(CmdResult r) - { - var view = GetTuiView(r); - if (view is null) return (int)r.status; - - int newLevel = Math.Max(view.GetMinimapZoom() - 1, MinimapControl.MinZoom); - Dispatcher.UIThread.Post(() => view.SetMinimapZoom(newLevel)); - return r.SetAndReturn(Status.Done, string.Format(Translations.cmd_minimap_zoom_set, newLevel)); - } - - private static int DoZoomOut(CmdResult r) - { - var view = GetTuiView(r); - if (view is null) return (int)r.status; - - int newLevel = Math.Min(view.GetMinimapZoom() + 1, MinimapControl.MaxZoom); - Dispatcher.UIThread.Post(() => view.SetMinimapZoom(newLevel)); - return r.SetAndReturn(Status.Done, string.Format(Translations.cmd_minimap_zoom_set, newLevel)); - } - - private static int DoZoomSet(CmdResult r, int level) - { - var view = GetTuiView(r); - if (view is null) return (int)r.status; - - Dispatcher.UIThread.Post(() => view.SetMinimapZoom(level)); - return r.SetAndReturn(Status.Done, string.Format(Translations.cmd_minimap_zoom_set, level)); - } - - private static int DoNamesInfo(CmdResult r) - { - var view = GetTuiView(r); - if (view is null) return (int)r.status; - - var nc = view.GetMinimapNameConfig(); - string status = string.Format(Translations.cmd_minimap_names_status, - BoolStr(nc.Players), BoolStr(nc.Hostile), BoolStr(nc.Neutral), BoolStr(nc.Passive)); - return r.SetAndReturn(Status.Done, status); - } - - private static int DoNamesAll(CmdResult r, bool on) - { - var view = GetTuiView(r); - if (view is null) return (int)r.status; - - Dispatcher.UIThread.Post(() => - { - view.GetMinimapNameConfig().SetAll(on); - view.SyncMinimapNameConfig(); - }); - string msg = on ? Translations.cmd_minimap_names_all_on : Translations.cmd_minimap_names_all_off; - return r.SetAndReturn(Status.Done, msg); - } - - private static int DoNamesCatInfo(CmdResult r, MobCategory cat) - { - var view = GetTuiView(r); - if (view is null) return (int)r.status; - - var nc = view.GetMinimapNameConfig(); - bool val = cat switch - { - MobCategory.Player => nc.Players, - MobCategory.Hostile => nc.Hostile, - MobCategory.Neutral => nc.Neutral, - MobCategory.Passive => nc.Passive, - _ => false, - }; - return r.SetAndReturn(Status.Done, - string.Format(Translations.cmd_minimap_names_cat, cat, BoolStr(val))); - } - - private static int DoNamesCatSet(CmdResult r, MobCategory cat, bool on) - { - var view = GetTuiView(r); - if (view is null) return (int)r.status; - - Dispatcher.UIThread.Post(() => - { - var nc = view.GetMinimapNameConfig(); - switch (cat) - { - case MobCategory.Player: nc.Players = on; break; - case MobCategory.Hostile: nc.Hostile = on; break; - case MobCategory.Neutral: nc.Neutral = on; break; - case MobCategory.Passive: nc.Passive = on; break; - } - view.SyncMinimapNameConfig(); - }); - return r.SetAndReturn(Status.Done, - string.Format(Translations.cmd_minimap_names_cat_set, cat, BoolStr(on))); - } - - private static int DoPositionInfo(CmdResult r) - { - var view = GetTuiView(r); - if (view is null) return (int)r.status; - - var pos = view.GetMinimapPosition(); - return r.SetAndReturn(Status.Done, - string.Format(Translations.cmd_minimap_position_current, pos)); - } - - private static int DoPositionSet(CmdResult r, MinimapPosition pos) - { - var view = GetTuiView(r); - if (view is null) return (int)r.status; - - Dispatcher.UIThread.Post(() => view.SetMinimapPosition(pos)); - return r.SetAndReturn(Status.Done, - string.Format(Translations.cmd_minimap_position_set, pos)); - } - - private static int DoCaveInfo(CmdResult r) - { - var view = GetTuiView(r); - if (view is null) return (int)r.status; - - var mode = view.GetMinimapCaveMode(); - return r.SetAndReturn(Status.Done, - string.Format(Translations.cmd_minimap_cave_current, mode)); - } - - private static int DoCaveSet(CmdResult r, CaveModeOption mode) - { - var view = GetTuiView(r); - if (view is null) return (int)r.status; - - Dispatcher.UIThread.Post(() => view.SetMinimapCaveMode(mode)); - return r.SetAndReturn(Status.Done, - string.Format(Translations.cmd_minimap_cave_set, mode)); - } - - private static string BoolStr(bool v) => v ? "ON" : "OFF"; - } -} diff --git a/MinecraftClient/Commands/Move.cs b/MinecraftClient/Commands/Move.cs deleted file mode 100644 index fa94a06b44..0000000000 --- a/MinecraftClient/Commands/Move.cs +++ /dev/null @@ -1,202 +0,0 @@ -using System; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.Mapping; -using static MinecraftClient.CommandHandler.CmdResult; - -namespace MinecraftClient.Commands -{ - public class Move : Command - { - public override string CmdName { get { return "move"; } } - public override string CmdUsage { get { return "move [-f]"; } } - public override string CmdDesc { get { return Translations.cmd_move_desc + " \"-f\": " + Translations.cmd_move_desc_force; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - .Then(l => l.Literal("enable") - .Executes(r => GetUsage(r.Source, "enable"))) - .Then(l => l.Literal("gravity") - .Executes(r => GetUsage(r.Source, "gravity"))) - .Then(l => l.Literal("direction") - .Executes(r => GetUsage(r.Source, "direction"))) - .Then(l => l.Literal("center") - .Executes(r => GetUsage(r.Source, "center"))) - .Then(l => l.Literal("get") - .Executes(r => GetUsage(r.Source, "get"))) - .Then(l => l.Literal("location") - .Executes(r => GetUsage(r.Source, "location"))) - .Then(l => l.Literal("-f") - .Executes(r => GetUsage(r.Source, "-f"))) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Then(l => l.Literal("on") - .Executes(r => SetMovementEnable(r.Source, enable: true))) - .Then(l => l.Literal("off") - .Executes(r => SetMovementEnable(r.Source, enable: false))) - .Then(l => l.Literal("gravity") - .Executes(r => SetGravityEnable(r.Source, enable: null)) - .Then(l => l.Literal("on") - .Executes(r => SetGravityEnable(r.Source, enable: true))) - .Then(l => l.Literal("off") - .Executes(r => SetGravityEnable(r.Source, enable: false)))) - .Then(l => l.Literal("up") - .Executes(r => MoveOnDirection(r.Source, Direction.Up, false)) - .Then(l => l.Literal("-f") - .Executes(r => MoveOnDirection(r.Source, Direction.Up, true)))) - .Then(l => l.Literal("down") - .Executes(r => MoveOnDirection(r.Source, Direction.Down, false)) - .Then(l => l.Literal("-f") - .Executes(r => MoveOnDirection(r.Source, Direction.Down, true)))) - .Then(l => l.Literal("east") - .Executes(r => MoveOnDirection(r.Source, Direction.East, false)) - .Then(l => l.Literal("-f") - .Executes(r => MoveOnDirection(r.Source, Direction.East, true)))) - .Then(l => l.Literal("west") - .Executes(r => MoveOnDirection(r.Source, Direction.West, false)) - .Then(l => l.Literal("-f") - .Executes(r => MoveOnDirection(r.Source, Direction.West, true)))) - .Then(l => l.Literal("north") - .Executes(r => MoveOnDirection(r.Source, Direction.North, false)) - .Then(l => l.Literal("-f") - .Executes(r => MoveOnDirection(r.Source, Direction.North, true)))) - .Then(l => l.Literal("south") - .Executes(r => MoveOnDirection(r.Source, Direction.South, false)) - .Then(l => l.Literal("-f") - .Executes(r => MoveOnDirection(r.Source, Direction.South, true)))) - .Then(l => l.Literal("center") - .Executes(r => MoveToCenter(r.Source))) - .Then(l => l.Literal("get") - .Executes(r => GetCurrentLocation(r.Source))) - .Then(l => l.Argument("location", MccArguments.Location()) - .Executes(r => MoveToLocation(r.Source, MccArguments.GetLocation(r, "location"), false)) - .Then(l => l.Literal("-f") - .Executes(r => MoveToLocation(r.Source, MccArguments.GetLocation(r, "location"), true)))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - "enable" => GetCmdDescTranslated(), - "gravity" => GetCmdDescTranslated(), - "direction" => GetCmdDescTranslated(), - "center" => GetCmdDescTranslated(), - "get" => GetCmdDescTranslated(), - "location" => GetCmdDescTranslated(), - "-f" => GetCmdDescTranslated(), - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int SetMovementEnable(CmdResult r, bool enable) - { - McClient handler = CmdResult.currentHandler!; - if (enable) - { - handler.SetTerrainEnabled(true); - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_move_enable); - } - else - { - handler.SetTerrainEnabled(false); - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_move_disable); - } - } - - private int SetGravityEnable(CmdResult r, bool? enable) - { - McClient handler = CmdResult.currentHandler!; - if (enable.HasValue) - Settings.InternalConfig.GravityEnabled = enable.Value; - - if (Settings.InternalConfig.GravityEnabled) - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_move_gravity_enabled); - else - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_move_gravity_disabled); - } - - private int GetCurrentLocation(CmdResult r) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetTerrainEnabled()) - return r.SetAndReturn(Status.FailNeedTerrain); - - return r.SetAndReturn(Status.Done, handler.GetCurrentLocation().ToString()); - } - - private int MoveToCenter(CmdResult r) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetTerrainEnabled()) - return r.SetAndReturn(Status.FailNeedTerrain); - - Location current = handler.GetCurrentLocation(); - Location currentCenter = new(Math.Floor(current.X) + 0.5, current.Y, Math.Floor(current.Z) + 0.5); - handler.MoveTo(currentCenter, allowDirectTeleport: true); - return r.SetAndReturn(Status.Done, string.Format(Translations.cmd_move_walk, currentCenter, current)); - } - - private int MoveOnDirection(CmdResult r, Direction direction, bool takeRisk) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetTerrainEnabled()) - return r.SetAndReturn(Status.FailNeedTerrain); - - Location goal = Movement.Move(handler.GetCurrentLocation(), direction); - - if (!Movement.CheckChunkLoading(handler.GetWorld(), handler.GetCurrentLocation(), goal)) - return r.SetAndReturn(Status.FailChunkNotLoad, string.Format(Translations.cmd_move_chunk_not_loaded, goal.X, goal.Y, goal.Z)); - - if (Movement.CanMove(handler.GetWorld(), handler.GetCurrentLocation(), direction)) - { - if (handler.MoveTo(goal, allowUnsafe: takeRisk)) - return r.SetAndReturn(Status.Done, string.Format(Translations.cmd_move_moving, direction.ToString())); - else - return r.SetAndReturn(Status.Fail, takeRisk ? Translations.cmd_move_dir_fail : Translations.cmd_move_suggestforce); - } - else - { - return r.SetAndReturn(Status.Fail, Translations.cmd_move_dir_fail); - } - } - - private int MoveToLocation(CmdResult r, Location goal, bool takeRisk) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetTerrainEnabled()) - return r.SetAndReturn(Status.FailNeedTerrain); - - Location current = handler.GetCurrentLocation(), currentCenter = current.ToCenter(); - goal.ToAbsolute(current); - - if (!Movement.CheckChunkLoading(handler.GetWorld(), current, goal)) - return r.SetAndReturn(Status.FailChunkNotLoad, string.Format(Translations.cmd_move_chunk_not_loaded, goal.X, goal.Y, goal.Z)); - - if (takeRisk || Movement.PlayerFitsHere(handler.GetWorld(), goal)) - { - if (current.ToFloor() == goal.ToFloor()) - handler.MoveTo(goal, allowDirectTeleport: true); - else if (!handler.MoveTo(goal, allowUnsafe: takeRisk)) - return r.SetAndReturn(Status.Fail, takeRisk ? string.Format(Translations.cmd_move_fail, goal) : string.Format(Translations.cmd_move_suggestforce, goal)); - return r.SetAndReturn(Status.Done, string.Format(Translations.cmd_move_walk, goal, current)); - } - else - { - return r.SetAndReturn(Status.Fail, string.Format(Translations.cmd_move_suggestforce, goal)); - } - } - } -} diff --git a/MinecraftClient/Commands/NameItem.cs b/MinecraftClient/Commands/NameItem.cs deleted file mode 100644 index 91f32e61f1..0000000000 --- a/MinecraftClient/Commands/NameItem.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System.Linq; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.Inventory; - -namespace MinecraftClient.Commands -{ - public class NameItem : Command - { - public override string CmdName => "nameitem"; - public override string CmdUsage => "nameitem "; - - public override string CmdDesc => Translations.cmd_nameitem_desc; - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Then(l => l.Argument("any", Arguments.GreedyString()) - .Executes(r => DoSetItemName(r.Source, Arguments.GetString(r, "any")))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int DoSetItemName(CmdResult r, string itemName) - { - var handler = CmdResult.currentHandler!; - - if (itemName.Trim().Length == 0) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_nameitem_item_name_empty); - - var currentInventory = handler.GetInventories().Count == 0 - ? null - : handler.GetInventories().Values.ToList().Last(); - - if (currentInventory is not { Type: ContainerType.Anvil }) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_nameitem_no_anvil_inventory_open); - - if (currentInventory.Items[0].IsEmpty) - return r.SetAndReturn(CmdResult.Status.Fail, - Translations.cmd_nameitem_first_slot_empty); - - return handler.SendRenameItem(itemName) - ? r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_nameitem_successful) - : r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_nameitem_failed); - } - } -} \ No newline at end of file diff --git a/MinecraftClient/Commands/RecipeBook.cs b/MinecraftClient/Commands/RecipeBook.cs deleted file mode 100644 index 4cf0d873f6..0000000000 --- a/MinecraftClient/Commands/RecipeBook.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System.Text; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - public class RecipeBook : Command - { - public override string CmdName => "recipebook"; - public override string CmdUsage => "recipebook [recipe id]"; - public override string CmdDesc => Translations.cmd_recipebook_desc; - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - .Then(l => l.Literal("list") - .Executes(r => GetUsage(r.Source, "list"))) - .Then(l => l.Literal("craft") - .Executes(r => GetUsage(r.Source, "craft"))) - .Then(l => l.Literal("craftall") - .Executes(r => GetUsage(r.Source, "craftall"))) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Then(l => l.Literal("list") - .Executes(r => ListRecipes(r.Source))) - .Then(l => l.Literal("craft") - .Then(l => l.Argument("RecipeId", Arguments.String()) - .Executes(r => CraftRecipe(r.Source, Arguments.GetString(r, "RecipeId"), makeAll: false)))) - .Then(l => l.Literal("craftall") - .Then(l => l.Argument("RecipeId", Arguments.String()) - .Executes(r => CraftRecipe(r.Source, Arguments.GetString(r, "RecipeId"), makeAll: true)))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - "list" => GetCmdDescTranslated(), - "craft" => GetCmdDescTranslated(), - "craftall" => GetCmdDescTranslated(), - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int ListRecipes(CmdResult r) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetInventoryEnabled()) - return r.SetAndReturn(CmdResult.Status.FailNeedInventory); - - RecipeBookRecipeEntry[] recipes = handler.GetUnlockedRecipes(); - if (recipes.Length == 0) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_recipebook_no_recipes); - - StringBuilder response = new(); - response.AppendLine(Translations.cmd_recipebook_list); - foreach (RecipeBookRecipeEntry recipe in recipes) - response.AppendLine("- " + recipe.DisplayText); - - handler.Log.Info(response.ToString().TrimEnd()); - return r.SetAndReturn(CmdResult.Status.Done); - } - - private int CraftRecipe(CmdResult r, string recipeId, bool makeAll) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetInventoryEnabled()) - return r.SetAndReturn(CmdResult.Status.FailNeedInventory); - - if (string.IsNullOrWhiteSpace(recipeId)) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_recipebook_recipe_id_empty); - - if (handler.GetProtocolVersion() < Protocol.Handlers.Protocol18Handler.MC_1_13_Version) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_recipebook_unsupported); - - if (handler.GetActiveRecipeBookInventory() is null) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_recipebook_no_active_inventory); - - string normalizedRecipeId = McClient.NormalizeRecipeArgument(recipeId, handler.GetProtocolVersion()); - string successMessage = string.Format(makeAll ? Translations.cmd_recipebook_craftall_sent : Translations.cmd_recipebook_craft_sent, normalizedRecipeId); - - return handler.SendPlaceRecipe(recipeId, makeAll) - ? r.SetAndReturn(CmdResult.Status.Done, successMessage) - : r.SetAndReturn(CmdResult.Status.Fail, string.Format(Translations.cmd_recipebook_craft_failed, normalizedRecipeId)); - } - } -} diff --git a/MinecraftClient/Commands/Reco.cs b/MinecraftClient/Commands/Reco.cs deleted file mode 100644 index 05fbe6f617..0000000000 --- a/MinecraftClient/Commands/Reco.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - public class Reco : Command - { - public override string CmdName { get { return "reco"; } } - public override string CmdUsage { get { return "reco [account]"; } } - public override string CmdDesc { get { return Translations.cmd_reco_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => DoReconnect(r.Source, string.Empty)) - .Then(l => l.Argument("AccountNick", MccArguments.AccountNick()) - .Executes(r => DoReconnect(r.Source, Arguments.GetString(r, "AccountNick")))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int DoReconnect(CmdResult r, string account) - { - RestartSettingsSnapshot previousSettings = Program.CaptureRestartSettings(); - if (!string.IsNullOrWhiteSpace(account)) - { - account = account.Trim(); - if (!Settings.Config.Main.Advanced.SetAccount(account)) - return r.SetAndReturn(CmdResult.Status.Fail, string.Format(Translations.cmd_connect_unknown, account)); - } - - if (Program.TryRestart( - Program.CurrentConnectionAttempt, - TimeSpan.Zero, - keepAccountAndServerSettings: true, - replaceUntilCommit: true)) - { - return r.SetAndReturn(CmdResult.Status.Done); - } - - Program.RestoreRestartSettings(previousSettings); - return r.SetAndReturn(CmdResult.Status.Fail); - } - - internal static string DoReconnect(string command) - { - RestartSettingsSnapshot previousSettings = Program.CaptureRestartSettings(); - string[] args = GetArgs(command); - if (args.Length > 0) - { - string account = args[0].Trim(); - if (!Settings.Config.Main.Advanced.SetAccount(account)) - { - return string.Format(Translations.cmd_connect_unknown, account); - } - } - - if (Program.TryRestart( - Program.CurrentConnectionAttempt, - TimeSpan.Zero, - keepAccountAndServerSettings: true, - replaceUntilCommit: true)) - { - return string.Empty; - } - - Program.RestoreRestartSettings(previousSettings); - return Translations.general_fail; - } - } -} diff --git a/MinecraftClient/Commands/Reload.cs b/MinecraftClient/Commands/Reload.cs deleted file mode 100644 index 953591595b..0000000000 --- a/MinecraftClient/Commands/Reload.cs +++ /dev/null @@ -1,52 +0,0 @@ -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - class Reload : Command - { - public override string CmdName { get { return "reload"; } } - public override string CmdUsage { get { return "reload"; } } - public override string CmdDesc { get { return Translations.cmd_reload_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => DoReload(r.Source)) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int DoReload(CmdResult r) - { - McClient handler = CmdResult.currentHandler!; - handler.Log.Info(Translations.cmd_reload_started); - handler.ReloadSettings(); - handler.Log.Warn(Translations.cmd_reload_warning1); - handler.Log.Warn(Translations.cmd_reload_warning2); - handler.Log.Warn(Translations.cmd_reload_warning3); - handler.Log.Warn(Translations.cmd_reload_warning4); - - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_reload_finished); - } - } -} diff --git a/MinecraftClient/Commands/Respawn.cs b/MinecraftClient/Commands/Respawn.cs deleted file mode 100644 index f8dd542a88..0000000000 --- a/MinecraftClient/Commands/Respawn.cs +++ /dev/null @@ -1,46 +0,0 @@ -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - public class Respawn : Command - { - public override string CmdName { get { return "respawn"; } } - public override string CmdUsage { get { return "respawn"; } } - public override string CmdDesc { get { return Translations.cmd_respawn_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => DoRespawn(r.Source)) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int DoRespawn(CmdResult r) - { - McClient handler = CmdResult.currentHandler!; - handler.SendRespawnPacket(); - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_respawn_done); - } - } -} diff --git a/MinecraftClient/Commands/Script.cs b/MinecraftClient/Commands/Script.cs deleted file mode 100644 index 37a8da80cd..0000000000 --- a/MinecraftClient/Commands/Script.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.Collections.Generic; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - public class Script : Command - { - public override string CmdName { get { return "script"; } } - public override string CmdUsage { get { return "script "; } } - public override string CmdDesc { get { return Translations.cmd_script_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Then(l => l.Argument("Script", MccArguments.ScriptName()) - .Executes(r => DoExecuteScript(r.Source, Arguments.GetString(r, "Script"), null))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int DoExecuteScript(CmdResult r, string command, Dictionary? localVars) - { - McClient handler = CmdResult.currentHandler!; - handler.BotLoad(new ChatBots.Script(command.Trim(), null, localVars)); - return r.SetAndReturn(CmdResult.Status.Done); - } - } -} diff --git a/MinecraftClient/Commands/Send.cs b/MinecraftClient/Commands/Send.cs deleted file mode 100644 index cf6964eca4..0000000000 --- a/MinecraftClient/Commands/Send.cs +++ /dev/null @@ -1,44 +0,0 @@ -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - public class Send : Command - { - public override string CmdName { get { return "send"; } } - public override string CmdUsage { get { return "send "; } } - public override string CmdDesc { get { return Translations.cmd_send_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Then(l => l.Argument("any", Arguments.GreedyString()) - .Executes(r => DoSendText(r.Source, Arguments.GetString(r, "any")))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int DoSendText(CmdResult r, string command) - { - McClient handler = CmdResult.currentHandler!; - handler.SendText(command); - return r.SetAndReturn(CmdResult.Status.Done); - } - } -} diff --git a/MinecraftClient/Commands/Set.cs b/MinecraftClient/Commands/Set.cs deleted file mode 100644 index 75d8bbd0fb..0000000000 --- a/MinecraftClient/Commands/Set.cs +++ /dev/null @@ -1,60 +0,0 @@ -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - public class Set : Command - { - public override string CmdName { get { return "set"; } } - public override string CmdUsage { get { return "set varname=value"; } } - public override string CmdDesc { get { return Translations.cmd_set_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Then(l => l.Argument("Expression", Arguments.GreedyString()) - .Executes(r => DoSetVar(r.Source, Arguments.GetString(r, "Expression")))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int DoSetVar(CmdResult r, string command) - { - string[] temp = command.Trim().Split('='); - if (temp.Length > 1) - { - if (Settings.Config.AppVar.SetVar(temp[0], command[(temp[0].Length + 1)..])) - { - return r.SetAndReturn(CmdResult.Status.Done); //Success - } - else - { - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_set_format); - } - } - else - { - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_set_format); - } - } - } -} diff --git a/MinecraftClient/Commands/SetRnd.cs b/MinecraftClient/Commands/SetRnd.cs deleted file mode 100644 index c792b5d726..0000000000 --- a/MinecraftClient/Commands/SetRnd.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System; -using System.Collections.Generic; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - class SetRnd : Command - { - public override string CmdName { get { return "setrnd"; } } - public override string CmdUsage { get { return Translations.cmd_setrnd_format; } } - public override string CmdDesc { get { return Translations.cmd_setrnd_desc; } } - private static readonly Random rand = new(); - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - .Then(l => l.Literal("range") - .Executes(r => GetUsage(r.Source, "range"))) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Then(l => l.Argument("VarName", Arguments.String()) - .Then(l => l.Argument("Min", Arguments.Long()) - .Then(l => l.Literal("to") - .Then(l => l.Argument("Max", Arguments.Long()) - .Executes(r => DoSetRnd(r.Source, Arguments.GetString(r, "VarName"), Arguments.GetLong(r, "Min"), Arguments.GetLong(r, "Max")))))) - .Then(l => l.Argument("Expression", Arguments.GreedyString()) - .Executes(r => DoSetRnd(r.Source, Arguments.GetString(r, "VarName"), Arguments.GetString(r, "Expression"))))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - "range" => GetCmdDescTranslated(), - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int DoSetRnd(CmdResult r, string var, string argString) - { - // process all arguments similar to regular terminals with quotes and escaping - List values = ParseCommandLine(argString); - - // create a variable or set it to one of the values - if (values.Count > 0 && Settings.Config.AppVar.SetVar(var, values[rand.Next(0, values.Count)])) - return r.SetAndReturn(CmdResult.Status.Done, string.Format("Set %{0}% to {1}.", var, Settings.Config.AppVar.GetVar(var))); - else - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_setrndstr_format); - } - - private int DoSetRnd(CmdResult r, string var, long min, long max) - { - // switch the values if they were entered in the wrong way - if (max < min) - (max, min) = (min, max); - - // create a variable or set it to num1 <= varlue < num2 - if (Settings.Config.AppVar.SetVar(var, rand.NextInt64(min, max))) - return r.SetAndReturn(CmdResult.Status.Fail, string.Format("Set %{0}% to {1}.", var, Settings.Config.AppVar.GetVar(var))); - else - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_setrndstr_format); - } - } -} diff --git a/MinecraftClient/Commands/Sneak.cs b/MinecraftClient/Commands/Sneak.cs deleted file mode 100644 index f6538736b2..0000000000 --- a/MinecraftClient/Commands/Sneak.cs +++ /dev/null @@ -1,59 +0,0 @@ -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - public class Sneak : Command - { - public override string CmdName => "sneak"; - public override string CmdUsage => "sneak"; - public override string CmdDesc => Translations.cmd_sneak_desc; - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => DoSneak(r.Source)) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int DoSneak(CmdResult r) - { - var handler = CmdResult.currentHandler!; - - if (handler.IsSneaking) - { - if (!handler.SendEntityAction(Protocol.EntityActionType.StopSneaking)) - return r.SetAndReturn(CmdResult.Status.Fail); - - handler.IsSneaking = false; - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_sneak_off); - } - - if (!handler.SendEntityAction(Protocol.EntityActionType.StartSneaking)) - return r.SetAndReturn(CmdResult.Status.Fail); - - handler.IsSneaking = true; - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_sneak_on); - } - } -} \ No newline at end of file diff --git a/MinecraftClient/Commands/Tab.cs b/MinecraftClient/Commands/Tab.cs deleted file mode 100644 index b5ea5c36a3..0000000000 --- a/MinecraftClient/Commands/Tab.cs +++ /dev/null @@ -1,50 +0,0 @@ -using Avalonia.Threading; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.Tui; - -namespace MinecraftClient.Commands -{ - public class Tab : Command - { - public override string CmdName => "tab"; - public override string CmdUsage => "tab"; - public override string CmdDesc => Translations.cmd_tab_desc; - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source))) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => ShowTab(r.Source)) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r) => r.SetAndReturn(GetCmdDescTranslated()); - - private static int ShowTab(CmdResult r) - { - McClient handler = CmdResult.currentHandler!; - var snapshot = handler.GetTabListSnapshot(); - - if (ConsoleIO.Backend is TuiConsoleBackend) - { - var view = TuiConsoleBackend.Instance?.GetView(); - if (view is null) - return r.SetAndReturn(CmdResult.Status.Fail, Translations.cmd_tab_tui_unavailable); - - Dispatcher.UIThread.Post(() => view.ShowOverlay(new TabListOverlay(handler))); - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_tab_tui_opened); - } - - return r.SetAndReturn(CmdResult.Status.Done, TabListFormatter.Render(snapshot)); - } - } -} diff --git a/MinecraftClient/Commands/Teams.cs b/MinecraftClient/Commands/Teams.cs deleted file mode 100644 index af7a06d1cb..0000000000 --- a/MinecraftClient/Commands/Teams.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.Mapping; - -namespace MinecraftClient.Commands -{ - public class Teams : Command - { - public override string CmdName => "teams"; - public override string CmdUsage => "teams"; - public override string CmdDesc => Translations.cmd_teams_desc; - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => DoListTeams(r.Source)) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private static int DoListTeams(CmdResult r) - { - McClient handler = CmdResult.currentHandler!; - Dictionary snapshot = handler.GetTeams(); - - if (snapshot.Count == 0) - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_teams_no_teams); - - var sb = new StringBuilder(); - foreach (var team in snapshot.Values.OrderBy(static t => t.Name, StringComparer.Ordinal)) - { - sb.AppendLine(string.Format(Translations.cmd_teams_team_header, - team.Name, - team.DisplayName, - team.Color, - team.Prefix, - team.Suffix, - team.NameTagVisibility, - team.CollisionRule, - team.AllowFriendlyFire, - team.SeeFriendlyInvisibles)); - - if (team.Members.Count == 0) - sb.AppendLine(Translations.cmd_teams_team_no_members); - else - sb.AppendLine(string.Format(Translations.cmd_teams_team_members, - team.Members.Count, - string.Join(", ", team.Members.OrderBy(static m => m, StringComparer.OrdinalIgnoreCase)))); - } - - return r.SetAndReturn(CmdResult.Status.Done, sb.ToString().TrimEnd()); - } - } -} diff --git a/MinecraftClient/Commands/Tps.cs b/MinecraftClient/Commands/Tps.cs deleted file mode 100644 index a30749bb7e..0000000000 --- a/MinecraftClient/Commands/Tps.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - class Tps : Command - { - public override string CmdName { get { return "tps"; } } - public override string CmdUsage { get { return "tps"; } } - public override string CmdDesc { get { return Translations.cmd_tps_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => DoLogTps(r.Source)) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int DoLogTps(CmdResult r) - { - McClient handler = CmdResult.currentHandler!; - var tps = Math.Round(handler.GetServerTPS(), 2); - string color; - if (tps < 10) - color = "§c"; // Red - else if (tps < 15) - color = "§e"; // Yellow - else - color = "§a"; // Green - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_tps_current + ": " + color + tps); - } - } -} diff --git a/MinecraftClient/Commands/Tryout.cs b/MinecraftClient/Commands/Tryout.cs deleted file mode 100644 index 8ae0829bbe..0000000000 --- a/MinecraftClient/Commands/Tryout.cs +++ /dev/null @@ -1,63 +0,0 @@ -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using static MinecraftClient.Settings.ConsoleConfigHealper.ConsoleConfig; - -namespace MinecraftClient.Commands -{ - public class Tryout : Command - { - public override string CmdName => "tryout"; - public override string CmdUsage => "tryout [list|tui]"; - public override string CmdDesc => Translations.cmd_tryout_desc; - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => ListTryouts(r.Source)) - .Then(l => l.Literal("list") - .Executes(r => ListTryouts(r.Source))) - .Then(l => l.Literal("tui") - .Executes(r => EnableTuiMode(r.Source))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r) - { - return r.SetAndReturn(GetCmdDescTranslated()); - } - - private int ListTryouts(CmdResult r) - { - return r.SetAndReturn(string.Join('\n', - GetCmdDescTranslated(), - string.Empty, - Translations.cmd_tryout_list_header, - $" - {Translations.cmd_tryout_list_tui}")); - } - - private int EnableTuiMode(CmdResult r) - { - var previousMode = Settings.Config.Console.General.ConsoleMode; - if (previousMode == ConsoleModeType.tui) - { - return r.SetAndReturn(CmdResult.Status.Done, Translations.cmd_tryout_tui_already_enabled); - } - - Settings.Config.Console.General.ConsoleMode = ConsoleModeType.tui; - Program.WriteBackSettings(); - - return r.SetAndReturn(CmdResult.Status.Done, - string.Format(Translations.cmd_tryout_tui_enabled, previousMode, ConsoleModeType.tui)); - } - } -} diff --git a/MinecraftClient/Commands/Upgrade.cs b/MinecraftClient/Commands/Upgrade.cs deleted file mode 100644 index 35ae378353..0000000000 --- a/MinecraftClient/Commands/Upgrade.cs +++ /dev/null @@ -1,78 +0,0 @@ -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; - -namespace MinecraftClient.Commands -{ - class Upgrade : Command - { - public override string CmdName { get { return "upgrade"; } } - public override string CmdUsage { get { return "upgrade [-f|check|cancel|download]"; } } - public override string CmdDesc { get { return string.Empty; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - .Then(l => l.Literal("cancel") - .Executes(r => GetUsage(r.Source, "cancel"))) - .Then(l => l.Literal("check") - .Executes(r => GetUsage(r.Source, "check"))) - .Then(l => l.Literal("download") - .Executes(r => GetUsage(r.Source, "download"))) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => DownloadUpdate(r.Source, force: false)) - .Then(l => l.Literal("-f") - .Executes(r => DownloadUpdate(r.Source, force: true))) - .Then(l => l.Literal("download") - .Executes(r => DownloadUpdate(r.Source, force: false)) - .Then(l => l.Literal("-f") - .Executes(r => DownloadUpdate(r.Source, force: true)))) - .Then(l => l.Literal("check") - .Executes(r => CheckUpdate(r.Source))) - .Then(l => l.Literal("cancel") - .Executes(r => CancelDownloadUpdate(r.Source))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - "cancel" => GetCmdDescTranslated(), - "check" => GetCmdDescTranslated(), - "download" => GetCmdDescTranslated(), - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private static int DownloadUpdate(CmdResult r, bool force) - { - if (UpgradeHelper.DownloadLatestBuild(force)) - return r.SetAndReturn(CmdResult.Status.Done, Translations.mcc_update_start); - else - return r.SetAndReturn(CmdResult.Status.Fail, Translations.mcc_update_already_running); - } - - private static int CancelDownloadUpdate(CmdResult r) - { - UpgradeHelper.CancelDownloadUpdate(); - return r.SetAndReturn(CmdResult.Status.Done, Translations.mcc_update_cancel); - } - - private static int CheckUpdate(CmdResult r) - { - UpgradeHelper.CheckUpdate(forceUpdate: true); - return r.SetAndReturn(CmdResult.Status.Done, Translations.mcc_update_start); - } - } -} diff --git a/MinecraftClient/Commands/UseItem.cs b/MinecraftClient/Commands/UseItem.cs deleted file mode 100644 index 70ad0003ca..0000000000 --- a/MinecraftClient/Commands/UseItem.cs +++ /dev/null @@ -1,112 +0,0 @@ -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.Inventory; -using MinecraftClient.Mapping; -using static MinecraftClient.CommandHandler.CmdResult; - -namespace MinecraftClient.Commands -{ - class UseItem : Command - { - public override string CmdName { get { return "useitem"; } } - public override string CmdUsage { get { return "useitem [mainhand|offhand] | useitem [x] [y] [z] [mainhand|offhand]"; } } - public override string CmdDesc { get { return Translations.cmd_useitem_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Executes(r => DoUseItem(r.Source)) - .Then(l => l.Literal("mainhand") - .Executes(r => DoUseItem(r.Source, Hand.MainHand))) - .Then(l => l.Literal("offhand") - .Executes(r => DoUseItem(r.Source, Hand.OffHand))) - .Then(l => l.Argument("Location", MccArguments.Location()) - .Executes(r => DoUseItemAtLocation(r.Source, MccArguments.GetLocation(r, "Location"), Hand.MainHand)) - .Then(l => l.Literal("mainhand") - .Executes(r => DoUseItemAtLocation(r.Source, MccArguments.GetLocation(r, "Location"), Hand.MainHand))) - .Then(l => l.Literal("offhand") - .Executes(r => DoUseItemAtLocation(r.Source, MccArguments.GetLocation(r, "Location"), Hand.OffHand)))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private static bool ShouldUseOffhandFood(McClient handler) - { - Container? inventory = handler.GetInventory(0); - if (inventory is null) - return false; - - if (!inventory.Items.TryGetValue(45, out Item? offhandItem) - || offhandItem.IsEmpty - || !offhandItem.Type.IsFood()) - return false; - - int mainHandSlot = 36 + handler.GetCurrentSlot(); - return !inventory.Items.TryGetValue(mainHandSlot, out Item? mainHandItem) - || mainHandItem.IsEmpty - || !mainHandItem.Type.IsFood(); - } - - private int DoUseItem(CmdResult r, Hand? requestedHand = null) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetInventoryEnabled()) - return r.SetAndReturn(Status.FailNeedInventory); - - Hand hand = requestedHand ?? (ShouldUseOffhandFood(handler) ? Hand.OffHand : Hand.MainHand); - bool useOffhandFood = !requestedHand.HasValue && hand == Hand.OffHand; - - if (!useOffhandFood && handler.GetTerrainEnabled()) - { - const double maxDistance = 4.5; - var raycast = RaycastHelper.RaycastBlock(handler, maxDistance, false); - if (raycast.Item1 && raycast.Item3.Type != Material.Air) - { - handler.PlaceBlock(raycast.Item2, Direction.Up, hand, lookAtBlock: true); - handler.DoAnimation((int)hand); - return r.SetAndReturn(Status.Done, Translations.cmd_useitem_use); - } - } - - if (hand == Hand.OffHand) - handler.UseItemOnLeftHand(); - else - handler.UseItemOnHand(); - - return r.SetAndReturn(Status.Done, Translations.cmd_useitem_use); - } - - private int DoUseItemAtLocation(CmdResult r, Location block, Hand hand) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetTerrainEnabled()) - return r.SetAndReturn(Status.FailNeedTerrain); - - Location current = handler.GetCurrentLocation(); - block = block.ToAbsolute(current).ToFloor(); - handler.PlaceBlock(block, Direction.Up, hand, lookAtBlock: true); - handler.DoAnimation((int)hand); - return r.SetAndReturn(Status.Done, Translations.cmd_useitem_use); - } - - } -} diff --git a/MinecraftClient/Commands/Useblock.cs b/MinecraftClient/Commands/Useblock.cs deleted file mode 100644 index d4f964a65c..0000000000 --- a/MinecraftClient/Commands/Useblock.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.Inventory; -using MinecraftClient.Mapping; -using static MinecraftClient.CommandHandler.CmdResult; - -namespace MinecraftClient.Commands -{ - class Useblock : Command - { - public override string CmdName { get { return "useblock"; } } - public override string CmdUsage { get { return "useblock [mainhand|offhand]"; } } - public override string CmdDesc { get { return Translations.cmd_useblock_desc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CmdName) - .Executes(r => GetUsage(r.Source, string.Empty)) - ) - ); - - dispatcher.Register(l => l.Literal(CmdName) - .Then(l => l.Argument("Location", MccArguments.Location()) - .Executes(r => UseBlockAtLocation(r.Source, MccArguments.GetLocation(r, "Location"), Hand.MainHand)) - .Then(l => l.Literal("mainhand") - .Executes(r => UseBlockAtLocation(r.Source, MccArguments.GetLocation(r, "Location"), Hand.MainHand))) - .Then(l => l.Literal("offhand") - .Executes(r => UseBlockAtLocation(r.Source, MccArguments.GetLocation(r, "Location"), Hand.OffHand)))) - .Then(l => l.Literal("_help") - .Executes(r => GetUsage(r.Source, string.Empty)) - .Redirect(dispatcher.GetRoot().GetChild("help").GetChild(CmdName))) - ); - } - - private int GetUsage(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - _ => GetCmdDescTranslated(), -#pragma warning restore format // @formatter:on - }); - } - - private int UseBlockAtLocation(CmdResult r, Location block, Hand hand) - { - McClient handler = CmdResult.currentHandler!; - if (!handler.GetTerrainEnabled()) - return r.SetAndReturn(Status.FailNeedTerrain); - - Location current = handler.GetCurrentLocation(); - block = block.ToAbsolute(current).ToFloor(); - Location blockCenter = block.ToCenter(); - bool res = handler.PlaceBlock(block, GetFaceNearestPlayer(current, blockCenter), hand, lookAtBlock: true); - return r.SetAndReturn(string.Format(Translations.cmd_useblock_use, blockCenter.X, blockCenter.Y, blockCenter.Z, res ? "succeeded" : "failed"), res); - } - - private static Direction GetFaceNearestPlayer(Location playerLocation, Location blockCenter) - { - double dx = playerLocation.X - blockCenter.X; - double dy = playerLocation.Y - blockCenter.Y; - double dz = playerLocation.Z - blockCenter.Z; - - double absX = Math.Abs(dx); - double absY = Math.Abs(dy); - double absZ = Math.Abs(dz); - - if (absX >= absY && absX >= absZ) - return dx >= 0 ? Direction.East : Direction.West; - - if (absY >= absZ) - return dy >= 0 ? Direction.Up : Direction.Down; - - return dz >= 0 ? Direction.South : Direction.North; - } - } -} diff --git a/MinecraftClient/ConnectionAttemptLifecycle.cs b/MinecraftClient/ConnectionAttemptLifecycle.cs deleted file mode 100644 index 360ae01305..0000000000 --- a/MinecraftClient/ConnectionAttemptLifecycle.cs +++ /dev/null @@ -1,107 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using MinecraftClient.Scripting; - -namespace MinecraftClient -{ - internal sealed class ConnectionAttemptLifecycle - { - private int disconnectState; - - internal bool IsFailureClaimed => Volatile.Read(ref disconnectState) != 0; - - internal bool TryBeginDisconnect() - { - return Interlocked.CompareExchange(ref disconnectState, 1, 0) == 0; - } - - internal void CompleteDisconnect() - { - Volatile.Write(ref disconnectState, 2); - } - - internal static void RestoreHeldBots(ICollection heldBots, Action loadBot) - { - ArgumentNullException.ThrowIfNull(heldBots); - ArgumentNullException.ThrowIfNull(loadBot); - - foreach (ChatBot bot in heldBots) - loadBot(bot); - heldBots.Clear(); - } - } - - internal sealed class AttemptOwnedRoute - { - private const long NoOwner = -1; - private readonly Lock stateLock = new(); - private long ownerAttempt = NoOwner; - - internal long OwnerAttempt - { - get - { - lock (stateLock) - return ownerAttempt; - } - } - - internal bool TryActivate(long connectionAttempt, long currentConnectionAttempt, Action activate) - { - ArgumentNullException.ThrowIfNull(activate); - - lock (stateLock) - { - if (connectionAttempt < currentConnectionAttempt || ownerAttempt >= connectionAttempt) - return false; - - ownerAttempt = connectionAttempt; - activate(); - return true; - } - } - - internal bool TryDeactivate(long connectionAttempt, Action deactivate) - { - ArgumentNullException.ThrowIfNull(deactivate); - - lock (stateLock) - { - if (ownerAttempt != connectionAttempt) - return false; - - ownerAttempt = NoOwner; - deactivate(); - return true; - } - } - - internal bool TryTransfer(long sourceConnectionAttempt, long targetConnectionAttempt) - { - lock (stateLock) - { - if (ownerAttempt != sourceConnectionAttempt) - return false; - - ownerAttempt = targetConnectionAttempt; - return true; - } - } - - internal bool TryDeactivate(Action deactivate) - { - ArgumentNullException.ThrowIfNull(deactivate); - - lock (stateLock) - { - if (ownerAttempt == NoOwner) - return false; - - ownerAttempt = NoOwner; - deactivate(); - return true; - } - } - } -} diff --git a/MinecraftClient/ConsoleIO.cs b/MinecraftClient/ConsoleIO.cs deleted file mode 100644 index 50a023fe91..0000000000 --- a/MinecraftClient/ConsoleIO.cs +++ /dev/null @@ -1,489 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Brigadier.NET; -using FuzzySharp; -using MinecraftClient.CommandHandler; -using MinecraftClient.Scripting; -using MinecraftClient.Tui; -using static MinecraftClient.Settings; - -namespace MinecraftClient -{ - /// - /// Allows simultaneous console input and output without breaking user input - /// (Without having this annoying behaviour : User inp[Some Console output]ut) - /// Provide some fancy features such as formatted output, text pasting and tab-completion. - /// By ORelio - (c) 2012-2018 - Available under the CDDL-1.0 License - /// - public static class ConsoleIO - { - private static IAutoComplete? autocomplete_engine; - - /// - /// The active console backend. Set once during startup. - /// - public static IConsoleBackend Backend { get; set; } = null!; - - /// - /// Reset the IO mechanism and clear all buffers - /// - public static void Reset() - { - Backend?.ClearInputBuffer(); - } - - /// - /// Set an auto-completion engine for TAB autocompletion. - /// - /// Engine implementing the IAutoComplete interface - public static void SetAutoCompleteEngine(IAutoComplete engine) - { - autocomplete_engine = engine; - } - - /// - /// Determines whether to use basic IO (legacy flag, kept for compatibility). - /// In the new architecture this is true when Backend is BasicConsoleBackend. - /// - public static bool BasicIO = false; - - /// - /// Determines whether not to print color codes in BasicIO mode. - /// - public static bool BasicIO_NoColor = false; - - /// - /// Determine whether WriteLineFormatted() should prepend lines with timestamps by default. - /// - public static bool EnableTimestamps = false; - - /// - /// Determine whether chat lines should be displayed in the console. - /// - public static bool ChatVisible = true; - - /// - /// Specify a generic log line prefix for WriteLogLine() - /// - public static string LogPrefix = "§8[MCC] "; - - /// - /// Read a password from the standard input - /// - public static string? ReadPassword() - { - if (ConsoleInputRouter.IsStarted) - { - if (BasicIO || Backend is null) - return ConsoleInputRouter.ReadLine(); - - Backend.SetInputVisible(false); - try - { - return ConsoleInputRouter.ReadLine(); - } - finally - { - Backend.SetInputVisible(true); - } - } - - if (BasicIO) - return Console.ReadLine(); - return Backend.ReadPassword(); - } - - /// - /// Read a line from the standard input - /// - public static string ReadLine() - { - if (ConsoleInputRouter.IsStarted) - return ConsoleInputRouter.ReadLine(); - - if (BasicIO) - return Console.ReadLine() ?? String.Empty; - return Backend.RequestImmediateInput(); - } - - /// - /// Debug routine: print all keys pressed in the console - /// - public static void DebugReadInput() - { - ConsoleKeyInfo k; - while (true) - { - k = Console.ReadKey(true); - Console.WriteLine("Key: {0}\tChar: {1}\tModifiers: {2}", k.Key, k.KeyChar, k.Modifiers); - } - } - - /// - /// Write a string to the standard output with a trailing newline - /// - public static void WriteLine(string line) - { - if (BasicIO || Backend is null) - Console.WriteLine(line); - else - Backend.WriteLine(line); - } - - /// - /// Write a Minecraft-Like formatted string to the standard output, using §c color codes - /// for more info - /// - /// String to write - /// If false, space are printed instead of newlines - /// - /// If false, no timestamp is prepended. - /// If true, "hh-mm-ss" timestamp will be prepended. - /// If unspecified, value is retrieved from EnableTimestamps. - /// - public static void WriteLineFormatted(string str, bool acceptnewlines = false, bool? displayTimestamp = null) - { - StringBuilder output = new(); - - if (!String.IsNullOrEmpty(str)) - { - displayTimestamp ??= EnableTimestamps; - if (displayTimestamp.Value) - { - int hour = DateTime.Now.Hour, minute = DateTime.Now.Minute, second = DateTime.Now.Second; - output.Append(String.Format("{0}:{1}:{2} ", hour.ToString("00"), minute.ToString("00"), second.ToString("00"))); - } - if (!acceptnewlines) - { - str = str.Replace('\n', ' '); - } - if (BasicIO || Backend is null) - { - if (BasicIO_NoColor) - { - output.Append(ChatBot.GetVerbatim(str)); - } - else - { - output.Append(str); - } - Console.WriteLine(output.ToString()); - return; - } - output.Append(str); - output.Append("§r"); - Backend.WriteLineFormatted(output.ToString()); - } - } - - /// - /// Write a formatted chat line to the console when chat output is enabled. - /// - public static void WriteChatLineIfVisible(string str, bool acceptnewlines = false, bool? displayTimestamp = null) - { - if (!ChatVisible) - return; - - WriteLineFormatted(str, acceptnewlines, displayTimestamp); - } - - /// - /// Write a prefixed log line. Prefix is set in LogPrefix. - /// - /// Text of the log line - /// Allow line breaks - public static void WriteLogLine(string text, bool acceptnewlines = true) - { - if (!acceptnewlines) - text = text.Replace('\n', ' '); - WriteLineFormatted(LogPrefix + text, acceptnewlines); - } - - #region Subfunctions - - /// - /// Clear all text inside the input prompt - /// - private static void ClearLineAndBuffer() - { - if (BasicIO) return; - Backend.ClearInputBuffer(); - } - - /// - /// Clear the visible console output. - /// - public static void ClearConsole() - { - if (BasicIO || Backend is null) - { - try - { - Console.Clear(); - } - catch (IOException ex) - { - System.Diagnostics.Debug.WriteLine(ex); - } - catch (PlatformNotSupportedException ex) - { - System.Diagnostics.Debug.WriteLine(ex); - } - - return; - } - - Backend.ClearScreen(); - } - - #endregion - - internal static bool AutoCompleteDone = false; - internal static string[] AutoCompleteResult = Array.Empty(); - - private static HashSet Commands = new(); - private static string[] CommandsFromAutoComplete = Array.Empty(); - private static string[] CommandsFromDeclareCommands = Array.Empty(); - - private static Task _latestTask = Task.CompletedTask; - private static CancellationTokenSource? _cancellationTokenSource; - - private static void SendSuggestions( - ConsoleInteractive.ConsoleSuggestion.Suggestion[] classicSugs, - Tuple range) - { - if (Backend is ClassicConsoleBackend classic) - { - classic.UpdateSuggestions(classicSugs, range); - } - else if (Backend is TuiConsoleBackend tui) - { - var tuiSugs = new CommandSuggestion[classicSugs.Length]; - for (int i = 0; i < classicSugs.Length; i++) - tuiSugs[i] = new CommandSuggestion(classicSugs[i].Text, classicSugs[i].Tooltip); - tui.UpdateSuggestions(tuiSugs, (range.Item1, range.Item2)); - } - } - - private static void DoClearSuggestions() - { - if (Backend is ClassicConsoleBackend classic) - classic.ClearSuggestions(); - else if (Backend is TuiConsoleBackend tui) - tui.ClearSuggestions(); - } - - private static void MccAutocompleteHandler(ConsoleInputBuffer buffer) - { - string fullCommand = buffer.Text; - if (string.IsNullOrEmpty(fullCommand)) - { - DoClearSuggestions(); - return; - } - - var InternalCmdChar = Config.Main.Advanced.InternalCmdChar; - if (InternalCmdChar == MainConfigHelper.MainConfig.AdvancedConfig.InternalCmdCharType.none || fullCommand[0] == InternalCmdChar.ToChar()) - { - int offset = InternalCmdChar == MainConfigHelper.MainConfig.AdvancedConfig.InternalCmdCharType.none ? 0 : 1; - if (buffer.CursorPosition - offset < 0) - { - DoClearSuggestions(); - return; - } - _cancellationTokenSource?.Cancel(); - using var cts = new CancellationTokenSource(); - _cancellationTokenSource = cts; - var previousTask = _latestTask; - var newTask = new Task(async () => - { - string command = fullCommand[offset..]; - if (command.Length == 0) - { - List sugList = new(); - - sugList.Add(new("/")); - - var childs = McClient.dispatcher.GetRoot().Children; - if (childs is not null) - foreach (var child in childs) - sugList.Add(new(child.Name)); - - foreach (var cmd in Commands) - sugList.Add(new(cmd)); - - SendSuggestions(sugList.ToArray(), new(offset, offset)); - } - else if (command.Length > 0 && command[0] == '/' && !command.Contains(' ')) - { - var sorted = Process.ExtractSorted(command[1..], Commands); - var sugList = new ConsoleInteractive.ConsoleSuggestion.Suggestion[sorted.Count()]; - - int index = 0; - foreach (var sug in sorted) - sugList[index++] = new(sug.Value); - SendSuggestions(sugList, new(offset, offset + command.Length)); - } - else - { - CommandDispatcher? dispatcher = McClient.dispatcher; - if (dispatcher is null) - return; - - ParseResults parse = dispatcher.Parse(command, CmdResult.Empty); - - Brigadier.NET.Suggestion.Suggestions suggestions = await dispatcher.GetCompletionSuggestions(parse, buffer.CursorPosition - offset); - - int sugLen = suggestions.List.Count; - if (sugLen == 0) - { - DoClearSuggestions(); - return; - } - - Dictionary dictionary = new(); - foreach (var sug in suggestions.List) - dictionary.Add(sug.Text, sug.Tooltip?.String); - - var sugList = new ConsoleInteractive.ConsoleSuggestion.Suggestion[sugLen]; - if (cts.IsCancellationRequested) - return; - - Tuple range = new(suggestions.Range.Start + offset, suggestions.Range.End + offset); - var sorted = Process.ExtractSorted(fullCommand[range.Item1..range.Item2], dictionary.Keys); - if (cts.IsCancellationRequested) - return; - - int index = 0; - foreach (var sug in sorted) - sugList[index++] = new(sug.Value, dictionary[sug.Value] ?? string.Empty); - - SendSuggestions(sugList, range); - } - }, cts.Token); - _latestTask = newTask; - try { newTask.Start(); } catch { } - if (_cancellationTokenSource == cts) _cancellationTokenSource = null; - } - else - { - DoClearSuggestions(); - return; - } - } - - public static void AutocompleteHandler(object? sender, ConsoleInputBuffer buffer) - { - if (Settings.Config.Console.CommandSuggestion.Enable) - MccAutocompleteHandler(buffer); - } - - private static readonly string[] OfflineCommands = ["quit", "exit", "connect", "reco", "help"]; - - public static void OfflineAutocompleteHandler(object? sender, ConsoleInputBuffer buffer) - { - if (!Settings.Config.Console.CommandSuggestion.Enable) - return; - - string fullCommand = buffer.Text; - if (string.IsNullOrEmpty(fullCommand)) - { - DoClearSuggestions(); - return; - } - - var InternalCmdChar = Config.Main.Advanced.InternalCmdChar; - int offset = 0; - if (InternalCmdChar != MainConfigHelper.MainConfig.AdvancedConfig.InternalCmdCharType.none) - { - if (fullCommand[0] != InternalCmdChar.ToChar()) - { - DoClearSuggestions(); - return; - } - offset = 1; - } - - string command = fullCommand[offset..]; - if (command.Contains(' ')) - { - DoClearSuggestions(); - return; - } - - var sugList = new List(); - foreach (string cmd in OfflineCommands) - { - if (command.Length == 0 || cmd.StartsWith(command, StringComparison.OrdinalIgnoreCase)) - sugList.Add(new(cmd)); - } - - if (sugList.Count > 0) - SendSuggestions(sugList.ToArray(), new(offset, offset + command.Length)); - else - DoClearSuggestions(); - } - - public static void CancelAutocomplete() - { - _cancellationTokenSource?.Cancel(); - _latestTask = Task.CompletedTask; - DoClearSuggestions(); - - AutoCompleteDone = false; - AutoCompleteResult = Array.Empty(); - CommandsFromAutoComplete = Array.Empty(); - CommandsFromDeclareCommands = Array.Empty(); - } - - private static void MergeCommands() - { - Commands.Clear(); - foreach (string cmd in CommandsFromAutoComplete) - Commands.Add('/' + cmd); - foreach (string cmd in CommandsFromDeclareCommands) - Commands.Add('/' + cmd); - } - - public static void OnAutoCompleteDone(int transactionId, string[] result) - { - AutoCompleteResult = result; - if (transactionId == 0) - { - CommandsFromAutoComplete = result; - MergeCommands(); - } - AutoCompleteDone = true; - } - - public static void OnDeclareMinecraftCommand(string[] rootCommands) - { - CommandsFromDeclareCommands = rootCommands; - MergeCommands(); - } - - public static void InitCommandList(CommandDispatcher dispatcher) - { - autocomplete_engine!.AutoComplete("/"); - } - } - - /// - /// Interface for TAB autocompletion - /// Allows to use any object which has an AutoComplete() method using the IAutocomplete interface - /// - public interface IAutoComplete - { - /// - /// Provide a list of auto-complete strings based on the provided input behing the cursor - /// - /// Text behind the cursor, e.g. "my input comm" - /// List of auto-complete words, e.g. ["command", "comment"] - int AutoComplete(string BehindCursor); - } -} diff --git a/MinecraftClient/ConsoleInputRouter.cs b/MinecraftClient/ConsoleInputRouter.cs deleted file mode 100644 index 3343e4b2b3..0000000000 --- a/MinecraftClient/ConsoleInputRouter.cs +++ /dev/null @@ -1,187 +0,0 @@ -using System; -using System.Threading; -using System.Threading.Tasks; - -namespace MinecraftClient -{ - internal static class ConsoleInputRouter - { - private static readonly Lock StateLock = new(); - private static readonly CancellationTokenSource Shutdown = new(); - private static bool started; - private static Action? messageRoute; - private static EventHandler? inputChangeRoute; - private static TaskCompletionSource? pendingRead; - - internal static bool IsStarted - { - get - { - lock (StateLock) - return started; - } - } - - internal static void EnsureStarted() - { - lock (StateLock) - { - if (started) - return; - - started = true; - if (ConsoleIO.BasicIO || ConsoleIO.Backend is null) - { - var readThread = new Thread(() => ReadBasicInput(Shutdown.Token)) - { - Name = "MCC console input router", - }; - readThread.Start(); - return; - } - - try - { - ConsoleIO.Backend.MessageReceived += OnMessageReceived; - ConsoleIO.Backend.OnInputChange += OnInputChanged; - ConsoleIO.Backend.BeginReadThread(); - } - catch - { - ConsoleIO.Backend.MessageReceived -= OnMessageReceived; - ConsoleIO.Backend.OnInputChange -= OnInputChanged; - started = false; - throw; - } - } - } - - internal static void RouteToClient(McClient client) - { - ArgumentNullException.ThrowIfNull(client); - EnsureStarted(); - - lock (StateLock) - { - messageRoute = client.RouteConsoleInput; - inputChangeRoute = ConsoleIO.AutocompleteHandler; - } - } - - internal static void ClearClient(McClient client) - { - ArgumentNullException.ThrowIfNull(client); - - lock (StateLock) - { - if (messageRoute == client.RouteConsoleInput) - { - messageRoute = null; - inputChangeRoute = null; - } - } - } - - internal static void RouteOffline(Action handler) - { - ArgumentNullException.ThrowIfNull(handler); - EnsureStarted(); - - lock (StateLock) - { - messageRoute = handler; - inputChangeRoute = ConsoleIO.OfflineAutocompleteHandler; - } - } - - internal static void ClearOfflineRoute(Action handler) - { - ArgumentNullException.ThrowIfNull(handler); - - lock (StateLock) - { - if (messageRoute == handler) - { - messageRoute = null; - inputChangeRoute = null; - } - } - } - - internal static string ReadLine() - { - EnsureStarted(); - - TaskCompletionSource readCompletion = new(TaskCreationOptions.RunContinuationsAsynchronously); - lock (StateLock) - { - if (pendingRead is not null) - throw new InvalidOperationException(); - - pendingRead = readCompletion; - } - - return readCompletion.Task.GetAwaiter().GetResult(); - } - - internal static void ShutdownRouter() - { - lock (StateLock) - { - messageRoute = null; - inputChangeRoute = null; - pendingRead?.TrySetCanceled(); - pendingRead = null; - Shutdown.Cancel(); - } - } - - private static void ReadBasicInput(CancellationToken cancellationToken) - { - while (!cancellationToken.IsCancellationRequested) - { - string? input = Console.ReadLine(); - if (input is null) - return; - - DispatchMessage(input); - } - } - - private static void OnMessageReceived(object? sender, string message) - { - DispatchMessage(message); - } - - private static void OnInputChanged(object? sender, ConsoleInputBuffer input) - { - EventHandler? route; - lock (StateLock) - route = inputChangeRoute; - - route?.Invoke(sender, input); - } - - private static void DispatchMessage(string message) - { - TaskCompletionSource? readCompletion; - Action? route; - - lock (StateLock) - { - readCompletion = pendingRead; - if (readCompletion is not null) - pendingRead = null; - route = messageRoute; - } - - if (readCompletion is not null) - { - readCompletion.TrySetResult(message); - return; - } - - route?.Invoke(message); - } - } -} diff --git a/MinecraftClient/Crypto/AesCfb8Stream.cs b/MinecraftClient/Crypto/AesCfb8Stream.cs deleted file mode 100644 index b60eb84528..0000000000 --- a/MinecraftClient/Crypto/AesCfb8Stream.cs +++ /dev/null @@ -1,199 +0,0 @@ -using System; -using System.IO; -using System.Runtime.CompilerServices; -using System.Security.Cryptography; - -namespace MinecraftClient.Crypto -{ - public class AesCfb8Stream : Stream - { - public const int blockSize = 16; - - private readonly Aes? Aes = null; - private readonly FastAes? FastAes = null; - - private bool inStreamEnded = false; - - private readonly byte[] ReadStreamIV = new byte[16]; - private readonly byte[] WriteStreamIV = new byte[16]; - - public Stream BaseStream { get; set; } - - public AesCfb8Stream(Stream stream, byte[] key) - { - BaseStream = stream; - - if (FastAes.IsSupported()) - FastAes = new FastAes(key); - else - { - Aes = Aes.Create(); - Aes.BlockSize = 128; - Aes.KeySize = 128; - Aes.Key = key; - Aes.Mode = CipherMode.ECB; - Aes.Padding = PaddingMode.None; - } - - Array.Copy(key, ReadStreamIV, 16); - Array.Copy(key, WriteStreamIV, 16); - } - - public override bool CanRead - { - get { return true; } - } - - public override bool CanSeek - { - get { return false; } - } - - public override bool CanWrite - { - get { return true; } - } - - public override void Flush() - { - BaseStream.Flush(); - } - - public override long Length - { - get { throw new NotSupportedException(); } - } - - public override long Position - { - get - { - throw new NotSupportedException(); - } - set - { - throw new NotSupportedException(); - } - } - - public override int ReadByte() - { - if (inStreamEnded) - return -1; - - int inputBuf = BaseStream.ReadByte(); - if (inputBuf == -1) - { - inStreamEnded = true; - return -1; - } - - Span blockOutput = stackalloc byte[blockSize]; - if (FastAes is not null) - FastAes.EncryptEcb(ReadStreamIV, blockOutput); - else - Aes!.EncryptEcb(ReadStreamIV, blockOutput, PaddingMode.None); - - // Shift left - Array.Copy(ReadStreamIV, 1, ReadStreamIV, 0, blockSize - 1); - ReadStreamIV[blockSize - 1] = (byte)inputBuf; - - return (byte)(blockOutput[0] ^ inputBuf); - } - - [MethodImpl(MethodImplOptions.AggressiveOptimization)] - public override int Read(byte[] buffer, int outOffset, int required) - { - if (inStreamEnded) - return 0; - - Span blockOutput = stackalloc byte[blockSize]; - - byte[] inputBuf = new byte[blockSize + required]; - Array.Copy(ReadStreamIV, inputBuf, blockSize); - - for (int readed = 0, curRead; readed < required; readed += curRead) - { - curRead = BaseStream.Read(inputBuf, blockSize + readed, required - readed); - if (curRead == 0) - { - inStreamEnded = true; - return readed; - } - - int processEnd = readed + curRead; - if (FastAes is not null) - { - for (int idx = readed; idx < processEnd; idx++) - { - ReadOnlySpan blockInput = new(inputBuf, idx, blockSize); - FastAes.EncryptEcb(blockInput, blockOutput); - buffer[outOffset + idx] = (byte)(blockOutput[0] ^ inputBuf[idx + blockSize]); - } - } - else - { - for (int idx = readed; idx < processEnd; idx++) - { - ReadOnlySpan blockInput = new(inputBuf, idx, blockSize); - Aes!.EncryptEcb(blockInput, blockOutput, PaddingMode.None); - buffer[outOffset + idx] = (byte)(blockOutput[0] ^ inputBuf[idx + blockSize]); - } - } - } - - Array.Copy(inputBuf, required, ReadStreamIV, 0, blockSize); - - return required; - } - - public override long Seek(long offset, SeekOrigin origin) - { - throw new NotSupportedException(); - } - - public override void SetLength(long value) - { - throw new NotSupportedException(); - } - - public override void WriteByte(byte b) - { - Span blockOutput = stackalloc byte[blockSize]; - - if (FastAes is not null) - FastAes.EncryptEcb(WriteStreamIV, blockOutput); - else - Aes!.EncryptEcb(WriteStreamIV, blockOutput, PaddingMode.None); - - byte outputBuf = (byte)(blockOutput[0] ^ b); - - BaseStream.WriteByte(outputBuf); - - // Shift left - Array.Copy(WriteStreamIV, 1, WriteStreamIV, 0, blockSize - 1); - WriteStreamIV[blockSize - 1] = outputBuf; - } - - [MethodImpl(MethodImplOptions.AggressiveOptimization)] - public override void Write(byte[] input, int offset, int required) - { - byte[] outputBuf = new byte[blockSize + required]; - Array.Copy(WriteStreamIV, outputBuf, blockSize); - - Span blockOutput = stackalloc byte[blockSize]; - for (int wirtten = 0; wirtten < required; ++wirtten) - { - ReadOnlySpan blockInput = new(outputBuf, wirtten, blockSize); - if (FastAes is not null) - FastAes.EncryptEcb(blockInput, blockOutput); - else - Aes!.EncryptEcb(blockInput, blockOutput, PaddingMode.None); - outputBuf[blockSize + wirtten] = (byte)(blockOutput[0] ^ input[offset + wirtten]); - } - BaseStream.WriteAsync(outputBuf, blockSize, required); - - Array.Copy(outputBuf, required, WriteStreamIV, 0, blockSize); - } - } -} diff --git a/MinecraftClient/Crypto/CryptoHandler.cs b/MinecraftClient/Crypto/CryptoHandler.cs deleted file mode 100644 index 963c5dbc23..0000000000 --- a/MinecraftClient/Crypto/CryptoHandler.cs +++ /dev/null @@ -1,198 +0,0 @@ -using System; -using System.Linq; -using System.Security.Cryptography; -using System.Text; - -namespace MinecraftClient.Crypto -{ - /// - /// Methods for handling all the crypto stuff: RSA (Encryption Key Request), AES (Encrypted Stream), SHA-1 (Server Hash). - /// - - public static class CryptoHandler - { - public static byte[]? ClientAESPrivateKey; - - /// - /// Get a cryptographic service for encrypting data using the server's RSA public key - /// - /// Byte array containing the encoded key - /// Returns the corresponding RSA Crypto Service - - public static RSACryptoServiceProvider? DecodeRSAPublicKey(byte[] x509key) - { - /* Code from StackOverflow no. 18091460 */ - - byte[] SeqOID = { 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01 }; - - System.IO.MemoryStream ms = new(x509key); - System.IO.BinaryReader reader = new(ms); - - if (reader.ReadByte() == 0x30) - ReadASNLength(reader); //skip the size - else - return null; - - int identifierSize; //total length of Object Identifier section - if (reader.ReadByte() == 0x30) - identifierSize = ReadASNLength(reader); - else - return null; - - if (reader.ReadByte() == 0x06) //is the next element an object identifier? - { - int oidLength = ReadASNLength(reader); - byte[] oidBytes = new byte[oidLength]; - reader.Read(oidBytes, 0, oidBytes.Length); - if (oidBytes.SequenceEqual(SeqOID) == false) //is the object identifier rsaEncryption PKCS#1? - return null; - - int remainingBytes = identifierSize - 2 - oidBytes.Length; - reader.ReadBytes(remainingBytes); - } - - if (reader.ReadByte() == 0x03) //is the next element a bit string? - { - ReadASNLength(reader); //skip the size - reader.ReadByte(); //skip unused bits indicator - if (reader.ReadByte() == 0x30) - { - ReadASNLength(reader); //skip the size - if (reader.ReadByte() == 0x02) //is it an integer? - { - int modulusSize = ReadASNLength(reader); - byte[] modulus = new byte[modulusSize]; - reader.Read(modulus, 0, modulus.Length); - if (modulus[0] == 0x00) //strip off the first byte if it's 0 - { - byte[] tempModulus = new byte[modulus.Length - 1]; - Array.Copy(modulus, 1, tempModulus, 0, modulus.Length - 1); - modulus = tempModulus; - } - - if (reader.ReadByte() == 0x02) //is it an integer? - { - int exponentSize = ReadASNLength(reader); - byte[] exponent = new byte[exponentSize]; - reader.Read(exponent, 0, exponent.Length); - - RSACryptoServiceProvider RSA = new(); - RSAParameters RSAKeyInfo = new() - { - Modulus = modulus, - Exponent = exponent - }; - RSA.ImportParameters(RSAKeyInfo); - return RSA; - } - } - } - } - return null; - } - - /// - /// Subfunction for decrypting ASN.1 (x509) RSA certificate data fields lengths - /// - /// StreamReader containing the stream to decode - /// Return the read length - - private static int ReadASNLength(System.IO.BinaryReader reader) - { - //Note: this method only reads lengths up to 4 bytes long as - //this is satisfactory for the majority of situations. - int length = reader.ReadByte(); - if ((length & 0x00000080) == 0x00000080) //is the length greater than 1 byte - { - int count = length & 0x0000000f; - byte[] lengthBytes = new byte[4]; - reader.Read(lengthBytes, 4 - count, count); - Array.Reverse(lengthBytes); // - length = BitConverter.ToInt32(lengthBytes, 0); - } - return length; - } - - /// - /// Generate a new random AES key for symmetric encryption - /// - /// Returns a byte array containing the key - - public static byte[] GenerateAESPrivateKey() - { - Aes AES = Aes.Create(); - AES.KeySize = 128; - AES.GenerateKey(); - return AES.Key; - } - - /// - /// Get a SHA-1 hash for online-mode session checking - /// - /// Server ID hash - /// Server's RSA key - /// Secret key chosen by the client - /// Returns the corresponding SHA-1 hex hash - - public static string GetServerHash(string serverID, byte[] PublicKey, byte[] SecretKey) - { - byte[] hash = Digest(new byte[][] { Encoding.GetEncoding("iso-8859-1").GetBytes(serverID), SecretKey, PublicKey }); - bool negative = (hash[0] & 0x80) == 0x80; - if (negative) { hash = TwosComplementLittleEndian(hash); } - string result = GetHexString(hash).TrimStart('0'); - if (negative) { result = "-" + result; } - return result; - } - - /// - /// Generate a SHA-1 hash using several byte arrays - /// - /// array of byte arrays to hash - /// Returns the hashed data - - private static byte[] Digest(byte[][] tohash) - { - SHA1 sha1 = SHA1.Create(); - for (int i = 0; i < tohash.Length; i++) - sha1.TransformBlock(tohash[i], 0, tohash[i].Length, tohash[i], 0); - sha1.TransformFinalBlock(Array.Empty(), 0, 0); - return sha1.Hash!; - } - - /// - /// Converts a byte array to its hex string representation - /// - /// Byte array to convert - /// Returns the string representation - - private static string GetHexString(byte[] p) - { - string result = string.Empty; - for (int i = 0; i < p.Length; i++) - result += p[i].ToString("x2"); - return result; - } - - /// - /// Compute the two's complement of a little endian byte array - /// - /// Byte array to compute - /// Returns the corresponding two's complement - - private static byte[] TwosComplementLittleEndian(byte[] p) - { - int i; - bool carry = true; - for (i = p.Length - 1; i >= 0; i--) - { - p[i] = (byte)~p[i]; - if (carry) - { - carry = p[i] == 0xFF; - p[i]++; - } - } - return p; - } - } -} diff --git a/MinecraftClient/Crypto/FastAes.cs b/MinecraftClient/Crypto/FastAes.cs deleted file mode 100644 index e423caab0c..0000000000 --- a/MinecraftClient/Crypto/FastAes.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Runtime.Intrinsics; -using System.Runtime.Intrinsics.X86; - -namespace MinecraftClient.Crypto -{ - // Using the AES-NI instruction set - // https://gist.github.com/Thealexbarney/9f75883786a9f3100408ff795fb95d85 - public class FastAes - { - private Vector128[] RoundKeys { get; } - - public FastAes(Span key) - { - RoundKeys = KeyExpansion(key); - } - - /// - /// Detects if the required instruction set is supported - /// - /// Is it supported - public static bool IsSupported() - { - return Sse2.IsSupported && Aes.IsSupported; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public void EncryptEcb(ReadOnlySpan plaintext, Span destination) - { - Vector128[] keys = RoundKeys; - - ReadOnlySpan> blocks = MemoryMarshal.Cast>(plaintext); - Span> dest = MemoryMarshal.Cast>(destination); - - // Makes the JIT remove all the other range checks on keys - _ = keys[10]; - - for (int i = 0; i < blocks.Length; i++) - { - Vector128 b = blocks[i]; - - b = Sse2.Xor(b, keys[0]); - b = Aes.Encrypt(b, keys[1]); - b = Aes.Encrypt(b, keys[2]); - b = Aes.Encrypt(b, keys[3]); - b = Aes.Encrypt(b, keys[4]); - b = Aes.Encrypt(b, keys[5]); - b = Aes.Encrypt(b, keys[6]); - b = Aes.Encrypt(b, keys[7]); - b = Aes.Encrypt(b, keys[8]); - b = Aes.Encrypt(b, keys[9]); - b = Aes.EncryptLast(b, keys[10]); - - dest[i] = b; - } - } - - private static Vector128[] KeyExpansion(Span key) - { - var keys = new Vector128[20]; - - keys[0] = Unsafe.ReadUnaligned>(ref key[0]); - - ExpandRound(keys, 1, Aes.KeygenAssist(keys[0], 0x01)); - ExpandRound(keys, 2, Aes.KeygenAssist(keys[1], 0x02)); - ExpandRound(keys, 3, Aes.KeygenAssist(keys[2], 0x04)); - ExpandRound(keys, 4, Aes.KeygenAssist(keys[3], 0x08)); - ExpandRound(keys, 5, Aes.KeygenAssist(keys[4], 0x10)); - ExpandRound(keys, 6, Aes.KeygenAssist(keys[5], 0x20)); - ExpandRound(keys, 7, Aes.KeygenAssist(keys[6], 0x40)); - ExpandRound(keys, 8, Aes.KeygenAssist(keys[7], 0x80)); - ExpandRound(keys, 9, Aes.KeygenAssist(keys[8], 0x1b)); - ExpandRound(keys, 10, Aes.KeygenAssist(keys[9], 0x36)); - - for (int i = 1; i < 10; i++) - { - keys[10 + i] = Aes.InverseMixColumns(keys[i]); - } - - return keys; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static void ExpandRound(Vector128[] keys, int i, Vector128 assist) - { - Vector128 s = keys[i - 1]; - Vector128 t = Sse2.Shuffle(assist.AsUInt32(), 0xFF).AsByte(); - - s = Sse2.Xor(s, Sse2.ShiftLeftLogical128BitLane(s, 4)); - s = Sse2.Xor(s, Sse2.ShiftLeftLogical128BitLane(s, 8)); - - keys[i] = Sse2.Xor(s, t); - } - } -} diff --git a/MinecraftClient/Dialogs/DialogFormatter.cs b/MinecraftClient/Dialogs/DialogFormatter.cs deleted file mode 100644 index 9e836e3e29..0000000000 --- a/MinecraftClient/Dialogs/DialogFormatter.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System; -using System.Linq; -using System.Text; - -namespace MinecraftClient.Dialogs; - -public static class DialogFormatter -{ - public static string DisplayTitle(this DialogDefinition definition) - { - if (!string.IsNullOrWhiteSpace(definition.ExternalTitle)) - return definition.ExternalTitle!; - - return string.IsNullOrWhiteSpace(definition.Title) ? DisplayType(definition.Type) : definition.Title; - } - - private const int BoxWidth = 50; - - public static string Render(DialogInstance instance) - { - StringBuilder builder = new(); - string border = new('-', BoxWidth); - builder.AppendLine(border); - builder.AppendLine(" " + string.Format(Translations.dialog_render_header, instance.Revision, instance.Phase, instance.Definition.DisplayTitle())); - builder.AppendLine(border); - - foreach (var body in instance.Definition.Body.Where(static body => !string.IsNullOrWhiteSpace(body.Text))) - builder.AppendLine(body.Text); - - if (instance.Definition.Inputs.Count > 0) - { - builder.AppendLine(Translations.dialog_render_inputs); - foreach (var input in instance.Definition.Inputs) - { - instance.Values.TryGetValue(input.Key, out var value); - value ??= input.InitialValue; - builder.AppendLine(string.Format(Translations.dialog_render_input, input.Key, DescribeKind(input.Kind), input.Label, value, DescribeInput(input))); - } - } - - if (instance.Definition.Actions.Count > 0) - { - builder.AppendLine(Translations.dialog_render_actions); - foreach (var action in instance.Definition.Actions) - builder.AppendLine(string.Format(Translations.dialog_render_action, action.Index, action.Label, DescribeAction(action.Action))); - } - - builder.AppendLine(); - builder.AppendLine("§o" + Translations.dialog_render_help_hint + "§r"); - builder.Append(border); - return builder.ToString(); - } - - public static string DisplayType(string rawType) - { - return rawType switch - { - "minecraft:notice" => Translations.dialog_type_notice, - "minecraft:confirmation" => Translations.dialog_type_confirmation, - "minecraft:multi_action" => Translations.dialog_type_multi_action, - "minecraft:dialog_list" => Translations.dialog_type_dialog_list, - "minecraft:server_links" => Translations.dialog_type_server_links, - _ => string.IsNullOrEmpty(rawType) ? Translations.dialog_type_unknown : rawType - }; - } - - private static string DescribeKind(DialogInputKind kind) - { - return kind switch - { - DialogInputKind.Text => Translations.dialog_input_kind_text, - DialogInputKind.Boolean => Translations.dialog_input_kind_boolean, - DialogInputKind.SingleOption => Translations.dialog_input_kind_options, - DialogInputKind.NumberRange => Translations.dialog_input_kind_number, - _ => Translations.dialog_input_kind_unknown - }; - } - - private static string DescribeInput(DialogInput input) - { - return input.Kind switch - { - DialogInputKind.Text => string.Format(Translations.dialog_input_desc_text, input.MaxLength), - DialogInputKind.Boolean => string.Format(Translations.dialog_input_desc_boolean, input.OnTrue, input.OnFalse), - DialogInputKind.SingleOption => string.Format(Translations.dialog_input_desc_options, - string.Join(", ", input.Options?.Select(static option => option.Id) ?? [])), - DialogInputKind.NumberRange => string.Format(Translations.dialog_input_desc_number, input.Start, input.End), - _ => input.Type ?? Translations.dialog_input_desc_unknown - }; - } - - private static string DescribeAction(DialogActionDefinition? action) - { - if (action is null) - return Translations.dialog_action_desc_close; - - return action.Kind switch - { - DialogActionKind.RunCommand => Translations.dialog_action_desc_command, - DialogActionKind.CustomClick => Translations.dialog_action_desc_custom, - DialogActionKind.ShowDialog => Translations.dialog_action_desc_show_dialog, - DialogActionKind.OpenUrl => Translations.dialog_action_desc_open_url, - DialogActionKind.SuggestCommand => Translations.dialog_action_desc_suggest, - DialogActionKind.CopyToClipboard => Translations.dialog_action_desc_copy, - _ => action.Type ?? Translations.dialog_action_desc_unknown - }; - } -} diff --git a/MinecraftClient/Dialogs/DialogManager.cs b/MinecraftClient/Dialogs/DialogManager.cs deleted file mode 100644 index 40876b61b9..0000000000 --- a/MinecraftClient/Dialogs/DialogManager.cs +++ /dev/null @@ -1,445 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Threading; - -namespace MinecraftClient.Dialogs; - -public sealed class DialogManager -{ - private readonly McClient _client; - private readonly Lock _lock = new(); - private readonly Dictionary _registryById = new(); - private readonly Dictionary _registryByName = new(StringComparer.Ordinal); - private readonly List _serverLinks = []; - private DialogInstance? _current; - private int _revision; - - public DialogManager(McClient client) - { - ArgumentNullException.ThrowIfNull(client); - _client = client; - } - - public event Action? DialogShown; - public event Action? DialogCleared; - - public DialogInstance? Current - { - get - { - lock (_lock) - return _current; - } - } - - public void StoreRegistryDialog(int protocolId, string resourceId, DialogDefinition definition) - { - lock (_lock) - { - _registryById[protocolId] = definition; - _registryByName[resourceId] = definition; - } - } - - public void ClearRegistry() - { - lock (_lock) - { - _registryById.Clear(); - _registryByName.Clear(); - } - } - - public void SetServerLinks(IEnumerable links) - { - lock (_lock) - { - _serverLinks.Clear(); - _serverLinks.AddRange(links); - } - } - - public DialogInstance Show(DialogDefinition definition, DialogPhase phase) - { - DialogInstance instance; - lock (_lock) - { - var expanded = ExpandServerLinks(definition); - var values = expanded.Inputs.ToDictionary(static input => input.Key, static input => input.InitialValue, StringComparer.Ordinal); - instance = new DialogInstance(++_revision, phase, expanded, values, DateTimeOffset.UtcNow); - _current = instance; - } - - _client.Log.Info("§e" + string.Format(Translations.dialog_received, instance.Definition.DisplayTitle())); - DialogShown?.Invoke(instance); - return instance; - } - - public DialogInstance ShowRegistryReference(int protocolId, DialogPhase phase) - { - DialogDefinition? definition; - lock (_lock) - _registryById.TryGetValue(protocolId, out definition); - - if (definition is not null) - return Show(definition, phase); - - var unresolved = new DialogDefinition( - "minecraft:unresolved", - string.Format(CultureInfo.InvariantCulture, Translations.dialog_unresolved_title, protocolId), - null, - CanCloseWithEscape: true, - Pause: false, - DialogAfterAction.Close, - [new DialogBody(DialogBodyKind.Unknown, string.Format(CultureInfo.InvariantCulture, Translations.dialog_unresolved_body, protocolId))], - [], - [], - null, - IsResolved: false, - UnresolvedReference: protocolId.ToString(CultureInfo.InvariantCulture)); - return Show(unresolved, phase); - } - - public void Clear() - { - int revision; - lock (_lock) - { - revision = _current?.Revision ?? _revision; - _current = null; - } - - _client.Log.Info(Translations.dialog_cleared); - DialogCleared?.Invoke(revision); - } - - public DialogActionResult Dismiss() - { - int revision; - lock (_lock) - { - if (_current is null) - return new DialogActionResult(false, Translations.dialog_none); - - revision = _current.Revision; - _current = null; - } - - DialogCleared?.Invoke(revision); - return new DialogActionResult(true, Translations.dialog_dismissed); - } - - public DialogActionResult SetInput(string key, string value) - { - lock (_lock) - { - if (_current is null) - return new DialogActionResult(false, Translations.dialog_none); - - var input = _current.Definition.Inputs.FirstOrDefault(input => input.Key.Equals(key, StringComparison.Ordinal)); - if (input is null) - return new DialogActionResult(false, string.Format(Translations.dialog_input_unknown, key)); - - var normalized = NormalizeInputValue(input, value, out var error); - if (error is not null) - return new DialogActionResult(false, error); - - var values = _current.Values.ToDictionary(static pair => pair.Key, static pair => pair.Value, StringComparer.Ordinal); - values[key] = normalized; - _current = _current with { Values = values }; - return new DialogActionResult(true, string.Format(Translations.dialog_input_set, key, normalized)); - } - } - - public DialogActionResult Click(int index) - { - DialogButton? button; - DialogInstance? instance; - lock (_lock) - { - instance = _current; - button = instance?.Definition.Actions.FirstOrDefault(action => action.Index == index); - } - - if (instance is null) - return new DialogActionResult(false, Translations.dialog_none); - - if (button is null) - return new DialogActionResult(false, string.Format(Translations.dialog_action_unknown, index)); - - return Execute(instance, button.Action, ShouldCloseAfterAction(instance.Definition.AfterAction)); - } - - public DialogActionResult ClickLabel(string label) - { - DialogButton[] matches; - DialogInstance? instance; - lock (_lock) - { - instance = _current; - matches = instance?.Definition.Actions - .Where(action => action.Label.Equals(label, StringComparison.OrdinalIgnoreCase)) - .ToArray() ?? []; - } - - if (instance is null) - return new DialogActionResult(false, Translations.dialog_none); - - return matches.Length switch - { - 0 => new DialogActionResult(false, string.Format(Translations.dialog_action_label_unknown, label)), - > 1 => new DialogActionResult(false, string.Format(Translations.dialog_action_label_ambiguous, label)), - _ => Execute(instance, matches[0].Action, ShouldCloseAfterAction(instance.Definition.AfterAction)) - }; - } - - public DialogActionResult Cancel() - { - DialogInstance? instance; - lock (_lock) - instance = _current; - - if (instance is null) - return new DialogActionResult(false, Translations.dialog_none); - - if (!instance.Definition.CanCloseWithEscape && instance.Definition.CancelAction is null) - return new DialogActionResult(false, Translations.dialog_cannot_cancel); - - return Execute(instance, instance.Definition.CancelAction, closeWhenDone: true); - } - - private DialogActionResult Execute(DialogInstance instance, DialogActionDefinition? action, bool closeWhenDone) - { - if (!instance.Definition.IsResolved) - return new DialogActionResult(false, Translations.dialog_unresolved_action_disabled); - - if (action is null || action.Kind == DialogActionKind.None) - { - if (closeWhenDone) - _ = Dismiss(); - return new DialogActionResult(true, Translations.dialog_action_closed); - } - - var values = BuildActionValues(instance); - switch (action.Kind) - { - case DialogActionKind.RunCommand: - if (instance.Phase != DialogPhase.Play) - return new DialogActionResult(false, Translations.dialog_action_command_not_in_play); - - var command = ApplyTemplate(action.Value ?? string.Empty, values.TemplateValues); - _client.SendText(command); - if (closeWhenDone) - _ = Dismiss(); - return new DialogActionResult(true, string.Format(Translations.dialog_action_command_sent, command)); - - case DialogActionKind.CustomClick: - if (action.Id is null) - return new DialogActionResult(false, Translations.dialog_action_invalid); - - var payload = action.Type == "minecraft:custom" && action.Payload is null && values.TagValues.Count == 0 - ? null - : MergePayload(action.Payload, values.TagValues); - if (!_client.SendCustomClickAction(action.Id, payload)) - return new DialogActionResult(false, Translations.dialog_action_custom_failed); - - if (closeWhenDone) - _ = Dismiss(); - return new DialogActionResult(true, string.Format(Translations.dialog_action_custom_sent, action.Id)); - - case DialogActionKind.ShowDialog: - if (action.NestedDialog is not null) - { - Show(action.NestedDialog, instance.Phase); - return new DialogActionResult(true, Translations.dialog_action_nested_opened); - } - - if (action.DialogReferenceId is int referenceId) - { - ShowRegistryReference(referenceId, instance.Phase); - return new DialogActionResult(true, Translations.dialog_action_nested_opened); - } - - if (action.Value is not null) - { - DialogDefinition? referencedDialog; - lock (_lock) - _registryByName.TryGetValue(action.Value, out referencedDialog); - - if (referencedDialog is not null) - { - Show(referencedDialog, instance.Phase); - return new DialogActionResult(true, Translations.dialog_action_nested_opened); - } - } - - return new DialogActionResult(false, Translations.dialog_action_invalid); - - case DialogActionKind.OpenUrl: - return new DialogActionResult(true, string.Format(Translations.dialog_action_open_url, action.Value ?? string.Empty)); - - case DialogActionKind.SuggestCommand: - return new DialogActionResult(true, string.Format(Translations.dialog_action_suggest_command, action.Value ?? string.Empty)); - - case DialogActionKind.CopyToClipboard: - return new DialogActionResult(true, string.Format(Translations.dialog_action_copy, action.Value ?? string.Empty)); - - default: - return new DialogActionResult(false, string.Format(Translations.dialog_action_unsupported, action.Type ?? action.Kind.ToString())); - } - } - - private static bool ShouldCloseAfterAction(DialogAfterAction afterAction) - { - return afterAction == DialogAfterAction.Close; - } - - private DialogDefinition ExpandServerLinks(DialogDefinition definition) - { - if (!definition.Type.Equals("minecraft:server_links", StringComparison.Ordinal)) - return definition; - - var linkActions = _serverLinks - .Select((link, index) => new DialogButton( - index + 1, - link.Label, - new DialogActionDefinition(DialogActionKind.OpenUrl, Value: link.Url))) - .ToList(); - - if (definition.Actions.Count > 0) - linkActions.AddRange(definition.Actions.Select((button, i) => button with { Index = linkActions.Count + i + 1 })); - - return definition with { Actions = linkActions }; - } - - private static DialogActionValues BuildActionValues(DialogInstance instance) - { - Dictionary templateValues = new(StringComparer.Ordinal); - Dictionary tagValues = new(StringComparer.Ordinal); - - foreach (var input in instance.Definition.Inputs) - { - instance.Values.TryGetValue(input.Key, out var value); - value ??= input.InitialValue; - templateValues[input.Key] = ToTemplateValue(input, value); - tagValues[input.Key] = ToNbtValue(input, value); - } - - return new DialogActionValues(templateValues, tagValues); - } - - private static Dictionary MergePayload(Dictionary? basePayload, Dictionary inputTags) - { - Dictionary payload = basePayload is null - ? new(StringComparer.Ordinal) - : new(basePayload, StringComparer.Ordinal); - - foreach (var (key, value) in inputTags) - payload[key] = value; - - return payload; - } - - private static string NormalizeInputValue(DialogInput input, string value, out string? error) - { - error = null; - switch (input.Kind) - { - case DialogInputKind.Text: - if (value.Length > input.MaxLength) - { - error = string.Format(Translations.dialog_input_too_long, input.Key, input.MaxLength); - return input.InitialValue; - } - return value; - - case DialogInputKind.Boolean: - if (bool.TryParse(value, out var boolValue)) - return boolValue ? "true" : "false"; - - if (value.Equals(input.OnTrue, StringComparison.OrdinalIgnoreCase)) - return "true"; - - if (value.Equals(input.OnFalse, StringComparison.OrdinalIgnoreCase)) - return "false"; - - error = string.Format(Translations.dialog_input_boolean_invalid, input.Key); - return input.InitialValue; - - case DialogInputKind.SingleOption: - if (input.Options?.Any(option => option.Id.Equals(value, StringComparison.Ordinal)) == true) - return value; - - error = string.Format(Translations.dialog_input_option_invalid, input.Key); - return input.InitialValue; - - case DialogInputKind.NumberRange: - if (!float.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out var number)) - { - error = string.Format(Translations.dialog_input_number_invalid, input.Key); - return input.InitialValue; - } - - var min = Math.Min(input.Start, input.End); - var max = Math.Max(input.Start, input.End); - if (number < min || number > max) - { - error = string.Format(CultureInfo.InvariantCulture, Translations.dialog_input_number_range_invalid, input.Key, min, max); - return input.InitialValue; - } - - return NumberToString(number); - - default: - return value; - } - } - - private static string ToTemplateValue(DialogInput input, string value) - { - return input.Kind switch - { - DialogInputKind.Boolean => value.Equals("true", StringComparison.OrdinalIgnoreCase) ? input.OnTrue : input.OnFalse, - DialogInputKind.Text => EscapeStringTagWithoutQuotes(value), - _ => value - }; - } - - private static object ToNbtValue(DialogInput input, string value) - { - return input.Kind switch - { - DialogInputKind.Boolean => (byte)(value.Equals("true", StringComparison.OrdinalIgnoreCase) ? 1 : 0), - DialogInputKind.NumberRange when float.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out var number) => number, - _ => value - }; - } - - private static string ApplyTemplate(string template, IReadOnlyDictionary values) - { - var result = template; - foreach (var (key, value) in values) - result = result.Replace("$(" + key + ")", value, StringComparison.Ordinal); - - return result; - } - - private static string EscapeStringTagWithoutQuotes(string value) - { - return value.Replace("\\", "\\\\", StringComparison.Ordinal).Replace("\"", "\\\"", StringComparison.Ordinal); - } - - private static string NumberToString(float value) - { - var integer = (int)value; - return integer == value - ? integer.ToString(CultureInfo.InvariantCulture) - : value.ToString(CultureInfo.InvariantCulture); - } - - private sealed record DialogActionValues( - IReadOnlyDictionary TemplateValues, - Dictionary TagValues); -} diff --git a/MinecraftClient/Dialogs/DialogModels.cs b/MinecraftClient/Dialogs/DialogModels.cs deleted file mode 100644 index fc40b480a0..0000000000 --- a/MinecraftClient/Dialogs/DialogModels.cs +++ /dev/null @@ -1,110 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace MinecraftClient.Dialogs; - -public enum DialogPhase -{ - Configuration, - Play -} - -public enum DialogAfterAction -{ - Close, - None, - WaitForResponse -} - -public enum DialogBodyKind -{ - PlainMessage, - Item, - Unknown -} - -public enum DialogInputKind -{ - Text, - Boolean, - SingleOption, - NumberRange, - Unknown -} - -public enum DialogActionKind -{ - None, - RunCommand, - CustomClick, - ShowDialog, - OpenUrl, - SuggestCommand, - CopyToClipboard, - Unknown -} - -public sealed record DialogBody(DialogBodyKind Kind, string Text, string? Type = null); - -public sealed record DialogOption(string Id, string Display, bool Initial) -{ - public override string ToString() - { - return string.IsNullOrWhiteSpace(Display) ? Id : Display; - } -} - -public sealed record DialogInput( - string Key, - DialogInputKind Kind, - string Label, - string InitialValue, - int MaxLength = 32, - bool LabelVisible = true, - bool Multiline = false, - IReadOnlyList? Options = null, - string OnTrue = "true", - string OnFalse = "false", - float Start = 0, - float End = 1, - float? InitialNumber = null, - float? Step = null, - string? Type = null); - -public sealed record DialogActionDefinition( - DialogActionKind Kind, - string? Value = null, - string? Id = null, - Dictionary? Payload = null, - DialogDefinition? NestedDialog = null, - int? DialogReferenceId = null, - string? Type = null); - -public sealed record DialogButton(int Index, string Label, DialogActionDefinition? Action, bool IsCancel = false); - -public sealed record DialogServerLink(string Label, string Url); - -public sealed record DialogDefinition( - string Type, - string Title, - string? ExternalTitle, - bool CanCloseWithEscape, - bool Pause, - DialogAfterAction AfterAction, - IReadOnlyList Body, - IReadOnlyList Inputs, - IReadOnlyList Actions, - DialogActionDefinition? CancelAction, - int Columns = 1, - int ButtonWidth = 150, - bool IsResolved = true, - string? UnresolvedReference = null); - -public sealed record DialogInstance( - int Revision, - DialogPhase Phase, - DialogDefinition Definition, - IReadOnlyDictionary Values, - DateTimeOffset ReceivedAt); - -public sealed record DialogActionResult(bool Success, string Message); diff --git a/MinecraftClient/ExtensionMethods.cs b/MinecraftClient/ExtensionMethods.cs deleted file mode 100644 index f21b97bdf6..0000000000 --- a/MinecraftClient/ExtensionMethods.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Linq; - -namespace MinecraftClient -{ - public static class ExtensionMethods - { - public static string ToUnderscoreCase(this string str) - { - return string.Concat(str.Select((x, i) => i > 0 && char.IsUpper(x) ? "_" + x.ToString() : x.ToString())).ToLower(); - } - } -} diff --git a/MinecraftClient/FileMonitor.cs b/MinecraftClient/FileMonitor.cs deleted file mode 100644 index 16f590a4f1..0000000000 --- a/MinecraftClient/FileMonitor.cs +++ /dev/null @@ -1,161 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Threading; - -namespace MinecraftClient -{ - /// - /// Monitor file changes on disk - /// - public class FileMonitor : IDisposable - { - private readonly Tuple? monitor = null; - private readonly Tuple? polling = null; - - /// - /// Create a new FileMonitor and start monitoring - /// - /// Folder to monitor - /// Filename inside folder - /// Callback for file changes - public FileMonitor(string folder, string filename, FileSystemEventHandler handler) - { - if (Settings.Config.Logging.DebugMessages) - { - string callerClass = new System.Diagnostics.StackFrame(1).GetMethod()!.DeclaringType!.Name; - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.filemonitor_init, callerClass, Path.Combine(folder, filename))); - } - - try - { - monitor = new Tuple(new FileSystemWatcher(), new CancellationTokenSource()); - monitor.Item1.Path = folder; - monitor.Item1.IncludeSubdirectories = false; - monitor.Item1.Filter = filename; - monitor.Item1.NotifyFilter = NotifyFilters.LastWrite; - monitor.Item1.Changed += handler; - monitor.Item1.EnableRaisingEvents = true; - } - catch - { - if (Settings.Config.Logging.DebugMessages) - { - string callerClass = new System.Diagnostics.StackFrame(1).GetMethod()!.DeclaringType!.Name; - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.filemonitor_fail, callerClass)); - } - - monitor = null; - var cancellationTokenSource = new CancellationTokenSource(); - polling = new Tuple(new Thread(() => PollingThread(folder, filename, handler, cancellationTokenSource.Token)), cancellationTokenSource); - polling.Item1.Name = String.Format("{0} Polling thread: {1}", GetType().Name, Path.Combine(folder, filename)); - polling.Item1.Start(); - } - } - - /// - /// Stop monitoring and dispose the inner resources - /// - public void Dispose() - { - if (monitor is not null) - monitor.Item1.Dispose(); - if (polling is not null) - polling.Item2.Cancel(); - } - - /// - /// Fallback polling thread for use when operating system does not support FileSystemWatcher - /// - /// Folder to monitor - /// File name to monitor - /// Callback when file changes - private void PollingThread(string folder, string filename, FileSystemEventHandler handler, CancellationToken cancellationToken) - { - string filePath = Path.Combine(folder, filename); - DateTime lastWrite = GetLastWrite(filePath); - while (!cancellationToken.IsCancellationRequested) - { - Thread.Sleep(5000); - DateTime lastWriteNew = GetLastWrite(filePath); - if (lastWriteNew != lastWrite) - { - lastWrite = lastWriteNew; - handler(this, new FileSystemEventArgs(WatcherChangeTypes.Changed, folder, filename)); - } - } - } - - /// - /// Get last write for a given file - /// - /// File path to get last write from - /// Last write time, or DateTime.MinValue if the file does not exist - private DateTime GetLastWrite(string path) - { - FileInfo fileInfo = new(path); - if (fileInfo.Exists) - { - return fileInfo.LastWriteTime; - } - else return DateTime.MinValue; - } - - /// - /// Opens a text file, reads all lines of the file, and then closes the file. Retry several times if the file is in use - /// - /// The file to open for reading - /// Maximum read attempts - /// Encoding (default is UTF8) - /// Thrown when failing to read the file despite multiple retries - /// All lines - public static string[] ReadAllLinesWithRetries(string filePath, int maxTries = 3, Encoding? encoding = null) - { - int attempt = 0; - encoding ??= Encoding.UTF8; - while (true) - { - try - { - return File.ReadAllLines(filePath, encoding); - } - catch (IOException) - { - attempt++; - if (attempt < maxTries) - Thread.Sleep(new Random().Next(50, 100) * attempt); // Back-off like CSMA/CD - else throw; - } - } - } - - /// - /// Creates a new file, writes a collection of strings to the file, and then closes the file. - /// - /// The file to open for writing - /// The lines to write to the file - /// Maximum read attempts - /// Encoding (default is UTF8) - public static void WriteAllLinesWithRetries(string filePath, IEnumerable lines, int maxTries = 3, Encoding? encoding = null) - { - int attempt = 0; - encoding ??= Encoding.UTF8; - while (true) - { - try - { - File.WriteAllLines(filePath, lines, encoding); - return; - } - catch (IOException) - { - attempt++; - if (attempt < maxTries) - Thread.Sleep(new Random().Next(50, 100) * attempt); // Back-off like CSMA/CD - else throw; - } - } - } - } -} diff --git a/MinecraftClient/IConsoleBackend.cs b/MinecraftClient/IConsoleBackend.cs deleted file mode 100644 index 0fd2338928..0000000000 --- a/MinecraftClient/IConsoleBackend.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System; - -namespace MinecraftClient -{ - /// - /// Input buffer state passed with OnInputChange events. - /// - public readonly struct ConsoleInputBuffer - { - public string Text { get; } - public int CursorPosition { get; } - - public ConsoleInputBuffer(string text, int cursorPosition) - { - Text = text; - CursorPosition = cursorPosition; - } - } - - /// - /// Backend-independent suggestion item used by the TUI autocomplete popup. - /// Mirrors the shape of ConsoleInteractive.ConsoleSuggestion.Suggestion - /// without requiring a dependency on the ConsoleInteractive assembly. - /// - public readonly struct CommandSuggestion - { - public string Text { get; } - public string Tooltip { get; } - - public CommandSuggestion(string text, string tooltip = "") - { - Text = text; - Tooltip = tooltip; - } - } - - /// - /// Abstraction over the console I/O backend. - /// Implementations: ClassicConsoleBackend (ConsoleInteractive), TuiConsoleBackend (Avalonia/Consolonia), BasicConsoleBackend (stdio). - /// - public interface IConsoleBackend - { - void Init(); - - void WriteLine(string text); - - void WriteLineFormatted(string text); - - void BeginReadThread(); - - void StopReadThread(); - - event EventHandler? MessageReceived; - - event EventHandler? OnInputChange; - - string RequestImmediateInput(); - - string? ReadPassword(); - - void ClearInputBuffer(); - - void ClearScreen(); - - bool DisplayUserInput { get; set; } - - void SetInputVisible(bool visible); - - void SetBackreadBufferLimit(int limit); - - void Shutdown(); - } -} diff --git a/MinecraftClient/INIFile.cs b/MinecraftClient/INIFile.cs deleted file mode 100644 index 87f8de7ec9..0000000000 --- a/MinecraftClient/INIFile.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; - -namespace MinecraftClient -{ - /// - /// INI File tools for parsing and generating user-friendly INI files - /// By ORelio (c) 2014-2020 - CDDL 1.0 - /// - static class INIFile - { - /// - /// Parse a INI file into a dictionary. - /// Values can be accessed like this: dict["section"]["setting"] - /// - /// INI file to parse - /// INI sections and keys will be converted to lowercase unless this parameter is set to false - /// If failed to read the file - /// Parsed data from INI file - public static Dictionary> ParseFile(string iniFile, bool lowerCase = true) - { - return ParseFile(File.ReadAllLines(iniFile, Encoding.UTF8), lowerCase); - } - - /// - /// Parse a INI file into a dictionary. - /// Values can be accessed like this: dict["section"]["setting"] - /// - /// INI file content to parse - /// INI sections and keys will be converted to lowercase unless this parameter is set to false - /// If failed to read the file - /// Parsed data from INI file - public static Dictionary> ParseFile(IEnumerable lines, bool lowerCase = true) - { - var iniContents = new Dictionary>(); - string iniSection = "default"; - foreach (string lineRaw in lines) - { - string line = lineRaw.Split('#')[0].Trim(); - if (line.Length > 0 && line[0] != ';') - { - if (line[0] == '[' && line[^1] == ']') - { - iniSection = line[1..^1]; - if (lowerCase) - iniSection = iniSection.ToLower(); - } - else - { - string argName = line.Split('=')[0]; - if (lowerCase) - argName = argName.ToLower(); - if (line.Length > (argName.Length + 1)) - { - string argValue = line[(argName.Length + 1)..]; - if (!iniContents.ContainsKey(iniSection)) - iniContents[iniSection] = new Dictionary(); - iniContents[iniSection][argName] = argValue; - } - } - } - } - return iniContents; - } - - /// - /// Write given data into an INI file - /// - /// File to write into - /// Data to put into the file - /// INI file description, inserted as a comment on first line of the INI file - /// Automatically change first char of section and keys to uppercase - public static void WriteFile(string iniFile, Dictionary> contents, string? description = null, bool autoCase = true) - { - File.WriteAllLines(iniFile, Generate(contents, description, autoCase), Encoding.UTF8); - } - - /// - /// Generate given data into the INI format - /// - /// Data to put into the INI format - /// INI file description, inserted as a comment on first line of the INI file - /// Automatically change first char of section and keys to uppercase - /// Lines of the INI file - public static string[] Generate(Dictionary> contents, string? description = null, bool autoCase = true) - { - List lines = new(); - if (!String.IsNullOrWhiteSpace(description)) - lines.Add('#' + description); - foreach (var section in contents) - { - if (lines.Count > 0) - lines.Add(""); - if (!String.IsNullOrEmpty(section.Key)) - { - lines.Add("[" + (autoCase ? char.ToUpper(section.Key[0]) + section.Key[1..] : section.Key) + ']'); - foreach (var item in section.Value) - if (!String.IsNullOrEmpty(item.Key)) - lines.Add((autoCase ? char.ToUpper(item.Key[0]) + item.Key[1..] : item.Key) + '=' + item.Value); - } - } - return lines.ToArray(); - } - - /// - /// Convert an integer from a string or return 0 if failed to parse - /// - /// String to parse - /// Int value - public static int Str2Int(string str) - { - try - { - return Convert.ToInt32(str); - } - catch - { - return 0; - } - } - - /// - /// Convert a 0/1 or True/False value to boolean - /// - /// String to parse - /// Boolean value - public static bool Str2Bool(string str) - { - return str.ToLower() == "true" || str == "1"; - } - } -} diff --git a/MinecraftClient/Inventory/BookContent.cs b/MinecraftClient/Inventory/BookContent.cs deleted file mode 100644 index 262e468002..0000000000 --- a/MinecraftClient/Inventory/BookContent.cs +++ /dev/null @@ -1,183 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.Json; -using MinecraftClient.Protocol.Handlers; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; -using MinecraftClient.Protocol.Message; - -namespace MinecraftClient.Inventory; - -public enum BookHand -{ - Main = 0, - Off = 1 -} - -public sealed record BookLimits(int MaxPages, int MaxPageLength, int MaxTitleLength) -{ - public static BookLimits ForProtocol(int protocolVersion) - { - int maxPageLength = protocolVersion switch - { - >= Protocol18Handler.MC_1_21_2_Version => 1024, - >= Protocol18Handler.MC_1_17_Version => 8192, - _ => 32767 - }; - - int maxTitleLength = protocolVersion switch - { - >= Protocol18Handler.MC_1_21_2_Version => 32, - >= Protocol18Handler.MC_1_17_Version => 128, - _ => 16 - }; - - return new BookLimits(100, maxPageLength, maxTitleLength); - } -} - -public sealed record BookContent( - IReadOnlyList Pages, - string? Title, - string? Author, - int Generation, - bool IsSigned) -{ - public static BookContent EmptyWritable { get; } = new([string.Empty], null, null, 0, false); -} - -public static class BookContentHelper -{ - public static bool IsBook(Item? item) => item?.Type is ItemType.WritableBook or ItemType.WrittenBook; - - public static bool IsWritableBook(Item? item) => item?.Type == ItemType.WritableBook; - - public static bool TryRead(Item? item, out BookContent content) - { - content = BookContent.EmptyWritable; - - if (item is null || item.IsEmpty) - return false; - - return item.Type switch - { - ItemType.WritableBook => TryReadWritable(item, out content), - ItemType.WrittenBook => TryReadWritten(item, out content), - _ => false - }; - } - - public static Item CreateWritablePayload(Item currentBook, IReadOnlyList pages) - { - return new Item(ItemType.WritableBook, 1, currentBook.Data, new Dictionary - { - ["pages"] = pages.Cast().ToArray() - }); - } - - public static Item CreateWrittenPayload(Item currentBook, IReadOnlyList pages, string title, string author, bool encodePagesAsJson) - { - object[] encodedPages = pages - .Select(page => encodePagesAsJson ? ToJsonTextComponent(page) : page) - .Cast() - .ToArray(); - - return new Item(ItemType.WrittenBook, 1, currentBook.Data, new Dictionary - { - ["author"] = author, - ["title"] = title, - ["pages"] = encodedPages - }); - } - - public static IReadOnlyList NormalizePages(IEnumerable pages) - { - string[] normalized = pages.Select(page => page ?? string.Empty).ToArray(); - return normalized.Length == 0 ? [string.Empty] : normalized; - } - - private static bool TryReadWritable(Item item, out BookContent content) - { - if (item.Components is not null) - { - var component = item.Components.OfType().FirstOrDefault(); - if (component is not null) - { - content = new BookContent( - NormalizePages(component.Pages.Select(page => page.RawContent)), - null, - null, - 0, - IsSigned: false); - return true; - } - } - - content = new BookContent(ReadStringList(item.NBT, "pages", parseJson: false), null, null, 0, IsSigned: false); - return true; - } - - private static bool TryReadWritten(Item item, out BookContent content) - { - if (item.Components is not null) - { - var component = item.Components.OfType().FirstOrDefault(); - if (component is not null) - { - content = new BookContent( - NormalizePages(component.Pages.Select(page => page.RawContent)), - component.RawTitle, - component.Author, - component.Generation, - IsSigned: true); - return true; - } - } - - string? title = ReadString(item.NBT, "title"); - string? author = ReadString(item.NBT, "author"); - int generation = ReadInt(item.NBT, "generation"); - content = new BookContent(ReadStringList(item.NBT, "pages", parseJson: true), title, author, generation, IsSigned: true); - return true; - } - - private static IReadOnlyList ReadStringList(Dictionary? nbt, string key, bool parseJson) - { - if (nbt is null || !nbt.TryGetValue(key, out object? value) || value is not object[] values) - return [string.Empty]; - - string[] pages = values - .Select(value => value?.ToString() ?? string.Empty) - .Select(value => parseJson ? ChatParser.ParseText(value) : value) - .ToArray(); - - return pages.Length == 0 ? [string.Empty] : pages; - } - - private static string? ReadString(Dictionary? nbt, string key) - { - return nbt is not null && nbt.TryGetValue(key, out object? value) - ? value?.ToString() - : null; - } - - private static int ReadInt(Dictionary? nbt, string key) - { - if (nbt is null || !nbt.TryGetValue(key, out object? value) || value is null) - return 0; - - return value switch - { - int i => i, - short s => s, - byte b => b, - _ when int.TryParse(value.ToString(), out int parsed) => parsed, - _ => 0 - }; - } - - private static string ToJsonTextComponent(string text) - { - return JsonSerializer.Serialize(new Dictionary { ["text"] = text }); - } -} diff --git a/MinecraftClient/Inventory/BookPage.cs b/MinecraftClient/Inventory/BookPage.cs deleted file mode 100644 index 9240d77e67..0000000000 --- a/MinecraftClient/Inventory/BookPage.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory; - -public record BookPage( - string RawContent, - bool HasFilteredContent, - string? FilteredContent, - Dictionary? RawContentNbt = null, - Dictionary? FilteredContentNbt = null); \ No newline at end of file diff --git a/MinecraftClient/Inventory/Container.cs b/MinecraftClient/Inventory/Container.cs deleted file mode 100644 index f2258fee63..0000000000 --- a/MinecraftClient/Inventory/Container.cs +++ /dev/null @@ -1,271 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory -{ - /// - /// Represents a Minecraft inventory (player inventory, chest, etc.) - /// - public class Container - { - /// - /// ID of the container on the server - /// - public int ID; - - /// - /// Type of container - /// - public ContainerType Type; - - /// - /// title of container - /// - public string? Title; - - /// - /// state of container - /// - public int StateID; - - /// - /// Container Items - /// - public Dictionary Items; - - /// - /// Container Properties - /// Used for Frunaces, Enchanting Table, Beacon, Brewing stand, Stone cutter, Loom and Lectern - /// More info about: https://wiki.vg/Protocol#Set_Container_Property - /// - public Dictionary Properties; - - /// - /// Create an empty container with ID, Type and Title - /// - /// Container ID - /// Container Type - /// Container Title - public Container(int id, ContainerType type, string title) - { - ID = id; - Type = type; - Title = title; - Items = new(); - Properties = new(); - } - - /// - /// Create a container with ID, Type, Title and Items - /// - /// Container ID - /// Container Type - /// Container Title - /// Container Items (key: slot ID, value: item info) - public Container(int id, ContainerType type, string? title, Dictionary items) - { - ID = id; - Type = type; - Title = title; - Items = items; - Properties = new(); - } - - /// - /// Create an empty container with ID, Type and Title - /// - /// Container ID - /// Container Type - /// Container title - public Container(int id, ContainerTypeOld type, string title) - { - ID = id; - Title = title; - Type = ConvertType.ToNew(type); - Items = new(); - Properties = new(); - } - - /// - /// Create an empty container with ID, Type and Title - /// - /// Container ID - /// Container Type - /// Container Title - /// Protocol version for version-specific mapping - public Container(int id, int typeID, string title, int protocolVersion = 0) - { - ID = id; - Type = GetContainerType(typeID, protocolVersion); - Title = title; - Items = new(); - Properties = new(); - } - - /// - /// Create an empty container with Type - /// - /// Container Type - public Container(ContainerType type) - { - ID = -1; - Type = type; - Title = null; - Items = new(); - Properties = new(); - } - - /// - /// Create an empty container with T^ype and Items - /// - /// Container Type - /// Container Items (key: slot ID, value: item info) - public Container(ContainerType type, Dictionary items) - { - ID = -1; - Type = type; - Title = null; - Items = items; - Properties = new(); - } - - /// - /// Get container type from Type ID - /// - /// Container Type ID - /// Protocol version (menu registry changed across versions) - /// Container Type - public static ContainerType GetContainerType(int typeID, int protocolVersion = 0) - { - // MC 1.20.4 (protocol 765) added crafter_3x3 at index 7, shifting all subsequent IDs by +1. - // Registry order from decompiled MenuType.java: - // 1.14-1.20.2: generic_9x1..generic_3x3(6), anvil(7), beacon(8), ... stonecutter(22) - // 1.20.4+: generic_9x1..generic_3x3(6), crafter_3x3(7), anvil(8), beacon(9), ... stonecutter(24) - if (protocolVersion >= 765) - { - return typeID switch - { -#pragma warning disable format // @formatter:off - 0 => ContainerType.Generic_9x1, - 1 => ContainerType.Generic_9x2, - 2 => ContainerType.Generic_9x3, - 3 => ContainerType.Generic_9x4, - 4 => ContainerType.Generic_9x5, - 5 => ContainerType.Generic_9x6, - 6 => ContainerType.Generic_3x3, - 7 => ContainerType.Crafter, - 8 => ContainerType.Anvil, - 9 => ContainerType.Beacon, - 10 => ContainerType.BlastFurnace, - 11 => ContainerType.BrewingStand, - 12 => ContainerType.Crafting, - 13 => ContainerType.Enchantment, - 14 => ContainerType.Furnace, - 15 => ContainerType.Grindstone, - 16 => ContainerType.Hopper, - 17 => ContainerType.Lectern, - 18 => ContainerType.Loom, - 19 => ContainerType.Merchant, - 20 => ContainerType.ShulkerBox, - 21 => ContainerType.SmightingTable, - 22 => ContainerType.Smoker, - 23 => ContainerType.Cartography, - 24 => ContainerType.Stonecutter, - _ => ContainerType.Unknown, -#pragma warning restore format // @formatter:on - }; - } - - return typeID switch - { -#pragma warning disable format // @formatter:off - 0 => ContainerType.Generic_9x1, - 1 => ContainerType.Generic_9x2, - 2 => ContainerType.Generic_9x3, - 3 => ContainerType.Generic_9x4, - 4 => ContainerType.Generic_9x5, - 5 => ContainerType.Generic_9x6, - 6 => ContainerType.Generic_3x3, - 7 => ContainerType.Anvil, - 8 => ContainerType.Beacon, - 9 => ContainerType.BlastFurnace, - 10 => ContainerType.BrewingStand, - 11 => ContainerType.Crafting, - 12 => ContainerType.Enchantment, - 13 => ContainerType.Furnace, - 14 => ContainerType.Grindstone, - 15 => ContainerType.Hopper, - 16 => ContainerType.Lectern, - 17 => ContainerType.Loom, - 18 => ContainerType.Merchant, - 19 => ContainerType.ShulkerBox, - 20 => ContainerType.Smoker, - 21 => ContainerType.Cartography, - 22 => ContainerType.Stonecutter, - _ => ContainerType.Unknown, -#pragma warning restore format // @formatter:on - }; - } - - /// - /// Search an item in the container - /// - /// The item to search - /// An array of slot ID - public int[] SearchItem(ItemType itemType) - { - List result = new(); - if (Items is not null) - { - foreach (var item in Items) - { - if (item.Value.Type == itemType) - result.Add(item.Key); - } - } - return result.ToArray(); - } - - /// - /// List empty slots in the container - /// - /// An array of slot ID - /// Also depending on the container type, some empty slots cannot be used e.g. armor slots. This might cause issues. - public int[] GetEmpytSlots() - { - List result = new(); - for (int i = 0; i < Type.SlotCount(); i++) - { - result.Add(i); - } - foreach (var item in Items) - { - result.Remove(item.Key); - } - return result.ToArray(); - } - - /// - /// Check the given slot ID is a hotbar slot and give the hotbar number - /// - /// The slot ID to check - /// Zero-based, 0-8. -1 if not a hotbar - /// True if given slot ID is a hotbar slot - public bool IsHotbar(int slotId, out int hotbar) - { - int hotbarStart = Type.SlotCount() - 9; - // Remove offhand slot - if (Type == ContainerType.PlayerInventory) - hotbarStart--; - if ((slotId >= hotbarStart) && (slotId <= hotbarStart + 9)) - { - hotbar = slotId - hotbarStart; - return true; - } - else - { - hotbar = -1; - return false; - } - } - } -} diff --git a/MinecraftClient/Inventory/ContainerExtensions.cs b/MinecraftClient/Inventory/ContainerExtensions.cs deleted file mode 100644 index 6e6306356d..0000000000 --- a/MinecraftClient/Inventory/ContainerExtensions.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; - -namespace MinecraftClient.Inventory; - -using System.Linq; -using System.Linq.Expressions; - -public enum ComparisonType -{ - Equals, - NotEquals, - Less, - LessOrEqual, - Greater, - GreaterOrEqual -} - -public static class ContainerExtensions -{ - public static bool IsFull(this Container container) => - container.Items.Values.All(item => item.Count >= item.Type.StackCount()); - - public static int FirstEmptySlot(this Container container) => - container.Items.FirstOrDefault(slot => slot.Value.IsEmpty).Key; - - public static int FirstSlotWithItem(this Container container, ItemType type, int? count = null, - ComparisonType comparison = ComparisonType.Equals) => - container.Items.FirstOrDefault(slot => - slot.Value.Type == type && - (!count.HasValue || CompareCounts(slot.Value.Count, count.Value, comparison))).Key; - - public static int LastSlotWithItem(this Container container, ItemType type, int? count = null, - ComparisonType comparison = ComparisonType.Equals) => - container.Items.LastOrDefault(slot => - slot.Value.Type == type && - (!count.HasValue || CompareCounts(slot.Value.Count, count.Value, comparison))) - .Key; - - // We could have used "Expression> comparison = null" instead of "ComparisonType comparison", but it would look ugly to use - private static bool CompareCounts(int value1, int value2, ComparisonType comparison) - { - var left = Expression.Constant(value1); - var right = Expression.Constant(value2); - - Expression binaryExpression = comparison switch - { - ComparisonType.Less => Expression.LessThan(left, right), - ComparisonType.LessOrEqual => Expression.LessThanOrEqual(left, right), - ComparisonType.Greater => Expression.GreaterThan(left, right), - ComparisonType.GreaterOrEqual => Expression.GreaterThanOrEqual(left, right), - ComparisonType.Equals => Expression.Equal(left, right), - ComparisonType.NotEquals => Expression.NotEqual(left, right), - _ => Expression.Equal(left, right) - }; - - return Expression.Lambda>(binaryExpression).Compile().Invoke(); - } -} \ No newline at end of file diff --git a/MinecraftClient/Inventory/ContainerType.cs b/MinecraftClient/Inventory/ContainerType.cs deleted file mode 100644 index e82878fe92..0000000000 --- a/MinecraftClient/Inventory/ContainerType.cs +++ /dev/null @@ -1,76 +0,0 @@ -namespace MinecraftClient.Inventory -{ - // For MC 1.14 after ONLY - public enum ContainerType - { - Generic_9x1, - Generic_9x2, - Generic_9x3, // chest, ender chest, minecart with chest, barrel - Generic_9x4, - Generic_9x5, - Generic_9x6, - Generic_3x3, - Crafter, - Anvil, - Beacon, - BlastFurnace, - BrewingStand, - Crafting, - Enchantment, - Furnace, - Grindstone, - Hopper, - Lectern, - Loom, - Merchant, - ShulkerBox, - SmightingTable, - Smoker, - Cartography, - Stonecutter, - // not in the wiki.vg list - PlayerInventory, - Unknown - } - public enum ContainerTypeOld - { - CONTAINER, - CHEST, - CRAFTING_TABLE, - FURNACE, - DISPENSER, - ENCHANTING_TABLE, - BREWING_STAND, - VILLAGER, - BEACON, - ANVIL, - HOPPER, - DROPPER, - SHULKER_BOX, - ENTITYHORSE - } - public static class ConvertType - { - public static ContainerType ToNew(ContainerTypeOld type) - { - return type switch - { -#pragma warning disable format // @formatter:off - ContainerTypeOld.CONTAINER => ContainerType.Unknown, - ContainerTypeOld.CHEST => ContainerType.Generic_9x3, - ContainerTypeOld.CRAFTING_TABLE => ContainerType.Crafting, - ContainerTypeOld.FURNACE => ContainerType.Furnace, - ContainerTypeOld.DISPENSER => ContainerType.Generic_3x3, - ContainerTypeOld.ENCHANTING_TABLE => ContainerType.Enchantment, - ContainerTypeOld.BREWING_STAND => ContainerType.BrewingStand, - ContainerTypeOld.VILLAGER => ContainerType.Merchant, - ContainerTypeOld.HOPPER => ContainerType.Hopper, - ContainerTypeOld.DROPPER => ContainerType.Generic_3x3, - ContainerTypeOld.SHULKER_BOX => ContainerType.ShulkerBox, - ContainerTypeOld.ENTITYHORSE => ContainerType.Unknown, - _ => ContainerType.Unknown, -#pragma warning restore format // @formatter:on - }; - } - } -} diff --git a/MinecraftClient/Inventory/ContainerTypeExtensions.cs b/MinecraftClient/Inventory/ContainerTypeExtensions.cs deleted file mode 100644 index 4644e55354..0000000000 --- a/MinecraftClient/Inventory/ContainerTypeExtensions.cs +++ /dev/null @@ -1,89 +0,0 @@ -namespace MinecraftClient.Inventory -{ - public static class ContainerTypeExtensions - { - /// - /// Get the slot count of the container - /// - /// - /// Slot count of the container - public static int SlotCount(this ContainerType c) - { - return c switch - { -#pragma warning disable format // @formatter:off - ContainerType.PlayerInventory => 46, - ContainerType.Generic_9x1 => 45, - ContainerType.Generic_9x2 => 54, - ContainerType.Generic_9x3 => 63, - ContainerType.Generic_9x4 => 72, - ContainerType.Generic_9x5 => 81, - ContainerType.Generic_9x6 => 90, - ContainerType.Generic_3x3 => 45, - ContainerType.Crafter => 45, - ContainerType.Crafting => 46, - ContainerType.BlastFurnace => 39, - ContainerType.Furnace => 39, - ContainerType.Smoker => 39, - ContainerType.Enchantment => 38, - ContainerType.BrewingStand => 41, - ContainerType.Merchant => 39, - ContainerType.Beacon => 37, - ContainerType.Anvil => 39, - ContainerType.Hopper => 41, - ContainerType.ShulkerBox => 63, - ContainerType.SmightingTable => 39, - ContainerType.Loom => 40, - ContainerType.Stonecutter => 38, - ContainerType.Lectern => 37, - ContainerType.Cartography => 39, - ContainerType.Grindstone => 39, - ContainerType.Unknown => 0, - _ => 0, -#pragma warning restore format // @formatter:on - }; - } - - /// - /// Get an ASCII art representation of the container - /// - /// - /// ASCII art representation or NULL if not implemented for this container type - public static string? GetAsciiArt(this ContainerType c) - { - return c switch - { -#pragma warning disable format // @formatter:off - ContainerType.PlayerInventory => AsciiArt.Container_PlayerInventory, - ContainerType.Generic_9x3 => AsciiArt.Container_Generic_9x3, - ContainerType.Generic_9x6 => AsciiArt.Container_Generic_9x6, - ContainerType.Generic_3x3 => AsciiArt.Container_Generic_3x3, - ContainerType.Crafter => AsciiArt.Container_Generic_3x3, - ContainerType.Crafting => AsciiArt.Container_Crafting, - ContainerType.BlastFurnace => AsciiArt.Container_Furnace, - ContainerType.Furnace => AsciiArt.Container_Furnace, - ContainerType.Smoker => AsciiArt.Container_Furnace, - ContainerType.Enchantment => AsciiArt.Container_EnchantingTable, - ContainerType.BrewingStand => AsciiArt.Container_BrewingStand, - ContainerType.Merchant => null, - ContainerType.Beacon => null, - ContainerType.Anvil => null, - ContainerType.Hopper => AsciiArt.Container_Hopper, - ContainerType.ShulkerBox => AsciiArt.Container_Generic_9x3, - ContainerType.Loom => null, - ContainerType.Stonecutter => null, - ContainerType.Lectern => null, - ContainerType.Cartography => null, - ContainerType.Grindstone => AsciiArt.Container_Grindstone, - ContainerType.Unknown => null, - ContainerType.Generic_9x1 => null, - ContainerType.Generic_9x2 => null, - ContainerType.Generic_9x4 => null, - ContainerType.Generic_9x5 => null, - ContainerType.SmightingTable => null, - _ => null, -#pragma warning restore format // @formatter:on - }; - } - } -} diff --git a/MinecraftClient/Inventory/EffectData.cs b/MinecraftClient/Inventory/EffectData.cs deleted file mode 100644 index c13e4312f6..0000000000 --- a/MinecraftClient/Inventory/EffectData.cs +++ /dev/null @@ -1,194 +0,0 @@ -namespace MinecraftClient.Inventory; - -using System; -using System.Collections.Generic; -using System.Linq; -using MinecraftClient.Protocol; -using MinecraftClient.Protocol.Message; - -/// -/// Represents an active status effect on an entity -/// -public class EffectData -{ - /// - /// The type of effect - /// - public Effects Effect { get; set; } - - /// - /// Effect amplifier (level - 1, e.g., 0 = level I, 1 = level II) - /// - public int Amplifier { get; set; } - - /// - /// Duration in ticks (20 ticks = 1 second). -1 for infinite. - /// - public int Duration { get; set; } - - /// - /// Effect flags (ambient, show particles, show icon) - /// - public byte Flags { get; set; } - - /// - /// Time when the effect was applied - /// - public DateTime StartTime { get; set; } - - public EffectData(Effects effect, int amplifier, int duration, byte flags) - { - Effect = effect; - Amplifier = amplifier; - Duration = duration; - Flags = flags; - StartTime = DateTime.UtcNow; - } - - /// - /// Check if this is an infinite duration effect - /// - public bool IsInfinite => Duration == -1 || Duration == int.MaxValue; - - /// - /// Check if the effect has expired - /// - public bool IsExpired - { - get - { - if (IsInfinite) return false; - return GetElapsedTicks() >= Duration; - } - } - - /// - /// Get remaining duration in ticks - /// - public int RemainingTicks - { - get - { - if (IsInfinite) return -1; - return Math.Max(0, Duration - GetElapsedTicks()); - } - } - - /// - /// Get remaining duration in seconds - /// - public int RemainingSeconds - { - get - { - if (IsInfinite) return -1; - return (RemainingTicks + 19) / 20; - } - } - - /// - /// Get the translated effect name from Minecraft translations - /// - public string GetTranslatedName() - { - var key = $"effect.minecraft.{Effect.ToString().ToUnderscoreCase()}"; - var translated = ChatParser.TranslateString(key); - return string.IsNullOrEmpty(translated) ? Effect.ToString() : translated; - } - - /// - /// Get the translated effect name with level when applicable - /// - public string GetDisplayName() - { - string translatedName = GetTranslatedName(); - if (Amplifier <= 0) - return translatedName; - - return string.Format(Translations.effect_name_with_amplifier, translatedName, - EnchantmentMapping.ConvertLevelToRomanNumbers(Amplifier + 1)); - } - - /// - /// Get the translated effect name prefixed with the best-fit indefinite article - /// - public string GetDisplayNameWithArticle() - { - string displayName = GetDisplayName(); - char? firstLetter = displayName - .TrimStart() - .FirstOrDefault(char.IsLetter); - - if (firstLetter is null) - return displayName; - - string article = "AEIOUaeiou".Contains(firstLetter.Value) - ? Translations.effect_article_an - : Translations.effect_article_a; - return $"{article} {displayName}"; - } - - /// - /// Get the configured short duration label for the remaining time - /// - public string GetRemainingDurationText() - { - return FormatShortDuration(RemainingSeconds); - } - - /// - /// Get the configured short duration label for the initial effect duration - /// - public string GetInitialDurationText() - { - if (IsInfinite) - return Translations.effect_duration_unlimited; - - int durationSeconds = (Duration + 19) / 20; - return FormatShortDuration(durationSeconds); - } - - /// - /// Format a duration for compact UI output - /// - /// Duration in seconds, -1 for unlimited - public static string FormatShortDuration(int seconds) - { - if (seconds < 0) - return Translations.effect_duration_short_unlimited; - - if (seconds < 60) - return string.Format(Translations.effect_duration_short_seconds, seconds); - - int minutes = seconds / 60; - int remainingSeconds = seconds % 60; - if (seconds < 3600) - { - return remainingSeconds == 0 - ? string.Format(Translations.effect_duration_short_minutes, minutes) - : string.Format(Translations.effect_duration_short_minutes_seconds, minutes, remainingSeconds); - } - - int hours = seconds / 3600; - int remainingMinutes = (seconds % 3600) / 60; - return remainingMinutes == 0 - ? string.Format(Translations.effect_duration_short_hours, hours) - : string.Format(Translations.effect_duration_short_hours_minutes, hours, remainingMinutes); - } - - private int GetElapsedTicks() - { - return (int)((DateTime.UtcNow - StartTime).TotalMilliseconds / 50); - } -} - -/// -/// Extension method for converting PascalCase to snake_case -/// -public static class StringExtensions -{ - public static string ToUnderscoreCase(this string str) - { - return string.Concat(str.Select((x, i) => i > 0 && char.IsUpper(x) ? "_" + x.ToString() : x.ToString())).ToLower(); - } -} diff --git a/MinecraftClient/Inventory/Effects.cs b/MinecraftClient/Inventory/Effects.cs deleted file mode 100644 index 7b5df3bd25..0000000000 --- a/MinecraftClient/Inventory/Effects.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace MinecraftClient.Inventory -{ - /// - /// Represents a Minecraft effects - /// - public enum Effects - { - Speed = 1, - Slowness = 2, - Haste = 3, - MiningFatigue = 4, - Strength = 5, - InstantHealth = 6, - InstantDamage = 7, - JumpBoost = 8, - Nausea = 9, - Regeneration = 10, - Resistance = 11, - FireResistance = 12, - WaterBreathing = 13, - Invisibility = 14, - Blindness = 15, - NightVision = 16, - Hunger = 17, - Weakness = 18, - Poison = 19, - Wither = 20, - HealthBoost = 21, - Absorption = 22, - Saturation = 23, - Glowing = 24, - Levitation = 25, - Luck = 26, - BadLuck = 27, - SlowFalling = 28, - ConduitPower = 29, - DolphinsGrace = 30, - BadOmen = 31, - HerooftheVillage = 32, - } -} diff --git a/MinecraftClient/Inventory/Enchantment.cs b/MinecraftClient/Inventory/Enchantment.cs deleted file mode 100644 index 09b513f998..0000000000 --- a/MinecraftClient/Inventory/Enchantment.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace MinecraftClient.Inventory; - -public record Enchantment(Enchantments Type, int Level); \ No newline at end of file diff --git a/MinecraftClient/Inventory/EnchantmentData.cs b/MinecraftClient/Inventory/EnchantmentData.cs deleted file mode 100644 index 55571d0c24..0000000000 --- a/MinecraftClient/Inventory/EnchantmentData.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace MinecraftClient.Inventory -{ - public record EnchantmentData - { - public Enchantments TopEnchantment { get; set; } - public Enchantments MiddleEnchantment { get; set; } - public Enchantments BottomEnchantment { get; set; } - - // Seed for rendering Standard Galactic Language (symbols in the enchanting table) (Useful for poeple who use MCC for the protocol) - public short Seed { get; set; } - - /// Enchantment levels are the levels of enchantment (eg. I, II, III, IV, V) (eg. Smite IV, Power III, Knockback II ..) - public short TopEnchantmentLevel { get; set; } - public short MiddleEnchantmentLevel { get; set; } - public short BottomEnchantmentLevel { get; set; } - - /// Enchantment level requirements are the levels that player needs to have in order to enchant the item - public short TopEnchantmentLevelRequirement { get; set; } - public short MiddleEnchantmentLevelRequirement { get; set; } - public short BottomEnchantmentLevelRequirement { get; set; } - } -} diff --git a/MinecraftClient/Inventory/EnchantmentMapping.cs b/MinecraftClient/Inventory/EnchantmentMapping.cs deleted file mode 100644 index f09bd420e4..0000000000 --- a/MinecraftClient/Inventory/EnchantmentMapping.cs +++ /dev/null @@ -1,420 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using MinecraftClient.Protocol.Handlers; -using MinecraftClient.Protocol.Message; - -namespace MinecraftClient.Inventory -{ - public class EnchantmentMapping - { - #pragma warning disable format // @formatter:off - // 1.14 - 1.15.2 - private static Dictionary enchantmentMappings114 = new() - { - //id type - { 0, Enchantments.Protection }, - { 1, Enchantments.FireProtection }, - { 2, Enchantments.FeatherFalling }, - { 3, Enchantments.BlastProtection }, - { 4, Enchantments.ProjectileProtection }, - { 5, Enchantments.Respiration }, - { 6, Enchantments.AquaAffinity }, - { 7, Enchantments.Thorns }, - { 8, Enchantments.DepthStrider }, - { 9, Enchantments.FrostWalker }, - { 10, Enchantments.BindingCurse }, - { 11, Enchantments.Sharpness }, - { 12, Enchantments.Smite }, - { 13, Enchantments.BaneOfArthropods }, - { 14, Enchantments.Knockback }, - { 15, Enchantments.FireAspect }, - { 16, Enchantments.Looting }, - { 17, Enchantments.Sweeping }, - { 18, Enchantments.Efficiency }, - { 19, Enchantments.SilkTouch }, - { 20, Enchantments.Unbreaking }, - { 21, Enchantments.Fortune }, - { 22, Enchantments.Power }, - { 23, Enchantments.Punch }, - { 24, Enchantments.Flame }, - { 25, Enchantments.Infinity }, - { 26, Enchantments.LuckOfTheSea }, - { 27, Enchantments.Lure }, - { 28, Enchantments.Loyalty }, - { 29, Enchantments.Impaling }, - { 30, Enchantments.Riptide }, - { 31, Enchantments.Channeling }, - { 32, Enchantments.Mending }, - { 33, Enchantments.VanishingCurse } - }; - - // 1.16 - 1.18 - private static Dictionary enchantmentMappings116 = new() - { - //id type - { 0, Enchantments.Protection }, - { 1, Enchantments.FireProtection }, - { 2, Enchantments.FeatherFalling }, - { 3, Enchantments.BlastProtection }, - { 4, Enchantments.ProjectileProtection }, - { 5, Enchantments.Respiration }, - { 6, Enchantments.AquaAffinity }, - { 7, Enchantments.Thorns }, - { 8, Enchantments.DepthStrider }, - { 9, Enchantments.FrostWalker }, - { 10, Enchantments.BindingCurse }, - { 11, Enchantments.SoulSpeed }, - { 12, Enchantments.Sharpness }, - { 13, Enchantments.Smite }, - { 14, Enchantments.BaneOfArthropods }, - { 15, Enchantments.Knockback }, - { 16, Enchantments.FireAspect }, - { 17, Enchantments.Looting }, - { 18, Enchantments.Sweeping }, - { 19, Enchantments.Efficiency }, - { 20, Enchantments.SilkTouch }, - { 21, Enchantments.Unbreaking }, - { 22, Enchantments.Fortune }, - { 23, Enchantments.Power }, - { 24, Enchantments.Punch }, - { 25, Enchantments.Flame }, - { 26, Enchantments.Infinity }, - { 27, Enchantments.LuckOfTheSea }, - { 28, Enchantments.Lure }, - { 29, Enchantments.Loyalty }, - { 30, Enchantments.Impaling }, - { 31, Enchantments.Riptide }, - { 32, Enchantments.Channeling }, - { 33, Enchantments.Multishot }, - { 34, Enchantments.QuickCharge }, - { 35, Enchantments.Piercing }, - { 36, Enchantments.Mending }, - { 37, Enchantments.VanishingCurse } - }; - - // 1.19 - 1.20.4 - private static Dictionary enchantmentMappings119 = new() - { - //id type - { 0, Enchantments.Protection }, - { 1, Enchantments.FireProtection }, - { 2, Enchantments.FeatherFalling }, - { 3, Enchantments.BlastProtection }, - { 4, Enchantments.ProjectileProtection }, - { 5, Enchantments.Respiration }, - { 6, Enchantments.AquaAffinity }, - { 7, Enchantments.Thorns }, - { 8, Enchantments.DepthStrider }, - { 9, Enchantments.FrostWalker }, - { 10, Enchantments.BindingCurse }, - { 11, Enchantments.SoulSpeed }, - { 12, Enchantments.SwiftSneak }, - { 13, Enchantments.Sharpness }, - { 14, Enchantments.Smite }, - { 15, Enchantments.BaneOfArthropods }, - { 16, Enchantments.Knockback }, - { 17, Enchantments.FireAspect }, - { 18, Enchantments.Looting }, - { 19, Enchantments.Sweeping }, - { 20, Enchantments.Efficiency }, - { 21, Enchantments.SilkTouch }, - { 22, Enchantments.Unbreaking }, - { 23, Enchantments.Fortune }, - { 24, Enchantments.Power }, - { 25, Enchantments.Punch }, - { 26, Enchantments.Flame }, - { 27, Enchantments.Infinity }, - { 28, Enchantments.LuckOfTheSea }, - { 29, Enchantments.Lure }, - { 30, Enchantments.Loyalty }, - { 31, Enchantments.Impaling }, - { 32, Enchantments.Riptide }, - { 33, Enchantments.Channeling }, - { 34, Enchantments.Multishot }, - { 35, Enchantments.QuickCharge }, - { 36, Enchantments.Piercing }, - { 37, Enchantments.Mending }, - { 38, Enchantments.VanishingCurse } - }; - - // 1.20.6 - 1.21.10 - private static Dictionary enchantmentMappings1206 = new() - { - //id type - { 0, Enchantments.Protection }, - { 1, Enchantments.FireProtection }, - { 2, Enchantments.FeatherFalling }, - { 3, Enchantments.BlastProtection }, - { 4, Enchantments.ProjectileProtection }, - { 5, Enchantments.Respiration }, - { 6, Enchantments.AquaAffinity }, - { 7, Enchantments.Thorns }, - { 8, Enchantments.DepthStrider }, - { 9, Enchantments.FrostWalker }, - { 10, Enchantments.BindingCurse }, - { 11, Enchantments.SoulSpeed }, - { 12, Enchantments.SwiftSneak }, - { 13, Enchantments.Sharpness }, - { 14, Enchantments.Smite }, - { 15, Enchantments.BaneOfArthropods }, - { 16, Enchantments.Knockback }, - { 17, Enchantments.FireAspect }, - { 18, Enchantments.Looting }, - { 19, Enchantments.Sweeping }, - { 20, Enchantments.Efficiency }, - { 21, Enchantments.SilkTouch }, - { 22, Enchantments.Unbreaking }, - { 23, Enchantments.Fortune }, - { 24, Enchantments.Power }, - { 25, Enchantments.Punch }, - { 26, Enchantments.Flame }, - { 27, Enchantments.Infinity }, - { 28, Enchantments.LuckOfTheSea }, - { 29, Enchantments.Lure }, - { 30, Enchantments.Loyalty }, - { 31, Enchantments.Impaling }, - { 32, Enchantments.Riptide }, - { 33, Enchantments.Channeling }, - { 34, Enchantments.Multishot }, - { 35, Enchantments.QuickCharge }, - { 36, Enchantments.Piercing }, - { 37, Enchantments.Density }, - { 38, Enchantments.Breach }, - { 39, Enchantments.WindBurst }, - { 40, Enchantments.Mending }, - { 41, Enchantments.VanishingCurse } - }; - - // 1.21.11+ - private static Dictionary enchantmentMappings12111 = new() - { - //id type - { 0, Enchantments.Protection }, - { 1, Enchantments.FireProtection }, - { 2, Enchantments.FeatherFalling }, - { 3, Enchantments.BlastProtection }, - { 4, Enchantments.ProjectileProtection }, - { 5, Enchantments.Respiration }, - { 6, Enchantments.AquaAffinity }, - { 7, Enchantments.Thorns }, - { 8, Enchantments.DepthStrider }, - { 9, Enchantments.FrostWalker }, - { 10, Enchantments.BindingCurse }, - { 11, Enchantments.SoulSpeed }, - { 12, Enchantments.SwiftSneak }, - { 13, Enchantments.Sharpness }, - { 14, Enchantments.Smite }, - { 15, Enchantments.BaneOfArthropods }, - { 16, Enchantments.Knockback }, - { 17, Enchantments.FireAspect }, - { 18, Enchantments.Looting }, - { 19, Enchantments.Sweeping }, - { 20, Enchantments.Efficiency }, - { 21, Enchantments.SilkTouch }, - { 22, Enchantments.Unbreaking }, - { 23, Enchantments.Fortune }, - { 24, Enchantments.Power }, - { 25, Enchantments.Punch }, - { 26, Enchantments.Flame }, - { 27, Enchantments.Infinity }, - { 28, Enchantments.LuckOfTheSea }, - { 29, Enchantments.Lure }, - { 30, Enchantments.Loyalty }, - { 31, Enchantments.Impaling }, - { 32, Enchantments.Riptide }, - { 33, Enchantments.Channeling }, - { 34, Enchantments.Multishot }, - { 35, Enchantments.QuickCharge }, - { 36, Enchantments.Piercing }, - { 37, Enchantments.Density }, - { 38, Enchantments.Breach }, - { 39, Enchantments.WindBurst }, - { 40, Enchantments.Lunge }, - { 41, Enchantments.Mending }, - { 42, Enchantments.VanishingCurse } - }; -#pragma warning restore format // @formatter:on - - public static Enchantments GetEnchantmentById(int protocolVersion, short id) - { - if (protocolVersion < Protocol18Handler.MC_1_14_Version) - throw new Exception("Enchantments mappings are not implemented below 1.14"); - - var map = GetMapForProtocolVersion(protocolVersion); - - if (!map.TryGetValue(id, out var value)) - throw new Exception($"Got an Unknown Enchantment ID {id}, please update the Mappings!"); - - return value; - } - - private static Dictionary? reverseDynamicEnchantmentMappings; - private static readonly Dictionary reverseEnchantmentMappings114 = CreateReverseMap(enchantmentMappings114); - private static readonly Dictionary reverseEnchantmentMappings116 = CreateReverseMap(enchantmentMappings116); - private static readonly Dictionary reverseEnchantmentMappings119 = CreateReverseMap(enchantmentMappings119); - private static readonly Dictionary reverseEnchantmentMappings1206 = CreateReverseMap(enchantmentMappings1206); - private static readonly Dictionary reverseEnchantmentMappings12111 = CreateReverseMap(enchantmentMappings12111); - private static Dictionary? dynamicEnchantmentIdMap; - - private static readonly Dictionary nameToEnchantment = new() - { - { "protection", Enchantments.Protection }, - { "fire_protection", Enchantments.FireProtection }, - { "feather_falling", Enchantments.FeatherFalling }, - { "blast_protection", Enchantments.BlastProtection }, - { "projectile_protection", Enchantments.ProjectileProtection }, - { "respiration", Enchantments.Respiration }, - { "aqua_affinity", Enchantments.AquaAffinity }, - { "thorns", Enchantments.Thorns }, - { "depth_strider", Enchantments.DepthStrider }, - { "frost_walker", Enchantments.FrostWalker }, - { "binding_curse", Enchantments.BindingCurse }, - { "soul_speed", Enchantments.SoulSpeed }, - { "swift_sneak", Enchantments.SwiftSneak }, - { "sharpness", Enchantments.Sharpness }, - { "smite", Enchantments.Smite }, - { "bane_of_arthropods", Enchantments.BaneOfArthropods }, - { "knockback", Enchantments.Knockback }, - { "fire_aspect", Enchantments.FireAspect }, - { "looting", Enchantments.Looting }, - { "sweeping_edge", Enchantments.Sweeping }, - { "efficiency", Enchantments.Efficiency }, - { "silk_touch", Enchantments.SilkTouch }, - { "unbreaking", Enchantments.Unbreaking }, - { "fortune", Enchantments.Fortune }, - { "power", Enchantments.Power }, - { "punch", Enchantments.Punch }, - { "flame", Enchantments.Flame }, - { "infinity", Enchantments.Infinity }, - { "luck_of_the_sea", Enchantments.LuckOfTheSea }, - { "lure", Enchantments.Lure }, - { "loyalty", Enchantments.Loyalty }, - { "lunge", Enchantments.Lunge }, - { "impaling", Enchantments.Impaling }, - { "riptide", Enchantments.Riptide }, - { "channeling", Enchantments.Channeling }, - { "multishot", Enchantments.Multishot }, - { "quick_charge", Enchantments.QuickCharge }, - { "piercing", Enchantments.Piercing }, - { "density", Enchantments.Density }, - { "breach", Enchantments.Breach }, - { "wind_burst", Enchantments.WindBurst }, - { "mending", Enchantments.Mending }, - { "vanishing_curse", Enchantments.VanishingCurse }, - }; - - /// - /// Set the dynamic enchantment ID map from server RegistryData. - /// Called during configuration phase when receiving minecraft:enchantment registry. - /// - public static void SetDynamicEnchantmentIdMap(Dictionary idMap) - { - dynamicEnchantmentIdMap = new(); - foreach (var kvp in idMap) - { - var name = kvp.Value.StartsWith("minecraft:") ? kvp.Value.Substring("minecraft:".Length) : kvp.Value; - if (nameToEnchantment.TryGetValue(name, out var enchantment)) - dynamicEnchantmentIdMap[kvp.Key] = enchantment; - } - reverseDynamicEnchantmentMappings = null; - } - - public static Enchantments GetEnchantmentByRegistryId1206(int protocolVersion, int id) - { - if (dynamicEnchantmentIdMap is not null && dynamicEnchantmentIdMap.TryGetValue(id, out var dynValue)) - return dynValue; - if (GetMapForProtocolVersion(protocolVersion).TryGetValue((short)id, out var value)) - return value; - return (Enchantments)(-1); - } - - public static int GetRegistryId1206ByEnchantment(int protocolVersion, Enchantments enchantment) - { - if (dynamicEnchantmentIdMap is not null) - { - if (reverseDynamicEnchantmentMappings is null) - { - reverseDynamicEnchantmentMappings = new(); - foreach (var kvp in dynamicEnchantmentIdMap) - reverseDynamicEnchantmentMappings[kvp.Value] = (short)kvp.Key; - } - - return reverseDynamicEnchantmentMappings.TryGetValue(enchantment, out var dynamicId) ? dynamicId : -1; - } - - var reverseMap = GetReverseMapForProtocolVersion(protocolVersion); - return reverseMap.TryGetValue(enchantment, out var id) ? id : -1; - } - - public static string GetEnchantmentName(Enchantments enchantment) - { - var translation = ChatParser.TranslateString("enchantment.minecraft." + enchantment.ToString().ToUnderscoreCase()); - return string.IsNullOrEmpty(translation) ? $"Unknown Enchantment with ID: {(short)enchantment} (Probably not named in the code yet)" : translation; - } - - public static string ConvertLevelToRomanNumbers(int num) - { - var result = string.Empty; - var romanNumbers = new Dictionary - { - {"M", 1000}, - {"CM", 900}, - {"D", 500}, - {"CD", 400}, - {"C", 100}, - {"XC", 90}, - {"L", 50}, - {"XL", 40}, - {"X", 10}, - {"IX", 9}, - {"V", 5}, - {"IV", 4}, - {"I", 1} - }; - - foreach (var pair in romanNumbers) - { - result += string.Join(string.Empty, Enumerable.Repeat(pair.Key, num / pair.Value)); - num %= pair.Value; - } - - return result; - } - - private static Dictionary GetMapForProtocolVersion(int protocolVersion) - { - return protocolVersion switch - { - >= Protocol18Handler.MC_1_14_Version and < Protocol18Handler.MC_1_16_Version => enchantmentMappings114, - >= Protocol18Handler.MC_1_16_Version and < Protocol18Handler.MC_1_19_Version => enchantmentMappings116, - >= Protocol18Handler.MC_1_19_Version and < Protocol18Handler.MC_1_20_6_Version => enchantmentMappings119, - >= Protocol18Handler.MC_1_20_6_Version and < Protocol18Handler.MC_1_21_11_Version => enchantmentMappings1206, - >= Protocol18Handler.MC_1_21_11_Version => enchantmentMappings12111, - _ => throw new Exception("Enchantments mappings are not implemented below 1.14") - }; - } - - private static Dictionary GetReverseMapForProtocolVersion(int protocolVersion) - { - return protocolVersion switch - { - >= Protocol18Handler.MC_1_14_Version and < Protocol18Handler.MC_1_16_Version => reverseEnchantmentMappings114, - >= Protocol18Handler.MC_1_16_Version and < Protocol18Handler.MC_1_19_Version => reverseEnchantmentMappings116, - >= Protocol18Handler.MC_1_19_Version and < Protocol18Handler.MC_1_20_6_Version => reverseEnchantmentMappings119, - >= Protocol18Handler.MC_1_20_6_Version and < Protocol18Handler.MC_1_21_11_Version => reverseEnchantmentMappings1206, - >= Protocol18Handler.MC_1_21_11_Version => reverseEnchantmentMappings12111, - _ => throw new Exception("Enchantments mappings are not implemented below 1.14") - }; - } - - private static Dictionary CreateReverseMap(Dictionary map) - { - Dictionary reverseMap = new(); - foreach (var kvp in map) - reverseMap[kvp.Value] = kvp.Key; - - return reverseMap; - } - } -} diff --git a/MinecraftClient/Inventory/EnchantmentPropertyInfo.cs b/MinecraftClient/Inventory/EnchantmentPropertyInfo.cs deleted file mode 100644 index 20c93d9477..0000000000 --- a/MinecraftClient/Inventory/EnchantmentPropertyInfo.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace MinecraftClient.Inventory -{ - public enum EnchantmentPropertyInfo - { - // Levels that are required to enchant an item - TopEnchantmentLevelRequirement = 0, - MiddleEnchantmentLevelRequirement, - BottomEnchantmentLevelRequirement, - - // Seed - EnchantmentSeed, - - // Enchantment ids - TopEnchantmentId, - MiddleEnchantmentId, - BottomEnchantmentId, - - // Shown on mouse hover over the top, middle and bottom slot - TopEnchantmentLevel, - MiddleEnchantmentLevel, - BottomEnchantmentLevel - } -} diff --git a/MinecraftClient/Inventory/Enchantments.cs b/MinecraftClient/Inventory/Enchantments.cs deleted file mode 100644 index 173ea995b5..0000000000 --- a/MinecraftClient/Inventory/Enchantments.cs +++ /dev/null @@ -1,50 +0,0 @@ -namespace MinecraftClient.Inventory -{ - // Not implemented for 1.14 - public enum Enchantments : short - { - AquaAffinity = 0, - BaneOfArthropods, - BindingCurse, - BlastProtection, - Breach, - Channeling, - DepthStrider, - Density, - Efficiency, - FeatherFalling, - FireAspect, - FireProtection, - Flame, - Fortune, - FrostWalker, - Impaling, - Infinity, - Knockback, - Looting, - LuckOfTheSea, - Loyalty, - Lunge, - Lure, - Mending, - Multishot, - Piercing, - Power, - ProjectileProtection, - Protection, - Punch, - QuickCharge, - Respiration, - Riptide, - Sharpness, - SilkTouch, - Smite, - SoulSpeed, - Sweeping, - SwiftSneak, - Thorns, - Unbreaking, - VanishingCurse, - WindBurst - } -} diff --git a/MinecraftClient/Inventory/Hand.cs b/MinecraftClient/Inventory/Hand.cs deleted file mode 100644 index a150fbc5b7..0000000000 --- a/MinecraftClient/Inventory/Hand.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace MinecraftClient.Inventory -{ - /// - /// Represents a Minecraft hand - /// - public enum Hand - { - MainHand = 0, - OffHand = 1, - } -} diff --git a/MinecraftClient/Inventory/Item.cs b/MinecraftClient/Inventory/Item.cs deleted file mode 100644 index 95f95b3723..0000000000 --- a/MinecraftClient/Inventory/Item.cs +++ /dev/null @@ -1,275 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; -using MinecraftClient.Protocol.Message; - -namespace MinecraftClient.Inventory -{ - /// - /// Represents an item inside a Container - /// - public class Item - { - /// - /// Item Type - /// - public ItemType Type; - - /// - /// Item Count - /// - public int Count; - - /// - /// Item Count - /// - public int Data; - - /// - /// Item Metadata - /// - public Dictionary? NBT; - - /// - /// 1.20.6+ structured components (raw list for round-trip serialization) - /// - public List? Components; - - /// - /// Create an item with ItemType, Count and Metadata - /// - /// Type of the item - /// Item Count - /// Item Metadata - public Item(ItemType itemType, int count, Dictionary? nbt) - { - Type = itemType; - Count = count; - NBT = nbt; - } - - public Item(ItemType itemType, int count, int data, Dictionary? nbt) : this(itemType, count, nbt) - { - Data = data; - } - - /// - /// Create a shallow clone with a specific count (preserves NBT and Components). - /// - public Item CloneWithCount(int count) - { - return new Item(Type, count, Data, NBT) { Components = Components }; - } - - /// - /// Check if the item slot is empty - /// - /// TRUE if the item is empty - public bool IsEmpty - { - get { return Type == ItemType.Air || Count == 0; } - } - - /// - /// Retrieve item display name. For 1.20.6+ reads from structured components - /// (CustomNameComponent, then ItemNameComponent as fallback); for older versions reads from NBT. - /// - public string? DisplayName - { - get - { - if (Components is not null) - { - var customName = Components.OfType().FirstOrDefault(); - if (customName is not null && !string.IsNullOrEmpty(customName.CustomName)) - return customName.CustomName; - - var itemName = Components.OfType().FirstOrDefault(); - if (itemName is not null && !string.IsNullOrEmpty(itemName.ItemName)) - return itemName.ItemName; - - return null; - } - - if (NBT is not null && NBT.ContainsKey("display")) - { - if (NBT["display"] is Dictionary displayProperties && - displayProperties.ContainsKey("Name")) - { - string? displayName = displayProperties["Name"] as string; - if (!String.IsNullOrEmpty(displayName)) - return ChatParser.ParseText(displayProperties["Name"].ToString() ?? string.Empty); - } - } - - return null; - } - } - - /// - /// Retrieve item lores. For 1.20.6+ reads from LoreNameComponent1206; for older versions reads from NBT. - /// - public string[]? Lores - { - get - { - if (Components is not null) - { - var loreComponent = Components.OfType().FirstOrDefault(); - if (loreComponent is not null && loreComponent.Lines.Count > 0) - return loreComponent.Lines.ToArray(); - - return null; - } - - List lores = new(); - if (NBT is not null && NBT.ContainsKey("display")) - { - if (NBT["display"] is Dictionary displayProperties && - displayProperties.ContainsKey("Lore")) - { - object[] displayName = (object[])displayProperties["Lore"]; - lores.AddRange(from string st in displayName - let str = ChatParser.ParseText(st.ToString()) - select str); - return lores.ToArray(); - } - } - - return null; - } - } - - /// - /// Retrieve item damage. For 1.20.6+ reads from DamageComponent; for older versions reads from NBT. - /// - public int Damage - { - get - { - if (Components is not null) - { - var damageComponent = Components.OfType().FirstOrDefault(); - if (damageComponent is not null) - return damageComponent.Damage; - - return 0; - } - - if (NBT is not null && NBT.ContainsKey("Damage")) - { - object damage = NBT["Damage"]; - if (damage is not null) - { - return int.Parse(damage.ToString() ?? string.Empty, NumberStyles.Any, - CultureInfo.CurrentCulture); - } - } - - return 0; - } - } - - /// - /// Retrieve enchantments from structured components (1.20.6+). Returns null for older versions. - /// Both normal enchantments (EnchantmentsComponent) and stored enchantments - /// (StoredEnchantmentsComponent, e.g. enchanted books) are checked. - /// - public List? EnchantmentList - { - get - { - if (Components is null) - return null; - - var enchComp = Components.OfType().FirstOrDefault(); - if (enchComp is not null && enchComp.Enchantments.Count > 0) - return enchComp.Enchantments; - - return null; - } - } - - public static string GetTypeString(ItemType type) - { - string type_str = type.ToString(); - string type_renamed = type_str.ToUnderscoreCase(); - string? res1 = ChatParser.TranslateString("item.minecraft." + type_renamed); - if (!string.IsNullOrEmpty(res1)) - return res1; - string? res2 = ChatParser.TranslateString("block.minecraft." + type_renamed); - if (!string.IsNullOrEmpty(res2)) - return res2; - return type_str; - } - - public string GetTypeString() - { - return GetTypeString(Type); - } - - public string ToFullString() - { - StringBuilder sb = new(); - sb.Append(ToString()); - - try - { - var enchList = EnchantmentList; - if (enchList is not null) - { - foreach (var ench in enchList) - { - string name = EnchantmentMapping.GetEnchantmentName(ench.Type); - string level = EnchantmentMapping.ConvertLevelToRomanNumbers(ench.Level); - sb.AppendFormat(" | {0} {1}", name, level); - } - } - else if (NBT is not null && (NBT.TryGetValue("Enchantments", out object? enchantments) || - NBT.TryGetValue("StoredEnchantments", out enchantments))) - { - foreach (Dictionary enchantment in (object[])enchantments) - { - short level = (short)enchantment["lvl"]; - string id = ((string)enchantment["id"]).Replace(':', '.'); - sb.AppendFormat(" | {0} {1}", - ChatParser.TranslateString("enchantment." + id) ?? id, - ChatParser.TranslateString("enchantment.level." + level) ?? level.ToString()); - } - } - - if (Lores is not null && Lores.Length > 0) - { - foreach (var lore in Lores) - sb.AppendFormat(" | {0}", lore); - } - } - catch (Exception) - { - } - - return sb.ToString(); - } - - public override string ToString() - { - StringBuilder sb = new(); - - sb.AppendFormat("x{0,-2} {1}", Count, GetTypeString()); - - string? displayName = DisplayName; - if (!String.IsNullOrEmpty(displayName)) - sb.AppendFormat(" - {0}§8", displayName); - - int damage = Damage; - if (damage != 0) - sb.AppendFormat(" | {0}: {1}", Translations.cmd_inventory_damage, damage); - - return sb.ToString(); - } - } -} diff --git a/MinecraftClient/Inventory/ItemMovingHelper.cs b/MinecraftClient/Inventory/ItemMovingHelper.cs deleted file mode 100644 index 16d7d4dec8..0000000000 --- a/MinecraftClient/Inventory/ItemMovingHelper.cs +++ /dev/null @@ -1,156 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using MinecraftClient.Scripting; - -namespace MinecraftClient.Inventory -{ - /// - /// Class that contains useful methods to move item around in a container - /// - public class ItemMovingHelper(Container c, McClient mc) - { - private readonly Container c = c; - private readonly McClient mc = mc; - - /// - /// Move an item fron source to dest. Source should contain an item and dest slot should be empty - /// - /// Source slot - /// Dest slot - /// Dest slot's container (only if dest slot is in other container) - /// True if success or false if Failed - public bool MoveTo(int source, int dest, Container? destContainer = null) - { - // Condition: source has item and dest has no item - if (ValidateSlots(source, dest, destContainer) && - HasItem(source) && - ((destContainer is not null && !HasItem(dest, destContainer)) || (destContainer is null && !HasItem(dest)))) - return mc.DoWindowAction(c.ID, source, WindowActionType.LeftClick) - && mc.DoWindowAction(destContainer is null ? c.ID : destContainer.ID, dest, WindowActionType.LeftClick); - else return false; - } - - /// - /// Swap two item. Both slots should contain item - /// - /// Slot 1 - /// Slot 2 - /// Slot2 container (only if slot2 is in other container) - /// True if success or False if Failed - public bool Swap(int slot1, int slot2, Container? destContainer = null) - { - // Condition: Both slot1 and slot2 has item - if (ValidateSlots(slot1, slot2, destContainer) && - HasItem(slot1) && - (destContainer is not null && HasItem(slot2, destContainer) || (destContainer is null && HasItem(slot2)))) - return mc.DoWindowAction(c.ID, slot1, WindowActionType.LeftClick) - && mc.DoWindowAction(destContainer is null ? c.ID : destContainer.ID, slot2, WindowActionType.LeftClick) - && mc.DoWindowAction(c.ID, slot1, WindowActionType.LeftClick); - else return false; - } - - /// - /// Drag a stack of item over a set of slots. Those slots should be empty or have the same item as source item - /// - /// Source item - /// Slots to be drag over - /// Which mouse key to use: StartDragLeft, StartDragRight or StartDragMiddle - /// True if success or false if Failed - /// - /// After calling this method, you will need to wait until the server have updated the player inventory before doing next inventory action - /// - public bool DragOverSlots(int source, IEnumerable slots, WindowActionType mouseKey = WindowActionType.StartDragLeft) - { - if (!HasItem(source)) - return false; - List availableSlots = new(slots.Count()); - // filter out different item type or non-empty slots (they will be ignored silently) - foreach (var slot in slots) - if (ItemTypeEqual(source, slot) || !HasItem(slot)) - availableSlots.Add(slot); - if (availableSlots.Count > 0) - { - WindowActionType startDragging = WindowActionType.StartDragLeft; - WindowActionType addDragging = WindowActionType.AddDragLeft; - WindowActionType endDragging = WindowActionType.EndDragLeft; - switch (mouseKey) - { - case WindowActionType.StartDragRight: - { - startDragging = WindowActionType.StartDragRight; - addDragging = WindowActionType.AddDragRight; - endDragging = WindowActionType.EndDragRight; - break; - } - case WindowActionType.StartDragMiddle: - { - startDragging = WindowActionType.StartDragMiddle; - addDragging = WindowActionType.AddDragMiddle; - endDragging = WindowActionType.EndDragMiddle; - break; - } - } - mc.DoWindowAction(c.ID, source, WindowActionType.LeftClick); // grab item - mc.DoWindowAction(c.ID, -999, startDragging); - foreach (var slot in availableSlots) - { - mc.DoWindowAction(c.ID, slot, addDragging); - } - mc.DoWindowAction(c.ID, -999, endDragging); - mc.DoWindowAction(c.ID, source, WindowActionType.LeftClick); // put down item left (if any) - return true; - } - else return false; - } - - /// - /// Validate two slot by comparing they are different and within the maximum slot count of the container - /// - /// Slot 1 - /// Slot 2 - /// Second container (only if slot2 is in other container) - /// The compare result - private bool ValidateSlots(int s1, int s2, Container? s2Container = null) - { - if (s2Container is null) - return (s1 != s2 && s1 < c.Type.SlotCount() && s2 < c.Type.SlotCount()); - else - return (s1 < c.Type.SlotCount() && s2 < s2Container.Type.SlotCount()); - } - - /// - /// Check if the slot has an item inside - /// - /// Slot ID - /// Specify another contianer (only if the slot is in other container) - /// True if has item - private bool HasItem(int slot, Container? c = null) - { - c ??= this.c; - return c.Items.ContainsKey(slot); - } - - /// - /// Check both slots item type are the same - /// - /// - /// - /// Second container (only if slot2 is in other container) - /// True if they are equal - private bool ItemTypeEqual(int slot1, int slot2, Container? s2Container = null) - { - if (s2Container is null) - { - if (HasItem(slot1) && HasItem(slot2)) - return c.Items[slot1].Type == c.Items[slot2].Type; - else return false; - } - else - { - if (HasItem(slot1) && HasItem(slot2, s2Container)) - return c.Items[slot1].Type == s2Container.Items[slot2].Type; - else return false; - } - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette.cs deleted file mode 100644 index c8cbe3162b..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public abstract class ItemPalette - { - protected abstract Dictionary GetDict(); - private readonly Dictionary DictReverse = new(); - - public ItemPalette() - { - // Index reverse mappings for use in ToId() - foreach (KeyValuePair entry in GetDict()) - { - if (DictReverse.ContainsKey(entry.Value)) - continue; - - DictReverse.Add(entry.Value, entry.Key); - } - - // Hardcoded placeholder types for internal and network use - DictReverse[ItemType.Unknown] = (int)ItemType.Unknown; - DictReverse[ItemType.Null] = (int)ItemType.Null; - } - - public ItemType FromId(int id) - { - // Unknown item types may appear on Forge servers for custom items - if (!GetDict().ContainsKey(id)) - return ItemType.Unknown; - - return GetDict()[id]; - } - - public int ToId(ItemType itemType) - { - return DictReverse[itemType]; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette110.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette110.cs deleted file mode 100644 index 7a6a6d7928..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette110.cs +++ /dev/null @@ -1,613 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - /// - /// For MC 1.8 - /// Done manually by Milutinke :( - /// - public class ItemPalette110 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette110() - { - // Mapping IDs are a derived from: (Item ID << 16) | Data - mappings[0] = ItemType.Air; - mappings[65536] = ItemType.Stone; - mappings[65537] = ItemType.Granite; - mappings[65538] = ItemType.PolishedGranite; - mappings[65539] = ItemType.Diorite; - mappings[65540] = ItemType.PolishedDiorite; - mappings[65541] = ItemType.Andesite; - mappings[65542] = ItemType.PolishedAndesite; - mappings[131072] = ItemType.GrassBlock; - mappings[196608] = ItemType.Dirt; - mappings[196609] = ItemType.CoarseDirt; - mappings[196610] = ItemType.Podzol; - mappings[262144] = ItemType.Cobblestone; - mappings[327680] = ItemType.OakPlanks; - mappings[327681] = ItemType.SprucePlanks; - mappings[327682] = ItemType.BirchPlanks; - mappings[327683] = ItemType.JunglePlanks; - mappings[327684] = ItemType.AcaciaPlanks; - mappings[327685] = ItemType.DarkOakPlanks; - mappings[393216] = ItemType.OakSapling; - mappings[393217] = ItemType.SpruceSapling; - mappings[393218] = ItemType.BirchSapling; - mappings[393219] = ItemType.JungleSapling; - mappings[393220] = ItemType.AcaciaSapling; - mappings[393221] = ItemType.DarkOakSapling; - mappings[458752] = ItemType.Bedrock; - mappings[524288] = ItemType.WaterBucket; // Still Water Block Item - mappings[589824] = ItemType.WaterBucket; // Flowing Water Block Item - mappings[655360] = ItemType.LavaBucket; // Still Lava Block Item - mappings[720896] = ItemType.LavaBucket; // Flowing Lava Block Item - mappings[786432] = ItemType.Sand; - mappings[786433] = ItemType.RedSand; - mappings[851968] = ItemType.Gravel; - mappings[917504] = ItemType.GoldOre; - mappings[983040] = ItemType.IronOre; - mappings[1048576] = ItemType.CoalOre; - mappings[1114112] = ItemType.OakLog; - mappings[1114113] = ItemType.SpruceLog; - mappings[1114114] = ItemType.BirchLog; - mappings[1114115] = ItemType.JungleLog; - mappings[1179648] = ItemType.OakLeaves; - mappings[1179649] = ItemType.SpruceLeaves; - mappings[1179650] = ItemType.BirchLeaves; - mappings[1179651] = ItemType.JungleLeaves; - mappings[1245184] = ItemType.Sponge; - mappings[1245185] = ItemType.WetSponge; - mappings[1310720] = ItemType.Glass; - mappings[1376256] = ItemType.LapisOre; - mappings[1441792] = ItemType.LapisBlock; - mappings[1507328] = ItemType.Dispenser; - mappings[1572864] = ItemType.Sandstone; - mappings[1572865] = ItemType.ChiseledSandstone; - mappings[1572866] = ItemType.SmoothSandstone; - mappings[1638400] = ItemType.NoteBlock; - mappings[1769472] = ItemType.PoweredRail; - mappings[1835008] = ItemType.DetectorRail; - mappings[1900544] = ItemType.StickyPiston; - mappings[1966080] = ItemType.Cobweb; - mappings[2031617] = ItemType.ShortGrass; - mappings[2031618] = ItemType.Fern; - mappings[2097152] = ItemType.DeadBush; - mappings[2162688] = ItemType.Piston; - mappings[2293760] = ItemType.WhiteWool; - mappings[2293761] = ItemType.OrangeWool; - mappings[2293762] = ItemType.MagentaWool; - mappings[2293763] = ItemType.LightBlueWool; - mappings[2293764] = ItemType.YellowWool; - mappings[2293765] = ItemType.LimeWool; - mappings[2293766] = ItemType.PinkWool; - mappings[2293767] = ItemType.GrayWool; - mappings[2293768] = ItemType.LightGrayWool; - mappings[2293769] = ItemType.CyanWool; - mappings[2293770] = ItemType.PurpleWool; - mappings[2293771] = ItemType.BlueWool; - mappings[2293772] = ItemType.BrownWool; - mappings[2293773] = ItemType.GreenWool; - mappings[2293774] = ItemType.RedWool; - mappings[2293775] = ItemType.BlackWool; - mappings[2424832] = ItemType.Dandelion; - mappings[2490368] = ItemType.Poppy; - mappings[2490369] = ItemType.BlueOrchid; - mappings[2490370] = ItemType.Allium; - mappings[2490371] = ItemType.AzureBluet; - mappings[2490372] = ItemType.RedTulip; - mappings[2490373] = ItemType.OrangeTulip; - mappings[2490374] = ItemType.WhiteTulip; - mappings[2490375] = ItemType.PinkTulip; - mappings[2490376] = ItemType.OxeyeDaisy; - mappings[2555904] = ItemType.BrownMushroom; - mappings[2621440] = ItemType.RedMushroom; - mappings[2686976] = ItemType.GoldBlock; - mappings[2752512] = ItemType.IronBlock; - mappings[2883584] = ItemType.StoneSlab; - mappings[2883585] = ItemType.SandstoneSlab; - mappings[2883587] = ItemType.CobblestoneSlab; - mappings[2883588] = ItemType.BrickSlab; - mappings[2883589] = ItemType.StoneBrickSlab; - mappings[2883590] = ItemType.NetherBrickSlab; - mappings[2883591] = ItemType.QuartzSlab; - mappings[2949120] = ItemType.Bricks; - mappings[3014656] = ItemType.Tnt; - mappings[3080192] = ItemType.Bookshelf; - mappings[3145728] = ItemType.MossyCobblestone; - mappings[3211264] = ItemType.Obsidian; - mappings[3276800] = ItemType.Torch; - mappings[3407872] = ItemType.Spawner; - mappings[3473408] = ItemType.OakStairs; - mappings[3538944] = ItemType.Chest; - mappings[3670016] = ItemType.DiamondOre; - mappings[3735552] = ItemType.DiamondBlock; - mappings[3801088] = ItemType.CraftingTable; - mappings[3932160] = ItemType.Farmland; - mappings[3997696] = ItemType.Furnace; - mappings[4259840] = ItemType.Ladder; - mappings[4390912] = ItemType.CobblestoneStairs; - mappings[4587520] = ItemType.StonePressurePlate; - mappings[4718592] = ItemType.OakPressurePlate; - mappings[5046272] = ItemType.StoneButton; - mappings[5177344] = ItemType.Ice; - mappings[5308416] = ItemType.Cactus; - mappings[5373952] = ItemType.Clay; - mappings[5505024] = ItemType.Jukebox; - mappings[5570560] = ItemType.OakFence; - mappings[5832704] = ItemType.Glowstone; - mappings[6225920] = ItemType.WhiteStainedGlass; - mappings[6225921] = ItemType.OrangeStainedGlass; - mappings[6225922] = ItemType.MagentaStainedGlass; - mappings[6225923] = ItemType.LightBlueStainedGlass; - mappings[6225924] = ItemType.YellowStainedGlass; - mappings[6225925] = ItemType.LimeStainedGlass; - mappings[6225926] = ItemType.PinkStainedGlass; - mappings[6225927] = ItemType.GrayStainedGlass; - mappings[6225928] = ItemType.LightGrayStainedGlass; - mappings[6225929] = ItemType.CyanStainedGlass; - mappings[6225930] = ItemType.PurpleStainedGlass; - mappings[6225931] = ItemType.BlueStainedGlass; - mappings[6225932] = ItemType.BrownStainedGlass; - mappings[6225933] = ItemType.GreenStainedGlass; - mappings[6225934] = ItemType.RedStainedGlass; - mappings[6225935] = ItemType.BlackStainedGlass; - mappings[6291456] = ItemType.OakTrapdoor; - mappings[6422528] = ItemType.StoneBricks; - mappings[6422529] = ItemType.MossyStoneBricks; - mappings[6422530] = ItemType.CrackedStoneBricks; - mappings[6422531] = ItemType.ChiseledStoneBricks; - mappings[6488064] = ItemType.BrownMushroomBlock; - mappings[6619136] = ItemType.IronBars; - mappings[6684672] = ItemType.GlassPane; - mappings[6946816] = ItemType.Vine; - mappings[7012352] = ItemType.OakFenceGate; - mappings[7077888] = ItemType.BrickStairs; - mappings[7143424] = ItemType.StoneBrickStairs; - mappings[7274496] = ItemType.LilyPad; - mappings[7602176] = ItemType.EnchantingTable; - mappings[7864320] = ItemType.EndPortalFrame; - mappings[7929856] = ItemType.EndStone; - mappings[7995392] = ItemType.DragonEgg; - mappings[8257536] = ItemType.OakSlab; - mappings[8257537] = ItemType.SpruceSlab; - mappings[8257538] = ItemType.BirchSlab; - mappings[8257539] = ItemType.JungleSlab; - mappings[8257540] = ItemType.AcaciaSlab; - mappings[8257541] = ItemType.DarkOakSlab; - mappings[8454144] = ItemType.EmeraldOre; - mappings[8519680] = ItemType.EnderChest; - mappings[8585216] = ItemType.TripwireHook; - mappings[8716288] = ItemType.EmeraldBlock; - mappings[8781824] = ItemType.SpruceStairs; - mappings[8847360] = ItemType.BirchStairs; - mappings[8912896] = ItemType.JungleStairs; - mappings[8978432] = ItemType.CommandBlock; - mappings[9043968] = ItemType.Beacon; - mappings[9109504] = ItemType.CobblestoneWall; - mappings[4325376] = ItemType.Rail; - mappings[4521984] = ItemType.Lever; - mappings[4784128] = ItemType.RedstoneOre; - mappings[4980736] = ItemType.RedstoneTorch; - mappings[5111808] = ItemType.Snow; - mappings[5242880] = ItemType.SnowBlock; - mappings[5636096] = ItemType.Pumpkin; - mappings[5701632] = ItemType.Netherrack; - mappings[5767168] = ItemType.SoulSand; - mappings[5963776] = ItemType.JackOLantern; - mappings[6356992] = ItemType.InfestedStone; - mappings[6356993] = ItemType.InfestedCobblestone; - mappings[6356994] = ItemType.InfestedStoneBricks; - mappings[6356995] = ItemType.InfestedMossyStoneBricks; - mappings[6356996] = ItemType.InfestedCrackedStoneBricks; - mappings[6356997] = ItemType.InfestedChiseledStoneBricks; - mappings[6553600] = ItemType.RedMushroomBlock; - mappings[6750208] = ItemType.Melon; - mappings[7208960] = ItemType.Mycelium; - mappings[7340032] = ItemType.NetherBricks; - mappings[7405568] = ItemType.NetherBrickFence; - mappings[7471104] = ItemType.NetherBrickStairs; - mappings[8060928] = ItemType.RedstoneLamp; - mappings[8388608] = ItemType.SandstoneStairs; - mappings[9109505] = ItemType.MossyCobblestoneWall; - mappings[9502720] = ItemType.Anvil; - mappings[9502721] = ItemType.ChippedAnvil; - mappings[9502722] = ItemType.DamagedAnvil; - mappings[9568256] = ItemType.TrappedChest; - mappings[9633792] = ItemType.LightWeightedPressurePlate; - mappings[9699328] = ItemType.HeavyWeightedPressurePlate; - mappings[9895936] = ItemType.DaylightDetector; - mappings[9961472] = ItemType.RedstoneBlock; - mappings[10027008] = ItemType.NetherQuartzOre; - mappings[10092544] = ItemType.Hopper; - mappings[10158080] = ItemType.QuartzBlock; - mappings[10158081] = ItemType.ChiseledQuartzBlock; - mappings[10158082] = ItemType.QuartzPillar; - mappings[10223616] = ItemType.QuartzStairs; - mappings[10289152] = ItemType.ActivatorRail; - mappings[10354688] = ItemType.Dropper; - mappings[10420224] = ItemType.WhiteTerracotta; - mappings[10420225] = ItemType.OrangeTerracotta; - mappings[10420226] = ItemType.MagentaTerracotta; - mappings[10420227] = ItemType.LightBlueTerracotta; - mappings[10420228] = ItemType.YellowTerracotta; - mappings[10420229] = ItemType.LimeTerracotta; - mappings[10420230] = ItemType.PinkTerracotta; - mappings[10420231] = ItemType.GrayTerracotta; - mappings[10420232] = ItemType.LightGrayTerracotta; - mappings[10420233] = ItemType.CyanTerracotta; - mappings[10420234] = ItemType.PurpleTerracotta; - mappings[10420235] = ItemType.BlueTerracotta; - mappings[10420236] = ItemType.BrownTerracotta; - mappings[10420237] = ItemType.GreenTerracotta; - mappings[10420238] = ItemType.RedTerracotta; - mappings[10420239] = ItemType.BlackTerracotta; - mappings[10485760] = ItemType.WhiteStainedGlassPane; - mappings[10485761] = ItemType.OrangeStainedGlassPane; - mappings[10485762] = ItemType.MagentaStainedGlassPane; - mappings[10485763] = ItemType.LightBlueStainedGlassPane; - mappings[10485764] = ItemType.YellowStainedGlassPane; - mappings[10485765] = ItemType.LimeStainedGlassPane; - mappings[10485766] = ItemType.PinkStainedGlassPane; - mappings[10485767] = ItemType.GrayStainedGlassPane; - mappings[10485768] = ItemType.LightGrayStainedGlassPane; - mappings[10485769] = ItemType.CyanStainedGlassPane; - mappings[10485770] = ItemType.PurpleStainedGlassPane; - mappings[10485771] = ItemType.BlueStainedGlassPane; - mappings[10485772] = ItemType.BrownStainedGlassPane; - mappings[10485773] = ItemType.GreenStainedGlassPane; - mappings[10485774] = ItemType.RedStainedGlassPane; - mappings[10485775] = ItemType.BlackStainedGlassPane; - mappings[10551296] = ItemType.AcaciaLeaves; - mappings[10551297] = ItemType.DarkOakLeaves; - mappings[10616832] = ItemType.AcaciaLog; - mappings[10616833] = ItemType.DarkOakLog; - mappings[10682368] = ItemType.AcaciaStairs; - mappings[10747904] = ItemType.DarkOakStairs; - mappings[10813440] = ItemType.SlimeBlock; - mappings[10878976] = ItemType.Barrier; - mappings[10944512] = ItemType.IronTrapdoor; - mappings[11010048] = ItemType.Prismarine; - mappings[11010049] = ItemType.PrismarineBricks; - mappings[11010050] = ItemType.DarkPrismarine; - mappings[11075584] = ItemType.SeaLantern; - mappings[11141120] = ItemType.HayBlock; - mappings[11206656] = ItemType.WhiteCarpet; - mappings[11206657] = ItemType.OrangeCarpet; - mappings[11206658] = ItemType.MagentaCarpet; - mappings[11206659] = ItemType.LightBlueCarpet; - mappings[11206660] = ItemType.YellowCarpet; - mappings[11206661] = ItemType.LimeCarpet; - mappings[11206662] = ItemType.PinkCarpet; - mappings[11206663] = ItemType.GrayCarpet; - mappings[11206664] = ItemType.LightGrayCarpet; - mappings[11206665] = ItemType.CyanCarpet; - mappings[11206666] = ItemType.PurpleCarpet; - mappings[11206667] = ItemType.BlueCarpet; - mappings[11206668] = ItemType.BrownCarpet; - mappings[11206669] = ItemType.GreenCarpet; - mappings[11206670] = ItemType.RedCarpet; - mappings[11206671] = ItemType.BlackCarpet; - mappings[11272192] = ItemType.Terracotta; - mappings[11337728] = ItemType.CoalBlock; - mappings[11403264] = ItemType.PackedIce; - mappings[11468800] = ItemType.Sunflower; - mappings[11468801] = ItemType.Lilac; - mappings[11468802] = ItemType.TallGrass; - mappings[11468803] = ItemType.LargeFern; - mappings[11468804] = ItemType.RoseBush; - mappings[11468805] = ItemType.Peony; - mappings[11730944] = ItemType.RedSandstone; - mappings[11730945] = ItemType.ChiseledRedSandstone; - mappings[11730946] = ItemType.SmoothRedSandstone; - mappings[11796480] = ItemType.RedSandstoneStairs; - mappings[11927552] = ItemType.RedSandstoneSlab; - mappings[11993088] = ItemType.SpruceFenceGate; - mappings[12058624] = ItemType.BirchFenceGate; - mappings[12124160] = ItemType.JungleFenceGate; - mappings[12189696] = ItemType.DarkOakFenceGate; - mappings[12255232] = ItemType.AcaciaFenceGate; - mappings[12320768] = ItemType.SpruceFence; - mappings[12386304] = ItemType.BirchFence; - mappings[12451840] = ItemType.JungleFence; - mappings[12517376] = ItemType.DarkOakFence; - mappings[12582912] = ItemType.AcaciaFence; - mappings[12976128] = ItemType.EndRod; - mappings[13041664] = ItemType.ChorusPlant; - mappings[13107200] = ItemType.ChorusFlower; - mappings[13172736] = ItemType.PurpurBlock; - mappings[13238272] = ItemType.PurpurPillar; - mappings[13303808] = ItemType.PurpurStairs; - mappings[13434880] = ItemType.PurpurSlab; - mappings[13500416] = ItemType.EndStoneBricks; - mappings[13631488] = ItemType.DirtPath; - mappings[13762560] = ItemType.RepeatingCommandBlock; - mappings[13828096] = ItemType.ChainCommandBlock; - mappings[13959168] = ItemType.MagmaBlock; - mappings[14024704] = ItemType.NetherWartBlock; - mappings[14090240] = ItemType.RedNetherBricks; - mappings[14155776] = ItemType.BoneBlock; - mappings[14221312] = ItemType.StructureVoid; - mappings[16711680] = ItemType.StructureBlock; - mappings[16777216] = ItemType.IronShovel; - mappings[16842752] = ItemType.IronPickaxe; - mappings[16908288] = ItemType.IronAxe; - mappings[16973824] = ItemType.FlintAndSteel; - mappings[17039360] = ItemType.Apple; - mappings[17104896] = ItemType.Bow; - mappings[17170432] = ItemType.Arrow; - mappings[17235968] = ItemType.Coal; - mappings[17235969] = ItemType.Charcoal; - mappings[17301504] = ItemType.Diamond; - mappings[17367040] = ItemType.IronIngot; - mappings[17432576] = ItemType.GoldIngot; - mappings[17498112] = ItemType.IronSword; - mappings[17825792] = ItemType.StoneSword; - mappings[17891328] = ItemType.StoneShovel; - mappings[17956864] = ItemType.StonePickaxe; - mappings[18022400] = ItemType.StoneAxe; - mappings[18087936] = ItemType.DiamondSword; - mappings[18153472] = ItemType.DiamondShovel; - mappings[18219008] = ItemType.DiamondPickaxe; - mappings[18284544] = ItemType.DiamondAxe; - mappings[18350080] = ItemType.Stick; - mappings[18415616] = ItemType.Bowl; - mappings[18481152] = ItemType.MushroomStew; - mappings[18546688] = ItemType.GoldenSword; - mappings[18612224] = ItemType.GoldenShovel; - mappings[18677760] = ItemType.GoldenPickaxe; - mappings[18743296] = ItemType.GoldenAxe; - mappings[18808832] = ItemType.String; - mappings[18874368] = ItemType.Feather; - mappings[18939904] = ItemType.Gunpowder; - mappings[19070976] = ItemType.StoneHoe; - mappings[19136512] = ItemType.IronHoe; - mappings[19202048] = ItemType.DiamondHoe; - mappings[19267584] = ItemType.GoldenHoe; - mappings[19464192] = ItemType.Bread; - mappings[19529728] = ItemType.LeatherHelmet; - mappings[19595264] = ItemType.LeatherChestplate; - mappings[19660800] = ItemType.LeatherLeggings; - mappings[19726336] = ItemType.LeatherBoots; - mappings[19791872] = ItemType.ChainmailHelmet; - mappings[19857408] = ItemType.ChainmailChestplate; - mappings[19922944] = ItemType.ChainmailLeggings; - mappings[19988480] = ItemType.ChainmailBoots; - mappings[20054016] = ItemType.IronHelmet; - mappings[20119552] = ItemType.IronChestplate; - mappings[20185088] = ItemType.IronLeggings; - mappings[20250624] = ItemType.IronBoots; - mappings[20316160] = ItemType.DiamondHelmet; - mappings[20381696] = ItemType.DiamondChestplate; - mappings[20447232] = ItemType.DiamondLeggings; - mappings[20512768] = ItemType.DiamondBoots; - mappings[20578304] = ItemType.GoldenHelmet; - mappings[20643840] = ItemType.GoldenChestplate; - mappings[20709376] = ItemType.GoldenLeggings; - mappings[20774912] = ItemType.GoldenBoots; - mappings[20840448] = ItemType.Flint; - mappings[20905984] = ItemType.Porkchop; - mappings[20971520] = ItemType.CookedPorkchop; - mappings[21037056] = ItemType.Painting; - mappings[21102592] = ItemType.GoldenApple; - mappings[21102593] = ItemType.EnchantedGoldenApple; - mappings[21168128] = ItemType.OakSign; - mappings[21299200] = ItemType.Bucket; - mappings[21430272] = ItemType.LavaBucket; - mappings[21495808] = ItemType.Minecart; - mappings[21561344] = ItemType.Saddle; - mappings[21626880] = ItemType.IronDoor; - mappings[21692416] = ItemType.Redstone; - mappings[21757952] = ItemType.Snowball; - mappings[21823488] = ItemType.OakBoat; - mappings[21889024] = ItemType.Leather; - mappings[21954560] = ItemType.MilkBucket; - mappings[22020096] = ItemType.Brick; - mappings[22085632] = ItemType.ClayBall; - mappings[22151168] = ItemType.SugarCane; - mappings[22216704] = ItemType.Paper; - mappings[22282240] = ItemType.Book; - mappings[22347776] = ItemType.SlimeBall; - mappings[22413312] = ItemType.ChestMinecart; - mappings[22478848] = ItemType.FurnaceMinecart; - mappings[22544384] = ItemType.Egg; - mappings[22609920] = ItemType.Compass; - mappings[22675456] = ItemType.FishingRod; - mappings[22740992] = ItemType.Clock; - mappings[22806528] = ItemType.GlowstoneDust; - mappings[22872064] = ItemType.Salmon; - mappings[22872065] = ItemType.Salmon; - mappings[22872066] = ItemType.TropicalFish; - mappings[22872067] = ItemType.Pufferfish; - mappings[22937600] = ItemType.CookedSalmon; - mappings[22937601] = ItemType.CookedSalmon; - mappings[23003136] = ItemType.InkSac; - mappings[23003137] = ItemType.RedDye; - mappings[23003138] = ItemType.GreenDye; - mappings[23003139] = ItemType.CocoaBeans; - mappings[23003140] = ItemType.LapisLazuli; - mappings[23003141] = ItemType.PurpleDye; - mappings[23003142] = ItemType.CyanDye; - mappings[23003143] = ItemType.LightGrayDye; - mappings[23003144] = ItemType.GrayDye; - mappings[23003145] = ItemType.PinkDye; - mappings[23003146] = ItemType.LimeDye; - mappings[23003147] = ItemType.YellowDye; - mappings[23003148] = ItemType.LightBlueDye; - mappings[23003149] = ItemType.MagentaDye; - mappings[23003150] = ItemType.OrangeDye; - mappings[23003151] = ItemType.BoneMeal; - mappings[23068672] = ItemType.Bone; - mappings[23134208] = ItemType.Sugar; - mappings[23199744] = ItemType.Cake; - mappings[23265280] = ItemType.RedBed; - mappings[23330816] = ItemType.Repeater; - mappings[23396352] = ItemType.Cookie; - mappings[23527424] = ItemType.Shears; - mappings[23592960] = ItemType.MelonSlice; - mappings[23658496] = ItemType.PumpkinSeeds; - mappings[23724032] = ItemType.MelonSeeds; - mappings[23789568] = ItemType.Beef; - mappings[23855104] = ItemType.CookedBeef; - mappings[23920640] = ItemType.Chicken; - mappings[23986176] = ItemType.CookedChicken; - mappings[24051712] = ItemType.RottenFlesh; - mappings[24117248] = ItemType.EnderPearl; - mappings[24182784] = ItemType.BlazeRod; - mappings[24248320] = ItemType.GhastTear; - mappings[24313856] = ItemType.GoldNugget; - mappings[24379392] = ItemType.NetherWart; - mappings[24444928] = ItemType.Potion; - mappings[24510464] = ItemType.GlassBottle; - mappings[24576000] = ItemType.SpiderEye; - mappings[24641536] = ItemType.FermentedSpiderEye; - mappings[24707072] = ItemType.BlazePowder; - mappings[24772608] = ItemType.MagmaCream; - mappings[24838144] = ItemType.BrewingStand; - mappings[24903680] = ItemType.Cauldron; - mappings[24969216] = ItemType.EnderEye; - mappings[25034752] = ItemType.GlisteringMelonSlice; - mappings[25100288] = ItemType.BatSpawnEgg; - mappings[25100288] = ItemType.BlazeSpawnEgg; - mappings[25100288] = ItemType.CaveSpiderSpawnEgg; - mappings[25100288] = ItemType.ChickenSpawnEgg; - mappings[25100288] = ItemType.CowSpawnEgg; - mappings[25100288] = ItemType.CreeperSpawnEgg; - mappings[25100288] = ItemType.EndermanSpawnEgg; - mappings[25100288] = ItemType.EndermiteSpawnEgg; - mappings[25100288] = ItemType.GhastSpawnEgg; - mappings[25100288] = ItemType.GuardianSpawnEgg; - mappings[25100288] = ItemType.HorseSpawnEgg; - mappings[25100288] = ItemType.MagmaCubeSpawnEgg; - mappings[25100288] = ItemType.MooshroomSpawnEgg; - mappings[25100288] = ItemType.OcelotSpawnEgg; - mappings[25100288] = ItemType.PigSpawnEgg; - mappings[25100288] = ItemType.PolarBearSpawnEgg; - mappings[25100288] = ItemType.RabbitSpawnEgg; - mappings[25100288] = ItemType.SheepSpawnEgg; - mappings[25100288] = ItemType.ShulkerSpawnEgg; - mappings[25100288] = ItemType.SilverfishSpawnEgg; - mappings[25100288] = ItemType.SkeletonSpawnEgg; - mappings[25100288] = ItemType.SlimeSpawnEgg; - mappings[25100288] = ItemType.SpiderSpawnEgg; - mappings[25100288] = ItemType.SquidSpawnEgg; - mappings[25100288] = ItemType.VillagerSpawnEgg; - mappings[25100288] = ItemType.WitchSpawnEgg; - mappings[25100288] = ItemType.WolfSpawnEgg; - mappings[25100288] = ItemType.ZombieSpawnEgg; - mappings[25100288] = ItemType.ZombifiedPiglinSpawnEgg; - mappings[25165824] = ItemType.ExperienceBottle; - mappings[25231360] = ItemType.FireCharge; - mappings[25296896] = ItemType.WritableBook; - mappings[25362432] = ItemType.WrittenBook; - mappings[25427968] = ItemType.Emerald; - mappings[25493504] = ItemType.ItemFrame; - mappings[25559040] = ItemType.FlowerPot; - mappings[25624576] = ItemType.Carrot; - mappings[25690112] = ItemType.Potato; - mappings[25755648] = ItemType.BakedPotato; - mappings[25821184] = ItemType.PoisonousPotato; - mappings[25886720] = ItemType.Map; - mappings[25952256] = ItemType.GoldenCarrot; - mappings[26017792] = ItemType.SkeletonSkull; - mappings[26017793] = ItemType.WitherSkeletonSkull; - mappings[26017794] = ItemType.ZombieHead; - mappings[26017795] = ItemType.PlayerHead; - mappings[26017796] = ItemType.CreeperHead; - mappings[26017797] = ItemType.DragonHead; - mappings[26083328] = ItemType.CarrotOnAStick; - mappings[26148864] = ItemType.NetherStar; - mappings[26214400] = ItemType.PumpkinPie; - mappings[26279936] = ItemType.FireworkRocket; - mappings[26411008] = ItemType.EnchantedBook; - mappings[26476544] = ItemType.Comparator; - mappings[26542080] = ItemType.NetherBrick; - mappings[26607616] = ItemType.Quartz; - mappings[26673152] = ItemType.TntMinecart; - mappings[26738688] = ItemType.HopperMinecart; - mappings[26804224] = ItemType.PrismarineShard; - mappings[26869760] = ItemType.PrismarineCrystals; - mappings[26935296] = ItemType.Rabbit; - mappings[27000832] = ItemType.CookedRabbit; - mappings[27066368] = ItemType.RabbitStew; - mappings[27131904] = ItemType.RabbitFoot; - mappings[27197440] = ItemType.RabbitHide; - mappings[27262976] = ItemType.ArmorStand; - mappings[27328512] = ItemType.IronHorseArmor; - mappings[27394048] = ItemType.GoldenHorseArmor; - mappings[27459584] = ItemType.DiamondHorseArmor; - mappings[27525120] = ItemType.Lead; - mappings[27590656] = ItemType.NameTag; - mappings[27656192] = ItemType.CommandBlockMinecart; - mappings[27721728] = ItemType.Mutton; - mappings[27787264] = ItemType.CookedMutton; - mappings[27852800] = ItemType.BlackBanner; - mappings[27852801] = ItemType.RedBanner; - mappings[27852802] = ItemType.GreenBanner; - mappings[27852803] = ItemType.BrownBanner; - mappings[27852804] = ItemType.BlueBanner; - mappings[27852805] = ItemType.PurpleBanner; - mappings[27852806] = ItemType.CyanBanner; - mappings[27852807] = ItemType.LightGrayBanner; - mappings[27852808] = ItemType.GrayBanner; - mappings[27852809] = ItemType.PinkBanner; - mappings[27852810] = ItemType.LimeBanner; - mappings[27852811] = ItemType.YellowBanner; - mappings[27852812] = ItemType.LightBlueBanner; - mappings[27852813] = ItemType.MagentaBanner; - mappings[27852814] = ItemType.OrangeBanner; - mappings[27852815] = ItemType.WhiteBanner; - mappings[27918336] = ItemType.EndCrystal; - mappings[27983872] = ItemType.SpruceDoor; - mappings[28049408] = ItemType.BirchDoor; - mappings[28114944] = ItemType.JungleDoor; - mappings[28180480] = ItemType.AcaciaDoor; - mappings[28246016] = ItemType.DarkOakDoor; - mappings[28311552] = ItemType.ChorusFruit; - mappings[28377088] = ItemType.PoppedChorusFruit; - mappings[28442624] = ItemType.Beetroot; - mappings[28508160] = ItemType.BeetrootSeeds; - mappings[28573696] = ItemType.BeetrootSoup; - mappings[28639232] = ItemType.DragonBreath; - mappings[28704768] = ItemType.SplashPotion; - mappings[28770304] = ItemType.SpectralArrow; - mappings[28835840] = ItemType.Arrow; - mappings[28901376] = ItemType.LingeringPotion; - mappings[28966912] = ItemType.Shield; - mappings[29032448] = ItemType.Elytra; - mappings[29097984] = ItemType.SpruceBoat; - mappings[29163520] = ItemType.BirchBoat; - mappings[29229056] = ItemType.JungleBoat; - mappings[29294592] = ItemType.AcaciaBoat; - mappings[29360128] = ItemType.DarkOakBoat; - mappings[147849216] = ItemType.MusicDisc13; - mappings[147914752] = ItemType.MusicDiscCat; - mappings[147980288] = ItemType.MusicDiscBlocks; - mappings[148045824] = ItemType.MusicDiscChirp; - mappings[148111360] = ItemType.MusicDiscFar; - mappings[148176896] = ItemType.MusicDiscMall; - mappings[148242432] = ItemType.MusicDiscMellohi; - mappings[148307968] = ItemType.MusicDiscStal; - mappings[148373504] = ItemType.MusicDiscStrad; - mappings[148439040] = ItemType.MusicDiscWard; - mappings[148504576] = ItemType.MusicDisc11; - mappings[148570112] = ItemType.MusicDiscWait; - mappings[9371648] = ItemType.OakButton; - mappings[17563648] = ItemType.WoodenSword; - mappings[17629184] = ItemType.WoodenShovel; - mappings[17694720] = ItemType.WoodenPickaxe; - mappings[17760256] = ItemType.WoodenAxe; - mappings[19005440] = ItemType.WoodenHoe; - mappings[19333120] = ItemType.WheatSeeds; - mappings[19398656] = ItemType.Wheat; - mappings[21233664] = ItemType.OakDoor; - mappings[21364736] = ItemType.WaterBucket; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} \ No newline at end of file diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette111.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette111.cs deleted file mode 100644 index 02f2694809..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette111.cs +++ /dev/null @@ -1,646 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - /// - /// For MC 1.8 - /// Done manually by Milutinke :( - /// - public class ItemPalette111 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette111() - { - // Mapping IDs are a derived from: (Item ID << 16) | Data - mappings[0] = ItemType.Air; - mappings[65536] = ItemType.Stone; - mappings[65537] = ItemType.Granite; - mappings[65538] = ItemType.PolishedGranite; - mappings[65539] = ItemType.Diorite; - mappings[65540] = ItemType.PolishedDiorite; - mappings[65541] = ItemType.Andesite; - mappings[65542] = ItemType.PolishedAndesite; - mappings[131072] = ItemType.GrassBlock; - mappings[196608] = ItemType.Dirt; - mappings[196609] = ItemType.CoarseDirt; - mappings[196610] = ItemType.Podzol; - mappings[262144] = ItemType.Cobblestone; - mappings[327680] = ItemType.OakPlanks; - mappings[327681] = ItemType.SprucePlanks; - mappings[327682] = ItemType.BirchPlanks; - mappings[327683] = ItemType.JunglePlanks; - mappings[327684] = ItemType.AcaciaPlanks; - mappings[327685] = ItemType.DarkOakPlanks; - mappings[393216] = ItemType.OakSapling; - mappings[393217] = ItemType.SpruceSapling; - mappings[393218] = ItemType.BirchSapling; - mappings[393219] = ItemType.JungleSapling; - mappings[393220] = ItemType.AcaciaSapling; - mappings[393221] = ItemType.DarkOakSapling; - mappings[458752] = ItemType.Bedrock; - mappings[524288] = ItemType.WaterBucket; // Still Water Block Item - mappings[589824] = ItemType.WaterBucket; // Flowing Water Block Item - mappings[655360] = ItemType.LavaBucket; // Still Lava Block Item - mappings[720896] = ItemType.LavaBucket; // Flowing Lava Block Item - mappings[786432] = ItemType.Sand; - mappings[786433] = ItemType.RedSand; - mappings[851968] = ItemType.Gravel; - mappings[917504] = ItemType.GoldOre; - mappings[983040] = ItemType.IronOre; - mappings[1048576] = ItemType.CoalOre; - mappings[1114112] = ItemType.OakLog; - mappings[1114113] = ItemType.SpruceLog; - mappings[1114114] = ItemType.BirchLog; - mappings[1114115] = ItemType.JungleLog; - mappings[1179648] = ItemType.OakLeaves; - mappings[1179649] = ItemType.SpruceLeaves; - mappings[1179650] = ItemType.BirchLeaves; - mappings[1179651] = ItemType.JungleLeaves; - mappings[1245184] = ItemType.Sponge; - mappings[1245185] = ItemType.WetSponge; - mappings[1310720] = ItemType.Glass; - mappings[1376256] = ItemType.LapisOre; - mappings[1441792] = ItemType.LapisBlock; - mappings[1507328] = ItemType.Dispenser; - mappings[1572864] = ItemType.Sandstone; - mappings[1572865] = ItemType.ChiseledSandstone; - mappings[1572866] = ItemType.SmoothSandstone; - mappings[1638400] = ItemType.NoteBlock; - mappings[1769472] = ItemType.PoweredRail; - mappings[1835008] = ItemType.DetectorRail; - mappings[1900544] = ItemType.StickyPiston; - mappings[1966080] = ItemType.Cobweb; - mappings[2031617] = ItemType.ShortGrass; - mappings[2031618] = ItemType.Fern; - mappings[2097152] = ItemType.DeadBush; - mappings[2162688] = ItemType.Piston; - mappings[2293760] = ItemType.WhiteWool; - mappings[2293761] = ItemType.OrangeWool; - mappings[2293762] = ItemType.MagentaWool; - mappings[2293763] = ItemType.LightBlueWool; - mappings[2293764] = ItemType.YellowWool; - mappings[2293765] = ItemType.LimeWool; - mappings[2293766] = ItemType.PinkWool; - mappings[2293767] = ItemType.GrayWool; - mappings[2293768] = ItemType.LightGrayWool; - mappings[2293769] = ItemType.CyanWool; - mappings[2293770] = ItemType.PurpleWool; - mappings[2293771] = ItemType.BlueWool; - mappings[2293772] = ItemType.BrownWool; - mappings[2293773] = ItemType.GreenWool; - mappings[2293774] = ItemType.RedWool; - mappings[2293775] = ItemType.BlackWool; - mappings[2424832] = ItemType.Dandelion; - mappings[2490368] = ItemType.Poppy; - mappings[2490369] = ItemType.BlueOrchid; - mappings[2490370] = ItemType.Allium; - mappings[2490371] = ItemType.AzureBluet; - mappings[2490372] = ItemType.RedTulip; - mappings[2490373] = ItemType.OrangeTulip; - mappings[2490374] = ItemType.WhiteTulip; - mappings[2490375] = ItemType.PinkTulip; - mappings[2490376] = ItemType.OxeyeDaisy; - mappings[2555904] = ItemType.BrownMushroom; - mappings[2621440] = ItemType.RedMushroom; - mappings[2686976] = ItemType.GoldBlock; - mappings[2752512] = ItemType.IronBlock; - mappings[2883584] = ItemType.StoneSlab; - mappings[2883585] = ItemType.SandstoneSlab; - mappings[2883587] = ItemType.CobblestoneSlab; - mappings[2883588] = ItemType.BrickSlab; - mappings[2883589] = ItemType.StoneBrickSlab; - mappings[2883590] = ItemType.NetherBrickSlab; - mappings[2883591] = ItemType.QuartzSlab; - mappings[2949120] = ItemType.Bricks; - mappings[3014656] = ItemType.Tnt; - mappings[3080192] = ItemType.Bookshelf; - mappings[3145728] = ItemType.MossyCobblestone; - mappings[3211264] = ItemType.Obsidian; - mappings[3276800] = ItemType.Torch; - mappings[3407872] = ItemType.Spawner; - mappings[3473408] = ItemType.OakStairs; - mappings[3538944] = ItemType.Chest; - mappings[3670016] = ItemType.DiamondOre; - mappings[3735552] = ItemType.DiamondBlock; - mappings[3801088] = ItemType.CraftingTable; - mappings[3932160] = ItemType.Farmland; - mappings[3997696] = ItemType.Furnace; - mappings[4259840] = ItemType.Ladder; - mappings[4325376] = ItemType.Rail; - mappings[4390912] = ItemType.CobblestoneStairs; - mappings[4521984] = ItemType.Lever; - mappings[4587520] = ItemType.StonePressurePlate; - mappings[4718592] = ItemType.OakPressurePlate; - mappings[4784128] = ItemType.RedstoneOre; - mappings[4980736] = ItemType.RedstoneTorch; - mappings[5046272] = ItemType.StoneButton; - mappings[5111808] = ItemType.Snow; - mappings[5177344] = ItemType.Ice; - mappings[5242880] = ItemType.SnowBlock; - mappings[5308416] = ItemType.Cactus; - mappings[5373952] = ItemType.Clay; - mappings[5505024] = ItemType.Jukebox; - mappings[5570560] = ItemType.OakFence; - mappings[5636096] = ItemType.Pumpkin; - mappings[5701632] = ItemType.Netherrack; - mappings[5767168] = ItemType.SoulSand; - mappings[5832704] = ItemType.Glowstone; - mappings[5963776] = ItemType.JackOLantern; - mappings[6225920] = ItemType.WhiteStainedGlass; - mappings[6225921] = ItemType.OrangeStainedGlass; - mappings[6225922] = ItemType.MagentaStainedGlass; - mappings[6225923] = ItemType.LightBlueStainedGlass; - mappings[6225924] = ItemType.YellowStainedGlass; - mappings[6225925] = ItemType.LimeStainedGlass; - mappings[6225926] = ItemType.PinkStainedGlass; - mappings[6225927] = ItemType.GrayStainedGlass; - mappings[6225928] = ItemType.LightGrayStainedGlass; - mappings[6225929] = ItemType.CyanStainedGlass; - mappings[6225930] = ItemType.PurpleStainedGlass; - mappings[6225931] = ItemType.BlueStainedGlass; - mappings[6225932] = ItemType.BrownStainedGlass; - mappings[6225933] = ItemType.GreenStainedGlass; - mappings[6225934] = ItemType.RedStainedGlass; - mappings[6225935] = ItemType.BlackStainedGlass; - mappings[6291456] = ItemType.OakTrapdoor; - mappings[6356992] = ItemType.InfestedStone; - mappings[6356993] = ItemType.InfestedCobblestone; - mappings[6356994] = ItemType.InfestedStoneBricks; - mappings[6356995] = ItemType.InfestedMossyStoneBricks; - mappings[6356996] = ItemType.InfestedCrackedStoneBricks; - mappings[6356997] = ItemType.InfestedChiseledStoneBricks; - mappings[6422528] = ItemType.StoneBricks; - mappings[6422529] = ItemType.MossyStoneBricks; - mappings[6422530] = ItemType.CrackedStoneBricks; - mappings[6422531] = ItemType.ChiseledStoneBricks; - mappings[6488064] = ItemType.BrownMushroomBlock; - mappings[6553600] = ItemType.RedMushroomBlock; - mappings[6619136] = ItemType.IronBars; - mappings[6684672] = ItemType.GlassPane; - mappings[6750208] = ItemType.Melon; - mappings[6946816] = ItemType.Vine; - mappings[7012352] = ItemType.OakFenceGate; - mappings[7077888] = ItemType.BrickStairs; - mappings[7143424] = ItemType.StoneBrickStairs; - mappings[7208960] = ItemType.Mycelium; - mappings[7340032] = ItemType.NetherBricks; - mappings[7405568] = ItemType.NetherBrickFence; - mappings[7471104] = ItemType.NetherBrickStairs; - mappings[7602176] = ItemType.EnchantingTable; - mappings[7864320] = ItemType.EndPortalFrame; - mappings[7929856] = ItemType.EndStone; - mappings[7995392] = ItemType.DragonEgg; - mappings[8060928] = ItemType.RedstoneLamp; - mappings[8388608] = ItemType.SandstoneStairs; - mappings[8454144] = ItemType.EmeraldOre; - mappings[8519680] = ItemType.EnderChest; - mappings[8585216] = ItemType.TripwireHook; - mappings[8716288] = ItemType.EmeraldBlock; - mappings[8781824] = ItemType.SpruceStairs; - mappings[8847360] = ItemType.BirchStairs; - mappings[8912896] = ItemType.JungleStairs; - mappings[8978432] = ItemType.CommandBlock; - mappings[9043968] = ItemType.Beacon; - mappings[9109504] = ItemType.CobblestoneWall; - mappings[9109505] = ItemType.MossyCobblestoneWall; - mappings[9502720] = ItemType.Anvil; - mappings[9502721] = ItemType.ChippedAnvil; - mappings[9502722] = ItemType.DamagedAnvil; - mappings[9568256] = ItemType.TrappedChest; - mappings[9633792] = ItemType.LightWeightedPressurePlate; - mappings[9699328] = ItemType.HeavyWeightedPressurePlate; - mappings[9895936] = ItemType.DaylightDetector; - mappings[9961472] = ItemType.RedstoneBlock; - mappings[10027008] = ItemType.NetherQuartzOre; - mappings[10092544] = ItemType.Hopper; - mappings[10158080] = ItemType.QuartzBlock; - mappings[10158081] = ItemType.ChiseledQuartzBlock; - mappings[10158082] = ItemType.QuartzPillar; - mappings[10223616] = ItemType.QuartzStairs; - mappings[10289152] = ItemType.ActivatorRail; - mappings[10354688] = ItemType.Dropper; - mappings[10420224] = ItemType.WhiteTerracotta; - mappings[10420225] = ItemType.OrangeTerracotta; - mappings[10420226] = ItemType.MagentaTerracotta; - mappings[10420227] = ItemType.LightBlueTerracotta; - mappings[10420228] = ItemType.YellowTerracotta; - mappings[10420229] = ItemType.LimeTerracotta; - mappings[10420230] = ItemType.PinkTerracotta; - mappings[10420231] = ItemType.GrayTerracotta; - mappings[10420232] = ItemType.LightGrayTerracotta; - mappings[10420233] = ItemType.CyanTerracotta; - mappings[10420234] = ItemType.PurpleTerracotta; - mappings[10420235] = ItemType.BlueTerracotta; - mappings[10420236] = ItemType.BrownTerracotta; - mappings[10420237] = ItemType.GreenTerracotta; - mappings[10420238] = ItemType.RedTerracotta; - mappings[10420239] = ItemType.BlackTerracotta; - mappings[10485760] = ItemType.WhiteStainedGlassPane; - mappings[10485761] = ItemType.OrangeStainedGlassPane; - mappings[10485762] = ItemType.MagentaStainedGlassPane; - mappings[10485763] = ItemType.LightBlueStainedGlassPane; - mappings[10485764] = ItemType.YellowStainedGlassPane; - mappings[10485765] = ItemType.LimeStainedGlassPane; - mappings[10485766] = ItemType.PinkStainedGlassPane; - mappings[10485767] = ItemType.GrayStainedGlassPane; - mappings[10485768] = ItemType.LightGrayStainedGlassPane; - mappings[10485769] = ItemType.CyanStainedGlassPane; - mappings[10485770] = ItemType.PurpleStainedGlassPane; - mappings[10485771] = ItemType.BlueStainedGlassPane; - mappings[10485772] = ItemType.BrownStainedGlassPane; - mappings[10485773] = ItemType.GreenStainedGlassPane; - mappings[10485774] = ItemType.RedStainedGlassPane; - mappings[10485775] = ItemType.BlackStainedGlassPane; - mappings[10551296] = ItemType.AcaciaLeaves; - mappings[10551297] = ItemType.DarkOakLeaves; - mappings[10616832] = ItemType.AcaciaLog; - mappings[10616833] = ItemType.DarkOakLog; - mappings[10682368] = ItemType.AcaciaStairs; - mappings[10747904] = ItemType.DarkOakStairs; - mappings[10813440] = ItemType.SlimeBlock; - mappings[10878976] = ItemType.Barrier; - mappings[10944512] = ItemType.IronTrapdoor; - mappings[11010048] = ItemType.Prismarine; - mappings[11010049] = ItemType.PrismarineBricks; - mappings[11010050] = ItemType.DarkPrismarine; - mappings[11075584] = ItemType.SeaLantern; - mappings[11141120] = ItemType.HayBlock; - mappings[11206656] = ItemType.WhiteCarpet; - mappings[11206657] = ItemType.OrangeCarpet; - mappings[11206658] = ItemType.MagentaCarpet; - mappings[11206659] = ItemType.LightBlueCarpet; - mappings[11206660] = ItemType.YellowCarpet; - mappings[11206661] = ItemType.LimeCarpet; - mappings[11206662] = ItemType.PinkCarpet; - mappings[11206663] = ItemType.GrayCarpet; - mappings[11206664] = ItemType.LightGrayCarpet; - mappings[11206665] = ItemType.CyanCarpet; - mappings[11206666] = ItemType.PurpleCarpet; - mappings[11206667] = ItemType.BlueCarpet; - mappings[11206668] = ItemType.BrownCarpet; - mappings[11206669] = ItemType.GreenCarpet; - mappings[11206670] = ItemType.RedCarpet; - mappings[11206671] = ItemType.BlackCarpet; - mappings[11272192] = ItemType.Terracotta; - mappings[11337728] = ItemType.CoalBlock; - mappings[11403264] = ItemType.PackedIce; - mappings[11468800] = ItemType.Sunflower; - mappings[11468801] = ItemType.Lilac; - mappings[11468802] = ItemType.TallGrass; - mappings[11468803] = ItemType.LargeFern; - mappings[11468804] = ItemType.RoseBush; - mappings[11468805] = ItemType.Peony; - mappings[11730944] = ItemType.RedSandstone; - mappings[11730945] = ItemType.ChiseledRedSandstone; - mappings[11730946] = ItemType.SmoothRedSandstone; - mappings[11796480] = ItemType.RedSandstoneStairs; - mappings[11927552] = ItemType.RedSandstoneSlab; - mappings[11993088] = ItemType.SpruceFenceGate; - mappings[12058624] = ItemType.BirchFenceGate; - mappings[12124160] = ItemType.JungleFenceGate; - mappings[12189696] = ItemType.DarkOakFenceGate; - mappings[12255232] = ItemType.AcaciaFenceGate; - mappings[12320768] = ItemType.SpruceFence; - mappings[12386304] = ItemType.BirchFence; - mappings[12451840] = ItemType.JungleFence; - mappings[12517376] = ItemType.DarkOakFence; - mappings[12582912] = ItemType.AcaciaFence; - mappings[12976128] = ItemType.EndRod; - mappings[13041664] = ItemType.ChorusPlant; - mappings[13107200] = ItemType.ChorusFlower; - mappings[13172736] = ItemType.PurpurBlock; - mappings[13238272] = ItemType.PurpurPillar; - mappings[13303808] = ItemType.PurpurStairs; - mappings[13434880] = ItemType.PurpurSlab; - mappings[13500416] = ItemType.EndStoneBricks; - mappings[13631488] = ItemType.DirtPath; - mappings[13762560] = ItemType.RepeatingCommandBlock; - mappings[13828096] = ItemType.ChainCommandBlock; - mappings[13959168] = ItemType.MagmaBlock; - mappings[14024704] = ItemType.NetherWartBlock; - mappings[14090240] = ItemType.RedNetherBricks; - mappings[14155776] = ItemType.BoneBlock; - mappings[14221312] = ItemType.StructureVoid; - mappings[14286848] = ItemType.Observer; - mappings[14417920] = ItemType.OrangeShulkerBox; - mappings[14483456] = ItemType.MagentaShulkerBox; - mappings[14548992] = ItemType.LightBlueShulkerBox; - mappings[14680064] = ItemType.LimeShulkerBox; - mappings[14745600] = ItemType.PinkShulkerBox; - mappings[14811136] = ItemType.GrayShulkerBox; - mappings[14876672] = ItemType.LightGrayShulkerBox; - mappings[14942208] = ItemType.CyanShulkerBox; - mappings[15007744] = ItemType.PurpleShulkerBox; - mappings[15073280] = ItemType.BlueShulkerBox; - mappings[15138816] = ItemType.BrownShulkerBox; - mappings[15204352] = ItemType.GreenShulkerBox; - mappings[15269888] = ItemType.RedShulkerBox; - mappings[15335424] = ItemType.BlackShulkerBox; - mappings[16711680] = ItemType.StructureBlock; - mappings[16777216] = ItemType.IronShovel; - mappings[16842752] = ItemType.IronPickaxe; - mappings[16908288] = ItemType.IronAxe; - mappings[16973824] = ItemType.FlintAndSteel; - mappings[17039360] = ItemType.Apple; - mappings[17104896] = ItemType.Bow; - mappings[17170432] = ItemType.Arrow; - mappings[17235968] = ItemType.Coal; - mappings[17235969] = ItemType.Charcoal; - mappings[17301504] = ItemType.Diamond; - mappings[17367040] = ItemType.IronIngot; - mappings[17432576] = ItemType.GoldIngot; - mappings[17498112] = ItemType.IronSword; - mappings[17825792] = ItemType.StoneSword; - mappings[17891328] = ItemType.StoneShovel; - mappings[17956864] = ItemType.StonePickaxe; - mappings[18022400] = ItemType.StoneAxe; - mappings[18087936] = ItemType.DiamondSword; - mappings[18153472] = ItemType.DiamondShovel; - mappings[18219008] = ItemType.DiamondPickaxe; - mappings[18284544] = ItemType.DiamondAxe; - mappings[18350080] = ItemType.Stick; - mappings[18415616] = ItemType.Bowl; - mappings[18481152] = ItemType.MushroomStew; - mappings[18546688] = ItemType.GoldenSword; - mappings[18612224] = ItemType.GoldenShovel; - mappings[18677760] = ItemType.GoldenPickaxe; - mappings[18743296] = ItemType.GoldenAxe; - mappings[18808832] = ItemType.String; - mappings[18874368] = ItemType.Feather; - mappings[18939904] = ItemType.Gunpowder; - mappings[19070976] = ItemType.StoneHoe; - mappings[19136512] = ItemType.IronHoe; - mappings[19202048] = ItemType.DiamondHoe; - mappings[19267584] = ItemType.GoldenHoe; - mappings[19464192] = ItemType.Bread; - mappings[19529728] = ItemType.LeatherHelmet; - mappings[19660800] = ItemType.LeatherLeggings; - mappings[19791872] = ItemType.ChainmailHelmet; - mappings[19857408] = ItemType.ChainmailChestplate; - mappings[19922944] = ItemType.ChainmailLeggings; - mappings[19988480] = ItemType.ChainmailBoots; - mappings[20054016] = ItemType.IronHelmet; - mappings[20119552] = ItemType.IronChestplate; - mappings[20185088] = ItemType.IronLeggings; - mappings[20250624] = ItemType.IronBoots; - mappings[20316160] = ItemType.DiamondHelmet; - mappings[20381696] = ItemType.DiamondChestplate; - mappings[20447232] = ItemType.DiamondLeggings; - mappings[20512768] = ItemType.DiamondBoots; - mappings[20578304] = ItemType.GoldenHelmet; - mappings[20643840] = ItemType.GoldenChestplate; - mappings[20709376] = ItemType.GoldenLeggings; - mappings[20774912] = ItemType.GoldenBoots; - mappings[20840448] = ItemType.Flint; - mappings[20905984] = ItemType.Porkchop; - mappings[20971520] = ItemType.CookedPorkchop; - mappings[21037056] = ItemType.Painting; - mappings[21102592] = ItemType.GoldenApple; - mappings[21102593] = ItemType.EnchantedGoldenApple; - mappings[21168128] = ItemType.OakSign; - mappings[21299200] = ItemType.Bucket; - mappings[21495808] = ItemType.Minecart; - mappings[21561344] = ItemType.Saddle; - mappings[21626880] = ItemType.IronDoor; - mappings[21692416] = ItemType.Redstone; - mappings[21757952] = ItemType.Snowball; - mappings[21823488] = ItemType.OakBoat; - mappings[21954560] = ItemType.MilkBucket; - mappings[22020096] = ItemType.Brick; - mappings[22085632] = ItemType.ClayBall; - mappings[22151168] = ItemType.Sugar; - mappings[22216704] = ItemType.Paper; - mappings[22282240] = ItemType.Book; - mappings[22347776] = ItemType.SlimeBall; - mappings[22413312] = ItemType.ChestMinecart; - mappings[22478848] = ItemType.FurnaceMinecart; - mappings[22544384] = ItemType.Egg; - mappings[22609920] = ItemType.Compass; - mappings[22675456] = ItemType.FishingRod; - mappings[22740992] = ItemType.Clock; - mappings[22806528] = ItemType.GlowstoneDust; - mappings[22872064] = ItemType.Salmon; - mappings[22872065] = ItemType.Salmon; - mappings[22872066] = ItemType.TropicalFish; - mappings[22872067] = ItemType.Pufferfish; - mappings[22937600] = ItemType.CookedSalmon; - mappings[22937601] = ItemType.CookedSalmon; - mappings[23003136] = ItemType.InkSac; - mappings[23003137] = ItemType.RedDye; - mappings[23003138] = ItemType.GreenDye; - mappings[23003139] = ItemType.CocoaBeans; - mappings[23003140] = ItemType.LapisLazuli; - mappings[23003141] = ItemType.PurpleDye; - mappings[23003142] = ItemType.CyanDye; - mappings[23003143] = ItemType.LightGrayDye; - mappings[23003144] = ItemType.GrayDye; - mappings[23003145] = ItemType.PinkDye; - mappings[23003146] = ItemType.LimeDye; - mappings[23003147] = ItemType.YellowDye; - mappings[23003148] = ItemType.LightBlueDye; - mappings[23003149] = ItemType.MagentaDye; - mappings[23003150] = ItemType.OrangeDye; - mappings[23003151] = ItemType.BoneMeal; - mappings[23068672] = ItemType.Bone; - mappings[23134208] = ItemType.Sugar; - mappings[23199744] = ItemType.Cake; - mappings[23265280] = ItemType.RedBed; - mappings[23330816] = ItemType.Repeater; - mappings[23396352] = ItemType.Cookie; - mappings[23527424] = ItemType.Shears; - mappings[23592960] = ItemType.MelonSlice; - mappings[23658496] = ItemType.PumpkinSeeds; - mappings[23724032] = ItemType.MelonSeeds; - mappings[23789568] = ItemType.Beef; - mappings[23855104] = ItemType.CookedBeef; - mappings[23920640] = ItemType.Chicken; - mappings[23986176] = ItemType.CookedChicken; - mappings[24051712] = ItemType.RottenFlesh; - mappings[24117248] = ItemType.EnderPearl; - mappings[24182784] = ItemType.BlazeRod; - mappings[24248320] = ItemType.GhastTear; - mappings[24313856] = ItemType.GoldNugget; - mappings[24379392] = ItemType.NetherWart; - mappings[24444928] = ItemType.Potion; - mappings[24510464] = ItemType.GlassBottle; - mappings[24576000] = ItemType.SpiderEye; - mappings[24641536] = ItemType.FermentedSpiderEye; - mappings[24707072] = ItemType.BlazePowder; - mappings[24772608] = ItemType.MagmaCream; - mappings[24838144] = ItemType.BrewingStand; - mappings[24903680] = ItemType.Cauldron; - mappings[24969216] = ItemType.EnderEye; - mappings[25034752] = ItemType.GlisteringMelonSlice; - mappings[25100288] = ItemType.BatSpawnEgg; - mappings[25100288] = ItemType.BlazeSpawnEgg; - mappings[25100288] = ItemType.CaveSpiderSpawnEgg; - mappings[25100288] = ItemType.ChickenSpawnEgg; - mappings[25100288] = ItemType.CowSpawnEgg; - mappings[25100288] = ItemType.CreeperSpawnEgg; - mappings[25100288] = ItemType.DonkeySpawnEgg; - mappings[25100288] = ItemType.ElderGuardianSpawnEgg; - mappings[25100288] = ItemType.EndermanSpawnEgg; - mappings[25100288] = ItemType.EndermiteSpawnEgg; - mappings[25100288] = ItemType.EvokerSpawnEgg; - mappings[25100288] = ItemType.GhastSpawnEgg; - mappings[25100288] = ItemType.GuardianSpawnEgg; - mappings[25100288] = ItemType.HorseSpawnEgg; - mappings[25100288] = ItemType.HuskSpawnEgg; - mappings[25100288] = ItemType.LlamaSpawnEgg; - mappings[25100288] = ItemType.MagmaCubeSpawnEgg; - mappings[25100288] = ItemType.MooshroomSpawnEgg; - mappings[25100288] = ItemType.MuleSpawnEgg; - mappings[25100288] = ItemType.OcelotSpawnEgg; - mappings[25100288] = ItemType.PigSpawnEgg; - mappings[25100288] = ItemType.PolarBearSpawnEgg; - mappings[25100288] = ItemType.RabbitSpawnEgg; - mappings[25100288] = ItemType.SheepSpawnEgg; - mappings[25100288] = ItemType.ShulkerSpawnEgg; - mappings[25100288] = ItemType.SilverfishSpawnEgg; - mappings[25100288] = ItemType.SkeletonHorseSpawnEgg; - mappings[25100288] = ItemType.SkeletonSpawnEgg; - mappings[25100288] = ItemType.SlimeSpawnEgg; - mappings[25100288] = ItemType.SpiderSpawnEgg; - mappings[25100288] = ItemType.SquidSpawnEgg; - mappings[25100288] = ItemType.StraySpawnEgg; - mappings[25100288] = ItemType.VexSpawnEgg; - mappings[25100288] = ItemType.VillagerSpawnEgg; - mappings[25100288] = ItemType.VindicatorSpawnEgg; - mappings[25100288] = ItemType.WitchSpawnEgg; - mappings[25100288] = ItemType.WitherSkeletonSpawnEgg; - mappings[25100288] = ItemType.WolfSpawnEgg; - mappings[25100288] = ItemType.ZombieHorseSpawnEgg; - mappings[25100288] = ItemType.ZombieSpawnEgg; - mappings[25100288] = ItemType.ZombieVillagerSpawnEgg; - mappings[25100288] = ItemType.ZombifiedPiglinSpawnEgg; - mappings[25165824] = ItemType.ExperienceBottle; - mappings[25231360] = ItemType.FireCharge; - mappings[25427968] = ItemType.Emerald; - mappings[25493504] = ItemType.ItemFrame; - mappings[25559040] = ItemType.FlowerPot; - mappings[25624576] = ItemType.Carrot; - mappings[25690112] = ItemType.Potato; - mappings[25755648] = ItemType.BakedPotato; - mappings[25821184] = ItemType.PoisonousPotato; - mappings[25886720] = ItemType.Map; - mappings[25952256] = ItemType.GoldenCarrot; - mappings[26017792] = ItemType.SkeletonSkull; - mappings[26017793] = ItemType.WitherSkeletonSkull; - mappings[26017794] = ItemType.ZombieHead; - mappings[26017795] = ItemType.PlayerHead; - mappings[26017796] = ItemType.CreeperHead; - mappings[26017797] = ItemType.DragonHead; - mappings[26083328] = ItemType.CarrotOnAStick; - mappings[26148864] = ItemType.NetherStar; - mappings[26214400] = ItemType.PumpkinPie; - mappings[26279936] = ItemType.FireworkRocket; - mappings[26411008] = ItemType.EnchantedBook; - mappings[26476544] = ItemType.Comparator; - mappings[26542080] = ItemType.NetherBrick; - mappings[26607616] = ItemType.Quartz; - mappings[26673152] = ItemType.TntMinecart; - mappings[26738688] = ItemType.HopperMinecart; - mappings[26804224] = ItemType.PrismarineShard; - mappings[26869760] = ItemType.PrismarineCrystals; - mappings[26935296] = ItemType.Rabbit; - mappings[27000832] = ItemType.CookedRabbit; - mappings[27066368] = ItemType.RabbitStew; - mappings[27131904] = ItemType.RabbitFoot; - mappings[27197440] = ItemType.RabbitHide; - mappings[27262976] = ItemType.ArmorStand; - mappings[27328512] = ItemType.IronHorseArmor; - mappings[27394048] = ItemType.GoldenHorseArmor; - mappings[27459584] = ItemType.DiamondHorseArmor; - mappings[27590656] = ItemType.NameTag; - mappings[27656192] = ItemType.CommandBlockMinecart; - mappings[27721728] = ItemType.Mutton; - mappings[27787264] = ItemType.CookedMutton; - mappings[27852800] = ItemType.BlackBanner; - mappings[27852801] = ItemType.RedBanner; - mappings[27852802] = ItemType.GreenBanner; - mappings[27852803] = ItemType.BrownBanner; - mappings[27852804] = ItemType.BlueBanner; - mappings[27852805] = ItemType.PurpleBanner; - mappings[27852806] = ItemType.CyanBanner; - mappings[27852807] = ItemType.LightGrayBanner; - mappings[27852808] = ItemType.GrayBanner; - mappings[27852809] = ItemType.PinkBanner; - mappings[27852810] = ItemType.LimeBanner; - mappings[27852811] = ItemType.YellowBanner; - mappings[27852812] = ItemType.LightBlueBanner; - mappings[27852813] = ItemType.MagentaBanner; - mappings[27852814] = ItemType.OrangeBanner; - mappings[27852815] = ItemType.WhiteBanner; - mappings[27918336] = ItemType.EndCrystal; - mappings[27983872] = ItemType.SpruceDoor; - mappings[28049408] = ItemType.BirchDoor; - mappings[28114944] = ItemType.JungleDoor; - mappings[28180480] = ItemType.AcaciaDoor; - mappings[28246016] = ItemType.DarkOakDoor; - mappings[28311552] = ItemType.ChorusFruit; - mappings[28377088] = ItemType.PoppedChorusFruit; - mappings[28442624] = ItemType.Beetroot; - mappings[28508160] = ItemType.BeetrootSeeds; - mappings[28573696] = ItemType.BeetrootSoup; - mappings[28639232] = ItemType.DragonBreath; - mappings[28704768] = ItemType.SplashPotion; - mappings[28770304] = ItemType.SpectralArrow; - mappings[28835840] = ItemType.Arrow; - mappings[28901376] = ItemType.LingeringPotion; - mappings[28966912] = ItemType.Shield; - mappings[29032448] = ItemType.Elytra; - mappings[29097984] = ItemType.SpruceBoat; - mappings[29163520] = ItemType.BirchBoat; - mappings[29229056] = ItemType.JungleBoat; - mappings[29294592] = ItemType.AcaciaBoat; - mappings[29360128] = ItemType.DarkOakBoat; - mappings[29425664] = ItemType.TotemOfUndying; - mappings[29622272] = ItemType.IronNugget; - mappings[19595264] = ItemType.LeatherChestplate; - mappings[19726336] = ItemType.LeatherBoots; - mappings[21430272] = ItemType.LavaBucket; - mappings[21889024] = ItemType.Leather; - mappings[27525120] = ItemType.Lead; - mappings[29491200] = ItemType.ShulkerShell; - mappings[147849216] = ItemType.MusicDisc13; - mappings[147914752] = ItemType.MusicDiscCat; - mappings[147980288] = ItemType.MusicDiscBlocks; - mappings[148045824] = ItemType.MusicDiscChirp; - mappings[148111360] = ItemType.MusicDiscFar; - mappings[148176896] = ItemType.MusicDiscMall; - mappings[148242432] = ItemType.MusicDiscMellohi; - mappings[148307968] = ItemType.MusicDiscStal; - mappings[148373504] = ItemType.MusicDiscStrad; - mappings[148439040] = ItemType.MusicDiscWard; - mappings[148504576] = ItemType.MusicDisc11; - mappings[148570112] = ItemType.MusicDiscWait; - mappings[7274496] = ItemType.LilyPad; - mappings[8257536] = ItemType.OakSlab; - mappings[8257537] = ItemType.SpruceSlab; - mappings[8257538] = ItemType.BirchSlab; - mappings[8257539] = ItemType.JungleSlab; - mappings[8257540] = ItemType.AcaciaSlab; - mappings[8257541] = ItemType.DarkOakSlab; - mappings[9371648] = ItemType.OakButton; - mappings[14352384] = ItemType.WhiteShulkerBox; - mappings[14614528] = ItemType.YellowShulkerBox; - mappings[17563648] = ItemType.WoodenSword; - mappings[17629184] = ItemType.WoodenShovel; - mappings[17694720] = ItemType.WoodenPickaxe; - mappings[17760256] = ItemType.WoodenAxe; - mappings[19005440] = ItemType.WoodenHoe; - mappings[19333120] = ItemType.WheatSeeds; - mappings[19398656] = ItemType.Wheat; - mappings[21233664] = ItemType.OakDoor; - mappings[21364736] = ItemType.WaterBucket; - mappings[25296896] = ItemType.WritableBook; - mappings[25362432] = ItemType.WrittenBook; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} \ No newline at end of file diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette112.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette112.cs deleted file mode 100644 index b6758b62c0..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette112.cs +++ /dev/null @@ -1,669 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - /// - /// For MC 1.8 - /// Done manually by Milutinke :( - /// - public class ItemPalette112 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette112() - { - // Mapping IDs are a derived from: (Item ID << 16) | Data - mappings[0] = ItemType.Air; - mappings[65536] = ItemType.Stone; - mappings[65537] = ItemType.Granite; - mappings[65538] = ItemType.PolishedGranite; - mappings[65539] = ItemType.Diorite; - mappings[65540] = ItemType.PolishedDiorite; - mappings[65541] = ItemType.Andesite; - mappings[65542] = ItemType.PolishedAndesite; - mappings[131072] = ItemType.GrassBlock; - mappings[196608] = ItemType.Dirt; - mappings[196609] = ItemType.CoarseDirt; - mappings[196610] = ItemType.Podzol; - mappings[262144] = ItemType.Cobblestone; - mappings[327680] = ItemType.OakPlanks; - mappings[327681] = ItemType.SprucePlanks; - mappings[327682] = ItemType.BirchPlanks; - mappings[327683] = ItemType.JunglePlanks; - mappings[327684] = ItemType.AcaciaPlanks; - mappings[327685] = ItemType.DarkOakPlanks; - mappings[393216] = ItemType.OakSapling; - mappings[393217] = ItemType.SpruceSapling; - mappings[393218] = ItemType.BirchSapling; - mappings[393219] = ItemType.JungleSapling; - mappings[393220] = ItemType.AcaciaSapling; - mappings[393221] = ItemType.DarkOakSapling; - mappings[458752] = ItemType.Bedrock; - mappings[524288] = ItemType.WaterBucket; // Still Water Block Item - mappings[589824] = ItemType.WaterBucket; // Flowing Water Block Item - mappings[655360] = ItemType.LavaBucket; // Still Lava Block Item - mappings[720896] = ItemType.LavaBucket; // Flowing Lava Block Item - mappings[786432] = ItemType.Sand; - mappings[786433] = ItemType.RedSand; - mappings[851968] = ItemType.Gravel; - mappings[917504] = ItemType.GoldOre; - mappings[983040] = ItemType.IronOre; - mappings[1048576] = ItemType.CoalOre; - mappings[1245184] = ItemType.Sponge; - mappings[1245185] = ItemType.WetSponge; - mappings[1310720] = ItemType.Glass; - mappings[1376256] = ItemType.LapisOre; - mappings[1441792] = ItemType.LapisBlock; - mappings[1507328] = ItemType.Dispenser; - mappings[1572864] = ItemType.Sandstone; - mappings[1572865] = ItemType.ChiseledSandstone; - mappings[1572866] = ItemType.SmoothSandstone; - mappings[1638400] = ItemType.NoteBlock; - mappings[1769472] = ItemType.PoweredRail; - mappings[1835008] = ItemType.DetectorRail; - mappings[1900544] = ItemType.StickyPiston; - mappings[2031617] = ItemType.ShortGrass; - mappings[2031618] = ItemType.Fern; - mappings[2097152] = ItemType.DeadBush; - mappings[2162688] = ItemType.Piston; - mappings[2490368] = ItemType.Poppy; - mappings[2490369] = ItemType.BlueOrchid; - mappings[2490370] = ItemType.Allium; - mappings[2490371] = ItemType.AzureBluet; - mappings[2490372] = ItemType.RedTulip; - mappings[2490373] = ItemType.OrangeTulip; - mappings[2490374] = ItemType.WhiteTulip; - mappings[2490375] = ItemType.PinkTulip; - mappings[2490376] = ItemType.OxeyeDaisy; - mappings[2555904] = ItemType.BrownMushroom; - mappings[2621440] = ItemType.RedMushroom; - mappings[2686976] = ItemType.GoldBlock; - mappings[2752512] = ItemType.IronBlock; - mappings[2883584] = ItemType.StoneSlab; - mappings[2883585] = ItemType.SandstoneSlab; - mappings[2883587] = ItemType.CobblestoneSlab; - mappings[2883588] = ItemType.BrickSlab; - mappings[2883589] = ItemType.StoneBrickSlab; - mappings[2883590] = ItemType.NetherBrickSlab; - mappings[2883591] = ItemType.QuartzSlab; - mappings[2949120] = ItemType.Bricks; - mappings[3014656] = ItemType.Tnt; - mappings[3080192] = ItemType.Bookshelf; - mappings[3145728] = ItemType.MossyCobblestone; - mappings[3211264] = ItemType.Obsidian; - mappings[3276800] = ItemType.Torch; - mappings[3407872] = ItemType.Spawner; - mappings[3473408] = ItemType.OakStairs; - mappings[3538944] = ItemType.Chest; - mappings[3670016] = ItemType.DiamondOre; - mappings[3735552] = ItemType.DiamondBlock; - mappings[3801088] = ItemType.CraftingTable; - mappings[3932160] = ItemType.Farmland; - mappings[3997696] = ItemType.Furnace; - mappings[4259840] = ItemType.Ladder; - mappings[4325376] = ItemType.Rail; - mappings[4390912] = ItemType.CobblestoneStairs; - mappings[4587520] = ItemType.StonePressurePlate; - mappings[4784128] = ItemType.RedstoneOre; - mappings[4980736] = ItemType.RedstoneTorch; - mappings[5046272] = ItemType.StoneButton; - mappings[5111808] = ItemType.Snow; - mappings[5177344] = ItemType.Ice; - mappings[5242880] = ItemType.SnowBlock; - mappings[5308416] = ItemType.Cactus; - mappings[5373952] = ItemType.Clay; - mappings[5505024] = ItemType.Jukebox; - mappings[5570560] = ItemType.OakFence; - mappings[5636096] = ItemType.Pumpkin; - mappings[5701632] = ItemType.Netherrack; - mappings[5767168] = ItemType.SoulSand; - mappings[5832704] = ItemType.Glowstone; - mappings[6225920] = ItemType.WhiteStainedGlass; - mappings[6225921] = ItemType.OrangeStainedGlass; - mappings[6225922] = ItemType.MagentaStainedGlass; - mappings[6225923] = ItemType.LightBlueStainedGlass; - mappings[6225924] = ItemType.YellowStainedGlass; - mappings[6225925] = ItemType.LimeStainedGlass; - mappings[6225926] = ItemType.PinkStainedGlass; - mappings[6225927] = ItemType.GrayStainedGlass; - mappings[6225928] = ItemType.LightGrayStainedGlass; - mappings[6225929] = ItemType.CyanStainedGlass; - mappings[6225930] = ItemType.PurpleStainedGlass; - mappings[6225931] = ItemType.BlueStainedGlass; - mappings[6225932] = ItemType.BrownStainedGlass; - mappings[6225933] = ItemType.GreenStainedGlass; - mappings[6225934] = ItemType.RedStainedGlass; - mappings[6225935] = ItemType.BlackStainedGlass; - mappings[6291456] = ItemType.OakTrapdoor; - mappings[6356992] = ItemType.InfestedStone; - mappings[6356993] = ItemType.InfestedCobblestone; - mappings[6356994] = ItemType.InfestedStoneBricks; - mappings[6356995] = ItemType.InfestedMossyStoneBricks; - mappings[6356996] = ItemType.InfestedCrackedStoneBricks; - mappings[6356997] = ItemType.InfestedChiseledStoneBricks; - mappings[6422528] = ItemType.StoneBricks; - mappings[6422529] = ItemType.MossyStoneBricks; - mappings[6422530] = ItemType.CrackedStoneBricks; - mappings[6422531] = ItemType.ChiseledStoneBricks; - mappings[6488064] = ItemType.BrownMushroomBlock; - mappings[6553600] = ItemType.RedMushroomBlock; - mappings[6619136] = ItemType.IronBars; - mappings[6684672] = ItemType.GlassPane; - mappings[6750208] = ItemType.Melon; - mappings[6946816] = ItemType.Vine; - mappings[7012352] = ItemType.OakFenceGate; - mappings[7077888] = ItemType.BrickStairs; - mappings[7143424] = ItemType.StoneBrickStairs; - mappings[7208960] = ItemType.Mycelium; - mappings[7340032] = ItemType.NetherBricks; - mappings[7405568] = ItemType.NetherBrickFence; - mappings[7471104] = ItemType.NetherBrickStairs; - mappings[7602176] = ItemType.EnchantingTable; - mappings[7864320] = ItemType.EndPortalFrame; - mappings[7929856] = ItemType.EndStone; - mappings[7995392] = ItemType.DragonEgg; - mappings[8060928] = ItemType.RedstoneLamp; - mappings[8388608] = ItemType.SandstoneStairs; - mappings[8454144] = ItemType.EmeraldOre; - mappings[8519680] = ItemType.EnderChest; - mappings[8585216] = ItemType.TripwireHook; - mappings[8716288] = ItemType.EmeraldBlock; - mappings[8781824] = ItemType.SpruceStairs; - mappings[8847360] = ItemType.BirchStairs; - mappings[8912896] = ItemType.JungleStairs; - mappings[8978432] = ItemType.CommandBlock; - mappings[9043968] = ItemType.Beacon; - mappings[9109504] = ItemType.CobblestoneWall; - mappings[9109505] = ItemType.MossyCobblestoneWall; - mappings[9502720] = ItemType.Anvil; - mappings[9502721] = ItemType.ChippedAnvil; - mappings[9502722] = ItemType.DamagedAnvil; - mappings[9568256] = ItemType.TrappedChest; - mappings[9699328] = ItemType.HeavyWeightedPressurePlate; - mappings[9895936] = ItemType.DaylightDetector; - mappings[9961472] = ItemType.RedstoneBlock; - mappings[10027008] = ItemType.NetherQuartzOre; - mappings[10092544] = ItemType.Hopper; - mappings[10158080] = ItemType.QuartzBlock; - mappings[10158081] = ItemType.ChiseledQuartzBlock; - mappings[10158082] = ItemType.QuartzPillar; - mappings[10223616] = ItemType.QuartzStairs; - mappings[10289152] = ItemType.ActivatorRail; - mappings[10354688] = ItemType.Dropper; - mappings[10420224] = ItemType.WhiteTerracotta; - mappings[10420225] = ItemType.OrangeTerracotta; - mappings[10420226] = ItemType.MagentaTerracotta; - mappings[10420227] = ItemType.LightBlueTerracotta; - mappings[10420228] = ItemType.YellowTerracotta; - mappings[10420229] = ItemType.LimeTerracotta; - mappings[10420230] = ItemType.PinkTerracotta; - mappings[10420231] = ItemType.GrayTerracotta; - mappings[10420232] = ItemType.LightGrayTerracotta; - mappings[10420233] = ItemType.CyanTerracotta; - mappings[10420234] = ItemType.PurpleTerracotta; - mappings[10420235] = ItemType.BlueTerracotta; - mappings[10420236] = ItemType.BrownTerracotta; - mappings[10420237] = ItemType.GreenTerracotta; - mappings[10420238] = ItemType.RedTerracotta; - mappings[10420239] = ItemType.BlackTerracotta; - mappings[10485760] = ItemType.WhiteStainedGlassPane; - mappings[10485761] = ItemType.OrangeStainedGlassPane; - mappings[10485762] = ItemType.MagentaStainedGlassPane; - mappings[10485763] = ItemType.LightBlueStainedGlassPane; - mappings[10485764] = ItemType.YellowStainedGlassPane; - mappings[10485765] = ItemType.LimeStainedGlassPane; - mappings[10485766] = ItemType.PinkStainedGlassPane; - mappings[10485767] = ItemType.GrayStainedGlassPane; - mappings[10485768] = ItemType.LightGrayStainedGlassPane; - mappings[10485769] = ItemType.CyanStainedGlassPane; - mappings[10485770] = ItemType.PurpleStainedGlassPane; - mappings[10485771] = ItemType.BlueStainedGlassPane; - mappings[10485772] = ItemType.BrownStainedGlassPane; - mappings[10485773] = ItemType.GreenStainedGlassPane; - mappings[10485774] = ItemType.RedStainedGlassPane; - mappings[10485775] = ItemType.BlackStainedGlassPane; - mappings[10682368] = ItemType.AcaciaStairs; - mappings[10747904] = ItemType.DarkOakStairs; - mappings[10813440] = ItemType.SlimeBlock; - mappings[10878976] = ItemType.Barrier; - mappings[10944512] = ItemType.IronTrapdoor; - mappings[11010048] = ItemType.Prismarine; - mappings[11010049] = ItemType.PrismarineBricks; - mappings[11010050] = ItemType.DarkPrismarine; - mappings[11075584] = ItemType.SeaLantern; - mappings[11141120] = ItemType.HayBlock; - mappings[11206656] = ItemType.WhiteCarpet; - mappings[11206657] = ItemType.OrangeCarpet; - mappings[11206658] = ItemType.MagentaCarpet; - mappings[11206659] = ItemType.LightBlueCarpet; - mappings[11206660] = ItemType.YellowCarpet; - mappings[11206661] = ItemType.LimeCarpet; - mappings[11206662] = ItemType.PinkCarpet; - mappings[11206663] = ItemType.GrayCarpet; - mappings[11206664] = ItemType.LightGrayCarpet; - mappings[11206665] = ItemType.CyanCarpet; - mappings[11206666] = ItemType.PurpleCarpet; - mappings[11206667] = ItemType.BlueCarpet; - mappings[11206668] = ItemType.BrownCarpet; - mappings[11206669] = ItemType.GreenCarpet; - mappings[11206670] = ItemType.RedCarpet; - mappings[11206671] = ItemType.BlackCarpet; - mappings[11272192] = ItemType.Terracotta; - mappings[11337728] = ItemType.CoalBlock; - mappings[11403264] = ItemType.PackedIce; - mappings[11468800] = ItemType.Sunflower; - mappings[11468801] = ItemType.Lilac; - mappings[11468802] = ItemType.TallGrass; - mappings[11468803] = ItemType.LargeFern; - mappings[11468804] = ItemType.RoseBush; - mappings[11468805] = ItemType.Peony; - mappings[11730944] = ItemType.RedSandstone; - mappings[11730945] = ItemType.ChiseledRedSandstone; - mappings[11730946] = ItemType.SmoothRedSandstone; - mappings[11796480] = ItemType.RedSandstoneStairs; - mappings[11927552] = ItemType.RedSandstoneSlab; - mappings[11993088] = ItemType.SpruceFenceGate; - mappings[12058624] = ItemType.BirchFenceGate; - mappings[12124160] = ItemType.JungleFenceGate; - mappings[12189696] = ItemType.DarkOakFenceGate; - mappings[12255232] = ItemType.AcaciaFenceGate; - mappings[12320768] = ItemType.SpruceFence; - mappings[12386304] = ItemType.BirchFence; - mappings[12451840] = ItemType.JungleFence; - mappings[12517376] = ItemType.DarkOakFence; - mappings[12582912] = ItemType.AcaciaFence; - mappings[12976128] = ItemType.EndRod; - mappings[13041664] = ItemType.ChorusPlant; - mappings[13107200] = ItemType.ChorusFlower; - mappings[13172736] = ItemType.PurpurBlock; - mappings[13238272] = ItemType.PurpurPillar; - mappings[13303808] = ItemType.PurpurStairs; - mappings[13434880] = ItemType.PurpurSlab; - mappings[13500416] = ItemType.EndStoneBricks; - mappings[13631488] = ItemType.DirtPath; - mappings[13762560] = ItemType.RepeatingCommandBlock; - mappings[13828096] = ItemType.ChainCommandBlock; - mappings[14024704] = ItemType.NetherWartBlock; - mappings[14090240] = ItemType.RedNetherBricks; - mappings[14155776] = ItemType.BoneBlock; - mappings[14221312] = ItemType.StructureVoid; - mappings[14286848] = ItemType.Observer; - mappings[14417920] = ItemType.OrangeShulkerBox; - mappings[14745600] = ItemType.PinkShulkerBox; - mappings[14811136] = ItemType.GrayShulkerBox; - mappings[14876672] = ItemType.LightGrayShulkerBox; - mappings[14942208] = ItemType.CyanShulkerBox; - mappings[15007744] = ItemType.PurpleShulkerBox; - mappings[15073280] = ItemType.BlueShulkerBox; - mappings[15138816] = ItemType.BrownShulkerBox; - mappings[15204352] = ItemType.GreenShulkerBox; - mappings[15269888] = ItemType.RedShulkerBox; - mappings[15335424] = ItemType.BlackShulkerBox; - mappings[15466496] = ItemType.OrangeGlazedTerracotta; - mappings[15794176] = ItemType.PinkGlazedTerracotta; - mappings[15859712] = ItemType.GrayGlazedTerracotta; - mappings[15925248] = ItemType.LightGrayGlazedTerracotta; - mappings[15990784] = ItemType.CyanGlazedTerracotta; - mappings[16056320] = ItemType.PurpleGlazedTerracotta; - mappings[16121856] = ItemType.BlueGlazedTerracotta; - mappings[16187392] = ItemType.BrownGlazedTerracotta; - mappings[16252928] = ItemType.GreenGlazedTerracotta; - mappings[16318464] = ItemType.RedGlazedTerracotta; - mappings[16384000] = ItemType.BlackGlazedTerracotta; - mappings[16449536] = ItemType.WhiteConcrete; - mappings[16449537] = ItemType.OrangeConcrete; - mappings[16449538] = ItemType.MagentaConcrete; - mappings[16449539] = ItemType.LightBlueConcrete; - mappings[16449540] = ItemType.YellowConcrete; - mappings[16449541] = ItemType.LimeConcrete; - mappings[16449542] = ItemType.PinkConcrete; - mappings[16449543] = ItemType.GrayConcrete; - mappings[16449544] = ItemType.LightGrayConcrete; - mappings[16449545] = ItemType.CyanConcrete; - mappings[16449546] = ItemType.PurpleConcrete; - mappings[16449547] = ItemType.BlueConcrete; - mappings[16449548] = ItemType.BrownConcrete; - mappings[16449549] = ItemType.GreenConcrete; - mappings[16449550] = ItemType.RedConcrete; - mappings[16449551] = ItemType.BlackConcrete; - mappings[16515072] = ItemType.WhiteConcretePowder; - mappings[16515073] = ItemType.OrangeConcretePowder; - mappings[16515074] = ItemType.MagentaConcretePowder; - mappings[16515075] = ItemType.LightBlueConcretePowder; - mappings[16515076] = ItemType.YellowConcretePowder; - mappings[16515077] = ItemType.LimeConcretePowder; - mappings[16515078] = ItemType.PinkConcretePowder; - mappings[16515079] = ItemType.GrayConcretePowder; - mappings[16515080] = ItemType.LightGrayConcretePowder; - mappings[16515081] = ItemType.CyanConcretePowder; - mappings[16515082] = ItemType.PurpleConcretePowder; - mappings[16515083] = ItemType.BlueConcretePowder; - mappings[16515084] = ItemType.BrownConcretePowder; - mappings[16515085] = ItemType.GreenConcretePowder; - mappings[16515086] = ItemType.RedConcretePowder; - mappings[16515087] = ItemType.BlackConcretePowder; - mappings[16711680] = ItemType.StructureBlock; - mappings[16777216] = ItemType.IronShovel; - mappings[16842752] = ItemType.IronPickaxe; - mappings[16908288] = ItemType.IronAxe; - mappings[16973824] = ItemType.FlintAndSteel; - mappings[17039360] = ItemType.Apple; - mappings[17104896] = ItemType.Bow; - mappings[17170432] = ItemType.Arrow; - mappings[17235968] = ItemType.Coal; - mappings[17235969] = ItemType.Charcoal; - mappings[17301504] = ItemType.Diamond; - mappings[17367040] = ItemType.IronIngot; - mappings[17432576] = ItemType.GoldIngot; - mappings[17498112] = ItemType.IronSword; - mappings[17825792] = ItemType.StoneSword; - mappings[17891328] = ItemType.StoneShovel; - mappings[17956864] = ItemType.StonePickaxe; - mappings[18022400] = ItemType.StoneAxe; - mappings[18087936] = ItemType.DiamondSword; - mappings[18153472] = ItemType.DiamondShovel; - mappings[18219008] = ItemType.DiamondPickaxe; - mappings[18284544] = ItemType.DiamondAxe; - mappings[18350080] = ItemType.Stick; - mappings[18415616] = ItemType.Bowl; - mappings[18481152] = ItemType.MushroomStew; - mappings[18546688] = ItemType.GoldenSword; - mappings[18612224] = ItemType.GoldenShovel; - mappings[18677760] = ItemType.GoldenPickaxe; - mappings[18743296] = ItemType.GoldenAxe; - mappings[18808832] = ItemType.String; - mappings[18874368] = ItemType.Feather; - mappings[18939904] = ItemType.Gunpowder; - mappings[19070976] = ItemType.StoneHoe; - mappings[19136512] = ItemType.IronHoe; - mappings[19202048] = ItemType.DiamondHoe; - mappings[19267584] = ItemType.GoldenHoe; - mappings[19464192] = ItemType.Bread; - mappings[19791872] = ItemType.ChainmailHelmet; - mappings[19857408] = ItemType.ChainmailChestplate; - mappings[19922944] = ItemType.ChainmailLeggings; - mappings[19988480] = ItemType.ChainmailBoots; - mappings[20054016] = ItemType.IronHelmet; - mappings[20119552] = ItemType.IronChestplate; - mappings[20185088] = ItemType.IronLeggings; - mappings[20250624] = ItemType.IronBoots; - mappings[20316160] = ItemType.DiamondHelmet; - mappings[20381696] = ItemType.DiamondChestplate; - mappings[20447232] = ItemType.DiamondLeggings; - mappings[20512768] = ItemType.DiamondBoots; - mappings[20578304] = ItemType.GoldenHelmet; - mappings[20643840] = ItemType.GoldenChestplate; - mappings[20709376] = ItemType.GoldenLeggings; - mappings[20774912] = ItemType.GoldenBoots; - mappings[20840448] = ItemType.Flint; - mappings[20905984] = ItemType.Porkchop; - mappings[20971520] = ItemType.CookedPorkchop; - mappings[21037056] = ItemType.Painting; - mappings[21102592] = ItemType.GoldenApple; - mappings[21102593] = ItemType.EnchantedGoldenApple; - mappings[21168128] = ItemType.OakSign; - mappings[21299200] = ItemType.Bucket; - mappings[21495808] = ItemType.Minecart; - mappings[21561344] = ItemType.Saddle; - mappings[21626880] = ItemType.IronDoor; - mappings[21692416] = ItemType.Redstone; - mappings[21757952] = ItemType.Snowball; - mappings[21823488] = ItemType.OakBoat; - mappings[21954560] = ItemType.MilkBucket; - mappings[22020096] = ItemType.Brick; - mappings[22085632] = ItemType.ClayBall; - mappings[22151168] = ItemType.SugarCane; - mappings[22216704] = ItemType.Paper; - mappings[22282240] = ItemType.Book; - mappings[22347776] = ItemType.SlimeBall; - mappings[22413312] = ItemType.ChestMinecart; - mappings[22478848] = ItemType.FurnaceMinecart; - mappings[22544384] = ItemType.Egg; - mappings[22609920] = ItemType.Compass; - mappings[22675456] = ItemType.FishingRod; - mappings[22740992] = ItemType.Clock; - mappings[22806528] = ItemType.GlowstoneDust; - mappings[22872064] = ItemType.Salmon; - mappings[22872065] = ItemType.Salmon; - mappings[22872066] = ItemType.TropicalFish; - mappings[22872067] = ItemType.Pufferfish; - mappings[22937600] = ItemType.CookedSalmon; - mappings[22937601] = ItemType.CookedSalmon; - mappings[23003136] = ItemType.InkSac; - mappings[23003137] = ItemType.RedDye; - mappings[23003138] = ItemType.GreenDye; - mappings[23003139] = ItemType.CocoaBeans; - mappings[23003140] = ItemType.LapisLazuli; - mappings[23003141] = ItemType.PurpleDye; - mappings[23003142] = ItemType.CyanDye; - mappings[23003143] = ItemType.LightGrayDye; - mappings[23003144] = ItemType.GrayDye; - mappings[23003145] = ItemType.PinkDye; - mappings[23003146] = ItemType.LimeDye; - mappings[23003147] = ItemType.YellowDye; - mappings[23003148] = ItemType.LightBlueDye; - mappings[23003149] = ItemType.MagentaDye; - mappings[23003150] = ItemType.OrangeDye; - mappings[23003151] = ItemType.BoneMeal; - mappings[23068672] = ItemType.Bone; - mappings[23134208] = ItemType.Sugar; - mappings[23199744] = ItemType.Cake; - mappings[23265280] = ItemType.WhiteBed; - mappings[23265281] = ItemType.OrangeBed; - mappings[23265282] = ItemType.MagentaBed; - mappings[23265283] = ItemType.LightBlueBed; - mappings[23265284] = ItemType.YellowBed; - mappings[23265285] = ItemType.LimeBed; - mappings[23265286] = ItemType.PinkBed; - mappings[23265287] = ItemType.GrayBed; - mappings[23265288] = ItemType.LightGrayBed; - mappings[23265289] = ItemType.CyanBed; - mappings[23265290] = ItemType.PurpleBed; - mappings[23265291] = ItemType.BlueBed; - mappings[23265292] = ItemType.BrownBed; - mappings[23265293] = ItemType.GreenBed; - mappings[23265294] = ItemType.RedBed; - mappings[23265295] = ItemType.BlackBed; - mappings[23330816] = ItemType.Repeater; - mappings[23396352] = ItemType.Cookie; - mappings[23527424] = ItemType.Shears; - mappings[23592960] = ItemType.MelonSlice; - mappings[23658496] = ItemType.PumpkinSeeds; - mappings[23724032] = ItemType.MelonSeeds; - mappings[23789568] = ItemType.Beef; - mappings[23855104] = ItemType.CookedBeef; - mappings[23920640] = ItemType.Chicken; - mappings[23986176] = ItemType.CookedChicken; - mappings[24051712] = ItemType.RottenFlesh; - mappings[24117248] = ItemType.EnderPearl; - mappings[24182784] = ItemType.BlazeRod; - mappings[24248320] = ItemType.GhastTear; - mappings[24313856] = ItemType.GoldNugget; - mappings[24379392] = ItemType.NetherWart; - mappings[24444928] = ItemType.Potion; - mappings[24510464] = ItemType.GlassBottle; - mappings[24576000] = ItemType.SpiderEye; - mappings[24641536] = ItemType.FermentedSpiderEye; - mappings[24707072] = ItemType.BlazePowder; - mappings[24838144] = ItemType.BrewingStand; - mappings[24903680] = ItemType.Cauldron; - mappings[24969216] = ItemType.EnderEye; - mappings[25034752] = ItemType.GlisteringMelonSlice; - mappings[25100288] = ItemType.BatSpawnEgg; - mappings[25165824] = ItemType.ExperienceBottle; - mappings[25231360] = ItemType.FireCharge; - mappings[25427968] = ItemType.Emerald; - mappings[25493504] = ItemType.ItemFrame; - mappings[25559040] = ItemType.FlowerPot; - mappings[25624576] = ItemType.Carrot; - mappings[25690112] = ItemType.Potato; - mappings[25755648] = ItemType.BakedPotato; - mappings[25821184] = ItemType.PoisonousPotato; - mappings[25952256] = ItemType.GoldenCarrot; - mappings[26017792] = ItemType.SkeletonSkull; - mappings[26017793] = ItemType.WitherSkeletonSkull; - mappings[26017794] = ItemType.ZombieHead; - mappings[26017795] = ItemType.PlayerHead; - mappings[26017796] = ItemType.CreeperHead; - mappings[26017797] = ItemType.DragonHead; - mappings[26083328] = ItemType.CarrotOnAStick; - mappings[26148864] = ItemType.NetherStar; - mappings[26214400] = ItemType.PumpkinPie; - mappings[26279936] = ItemType.FireworkRocket; - mappings[26411008] = ItemType.EnchantedBook; - mappings[26476544] = ItemType.Comparator; - mappings[26542080] = ItemType.NetherBrick; - mappings[26607616] = ItemType.Quartz; - mappings[26673152] = ItemType.TntMinecart; - mappings[26738688] = ItemType.HopperMinecart; - mappings[26804224] = ItemType.PrismarineShard; - mappings[26869760] = ItemType.PrismarineCrystals; - mappings[26935296] = ItemType.Rabbit; - mappings[27000832] = ItemType.CookedRabbit; - mappings[27066368] = ItemType.RabbitStew; - mappings[27131904] = ItemType.RabbitFoot; - mappings[27197440] = ItemType.RabbitHide; - mappings[27262976] = ItemType.ArmorStand; - mappings[27328512] = ItemType.IronHorseArmor; - mappings[27394048] = ItemType.GoldenHorseArmor; - mappings[27459584] = ItemType.DiamondHorseArmor; - mappings[27590656] = ItemType.NameTag; - mappings[27656192] = ItemType.CommandBlockMinecart; - mappings[27721728] = ItemType.Mutton; - mappings[27787264] = ItemType.CookedMutton; - mappings[27852800] = ItemType.BlackBanner; - mappings[27852801] = ItemType.RedBanner; - mappings[27852802] = ItemType.GreenBanner; - mappings[27852803] = ItemType.BrownBanner; - mappings[27852804] = ItemType.BlueBanner; - mappings[27852805] = ItemType.PurpleBanner; - mappings[27852806] = ItemType.CyanBanner; - mappings[27852807] = ItemType.LightGrayBanner; - mappings[27852808] = ItemType.GrayBanner; - mappings[27852809] = ItemType.PinkBanner; - mappings[27852810] = ItemType.LimeBanner; - mappings[27852811] = ItemType.YellowBanner; - mappings[27852812] = ItemType.LightBlueBanner; - mappings[27852813] = ItemType.MagentaBanner; - mappings[27852814] = ItemType.OrangeBanner; - mappings[27852815] = ItemType.WhiteBanner; - mappings[27918336] = ItemType.EndCrystal; - mappings[27983872] = ItemType.SpruceDoor; - mappings[28049408] = ItemType.BirchDoor; - mappings[28114944] = ItemType.JungleDoor; - mappings[28180480] = ItemType.AcaciaDoor; - mappings[28246016] = ItemType.DarkOakDoor; - mappings[28311552] = ItemType.ChorusFruit; - mappings[28377088] = ItemType.PoppedChorusFruit; - mappings[28442624] = ItemType.Beetroot; - mappings[28508160] = ItemType.BeetrootSeeds; - mappings[28573696] = ItemType.BeetrootSoup; - mappings[28639232] = ItemType.DragonBreath; - mappings[28704768] = ItemType.Potion; - mappings[28770304] = ItemType.SpectralArrow; - mappings[28835840] = ItemType.Arrow; - mappings[28966912] = ItemType.Shield; - mappings[29032448] = ItemType.Elytra; - mappings[29097984] = ItemType.SpruceBoat; - mappings[29163520] = ItemType.BirchBoat; - mappings[29229056] = ItemType.JungleBoat; - mappings[29294592] = ItemType.AcaciaBoat; - mappings[29360128] = ItemType.DarkOakBoat; - mappings[29425664] = ItemType.TotemOfUndying; - mappings[29491200] = ItemType.ShulkerShell; - mappings[29622272] = ItemType.IronNugget; - mappings[29687808] = ItemType.KnowledgeBook; - mappings[1114112] = ItemType.OakLog; - mappings[1114113] = ItemType.SpruceLog; - mappings[1114114] = ItemType.BirchLog; - mappings[1114115] = ItemType.JungleLog; - mappings[1179648] = ItemType.OakLeaves; - mappings[1179649] = ItemType.SpruceLeaves; - mappings[1179650] = ItemType.BirchLeaves; - mappings[1179651] = ItemType.JungleLeaves; - mappings[1966080] = ItemType.Cobweb; - mappings[2293760] = ItemType.WhiteWool; - mappings[2293761] = ItemType.OrangeWool; - mappings[2293762] = ItemType.MagentaWool; - mappings[2293763] = ItemType.LightBlueWool; - mappings[2293764] = ItemType.YellowWool; - mappings[2293765] = ItemType.LimeWool; - mappings[2293766] = ItemType.PinkWool; - mappings[2293767] = ItemType.GrayWool; - mappings[2293768] = ItemType.LightGrayWool; - mappings[2293769] = ItemType.CyanWool; - mappings[2293770] = ItemType.PurpleWool; - mappings[2293771] = ItemType.BlueWool; - mappings[2293772] = ItemType.BrownWool; - mappings[2293773] = ItemType.GreenWool; - mappings[2293774] = ItemType.RedWool; - mappings[2293775] = ItemType.BlackWool; - mappings[2424832] = ItemType.Dandelion; - mappings[4521984] = ItemType.Lever; - mappings[4718592] = ItemType.OakPressurePlate; - mappings[5963776] = ItemType.JackOLantern; - mappings[7274496] = ItemType.LilyPad; - mappings[8257536] = ItemType.OakSlab; - mappings[8257537] = ItemType.SpruceSlab; - mappings[8257538] = ItemType.BirchSlab; - mappings[8257539] = ItemType.JungleSlab; - mappings[8257540] = ItemType.AcaciaSlab; - mappings[8257541] = ItemType.DarkOakSlab; - mappings[9371648] = ItemType.OakButton; - mappings[9633792] = ItemType.LightWeightedPressurePlate; - mappings[10551296] = ItemType.AcaciaLeaves; - mappings[10551297] = ItemType.DarkOakLeaves; - mappings[10616832] = ItemType.AcaciaLog; - mappings[10616833] = ItemType.DarkOakLog; - mappings[13959168] = ItemType.MagmaBlock; - mappings[14352384] = ItemType.WhiteShulkerBox; - mappings[14483456] = ItemType.MagentaShulkerBox; - mappings[14548992] = ItemType.LightBlueShulkerBox; - mappings[14614528] = ItemType.YellowShulkerBox; - mappings[14680064] = ItemType.LimeShulkerBox; - mappings[15400960] = ItemType.WhiteGlazedTerracotta; - mappings[15532032] = ItemType.MagentaGlazedTerracotta; - mappings[15597568] = ItemType.LightBlueGlazedTerracotta; - mappings[15663104] = ItemType.YellowGlazedTerracotta; - mappings[15728640] = ItemType.LimeGlazedTerracotta; - mappings[17563648] = ItemType.WoodenSword; - mappings[17629184] = ItemType.WoodenShovel; - mappings[17694720] = ItemType.WoodenPickaxe; - mappings[17760256] = ItemType.WoodenAxe; - mappings[19005440] = ItemType.WoodenHoe; - mappings[19333120] = ItemType.WheatSeeds; - mappings[19398656] = ItemType.Wheat; - mappings[19529728] = ItemType.LeatherHelmet; - mappings[19595264] = ItemType.LeatherChestplate; - mappings[19660800] = ItemType.LeatherLeggings; - mappings[19726336] = ItemType.LeatherBoots; - mappings[21233664] = ItemType.OakDoor; - mappings[21364736] = ItemType.WaterBucket; - mappings[21430272] = ItemType.LavaBucket; - mappings[21889024] = ItemType.Leather; - mappings[24772608] = ItemType.MagmaCream; - mappings[25296896] = ItemType.WritableBook; - mappings[25362432] = ItemType.WrittenBook; - mappings[25886720] = ItemType.Map; - mappings[27525120] = ItemType.Lead; - mappings[28901376] = ItemType.LingeringPotion; - mappings[147849216] = ItemType.MusicDisc13; - mappings[147914752] = ItemType.MusicDiscCat; - mappings[147980288] = ItemType.MusicDiscBlocks; - mappings[148045824] = ItemType.MusicDiscChirp; - mappings[148111360] = ItemType.MusicDiscFar; - mappings[148176896] = ItemType.MusicDiscMall; - mappings[148242432] = ItemType.MusicDiscMellohi; - mappings[148307968] = ItemType.MusicDiscStal; - mappings[148373504] = ItemType.MusicDiscStrad; - mappings[148439040] = ItemType.MusicDiscWard; - mappings[148504576] = ItemType.MusicDisc11; - mappings[148570112] = ItemType.MusicDiscWait; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} \ No newline at end of file diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette113.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette113.cs deleted file mode 100644 index af292fa1a2..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette113.cs +++ /dev/null @@ -1,803 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public class ItemPalette113 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette113() - { - mappings[0] = ItemType.Air; - mappings[1] = ItemType.Stone; - mappings[2] = ItemType.Granite; - mappings[3] = ItemType.PolishedGranite; - mappings[4] = ItemType.Diorite; - mappings[5] = ItemType.PolishedDiorite; - mappings[6] = ItemType.Andesite; - mappings[7] = ItemType.PolishedAndesite; - mappings[8] = ItemType.GrassBlock; - mappings[9] = ItemType.Dirt; - mappings[10] = ItemType.CoarseDirt; - mappings[11] = ItemType.Podzol; - mappings[12] = ItemType.Cobblestone; - mappings[13] = ItemType.OakPlanks; - mappings[14] = ItemType.SprucePlanks; - mappings[15] = ItemType.BirchPlanks; - mappings[16] = ItemType.JunglePlanks; - mappings[17] = ItemType.AcaciaPlanks; - mappings[18] = ItemType.DarkOakPlanks; - mappings[19] = ItemType.OakSapling; - mappings[20] = ItemType.SpruceSapling; - mappings[21] = ItemType.BirchSapling; - mappings[22] = ItemType.JungleSapling; - mappings[23] = ItemType.AcaciaSapling; - mappings[24] = ItemType.DarkOakSapling; - mappings[25] = ItemType.Bedrock; - mappings[26] = ItemType.Sand; - mappings[27] = ItemType.RedSand; - mappings[28] = ItemType.Gravel; - mappings[29] = ItemType.GoldOre; - mappings[30] = ItemType.IronOre; - mappings[31] = ItemType.CoalOre; - mappings[32] = ItemType.OakLog; - mappings[33] = ItemType.SpruceLog; - mappings[34] = ItemType.BirchLog; - mappings[35] = ItemType.JungleLog; - mappings[36] = ItemType.AcaciaLog; - mappings[37] = ItemType.DarkOakLog; - mappings[38] = ItemType.StrippedOakLog; - mappings[39] = ItemType.StrippedSpruceLog; - mappings[40] = ItemType.StrippedBirchLog; - mappings[41] = ItemType.StrippedJungleLog; - mappings[42] = ItemType.StrippedAcaciaLog; - mappings[43] = ItemType.StrippedDarkOakLog; - mappings[44] = ItemType.StrippedOakWood; - mappings[45] = ItemType.StrippedSpruceWood; - mappings[46] = ItemType.StrippedBirchWood; - mappings[47] = ItemType.StrippedJungleWood; - mappings[48] = ItemType.StrippedAcaciaWood; - mappings[49] = ItemType.StrippedDarkOakWood; - mappings[50] = ItemType.OakWood; - mappings[51] = ItemType.SpruceWood; - mappings[52] = ItemType.BirchWood; - mappings[53] = ItemType.JungleWood; - mappings[54] = ItemType.AcaciaWood; - mappings[55] = ItemType.DarkOakWood; - mappings[56] = ItemType.OakLeaves; - mappings[57] = ItemType.SpruceLeaves; - mappings[58] = ItemType.BirchLeaves; - mappings[59] = ItemType.JungleLeaves; - mappings[60] = ItemType.AcaciaLeaves; - mappings[61] = ItemType.DarkOakLeaves; - mappings[62] = ItemType.Sponge; - mappings[63] = ItemType.WetSponge; - mappings[64] = ItemType.Glass; - mappings[65] = ItemType.LapisOre; - mappings[66] = ItemType.LapisBlock; - mappings[67] = ItemType.Dispenser; - mappings[68] = ItemType.Sandstone; - mappings[69] = ItemType.ChiseledSandstone; - mappings[70] = ItemType.CutSandstone; - mappings[71] = ItemType.NoteBlock; - mappings[72] = ItemType.PoweredRail; - mappings[73] = ItemType.DetectorRail; - mappings[74] = ItemType.StickyPiston; - mappings[75] = ItemType.Cobweb; - mappings[76] = ItemType.ShortGrass; - mappings[77] = ItemType.Fern; - mappings[78] = ItemType.DeadBush; - mappings[79] = ItemType.Seagrass; - mappings[80] = ItemType.SeaPickle; - mappings[81] = ItemType.Piston; - mappings[82] = ItemType.WhiteWool; - mappings[83] = ItemType.OrangeWool; - mappings[84] = ItemType.MagentaWool; - mappings[85] = ItemType.LightBlueWool; - mappings[86] = ItemType.YellowWool; - mappings[87] = ItemType.LimeWool; - mappings[88] = ItemType.PinkWool; - mappings[89] = ItemType.GrayWool; - mappings[90] = ItemType.LightGrayWool; - mappings[91] = ItemType.CyanWool; - mappings[92] = ItemType.PurpleWool; - mappings[93] = ItemType.BlueWool; - mappings[94] = ItemType.BrownWool; - mappings[95] = ItemType.GreenWool; - mappings[96] = ItemType.RedWool; - mappings[97] = ItemType.BlackWool; - mappings[98] = ItemType.Dandelion; - mappings[99] = ItemType.Poppy; - mappings[100] = ItemType.BlueOrchid; - mappings[101] = ItemType.Allium; - mappings[102] = ItemType.AzureBluet; - mappings[103] = ItemType.RedTulip; - mappings[104] = ItemType.OrangeTulip; - mappings[105] = ItemType.WhiteTulip; - mappings[106] = ItemType.PinkTulip; - mappings[107] = ItemType.OxeyeDaisy; - mappings[108] = ItemType.BrownMushroom; - mappings[109] = ItemType.RedMushroom; - mappings[110] = ItemType.GoldBlock; - mappings[111] = ItemType.IronBlock; - mappings[112] = ItemType.OakSlab; - mappings[113] = ItemType.SpruceSlab; - mappings[114] = ItemType.BirchSlab; - mappings[115] = ItemType.JungleSlab; - mappings[116] = ItemType.AcaciaSlab; - mappings[117] = ItemType.DarkOakSlab; - mappings[118] = ItemType.StoneSlab; - mappings[119] = ItemType.SandstoneSlab; - mappings[120] = ItemType.PetrifiedOakSlab; - mappings[121] = ItemType.CobblestoneSlab; - mappings[122] = ItemType.BrickSlab; - mappings[123] = ItemType.StoneBrickSlab; - mappings[124] = ItemType.NetherBrickSlab; - mappings[125] = ItemType.QuartzSlab; - mappings[126] = ItemType.RedSandstoneSlab; - mappings[127] = ItemType.PurpurSlab; - mappings[128] = ItemType.PrismarineSlab; - mappings[129] = ItemType.PrismarineBrickSlab; - mappings[130] = ItemType.DarkPrismarineSlab; - mappings[131] = ItemType.SmoothQuartz; - mappings[132] = ItemType.SmoothRedSandstone; - mappings[133] = ItemType.SmoothSandstone; - mappings[134] = ItemType.SmoothStone; - mappings[135] = ItemType.Bricks; - mappings[136] = ItemType.Tnt; - mappings[137] = ItemType.Bookshelf; - mappings[138] = ItemType.MossyCobblestone; - mappings[139] = ItemType.Obsidian; - mappings[140] = ItemType.Torch; - mappings[141] = ItemType.EndRod; - mappings[142] = ItemType.ChorusPlant; - mappings[143] = ItemType.ChorusFlower; - mappings[144] = ItemType.PurpurBlock; - mappings[145] = ItemType.PurpurPillar; - mappings[146] = ItemType.PurpurStairs; - mappings[147] = ItemType.Spawner; - mappings[148] = ItemType.OakStairs; - mappings[149] = ItemType.Chest; - mappings[150] = ItemType.DiamondOre; - mappings[151] = ItemType.DiamondBlock; - mappings[152] = ItemType.CraftingTable; - mappings[153] = ItemType.Farmland; - mappings[154] = ItemType.Furnace; - mappings[155] = ItemType.Ladder; - mappings[156] = ItemType.Rail; - mappings[157] = ItemType.CobblestoneStairs; - mappings[158] = ItemType.Lever; - mappings[159] = ItemType.StonePressurePlate; - mappings[160] = ItemType.OakPressurePlate; - mappings[161] = ItemType.SprucePressurePlate; - mappings[162] = ItemType.BirchPressurePlate; - mappings[163] = ItemType.JunglePressurePlate; - mappings[164] = ItemType.AcaciaPressurePlate; - mappings[165] = ItemType.DarkOakPressurePlate; - mappings[166] = ItemType.RedstoneOre; - mappings[167] = ItemType.RedstoneTorch; - mappings[168] = ItemType.StoneButton; - mappings[169] = ItemType.Snow; - mappings[170] = ItemType.Ice; - mappings[171] = ItemType.SnowBlock; - mappings[172] = ItemType.Cactus; - mappings[173] = ItemType.Clay; - mappings[174] = ItemType.Jukebox; - mappings[175] = ItemType.OakFence; - mappings[176] = ItemType.SpruceFence; - mappings[177] = ItemType.BirchFence; - mappings[178] = ItemType.JungleFence; - mappings[179] = ItemType.AcaciaFence; - mappings[180] = ItemType.DarkOakFence; - mappings[181] = ItemType.Pumpkin; - mappings[182] = ItemType.CarvedPumpkin; - mappings[183] = ItemType.Netherrack; - mappings[184] = ItemType.SoulSand; - mappings[185] = ItemType.Glowstone; - mappings[186] = ItemType.JackOLantern; - mappings[187] = ItemType.OakTrapdoor; - mappings[188] = ItemType.SpruceTrapdoor; - mappings[189] = ItemType.BirchTrapdoor; - mappings[190] = ItemType.JungleTrapdoor; - mappings[191] = ItemType.AcaciaTrapdoor; - mappings[192] = ItemType.DarkOakTrapdoor; - mappings[193] = ItemType.InfestedStone; - mappings[194] = ItemType.InfestedCobblestone; - mappings[195] = ItemType.InfestedStoneBricks; - mappings[196] = ItemType.InfestedMossyStoneBricks; - mappings[197] = ItemType.InfestedCrackedStoneBricks; - mappings[198] = ItemType.InfestedChiseledStoneBricks; - mappings[199] = ItemType.StoneBricks; - mappings[200] = ItemType.MossyStoneBricks; - mappings[201] = ItemType.CrackedStoneBricks; - mappings[202] = ItemType.ChiseledStoneBricks; - mappings[203] = ItemType.BrownMushroomBlock; - mappings[204] = ItemType.RedMushroomBlock; - mappings[205] = ItemType.MushroomStem; - mappings[206] = ItemType.IronBars; - mappings[207] = ItemType.GlassPane; - mappings[208] = ItemType.Melon; - mappings[209] = ItemType.Vine; - mappings[210] = ItemType.OakFenceGate; - mappings[211] = ItemType.SpruceFenceGate; - mappings[212] = ItemType.BirchFenceGate; - mappings[213] = ItemType.JungleFenceGate; - mappings[214] = ItemType.AcaciaFenceGate; - mappings[215] = ItemType.DarkOakFenceGate; - mappings[216] = ItemType.BrickStairs; - mappings[217] = ItemType.StoneBrickStairs; - mappings[218] = ItemType.Mycelium; - mappings[219] = ItemType.LilyPad; - mappings[220] = ItemType.NetherBricks; - mappings[221] = ItemType.NetherBrickFence; - mappings[222] = ItemType.NetherBrickStairs; - mappings[223] = ItemType.EnchantingTable; - mappings[224] = ItemType.EndPortalFrame; - mappings[225] = ItemType.EndStone; - mappings[226] = ItemType.EndStoneBricks; - mappings[227] = ItemType.DragonEgg; - mappings[228] = ItemType.RedstoneLamp; - mappings[229] = ItemType.SandstoneStairs; - mappings[230] = ItemType.EmeraldOre; - mappings[231] = ItemType.EnderChest; - mappings[232] = ItemType.TripwireHook; - mappings[233] = ItemType.EmeraldBlock; - mappings[234] = ItemType.SpruceStairs; - mappings[235] = ItemType.BirchStairs; - mappings[236] = ItemType.JungleStairs; - mappings[237] = ItemType.CommandBlock; - mappings[238] = ItemType.Beacon; - mappings[239] = ItemType.CobblestoneWall; - mappings[240] = ItemType.MossyCobblestoneWall; - mappings[241] = ItemType.OakButton; - mappings[242] = ItemType.SpruceButton; - mappings[243] = ItemType.BirchButton; - mappings[244] = ItemType.JungleButton; - mappings[245] = ItemType.AcaciaButton; - mappings[246] = ItemType.DarkOakButton; - mappings[247] = ItemType.Anvil; - mappings[248] = ItemType.ChippedAnvil; - mappings[249] = ItemType.DamagedAnvil; - mappings[250] = ItemType.TrappedChest; - mappings[251] = ItemType.LightWeightedPressurePlate; - mappings[252] = ItemType.HeavyWeightedPressurePlate; - mappings[253] = ItemType.DaylightDetector; - mappings[254] = ItemType.RedstoneBlock; - mappings[255] = ItemType.NetherQuartzOre; - mappings[256] = ItemType.Hopper; - mappings[257] = ItemType.ChiseledQuartzBlock; - mappings[258] = ItemType.QuartzBlock; - mappings[259] = ItemType.QuartzPillar; - mappings[260] = ItemType.QuartzStairs; - mappings[261] = ItemType.ActivatorRail; - mappings[262] = ItemType.Dropper; - mappings[263] = ItemType.WhiteTerracotta; - mappings[264] = ItemType.OrangeTerracotta; - mappings[265] = ItemType.MagentaTerracotta; - mappings[266] = ItemType.LightBlueTerracotta; - mappings[267] = ItemType.YellowTerracotta; - mappings[268] = ItemType.LimeTerracotta; - mappings[269] = ItemType.PinkTerracotta; - mappings[270] = ItemType.GrayTerracotta; - mappings[271] = ItemType.LightGrayTerracotta; - mappings[272] = ItemType.CyanTerracotta; - mappings[273] = ItemType.PurpleTerracotta; - mappings[274] = ItemType.BlueTerracotta; - mappings[275] = ItemType.BrownTerracotta; - mappings[276] = ItemType.GreenTerracotta; - mappings[277] = ItemType.RedTerracotta; - mappings[278] = ItemType.BlackTerracotta; - mappings[279] = ItemType.Barrier; - mappings[280] = ItemType.IronTrapdoor; - mappings[281] = ItemType.HayBlock; - mappings[282] = ItemType.WhiteCarpet; - mappings[283] = ItemType.OrangeCarpet; - mappings[284] = ItemType.MagentaCarpet; - mappings[285] = ItemType.LightBlueCarpet; - mappings[286] = ItemType.YellowCarpet; - mappings[287] = ItemType.LimeCarpet; - mappings[288] = ItemType.PinkCarpet; - mappings[289] = ItemType.GrayCarpet; - mappings[290] = ItemType.LightGrayCarpet; - mappings[291] = ItemType.CyanCarpet; - mappings[292] = ItemType.PurpleCarpet; - mappings[293] = ItemType.BlueCarpet; - mappings[294] = ItemType.BrownCarpet; - mappings[295] = ItemType.GreenCarpet; - mappings[296] = ItemType.RedCarpet; - mappings[297] = ItemType.BlackCarpet; - mappings[298] = ItemType.Terracotta; - mappings[299] = ItemType.CoalBlock; - mappings[300] = ItemType.PackedIce; - mappings[301] = ItemType.AcaciaStairs; - mappings[302] = ItemType.DarkOakStairs; - mappings[303] = ItemType.SlimeBlock; - mappings[304] = ItemType.DirtPath; - mappings[305] = ItemType.Sunflower; - mappings[306] = ItemType.Lilac; - mappings[307] = ItemType.RoseBush; - mappings[308] = ItemType.Peony; - mappings[309] = ItemType.TallGrass; - mappings[310] = ItemType.LargeFern; - mappings[311] = ItemType.WhiteStainedGlass; - mappings[312] = ItemType.OrangeStainedGlass; - mappings[313] = ItemType.MagentaStainedGlass; - mappings[314] = ItemType.LightBlueStainedGlass; - mappings[315] = ItemType.YellowStainedGlass; - mappings[316] = ItemType.LimeStainedGlass; - mappings[317] = ItemType.PinkStainedGlass; - mappings[318] = ItemType.GrayStainedGlass; - mappings[319] = ItemType.LightGrayStainedGlass; - mappings[320] = ItemType.CyanStainedGlass; - mappings[321] = ItemType.PurpleStainedGlass; - mappings[322] = ItemType.BlueStainedGlass; - mappings[323] = ItemType.BrownStainedGlass; - mappings[324] = ItemType.GreenStainedGlass; - mappings[325] = ItemType.RedStainedGlass; - mappings[326] = ItemType.BlackStainedGlass; - mappings[327] = ItemType.WhiteStainedGlassPane; - mappings[328] = ItemType.OrangeStainedGlassPane; - mappings[329] = ItemType.MagentaStainedGlassPane; - mappings[330] = ItemType.LightBlueStainedGlassPane; - mappings[331] = ItemType.YellowStainedGlassPane; - mappings[332] = ItemType.LimeStainedGlassPane; - mappings[333] = ItemType.PinkStainedGlassPane; - mappings[334] = ItemType.GrayStainedGlassPane; - mappings[335] = ItemType.LightGrayStainedGlassPane; - mappings[336] = ItemType.CyanStainedGlassPane; - mappings[337] = ItemType.PurpleStainedGlassPane; - mappings[338] = ItemType.BlueStainedGlassPane; - mappings[339] = ItemType.BrownStainedGlassPane; - mappings[340] = ItemType.GreenStainedGlassPane; - mappings[341] = ItemType.RedStainedGlassPane; - mappings[342] = ItemType.BlackStainedGlassPane; - mappings[343] = ItemType.Prismarine; - mappings[344] = ItemType.PrismarineBricks; - mappings[345] = ItemType.DarkPrismarine; - mappings[346] = ItemType.PrismarineStairs; - mappings[347] = ItemType.PrismarineBrickStairs; - mappings[348] = ItemType.DarkPrismarineStairs; - mappings[349] = ItemType.SeaLantern; - mappings[350] = ItemType.RedSandstone; - mappings[351] = ItemType.ChiseledRedSandstone; - mappings[352] = ItemType.CutRedSandstone; - mappings[353] = ItemType.RedSandstoneStairs; - mappings[354] = ItemType.RepeatingCommandBlock; - mappings[355] = ItemType.ChainCommandBlock; - mappings[356] = ItemType.MagmaBlock; - mappings[357] = ItemType.NetherWartBlock; - mappings[358] = ItemType.RedNetherBricks; - mappings[359] = ItemType.BoneBlock; - mappings[360] = ItemType.StructureVoid; - mappings[361] = ItemType.Observer; - mappings[362] = ItemType.ShulkerBox; - mappings[363] = ItemType.WhiteShulkerBox; - mappings[364] = ItemType.OrangeShulkerBox; - mappings[365] = ItemType.MagentaShulkerBox; - mappings[366] = ItemType.LightBlueShulkerBox; - mappings[367] = ItemType.YellowShulkerBox; - mappings[368] = ItemType.LimeShulkerBox; - mappings[369] = ItemType.PinkShulkerBox; - mappings[370] = ItemType.GrayShulkerBox; - mappings[371] = ItemType.LightGrayShulkerBox; - mappings[372] = ItemType.CyanShulkerBox; - mappings[373] = ItemType.PurpleShulkerBox; - mappings[374] = ItemType.BlueShulkerBox; - mappings[375] = ItemType.BrownShulkerBox; - mappings[376] = ItemType.GreenShulkerBox; - mappings[377] = ItemType.RedShulkerBox; - mappings[378] = ItemType.BlackShulkerBox; - mappings[379] = ItemType.WhiteGlazedTerracotta; - mappings[380] = ItemType.OrangeGlazedTerracotta; - mappings[381] = ItemType.MagentaGlazedTerracotta; - mappings[382] = ItemType.LightBlueGlazedTerracotta; - mappings[383] = ItemType.YellowGlazedTerracotta; - mappings[384] = ItemType.LimeGlazedTerracotta; - mappings[385] = ItemType.PinkGlazedTerracotta; - mappings[386] = ItemType.GrayGlazedTerracotta; - mappings[387] = ItemType.LightGrayGlazedTerracotta; - mappings[388] = ItemType.CyanGlazedTerracotta; - mappings[389] = ItemType.PurpleGlazedTerracotta; - mappings[390] = ItemType.BlueGlazedTerracotta; - mappings[391] = ItemType.BrownGlazedTerracotta; - mappings[392] = ItemType.GreenGlazedTerracotta; - mappings[393] = ItemType.RedGlazedTerracotta; - mappings[394] = ItemType.BlackGlazedTerracotta; - mappings[395] = ItemType.WhiteConcrete; - mappings[396] = ItemType.OrangeConcrete; - mappings[397] = ItemType.MagentaConcrete; - mappings[398] = ItemType.LightBlueConcrete; - mappings[399] = ItemType.YellowConcrete; - mappings[400] = ItemType.LimeConcrete; - mappings[401] = ItemType.PinkConcrete; - mappings[402] = ItemType.GrayConcrete; - mappings[403] = ItemType.LightGrayConcrete; - mappings[404] = ItemType.CyanConcrete; - mappings[405] = ItemType.PurpleConcrete; - mappings[406] = ItemType.BlueConcrete; - mappings[407] = ItemType.BrownConcrete; - mappings[408] = ItemType.GreenConcrete; - mappings[409] = ItemType.RedConcrete; - mappings[410] = ItemType.BlackConcrete; - mappings[411] = ItemType.WhiteConcretePowder; - mappings[412] = ItemType.OrangeConcretePowder; - mappings[413] = ItemType.MagentaConcretePowder; - mappings[414] = ItemType.LightBlueConcretePowder; - mappings[415] = ItemType.YellowConcretePowder; - mappings[416] = ItemType.LimeConcretePowder; - mappings[417] = ItemType.PinkConcretePowder; - mappings[418] = ItemType.GrayConcretePowder; - mappings[419] = ItemType.LightGrayConcretePowder; - mappings[420] = ItemType.CyanConcretePowder; - mappings[421] = ItemType.PurpleConcretePowder; - mappings[422] = ItemType.BlueConcretePowder; - mappings[423] = ItemType.BrownConcretePowder; - mappings[424] = ItemType.GreenConcretePowder; - mappings[425] = ItemType.RedConcretePowder; - mappings[426] = ItemType.BlackConcretePowder; - mappings[427] = ItemType.TurtleEgg; - mappings[428] = ItemType.DeadTubeCoralBlock; - mappings[429] = ItemType.DeadBrainCoralBlock; - mappings[430] = ItemType.DeadBubbleCoralBlock; - mappings[431] = ItemType.DeadFireCoralBlock; - mappings[432] = ItemType.DeadHornCoralBlock; - mappings[433] = ItemType.TubeCoralBlock; - mappings[434] = ItemType.BrainCoralBlock; - mappings[435] = ItemType.BubbleCoralBlock; - mappings[436] = ItemType.FireCoralBlock; - mappings[437] = ItemType.HornCoralBlock; - mappings[438] = ItemType.TubeCoral; - mappings[439] = ItemType.BrainCoral; - mappings[440] = ItemType.BubbleCoral; - mappings[441] = ItemType.FireCoral; - mappings[442] = ItemType.HornCoral; - mappings[443] = ItemType.TubeCoralFan; - mappings[444] = ItemType.BrainCoralFan; - mappings[445] = ItemType.BubbleCoralFan; - mappings[446] = ItemType.FireCoralFan; - mappings[447] = ItemType.HornCoralFan; - mappings[448] = ItemType.DeadTubeCoralFan; - mappings[449] = ItemType.DeadBrainCoralFan; - mappings[450] = ItemType.DeadBubbleCoralFan; - mappings[451] = ItemType.DeadFireCoralFan; - mappings[452] = ItemType.DeadHornCoralFan; - mappings[453] = ItemType.BlueIce; - mappings[454] = ItemType.Conduit; - mappings[455] = ItemType.IronDoor; - mappings[456] = ItemType.OakDoor; - mappings[457] = ItemType.SpruceDoor; - mappings[458] = ItemType.BirchDoor; - mappings[459] = ItemType.JungleDoor; - mappings[460] = ItemType.AcaciaDoor; - mappings[461] = ItemType.DarkOakDoor; - mappings[462] = ItemType.Repeater; - mappings[463] = ItemType.Comparator; - mappings[464] = ItemType.StructureBlock; - mappings[465] = ItemType.TurtleHelmet; - mappings[466] = ItemType.TurtleScute; - mappings[467] = ItemType.IronShovel; - mappings[468] = ItemType.IronPickaxe; - mappings[469] = ItemType.IronAxe; - mappings[470] = ItemType.FlintAndSteel; - mappings[471] = ItemType.Apple; - mappings[472] = ItemType.Bow; - mappings[473] = ItemType.Arrow; - mappings[474] = ItemType.Coal; - mappings[475] = ItemType.Charcoal; - mappings[476] = ItemType.Diamond; - mappings[477] = ItemType.IronIngot; - mappings[478] = ItemType.GoldIngot; - mappings[479] = ItemType.IronSword; - mappings[480] = ItemType.WoodenSword; - mappings[481] = ItemType.WoodenShovel; - mappings[482] = ItemType.WoodenPickaxe; - mappings[483] = ItemType.WoodenAxe; - mappings[484] = ItemType.StoneSword; - mappings[485] = ItemType.StoneShovel; - mappings[486] = ItemType.StonePickaxe; - mappings[487] = ItemType.StoneAxe; - mappings[488] = ItemType.DiamondSword; - mappings[489] = ItemType.DiamondShovel; - mappings[490] = ItemType.DiamondPickaxe; - mappings[491] = ItemType.DiamondAxe; - mappings[492] = ItemType.Stick; - mappings[493] = ItemType.Bowl; - mappings[494] = ItemType.MushroomStew; - mappings[495] = ItemType.GoldenSword; - mappings[496] = ItemType.GoldenShovel; - mappings[497] = ItemType.GoldenPickaxe; - mappings[498] = ItemType.GoldenAxe; - mappings[499] = ItemType.String; - mappings[500] = ItemType.Feather; - mappings[501] = ItemType.Gunpowder; - mappings[502] = ItemType.WoodenHoe; - mappings[503] = ItemType.StoneHoe; - mappings[504] = ItemType.IronHoe; - mappings[505] = ItemType.DiamondHoe; - mappings[506] = ItemType.GoldenHoe; - mappings[507] = ItemType.WheatSeeds; - mappings[508] = ItemType.Wheat; - mappings[509] = ItemType.Bread; - mappings[510] = ItemType.LeatherHelmet; - mappings[511] = ItemType.LeatherChestplate; - mappings[512] = ItemType.LeatherLeggings; - mappings[513] = ItemType.LeatherBoots; - mappings[514] = ItemType.ChainmailHelmet; - mappings[515] = ItemType.ChainmailChestplate; - mappings[516] = ItemType.ChainmailLeggings; - mappings[517] = ItemType.ChainmailBoots; - mappings[518] = ItemType.IronHelmet; - mappings[519] = ItemType.IronChestplate; - mappings[520] = ItemType.IronLeggings; - mappings[521] = ItemType.IronBoots; - mappings[522] = ItemType.DiamondHelmet; - mappings[523] = ItemType.DiamondChestplate; - mappings[524] = ItemType.DiamondLeggings; - mappings[525] = ItemType.DiamondBoots; - mappings[526] = ItemType.GoldenHelmet; - mappings[527] = ItemType.GoldenChestplate; - mappings[528] = ItemType.GoldenLeggings; - mappings[529] = ItemType.GoldenBoots; - mappings[530] = ItemType.Flint; - mappings[531] = ItemType.Porkchop; - mappings[532] = ItemType.CookedPorkchop; - mappings[533] = ItemType.Painting; - mappings[534] = ItemType.GoldenApple; - mappings[535] = ItemType.EnchantedGoldenApple; - mappings[536] = ItemType.OakSign; - mappings[537] = ItemType.Bucket; - mappings[538] = ItemType.WaterBucket; - mappings[539] = ItemType.LavaBucket; - mappings[540] = ItemType.Minecart; - mappings[541] = ItemType.Saddle; - mappings[542] = ItemType.Redstone; - mappings[543] = ItemType.Snowball; - mappings[544] = ItemType.OakBoat; - mappings[545] = ItemType.Leather; - mappings[546] = ItemType.MilkBucket; - mappings[547] = ItemType.PufferfishBucket; - mappings[548] = ItemType.SalmonBucket; - mappings[549] = ItemType.CodBucket; - mappings[550] = ItemType.TropicalFishBucket; - mappings[551] = ItemType.Brick; - mappings[552] = ItemType.ClayBall; - mappings[553] = ItemType.SugarCane; - mappings[554] = ItemType.Kelp; - mappings[555] = ItemType.DriedKelpBlock; - mappings[556] = ItemType.Paper; - mappings[557] = ItemType.Book; - mappings[558] = ItemType.SlimeBall; - mappings[559] = ItemType.ChestMinecart; - mappings[560] = ItemType.FurnaceMinecart; - mappings[561] = ItemType.Egg; - mappings[562] = ItemType.Compass; - mappings[563] = ItemType.FishingRod; - mappings[564] = ItemType.Clock; - mappings[565] = ItemType.GlowstoneDust; - mappings[566] = ItemType.Cod; - mappings[567] = ItemType.Salmon; - mappings[568] = ItemType.TropicalFish; - mappings[569] = ItemType.Pufferfish; - mappings[570] = ItemType.CookedCod; - mappings[571] = ItemType.CookedSalmon; - mappings[572] = ItemType.InkSac; - mappings[573] = ItemType.RedDye; - mappings[574] = ItemType.GreenDye; - mappings[575] = ItemType.CocoaBeans; - mappings[576] = ItemType.LapisLazuli; - mappings[577] = ItemType.PurpleDye; - mappings[578] = ItemType.CyanDye; - mappings[579] = ItemType.LightGrayDye; - mappings[580] = ItemType.GrayDye; - mappings[581] = ItemType.PinkDye; - mappings[582] = ItemType.LimeDye; - mappings[583] = ItemType.YellowDye; - mappings[584] = ItemType.LightBlueDye; - mappings[585] = ItemType.MagentaDye; - mappings[586] = ItemType.OrangeDye; - mappings[587] = ItemType.BoneMeal; - mappings[588] = ItemType.Bone; - mappings[589] = ItemType.Sugar; - mappings[590] = ItemType.Cake; - mappings[591] = ItemType.WhiteBed; - mappings[592] = ItemType.OrangeBed; - mappings[593] = ItemType.MagentaBed; - mappings[594] = ItemType.LightBlueBed; - mappings[595] = ItemType.YellowBed; - mappings[596] = ItemType.LimeBed; - mappings[597] = ItemType.PinkBed; - mappings[598] = ItemType.GrayBed; - mappings[599] = ItemType.LightGrayBed; - mappings[600] = ItemType.CyanBed; - mappings[601] = ItemType.PurpleBed; - mappings[602] = ItemType.BlueBed; - mappings[603] = ItemType.BrownBed; - mappings[604] = ItemType.GreenBed; - mappings[605] = ItemType.RedBed; - mappings[606] = ItemType.BlackBed; - mappings[607] = ItemType.Cookie; - mappings[608] = ItemType.FilledMap; - mappings[609] = ItemType.Shears; - mappings[610] = ItemType.MelonSlice; - mappings[611] = ItemType.DriedKelp; - mappings[612] = ItemType.PumpkinSeeds; - mappings[613] = ItemType.MelonSeeds; - mappings[614] = ItemType.Beef; - mappings[615] = ItemType.CookedBeef; - mappings[616] = ItemType.Chicken; - mappings[617] = ItemType.CookedChicken; - mappings[618] = ItemType.RottenFlesh; - mappings[619] = ItemType.EnderPearl; - mappings[620] = ItemType.BlazeRod; - mappings[621] = ItemType.GhastTear; - mappings[622] = ItemType.GoldNugget; - mappings[623] = ItemType.NetherWart; - mappings[624] = ItemType.Potion; - mappings[625] = ItemType.GlassBottle; - mappings[626] = ItemType.SpiderEye; - mappings[627] = ItemType.FermentedSpiderEye; - mappings[628] = ItemType.BlazePowder; - mappings[629] = ItemType.MagmaCream; - mappings[630] = ItemType.BrewingStand; - mappings[631] = ItemType.Cauldron; - mappings[632] = ItemType.EnderEye; - mappings[633] = ItemType.GlisteringMelonSlice; - mappings[634] = ItemType.BatSpawnEgg; - mappings[635] = ItemType.BlazeSpawnEgg; - mappings[636] = ItemType.CaveSpiderSpawnEgg; - mappings[637] = ItemType.ChickenSpawnEgg; - mappings[638] = ItemType.CodSpawnEgg; - mappings[639] = ItemType.CowSpawnEgg; - mappings[640] = ItemType.CreeperSpawnEgg; - mappings[641] = ItemType.DolphinSpawnEgg; - mappings[642] = ItemType.DonkeySpawnEgg; - mappings[643] = ItemType.DrownedSpawnEgg; - mappings[644] = ItemType.ElderGuardianSpawnEgg; - mappings[645] = ItemType.EndermanSpawnEgg; - mappings[646] = ItemType.EndermiteSpawnEgg; - mappings[647] = ItemType.EvokerSpawnEgg; - mappings[648] = ItemType.GhastSpawnEgg; - mappings[649] = ItemType.GuardianSpawnEgg; - mappings[650] = ItemType.HorseSpawnEgg; - mappings[651] = ItemType.HuskSpawnEgg; - mappings[652] = ItemType.LlamaSpawnEgg; - mappings[653] = ItemType.MagmaCubeSpawnEgg; - mappings[654] = ItemType.MooshroomSpawnEgg; - mappings[655] = ItemType.MuleSpawnEgg; - mappings[656] = ItemType.OcelotSpawnEgg; - mappings[657] = ItemType.ParrotSpawnEgg; - mappings[658] = ItemType.PhantomSpawnEgg; - mappings[659] = ItemType.PigSpawnEgg; - mappings[660] = ItemType.PolarBearSpawnEgg; - mappings[661] = ItemType.PufferfishSpawnEgg; - mappings[662] = ItemType.RabbitSpawnEgg; - mappings[663] = ItemType.SalmonSpawnEgg; - mappings[664] = ItemType.SheepSpawnEgg; - mappings[665] = ItemType.ShulkerSpawnEgg; - mappings[666] = ItemType.SilverfishSpawnEgg; - mappings[667] = ItemType.SkeletonSpawnEgg; - mappings[668] = ItemType.SkeletonHorseSpawnEgg; - mappings[669] = ItemType.SlimeSpawnEgg; - mappings[670] = ItemType.SpiderSpawnEgg; - mappings[671] = ItemType.SquidSpawnEgg; - mappings[672] = ItemType.StraySpawnEgg; - mappings[673] = ItemType.TropicalFishSpawnEgg; - mappings[674] = ItemType.TurtleSpawnEgg; - mappings[675] = ItemType.VexSpawnEgg; - mappings[676] = ItemType.VillagerSpawnEgg; - mappings[677] = ItemType.VindicatorSpawnEgg; - mappings[678] = ItemType.WitchSpawnEgg; - mappings[679] = ItemType.WitherSkeletonSpawnEgg; - mappings[680] = ItemType.WolfSpawnEgg; - mappings[681] = ItemType.ZombieSpawnEgg; - mappings[682] = ItemType.ZombieHorseSpawnEgg; - mappings[683] = ItemType.ZombifiedPiglinSpawnEgg; - mappings[684] = ItemType.ZombieVillagerSpawnEgg; - mappings[685] = ItemType.ExperienceBottle; - mappings[686] = ItemType.FireCharge; - mappings[687] = ItemType.WritableBook; - mappings[688] = ItemType.WrittenBook; - mappings[689] = ItemType.Emerald; - mappings[690] = ItemType.ItemFrame; - mappings[691] = ItemType.FlowerPot; - mappings[692] = ItemType.Carrot; - mappings[693] = ItemType.Potato; - mappings[694] = ItemType.BakedPotato; - mappings[695] = ItemType.PoisonousPotato; - mappings[696] = ItemType.Map; - mappings[697] = ItemType.GoldenCarrot; - mappings[698] = ItemType.SkeletonSkull; - mappings[699] = ItemType.WitherSkeletonSkull; - mappings[700] = ItemType.PlayerHead; - mappings[701] = ItemType.ZombieHead; - mappings[702] = ItemType.CreeperHead; - mappings[703] = ItemType.DragonHead; - mappings[704] = ItemType.CarrotOnAStick; - mappings[705] = ItemType.NetherStar; - mappings[706] = ItemType.PumpkinPie; - mappings[707] = ItemType.FireworkRocket; - mappings[708] = ItemType.FireworkStar; - mappings[709] = ItemType.EnchantedBook; - mappings[710] = ItemType.NetherBrick; - mappings[711] = ItemType.Quartz; - mappings[712] = ItemType.TntMinecart; - mappings[713] = ItemType.HopperMinecart; - mappings[714] = ItemType.PrismarineShard; - mappings[715] = ItemType.PrismarineCrystals; - mappings[716] = ItemType.Rabbit; - mappings[717] = ItemType.CookedRabbit; - mappings[718] = ItemType.RabbitStew; - mappings[719] = ItemType.RabbitFoot; - mappings[720] = ItemType.RabbitHide; - mappings[721] = ItemType.ArmorStand; - mappings[722] = ItemType.IronHorseArmor; - mappings[723] = ItemType.GoldenHorseArmor; - mappings[724] = ItemType.DiamondHorseArmor; - mappings[725] = ItemType.Lead; - mappings[726] = ItemType.NameTag; - mappings[727] = ItemType.CommandBlockMinecart; - mappings[728] = ItemType.Mutton; - mappings[729] = ItemType.CookedMutton; - mappings[730] = ItemType.WhiteBanner; - mappings[731] = ItemType.OrangeBanner; - mappings[732] = ItemType.MagentaBanner; - mappings[733] = ItemType.LightBlueBanner; - mappings[734] = ItemType.YellowBanner; - mappings[735] = ItemType.LimeBanner; - mappings[736] = ItemType.PinkBanner; - mappings[737] = ItemType.GrayBanner; - mappings[738] = ItemType.LightGrayBanner; - mappings[739] = ItemType.CyanBanner; - mappings[740] = ItemType.PurpleBanner; - mappings[741] = ItemType.BlueBanner; - mappings[742] = ItemType.BrownBanner; - mappings[743] = ItemType.GreenBanner; - mappings[744] = ItemType.RedBanner; - mappings[745] = ItemType.BlackBanner; - mappings[746] = ItemType.EndCrystal; - mappings[747] = ItemType.ChorusFruit; - mappings[748] = ItemType.PoppedChorusFruit; - mappings[749] = ItemType.Beetroot; - mappings[750] = ItemType.BeetrootSeeds; - mappings[751] = ItemType.BeetrootSoup; - mappings[752] = ItemType.DragonBreath; - mappings[753] = ItemType.SplashPotion; - mappings[754] = ItemType.SpectralArrow; - mappings[755] = ItemType.TippedArrow; - mappings[756] = ItemType.LingeringPotion; - mappings[757] = ItemType.Shield; - mappings[758] = ItemType.Elytra; - mappings[759] = ItemType.SpruceBoat; - mappings[760] = ItemType.BirchBoat; - mappings[761] = ItemType.JungleBoat; - mappings[762] = ItemType.AcaciaBoat; - mappings[763] = ItemType.DarkOakBoat; - mappings[764] = ItemType.TotemOfUndying; - mappings[765] = ItemType.ShulkerShell; - mappings[766] = ItemType.IronNugget; - mappings[767] = ItemType.KnowledgeBook; - mappings[768] = ItemType.DebugStick; - mappings[769] = ItemType.MusicDisc13; - mappings[770] = ItemType.MusicDiscCat; - mappings[771] = ItemType.MusicDiscBlocks; - mappings[772] = ItemType.MusicDiscChirp; - mappings[773] = ItemType.MusicDiscFar; - mappings[774] = ItemType.MusicDiscMall; - mappings[775] = ItemType.MusicDiscMellohi; - mappings[776] = ItemType.MusicDiscStal; - mappings[777] = ItemType.MusicDiscStrad; - mappings[778] = ItemType.MusicDiscWard; - mappings[779] = ItemType.MusicDisc11; - mappings[780] = ItemType.MusicDiscWait; - mappings[781] = ItemType.Trident; - mappings[782] = ItemType.PhantomMembrane; - mappings[783] = ItemType.NautilusShell; - mappings[784] = ItemType.HeartOfTheSea; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1132.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette1132.cs deleted file mode 100644 index da38b04199..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1132.cs +++ /dev/null @@ -1,808 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public class ItemPalette1132 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette1132() - { - mappings[0] = ItemType.Air; - mappings[1] = ItemType.Stone; - mappings[2] = ItemType.Granite; - mappings[3] = ItemType.PolishedGranite; - mappings[4] = ItemType.Diorite; - mappings[5] = ItemType.PolishedDiorite; - mappings[6] = ItemType.Andesite; - mappings[7] = ItemType.PolishedAndesite; - mappings[8] = ItemType.GrassBlock; - mappings[9] = ItemType.Dirt; - mappings[10] = ItemType.CoarseDirt; - mappings[11] = ItemType.Podzol; - mappings[12] = ItemType.Cobblestone; - mappings[13] = ItemType.OakPlanks; - mappings[14] = ItemType.SprucePlanks; - mappings[15] = ItemType.BirchPlanks; - mappings[16] = ItemType.JunglePlanks; - mappings[17] = ItemType.AcaciaPlanks; - mappings[18] = ItemType.DarkOakPlanks; - mappings[19] = ItemType.OakSapling; - mappings[20] = ItemType.SpruceSapling; - mappings[21] = ItemType.BirchSapling; - mappings[22] = ItemType.JungleSapling; - mappings[23] = ItemType.AcaciaSapling; - mappings[24] = ItemType.DarkOakSapling; - mappings[25] = ItemType.Bedrock; - mappings[26] = ItemType.Sand; - mappings[27] = ItemType.RedSand; - mappings[28] = ItemType.Gravel; - mappings[29] = ItemType.GoldOre; - mappings[30] = ItemType.IronOre; - mappings[31] = ItemType.CoalOre; - mappings[32] = ItemType.OakLog; - mappings[33] = ItemType.SpruceLog; - mappings[34] = ItemType.BirchLog; - mappings[35] = ItemType.JungleLog; - mappings[36] = ItemType.AcaciaLog; - mappings[37] = ItemType.DarkOakLog; - mappings[38] = ItemType.StrippedOakLog; - mappings[39] = ItemType.StrippedSpruceLog; - mappings[40] = ItemType.StrippedBirchLog; - mappings[41] = ItemType.StrippedJungleLog; - mappings[42] = ItemType.StrippedAcaciaLog; - mappings[43] = ItemType.StrippedDarkOakLog; - mappings[44] = ItemType.StrippedOakWood; - mappings[45] = ItemType.StrippedSpruceWood; - mappings[46] = ItemType.StrippedBirchWood; - mappings[47] = ItemType.StrippedJungleWood; - mappings[48] = ItemType.StrippedAcaciaWood; - mappings[49] = ItemType.StrippedDarkOakWood; - mappings[50] = ItemType.OakWood; - mappings[51] = ItemType.SpruceWood; - mappings[52] = ItemType.BirchWood; - mappings[53] = ItemType.JungleWood; - mappings[54] = ItemType.AcaciaWood; - mappings[55] = ItemType.DarkOakWood; - mappings[56] = ItemType.OakLeaves; - mappings[57] = ItemType.SpruceLeaves; - mappings[58] = ItemType.BirchLeaves; - mappings[59] = ItemType.JungleLeaves; - mappings[60] = ItemType.AcaciaLeaves; - mappings[61] = ItemType.DarkOakLeaves; - mappings[62] = ItemType.Sponge; - mappings[63] = ItemType.WetSponge; - mappings[64] = ItemType.Glass; - mappings[65] = ItemType.LapisOre; - mappings[66] = ItemType.LapisBlock; - mappings[67] = ItemType.Dispenser; - mappings[68] = ItemType.Sandstone; - mappings[69] = ItemType.ChiseledSandstone; - mappings[70] = ItemType.CutSandstone; - mappings[71] = ItemType.NoteBlock; - mappings[72] = ItemType.PoweredRail; - mappings[73] = ItemType.DetectorRail; - mappings[74] = ItemType.StickyPiston; - mappings[75] = ItemType.Cobweb; - mappings[76] = ItemType.ShortGrass; - mappings[77] = ItemType.Fern; - mappings[78] = ItemType.DeadBush; - mappings[79] = ItemType.Seagrass; - mappings[80] = ItemType.SeaPickle; - mappings[81] = ItemType.Piston; - mappings[82] = ItemType.WhiteWool; - mappings[83] = ItemType.OrangeWool; - mappings[84] = ItemType.MagentaWool; - mappings[85] = ItemType.LightBlueWool; - mappings[86] = ItemType.YellowWool; - mappings[87] = ItemType.LimeWool; - mappings[88] = ItemType.PinkWool; - mappings[89] = ItemType.GrayWool; - mappings[90] = ItemType.LightGrayWool; - mappings[91] = ItemType.CyanWool; - mappings[92] = ItemType.PurpleWool; - mappings[93] = ItemType.BlueWool; - mappings[94] = ItemType.BrownWool; - mappings[95] = ItemType.GreenWool; - mappings[96] = ItemType.RedWool; - mappings[97] = ItemType.BlackWool; - mappings[98] = ItemType.Dandelion; - mappings[99] = ItemType.Poppy; - mappings[100] = ItemType.BlueOrchid; - mappings[101] = ItemType.Allium; - mappings[102] = ItemType.AzureBluet; - mappings[103] = ItemType.RedTulip; - mappings[104] = ItemType.OrangeTulip; - mappings[105] = ItemType.WhiteTulip; - mappings[106] = ItemType.PinkTulip; - mappings[107] = ItemType.OxeyeDaisy; - mappings[108] = ItemType.BrownMushroom; - mappings[109] = ItemType.RedMushroom; - mappings[110] = ItemType.GoldBlock; - mappings[111] = ItemType.IronBlock; - mappings[112] = ItemType.OakSlab; - mappings[113] = ItemType.SpruceSlab; - mappings[114] = ItemType.BirchSlab; - mappings[115] = ItemType.JungleSlab; - mappings[116] = ItemType.AcaciaSlab; - mappings[117] = ItemType.DarkOakSlab; - mappings[118] = ItemType.StoneSlab; - mappings[119] = ItemType.SandstoneSlab; - mappings[120] = ItemType.PetrifiedOakSlab; - mappings[121] = ItemType.CobblestoneSlab; - mappings[122] = ItemType.BrickSlab; - mappings[123] = ItemType.StoneBrickSlab; - mappings[124] = ItemType.NetherBrickSlab; - mappings[125] = ItemType.QuartzSlab; - mappings[126] = ItemType.RedSandstoneSlab; - mappings[127] = ItemType.PurpurSlab; - mappings[128] = ItemType.PrismarineSlab; - mappings[129] = ItemType.PrismarineBrickSlab; - mappings[130] = ItemType.DarkPrismarineSlab; - mappings[131] = ItemType.SmoothQuartz; - mappings[132] = ItemType.SmoothRedSandstone; - mappings[133] = ItemType.SmoothSandstone; - mappings[134] = ItemType.SmoothStone; - mappings[135] = ItemType.Bricks; - mappings[136] = ItemType.Tnt; - mappings[137] = ItemType.Bookshelf; - mappings[138] = ItemType.MossyCobblestone; - mappings[139] = ItemType.Obsidian; - mappings[140] = ItemType.Torch; - mappings[141] = ItemType.EndRod; - mappings[142] = ItemType.ChorusPlant; - mappings[143] = ItemType.ChorusFlower; - mappings[144] = ItemType.PurpurBlock; - mappings[145] = ItemType.PurpurPillar; - mappings[146] = ItemType.PurpurStairs; - mappings[147] = ItemType.Spawner; - mappings[148] = ItemType.OakStairs; - mappings[149] = ItemType.Chest; - mappings[150] = ItemType.DiamondOre; - mappings[151] = ItemType.DiamondBlock; - mappings[152] = ItemType.CraftingTable; - mappings[153] = ItemType.Farmland; - mappings[154] = ItemType.Furnace; - mappings[155] = ItemType.Ladder; - mappings[156] = ItemType.Rail; - mappings[157] = ItemType.CobblestoneStairs; - mappings[158] = ItemType.Lever; - mappings[159] = ItemType.StonePressurePlate; - mappings[160] = ItemType.OakPressurePlate; - mappings[161] = ItemType.SprucePressurePlate; - mappings[162] = ItemType.BirchPressurePlate; - mappings[163] = ItemType.JunglePressurePlate; - mappings[164] = ItemType.AcaciaPressurePlate; - mappings[165] = ItemType.DarkOakPressurePlate; - mappings[166] = ItemType.RedstoneOre; - mappings[167] = ItemType.RedstoneTorch; - mappings[168] = ItemType.StoneButton; - mappings[169] = ItemType.Snow; - mappings[170] = ItemType.Ice; - mappings[171] = ItemType.SnowBlock; - mappings[172] = ItemType.Cactus; - mappings[173] = ItemType.Clay; - mappings[174] = ItemType.Jukebox; - mappings[175] = ItemType.OakFence; - mappings[176] = ItemType.SpruceFence; - mappings[177] = ItemType.BirchFence; - mappings[178] = ItemType.JungleFence; - mappings[179] = ItemType.AcaciaFence; - mappings[180] = ItemType.DarkOakFence; - mappings[181] = ItemType.Pumpkin; - mappings[182] = ItemType.CarvedPumpkin; - mappings[183] = ItemType.Netherrack; - mappings[184] = ItemType.SoulSand; - mappings[185] = ItemType.Glowstone; - mappings[186] = ItemType.JackOLantern; - mappings[187] = ItemType.OakTrapdoor; - mappings[188] = ItemType.SpruceTrapdoor; - mappings[189] = ItemType.BirchTrapdoor; - mappings[190] = ItemType.JungleTrapdoor; - mappings[191] = ItemType.AcaciaTrapdoor; - mappings[192] = ItemType.DarkOakTrapdoor; - mappings[193] = ItemType.InfestedStone; - mappings[194] = ItemType.InfestedCobblestone; - mappings[195] = ItemType.InfestedStoneBricks; - mappings[196] = ItemType.InfestedMossyStoneBricks; - mappings[197] = ItemType.InfestedCrackedStoneBricks; - mappings[198] = ItemType.InfestedChiseledStoneBricks; - mappings[199] = ItemType.StoneBricks; - mappings[200] = ItemType.MossyStoneBricks; - mappings[201] = ItemType.CrackedStoneBricks; - mappings[202] = ItemType.ChiseledStoneBricks; - mappings[203] = ItemType.BrownMushroomBlock; - mappings[204] = ItemType.RedMushroomBlock; - mappings[205] = ItemType.MushroomStem; - mappings[206] = ItemType.IronBars; - mappings[207] = ItemType.GlassPane; - mappings[208] = ItemType.Melon; - mappings[209] = ItemType.Vine; - mappings[210] = ItemType.OakFenceGate; - mappings[211] = ItemType.SpruceFenceGate; - mappings[212] = ItemType.BirchFenceGate; - mappings[213] = ItemType.JungleFenceGate; - mappings[214] = ItemType.AcaciaFenceGate; - mappings[215] = ItemType.DarkOakFenceGate; - mappings[216] = ItemType.BrickStairs; - mappings[217] = ItemType.StoneBrickStairs; - mappings[218] = ItemType.Mycelium; - mappings[219] = ItemType.LilyPad; - mappings[220] = ItemType.NetherBricks; - mappings[221] = ItemType.NetherBrickFence; - mappings[222] = ItemType.NetherBrickStairs; - mappings[223] = ItemType.EnchantingTable; - mappings[224] = ItemType.EndPortalFrame; - mappings[225] = ItemType.EndStone; - mappings[226] = ItemType.EndStoneBricks; - mappings[227] = ItemType.DragonEgg; - mappings[228] = ItemType.RedstoneLamp; - mappings[229] = ItemType.SandstoneStairs; - mappings[230] = ItemType.EmeraldOre; - mappings[231] = ItemType.EnderChest; - mappings[232] = ItemType.TripwireHook; - mappings[233] = ItemType.EmeraldBlock; - mappings[234] = ItemType.SpruceStairs; - mappings[235] = ItemType.BirchStairs; - mappings[236] = ItemType.JungleStairs; - mappings[237] = ItemType.CommandBlock; - mappings[238] = ItemType.Beacon; - mappings[239] = ItemType.CobblestoneWall; - mappings[240] = ItemType.MossyCobblestoneWall; - mappings[241] = ItemType.OakButton; - mappings[242] = ItemType.SpruceButton; - mappings[243] = ItemType.BirchButton; - mappings[244] = ItemType.JungleButton; - mappings[245] = ItemType.AcaciaButton; - mappings[246] = ItemType.DarkOakButton; - mappings[247] = ItemType.Anvil; - mappings[248] = ItemType.ChippedAnvil; - mappings[249] = ItemType.DamagedAnvil; - mappings[250] = ItemType.TrappedChest; - mappings[251] = ItemType.LightWeightedPressurePlate; - mappings[252] = ItemType.HeavyWeightedPressurePlate; - mappings[253] = ItemType.DaylightDetector; - mappings[254] = ItemType.RedstoneBlock; - mappings[255] = ItemType.NetherQuartzOre; - mappings[256] = ItemType.Hopper; - mappings[257] = ItemType.ChiseledQuartzBlock; - mappings[258] = ItemType.QuartzBlock; - mappings[259] = ItemType.QuartzPillar; - mappings[260] = ItemType.QuartzStairs; - mappings[261] = ItemType.ActivatorRail; - mappings[262] = ItemType.Dropper; - mappings[263] = ItemType.WhiteTerracotta; - mappings[264] = ItemType.OrangeTerracotta; - mappings[265] = ItemType.MagentaTerracotta; - mappings[266] = ItemType.LightBlueTerracotta; - mappings[267] = ItemType.YellowTerracotta; - mappings[268] = ItemType.LimeTerracotta; - mappings[269] = ItemType.PinkTerracotta; - mappings[270] = ItemType.GrayTerracotta; - mappings[271] = ItemType.LightGrayTerracotta; - mappings[272] = ItemType.CyanTerracotta; - mappings[273] = ItemType.PurpleTerracotta; - mappings[274] = ItemType.BlueTerracotta; - mappings[275] = ItemType.BrownTerracotta; - mappings[276] = ItemType.GreenTerracotta; - mappings[277] = ItemType.RedTerracotta; - mappings[278] = ItemType.BlackTerracotta; - mappings[279] = ItemType.Barrier; - mappings[280] = ItemType.IronTrapdoor; - mappings[281] = ItemType.HayBlock; - mappings[282] = ItemType.WhiteCarpet; - mappings[283] = ItemType.OrangeCarpet; - mappings[284] = ItemType.MagentaCarpet; - mappings[285] = ItemType.LightBlueCarpet; - mappings[286] = ItemType.YellowCarpet; - mappings[287] = ItemType.LimeCarpet; - mappings[288] = ItemType.PinkCarpet; - mappings[289] = ItemType.GrayCarpet; - mappings[290] = ItemType.LightGrayCarpet; - mappings[291] = ItemType.CyanCarpet; - mappings[292] = ItemType.PurpleCarpet; - mappings[293] = ItemType.BlueCarpet; - mappings[294] = ItemType.BrownCarpet; - mappings[295] = ItemType.GreenCarpet; - mappings[296] = ItemType.RedCarpet; - mappings[297] = ItemType.BlackCarpet; - mappings[298] = ItemType.Terracotta; - mappings[299] = ItemType.CoalBlock; - mappings[300] = ItemType.PackedIce; - mappings[301] = ItemType.AcaciaStairs; - mappings[302] = ItemType.DarkOakStairs; - mappings[303] = ItemType.SlimeBlock; - mappings[304] = ItemType.DirtPath; - mappings[305] = ItemType.Sunflower; - mappings[306] = ItemType.Lilac; - mappings[307] = ItemType.RoseBush; - mappings[308] = ItemType.Peony; - mappings[309] = ItemType.TallGrass; - mappings[310] = ItemType.LargeFern; - mappings[311] = ItemType.WhiteStainedGlass; - mappings[312] = ItemType.OrangeStainedGlass; - mappings[313] = ItemType.MagentaStainedGlass; - mappings[314] = ItemType.LightBlueStainedGlass; - mappings[315] = ItemType.YellowStainedGlass; - mappings[316] = ItemType.LimeStainedGlass; - mappings[317] = ItemType.PinkStainedGlass; - mappings[318] = ItemType.GrayStainedGlass; - mappings[319] = ItemType.LightGrayStainedGlass; - mappings[320] = ItemType.CyanStainedGlass; - mappings[321] = ItemType.PurpleStainedGlass; - mappings[322] = ItemType.BlueStainedGlass; - mappings[323] = ItemType.BrownStainedGlass; - mappings[324] = ItemType.GreenStainedGlass; - mappings[325] = ItemType.RedStainedGlass; - mappings[326] = ItemType.BlackStainedGlass; - mappings[327] = ItemType.WhiteStainedGlassPane; - mappings[328] = ItemType.OrangeStainedGlassPane; - mappings[329] = ItemType.MagentaStainedGlassPane; - mappings[330] = ItemType.LightBlueStainedGlassPane; - mappings[331] = ItemType.YellowStainedGlassPane; - mappings[332] = ItemType.LimeStainedGlassPane; - mappings[333] = ItemType.PinkStainedGlassPane; - mappings[334] = ItemType.GrayStainedGlassPane; - mappings[335] = ItemType.LightGrayStainedGlassPane; - mappings[336] = ItemType.CyanStainedGlassPane; - mappings[337] = ItemType.PurpleStainedGlassPane; - mappings[338] = ItemType.BlueStainedGlassPane; - mappings[339] = ItemType.BrownStainedGlassPane; - mappings[340] = ItemType.GreenStainedGlassPane; - mappings[341] = ItemType.RedStainedGlassPane; - mappings[342] = ItemType.BlackStainedGlassPane; - mappings[343] = ItemType.Prismarine; - mappings[344] = ItemType.PrismarineBricks; - mappings[345] = ItemType.DarkPrismarine; - mappings[346] = ItemType.PrismarineStairs; - mappings[347] = ItemType.PrismarineBrickStairs; - mappings[348] = ItemType.DarkPrismarineStairs; - mappings[349] = ItemType.SeaLantern; - mappings[350] = ItemType.RedSandstone; - mappings[351] = ItemType.ChiseledRedSandstone; - mappings[352] = ItemType.CutRedSandstone; - mappings[353] = ItemType.RedSandstoneStairs; - mappings[354] = ItemType.RepeatingCommandBlock; - mappings[355] = ItemType.ChainCommandBlock; - mappings[356] = ItemType.MagmaBlock; - mappings[357] = ItemType.NetherWartBlock; - mappings[358] = ItemType.RedNetherBricks; - mappings[359] = ItemType.BoneBlock; - mappings[360] = ItemType.StructureVoid; - mappings[361] = ItemType.Observer; - mappings[362] = ItemType.ShulkerBox; - mappings[363] = ItemType.WhiteShulkerBox; - mappings[364] = ItemType.OrangeShulkerBox; - mappings[365] = ItemType.MagentaShulkerBox; - mappings[366] = ItemType.LightBlueShulkerBox; - mappings[367] = ItemType.YellowShulkerBox; - mappings[368] = ItemType.LimeShulkerBox; - mappings[369] = ItemType.PinkShulkerBox; - mappings[370] = ItemType.GrayShulkerBox; - mappings[371] = ItemType.LightGrayShulkerBox; - mappings[372] = ItemType.CyanShulkerBox; - mappings[373] = ItemType.PurpleShulkerBox; - mappings[374] = ItemType.BlueShulkerBox; - mappings[375] = ItemType.BrownShulkerBox; - mappings[376] = ItemType.GreenShulkerBox; - mappings[377] = ItemType.RedShulkerBox; - mappings[378] = ItemType.BlackShulkerBox; - mappings[379] = ItemType.WhiteGlazedTerracotta; - mappings[380] = ItemType.OrangeGlazedTerracotta; - mappings[381] = ItemType.MagentaGlazedTerracotta; - mappings[382] = ItemType.LightBlueGlazedTerracotta; - mappings[383] = ItemType.YellowGlazedTerracotta; - mappings[384] = ItemType.LimeGlazedTerracotta; - mappings[385] = ItemType.PinkGlazedTerracotta; - mappings[386] = ItemType.GrayGlazedTerracotta; - mappings[387] = ItemType.LightGrayGlazedTerracotta; - mappings[388] = ItemType.CyanGlazedTerracotta; - mappings[389] = ItemType.PurpleGlazedTerracotta; - mappings[390] = ItemType.BlueGlazedTerracotta; - mappings[391] = ItemType.BrownGlazedTerracotta; - mappings[392] = ItemType.GreenGlazedTerracotta; - mappings[393] = ItemType.RedGlazedTerracotta; - mappings[394] = ItemType.BlackGlazedTerracotta; - mappings[395] = ItemType.WhiteConcrete; - mappings[396] = ItemType.OrangeConcrete; - mappings[397] = ItemType.MagentaConcrete; - mappings[398] = ItemType.LightBlueConcrete; - mappings[399] = ItemType.YellowConcrete; - mappings[400] = ItemType.LimeConcrete; - mappings[401] = ItemType.PinkConcrete; - mappings[402] = ItemType.GrayConcrete; - mappings[403] = ItemType.LightGrayConcrete; - mappings[404] = ItemType.CyanConcrete; - mappings[405] = ItemType.PurpleConcrete; - mappings[406] = ItemType.BlueConcrete; - mappings[407] = ItemType.BrownConcrete; - mappings[408] = ItemType.GreenConcrete; - mappings[409] = ItemType.RedConcrete; - mappings[410] = ItemType.BlackConcrete; - mappings[411] = ItemType.WhiteConcretePowder; - mappings[412] = ItemType.OrangeConcretePowder; - mappings[413] = ItemType.MagentaConcretePowder; - mappings[414] = ItemType.LightBlueConcretePowder; - mappings[415] = ItemType.YellowConcretePowder; - mappings[416] = ItemType.LimeConcretePowder; - mappings[417] = ItemType.PinkConcretePowder; - mappings[418] = ItemType.GrayConcretePowder; - mappings[419] = ItemType.LightGrayConcretePowder; - mappings[420] = ItemType.CyanConcretePowder; - mappings[421] = ItemType.PurpleConcretePowder; - mappings[422] = ItemType.BlueConcretePowder; - mappings[423] = ItemType.BrownConcretePowder; - mappings[424] = ItemType.GreenConcretePowder; - mappings[425] = ItemType.RedConcretePowder; - mappings[426] = ItemType.BlackConcretePowder; - mappings[427] = ItemType.TurtleEgg; - mappings[428] = ItemType.DeadTubeCoralBlock; - mappings[429] = ItemType.DeadBrainCoralBlock; - mappings[430] = ItemType.DeadBubbleCoralBlock; - mappings[431] = ItemType.DeadFireCoralBlock; - mappings[432] = ItemType.DeadHornCoralBlock; - mappings[433] = ItemType.TubeCoralBlock; - mappings[434] = ItemType.BrainCoralBlock; - mappings[435] = ItemType.BubbleCoralBlock; - mappings[436] = ItemType.FireCoralBlock; - mappings[437] = ItemType.HornCoralBlock; - mappings[438] = ItemType.TubeCoral; - mappings[439] = ItemType.BrainCoral; - mappings[440] = ItemType.BubbleCoral; - mappings[441] = ItemType.FireCoral; - mappings[442] = ItemType.HornCoral; - mappings[443] = ItemType.DeadBrainCoral; - mappings[444] = ItemType.DeadBubbleCoral; - mappings[445] = ItemType.DeadFireCoral; - mappings[446] = ItemType.DeadHornCoral; - mappings[447] = ItemType.DeadTubeCoral; - mappings[448] = ItemType.TubeCoralFan; - mappings[449] = ItemType.BrainCoralFan; - mappings[450] = ItemType.BubbleCoralFan; - mappings[451] = ItemType.FireCoralFan; - mappings[452] = ItemType.HornCoralFan; - mappings[453] = ItemType.DeadTubeCoralFan; - mappings[454] = ItemType.DeadBrainCoralFan; - mappings[455] = ItemType.DeadBubbleCoralFan; - mappings[456] = ItemType.DeadFireCoralFan; - mappings[457] = ItemType.DeadHornCoralFan; - mappings[458] = ItemType.BlueIce; - mappings[459] = ItemType.Conduit; - mappings[460] = ItemType.IronDoor; - mappings[461] = ItemType.OakDoor; - mappings[462] = ItemType.SpruceDoor; - mappings[463] = ItemType.BirchDoor; - mappings[464] = ItemType.JungleDoor; - mappings[465] = ItemType.AcaciaDoor; - mappings[466] = ItemType.DarkOakDoor; - mappings[467] = ItemType.Repeater; - mappings[468] = ItemType.Comparator; - mappings[469] = ItemType.StructureBlock; - mappings[470] = ItemType.TurtleHelmet; - mappings[471] = ItemType.TurtleScute; - mappings[472] = ItemType.IronShovel; - mappings[473] = ItemType.IronPickaxe; - mappings[474] = ItemType.IronAxe; - mappings[475] = ItemType.FlintAndSteel; - mappings[476] = ItemType.Apple; - mappings[477] = ItemType.Bow; - mappings[478] = ItemType.Arrow; - mappings[479] = ItemType.Coal; - mappings[480] = ItemType.Charcoal; - mappings[481] = ItemType.Diamond; - mappings[482] = ItemType.IronIngot; - mappings[483] = ItemType.GoldIngot; - mappings[484] = ItemType.IronSword; - mappings[485] = ItemType.WoodenSword; - mappings[486] = ItemType.WoodenShovel; - mappings[487] = ItemType.WoodenPickaxe; - mappings[488] = ItemType.WoodenAxe; - mappings[489] = ItemType.StoneSword; - mappings[490] = ItemType.StoneShovel; - mappings[491] = ItemType.StonePickaxe; - mappings[492] = ItemType.StoneAxe; - mappings[493] = ItemType.DiamondSword; - mappings[494] = ItemType.DiamondShovel; - mappings[495] = ItemType.DiamondPickaxe; - mappings[496] = ItemType.DiamondAxe; - mappings[497] = ItemType.Stick; - mappings[498] = ItemType.Bowl; - mappings[499] = ItemType.MushroomStew; - mappings[500] = ItemType.GoldenSword; - mappings[501] = ItemType.GoldenShovel; - mappings[502] = ItemType.GoldenPickaxe; - mappings[503] = ItemType.GoldenAxe; - mappings[504] = ItemType.String; - mappings[505] = ItemType.Feather; - mappings[506] = ItemType.Gunpowder; - mappings[507] = ItemType.WoodenHoe; - mappings[508] = ItemType.StoneHoe; - mappings[509] = ItemType.IronHoe; - mappings[510] = ItemType.DiamondHoe; - mappings[511] = ItemType.GoldenHoe; - mappings[512] = ItemType.WheatSeeds; - mappings[513] = ItemType.Wheat; - mappings[514] = ItemType.Bread; - mappings[515] = ItemType.LeatherHelmet; - mappings[516] = ItemType.LeatherChestplate; - mappings[517] = ItemType.LeatherLeggings; - mappings[518] = ItemType.LeatherBoots; - mappings[519] = ItemType.ChainmailHelmet; - mappings[520] = ItemType.ChainmailChestplate; - mappings[521] = ItemType.ChainmailLeggings; - mappings[522] = ItemType.ChainmailBoots; - mappings[523] = ItemType.IronHelmet; - mappings[524] = ItemType.IronChestplate; - mappings[525] = ItemType.IronLeggings; - mappings[526] = ItemType.IronBoots; - mappings[527] = ItemType.DiamondHelmet; - mappings[528] = ItemType.DiamondChestplate; - mappings[529] = ItemType.DiamondLeggings; - mappings[530] = ItemType.DiamondBoots; - mappings[531] = ItemType.GoldenHelmet; - mappings[532] = ItemType.GoldenChestplate; - mappings[533] = ItemType.GoldenLeggings; - mappings[534] = ItemType.GoldenBoots; - mappings[535] = ItemType.Flint; - mappings[536] = ItemType.Porkchop; - mappings[537] = ItemType.CookedPorkchop; - mappings[538] = ItemType.Painting; - mappings[539] = ItemType.GoldenApple; - mappings[540] = ItemType.EnchantedGoldenApple; - mappings[541] = ItemType.OakSign; - mappings[542] = ItemType.Bucket; - mappings[543] = ItemType.WaterBucket; - mappings[544] = ItemType.LavaBucket; - mappings[545] = ItemType.Minecart; - mappings[546] = ItemType.Saddle; - mappings[547] = ItemType.Redstone; - mappings[548] = ItemType.Snowball; - mappings[549] = ItemType.OakBoat; - mappings[550] = ItemType.Leather; - mappings[551] = ItemType.MilkBucket; - mappings[552] = ItemType.PufferfishBucket; - mappings[553] = ItemType.SalmonBucket; - mappings[554] = ItemType.CodBucket; - mappings[555] = ItemType.TropicalFishBucket; - mappings[556] = ItemType.Brick; - mappings[557] = ItemType.ClayBall; - mappings[558] = ItemType.SugarCane; - mappings[559] = ItemType.Kelp; - mappings[560] = ItemType.DriedKelpBlock; - mappings[561] = ItemType.Paper; - mappings[562] = ItemType.Book; - mappings[563] = ItemType.SlimeBall; - mappings[564] = ItemType.ChestMinecart; - mappings[565] = ItemType.FurnaceMinecart; - mappings[566] = ItemType.Egg; - mappings[567] = ItemType.Compass; - mappings[568] = ItemType.FishingRod; - mappings[569] = ItemType.Clock; - mappings[570] = ItemType.GlowstoneDust; - mappings[571] = ItemType.Cod; - mappings[572] = ItemType.Salmon; - mappings[573] = ItemType.TropicalFish; - mappings[574] = ItemType.Pufferfish; - mappings[575] = ItemType.CookedCod; - mappings[576] = ItemType.CookedSalmon; - mappings[577] = ItemType.InkSac; - mappings[578] = ItemType.RedDye; - mappings[579] = ItemType.GreenDye; - mappings[580] = ItemType.CocoaBeans; - mappings[581] = ItemType.LapisLazuli; - mappings[582] = ItemType.PurpleDye; - mappings[583] = ItemType.CyanDye; - mappings[584] = ItemType.LightGrayDye; - mappings[585] = ItemType.GrayDye; - mappings[586] = ItemType.PinkDye; - mappings[587] = ItemType.LimeDye; - mappings[588] = ItemType.YellowDye; - mappings[589] = ItemType.LightBlueDye; - mappings[590] = ItemType.MagentaDye; - mappings[591] = ItemType.OrangeDye; - mappings[592] = ItemType.BoneMeal; - mappings[593] = ItemType.Bone; - mappings[594] = ItemType.Sugar; - mappings[595] = ItemType.Cake; - mappings[596] = ItemType.WhiteBed; - mappings[597] = ItemType.OrangeBed; - mappings[598] = ItemType.MagentaBed; - mappings[599] = ItemType.LightBlueBed; - mappings[600] = ItemType.YellowBed; - mappings[601] = ItemType.LimeBed; - mappings[602] = ItemType.PinkBed; - mappings[603] = ItemType.GrayBed; - mappings[604] = ItemType.LightGrayBed; - mappings[605] = ItemType.CyanBed; - mappings[606] = ItemType.PurpleBed; - mappings[607] = ItemType.BlueBed; - mappings[608] = ItemType.BrownBed; - mappings[609] = ItemType.GreenBed; - mappings[610] = ItemType.RedBed; - mappings[611] = ItemType.BlackBed; - mappings[612] = ItemType.Cookie; - mappings[613] = ItemType.FilledMap; - mappings[614] = ItemType.Shears; - mappings[615] = ItemType.MelonSlice; - mappings[616] = ItemType.DriedKelp; - mappings[617] = ItemType.PumpkinSeeds; - mappings[618] = ItemType.MelonSeeds; - mappings[619] = ItemType.Beef; - mappings[620] = ItemType.CookedBeef; - mappings[621] = ItemType.Chicken; - mappings[622] = ItemType.CookedChicken; - mappings[623] = ItemType.RottenFlesh; - mappings[624] = ItemType.EnderPearl; - mappings[625] = ItemType.BlazeRod; - mappings[626] = ItemType.GhastTear; - mappings[627] = ItemType.GoldNugget; - mappings[628] = ItemType.NetherWart; - mappings[629] = ItemType.Potion; - mappings[630] = ItemType.GlassBottle; - mappings[631] = ItemType.SpiderEye; - mappings[632] = ItemType.FermentedSpiderEye; - mappings[633] = ItemType.BlazePowder; - mappings[634] = ItemType.MagmaCream; - mappings[635] = ItemType.BrewingStand; - mappings[636] = ItemType.Cauldron; - mappings[637] = ItemType.EnderEye; - mappings[638] = ItemType.GlisteringMelonSlice; - mappings[639] = ItemType.BatSpawnEgg; - mappings[640] = ItemType.BlazeSpawnEgg; - mappings[641] = ItemType.CaveSpiderSpawnEgg; - mappings[642] = ItemType.ChickenSpawnEgg; - mappings[643] = ItemType.CodSpawnEgg; - mappings[644] = ItemType.CowSpawnEgg; - mappings[645] = ItemType.CreeperSpawnEgg; - mappings[646] = ItemType.DolphinSpawnEgg; - mappings[647] = ItemType.DonkeySpawnEgg; - mappings[648] = ItemType.DrownedSpawnEgg; - mappings[649] = ItemType.ElderGuardianSpawnEgg; - mappings[650] = ItemType.EndermanSpawnEgg; - mappings[651] = ItemType.EndermiteSpawnEgg; - mappings[652] = ItemType.EvokerSpawnEgg; - mappings[653] = ItemType.GhastSpawnEgg; - mappings[654] = ItemType.GuardianSpawnEgg; - mappings[655] = ItemType.HorseSpawnEgg; - mappings[656] = ItemType.HuskSpawnEgg; - mappings[657] = ItemType.LlamaSpawnEgg; - mappings[658] = ItemType.MagmaCubeSpawnEgg; - mappings[659] = ItemType.MooshroomSpawnEgg; - mappings[660] = ItemType.MuleSpawnEgg; - mappings[661] = ItemType.OcelotSpawnEgg; - mappings[662] = ItemType.ParrotSpawnEgg; - mappings[663] = ItemType.PhantomSpawnEgg; - mappings[664] = ItemType.PigSpawnEgg; - mappings[665] = ItemType.PolarBearSpawnEgg; - mappings[666] = ItemType.PufferfishSpawnEgg; - mappings[667] = ItemType.RabbitSpawnEgg; - mappings[668] = ItemType.SalmonSpawnEgg; - mappings[669] = ItemType.SheepSpawnEgg; - mappings[670] = ItemType.ShulkerSpawnEgg; - mappings[671] = ItemType.SilverfishSpawnEgg; - mappings[672] = ItemType.SkeletonSpawnEgg; - mappings[673] = ItemType.SkeletonHorseSpawnEgg; - mappings[674] = ItemType.SlimeSpawnEgg; - mappings[675] = ItemType.SpiderSpawnEgg; - mappings[676] = ItemType.SquidSpawnEgg; - mappings[677] = ItemType.StraySpawnEgg; - mappings[678] = ItemType.TropicalFishSpawnEgg; - mappings[679] = ItemType.TurtleSpawnEgg; - mappings[680] = ItemType.VexSpawnEgg; - mappings[681] = ItemType.VillagerSpawnEgg; - mappings[682] = ItemType.VindicatorSpawnEgg; - mappings[683] = ItemType.WitchSpawnEgg; - mappings[684] = ItemType.WitherSkeletonSpawnEgg; - mappings[685] = ItemType.WolfSpawnEgg; - mappings[686] = ItemType.ZombieSpawnEgg; - mappings[687] = ItemType.ZombieHorseSpawnEgg; - mappings[688] = ItemType.ZombifiedPiglinSpawnEgg; - mappings[689] = ItemType.ZombieVillagerSpawnEgg; - mappings[690] = ItemType.ExperienceBottle; - mappings[691] = ItemType.FireCharge; - mappings[692] = ItemType.WritableBook; - mappings[693] = ItemType.WrittenBook; - mappings[694] = ItemType.Emerald; - mappings[695] = ItemType.ItemFrame; - mappings[696] = ItemType.FlowerPot; - mappings[697] = ItemType.Carrot; - mappings[698] = ItemType.Potato; - mappings[699] = ItemType.BakedPotato; - mappings[700] = ItemType.PoisonousPotato; - mappings[701] = ItemType.Map; - mappings[702] = ItemType.GoldenCarrot; - mappings[703] = ItemType.SkeletonSkull; - mappings[704] = ItemType.WitherSkeletonSkull; - mappings[705] = ItemType.PlayerHead; - mappings[706] = ItemType.ZombieHead; - mappings[707] = ItemType.CreeperHead; - mappings[708] = ItemType.DragonHead; - mappings[709] = ItemType.CarrotOnAStick; - mappings[710] = ItemType.NetherStar; - mappings[711] = ItemType.PumpkinPie; - mappings[712] = ItemType.FireworkRocket; - mappings[713] = ItemType.FireworkStar; - mappings[714] = ItemType.EnchantedBook; - mappings[715] = ItemType.NetherBrick; - mappings[716] = ItemType.Quartz; - mappings[717] = ItemType.TntMinecart; - mappings[718] = ItemType.HopperMinecart; - mappings[719] = ItemType.PrismarineShard; - mappings[720] = ItemType.PrismarineCrystals; - mappings[721] = ItemType.Rabbit; - mappings[722] = ItemType.CookedRabbit; - mappings[723] = ItemType.RabbitStew; - mappings[724] = ItemType.RabbitFoot; - mappings[725] = ItemType.RabbitHide; - mappings[726] = ItemType.ArmorStand; - mappings[727] = ItemType.IronHorseArmor; - mappings[728] = ItemType.GoldenHorseArmor; - mappings[729] = ItemType.DiamondHorseArmor; - mappings[730] = ItemType.Lead; - mappings[731] = ItemType.NameTag; - mappings[732] = ItemType.CommandBlockMinecart; - mappings[733] = ItemType.Mutton; - mappings[734] = ItemType.CookedMutton; - mappings[735] = ItemType.WhiteBanner; - mappings[736] = ItemType.OrangeBanner; - mappings[737] = ItemType.MagentaBanner; - mappings[738] = ItemType.LightBlueBanner; - mappings[739] = ItemType.YellowBanner; - mappings[740] = ItemType.LimeBanner; - mappings[741] = ItemType.PinkBanner; - mappings[742] = ItemType.GrayBanner; - mappings[743] = ItemType.LightGrayBanner; - mappings[744] = ItemType.CyanBanner; - mappings[745] = ItemType.PurpleBanner; - mappings[746] = ItemType.BlueBanner; - mappings[747] = ItemType.BrownBanner; - mappings[748] = ItemType.GreenBanner; - mappings[749] = ItemType.RedBanner; - mappings[750] = ItemType.BlackBanner; - mappings[751] = ItemType.EndCrystal; - mappings[752] = ItemType.ChorusFruit; - mappings[753] = ItemType.PoppedChorusFruit; - mappings[754] = ItemType.Beetroot; - mappings[755] = ItemType.BeetrootSeeds; - mappings[756] = ItemType.BeetrootSoup; - mappings[757] = ItemType.DragonBreath; - mappings[758] = ItemType.SplashPotion; - mappings[759] = ItemType.SpectralArrow; - mappings[760] = ItemType.TippedArrow; - mappings[761] = ItemType.LingeringPotion; - mappings[762] = ItemType.Shield; - mappings[763] = ItemType.Elytra; - mappings[764] = ItemType.SpruceBoat; - mappings[765] = ItemType.BirchBoat; - mappings[766] = ItemType.JungleBoat; - mappings[767] = ItemType.AcaciaBoat; - mappings[768] = ItemType.DarkOakBoat; - mappings[769] = ItemType.TotemOfUndying; - mappings[770] = ItemType.ShulkerShell; - mappings[771] = ItemType.IronNugget; - mappings[772] = ItemType.KnowledgeBook; - mappings[773] = ItemType.DebugStick; - mappings[774] = ItemType.MusicDisc13; - mappings[775] = ItemType.MusicDiscCat; - mappings[776] = ItemType.MusicDiscBlocks; - mappings[777] = ItemType.MusicDiscChirp; - mappings[778] = ItemType.MusicDiscFar; - mappings[779] = ItemType.MusicDiscMall; - mappings[780] = ItemType.MusicDiscMellohi; - mappings[781] = ItemType.MusicDiscStal; - mappings[782] = ItemType.MusicDiscStrad; - mappings[783] = ItemType.MusicDiscWard; - mappings[784] = ItemType.MusicDisc11; - mappings[785] = ItemType.MusicDiscWait; - mappings[786] = ItemType.Trident; - mappings[787] = ItemType.PhantomMembrane; - mappings[788] = ItemType.NautilusShell; - mappings[789] = ItemType.HeartOfTheSea; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette114.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette114.cs deleted file mode 100644 index c84079dad6..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette114.cs +++ /dev/null @@ -1,895 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public class ItemPalette114 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette114() - { - mappings[0] = ItemType.Air; - mappings[1] = ItemType.Stone; - mappings[2] = ItemType.Granite; - mappings[3] = ItemType.PolishedGranite; - mappings[4] = ItemType.Diorite; - mappings[5] = ItemType.PolishedDiorite; - mappings[6] = ItemType.Andesite; - mappings[7] = ItemType.PolishedAndesite; - mappings[8] = ItemType.GrassBlock; - mappings[9] = ItemType.Dirt; - mappings[10] = ItemType.CoarseDirt; - mappings[11] = ItemType.Podzol; - mappings[12] = ItemType.Cobblestone; - mappings[13] = ItemType.OakPlanks; - mappings[14] = ItemType.SprucePlanks; - mappings[15] = ItemType.BirchPlanks; - mappings[16] = ItemType.JunglePlanks; - mappings[17] = ItemType.AcaciaPlanks; - mappings[18] = ItemType.DarkOakPlanks; - mappings[19] = ItemType.OakSapling; - mappings[20] = ItemType.SpruceSapling; - mappings[21] = ItemType.BirchSapling; - mappings[22] = ItemType.JungleSapling; - mappings[23] = ItemType.AcaciaSapling; - mappings[24] = ItemType.DarkOakSapling; - mappings[25] = ItemType.Bedrock; - mappings[26] = ItemType.Sand; - mappings[27] = ItemType.RedSand; - mappings[28] = ItemType.Gravel; - mappings[29] = ItemType.GoldOre; - mappings[30] = ItemType.IronOre; - mappings[31] = ItemType.CoalOre; - mappings[32] = ItemType.OakLog; - mappings[33] = ItemType.SpruceLog; - mappings[34] = ItemType.BirchLog; - mappings[35] = ItemType.JungleLog; - mappings[36] = ItemType.AcaciaLog; - mappings[37] = ItemType.DarkOakLog; - mappings[38] = ItemType.StrippedOakLog; - mappings[39] = ItemType.StrippedSpruceLog; - mappings[40] = ItemType.StrippedBirchLog; - mappings[41] = ItemType.StrippedJungleLog; - mappings[42] = ItemType.StrippedAcaciaLog; - mappings[43] = ItemType.StrippedDarkOakLog; - mappings[44] = ItemType.StrippedOakWood; - mappings[45] = ItemType.StrippedSpruceWood; - mappings[46] = ItemType.StrippedBirchWood; - mappings[47] = ItemType.StrippedJungleWood; - mappings[48] = ItemType.StrippedAcaciaWood; - mappings[49] = ItemType.StrippedDarkOakWood; - mappings[50] = ItemType.OakWood; - mappings[51] = ItemType.SpruceWood; - mappings[52] = ItemType.BirchWood; - mappings[53] = ItemType.JungleWood; - mappings[54] = ItemType.AcaciaWood; - mappings[55] = ItemType.DarkOakWood; - mappings[56] = ItemType.OakLeaves; - mappings[57] = ItemType.SpruceLeaves; - mappings[58] = ItemType.BirchLeaves; - mappings[59] = ItemType.JungleLeaves; - mappings[60] = ItemType.AcaciaLeaves; - mappings[61] = ItemType.DarkOakLeaves; - mappings[62] = ItemType.Sponge; - mappings[63] = ItemType.WetSponge; - mappings[64] = ItemType.Glass; - mappings[65] = ItemType.LapisOre; - mappings[66] = ItemType.LapisBlock; - mappings[67] = ItemType.Dispenser; - mappings[68] = ItemType.Sandstone; - mappings[69] = ItemType.ChiseledSandstone; - mappings[70] = ItemType.CutSandstone; - mappings[71] = ItemType.NoteBlock; - mappings[72] = ItemType.PoweredRail; - mappings[73] = ItemType.DetectorRail; - mappings[74] = ItemType.StickyPiston; - mappings[75] = ItemType.Cobweb; - mappings[76] = ItemType.ShortGrass; - mappings[77] = ItemType.Fern; - mappings[78] = ItemType.DeadBush; - mappings[79] = ItemType.Seagrass; - mappings[80] = ItemType.SeaPickle; - mappings[81] = ItemType.Piston; - mappings[82] = ItemType.WhiteWool; - mappings[83] = ItemType.OrangeWool; - mappings[84] = ItemType.MagentaWool; - mappings[85] = ItemType.LightBlueWool; - mappings[86] = ItemType.YellowWool; - mappings[87] = ItemType.LimeWool; - mappings[88] = ItemType.PinkWool; - mappings[89] = ItemType.GrayWool; - mappings[90] = ItemType.LightGrayWool; - mappings[91] = ItemType.CyanWool; - mappings[92] = ItemType.PurpleWool; - mappings[93] = ItemType.BlueWool; - mappings[94] = ItemType.BrownWool; - mappings[95] = ItemType.GreenWool; - mappings[96] = ItemType.RedWool; - mappings[97] = ItemType.BlackWool; - mappings[98] = ItemType.Dandelion; - mappings[99] = ItemType.Poppy; - mappings[100] = ItemType.BlueOrchid; - mappings[101] = ItemType.Allium; - mappings[102] = ItemType.AzureBluet; - mappings[103] = ItemType.RedTulip; - mappings[104] = ItemType.OrangeTulip; - mappings[105] = ItemType.WhiteTulip; - mappings[106] = ItemType.PinkTulip; - mappings[107] = ItemType.OxeyeDaisy; - mappings[108] = ItemType.Cornflower; - mappings[109] = ItemType.LilyOfTheValley; - mappings[110] = ItemType.WitherRose; - mappings[111] = ItemType.BrownMushroom; - mappings[112] = ItemType.RedMushroom; - mappings[113] = ItemType.GoldBlock; - mappings[114] = ItemType.IronBlock; - mappings[115] = ItemType.OakSlab; - mappings[116] = ItemType.SpruceSlab; - mappings[117] = ItemType.BirchSlab; - mappings[118] = ItemType.JungleSlab; - mappings[119] = ItemType.AcaciaSlab; - mappings[120] = ItemType.DarkOakSlab; - mappings[121] = ItemType.StoneSlab; - mappings[122] = ItemType.SmoothStoneSlab; - mappings[123] = ItemType.SandstoneSlab; - mappings[124] = ItemType.CutSandstoneSlab; - mappings[125] = ItemType.PetrifiedOakSlab; - mappings[126] = ItemType.CobblestoneSlab; - mappings[127] = ItemType.BrickSlab; - mappings[128] = ItemType.StoneBrickSlab; - mappings[129] = ItemType.NetherBrickSlab; - mappings[130] = ItemType.QuartzSlab; - mappings[131] = ItemType.RedSandstoneSlab; - mappings[132] = ItemType.CutRedSandstoneSlab; - mappings[133] = ItemType.PurpurSlab; - mappings[134] = ItemType.PrismarineSlab; - mappings[135] = ItemType.PrismarineBrickSlab; - mappings[136] = ItemType.DarkPrismarineSlab; - mappings[137] = ItemType.SmoothQuartz; - mappings[138] = ItemType.SmoothRedSandstone; - mappings[139] = ItemType.SmoothSandstone; - mappings[140] = ItemType.SmoothStone; - mappings[141] = ItemType.Bricks; - mappings[142] = ItemType.Tnt; - mappings[143] = ItemType.Bookshelf; - mappings[144] = ItemType.MossyCobblestone; - mappings[145] = ItemType.Obsidian; - mappings[146] = ItemType.Torch; - mappings[147] = ItemType.EndRod; - mappings[148] = ItemType.ChorusPlant; - mappings[149] = ItemType.ChorusFlower; - mappings[150] = ItemType.PurpurBlock; - mappings[151] = ItemType.PurpurPillar; - mappings[152] = ItemType.PurpurStairs; - mappings[153] = ItemType.Spawner; - mappings[154] = ItemType.OakStairs; - mappings[155] = ItemType.Chest; - mappings[156] = ItemType.DiamondOre; - mappings[157] = ItemType.DiamondBlock; - mappings[158] = ItemType.CraftingTable; - mappings[159] = ItemType.Farmland; - mappings[160] = ItemType.Furnace; - mappings[161] = ItemType.Ladder; - mappings[162] = ItemType.Rail; - mappings[163] = ItemType.CobblestoneStairs; - mappings[164] = ItemType.Lever; - mappings[165] = ItemType.StonePressurePlate; - mappings[166] = ItemType.OakPressurePlate; - mappings[167] = ItemType.SprucePressurePlate; - mappings[168] = ItemType.BirchPressurePlate; - mappings[169] = ItemType.JunglePressurePlate; - mappings[170] = ItemType.AcaciaPressurePlate; - mappings[171] = ItemType.DarkOakPressurePlate; - mappings[172] = ItemType.RedstoneOre; - mappings[173] = ItemType.RedstoneTorch; - mappings[174] = ItemType.StoneButton; - mappings[175] = ItemType.Snow; - mappings[176] = ItemType.Ice; - mappings[177] = ItemType.SnowBlock; - mappings[178] = ItemType.Cactus; - mappings[179] = ItemType.Clay; - mappings[180] = ItemType.Jukebox; - mappings[181] = ItemType.OakFence; - mappings[182] = ItemType.SpruceFence; - mappings[183] = ItemType.BirchFence; - mappings[184] = ItemType.JungleFence; - mappings[185] = ItemType.AcaciaFence; - mappings[186] = ItemType.DarkOakFence; - mappings[187] = ItemType.Pumpkin; - mappings[188] = ItemType.CarvedPumpkin; - mappings[189] = ItemType.Netherrack; - mappings[190] = ItemType.SoulSand; - mappings[191] = ItemType.Glowstone; - mappings[192] = ItemType.JackOLantern; - mappings[193] = ItemType.OakTrapdoor; - mappings[194] = ItemType.SpruceTrapdoor; - mappings[195] = ItemType.BirchTrapdoor; - mappings[196] = ItemType.JungleTrapdoor; - mappings[197] = ItemType.AcaciaTrapdoor; - mappings[198] = ItemType.DarkOakTrapdoor; - mappings[199] = ItemType.InfestedStone; - mappings[200] = ItemType.InfestedCobblestone; - mappings[201] = ItemType.InfestedStoneBricks; - mappings[202] = ItemType.InfestedMossyStoneBricks; - mappings[203] = ItemType.InfestedCrackedStoneBricks; - mappings[204] = ItemType.InfestedChiseledStoneBricks; - mappings[205] = ItemType.StoneBricks; - mappings[206] = ItemType.MossyStoneBricks; - mappings[207] = ItemType.CrackedStoneBricks; - mappings[208] = ItemType.ChiseledStoneBricks; - mappings[209] = ItemType.BrownMushroomBlock; - mappings[210] = ItemType.RedMushroomBlock; - mappings[211] = ItemType.MushroomStem; - mappings[212] = ItemType.IronBars; - mappings[213] = ItemType.GlassPane; - mappings[214] = ItemType.Melon; - mappings[215] = ItemType.Vine; - mappings[216] = ItemType.OakFenceGate; - mappings[217] = ItemType.SpruceFenceGate; - mappings[218] = ItemType.BirchFenceGate; - mappings[219] = ItemType.JungleFenceGate; - mappings[220] = ItemType.AcaciaFenceGate; - mappings[221] = ItemType.DarkOakFenceGate; - mappings[222] = ItemType.BrickStairs; - mappings[223] = ItemType.StoneBrickStairs; - mappings[224] = ItemType.Mycelium; - mappings[225] = ItemType.LilyPad; - mappings[226] = ItemType.NetherBricks; - mappings[227] = ItemType.NetherBrickFence; - mappings[228] = ItemType.NetherBrickStairs; - mappings[229] = ItemType.EnchantingTable; - mappings[230] = ItemType.EndPortalFrame; - mappings[231] = ItemType.EndStone; - mappings[232] = ItemType.EndStoneBricks; - mappings[233] = ItemType.DragonEgg; - mappings[234] = ItemType.RedstoneLamp; - mappings[235] = ItemType.SandstoneStairs; - mappings[236] = ItemType.EmeraldOre; - mappings[237] = ItemType.EnderChest; - mappings[238] = ItemType.TripwireHook; - mappings[239] = ItemType.EmeraldBlock; - mappings[240] = ItemType.SpruceStairs; - mappings[241] = ItemType.BirchStairs; - mappings[242] = ItemType.JungleStairs; - mappings[243] = ItemType.CommandBlock; - mappings[244] = ItemType.Beacon; - mappings[245] = ItemType.CobblestoneWall; - mappings[246] = ItemType.MossyCobblestoneWall; - mappings[247] = ItemType.BrickWall; - mappings[248] = ItemType.PrismarineWall; - mappings[249] = ItemType.RedSandstoneWall; - mappings[250] = ItemType.MossyStoneBrickWall; - mappings[251] = ItemType.GraniteWall; - mappings[252] = ItemType.StoneBrickWall; - mappings[253] = ItemType.NetherBrickWall; - mappings[254] = ItemType.AndesiteWall; - mappings[255] = ItemType.RedNetherBrickWall; - mappings[256] = ItemType.SandstoneWall; - mappings[257] = ItemType.EndStoneBrickWall; - mappings[258] = ItemType.DioriteWall; - mappings[259] = ItemType.OakButton; - mappings[260] = ItemType.SpruceButton; - mappings[261] = ItemType.BirchButton; - mappings[262] = ItemType.JungleButton; - mappings[263] = ItemType.AcaciaButton; - mappings[264] = ItemType.DarkOakButton; - mappings[265] = ItemType.Anvil; - mappings[266] = ItemType.ChippedAnvil; - mappings[267] = ItemType.DamagedAnvil; - mappings[268] = ItemType.TrappedChest; - mappings[269] = ItemType.LightWeightedPressurePlate; - mappings[270] = ItemType.HeavyWeightedPressurePlate; - mappings[271] = ItemType.DaylightDetector; - mappings[272] = ItemType.RedstoneBlock; - mappings[273] = ItemType.NetherQuartzOre; - mappings[274] = ItemType.Hopper; - mappings[275] = ItemType.ChiseledQuartzBlock; - mappings[276] = ItemType.QuartzBlock; - mappings[277] = ItemType.QuartzPillar; - mappings[278] = ItemType.QuartzStairs; - mappings[279] = ItemType.ActivatorRail; - mappings[280] = ItemType.Dropper; - mappings[281] = ItemType.WhiteTerracotta; - mappings[282] = ItemType.OrangeTerracotta; - mappings[283] = ItemType.MagentaTerracotta; - mappings[284] = ItemType.LightBlueTerracotta; - mappings[285] = ItemType.YellowTerracotta; - mappings[286] = ItemType.LimeTerracotta; - mappings[287] = ItemType.PinkTerracotta; - mappings[288] = ItemType.GrayTerracotta; - mappings[289] = ItemType.LightGrayTerracotta; - mappings[290] = ItemType.CyanTerracotta; - mappings[291] = ItemType.PurpleTerracotta; - mappings[292] = ItemType.BlueTerracotta; - mappings[293] = ItemType.BrownTerracotta; - mappings[294] = ItemType.GreenTerracotta; - mappings[295] = ItemType.RedTerracotta; - mappings[296] = ItemType.BlackTerracotta; - mappings[297] = ItemType.Barrier; - mappings[298] = ItemType.IronTrapdoor; - mappings[299] = ItemType.HayBlock; - mappings[300] = ItemType.WhiteCarpet; - mappings[301] = ItemType.OrangeCarpet; - mappings[302] = ItemType.MagentaCarpet; - mappings[303] = ItemType.LightBlueCarpet; - mappings[304] = ItemType.YellowCarpet; - mappings[305] = ItemType.LimeCarpet; - mappings[306] = ItemType.PinkCarpet; - mappings[307] = ItemType.GrayCarpet; - mappings[308] = ItemType.LightGrayCarpet; - mappings[309] = ItemType.CyanCarpet; - mappings[310] = ItemType.PurpleCarpet; - mappings[311] = ItemType.BlueCarpet; - mappings[312] = ItemType.BrownCarpet; - mappings[313] = ItemType.GreenCarpet; - mappings[314] = ItemType.RedCarpet; - mappings[315] = ItemType.BlackCarpet; - mappings[316] = ItemType.Terracotta; - mappings[317] = ItemType.CoalBlock; - mappings[318] = ItemType.PackedIce; - mappings[319] = ItemType.AcaciaStairs; - mappings[320] = ItemType.DarkOakStairs; - mappings[321] = ItemType.SlimeBlock; - mappings[322] = ItemType.DirtPath; - mappings[323] = ItemType.Sunflower; - mappings[324] = ItemType.Lilac; - mappings[325] = ItemType.RoseBush; - mappings[326] = ItemType.Peony; - mappings[327] = ItemType.TallGrass; - mappings[328] = ItemType.LargeFern; - mappings[329] = ItemType.WhiteStainedGlass; - mappings[330] = ItemType.OrangeStainedGlass; - mappings[331] = ItemType.MagentaStainedGlass; - mappings[332] = ItemType.LightBlueStainedGlass; - mappings[333] = ItemType.YellowStainedGlass; - mappings[334] = ItemType.LimeStainedGlass; - mappings[335] = ItemType.PinkStainedGlass; - mappings[336] = ItemType.GrayStainedGlass; - mappings[337] = ItemType.LightGrayStainedGlass; - mappings[338] = ItemType.CyanStainedGlass; - mappings[339] = ItemType.PurpleStainedGlass; - mappings[340] = ItemType.BlueStainedGlass; - mappings[341] = ItemType.BrownStainedGlass; - mappings[342] = ItemType.GreenStainedGlass; - mappings[343] = ItemType.RedStainedGlass; - mappings[344] = ItemType.BlackStainedGlass; - mappings[345] = ItemType.WhiteStainedGlassPane; - mappings[346] = ItemType.OrangeStainedGlassPane; - mappings[347] = ItemType.MagentaStainedGlassPane; - mappings[348] = ItemType.LightBlueStainedGlassPane; - mappings[349] = ItemType.YellowStainedGlassPane; - mappings[350] = ItemType.LimeStainedGlassPane; - mappings[351] = ItemType.PinkStainedGlassPane; - mappings[352] = ItemType.GrayStainedGlassPane; - mappings[353] = ItemType.LightGrayStainedGlassPane; - mappings[354] = ItemType.CyanStainedGlassPane; - mappings[355] = ItemType.PurpleStainedGlassPane; - mappings[356] = ItemType.BlueStainedGlassPane; - mappings[357] = ItemType.BrownStainedGlassPane; - mappings[358] = ItemType.GreenStainedGlassPane; - mappings[359] = ItemType.RedStainedGlassPane; - mappings[360] = ItemType.BlackStainedGlassPane; - mappings[361] = ItemType.Prismarine; - mappings[362] = ItemType.PrismarineBricks; - mappings[363] = ItemType.DarkPrismarine; - mappings[364] = ItemType.PrismarineStairs; - mappings[365] = ItemType.PrismarineBrickStairs; - mappings[366] = ItemType.DarkPrismarineStairs; - mappings[367] = ItemType.SeaLantern; - mappings[368] = ItemType.RedSandstone; - mappings[369] = ItemType.ChiseledRedSandstone; - mappings[370] = ItemType.CutRedSandstone; - mappings[371] = ItemType.RedSandstoneStairs; - mappings[372] = ItemType.RepeatingCommandBlock; - mappings[373] = ItemType.ChainCommandBlock; - mappings[374] = ItemType.MagmaBlock; - mappings[375] = ItemType.NetherWartBlock; - mappings[376] = ItemType.RedNetherBricks; - mappings[377] = ItemType.BoneBlock; - mappings[378] = ItemType.StructureVoid; - mappings[379] = ItemType.Observer; - mappings[380] = ItemType.ShulkerBox; - mappings[381] = ItemType.WhiteShulkerBox; - mappings[382] = ItemType.OrangeShulkerBox; - mappings[383] = ItemType.MagentaShulkerBox; - mappings[384] = ItemType.LightBlueShulkerBox; - mappings[385] = ItemType.YellowShulkerBox; - mappings[386] = ItemType.LimeShulkerBox; - mappings[387] = ItemType.PinkShulkerBox; - mappings[388] = ItemType.GrayShulkerBox; - mappings[389] = ItemType.LightGrayShulkerBox; - mappings[390] = ItemType.CyanShulkerBox; - mappings[391] = ItemType.PurpleShulkerBox; - mappings[392] = ItemType.BlueShulkerBox; - mappings[393] = ItemType.BrownShulkerBox; - mappings[394] = ItemType.GreenShulkerBox; - mappings[395] = ItemType.RedShulkerBox; - mappings[396] = ItemType.BlackShulkerBox; - mappings[397] = ItemType.WhiteGlazedTerracotta; - mappings[398] = ItemType.OrangeGlazedTerracotta; - mappings[399] = ItemType.MagentaGlazedTerracotta; - mappings[400] = ItemType.LightBlueGlazedTerracotta; - mappings[401] = ItemType.YellowGlazedTerracotta; - mappings[402] = ItemType.LimeGlazedTerracotta; - mappings[403] = ItemType.PinkGlazedTerracotta; - mappings[404] = ItemType.GrayGlazedTerracotta; - mappings[405] = ItemType.LightGrayGlazedTerracotta; - mappings[406] = ItemType.CyanGlazedTerracotta; - mappings[407] = ItemType.PurpleGlazedTerracotta; - mappings[408] = ItemType.BlueGlazedTerracotta; - mappings[409] = ItemType.BrownGlazedTerracotta; - mappings[410] = ItemType.GreenGlazedTerracotta; - mappings[411] = ItemType.RedGlazedTerracotta; - mappings[412] = ItemType.BlackGlazedTerracotta; - mappings[413] = ItemType.WhiteConcrete; - mappings[414] = ItemType.OrangeConcrete; - mappings[415] = ItemType.MagentaConcrete; - mappings[416] = ItemType.LightBlueConcrete; - mappings[417] = ItemType.YellowConcrete; - mappings[418] = ItemType.LimeConcrete; - mappings[419] = ItemType.PinkConcrete; - mappings[420] = ItemType.GrayConcrete; - mappings[421] = ItemType.LightGrayConcrete; - mappings[422] = ItemType.CyanConcrete; - mappings[423] = ItemType.PurpleConcrete; - mappings[424] = ItemType.BlueConcrete; - mappings[425] = ItemType.BrownConcrete; - mappings[426] = ItemType.GreenConcrete; - mappings[427] = ItemType.RedConcrete; - mappings[428] = ItemType.BlackConcrete; - mappings[429] = ItemType.WhiteConcretePowder; - mappings[430] = ItemType.OrangeConcretePowder; - mappings[431] = ItemType.MagentaConcretePowder; - mappings[432] = ItemType.LightBlueConcretePowder; - mappings[433] = ItemType.YellowConcretePowder; - mappings[434] = ItemType.LimeConcretePowder; - mappings[435] = ItemType.PinkConcretePowder; - mappings[436] = ItemType.GrayConcretePowder; - mappings[437] = ItemType.LightGrayConcretePowder; - mappings[438] = ItemType.CyanConcretePowder; - mappings[439] = ItemType.PurpleConcretePowder; - mappings[440] = ItemType.BlueConcretePowder; - mappings[441] = ItemType.BrownConcretePowder; - mappings[442] = ItemType.GreenConcretePowder; - mappings[443] = ItemType.RedConcretePowder; - mappings[444] = ItemType.BlackConcretePowder; - mappings[445] = ItemType.TurtleEgg; - mappings[446] = ItemType.DeadTubeCoralBlock; - mappings[447] = ItemType.DeadBrainCoralBlock; - mappings[448] = ItemType.DeadBubbleCoralBlock; - mappings[449] = ItemType.DeadFireCoralBlock; - mappings[450] = ItemType.DeadHornCoralBlock; - mappings[451] = ItemType.TubeCoralBlock; - mappings[452] = ItemType.BrainCoralBlock; - mappings[453] = ItemType.BubbleCoralBlock; - mappings[454] = ItemType.FireCoralBlock; - mappings[455] = ItemType.HornCoralBlock; - mappings[456] = ItemType.TubeCoral; - mappings[457] = ItemType.BrainCoral; - mappings[458] = ItemType.BubbleCoral; - mappings[459] = ItemType.FireCoral; - mappings[460] = ItemType.HornCoral; - mappings[461] = ItemType.DeadBrainCoral; - mappings[462] = ItemType.DeadBubbleCoral; - mappings[463] = ItemType.DeadFireCoral; - mappings[464] = ItemType.DeadHornCoral; - mappings[465] = ItemType.DeadTubeCoral; - mappings[466] = ItemType.TubeCoralFan; - mappings[467] = ItemType.BrainCoralFan; - mappings[468] = ItemType.BubbleCoralFan; - mappings[469] = ItemType.FireCoralFan; - mappings[470] = ItemType.HornCoralFan; - mappings[471] = ItemType.DeadTubeCoralFan; - mappings[472] = ItemType.DeadBrainCoralFan; - mappings[473] = ItemType.DeadBubbleCoralFan; - mappings[474] = ItemType.DeadFireCoralFan; - mappings[475] = ItemType.DeadHornCoralFan; - mappings[476] = ItemType.BlueIce; - mappings[477] = ItemType.Conduit; - mappings[478] = ItemType.PolishedGraniteStairs; - mappings[479] = ItemType.SmoothRedSandstoneStairs; - mappings[480] = ItemType.MossyStoneBrickStairs; - mappings[481] = ItemType.PolishedDioriteStairs; - mappings[482] = ItemType.MossyCobblestoneStairs; - mappings[483] = ItemType.EndStoneBrickStairs; - mappings[484] = ItemType.StoneStairs; - mappings[485] = ItemType.SmoothSandstoneStairs; - mappings[486] = ItemType.SmoothQuartzStairs; - mappings[487] = ItemType.GraniteStairs; - mappings[488] = ItemType.AndesiteStairs; - mappings[489] = ItemType.RedNetherBrickStairs; - mappings[490] = ItemType.PolishedAndesiteStairs; - mappings[491] = ItemType.DioriteStairs; - mappings[492] = ItemType.PolishedGraniteSlab; - mappings[493] = ItemType.SmoothRedSandstoneSlab; - mappings[494] = ItemType.MossyStoneBrickSlab; - mappings[495] = ItemType.PolishedDioriteSlab; - mappings[496] = ItemType.MossyCobblestoneSlab; - mappings[497] = ItemType.EndStoneBrickSlab; - mappings[498] = ItemType.SmoothSandstoneSlab; - mappings[499] = ItemType.SmoothQuartzSlab; - mappings[500] = ItemType.GraniteSlab; - mappings[501] = ItemType.AndesiteSlab; - mappings[502] = ItemType.RedNetherBrickSlab; - mappings[503] = ItemType.PolishedAndesiteSlab; - mappings[504] = ItemType.DioriteSlab; - mappings[505] = ItemType.Scaffolding; - mappings[506] = ItemType.IronDoor; - mappings[507] = ItemType.OakDoor; - mappings[508] = ItemType.SpruceDoor; - mappings[509] = ItemType.BirchDoor; - mappings[510] = ItemType.JungleDoor; - mappings[511] = ItemType.AcaciaDoor; - mappings[512] = ItemType.DarkOakDoor; - mappings[513] = ItemType.Repeater; - mappings[514] = ItemType.Comparator; - mappings[515] = ItemType.StructureBlock; - mappings[516] = ItemType.Jigsaw; - mappings[517] = ItemType.Composter; - mappings[518] = ItemType.TurtleHelmet; - mappings[519] = ItemType.TurtleScute; - mappings[520] = ItemType.IronShovel; - mappings[521] = ItemType.IronPickaxe; - mappings[522] = ItemType.IronAxe; - mappings[523] = ItemType.FlintAndSteel; - mappings[524] = ItemType.Apple; - mappings[525] = ItemType.Bow; - mappings[526] = ItemType.Arrow; - mappings[527] = ItemType.Coal; - mappings[528] = ItemType.Charcoal; - mappings[529] = ItemType.Diamond; - mappings[530] = ItemType.IronIngot; - mappings[531] = ItemType.GoldIngot; - mappings[532] = ItemType.IronSword; - mappings[533] = ItemType.WoodenSword; - mappings[534] = ItemType.WoodenShovel; - mappings[535] = ItemType.WoodenPickaxe; - mappings[536] = ItemType.WoodenAxe; - mappings[537] = ItemType.StoneSword; - mappings[538] = ItemType.StoneShovel; - mappings[539] = ItemType.StonePickaxe; - mappings[540] = ItemType.StoneAxe; - mappings[541] = ItemType.DiamondSword; - mappings[542] = ItemType.DiamondShovel; - mappings[543] = ItemType.DiamondPickaxe; - mappings[544] = ItemType.DiamondAxe; - mappings[545] = ItemType.Stick; - mappings[546] = ItemType.Bowl; - mappings[547] = ItemType.MushroomStew; - mappings[548] = ItemType.GoldenSword; - mappings[549] = ItemType.GoldenShovel; - mappings[550] = ItemType.GoldenPickaxe; - mappings[551] = ItemType.GoldenAxe; - mappings[552] = ItemType.String; - mappings[553] = ItemType.Feather; - mappings[554] = ItemType.Gunpowder; - mappings[555] = ItemType.WoodenHoe; - mappings[556] = ItemType.StoneHoe; - mappings[557] = ItemType.IronHoe; - mappings[558] = ItemType.DiamondHoe; - mappings[559] = ItemType.GoldenHoe; - mappings[560] = ItemType.WheatSeeds; - mappings[561] = ItemType.Wheat; - mappings[562] = ItemType.Bread; - mappings[563] = ItemType.LeatherHelmet; - mappings[564] = ItemType.LeatherChestplate; - mappings[565] = ItemType.LeatherLeggings; - mappings[566] = ItemType.LeatherBoots; - mappings[567] = ItemType.ChainmailHelmet; - mappings[568] = ItemType.ChainmailChestplate; - mappings[569] = ItemType.ChainmailLeggings; - mappings[570] = ItemType.ChainmailBoots; - mappings[571] = ItemType.IronHelmet; - mappings[572] = ItemType.IronChestplate; - mappings[573] = ItemType.IronLeggings; - mappings[574] = ItemType.IronBoots; - mappings[575] = ItemType.DiamondHelmet; - mappings[576] = ItemType.DiamondChestplate; - mappings[577] = ItemType.DiamondLeggings; - mappings[578] = ItemType.DiamondBoots; - mappings[579] = ItemType.GoldenHelmet; - mappings[580] = ItemType.GoldenChestplate; - mappings[581] = ItemType.GoldenLeggings; - mappings[582] = ItemType.GoldenBoots; - mappings[583] = ItemType.Flint; - mappings[584] = ItemType.Porkchop; - mappings[585] = ItemType.CookedPorkchop; - mappings[586] = ItemType.Painting; - mappings[587] = ItemType.GoldenApple; - mappings[588] = ItemType.EnchantedGoldenApple; - mappings[589] = ItemType.OakSign; - mappings[590] = ItemType.SpruceSign; - mappings[591] = ItemType.BirchSign; - mappings[592] = ItemType.JungleSign; - mappings[593] = ItemType.AcaciaSign; - mappings[594] = ItemType.DarkOakSign; - mappings[595] = ItemType.Bucket; - mappings[596] = ItemType.WaterBucket; - mappings[597] = ItemType.LavaBucket; - mappings[598] = ItemType.Minecart; - mappings[599] = ItemType.Saddle; - mappings[600] = ItemType.Redstone; - mappings[601] = ItemType.Snowball; - mappings[602] = ItemType.OakBoat; - mappings[603] = ItemType.Leather; - mappings[604] = ItemType.MilkBucket; - mappings[605] = ItemType.PufferfishBucket; - mappings[606] = ItemType.SalmonBucket; - mappings[607] = ItemType.CodBucket; - mappings[608] = ItemType.TropicalFishBucket; - mappings[609] = ItemType.Brick; - mappings[610] = ItemType.ClayBall; - mappings[611] = ItemType.SugarCane; - mappings[612] = ItemType.Kelp; - mappings[613] = ItemType.DriedKelpBlock; - mappings[614] = ItemType.Bamboo; - mappings[615] = ItemType.Paper; - mappings[616] = ItemType.Book; - mappings[617] = ItemType.SlimeBall; - mappings[618] = ItemType.ChestMinecart; - mappings[619] = ItemType.FurnaceMinecart; - mappings[620] = ItemType.Egg; - mappings[621] = ItemType.Compass; - mappings[622] = ItemType.FishingRod; - mappings[623] = ItemType.Clock; - mappings[624] = ItemType.GlowstoneDust; - mappings[625] = ItemType.Cod; - mappings[626] = ItemType.Salmon; - mappings[627] = ItemType.TropicalFish; - mappings[628] = ItemType.Pufferfish; - mappings[629] = ItemType.CookedCod; - mappings[630] = ItemType.CookedSalmon; - mappings[631] = ItemType.InkSac; - mappings[632] = ItemType.RedDye; - mappings[633] = ItemType.GreenDye; - mappings[634] = ItemType.CocoaBeans; - mappings[635] = ItemType.LapisLazuli; - mappings[636] = ItemType.PurpleDye; - mappings[637] = ItemType.CyanDye; - mappings[638] = ItemType.LightGrayDye; - mappings[639] = ItemType.GrayDye; - mappings[640] = ItemType.PinkDye; - mappings[641] = ItemType.LimeDye; - mappings[642] = ItemType.YellowDye; - mappings[643] = ItemType.LightBlueDye; - mappings[644] = ItemType.MagentaDye; - mappings[645] = ItemType.OrangeDye; - mappings[646] = ItemType.BoneMeal; - mappings[647] = ItemType.BlueDye; - mappings[648] = ItemType.BrownDye; - mappings[649] = ItemType.BlackDye; - mappings[650] = ItemType.WhiteDye; - mappings[651] = ItemType.Bone; - mappings[652] = ItemType.Sugar; - mappings[653] = ItemType.Cake; - mappings[654] = ItemType.WhiteBed; - mappings[655] = ItemType.OrangeBed; - mappings[656] = ItemType.MagentaBed; - mappings[657] = ItemType.LightBlueBed; - mappings[658] = ItemType.YellowBed; - mappings[659] = ItemType.LimeBed; - mappings[660] = ItemType.PinkBed; - mappings[661] = ItemType.GrayBed; - mappings[662] = ItemType.LightGrayBed; - mappings[663] = ItemType.CyanBed; - mappings[664] = ItemType.PurpleBed; - mappings[665] = ItemType.BlueBed; - mappings[666] = ItemType.BrownBed; - mappings[667] = ItemType.GreenBed; - mappings[668] = ItemType.RedBed; - mappings[669] = ItemType.BlackBed; - mappings[670] = ItemType.Cookie; - mappings[671] = ItemType.FilledMap; - mappings[672] = ItemType.Shears; - mappings[673] = ItemType.MelonSlice; - mappings[674] = ItemType.DriedKelp; - mappings[675] = ItemType.PumpkinSeeds; - mappings[676] = ItemType.MelonSeeds; - mappings[677] = ItemType.Beef; - mappings[678] = ItemType.CookedBeef; - mappings[679] = ItemType.Chicken; - mappings[680] = ItemType.CookedChicken; - mappings[681] = ItemType.RottenFlesh; - mappings[682] = ItemType.EnderPearl; - mappings[683] = ItemType.BlazeRod; - mappings[684] = ItemType.GhastTear; - mappings[685] = ItemType.GoldNugget; - mappings[686] = ItemType.NetherWart; - mappings[687] = ItemType.Potion; - mappings[688] = ItemType.GlassBottle; - mappings[689] = ItemType.SpiderEye; - mappings[690] = ItemType.FermentedSpiderEye; - mappings[691] = ItemType.BlazePowder; - mappings[692] = ItemType.MagmaCream; - mappings[693] = ItemType.BrewingStand; - mappings[694] = ItemType.Cauldron; - mappings[695] = ItemType.EnderEye; - mappings[696] = ItemType.GlisteringMelonSlice; - mappings[697] = ItemType.BatSpawnEgg; - mappings[698] = ItemType.BlazeSpawnEgg; - mappings[699] = ItemType.CatSpawnEgg; - mappings[700] = ItemType.CaveSpiderSpawnEgg; - mappings[701] = ItemType.ChickenSpawnEgg; - mappings[702] = ItemType.CodSpawnEgg; - mappings[703] = ItemType.CowSpawnEgg; - mappings[704] = ItemType.CreeperSpawnEgg; - mappings[705] = ItemType.DolphinSpawnEgg; - mappings[706] = ItemType.DonkeySpawnEgg; - mappings[707] = ItemType.DrownedSpawnEgg; - mappings[708] = ItemType.ElderGuardianSpawnEgg; - mappings[709] = ItemType.EndermanSpawnEgg; - mappings[710] = ItemType.EndermiteSpawnEgg; - mappings[711] = ItemType.EvokerSpawnEgg; - mappings[712] = ItemType.FoxSpawnEgg; - mappings[713] = ItemType.GhastSpawnEgg; - mappings[714] = ItemType.GuardianSpawnEgg; - mappings[715] = ItemType.HorseSpawnEgg; - mappings[716] = ItemType.HuskSpawnEgg; - mappings[717] = ItemType.LlamaSpawnEgg; - mappings[718] = ItemType.MagmaCubeSpawnEgg; - mappings[719] = ItemType.MooshroomSpawnEgg; - mappings[720] = ItemType.MuleSpawnEgg; - mappings[721] = ItemType.OcelotSpawnEgg; - mappings[722] = ItemType.PandaSpawnEgg; - mappings[723] = ItemType.ParrotSpawnEgg; - mappings[724] = ItemType.PhantomSpawnEgg; - mappings[725] = ItemType.PigSpawnEgg; - mappings[726] = ItemType.PillagerSpawnEgg; - mappings[727] = ItemType.PolarBearSpawnEgg; - mappings[728] = ItemType.PufferfishSpawnEgg; - mappings[729] = ItemType.RabbitSpawnEgg; - mappings[730] = ItemType.RavagerSpawnEgg; - mappings[731] = ItemType.SalmonSpawnEgg; - mappings[732] = ItemType.SheepSpawnEgg; - mappings[733] = ItemType.ShulkerSpawnEgg; - mappings[734] = ItemType.SilverfishSpawnEgg; - mappings[735] = ItemType.SkeletonSpawnEgg; - mappings[736] = ItemType.SkeletonHorseSpawnEgg; - mappings[737] = ItemType.SlimeSpawnEgg; - mappings[738] = ItemType.SpiderSpawnEgg; - mappings[739] = ItemType.SquidSpawnEgg; - mappings[740] = ItemType.StraySpawnEgg; - mappings[741] = ItemType.TraderLlamaSpawnEgg; - mappings[742] = ItemType.TropicalFishSpawnEgg; - mappings[743] = ItemType.TurtleSpawnEgg; - mappings[744] = ItemType.VexSpawnEgg; - mappings[745] = ItemType.VillagerSpawnEgg; - mappings[746] = ItemType.VindicatorSpawnEgg; - mappings[747] = ItemType.WanderingTraderSpawnEgg; - mappings[748] = ItemType.WitchSpawnEgg; - mappings[749] = ItemType.WitherSkeletonSpawnEgg; - mappings[750] = ItemType.WolfSpawnEgg; - mappings[751] = ItemType.ZombieSpawnEgg; - mappings[752] = ItemType.ZombieHorseSpawnEgg; - mappings[753] = ItemType.ZombifiedPiglinSpawnEgg; - mappings[754] = ItemType.ZombieVillagerSpawnEgg; - mappings[755] = ItemType.ExperienceBottle; - mappings[756] = ItemType.FireCharge; - mappings[757] = ItemType.WritableBook; - mappings[758] = ItemType.WrittenBook; - mappings[759] = ItemType.Emerald; - mappings[760] = ItemType.ItemFrame; - mappings[761] = ItemType.FlowerPot; - mappings[762] = ItemType.Carrot; - mappings[763] = ItemType.Potato; - mappings[764] = ItemType.BakedPotato; - mappings[765] = ItemType.PoisonousPotato; - mappings[766] = ItemType.Map; - mappings[767] = ItemType.GoldenCarrot; - mappings[768] = ItemType.SkeletonSkull; - mappings[769] = ItemType.WitherSkeletonSkull; - mappings[770] = ItemType.PlayerHead; - mappings[771] = ItemType.ZombieHead; - mappings[772] = ItemType.CreeperHead; - mappings[773] = ItemType.DragonHead; - mappings[774] = ItemType.CarrotOnAStick; - mappings[775] = ItemType.NetherStar; - mappings[776] = ItemType.PumpkinPie; - mappings[777] = ItemType.FireworkRocket; - mappings[778] = ItemType.FireworkStar; - mappings[779] = ItemType.EnchantedBook; - mappings[780] = ItemType.NetherBrick; - mappings[781] = ItemType.Quartz; - mappings[782] = ItemType.TntMinecart; - mappings[783] = ItemType.HopperMinecart; - mappings[784] = ItemType.PrismarineShard; - mappings[785] = ItemType.PrismarineCrystals; - mappings[786] = ItemType.Rabbit; - mappings[787] = ItemType.CookedRabbit; - mappings[788] = ItemType.RabbitStew; - mappings[789] = ItemType.RabbitFoot; - mappings[790] = ItemType.RabbitHide; - mappings[791] = ItemType.ArmorStand; - mappings[792] = ItemType.IronHorseArmor; - mappings[793] = ItemType.GoldenHorseArmor; - mappings[794] = ItemType.DiamondHorseArmor; - mappings[795] = ItemType.LeatherHorseArmor; - mappings[796] = ItemType.Lead; - mappings[797] = ItemType.NameTag; - mappings[798] = ItemType.CommandBlockMinecart; - mappings[799] = ItemType.Mutton; - mappings[800] = ItemType.CookedMutton; - mappings[801] = ItemType.WhiteBanner; - mappings[802] = ItemType.OrangeBanner; - mappings[803] = ItemType.MagentaBanner; - mappings[804] = ItemType.LightBlueBanner; - mappings[805] = ItemType.YellowBanner; - mappings[806] = ItemType.LimeBanner; - mappings[807] = ItemType.PinkBanner; - mappings[808] = ItemType.GrayBanner; - mappings[809] = ItemType.LightGrayBanner; - mappings[810] = ItemType.CyanBanner; - mappings[811] = ItemType.PurpleBanner; - mappings[812] = ItemType.BlueBanner; - mappings[813] = ItemType.BrownBanner; - mappings[814] = ItemType.GreenBanner; - mappings[815] = ItemType.RedBanner; - mappings[816] = ItemType.BlackBanner; - mappings[817] = ItemType.EndCrystal; - mappings[818] = ItemType.ChorusFruit; - mappings[819] = ItemType.PoppedChorusFruit; - mappings[820] = ItemType.Beetroot; - mappings[821] = ItemType.BeetrootSeeds; - mappings[822] = ItemType.BeetrootSoup; - mappings[823] = ItemType.DragonBreath; - mappings[824] = ItemType.SplashPotion; - mappings[825] = ItemType.SpectralArrow; - mappings[826] = ItemType.TippedArrow; - mappings[827] = ItemType.LingeringPotion; - mappings[828] = ItemType.Shield; - mappings[829] = ItemType.Elytra; - mappings[830] = ItemType.SpruceBoat; - mappings[831] = ItemType.BirchBoat; - mappings[832] = ItemType.JungleBoat; - mappings[833] = ItemType.AcaciaBoat; - mappings[834] = ItemType.DarkOakBoat; - mappings[835] = ItemType.TotemOfUndying; - mappings[836] = ItemType.ShulkerShell; - mappings[837] = ItemType.IronNugget; - mappings[838] = ItemType.KnowledgeBook; - mappings[839] = ItemType.DebugStick; - mappings[840] = ItemType.MusicDisc13; - mappings[841] = ItemType.MusicDiscCat; - mappings[842] = ItemType.MusicDiscBlocks; - mappings[843] = ItemType.MusicDiscChirp; - mappings[844] = ItemType.MusicDiscFar; - mappings[845] = ItemType.MusicDiscMall; - mappings[846] = ItemType.MusicDiscMellohi; - mappings[847] = ItemType.MusicDiscStal; - mappings[848] = ItemType.MusicDiscStrad; - mappings[849] = ItemType.MusicDiscWard; - mappings[850] = ItemType.MusicDisc11; - mappings[851] = ItemType.MusicDiscWait; - mappings[852] = ItemType.Trident; - mappings[853] = ItemType.PhantomMembrane; - mappings[854] = ItemType.NautilusShell; - mappings[855] = ItemType.HeartOfTheSea; - mappings[856] = ItemType.Crossbow; - mappings[857] = ItemType.SuspiciousStew; - mappings[858] = ItemType.Loom; - mappings[859] = ItemType.FlowerBannerPattern; - mappings[860] = ItemType.CreeperBannerPattern; - mappings[861] = ItemType.SkullBannerPattern; - mappings[862] = ItemType.MojangBannerPattern; - mappings[863] = ItemType.GlobeBannerPattern; - mappings[864] = ItemType.Barrel; - mappings[865] = ItemType.Smoker; - mappings[866] = ItemType.BlastFurnace; - mappings[867] = ItemType.CartographyTable; - mappings[868] = ItemType.FletchingTable; - mappings[869] = ItemType.Grindstone; - mappings[870] = ItemType.Lectern; - mappings[871] = ItemType.SmithingTable; - mappings[872] = ItemType.Stonecutter; - mappings[873] = ItemType.Bell; - mappings[874] = ItemType.Lantern; - mappings[875] = ItemType.SweetBerries; - mappings[876] = ItemType.Campfire; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette115.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette115.cs deleted file mode 100644 index 35593662da..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette115.cs +++ /dev/null @@ -1,906 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - /// - /// For MC 1.15.2 or below - /// Generated by ItemPaletteGenerator.cs - /// - public class ItemPalette115 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette115() - { - mappings[0] = ItemType.Air; - mappings[1] = ItemType.Stone; - mappings[2] = ItemType.Granite; - mappings[3] = ItemType.PolishedGranite; - mappings[4] = ItemType.Diorite; - mappings[5] = ItemType.PolishedDiorite; - mappings[6] = ItemType.Andesite; - mappings[7] = ItemType.PolishedAndesite; - mappings[8] = ItemType.GrassBlock; - mappings[9] = ItemType.Dirt; - mappings[10] = ItemType.CoarseDirt; - mappings[11] = ItemType.Podzol; - mappings[12] = ItemType.Cobblestone; - mappings[13] = ItemType.OakPlanks; - mappings[14] = ItemType.SprucePlanks; - mappings[15] = ItemType.BirchPlanks; - mappings[16] = ItemType.JunglePlanks; - mappings[17] = ItemType.AcaciaPlanks; - mappings[18] = ItemType.DarkOakPlanks; - mappings[19] = ItemType.OakSapling; - mappings[20] = ItemType.SpruceSapling; - mappings[21] = ItemType.BirchSapling; - mappings[22] = ItemType.JungleSapling; - mappings[23] = ItemType.AcaciaSapling; - mappings[24] = ItemType.DarkOakSapling; - mappings[25] = ItemType.Bedrock; - mappings[26] = ItemType.Sand; - mappings[27] = ItemType.RedSand; - mappings[28] = ItemType.Gravel; - mappings[29] = ItemType.GoldOre; - mappings[30] = ItemType.IronOre; - mappings[31] = ItemType.CoalOre; - mappings[32] = ItemType.OakLog; - mappings[33] = ItemType.SpruceLog; - mappings[34] = ItemType.BirchLog; - mappings[35] = ItemType.JungleLog; - mappings[36] = ItemType.AcaciaLog; - mappings[37] = ItemType.DarkOakLog; - mappings[38] = ItemType.StrippedOakLog; - mappings[39] = ItemType.StrippedSpruceLog; - mappings[40] = ItemType.StrippedBirchLog; - mappings[41] = ItemType.StrippedJungleLog; - mappings[42] = ItemType.StrippedAcaciaLog; - mappings[43] = ItemType.StrippedDarkOakLog; - mappings[44] = ItemType.StrippedOakWood; - mappings[45] = ItemType.StrippedSpruceWood; - mappings[46] = ItemType.StrippedBirchWood; - mappings[47] = ItemType.StrippedJungleWood; - mappings[48] = ItemType.StrippedAcaciaWood; - mappings[49] = ItemType.StrippedDarkOakWood; - mappings[50] = ItemType.OakWood; - mappings[51] = ItemType.SpruceWood; - mappings[52] = ItemType.BirchWood; - mappings[53] = ItemType.JungleWood; - mappings[54] = ItemType.AcaciaWood; - mappings[55] = ItemType.DarkOakWood; - mappings[56] = ItemType.OakLeaves; - mappings[57] = ItemType.SpruceLeaves; - mappings[58] = ItemType.BirchLeaves; - mappings[59] = ItemType.JungleLeaves; - mappings[60] = ItemType.AcaciaLeaves; - mappings[61] = ItemType.DarkOakLeaves; - mappings[62] = ItemType.Sponge; - mappings[63] = ItemType.WetSponge; - mappings[64] = ItemType.Glass; - mappings[65] = ItemType.LapisOre; - mappings[66] = ItemType.LapisBlock; - mappings[67] = ItemType.Dispenser; - mappings[68] = ItemType.Sandstone; - mappings[69] = ItemType.ChiseledSandstone; - mappings[70] = ItemType.CutSandstone; - mappings[71] = ItemType.NoteBlock; - mappings[72] = ItemType.PoweredRail; - mappings[73] = ItemType.DetectorRail; - mappings[74] = ItemType.StickyPiston; - mappings[75] = ItemType.Cobweb; - mappings[76] = ItemType.ShortGrass; - mappings[77] = ItemType.Fern; - mappings[78] = ItemType.DeadBush; - mappings[79] = ItemType.Seagrass; - mappings[80] = ItemType.SeaPickle; - mappings[81] = ItemType.Piston; - mappings[82] = ItemType.WhiteWool; - mappings[83] = ItemType.OrangeWool; - mappings[84] = ItemType.MagentaWool; - mappings[85] = ItemType.LightBlueWool; - mappings[86] = ItemType.YellowWool; - mappings[87] = ItemType.LimeWool; - mappings[88] = ItemType.PinkWool; - mappings[89] = ItemType.GrayWool; - mappings[90] = ItemType.LightGrayWool; - mappings[91] = ItemType.CyanWool; - mappings[92] = ItemType.PurpleWool; - mappings[93] = ItemType.BlueWool; - mappings[94] = ItemType.BrownWool; - mappings[95] = ItemType.GreenWool; - mappings[96] = ItemType.RedWool; - mappings[97] = ItemType.BlackWool; - mappings[98] = ItemType.Dandelion; - mappings[99] = ItemType.Poppy; - mappings[100] = ItemType.BlueOrchid; - mappings[101] = ItemType.Allium; - mappings[102] = ItemType.AzureBluet; - mappings[103] = ItemType.RedTulip; - mappings[104] = ItemType.OrangeTulip; - mappings[105] = ItemType.WhiteTulip; - mappings[106] = ItemType.PinkTulip; - mappings[107] = ItemType.OxeyeDaisy; - mappings[108] = ItemType.Cornflower; - mappings[109] = ItemType.LilyOfTheValley; - mappings[110] = ItemType.WitherRose; - mappings[111] = ItemType.BrownMushroom; - mappings[112] = ItemType.RedMushroom; - mappings[113] = ItemType.GoldBlock; - mappings[114] = ItemType.IronBlock; - mappings[115] = ItemType.OakSlab; - mappings[116] = ItemType.SpruceSlab; - mappings[117] = ItemType.BirchSlab; - mappings[118] = ItemType.JungleSlab; - mappings[119] = ItemType.AcaciaSlab; - mappings[120] = ItemType.DarkOakSlab; - mappings[121] = ItemType.StoneSlab; - mappings[122] = ItemType.SmoothStoneSlab; - mappings[123] = ItemType.SandstoneSlab; - mappings[124] = ItemType.CutSandstoneSlab; - mappings[125] = ItemType.PetrifiedOakSlab; - mappings[126] = ItemType.CobblestoneSlab; - mappings[127] = ItemType.BrickSlab; - mappings[128] = ItemType.StoneBrickSlab; - mappings[129] = ItemType.NetherBrickSlab; - mappings[130] = ItemType.QuartzSlab; - mappings[131] = ItemType.RedSandstoneSlab; - mappings[132] = ItemType.CutRedSandstoneSlab; - mappings[133] = ItemType.PurpurSlab; - mappings[134] = ItemType.PrismarineSlab; - mappings[135] = ItemType.PrismarineBrickSlab; - mappings[136] = ItemType.DarkPrismarineSlab; - mappings[137] = ItemType.SmoothQuartz; - mappings[138] = ItemType.SmoothRedSandstone; - mappings[139] = ItemType.SmoothSandstone; - mappings[140] = ItemType.SmoothStone; - mappings[141] = ItemType.Bricks; - mappings[142] = ItemType.Tnt; - mappings[143] = ItemType.Bookshelf; - mappings[144] = ItemType.MossyCobblestone; - mappings[145] = ItemType.Obsidian; - mappings[146] = ItemType.Torch; - mappings[147] = ItemType.EndRod; - mappings[148] = ItemType.ChorusPlant; - mappings[149] = ItemType.ChorusFlower; - mappings[150] = ItemType.PurpurBlock; - mappings[151] = ItemType.PurpurPillar; - mappings[152] = ItemType.PurpurStairs; - mappings[153] = ItemType.Spawner; - mappings[154] = ItemType.OakStairs; - mappings[155] = ItemType.Chest; - mappings[156] = ItemType.DiamondOre; - mappings[157] = ItemType.DiamondBlock; - mappings[158] = ItemType.CraftingTable; - mappings[159] = ItemType.Farmland; - mappings[160] = ItemType.Furnace; - mappings[161] = ItemType.Ladder; - mappings[162] = ItemType.Rail; - mappings[163] = ItemType.CobblestoneStairs; - mappings[164] = ItemType.Lever; - mappings[165] = ItemType.StonePressurePlate; - mappings[166] = ItemType.OakPressurePlate; - mappings[167] = ItemType.SprucePressurePlate; - mappings[168] = ItemType.BirchPressurePlate; - mappings[169] = ItemType.JunglePressurePlate; - mappings[170] = ItemType.AcaciaPressurePlate; - mappings[171] = ItemType.DarkOakPressurePlate; - mappings[172] = ItemType.RedstoneOre; - mappings[173] = ItemType.RedstoneTorch; - mappings[174] = ItemType.StoneButton; - mappings[175] = ItemType.Snow; - mappings[176] = ItemType.Ice; - mappings[177] = ItemType.SnowBlock; - mappings[178] = ItemType.Cactus; - mappings[179] = ItemType.Clay; - mappings[180] = ItemType.Jukebox; - mappings[181] = ItemType.OakFence; - mappings[182] = ItemType.SpruceFence; - mappings[183] = ItemType.BirchFence; - mappings[184] = ItemType.JungleFence; - mappings[185] = ItemType.AcaciaFence; - mappings[186] = ItemType.DarkOakFence; - mappings[187] = ItemType.Pumpkin; - mappings[188] = ItemType.CarvedPumpkin; - mappings[189] = ItemType.Netherrack; - mappings[190] = ItemType.SoulSand; - mappings[191] = ItemType.Glowstone; - mappings[192] = ItemType.JackOLantern; - mappings[193] = ItemType.OakTrapdoor; - mappings[194] = ItemType.SpruceTrapdoor; - mappings[195] = ItemType.BirchTrapdoor; - mappings[196] = ItemType.JungleTrapdoor; - mappings[197] = ItemType.AcaciaTrapdoor; - mappings[198] = ItemType.DarkOakTrapdoor; - mappings[199] = ItemType.InfestedStone; - mappings[200] = ItemType.InfestedCobblestone; - mappings[201] = ItemType.InfestedStoneBricks; - mappings[202] = ItemType.InfestedMossyStoneBricks; - mappings[203] = ItemType.InfestedCrackedStoneBricks; - mappings[204] = ItemType.InfestedChiseledStoneBricks; - mappings[205] = ItemType.StoneBricks; - mappings[206] = ItemType.MossyStoneBricks; - mappings[207] = ItemType.CrackedStoneBricks; - mappings[208] = ItemType.ChiseledStoneBricks; - mappings[209] = ItemType.BrownMushroomBlock; - mappings[210] = ItemType.RedMushroomBlock; - mappings[211] = ItemType.MushroomStem; - mappings[212] = ItemType.IronBars; - mappings[213] = ItemType.GlassPane; - mappings[214] = ItemType.Melon; - mappings[215] = ItemType.Vine; - mappings[216] = ItemType.OakFenceGate; - mappings[217] = ItemType.SpruceFenceGate; - mappings[218] = ItemType.BirchFenceGate; - mappings[219] = ItemType.JungleFenceGate; - mappings[220] = ItemType.AcaciaFenceGate; - mappings[221] = ItemType.DarkOakFenceGate; - mappings[222] = ItemType.BrickStairs; - mappings[223] = ItemType.StoneBrickStairs; - mappings[224] = ItemType.Mycelium; - mappings[225] = ItemType.LilyPad; - mappings[226] = ItemType.NetherBricks; - mappings[227] = ItemType.NetherBrickFence; - mappings[228] = ItemType.NetherBrickStairs; - mappings[229] = ItemType.EnchantingTable; - mappings[230] = ItemType.EndPortalFrame; - mappings[231] = ItemType.EndStone; - mappings[232] = ItemType.EndStoneBricks; - mappings[233] = ItemType.DragonEgg; - mappings[234] = ItemType.RedstoneLamp; - mappings[235] = ItemType.SandstoneStairs; - mappings[236] = ItemType.EmeraldOre; - mappings[237] = ItemType.EnderChest; - mappings[238] = ItemType.TripwireHook; - mappings[239] = ItemType.EmeraldBlock; - mappings[240] = ItemType.SpruceStairs; - mappings[241] = ItemType.BirchStairs; - mappings[242] = ItemType.JungleStairs; - mappings[243] = ItemType.CommandBlock; - mappings[244] = ItemType.Beacon; - mappings[245] = ItemType.CobblestoneWall; - mappings[246] = ItemType.MossyCobblestoneWall; - mappings[247] = ItemType.BrickWall; - mappings[248] = ItemType.PrismarineWall; - mappings[249] = ItemType.RedSandstoneWall; - mappings[250] = ItemType.MossyStoneBrickWall; - mappings[251] = ItemType.GraniteWall; - mappings[252] = ItemType.StoneBrickWall; - mappings[253] = ItemType.NetherBrickWall; - mappings[254] = ItemType.AndesiteWall; - mappings[255] = ItemType.RedNetherBrickWall; - mappings[256] = ItemType.SandstoneWall; - mappings[257] = ItemType.EndStoneBrickWall; - mappings[258] = ItemType.DioriteWall; - mappings[259] = ItemType.OakButton; - mappings[260] = ItemType.SpruceButton; - mappings[261] = ItemType.BirchButton; - mappings[262] = ItemType.JungleButton; - mappings[263] = ItemType.AcaciaButton; - mappings[264] = ItemType.DarkOakButton; - mappings[265] = ItemType.Anvil; - mappings[266] = ItemType.ChippedAnvil; - mappings[267] = ItemType.DamagedAnvil; - mappings[268] = ItemType.TrappedChest; - mappings[269] = ItemType.LightWeightedPressurePlate; - mappings[270] = ItemType.HeavyWeightedPressurePlate; - mappings[271] = ItemType.DaylightDetector; - mappings[272] = ItemType.RedstoneBlock; - mappings[273] = ItemType.NetherQuartzOre; - mappings[274] = ItemType.Hopper; - mappings[275] = ItemType.ChiseledQuartzBlock; - mappings[276] = ItemType.QuartzBlock; - mappings[277] = ItemType.QuartzPillar; - mappings[278] = ItemType.QuartzStairs; - mappings[279] = ItemType.ActivatorRail; - mappings[280] = ItemType.Dropper; - mappings[281] = ItemType.WhiteTerracotta; - mappings[282] = ItemType.OrangeTerracotta; - mappings[283] = ItemType.MagentaTerracotta; - mappings[284] = ItemType.LightBlueTerracotta; - mappings[285] = ItemType.YellowTerracotta; - mappings[286] = ItemType.LimeTerracotta; - mappings[287] = ItemType.PinkTerracotta; - mappings[288] = ItemType.GrayTerracotta; - mappings[289] = ItemType.LightGrayTerracotta; - mappings[290] = ItemType.CyanTerracotta; - mappings[291] = ItemType.PurpleTerracotta; - mappings[292] = ItemType.BlueTerracotta; - mappings[293] = ItemType.BrownTerracotta; - mappings[294] = ItemType.GreenTerracotta; - mappings[295] = ItemType.RedTerracotta; - mappings[296] = ItemType.BlackTerracotta; - mappings[297] = ItemType.Barrier; - mappings[298] = ItemType.IronTrapdoor; - mappings[299] = ItemType.HayBlock; - mappings[300] = ItemType.WhiteCarpet; - mappings[301] = ItemType.OrangeCarpet; - mappings[302] = ItemType.MagentaCarpet; - mappings[303] = ItemType.LightBlueCarpet; - mappings[304] = ItemType.YellowCarpet; - mappings[305] = ItemType.LimeCarpet; - mappings[306] = ItemType.PinkCarpet; - mappings[307] = ItemType.GrayCarpet; - mappings[308] = ItemType.LightGrayCarpet; - mappings[309] = ItemType.CyanCarpet; - mappings[310] = ItemType.PurpleCarpet; - mappings[311] = ItemType.BlueCarpet; - mappings[312] = ItemType.BrownCarpet; - mappings[313] = ItemType.GreenCarpet; - mappings[314] = ItemType.RedCarpet; - mappings[315] = ItemType.BlackCarpet; - mappings[316] = ItemType.Terracotta; - mappings[317] = ItemType.CoalBlock; - mappings[318] = ItemType.PackedIce; - mappings[319] = ItemType.AcaciaStairs; - mappings[320] = ItemType.DarkOakStairs; - mappings[321] = ItemType.SlimeBlock; - mappings[322] = ItemType.DirtPath; - mappings[323] = ItemType.Sunflower; - mappings[324] = ItemType.Lilac; - mappings[325] = ItemType.RoseBush; - mappings[326] = ItemType.Peony; - mappings[327] = ItemType.TallGrass; - mappings[328] = ItemType.LargeFern; - mappings[329] = ItemType.WhiteStainedGlass; - mappings[330] = ItemType.OrangeStainedGlass; - mappings[331] = ItemType.MagentaStainedGlass; - mappings[332] = ItemType.LightBlueStainedGlass; - mappings[333] = ItemType.YellowStainedGlass; - mappings[334] = ItemType.LimeStainedGlass; - mappings[335] = ItemType.PinkStainedGlass; - mappings[336] = ItemType.GrayStainedGlass; - mappings[337] = ItemType.LightGrayStainedGlass; - mappings[338] = ItemType.CyanStainedGlass; - mappings[339] = ItemType.PurpleStainedGlass; - mappings[340] = ItemType.BlueStainedGlass; - mappings[341] = ItemType.BrownStainedGlass; - mappings[342] = ItemType.GreenStainedGlass; - mappings[343] = ItemType.RedStainedGlass; - mappings[344] = ItemType.BlackStainedGlass; - mappings[345] = ItemType.WhiteStainedGlassPane; - mappings[346] = ItemType.OrangeStainedGlassPane; - mappings[347] = ItemType.MagentaStainedGlassPane; - mappings[348] = ItemType.LightBlueStainedGlassPane; - mappings[349] = ItemType.YellowStainedGlassPane; - mappings[350] = ItemType.LimeStainedGlassPane; - mappings[351] = ItemType.PinkStainedGlassPane; - mappings[352] = ItemType.GrayStainedGlassPane; - mappings[353] = ItemType.LightGrayStainedGlassPane; - mappings[354] = ItemType.CyanStainedGlassPane; - mappings[355] = ItemType.PurpleStainedGlassPane; - mappings[356] = ItemType.BlueStainedGlassPane; - mappings[357] = ItemType.BrownStainedGlassPane; - mappings[358] = ItemType.GreenStainedGlassPane; - mappings[359] = ItemType.RedStainedGlassPane; - mappings[360] = ItemType.BlackStainedGlassPane; - mappings[361] = ItemType.Prismarine; - mappings[362] = ItemType.PrismarineBricks; - mappings[363] = ItemType.DarkPrismarine; - mappings[364] = ItemType.PrismarineStairs; - mappings[365] = ItemType.PrismarineBrickStairs; - mappings[366] = ItemType.DarkPrismarineStairs; - mappings[367] = ItemType.SeaLantern; - mappings[368] = ItemType.RedSandstone; - mappings[369] = ItemType.ChiseledRedSandstone; - mappings[370] = ItemType.CutRedSandstone; - mappings[371] = ItemType.RedSandstoneStairs; - mappings[372] = ItemType.RepeatingCommandBlock; - mappings[373] = ItemType.ChainCommandBlock; - mappings[374] = ItemType.MagmaBlock; - mappings[375] = ItemType.NetherWartBlock; - mappings[376] = ItemType.RedNetherBricks; - mappings[377] = ItemType.BoneBlock; - mappings[378] = ItemType.StructureVoid; - mappings[379] = ItemType.Observer; - mappings[380] = ItemType.ShulkerBox; - mappings[381] = ItemType.WhiteShulkerBox; - mappings[382] = ItemType.OrangeShulkerBox; - mappings[383] = ItemType.MagentaShulkerBox; - mappings[384] = ItemType.LightBlueShulkerBox; - mappings[385] = ItemType.YellowShulkerBox; - mappings[386] = ItemType.LimeShulkerBox; - mappings[387] = ItemType.PinkShulkerBox; - mappings[388] = ItemType.GrayShulkerBox; - mappings[389] = ItemType.LightGrayShulkerBox; - mappings[390] = ItemType.CyanShulkerBox; - mappings[391] = ItemType.PurpleShulkerBox; - mappings[392] = ItemType.BlueShulkerBox; - mappings[393] = ItemType.BrownShulkerBox; - mappings[394] = ItemType.GreenShulkerBox; - mappings[395] = ItemType.RedShulkerBox; - mappings[396] = ItemType.BlackShulkerBox; - mappings[397] = ItemType.WhiteGlazedTerracotta; - mappings[398] = ItemType.OrangeGlazedTerracotta; - mappings[399] = ItemType.MagentaGlazedTerracotta; - mappings[400] = ItemType.LightBlueGlazedTerracotta; - mappings[401] = ItemType.YellowGlazedTerracotta; - mappings[402] = ItemType.LimeGlazedTerracotta; - mappings[403] = ItemType.PinkGlazedTerracotta; - mappings[404] = ItemType.GrayGlazedTerracotta; - mappings[405] = ItemType.LightGrayGlazedTerracotta; - mappings[406] = ItemType.CyanGlazedTerracotta; - mappings[407] = ItemType.PurpleGlazedTerracotta; - mappings[408] = ItemType.BlueGlazedTerracotta; - mappings[409] = ItemType.BrownGlazedTerracotta; - mappings[410] = ItemType.GreenGlazedTerracotta; - mappings[411] = ItemType.RedGlazedTerracotta; - mappings[412] = ItemType.BlackGlazedTerracotta; - mappings[413] = ItemType.WhiteConcrete; - mappings[414] = ItemType.OrangeConcrete; - mappings[415] = ItemType.MagentaConcrete; - mappings[416] = ItemType.LightBlueConcrete; - mappings[417] = ItemType.YellowConcrete; - mappings[418] = ItemType.LimeConcrete; - mappings[419] = ItemType.PinkConcrete; - mappings[420] = ItemType.GrayConcrete; - mappings[421] = ItemType.LightGrayConcrete; - mappings[422] = ItemType.CyanConcrete; - mappings[423] = ItemType.PurpleConcrete; - mappings[424] = ItemType.BlueConcrete; - mappings[425] = ItemType.BrownConcrete; - mappings[426] = ItemType.GreenConcrete; - mappings[427] = ItemType.RedConcrete; - mappings[428] = ItemType.BlackConcrete; - mappings[429] = ItemType.WhiteConcretePowder; - mappings[430] = ItemType.OrangeConcretePowder; - mappings[431] = ItemType.MagentaConcretePowder; - mappings[432] = ItemType.LightBlueConcretePowder; - mappings[433] = ItemType.YellowConcretePowder; - mappings[434] = ItemType.LimeConcretePowder; - mappings[435] = ItemType.PinkConcretePowder; - mappings[436] = ItemType.GrayConcretePowder; - mappings[437] = ItemType.LightGrayConcretePowder; - mappings[438] = ItemType.CyanConcretePowder; - mappings[439] = ItemType.PurpleConcretePowder; - mappings[440] = ItemType.BlueConcretePowder; - mappings[441] = ItemType.BrownConcretePowder; - mappings[442] = ItemType.GreenConcretePowder; - mappings[443] = ItemType.RedConcretePowder; - mappings[444] = ItemType.BlackConcretePowder; - mappings[445] = ItemType.TurtleEgg; - mappings[446] = ItemType.DeadTubeCoralBlock; - mappings[447] = ItemType.DeadBrainCoralBlock; - mappings[448] = ItemType.DeadBubbleCoralBlock; - mappings[449] = ItemType.DeadFireCoralBlock; - mappings[450] = ItemType.DeadHornCoralBlock; - mappings[451] = ItemType.TubeCoralBlock; - mappings[452] = ItemType.BrainCoralBlock; - mappings[453] = ItemType.BubbleCoralBlock; - mappings[454] = ItemType.FireCoralBlock; - mappings[455] = ItemType.HornCoralBlock; - mappings[456] = ItemType.TubeCoral; - mappings[457] = ItemType.BrainCoral; - mappings[458] = ItemType.BubbleCoral; - mappings[459] = ItemType.FireCoral; - mappings[460] = ItemType.HornCoral; - mappings[461] = ItemType.DeadBrainCoral; - mappings[462] = ItemType.DeadBubbleCoral; - mappings[463] = ItemType.DeadFireCoral; - mappings[464] = ItemType.DeadHornCoral; - mappings[465] = ItemType.DeadTubeCoral; - mappings[466] = ItemType.TubeCoralFan; - mappings[467] = ItemType.BrainCoralFan; - mappings[468] = ItemType.BubbleCoralFan; - mappings[469] = ItemType.FireCoralFan; - mappings[470] = ItemType.HornCoralFan; - mappings[471] = ItemType.DeadTubeCoralFan; - mappings[472] = ItemType.DeadBrainCoralFan; - mappings[473] = ItemType.DeadBubbleCoralFan; - mappings[474] = ItemType.DeadFireCoralFan; - mappings[475] = ItemType.DeadHornCoralFan; - mappings[476] = ItemType.BlueIce; - mappings[477] = ItemType.Conduit; - mappings[478] = ItemType.PolishedGraniteStairs; - mappings[479] = ItemType.SmoothRedSandstoneStairs; - mappings[480] = ItemType.MossyStoneBrickStairs; - mappings[481] = ItemType.PolishedDioriteStairs; - mappings[482] = ItemType.MossyCobblestoneStairs; - mappings[483] = ItemType.EndStoneBrickStairs; - mappings[484] = ItemType.StoneStairs; - mappings[485] = ItemType.SmoothSandstoneStairs; - mappings[486] = ItemType.SmoothQuartzStairs; - mappings[487] = ItemType.GraniteStairs; - mappings[488] = ItemType.AndesiteStairs; - mappings[489] = ItemType.RedNetherBrickStairs; - mappings[490] = ItemType.PolishedAndesiteStairs; - mappings[491] = ItemType.DioriteStairs; - mappings[492] = ItemType.PolishedGraniteSlab; - mappings[493] = ItemType.SmoothRedSandstoneSlab; - mappings[494] = ItemType.MossyStoneBrickSlab; - mappings[495] = ItemType.PolishedDioriteSlab; - mappings[496] = ItemType.MossyCobblestoneSlab; - mappings[497] = ItemType.EndStoneBrickSlab; - mappings[498] = ItemType.SmoothSandstoneSlab; - mappings[499] = ItemType.SmoothQuartzSlab; - mappings[500] = ItemType.GraniteSlab; - mappings[501] = ItemType.AndesiteSlab; - mappings[502] = ItemType.RedNetherBrickSlab; - mappings[503] = ItemType.PolishedAndesiteSlab; - mappings[504] = ItemType.DioriteSlab; - mappings[505] = ItemType.Scaffolding; - mappings[506] = ItemType.IronDoor; - mappings[507] = ItemType.OakDoor; - mappings[508] = ItemType.SpruceDoor; - mappings[509] = ItemType.BirchDoor; - mappings[510] = ItemType.JungleDoor; - mappings[511] = ItemType.AcaciaDoor; - mappings[512] = ItemType.DarkOakDoor; - mappings[513] = ItemType.Repeater; - mappings[514] = ItemType.Comparator; - mappings[515] = ItemType.StructureBlock; - mappings[516] = ItemType.Jigsaw; - mappings[517] = ItemType.Composter; - mappings[518] = ItemType.TurtleHelmet; - mappings[519] = ItemType.TurtleScute; - mappings[520] = ItemType.IronShovel; - mappings[521] = ItemType.IronPickaxe; - mappings[522] = ItemType.IronAxe; - mappings[523] = ItemType.FlintAndSteel; - mappings[524] = ItemType.Apple; - mappings[525] = ItemType.Bow; - mappings[526] = ItemType.Arrow; - mappings[527] = ItemType.Coal; - mappings[528] = ItemType.Charcoal; - mappings[529] = ItemType.Diamond; - mappings[530] = ItemType.IronIngot; - mappings[531] = ItemType.GoldIngot; - mappings[532] = ItemType.IronSword; - mappings[533] = ItemType.WoodenSword; - mappings[534] = ItemType.WoodenShovel; - mappings[535] = ItemType.WoodenPickaxe; - mappings[536] = ItemType.WoodenAxe; - mappings[537] = ItemType.StoneSword; - mappings[538] = ItemType.StoneShovel; - mappings[539] = ItemType.StonePickaxe; - mappings[540] = ItemType.StoneAxe; - mappings[541] = ItemType.DiamondSword; - mappings[542] = ItemType.DiamondShovel; - mappings[543] = ItemType.DiamondPickaxe; - mappings[544] = ItemType.DiamondAxe; - mappings[545] = ItemType.Stick; - mappings[546] = ItemType.Bowl; - mappings[547] = ItemType.MushroomStew; - mappings[548] = ItemType.GoldenSword; - mappings[549] = ItemType.GoldenShovel; - mappings[550] = ItemType.GoldenPickaxe; - mappings[551] = ItemType.GoldenAxe; - mappings[552] = ItemType.String; - mappings[553] = ItemType.Feather; - mappings[554] = ItemType.Gunpowder; - mappings[555] = ItemType.WoodenHoe; - mappings[556] = ItemType.StoneHoe; - mappings[557] = ItemType.IronHoe; - mappings[558] = ItemType.DiamondHoe; - mappings[559] = ItemType.GoldenHoe; - mappings[560] = ItemType.WheatSeeds; - mappings[561] = ItemType.Wheat; - mappings[562] = ItemType.Bread; - mappings[563] = ItemType.LeatherHelmet; - mappings[564] = ItemType.LeatherChestplate; - mappings[565] = ItemType.LeatherLeggings; - mappings[566] = ItemType.LeatherBoots; - mappings[567] = ItemType.ChainmailHelmet; - mappings[568] = ItemType.ChainmailChestplate; - mappings[569] = ItemType.ChainmailLeggings; - mappings[570] = ItemType.ChainmailBoots; - mappings[571] = ItemType.IronHelmet; - mappings[572] = ItemType.IronChestplate; - mappings[573] = ItemType.IronLeggings; - mappings[574] = ItemType.IronBoots; - mappings[575] = ItemType.DiamondHelmet; - mappings[576] = ItemType.DiamondChestplate; - mappings[577] = ItemType.DiamondLeggings; - mappings[578] = ItemType.DiamondBoots; - mappings[579] = ItemType.GoldenHelmet; - mappings[580] = ItemType.GoldenChestplate; - mappings[581] = ItemType.GoldenLeggings; - mappings[582] = ItemType.GoldenBoots; - mappings[583] = ItemType.Flint; - mappings[584] = ItemType.Porkchop; - mappings[585] = ItemType.CookedPorkchop; - mappings[586] = ItemType.Painting; - mappings[587] = ItemType.GoldenApple; - mappings[588] = ItemType.EnchantedGoldenApple; - mappings[589] = ItemType.OakSign; - mappings[590] = ItemType.SpruceSign; - mappings[591] = ItemType.BirchSign; - mappings[592] = ItemType.JungleSign; - mappings[593] = ItemType.AcaciaSign; - mappings[594] = ItemType.DarkOakSign; - mappings[595] = ItemType.Bucket; - mappings[596] = ItemType.WaterBucket; - mappings[597] = ItemType.LavaBucket; - mappings[598] = ItemType.Minecart; - mappings[599] = ItemType.Saddle; - mappings[600] = ItemType.Redstone; - mappings[601] = ItemType.Snowball; - mappings[602] = ItemType.OakBoat; - mappings[603] = ItemType.Leather; - mappings[604] = ItemType.MilkBucket; - mappings[605] = ItemType.PufferfishBucket; - mappings[606] = ItemType.SalmonBucket; - mappings[607] = ItemType.CodBucket; - mappings[608] = ItemType.TropicalFishBucket; - mappings[609] = ItemType.Brick; - mappings[610] = ItemType.ClayBall; - mappings[611] = ItemType.SugarCane; - mappings[612] = ItemType.Kelp; - mappings[613] = ItemType.DriedKelpBlock; - mappings[614] = ItemType.Bamboo; - mappings[615] = ItemType.Paper; - mappings[616] = ItemType.Book; - mappings[617] = ItemType.SlimeBall; - mappings[618] = ItemType.ChestMinecart; - mappings[619] = ItemType.FurnaceMinecart; - mappings[620] = ItemType.Egg; - mappings[621] = ItemType.Compass; - mappings[622] = ItemType.FishingRod; - mappings[623] = ItemType.Clock; - mappings[624] = ItemType.GlowstoneDust; - mappings[625] = ItemType.Cod; - mappings[626] = ItemType.Salmon; - mappings[627] = ItemType.TropicalFish; - mappings[628] = ItemType.Pufferfish; - mappings[629] = ItemType.CookedCod; - mappings[630] = ItemType.CookedSalmon; - mappings[631] = ItemType.InkSac; - mappings[632] = ItemType.RedDye; - mappings[633] = ItemType.GreenDye; - mappings[634] = ItemType.CocoaBeans; - mappings[635] = ItemType.LapisLazuli; - mappings[636] = ItemType.PurpleDye; - mappings[637] = ItemType.CyanDye; - mappings[638] = ItemType.LightGrayDye; - mappings[639] = ItemType.GrayDye; - mappings[640] = ItemType.PinkDye; - mappings[641] = ItemType.LimeDye; - mappings[642] = ItemType.YellowDye; - mappings[643] = ItemType.LightBlueDye; - mappings[644] = ItemType.MagentaDye; - mappings[645] = ItemType.OrangeDye; - mappings[646] = ItemType.BoneMeal; - mappings[647] = ItemType.BlueDye; - mappings[648] = ItemType.BrownDye; - mappings[649] = ItemType.BlackDye; - mappings[650] = ItemType.WhiteDye; - mappings[651] = ItemType.Bone; - mappings[652] = ItemType.Sugar; - mappings[653] = ItemType.Cake; - mappings[654] = ItemType.WhiteBed; - mappings[655] = ItemType.OrangeBed; - mappings[656] = ItemType.MagentaBed; - mappings[657] = ItemType.LightBlueBed; - mappings[658] = ItemType.YellowBed; - mappings[659] = ItemType.LimeBed; - mappings[660] = ItemType.PinkBed; - mappings[661] = ItemType.GrayBed; - mappings[662] = ItemType.LightGrayBed; - mappings[663] = ItemType.CyanBed; - mappings[664] = ItemType.PurpleBed; - mappings[665] = ItemType.BlueBed; - mappings[666] = ItemType.BrownBed; - mappings[667] = ItemType.GreenBed; - mappings[668] = ItemType.RedBed; - mappings[669] = ItemType.BlackBed; - mappings[670] = ItemType.Cookie; - mappings[671] = ItemType.FilledMap; - mappings[672] = ItemType.Shears; - mappings[673] = ItemType.MelonSlice; - mappings[674] = ItemType.DriedKelp; - mappings[675] = ItemType.PumpkinSeeds; - mappings[676] = ItemType.MelonSeeds; - mappings[677] = ItemType.Beef; - mappings[678] = ItemType.CookedBeef; - mappings[679] = ItemType.Chicken; - mappings[680] = ItemType.CookedChicken; - mappings[681] = ItemType.RottenFlesh; - mappings[682] = ItemType.EnderPearl; - mappings[683] = ItemType.BlazeRod; - mappings[684] = ItemType.GhastTear; - mappings[685] = ItemType.GoldNugget; - mappings[686] = ItemType.NetherWart; - mappings[687] = ItemType.Potion; - mappings[688] = ItemType.GlassBottle; - mappings[689] = ItemType.SpiderEye; - mappings[690] = ItemType.FermentedSpiderEye; - mappings[691] = ItemType.BlazePowder; - mappings[692] = ItemType.MagmaCream; - mappings[693] = ItemType.BrewingStand; - mappings[694] = ItemType.Cauldron; - mappings[695] = ItemType.EnderEye; - mappings[696] = ItemType.GlisteringMelonSlice; - mappings[697] = ItemType.BatSpawnEgg; - mappings[698] = ItemType.BeeSpawnEgg; - mappings[699] = ItemType.BlazeSpawnEgg; - mappings[700] = ItemType.CatSpawnEgg; - mappings[701] = ItemType.CaveSpiderSpawnEgg; - mappings[702] = ItemType.ChickenSpawnEgg; - mappings[703] = ItemType.CodSpawnEgg; - mappings[704] = ItemType.CowSpawnEgg; - mappings[705] = ItemType.CreeperSpawnEgg; - mappings[706] = ItemType.DolphinSpawnEgg; - mappings[707] = ItemType.DonkeySpawnEgg; - mappings[708] = ItemType.DrownedSpawnEgg; - mappings[709] = ItemType.ElderGuardianSpawnEgg; - mappings[710] = ItemType.EndermanSpawnEgg; - mappings[711] = ItemType.EndermiteSpawnEgg; - mappings[712] = ItemType.EvokerSpawnEgg; - mappings[713] = ItemType.FoxSpawnEgg; - mappings[714] = ItemType.GhastSpawnEgg; - mappings[715] = ItemType.GuardianSpawnEgg; - mappings[716] = ItemType.HorseSpawnEgg; - mappings[717] = ItemType.HuskSpawnEgg; - mappings[718] = ItemType.LlamaSpawnEgg; - mappings[719] = ItemType.MagmaCubeSpawnEgg; - mappings[720] = ItemType.MooshroomSpawnEgg; - mappings[721] = ItemType.MuleSpawnEgg; - mappings[722] = ItemType.OcelotSpawnEgg; - mappings[723] = ItemType.PandaSpawnEgg; - mappings[724] = ItemType.ParrotSpawnEgg; - mappings[725] = ItemType.PhantomSpawnEgg; - mappings[726] = ItemType.PigSpawnEgg; - mappings[727] = ItemType.PillagerSpawnEgg; - mappings[728] = ItemType.PolarBearSpawnEgg; - mappings[729] = ItemType.PufferfishSpawnEgg; - mappings[730] = ItemType.RabbitSpawnEgg; - mappings[731] = ItemType.RavagerSpawnEgg; - mappings[732] = ItemType.SalmonSpawnEgg; - mappings[733] = ItemType.SheepSpawnEgg; - mappings[734] = ItemType.ShulkerSpawnEgg; - mappings[735] = ItemType.SilverfishSpawnEgg; - mappings[736] = ItemType.SkeletonSpawnEgg; - mappings[737] = ItemType.SkeletonHorseSpawnEgg; - mappings[738] = ItemType.SlimeSpawnEgg; - mappings[739] = ItemType.SpiderSpawnEgg; - mappings[740] = ItemType.SquidSpawnEgg; - mappings[741] = ItemType.StraySpawnEgg; - mappings[742] = ItemType.TraderLlamaSpawnEgg; - mappings[743] = ItemType.TropicalFishSpawnEgg; - mappings[744] = ItemType.TurtleSpawnEgg; - mappings[745] = ItemType.VexSpawnEgg; - mappings[746] = ItemType.VillagerSpawnEgg; - mappings[747] = ItemType.VindicatorSpawnEgg; - mappings[748] = ItemType.WanderingTraderSpawnEgg; - mappings[749] = ItemType.WitchSpawnEgg; - mappings[750] = ItemType.WitherSkeletonSpawnEgg; - mappings[751] = ItemType.WolfSpawnEgg; - mappings[752] = ItemType.ZombieSpawnEgg; - mappings[753] = ItemType.ZombieHorseSpawnEgg; - mappings[754] = ItemType.ZombifiedPiglinSpawnEgg; - mappings[755] = ItemType.ZombieVillagerSpawnEgg; - mappings[756] = ItemType.ExperienceBottle; - mappings[757] = ItemType.FireCharge; - mappings[758] = ItemType.WritableBook; - mappings[759] = ItemType.WrittenBook; - mappings[760] = ItemType.Emerald; - mappings[761] = ItemType.ItemFrame; - mappings[762] = ItemType.FlowerPot; - mappings[763] = ItemType.Carrot; - mappings[764] = ItemType.Potato; - mappings[765] = ItemType.BakedPotato; - mappings[766] = ItemType.PoisonousPotato; - mappings[767] = ItemType.Map; - mappings[768] = ItemType.GoldenCarrot; - mappings[769] = ItemType.SkeletonSkull; - mappings[770] = ItemType.WitherSkeletonSkull; - mappings[771] = ItemType.PlayerHead; - mappings[772] = ItemType.ZombieHead; - mappings[773] = ItemType.CreeperHead; - mappings[774] = ItemType.DragonHead; - mappings[775] = ItemType.CarrotOnAStick; - mappings[776] = ItemType.NetherStar; - mappings[777] = ItemType.PumpkinPie; - mappings[778] = ItemType.FireworkRocket; - mappings[779] = ItemType.FireworkStar; - mappings[780] = ItemType.EnchantedBook; - mappings[781] = ItemType.NetherBrick; - mappings[782] = ItemType.Quartz; - mappings[783] = ItemType.TntMinecart; - mappings[784] = ItemType.HopperMinecart; - mappings[785] = ItemType.PrismarineShard; - mappings[786] = ItemType.PrismarineCrystals; - mappings[787] = ItemType.Rabbit; - mappings[788] = ItemType.CookedRabbit; - mappings[789] = ItemType.RabbitStew; - mappings[790] = ItemType.RabbitFoot; - mappings[791] = ItemType.RabbitHide; - mappings[792] = ItemType.ArmorStand; - mappings[793] = ItemType.IronHorseArmor; - mappings[794] = ItemType.GoldenHorseArmor; - mappings[795] = ItemType.DiamondHorseArmor; - mappings[796] = ItemType.LeatherHorseArmor; - mappings[797] = ItemType.Lead; - mappings[798] = ItemType.NameTag; - mappings[799] = ItemType.CommandBlockMinecart; - mappings[800] = ItemType.Mutton; - mappings[801] = ItemType.CookedMutton; - mappings[802] = ItemType.WhiteBanner; - mappings[803] = ItemType.OrangeBanner; - mappings[804] = ItemType.MagentaBanner; - mappings[805] = ItemType.LightBlueBanner; - mappings[806] = ItemType.YellowBanner; - mappings[807] = ItemType.LimeBanner; - mappings[808] = ItemType.PinkBanner; - mappings[809] = ItemType.GrayBanner; - mappings[810] = ItemType.LightGrayBanner; - mappings[811] = ItemType.CyanBanner; - mappings[812] = ItemType.PurpleBanner; - mappings[813] = ItemType.BlueBanner; - mappings[814] = ItemType.BrownBanner; - mappings[815] = ItemType.GreenBanner; - mappings[816] = ItemType.RedBanner; - mappings[817] = ItemType.BlackBanner; - mappings[818] = ItemType.EndCrystal; - mappings[819] = ItemType.ChorusFruit; - mappings[820] = ItemType.PoppedChorusFruit; - mappings[821] = ItemType.Beetroot; - mappings[822] = ItemType.BeetrootSeeds; - mappings[823] = ItemType.BeetrootSoup; - mappings[824] = ItemType.DragonBreath; - mappings[825] = ItemType.SplashPotion; - mappings[826] = ItemType.SpectralArrow; - mappings[827] = ItemType.TippedArrow; - mappings[828] = ItemType.LingeringPotion; - mappings[829] = ItemType.Shield; - mappings[830] = ItemType.Elytra; - mappings[831] = ItemType.SpruceBoat; - mappings[832] = ItemType.BirchBoat; - mappings[833] = ItemType.JungleBoat; - mappings[834] = ItemType.AcaciaBoat; - mappings[835] = ItemType.DarkOakBoat; - mappings[836] = ItemType.TotemOfUndying; - mappings[837] = ItemType.ShulkerShell; - mappings[838] = ItemType.IronNugget; - mappings[839] = ItemType.KnowledgeBook; - mappings[840] = ItemType.DebugStick; - mappings[841] = ItemType.MusicDisc13; - mappings[842] = ItemType.MusicDiscCat; - mappings[843] = ItemType.MusicDiscBlocks; - mappings[844] = ItemType.MusicDiscChirp; - mappings[845] = ItemType.MusicDiscFar; - mappings[846] = ItemType.MusicDiscMall; - mappings[847] = ItemType.MusicDiscMellohi; - mappings[848] = ItemType.MusicDiscStal; - mappings[849] = ItemType.MusicDiscStrad; - mappings[850] = ItemType.MusicDiscWard; - mappings[851] = ItemType.MusicDisc11; - mappings[852] = ItemType.MusicDiscWait; - mappings[853] = ItemType.Trident; - mappings[854] = ItemType.PhantomMembrane; - mappings[855] = ItemType.NautilusShell; - mappings[856] = ItemType.HeartOfTheSea; - mappings[857] = ItemType.Crossbow; - mappings[858] = ItemType.SuspiciousStew; - mappings[859] = ItemType.Loom; - mappings[860] = ItemType.FlowerBannerPattern; - mappings[861] = ItemType.CreeperBannerPattern; - mappings[862] = ItemType.SkullBannerPattern; - mappings[863] = ItemType.MojangBannerPattern; - mappings[864] = ItemType.GlobeBannerPattern; - mappings[865] = ItemType.Barrel; - mappings[866] = ItemType.Smoker; - mappings[867] = ItemType.BlastFurnace; - mappings[868] = ItemType.CartographyTable; - mappings[869] = ItemType.FletchingTable; - mappings[870] = ItemType.Grindstone; - mappings[871] = ItemType.Lectern; - mappings[872] = ItemType.SmithingTable; - mappings[873] = ItemType.Stonecutter; - mappings[874] = ItemType.Bell; - mappings[875] = ItemType.Lantern; - mappings[876] = ItemType.SweetBerries; - mappings[877] = ItemType.Campfire; - mappings[878] = ItemType.Honeycomb; - mappings[879] = ItemType.BeeNest; - mappings[880] = ItemType.Beehive; - mappings[881] = ItemType.HoneyBottle; - mappings[882] = ItemType.HoneyBlock; - mappings[883] = ItemType.HoneycombBlock; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1161.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette1161.cs deleted file mode 100644 index 4bdb9006af..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1161.cs +++ /dev/null @@ -1,997 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - /// - /// For MC 1.16 - 1.16.1 - /// Generated by ItemPaletteGenerator.cs - /// - public class ItemPalette1161 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette1161() - { - mappings[0] = ItemType.Air; - mappings[1] = ItemType.Stone; - mappings[2] = ItemType.Granite; - mappings[3] = ItemType.PolishedGranite; - mappings[4] = ItemType.Diorite; - mappings[5] = ItemType.PolishedDiorite; - mappings[6] = ItemType.Andesite; - mappings[7] = ItemType.PolishedAndesite; - mappings[8] = ItemType.GrassBlock; - mappings[9] = ItemType.Dirt; - mappings[10] = ItemType.CoarseDirt; - mappings[11] = ItemType.Podzol; - mappings[12] = ItemType.CrimsonNylium; - mappings[13] = ItemType.WarpedNylium; - mappings[14] = ItemType.Cobblestone; - mappings[15] = ItemType.OakPlanks; - mappings[16] = ItemType.SprucePlanks; - mappings[17] = ItemType.BirchPlanks; - mappings[18] = ItemType.JunglePlanks; - mappings[19] = ItemType.AcaciaPlanks; - mappings[20] = ItemType.DarkOakPlanks; - mappings[21] = ItemType.CrimsonPlanks; - mappings[22] = ItemType.WarpedPlanks; - mappings[23] = ItemType.OakSapling; - mappings[24] = ItemType.SpruceSapling; - mappings[25] = ItemType.BirchSapling; - mappings[26] = ItemType.JungleSapling; - mappings[27] = ItemType.AcaciaSapling; - mappings[28] = ItemType.DarkOakSapling; - mappings[29] = ItemType.Bedrock; - mappings[30] = ItemType.Sand; - mappings[31] = ItemType.RedSand; - mappings[32] = ItemType.Gravel; - mappings[33] = ItemType.GoldOre; - mappings[34] = ItemType.IronOre; - mappings[35] = ItemType.CoalOre; - mappings[36] = ItemType.NetherGoldOre; - mappings[37] = ItemType.OakLog; - mappings[38] = ItemType.SpruceLog; - mappings[39] = ItemType.BirchLog; - mappings[40] = ItemType.JungleLog; - mappings[41] = ItemType.AcaciaLog; - mappings[42] = ItemType.DarkOakLog; - mappings[43] = ItemType.CrimsonStem; - mappings[44] = ItemType.WarpedStem; - mappings[45] = ItemType.StrippedOakLog; - mappings[46] = ItemType.StrippedSpruceLog; - mappings[47] = ItemType.StrippedBirchLog; - mappings[48] = ItemType.StrippedJungleLog; - mappings[49] = ItemType.StrippedAcaciaLog; - mappings[50] = ItemType.StrippedDarkOakLog; - mappings[51] = ItemType.StrippedCrimsonStem; - mappings[52] = ItemType.StrippedWarpedStem; - mappings[53] = ItemType.StrippedOakWood; - mappings[54] = ItemType.StrippedSpruceWood; - mappings[55] = ItemType.StrippedBirchWood; - mappings[56] = ItemType.StrippedJungleWood; - mappings[57] = ItemType.StrippedAcaciaWood; - mappings[58] = ItemType.StrippedDarkOakWood; - mappings[59] = ItemType.StrippedCrimsonHyphae; - mappings[60] = ItemType.StrippedWarpedHyphae; - mappings[61] = ItemType.OakWood; - mappings[62] = ItemType.SpruceWood; - mappings[63] = ItemType.BirchWood; - mappings[64] = ItemType.JungleWood; - mappings[65] = ItemType.AcaciaWood; - mappings[66] = ItemType.DarkOakWood; - mappings[67] = ItemType.CrimsonHyphae; - mappings[68] = ItemType.WarpedHyphae; - mappings[69] = ItemType.OakLeaves; - mappings[70] = ItemType.SpruceLeaves; - mappings[71] = ItemType.BirchLeaves; - mappings[72] = ItemType.JungleLeaves; - mappings[73] = ItemType.AcaciaLeaves; - mappings[74] = ItemType.DarkOakLeaves; - mappings[75] = ItemType.Sponge; - mappings[76] = ItemType.WetSponge; - mappings[77] = ItemType.Glass; - mappings[78] = ItemType.LapisOre; - mappings[79] = ItemType.LapisBlock; - mappings[80] = ItemType.Dispenser; - mappings[81] = ItemType.Sandstone; - mappings[82] = ItemType.ChiseledSandstone; - mappings[83] = ItemType.CutSandstone; - mappings[84] = ItemType.NoteBlock; - mappings[85] = ItemType.PoweredRail; - mappings[86] = ItemType.DetectorRail; - mappings[87] = ItemType.StickyPiston; - mappings[88] = ItemType.Cobweb; - mappings[89] = ItemType.ShortGrass; - mappings[90] = ItemType.Fern; - mappings[91] = ItemType.DeadBush; - mappings[92] = ItemType.Seagrass; - mappings[93] = ItemType.SeaPickle; - mappings[94] = ItemType.Piston; - mappings[95] = ItemType.WhiteWool; - mappings[96] = ItemType.OrangeWool; - mappings[97] = ItemType.MagentaWool; - mappings[98] = ItemType.LightBlueWool; - mappings[99] = ItemType.YellowWool; - mappings[100] = ItemType.LimeWool; - mappings[101] = ItemType.PinkWool; - mappings[102] = ItemType.GrayWool; - mappings[103] = ItemType.LightGrayWool; - mappings[104] = ItemType.CyanWool; - mappings[105] = ItemType.PurpleWool; - mappings[106] = ItemType.BlueWool; - mappings[107] = ItemType.BrownWool; - mappings[108] = ItemType.GreenWool; - mappings[109] = ItemType.RedWool; - mappings[110] = ItemType.BlackWool; - mappings[111] = ItemType.Dandelion; - mappings[112] = ItemType.Poppy; - mappings[113] = ItemType.BlueOrchid; - mappings[114] = ItemType.Allium; - mappings[115] = ItemType.AzureBluet; - mappings[116] = ItemType.RedTulip; - mappings[117] = ItemType.OrangeTulip; - mappings[118] = ItemType.WhiteTulip; - mappings[119] = ItemType.PinkTulip; - mappings[120] = ItemType.OxeyeDaisy; - mappings[121] = ItemType.Cornflower; - mappings[122] = ItemType.LilyOfTheValley; - mappings[123] = ItemType.WitherRose; - mappings[124] = ItemType.BrownMushroom; - mappings[125] = ItemType.RedMushroom; - mappings[126] = ItemType.CrimsonFungus; - mappings[127] = ItemType.WarpedFungus; - mappings[128] = ItemType.CrimsonRoots; - mappings[129] = ItemType.WarpedRoots; - mappings[130] = ItemType.NetherSprouts; - mappings[131] = ItemType.WeepingVines; - mappings[132] = ItemType.TwistingVines; - mappings[133] = ItemType.SugarCane; - mappings[134] = ItemType.Kelp; - mappings[135] = ItemType.Bamboo; - mappings[136] = ItemType.GoldBlock; - mappings[137] = ItemType.IronBlock; - mappings[138] = ItemType.OakSlab; - mappings[139] = ItemType.SpruceSlab; - mappings[140] = ItemType.BirchSlab; - mappings[141] = ItemType.JungleSlab; - mappings[142] = ItemType.AcaciaSlab; - mappings[143] = ItemType.DarkOakSlab; - mappings[144] = ItemType.CrimsonSlab; - mappings[145] = ItemType.WarpedSlab; - mappings[146] = ItemType.StoneSlab; - mappings[147] = ItemType.SmoothStoneSlab; - mappings[148] = ItemType.SandstoneSlab; - mappings[149] = ItemType.CutSandstoneSlab; - mappings[150] = ItemType.PetrifiedOakSlab; - mappings[151] = ItemType.CobblestoneSlab; - mappings[152] = ItemType.BrickSlab; - mappings[153] = ItemType.StoneBrickSlab; - mappings[154] = ItemType.NetherBrickSlab; - mappings[155] = ItemType.QuartzSlab; - mappings[156] = ItemType.RedSandstoneSlab; - mappings[157] = ItemType.CutRedSandstoneSlab; - mappings[158] = ItemType.PurpurSlab; - mappings[159] = ItemType.PrismarineSlab; - mappings[160] = ItemType.PrismarineBrickSlab; - mappings[161] = ItemType.DarkPrismarineSlab; - mappings[162] = ItemType.SmoothQuartz; - mappings[163] = ItemType.SmoothRedSandstone; - mappings[164] = ItemType.SmoothSandstone; - mappings[165] = ItemType.SmoothStone; - mappings[166] = ItemType.Bricks; - mappings[167] = ItemType.Tnt; - mappings[168] = ItemType.Bookshelf; - mappings[169] = ItemType.MossyCobblestone; - mappings[170] = ItemType.Obsidian; - mappings[171] = ItemType.Torch; - mappings[172] = ItemType.EndRod; - mappings[173] = ItemType.ChorusPlant; - mappings[174] = ItemType.ChorusFlower; - mappings[175] = ItemType.PurpurBlock; - mappings[176] = ItemType.PurpurPillar; - mappings[177] = ItemType.PurpurStairs; - mappings[178] = ItemType.Spawner; - mappings[179] = ItemType.OakStairs; - mappings[180] = ItemType.Chest; - mappings[181] = ItemType.DiamondOre; - mappings[182] = ItemType.DiamondBlock; - mappings[183] = ItemType.CraftingTable; - mappings[184] = ItemType.Farmland; - mappings[185] = ItemType.Furnace; - mappings[186] = ItemType.Ladder; - mappings[187] = ItemType.Rail; - mappings[188] = ItemType.CobblestoneStairs; - mappings[189] = ItemType.Lever; - mappings[190] = ItemType.StonePressurePlate; - mappings[191] = ItemType.OakPressurePlate; - mappings[192] = ItemType.SprucePressurePlate; - mappings[193] = ItemType.BirchPressurePlate; - mappings[194] = ItemType.JunglePressurePlate; - mappings[195] = ItemType.AcaciaPressurePlate; - mappings[196] = ItemType.DarkOakPressurePlate; - mappings[197] = ItemType.CrimsonPressurePlate; - mappings[198] = ItemType.WarpedPressurePlate; - mappings[199] = ItemType.PolishedBlackstonePressurePlate; - mappings[200] = ItemType.RedstoneOre; - mappings[201] = ItemType.RedstoneTorch; - mappings[202] = ItemType.Snow; - mappings[203] = ItemType.Ice; - mappings[204] = ItemType.SnowBlock; - mappings[205] = ItemType.Cactus; - mappings[206] = ItemType.Clay; - mappings[207] = ItemType.Jukebox; - mappings[208] = ItemType.OakFence; - mappings[209] = ItemType.SpruceFence; - mappings[210] = ItemType.BirchFence; - mappings[211] = ItemType.JungleFence; - mappings[212] = ItemType.AcaciaFence; - mappings[213] = ItemType.DarkOakFence; - mappings[214] = ItemType.CrimsonFence; - mappings[215] = ItemType.WarpedFence; - mappings[216] = ItemType.Pumpkin; - mappings[217] = ItemType.CarvedPumpkin; - mappings[218] = ItemType.Netherrack; - mappings[219] = ItemType.SoulSand; - mappings[220] = ItemType.SoulSoil; - mappings[221] = ItemType.Basalt; - mappings[222] = ItemType.PolishedBasalt; - mappings[223] = ItemType.SoulTorch; - mappings[224] = ItemType.Glowstone; - mappings[225] = ItemType.JackOLantern; - mappings[226] = ItemType.OakTrapdoor; - mappings[227] = ItemType.SpruceTrapdoor; - mappings[228] = ItemType.BirchTrapdoor; - mappings[229] = ItemType.JungleTrapdoor; - mappings[230] = ItemType.AcaciaTrapdoor; - mappings[231] = ItemType.DarkOakTrapdoor; - mappings[232] = ItemType.CrimsonTrapdoor; - mappings[233] = ItemType.WarpedTrapdoor; - mappings[234] = ItemType.InfestedStone; - mappings[235] = ItemType.InfestedCobblestone; - mappings[236] = ItemType.InfestedStoneBricks; - mappings[237] = ItemType.InfestedMossyStoneBricks; - mappings[238] = ItemType.InfestedCrackedStoneBricks; - mappings[239] = ItemType.InfestedChiseledStoneBricks; - mappings[240] = ItemType.StoneBricks; - mappings[241] = ItemType.MossyStoneBricks; - mappings[242] = ItemType.CrackedStoneBricks; - mappings[243] = ItemType.ChiseledStoneBricks; - mappings[244] = ItemType.BrownMushroomBlock; - mappings[245] = ItemType.RedMushroomBlock; - mappings[246] = ItemType.MushroomStem; - mappings[247] = ItemType.IronBars; - mappings[248] = ItemType.Chain; - mappings[249] = ItemType.GlassPane; - mappings[250] = ItemType.Melon; - mappings[251] = ItemType.Vine; - mappings[252] = ItemType.OakFenceGate; - mappings[253] = ItemType.SpruceFenceGate; - mappings[254] = ItemType.BirchFenceGate; - mappings[255] = ItemType.JungleFenceGate; - mappings[256] = ItemType.AcaciaFenceGate; - mappings[257] = ItemType.DarkOakFenceGate; - mappings[258] = ItemType.CrimsonFenceGate; - mappings[259] = ItemType.WarpedFenceGate; - mappings[260] = ItemType.BrickStairs; - mappings[261] = ItemType.StoneBrickStairs; - mappings[262] = ItemType.Mycelium; - mappings[263] = ItemType.LilyPad; - mappings[264] = ItemType.NetherBricks; - mappings[265] = ItemType.CrackedNetherBricks; - mappings[266] = ItemType.ChiseledNetherBricks; - mappings[267] = ItemType.NetherBrickFence; - mappings[268] = ItemType.NetherBrickStairs; - mappings[269] = ItemType.EnchantingTable; - mappings[270] = ItemType.EndPortalFrame; - mappings[271] = ItemType.EndStone; - mappings[272] = ItemType.EndStoneBricks; - mappings[273] = ItemType.DragonEgg; - mappings[274] = ItemType.RedstoneLamp; - mappings[275] = ItemType.SandstoneStairs; - mappings[276] = ItemType.EmeraldOre; - mappings[277] = ItemType.EnderChest; - mappings[278] = ItemType.TripwireHook; - mappings[279] = ItemType.EmeraldBlock; - mappings[280] = ItemType.SpruceStairs; - mappings[281] = ItemType.BirchStairs; - mappings[282] = ItemType.JungleStairs; - mappings[283] = ItemType.CrimsonStairs; - mappings[284] = ItemType.WarpedStairs; - mappings[285] = ItemType.CommandBlock; - mappings[286] = ItemType.Beacon; - mappings[287] = ItemType.CobblestoneWall; - mappings[288] = ItemType.MossyCobblestoneWall; - mappings[289] = ItemType.BrickWall; - mappings[290] = ItemType.PrismarineWall; - mappings[291] = ItemType.RedSandstoneWall; - mappings[292] = ItemType.MossyStoneBrickWall; - mappings[293] = ItemType.GraniteWall; - mappings[294] = ItemType.StoneBrickWall; - mappings[295] = ItemType.NetherBrickWall; - mappings[296] = ItemType.AndesiteWall; - mappings[297] = ItemType.RedNetherBrickWall; - mappings[298] = ItemType.SandstoneWall; - mappings[299] = ItemType.EndStoneBrickWall; - mappings[300] = ItemType.DioriteWall; - mappings[301] = ItemType.BlackstoneWall; - mappings[302] = ItemType.PolishedBlackstoneWall; - mappings[303] = ItemType.PolishedBlackstoneBrickWall; - mappings[304] = ItemType.StoneButton; - mappings[305] = ItemType.OakButton; - mappings[306] = ItemType.SpruceButton; - mappings[307] = ItemType.BirchButton; - mappings[308] = ItemType.JungleButton; - mappings[309] = ItemType.AcaciaButton; - mappings[310] = ItemType.DarkOakButton; - mappings[311] = ItemType.CrimsonButton; - mappings[312] = ItemType.WarpedButton; - mappings[313] = ItemType.PolishedBlackstoneButton; - mappings[314] = ItemType.Anvil; - mappings[315] = ItemType.ChippedAnvil; - mappings[316] = ItemType.DamagedAnvil; - mappings[317] = ItemType.TrappedChest; - mappings[318] = ItemType.LightWeightedPressurePlate; - mappings[319] = ItemType.HeavyWeightedPressurePlate; - mappings[320] = ItemType.DaylightDetector; - mappings[321] = ItemType.RedstoneBlock; - mappings[322] = ItemType.NetherQuartzOre; - mappings[323] = ItemType.Hopper; - mappings[324] = ItemType.ChiseledQuartzBlock; - mappings[325] = ItemType.QuartzBlock; - mappings[326] = ItemType.QuartzBricks; - mappings[327] = ItemType.QuartzPillar; - mappings[328] = ItemType.QuartzStairs; - mappings[329] = ItemType.ActivatorRail; - mappings[330] = ItemType.Dropper; - mappings[331] = ItemType.WhiteTerracotta; - mappings[332] = ItemType.OrangeTerracotta; - mappings[333] = ItemType.MagentaTerracotta; - mappings[334] = ItemType.LightBlueTerracotta; - mappings[335] = ItemType.YellowTerracotta; - mappings[336] = ItemType.LimeTerracotta; - mappings[337] = ItemType.PinkTerracotta; - mappings[338] = ItemType.GrayTerracotta; - mappings[339] = ItemType.LightGrayTerracotta; - mappings[340] = ItemType.CyanTerracotta; - mappings[341] = ItemType.PurpleTerracotta; - mappings[342] = ItemType.BlueTerracotta; - mappings[343] = ItemType.BrownTerracotta; - mappings[344] = ItemType.GreenTerracotta; - mappings[345] = ItemType.RedTerracotta; - mappings[346] = ItemType.BlackTerracotta; - mappings[347] = ItemType.Barrier; - mappings[348] = ItemType.IronTrapdoor; - mappings[349] = ItemType.HayBlock; - mappings[350] = ItemType.WhiteCarpet; - mappings[351] = ItemType.OrangeCarpet; - mappings[352] = ItemType.MagentaCarpet; - mappings[353] = ItemType.LightBlueCarpet; - mappings[354] = ItemType.YellowCarpet; - mappings[355] = ItemType.LimeCarpet; - mappings[356] = ItemType.PinkCarpet; - mappings[357] = ItemType.GrayCarpet; - mappings[358] = ItemType.LightGrayCarpet; - mappings[359] = ItemType.CyanCarpet; - mappings[360] = ItemType.PurpleCarpet; - mappings[361] = ItemType.BlueCarpet; - mappings[362] = ItemType.BrownCarpet; - mappings[363] = ItemType.GreenCarpet; - mappings[364] = ItemType.RedCarpet; - mappings[365] = ItemType.BlackCarpet; - mappings[366] = ItemType.Terracotta; - mappings[367] = ItemType.CoalBlock; - mappings[368] = ItemType.PackedIce; - mappings[369] = ItemType.AcaciaStairs; - mappings[370] = ItemType.DarkOakStairs; - mappings[371] = ItemType.SlimeBlock; - mappings[372] = ItemType.DirtPath; - mappings[373] = ItemType.Sunflower; - mappings[374] = ItemType.Lilac; - mappings[375] = ItemType.RoseBush; - mappings[376] = ItemType.Peony; - mappings[377] = ItemType.TallGrass; - mappings[378] = ItemType.LargeFern; - mappings[379] = ItemType.WhiteStainedGlass; - mappings[380] = ItemType.OrangeStainedGlass; - mappings[381] = ItemType.MagentaStainedGlass; - mappings[382] = ItemType.LightBlueStainedGlass; - mappings[383] = ItemType.YellowStainedGlass; - mappings[384] = ItemType.LimeStainedGlass; - mappings[385] = ItemType.PinkStainedGlass; - mappings[386] = ItemType.GrayStainedGlass; - mappings[387] = ItemType.LightGrayStainedGlass; - mappings[388] = ItemType.CyanStainedGlass; - mappings[389] = ItemType.PurpleStainedGlass; - mappings[390] = ItemType.BlueStainedGlass; - mappings[391] = ItemType.BrownStainedGlass; - mappings[392] = ItemType.GreenStainedGlass; - mappings[393] = ItemType.RedStainedGlass; - mappings[394] = ItemType.BlackStainedGlass; - mappings[395] = ItemType.WhiteStainedGlassPane; - mappings[396] = ItemType.OrangeStainedGlassPane; - mappings[397] = ItemType.MagentaStainedGlassPane; - mappings[398] = ItemType.LightBlueStainedGlassPane; - mappings[399] = ItemType.YellowStainedGlassPane; - mappings[400] = ItemType.LimeStainedGlassPane; - mappings[401] = ItemType.PinkStainedGlassPane; - mappings[402] = ItemType.GrayStainedGlassPane; - mappings[403] = ItemType.LightGrayStainedGlassPane; - mappings[404] = ItemType.CyanStainedGlassPane; - mappings[405] = ItemType.PurpleStainedGlassPane; - mappings[406] = ItemType.BlueStainedGlassPane; - mappings[407] = ItemType.BrownStainedGlassPane; - mappings[408] = ItemType.GreenStainedGlassPane; - mappings[409] = ItemType.RedStainedGlassPane; - mappings[410] = ItemType.BlackStainedGlassPane; - mappings[411] = ItemType.Prismarine; - mappings[412] = ItemType.PrismarineBricks; - mappings[413] = ItemType.DarkPrismarine; - mappings[414] = ItemType.PrismarineStairs; - mappings[415] = ItemType.PrismarineBrickStairs; - mappings[416] = ItemType.DarkPrismarineStairs; - mappings[417] = ItemType.SeaLantern; - mappings[418] = ItemType.RedSandstone; - mappings[419] = ItemType.ChiseledRedSandstone; - mappings[420] = ItemType.CutRedSandstone; - mappings[421] = ItemType.RedSandstoneStairs; - mappings[422] = ItemType.RepeatingCommandBlock; - mappings[423] = ItemType.ChainCommandBlock; - mappings[424] = ItemType.MagmaBlock; - mappings[425] = ItemType.NetherWartBlock; - mappings[426] = ItemType.WarpedWartBlock; - mappings[427] = ItemType.RedNetherBricks; - mappings[428] = ItemType.BoneBlock; - mappings[429] = ItemType.StructureVoid; - mappings[430] = ItemType.Observer; - mappings[431] = ItemType.ShulkerBox; - mappings[432] = ItemType.WhiteShulkerBox; - mappings[433] = ItemType.OrangeShulkerBox; - mappings[434] = ItemType.MagentaShulkerBox; - mappings[435] = ItemType.LightBlueShulkerBox; - mappings[436] = ItemType.YellowShulkerBox; - mappings[437] = ItemType.LimeShulkerBox; - mappings[438] = ItemType.PinkShulkerBox; - mappings[439] = ItemType.GrayShulkerBox; - mappings[440] = ItemType.LightGrayShulkerBox; - mappings[441] = ItemType.CyanShulkerBox; - mappings[442] = ItemType.PurpleShulkerBox; - mappings[443] = ItemType.BlueShulkerBox; - mappings[444] = ItemType.BrownShulkerBox; - mappings[445] = ItemType.GreenShulkerBox; - mappings[446] = ItemType.RedShulkerBox; - mappings[447] = ItemType.BlackShulkerBox; - mappings[448] = ItemType.WhiteGlazedTerracotta; - mappings[449] = ItemType.OrangeGlazedTerracotta; - mappings[450] = ItemType.MagentaGlazedTerracotta; - mappings[451] = ItemType.LightBlueGlazedTerracotta; - mappings[452] = ItemType.YellowGlazedTerracotta; - mappings[453] = ItemType.LimeGlazedTerracotta; - mappings[454] = ItemType.PinkGlazedTerracotta; - mappings[455] = ItemType.GrayGlazedTerracotta; - mappings[456] = ItemType.LightGrayGlazedTerracotta; - mappings[457] = ItemType.CyanGlazedTerracotta; - mappings[458] = ItemType.PurpleGlazedTerracotta; - mappings[459] = ItemType.BlueGlazedTerracotta; - mappings[460] = ItemType.BrownGlazedTerracotta; - mappings[461] = ItemType.GreenGlazedTerracotta; - mappings[462] = ItemType.RedGlazedTerracotta; - mappings[463] = ItemType.BlackGlazedTerracotta; - mappings[464] = ItemType.WhiteConcrete; - mappings[465] = ItemType.OrangeConcrete; - mappings[466] = ItemType.MagentaConcrete; - mappings[467] = ItemType.LightBlueConcrete; - mappings[468] = ItemType.YellowConcrete; - mappings[469] = ItemType.LimeConcrete; - mappings[470] = ItemType.PinkConcrete; - mappings[471] = ItemType.GrayConcrete; - mappings[472] = ItemType.LightGrayConcrete; - mappings[473] = ItemType.CyanConcrete; - mappings[474] = ItemType.PurpleConcrete; - mappings[475] = ItemType.BlueConcrete; - mappings[476] = ItemType.BrownConcrete; - mappings[477] = ItemType.GreenConcrete; - mappings[478] = ItemType.RedConcrete; - mappings[479] = ItemType.BlackConcrete; - mappings[480] = ItemType.WhiteConcretePowder; - mappings[481] = ItemType.OrangeConcretePowder; - mappings[482] = ItemType.MagentaConcretePowder; - mappings[483] = ItemType.LightBlueConcretePowder; - mappings[484] = ItemType.YellowConcretePowder; - mappings[485] = ItemType.LimeConcretePowder; - mappings[486] = ItemType.PinkConcretePowder; - mappings[487] = ItemType.GrayConcretePowder; - mappings[488] = ItemType.LightGrayConcretePowder; - mappings[489] = ItemType.CyanConcretePowder; - mappings[490] = ItemType.PurpleConcretePowder; - mappings[491] = ItemType.BlueConcretePowder; - mappings[492] = ItemType.BrownConcretePowder; - mappings[493] = ItemType.GreenConcretePowder; - mappings[494] = ItemType.RedConcretePowder; - mappings[495] = ItemType.BlackConcretePowder; - mappings[496] = ItemType.TurtleEgg; - mappings[497] = ItemType.DeadTubeCoralBlock; - mappings[498] = ItemType.DeadBrainCoralBlock; - mappings[499] = ItemType.DeadBubbleCoralBlock; - mappings[500] = ItemType.DeadFireCoralBlock; - mappings[501] = ItemType.DeadHornCoralBlock; - mappings[502] = ItemType.TubeCoralBlock; - mappings[503] = ItemType.BrainCoralBlock; - mappings[504] = ItemType.BubbleCoralBlock; - mappings[505] = ItemType.FireCoralBlock; - mappings[506] = ItemType.HornCoralBlock; - mappings[507] = ItemType.TubeCoral; - mappings[508] = ItemType.BrainCoral; - mappings[509] = ItemType.BubbleCoral; - mappings[510] = ItemType.FireCoral; - mappings[511] = ItemType.HornCoral; - mappings[512] = ItemType.DeadBrainCoral; - mappings[513] = ItemType.DeadBubbleCoral; - mappings[514] = ItemType.DeadFireCoral; - mappings[515] = ItemType.DeadHornCoral; - mappings[516] = ItemType.DeadTubeCoral; - mappings[517] = ItemType.TubeCoralFan; - mappings[518] = ItemType.BrainCoralFan; - mappings[519] = ItemType.BubbleCoralFan; - mappings[520] = ItemType.FireCoralFan; - mappings[521] = ItemType.HornCoralFan; - mappings[522] = ItemType.DeadTubeCoralFan; - mappings[523] = ItemType.DeadBrainCoralFan; - mappings[524] = ItemType.DeadBubbleCoralFan; - mappings[525] = ItemType.DeadFireCoralFan; - mappings[526] = ItemType.DeadHornCoralFan; - mappings[527] = ItemType.BlueIce; - mappings[528] = ItemType.Conduit; - mappings[529] = ItemType.PolishedGraniteStairs; - mappings[530] = ItemType.SmoothRedSandstoneStairs; - mappings[531] = ItemType.MossyStoneBrickStairs; - mappings[532] = ItemType.PolishedDioriteStairs; - mappings[533] = ItemType.MossyCobblestoneStairs; - mappings[534] = ItemType.EndStoneBrickStairs; - mappings[535] = ItemType.StoneStairs; - mappings[536] = ItemType.SmoothSandstoneStairs; - mappings[537] = ItemType.SmoothQuartzStairs; - mappings[538] = ItemType.GraniteStairs; - mappings[539] = ItemType.AndesiteStairs; - mappings[540] = ItemType.RedNetherBrickStairs; - mappings[541] = ItemType.PolishedAndesiteStairs; - mappings[542] = ItemType.DioriteStairs; - mappings[543] = ItemType.PolishedGraniteSlab; - mappings[544] = ItemType.SmoothRedSandstoneSlab; - mappings[545] = ItemType.MossyStoneBrickSlab; - mappings[546] = ItemType.PolishedDioriteSlab; - mappings[547] = ItemType.MossyCobblestoneSlab; - mappings[548] = ItemType.EndStoneBrickSlab; - mappings[549] = ItemType.SmoothSandstoneSlab; - mappings[550] = ItemType.SmoothQuartzSlab; - mappings[551] = ItemType.GraniteSlab; - mappings[552] = ItemType.AndesiteSlab; - mappings[553] = ItemType.RedNetherBrickSlab; - mappings[554] = ItemType.PolishedAndesiteSlab; - mappings[555] = ItemType.DioriteSlab; - mappings[556] = ItemType.Scaffolding; - mappings[557] = ItemType.IronDoor; - mappings[558] = ItemType.OakDoor; - mappings[559] = ItemType.SpruceDoor; - mappings[560] = ItemType.BirchDoor; - mappings[561] = ItemType.JungleDoor; - mappings[562] = ItemType.AcaciaDoor; - mappings[563] = ItemType.DarkOakDoor; - mappings[564] = ItemType.CrimsonDoor; - mappings[565] = ItemType.WarpedDoor; - mappings[566] = ItemType.Repeater; - mappings[567] = ItemType.Comparator; - mappings[568] = ItemType.StructureBlock; - mappings[569] = ItemType.Jigsaw; - mappings[570] = ItemType.TurtleHelmet; - mappings[571] = ItemType.TurtleScute; - mappings[572] = ItemType.IronShovel; - mappings[573] = ItemType.IronPickaxe; - mappings[574] = ItemType.IronAxe; - mappings[575] = ItemType.FlintAndSteel; - mappings[576] = ItemType.Apple; - mappings[577] = ItemType.Bow; - mappings[578] = ItemType.Arrow; - mappings[579] = ItemType.Coal; - mappings[580] = ItemType.Charcoal; - mappings[581] = ItemType.Diamond; - mappings[582] = ItemType.IronIngot; - mappings[583] = ItemType.GoldIngot; - mappings[584] = ItemType.NetheriteIngot; - mappings[585] = ItemType.NetheriteScrap; - mappings[586] = ItemType.IronSword; - mappings[587] = ItemType.WoodenSword; - mappings[588] = ItemType.WoodenShovel; - mappings[589] = ItemType.WoodenPickaxe; - mappings[590] = ItemType.WoodenAxe; - mappings[591] = ItemType.StoneSword; - mappings[592] = ItemType.StoneShovel; - mappings[593] = ItemType.StonePickaxe; - mappings[594] = ItemType.StoneAxe; - mappings[595] = ItemType.DiamondSword; - mappings[596] = ItemType.DiamondShovel; - mappings[597] = ItemType.DiamondPickaxe; - mappings[598] = ItemType.DiamondAxe; - mappings[599] = ItemType.Stick; - mappings[600] = ItemType.Bowl; - mappings[601] = ItemType.MushroomStew; - mappings[602] = ItemType.GoldenSword; - mappings[603] = ItemType.GoldenShovel; - mappings[604] = ItemType.GoldenPickaxe; - mappings[605] = ItemType.GoldenAxe; - mappings[606] = ItemType.NetheriteSword; - mappings[607] = ItemType.NetheriteShovel; - mappings[608] = ItemType.NetheritePickaxe; - mappings[609] = ItemType.NetheriteAxe; - mappings[610] = ItemType.String; - mappings[611] = ItemType.Feather; - mappings[612] = ItemType.Gunpowder; - mappings[613] = ItemType.WoodenHoe; - mappings[614] = ItemType.StoneHoe; - mappings[615] = ItemType.IronHoe; - mappings[616] = ItemType.DiamondHoe; - mappings[617] = ItemType.GoldenHoe; - mappings[618] = ItemType.NetheriteHoe; - mappings[619] = ItemType.WheatSeeds; - mappings[620] = ItemType.Wheat; - mappings[621] = ItemType.Bread; - mappings[622] = ItemType.LeatherHelmet; - mappings[623] = ItemType.LeatherChestplate; - mappings[624] = ItemType.LeatherLeggings; - mappings[625] = ItemType.LeatherBoots; - mappings[626] = ItemType.ChainmailHelmet; - mappings[627] = ItemType.ChainmailChestplate; - mappings[628] = ItemType.ChainmailLeggings; - mappings[629] = ItemType.ChainmailBoots; - mappings[630] = ItemType.IronHelmet; - mappings[631] = ItemType.IronChestplate; - mappings[632] = ItemType.IronLeggings; - mappings[633] = ItemType.IronBoots; - mappings[634] = ItemType.DiamondHelmet; - mappings[635] = ItemType.DiamondChestplate; - mappings[636] = ItemType.DiamondLeggings; - mappings[637] = ItemType.DiamondBoots; - mappings[638] = ItemType.GoldenHelmet; - mappings[639] = ItemType.GoldenChestplate; - mappings[640] = ItemType.GoldenLeggings; - mappings[641] = ItemType.GoldenBoots; - mappings[642] = ItemType.NetheriteHelmet; - mappings[643] = ItemType.NetheriteChestplate; - mappings[644] = ItemType.NetheriteLeggings; - mappings[645] = ItemType.NetheriteBoots; - mappings[646] = ItemType.Flint; - mappings[647] = ItemType.Porkchop; - mappings[648] = ItemType.CookedPorkchop; - mappings[649] = ItemType.Painting; - mappings[650] = ItemType.GoldenApple; - mappings[651] = ItemType.EnchantedGoldenApple; - mappings[652] = ItemType.OakSign; - mappings[653] = ItemType.SpruceSign; - mappings[654] = ItemType.BirchSign; - mappings[655] = ItemType.JungleSign; - mappings[656] = ItemType.AcaciaSign; - mappings[657] = ItemType.DarkOakSign; - mappings[658] = ItemType.CrimsonSign; - mappings[659] = ItemType.WarpedSign; - mappings[660] = ItemType.Bucket; - mappings[661] = ItemType.WaterBucket; - mappings[662] = ItemType.LavaBucket; - mappings[663] = ItemType.Minecart; - mappings[664] = ItemType.Saddle; - mappings[665] = ItemType.Redstone; - mappings[666] = ItemType.Snowball; - mappings[667] = ItemType.OakBoat; - mappings[668] = ItemType.Leather; - mappings[669] = ItemType.MilkBucket; - mappings[670] = ItemType.PufferfishBucket; - mappings[671] = ItemType.SalmonBucket; - mappings[672] = ItemType.CodBucket; - mappings[673] = ItemType.TropicalFishBucket; - mappings[674] = ItemType.Brick; - mappings[675] = ItemType.ClayBall; - mappings[676] = ItemType.DriedKelpBlock; - mappings[677] = ItemType.Paper; - mappings[678] = ItemType.Book; - mappings[679] = ItemType.SlimeBall; - mappings[680] = ItemType.ChestMinecart; - mappings[681] = ItemType.FurnaceMinecart; - mappings[682] = ItemType.Egg; - mappings[683] = ItemType.Compass; - mappings[684] = ItemType.FishingRod; - mappings[685] = ItemType.Clock; - mappings[686] = ItemType.GlowstoneDust; - mappings[687] = ItemType.Cod; - mappings[688] = ItemType.Salmon; - mappings[689] = ItemType.TropicalFish; - mappings[690] = ItemType.Pufferfish; - mappings[691] = ItemType.CookedCod; - mappings[692] = ItemType.CookedSalmon; - mappings[693] = ItemType.InkSac; - mappings[694] = ItemType.RedDye; - mappings[695] = ItemType.GreenDye; - mappings[696] = ItemType.CocoaBeans; - mappings[697] = ItemType.LapisLazuli; - mappings[698] = ItemType.PurpleDye; - mappings[699] = ItemType.CyanDye; - mappings[700] = ItemType.LightGrayDye; - mappings[701] = ItemType.GrayDye; - mappings[702] = ItemType.PinkDye; - mappings[703] = ItemType.LimeDye; - mappings[704] = ItemType.YellowDye; - mappings[705] = ItemType.LightBlueDye; - mappings[706] = ItemType.MagentaDye; - mappings[707] = ItemType.OrangeDye; - mappings[708] = ItemType.BoneMeal; - mappings[709] = ItemType.BlueDye; - mappings[710] = ItemType.BrownDye; - mappings[711] = ItemType.BlackDye; - mappings[712] = ItemType.WhiteDye; - mappings[713] = ItemType.Bone; - mappings[714] = ItemType.Sugar; - mappings[715] = ItemType.Cake; - mappings[716] = ItemType.WhiteBed; - mappings[717] = ItemType.OrangeBed; - mappings[718] = ItemType.MagentaBed; - mappings[719] = ItemType.LightBlueBed; - mappings[720] = ItemType.YellowBed; - mappings[721] = ItemType.LimeBed; - mappings[722] = ItemType.PinkBed; - mappings[723] = ItemType.GrayBed; - mappings[724] = ItemType.LightGrayBed; - mappings[725] = ItemType.CyanBed; - mappings[726] = ItemType.PurpleBed; - mappings[727] = ItemType.BlueBed; - mappings[728] = ItemType.BrownBed; - mappings[729] = ItemType.GreenBed; - mappings[730] = ItemType.RedBed; - mappings[731] = ItemType.BlackBed; - mappings[732] = ItemType.Cookie; - mappings[733] = ItemType.FilledMap; - mappings[734] = ItemType.Shears; - mappings[735] = ItemType.MelonSlice; - mappings[736] = ItemType.DriedKelp; - mappings[737] = ItemType.PumpkinSeeds; - mappings[738] = ItemType.MelonSeeds; - mappings[739] = ItemType.Beef; - mappings[740] = ItemType.CookedBeef; - mappings[741] = ItemType.Chicken; - mappings[742] = ItemType.CookedChicken; - mappings[743] = ItemType.RottenFlesh; - mappings[744] = ItemType.EnderPearl; - mappings[745] = ItemType.BlazeRod; - mappings[746] = ItemType.GhastTear; - mappings[747] = ItemType.GoldNugget; - mappings[748] = ItemType.NetherWart; - mappings[749] = ItemType.Potion; - mappings[750] = ItemType.GlassBottle; - mappings[751] = ItemType.SpiderEye; - mappings[752] = ItemType.FermentedSpiderEye; - mappings[753] = ItemType.BlazePowder; - mappings[754] = ItemType.MagmaCream; - mappings[755] = ItemType.BrewingStand; - mappings[756] = ItemType.Cauldron; - mappings[757] = ItemType.EnderEye; - mappings[758] = ItemType.GlisteringMelonSlice; - mappings[759] = ItemType.BatSpawnEgg; - mappings[760] = ItemType.BeeSpawnEgg; - mappings[761] = ItemType.BlazeSpawnEgg; - mappings[762] = ItemType.CatSpawnEgg; - mappings[763] = ItemType.CaveSpiderSpawnEgg; - mappings[764] = ItemType.ChickenSpawnEgg; - mappings[765] = ItemType.CodSpawnEgg; - mappings[766] = ItemType.CowSpawnEgg; - mappings[767] = ItemType.CreeperSpawnEgg; - mappings[768] = ItemType.DolphinSpawnEgg; - mappings[769] = ItemType.DonkeySpawnEgg; - mappings[770] = ItemType.DrownedSpawnEgg; - mappings[771] = ItemType.ElderGuardianSpawnEgg; - mappings[772] = ItemType.EndermanSpawnEgg; - mappings[773] = ItemType.EndermiteSpawnEgg; - mappings[774] = ItemType.EvokerSpawnEgg; - mappings[775] = ItemType.FoxSpawnEgg; - mappings[776] = ItemType.GhastSpawnEgg; - mappings[777] = ItemType.GuardianSpawnEgg; - mappings[778] = ItemType.HoglinSpawnEgg; - mappings[779] = ItemType.HorseSpawnEgg; - mappings[780] = ItemType.HuskSpawnEgg; - mappings[781] = ItemType.LlamaSpawnEgg; - mappings[782] = ItemType.MagmaCubeSpawnEgg; - mappings[783] = ItemType.MooshroomSpawnEgg; - mappings[784] = ItemType.MuleSpawnEgg; - mappings[785] = ItemType.OcelotSpawnEgg; - mappings[786] = ItemType.PandaSpawnEgg; - mappings[787] = ItemType.ParrotSpawnEgg; - mappings[788] = ItemType.PhantomSpawnEgg; - mappings[789] = ItemType.PigSpawnEgg; - mappings[790] = ItemType.PiglinSpawnEgg; - mappings[791] = ItemType.PillagerSpawnEgg; - mappings[792] = ItemType.PolarBearSpawnEgg; - mappings[793] = ItemType.PufferfishSpawnEgg; - mappings[794] = ItemType.RabbitSpawnEgg; - mappings[795] = ItemType.RavagerSpawnEgg; - mappings[796] = ItemType.SalmonSpawnEgg; - mappings[797] = ItemType.SheepSpawnEgg; - mappings[798] = ItemType.ShulkerSpawnEgg; - mappings[799] = ItemType.SilverfishSpawnEgg; - mappings[800] = ItemType.SkeletonSpawnEgg; - mappings[801] = ItemType.SkeletonHorseSpawnEgg; - mappings[802] = ItemType.SlimeSpawnEgg; - mappings[803] = ItemType.SpiderSpawnEgg; - mappings[804] = ItemType.SquidSpawnEgg; - mappings[805] = ItemType.StraySpawnEgg; - mappings[806] = ItemType.StriderSpawnEgg; - mappings[807] = ItemType.TraderLlamaSpawnEgg; - mappings[808] = ItemType.TropicalFishSpawnEgg; - mappings[809] = ItemType.TurtleSpawnEgg; - mappings[810] = ItemType.VexSpawnEgg; - mappings[811] = ItemType.VillagerSpawnEgg; - mappings[812] = ItemType.VindicatorSpawnEgg; - mappings[813] = ItemType.WanderingTraderSpawnEgg; - mappings[814] = ItemType.WitchSpawnEgg; - mappings[815] = ItemType.WitherSkeletonSpawnEgg; - mappings[816] = ItemType.WolfSpawnEgg; - mappings[817] = ItemType.ZoglinSpawnEgg; - mappings[818] = ItemType.ZombieSpawnEgg; - mappings[819] = ItemType.ZombieHorseSpawnEgg; - mappings[820] = ItemType.ZombieVillagerSpawnEgg; - mappings[821] = ItemType.ZombifiedPiglinSpawnEgg; - mappings[822] = ItemType.ExperienceBottle; - mappings[823] = ItemType.FireCharge; - mappings[824] = ItemType.WritableBook; - mappings[825] = ItemType.WrittenBook; - mappings[826] = ItemType.Emerald; - mappings[827] = ItemType.ItemFrame; - mappings[828] = ItemType.FlowerPot; - mappings[829] = ItemType.Carrot; - mappings[830] = ItemType.Potato; - mappings[831] = ItemType.BakedPotato; - mappings[832] = ItemType.PoisonousPotato; - mappings[833] = ItemType.Map; - mappings[834] = ItemType.GoldenCarrot; - mappings[835] = ItemType.SkeletonSkull; - mappings[836] = ItemType.WitherSkeletonSkull; - mappings[837] = ItemType.PlayerHead; - mappings[838] = ItemType.ZombieHead; - mappings[839] = ItemType.CreeperHead; - mappings[840] = ItemType.DragonHead; - mappings[841] = ItemType.CarrotOnAStick; - mappings[842] = ItemType.WarpedFungusOnAStick; - mappings[843] = ItemType.NetherStar; - mappings[844] = ItemType.PumpkinPie; - mappings[845] = ItemType.FireworkRocket; - mappings[846] = ItemType.FireworkStar; - mappings[847] = ItemType.EnchantedBook; - mappings[848] = ItemType.NetherBrick; - mappings[849] = ItemType.Quartz; - mappings[850] = ItemType.TntMinecart; - mappings[851] = ItemType.HopperMinecart; - mappings[852] = ItemType.PrismarineShard; - mappings[853] = ItemType.PrismarineCrystals; - mappings[854] = ItemType.Rabbit; - mappings[855] = ItemType.CookedRabbit; - mappings[856] = ItemType.RabbitStew; - mappings[857] = ItemType.RabbitFoot; - mappings[858] = ItemType.RabbitHide; - mappings[859] = ItemType.ArmorStand; - mappings[860] = ItemType.IronHorseArmor; - mappings[861] = ItemType.GoldenHorseArmor; - mappings[862] = ItemType.DiamondHorseArmor; - mappings[863] = ItemType.LeatherHorseArmor; - mappings[864] = ItemType.Lead; - mappings[865] = ItemType.NameTag; - mappings[866] = ItemType.CommandBlockMinecart; - mappings[867] = ItemType.Mutton; - mappings[868] = ItemType.CookedMutton; - mappings[869] = ItemType.WhiteBanner; - mappings[870] = ItemType.OrangeBanner; - mappings[871] = ItemType.MagentaBanner; - mappings[872] = ItemType.LightBlueBanner; - mappings[873] = ItemType.YellowBanner; - mappings[874] = ItemType.LimeBanner; - mappings[875] = ItemType.PinkBanner; - mappings[876] = ItemType.GrayBanner; - mappings[877] = ItemType.LightGrayBanner; - mappings[878] = ItemType.CyanBanner; - mappings[879] = ItemType.PurpleBanner; - mappings[880] = ItemType.BlueBanner; - mappings[881] = ItemType.BrownBanner; - mappings[882] = ItemType.GreenBanner; - mappings[883] = ItemType.RedBanner; - mappings[884] = ItemType.BlackBanner; - mappings[885] = ItemType.EndCrystal; - mappings[886] = ItemType.ChorusFruit; - mappings[887] = ItemType.PoppedChorusFruit; - mappings[888] = ItemType.Beetroot; - mappings[889] = ItemType.BeetrootSeeds; - mappings[890] = ItemType.BeetrootSoup; - mappings[891] = ItemType.DragonBreath; - mappings[892] = ItemType.SplashPotion; - mappings[893] = ItemType.SpectralArrow; - mappings[894] = ItemType.TippedArrow; - mappings[895] = ItemType.LingeringPotion; - mappings[896] = ItemType.Shield; - mappings[897] = ItemType.Elytra; - mappings[898] = ItemType.SpruceBoat; - mappings[899] = ItemType.BirchBoat; - mappings[900] = ItemType.JungleBoat; - mappings[901] = ItemType.AcaciaBoat; - mappings[902] = ItemType.DarkOakBoat; - mappings[903] = ItemType.TotemOfUndying; - mappings[904] = ItemType.ShulkerShell; - mappings[905] = ItemType.IronNugget; - mappings[906] = ItemType.KnowledgeBook; - mappings[907] = ItemType.DebugStick; - mappings[908] = ItemType.MusicDisc13; - mappings[909] = ItemType.MusicDiscCat; - mappings[910] = ItemType.MusicDiscBlocks; - mappings[911] = ItemType.MusicDiscChirp; - mappings[912] = ItemType.MusicDiscFar; - mappings[913] = ItemType.MusicDiscMall; - mappings[914] = ItemType.MusicDiscMellohi; - mappings[915] = ItemType.MusicDiscStal; - mappings[916] = ItemType.MusicDiscStrad; - mappings[917] = ItemType.MusicDiscWard; - mappings[918] = ItemType.MusicDisc11; - mappings[919] = ItemType.MusicDiscWait; - mappings[920] = ItemType.MusicDiscPigstep; - mappings[921] = ItemType.Trident; - mappings[922] = ItemType.PhantomMembrane; - mappings[923] = ItemType.NautilusShell; - mappings[924] = ItemType.HeartOfTheSea; - mappings[925] = ItemType.Crossbow; - mappings[926] = ItemType.SuspiciousStew; - mappings[927] = ItemType.Loom; - mappings[928] = ItemType.FlowerBannerPattern; - mappings[929] = ItemType.CreeperBannerPattern; - mappings[930] = ItemType.SkullBannerPattern; - mappings[931] = ItemType.MojangBannerPattern; - mappings[932] = ItemType.GlobeBannerPattern; - mappings[933] = ItemType.PiglinBannerPattern; - mappings[934] = ItemType.Composter; - mappings[935] = ItemType.Barrel; - mappings[936] = ItemType.Smoker; - mappings[937] = ItemType.BlastFurnace; - mappings[938] = ItemType.CartographyTable; - mappings[939] = ItemType.FletchingTable; - mappings[940] = ItemType.Grindstone; - mappings[941] = ItemType.Lectern; - mappings[942] = ItemType.SmithingTable; - mappings[943] = ItemType.Stonecutter; - mappings[944] = ItemType.Bell; - mappings[945] = ItemType.Lantern; - mappings[946] = ItemType.SoulLantern; - mappings[947] = ItemType.SweetBerries; - mappings[948] = ItemType.Campfire; - mappings[949] = ItemType.SoulCampfire; - mappings[950] = ItemType.Shroomlight; - mappings[951] = ItemType.Honeycomb; - mappings[952] = ItemType.BeeNest; - mappings[953] = ItemType.Beehive; - mappings[954] = ItemType.HoneyBottle; - mappings[955] = ItemType.HoneyBlock; - mappings[956] = ItemType.HoneycombBlock; - mappings[957] = ItemType.Lodestone; - mappings[958] = ItemType.NetheriteBlock; - mappings[959] = ItemType.AncientDebris; - mappings[960] = ItemType.Target; - mappings[961] = ItemType.CryingObsidian; - mappings[962] = ItemType.Blackstone; - mappings[963] = ItemType.BlackstoneSlab; - mappings[964] = ItemType.BlackstoneStairs; - mappings[965] = ItemType.GildedBlackstone; - mappings[966] = ItemType.PolishedBlackstone; - mappings[967] = ItemType.PolishedBlackstoneSlab; - mappings[968] = ItemType.PolishedBlackstoneStairs; - mappings[969] = ItemType.ChiseledPolishedBlackstone; - mappings[970] = ItemType.PolishedBlackstoneBricks; - mappings[971] = ItemType.PolishedBlackstoneBrickSlab; - mappings[972] = ItemType.PolishedBlackstoneBrickStairs; - mappings[973] = ItemType.CrackedPolishedBlackstoneBricks; - mappings[974] = ItemType.RespawnAnchor; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1162.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette1162.cs deleted file mode 100644 index 5a82eef4ba..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1162.cs +++ /dev/null @@ -1,998 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - /// - /// For MC 1.16.2 - /// Generated by ItemPaletteGenerator.cs - /// - public class ItemPalette1162 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette1162() - { - mappings[0] = ItemType.Air; - mappings[1] = ItemType.Stone; - mappings[2] = ItemType.Granite; - mappings[3] = ItemType.PolishedGranite; - mappings[4] = ItemType.Diorite; - mappings[5] = ItemType.PolishedDiorite; - mappings[6] = ItemType.Andesite; - mappings[7] = ItemType.PolishedAndesite; - mappings[8] = ItemType.GrassBlock; - mappings[9] = ItemType.Dirt; - mappings[10] = ItemType.CoarseDirt; - mappings[11] = ItemType.Podzol; - mappings[12] = ItemType.CrimsonNylium; - mappings[13] = ItemType.WarpedNylium; - mappings[14] = ItemType.Cobblestone; - mappings[15] = ItemType.OakPlanks; - mappings[16] = ItemType.SprucePlanks; - mappings[17] = ItemType.BirchPlanks; - mappings[18] = ItemType.JunglePlanks; - mappings[19] = ItemType.AcaciaPlanks; - mappings[20] = ItemType.DarkOakPlanks; - mappings[21] = ItemType.CrimsonPlanks; - mappings[22] = ItemType.WarpedPlanks; - mappings[23] = ItemType.OakSapling; - mappings[24] = ItemType.SpruceSapling; - mappings[25] = ItemType.BirchSapling; - mappings[26] = ItemType.JungleSapling; - mappings[27] = ItemType.AcaciaSapling; - mappings[28] = ItemType.DarkOakSapling; - mappings[29] = ItemType.Bedrock; - mappings[30] = ItemType.Sand; - mappings[31] = ItemType.RedSand; - mappings[32] = ItemType.Gravel; - mappings[33] = ItemType.GoldOre; - mappings[34] = ItemType.IronOre; - mappings[35] = ItemType.CoalOre; - mappings[36] = ItemType.NetherGoldOre; - mappings[37] = ItemType.OakLog; - mappings[38] = ItemType.SpruceLog; - mappings[39] = ItemType.BirchLog; - mappings[40] = ItemType.JungleLog; - mappings[41] = ItemType.AcaciaLog; - mappings[42] = ItemType.DarkOakLog; - mappings[43] = ItemType.CrimsonStem; - mappings[44] = ItemType.WarpedStem; - mappings[45] = ItemType.StrippedOakLog; - mappings[46] = ItemType.StrippedSpruceLog; - mappings[47] = ItemType.StrippedBirchLog; - mappings[48] = ItemType.StrippedJungleLog; - mappings[49] = ItemType.StrippedAcaciaLog; - mappings[50] = ItemType.StrippedDarkOakLog; - mappings[51] = ItemType.StrippedCrimsonStem; - mappings[52] = ItemType.StrippedWarpedStem; - mappings[53] = ItemType.StrippedOakWood; - mappings[54] = ItemType.StrippedSpruceWood; - mappings[55] = ItemType.StrippedBirchWood; - mappings[56] = ItemType.StrippedJungleWood; - mappings[57] = ItemType.StrippedAcaciaWood; - mappings[58] = ItemType.StrippedDarkOakWood; - mappings[59] = ItemType.StrippedCrimsonHyphae; - mappings[60] = ItemType.StrippedWarpedHyphae; - mappings[61] = ItemType.OakWood; - mappings[62] = ItemType.SpruceWood; - mappings[63] = ItemType.BirchWood; - mappings[64] = ItemType.JungleWood; - mappings[65] = ItemType.AcaciaWood; - mappings[66] = ItemType.DarkOakWood; - mappings[67] = ItemType.CrimsonHyphae; - mappings[68] = ItemType.WarpedHyphae; - mappings[69] = ItemType.OakLeaves; - mappings[70] = ItemType.SpruceLeaves; - mappings[71] = ItemType.BirchLeaves; - mappings[72] = ItemType.JungleLeaves; - mappings[73] = ItemType.AcaciaLeaves; - mappings[74] = ItemType.DarkOakLeaves; - mappings[75] = ItemType.Sponge; - mappings[76] = ItemType.WetSponge; - mappings[77] = ItemType.Glass; - mappings[78] = ItemType.LapisOre; - mappings[79] = ItemType.LapisBlock; - mappings[80] = ItemType.Dispenser; - mappings[81] = ItemType.Sandstone; - mappings[82] = ItemType.ChiseledSandstone; - mappings[83] = ItemType.CutSandstone; - mappings[84] = ItemType.NoteBlock; - mappings[85] = ItemType.PoweredRail; - mappings[86] = ItemType.DetectorRail; - mappings[87] = ItemType.StickyPiston; - mappings[88] = ItemType.Cobweb; - mappings[89] = ItemType.ShortGrass; - mappings[90] = ItemType.Fern; - mappings[91] = ItemType.DeadBush; - mappings[92] = ItemType.Seagrass; - mappings[93] = ItemType.SeaPickle; - mappings[94] = ItemType.Piston; - mappings[95] = ItemType.WhiteWool; - mappings[96] = ItemType.OrangeWool; - mappings[97] = ItemType.MagentaWool; - mappings[98] = ItemType.LightBlueWool; - mappings[99] = ItemType.YellowWool; - mappings[100] = ItemType.LimeWool; - mappings[101] = ItemType.PinkWool; - mappings[102] = ItemType.GrayWool; - mappings[103] = ItemType.LightGrayWool; - mappings[104] = ItemType.CyanWool; - mappings[105] = ItemType.PurpleWool; - mappings[106] = ItemType.BlueWool; - mappings[107] = ItemType.BrownWool; - mappings[108] = ItemType.GreenWool; - mappings[109] = ItemType.RedWool; - mappings[110] = ItemType.BlackWool; - mappings[111] = ItemType.Dandelion; - mappings[112] = ItemType.Poppy; - mappings[113] = ItemType.BlueOrchid; - mappings[114] = ItemType.Allium; - mappings[115] = ItemType.AzureBluet; - mappings[116] = ItemType.RedTulip; - mappings[117] = ItemType.OrangeTulip; - mappings[118] = ItemType.WhiteTulip; - mappings[119] = ItemType.PinkTulip; - mappings[120] = ItemType.OxeyeDaisy; - mappings[121] = ItemType.Cornflower; - mappings[122] = ItemType.LilyOfTheValley; - mappings[123] = ItemType.WitherRose; - mappings[124] = ItemType.BrownMushroom; - mappings[125] = ItemType.RedMushroom; - mappings[126] = ItemType.CrimsonFungus; - mappings[127] = ItemType.WarpedFungus; - mappings[128] = ItemType.CrimsonRoots; - mappings[129] = ItemType.WarpedRoots; - mappings[130] = ItemType.NetherSprouts; - mappings[131] = ItemType.WeepingVines; - mappings[132] = ItemType.TwistingVines; - mappings[133] = ItemType.SugarCane; - mappings[134] = ItemType.Kelp; - mappings[135] = ItemType.Bamboo; - mappings[136] = ItemType.GoldBlock; - mappings[137] = ItemType.IronBlock; - mappings[138] = ItemType.OakSlab; - mappings[139] = ItemType.SpruceSlab; - mappings[140] = ItemType.BirchSlab; - mappings[141] = ItemType.JungleSlab; - mappings[142] = ItemType.AcaciaSlab; - mappings[143] = ItemType.DarkOakSlab; - mappings[144] = ItemType.CrimsonSlab; - mappings[145] = ItemType.WarpedSlab; - mappings[146] = ItemType.StoneSlab; - mappings[147] = ItemType.SmoothStoneSlab; - mappings[148] = ItemType.SandstoneSlab; - mappings[149] = ItemType.CutSandstoneSlab; - mappings[150] = ItemType.PetrifiedOakSlab; - mappings[151] = ItemType.CobblestoneSlab; - mappings[152] = ItemType.BrickSlab; - mappings[153] = ItemType.StoneBrickSlab; - mappings[154] = ItemType.NetherBrickSlab; - mappings[155] = ItemType.QuartzSlab; - mappings[156] = ItemType.RedSandstoneSlab; - mappings[157] = ItemType.CutRedSandstoneSlab; - mappings[158] = ItemType.PurpurSlab; - mappings[159] = ItemType.PrismarineSlab; - mappings[160] = ItemType.PrismarineBrickSlab; - mappings[161] = ItemType.DarkPrismarineSlab; - mappings[162] = ItemType.SmoothQuartz; - mappings[163] = ItemType.SmoothRedSandstone; - mappings[164] = ItemType.SmoothSandstone; - mappings[165] = ItemType.SmoothStone; - mappings[166] = ItemType.Bricks; - mappings[167] = ItemType.Tnt; - mappings[168] = ItemType.Bookshelf; - mappings[169] = ItemType.MossyCobblestone; - mappings[170] = ItemType.Obsidian; - mappings[171] = ItemType.Torch; - mappings[172] = ItemType.EndRod; - mappings[173] = ItemType.ChorusPlant; - mappings[174] = ItemType.ChorusFlower; - mappings[175] = ItemType.PurpurBlock; - mappings[176] = ItemType.PurpurPillar; - mappings[177] = ItemType.PurpurStairs; - mappings[178] = ItemType.Spawner; - mappings[179] = ItemType.OakStairs; - mappings[180] = ItemType.Chest; - mappings[181] = ItemType.DiamondOre; - mappings[182] = ItemType.DiamondBlock; - mappings[183] = ItemType.CraftingTable; - mappings[184] = ItemType.Farmland; - mappings[185] = ItemType.Furnace; - mappings[186] = ItemType.Ladder; - mappings[187] = ItemType.Rail; - mappings[188] = ItemType.CobblestoneStairs; - mappings[189] = ItemType.Lever; - mappings[190] = ItemType.StonePressurePlate; - mappings[191] = ItemType.OakPressurePlate; - mappings[192] = ItemType.SprucePressurePlate; - mappings[193] = ItemType.BirchPressurePlate; - mappings[194] = ItemType.JunglePressurePlate; - mappings[195] = ItemType.AcaciaPressurePlate; - mappings[196] = ItemType.DarkOakPressurePlate; - mappings[197] = ItemType.CrimsonPressurePlate; - mappings[198] = ItemType.WarpedPressurePlate; - mappings[199] = ItemType.PolishedBlackstonePressurePlate; - mappings[200] = ItemType.RedstoneOre; - mappings[201] = ItemType.RedstoneTorch; - mappings[202] = ItemType.Snow; - mappings[203] = ItemType.Ice; - mappings[204] = ItemType.SnowBlock; - mappings[205] = ItemType.Cactus; - mappings[206] = ItemType.Clay; - mappings[207] = ItemType.Jukebox; - mappings[208] = ItemType.OakFence; - mappings[209] = ItemType.SpruceFence; - mappings[210] = ItemType.BirchFence; - mappings[211] = ItemType.JungleFence; - mappings[212] = ItemType.AcaciaFence; - mappings[213] = ItemType.DarkOakFence; - mappings[214] = ItemType.CrimsonFence; - mappings[215] = ItemType.WarpedFence; - mappings[216] = ItemType.Pumpkin; - mappings[217] = ItemType.CarvedPumpkin; - mappings[218] = ItemType.Netherrack; - mappings[219] = ItemType.SoulSand; - mappings[220] = ItemType.SoulSoil; - mappings[221] = ItemType.Basalt; - mappings[222] = ItemType.PolishedBasalt; - mappings[223] = ItemType.SoulTorch; - mappings[224] = ItemType.Glowstone; - mappings[225] = ItemType.JackOLantern; - mappings[226] = ItemType.OakTrapdoor; - mappings[227] = ItemType.SpruceTrapdoor; - mappings[228] = ItemType.BirchTrapdoor; - mappings[229] = ItemType.JungleTrapdoor; - mappings[230] = ItemType.AcaciaTrapdoor; - mappings[231] = ItemType.DarkOakTrapdoor; - mappings[232] = ItemType.CrimsonTrapdoor; - mappings[233] = ItemType.WarpedTrapdoor; - mappings[234] = ItemType.InfestedStone; - mappings[235] = ItemType.InfestedCobblestone; - mappings[236] = ItemType.InfestedStoneBricks; - mappings[237] = ItemType.InfestedMossyStoneBricks; - mappings[238] = ItemType.InfestedCrackedStoneBricks; - mappings[239] = ItemType.InfestedChiseledStoneBricks; - mappings[240] = ItemType.StoneBricks; - mappings[241] = ItemType.MossyStoneBricks; - mappings[242] = ItemType.CrackedStoneBricks; - mappings[243] = ItemType.ChiseledStoneBricks; - mappings[244] = ItemType.BrownMushroomBlock; - mappings[245] = ItemType.RedMushroomBlock; - mappings[246] = ItemType.MushroomStem; - mappings[247] = ItemType.IronBars; - mappings[248] = ItemType.Chain; - mappings[249] = ItemType.GlassPane; - mappings[250] = ItemType.Melon; - mappings[251] = ItemType.Vine; - mappings[252] = ItemType.OakFenceGate; - mappings[253] = ItemType.SpruceFenceGate; - mappings[254] = ItemType.BirchFenceGate; - mappings[255] = ItemType.JungleFenceGate; - mappings[256] = ItemType.AcaciaFenceGate; - mappings[257] = ItemType.DarkOakFenceGate; - mappings[258] = ItemType.CrimsonFenceGate; - mappings[259] = ItemType.WarpedFenceGate; - mappings[260] = ItemType.BrickStairs; - mappings[261] = ItemType.StoneBrickStairs; - mappings[262] = ItemType.Mycelium; - mappings[263] = ItemType.LilyPad; - mappings[264] = ItemType.NetherBricks; - mappings[265] = ItemType.CrackedNetherBricks; - mappings[266] = ItemType.ChiseledNetherBricks; - mappings[267] = ItemType.NetherBrickFence; - mappings[268] = ItemType.NetherBrickStairs; - mappings[269] = ItemType.EnchantingTable; - mappings[270] = ItemType.EndPortalFrame; - mappings[271] = ItemType.EndStone; - mappings[272] = ItemType.EndStoneBricks; - mappings[273] = ItemType.DragonEgg; - mappings[274] = ItemType.RedstoneLamp; - mappings[275] = ItemType.SandstoneStairs; - mappings[276] = ItemType.EmeraldOre; - mappings[277] = ItemType.EnderChest; - mappings[278] = ItemType.TripwireHook; - mappings[279] = ItemType.EmeraldBlock; - mappings[280] = ItemType.SpruceStairs; - mappings[281] = ItemType.BirchStairs; - mappings[282] = ItemType.JungleStairs; - mappings[283] = ItemType.CrimsonStairs; - mappings[284] = ItemType.WarpedStairs; - mappings[285] = ItemType.CommandBlock; - mappings[286] = ItemType.Beacon; - mappings[287] = ItemType.CobblestoneWall; - mappings[288] = ItemType.MossyCobblestoneWall; - mappings[289] = ItemType.BrickWall; - mappings[290] = ItemType.PrismarineWall; - mappings[291] = ItemType.RedSandstoneWall; - mappings[292] = ItemType.MossyStoneBrickWall; - mappings[293] = ItemType.GraniteWall; - mappings[294] = ItemType.StoneBrickWall; - mappings[295] = ItemType.NetherBrickWall; - mappings[296] = ItemType.AndesiteWall; - mappings[297] = ItemType.RedNetherBrickWall; - mappings[298] = ItemType.SandstoneWall; - mappings[299] = ItemType.EndStoneBrickWall; - mappings[300] = ItemType.DioriteWall; - mappings[301] = ItemType.BlackstoneWall; - mappings[302] = ItemType.PolishedBlackstoneWall; - mappings[303] = ItemType.PolishedBlackstoneBrickWall; - mappings[304] = ItemType.StoneButton; - mappings[305] = ItemType.OakButton; - mappings[306] = ItemType.SpruceButton; - mappings[307] = ItemType.BirchButton; - mappings[308] = ItemType.JungleButton; - mappings[309] = ItemType.AcaciaButton; - mappings[310] = ItemType.DarkOakButton; - mappings[311] = ItemType.CrimsonButton; - mappings[312] = ItemType.WarpedButton; - mappings[313] = ItemType.PolishedBlackstoneButton; - mappings[314] = ItemType.Anvil; - mappings[315] = ItemType.ChippedAnvil; - mappings[316] = ItemType.DamagedAnvil; - mappings[317] = ItemType.TrappedChest; - mappings[318] = ItemType.LightWeightedPressurePlate; - mappings[319] = ItemType.HeavyWeightedPressurePlate; - mappings[320] = ItemType.DaylightDetector; - mappings[321] = ItemType.RedstoneBlock; - mappings[322] = ItemType.NetherQuartzOre; - mappings[323] = ItemType.Hopper; - mappings[324] = ItemType.ChiseledQuartzBlock; - mappings[325] = ItemType.QuartzBlock; - mappings[326] = ItemType.QuartzBricks; - mappings[327] = ItemType.QuartzPillar; - mappings[328] = ItemType.QuartzStairs; - mappings[329] = ItemType.ActivatorRail; - mappings[330] = ItemType.Dropper; - mappings[331] = ItemType.WhiteTerracotta; - mappings[332] = ItemType.OrangeTerracotta; - mappings[333] = ItemType.MagentaTerracotta; - mappings[334] = ItemType.LightBlueTerracotta; - mappings[335] = ItemType.YellowTerracotta; - mappings[336] = ItemType.LimeTerracotta; - mappings[337] = ItemType.PinkTerracotta; - mappings[338] = ItemType.GrayTerracotta; - mappings[339] = ItemType.LightGrayTerracotta; - mappings[340] = ItemType.CyanTerracotta; - mappings[341] = ItemType.PurpleTerracotta; - mappings[342] = ItemType.BlueTerracotta; - mappings[343] = ItemType.BrownTerracotta; - mappings[344] = ItemType.GreenTerracotta; - mappings[345] = ItemType.RedTerracotta; - mappings[346] = ItemType.BlackTerracotta; - mappings[347] = ItemType.Barrier; - mappings[348] = ItemType.IronTrapdoor; - mappings[349] = ItemType.HayBlock; - mappings[350] = ItemType.WhiteCarpet; - mappings[351] = ItemType.OrangeCarpet; - mappings[352] = ItemType.MagentaCarpet; - mappings[353] = ItemType.LightBlueCarpet; - mappings[354] = ItemType.YellowCarpet; - mappings[355] = ItemType.LimeCarpet; - mappings[356] = ItemType.PinkCarpet; - mappings[357] = ItemType.GrayCarpet; - mappings[358] = ItemType.LightGrayCarpet; - mappings[359] = ItemType.CyanCarpet; - mappings[360] = ItemType.PurpleCarpet; - mappings[361] = ItemType.BlueCarpet; - mappings[362] = ItemType.BrownCarpet; - mappings[363] = ItemType.GreenCarpet; - mappings[364] = ItemType.RedCarpet; - mappings[365] = ItemType.BlackCarpet; - mappings[366] = ItemType.Terracotta; - mappings[367] = ItemType.CoalBlock; - mappings[368] = ItemType.PackedIce; - mappings[369] = ItemType.AcaciaStairs; - mappings[370] = ItemType.DarkOakStairs; - mappings[371] = ItemType.SlimeBlock; - mappings[372] = ItemType.DirtPath; - mappings[373] = ItemType.Sunflower; - mappings[374] = ItemType.Lilac; - mappings[375] = ItemType.RoseBush; - mappings[376] = ItemType.Peony; - mappings[377] = ItemType.TallGrass; - mappings[378] = ItemType.LargeFern; - mappings[379] = ItemType.WhiteStainedGlass; - mappings[380] = ItemType.OrangeStainedGlass; - mappings[381] = ItemType.MagentaStainedGlass; - mappings[382] = ItemType.LightBlueStainedGlass; - mappings[383] = ItemType.YellowStainedGlass; - mappings[384] = ItemType.LimeStainedGlass; - mappings[385] = ItemType.PinkStainedGlass; - mappings[386] = ItemType.GrayStainedGlass; - mappings[387] = ItemType.LightGrayStainedGlass; - mappings[388] = ItemType.CyanStainedGlass; - mappings[389] = ItemType.PurpleStainedGlass; - mappings[390] = ItemType.BlueStainedGlass; - mappings[391] = ItemType.BrownStainedGlass; - mappings[392] = ItemType.GreenStainedGlass; - mappings[393] = ItemType.RedStainedGlass; - mappings[394] = ItemType.BlackStainedGlass; - mappings[395] = ItemType.WhiteStainedGlassPane; - mappings[396] = ItemType.OrangeStainedGlassPane; - mappings[397] = ItemType.MagentaStainedGlassPane; - mappings[398] = ItemType.LightBlueStainedGlassPane; - mappings[399] = ItemType.YellowStainedGlassPane; - mappings[400] = ItemType.LimeStainedGlassPane; - mappings[401] = ItemType.PinkStainedGlassPane; - mappings[402] = ItemType.GrayStainedGlassPane; - mappings[403] = ItemType.LightGrayStainedGlassPane; - mappings[404] = ItemType.CyanStainedGlassPane; - mappings[405] = ItemType.PurpleStainedGlassPane; - mappings[406] = ItemType.BlueStainedGlassPane; - mappings[407] = ItemType.BrownStainedGlassPane; - mappings[408] = ItemType.GreenStainedGlassPane; - mappings[409] = ItemType.RedStainedGlassPane; - mappings[410] = ItemType.BlackStainedGlassPane; - mappings[411] = ItemType.Prismarine; - mappings[412] = ItemType.PrismarineBricks; - mappings[413] = ItemType.DarkPrismarine; - mappings[414] = ItemType.PrismarineStairs; - mappings[415] = ItemType.PrismarineBrickStairs; - mappings[416] = ItemType.DarkPrismarineStairs; - mappings[417] = ItemType.SeaLantern; - mappings[418] = ItemType.RedSandstone; - mappings[419] = ItemType.ChiseledRedSandstone; - mappings[420] = ItemType.CutRedSandstone; - mappings[421] = ItemType.RedSandstoneStairs; - mappings[422] = ItemType.RepeatingCommandBlock; - mappings[423] = ItemType.ChainCommandBlock; - mappings[424] = ItemType.MagmaBlock; - mappings[425] = ItemType.NetherWartBlock; - mappings[426] = ItemType.WarpedWartBlock; - mappings[427] = ItemType.RedNetherBricks; - mappings[428] = ItemType.BoneBlock; - mappings[429] = ItemType.StructureVoid; - mappings[430] = ItemType.Observer; - mappings[431] = ItemType.ShulkerBox; - mappings[432] = ItemType.WhiteShulkerBox; - mappings[433] = ItemType.OrangeShulkerBox; - mappings[434] = ItemType.MagentaShulkerBox; - mappings[435] = ItemType.LightBlueShulkerBox; - mappings[436] = ItemType.YellowShulkerBox; - mappings[437] = ItemType.LimeShulkerBox; - mappings[438] = ItemType.PinkShulkerBox; - mappings[439] = ItemType.GrayShulkerBox; - mappings[440] = ItemType.LightGrayShulkerBox; - mappings[441] = ItemType.CyanShulkerBox; - mappings[442] = ItemType.PurpleShulkerBox; - mappings[443] = ItemType.BlueShulkerBox; - mappings[444] = ItemType.BrownShulkerBox; - mappings[445] = ItemType.GreenShulkerBox; - mappings[446] = ItemType.RedShulkerBox; - mappings[447] = ItemType.BlackShulkerBox; - mappings[448] = ItemType.WhiteGlazedTerracotta; - mappings[449] = ItemType.OrangeGlazedTerracotta; - mappings[450] = ItemType.MagentaGlazedTerracotta; - mappings[451] = ItemType.LightBlueGlazedTerracotta; - mappings[452] = ItemType.YellowGlazedTerracotta; - mappings[453] = ItemType.LimeGlazedTerracotta; - mappings[454] = ItemType.PinkGlazedTerracotta; - mappings[455] = ItemType.GrayGlazedTerracotta; - mappings[456] = ItemType.LightGrayGlazedTerracotta; - mappings[457] = ItemType.CyanGlazedTerracotta; - mappings[458] = ItemType.PurpleGlazedTerracotta; - mappings[459] = ItemType.BlueGlazedTerracotta; - mappings[460] = ItemType.BrownGlazedTerracotta; - mappings[461] = ItemType.GreenGlazedTerracotta; - mappings[462] = ItemType.RedGlazedTerracotta; - mappings[463] = ItemType.BlackGlazedTerracotta; - mappings[464] = ItemType.WhiteConcrete; - mappings[465] = ItemType.OrangeConcrete; - mappings[466] = ItemType.MagentaConcrete; - mappings[467] = ItemType.LightBlueConcrete; - mappings[468] = ItemType.YellowConcrete; - mappings[469] = ItemType.LimeConcrete; - mappings[470] = ItemType.PinkConcrete; - mappings[471] = ItemType.GrayConcrete; - mappings[472] = ItemType.LightGrayConcrete; - mappings[473] = ItemType.CyanConcrete; - mappings[474] = ItemType.PurpleConcrete; - mappings[475] = ItemType.BlueConcrete; - mappings[476] = ItemType.BrownConcrete; - mappings[477] = ItemType.GreenConcrete; - mappings[478] = ItemType.RedConcrete; - mappings[479] = ItemType.BlackConcrete; - mappings[480] = ItemType.WhiteConcretePowder; - mappings[481] = ItemType.OrangeConcretePowder; - mappings[482] = ItemType.MagentaConcretePowder; - mappings[483] = ItemType.LightBlueConcretePowder; - mappings[484] = ItemType.YellowConcretePowder; - mappings[485] = ItemType.LimeConcretePowder; - mappings[486] = ItemType.PinkConcretePowder; - mappings[487] = ItemType.GrayConcretePowder; - mappings[488] = ItemType.LightGrayConcretePowder; - mappings[489] = ItemType.CyanConcretePowder; - mappings[490] = ItemType.PurpleConcretePowder; - mappings[491] = ItemType.BlueConcretePowder; - mappings[492] = ItemType.BrownConcretePowder; - mappings[493] = ItemType.GreenConcretePowder; - mappings[494] = ItemType.RedConcretePowder; - mappings[495] = ItemType.BlackConcretePowder; - mappings[496] = ItemType.TurtleEgg; - mappings[497] = ItemType.DeadTubeCoralBlock; - mappings[498] = ItemType.DeadBrainCoralBlock; - mappings[499] = ItemType.DeadBubbleCoralBlock; - mappings[500] = ItemType.DeadFireCoralBlock; - mappings[501] = ItemType.DeadHornCoralBlock; - mappings[502] = ItemType.TubeCoralBlock; - mappings[503] = ItemType.BrainCoralBlock; - mappings[504] = ItemType.BubbleCoralBlock; - mappings[505] = ItemType.FireCoralBlock; - mappings[506] = ItemType.HornCoralBlock; - mappings[507] = ItemType.TubeCoral; - mappings[508] = ItemType.BrainCoral; - mappings[509] = ItemType.BubbleCoral; - mappings[510] = ItemType.FireCoral; - mappings[511] = ItemType.HornCoral; - mappings[512] = ItemType.DeadBrainCoral; - mappings[513] = ItemType.DeadBubbleCoral; - mappings[514] = ItemType.DeadFireCoral; - mappings[515] = ItemType.DeadHornCoral; - mappings[516] = ItemType.DeadTubeCoral; - mappings[517] = ItemType.TubeCoralFan; - mappings[518] = ItemType.BrainCoralFan; - mappings[519] = ItemType.BubbleCoralFan; - mappings[520] = ItemType.FireCoralFan; - mappings[521] = ItemType.HornCoralFan; - mappings[522] = ItemType.DeadTubeCoralFan; - mappings[523] = ItemType.DeadBrainCoralFan; - mappings[524] = ItemType.DeadBubbleCoralFan; - mappings[525] = ItemType.DeadFireCoralFan; - mappings[526] = ItemType.DeadHornCoralFan; - mappings[527] = ItemType.BlueIce; - mappings[528] = ItemType.Conduit; - mappings[529] = ItemType.PolishedGraniteStairs; - mappings[530] = ItemType.SmoothRedSandstoneStairs; - mappings[531] = ItemType.MossyStoneBrickStairs; - mappings[532] = ItemType.PolishedDioriteStairs; - mappings[533] = ItemType.MossyCobblestoneStairs; - mappings[534] = ItemType.EndStoneBrickStairs; - mappings[535] = ItemType.StoneStairs; - mappings[536] = ItemType.SmoothSandstoneStairs; - mappings[537] = ItemType.SmoothQuartzStairs; - mappings[538] = ItemType.GraniteStairs; - mappings[539] = ItemType.AndesiteStairs; - mappings[540] = ItemType.RedNetherBrickStairs; - mappings[541] = ItemType.PolishedAndesiteStairs; - mappings[542] = ItemType.DioriteStairs; - mappings[543] = ItemType.PolishedGraniteSlab; - mappings[544] = ItemType.SmoothRedSandstoneSlab; - mappings[545] = ItemType.MossyStoneBrickSlab; - mappings[546] = ItemType.PolishedDioriteSlab; - mappings[547] = ItemType.MossyCobblestoneSlab; - mappings[548] = ItemType.EndStoneBrickSlab; - mappings[549] = ItemType.SmoothSandstoneSlab; - mappings[550] = ItemType.SmoothQuartzSlab; - mappings[551] = ItemType.GraniteSlab; - mappings[552] = ItemType.AndesiteSlab; - mappings[553] = ItemType.RedNetherBrickSlab; - mappings[554] = ItemType.PolishedAndesiteSlab; - mappings[555] = ItemType.DioriteSlab; - mappings[556] = ItemType.Scaffolding; - mappings[557] = ItemType.IronDoor; - mappings[558] = ItemType.OakDoor; - mappings[559] = ItemType.SpruceDoor; - mappings[560] = ItemType.BirchDoor; - mappings[561] = ItemType.JungleDoor; - mappings[562] = ItemType.AcaciaDoor; - mappings[563] = ItemType.DarkOakDoor; - mappings[564] = ItemType.CrimsonDoor; - mappings[565] = ItemType.WarpedDoor; - mappings[566] = ItemType.Repeater; - mappings[567] = ItemType.Comparator; - mappings[568] = ItemType.StructureBlock; - mappings[569] = ItemType.Jigsaw; - mappings[570] = ItemType.TurtleHelmet; - mappings[571] = ItemType.TurtleScute; - mappings[572] = ItemType.FlintAndSteel; - mappings[573] = ItemType.Apple; - mappings[574] = ItemType.Bow; - mappings[575] = ItemType.Arrow; - mappings[576] = ItemType.Coal; - mappings[577] = ItemType.Charcoal; - mappings[578] = ItemType.Diamond; - mappings[579] = ItemType.IronIngot; - mappings[580] = ItemType.GoldIngot; - mappings[581] = ItemType.NetheriteIngot; - mappings[582] = ItemType.NetheriteScrap; - mappings[583] = ItemType.WoodenSword; - mappings[584] = ItemType.WoodenShovel; - mappings[585] = ItemType.WoodenPickaxe; - mappings[586] = ItemType.WoodenAxe; - mappings[587] = ItemType.WoodenHoe; - mappings[588] = ItemType.StoneSword; - mappings[589] = ItemType.StoneShovel; - mappings[590] = ItemType.StonePickaxe; - mappings[591] = ItemType.StoneAxe; - mappings[592] = ItemType.StoneHoe; - mappings[593] = ItemType.GoldenSword; - mappings[594] = ItemType.GoldenShovel; - mappings[595] = ItemType.GoldenPickaxe; - mappings[596] = ItemType.GoldenAxe; - mappings[597] = ItemType.GoldenHoe; - mappings[598] = ItemType.IronSword; - mappings[599] = ItemType.IronShovel; - mappings[600] = ItemType.IronPickaxe; - mappings[601] = ItemType.IronAxe; - mappings[602] = ItemType.IronHoe; - mappings[603] = ItemType.DiamondSword; - mappings[604] = ItemType.DiamondShovel; - mappings[605] = ItemType.DiamondPickaxe; - mappings[606] = ItemType.DiamondAxe; - mappings[607] = ItemType.DiamondHoe; - mappings[608] = ItemType.NetheriteSword; - mappings[609] = ItemType.NetheriteShovel; - mappings[610] = ItemType.NetheritePickaxe; - mappings[611] = ItemType.NetheriteAxe; - mappings[612] = ItemType.NetheriteHoe; - mappings[613] = ItemType.Stick; - mappings[614] = ItemType.Bowl; - mappings[615] = ItemType.MushroomStew; - mappings[616] = ItemType.String; - mappings[617] = ItemType.Feather; - mappings[618] = ItemType.Gunpowder; - mappings[619] = ItemType.WheatSeeds; - mappings[620] = ItemType.Wheat; - mappings[621] = ItemType.Bread; - mappings[622] = ItemType.LeatherHelmet; - mappings[623] = ItemType.LeatherChestplate; - mappings[624] = ItemType.LeatherLeggings; - mappings[625] = ItemType.LeatherBoots; - mappings[626] = ItemType.ChainmailHelmet; - mappings[627] = ItemType.ChainmailChestplate; - mappings[628] = ItemType.ChainmailLeggings; - mappings[629] = ItemType.ChainmailBoots; - mappings[630] = ItemType.IronHelmet; - mappings[631] = ItemType.IronChestplate; - mappings[632] = ItemType.IronLeggings; - mappings[633] = ItemType.IronBoots; - mappings[634] = ItemType.DiamondHelmet; - mappings[635] = ItemType.DiamondChestplate; - mappings[636] = ItemType.DiamondLeggings; - mappings[637] = ItemType.DiamondBoots; - mappings[638] = ItemType.GoldenHelmet; - mappings[639] = ItemType.GoldenChestplate; - mappings[640] = ItemType.GoldenLeggings; - mappings[641] = ItemType.GoldenBoots; - mappings[642] = ItemType.NetheriteHelmet; - mappings[643] = ItemType.NetheriteChestplate; - mappings[644] = ItemType.NetheriteLeggings; - mappings[645] = ItemType.NetheriteBoots; - mappings[646] = ItemType.Flint; - mappings[647] = ItemType.Porkchop; - mappings[648] = ItemType.CookedPorkchop; - mappings[649] = ItemType.Painting; - mappings[650] = ItemType.GoldenApple; - mappings[651] = ItemType.EnchantedGoldenApple; - mappings[652] = ItemType.OakSign; - mappings[653] = ItemType.SpruceSign; - mappings[654] = ItemType.BirchSign; - mappings[655] = ItemType.JungleSign; - mappings[656] = ItemType.AcaciaSign; - mappings[657] = ItemType.DarkOakSign; - mappings[658] = ItemType.CrimsonSign; - mappings[659] = ItemType.WarpedSign; - mappings[660] = ItemType.Bucket; - mappings[661] = ItemType.WaterBucket; - mappings[662] = ItemType.LavaBucket; - mappings[663] = ItemType.Minecart; - mappings[664] = ItemType.Saddle; - mappings[665] = ItemType.Redstone; - mappings[666] = ItemType.Snowball; - mappings[667] = ItemType.OakBoat; - mappings[668] = ItemType.Leather; - mappings[669] = ItemType.MilkBucket; - mappings[670] = ItemType.PufferfishBucket; - mappings[671] = ItemType.SalmonBucket; - mappings[672] = ItemType.CodBucket; - mappings[673] = ItemType.TropicalFishBucket; - mappings[674] = ItemType.Brick; - mappings[675] = ItemType.ClayBall; - mappings[676] = ItemType.DriedKelpBlock; - mappings[677] = ItemType.Paper; - mappings[678] = ItemType.Book; - mappings[679] = ItemType.SlimeBall; - mappings[680] = ItemType.ChestMinecart; - mappings[681] = ItemType.FurnaceMinecart; - mappings[682] = ItemType.Egg; - mappings[683] = ItemType.Compass; - mappings[684] = ItemType.FishingRod; - mappings[685] = ItemType.Clock; - mappings[686] = ItemType.GlowstoneDust; - mappings[687] = ItemType.Cod; - mappings[688] = ItemType.Salmon; - mappings[689] = ItemType.TropicalFish; - mappings[690] = ItemType.Pufferfish; - mappings[691] = ItemType.CookedCod; - mappings[692] = ItemType.CookedSalmon; - mappings[693] = ItemType.InkSac; - mappings[694] = ItemType.CocoaBeans; - mappings[695] = ItemType.LapisLazuli; - mappings[696] = ItemType.WhiteDye; - mappings[697] = ItemType.OrangeDye; - mappings[698] = ItemType.MagentaDye; - mappings[699] = ItemType.LightBlueDye; - mappings[700] = ItemType.YellowDye; - mappings[701] = ItemType.LimeDye; - mappings[702] = ItemType.PinkDye; - mappings[703] = ItemType.GrayDye; - mappings[704] = ItemType.LightGrayDye; - mappings[705] = ItemType.CyanDye; - mappings[706] = ItemType.PurpleDye; - mappings[707] = ItemType.BlueDye; - mappings[708] = ItemType.BrownDye; - mappings[709] = ItemType.GreenDye; - mappings[710] = ItemType.RedDye; - mappings[711] = ItemType.BlackDye; - mappings[712] = ItemType.BoneMeal; - mappings[713] = ItemType.Bone; - mappings[714] = ItemType.Sugar; - mappings[715] = ItemType.Cake; - mappings[716] = ItemType.WhiteBed; - mappings[717] = ItemType.OrangeBed; - mappings[718] = ItemType.MagentaBed; - mappings[719] = ItemType.LightBlueBed; - mappings[720] = ItemType.YellowBed; - mappings[721] = ItemType.LimeBed; - mappings[722] = ItemType.PinkBed; - mappings[723] = ItemType.GrayBed; - mappings[724] = ItemType.LightGrayBed; - mappings[725] = ItemType.CyanBed; - mappings[726] = ItemType.PurpleBed; - mappings[727] = ItemType.BlueBed; - mappings[728] = ItemType.BrownBed; - mappings[729] = ItemType.GreenBed; - mappings[730] = ItemType.RedBed; - mappings[731] = ItemType.BlackBed; - mappings[732] = ItemType.Cookie; - mappings[733] = ItemType.FilledMap; - mappings[734] = ItemType.Shears; - mappings[735] = ItemType.MelonSlice; - mappings[736] = ItemType.DriedKelp; - mappings[737] = ItemType.PumpkinSeeds; - mappings[738] = ItemType.MelonSeeds; - mappings[739] = ItemType.Beef; - mappings[740] = ItemType.CookedBeef; - mappings[741] = ItemType.Chicken; - mappings[742] = ItemType.CookedChicken; - mappings[743] = ItemType.RottenFlesh; - mappings[744] = ItemType.EnderPearl; - mappings[745] = ItemType.BlazeRod; - mappings[746] = ItemType.GhastTear; - mappings[747] = ItemType.GoldNugget; - mappings[748] = ItemType.NetherWart; - mappings[749] = ItemType.Potion; - mappings[750] = ItemType.GlassBottle; - mappings[751] = ItemType.SpiderEye; - mappings[752] = ItemType.FermentedSpiderEye; - mappings[753] = ItemType.BlazePowder; - mappings[754] = ItemType.MagmaCream; - mappings[755] = ItemType.BrewingStand; - mappings[756] = ItemType.Cauldron; - mappings[757] = ItemType.EnderEye; - mappings[758] = ItemType.GlisteringMelonSlice; - mappings[759] = ItemType.BatSpawnEgg; - mappings[760] = ItemType.BeeSpawnEgg; - mappings[761] = ItemType.BlazeSpawnEgg; - mappings[762] = ItemType.CatSpawnEgg; - mappings[763] = ItemType.CaveSpiderSpawnEgg; - mappings[764] = ItemType.ChickenSpawnEgg; - mappings[765] = ItemType.CodSpawnEgg; - mappings[766] = ItemType.CowSpawnEgg; - mappings[767] = ItemType.CreeperSpawnEgg; - mappings[768] = ItemType.DolphinSpawnEgg; - mappings[769] = ItemType.DonkeySpawnEgg; - mappings[770] = ItemType.DrownedSpawnEgg; - mappings[771] = ItemType.ElderGuardianSpawnEgg; - mappings[772] = ItemType.EndermanSpawnEgg; - mappings[773] = ItemType.EndermiteSpawnEgg; - mappings[774] = ItemType.EvokerSpawnEgg; - mappings[775] = ItemType.FoxSpawnEgg; - mappings[776] = ItemType.GhastSpawnEgg; - mappings[777] = ItemType.GuardianSpawnEgg; - mappings[778] = ItemType.HoglinSpawnEgg; - mappings[779] = ItemType.HorseSpawnEgg; - mappings[780] = ItemType.HuskSpawnEgg; - mappings[781] = ItemType.LlamaSpawnEgg; - mappings[782] = ItemType.MagmaCubeSpawnEgg; - mappings[783] = ItemType.MooshroomSpawnEgg; - mappings[784] = ItemType.MuleSpawnEgg; - mappings[785] = ItemType.OcelotSpawnEgg; - mappings[786] = ItemType.PandaSpawnEgg; - mappings[787] = ItemType.ParrotSpawnEgg; - mappings[788] = ItemType.PhantomSpawnEgg; - mappings[789] = ItemType.PigSpawnEgg; - mappings[790] = ItemType.PiglinSpawnEgg; - mappings[791] = ItemType.PiglinBruteSpawnEgg; - mappings[792] = ItemType.PillagerSpawnEgg; - mappings[793] = ItemType.PolarBearSpawnEgg; - mappings[794] = ItemType.PufferfishSpawnEgg; - mappings[795] = ItemType.RabbitSpawnEgg; - mappings[796] = ItemType.RavagerSpawnEgg; - mappings[797] = ItemType.SalmonSpawnEgg; - mappings[798] = ItemType.SheepSpawnEgg; - mappings[799] = ItemType.ShulkerSpawnEgg; - mappings[800] = ItemType.SilverfishSpawnEgg; - mappings[801] = ItemType.SkeletonSpawnEgg; - mappings[802] = ItemType.SkeletonHorseSpawnEgg; - mappings[803] = ItemType.SlimeSpawnEgg; - mappings[804] = ItemType.SpiderSpawnEgg; - mappings[805] = ItemType.SquidSpawnEgg; - mappings[806] = ItemType.StraySpawnEgg; - mappings[807] = ItemType.StriderSpawnEgg; - mappings[808] = ItemType.TraderLlamaSpawnEgg; - mappings[809] = ItemType.TropicalFishSpawnEgg; - mappings[810] = ItemType.TurtleSpawnEgg; - mappings[811] = ItemType.VexSpawnEgg; - mappings[812] = ItemType.VillagerSpawnEgg; - mappings[813] = ItemType.VindicatorSpawnEgg; - mappings[814] = ItemType.WanderingTraderSpawnEgg; - mappings[815] = ItemType.WitchSpawnEgg; - mappings[816] = ItemType.WitherSkeletonSpawnEgg; - mappings[817] = ItemType.WolfSpawnEgg; - mappings[818] = ItemType.ZoglinSpawnEgg; - mappings[819] = ItemType.ZombieSpawnEgg; - mappings[820] = ItemType.ZombieHorseSpawnEgg; - mappings[821] = ItemType.ZombieVillagerSpawnEgg; - mappings[822] = ItemType.ZombifiedPiglinSpawnEgg; - mappings[823] = ItemType.ExperienceBottle; - mappings[824] = ItemType.FireCharge; - mappings[825] = ItemType.WritableBook; - mappings[826] = ItemType.WrittenBook; - mappings[827] = ItemType.Emerald; - mappings[828] = ItemType.ItemFrame; - mappings[829] = ItemType.FlowerPot; - mappings[830] = ItemType.Carrot; - mappings[831] = ItemType.Potato; - mappings[832] = ItemType.BakedPotato; - mappings[833] = ItemType.PoisonousPotato; - mappings[834] = ItemType.Map; - mappings[835] = ItemType.GoldenCarrot; - mappings[836] = ItemType.SkeletonSkull; - mappings[837] = ItemType.WitherSkeletonSkull; - mappings[838] = ItemType.PlayerHead; - mappings[839] = ItemType.ZombieHead; - mappings[840] = ItemType.CreeperHead; - mappings[841] = ItemType.DragonHead; - mappings[842] = ItemType.CarrotOnAStick; - mappings[843] = ItemType.WarpedFungusOnAStick; - mappings[844] = ItemType.NetherStar; - mappings[845] = ItemType.PumpkinPie; - mappings[846] = ItemType.FireworkRocket; - mappings[847] = ItemType.FireworkStar; - mappings[848] = ItemType.EnchantedBook; - mappings[849] = ItemType.NetherBrick; - mappings[850] = ItemType.Quartz; - mappings[851] = ItemType.TntMinecart; - mappings[852] = ItemType.HopperMinecart; - mappings[853] = ItemType.PrismarineShard; - mappings[854] = ItemType.PrismarineCrystals; - mappings[855] = ItemType.Rabbit; - mappings[856] = ItemType.CookedRabbit; - mappings[857] = ItemType.RabbitStew; - mappings[858] = ItemType.RabbitFoot; - mappings[859] = ItemType.RabbitHide; - mappings[860] = ItemType.ArmorStand; - mappings[861] = ItemType.IronHorseArmor; - mappings[862] = ItemType.GoldenHorseArmor; - mappings[863] = ItemType.DiamondHorseArmor; - mappings[864] = ItemType.LeatherHorseArmor; - mappings[865] = ItemType.Lead; - mappings[866] = ItemType.NameTag; - mappings[867] = ItemType.CommandBlockMinecart; - mappings[868] = ItemType.Mutton; - mappings[869] = ItemType.CookedMutton; - mappings[870] = ItemType.WhiteBanner; - mappings[871] = ItemType.OrangeBanner; - mappings[872] = ItemType.MagentaBanner; - mappings[873] = ItemType.LightBlueBanner; - mappings[874] = ItemType.YellowBanner; - mappings[875] = ItemType.LimeBanner; - mappings[876] = ItemType.PinkBanner; - mappings[877] = ItemType.GrayBanner; - mappings[878] = ItemType.LightGrayBanner; - mappings[879] = ItemType.CyanBanner; - mappings[880] = ItemType.PurpleBanner; - mappings[881] = ItemType.BlueBanner; - mappings[882] = ItemType.BrownBanner; - mappings[883] = ItemType.GreenBanner; - mappings[884] = ItemType.RedBanner; - mappings[885] = ItemType.BlackBanner; - mappings[886] = ItemType.EndCrystal; - mappings[887] = ItemType.ChorusFruit; - mappings[888] = ItemType.PoppedChorusFruit; - mappings[889] = ItemType.Beetroot; - mappings[890] = ItemType.BeetrootSeeds; - mappings[891] = ItemType.BeetrootSoup; - mappings[892] = ItemType.DragonBreath; - mappings[893] = ItemType.SplashPotion; - mappings[894] = ItemType.SpectralArrow; - mappings[895] = ItemType.TippedArrow; - mappings[896] = ItemType.LingeringPotion; - mappings[897] = ItemType.Shield; - mappings[898] = ItemType.Elytra; - mappings[899] = ItemType.SpruceBoat; - mappings[900] = ItemType.BirchBoat; - mappings[901] = ItemType.JungleBoat; - mappings[902] = ItemType.AcaciaBoat; - mappings[903] = ItemType.DarkOakBoat; - mappings[904] = ItemType.TotemOfUndying; - mappings[905] = ItemType.ShulkerShell; - mappings[906] = ItemType.IronNugget; - mappings[907] = ItemType.KnowledgeBook; - mappings[908] = ItemType.DebugStick; - mappings[909] = ItemType.MusicDisc13; - mappings[910] = ItemType.MusicDiscCat; - mappings[911] = ItemType.MusicDiscBlocks; - mappings[912] = ItemType.MusicDiscChirp; - mappings[913] = ItemType.MusicDiscFar; - mappings[914] = ItemType.MusicDiscMall; - mappings[915] = ItemType.MusicDiscMellohi; - mappings[916] = ItemType.MusicDiscStal; - mappings[917] = ItemType.MusicDiscStrad; - mappings[918] = ItemType.MusicDiscWard; - mappings[919] = ItemType.MusicDisc11; - mappings[920] = ItemType.MusicDiscWait; - mappings[921] = ItemType.MusicDiscPigstep; - mappings[922] = ItemType.Trident; - mappings[923] = ItemType.PhantomMembrane; - mappings[924] = ItemType.NautilusShell; - mappings[925] = ItemType.HeartOfTheSea; - mappings[926] = ItemType.Crossbow; - mappings[927] = ItemType.SuspiciousStew; - mappings[928] = ItemType.Loom; - mappings[929] = ItemType.FlowerBannerPattern; - mappings[930] = ItemType.CreeperBannerPattern; - mappings[931] = ItemType.SkullBannerPattern; - mappings[932] = ItemType.MojangBannerPattern; - mappings[933] = ItemType.GlobeBannerPattern; - mappings[934] = ItemType.PiglinBannerPattern; - mappings[935] = ItemType.Composter; - mappings[936] = ItemType.Barrel; - mappings[937] = ItemType.Smoker; - mappings[938] = ItemType.BlastFurnace; - mappings[939] = ItemType.CartographyTable; - mappings[940] = ItemType.FletchingTable; - mappings[941] = ItemType.Grindstone; - mappings[942] = ItemType.Lectern; - mappings[943] = ItemType.SmithingTable; - mappings[944] = ItemType.Stonecutter; - mappings[945] = ItemType.Bell; - mappings[946] = ItemType.Lantern; - mappings[947] = ItemType.SoulLantern; - mappings[948] = ItemType.SweetBerries; - mappings[949] = ItemType.Campfire; - mappings[950] = ItemType.SoulCampfire; - mappings[951] = ItemType.Shroomlight; - mappings[952] = ItemType.Honeycomb; - mappings[953] = ItemType.BeeNest; - mappings[954] = ItemType.Beehive; - mappings[955] = ItemType.HoneyBottle; - mappings[956] = ItemType.HoneyBlock; - mappings[957] = ItemType.HoneycombBlock; - mappings[958] = ItemType.Lodestone; - mappings[959] = ItemType.NetheriteBlock; - mappings[960] = ItemType.AncientDebris; - mappings[961] = ItemType.Target; - mappings[962] = ItemType.CryingObsidian; - mappings[963] = ItemType.Blackstone; - mappings[964] = ItemType.BlackstoneSlab; - mappings[965] = ItemType.BlackstoneStairs; - mappings[966] = ItemType.GildedBlackstone; - mappings[967] = ItemType.PolishedBlackstone; - mappings[968] = ItemType.PolishedBlackstoneSlab; - mappings[969] = ItemType.PolishedBlackstoneStairs; - mappings[970] = ItemType.ChiseledPolishedBlackstone; - mappings[971] = ItemType.PolishedBlackstoneBricks; - mappings[972] = ItemType.PolishedBlackstoneBrickSlab; - mappings[973] = ItemType.PolishedBlackstoneBrickStairs; - mappings[974] = ItemType.CrackedPolishedBlackstoneBricks; - mappings[975] = ItemType.RespawnAnchor; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette117.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette117.cs deleted file mode 100644 index be1bd51716..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette117.cs +++ /dev/null @@ -1,1118 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public class ItemPalette117 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette117() - { - mappings[0] = ItemType.Air; - mappings[1] = ItemType.Stone; - mappings[2] = ItemType.Granite; - mappings[3] = ItemType.PolishedGranite; - mappings[4] = ItemType.Diorite; - mappings[5] = ItemType.PolishedDiorite; - mappings[6] = ItemType.Andesite; - mappings[7] = ItemType.PolishedAndesite; - mappings[8] = ItemType.Deepslate; - mappings[9] = ItemType.CobbledDeepslate; - mappings[10] = ItemType.PolishedDeepslate; - mappings[11] = ItemType.Calcite; - mappings[12] = ItemType.Tuff; - mappings[13] = ItemType.DripstoneBlock; - mappings[14] = ItemType.GrassBlock; - mappings[15] = ItemType.Dirt; - mappings[16] = ItemType.CoarseDirt; - mappings[17] = ItemType.Podzol; - mappings[18] = ItemType.RootedDirt; - mappings[19] = ItemType.CrimsonNylium; - mappings[20] = ItemType.WarpedNylium; - mappings[21] = ItemType.Cobblestone; - mappings[22] = ItemType.OakPlanks; - mappings[23] = ItemType.SprucePlanks; - mappings[24] = ItemType.BirchPlanks; - mappings[25] = ItemType.JunglePlanks; - mappings[26] = ItemType.AcaciaPlanks; - mappings[27] = ItemType.DarkOakPlanks; - mappings[28] = ItemType.CrimsonPlanks; - mappings[29] = ItemType.WarpedPlanks; - mappings[30] = ItemType.OakSapling; - mappings[31] = ItemType.SpruceSapling; - mappings[32] = ItemType.BirchSapling; - mappings[33] = ItemType.JungleSapling; - mappings[34] = ItemType.AcaciaSapling; - mappings[35] = ItemType.DarkOakSapling; - mappings[36] = ItemType.Bedrock; - mappings[37] = ItemType.Sand; - mappings[38] = ItemType.RedSand; - mappings[39] = ItemType.Gravel; - mappings[40] = ItemType.CoalOre; - mappings[41] = ItemType.DeepslateCoalOre; - mappings[42] = ItemType.IronOre; - mappings[43] = ItemType.DeepslateIronOre; - mappings[44] = ItemType.CopperOre; - mappings[45] = ItemType.DeepslateCopperOre; - mappings[46] = ItemType.GoldOre; - mappings[47] = ItemType.DeepslateGoldOre; - mappings[48] = ItemType.RedstoneOre; - mappings[49] = ItemType.DeepslateRedstoneOre; - mappings[50] = ItemType.EmeraldOre; - mappings[51] = ItemType.DeepslateEmeraldOre; - mappings[52] = ItemType.LapisOre; - mappings[53] = ItemType.DeepslateLapisOre; - mappings[54] = ItemType.DiamondOre; - mappings[55] = ItemType.DeepslateDiamondOre; - mappings[56] = ItemType.NetherGoldOre; - mappings[57] = ItemType.NetherQuartzOre; - mappings[58] = ItemType.AncientDebris; - mappings[59] = ItemType.CoalBlock; - mappings[60] = ItemType.RawIronBlock; - mappings[61] = ItemType.RawCopperBlock; - mappings[62] = ItemType.RawGoldBlock; - mappings[63] = ItemType.AmethystBlock; - mappings[64] = ItemType.BuddingAmethyst; - mappings[65] = ItemType.IronBlock; - mappings[66] = ItemType.CopperBlock; - mappings[67] = ItemType.GoldBlock; - mappings[68] = ItemType.DiamondBlock; - mappings[69] = ItemType.NetheriteBlock; - mappings[70] = ItemType.ExposedCopper; - mappings[71] = ItemType.WeatheredCopper; - mappings[72] = ItemType.OxidizedCopper; - mappings[73] = ItemType.CutCopper; - mappings[74] = ItemType.ExposedCutCopper; - mappings[75] = ItemType.WeatheredCutCopper; - mappings[76] = ItemType.OxidizedCutCopper; - mappings[77] = ItemType.CutCopperStairs; - mappings[78] = ItemType.ExposedCutCopperStairs; - mappings[79] = ItemType.WeatheredCutCopperStairs; - mappings[80] = ItemType.OxidizedCutCopperStairs; - mappings[81] = ItemType.CutCopperSlab; - mappings[82] = ItemType.ExposedCutCopperSlab; - mappings[83] = ItemType.WeatheredCutCopperSlab; - mappings[84] = ItemType.OxidizedCutCopperSlab; - mappings[85] = ItemType.WaxedCopperBlock; - mappings[86] = ItemType.WaxedExposedCopper; - mappings[87] = ItemType.WaxedWeatheredCopper; - mappings[88] = ItemType.WaxedOxidizedCopper; - mappings[89] = ItemType.WaxedCutCopper; - mappings[90] = ItemType.WaxedExposedCutCopper; - mappings[91] = ItemType.WaxedWeatheredCutCopper; - mappings[92] = ItemType.WaxedOxidizedCutCopper; - mappings[93] = ItemType.WaxedCutCopperStairs; - mappings[94] = ItemType.WaxedExposedCutCopperStairs; - mappings[95] = ItemType.WaxedWeatheredCutCopperStairs; - mappings[96] = ItemType.WaxedOxidizedCutCopperStairs; - mappings[97] = ItemType.WaxedCutCopperSlab; - mappings[98] = ItemType.WaxedExposedCutCopperSlab; - mappings[99] = ItemType.WaxedWeatheredCutCopperSlab; - mappings[100] = ItemType.WaxedOxidizedCutCopperSlab; - mappings[101] = ItemType.OakLog; - mappings[102] = ItemType.SpruceLog; - mappings[103] = ItemType.BirchLog; - mappings[104] = ItemType.JungleLog; - mappings[105] = ItemType.AcaciaLog; - mappings[106] = ItemType.DarkOakLog; - mappings[107] = ItemType.CrimsonStem; - mappings[108] = ItemType.WarpedStem; - mappings[109] = ItemType.StrippedOakLog; - mappings[110] = ItemType.StrippedSpruceLog; - mappings[111] = ItemType.StrippedBirchLog; - mappings[112] = ItemType.StrippedJungleLog; - mappings[113] = ItemType.StrippedAcaciaLog; - mappings[114] = ItemType.StrippedDarkOakLog; - mappings[115] = ItemType.StrippedCrimsonStem; - mappings[116] = ItemType.StrippedWarpedStem; - mappings[117] = ItemType.StrippedOakWood; - mappings[118] = ItemType.StrippedSpruceWood; - mappings[119] = ItemType.StrippedBirchWood; - mappings[120] = ItemType.StrippedJungleWood; - mappings[121] = ItemType.StrippedAcaciaWood; - mappings[122] = ItemType.StrippedDarkOakWood; - mappings[123] = ItemType.StrippedCrimsonHyphae; - mappings[124] = ItemType.StrippedWarpedHyphae; - mappings[125] = ItemType.OakWood; - mappings[126] = ItemType.SpruceWood; - mappings[127] = ItemType.BirchWood; - mappings[128] = ItemType.JungleWood; - mappings[129] = ItemType.AcaciaWood; - mappings[130] = ItemType.DarkOakWood; - mappings[131] = ItemType.CrimsonHyphae; - mappings[132] = ItemType.WarpedHyphae; - mappings[133] = ItemType.OakLeaves; - mappings[134] = ItemType.SpruceLeaves; - mappings[135] = ItemType.BirchLeaves; - mappings[136] = ItemType.JungleLeaves; - mappings[137] = ItemType.AcaciaLeaves; - mappings[138] = ItemType.DarkOakLeaves; - mappings[139] = ItemType.AzaleaLeaves; - mappings[140] = ItemType.FloweringAzaleaLeaves; - mappings[141] = ItemType.Sponge; - mappings[142] = ItemType.WetSponge; - mappings[143] = ItemType.Glass; - mappings[144] = ItemType.TintedGlass; - mappings[145] = ItemType.LapisBlock; - mappings[146] = ItemType.Sandstone; - mappings[147] = ItemType.ChiseledSandstone; - mappings[148] = ItemType.CutSandstone; - mappings[149] = ItemType.Cobweb; - mappings[150] = ItemType.ShortGrass; - mappings[151] = ItemType.Fern; - mappings[152] = ItemType.Azalea; - mappings[153] = ItemType.FloweringAzalea; - mappings[154] = ItemType.DeadBush; - mappings[155] = ItemType.Seagrass; - mappings[156] = ItemType.SeaPickle; - mappings[157] = ItemType.WhiteWool; - mappings[158] = ItemType.OrangeWool; - mappings[159] = ItemType.MagentaWool; - mappings[160] = ItemType.LightBlueWool; - mappings[161] = ItemType.YellowWool; - mappings[162] = ItemType.LimeWool; - mappings[163] = ItemType.PinkWool; - mappings[164] = ItemType.GrayWool; - mappings[165] = ItemType.LightGrayWool; - mappings[166] = ItemType.CyanWool; - mappings[167] = ItemType.PurpleWool; - mappings[168] = ItemType.BlueWool; - mappings[169] = ItemType.BrownWool; - mappings[170] = ItemType.GreenWool; - mappings[171] = ItemType.RedWool; - mappings[172] = ItemType.BlackWool; - mappings[173] = ItemType.Dandelion; - mappings[174] = ItemType.Poppy; - mappings[175] = ItemType.BlueOrchid; - mappings[176] = ItemType.Allium; - mappings[177] = ItemType.AzureBluet; - mappings[178] = ItemType.RedTulip; - mappings[179] = ItemType.OrangeTulip; - mappings[180] = ItemType.WhiteTulip; - mappings[181] = ItemType.PinkTulip; - mappings[182] = ItemType.OxeyeDaisy; - mappings[183] = ItemType.Cornflower; - mappings[184] = ItemType.LilyOfTheValley; - mappings[185] = ItemType.WitherRose; - mappings[186] = ItemType.SporeBlossom; - mappings[187] = ItemType.BrownMushroom; - mappings[188] = ItemType.RedMushroom; - mappings[189] = ItemType.CrimsonFungus; - mappings[190] = ItemType.WarpedFungus; - mappings[191] = ItemType.CrimsonRoots; - mappings[192] = ItemType.WarpedRoots; - mappings[193] = ItemType.NetherSprouts; - mappings[194] = ItemType.WeepingVines; - mappings[195] = ItemType.TwistingVines; - mappings[196] = ItemType.SugarCane; - mappings[197] = ItemType.Kelp; - mappings[198] = ItemType.MossCarpet; - mappings[199] = ItemType.MossBlock; - mappings[200] = ItemType.HangingRoots; - mappings[201] = ItemType.BigDripleaf; - mappings[202] = ItemType.SmallDripleaf; - mappings[203] = ItemType.Bamboo; - mappings[204] = ItemType.OakSlab; - mappings[205] = ItemType.SpruceSlab; - mappings[206] = ItemType.BirchSlab; - mappings[207] = ItemType.JungleSlab; - mappings[208] = ItemType.AcaciaSlab; - mappings[209] = ItemType.DarkOakSlab; - mappings[210] = ItemType.CrimsonSlab; - mappings[211] = ItemType.WarpedSlab; - mappings[212] = ItemType.StoneSlab; - mappings[213] = ItemType.SmoothStoneSlab; - mappings[214] = ItemType.SandstoneSlab; - mappings[215] = ItemType.CutSandstoneSlab; - mappings[216] = ItemType.PetrifiedOakSlab; - mappings[217] = ItemType.CobblestoneSlab; - mappings[218] = ItemType.BrickSlab; - mappings[219] = ItemType.StoneBrickSlab; - mappings[220] = ItemType.NetherBrickSlab; - mappings[221] = ItemType.QuartzSlab; - mappings[222] = ItemType.RedSandstoneSlab; - mappings[223] = ItemType.CutRedSandstoneSlab; - mappings[224] = ItemType.PurpurSlab; - mappings[225] = ItemType.PrismarineSlab; - mappings[226] = ItemType.PrismarineBrickSlab; - mappings[227] = ItemType.DarkPrismarineSlab; - mappings[228] = ItemType.SmoothQuartz; - mappings[229] = ItemType.SmoothRedSandstone; - mappings[230] = ItemType.SmoothSandstone; - mappings[231] = ItemType.SmoothStone; - mappings[232] = ItemType.Bricks; - mappings[233] = ItemType.Bookshelf; - mappings[234] = ItemType.MossyCobblestone; - mappings[235] = ItemType.Obsidian; - mappings[236] = ItemType.Torch; - mappings[237] = ItemType.EndRod; - mappings[238] = ItemType.ChorusPlant; - mappings[239] = ItemType.ChorusFlower; - mappings[240] = ItemType.PurpurBlock; - mappings[241] = ItemType.PurpurPillar; - mappings[242] = ItemType.PurpurStairs; - mappings[243] = ItemType.Spawner; - mappings[244] = ItemType.OakStairs; - mappings[245] = ItemType.Chest; - mappings[246] = ItemType.CraftingTable; - mappings[247] = ItemType.Farmland; - mappings[248] = ItemType.Furnace; - mappings[249] = ItemType.Ladder; - mappings[250] = ItemType.CobblestoneStairs; - mappings[251] = ItemType.Snow; - mappings[252] = ItemType.Ice; - mappings[253] = ItemType.SnowBlock; - mappings[254] = ItemType.Cactus; - mappings[255] = ItemType.Clay; - mappings[256] = ItemType.Jukebox; - mappings[257] = ItemType.OakFence; - mappings[258] = ItemType.SpruceFence; - mappings[259] = ItemType.BirchFence; - mappings[260] = ItemType.JungleFence; - mappings[261] = ItemType.AcaciaFence; - mappings[262] = ItemType.DarkOakFence; - mappings[263] = ItemType.CrimsonFence; - mappings[264] = ItemType.WarpedFence; - mappings[265] = ItemType.Pumpkin; - mappings[266] = ItemType.CarvedPumpkin; - mappings[267] = ItemType.JackOLantern; - mappings[268] = ItemType.Netherrack; - mappings[269] = ItemType.SoulSand; - mappings[270] = ItemType.SoulSoil; - mappings[271] = ItemType.Basalt; - mappings[272] = ItemType.PolishedBasalt; - mappings[273] = ItemType.SmoothBasalt; - mappings[274] = ItemType.SoulTorch; - mappings[275] = ItemType.Glowstone; - mappings[276] = ItemType.InfestedStone; - mappings[277] = ItemType.InfestedCobblestone; - mappings[278] = ItemType.InfestedStoneBricks; - mappings[279] = ItemType.InfestedMossyStoneBricks; - mappings[280] = ItemType.InfestedCrackedStoneBricks; - mappings[281] = ItemType.InfestedChiseledStoneBricks; - mappings[282] = ItemType.InfestedDeepslate; - mappings[283] = ItemType.StoneBricks; - mappings[284] = ItemType.MossyStoneBricks; - mappings[285] = ItemType.CrackedStoneBricks; - mappings[286] = ItemType.ChiseledStoneBricks; - mappings[287] = ItemType.DeepslateBricks; - mappings[288] = ItemType.CrackedDeepslateBricks; - mappings[289] = ItemType.DeepslateTiles; - mappings[290] = ItemType.CrackedDeepslateTiles; - mappings[291] = ItemType.ChiseledDeepslate; - mappings[292] = ItemType.BrownMushroomBlock; - mappings[293] = ItemType.RedMushroomBlock; - mappings[294] = ItemType.MushroomStem; - mappings[295] = ItemType.IronBars; - mappings[296] = ItemType.Chain; - mappings[297] = ItemType.GlassPane; - mappings[298] = ItemType.Melon; - mappings[299] = ItemType.Vine; - mappings[300] = ItemType.GlowLichen; - mappings[301] = ItemType.BrickStairs; - mappings[302] = ItemType.StoneBrickStairs; - mappings[303] = ItemType.Mycelium; - mappings[304] = ItemType.LilyPad; - mappings[305] = ItemType.NetherBricks; - mappings[306] = ItemType.CrackedNetherBricks; - mappings[307] = ItemType.ChiseledNetherBricks; - mappings[308] = ItemType.NetherBrickFence; - mappings[309] = ItemType.NetherBrickStairs; - mappings[310] = ItemType.EnchantingTable; - mappings[311] = ItemType.EndPortalFrame; - mappings[312] = ItemType.EndStone; - mappings[313] = ItemType.EndStoneBricks; - mappings[314] = ItemType.DragonEgg; - mappings[315] = ItemType.SandstoneStairs; - mappings[316] = ItemType.EnderChest; - mappings[317] = ItemType.EmeraldBlock; - mappings[318] = ItemType.SpruceStairs; - mappings[319] = ItemType.BirchStairs; - mappings[320] = ItemType.JungleStairs; - mappings[321] = ItemType.CrimsonStairs; - mappings[322] = ItemType.WarpedStairs; - mappings[323] = ItemType.CommandBlock; - mappings[324] = ItemType.Beacon; - mappings[325] = ItemType.CobblestoneWall; - mappings[326] = ItemType.MossyCobblestoneWall; - mappings[327] = ItemType.BrickWall; - mappings[328] = ItemType.PrismarineWall; - mappings[329] = ItemType.RedSandstoneWall; - mappings[330] = ItemType.MossyStoneBrickWall; - mappings[331] = ItemType.GraniteWall; - mappings[332] = ItemType.StoneBrickWall; - mappings[333] = ItemType.NetherBrickWall; - mappings[334] = ItemType.AndesiteWall; - mappings[335] = ItemType.RedNetherBrickWall; - mappings[336] = ItemType.SandstoneWall; - mappings[337] = ItemType.EndStoneBrickWall; - mappings[338] = ItemType.DioriteWall; - mappings[339] = ItemType.BlackstoneWall; - mappings[340] = ItemType.PolishedBlackstoneWall; - mappings[341] = ItemType.PolishedBlackstoneBrickWall; - mappings[342] = ItemType.CobbledDeepslateWall; - mappings[343] = ItemType.PolishedDeepslateWall; - mappings[344] = ItemType.DeepslateBrickWall; - mappings[345] = ItemType.DeepslateTileWall; - mappings[346] = ItemType.Anvil; - mappings[347] = ItemType.ChippedAnvil; - mappings[348] = ItemType.DamagedAnvil; - mappings[349] = ItemType.ChiseledQuartzBlock; - mappings[350] = ItemType.QuartzBlock; - mappings[351] = ItemType.QuartzBricks; - mappings[352] = ItemType.QuartzPillar; - mappings[353] = ItemType.QuartzStairs; - mappings[354] = ItemType.WhiteTerracotta; - mappings[355] = ItemType.OrangeTerracotta; - mappings[356] = ItemType.MagentaTerracotta; - mappings[357] = ItemType.LightBlueTerracotta; - mappings[358] = ItemType.YellowTerracotta; - mappings[359] = ItemType.LimeTerracotta; - mappings[360] = ItemType.PinkTerracotta; - mappings[361] = ItemType.GrayTerracotta; - mappings[362] = ItemType.LightGrayTerracotta; - mappings[363] = ItemType.CyanTerracotta; - mappings[364] = ItemType.PurpleTerracotta; - mappings[365] = ItemType.BlueTerracotta; - mappings[366] = ItemType.BrownTerracotta; - mappings[367] = ItemType.GreenTerracotta; - mappings[368] = ItemType.RedTerracotta; - mappings[369] = ItemType.BlackTerracotta; - mappings[370] = ItemType.Barrier; - mappings[371] = ItemType.Light; - mappings[372] = ItemType.HayBlock; - mappings[373] = ItemType.WhiteCarpet; - mappings[374] = ItemType.OrangeCarpet; - mappings[375] = ItemType.MagentaCarpet; - mappings[376] = ItemType.LightBlueCarpet; - mappings[377] = ItemType.YellowCarpet; - mappings[378] = ItemType.LimeCarpet; - mappings[379] = ItemType.PinkCarpet; - mappings[380] = ItemType.GrayCarpet; - mappings[381] = ItemType.LightGrayCarpet; - mappings[382] = ItemType.CyanCarpet; - mappings[383] = ItemType.PurpleCarpet; - mappings[384] = ItemType.BlueCarpet; - mappings[385] = ItemType.BrownCarpet; - mappings[386] = ItemType.GreenCarpet; - mappings[387] = ItemType.RedCarpet; - mappings[388] = ItemType.BlackCarpet; - mappings[389] = ItemType.Terracotta; - mappings[390] = ItemType.PackedIce; - mappings[391] = ItemType.AcaciaStairs; - mappings[392] = ItemType.DarkOakStairs; - mappings[393] = ItemType.DirtPath; - mappings[394] = ItemType.Sunflower; - mappings[395] = ItemType.Lilac; - mappings[396] = ItemType.RoseBush; - mappings[397] = ItemType.Peony; - mappings[398] = ItemType.TallGrass; - mappings[399] = ItemType.LargeFern; - mappings[400] = ItemType.WhiteStainedGlass; - mappings[401] = ItemType.OrangeStainedGlass; - mappings[402] = ItemType.MagentaStainedGlass; - mappings[403] = ItemType.LightBlueStainedGlass; - mappings[404] = ItemType.YellowStainedGlass; - mappings[405] = ItemType.LimeStainedGlass; - mappings[406] = ItemType.PinkStainedGlass; - mappings[407] = ItemType.GrayStainedGlass; - mappings[408] = ItemType.LightGrayStainedGlass; - mappings[409] = ItemType.CyanStainedGlass; - mappings[410] = ItemType.PurpleStainedGlass; - mappings[411] = ItemType.BlueStainedGlass; - mappings[412] = ItemType.BrownStainedGlass; - mappings[413] = ItemType.GreenStainedGlass; - mappings[414] = ItemType.RedStainedGlass; - mappings[415] = ItemType.BlackStainedGlass; - mappings[416] = ItemType.WhiteStainedGlassPane; - mappings[417] = ItemType.OrangeStainedGlassPane; - mappings[418] = ItemType.MagentaStainedGlassPane; - mappings[419] = ItemType.LightBlueStainedGlassPane; - mappings[420] = ItemType.YellowStainedGlassPane; - mappings[421] = ItemType.LimeStainedGlassPane; - mappings[422] = ItemType.PinkStainedGlassPane; - mappings[423] = ItemType.GrayStainedGlassPane; - mappings[424] = ItemType.LightGrayStainedGlassPane; - mappings[425] = ItemType.CyanStainedGlassPane; - mappings[426] = ItemType.PurpleStainedGlassPane; - mappings[427] = ItemType.BlueStainedGlassPane; - mappings[428] = ItemType.BrownStainedGlassPane; - mappings[429] = ItemType.GreenStainedGlassPane; - mappings[430] = ItemType.RedStainedGlassPane; - mappings[431] = ItemType.BlackStainedGlassPane; - mappings[432] = ItemType.Prismarine; - mappings[433] = ItemType.PrismarineBricks; - mappings[434] = ItemType.DarkPrismarine; - mappings[435] = ItemType.PrismarineStairs; - mappings[436] = ItemType.PrismarineBrickStairs; - mappings[437] = ItemType.DarkPrismarineStairs; - mappings[438] = ItemType.SeaLantern; - mappings[439] = ItemType.RedSandstone; - mappings[440] = ItemType.ChiseledRedSandstone; - mappings[441] = ItemType.CutRedSandstone; - mappings[442] = ItemType.RedSandstoneStairs; - mappings[443] = ItemType.RepeatingCommandBlock; - mappings[444] = ItemType.ChainCommandBlock; - mappings[445] = ItemType.MagmaBlock; - mappings[446] = ItemType.NetherWartBlock; - mappings[447] = ItemType.WarpedWartBlock; - mappings[448] = ItemType.RedNetherBricks; - mappings[449] = ItemType.BoneBlock; - mappings[450] = ItemType.StructureVoid; - mappings[451] = ItemType.ShulkerBox; - mappings[452] = ItemType.WhiteShulkerBox; - mappings[453] = ItemType.OrangeShulkerBox; - mappings[454] = ItemType.MagentaShulkerBox; - mappings[455] = ItemType.LightBlueShulkerBox; - mappings[456] = ItemType.YellowShulkerBox; - mappings[457] = ItemType.LimeShulkerBox; - mappings[458] = ItemType.PinkShulkerBox; - mappings[459] = ItemType.GrayShulkerBox; - mappings[460] = ItemType.LightGrayShulkerBox; - mappings[461] = ItemType.CyanShulkerBox; - mappings[462] = ItemType.PurpleShulkerBox; - mappings[463] = ItemType.BlueShulkerBox; - mappings[464] = ItemType.BrownShulkerBox; - mappings[465] = ItemType.GreenShulkerBox; - mappings[466] = ItemType.RedShulkerBox; - mappings[467] = ItemType.BlackShulkerBox; - mappings[468] = ItemType.WhiteGlazedTerracotta; - mappings[469] = ItemType.OrangeGlazedTerracotta; - mappings[470] = ItemType.MagentaGlazedTerracotta; - mappings[471] = ItemType.LightBlueGlazedTerracotta; - mappings[472] = ItemType.YellowGlazedTerracotta; - mappings[473] = ItemType.LimeGlazedTerracotta; - mappings[474] = ItemType.PinkGlazedTerracotta; - mappings[475] = ItemType.GrayGlazedTerracotta; - mappings[476] = ItemType.LightGrayGlazedTerracotta; - mappings[477] = ItemType.CyanGlazedTerracotta; - mappings[478] = ItemType.PurpleGlazedTerracotta; - mappings[479] = ItemType.BlueGlazedTerracotta; - mappings[480] = ItemType.BrownGlazedTerracotta; - mappings[481] = ItemType.GreenGlazedTerracotta; - mappings[482] = ItemType.RedGlazedTerracotta; - mappings[483] = ItemType.BlackGlazedTerracotta; - mappings[484] = ItemType.WhiteConcrete; - mappings[485] = ItemType.OrangeConcrete; - mappings[486] = ItemType.MagentaConcrete; - mappings[487] = ItemType.LightBlueConcrete; - mappings[488] = ItemType.YellowConcrete; - mappings[489] = ItemType.LimeConcrete; - mappings[490] = ItemType.PinkConcrete; - mappings[491] = ItemType.GrayConcrete; - mappings[492] = ItemType.LightGrayConcrete; - mappings[493] = ItemType.CyanConcrete; - mappings[494] = ItemType.PurpleConcrete; - mappings[495] = ItemType.BlueConcrete; - mappings[496] = ItemType.BrownConcrete; - mappings[497] = ItemType.GreenConcrete; - mappings[498] = ItemType.RedConcrete; - mappings[499] = ItemType.BlackConcrete; - mappings[500] = ItemType.WhiteConcretePowder; - mappings[501] = ItemType.OrangeConcretePowder; - mappings[502] = ItemType.MagentaConcretePowder; - mappings[503] = ItemType.LightBlueConcretePowder; - mappings[504] = ItemType.YellowConcretePowder; - mappings[505] = ItemType.LimeConcretePowder; - mappings[506] = ItemType.PinkConcretePowder; - mappings[507] = ItemType.GrayConcretePowder; - mappings[508] = ItemType.LightGrayConcretePowder; - mappings[509] = ItemType.CyanConcretePowder; - mappings[510] = ItemType.PurpleConcretePowder; - mappings[511] = ItemType.BlueConcretePowder; - mappings[512] = ItemType.BrownConcretePowder; - mappings[513] = ItemType.GreenConcretePowder; - mappings[514] = ItemType.RedConcretePowder; - mappings[515] = ItemType.BlackConcretePowder; - mappings[516] = ItemType.TurtleEgg; - mappings[517] = ItemType.DeadTubeCoralBlock; - mappings[518] = ItemType.DeadBrainCoralBlock; - mappings[519] = ItemType.DeadBubbleCoralBlock; - mappings[520] = ItemType.DeadFireCoralBlock; - mappings[521] = ItemType.DeadHornCoralBlock; - mappings[522] = ItemType.TubeCoralBlock; - mappings[523] = ItemType.BrainCoralBlock; - mappings[524] = ItemType.BubbleCoralBlock; - mappings[525] = ItemType.FireCoralBlock; - mappings[526] = ItemType.HornCoralBlock; - mappings[527] = ItemType.TubeCoral; - mappings[528] = ItemType.BrainCoral; - mappings[529] = ItemType.BubbleCoral; - mappings[530] = ItemType.FireCoral; - mappings[531] = ItemType.HornCoral; - mappings[532] = ItemType.DeadBrainCoral; - mappings[533] = ItemType.DeadBubbleCoral; - mappings[534] = ItemType.DeadFireCoral; - mappings[535] = ItemType.DeadHornCoral; - mappings[536] = ItemType.DeadTubeCoral; - mappings[537] = ItemType.TubeCoralFan; - mappings[538] = ItemType.BrainCoralFan; - mappings[539] = ItemType.BubbleCoralFan; - mappings[540] = ItemType.FireCoralFan; - mappings[541] = ItemType.HornCoralFan; - mappings[542] = ItemType.DeadTubeCoralFan; - mappings[543] = ItemType.DeadBrainCoralFan; - mappings[544] = ItemType.DeadBubbleCoralFan; - mappings[545] = ItemType.DeadFireCoralFan; - mappings[546] = ItemType.DeadHornCoralFan; - mappings[547] = ItemType.BlueIce; - mappings[548] = ItemType.Conduit; - mappings[549] = ItemType.PolishedGraniteStairs; - mappings[550] = ItemType.SmoothRedSandstoneStairs; - mappings[551] = ItemType.MossyStoneBrickStairs; - mappings[552] = ItemType.PolishedDioriteStairs; - mappings[553] = ItemType.MossyCobblestoneStairs; - mappings[554] = ItemType.EndStoneBrickStairs; - mappings[555] = ItemType.StoneStairs; - mappings[556] = ItemType.SmoothSandstoneStairs; - mappings[557] = ItemType.SmoothQuartzStairs; - mappings[558] = ItemType.GraniteStairs; - mappings[559] = ItemType.AndesiteStairs; - mappings[560] = ItemType.RedNetherBrickStairs; - mappings[561] = ItemType.PolishedAndesiteStairs; - mappings[562] = ItemType.DioriteStairs; - mappings[563] = ItemType.CobbledDeepslateStairs; - mappings[564] = ItemType.PolishedDeepslateStairs; - mappings[565] = ItemType.DeepslateBrickStairs; - mappings[566] = ItemType.DeepslateTileStairs; - mappings[567] = ItemType.PolishedGraniteSlab; - mappings[568] = ItemType.SmoothRedSandstoneSlab; - mappings[569] = ItemType.MossyStoneBrickSlab; - mappings[570] = ItemType.PolishedDioriteSlab; - mappings[571] = ItemType.MossyCobblestoneSlab; - mappings[572] = ItemType.EndStoneBrickSlab; - mappings[573] = ItemType.SmoothSandstoneSlab; - mappings[574] = ItemType.SmoothQuartzSlab; - mappings[575] = ItemType.GraniteSlab; - mappings[576] = ItemType.AndesiteSlab; - mappings[577] = ItemType.RedNetherBrickSlab; - mappings[578] = ItemType.PolishedAndesiteSlab; - mappings[579] = ItemType.DioriteSlab; - mappings[580] = ItemType.CobbledDeepslateSlab; - mappings[581] = ItemType.PolishedDeepslateSlab; - mappings[582] = ItemType.DeepslateBrickSlab; - mappings[583] = ItemType.DeepslateTileSlab; - mappings[584] = ItemType.Scaffolding; - mappings[585] = ItemType.Redstone; - mappings[586] = ItemType.RedstoneTorch; - mappings[587] = ItemType.RedstoneBlock; - mappings[588] = ItemType.Repeater; - mappings[589] = ItemType.Comparator; - mappings[590] = ItemType.Piston; - mappings[591] = ItemType.StickyPiston; - mappings[592] = ItemType.SlimeBlock; - mappings[593] = ItemType.HoneyBlock; - mappings[594] = ItemType.Observer; - mappings[595] = ItemType.Hopper; - mappings[596] = ItemType.Dispenser; - mappings[597] = ItemType.Dropper; - mappings[598] = ItemType.Lectern; - mappings[599] = ItemType.Target; - mappings[600] = ItemType.Lever; - mappings[601] = ItemType.LightningRod; - mappings[602] = ItemType.DaylightDetector; - mappings[603] = ItemType.SculkSensor; - mappings[604] = ItemType.TripwireHook; - mappings[605] = ItemType.TrappedChest; - mappings[606] = ItemType.Tnt; - mappings[607] = ItemType.RedstoneLamp; - mappings[608] = ItemType.NoteBlock; - mappings[609] = ItemType.StoneButton; - mappings[610] = ItemType.PolishedBlackstoneButton; - mappings[611] = ItemType.OakButton; - mappings[612] = ItemType.SpruceButton; - mappings[613] = ItemType.BirchButton; - mappings[614] = ItemType.JungleButton; - mappings[615] = ItemType.AcaciaButton; - mappings[616] = ItemType.DarkOakButton; - mappings[617] = ItemType.CrimsonButton; - mappings[618] = ItemType.WarpedButton; - mappings[619] = ItemType.StonePressurePlate; - mappings[620] = ItemType.PolishedBlackstonePressurePlate; - mappings[621] = ItemType.LightWeightedPressurePlate; - mappings[622] = ItemType.HeavyWeightedPressurePlate; - mappings[623] = ItemType.OakPressurePlate; - mappings[624] = ItemType.SprucePressurePlate; - mappings[625] = ItemType.BirchPressurePlate; - mappings[626] = ItemType.JunglePressurePlate; - mappings[627] = ItemType.AcaciaPressurePlate; - mappings[628] = ItemType.DarkOakPressurePlate; - mappings[629] = ItemType.CrimsonPressurePlate; - mappings[630] = ItemType.WarpedPressurePlate; - mappings[631] = ItemType.IronDoor; - mappings[632] = ItemType.OakDoor; - mappings[633] = ItemType.SpruceDoor; - mappings[634] = ItemType.BirchDoor; - mappings[635] = ItemType.JungleDoor; - mappings[636] = ItemType.AcaciaDoor; - mappings[637] = ItemType.DarkOakDoor; - mappings[638] = ItemType.CrimsonDoor; - mappings[639] = ItemType.WarpedDoor; - mappings[640] = ItemType.IronTrapdoor; - mappings[641] = ItemType.OakTrapdoor; - mappings[642] = ItemType.SpruceTrapdoor; - mappings[643] = ItemType.BirchTrapdoor; - mappings[644] = ItemType.JungleTrapdoor; - mappings[645] = ItemType.AcaciaTrapdoor; - mappings[646] = ItemType.DarkOakTrapdoor; - mappings[647] = ItemType.CrimsonTrapdoor; - mappings[648] = ItemType.WarpedTrapdoor; - mappings[649] = ItemType.OakFenceGate; - mappings[650] = ItemType.SpruceFenceGate; - mappings[651] = ItemType.BirchFenceGate; - mappings[652] = ItemType.JungleFenceGate; - mappings[653] = ItemType.AcaciaFenceGate; - mappings[654] = ItemType.DarkOakFenceGate; - mappings[655] = ItemType.CrimsonFenceGate; - mappings[656] = ItemType.WarpedFenceGate; - mappings[657] = ItemType.PoweredRail; - mappings[658] = ItemType.DetectorRail; - mappings[659] = ItemType.Rail; - mappings[660] = ItemType.ActivatorRail; - mappings[661] = ItemType.Saddle; - mappings[662] = ItemType.Minecart; - mappings[663] = ItemType.ChestMinecart; - mappings[664] = ItemType.FurnaceMinecart; - mappings[665] = ItemType.TntMinecart; - mappings[666] = ItemType.HopperMinecart; - mappings[667] = ItemType.CarrotOnAStick; - mappings[668] = ItemType.WarpedFungusOnAStick; - mappings[669] = ItemType.Elytra; - mappings[670] = ItemType.OakBoat; - mappings[671] = ItemType.SpruceBoat; - mappings[672] = ItemType.BirchBoat; - mappings[673] = ItemType.JungleBoat; - mappings[674] = ItemType.AcaciaBoat; - mappings[675] = ItemType.DarkOakBoat; - mappings[676] = ItemType.StructureBlock; - mappings[677] = ItemType.Jigsaw; - mappings[678] = ItemType.TurtleHelmet; - mappings[679] = ItemType.TurtleScute; - mappings[680] = ItemType.FlintAndSteel; - mappings[681] = ItemType.Apple; - mappings[682] = ItemType.Bow; - mappings[683] = ItemType.Arrow; - mappings[684] = ItemType.Coal; - mappings[685] = ItemType.Charcoal; - mappings[686] = ItemType.Diamond; - mappings[687] = ItemType.Emerald; - mappings[688] = ItemType.LapisLazuli; - mappings[689] = ItemType.Quartz; - mappings[690] = ItemType.AmethystShard; - mappings[691] = ItemType.RawIron; - mappings[692] = ItemType.IronIngot; - mappings[693] = ItemType.RawCopper; - mappings[694] = ItemType.CopperIngot; - mappings[695] = ItemType.RawGold; - mappings[696] = ItemType.GoldIngot; - mappings[697] = ItemType.NetheriteIngot; - mappings[698] = ItemType.NetheriteScrap; - mappings[699] = ItemType.WoodenSword; - mappings[700] = ItemType.WoodenShovel; - mappings[701] = ItemType.WoodenPickaxe; - mappings[702] = ItemType.WoodenAxe; - mappings[703] = ItemType.WoodenHoe; - mappings[704] = ItemType.StoneSword; - mappings[705] = ItemType.StoneShovel; - mappings[706] = ItemType.StonePickaxe; - mappings[707] = ItemType.StoneAxe; - mappings[708] = ItemType.StoneHoe; - mappings[709] = ItemType.GoldenSword; - mappings[710] = ItemType.GoldenShovel; - mappings[711] = ItemType.GoldenPickaxe; - mappings[712] = ItemType.GoldenAxe; - mappings[713] = ItemType.GoldenHoe; - mappings[714] = ItemType.IronSword; - mappings[715] = ItemType.IronShovel; - mappings[716] = ItemType.IronPickaxe; - mappings[717] = ItemType.IronAxe; - mappings[718] = ItemType.IronHoe; - mappings[719] = ItemType.DiamondSword; - mappings[720] = ItemType.DiamondShovel; - mappings[721] = ItemType.DiamondPickaxe; - mappings[722] = ItemType.DiamondAxe; - mappings[723] = ItemType.DiamondHoe; - mappings[724] = ItemType.NetheriteSword; - mappings[725] = ItemType.NetheriteShovel; - mappings[726] = ItemType.NetheritePickaxe; - mappings[727] = ItemType.NetheriteAxe; - mappings[728] = ItemType.NetheriteHoe; - mappings[729] = ItemType.Stick; - mappings[730] = ItemType.Bowl; - mappings[731] = ItemType.MushroomStew; - mappings[732] = ItemType.String; - mappings[733] = ItemType.Feather; - mappings[734] = ItemType.Gunpowder; - mappings[735] = ItemType.WheatSeeds; - mappings[736] = ItemType.Wheat; - mappings[737] = ItemType.Bread; - mappings[738] = ItemType.LeatherHelmet; - mappings[739] = ItemType.LeatherChestplate; - mappings[740] = ItemType.LeatherLeggings; - mappings[741] = ItemType.LeatherBoots; - mappings[742] = ItemType.ChainmailHelmet; - mappings[743] = ItemType.ChainmailChestplate; - mappings[744] = ItemType.ChainmailLeggings; - mappings[745] = ItemType.ChainmailBoots; - mappings[746] = ItemType.IronHelmet; - mappings[747] = ItemType.IronChestplate; - mappings[748] = ItemType.IronLeggings; - mappings[749] = ItemType.IronBoots; - mappings[750] = ItemType.DiamondHelmet; - mappings[751] = ItemType.DiamondChestplate; - mappings[752] = ItemType.DiamondLeggings; - mappings[753] = ItemType.DiamondBoots; - mappings[754] = ItemType.GoldenHelmet; - mappings[755] = ItemType.GoldenChestplate; - mappings[756] = ItemType.GoldenLeggings; - mappings[757] = ItemType.GoldenBoots; - mappings[758] = ItemType.NetheriteHelmet; - mappings[759] = ItemType.NetheriteChestplate; - mappings[760] = ItemType.NetheriteLeggings; - mappings[761] = ItemType.NetheriteBoots; - mappings[762] = ItemType.Flint; - mappings[763] = ItemType.Porkchop; - mappings[764] = ItemType.CookedPorkchop; - mappings[765] = ItemType.Painting; - mappings[766] = ItemType.GoldenApple; - mappings[767] = ItemType.EnchantedGoldenApple; - mappings[768] = ItemType.OakSign; - mappings[769] = ItemType.SpruceSign; - mappings[770] = ItemType.BirchSign; - mappings[771] = ItemType.JungleSign; - mappings[772] = ItemType.AcaciaSign; - mappings[773] = ItemType.DarkOakSign; - mappings[774] = ItemType.CrimsonSign; - mappings[775] = ItemType.WarpedSign; - mappings[776] = ItemType.Bucket; - mappings[777] = ItemType.WaterBucket; - mappings[778] = ItemType.LavaBucket; - mappings[779] = ItemType.PowderSnowBucket; - mappings[780] = ItemType.Snowball; - mappings[781] = ItemType.Leather; - mappings[782] = ItemType.MilkBucket; - mappings[783] = ItemType.PufferfishBucket; - mappings[784] = ItemType.SalmonBucket; - mappings[785] = ItemType.CodBucket; - mappings[786] = ItemType.TropicalFishBucket; - mappings[787] = ItemType.AxolotlBucket; - mappings[788] = ItemType.Brick; - mappings[789] = ItemType.ClayBall; - mappings[790] = ItemType.DriedKelpBlock; - mappings[791] = ItemType.Paper; - mappings[792] = ItemType.Book; - mappings[793] = ItemType.SlimeBall; - mappings[794] = ItemType.Egg; - mappings[795] = ItemType.Compass; - mappings[796] = ItemType.Bundle; - mappings[797] = ItemType.FishingRod; - mappings[798] = ItemType.Clock; - mappings[799] = ItemType.Spyglass; - mappings[800] = ItemType.GlowstoneDust; - mappings[801] = ItemType.Cod; - mappings[802] = ItemType.Salmon; - mappings[803] = ItemType.TropicalFish; - mappings[804] = ItemType.Pufferfish; - mappings[805] = ItemType.CookedCod; - mappings[806] = ItemType.CookedSalmon; - mappings[807] = ItemType.InkSac; - mappings[808] = ItemType.GlowInkSac; - mappings[809] = ItemType.CocoaBeans; - mappings[810] = ItemType.WhiteDye; - mappings[811] = ItemType.OrangeDye; - mappings[812] = ItemType.MagentaDye; - mappings[813] = ItemType.LightBlueDye; - mappings[814] = ItemType.YellowDye; - mappings[815] = ItemType.LimeDye; - mappings[816] = ItemType.PinkDye; - mappings[817] = ItemType.GrayDye; - mappings[818] = ItemType.LightGrayDye; - mappings[819] = ItemType.CyanDye; - mappings[820] = ItemType.PurpleDye; - mappings[821] = ItemType.BlueDye; - mappings[822] = ItemType.BrownDye; - mappings[823] = ItemType.GreenDye; - mappings[824] = ItemType.RedDye; - mappings[825] = ItemType.BlackDye; - mappings[826] = ItemType.BoneMeal; - mappings[827] = ItemType.Bone; - mappings[828] = ItemType.Sugar; - mappings[829] = ItemType.Cake; - mappings[830] = ItemType.WhiteBed; - mappings[831] = ItemType.OrangeBed; - mappings[832] = ItemType.MagentaBed; - mappings[833] = ItemType.LightBlueBed; - mappings[834] = ItemType.YellowBed; - mappings[835] = ItemType.LimeBed; - mappings[836] = ItemType.PinkBed; - mappings[837] = ItemType.GrayBed; - mappings[838] = ItemType.LightGrayBed; - mappings[839] = ItemType.CyanBed; - mappings[840] = ItemType.PurpleBed; - mappings[841] = ItemType.BlueBed; - mappings[842] = ItemType.BrownBed; - mappings[843] = ItemType.GreenBed; - mappings[844] = ItemType.RedBed; - mappings[845] = ItemType.BlackBed; - mappings[846] = ItemType.Cookie; - mappings[847] = ItemType.FilledMap; - mappings[848] = ItemType.Shears; - mappings[849] = ItemType.MelonSlice; - mappings[850] = ItemType.DriedKelp; - mappings[851] = ItemType.PumpkinSeeds; - mappings[852] = ItemType.MelonSeeds; - mappings[853] = ItemType.Beef; - mappings[854] = ItemType.CookedBeef; - mappings[855] = ItemType.Chicken; - mappings[856] = ItemType.CookedChicken; - mappings[857] = ItemType.RottenFlesh; - mappings[858] = ItemType.EnderPearl; - mappings[859] = ItemType.BlazeRod; - mappings[860] = ItemType.GhastTear; - mappings[861] = ItemType.GoldNugget; - mappings[862] = ItemType.NetherWart; - mappings[863] = ItemType.Potion; - mappings[864] = ItemType.GlassBottle; - mappings[865] = ItemType.SpiderEye; - mappings[866] = ItemType.FermentedSpiderEye; - mappings[867] = ItemType.BlazePowder; - mappings[868] = ItemType.MagmaCream; - mappings[869] = ItemType.BrewingStand; - mappings[870] = ItemType.Cauldron; - mappings[871] = ItemType.EnderEye; - mappings[872] = ItemType.GlisteringMelonSlice; - mappings[873] = ItemType.AxolotlSpawnEgg; - mappings[874] = ItemType.BatSpawnEgg; - mappings[875] = ItemType.BeeSpawnEgg; - mappings[876] = ItemType.BlazeSpawnEgg; - mappings[877] = ItemType.CatSpawnEgg; - mappings[878] = ItemType.CaveSpiderSpawnEgg; - mappings[879] = ItemType.ChickenSpawnEgg; - mappings[880] = ItemType.CodSpawnEgg; - mappings[881] = ItemType.CowSpawnEgg; - mappings[882] = ItemType.CreeperSpawnEgg; - mappings[883] = ItemType.DolphinSpawnEgg; - mappings[884] = ItemType.DonkeySpawnEgg; - mappings[885] = ItemType.DrownedSpawnEgg; - mappings[886] = ItemType.ElderGuardianSpawnEgg; - mappings[887] = ItemType.EndermanSpawnEgg; - mappings[888] = ItemType.EndermiteSpawnEgg; - mappings[889] = ItemType.EvokerSpawnEgg; - mappings[890] = ItemType.FoxSpawnEgg; - mappings[891] = ItemType.GhastSpawnEgg; - mappings[892] = ItemType.GlowSquidSpawnEgg; - mappings[893] = ItemType.GoatSpawnEgg; - mappings[894] = ItemType.GuardianSpawnEgg; - mappings[895] = ItemType.HoglinSpawnEgg; - mappings[896] = ItemType.HorseSpawnEgg; - mappings[897] = ItemType.HuskSpawnEgg; - mappings[898] = ItemType.LlamaSpawnEgg; - mappings[899] = ItemType.MagmaCubeSpawnEgg; - mappings[900] = ItemType.MooshroomSpawnEgg; - mappings[901] = ItemType.MuleSpawnEgg; - mappings[902] = ItemType.OcelotSpawnEgg; - mappings[903] = ItemType.PandaSpawnEgg; - mappings[904] = ItemType.ParrotSpawnEgg; - mappings[905] = ItemType.PhantomSpawnEgg; - mappings[906] = ItemType.PigSpawnEgg; - mappings[907] = ItemType.PiglinSpawnEgg; - mappings[908] = ItemType.PiglinBruteSpawnEgg; - mappings[909] = ItemType.PillagerSpawnEgg; - mappings[910] = ItemType.PolarBearSpawnEgg; - mappings[911] = ItemType.PufferfishSpawnEgg; - mappings[912] = ItemType.RabbitSpawnEgg; - mappings[913] = ItemType.RavagerSpawnEgg; - mappings[914] = ItemType.SalmonSpawnEgg; - mappings[915] = ItemType.SheepSpawnEgg; - mappings[916] = ItemType.ShulkerSpawnEgg; - mappings[917] = ItemType.SilverfishSpawnEgg; - mappings[918] = ItemType.SkeletonSpawnEgg; - mappings[919] = ItemType.SkeletonHorseSpawnEgg; - mappings[920] = ItemType.SlimeSpawnEgg; - mappings[921] = ItemType.SpiderSpawnEgg; - mappings[922] = ItemType.SquidSpawnEgg; - mappings[923] = ItemType.StraySpawnEgg; - mappings[924] = ItemType.StriderSpawnEgg; - mappings[925] = ItemType.TraderLlamaSpawnEgg; - mappings[926] = ItemType.TropicalFishSpawnEgg; - mappings[927] = ItemType.TurtleSpawnEgg; - mappings[928] = ItemType.VexSpawnEgg; - mappings[929] = ItemType.VillagerSpawnEgg; - mappings[930] = ItemType.VindicatorSpawnEgg; - mappings[931] = ItemType.WanderingTraderSpawnEgg; - mappings[932] = ItemType.WitchSpawnEgg; - mappings[933] = ItemType.WitherSkeletonSpawnEgg; - mappings[934] = ItemType.WolfSpawnEgg; - mappings[935] = ItemType.ZoglinSpawnEgg; - mappings[936] = ItemType.ZombieSpawnEgg; - mappings[937] = ItemType.ZombieHorseSpawnEgg; - mappings[938] = ItemType.ZombieVillagerSpawnEgg; - mappings[939] = ItemType.ZombifiedPiglinSpawnEgg; - mappings[940] = ItemType.ExperienceBottle; - mappings[941] = ItemType.FireCharge; - mappings[942] = ItemType.WritableBook; - mappings[943] = ItemType.WrittenBook; - mappings[944] = ItemType.ItemFrame; - mappings[945] = ItemType.GlowItemFrame; - mappings[946] = ItemType.FlowerPot; - mappings[947] = ItemType.Carrot; - mappings[948] = ItemType.Potato; - mappings[949] = ItemType.BakedPotato; - mappings[950] = ItemType.PoisonousPotato; - mappings[951] = ItemType.Map; - mappings[952] = ItemType.GoldenCarrot; - mappings[953] = ItemType.SkeletonSkull; - mappings[954] = ItemType.WitherSkeletonSkull; - mappings[955] = ItemType.PlayerHead; - mappings[956] = ItemType.ZombieHead; - mappings[957] = ItemType.CreeperHead; - mappings[958] = ItemType.DragonHead; - mappings[959] = ItemType.NetherStar; - mappings[960] = ItemType.PumpkinPie; - mappings[961] = ItemType.FireworkRocket; - mappings[962] = ItemType.FireworkStar; - mappings[963] = ItemType.EnchantedBook; - mappings[964] = ItemType.NetherBrick; - mappings[965] = ItemType.PrismarineShard; - mappings[966] = ItemType.PrismarineCrystals; - mappings[967] = ItemType.Rabbit; - mappings[968] = ItemType.CookedRabbit; - mappings[969] = ItemType.RabbitStew; - mappings[970] = ItemType.RabbitFoot; - mappings[971] = ItemType.RabbitHide; - mappings[972] = ItemType.ArmorStand; - mappings[973] = ItemType.IronHorseArmor; - mappings[974] = ItemType.GoldenHorseArmor; - mappings[975] = ItemType.DiamondHorseArmor; - mappings[976] = ItemType.LeatherHorseArmor; - mappings[977] = ItemType.Lead; - mappings[978] = ItemType.NameTag; - mappings[979] = ItemType.CommandBlockMinecart; - mappings[980] = ItemType.Mutton; - mappings[981] = ItemType.CookedMutton; - mappings[982] = ItemType.WhiteBanner; - mappings[983] = ItemType.OrangeBanner; - mappings[984] = ItemType.MagentaBanner; - mappings[985] = ItemType.LightBlueBanner; - mappings[986] = ItemType.YellowBanner; - mappings[987] = ItemType.LimeBanner; - mappings[988] = ItemType.PinkBanner; - mappings[989] = ItemType.GrayBanner; - mappings[990] = ItemType.LightGrayBanner; - mappings[991] = ItemType.CyanBanner; - mappings[992] = ItemType.PurpleBanner; - mappings[993] = ItemType.BlueBanner; - mappings[994] = ItemType.BrownBanner; - mappings[995] = ItemType.GreenBanner; - mappings[996] = ItemType.RedBanner; - mappings[997] = ItemType.BlackBanner; - mappings[998] = ItemType.EndCrystal; - mappings[999] = ItemType.ChorusFruit; - mappings[1000] = ItemType.PoppedChorusFruit; - mappings[1001] = ItemType.Beetroot; - mappings[1002] = ItemType.BeetrootSeeds; - mappings[1003] = ItemType.BeetrootSoup; - mappings[1004] = ItemType.DragonBreath; - mappings[1005] = ItemType.SplashPotion; - mappings[1006] = ItemType.SpectralArrow; - mappings[1007] = ItemType.TippedArrow; - mappings[1008] = ItemType.LingeringPotion; - mappings[1009] = ItemType.Shield; - mappings[1010] = ItemType.TotemOfUndying; - mappings[1011] = ItemType.ShulkerShell; - mappings[1012] = ItemType.IronNugget; - mappings[1013] = ItemType.KnowledgeBook; - mappings[1014] = ItemType.DebugStick; - mappings[1015] = ItemType.MusicDisc13; - mappings[1016] = ItemType.MusicDiscCat; - mappings[1017] = ItemType.MusicDiscBlocks; - mappings[1018] = ItemType.MusicDiscChirp; - mappings[1019] = ItemType.MusicDiscFar; - mappings[1020] = ItemType.MusicDiscMall; - mappings[1021] = ItemType.MusicDiscMellohi; - mappings[1022] = ItemType.MusicDiscStal; - mappings[1023] = ItemType.MusicDiscStrad; - mappings[1024] = ItemType.MusicDiscWard; - mappings[1025] = ItemType.MusicDisc11; - mappings[1026] = ItemType.MusicDiscWait; - mappings[1027] = ItemType.MusicDiscPigstep; - mappings[1028] = ItemType.Trident; - mappings[1029] = ItemType.PhantomMembrane; - mappings[1030] = ItemType.NautilusShell; - mappings[1031] = ItemType.HeartOfTheSea; - mappings[1032] = ItemType.Crossbow; - mappings[1033] = ItemType.SuspiciousStew; - mappings[1034] = ItemType.Loom; - mappings[1035] = ItemType.FlowerBannerPattern; - mappings[1036] = ItemType.CreeperBannerPattern; - mappings[1037] = ItemType.SkullBannerPattern; - mappings[1038] = ItemType.MojangBannerPattern; - mappings[1039] = ItemType.GlobeBannerPattern; - mappings[1040] = ItemType.PiglinBannerPattern; - mappings[1041] = ItemType.Composter; - mappings[1042] = ItemType.Barrel; - mappings[1043] = ItemType.Smoker; - mappings[1044] = ItemType.BlastFurnace; - mappings[1045] = ItemType.CartographyTable; - mappings[1046] = ItemType.FletchingTable; - mappings[1047] = ItemType.Grindstone; - mappings[1048] = ItemType.SmithingTable; - mappings[1049] = ItemType.Stonecutter; - mappings[1050] = ItemType.Bell; - mappings[1051] = ItemType.Lantern; - mappings[1052] = ItemType.SoulLantern; - mappings[1053] = ItemType.SweetBerries; - mappings[1054] = ItemType.GlowBerries; - mappings[1055] = ItemType.Campfire; - mappings[1056] = ItemType.SoulCampfire; - mappings[1057] = ItemType.Shroomlight; - mappings[1058] = ItemType.Honeycomb; - mappings[1059] = ItemType.BeeNest; - mappings[1060] = ItemType.Beehive; - mappings[1061] = ItemType.HoneyBottle; - mappings[1062] = ItemType.HoneycombBlock; - mappings[1063] = ItemType.Lodestone; - mappings[1064] = ItemType.CryingObsidian; - mappings[1065] = ItemType.Blackstone; - mappings[1066] = ItemType.BlackstoneSlab; - mappings[1067] = ItemType.BlackstoneStairs; - mappings[1068] = ItemType.GildedBlackstone; - mappings[1069] = ItemType.PolishedBlackstone; - mappings[1070] = ItemType.PolishedBlackstoneSlab; - mappings[1071] = ItemType.PolishedBlackstoneStairs; - mappings[1072] = ItemType.ChiseledPolishedBlackstone; - mappings[1073] = ItemType.PolishedBlackstoneBricks; - mappings[1074] = ItemType.PolishedBlackstoneBrickSlab; - mappings[1075] = ItemType.PolishedBlackstoneBrickStairs; - mappings[1076] = ItemType.CrackedPolishedBlackstoneBricks; - mappings[1077] = ItemType.RespawnAnchor; - mappings[1078] = ItemType.Candle; - mappings[1079] = ItemType.WhiteCandle; - mappings[1080] = ItemType.OrangeCandle; - mappings[1081] = ItemType.MagentaCandle; - mappings[1082] = ItemType.LightBlueCandle; - mappings[1083] = ItemType.YellowCandle; - mappings[1084] = ItemType.LimeCandle; - mappings[1085] = ItemType.PinkCandle; - mappings[1086] = ItemType.GrayCandle; - mappings[1087] = ItemType.LightGrayCandle; - mappings[1088] = ItemType.CyanCandle; - mappings[1089] = ItemType.PurpleCandle; - mappings[1090] = ItemType.BlueCandle; - mappings[1091] = ItemType.BrownCandle; - mappings[1092] = ItemType.GreenCandle; - mappings[1093] = ItemType.RedCandle; - mappings[1094] = ItemType.BlackCandle; - mappings[1095] = ItemType.SmallAmethystBud; - mappings[1096] = ItemType.MediumAmethystBud; - mappings[1097] = ItemType.LargeAmethystBud; - mappings[1098] = ItemType.AmethystCluster; - mappings[1099] = ItemType.PointedDripstone; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette118.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette118.cs deleted file mode 100644 index bc3f25ad21..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette118.cs +++ /dev/null @@ -1,1119 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public class ItemPalette118 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette118() - { - mappings[0] = ItemType.Air; - mappings[1] = ItemType.Stone; - mappings[2] = ItemType.Granite; - mappings[3] = ItemType.PolishedGranite; - mappings[4] = ItemType.Diorite; - mappings[5] = ItemType.PolishedDiorite; - mappings[6] = ItemType.Andesite; - mappings[7] = ItemType.PolishedAndesite; - mappings[8] = ItemType.Deepslate; - mappings[9] = ItemType.CobbledDeepslate; - mappings[10] = ItemType.PolishedDeepslate; - mappings[11] = ItemType.Calcite; - mappings[12] = ItemType.Tuff; - mappings[13] = ItemType.DripstoneBlock; - mappings[14] = ItemType.GrassBlock; - mappings[15] = ItemType.Dirt; - mappings[16] = ItemType.CoarseDirt; - mappings[17] = ItemType.Podzol; - mappings[18] = ItemType.RootedDirt; - mappings[19] = ItemType.CrimsonNylium; - mappings[20] = ItemType.WarpedNylium; - mappings[21] = ItemType.Cobblestone; - mappings[22] = ItemType.OakPlanks; - mappings[23] = ItemType.SprucePlanks; - mappings[24] = ItemType.BirchPlanks; - mappings[25] = ItemType.JunglePlanks; - mappings[26] = ItemType.AcaciaPlanks; - mappings[27] = ItemType.DarkOakPlanks; - mappings[28] = ItemType.CrimsonPlanks; - mappings[29] = ItemType.WarpedPlanks; - mappings[30] = ItemType.OakSapling; - mappings[31] = ItemType.SpruceSapling; - mappings[32] = ItemType.BirchSapling; - mappings[33] = ItemType.JungleSapling; - mappings[34] = ItemType.AcaciaSapling; - mappings[35] = ItemType.DarkOakSapling; - mappings[36] = ItemType.Bedrock; - mappings[37] = ItemType.Sand; - mappings[38] = ItemType.RedSand; - mappings[39] = ItemType.Gravel; - mappings[40] = ItemType.CoalOre; - mappings[41] = ItemType.DeepslateCoalOre; - mappings[42] = ItemType.IronOre; - mappings[43] = ItemType.DeepslateIronOre; - mappings[44] = ItemType.CopperOre; - mappings[45] = ItemType.DeepslateCopperOre; - mappings[46] = ItemType.GoldOre; - mappings[47] = ItemType.DeepslateGoldOre; - mappings[48] = ItemType.RedstoneOre; - mappings[49] = ItemType.DeepslateRedstoneOre; - mappings[50] = ItemType.EmeraldOre; - mappings[51] = ItemType.DeepslateEmeraldOre; - mappings[52] = ItemType.LapisOre; - mappings[53] = ItemType.DeepslateLapisOre; - mappings[54] = ItemType.DiamondOre; - mappings[55] = ItemType.DeepslateDiamondOre; - mappings[56] = ItemType.NetherGoldOre; - mappings[57] = ItemType.NetherQuartzOre; - mappings[58] = ItemType.AncientDebris; - mappings[59] = ItemType.CoalBlock; - mappings[60] = ItemType.RawIronBlock; - mappings[61] = ItemType.RawCopperBlock; - mappings[62] = ItemType.RawGoldBlock; - mappings[63] = ItemType.AmethystBlock; - mappings[64] = ItemType.BuddingAmethyst; - mappings[65] = ItemType.IronBlock; - mappings[66] = ItemType.CopperBlock; - mappings[67] = ItemType.GoldBlock; - mappings[68] = ItemType.DiamondBlock; - mappings[69] = ItemType.NetheriteBlock; - mappings[70] = ItemType.ExposedCopper; - mappings[71] = ItemType.WeatheredCopper; - mappings[72] = ItemType.OxidizedCopper; - mappings[73] = ItemType.CutCopper; - mappings[74] = ItemType.ExposedCutCopper; - mappings[75] = ItemType.WeatheredCutCopper; - mappings[76] = ItemType.OxidizedCutCopper; - mappings[77] = ItemType.CutCopperStairs; - mappings[78] = ItemType.ExposedCutCopperStairs; - mappings[79] = ItemType.WeatheredCutCopperStairs; - mappings[80] = ItemType.OxidizedCutCopperStairs; - mappings[81] = ItemType.CutCopperSlab; - mappings[82] = ItemType.ExposedCutCopperSlab; - mappings[83] = ItemType.WeatheredCutCopperSlab; - mappings[84] = ItemType.OxidizedCutCopperSlab; - mappings[85] = ItemType.WaxedCopperBlock; - mappings[86] = ItemType.WaxedExposedCopper; - mappings[87] = ItemType.WaxedWeatheredCopper; - mappings[88] = ItemType.WaxedOxidizedCopper; - mappings[89] = ItemType.WaxedCutCopper; - mappings[90] = ItemType.WaxedExposedCutCopper; - mappings[91] = ItemType.WaxedWeatheredCutCopper; - mappings[92] = ItemType.WaxedOxidizedCutCopper; - mappings[93] = ItemType.WaxedCutCopperStairs; - mappings[94] = ItemType.WaxedExposedCutCopperStairs; - mappings[95] = ItemType.WaxedWeatheredCutCopperStairs; - mappings[96] = ItemType.WaxedOxidizedCutCopperStairs; - mappings[97] = ItemType.WaxedCutCopperSlab; - mappings[98] = ItemType.WaxedExposedCutCopperSlab; - mappings[99] = ItemType.WaxedWeatheredCutCopperSlab; - mappings[100] = ItemType.WaxedOxidizedCutCopperSlab; - mappings[101] = ItemType.OakLog; - mappings[102] = ItemType.SpruceLog; - mappings[103] = ItemType.BirchLog; - mappings[104] = ItemType.JungleLog; - mappings[105] = ItemType.AcaciaLog; - mappings[106] = ItemType.DarkOakLog; - mappings[107] = ItemType.CrimsonStem; - mappings[108] = ItemType.WarpedStem; - mappings[109] = ItemType.StrippedOakLog; - mappings[110] = ItemType.StrippedSpruceLog; - mappings[111] = ItemType.StrippedBirchLog; - mappings[112] = ItemType.StrippedJungleLog; - mappings[113] = ItemType.StrippedAcaciaLog; - mappings[114] = ItemType.StrippedDarkOakLog; - mappings[115] = ItemType.StrippedCrimsonStem; - mappings[116] = ItemType.StrippedWarpedStem; - mappings[117] = ItemType.StrippedOakWood; - mappings[118] = ItemType.StrippedSpruceWood; - mappings[119] = ItemType.StrippedBirchWood; - mappings[120] = ItemType.StrippedJungleWood; - mappings[121] = ItemType.StrippedAcaciaWood; - mappings[122] = ItemType.StrippedDarkOakWood; - mappings[123] = ItemType.StrippedCrimsonHyphae; - mappings[124] = ItemType.StrippedWarpedHyphae; - mappings[125] = ItemType.OakWood; - mappings[126] = ItemType.SpruceWood; - mappings[127] = ItemType.BirchWood; - mappings[128] = ItemType.JungleWood; - mappings[129] = ItemType.AcaciaWood; - mappings[130] = ItemType.DarkOakWood; - mappings[131] = ItemType.CrimsonHyphae; - mappings[132] = ItemType.WarpedHyphae; - mappings[133] = ItemType.OakLeaves; - mappings[134] = ItemType.SpruceLeaves; - mappings[135] = ItemType.BirchLeaves; - mappings[136] = ItemType.JungleLeaves; - mappings[137] = ItemType.AcaciaLeaves; - mappings[138] = ItemType.DarkOakLeaves; - mappings[139] = ItemType.AzaleaLeaves; - mappings[140] = ItemType.FloweringAzaleaLeaves; - mappings[141] = ItemType.Sponge; - mappings[142] = ItemType.WetSponge; - mappings[143] = ItemType.Glass; - mappings[144] = ItemType.TintedGlass; - mappings[145] = ItemType.LapisBlock; - mappings[146] = ItemType.Sandstone; - mappings[147] = ItemType.ChiseledSandstone; - mappings[148] = ItemType.CutSandstone; - mappings[149] = ItemType.Cobweb; - mappings[150] = ItemType.ShortGrass; - mappings[151] = ItemType.Fern; - mappings[152] = ItemType.Azalea; - mappings[153] = ItemType.FloweringAzalea; - mappings[154] = ItemType.DeadBush; - mappings[155] = ItemType.Seagrass; - mappings[156] = ItemType.SeaPickle; - mappings[157] = ItemType.WhiteWool; - mappings[158] = ItemType.OrangeWool; - mappings[159] = ItemType.MagentaWool; - mappings[160] = ItemType.LightBlueWool; - mappings[161] = ItemType.YellowWool; - mappings[162] = ItemType.LimeWool; - mappings[163] = ItemType.PinkWool; - mappings[164] = ItemType.GrayWool; - mappings[165] = ItemType.LightGrayWool; - mappings[166] = ItemType.CyanWool; - mappings[167] = ItemType.PurpleWool; - mappings[168] = ItemType.BlueWool; - mappings[169] = ItemType.BrownWool; - mappings[170] = ItemType.GreenWool; - mappings[171] = ItemType.RedWool; - mappings[172] = ItemType.BlackWool; - mappings[173] = ItemType.Dandelion; - mappings[174] = ItemType.Poppy; - mappings[175] = ItemType.BlueOrchid; - mappings[176] = ItemType.Allium; - mappings[177] = ItemType.AzureBluet; - mappings[178] = ItemType.RedTulip; - mappings[179] = ItemType.OrangeTulip; - mappings[180] = ItemType.WhiteTulip; - mappings[181] = ItemType.PinkTulip; - mappings[182] = ItemType.OxeyeDaisy; - mappings[183] = ItemType.Cornflower; - mappings[184] = ItemType.LilyOfTheValley; - mappings[185] = ItemType.WitherRose; - mappings[186] = ItemType.SporeBlossom; - mappings[187] = ItemType.BrownMushroom; - mappings[188] = ItemType.RedMushroom; - mappings[189] = ItemType.CrimsonFungus; - mappings[190] = ItemType.WarpedFungus; - mappings[191] = ItemType.CrimsonRoots; - mappings[192] = ItemType.WarpedRoots; - mappings[193] = ItemType.NetherSprouts; - mappings[194] = ItemType.WeepingVines; - mappings[195] = ItemType.TwistingVines; - mappings[196] = ItemType.SugarCane; - mappings[197] = ItemType.Kelp; - mappings[198] = ItemType.MossCarpet; - mappings[199] = ItemType.MossBlock; - mappings[200] = ItemType.HangingRoots; - mappings[201] = ItemType.BigDripleaf; - mappings[202] = ItemType.SmallDripleaf; - mappings[203] = ItemType.Bamboo; - mappings[204] = ItemType.OakSlab; - mappings[205] = ItemType.SpruceSlab; - mappings[206] = ItemType.BirchSlab; - mappings[207] = ItemType.JungleSlab; - mappings[208] = ItemType.AcaciaSlab; - mappings[209] = ItemType.DarkOakSlab; - mappings[210] = ItemType.CrimsonSlab; - mappings[211] = ItemType.WarpedSlab; - mappings[212] = ItemType.StoneSlab; - mappings[213] = ItemType.SmoothStoneSlab; - mappings[214] = ItemType.SandstoneSlab; - mappings[215] = ItemType.CutSandstoneSlab; - mappings[216] = ItemType.PetrifiedOakSlab; - mappings[217] = ItemType.CobblestoneSlab; - mappings[218] = ItemType.BrickSlab; - mappings[219] = ItemType.StoneBrickSlab; - mappings[220] = ItemType.NetherBrickSlab; - mappings[221] = ItemType.QuartzSlab; - mappings[222] = ItemType.RedSandstoneSlab; - mappings[223] = ItemType.CutRedSandstoneSlab; - mappings[224] = ItemType.PurpurSlab; - mappings[225] = ItemType.PrismarineSlab; - mappings[226] = ItemType.PrismarineBrickSlab; - mappings[227] = ItemType.DarkPrismarineSlab; - mappings[228] = ItemType.SmoothQuartz; - mappings[229] = ItemType.SmoothRedSandstone; - mappings[230] = ItemType.SmoothSandstone; - mappings[231] = ItemType.SmoothStone; - mappings[232] = ItemType.Bricks; - mappings[233] = ItemType.Bookshelf; - mappings[234] = ItemType.MossyCobblestone; - mappings[235] = ItemType.Obsidian; - mappings[236] = ItemType.Torch; - mappings[237] = ItemType.EndRod; - mappings[238] = ItemType.ChorusPlant; - mappings[239] = ItemType.ChorusFlower; - mappings[240] = ItemType.PurpurBlock; - mappings[241] = ItemType.PurpurPillar; - mappings[242] = ItemType.PurpurStairs; - mappings[243] = ItemType.Spawner; - mappings[244] = ItemType.OakStairs; - mappings[245] = ItemType.Chest; - mappings[246] = ItemType.CraftingTable; - mappings[247] = ItemType.Farmland; - mappings[248] = ItemType.Furnace; - mappings[249] = ItemType.Ladder; - mappings[250] = ItemType.CobblestoneStairs; - mappings[251] = ItemType.Snow; - mappings[252] = ItemType.Ice; - mappings[253] = ItemType.SnowBlock; - mappings[254] = ItemType.Cactus; - mappings[255] = ItemType.Clay; - mappings[256] = ItemType.Jukebox; - mappings[257] = ItemType.OakFence; - mappings[258] = ItemType.SpruceFence; - mappings[259] = ItemType.BirchFence; - mappings[260] = ItemType.JungleFence; - mappings[261] = ItemType.AcaciaFence; - mappings[262] = ItemType.DarkOakFence; - mappings[263] = ItemType.CrimsonFence; - mappings[264] = ItemType.WarpedFence; - mappings[265] = ItemType.Pumpkin; - mappings[266] = ItemType.CarvedPumpkin; - mappings[267] = ItemType.JackOLantern; - mappings[268] = ItemType.Netherrack; - mappings[269] = ItemType.SoulSand; - mappings[270] = ItemType.SoulSoil; - mappings[271] = ItemType.Basalt; - mappings[272] = ItemType.PolishedBasalt; - mappings[273] = ItemType.SmoothBasalt; - mappings[274] = ItemType.SoulTorch; - mappings[275] = ItemType.Glowstone; - mappings[276] = ItemType.InfestedStone; - mappings[277] = ItemType.InfestedCobblestone; - mappings[278] = ItemType.InfestedStoneBricks; - mappings[279] = ItemType.InfestedMossyStoneBricks; - mappings[280] = ItemType.InfestedCrackedStoneBricks; - mappings[281] = ItemType.InfestedChiseledStoneBricks; - mappings[282] = ItemType.InfestedDeepslate; - mappings[283] = ItemType.StoneBricks; - mappings[284] = ItemType.MossyStoneBricks; - mappings[285] = ItemType.CrackedStoneBricks; - mappings[286] = ItemType.ChiseledStoneBricks; - mappings[287] = ItemType.DeepslateBricks; - mappings[288] = ItemType.CrackedDeepslateBricks; - mappings[289] = ItemType.DeepslateTiles; - mappings[290] = ItemType.CrackedDeepslateTiles; - mappings[291] = ItemType.ChiseledDeepslate; - mappings[292] = ItemType.BrownMushroomBlock; - mappings[293] = ItemType.RedMushroomBlock; - mappings[294] = ItemType.MushroomStem; - mappings[295] = ItemType.IronBars; - mappings[296] = ItemType.Chain; - mappings[297] = ItemType.GlassPane; - mappings[298] = ItemType.Melon; - mappings[299] = ItemType.Vine; - mappings[300] = ItemType.GlowLichen; - mappings[301] = ItemType.BrickStairs; - mappings[302] = ItemType.StoneBrickStairs; - mappings[303] = ItemType.Mycelium; - mappings[304] = ItemType.LilyPad; - mappings[305] = ItemType.NetherBricks; - mappings[306] = ItemType.CrackedNetherBricks; - mappings[307] = ItemType.ChiseledNetherBricks; - mappings[308] = ItemType.NetherBrickFence; - mappings[309] = ItemType.NetherBrickStairs; - mappings[310] = ItemType.EnchantingTable; - mappings[311] = ItemType.EndPortalFrame; - mappings[312] = ItemType.EndStone; - mappings[313] = ItemType.EndStoneBricks; - mappings[314] = ItemType.DragonEgg; - mappings[315] = ItemType.SandstoneStairs; - mappings[316] = ItemType.EnderChest; - mappings[317] = ItemType.EmeraldBlock; - mappings[318] = ItemType.SpruceStairs; - mappings[319] = ItemType.BirchStairs; - mappings[320] = ItemType.JungleStairs; - mappings[321] = ItemType.CrimsonStairs; - mappings[322] = ItemType.WarpedStairs; - mappings[323] = ItemType.CommandBlock; - mappings[324] = ItemType.Beacon; - mappings[325] = ItemType.CobblestoneWall; - mappings[326] = ItemType.MossyCobblestoneWall; - mappings[327] = ItemType.BrickWall; - mappings[328] = ItemType.PrismarineWall; - mappings[329] = ItemType.RedSandstoneWall; - mappings[330] = ItemType.MossyStoneBrickWall; - mappings[331] = ItemType.GraniteWall; - mappings[332] = ItemType.StoneBrickWall; - mappings[333] = ItemType.NetherBrickWall; - mappings[334] = ItemType.AndesiteWall; - mappings[335] = ItemType.RedNetherBrickWall; - mappings[336] = ItemType.SandstoneWall; - mappings[337] = ItemType.EndStoneBrickWall; - mappings[338] = ItemType.DioriteWall; - mappings[339] = ItemType.BlackstoneWall; - mappings[340] = ItemType.PolishedBlackstoneWall; - mappings[341] = ItemType.PolishedBlackstoneBrickWall; - mappings[342] = ItemType.CobbledDeepslateWall; - mappings[343] = ItemType.PolishedDeepslateWall; - mappings[344] = ItemType.DeepslateBrickWall; - mappings[345] = ItemType.DeepslateTileWall; - mappings[346] = ItemType.Anvil; - mappings[347] = ItemType.ChippedAnvil; - mappings[348] = ItemType.DamagedAnvil; - mappings[349] = ItemType.ChiseledQuartzBlock; - mappings[350] = ItemType.QuartzBlock; - mappings[351] = ItemType.QuartzBricks; - mappings[352] = ItemType.QuartzPillar; - mappings[353] = ItemType.QuartzStairs; - mappings[354] = ItemType.WhiteTerracotta; - mappings[355] = ItemType.OrangeTerracotta; - mappings[356] = ItemType.MagentaTerracotta; - mappings[357] = ItemType.LightBlueTerracotta; - mappings[358] = ItemType.YellowTerracotta; - mappings[359] = ItemType.LimeTerracotta; - mappings[360] = ItemType.PinkTerracotta; - mappings[361] = ItemType.GrayTerracotta; - mappings[362] = ItemType.LightGrayTerracotta; - mappings[363] = ItemType.CyanTerracotta; - mappings[364] = ItemType.PurpleTerracotta; - mappings[365] = ItemType.BlueTerracotta; - mappings[366] = ItemType.BrownTerracotta; - mappings[367] = ItemType.GreenTerracotta; - mappings[368] = ItemType.RedTerracotta; - mappings[369] = ItemType.BlackTerracotta; - mappings[370] = ItemType.Barrier; - mappings[371] = ItemType.Light; - mappings[372] = ItemType.HayBlock; - mappings[373] = ItemType.WhiteCarpet; - mappings[374] = ItemType.OrangeCarpet; - mappings[375] = ItemType.MagentaCarpet; - mappings[376] = ItemType.LightBlueCarpet; - mappings[377] = ItemType.YellowCarpet; - mappings[378] = ItemType.LimeCarpet; - mappings[379] = ItemType.PinkCarpet; - mappings[380] = ItemType.GrayCarpet; - mappings[381] = ItemType.LightGrayCarpet; - mappings[382] = ItemType.CyanCarpet; - mappings[383] = ItemType.PurpleCarpet; - mappings[384] = ItemType.BlueCarpet; - mappings[385] = ItemType.BrownCarpet; - mappings[386] = ItemType.GreenCarpet; - mappings[387] = ItemType.RedCarpet; - mappings[388] = ItemType.BlackCarpet; - mappings[389] = ItemType.Terracotta; - mappings[390] = ItemType.PackedIce; - mappings[391] = ItemType.AcaciaStairs; - mappings[392] = ItemType.DarkOakStairs; - mappings[393] = ItemType.DirtPath; - mappings[394] = ItemType.Sunflower; - mappings[395] = ItemType.Lilac; - mappings[396] = ItemType.RoseBush; - mappings[397] = ItemType.Peony; - mappings[398] = ItemType.TallGrass; - mappings[399] = ItemType.LargeFern; - mappings[400] = ItemType.WhiteStainedGlass; - mappings[401] = ItemType.OrangeStainedGlass; - mappings[402] = ItemType.MagentaStainedGlass; - mappings[403] = ItemType.LightBlueStainedGlass; - mappings[404] = ItemType.YellowStainedGlass; - mappings[405] = ItemType.LimeStainedGlass; - mappings[406] = ItemType.PinkStainedGlass; - mappings[407] = ItemType.GrayStainedGlass; - mappings[408] = ItemType.LightGrayStainedGlass; - mappings[409] = ItemType.CyanStainedGlass; - mappings[410] = ItemType.PurpleStainedGlass; - mappings[411] = ItemType.BlueStainedGlass; - mappings[412] = ItemType.BrownStainedGlass; - mappings[413] = ItemType.GreenStainedGlass; - mappings[414] = ItemType.RedStainedGlass; - mappings[415] = ItemType.BlackStainedGlass; - mappings[416] = ItemType.WhiteStainedGlassPane; - mappings[417] = ItemType.OrangeStainedGlassPane; - mappings[418] = ItemType.MagentaStainedGlassPane; - mappings[419] = ItemType.LightBlueStainedGlassPane; - mappings[420] = ItemType.YellowStainedGlassPane; - mappings[421] = ItemType.LimeStainedGlassPane; - mappings[422] = ItemType.PinkStainedGlassPane; - mappings[423] = ItemType.GrayStainedGlassPane; - mappings[424] = ItemType.LightGrayStainedGlassPane; - mappings[425] = ItemType.CyanStainedGlassPane; - mappings[426] = ItemType.PurpleStainedGlassPane; - mappings[427] = ItemType.BlueStainedGlassPane; - mappings[428] = ItemType.BrownStainedGlassPane; - mappings[429] = ItemType.GreenStainedGlassPane; - mappings[430] = ItemType.RedStainedGlassPane; - mappings[431] = ItemType.BlackStainedGlassPane; - mappings[432] = ItemType.Prismarine; - mappings[433] = ItemType.PrismarineBricks; - mappings[434] = ItemType.DarkPrismarine; - mappings[435] = ItemType.PrismarineStairs; - mappings[436] = ItemType.PrismarineBrickStairs; - mappings[437] = ItemType.DarkPrismarineStairs; - mappings[438] = ItemType.SeaLantern; - mappings[439] = ItemType.RedSandstone; - mappings[440] = ItemType.ChiseledRedSandstone; - mappings[441] = ItemType.CutRedSandstone; - mappings[442] = ItemType.RedSandstoneStairs; - mappings[443] = ItemType.RepeatingCommandBlock; - mappings[444] = ItemType.ChainCommandBlock; - mappings[445] = ItemType.MagmaBlock; - mappings[446] = ItemType.NetherWartBlock; - mappings[447] = ItemType.WarpedWartBlock; - mappings[448] = ItemType.RedNetherBricks; - mappings[449] = ItemType.BoneBlock; - mappings[450] = ItemType.StructureVoid; - mappings[451] = ItemType.ShulkerBox; - mappings[452] = ItemType.WhiteShulkerBox; - mappings[453] = ItemType.OrangeShulkerBox; - mappings[454] = ItemType.MagentaShulkerBox; - mappings[455] = ItemType.LightBlueShulkerBox; - mappings[456] = ItemType.YellowShulkerBox; - mappings[457] = ItemType.LimeShulkerBox; - mappings[458] = ItemType.PinkShulkerBox; - mappings[459] = ItemType.GrayShulkerBox; - mappings[460] = ItemType.LightGrayShulkerBox; - mappings[461] = ItemType.CyanShulkerBox; - mappings[462] = ItemType.PurpleShulkerBox; - mappings[463] = ItemType.BlueShulkerBox; - mappings[464] = ItemType.BrownShulkerBox; - mappings[465] = ItemType.GreenShulkerBox; - mappings[466] = ItemType.RedShulkerBox; - mappings[467] = ItemType.BlackShulkerBox; - mappings[468] = ItemType.WhiteGlazedTerracotta; - mappings[469] = ItemType.OrangeGlazedTerracotta; - mappings[470] = ItemType.MagentaGlazedTerracotta; - mappings[471] = ItemType.LightBlueGlazedTerracotta; - mappings[472] = ItemType.YellowGlazedTerracotta; - mappings[473] = ItemType.LimeGlazedTerracotta; - mappings[474] = ItemType.PinkGlazedTerracotta; - mappings[475] = ItemType.GrayGlazedTerracotta; - mappings[476] = ItemType.LightGrayGlazedTerracotta; - mappings[477] = ItemType.CyanGlazedTerracotta; - mappings[478] = ItemType.PurpleGlazedTerracotta; - mappings[479] = ItemType.BlueGlazedTerracotta; - mappings[480] = ItemType.BrownGlazedTerracotta; - mappings[481] = ItemType.GreenGlazedTerracotta; - mappings[482] = ItemType.RedGlazedTerracotta; - mappings[483] = ItemType.BlackGlazedTerracotta; - mappings[484] = ItemType.WhiteConcrete; - mappings[485] = ItemType.OrangeConcrete; - mappings[486] = ItemType.MagentaConcrete; - mappings[487] = ItemType.LightBlueConcrete; - mappings[488] = ItemType.YellowConcrete; - mappings[489] = ItemType.LimeConcrete; - mappings[490] = ItemType.PinkConcrete; - mappings[491] = ItemType.GrayConcrete; - mappings[492] = ItemType.LightGrayConcrete; - mappings[493] = ItemType.CyanConcrete; - mappings[494] = ItemType.PurpleConcrete; - mappings[495] = ItemType.BlueConcrete; - mappings[496] = ItemType.BrownConcrete; - mappings[497] = ItemType.GreenConcrete; - mappings[498] = ItemType.RedConcrete; - mappings[499] = ItemType.BlackConcrete; - mappings[500] = ItemType.WhiteConcretePowder; - mappings[501] = ItemType.OrangeConcretePowder; - mappings[502] = ItemType.MagentaConcretePowder; - mappings[503] = ItemType.LightBlueConcretePowder; - mappings[504] = ItemType.YellowConcretePowder; - mappings[505] = ItemType.LimeConcretePowder; - mappings[506] = ItemType.PinkConcretePowder; - mappings[507] = ItemType.GrayConcretePowder; - mappings[508] = ItemType.LightGrayConcretePowder; - mappings[509] = ItemType.CyanConcretePowder; - mappings[510] = ItemType.PurpleConcretePowder; - mappings[511] = ItemType.BlueConcretePowder; - mappings[512] = ItemType.BrownConcretePowder; - mappings[513] = ItemType.GreenConcretePowder; - mappings[514] = ItemType.RedConcretePowder; - mappings[515] = ItemType.BlackConcretePowder; - mappings[516] = ItemType.TurtleEgg; - mappings[517] = ItemType.DeadTubeCoralBlock; - mappings[518] = ItemType.DeadBrainCoralBlock; - mappings[519] = ItemType.DeadBubbleCoralBlock; - mappings[520] = ItemType.DeadFireCoralBlock; - mappings[521] = ItemType.DeadHornCoralBlock; - mappings[522] = ItemType.TubeCoralBlock; - mappings[523] = ItemType.BrainCoralBlock; - mappings[524] = ItemType.BubbleCoralBlock; - mappings[525] = ItemType.FireCoralBlock; - mappings[526] = ItemType.HornCoralBlock; - mappings[527] = ItemType.TubeCoral; - mappings[528] = ItemType.BrainCoral; - mappings[529] = ItemType.BubbleCoral; - mappings[530] = ItemType.FireCoral; - mappings[531] = ItemType.HornCoral; - mappings[532] = ItemType.DeadBrainCoral; - mappings[533] = ItemType.DeadBubbleCoral; - mappings[534] = ItemType.DeadFireCoral; - mappings[535] = ItemType.DeadHornCoral; - mappings[536] = ItemType.DeadTubeCoral; - mappings[537] = ItemType.TubeCoralFan; - mappings[538] = ItemType.BrainCoralFan; - mappings[539] = ItemType.BubbleCoralFan; - mappings[540] = ItemType.FireCoralFan; - mappings[541] = ItemType.HornCoralFan; - mappings[542] = ItemType.DeadTubeCoralFan; - mappings[543] = ItemType.DeadBrainCoralFan; - mappings[544] = ItemType.DeadBubbleCoralFan; - mappings[545] = ItemType.DeadFireCoralFan; - mappings[546] = ItemType.DeadHornCoralFan; - mappings[547] = ItemType.BlueIce; - mappings[548] = ItemType.Conduit; - mappings[549] = ItemType.PolishedGraniteStairs; - mappings[550] = ItemType.SmoothRedSandstoneStairs; - mappings[551] = ItemType.MossyStoneBrickStairs; - mappings[552] = ItemType.PolishedDioriteStairs; - mappings[553] = ItemType.MossyCobblestoneStairs; - mappings[554] = ItemType.EndStoneBrickStairs; - mappings[555] = ItemType.StoneStairs; - mappings[556] = ItemType.SmoothSandstoneStairs; - mappings[557] = ItemType.SmoothQuartzStairs; - mappings[558] = ItemType.GraniteStairs; - mappings[559] = ItemType.AndesiteStairs; - mappings[560] = ItemType.RedNetherBrickStairs; - mappings[561] = ItemType.PolishedAndesiteStairs; - mappings[562] = ItemType.DioriteStairs; - mappings[563] = ItemType.CobbledDeepslateStairs; - mappings[564] = ItemType.PolishedDeepslateStairs; - mappings[565] = ItemType.DeepslateBrickStairs; - mappings[566] = ItemType.DeepslateTileStairs; - mappings[567] = ItemType.PolishedGraniteSlab; - mappings[568] = ItemType.SmoothRedSandstoneSlab; - mappings[569] = ItemType.MossyStoneBrickSlab; - mappings[570] = ItemType.PolishedDioriteSlab; - mappings[571] = ItemType.MossyCobblestoneSlab; - mappings[572] = ItemType.EndStoneBrickSlab; - mappings[573] = ItemType.SmoothSandstoneSlab; - mappings[574] = ItemType.SmoothQuartzSlab; - mappings[575] = ItemType.GraniteSlab; - mappings[576] = ItemType.AndesiteSlab; - mappings[577] = ItemType.RedNetherBrickSlab; - mappings[578] = ItemType.PolishedAndesiteSlab; - mappings[579] = ItemType.DioriteSlab; - mappings[580] = ItemType.CobbledDeepslateSlab; - mappings[581] = ItemType.PolishedDeepslateSlab; - mappings[582] = ItemType.DeepslateBrickSlab; - mappings[583] = ItemType.DeepslateTileSlab; - mappings[584] = ItemType.Scaffolding; - mappings[585] = ItemType.Redstone; - mappings[586] = ItemType.RedstoneTorch; - mappings[587] = ItemType.RedstoneBlock; - mappings[588] = ItemType.Repeater; - mappings[589] = ItemType.Comparator; - mappings[590] = ItemType.Piston; - mappings[591] = ItemType.StickyPiston; - mappings[592] = ItemType.SlimeBlock; - mappings[593] = ItemType.HoneyBlock; - mappings[594] = ItemType.Observer; - mappings[595] = ItemType.Hopper; - mappings[596] = ItemType.Dispenser; - mappings[597] = ItemType.Dropper; - mappings[598] = ItemType.Lectern; - mappings[599] = ItemType.Target; - mappings[600] = ItemType.Lever; - mappings[601] = ItemType.LightningRod; - mappings[602] = ItemType.DaylightDetector; - mappings[603] = ItemType.SculkSensor; - mappings[604] = ItemType.TripwireHook; - mappings[605] = ItemType.TrappedChest; - mappings[606] = ItemType.Tnt; - mappings[607] = ItemType.RedstoneLamp; - mappings[608] = ItemType.NoteBlock; - mappings[609] = ItemType.StoneButton; - mappings[610] = ItemType.PolishedBlackstoneButton; - mappings[611] = ItemType.OakButton; - mappings[612] = ItemType.SpruceButton; - mappings[613] = ItemType.BirchButton; - mappings[614] = ItemType.JungleButton; - mappings[615] = ItemType.AcaciaButton; - mappings[616] = ItemType.DarkOakButton; - mappings[617] = ItemType.CrimsonButton; - mappings[618] = ItemType.WarpedButton; - mappings[619] = ItemType.StonePressurePlate; - mappings[620] = ItemType.PolishedBlackstonePressurePlate; - mappings[621] = ItemType.LightWeightedPressurePlate; - mappings[622] = ItemType.HeavyWeightedPressurePlate; - mappings[623] = ItemType.OakPressurePlate; - mappings[624] = ItemType.SprucePressurePlate; - mappings[625] = ItemType.BirchPressurePlate; - mappings[626] = ItemType.JunglePressurePlate; - mappings[627] = ItemType.AcaciaPressurePlate; - mappings[628] = ItemType.DarkOakPressurePlate; - mappings[629] = ItemType.CrimsonPressurePlate; - mappings[630] = ItemType.WarpedPressurePlate; - mappings[631] = ItemType.IronDoor; - mappings[632] = ItemType.OakDoor; - mappings[633] = ItemType.SpruceDoor; - mappings[634] = ItemType.BirchDoor; - mappings[635] = ItemType.JungleDoor; - mappings[636] = ItemType.AcaciaDoor; - mappings[637] = ItemType.DarkOakDoor; - mappings[638] = ItemType.CrimsonDoor; - mappings[639] = ItemType.WarpedDoor; - mappings[640] = ItemType.IronTrapdoor; - mappings[641] = ItemType.OakTrapdoor; - mappings[642] = ItemType.SpruceTrapdoor; - mappings[643] = ItemType.BirchTrapdoor; - mappings[644] = ItemType.JungleTrapdoor; - mappings[645] = ItemType.AcaciaTrapdoor; - mappings[646] = ItemType.DarkOakTrapdoor; - mappings[647] = ItemType.CrimsonTrapdoor; - mappings[648] = ItemType.WarpedTrapdoor; - mappings[649] = ItemType.OakFenceGate; - mappings[650] = ItemType.SpruceFenceGate; - mappings[651] = ItemType.BirchFenceGate; - mappings[652] = ItemType.JungleFenceGate; - mappings[653] = ItemType.AcaciaFenceGate; - mappings[654] = ItemType.DarkOakFenceGate; - mappings[655] = ItemType.CrimsonFenceGate; - mappings[656] = ItemType.WarpedFenceGate; - mappings[657] = ItemType.PoweredRail; - mappings[658] = ItemType.DetectorRail; - mappings[659] = ItemType.Rail; - mappings[660] = ItemType.ActivatorRail; - mappings[661] = ItemType.Saddle; - mappings[662] = ItemType.Minecart; - mappings[663] = ItemType.ChestMinecart; - mappings[664] = ItemType.FurnaceMinecart; - mappings[665] = ItemType.TntMinecart; - mappings[666] = ItemType.HopperMinecart; - mappings[667] = ItemType.CarrotOnAStick; - mappings[668] = ItemType.WarpedFungusOnAStick; - mappings[669] = ItemType.Elytra; - mappings[670] = ItemType.OakBoat; - mappings[671] = ItemType.SpruceBoat; - mappings[672] = ItemType.BirchBoat; - mappings[673] = ItemType.JungleBoat; - mappings[674] = ItemType.AcaciaBoat; - mappings[675] = ItemType.DarkOakBoat; - mappings[676] = ItemType.StructureBlock; - mappings[677] = ItemType.Jigsaw; - mappings[678] = ItemType.TurtleHelmet; - mappings[679] = ItemType.TurtleScute; - mappings[680] = ItemType.FlintAndSteel; - mappings[681] = ItemType.Apple; - mappings[682] = ItemType.Bow; - mappings[683] = ItemType.Arrow; - mappings[684] = ItemType.Coal; - mappings[685] = ItemType.Charcoal; - mappings[686] = ItemType.Diamond; - mappings[687] = ItemType.Emerald; - mappings[688] = ItemType.LapisLazuli; - mappings[689] = ItemType.Quartz; - mappings[690] = ItemType.AmethystShard; - mappings[691] = ItemType.RawIron; - mappings[692] = ItemType.IronIngot; - mappings[693] = ItemType.RawCopper; - mappings[694] = ItemType.CopperIngot; - mappings[695] = ItemType.RawGold; - mappings[696] = ItemType.GoldIngot; - mappings[697] = ItemType.NetheriteIngot; - mappings[698] = ItemType.NetheriteScrap; - mappings[699] = ItemType.WoodenSword; - mappings[700] = ItemType.WoodenShovel; - mappings[701] = ItemType.WoodenPickaxe; - mappings[702] = ItemType.WoodenAxe; - mappings[703] = ItemType.WoodenHoe; - mappings[704] = ItemType.StoneSword; - mappings[705] = ItemType.StoneShovel; - mappings[706] = ItemType.StonePickaxe; - mappings[707] = ItemType.StoneAxe; - mappings[708] = ItemType.StoneHoe; - mappings[709] = ItemType.GoldenSword; - mappings[710] = ItemType.GoldenShovel; - mappings[711] = ItemType.GoldenPickaxe; - mappings[712] = ItemType.GoldenAxe; - mappings[713] = ItemType.GoldenHoe; - mappings[714] = ItemType.IronSword; - mappings[715] = ItemType.IronShovel; - mappings[716] = ItemType.IronPickaxe; - mappings[717] = ItemType.IronAxe; - mappings[718] = ItemType.IronHoe; - mappings[719] = ItemType.DiamondSword; - mappings[720] = ItemType.DiamondShovel; - mappings[721] = ItemType.DiamondPickaxe; - mappings[722] = ItemType.DiamondAxe; - mappings[723] = ItemType.DiamondHoe; - mappings[724] = ItemType.NetheriteSword; - mappings[725] = ItemType.NetheriteShovel; - mappings[726] = ItemType.NetheritePickaxe; - mappings[727] = ItemType.NetheriteAxe; - mappings[728] = ItemType.NetheriteHoe; - mappings[729] = ItemType.Stick; - mappings[730] = ItemType.Bowl; - mappings[731] = ItemType.MushroomStew; - mappings[732] = ItemType.String; - mappings[733] = ItemType.Feather; - mappings[734] = ItemType.Gunpowder; - mappings[735] = ItemType.WheatSeeds; - mappings[736] = ItemType.Wheat; - mappings[737] = ItemType.Bread; - mappings[738] = ItemType.LeatherHelmet; - mappings[739] = ItemType.LeatherChestplate; - mappings[740] = ItemType.LeatherLeggings; - mappings[741] = ItemType.LeatherBoots; - mappings[742] = ItemType.ChainmailHelmet; - mappings[743] = ItemType.ChainmailChestplate; - mappings[744] = ItemType.ChainmailLeggings; - mappings[745] = ItemType.ChainmailBoots; - mappings[746] = ItemType.IronHelmet; - mappings[747] = ItemType.IronChestplate; - mappings[748] = ItemType.IronLeggings; - mappings[749] = ItemType.IronBoots; - mappings[750] = ItemType.DiamondHelmet; - mappings[751] = ItemType.DiamondChestplate; - mappings[752] = ItemType.DiamondLeggings; - mappings[753] = ItemType.DiamondBoots; - mappings[754] = ItemType.GoldenHelmet; - mappings[755] = ItemType.GoldenChestplate; - mappings[756] = ItemType.GoldenLeggings; - mappings[757] = ItemType.GoldenBoots; - mappings[758] = ItemType.NetheriteHelmet; - mappings[759] = ItemType.NetheriteChestplate; - mappings[760] = ItemType.NetheriteLeggings; - mappings[761] = ItemType.NetheriteBoots; - mappings[762] = ItemType.Flint; - mappings[763] = ItemType.Porkchop; - mappings[764] = ItemType.CookedPorkchop; - mappings[765] = ItemType.Painting; - mappings[766] = ItemType.GoldenApple; - mappings[767] = ItemType.EnchantedGoldenApple; - mappings[768] = ItemType.OakSign; - mappings[769] = ItemType.SpruceSign; - mappings[770] = ItemType.BirchSign; - mappings[771] = ItemType.JungleSign; - mappings[772] = ItemType.AcaciaSign; - mappings[773] = ItemType.DarkOakSign; - mappings[774] = ItemType.CrimsonSign; - mappings[775] = ItemType.WarpedSign; - mappings[776] = ItemType.Bucket; - mappings[777] = ItemType.WaterBucket; - mappings[778] = ItemType.LavaBucket; - mappings[779] = ItemType.PowderSnowBucket; - mappings[780] = ItemType.Snowball; - mappings[781] = ItemType.Leather; - mappings[782] = ItemType.MilkBucket; - mappings[783] = ItemType.PufferfishBucket; - mappings[784] = ItemType.SalmonBucket; - mappings[785] = ItemType.CodBucket; - mappings[786] = ItemType.TropicalFishBucket; - mappings[787] = ItemType.AxolotlBucket; - mappings[788] = ItemType.Brick; - mappings[789] = ItemType.ClayBall; - mappings[790] = ItemType.DriedKelpBlock; - mappings[791] = ItemType.Paper; - mappings[792] = ItemType.Book; - mappings[793] = ItemType.SlimeBall; - mappings[794] = ItemType.Egg; - mappings[795] = ItemType.Compass; - mappings[796] = ItemType.Bundle; - mappings[797] = ItemType.FishingRod; - mappings[798] = ItemType.Clock; - mappings[799] = ItemType.Spyglass; - mappings[800] = ItemType.GlowstoneDust; - mappings[801] = ItemType.Cod; - mappings[802] = ItemType.Salmon; - mappings[803] = ItemType.TropicalFish; - mappings[804] = ItemType.Pufferfish; - mappings[805] = ItemType.CookedCod; - mappings[806] = ItemType.CookedSalmon; - mappings[807] = ItemType.InkSac; - mappings[808] = ItemType.GlowInkSac; - mappings[809] = ItemType.CocoaBeans; - mappings[810] = ItemType.WhiteDye; - mappings[811] = ItemType.OrangeDye; - mappings[812] = ItemType.MagentaDye; - mappings[813] = ItemType.LightBlueDye; - mappings[814] = ItemType.YellowDye; - mappings[815] = ItemType.LimeDye; - mappings[816] = ItemType.PinkDye; - mappings[817] = ItemType.GrayDye; - mappings[818] = ItemType.LightGrayDye; - mappings[819] = ItemType.CyanDye; - mappings[820] = ItemType.PurpleDye; - mappings[821] = ItemType.BlueDye; - mappings[822] = ItemType.BrownDye; - mappings[823] = ItemType.GreenDye; - mappings[824] = ItemType.RedDye; - mappings[825] = ItemType.BlackDye; - mappings[826] = ItemType.BoneMeal; - mappings[827] = ItemType.Bone; - mappings[828] = ItemType.Sugar; - mappings[829] = ItemType.Cake; - mappings[830] = ItemType.WhiteBed; - mappings[831] = ItemType.OrangeBed; - mappings[832] = ItemType.MagentaBed; - mappings[833] = ItemType.LightBlueBed; - mappings[834] = ItemType.YellowBed; - mappings[835] = ItemType.LimeBed; - mappings[836] = ItemType.PinkBed; - mappings[837] = ItemType.GrayBed; - mappings[838] = ItemType.LightGrayBed; - mappings[839] = ItemType.CyanBed; - mappings[840] = ItemType.PurpleBed; - mappings[841] = ItemType.BlueBed; - mappings[842] = ItemType.BrownBed; - mappings[843] = ItemType.GreenBed; - mappings[844] = ItemType.RedBed; - mappings[845] = ItemType.BlackBed; - mappings[846] = ItemType.Cookie; - mappings[847] = ItemType.FilledMap; - mappings[848] = ItemType.Shears; - mappings[849] = ItemType.MelonSlice; - mappings[850] = ItemType.DriedKelp; - mappings[851] = ItemType.PumpkinSeeds; - mappings[852] = ItemType.MelonSeeds; - mappings[853] = ItemType.Beef; - mappings[854] = ItemType.CookedBeef; - mappings[855] = ItemType.Chicken; - mappings[856] = ItemType.CookedChicken; - mappings[857] = ItemType.RottenFlesh; - mappings[858] = ItemType.EnderPearl; - mappings[859] = ItemType.BlazeRod; - mappings[860] = ItemType.GhastTear; - mappings[861] = ItemType.GoldNugget; - mappings[862] = ItemType.NetherWart; - mappings[863] = ItemType.Potion; - mappings[864] = ItemType.GlassBottle; - mappings[865] = ItemType.SpiderEye; - mappings[866] = ItemType.FermentedSpiderEye; - mappings[867] = ItemType.BlazePowder; - mappings[868] = ItemType.MagmaCream; - mappings[869] = ItemType.BrewingStand; - mappings[870] = ItemType.Cauldron; - mappings[871] = ItemType.EnderEye; - mappings[872] = ItemType.GlisteringMelonSlice; - mappings[873] = ItemType.AxolotlSpawnEgg; - mappings[874] = ItemType.BatSpawnEgg; - mappings[875] = ItemType.BeeSpawnEgg; - mappings[876] = ItemType.BlazeSpawnEgg; - mappings[877] = ItemType.CatSpawnEgg; - mappings[878] = ItemType.CaveSpiderSpawnEgg; - mappings[879] = ItemType.ChickenSpawnEgg; - mappings[880] = ItemType.CodSpawnEgg; - mappings[881] = ItemType.CowSpawnEgg; - mappings[882] = ItemType.CreeperSpawnEgg; - mappings[883] = ItemType.DolphinSpawnEgg; - mappings[884] = ItemType.DonkeySpawnEgg; - mappings[885] = ItemType.DrownedSpawnEgg; - mappings[886] = ItemType.ElderGuardianSpawnEgg; - mappings[887] = ItemType.EndermanSpawnEgg; - mappings[888] = ItemType.EndermiteSpawnEgg; - mappings[889] = ItemType.EvokerSpawnEgg; - mappings[890] = ItemType.FoxSpawnEgg; - mappings[891] = ItemType.GhastSpawnEgg; - mappings[892] = ItemType.GlowSquidSpawnEgg; - mappings[893] = ItemType.GoatSpawnEgg; - mappings[894] = ItemType.GuardianSpawnEgg; - mappings[895] = ItemType.HoglinSpawnEgg; - mappings[896] = ItemType.HorseSpawnEgg; - mappings[897] = ItemType.HuskSpawnEgg; - mappings[898] = ItemType.LlamaSpawnEgg; - mappings[899] = ItemType.MagmaCubeSpawnEgg; - mappings[900] = ItemType.MooshroomSpawnEgg; - mappings[901] = ItemType.MuleSpawnEgg; - mappings[902] = ItemType.OcelotSpawnEgg; - mappings[903] = ItemType.PandaSpawnEgg; - mappings[904] = ItemType.ParrotSpawnEgg; - mappings[905] = ItemType.PhantomSpawnEgg; - mappings[906] = ItemType.PigSpawnEgg; - mappings[907] = ItemType.PiglinSpawnEgg; - mappings[908] = ItemType.PiglinBruteSpawnEgg; - mappings[909] = ItemType.PillagerSpawnEgg; - mappings[910] = ItemType.PolarBearSpawnEgg; - mappings[911] = ItemType.PufferfishSpawnEgg; - mappings[912] = ItemType.RabbitSpawnEgg; - mappings[913] = ItemType.RavagerSpawnEgg; - mappings[914] = ItemType.SalmonSpawnEgg; - mappings[915] = ItemType.SheepSpawnEgg; - mappings[916] = ItemType.ShulkerSpawnEgg; - mappings[917] = ItemType.SilverfishSpawnEgg; - mappings[918] = ItemType.SkeletonSpawnEgg; - mappings[919] = ItemType.SkeletonHorseSpawnEgg; - mappings[920] = ItemType.SlimeSpawnEgg; - mappings[921] = ItemType.SpiderSpawnEgg; - mappings[922] = ItemType.SquidSpawnEgg; - mappings[923] = ItemType.StraySpawnEgg; - mappings[924] = ItemType.StriderSpawnEgg; - mappings[925] = ItemType.TraderLlamaSpawnEgg; - mappings[926] = ItemType.TropicalFishSpawnEgg; - mappings[927] = ItemType.TurtleSpawnEgg; - mappings[928] = ItemType.VexSpawnEgg; - mappings[929] = ItemType.VillagerSpawnEgg; - mappings[930] = ItemType.VindicatorSpawnEgg; - mappings[931] = ItemType.WanderingTraderSpawnEgg; - mappings[932] = ItemType.WitchSpawnEgg; - mappings[933] = ItemType.WitherSkeletonSpawnEgg; - mappings[934] = ItemType.WolfSpawnEgg; - mappings[935] = ItemType.ZoglinSpawnEgg; - mappings[936] = ItemType.ZombieSpawnEgg; - mappings[937] = ItemType.ZombieHorseSpawnEgg; - mappings[938] = ItemType.ZombieVillagerSpawnEgg; - mappings[939] = ItemType.ZombifiedPiglinSpawnEgg; - mappings[940] = ItemType.ExperienceBottle; - mappings[941] = ItemType.FireCharge; - mappings[942] = ItemType.WritableBook; - mappings[943] = ItemType.WrittenBook; - mappings[944] = ItemType.ItemFrame; - mappings[945] = ItemType.GlowItemFrame; - mappings[946] = ItemType.FlowerPot; - mappings[947] = ItemType.Carrot; - mappings[948] = ItemType.Potato; - mappings[949] = ItemType.BakedPotato; - mappings[950] = ItemType.PoisonousPotato; - mappings[951] = ItemType.Map; - mappings[952] = ItemType.GoldenCarrot; - mappings[953] = ItemType.SkeletonSkull; - mappings[954] = ItemType.WitherSkeletonSkull; - mappings[955] = ItemType.PlayerHead; - mappings[956] = ItemType.ZombieHead; - mappings[957] = ItemType.CreeperHead; - mappings[958] = ItemType.DragonHead; - mappings[959] = ItemType.NetherStar; - mappings[960] = ItemType.PumpkinPie; - mappings[961] = ItemType.FireworkRocket; - mappings[962] = ItemType.FireworkStar; - mappings[963] = ItemType.EnchantedBook; - mappings[964] = ItemType.NetherBrick; - mappings[965] = ItemType.PrismarineShard; - mappings[966] = ItemType.PrismarineCrystals; - mappings[967] = ItemType.Rabbit; - mappings[968] = ItemType.CookedRabbit; - mappings[969] = ItemType.RabbitStew; - mappings[970] = ItemType.RabbitFoot; - mappings[971] = ItemType.RabbitHide; - mappings[972] = ItemType.ArmorStand; - mappings[973] = ItemType.IronHorseArmor; - mappings[974] = ItemType.GoldenHorseArmor; - mappings[975] = ItemType.DiamondHorseArmor; - mappings[976] = ItemType.LeatherHorseArmor; - mappings[977] = ItemType.Lead; - mappings[978] = ItemType.NameTag; - mappings[979] = ItemType.CommandBlockMinecart; - mappings[980] = ItemType.Mutton; - mappings[981] = ItemType.CookedMutton; - mappings[982] = ItemType.WhiteBanner; - mappings[983] = ItemType.OrangeBanner; - mappings[984] = ItemType.MagentaBanner; - mappings[985] = ItemType.LightBlueBanner; - mappings[986] = ItemType.YellowBanner; - mappings[987] = ItemType.LimeBanner; - mappings[988] = ItemType.PinkBanner; - mappings[989] = ItemType.GrayBanner; - mappings[990] = ItemType.LightGrayBanner; - mappings[991] = ItemType.CyanBanner; - mappings[992] = ItemType.PurpleBanner; - mappings[993] = ItemType.BlueBanner; - mappings[994] = ItemType.BrownBanner; - mappings[995] = ItemType.GreenBanner; - mappings[996] = ItemType.RedBanner; - mappings[997] = ItemType.BlackBanner; - mappings[998] = ItemType.EndCrystal; - mappings[999] = ItemType.ChorusFruit; - mappings[1000] = ItemType.PoppedChorusFruit; - mappings[1001] = ItemType.Beetroot; - mappings[1002] = ItemType.BeetrootSeeds; - mappings[1003] = ItemType.BeetrootSoup; - mappings[1004] = ItemType.DragonBreath; - mappings[1005] = ItemType.SplashPotion; - mappings[1006] = ItemType.SpectralArrow; - mappings[1007] = ItemType.TippedArrow; - mappings[1008] = ItemType.LingeringPotion; - mappings[1009] = ItemType.Shield; - mappings[1010] = ItemType.TotemOfUndying; - mappings[1011] = ItemType.ShulkerShell; - mappings[1012] = ItemType.IronNugget; - mappings[1013] = ItemType.KnowledgeBook; - mappings[1014] = ItemType.DebugStick; - mappings[1015] = ItemType.MusicDisc13; - mappings[1016] = ItemType.MusicDiscCat; - mappings[1017] = ItemType.MusicDiscBlocks; - mappings[1018] = ItemType.MusicDiscChirp; - mappings[1019] = ItemType.MusicDiscFar; - mappings[1020] = ItemType.MusicDiscMall; - mappings[1021] = ItemType.MusicDiscMellohi; - mappings[1022] = ItemType.MusicDiscStal; - mappings[1023] = ItemType.MusicDiscStrad; - mappings[1024] = ItemType.MusicDiscWard; - mappings[1025] = ItemType.MusicDisc11; - mappings[1026] = ItemType.MusicDiscWait; - mappings[1027] = ItemType.MusicDiscOtherside; - mappings[1028] = ItemType.MusicDiscPigstep; - mappings[1029] = ItemType.Trident; - mappings[1030] = ItemType.PhantomMembrane; - mappings[1031] = ItemType.NautilusShell; - mappings[1032] = ItemType.HeartOfTheSea; - mappings[1033] = ItemType.Crossbow; - mappings[1034] = ItemType.SuspiciousStew; - mappings[1035] = ItemType.Loom; - mappings[1036] = ItemType.FlowerBannerPattern; - mappings[1037] = ItemType.CreeperBannerPattern; - mappings[1038] = ItemType.SkullBannerPattern; - mappings[1039] = ItemType.MojangBannerPattern; - mappings[1040] = ItemType.GlobeBannerPattern; - mappings[1041] = ItemType.PiglinBannerPattern; - mappings[1042] = ItemType.Composter; - mappings[1043] = ItemType.Barrel; - mappings[1044] = ItemType.Smoker; - mappings[1045] = ItemType.BlastFurnace; - mappings[1046] = ItemType.CartographyTable; - mappings[1047] = ItemType.FletchingTable; - mappings[1048] = ItemType.Grindstone; - mappings[1049] = ItemType.SmithingTable; - mappings[1050] = ItemType.Stonecutter; - mappings[1051] = ItemType.Bell; - mappings[1052] = ItemType.Lantern; - mappings[1053] = ItemType.SoulLantern; - mappings[1054] = ItemType.SweetBerries; - mappings[1055] = ItemType.GlowBerries; - mappings[1056] = ItemType.Campfire; - mappings[1057] = ItemType.SoulCampfire; - mappings[1058] = ItemType.Shroomlight; - mappings[1059] = ItemType.Honeycomb; - mappings[1060] = ItemType.BeeNest; - mappings[1061] = ItemType.Beehive; - mappings[1062] = ItemType.HoneyBottle; - mappings[1063] = ItemType.HoneycombBlock; - mappings[1064] = ItemType.Lodestone; - mappings[1065] = ItemType.CryingObsidian; - mappings[1066] = ItemType.Blackstone; - mappings[1067] = ItemType.BlackstoneSlab; - mappings[1068] = ItemType.BlackstoneStairs; - mappings[1069] = ItemType.GildedBlackstone; - mappings[1070] = ItemType.PolishedBlackstone; - mappings[1071] = ItemType.PolishedBlackstoneSlab; - mappings[1072] = ItemType.PolishedBlackstoneStairs; - mappings[1073] = ItemType.ChiseledPolishedBlackstone; - mappings[1074] = ItemType.PolishedBlackstoneBricks; - mappings[1075] = ItemType.PolishedBlackstoneBrickSlab; - mappings[1076] = ItemType.PolishedBlackstoneBrickStairs; - mappings[1077] = ItemType.CrackedPolishedBlackstoneBricks; - mappings[1078] = ItemType.RespawnAnchor; - mappings[1079] = ItemType.Candle; - mappings[1080] = ItemType.WhiteCandle; - mappings[1081] = ItemType.OrangeCandle; - mappings[1082] = ItemType.MagentaCandle; - mappings[1083] = ItemType.LightBlueCandle; - mappings[1084] = ItemType.YellowCandle; - mappings[1085] = ItemType.LimeCandle; - mappings[1086] = ItemType.PinkCandle; - mappings[1087] = ItemType.GrayCandle; - mappings[1088] = ItemType.LightGrayCandle; - mappings[1089] = ItemType.CyanCandle; - mappings[1090] = ItemType.PurpleCandle; - mappings[1091] = ItemType.BlueCandle; - mappings[1092] = ItemType.BrownCandle; - mappings[1093] = ItemType.GreenCandle; - mappings[1094] = ItemType.RedCandle; - mappings[1095] = ItemType.BlackCandle; - mappings[1096] = ItemType.SmallAmethystBud; - mappings[1097] = ItemType.MediumAmethystBud; - mappings[1098] = ItemType.LargeAmethystBud; - mappings[1099] = ItemType.AmethystCluster; - mappings[1100] = ItemType.PointedDripstone; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette119.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette119.cs deleted file mode 100644 index a1ab48d320..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette119.cs +++ /dev/null @@ -1,1170 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public class ItemPalette119 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette119() - { - mappings[706] = ItemType.AcaciaBoat; - mappings[638] = ItemType.AcaciaButton; - mappings[707] = ItemType.AcaciaChestBoat; - mappings[661] = ItemType.AcaciaDoor; - mappings[272] = ItemType.AcaciaFence; - mappings[680] = ItemType.AcaciaFenceGate; - mappings[146] = ItemType.AcaciaLeaves; - mappings[108] = ItemType.AcaciaLog; - mappings[27] = ItemType.AcaciaPlanks; - mappings[651] = ItemType.AcaciaPressurePlate; - mappings[36] = ItemType.AcaciaSapling; - mappings[808] = ItemType.AcaciaSign; - mappings[218] = ItemType.AcaciaSlab; - mappings[342] = ItemType.AcaciaStairs; - mappings[671] = ItemType.AcaciaTrapdoor; - mappings[137] = ItemType.AcaciaWood; - mappings[688] = ItemType.ActivatorRail; - mappings[0] = ItemType.Air; - mappings[912] = ItemType.AllaySpawnEgg; - mappings[186] = ItemType.Allium; - mappings[66] = ItemType.AmethystBlock; - mappings[1145] = ItemType.AmethystCluster; - mappings[726] = ItemType.AmethystShard; - mappings[61] = ItemType.AncientDebris; - mappings[6] = ItemType.Andesite; - mappings[599] = ItemType.AndesiteSlab; - mappings[582] = ItemType.AndesiteStairs; - mappings[359] = ItemType.AndesiteWall; - mappings[371] = ItemType.Anvil; - mappings[717] = ItemType.Apple; - mappings[1015] = ItemType.ArmorStand; - mappings[719] = ItemType.Arrow; - mappings[824] = ItemType.AxolotlBucket; - mappings[913] = ItemType.AxolotlSpawnEgg; - mappings[162] = ItemType.Azalea; - mappings[149] = ItemType.AzaleaLeaves; - mappings[187] = ItemType.AzureBluet; - mappings[992] = ItemType.BakedPotato; - mappings[213] = ItemType.Bamboo; - mappings[1089] = ItemType.Barrel; - mappings[395] = ItemType.Barrier; - mappings[283] = ItemType.Basalt; - mappings[914] = ItemType.BatSpawnEgg; - mappings[348] = ItemType.Beacon; - mappings[39] = ItemType.Bedrock; - mappings[1106] = ItemType.BeeNest; - mappings[915] = ItemType.BeeSpawnEgg; - mappings[892] = ItemType.Beef; - mappings[1107] = ItemType.Beehive; - mappings[1044] = ItemType.Beetroot; - mappings[1045] = ItemType.BeetrootSeeds; - mappings[1046] = ItemType.BeetrootSoup; - mappings[1097] = ItemType.Bell; - mappings[211] = ItemType.BigDripleaf; - mappings[702] = ItemType.BirchBoat; - mappings[636] = ItemType.BirchButton; - mappings[703] = ItemType.BirchChestBoat; - mappings[659] = ItemType.BirchDoor; - mappings[270] = ItemType.BirchFence; - mappings[678] = ItemType.BirchFenceGate; - mappings[144] = ItemType.BirchLeaves; - mappings[106] = ItemType.BirchLog; - mappings[25] = ItemType.BirchPlanks; - mappings[649] = ItemType.BirchPressurePlate; - mappings[34] = ItemType.BirchSapling; - mappings[806] = ItemType.BirchSign; - mappings[216] = ItemType.BirchSlab; - mappings[340] = ItemType.BirchStairs; - mappings[669] = ItemType.BirchTrapdoor; - mappings[135] = ItemType.BirchWood; - mappings[1040] = ItemType.BlackBanner; - mappings[884] = ItemType.BlackBed; - mappings[1141] = ItemType.BlackCandle; - mappings[413] = ItemType.BlackCarpet; - mappings[522] = ItemType.BlackConcrete; - mappings[538] = ItemType.BlackConcretePowder; - mappings[864] = ItemType.BlackDye; - mappings[506] = ItemType.BlackGlazedTerracotta; - mappings[490] = ItemType.BlackShulkerBox; - mappings[438] = ItemType.BlackStainedGlass; - mappings[454] = ItemType.BlackStainedGlassPane; - mappings[394] = ItemType.BlackTerracotta; - mappings[182] = ItemType.BlackWool; - mappings[1112] = ItemType.Blackstone; - mappings[1113] = ItemType.BlackstoneSlab; - mappings[1114] = ItemType.BlackstoneStairs; - mappings[364] = ItemType.BlackstoneWall; - mappings[1091] = ItemType.BlastFurnace; - mappings[906] = ItemType.BlazePowder; - mappings[898] = ItemType.BlazeRod; - mappings[916] = ItemType.BlazeSpawnEgg; - mappings[1036] = ItemType.BlueBanner; - mappings[880] = ItemType.BlueBed; - mappings[1137] = ItemType.BlueCandle; - mappings[409] = ItemType.BlueCarpet; - mappings[518] = ItemType.BlueConcrete; - mappings[534] = ItemType.BlueConcretePowder; - mappings[860] = ItemType.BlueDye; - mappings[502] = ItemType.BlueGlazedTerracotta; - mappings[570] = ItemType.BlueIce; - mappings[185] = ItemType.BlueOrchid; - mappings[486] = ItemType.BlueShulkerBox; - mappings[434] = ItemType.BlueStainedGlass; - mappings[450] = ItemType.BlueStainedGlassPane; - mappings[390] = ItemType.BlueTerracotta; - mappings[178] = ItemType.BlueWool; - mappings[866] = ItemType.Bone; - mappings[472] = ItemType.BoneBlock; - mappings[865] = ItemType.BoneMeal; - mappings[830] = ItemType.Book; - mappings[245] = ItemType.Bookshelf; - mappings[718] = ItemType.Bow; - mappings[766] = ItemType.Bowl; - mappings[551] = ItemType.BrainCoral; - mappings[546] = ItemType.BrainCoralBlock; - mappings[561] = ItemType.BrainCoralFan; - mappings[773] = ItemType.Bread; - mappings[908] = ItemType.BrewingStand; - mappings[826] = ItemType.Brick; - mappings[229] = ItemType.BrickSlab; - mappings[316] = ItemType.BrickStairs; - mappings[351] = ItemType.BrickWall; - mappings[244] = ItemType.Bricks; - mappings[1037] = ItemType.BrownBanner; - mappings[881] = ItemType.BrownBed; - mappings[1138] = ItemType.BrownCandle; - mappings[410] = ItemType.BrownCarpet; - mappings[519] = ItemType.BrownConcrete; - mappings[535] = ItemType.BrownConcretePowder; - mappings[861] = ItemType.BrownDye; - mappings[503] = ItemType.BrownGlazedTerracotta; - mappings[197] = ItemType.BrownMushroom; - mappings[307] = ItemType.BrownMushroomBlock; - mappings[487] = ItemType.BrownShulkerBox; - mappings[435] = ItemType.BrownStainedGlass; - mappings[451] = ItemType.BrownStainedGlassPane; - mappings[391] = ItemType.BrownTerracotta; - mappings[179] = ItemType.BrownWool; - mappings[552] = ItemType.BubbleCoral; - mappings[547] = ItemType.BubbleCoralBlock; - mappings[562] = ItemType.BubbleCoralFan; - mappings[813] = ItemType.Bucket; - mappings[67] = ItemType.BuddingAmethyst; - mappings[835] = ItemType.Bundle; - mappings[265] = ItemType.Cactus; - mappings[868] = ItemType.Cake; - mappings[11] = ItemType.Calcite; - mappings[1102] = ItemType.Campfire; - mappings[1125] = ItemType.Candle; - mappings[990] = ItemType.Carrot; - mappings[695] = ItemType.CarrotOnAStick; - mappings[1092] = ItemType.CartographyTable; - mappings[278] = ItemType.CarvedPumpkin; - mappings[917] = ItemType.CatSpawnEgg; - mappings[909] = ItemType.Cauldron; - mappings[918] = ItemType.CaveSpiderSpawnEgg; - mappings[311] = ItemType.Chain; - mappings[467] = ItemType.ChainCommandBlock; - mappings[781] = ItemType.ChainmailBoots; - mappings[779] = ItemType.ChainmailChestplate; - mappings[778] = ItemType.ChainmailHelmet; - mappings[780] = ItemType.ChainmailLeggings; - mappings[721] = ItemType.Charcoal; - mappings[256] = ItemType.Chest; - mappings[691] = ItemType.ChestMinecart; - mappings[894] = ItemType.Chicken; - mappings[919] = ItemType.ChickenSpawnEgg; - mappings[372] = ItemType.ChippedAnvil; - mappings[305] = ItemType.ChiseledDeepslate; - mappings[323] = ItemType.ChiseledNetherBricks; - mappings[1119] = ItemType.ChiseledPolishedBlackstone; - mappings[374] = ItemType.ChiseledQuartzBlock; - mappings[463] = ItemType.ChiseledRedSandstone; - mappings[157] = ItemType.ChiseledSandstone; - mappings[298] = ItemType.ChiseledStoneBricks; - mappings[251] = ItemType.ChorusFlower; - mappings[1042] = ItemType.ChorusFruit; - mappings[250] = ItemType.ChorusPlant; - mappings[266] = ItemType.Clay; - mappings[827] = ItemType.ClayBall; - mappings[837] = ItemType.Clock; - mappings[720] = ItemType.Coal; - mappings[62] = ItemType.CoalBlock; - mappings[43] = ItemType.CoalOre; - mappings[16] = ItemType.CoarseDirt; - mappings[9] = ItemType.CobbledDeepslate; - mappings[603] = ItemType.CobbledDeepslateSlab; - mappings[586] = ItemType.CobbledDeepslateStairs; - mappings[367] = ItemType.CobbledDeepslateWall; - mappings[22] = ItemType.Cobblestone; - mappings[228] = ItemType.CobblestoneSlab; - mappings[261] = ItemType.CobblestoneStairs; - mappings[349] = ItemType.CobblestoneWall; - mappings[159] = ItemType.Cobweb; - mappings[848] = ItemType.CocoaBeans; - mappings[840] = ItemType.Cod; - mappings[822] = ItemType.CodBucket; - mappings[920] = ItemType.CodSpawnEgg; - mappings[347] = ItemType.CommandBlock; - mappings[1022] = ItemType.CommandBlockMinecart; - mappings[612] = ItemType.Comparator; - mappings[833] = ItemType.Compass; - mappings[1088] = ItemType.Composter; - mappings[571] = ItemType.Conduit; - mappings[893] = ItemType.CookedBeef; - mappings[895] = ItemType.CookedChicken; - mappings[844] = ItemType.CookedCod; - mappings[1024] = ItemType.CookedMutton; - mappings[800] = ItemType.CookedPorkchop; - mappings[1011] = ItemType.CookedRabbit; - mappings[845] = ItemType.CookedSalmon; - mappings[885] = ItemType.Cookie; - mappings[69] = ItemType.CopperBlock; - mappings[730] = ItemType.CopperIngot; - mappings[47] = ItemType.CopperOre; - mappings[193] = ItemType.Cornflower; - mappings[921] = ItemType.CowSpawnEgg; - mappings[302] = ItemType.CrackedDeepslateBricks; - mappings[304] = ItemType.CrackedDeepslateTiles; - mappings[322] = ItemType.CrackedNetherBricks; - mappings[1123] = ItemType.CrackedPolishedBlackstoneBricks; - mappings[297] = ItemType.CrackedStoneBricks; - mappings[257] = ItemType.CraftingTable; - mappings[1082] = ItemType.CreeperBannerPattern; - mappings[1000] = ItemType.CreeperHead; - mappings[922] = ItemType.CreeperSpawnEgg; - mappings[641] = ItemType.CrimsonButton; - mappings[664] = ItemType.CrimsonDoor; - mappings[275] = ItemType.CrimsonFence; - mappings[683] = ItemType.CrimsonFenceGate; - mappings[199] = ItemType.CrimsonFungus; - mappings[140] = ItemType.CrimsonHyphae; - mappings[20] = ItemType.CrimsonNylium; - mappings[30] = ItemType.CrimsonPlanks; - mappings[654] = ItemType.CrimsonPressurePlate; - mappings[201] = ItemType.CrimsonRoots; - mappings[811] = ItemType.CrimsonSign; - mappings[221] = ItemType.CrimsonSlab; - mappings[345] = ItemType.CrimsonStairs; - mappings[113] = ItemType.CrimsonStem; - mappings[674] = ItemType.CrimsonTrapdoor; - mappings[1078] = ItemType.Crossbow; - mappings[1111] = ItemType.CryingObsidian; - mappings[76] = ItemType.CutCopper; - mappings[84] = ItemType.CutCopperSlab; - mappings[80] = ItemType.CutCopperStairs; - mappings[464] = ItemType.CutRedSandstone; - mappings[235] = ItemType.CutRedSandstoneSlab; - mappings[158] = ItemType.CutSandstone; - mappings[226] = ItemType.CutSandstoneSlab; - mappings[1034] = ItemType.CyanBanner; - mappings[878] = ItemType.CyanBed; - mappings[1135] = ItemType.CyanCandle; - mappings[407] = ItemType.CyanCarpet; - mappings[516] = ItemType.CyanConcrete; - mappings[532] = ItemType.CyanConcretePowder; - mappings[858] = ItemType.CyanDye; - mappings[500] = ItemType.CyanGlazedTerracotta; - mappings[484] = ItemType.CyanShulkerBox; - mappings[432] = ItemType.CyanStainedGlass; - mappings[448] = ItemType.CyanStainedGlassPane; - mappings[388] = ItemType.CyanTerracotta; - mappings[176] = ItemType.CyanWool; - mappings[373] = ItemType.DamagedAnvil; - mappings[183] = ItemType.Dandelion; - mappings[708] = ItemType.DarkOakBoat; - mappings[639] = ItemType.DarkOakButton; - mappings[709] = ItemType.DarkOakChestBoat; - mappings[662] = ItemType.DarkOakDoor; - mappings[273] = ItemType.DarkOakFence; - mappings[681] = ItemType.DarkOakFenceGate; - mappings[147] = ItemType.DarkOakLeaves; - mappings[109] = ItemType.DarkOakLog; - mappings[28] = ItemType.DarkOakPlanks; - mappings[652] = ItemType.DarkOakPressurePlate; - mappings[37] = ItemType.DarkOakSapling; - mappings[809] = ItemType.DarkOakSign; - mappings[219] = ItemType.DarkOakSlab; - mappings[343] = ItemType.DarkOakStairs; - mappings[672] = ItemType.DarkOakTrapdoor; - mappings[138] = ItemType.DarkOakWood; - mappings[457] = ItemType.DarkPrismarine; - mappings[239] = ItemType.DarkPrismarineSlab; - mappings[460] = ItemType.DarkPrismarineStairs; - mappings[625] = ItemType.DaylightDetector; - mappings[555] = ItemType.DeadBrainCoral; - mappings[541] = ItemType.DeadBrainCoralBlock; - mappings[566] = ItemType.DeadBrainCoralFan; - mappings[556] = ItemType.DeadBubbleCoral; - mappings[542] = ItemType.DeadBubbleCoralBlock; - mappings[567] = ItemType.DeadBubbleCoralFan; - mappings[164] = ItemType.DeadBush; - mappings[557] = ItemType.DeadFireCoral; - mappings[543] = ItemType.DeadFireCoralBlock; - mappings[568] = ItemType.DeadFireCoralFan; - mappings[558] = ItemType.DeadHornCoral; - mappings[544] = ItemType.DeadHornCoralBlock; - mappings[569] = ItemType.DeadHornCoralFan; - mappings[559] = ItemType.DeadTubeCoral; - mappings[540] = ItemType.DeadTubeCoralBlock; - mappings[565] = ItemType.DeadTubeCoralFan; - mappings[1057] = ItemType.DebugStick; - mappings[8] = ItemType.Deepslate; - mappings[605] = ItemType.DeepslateBrickSlab; - mappings[588] = ItemType.DeepslateBrickStairs; - mappings[369] = ItemType.DeepslateBrickWall; - mappings[301] = ItemType.DeepslateBricks; - mappings[44] = ItemType.DeepslateCoalOre; - mappings[48] = ItemType.DeepslateCopperOre; - mappings[58] = ItemType.DeepslateDiamondOre; - mappings[54] = ItemType.DeepslateEmeraldOre; - mappings[50] = ItemType.DeepslateGoldOre; - mappings[46] = ItemType.DeepslateIronOre; - mappings[56] = ItemType.DeepslateLapisOre; - mappings[52] = ItemType.DeepslateRedstoneOre; - mappings[606] = ItemType.DeepslateTileSlab; - mappings[589] = ItemType.DeepslateTileStairs; - mappings[370] = ItemType.DeepslateTileWall; - mappings[303] = ItemType.DeepslateTiles; - mappings[686] = ItemType.DetectorRail; - mappings[722] = ItemType.Diamond; - mappings[758] = ItemType.DiamondAxe; - mappings[71] = ItemType.DiamondBlock; - mappings[789] = ItemType.DiamondBoots; - mappings[787] = ItemType.DiamondChestplate; - mappings[786] = ItemType.DiamondHelmet; - mappings[759] = ItemType.DiamondHoe; - mappings[1018] = ItemType.DiamondHorseArmor; - mappings[788] = ItemType.DiamondLeggings; - mappings[57] = ItemType.DiamondOre; - mappings[757] = ItemType.DiamondPickaxe; - mappings[756] = ItemType.DiamondShovel; - mappings[755] = ItemType.DiamondSword; - mappings[4] = ItemType.Diorite; - mappings[602] = ItemType.DioriteSlab; - mappings[585] = ItemType.DioriteStairs; - mappings[363] = ItemType.DioriteWall; - mappings[15] = ItemType.Dirt; - mappings[416] = ItemType.DirtPath; - mappings[1073] = ItemType.DiscFragment5; - mappings[619] = ItemType.Dispenser; - mappings[923] = ItemType.DolphinSpawnEgg; - mappings[924] = ItemType.DonkeySpawnEgg; - mappings[1047] = ItemType.DragonBreath; - mappings[334] = ItemType.DragonEgg; - mappings[1001] = ItemType.DragonHead; - mappings[889] = ItemType.DriedKelp; - mappings[828] = ItemType.DriedKelpBlock; - mappings[13] = ItemType.DripstoneBlock; - mappings[620] = ItemType.Dropper; - mappings[925] = ItemType.DrownedSpawnEgg; - mappings[1151] = ItemType.EchoShard; - mappings[832] = ItemType.Egg; - mappings[926] = ItemType.ElderGuardianSpawnEgg; - mappings[697] = ItemType.Elytra; - mappings[723] = ItemType.Emerald; - mappings[337] = ItemType.EmeraldBlock; - mappings[53] = ItemType.EmeraldOre; - mappings[1006] = ItemType.EnchantedBook; - mappings[803] = ItemType.EnchantedGoldenApple; - mappings[330] = ItemType.EnchantingTable; - mappings[1041] = ItemType.EndCrystal; - mappings[331] = ItemType.EndPortalFrame; - mappings[249] = ItemType.EndRod; - mappings[332] = ItemType.EndStone; - mappings[595] = ItemType.EndStoneBrickSlab; - mappings[577] = ItemType.EndStoneBrickStairs; - mappings[362] = ItemType.EndStoneBrickWall; - mappings[333] = ItemType.EndStoneBricks; - mappings[336] = ItemType.EnderChest; - mappings[910] = ItemType.EnderEye; - mappings[897] = ItemType.EnderPearl; - mappings[927] = ItemType.EndermanSpawnEgg; - mappings[928] = ItemType.EndermiteSpawnEgg; - mappings[929] = ItemType.EvokerSpawnEgg; - mappings[983] = ItemType.ExperienceBottle; - mappings[73] = ItemType.ExposedCopper; - mappings[77] = ItemType.ExposedCutCopper; - mappings[85] = ItemType.ExposedCutCopperSlab; - mappings[81] = ItemType.ExposedCutCopperStairs; - mappings[258] = ItemType.Farmland; - mappings[769] = ItemType.Feather; - mappings[905] = ItemType.FermentedSpiderEye; - mappings[161] = ItemType.Fern; - mappings[886] = ItemType.FilledMap; - mappings[984] = ItemType.FireCharge; - mappings[553] = ItemType.FireCoral; - mappings[548] = ItemType.FireCoralBlock; - mappings[563] = ItemType.FireCoralFan; - mappings[1004] = ItemType.FireworkRocket; - mappings[1005] = ItemType.FireworkStar; - mappings[836] = ItemType.FishingRod; - mappings[1093] = ItemType.FletchingTable; - mappings[798] = ItemType.Flint; - mappings[716] = ItemType.FlintAndSteel; - mappings[1081] = ItemType.FlowerBannerPattern; - mappings[989] = ItemType.FlowerPot; - mappings[163] = ItemType.FloweringAzalea; - mappings[150] = ItemType.FloweringAzaleaLeaves; - mappings[930] = ItemType.FoxSpawnEgg; - mappings[931] = ItemType.FrogSpawnEgg; - mappings[1150] = ItemType.Frogspawn; - mappings[259] = ItemType.Furnace; - mappings[692] = ItemType.FurnaceMinecart; - mappings[932] = ItemType.GhastSpawnEgg; - mappings[899] = ItemType.GhastTear; - mappings[1115] = ItemType.GildedBlackstone; - mappings[153] = ItemType.Glass; - mappings[903] = ItemType.GlassBottle; - mappings[312] = ItemType.GlassPane; - mappings[911] = ItemType.GlisteringMelonSlice; - mappings[1085] = ItemType.GlobeBannerPattern; - mappings[1101] = ItemType.GlowBerries; - mappings[847] = ItemType.GlowInkSac; - mappings[988] = ItemType.GlowItemFrame; - mappings[315] = ItemType.GlowLichen; - mappings[933] = ItemType.GlowSquidSpawnEgg; - mappings[287] = ItemType.Glowstone; - mappings[839] = ItemType.GlowstoneDust; - mappings[1087] = ItemType.GoatHorn; - mappings[934] = ItemType.GoatSpawnEgg; - mappings[70] = ItemType.GoldBlock; - mappings[732] = ItemType.GoldIngot; - mappings[900] = ItemType.GoldNugget; - mappings[49] = ItemType.GoldOre; - mappings[802] = ItemType.GoldenApple; - mappings[748] = ItemType.GoldenAxe; - mappings[793] = ItemType.GoldenBoots; - mappings[995] = ItemType.GoldenCarrot; - mappings[791] = ItemType.GoldenChestplate; - mappings[790] = ItemType.GoldenHelmet; - mappings[749] = ItemType.GoldenHoe; - mappings[1017] = ItemType.GoldenHorseArmor; - mappings[792] = ItemType.GoldenLeggings; - mappings[747] = ItemType.GoldenPickaxe; - mappings[746] = ItemType.GoldenShovel; - mappings[745] = ItemType.GoldenSword; - mappings[2] = ItemType.Granite; - mappings[598] = ItemType.GraniteSlab; - mappings[581] = ItemType.GraniteStairs; - mappings[355] = ItemType.GraniteWall; - mappings[160] = ItemType.ShortGrass; - mappings[14] = ItemType.GrassBlock; - mappings[42] = ItemType.Gravel; - mappings[1032] = ItemType.GrayBanner; - mappings[876] = ItemType.GrayBed; - mappings[1133] = ItemType.GrayCandle; - mappings[405] = ItemType.GrayCarpet; - mappings[514] = ItemType.GrayConcrete; - mappings[530] = ItemType.GrayConcretePowder; - mappings[856] = ItemType.GrayDye; - mappings[498] = ItemType.GrayGlazedTerracotta; - mappings[482] = ItemType.GrayShulkerBox; - mappings[430] = ItemType.GrayStainedGlass; - mappings[446] = ItemType.GrayStainedGlassPane; - mappings[386] = ItemType.GrayTerracotta; - mappings[174] = ItemType.GrayWool; - mappings[1038] = ItemType.GreenBanner; - mappings[882] = ItemType.GreenBed; - mappings[1139] = ItemType.GreenCandle; - mappings[411] = ItemType.GreenCarpet; - mappings[520] = ItemType.GreenConcrete; - mappings[536] = ItemType.GreenConcretePowder; - mappings[862] = ItemType.GreenDye; - mappings[504] = ItemType.GreenGlazedTerracotta; - mappings[488] = ItemType.GreenShulkerBox; - mappings[436] = ItemType.GreenStainedGlass; - mappings[452] = ItemType.GreenStainedGlassPane; - mappings[392] = ItemType.GreenTerracotta; - mappings[180] = ItemType.GreenWool; - mappings[1094] = ItemType.Grindstone; - mappings[935] = ItemType.GuardianSpawnEgg; - mappings[770] = ItemType.Gunpowder; - mappings[210] = ItemType.HangingRoots; - mappings[397] = ItemType.HayBlock; - mappings[1077] = ItemType.HeartOfTheSea; - mappings[646] = ItemType.HeavyWeightedPressurePlate; - mappings[936] = ItemType.HoglinSpawnEgg; - mappings[616] = ItemType.HoneyBlock; - mappings[1108] = ItemType.HoneyBottle; - mappings[1105] = ItemType.Honeycomb; - mappings[1109] = ItemType.HoneycombBlock; - mappings[618] = ItemType.Hopper; - mappings[694] = ItemType.HopperMinecart; - mappings[554] = ItemType.HornCoral; - mappings[549] = ItemType.HornCoralBlock; - mappings[564] = ItemType.HornCoralFan; - mappings[937] = ItemType.HorseSpawnEgg; - mappings[938] = ItemType.HuskSpawnEgg; - mappings[263] = ItemType.Ice; - mappings[293] = ItemType.InfestedChiseledStoneBricks; - mappings[289] = ItemType.InfestedCobblestone; - mappings[292] = ItemType.InfestedCrackedStoneBricks; - mappings[294] = ItemType.InfestedDeepslate; - mappings[291] = ItemType.InfestedMossyStoneBricks; - mappings[288] = ItemType.InfestedStone; - mappings[290] = ItemType.InfestedStoneBricks; - mappings[846] = ItemType.InkSac; - mappings[753] = ItemType.IronAxe; - mappings[310] = ItemType.IronBars; - mappings[68] = ItemType.IronBlock; - mappings[785] = ItemType.IronBoots; - mappings[783] = ItemType.IronChestplate; - mappings[656] = ItemType.IronDoor; - mappings[782] = ItemType.IronHelmet; - mappings[754] = ItemType.IronHoe; - mappings[1016] = ItemType.IronHorseArmor; - mappings[728] = ItemType.IronIngot; - mappings[784] = ItemType.IronLeggings; - mappings[1055] = ItemType.IronNugget; - mappings[45] = ItemType.IronOre; - mappings[752] = ItemType.IronPickaxe; - mappings[751] = ItemType.IronShovel; - mappings[750] = ItemType.IronSword; - mappings[666] = ItemType.IronTrapdoor; - mappings[987] = ItemType.ItemFrame; - mappings[279] = ItemType.JackOLantern; - mappings[713] = ItemType.Jigsaw; - mappings[267] = ItemType.Jukebox; - mappings[704] = ItemType.JungleBoat; - mappings[637] = ItemType.JungleButton; - mappings[705] = ItemType.JungleChestBoat; - mappings[660] = ItemType.JungleDoor; - mappings[271] = ItemType.JungleFence; - mappings[679] = ItemType.JungleFenceGate; - mappings[145] = ItemType.JungleLeaves; - mappings[107] = ItemType.JungleLog; - mappings[26] = ItemType.JunglePlanks; - mappings[650] = ItemType.JunglePressurePlate; - mappings[35] = ItemType.JungleSapling; - mappings[807] = ItemType.JungleSign; - mappings[217] = ItemType.JungleSlab; - mappings[341] = ItemType.JungleStairs; - mappings[670] = ItemType.JungleTrapdoor; - mappings[136] = ItemType.JungleWood; - mappings[207] = ItemType.Kelp; - mappings[1056] = ItemType.KnowledgeBook; - mappings[260] = ItemType.Ladder; - mappings[1098] = ItemType.Lantern; - mappings[155] = ItemType.LapisBlock; - mappings[724] = ItemType.LapisLazuli; - mappings[55] = ItemType.LapisOre; - mappings[1144] = ItemType.LargeAmethystBud; - mappings[422] = ItemType.LargeFern; - mappings[815] = ItemType.LavaBucket; - mappings[1020] = ItemType.Lead; - mappings[818] = ItemType.Leather; - mappings[777] = ItemType.LeatherBoots; - mappings[775] = ItemType.LeatherChestplate; - mappings[774] = ItemType.LeatherHelmet; - mappings[1019] = ItemType.LeatherHorseArmor; - mappings[776] = ItemType.LeatherLeggings; - mappings[621] = ItemType.Lectern; - mappings[623] = ItemType.Lever; - mappings[396] = ItemType.Light; - mappings[1028] = ItemType.LightBlueBanner; - mappings[872] = ItemType.LightBlueBed; - mappings[1129] = ItemType.LightBlueCandle; - mappings[401] = ItemType.LightBlueCarpet; - mappings[510] = ItemType.LightBlueConcrete; - mappings[526] = ItemType.LightBlueConcretePowder; - mappings[852] = ItemType.LightBlueDye; - mappings[494] = ItemType.LightBlueGlazedTerracotta; - mappings[478] = ItemType.LightBlueShulkerBox; - mappings[426] = ItemType.LightBlueStainedGlass; - mappings[442] = ItemType.LightBlueStainedGlassPane; - mappings[382] = ItemType.LightBlueTerracotta; - mappings[170] = ItemType.LightBlueWool; - mappings[1033] = ItemType.LightGrayBanner; - mappings[877] = ItemType.LightGrayBed; - mappings[1134] = ItemType.LightGrayCandle; - mappings[406] = ItemType.LightGrayCarpet; - mappings[515] = ItemType.LightGrayConcrete; - mappings[531] = ItemType.LightGrayConcretePowder; - mappings[857] = ItemType.LightGrayDye; - mappings[499] = ItemType.LightGrayGlazedTerracotta; - mappings[483] = ItemType.LightGrayShulkerBox; - mappings[431] = ItemType.LightGrayStainedGlass; - mappings[447] = ItemType.LightGrayStainedGlassPane; - mappings[387] = ItemType.LightGrayTerracotta; - mappings[175] = ItemType.LightGrayWool; - mappings[645] = ItemType.LightWeightedPressurePlate; - mappings[624] = ItemType.LightningRod; - mappings[418] = ItemType.Lilac; - mappings[194] = ItemType.LilyOfTheValley; - mappings[320] = ItemType.LilyPad; - mappings[1030] = ItemType.LimeBanner; - mappings[874] = ItemType.LimeBed; - mappings[1131] = ItemType.LimeCandle; - mappings[403] = ItemType.LimeCarpet; - mappings[512] = ItemType.LimeConcrete; - mappings[528] = ItemType.LimeConcretePowder; - mappings[854] = ItemType.LimeDye; - mappings[496] = ItemType.LimeGlazedTerracotta; - mappings[480] = ItemType.LimeShulkerBox; - mappings[428] = ItemType.LimeStainedGlass; - mappings[444] = ItemType.LimeStainedGlassPane; - mappings[384] = ItemType.LimeTerracotta; - mappings[172] = ItemType.LimeWool; - mappings[1051] = ItemType.LingeringPotion; - mappings[939] = ItemType.LlamaSpawnEgg; - mappings[1110] = ItemType.Lodestone; - mappings[1080] = ItemType.Loom; - mappings[1027] = ItemType.MagentaBanner; - mappings[871] = ItemType.MagentaBed; - mappings[1128] = ItemType.MagentaCandle; - mappings[400] = ItemType.MagentaCarpet; - mappings[509] = ItemType.MagentaConcrete; - mappings[525] = ItemType.MagentaConcretePowder; - mappings[851] = ItemType.MagentaDye; - mappings[493] = ItemType.MagentaGlazedTerracotta; - mappings[477] = ItemType.MagentaShulkerBox; - mappings[425] = ItemType.MagentaStainedGlass; - mappings[441] = ItemType.MagentaStainedGlassPane; - mappings[381] = ItemType.MagentaTerracotta; - mappings[169] = ItemType.MagentaWool; - mappings[468] = ItemType.MagmaBlock; - mappings[907] = ItemType.MagmaCream; - mappings[940] = ItemType.MagmaCubeSpawnEgg; - mappings[710] = ItemType.MangroveBoat; - mappings[640] = ItemType.MangroveButton; - mappings[711] = ItemType.MangroveChestBoat; - mappings[663] = ItemType.MangroveDoor; - mappings[274] = ItemType.MangroveFence; - mappings[682] = ItemType.MangroveFenceGate; - mappings[148] = ItemType.MangroveLeaves; - mappings[110] = ItemType.MangroveLog; - mappings[29] = ItemType.MangrovePlanks; - mappings[653] = ItemType.MangrovePressurePlate; - mappings[38] = ItemType.MangrovePropagule; - mappings[111] = ItemType.MangroveRoots; - mappings[810] = ItemType.MangroveSign; - mappings[220] = ItemType.MangroveSlab; - mappings[344] = ItemType.MangroveStairs; - mappings[673] = ItemType.MangroveTrapdoor; - mappings[139] = ItemType.MangroveWood; - mappings[994] = ItemType.Map; - mappings[1143] = ItemType.MediumAmethystBud; - mappings[313] = ItemType.Melon; - mappings[891] = ItemType.MelonSeeds; - mappings[888] = ItemType.MelonSlice; - mappings[819] = ItemType.MilkBucket; - mappings[690] = ItemType.Minecart; - mappings[1084] = ItemType.MojangBannerPattern; - mappings[941] = ItemType.MooshroomSpawnEgg; - mappings[209] = ItemType.MossBlock; - mappings[208] = ItemType.MossCarpet; - mappings[246] = ItemType.MossyCobblestone; - mappings[594] = ItemType.MossyCobblestoneSlab; - mappings[576] = ItemType.MossyCobblestoneStairs; - mappings[350] = ItemType.MossyCobblestoneWall; - mappings[592] = ItemType.MossyStoneBrickSlab; - mappings[574] = ItemType.MossyStoneBrickStairs; - mappings[354] = ItemType.MossyStoneBrickWall; - mappings[296] = ItemType.MossyStoneBricks; - mappings[19] = ItemType.Mud; - mappings[231] = ItemType.MudBrickSlab; - mappings[318] = ItemType.MudBrickStairs; - mappings[357] = ItemType.MudBrickWall; - mappings[300] = ItemType.MudBricks; - mappings[112] = ItemType.MuddyMangroveRoots; - mappings[942] = ItemType.MuleSpawnEgg; - mappings[309] = ItemType.MushroomStem; - mappings[767] = ItemType.MushroomStew; - mappings[1068] = ItemType.MusicDisc11; - mappings[1058] = ItemType.MusicDisc13; - mappings[1071] = ItemType.MusicDisc5; - mappings[1060] = ItemType.MusicDiscBlocks; - mappings[1059] = ItemType.MusicDiscCat; - mappings[1061] = ItemType.MusicDiscChirp; - mappings[1062] = ItemType.MusicDiscFar; - mappings[1063] = ItemType.MusicDiscMall; - mappings[1064] = ItemType.MusicDiscMellohi; - mappings[1070] = ItemType.MusicDiscOtherside; - mappings[1072] = ItemType.MusicDiscPigstep; - mappings[1065] = ItemType.MusicDiscStal; - mappings[1066] = ItemType.MusicDiscStrad; - mappings[1069] = ItemType.MusicDiscWait; - mappings[1067] = ItemType.MusicDiscWard; - mappings[1023] = ItemType.Mutton; - mappings[319] = ItemType.Mycelium; - mappings[1021] = ItemType.NameTag; - mappings[1076] = ItemType.NautilusShell; - mappings[1007] = ItemType.NetherBrick; - mappings[324] = ItemType.NetherBrickFence; - mappings[232] = ItemType.NetherBrickSlab; - mappings[325] = ItemType.NetherBrickStairs; - mappings[358] = ItemType.NetherBrickWall; - mappings[321] = ItemType.NetherBricks; - mappings[59] = ItemType.NetherGoldOre; - mappings[60] = ItemType.NetherQuartzOre; - mappings[203] = ItemType.NetherSprouts; - mappings[1002] = ItemType.NetherStar; - mappings[901] = ItemType.NetherWart; - mappings[469] = ItemType.NetherWartBlock; - mappings[763] = ItemType.NetheriteAxe; - mappings[72] = ItemType.NetheriteBlock; - mappings[797] = ItemType.NetheriteBoots; - mappings[795] = ItemType.NetheriteChestplate; - mappings[794] = ItemType.NetheriteHelmet; - mappings[764] = ItemType.NetheriteHoe; - mappings[733] = ItemType.NetheriteIngot; - mappings[796] = ItemType.NetheriteLeggings; - mappings[762] = ItemType.NetheritePickaxe; - mappings[734] = ItemType.NetheriteScrap; - mappings[761] = ItemType.NetheriteShovel; - mappings[760] = ItemType.NetheriteSword; - mappings[280] = ItemType.Netherrack; - mappings[631] = ItemType.NoteBlock; - mappings[698] = ItemType.OakBoat; - mappings[634] = ItemType.OakButton; - mappings[699] = ItemType.OakChestBoat; - mappings[657] = ItemType.OakDoor; - mappings[268] = ItemType.OakFence; - mappings[676] = ItemType.OakFenceGate; - mappings[142] = ItemType.OakLeaves; - mappings[104] = ItemType.OakLog; - mappings[23] = ItemType.OakPlanks; - mappings[647] = ItemType.OakPressurePlate; - mappings[32] = ItemType.OakSapling; - mappings[804] = ItemType.OakSign; - mappings[214] = ItemType.OakSlab; - mappings[338] = ItemType.OakStairs; - mappings[667] = ItemType.OakTrapdoor; - mappings[133] = ItemType.OakWood; - mappings[617] = ItemType.Observer; - mappings[247] = ItemType.Obsidian; - mappings[943] = ItemType.OcelotSpawnEgg; - mappings[1147] = ItemType.OchreFroglight; - mappings[1026] = ItemType.OrangeBanner; - mappings[870] = ItemType.OrangeBed; - mappings[1127] = ItemType.OrangeCandle; - mappings[399] = ItemType.OrangeCarpet; - mappings[508] = ItemType.OrangeConcrete; - mappings[524] = ItemType.OrangeConcretePowder; - mappings[850] = ItemType.OrangeDye; - mappings[492] = ItemType.OrangeGlazedTerracotta; - mappings[476] = ItemType.OrangeShulkerBox; - mappings[424] = ItemType.OrangeStainedGlass; - mappings[440] = ItemType.OrangeStainedGlassPane; - mappings[380] = ItemType.OrangeTerracotta; - mappings[189] = ItemType.OrangeTulip; - mappings[168] = ItemType.OrangeWool; - mappings[192] = ItemType.OxeyeDaisy; - mappings[75] = ItemType.OxidizedCopper; - mappings[79] = ItemType.OxidizedCutCopper; - mappings[87] = ItemType.OxidizedCutCopperSlab; - mappings[83] = ItemType.OxidizedCutCopperStairs; - mappings[415] = ItemType.PackedIce; - mappings[299] = ItemType.PackedMud; - mappings[801] = ItemType.Painting; - mappings[944] = ItemType.PandaSpawnEgg; - mappings[829] = ItemType.Paper; - mappings[945] = ItemType.ParrotSpawnEgg; - mappings[1149] = ItemType.PearlescentFroglight; - mappings[420] = ItemType.Peony; - mappings[227] = ItemType.PetrifiedOakSlab; - mappings[1075] = ItemType.PhantomMembrane; - mappings[946] = ItemType.PhantomSpawnEgg; - mappings[947] = ItemType.PigSpawnEgg; - mappings[1086] = ItemType.PiglinBannerPattern; - mappings[949] = ItemType.PiglinBruteSpawnEgg; - mappings[948] = ItemType.PiglinSpawnEgg; - mappings[950] = ItemType.PillagerSpawnEgg; - mappings[1031] = ItemType.PinkBanner; - mappings[875] = ItemType.PinkBed; - mappings[1132] = ItemType.PinkCandle; - mappings[404] = ItemType.PinkCarpet; - mappings[513] = ItemType.PinkConcrete; - mappings[529] = ItemType.PinkConcretePowder; - mappings[855] = ItemType.PinkDye; - mappings[497] = ItemType.PinkGlazedTerracotta; - mappings[481] = ItemType.PinkShulkerBox; - mappings[429] = ItemType.PinkStainedGlass; - mappings[445] = ItemType.PinkStainedGlassPane; - mappings[385] = ItemType.PinkTerracotta; - mappings[191] = ItemType.PinkTulip; - mappings[173] = ItemType.PinkWool; - mappings[613] = ItemType.Piston; - mappings[998] = ItemType.PlayerHead; - mappings[17] = ItemType.Podzol; - mappings[1146] = ItemType.PointedDripstone; - mappings[993] = ItemType.PoisonousPotato; - mappings[951] = ItemType.PolarBearSpawnEgg; - mappings[7] = ItemType.PolishedAndesite; - mappings[601] = ItemType.PolishedAndesiteSlab; - mappings[584] = ItemType.PolishedAndesiteStairs; - mappings[284] = ItemType.PolishedBasalt; - mappings[1116] = ItemType.PolishedBlackstone; - mappings[1121] = ItemType.PolishedBlackstoneBrickSlab; - mappings[1122] = ItemType.PolishedBlackstoneBrickStairs; - mappings[366] = ItemType.PolishedBlackstoneBrickWall; - mappings[1120] = ItemType.PolishedBlackstoneBricks; - mappings[633] = ItemType.PolishedBlackstoneButton; - mappings[644] = ItemType.PolishedBlackstonePressurePlate; - mappings[1117] = ItemType.PolishedBlackstoneSlab; - mappings[1118] = ItemType.PolishedBlackstoneStairs; - mappings[365] = ItemType.PolishedBlackstoneWall; - mappings[10] = ItemType.PolishedDeepslate; - mappings[604] = ItemType.PolishedDeepslateSlab; - mappings[587] = ItemType.PolishedDeepslateStairs; - mappings[368] = ItemType.PolishedDeepslateWall; - mappings[5] = ItemType.PolishedDiorite; - mappings[593] = ItemType.PolishedDioriteSlab; - mappings[575] = ItemType.PolishedDioriteStairs; - mappings[3] = ItemType.PolishedGranite; - mappings[590] = ItemType.PolishedGraniteSlab; - mappings[572] = ItemType.PolishedGraniteStairs; - mappings[1043] = ItemType.PoppedChorusFruit; - mappings[184] = ItemType.Poppy; - mappings[799] = ItemType.Porkchop; - mappings[991] = ItemType.Potato; - mappings[902] = ItemType.Potion; - mappings[816] = ItemType.PowderSnowBucket; - mappings[685] = ItemType.PoweredRail; - mappings[455] = ItemType.Prismarine; - mappings[238] = ItemType.PrismarineBrickSlab; - mappings[459] = ItemType.PrismarineBrickStairs; - mappings[456] = ItemType.PrismarineBricks; - mappings[1009] = ItemType.PrismarineCrystals; - mappings[1008] = ItemType.PrismarineShard; - mappings[237] = ItemType.PrismarineSlab; - mappings[458] = ItemType.PrismarineStairs; - mappings[352] = ItemType.PrismarineWall; - mappings[843] = ItemType.Pufferfish; - mappings[820] = ItemType.PufferfishBucket; - mappings[952] = ItemType.PufferfishSpawnEgg; - mappings[277] = ItemType.Pumpkin; - mappings[1003] = ItemType.PumpkinPie; - mappings[890] = ItemType.PumpkinSeeds; - mappings[1035] = ItemType.PurpleBanner; - mappings[879] = ItemType.PurpleBed; - mappings[1136] = ItemType.PurpleCandle; - mappings[408] = ItemType.PurpleCarpet; - mappings[517] = ItemType.PurpleConcrete; - mappings[533] = ItemType.PurpleConcretePowder; - mappings[859] = ItemType.PurpleDye; - mappings[501] = ItemType.PurpleGlazedTerracotta; - mappings[485] = ItemType.PurpleShulkerBox; - mappings[433] = ItemType.PurpleStainedGlass; - mappings[449] = ItemType.PurpleStainedGlassPane; - mappings[389] = ItemType.PurpleTerracotta; - mappings[177] = ItemType.PurpleWool; - mappings[252] = ItemType.PurpurBlock; - mappings[253] = ItemType.PurpurPillar; - mappings[236] = ItemType.PurpurSlab; - mappings[254] = ItemType.PurpurStairs; - mappings[725] = ItemType.Quartz; - mappings[375] = ItemType.QuartzBlock; - mappings[376] = ItemType.QuartzBricks; - mappings[377] = ItemType.QuartzPillar; - mappings[233] = ItemType.QuartzSlab; - mappings[378] = ItemType.QuartzStairs; - mappings[1010] = ItemType.Rabbit; - mappings[1013] = ItemType.RabbitFoot; - mappings[1014] = ItemType.RabbitHide; - mappings[953] = ItemType.RabbitSpawnEgg; - mappings[1012] = ItemType.RabbitStew; - mappings[687] = ItemType.Rail; - mappings[954] = ItemType.RavagerSpawnEgg; - mappings[729] = ItemType.RawCopper; - mappings[64] = ItemType.RawCopperBlock; - mappings[731] = ItemType.RawGold; - mappings[65] = ItemType.RawGoldBlock; - mappings[727] = ItemType.RawIron; - mappings[63] = ItemType.RawIronBlock; - mappings[834] = ItemType.RecoveryCompass; - mappings[1039] = ItemType.RedBanner; - mappings[883] = ItemType.RedBed; - mappings[1140] = ItemType.RedCandle; - mappings[412] = ItemType.RedCarpet; - mappings[521] = ItemType.RedConcrete; - mappings[537] = ItemType.RedConcretePowder; - mappings[863] = ItemType.RedDye; - mappings[505] = ItemType.RedGlazedTerracotta; - mappings[198] = ItemType.RedMushroom; - mappings[308] = ItemType.RedMushroomBlock; - mappings[600] = ItemType.RedNetherBrickSlab; - mappings[583] = ItemType.RedNetherBrickStairs; - mappings[360] = ItemType.RedNetherBrickWall; - mappings[471] = ItemType.RedNetherBricks; - mappings[41] = ItemType.RedSand; - mappings[462] = ItemType.RedSandstone; - mappings[234] = ItemType.RedSandstoneSlab; - mappings[465] = ItemType.RedSandstoneStairs; - mappings[353] = ItemType.RedSandstoneWall; - mappings[489] = ItemType.RedShulkerBox; - mappings[437] = ItemType.RedStainedGlass; - mappings[453] = ItemType.RedStainedGlassPane; - mappings[393] = ItemType.RedTerracotta; - mappings[188] = ItemType.RedTulip; - mappings[181] = ItemType.RedWool; - mappings[608] = ItemType.Redstone; - mappings[610] = ItemType.RedstoneBlock; - mappings[630] = ItemType.RedstoneLamp; - mappings[51] = ItemType.RedstoneOre; - mappings[609] = ItemType.RedstoneTorch; - mappings[306] = ItemType.ReinforcedDeepslate; - mappings[611] = ItemType.Repeater; - mappings[466] = ItemType.RepeatingCommandBlock; - mappings[1124] = ItemType.RespawnAnchor; - mappings[18] = ItemType.RootedDirt; - mappings[419] = ItemType.RoseBush; - mappings[896] = ItemType.RottenFlesh; - mappings[689] = ItemType.Saddle; - mappings[841] = ItemType.Salmon; - mappings[821] = ItemType.SalmonBucket; - mappings[955] = ItemType.SalmonSpawnEgg; - mappings[40] = ItemType.Sand; - mappings[156] = ItemType.Sandstone; - mappings[225] = ItemType.SandstoneSlab; - mappings[335] = ItemType.SandstoneStairs; - mappings[361] = ItemType.SandstoneWall; - mappings[607] = ItemType.Scaffolding; - mappings[326] = ItemType.Sculk; - mappings[328] = ItemType.SculkCatalyst; - mappings[626] = ItemType.SculkSensor; - mappings[329] = ItemType.SculkShrieker; - mappings[327] = ItemType.SculkVein; - mappings[715] = ItemType.TurtleScute; - mappings[461] = ItemType.SeaLantern; - mappings[166] = ItemType.SeaPickle; - mappings[165] = ItemType.Seagrass; - mappings[887] = ItemType.Shears; - mappings[956] = ItemType.SheepSpawnEgg; - mappings[1052] = ItemType.Shield; - mappings[1104] = ItemType.Shroomlight; - mappings[474] = ItemType.ShulkerBox; - mappings[1054] = ItemType.ShulkerShell; - mappings[957] = ItemType.ShulkerSpawnEgg; - mappings[958] = ItemType.SilverfishSpawnEgg; - mappings[960] = ItemType.SkeletonHorseSpawnEgg; - mappings[996] = ItemType.SkeletonSkull; - mappings[959] = ItemType.SkeletonSpawnEgg; - mappings[1083] = ItemType.SkullBannerPattern; - mappings[831] = ItemType.SlimeBall; - mappings[615] = ItemType.SlimeBlock; - mappings[961] = ItemType.SlimeSpawnEgg; - mappings[1142] = ItemType.SmallAmethystBud; - mappings[212] = ItemType.SmallDripleaf; - mappings[1095] = ItemType.SmithingTable; - mappings[1090] = ItemType.Smoker; - mappings[285] = ItemType.SmoothBasalt; - mappings[240] = ItemType.SmoothQuartz; - mappings[597] = ItemType.SmoothQuartzSlab; - mappings[580] = ItemType.SmoothQuartzStairs; - mappings[241] = ItemType.SmoothRedSandstone; - mappings[591] = ItemType.SmoothRedSandstoneSlab; - mappings[573] = ItemType.SmoothRedSandstoneStairs; - mappings[242] = ItemType.SmoothSandstone; - mappings[596] = ItemType.SmoothSandstoneSlab; - mappings[579] = ItemType.SmoothSandstoneStairs; - mappings[243] = ItemType.SmoothStone; - mappings[224] = ItemType.SmoothStoneSlab; - mappings[262] = ItemType.Snow; - mappings[264] = ItemType.SnowBlock; - mappings[817] = ItemType.Snowball; - mappings[1103] = ItemType.SoulCampfire; - mappings[1099] = ItemType.SoulLantern; - mappings[281] = ItemType.SoulSand; - mappings[282] = ItemType.SoulSoil; - mappings[286] = ItemType.SoulTorch; - mappings[255] = ItemType.Spawner; - mappings[1049] = ItemType.SpectralArrow; - mappings[904] = ItemType.SpiderEye; - mappings[962] = ItemType.SpiderSpawnEgg; - mappings[1048] = ItemType.SplashPotion; - mappings[151] = ItemType.Sponge; - mappings[196] = ItemType.SporeBlossom; - mappings[700] = ItemType.SpruceBoat; - mappings[635] = ItemType.SpruceButton; - mappings[701] = ItemType.SpruceChestBoat; - mappings[658] = ItemType.SpruceDoor; - mappings[269] = ItemType.SpruceFence; - mappings[677] = ItemType.SpruceFenceGate; - mappings[143] = ItemType.SpruceLeaves; - mappings[105] = ItemType.SpruceLog; - mappings[24] = ItemType.SprucePlanks; - mappings[648] = ItemType.SprucePressurePlate; - mappings[33] = ItemType.SpruceSapling; - mappings[805] = ItemType.SpruceSign; - mappings[215] = ItemType.SpruceSlab; - mappings[339] = ItemType.SpruceStairs; - mappings[668] = ItemType.SpruceTrapdoor; - mappings[134] = ItemType.SpruceWood; - mappings[838] = ItemType.Spyglass; - mappings[963] = ItemType.SquidSpawnEgg; - mappings[765] = ItemType.Stick; - mappings[614] = ItemType.StickyPiston; - mappings[1] = ItemType.Stone; - mappings[743] = ItemType.StoneAxe; - mappings[230] = ItemType.StoneBrickSlab; - mappings[317] = ItemType.StoneBrickStairs; - mappings[356] = ItemType.StoneBrickWall; - mappings[295] = ItemType.StoneBricks; - mappings[632] = ItemType.StoneButton; - mappings[744] = ItemType.StoneHoe; - mappings[742] = ItemType.StonePickaxe; - mappings[643] = ItemType.StonePressurePlate; - mappings[741] = ItemType.StoneShovel; - mappings[223] = ItemType.StoneSlab; - mappings[578] = ItemType.StoneStairs; - mappings[740] = ItemType.StoneSword; - mappings[1096] = ItemType.Stonecutter; - mappings[964] = ItemType.StraySpawnEgg; - mappings[965] = ItemType.StriderSpawnEgg; - mappings[768] = ItemType.String; - mappings[119] = ItemType.StrippedAcaciaLog; - mappings[128] = ItemType.StrippedAcaciaWood; - mappings[117] = ItemType.StrippedBirchLog; - mappings[126] = ItemType.StrippedBirchWood; - mappings[131] = ItemType.StrippedCrimsonHyphae; - mappings[122] = ItemType.StrippedCrimsonStem; - mappings[120] = ItemType.StrippedDarkOakLog; - mappings[129] = ItemType.StrippedDarkOakWood; - mappings[118] = ItemType.StrippedJungleLog; - mappings[127] = ItemType.StrippedJungleWood; - mappings[121] = ItemType.StrippedMangroveLog; - mappings[130] = ItemType.StrippedMangroveWood; - mappings[115] = ItemType.StrippedOakLog; - mappings[124] = ItemType.StrippedOakWood; - mappings[116] = ItemType.StrippedSpruceLog; - mappings[125] = ItemType.StrippedSpruceWood; - mappings[132] = ItemType.StrippedWarpedHyphae; - mappings[123] = ItemType.StrippedWarpedStem; - mappings[712] = ItemType.StructureBlock; - mappings[473] = ItemType.StructureVoid; - mappings[867] = ItemType.Sugar; - mappings[206] = ItemType.SugarCane; - mappings[417] = ItemType.Sunflower; - mappings[1079] = ItemType.SuspiciousStew; - mappings[1100] = ItemType.SweetBerries; - mappings[825] = ItemType.TadpoleBucket; - mappings[966] = ItemType.TadpoleSpawnEgg; - mappings[421] = ItemType.TallGrass; - mappings[622] = ItemType.Target; - mappings[414] = ItemType.Terracotta; - mappings[154] = ItemType.TintedGlass; - mappings[1050] = ItemType.TippedArrow; - mappings[629] = ItemType.Tnt; - mappings[693] = ItemType.TntMinecart; - mappings[248] = ItemType.Torch; - mappings[1053] = ItemType.TotemOfUndying; - mappings[967] = ItemType.TraderLlamaSpawnEgg; - mappings[628] = ItemType.TrappedChest; - mappings[1074] = ItemType.Trident; - mappings[627] = ItemType.TripwireHook; - mappings[842] = ItemType.TropicalFish; - mappings[823] = ItemType.TropicalFishBucket; - mappings[968] = ItemType.TropicalFishSpawnEgg; - mappings[550] = ItemType.TubeCoral; - mappings[545] = ItemType.TubeCoralBlock; - mappings[560] = ItemType.TubeCoralFan; - mappings[12] = ItemType.Tuff; - mappings[539] = ItemType.TurtleEgg; - mappings[714] = ItemType.TurtleHelmet; - mappings[969] = ItemType.TurtleSpawnEgg; - mappings[205] = ItemType.TwistingVines; - mappings[1148] = ItemType.VerdantFroglight; - mappings[970] = ItemType.VexSpawnEgg; - mappings[971] = ItemType.VillagerSpawnEgg; - mappings[972] = ItemType.VindicatorSpawnEgg; - mappings[314] = ItemType.Vine; - mappings[973] = ItemType.WanderingTraderSpawnEgg; - mappings[974] = ItemType.WardenSpawnEgg; - mappings[642] = ItemType.WarpedButton; - mappings[665] = ItemType.WarpedDoor; - mappings[276] = ItemType.WarpedFence; - mappings[684] = ItemType.WarpedFenceGate; - mappings[200] = ItemType.WarpedFungus; - mappings[696] = ItemType.WarpedFungusOnAStick; - mappings[141] = ItemType.WarpedHyphae; - mappings[21] = ItemType.WarpedNylium; - mappings[31] = ItemType.WarpedPlanks; - mappings[655] = ItemType.WarpedPressurePlate; - mappings[202] = ItemType.WarpedRoots; - mappings[812] = ItemType.WarpedSign; - mappings[222] = ItemType.WarpedSlab; - mappings[346] = ItemType.WarpedStairs; - mappings[114] = ItemType.WarpedStem; - mappings[675] = ItemType.WarpedTrapdoor; - mappings[470] = ItemType.WarpedWartBlock; - mappings[814] = ItemType.WaterBucket; - mappings[88] = ItemType.WaxedCopperBlock; - mappings[92] = ItemType.WaxedCutCopper; - mappings[100] = ItemType.WaxedCutCopperSlab; - mappings[96] = ItemType.WaxedCutCopperStairs; - mappings[89] = ItemType.WaxedExposedCopper; - mappings[93] = ItemType.WaxedExposedCutCopper; - mappings[101] = ItemType.WaxedExposedCutCopperSlab; - mappings[97] = ItemType.WaxedExposedCutCopperStairs; - mappings[91] = ItemType.WaxedOxidizedCopper; - mappings[95] = ItemType.WaxedOxidizedCutCopper; - mappings[103] = ItemType.WaxedOxidizedCutCopperSlab; - mappings[99] = ItemType.WaxedOxidizedCutCopperStairs; - mappings[90] = ItemType.WaxedWeatheredCopper; - mappings[94] = ItemType.WaxedWeatheredCutCopper; - mappings[102] = ItemType.WaxedWeatheredCutCopperSlab; - mappings[98] = ItemType.WaxedWeatheredCutCopperStairs; - mappings[74] = ItemType.WeatheredCopper; - mappings[78] = ItemType.WeatheredCutCopper; - mappings[86] = ItemType.WeatheredCutCopperSlab; - mappings[82] = ItemType.WeatheredCutCopperStairs; - mappings[204] = ItemType.WeepingVines; - mappings[152] = ItemType.WetSponge; - mappings[772] = ItemType.Wheat; - mappings[771] = ItemType.WheatSeeds; - mappings[1025] = ItemType.WhiteBanner; - mappings[869] = ItemType.WhiteBed; - mappings[1126] = ItemType.WhiteCandle; - mappings[398] = ItemType.WhiteCarpet; - mappings[507] = ItemType.WhiteConcrete; - mappings[523] = ItemType.WhiteConcretePowder; - mappings[849] = ItemType.WhiteDye; - mappings[491] = ItemType.WhiteGlazedTerracotta; - mappings[475] = ItemType.WhiteShulkerBox; - mappings[423] = ItemType.WhiteStainedGlass; - mappings[439] = ItemType.WhiteStainedGlassPane; - mappings[379] = ItemType.WhiteTerracotta; - mappings[190] = ItemType.WhiteTulip; - mappings[167] = ItemType.WhiteWool; - mappings[975] = ItemType.WitchSpawnEgg; - mappings[195] = ItemType.WitherRose; - mappings[997] = ItemType.WitherSkeletonSkull; - mappings[976] = ItemType.WitherSkeletonSpawnEgg; - mappings[977] = ItemType.WolfSpawnEgg; - mappings[738] = ItemType.WoodenAxe; - mappings[739] = ItemType.WoodenHoe; - mappings[737] = ItemType.WoodenPickaxe; - mappings[736] = ItemType.WoodenShovel; - mappings[735] = ItemType.WoodenSword; - mappings[985] = ItemType.WritableBook; - mappings[986] = ItemType.WrittenBook; - mappings[1029] = ItemType.YellowBanner; - mappings[873] = ItemType.YellowBed; - mappings[1130] = ItemType.YellowCandle; - mappings[402] = ItemType.YellowCarpet; - mappings[511] = ItemType.YellowConcrete; - mappings[527] = ItemType.YellowConcretePowder; - mappings[853] = ItemType.YellowDye; - mappings[495] = ItemType.YellowGlazedTerracotta; - mappings[479] = ItemType.YellowShulkerBox; - mappings[427] = ItemType.YellowStainedGlass; - mappings[443] = ItemType.YellowStainedGlassPane; - mappings[383] = ItemType.YellowTerracotta; - mappings[171] = ItemType.YellowWool; - mappings[978] = ItemType.ZoglinSpawnEgg; - mappings[999] = ItemType.ZombieHead; - mappings[980] = ItemType.ZombieHorseSpawnEgg; - mappings[979] = ItemType.ZombieSpawnEgg; - mappings[981] = ItemType.ZombieVillagerSpawnEgg; - mappings[982] = ItemType.ZombifiedPiglinSpawnEgg; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1193.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette1193.cs deleted file mode 100644 index 6677721ea4..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1193.cs +++ /dev/null @@ -1,1204 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public class ItemPalette1193 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette1193() - { - mappings[721] = ItemType.AcaciaBoat; - mappings[648] = ItemType.AcaciaButton; - mappings[722] = ItemType.AcaciaChestBoat; - mappings[673] = ItemType.AcaciaDoor; - mappings[279] = ItemType.AcaciaFence; - mappings[694] = ItemType.AcaciaFenceGate; - mappings[835] = ItemType.AcaciaHangingSign; - mappings[150] = ItemType.AcaciaLeaves; - mappings[110] = ItemType.AcaciaLog; - mappings[27] = ItemType.AcaciaPlanks; - mappings[662] = ItemType.AcaciaPressurePlate; - mappings[38] = ItemType.AcaciaSapling; - mappings[825] = ItemType.AcaciaSign; - mappings[222] = ItemType.AcaciaSlab; - mappings[350] = ItemType.AcaciaStairs; - mappings[684] = ItemType.AcaciaTrapdoor; - mappings[141] = ItemType.AcaciaWood; - mappings[703] = ItemType.ActivatorRail; - mappings[0] = ItemType.Air; - mappings[940] = ItemType.AllaySpawnEgg; - mappings[190] = ItemType.Allium; - mappings[68] = ItemType.AmethystBlock; - mappings[1179] = ItemType.AmethystCluster; - mappings[743] = ItemType.AmethystShard; - mappings[63] = ItemType.AncientDebris; - mappings[6] = ItemType.Andesite; - mappings[609] = ItemType.AndesiteSlab; - mappings[592] = ItemType.AndesiteStairs; - mappings[369] = ItemType.AndesiteWall; - mappings[381] = ItemType.Anvil; - mappings[734] = ItemType.Apple; - mappings[1049] = ItemType.ArmorStand; - mappings[736] = ItemType.Arrow; - mappings[852] = ItemType.AxolotlBucket; - mappings[941] = ItemType.AxolotlSpawnEgg; - mappings[166] = ItemType.Azalea; - mappings[153] = ItemType.AzaleaLeaves; - mappings[191] = ItemType.AzureBluet; - mappings[1025] = ItemType.BakedPotato; - mappings[217] = ItemType.Bamboo; - mappings[117] = ItemType.BambooBlock; - mappings[651] = ItemType.BambooButton; - mappings[728] = ItemType.BambooChestRaft; - mappings[676] = ItemType.BambooDoor; - mappings[282] = ItemType.BambooFence; - mappings[697] = ItemType.BambooFenceGate; - mappings[838] = ItemType.BambooHangingSign; - mappings[33] = ItemType.BambooMosaic; - mappings[226] = ItemType.BambooMosaicSlab; - mappings[354] = ItemType.BambooMosaicStairs; - mappings[30] = ItemType.BambooPlanks; - mappings[665] = ItemType.BambooPressurePlate; - mappings[727] = ItemType.BambooRaft; - mappings[828] = ItemType.BambooSign; - mappings[225] = ItemType.BambooSlab; - mappings[353] = ItemType.BambooStairs; - mappings[687] = ItemType.BambooTrapdoor; - mappings[1123] = ItemType.Barrel; - mappings[405] = ItemType.Barrier; - mappings[291] = ItemType.Basalt; - mappings[942] = ItemType.BatSpawnEgg; - mappings[358] = ItemType.Beacon; - mappings[41] = ItemType.Bedrock; - mappings[1140] = ItemType.BeeNest; - mappings[943] = ItemType.BeeSpawnEgg; - mappings[920] = ItemType.Beef; - mappings[1141] = ItemType.Beehive; - mappings[1078] = ItemType.Beetroot; - mappings[1079] = ItemType.BeetrootSeeds; - mappings[1080] = ItemType.BeetrootSoup; - mappings[1131] = ItemType.Bell; - mappings[215] = ItemType.BigDripleaf; - mappings[717] = ItemType.BirchBoat; - mappings[646] = ItemType.BirchButton; - mappings[718] = ItemType.BirchChestBoat; - mappings[671] = ItemType.BirchDoor; - mappings[277] = ItemType.BirchFence; - mappings[692] = ItemType.BirchFenceGate; - mappings[833] = ItemType.BirchHangingSign; - mappings[148] = ItemType.BirchLeaves; - mappings[108] = ItemType.BirchLog; - mappings[25] = ItemType.BirchPlanks; - mappings[660] = ItemType.BirchPressurePlate; - mappings[36] = ItemType.BirchSapling; - mappings[823] = ItemType.BirchSign; - mappings[220] = ItemType.BirchSlab; - mappings[348] = ItemType.BirchStairs; - mappings[682] = ItemType.BirchTrapdoor; - mappings[139] = ItemType.BirchWood; - mappings[1074] = ItemType.BlackBanner; - mappings[912] = ItemType.BlackBed; - mappings[1175] = ItemType.BlackCandle; - mappings[423] = ItemType.BlackCarpet; - mappings[532] = ItemType.BlackConcrete; - mappings[548] = ItemType.BlackConcretePowder; - mappings[892] = ItemType.BlackDye; - mappings[516] = ItemType.BlackGlazedTerracotta; - mappings[500] = ItemType.BlackShulkerBox; - mappings[448] = ItemType.BlackStainedGlass; - mappings[464] = ItemType.BlackStainedGlassPane; - mappings[404] = ItemType.BlackTerracotta; - mappings[186] = ItemType.BlackWool; - mappings[1146] = ItemType.Blackstone; - mappings[1147] = ItemType.BlackstoneSlab; - mappings[1148] = ItemType.BlackstoneStairs; - mappings[374] = ItemType.BlackstoneWall; - mappings[1125] = ItemType.BlastFurnace; - mappings[934] = ItemType.BlazePowder; - mappings[926] = ItemType.BlazeRod; - mappings[944] = ItemType.BlazeSpawnEgg; - mappings[1070] = ItemType.BlueBanner; - mappings[908] = ItemType.BlueBed; - mappings[1171] = ItemType.BlueCandle; - mappings[419] = ItemType.BlueCarpet; - mappings[528] = ItemType.BlueConcrete; - mappings[544] = ItemType.BlueConcretePowder; - mappings[888] = ItemType.BlueDye; - mappings[512] = ItemType.BlueGlazedTerracotta; - mappings[580] = ItemType.BlueIce; - mappings[189] = ItemType.BlueOrchid; - mappings[496] = ItemType.BlueShulkerBox; - mappings[444] = ItemType.BlueStainedGlass; - mappings[460] = ItemType.BlueStainedGlassPane; - mappings[400] = ItemType.BlueTerracotta; - mappings[182] = ItemType.BlueWool; - mappings[894] = ItemType.Bone; - mappings[482] = ItemType.BoneBlock; - mappings[893] = ItemType.BoneMeal; - mappings[858] = ItemType.Book; - mappings[251] = ItemType.Bookshelf; - mappings[735] = ItemType.Bow; - mappings[783] = ItemType.Bowl; - mappings[561] = ItemType.BrainCoral; - mappings[556] = ItemType.BrainCoralBlock; - mappings[571] = ItemType.BrainCoralFan; - mappings[790] = ItemType.Bread; - mappings[936] = ItemType.BrewingStand; - mappings[854] = ItemType.Brick; - mappings[235] = ItemType.BrickSlab; - mappings[324] = ItemType.BrickStairs; - mappings[361] = ItemType.BrickWall; - mappings[250] = ItemType.Bricks; - mappings[1071] = ItemType.BrownBanner; - mappings[909] = ItemType.BrownBed; - mappings[1172] = ItemType.BrownCandle; - mappings[420] = ItemType.BrownCarpet; - mappings[529] = ItemType.BrownConcrete; - mappings[545] = ItemType.BrownConcretePowder; - mappings[889] = ItemType.BrownDye; - mappings[513] = ItemType.BrownGlazedTerracotta; - mappings[201] = ItemType.BrownMushroom; - mappings[315] = ItemType.BrownMushroomBlock; - mappings[497] = ItemType.BrownShulkerBox; - mappings[445] = ItemType.BrownStainedGlass; - mappings[461] = ItemType.BrownStainedGlassPane; - mappings[401] = ItemType.BrownTerracotta; - mappings[183] = ItemType.BrownWool; - mappings[562] = ItemType.BubbleCoral; - mappings[557] = ItemType.BubbleCoralBlock; - mappings[572] = ItemType.BubbleCoralFan; - mappings[841] = ItemType.Bucket; - mappings[69] = ItemType.BuddingAmethyst; - mappings[863] = ItemType.Bundle; - mappings[272] = ItemType.Cactus; - mappings[896] = ItemType.Cake; - mappings[11] = ItemType.Calcite; - mappings[946] = ItemType.CamelSpawnEgg; - mappings[1136] = ItemType.Campfire; - mappings[1159] = ItemType.Candle; - mappings[1023] = ItemType.Carrot; - mappings[710] = ItemType.CarrotOnAStick; - mappings[1126] = ItemType.CartographyTable; - mappings[286] = ItemType.CarvedPumpkin; - mappings[945] = ItemType.CatSpawnEgg; - mappings[937] = ItemType.Cauldron; - mappings[947] = ItemType.CaveSpiderSpawnEgg; - mappings[319] = ItemType.Chain; - mappings[477] = ItemType.ChainCommandBlock; - mappings[798] = ItemType.ChainmailBoots; - mappings[796] = ItemType.ChainmailChestplate; - mappings[795] = ItemType.ChainmailHelmet; - mappings[797] = ItemType.ChainmailLeggings; - mappings[738] = ItemType.Charcoal; - mappings[263] = ItemType.Chest; - mappings[706] = ItemType.ChestMinecart; - mappings[922] = ItemType.Chicken; - mappings[948] = ItemType.ChickenSpawnEgg; - mappings[382] = ItemType.ChippedAnvil; - mappings[252] = ItemType.ChiseledBookshelf; - mappings[313] = ItemType.ChiseledDeepslate; - mappings[331] = ItemType.ChiseledNetherBricks; - mappings[1153] = ItemType.ChiseledPolishedBlackstone; - mappings[384] = ItemType.ChiseledQuartzBlock; - mappings[473] = ItemType.ChiseledRedSandstone; - mappings[161] = ItemType.ChiseledSandstone; - mappings[306] = ItemType.ChiseledStoneBricks; - mappings[258] = ItemType.ChorusFlower; - mappings[1076] = ItemType.ChorusFruit; - mappings[257] = ItemType.ChorusPlant; - mappings[273] = ItemType.Clay; - mappings[855] = ItemType.ClayBall; - mappings[865] = ItemType.Clock; - mappings[737] = ItemType.Coal; - mappings[64] = ItemType.CoalBlock; - mappings[45] = ItemType.CoalOre; - mappings[16] = ItemType.CoarseDirt; - mappings[9] = ItemType.CobbledDeepslate; - mappings[613] = ItemType.CobbledDeepslateSlab; - mappings[596] = ItemType.CobbledDeepslateStairs; - mappings[377] = ItemType.CobbledDeepslateWall; - mappings[22] = ItemType.Cobblestone; - mappings[234] = ItemType.CobblestoneSlab; - mappings[268] = ItemType.CobblestoneStairs; - mappings[359] = ItemType.CobblestoneWall; - mappings[163] = ItemType.Cobweb; - mappings[876] = ItemType.CocoaBeans; - mappings[868] = ItemType.Cod; - mappings[850] = ItemType.CodBucket; - mappings[949] = ItemType.CodSpawnEgg; - mappings[357] = ItemType.CommandBlock; - mappings[1056] = ItemType.CommandBlockMinecart; - mappings[622] = ItemType.Comparator; - mappings[861] = ItemType.Compass; - mappings[1122] = ItemType.Composter; - mappings[581] = ItemType.Conduit; - mappings[921] = ItemType.CookedBeef; - mappings[923] = ItemType.CookedChicken; - mappings[872] = ItemType.CookedCod; - mappings[1058] = ItemType.CookedMutton; - mappings[817] = ItemType.CookedPorkchop; - mappings[1045] = ItemType.CookedRabbit; - mappings[873] = ItemType.CookedSalmon; - mappings[913] = ItemType.Cookie; - mappings[71] = ItemType.CopperBlock; - mappings[747] = ItemType.CopperIngot; - mappings[49] = ItemType.CopperOre; - mappings[197] = ItemType.Cornflower; - mappings[950] = ItemType.CowSpawnEgg; - mappings[310] = ItemType.CrackedDeepslateBricks; - mappings[312] = ItemType.CrackedDeepslateTiles; - mappings[330] = ItemType.CrackedNetherBricks; - mappings[1157] = ItemType.CrackedPolishedBlackstoneBricks; - mappings[305] = ItemType.CrackedStoneBricks; - mappings[264] = ItemType.CraftingTable; - mappings[1116] = ItemType.CreeperBannerPattern; - mappings[1033] = ItemType.CreeperHead; - mappings[951] = ItemType.CreeperSpawnEgg; - mappings[652] = ItemType.CrimsonButton; - mappings[677] = ItemType.CrimsonDoor; - mappings[283] = ItemType.CrimsonFence; - mappings[698] = ItemType.CrimsonFenceGate; - mappings[203] = ItemType.CrimsonFungus; - mappings[839] = ItemType.CrimsonHangingSign; - mappings[144] = ItemType.CrimsonHyphae; - mappings[20] = ItemType.CrimsonNylium; - mappings[31] = ItemType.CrimsonPlanks; - mappings[666] = ItemType.CrimsonPressurePlate; - mappings[205] = ItemType.CrimsonRoots; - mappings[829] = ItemType.CrimsonSign; - mappings[227] = ItemType.CrimsonSlab; - mappings[355] = ItemType.CrimsonStairs; - mappings[115] = ItemType.CrimsonStem; - mappings[688] = ItemType.CrimsonTrapdoor; - mappings[1112] = ItemType.Crossbow; - mappings[1145] = ItemType.CryingObsidian; - mappings[78] = ItemType.CutCopper; - mappings[86] = ItemType.CutCopperSlab; - mappings[82] = ItemType.CutCopperStairs; - mappings[474] = ItemType.CutRedSandstone; - mappings[241] = ItemType.CutRedSandstoneSlab; - mappings[162] = ItemType.CutSandstone; - mappings[232] = ItemType.CutSandstoneSlab; - mappings[1068] = ItemType.CyanBanner; - mappings[906] = ItemType.CyanBed; - mappings[1169] = ItemType.CyanCandle; - mappings[417] = ItemType.CyanCarpet; - mappings[526] = ItemType.CyanConcrete; - mappings[542] = ItemType.CyanConcretePowder; - mappings[886] = ItemType.CyanDye; - mappings[510] = ItemType.CyanGlazedTerracotta; - mappings[494] = ItemType.CyanShulkerBox; - mappings[442] = ItemType.CyanStainedGlass; - mappings[458] = ItemType.CyanStainedGlassPane; - mappings[398] = ItemType.CyanTerracotta; - mappings[180] = ItemType.CyanWool; - mappings[383] = ItemType.DamagedAnvil; - mappings[187] = ItemType.Dandelion; - mappings[723] = ItemType.DarkOakBoat; - mappings[649] = ItemType.DarkOakButton; - mappings[724] = ItemType.DarkOakChestBoat; - mappings[674] = ItemType.DarkOakDoor; - mappings[280] = ItemType.DarkOakFence; - mappings[695] = ItemType.DarkOakFenceGate; - mappings[836] = ItemType.DarkOakHangingSign; - mappings[151] = ItemType.DarkOakLeaves; - mappings[111] = ItemType.DarkOakLog; - mappings[28] = ItemType.DarkOakPlanks; - mappings[663] = ItemType.DarkOakPressurePlate; - mappings[39] = ItemType.DarkOakSapling; - mappings[826] = ItemType.DarkOakSign; - mappings[223] = ItemType.DarkOakSlab; - mappings[351] = ItemType.DarkOakStairs; - mappings[685] = ItemType.DarkOakTrapdoor; - mappings[142] = ItemType.DarkOakWood; - mappings[467] = ItemType.DarkPrismarine; - mappings[245] = ItemType.DarkPrismarineSlab; - mappings[470] = ItemType.DarkPrismarineStairs; - mappings[635] = ItemType.DaylightDetector; - mappings[565] = ItemType.DeadBrainCoral; - mappings[551] = ItemType.DeadBrainCoralBlock; - mappings[576] = ItemType.DeadBrainCoralFan; - mappings[566] = ItemType.DeadBubbleCoral; - mappings[552] = ItemType.DeadBubbleCoralBlock; - mappings[577] = ItemType.DeadBubbleCoralFan; - mappings[168] = ItemType.DeadBush; - mappings[567] = ItemType.DeadFireCoral; - mappings[553] = ItemType.DeadFireCoralBlock; - mappings[578] = ItemType.DeadFireCoralFan; - mappings[568] = ItemType.DeadHornCoral; - mappings[554] = ItemType.DeadHornCoralBlock; - mappings[579] = ItemType.DeadHornCoralFan; - mappings[569] = ItemType.DeadTubeCoral; - mappings[550] = ItemType.DeadTubeCoralBlock; - mappings[575] = ItemType.DeadTubeCoralFan; - mappings[1091] = ItemType.DebugStick; - mappings[8] = ItemType.Deepslate; - mappings[615] = ItemType.DeepslateBrickSlab; - mappings[598] = ItemType.DeepslateBrickStairs; - mappings[379] = ItemType.DeepslateBrickWall; - mappings[309] = ItemType.DeepslateBricks; - mappings[46] = ItemType.DeepslateCoalOre; - mappings[50] = ItemType.DeepslateCopperOre; - mappings[60] = ItemType.DeepslateDiamondOre; - mappings[56] = ItemType.DeepslateEmeraldOre; - mappings[52] = ItemType.DeepslateGoldOre; - mappings[48] = ItemType.DeepslateIronOre; - mappings[58] = ItemType.DeepslateLapisOre; - mappings[54] = ItemType.DeepslateRedstoneOre; - mappings[616] = ItemType.DeepslateTileSlab; - mappings[599] = ItemType.DeepslateTileStairs; - mappings[380] = ItemType.DeepslateTileWall; - mappings[311] = ItemType.DeepslateTiles; - mappings[701] = ItemType.DetectorRail; - mappings[739] = ItemType.Diamond; - mappings[775] = ItemType.DiamondAxe; - mappings[73] = ItemType.DiamondBlock; - mappings[806] = ItemType.DiamondBoots; - mappings[804] = ItemType.DiamondChestplate; - mappings[803] = ItemType.DiamondHelmet; - mappings[776] = ItemType.DiamondHoe; - mappings[1052] = ItemType.DiamondHorseArmor; - mappings[805] = ItemType.DiamondLeggings; - mappings[59] = ItemType.DiamondOre; - mappings[774] = ItemType.DiamondPickaxe; - mappings[773] = ItemType.DiamondShovel; - mappings[772] = ItemType.DiamondSword; - mappings[4] = ItemType.Diorite; - mappings[612] = ItemType.DioriteSlab; - mappings[595] = ItemType.DioriteStairs; - mappings[373] = ItemType.DioriteWall; - mappings[15] = ItemType.Dirt; - mappings[426] = ItemType.DirtPath; - mappings[1107] = ItemType.DiscFragment5; - mappings[629] = ItemType.Dispenser; - mappings[952] = ItemType.DolphinSpawnEgg; - mappings[953] = ItemType.DonkeySpawnEgg; - mappings[1081] = ItemType.DragonBreath; - mappings[342] = ItemType.DragonEgg; - mappings[1034] = ItemType.DragonHead; - mappings[917] = ItemType.DriedKelp; - mappings[856] = ItemType.DriedKelpBlock; - mappings[13] = ItemType.DripstoneBlock; - mappings[630] = ItemType.Dropper; - mappings[954] = ItemType.DrownedSpawnEgg; - mappings[1185] = ItemType.EchoShard; - mappings[860] = ItemType.Egg; - mappings[955] = ItemType.ElderGuardianSpawnEgg; - mappings[712] = ItemType.Elytra; - mappings[740] = ItemType.Emerald; - mappings[345] = ItemType.EmeraldBlock; - mappings[55] = ItemType.EmeraldOre; - mappings[1040] = ItemType.EnchantedBook; - mappings[820] = ItemType.EnchantedGoldenApple; - mappings[338] = ItemType.EnchantingTable; - mappings[1075] = ItemType.EndCrystal; - mappings[339] = ItemType.EndPortalFrame; - mappings[256] = ItemType.EndRod; - mappings[340] = ItemType.EndStone; - mappings[605] = ItemType.EndStoneBrickSlab; - mappings[587] = ItemType.EndStoneBrickStairs; - mappings[372] = ItemType.EndStoneBrickWall; - mappings[341] = ItemType.EndStoneBricks; - mappings[344] = ItemType.EnderChest; - mappings[956] = ItemType.EnderDragonSpawnEgg; - mappings[938] = ItemType.EnderEye; - mappings[925] = ItemType.EnderPearl; - mappings[957] = ItemType.EndermanSpawnEgg; - mappings[958] = ItemType.EndermiteSpawnEgg; - mappings[959] = ItemType.EvokerSpawnEgg; - mappings[1016] = ItemType.ExperienceBottle; - mappings[75] = ItemType.ExposedCopper; - mappings[79] = ItemType.ExposedCutCopper; - mappings[87] = ItemType.ExposedCutCopperSlab; - mappings[83] = ItemType.ExposedCutCopperStairs; - mappings[265] = ItemType.Farmland; - mappings[786] = ItemType.Feather; - mappings[933] = ItemType.FermentedSpiderEye; - mappings[165] = ItemType.Fern; - mappings[914] = ItemType.FilledMap; - mappings[1017] = ItemType.FireCharge; - mappings[563] = ItemType.FireCoral; - mappings[558] = ItemType.FireCoralBlock; - mappings[573] = ItemType.FireCoralFan; - mappings[1038] = ItemType.FireworkRocket; - mappings[1039] = ItemType.FireworkStar; - mappings[864] = ItemType.FishingRod; - mappings[1127] = ItemType.FletchingTable; - mappings[815] = ItemType.Flint; - mappings[733] = ItemType.FlintAndSteel; - mappings[1115] = ItemType.FlowerBannerPattern; - mappings[1022] = ItemType.FlowerPot; - mappings[167] = ItemType.FloweringAzalea; - mappings[154] = ItemType.FloweringAzaleaLeaves; - mappings[960] = ItemType.FoxSpawnEgg; - mappings[961] = ItemType.FrogSpawnEgg; - mappings[1184] = ItemType.Frogspawn; - mappings[266] = ItemType.Furnace; - mappings[707] = ItemType.FurnaceMinecart; - mappings[962] = ItemType.GhastSpawnEgg; - mappings[927] = ItemType.GhastTear; - mappings[1149] = ItemType.GildedBlackstone; - mappings[157] = ItemType.Glass; - mappings[931] = ItemType.GlassBottle; - mappings[320] = ItemType.GlassPane; - mappings[939] = ItemType.GlisteringMelonSlice; - mappings[1119] = ItemType.GlobeBannerPattern; - mappings[1135] = ItemType.GlowBerries; - mappings[875] = ItemType.GlowInkSac; - mappings[1021] = ItemType.GlowItemFrame; - mappings[323] = ItemType.GlowLichen; - mappings[963] = ItemType.GlowSquidSpawnEgg; - mappings[295] = ItemType.Glowstone; - mappings[867] = ItemType.GlowstoneDust; - mappings[1121] = ItemType.GoatHorn; - mappings[964] = ItemType.GoatSpawnEgg; - mappings[72] = ItemType.GoldBlock; - mappings[749] = ItemType.GoldIngot; - mappings[928] = ItemType.GoldNugget; - mappings[51] = ItemType.GoldOre; - mappings[819] = ItemType.GoldenApple; - mappings[765] = ItemType.GoldenAxe; - mappings[810] = ItemType.GoldenBoots; - mappings[1028] = ItemType.GoldenCarrot; - mappings[808] = ItemType.GoldenChestplate; - mappings[807] = ItemType.GoldenHelmet; - mappings[766] = ItemType.GoldenHoe; - mappings[1051] = ItemType.GoldenHorseArmor; - mappings[809] = ItemType.GoldenLeggings; - mappings[764] = ItemType.GoldenPickaxe; - mappings[763] = ItemType.GoldenShovel; - mappings[762] = ItemType.GoldenSword; - mappings[2] = ItemType.Granite; - mappings[608] = ItemType.GraniteSlab; - mappings[591] = ItemType.GraniteStairs; - mappings[365] = ItemType.GraniteWall; - mappings[164] = ItemType.ShortGrass; - mappings[14] = ItemType.GrassBlock; - mappings[44] = ItemType.Gravel; - mappings[1066] = ItemType.GrayBanner; - mappings[904] = ItemType.GrayBed; - mappings[1167] = ItemType.GrayCandle; - mappings[415] = ItemType.GrayCarpet; - mappings[524] = ItemType.GrayConcrete; - mappings[540] = ItemType.GrayConcretePowder; - mappings[884] = ItemType.GrayDye; - mappings[508] = ItemType.GrayGlazedTerracotta; - mappings[492] = ItemType.GrayShulkerBox; - mappings[440] = ItemType.GrayStainedGlass; - mappings[456] = ItemType.GrayStainedGlassPane; - mappings[396] = ItemType.GrayTerracotta; - mappings[178] = ItemType.GrayWool; - mappings[1072] = ItemType.GreenBanner; - mappings[910] = ItemType.GreenBed; - mappings[1173] = ItemType.GreenCandle; - mappings[421] = ItemType.GreenCarpet; - mappings[530] = ItemType.GreenConcrete; - mappings[546] = ItemType.GreenConcretePowder; - mappings[890] = ItemType.GreenDye; - mappings[514] = ItemType.GreenGlazedTerracotta; - mappings[498] = ItemType.GreenShulkerBox; - mappings[446] = ItemType.GreenStainedGlass; - mappings[462] = ItemType.GreenStainedGlassPane; - mappings[402] = ItemType.GreenTerracotta; - mappings[184] = ItemType.GreenWool; - mappings[1128] = ItemType.Grindstone; - mappings[965] = ItemType.GuardianSpawnEgg; - mappings[787] = ItemType.Gunpowder; - mappings[214] = ItemType.HangingRoots; - mappings[407] = ItemType.HayBlock; - mappings[1111] = ItemType.HeartOfTheSea; - mappings[657] = ItemType.HeavyWeightedPressurePlate; - mappings[966] = ItemType.HoglinSpawnEgg; - mappings[626] = ItemType.HoneyBlock; - mappings[1142] = ItemType.HoneyBottle; - mappings[1139] = ItemType.Honeycomb; - mappings[1143] = ItemType.HoneycombBlock; - mappings[628] = ItemType.Hopper; - mappings[709] = ItemType.HopperMinecart; - mappings[564] = ItemType.HornCoral; - mappings[559] = ItemType.HornCoralBlock; - mappings[574] = ItemType.HornCoralFan; - mappings[967] = ItemType.HorseSpawnEgg; - mappings[968] = ItemType.HuskSpawnEgg; - mappings[270] = ItemType.Ice; - mappings[301] = ItemType.InfestedChiseledStoneBricks; - mappings[297] = ItemType.InfestedCobblestone; - mappings[300] = ItemType.InfestedCrackedStoneBricks; - mappings[302] = ItemType.InfestedDeepslate; - mappings[299] = ItemType.InfestedMossyStoneBricks; - mappings[296] = ItemType.InfestedStone; - mappings[298] = ItemType.InfestedStoneBricks; - mappings[874] = ItemType.InkSac; - mappings[770] = ItemType.IronAxe; - mappings[318] = ItemType.IronBars; - mappings[70] = ItemType.IronBlock; - mappings[802] = ItemType.IronBoots; - mappings[800] = ItemType.IronChestplate; - mappings[668] = ItemType.IronDoor; - mappings[969] = ItemType.IronGolemSpawnEgg; - mappings[799] = ItemType.IronHelmet; - mappings[771] = ItemType.IronHoe; - mappings[1050] = ItemType.IronHorseArmor; - mappings[745] = ItemType.IronIngot; - mappings[801] = ItemType.IronLeggings; - mappings[1089] = ItemType.IronNugget; - mappings[47] = ItemType.IronOre; - mappings[769] = ItemType.IronPickaxe; - mappings[768] = ItemType.IronShovel; - mappings[767] = ItemType.IronSword; - mappings[679] = ItemType.IronTrapdoor; - mappings[1020] = ItemType.ItemFrame; - mappings[287] = ItemType.JackOLantern; - mappings[730] = ItemType.Jigsaw; - mappings[274] = ItemType.Jukebox; - mappings[719] = ItemType.JungleBoat; - mappings[647] = ItemType.JungleButton; - mappings[720] = ItemType.JungleChestBoat; - mappings[672] = ItemType.JungleDoor; - mappings[278] = ItemType.JungleFence; - mappings[693] = ItemType.JungleFenceGate; - mappings[834] = ItemType.JungleHangingSign; - mappings[149] = ItemType.JungleLeaves; - mappings[109] = ItemType.JungleLog; - mappings[26] = ItemType.JunglePlanks; - mappings[661] = ItemType.JunglePressurePlate; - mappings[37] = ItemType.JungleSapling; - mappings[824] = ItemType.JungleSign; - mappings[221] = ItemType.JungleSlab; - mappings[349] = ItemType.JungleStairs; - mappings[683] = ItemType.JungleTrapdoor; - mappings[140] = ItemType.JungleWood; - mappings[211] = ItemType.Kelp; - mappings[1090] = ItemType.KnowledgeBook; - mappings[267] = ItemType.Ladder; - mappings[1132] = ItemType.Lantern; - mappings[159] = ItemType.LapisBlock; - mappings[741] = ItemType.LapisLazuli; - mappings[57] = ItemType.LapisOre; - mappings[1178] = ItemType.LargeAmethystBud; - mappings[432] = ItemType.LargeFern; - mappings[843] = ItemType.LavaBucket; - mappings[1054] = ItemType.Lead; - mappings[846] = ItemType.Leather; - mappings[794] = ItemType.LeatherBoots; - mappings[792] = ItemType.LeatherChestplate; - mappings[791] = ItemType.LeatherHelmet; - mappings[1053] = ItemType.LeatherHorseArmor; - mappings[793] = ItemType.LeatherLeggings; - mappings[631] = ItemType.Lectern; - mappings[633] = ItemType.Lever; - mappings[406] = ItemType.Light; - mappings[1062] = ItemType.LightBlueBanner; - mappings[900] = ItemType.LightBlueBed; - mappings[1163] = ItemType.LightBlueCandle; - mappings[411] = ItemType.LightBlueCarpet; - mappings[520] = ItemType.LightBlueConcrete; - mappings[536] = ItemType.LightBlueConcretePowder; - mappings[880] = ItemType.LightBlueDye; - mappings[504] = ItemType.LightBlueGlazedTerracotta; - mappings[488] = ItemType.LightBlueShulkerBox; - mappings[436] = ItemType.LightBlueStainedGlass; - mappings[452] = ItemType.LightBlueStainedGlassPane; - mappings[392] = ItemType.LightBlueTerracotta; - mappings[174] = ItemType.LightBlueWool; - mappings[1067] = ItemType.LightGrayBanner; - mappings[905] = ItemType.LightGrayBed; - mappings[1168] = ItemType.LightGrayCandle; - mappings[416] = ItemType.LightGrayCarpet; - mappings[525] = ItemType.LightGrayConcrete; - mappings[541] = ItemType.LightGrayConcretePowder; - mappings[885] = ItemType.LightGrayDye; - mappings[509] = ItemType.LightGrayGlazedTerracotta; - mappings[493] = ItemType.LightGrayShulkerBox; - mappings[441] = ItemType.LightGrayStainedGlass; - mappings[457] = ItemType.LightGrayStainedGlassPane; - mappings[397] = ItemType.LightGrayTerracotta; - mappings[179] = ItemType.LightGrayWool; - mappings[656] = ItemType.LightWeightedPressurePlate; - mappings[634] = ItemType.LightningRod; - mappings[428] = ItemType.Lilac; - mappings[198] = ItemType.LilyOfTheValley; - mappings[328] = ItemType.LilyPad; - mappings[1064] = ItemType.LimeBanner; - mappings[902] = ItemType.LimeBed; - mappings[1165] = ItemType.LimeCandle; - mappings[413] = ItemType.LimeCarpet; - mappings[522] = ItemType.LimeConcrete; - mappings[538] = ItemType.LimeConcretePowder; - mappings[882] = ItemType.LimeDye; - mappings[506] = ItemType.LimeGlazedTerracotta; - mappings[490] = ItemType.LimeShulkerBox; - mappings[438] = ItemType.LimeStainedGlass; - mappings[454] = ItemType.LimeStainedGlassPane; - mappings[394] = ItemType.LimeTerracotta; - mappings[176] = ItemType.LimeWool; - mappings[1085] = ItemType.LingeringPotion; - mappings[970] = ItemType.LlamaSpawnEgg; - mappings[1144] = ItemType.Lodestone; - mappings[1114] = ItemType.Loom; - mappings[1061] = ItemType.MagentaBanner; - mappings[899] = ItemType.MagentaBed; - mappings[1162] = ItemType.MagentaCandle; - mappings[410] = ItemType.MagentaCarpet; - mappings[519] = ItemType.MagentaConcrete; - mappings[535] = ItemType.MagentaConcretePowder; - mappings[879] = ItemType.MagentaDye; - mappings[503] = ItemType.MagentaGlazedTerracotta; - mappings[487] = ItemType.MagentaShulkerBox; - mappings[435] = ItemType.MagentaStainedGlass; - mappings[451] = ItemType.MagentaStainedGlassPane; - mappings[391] = ItemType.MagentaTerracotta; - mappings[173] = ItemType.MagentaWool; - mappings[478] = ItemType.MagmaBlock; - mappings[935] = ItemType.MagmaCream; - mappings[971] = ItemType.MagmaCubeSpawnEgg; - mappings[725] = ItemType.MangroveBoat; - mappings[650] = ItemType.MangroveButton; - mappings[726] = ItemType.MangroveChestBoat; - mappings[675] = ItemType.MangroveDoor; - mappings[281] = ItemType.MangroveFence; - mappings[696] = ItemType.MangroveFenceGate; - mappings[837] = ItemType.MangroveHangingSign; - mappings[152] = ItemType.MangroveLeaves; - mappings[112] = ItemType.MangroveLog; - mappings[29] = ItemType.MangrovePlanks; - mappings[664] = ItemType.MangrovePressurePlate; - mappings[40] = ItemType.MangrovePropagule; - mappings[113] = ItemType.MangroveRoots; - mappings[827] = ItemType.MangroveSign; - mappings[224] = ItemType.MangroveSlab; - mappings[352] = ItemType.MangroveStairs; - mappings[686] = ItemType.MangroveTrapdoor; - mappings[143] = ItemType.MangroveWood; - mappings[1027] = ItemType.Map; - mappings[1177] = ItemType.MediumAmethystBud; - mappings[321] = ItemType.Melon; - mappings[919] = ItemType.MelonSeeds; - mappings[916] = ItemType.MelonSlice; - mappings[847] = ItemType.MilkBucket; - mappings[705] = ItemType.Minecart; - mappings[1118] = ItemType.MojangBannerPattern; - mappings[972] = ItemType.MooshroomSpawnEgg; - mappings[213] = ItemType.MossBlock; - mappings[212] = ItemType.MossCarpet; - mappings[253] = ItemType.MossyCobblestone; - mappings[604] = ItemType.MossyCobblestoneSlab; - mappings[586] = ItemType.MossyCobblestoneStairs; - mappings[360] = ItemType.MossyCobblestoneWall; - mappings[602] = ItemType.MossyStoneBrickSlab; - mappings[584] = ItemType.MossyStoneBrickStairs; - mappings[364] = ItemType.MossyStoneBrickWall; - mappings[304] = ItemType.MossyStoneBricks; - mappings[19] = ItemType.Mud; - mappings[237] = ItemType.MudBrickSlab; - mappings[326] = ItemType.MudBrickStairs; - mappings[367] = ItemType.MudBrickWall; - mappings[308] = ItemType.MudBricks; - mappings[114] = ItemType.MuddyMangroveRoots; - mappings[973] = ItemType.MuleSpawnEgg; - mappings[317] = ItemType.MushroomStem; - mappings[784] = ItemType.MushroomStew; - mappings[1102] = ItemType.MusicDisc11; - mappings[1092] = ItemType.MusicDisc13; - mappings[1105] = ItemType.MusicDisc5; - mappings[1094] = ItemType.MusicDiscBlocks; - mappings[1093] = ItemType.MusicDiscCat; - mappings[1095] = ItemType.MusicDiscChirp; - mappings[1096] = ItemType.MusicDiscFar; - mappings[1097] = ItemType.MusicDiscMall; - mappings[1098] = ItemType.MusicDiscMellohi; - mappings[1104] = ItemType.MusicDiscOtherside; - mappings[1106] = ItemType.MusicDiscPigstep; - mappings[1099] = ItemType.MusicDiscStal; - mappings[1100] = ItemType.MusicDiscStrad; - mappings[1103] = ItemType.MusicDiscWait; - mappings[1101] = ItemType.MusicDiscWard; - mappings[1057] = ItemType.Mutton; - mappings[327] = ItemType.Mycelium; - mappings[1055] = ItemType.NameTag; - mappings[1110] = ItemType.NautilusShell; - mappings[1041] = ItemType.NetherBrick; - mappings[332] = ItemType.NetherBrickFence; - mappings[238] = ItemType.NetherBrickSlab; - mappings[333] = ItemType.NetherBrickStairs; - mappings[368] = ItemType.NetherBrickWall; - mappings[329] = ItemType.NetherBricks; - mappings[61] = ItemType.NetherGoldOre; - mappings[62] = ItemType.NetherQuartzOre; - mappings[207] = ItemType.NetherSprouts; - mappings[1036] = ItemType.NetherStar; - mappings[929] = ItemType.NetherWart; - mappings[479] = ItemType.NetherWartBlock; - mappings[780] = ItemType.NetheriteAxe; - mappings[74] = ItemType.NetheriteBlock; - mappings[814] = ItemType.NetheriteBoots; - mappings[812] = ItemType.NetheriteChestplate; - mappings[811] = ItemType.NetheriteHelmet; - mappings[781] = ItemType.NetheriteHoe; - mappings[750] = ItemType.NetheriteIngot; - mappings[813] = ItemType.NetheriteLeggings; - mappings[779] = ItemType.NetheritePickaxe; - mappings[751] = ItemType.NetheriteScrap; - mappings[778] = ItemType.NetheriteShovel; - mappings[777] = ItemType.NetheriteSword; - mappings[288] = ItemType.Netherrack; - mappings[641] = ItemType.NoteBlock; - mappings[713] = ItemType.OakBoat; - mappings[644] = ItemType.OakButton; - mappings[714] = ItemType.OakChestBoat; - mappings[669] = ItemType.OakDoor; - mappings[275] = ItemType.OakFence; - mappings[690] = ItemType.OakFenceGate; - mappings[831] = ItemType.OakHangingSign; - mappings[146] = ItemType.OakLeaves; - mappings[106] = ItemType.OakLog; - mappings[23] = ItemType.OakPlanks; - mappings[658] = ItemType.OakPressurePlate; - mappings[34] = ItemType.OakSapling; - mappings[821] = ItemType.OakSign; - mappings[218] = ItemType.OakSlab; - mappings[346] = ItemType.OakStairs; - mappings[680] = ItemType.OakTrapdoor; - mappings[137] = ItemType.OakWood; - mappings[627] = ItemType.Observer; - mappings[254] = ItemType.Obsidian; - mappings[974] = ItemType.OcelotSpawnEgg; - mappings[1181] = ItemType.OchreFroglight; - mappings[1060] = ItemType.OrangeBanner; - mappings[898] = ItemType.OrangeBed; - mappings[1161] = ItemType.OrangeCandle; - mappings[409] = ItemType.OrangeCarpet; - mappings[518] = ItemType.OrangeConcrete; - mappings[534] = ItemType.OrangeConcretePowder; - mappings[878] = ItemType.OrangeDye; - mappings[502] = ItemType.OrangeGlazedTerracotta; - mappings[486] = ItemType.OrangeShulkerBox; - mappings[434] = ItemType.OrangeStainedGlass; - mappings[450] = ItemType.OrangeStainedGlassPane; - mappings[390] = ItemType.OrangeTerracotta; - mappings[193] = ItemType.OrangeTulip; - mappings[172] = ItemType.OrangeWool; - mappings[196] = ItemType.OxeyeDaisy; - mappings[77] = ItemType.OxidizedCopper; - mappings[81] = ItemType.OxidizedCutCopper; - mappings[89] = ItemType.OxidizedCutCopperSlab; - mappings[85] = ItemType.OxidizedCutCopperStairs; - mappings[425] = ItemType.PackedIce; - mappings[307] = ItemType.PackedMud; - mappings[818] = ItemType.Painting; - mappings[975] = ItemType.PandaSpawnEgg; - mappings[857] = ItemType.Paper; - mappings[976] = ItemType.ParrotSpawnEgg; - mappings[1183] = ItemType.PearlescentFroglight; - mappings[430] = ItemType.Peony; - mappings[233] = ItemType.PetrifiedOakSlab; - mappings[1109] = ItemType.PhantomMembrane; - mappings[977] = ItemType.PhantomSpawnEgg; - mappings[978] = ItemType.PigSpawnEgg; - mappings[1120] = ItemType.PiglinBannerPattern; - mappings[980] = ItemType.PiglinBruteSpawnEgg; - mappings[1035] = ItemType.PiglinHead; - mappings[979] = ItemType.PiglinSpawnEgg; - mappings[981] = ItemType.PillagerSpawnEgg; - mappings[1065] = ItemType.PinkBanner; - mappings[903] = ItemType.PinkBed; - mappings[1166] = ItemType.PinkCandle; - mappings[414] = ItemType.PinkCarpet; - mappings[523] = ItemType.PinkConcrete; - mappings[539] = ItemType.PinkConcretePowder; - mappings[883] = ItemType.PinkDye; - mappings[507] = ItemType.PinkGlazedTerracotta; - mappings[491] = ItemType.PinkShulkerBox; - mappings[439] = ItemType.PinkStainedGlass; - mappings[455] = ItemType.PinkStainedGlassPane; - mappings[395] = ItemType.PinkTerracotta; - mappings[195] = ItemType.PinkTulip; - mappings[177] = ItemType.PinkWool; - mappings[623] = ItemType.Piston; - mappings[1031] = ItemType.PlayerHead; - mappings[17] = ItemType.Podzol; - mappings[1180] = ItemType.PointedDripstone; - mappings[1026] = ItemType.PoisonousPotato; - mappings[982] = ItemType.PolarBearSpawnEgg; - mappings[7] = ItemType.PolishedAndesite; - mappings[611] = ItemType.PolishedAndesiteSlab; - mappings[594] = ItemType.PolishedAndesiteStairs; - mappings[292] = ItemType.PolishedBasalt; - mappings[1150] = ItemType.PolishedBlackstone; - mappings[1155] = ItemType.PolishedBlackstoneBrickSlab; - mappings[1156] = ItemType.PolishedBlackstoneBrickStairs; - mappings[376] = ItemType.PolishedBlackstoneBrickWall; - mappings[1154] = ItemType.PolishedBlackstoneBricks; - mappings[643] = ItemType.PolishedBlackstoneButton; - mappings[655] = ItemType.PolishedBlackstonePressurePlate; - mappings[1151] = ItemType.PolishedBlackstoneSlab; - mappings[1152] = ItemType.PolishedBlackstoneStairs; - mappings[375] = ItemType.PolishedBlackstoneWall; - mappings[10] = ItemType.PolishedDeepslate; - mappings[614] = ItemType.PolishedDeepslateSlab; - mappings[597] = ItemType.PolishedDeepslateStairs; - mappings[378] = ItemType.PolishedDeepslateWall; - mappings[5] = ItemType.PolishedDiorite; - mappings[603] = ItemType.PolishedDioriteSlab; - mappings[585] = ItemType.PolishedDioriteStairs; - mappings[3] = ItemType.PolishedGranite; - mappings[600] = ItemType.PolishedGraniteSlab; - mappings[582] = ItemType.PolishedGraniteStairs; - mappings[1077] = ItemType.PoppedChorusFruit; - mappings[188] = ItemType.Poppy; - mappings[816] = ItemType.Porkchop; - mappings[1024] = ItemType.Potato; - mappings[930] = ItemType.Potion; - mappings[844] = ItemType.PowderSnowBucket; - mappings[700] = ItemType.PoweredRail; - mappings[465] = ItemType.Prismarine; - mappings[244] = ItemType.PrismarineBrickSlab; - mappings[469] = ItemType.PrismarineBrickStairs; - mappings[466] = ItemType.PrismarineBricks; - mappings[1043] = ItemType.PrismarineCrystals; - mappings[1042] = ItemType.PrismarineShard; - mappings[243] = ItemType.PrismarineSlab; - mappings[468] = ItemType.PrismarineStairs; - mappings[362] = ItemType.PrismarineWall; - mappings[871] = ItemType.Pufferfish; - mappings[848] = ItemType.PufferfishBucket; - mappings[983] = ItemType.PufferfishSpawnEgg; - mappings[285] = ItemType.Pumpkin; - mappings[1037] = ItemType.PumpkinPie; - mappings[918] = ItemType.PumpkinSeeds; - mappings[1069] = ItemType.PurpleBanner; - mappings[907] = ItemType.PurpleBed; - mappings[1170] = ItemType.PurpleCandle; - mappings[418] = ItemType.PurpleCarpet; - mappings[527] = ItemType.PurpleConcrete; - mappings[543] = ItemType.PurpleConcretePowder; - mappings[887] = ItemType.PurpleDye; - mappings[511] = ItemType.PurpleGlazedTerracotta; - mappings[495] = ItemType.PurpleShulkerBox; - mappings[443] = ItemType.PurpleStainedGlass; - mappings[459] = ItemType.PurpleStainedGlassPane; - mappings[399] = ItemType.PurpleTerracotta; - mappings[181] = ItemType.PurpleWool; - mappings[259] = ItemType.PurpurBlock; - mappings[260] = ItemType.PurpurPillar; - mappings[242] = ItemType.PurpurSlab; - mappings[261] = ItemType.PurpurStairs; - mappings[742] = ItemType.Quartz; - mappings[385] = ItemType.QuartzBlock; - mappings[386] = ItemType.QuartzBricks; - mappings[387] = ItemType.QuartzPillar; - mappings[239] = ItemType.QuartzSlab; - mappings[388] = ItemType.QuartzStairs; - mappings[1044] = ItemType.Rabbit; - mappings[1047] = ItemType.RabbitFoot; - mappings[1048] = ItemType.RabbitHide; - mappings[984] = ItemType.RabbitSpawnEgg; - mappings[1046] = ItemType.RabbitStew; - mappings[702] = ItemType.Rail; - mappings[985] = ItemType.RavagerSpawnEgg; - mappings[746] = ItemType.RawCopper; - mappings[66] = ItemType.RawCopperBlock; - mappings[748] = ItemType.RawGold; - mappings[67] = ItemType.RawGoldBlock; - mappings[744] = ItemType.RawIron; - mappings[65] = ItemType.RawIronBlock; - mappings[862] = ItemType.RecoveryCompass; - mappings[1073] = ItemType.RedBanner; - mappings[911] = ItemType.RedBed; - mappings[1174] = ItemType.RedCandle; - mappings[422] = ItemType.RedCarpet; - mappings[531] = ItemType.RedConcrete; - mappings[547] = ItemType.RedConcretePowder; - mappings[891] = ItemType.RedDye; - mappings[515] = ItemType.RedGlazedTerracotta; - mappings[202] = ItemType.RedMushroom; - mappings[316] = ItemType.RedMushroomBlock; - mappings[610] = ItemType.RedNetherBrickSlab; - mappings[593] = ItemType.RedNetherBrickStairs; - mappings[370] = ItemType.RedNetherBrickWall; - mappings[481] = ItemType.RedNetherBricks; - mappings[43] = ItemType.RedSand; - mappings[472] = ItemType.RedSandstone; - mappings[240] = ItemType.RedSandstoneSlab; - mappings[475] = ItemType.RedSandstoneStairs; - mappings[363] = ItemType.RedSandstoneWall; - mappings[499] = ItemType.RedShulkerBox; - mappings[447] = ItemType.RedStainedGlass; - mappings[463] = ItemType.RedStainedGlassPane; - mappings[403] = ItemType.RedTerracotta; - mappings[192] = ItemType.RedTulip; - mappings[185] = ItemType.RedWool; - mappings[618] = ItemType.Redstone; - mappings[620] = ItemType.RedstoneBlock; - mappings[640] = ItemType.RedstoneLamp; - mappings[53] = ItemType.RedstoneOre; - mappings[619] = ItemType.RedstoneTorch; - mappings[314] = ItemType.ReinforcedDeepslate; - mappings[621] = ItemType.Repeater; - mappings[476] = ItemType.RepeatingCommandBlock; - mappings[1158] = ItemType.RespawnAnchor; - mappings[18] = ItemType.RootedDirt; - mappings[429] = ItemType.RoseBush; - mappings[924] = ItemType.RottenFlesh; - mappings[704] = ItemType.Saddle; - mappings[869] = ItemType.Salmon; - mappings[849] = ItemType.SalmonBucket; - mappings[986] = ItemType.SalmonSpawnEgg; - mappings[42] = ItemType.Sand; - mappings[160] = ItemType.Sandstone; - mappings[231] = ItemType.SandstoneSlab; - mappings[343] = ItemType.SandstoneStairs; - mappings[371] = ItemType.SandstoneWall; - mappings[617] = ItemType.Scaffolding; - mappings[334] = ItemType.Sculk; - mappings[336] = ItemType.SculkCatalyst; - mappings[636] = ItemType.SculkSensor; - mappings[337] = ItemType.SculkShrieker; - mappings[335] = ItemType.SculkVein; - mappings[732] = ItemType.TurtleScute; - mappings[471] = ItemType.SeaLantern; - mappings[170] = ItemType.SeaPickle; - mappings[169] = ItemType.Seagrass; - mappings[915] = ItemType.Shears; - mappings[987] = ItemType.SheepSpawnEgg; - mappings[1086] = ItemType.Shield; - mappings[1138] = ItemType.Shroomlight; - mappings[484] = ItemType.ShulkerBox; - mappings[1088] = ItemType.ShulkerShell; - mappings[988] = ItemType.ShulkerSpawnEgg; - mappings[989] = ItemType.SilverfishSpawnEgg; - mappings[991] = ItemType.SkeletonHorseSpawnEgg; - mappings[1029] = ItemType.SkeletonSkull; - mappings[990] = ItemType.SkeletonSpawnEgg; - mappings[1117] = ItemType.SkullBannerPattern; - mappings[859] = ItemType.SlimeBall; - mappings[625] = ItemType.SlimeBlock; - mappings[992] = ItemType.SlimeSpawnEgg; - mappings[1176] = ItemType.SmallAmethystBud; - mappings[216] = ItemType.SmallDripleaf; - mappings[1129] = ItemType.SmithingTable; - mappings[1124] = ItemType.Smoker; - mappings[293] = ItemType.SmoothBasalt; - mappings[246] = ItemType.SmoothQuartz; - mappings[607] = ItemType.SmoothQuartzSlab; - mappings[590] = ItemType.SmoothQuartzStairs; - mappings[247] = ItemType.SmoothRedSandstone; - mappings[601] = ItemType.SmoothRedSandstoneSlab; - mappings[583] = ItemType.SmoothRedSandstoneStairs; - mappings[248] = ItemType.SmoothSandstone; - mappings[606] = ItemType.SmoothSandstoneSlab; - mappings[589] = ItemType.SmoothSandstoneStairs; - mappings[249] = ItemType.SmoothStone; - mappings[230] = ItemType.SmoothStoneSlab; - mappings[269] = ItemType.Snow; - mappings[271] = ItemType.SnowBlock; - mappings[993] = ItemType.SnowGolemSpawnEgg; - mappings[845] = ItemType.Snowball; - mappings[1137] = ItemType.SoulCampfire; - mappings[1133] = ItemType.SoulLantern; - mappings[289] = ItemType.SoulSand; - mappings[290] = ItemType.SoulSoil; - mappings[294] = ItemType.SoulTorch; - mappings[262] = ItemType.Spawner; - mappings[1083] = ItemType.SpectralArrow; - mappings[932] = ItemType.SpiderEye; - mappings[994] = ItemType.SpiderSpawnEgg; - mappings[1082] = ItemType.SplashPotion; - mappings[155] = ItemType.Sponge; - mappings[200] = ItemType.SporeBlossom; - mappings[715] = ItemType.SpruceBoat; - mappings[645] = ItemType.SpruceButton; - mappings[716] = ItemType.SpruceChestBoat; - mappings[670] = ItemType.SpruceDoor; - mappings[276] = ItemType.SpruceFence; - mappings[691] = ItemType.SpruceFenceGate; - mappings[832] = ItemType.SpruceHangingSign; - mappings[147] = ItemType.SpruceLeaves; - mappings[107] = ItemType.SpruceLog; - mappings[24] = ItemType.SprucePlanks; - mappings[659] = ItemType.SprucePressurePlate; - mappings[35] = ItemType.SpruceSapling; - mappings[822] = ItemType.SpruceSign; - mappings[219] = ItemType.SpruceSlab; - mappings[347] = ItemType.SpruceStairs; - mappings[681] = ItemType.SpruceTrapdoor; - mappings[138] = ItemType.SpruceWood; - mappings[866] = ItemType.Spyglass; - mappings[995] = ItemType.SquidSpawnEgg; - mappings[782] = ItemType.Stick; - mappings[624] = ItemType.StickyPiston; - mappings[1] = ItemType.Stone; - mappings[760] = ItemType.StoneAxe; - mappings[236] = ItemType.StoneBrickSlab; - mappings[325] = ItemType.StoneBrickStairs; - mappings[366] = ItemType.StoneBrickWall; - mappings[303] = ItemType.StoneBricks; - mappings[642] = ItemType.StoneButton; - mappings[761] = ItemType.StoneHoe; - mappings[759] = ItemType.StonePickaxe; - mappings[654] = ItemType.StonePressurePlate; - mappings[758] = ItemType.StoneShovel; - mappings[229] = ItemType.StoneSlab; - mappings[588] = ItemType.StoneStairs; - mappings[757] = ItemType.StoneSword; - mappings[1130] = ItemType.Stonecutter; - mappings[996] = ItemType.StraySpawnEgg; - mappings[997] = ItemType.StriderSpawnEgg; - mappings[785] = ItemType.String; - mappings[122] = ItemType.StrippedAcaciaLog; - mappings[131] = ItemType.StrippedAcaciaWood; - mappings[136] = ItemType.StrippedBambooBlock; - mappings[120] = ItemType.StrippedBirchLog; - mappings[129] = ItemType.StrippedBirchWood; - mappings[134] = ItemType.StrippedCrimsonHyphae; - mappings[125] = ItemType.StrippedCrimsonStem; - mappings[123] = ItemType.StrippedDarkOakLog; - mappings[132] = ItemType.StrippedDarkOakWood; - mappings[121] = ItemType.StrippedJungleLog; - mappings[130] = ItemType.StrippedJungleWood; - mappings[124] = ItemType.StrippedMangroveLog; - mappings[133] = ItemType.StrippedMangroveWood; - mappings[118] = ItemType.StrippedOakLog; - mappings[127] = ItemType.StrippedOakWood; - mappings[119] = ItemType.StrippedSpruceLog; - mappings[128] = ItemType.StrippedSpruceWood; - mappings[135] = ItemType.StrippedWarpedHyphae; - mappings[126] = ItemType.StrippedWarpedStem; - mappings[729] = ItemType.StructureBlock; - mappings[483] = ItemType.StructureVoid; - mappings[895] = ItemType.Sugar; - mappings[210] = ItemType.SugarCane; - mappings[427] = ItemType.Sunflower; - mappings[1113] = ItemType.SuspiciousStew; - mappings[1134] = ItemType.SweetBerries; - mappings[853] = ItemType.TadpoleBucket; - mappings[998] = ItemType.TadpoleSpawnEgg; - mappings[431] = ItemType.TallGrass; - mappings[632] = ItemType.Target; - mappings[424] = ItemType.Terracotta; - mappings[158] = ItemType.TintedGlass; - mappings[1084] = ItemType.TippedArrow; - mappings[639] = ItemType.Tnt; - mappings[708] = ItemType.TntMinecart; - mappings[255] = ItemType.Torch; - mappings[1087] = ItemType.TotemOfUndying; - mappings[999] = ItemType.TraderLlamaSpawnEgg; - mappings[638] = ItemType.TrappedChest; - mappings[1108] = ItemType.Trident; - mappings[637] = ItemType.TripwireHook; - mappings[870] = ItemType.TropicalFish; - mappings[851] = ItemType.TropicalFishBucket; - mappings[1000] = ItemType.TropicalFishSpawnEgg; - mappings[560] = ItemType.TubeCoral; - mappings[555] = ItemType.TubeCoralBlock; - mappings[570] = ItemType.TubeCoralFan; - mappings[12] = ItemType.Tuff; - mappings[549] = ItemType.TurtleEgg; - mappings[731] = ItemType.TurtleHelmet; - mappings[1001] = ItemType.TurtleSpawnEgg; - mappings[209] = ItemType.TwistingVines; - mappings[1182] = ItemType.VerdantFroglight; - mappings[1002] = ItemType.VexSpawnEgg; - mappings[1003] = ItemType.VillagerSpawnEgg; - mappings[1004] = ItemType.VindicatorSpawnEgg; - mappings[322] = ItemType.Vine; - mappings[1005] = ItemType.WanderingTraderSpawnEgg; - mappings[1006] = ItemType.WardenSpawnEgg; - mappings[653] = ItemType.WarpedButton; - mappings[678] = ItemType.WarpedDoor; - mappings[284] = ItemType.WarpedFence; - mappings[699] = ItemType.WarpedFenceGate; - mappings[204] = ItemType.WarpedFungus; - mappings[711] = ItemType.WarpedFungusOnAStick; - mappings[840] = ItemType.WarpedHangingSign; - mappings[145] = ItemType.WarpedHyphae; - mappings[21] = ItemType.WarpedNylium; - mappings[32] = ItemType.WarpedPlanks; - mappings[667] = ItemType.WarpedPressurePlate; - mappings[206] = ItemType.WarpedRoots; - mappings[830] = ItemType.WarpedSign; - mappings[228] = ItemType.WarpedSlab; - mappings[356] = ItemType.WarpedStairs; - mappings[116] = ItemType.WarpedStem; - mappings[689] = ItemType.WarpedTrapdoor; - mappings[480] = ItemType.WarpedWartBlock; - mappings[842] = ItemType.WaterBucket; - mappings[90] = ItemType.WaxedCopperBlock; - mappings[94] = ItemType.WaxedCutCopper; - mappings[102] = ItemType.WaxedCutCopperSlab; - mappings[98] = ItemType.WaxedCutCopperStairs; - mappings[91] = ItemType.WaxedExposedCopper; - mappings[95] = ItemType.WaxedExposedCutCopper; - mappings[103] = ItemType.WaxedExposedCutCopperSlab; - mappings[99] = ItemType.WaxedExposedCutCopperStairs; - mappings[93] = ItemType.WaxedOxidizedCopper; - mappings[97] = ItemType.WaxedOxidizedCutCopper; - mappings[105] = ItemType.WaxedOxidizedCutCopperSlab; - mappings[101] = ItemType.WaxedOxidizedCutCopperStairs; - mappings[92] = ItemType.WaxedWeatheredCopper; - mappings[96] = ItemType.WaxedWeatheredCutCopper; - mappings[104] = ItemType.WaxedWeatheredCutCopperSlab; - mappings[100] = ItemType.WaxedWeatheredCutCopperStairs; - mappings[76] = ItemType.WeatheredCopper; - mappings[80] = ItemType.WeatheredCutCopper; - mappings[88] = ItemType.WeatheredCutCopperSlab; - mappings[84] = ItemType.WeatheredCutCopperStairs; - mappings[208] = ItemType.WeepingVines; - mappings[156] = ItemType.WetSponge; - mappings[789] = ItemType.Wheat; - mappings[788] = ItemType.WheatSeeds; - mappings[1059] = ItemType.WhiteBanner; - mappings[897] = ItemType.WhiteBed; - mappings[1160] = ItemType.WhiteCandle; - mappings[408] = ItemType.WhiteCarpet; - mappings[517] = ItemType.WhiteConcrete; - mappings[533] = ItemType.WhiteConcretePowder; - mappings[877] = ItemType.WhiteDye; - mappings[501] = ItemType.WhiteGlazedTerracotta; - mappings[485] = ItemType.WhiteShulkerBox; - mappings[433] = ItemType.WhiteStainedGlass; - mappings[449] = ItemType.WhiteStainedGlassPane; - mappings[389] = ItemType.WhiteTerracotta; - mappings[194] = ItemType.WhiteTulip; - mappings[171] = ItemType.WhiteWool; - mappings[1007] = ItemType.WitchSpawnEgg; - mappings[199] = ItemType.WitherRose; - mappings[1030] = ItemType.WitherSkeletonSkull; - mappings[1009] = ItemType.WitherSkeletonSpawnEgg; - mappings[1008] = ItemType.WitherSpawnEgg; - mappings[1010] = ItemType.WolfSpawnEgg; - mappings[755] = ItemType.WoodenAxe; - mappings[756] = ItemType.WoodenHoe; - mappings[754] = ItemType.WoodenPickaxe; - mappings[753] = ItemType.WoodenShovel; - mappings[752] = ItemType.WoodenSword; - mappings[1018] = ItemType.WritableBook; - mappings[1019] = ItemType.WrittenBook; - mappings[1063] = ItemType.YellowBanner; - mappings[901] = ItemType.YellowBed; - mappings[1164] = ItemType.YellowCandle; - mappings[412] = ItemType.YellowCarpet; - mappings[521] = ItemType.YellowConcrete; - mappings[537] = ItemType.YellowConcretePowder; - mappings[881] = ItemType.YellowDye; - mappings[505] = ItemType.YellowGlazedTerracotta; - mappings[489] = ItemType.YellowShulkerBox; - mappings[437] = ItemType.YellowStainedGlass; - mappings[453] = ItemType.YellowStainedGlassPane; - mappings[393] = ItemType.YellowTerracotta; - mappings[175] = ItemType.YellowWool; - mappings[1011] = ItemType.ZoglinSpawnEgg; - mappings[1032] = ItemType.ZombieHead; - mappings[1013] = ItemType.ZombieHorseSpawnEgg; - mappings[1012] = ItemType.ZombieSpawnEgg; - mappings[1014] = ItemType.ZombieVillagerSpawnEgg; - mappings[1015] = ItemType.ZombifiedPiglinSpawnEgg; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1194.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette1194.cs deleted file mode 100644 index ef04e7dc62..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1194.cs +++ /dev/null @@ -1,1246 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public class ItemPalette1194 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette1194() - { - mappings[740] = ItemType.AcaciaBoat; - mappings[662] = ItemType.AcaciaButton; - mappings[741] = ItemType.AcaciaChestBoat; - mappings[689] = ItemType.AcaciaDoor; - mappings[291] = ItemType.AcaciaFence; - mappings[712] = ItemType.AcaciaFenceGate; - mappings[857] = ItemType.AcaciaHangingSign; - mappings[157] = ItemType.AcaciaLeaves; - mappings[113] = ItemType.AcaciaLog; - mappings[27] = ItemType.AcaciaPlanks; - mappings[677] = ItemType.AcaciaPressurePlate; - mappings[39] = ItemType.AcaciaSapling; - mappings[846] = ItemType.AcaciaSign; - mappings[232] = ItemType.AcaciaSlab; - mappings[363] = ItemType.AcaciaStairs; - mappings[701] = ItemType.AcaciaTrapdoor; - mappings[147] = ItemType.AcaciaWood; - mappings[722] = ItemType.ActivatorRail; - mappings[0] = ItemType.Air; - mappings[963] = ItemType.AllaySpawnEgg; - mappings[198] = ItemType.Allium; - mappings[71] = ItemType.AmethystBlock; - mappings[1204] = ItemType.AmethystCluster; - mappings[764] = ItemType.AmethystShard; - mappings[66] = ItemType.AncientDebris; - mappings[6] = ItemType.Andesite; - mappings[623] = ItemType.AndesiteSlab; - mappings[606] = ItemType.AndesiteStairs; - mappings[383] = ItemType.AndesiteWall; - mappings[395] = ItemType.Anvil; - mappings[755] = ItemType.Apple; - mappings[1073] = ItemType.ArmorStand; - mappings[757] = ItemType.Arrow; - mappings[875] = ItemType.AxolotlBucket; - mappings[964] = ItemType.AxolotlSpawnEgg; - mappings[174] = ItemType.Azalea; - mappings[161] = ItemType.AzaleaLeaves; - mappings[199] = ItemType.AzureBluet; - mappings[1049] = ItemType.BakedPotato; - mappings[227] = ItemType.Bamboo; - mappings[121] = ItemType.BambooBlock; - mappings[666] = ItemType.BambooButton; - mappings[749] = ItemType.BambooChestRaft; - mappings[693] = ItemType.BambooDoor; - mappings[295] = ItemType.BambooFence; - mappings[716] = ItemType.BambooFenceGate; - mappings[861] = ItemType.BambooHangingSign; - mappings[34] = ItemType.BambooMosaic; - mappings[237] = ItemType.BambooMosaicSlab; - mappings[368] = ItemType.BambooMosaicStairs; - mappings[31] = ItemType.BambooPlanks; - mappings[681] = ItemType.BambooPressurePlate; - mappings[748] = ItemType.BambooRaft; - mappings[850] = ItemType.BambooSign; - mappings[236] = ItemType.BambooSlab; - mappings[367] = ItemType.BambooStairs; - mappings[705] = ItemType.BambooTrapdoor; - mappings[1148] = ItemType.Barrel; - mappings[419] = ItemType.Barrier; - mappings[304] = ItemType.Basalt; - mappings[965] = ItemType.BatSpawnEgg; - mappings[372] = ItemType.Beacon; - mappings[43] = ItemType.Bedrock; - mappings[1165] = ItemType.BeeNest; - mappings[966] = ItemType.BeeSpawnEgg; - mappings[943] = ItemType.Beef; - mappings[1166] = ItemType.Beehive; - mappings[1103] = ItemType.Beetroot; - mappings[1104] = ItemType.BeetrootSeeds; - mappings[1105] = ItemType.BeetrootSoup; - mappings[1156] = ItemType.Bell; - mappings[225] = ItemType.BigDripleaf; - mappings[736] = ItemType.BirchBoat; - mappings[660] = ItemType.BirchButton; - mappings[737] = ItemType.BirchChestBoat; - mappings[687] = ItemType.BirchDoor; - mappings[289] = ItemType.BirchFence; - mappings[710] = ItemType.BirchFenceGate; - mappings[855] = ItemType.BirchHangingSign; - mappings[155] = ItemType.BirchLeaves; - mappings[111] = ItemType.BirchLog; - mappings[25] = ItemType.BirchPlanks; - mappings[675] = ItemType.BirchPressurePlate; - mappings[37] = ItemType.BirchSapling; - mappings[844] = ItemType.BirchSign; - mappings[230] = ItemType.BirchSlab; - mappings[361] = ItemType.BirchStairs; - mappings[699] = ItemType.BirchTrapdoor; - mappings[145] = ItemType.BirchWood; - mappings[1098] = ItemType.BlackBanner; - mappings[935] = ItemType.BlackBed; - mappings[1200] = ItemType.BlackCandle; - mappings[437] = ItemType.BlackCarpet; - mappings[546] = ItemType.BlackConcrete; - mappings[562] = ItemType.BlackConcretePowder; - mappings[915] = ItemType.BlackDye; - mappings[530] = ItemType.BlackGlazedTerracotta; - mappings[514] = ItemType.BlackShulkerBox; - mappings[462] = ItemType.BlackStainedGlass; - mappings[478] = ItemType.BlackStainedGlassPane; - mappings[418] = ItemType.BlackTerracotta; - mappings[194] = ItemType.BlackWool; - mappings[1171] = ItemType.Blackstone; - mappings[1172] = ItemType.BlackstoneSlab; - mappings[1173] = ItemType.BlackstoneStairs; - mappings[388] = ItemType.BlackstoneWall; - mappings[1150] = ItemType.BlastFurnace; - mappings[957] = ItemType.BlazePowder; - mappings[949] = ItemType.BlazeRod; - mappings[967] = ItemType.BlazeSpawnEgg; - mappings[1094] = ItemType.BlueBanner; - mappings[931] = ItemType.BlueBed; - mappings[1196] = ItemType.BlueCandle; - mappings[433] = ItemType.BlueCarpet; - mappings[542] = ItemType.BlueConcrete; - mappings[558] = ItemType.BlueConcretePowder; - mappings[911] = ItemType.BlueDye; - mappings[526] = ItemType.BlueGlazedTerracotta; - mappings[594] = ItemType.BlueIce; - mappings[197] = ItemType.BlueOrchid; - mappings[510] = ItemType.BlueShulkerBox; - mappings[458] = ItemType.BlueStainedGlass; - mappings[474] = ItemType.BlueStainedGlassPane; - mappings[414] = ItemType.BlueTerracotta; - mappings[190] = ItemType.BlueWool; - mappings[917] = ItemType.Bone; - mappings[496] = ItemType.BoneBlock; - mappings[916] = ItemType.BoneMeal; - mappings[881] = ItemType.Book; - mappings[262] = ItemType.Bookshelf; - mappings[756] = ItemType.Bow; - mappings[804] = ItemType.Bowl; - mappings[575] = ItemType.BrainCoral; - mappings[570] = ItemType.BrainCoralBlock; - mappings[585] = ItemType.BrainCoralFan; - mappings[811] = ItemType.Bread; - mappings[959] = ItemType.BrewingStand; - mappings[877] = ItemType.Brick; - mappings[246] = ItemType.BrickSlab; - mappings[337] = ItemType.BrickStairs; - mappings[375] = ItemType.BrickWall; - mappings[261] = ItemType.Bricks; - mappings[1095] = ItemType.BrownBanner; - mappings[932] = ItemType.BrownBed; - mappings[1197] = ItemType.BrownCandle; - mappings[434] = ItemType.BrownCarpet; - mappings[543] = ItemType.BrownConcrete; - mappings[559] = ItemType.BrownConcretePowder; - mappings[912] = ItemType.BrownDye; - mappings[527] = ItemType.BrownGlazedTerracotta; - mappings[210] = ItemType.BrownMushroom; - mappings[328] = ItemType.BrownMushroomBlock; - mappings[511] = ItemType.BrownShulkerBox; - mappings[459] = ItemType.BrownStainedGlass; - mappings[475] = ItemType.BrownStainedGlassPane; - mappings[415] = ItemType.BrownTerracotta; - mappings[191] = ItemType.BrownWool; - mappings[1211] = ItemType.Brush; - mappings[576] = ItemType.BubbleCoral; - mappings[571] = ItemType.BubbleCoralBlock; - mappings[586] = ItemType.BubbleCoralFan; - mappings[864] = ItemType.Bucket; - mappings[72] = ItemType.BuddingAmethyst; - mappings[886] = ItemType.Bundle; - mappings[284] = ItemType.Cactus; - mappings[919] = ItemType.Cake; - mappings[11] = ItemType.Calcite; - mappings[969] = ItemType.CamelSpawnEgg; - mappings[1161] = ItemType.Campfire; - mappings[1184] = ItemType.Candle; - mappings[1047] = ItemType.Carrot; - mappings[729] = ItemType.CarrotOnAStick; - mappings[1151] = ItemType.CartographyTable; - mappings[299] = ItemType.CarvedPumpkin; - mappings[968] = ItemType.CatSpawnEgg; - mappings[960] = ItemType.Cauldron; - mappings[970] = ItemType.CaveSpiderSpawnEgg; - mappings[332] = ItemType.Chain; - mappings[491] = ItemType.ChainCommandBlock; - mappings[819] = ItemType.ChainmailBoots; - mappings[817] = ItemType.ChainmailChestplate; - mappings[816] = ItemType.ChainmailHelmet; - mappings[818] = ItemType.ChainmailLeggings; - mappings[759] = ItemType.Charcoal; - mappings[742] = ItemType.CherryBoat; - mappings[663] = ItemType.CherryButton; - mappings[743] = ItemType.CherryChestBoat; - mappings[690] = ItemType.CherryDoor; - mappings[292] = ItemType.CherryFence; - mappings[713] = ItemType.CherryFenceGate; - mappings[858] = ItemType.CherryHangingSign; - mappings[158] = ItemType.CherryLeaves; - mappings[114] = ItemType.CherryLog; - mappings[28] = ItemType.CherryPlanks; - mappings[678] = ItemType.CherryPressurePlate; - mappings[40] = ItemType.CherrySapling; - mappings[847] = ItemType.CherrySign; - mappings[233] = ItemType.CherrySlab; - mappings[364] = ItemType.CherryStairs; - mappings[702] = ItemType.CherryTrapdoor; - mappings[148] = ItemType.CherryWood; - mappings[275] = ItemType.Chest; - mappings[725] = ItemType.ChestMinecart; - mappings[945] = ItemType.Chicken; - mappings[971] = ItemType.ChickenSpawnEgg; - mappings[396] = ItemType.ChippedAnvil; - mappings[263] = ItemType.ChiseledBookshelf; - mappings[326] = ItemType.ChiseledDeepslate; - mappings[344] = ItemType.ChiseledNetherBricks; - mappings[1178] = ItemType.ChiseledPolishedBlackstone; - mappings[398] = ItemType.ChiseledQuartzBlock; - mappings[487] = ItemType.ChiseledRedSandstone; - mappings[169] = ItemType.ChiseledSandstone; - mappings[319] = ItemType.ChiseledStoneBricks; - mappings[270] = ItemType.ChorusFlower; - mappings[1100] = ItemType.ChorusFruit; - mappings[269] = ItemType.ChorusPlant; - mappings[285] = ItemType.Clay; - mappings[878] = ItemType.ClayBall; - mappings[888] = ItemType.Clock; - mappings[758] = ItemType.Coal; - mappings[67] = ItemType.CoalBlock; - mappings[48] = ItemType.CoalOre; - mappings[16] = ItemType.CoarseDirt; - mappings[1215] = ItemType.CoastArmorTrimSmithingTemplate; - mappings[9] = ItemType.CobbledDeepslate; - mappings[627] = ItemType.CobbledDeepslateSlab; - mappings[610] = ItemType.CobbledDeepslateStairs; - mappings[391] = ItemType.CobbledDeepslateWall; - mappings[22] = ItemType.Cobblestone; - mappings[245] = ItemType.CobblestoneSlab; - mappings[280] = ItemType.CobblestoneStairs; - mappings[373] = ItemType.CobblestoneWall; - mappings[171] = ItemType.Cobweb; - mappings[899] = ItemType.CocoaBeans; - mappings[891] = ItemType.Cod; - mappings[873] = ItemType.CodBucket; - mappings[972] = ItemType.CodSpawnEgg; - mappings[371] = ItemType.CommandBlock; - mappings[1080] = ItemType.CommandBlockMinecart; - mappings[636] = ItemType.Comparator; - mappings[884] = ItemType.Compass; - mappings[1147] = ItemType.Composter; - mappings[595] = ItemType.Conduit; - mappings[944] = ItemType.CookedBeef; - mappings[946] = ItemType.CookedChicken; - mappings[895] = ItemType.CookedCod; - mappings[1082] = ItemType.CookedMutton; - mappings[838] = ItemType.CookedPorkchop; - mappings[1069] = ItemType.CookedRabbit; - mappings[896] = ItemType.CookedSalmon; - mappings[936] = ItemType.Cookie; - mappings[74] = ItemType.CopperBlock; - mappings[768] = ItemType.CopperIngot; - mappings[52] = ItemType.CopperOre; - mappings[205] = ItemType.Cornflower; - mappings[973] = ItemType.CowSpawnEgg; - mappings[323] = ItemType.CrackedDeepslateBricks; - mappings[325] = ItemType.CrackedDeepslateTiles; - mappings[343] = ItemType.CrackedNetherBricks; - mappings[1182] = ItemType.CrackedPolishedBlackstoneBricks; - mappings[318] = ItemType.CrackedStoneBricks; - mappings[276] = ItemType.CraftingTable; - mappings[1141] = ItemType.CreeperBannerPattern; - mappings[1057] = ItemType.CreeperHead; - mappings[974] = ItemType.CreeperSpawnEgg; - mappings[667] = ItemType.CrimsonButton; - mappings[694] = ItemType.CrimsonDoor; - mappings[296] = ItemType.CrimsonFence; - mappings[717] = ItemType.CrimsonFenceGate; - mappings[212] = ItemType.CrimsonFungus; - mappings[862] = ItemType.CrimsonHangingSign; - mappings[151] = ItemType.CrimsonHyphae; - mappings[20] = ItemType.CrimsonNylium; - mappings[32] = ItemType.CrimsonPlanks; - mappings[682] = ItemType.CrimsonPressurePlate; - mappings[214] = ItemType.CrimsonRoots; - mappings[851] = ItemType.CrimsonSign; - mappings[238] = ItemType.CrimsonSlab; - mappings[369] = ItemType.CrimsonStairs; - mappings[119] = ItemType.CrimsonStem; - mappings[706] = ItemType.CrimsonTrapdoor; - mappings[1137] = ItemType.Crossbow; - mappings[1170] = ItemType.CryingObsidian; - mappings[81] = ItemType.CutCopper; - mappings[89] = ItemType.CutCopperSlab; - mappings[85] = ItemType.CutCopperStairs; - mappings[488] = ItemType.CutRedSandstone; - mappings[252] = ItemType.CutRedSandstoneSlab; - mappings[170] = ItemType.CutSandstone; - mappings[243] = ItemType.CutSandstoneSlab; - mappings[1092] = ItemType.CyanBanner; - mappings[929] = ItemType.CyanBed; - mappings[1194] = ItemType.CyanCandle; - mappings[431] = ItemType.CyanCarpet; - mappings[540] = ItemType.CyanConcrete; - mappings[556] = ItemType.CyanConcretePowder; - mappings[909] = ItemType.CyanDye; - mappings[524] = ItemType.CyanGlazedTerracotta; - mappings[508] = ItemType.CyanShulkerBox; - mappings[456] = ItemType.CyanStainedGlass; - mappings[472] = ItemType.CyanStainedGlassPane; - mappings[412] = ItemType.CyanTerracotta; - mappings[188] = ItemType.CyanWool; - mappings[397] = ItemType.DamagedAnvil; - mappings[195] = ItemType.Dandelion; - mappings[744] = ItemType.DarkOakBoat; - mappings[664] = ItemType.DarkOakButton; - mappings[745] = ItemType.DarkOakChestBoat; - mappings[691] = ItemType.DarkOakDoor; - mappings[293] = ItemType.DarkOakFence; - mappings[714] = ItemType.DarkOakFenceGate; - mappings[859] = ItemType.DarkOakHangingSign; - mappings[159] = ItemType.DarkOakLeaves; - mappings[115] = ItemType.DarkOakLog; - mappings[29] = ItemType.DarkOakPlanks; - mappings[679] = ItemType.DarkOakPressurePlate; - mappings[41] = ItemType.DarkOakSapling; - mappings[848] = ItemType.DarkOakSign; - mappings[234] = ItemType.DarkOakSlab; - mappings[365] = ItemType.DarkOakStairs; - mappings[703] = ItemType.DarkOakTrapdoor; - mappings[149] = ItemType.DarkOakWood; - mappings[481] = ItemType.DarkPrismarine; - mappings[256] = ItemType.DarkPrismarineSlab; - mappings[484] = ItemType.DarkPrismarineStairs; - mappings[649] = ItemType.DaylightDetector; - mappings[579] = ItemType.DeadBrainCoral; - mappings[565] = ItemType.DeadBrainCoralBlock; - mappings[590] = ItemType.DeadBrainCoralFan; - mappings[580] = ItemType.DeadBubbleCoral; - mappings[566] = ItemType.DeadBubbleCoralBlock; - mappings[591] = ItemType.DeadBubbleCoralFan; - mappings[176] = ItemType.DeadBush; - mappings[581] = ItemType.DeadFireCoral; - mappings[567] = ItemType.DeadFireCoralBlock; - mappings[592] = ItemType.DeadFireCoralFan; - mappings[582] = ItemType.DeadHornCoral; - mappings[568] = ItemType.DeadHornCoralBlock; - mappings[593] = ItemType.DeadHornCoralFan; - mappings[583] = ItemType.DeadTubeCoral; - mappings[564] = ItemType.DeadTubeCoralBlock; - mappings[589] = ItemType.DeadTubeCoralFan; - mappings[1116] = ItemType.DebugStick; - mappings[264] = ItemType.DecoratedPot; - mappings[8] = ItemType.Deepslate; - mappings[629] = ItemType.DeepslateBrickSlab; - mappings[612] = ItemType.DeepslateBrickStairs; - mappings[393] = ItemType.DeepslateBrickWall; - mappings[322] = ItemType.DeepslateBricks; - mappings[49] = ItemType.DeepslateCoalOre; - mappings[53] = ItemType.DeepslateCopperOre; - mappings[63] = ItemType.DeepslateDiamondOre; - mappings[59] = ItemType.DeepslateEmeraldOre; - mappings[55] = ItemType.DeepslateGoldOre; - mappings[51] = ItemType.DeepslateIronOre; - mappings[61] = ItemType.DeepslateLapisOre; - mappings[57] = ItemType.DeepslateRedstoneOre; - mappings[630] = ItemType.DeepslateTileSlab; - mappings[613] = ItemType.DeepslateTileStairs; - mappings[394] = ItemType.DeepslateTileWall; - mappings[324] = ItemType.DeepslateTiles; - mappings[720] = ItemType.DetectorRail; - mappings[760] = ItemType.Diamond; - mappings[796] = ItemType.DiamondAxe; - mappings[76] = ItemType.DiamondBlock; - mappings[827] = ItemType.DiamondBoots; - mappings[825] = ItemType.DiamondChestplate; - mappings[824] = ItemType.DiamondHelmet; - mappings[797] = ItemType.DiamondHoe; - mappings[1076] = ItemType.DiamondHorseArmor; - mappings[826] = ItemType.DiamondLeggings; - mappings[62] = ItemType.DiamondOre; - mappings[795] = ItemType.DiamondPickaxe; - mappings[794] = ItemType.DiamondShovel; - mappings[793] = ItemType.DiamondSword; - mappings[4] = ItemType.Diorite; - mappings[626] = ItemType.DioriteSlab; - mappings[609] = ItemType.DioriteStairs; - mappings[387] = ItemType.DioriteWall; - mappings[15] = ItemType.Dirt; - mappings[440] = ItemType.DirtPath; - mappings[1132] = ItemType.DiscFragment5; - mappings[643] = ItemType.Dispenser; - mappings[975] = ItemType.DolphinSpawnEgg; - mappings[976] = ItemType.DonkeySpawnEgg; - mappings[1106] = ItemType.DragonBreath; - mappings[355] = ItemType.DragonEgg; - mappings[1058] = ItemType.DragonHead; - mappings[940] = ItemType.DriedKelp; - mappings[879] = ItemType.DriedKelpBlock; - mappings[13] = ItemType.DripstoneBlock; - mappings[644] = ItemType.Dropper; - mappings[977] = ItemType.DrownedSpawnEgg; - mappings[1214] = ItemType.DuneArmorTrimSmithingTemplate; - mappings[1210] = ItemType.EchoShard; - mappings[883] = ItemType.Egg; - mappings[978] = ItemType.ElderGuardianSpawnEgg; - mappings[731] = ItemType.Elytra; - mappings[761] = ItemType.Emerald; - mappings[358] = ItemType.EmeraldBlock; - mappings[58] = ItemType.EmeraldOre; - mappings[1064] = ItemType.EnchantedBook; - mappings[841] = ItemType.EnchantedGoldenApple; - mappings[351] = ItemType.EnchantingTable; - mappings[1099] = ItemType.EndCrystal; - mappings[352] = ItemType.EndPortalFrame; - mappings[268] = ItemType.EndRod; - mappings[353] = ItemType.EndStone; - mappings[619] = ItemType.EndStoneBrickSlab; - mappings[601] = ItemType.EndStoneBrickStairs; - mappings[386] = ItemType.EndStoneBrickWall; - mappings[354] = ItemType.EndStoneBricks; - mappings[357] = ItemType.EnderChest; - mappings[979] = ItemType.EnderDragonSpawnEgg; - mappings[961] = ItemType.EnderEye; - mappings[948] = ItemType.EnderPearl; - mappings[980] = ItemType.EndermanSpawnEgg; - mappings[981] = ItemType.EndermiteSpawnEgg; - mappings[982] = ItemType.EvokerSpawnEgg; - mappings[1040] = ItemType.ExperienceBottle; - mappings[78] = ItemType.ExposedCopper; - mappings[82] = ItemType.ExposedCutCopper; - mappings[90] = ItemType.ExposedCutCopperSlab; - mappings[86] = ItemType.ExposedCutCopperStairs; - mappings[1218] = ItemType.EyeArmorTrimSmithingTemplate; - mappings[277] = ItemType.Farmland; - mappings[807] = ItemType.Feather; - mappings[956] = ItemType.FermentedSpiderEye; - mappings[173] = ItemType.Fern; - mappings[937] = ItemType.FilledMap; - mappings[1041] = ItemType.FireCharge; - mappings[577] = ItemType.FireCoral; - mappings[572] = ItemType.FireCoralBlock; - mappings[587] = ItemType.FireCoralFan; - mappings[1062] = ItemType.FireworkRocket; - mappings[1063] = ItemType.FireworkStar; - mappings[887] = ItemType.FishingRod; - mappings[1152] = ItemType.FletchingTable; - mappings[836] = ItemType.Flint; - mappings[754] = ItemType.FlintAndSteel; - mappings[1140] = ItemType.FlowerBannerPattern; - mappings[1046] = ItemType.FlowerPot; - mappings[175] = ItemType.FloweringAzalea; - mappings[162] = ItemType.FloweringAzaleaLeaves; - mappings[983] = ItemType.FoxSpawnEgg; - mappings[984] = ItemType.FrogSpawnEgg; - mappings[1209] = ItemType.Frogspawn; - mappings[278] = ItemType.Furnace; - mappings[726] = ItemType.FurnaceMinecart; - mappings[985] = ItemType.GhastSpawnEgg; - mappings[950] = ItemType.GhastTear; - mappings[1174] = ItemType.GildedBlackstone; - mappings[165] = ItemType.Glass; - mappings[954] = ItemType.GlassBottle; - mappings[333] = ItemType.GlassPane; - mappings[962] = ItemType.GlisteringMelonSlice; - mappings[1144] = ItemType.GlobeBannerPattern; - mappings[1160] = ItemType.GlowBerries; - mappings[898] = ItemType.GlowInkSac; - mappings[1045] = ItemType.GlowItemFrame; - mappings[336] = ItemType.GlowLichen; - mappings[986] = ItemType.GlowSquidSpawnEgg; - mappings[308] = ItemType.Glowstone; - mappings[890] = ItemType.GlowstoneDust; - mappings[1146] = ItemType.GoatHorn; - mappings[987] = ItemType.GoatSpawnEgg; - mappings[75] = ItemType.GoldBlock; - mappings[770] = ItemType.GoldIngot; - mappings[951] = ItemType.GoldNugget; - mappings[54] = ItemType.GoldOre; - mappings[840] = ItemType.GoldenApple; - mappings[786] = ItemType.GoldenAxe; - mappings[831] = ItemType.GoldenBoots; - mappings[1052] = ItemType.GoldenCarrot; - mappings[829] = ItemType.GoldenChestplate; - mappings[828] = ItemType.GoldenHelmet; - mappings[787] = ItemType.GoldenHoe; - mappings[1075] = ItemType.GoldenHorseArmor; - mappings[830] = ItemType.GoldenLeggings; - mappings[785] = ItemType.GoldenPickaxe; - mappings[784] = ItemType.GoldenShovel; - mappings[783] = ItemType.GoldenSword; - mappings[2] = ItemType.Granite; - mappings[622] = ItemType.GraniteSlab; - mappings[605] = ItemType.GraniteStairs; - mappings[379] = ItemType.GraniteWall; - mappings[172] = ItemType.ShortGrass; - mappings[14] = ItemType.GrassBlock; - mappings[47] = ItemType.Gravel; - mappings[1090] = ItemType.GrayBanner; - mappings[927] = ItemType.GrayBed; - mappings[1192] = ItemType.GrayCandle; - mappings[429] = ItemType.GrayCarpet; - mappings[538] = ItemType.GrayConcrete; - mappings[554] = ItemType.GrayConcretePowder; - mappings[907] = ItemType.GrayDye; - mappings[522] = ItemType.GrayGlazedTerracotta; - mappings[506] = ItemType.GrayShulkerBox; - mappings[454] = ItemType.GrayStainedGlass; - mappings[470] = ItemType.GrayStainedGlassPane; - mappings[410] = ItemType.GrayTerracotta; - mappings[186] = ItemType.GrayWool; - mappings[1096] = ItemType.GreenBanner; - mappings[933] = ItemType.GreenBed; - mappings[1198] = ItemType.GreenCandle; - mappings[435] = ItemType.GreenCarpet; - mappings[544] = ItemType.GreenConcrete; - mappings[560] = ItemType.GreenConcretePowder; - mappings[913] = ItemType.GreenDye; - mappings[528] = ItemType.GreenGlazedTerracotta; - mappings[512] = ItemType.GreenShulkerBox; - mappings[460] = ItemType.GreenStainedGlass; - mappings[476] = ItemType.GreenStainedGlassPane; - mappings[416] = ItemType.GreenTerracotta; - mappings[192] = ItemType.GreenWool; - mappings[1153] = ItemType.Grindstone; - mappings[988] = ItemType.GuardianSpawnEgg; - mappings[808] = ItemType.Gunpowder; - mappings[224] = ItemType.HangingRoots; - mappings[421] = ItemType.HayBlock; - mappings[1136] = ItemType.HeartOfTheSea; - mappings[672] = ItemType.HeavyWeightedPressurePlate; - mappings[989] = ItemType.HoglinSpawnEgg; - mappings[640] = ItemType.HoneyBlock; - mappings[1167] = ItemType.HoneyBottle; - mappings[1164] = ItemType.Honeycomb; - mappings[1168] = ItemType.HoneycombBlock; - mappings[642] = ItemType.Hopper; - mappings[728] = ItemType.HopperMinecart; - mappings[578] = ItemType.HornCoral; - mappings[573] = ItemType.HornCoralBlock; - mappings[588] = ItemType.HornCoralFan; - mappings[990] = ItemType.HorseSpawnEgg; - mappings[991] = ItemType.HuskSpawnEgg; - mappings[282] = ItemType.Ice; - mappings[314] = ItemType.InfestedChiseledStoneBricks; - mappings[310] = ItemType.InfestedCobblestone; - mappings[313] = ItemType.InfestedCrackedStoneBricks; - mappings[315] = ItemType.InfestedDeepslate; - mappings[312] = ItemType.InfestedMossyStoneBricks; - mappings[309] = ItemType.InfestedStone; - mappings[311] = ItemType.InfestedStoneBricks; - mappings[897] = ItemType.InkSac; - mappings[791] = ItemType.IronAxe; - mappings[331] = ItemType.IronBars; - mappings[73] = ItemType.IronBlock; - mappings[823] = ItemType.IronBoots; - mappings[821] = ItemType.IronChestplate; - mappings[684] = ItemType.IronDoor; - mappings[992] = ItemType.IronGolemSpawnEgg; - mappings[820] = ItemType.IronHelmet; - mappings[792] = ItemType.IronHoe; - mappings[1074] = ItemType.IronHorseArmor; - mappings[766] = ItemType.IronIngot; - mappings[822] = ItemType.IronLeggings; - mappings[1114] = ItemType.IronNugget; - mappings[50] = ItemType.IronOre; - mappings[790] = ItemType.IronPickaxe; - mappings[789] = ItemType.IronShovel; - mappings[788] = ItemType.IronSword; - mappings[696] = ItemType.IronTrapdoor; - mappings[1044] = ItemType.ItemFrame; - mappings[300] = ItemType.JackOLantern; - mappings[751] = ItemType.Jigsaw; - mappings[286] = ItemType.Jukebox; - mappings[738] = ItemType.JungleBoat; - mappings[661] = ItemType.JungleButton; - mappings[739] = ItemType.JungleChestBoat; - mappings[688] = ItemType.JungleDoor; - mappings[290] = ItemType.JungleFence; - mappings[711] = ItemType.JungleFenceGate; - mappings[856] = ItemType.JungleHangingSign; - mappings[156] = ItemType.JungleLeaves; - mappings[112] = ItemType.JungleLog; - mappings[26] = ItemType.JunglePlanks; - mappings[676] = ItemType.JunglePressurePlate; - mappings[38] = ItemType.JungleSapling; - mappings[845] = ItemType.JungleSign; - mappings[231] = ItemType.JungleSlab; - mappings[362] = ItemType.JungleStairs; - mappings[700] = ItemType.JungleTrapdoor; - mappings[146] = ItemType.JungleWood; - mappings[220] = ItemType.Kelp; - mappings[1115] = ItemType.KnowledgeBook; - mappings[279] = ItemType.Ladder; - mappings[1157] = ItemType.Lantern; - mappings[167] = ItemType.LapisBlock; - mappings[762] = ItemType.LapisLazuli; - mappings[60] = ItemType.LapisOre; - mappings[1203] = ItemType.LargeAmethystBud; - mappings[446] = ItemType.LargeFern; - mappings[866] = ItemType.LavaBucket; - mappings[1078] = ItemType.Lead; - mappings[869] = ItemType.Leather; - mappings[815] = ItemType.LeatherBoots; - mappings[813] = ItemType.LeatherChestplate; - mappings[812] = ItemType.LeatherHelmet; - mappings[1077] = ItemType.LeatherHorseArmor; - mappings[814] = ItemType.LeatherLeggings; - mappings[645] = ItemType.Lectern; - mappings[647] = ItemType.Lever; - mappings[420] = ItemType.Light; - mappings[1086] = ItemType.LightBlueBanner; - mappings[923] = ItemType.LightBlueBed; - mappings[1188] = ItemType.LightBlueCandle; - mappings[425] = ItemType.LightBlueCarpet; - mappings[534] = ItemType.LightBlueConcrete; - mappings[550] = ItemType.LightBlueConcretePowder; - mappings[903] = ItemType.LightBlueDye; - mappings[518] = ItemType.LightBlueGlazedTerracotta; - mappings[502] = ItemType.LightBlueShulkerBox; - mappings[450] = ItemType.LightBlueStainedGlass; - mappings[466] = ItemType.LightBlueStainedGlassPane; - mappings[406] = ItemType.LightBlueTerracotta; - mappings[182] = ItemType.LightBlueWool; - mappings[1091] = ItemType.LightGrayBanner; - mappings[928] = ItemType.LightGrayBed; - mappings[1193] = ItemType.LightGrayCandle; - mappings[430] = ItemType.LightGrayCarpet; - mappings[539] = ItemType.LightGrayConcrete; - mappings[555] = ItemType.LightGrayConcretePowder; - mappings[908] = ItemType.LightGrayDye; - mappings[523] = ItemType.LightGrayGlazedTerracotta; - mappings[507] = ItemType.LightGrayShulkerBox; - mappings[455] = ItemType.LightGrayStainedGlass; - mappings[471] = ItemType.LightGrayStainedGlassPane; - mappings[411] = ItemType.LightGrayTerracotta; - mappings[187] = ItemType.LightGrayWool; - mappings[671] = ItemType.LightWeightedPressurePlate; - mappings[648] = ItemType.LightningRod; - mappings[442] = ItemType.Lilac; - mappings[206] = ItemType.LilyOfTheValley; - mappings[341] = ItemType.LilyPad; - mappings[1088] = ItemType.LimeBanner; - mappings[925] = ItemType.LimeBed; - mappings[1190] = ItemType.LimeCandle; - mappings[427] = ItemType.LimeCarpet; - mappings[536] = ItemType.LimeConcrete; - mappings[552] = ItemType.LimeConcretePowder; - mappings[905] = ItemType.LimeDye; - mappings[520] = ItemType.LimeGlazedTerracotta; - mappings[504] = ItemType.LimeShulkerBox; - mappings[452] = ItemType.LimeStainedGlass; - mappings[468] = ItemType.LimeStainedGlassPane; - mappings[408] = ItemType.LimeTerracotta; - mappings[184] = ItemType.LimeWool; - mappings[1110] = ItemType.LingeringPotion; - mappings[993] = ItemType.LlamaSpawnEgg; - mappings[1169] = ItemType.Lodestone; - mappings[1139] = ItemType.Loom; - mappings[1085] = ItemType.MagentaBanner; - mappings[922] = ItemType.MagentaBed; - mappings[1187] = ItemType.MagentaCandle; - mappings[424] = ItemType.MagentaCarpet; - mappings[533] = ItemType.MagentaConcrete; - mappings[549] = ItemType.MagentaConcretePowder; - mappings[902] = ItemType.MagentaDye; - mappings[517] = ItemType.MagentaGlazedTerracotta; - mappings[501] = ItemType.MagentaShulkerBox; - mappings[449] = ItemType.MagentaStainedGlass; - mappings[465] = ItemType.MagentaStainedGlassPane; - mappings[405] = ItemType.MagentaTerracotta; - mappings[181] = ItemType.MagentaWool; - mappings[492] = ItemType.MagmaBlock; - mappings[958] = ItemType.MagmaCream; - mappings[994] = ItemType.MagmaCubeSpawnEgg; - mappings[746] = ItemType.MangroveBoat; - mappings[665] = ItemType.MangroveButton; - mappings[747] = ItemType.MangroveChestBoat; - mappings[692] = ItemType.MangroveDoor; - mappings[294] = ItemType.MangroveFence; - mappings[715] = ItemType.MangroveFenceGate; - mappings[860] = ItemType.MangroveHangingSign; - mappings[160] = ItemType.MangroveLeaves; - mappings[116] = ItemType.MangroveLog; - mappings[30] = ItemType.MangrovePlanks; - mappings[680] = ItemType.MangrovePressurePlate; - mappings[42] = ItemType.MangrovePropagule; - mappings[117] = ItemType.MangroveRoots; - mappings[849] = ItemType.MangroveSign; - mappings[235] = ItemType.MangroveSlab; - mappings[366] = ItemType.MangroveStairs; - mappings[704] = ItemType.MangroveTrapdoor; - mappings[150] = ItemType.MangroveWood; - mappings[1051] = ItemType.Map; - mappings[1202] = ItemType.MediumAmethystBud; - mappings[334] = ItemType.Melon; - mappings[942] = ItemType.MelonSeeds; - mappings[939] = ItemType.MelonSlice; - mappings[870] = ItemType.MilkBucket; - mappings[724] = ItemType.Minecart; - mappings[1143] = ItemType.MojangBannerPattern; - mappings[995] = ItemType.MooshroomSpawnEgg; - mappings[223] = ItemType.MossBlock; - mappings[221] = ItemType.MossCarpet; - mappings[265] = ItemType.MossyCobblestone; - mappings[618] = ItemType.MossyCobblestoneSlab; - mappings[600] = ItemType.MossyCobblestoneStairs; - mappings[374] = ItemType.MossyCobblestoneWall; - mappings[616] = ItemType.MossyStoneBrickSlab; - mappings[598] = ItemType.MossyStoneBrickStairs; - mappings[378] = ItemType.MossyStoneBrickWall; - mappings[317] = ItemType.MossyStoneBricks; - mappings[19] = ItemType.Mud; - mappings[248] = ItemType.MudBrickSlab; - mappings[339] = ItemType.MudBrickStairs; - mappings[381] = ItemType.MudBrickWall; - mappings[321] = ItemType.MudBricks; - mappings[118] = ItemType.MuddyMangroveRoots; - mappings[996] = ItemType.MuleSpawnEgg; - mappings[330] = ItemType.MushroomStem; - mappings[805] = ItemType.MushroomStew; - mappings[1127] = ItemType.MusicDisc11; - mappings[1117] = ItemType.MusicDisc13; - mappings[1130] = ItemType.MusicDisc5; - mappings[1119] = ItemType.MusicDiscBlocks; - mappings[1118] = ItemType.MusicDiscCat; - mappings[1120] = ItemType.MusicDiscChirp; - mappings[1121] = ItemType.MusicDiscFar; - mappings[1122] = ItemType.MusicDiscMall; - mappings[1123] = ItemType.MusicDiscMellohi; - mappings[1129] = ItemType.MusicDiscOtherside; - mappings[1131] = ItemType.MusicDiscPigstep; - mappings[1124] = ItemType.MusicDiscStal; - mappings[1125] = ItemType.MusicDiscStrad; - mappings[1128] = ItemType.MusicDiscWait; - mappings[1126] = ItemType.MusicDiscWard; - mappings[1081] = ItemType.Mutton; - mappings[340] = ItemType.Mycelium; - mappings[1079] = ItemType.NameTag; - mappings[1135] = ItemType.NautilusShell; - mappings[1065] = ItemType.NetherBrick; - mappings[345] = ItemType.NetherBrickFence; - mappings[249] = ItemType.NetherBrickSlab; - mappings[346] = ItemType.NetherBrickStairs; - mappings[382] = ItemType.NetherBrickWall; - mappings[342] = ItemType.NetherBricks; - mappings[64] = ItemType.NetherGoldOre; - mappings[65] = ItemType.NetherQuartzOre; - mappings[216] = ItemType.NetherSprouts; - mappings[1060] = ItemType.NetherStar; - mappings[952] = ItemType.NetherWart; - mappings[493] = ItemType.NetherWartBlock; - mappings[801] = ItemType.NetheriteAxe; - mappings[77] = ItemType.NetheriteBlock; - mappings[835] = ItemType.NetheriteBoots; - mappings[833] = ItemType.NetheriteChestplate; - mappings[832] = ItemType.NetheriteHelmet; - mappings[802] = ItemType.NetheriteHoe; - mappings[771] = ItemType.NetheriteIngot; - mappings[834] = ItemType.NetheriteLeggings; - mappings[800] = ItemType.NetheritePickaxe; - mappings[772] = ItemType.NetheriteScrap; - mappings[799] = ItemType.NetheriteShovel; - mappings[798] = ItemType.NetheriteSword; - mappings[1212] = ItemType.NetheriteUpgradeSmithingTemplate; - mappings[301] = ItemType.Netherrack; - mappings[655] = ItemType.NoteBlock; - mappings[732] = ItemType.OakBoat; - mappings[658] = ItemType.OakButton; - mappings[733] = ItemType.OakChestBoat; - mappings[685] = ItemType.OakDoor; - mappings[287] = ItemType.OakFence; - mappings[708] = ItemType.OakFenceGate; - mappings[853] = ItemType.OakHangingSign; - mappings[153] = ItemType.OakLeaves; - mappings[109] = ItemType.OakLog; - mappings[23] = ItemType.OakPlanks; - mappings[673] = ItemType.OakPressurePlate; - mappings[35] = ItemType.OakSapling; - mappings[842] = ItemType.OakSign; - mappings[228] = ItemType.OakSlab; - mappings[359] = ItemType.OakStairs; - mappings[697] = ItemType.OakTrapdoor; - mappings[143] = ItemType.OakWood; - mappings[641] = ItemType.Observer; - mappings[266] = ItemType.Obsidian; - mappings[997] = ItemType.OcelotSpawnEgg; - mappings[1206] = ItemType.OchreFroglight; - mappings[1084] = ItemType.OrangeBanner; - mappings[921] = ItemType.OrangeBed; - mappings[1186] = ItemType.OrangeCandle; - mappings[423] = ItemType.OrangeCarpet; - mappings[532] = ItemType.OrangeConcrete; - mappings[548] = ItemType.OrangeConcretePowder; - mappings[901] = ItemType.OrangeDye; - mappings[516] = ItemType.OrangeGlazedTerracotta; - mappings[500] = ItemType.OrangeShulkerBox; - mappings[448] = ItemType.OrangeStainedGlass; - mappings[464] = ItemType.OrangeStainedGlassPane; - mappings[404] = ItemType.OrangeTerracotta; - mappings[201] = ItemType.OrangeTulip; - mappings[180] = ItemType.OrangeWool; - mappings[204] = ItemType.OxeyeDaisy; - mappings[80] = ItemType.OxidizedCopper; - mappings[84] = ItemType.OxidizedCutCopper; - mappings[92] = ItemType.OxidizedCutCopperSlab; - mappings[88] = ItemType.OxidizedCutCopperStairs; - mappings[439] = ItemType.PackedIce; - mappings[320] = ItemType.PackedMud; - mappings[839] = ItemType.Painting; - mappings[998] = ItemType.PandaSpawnEgg; - mappings[880] = ItemType.Paper; - mappings[999] = ItemType.ParrotSpawnEgg; - mappings[1208] = ItemType.PearlescentFroglight; - mappings[444] = ItemType.Peony; - mappings[244] = ItemType.PetrifiedOakSlab; - mappings[1134] = ItemType.PhantomMembrane; - mappings[1000] = ItemType.PhantomSpawnEgg; - mappings[1001] = ItemType.PigSpawnEgg; - mappings[1145] = ItemType.PiglinBannerPattern; - mappings[1003] = ItemType.PiglinBruteSpawnEgg; - mappings[1059] = ItemType.PiglinHead; - mappings[1002] = ItemType.PiglinSpawnEgg; - mappings[1004] = ItemType.PillagerSpawnEgg; - mappings[1089] = ItemType.PinkBanner; - mappings[926] = ItemType.PinkBed; - mappings[1191] = ItemType.PinkCandle; - mappings[428] = ItemType.PinkCarpet; - mappings[537] = ItemType.PinkConcrete; - mappings[553] = ItemType.PinkConcretePowder; - mappings[906] = ItemType.PinkDye; - mappings[521] = ItemType.PinkGlazedTerracotta; - mappings[222] = ItemType.PinkPetals; - mappings[505] = ItemType.PinkShulkerBox; - mappings[453] = ItemType.PinkStainedGlass; - mappings[469] = ItemType.PinkStainedGlassPane; - mappings[409] = ItemType.PinkTerracotta; - mappings[203] = ItemType.PinkTulip; - mappings[185] = ItemType.PinkWool; - mappings[637] = ItemType.Piston; - mappings[1055] = ItemType.PlayerHead; - mappings[17] = ItemType.Podzol; - mappings[1205] = ItemType.PointedDripstone; - mappings[1050] = ItemType.PoisonousPotato; - mappings[1005] = ItemType.PolarBearSpawnEgg; - mappings[7] = ItemType.PolishedAndesite; - mappings[625] = ItemType.PolishedAndesiteSlab; - mappings[608] = ItemType.PolishedAndesiteStairs; - mappings[305] = ItemType.PolishedBasalt; - mappings[1175] = ItemType.PolishedBlackstone; - mappings[1180] = ItemType.PolishedBlackstoneBrickSlab; - mappings[1181] = ItemType.PolishedBlackstoneBrickStairs; - mappings[390] = ItemType.PolishedBlackstoneBrickWall; - mappings[1179] = ItemType.PolishedBlackstoneBricks; - mappings[657] = ItemType.PolishedBlackstoneButton; - mappings[670] = ItemType.PolishedBlackstonePressurePlate; - mappings[1176] = ItemType.PolishedBlackstoneSlab; - mappings[1177] = ItemType.PolishedBlackstoneStairs; - mappings[389] = ItemType.PolishedBlackstoneWall; - mappings[10] = ItemType.PolishedDeepslate; - mappings[628] = ItemType.PolishedDeepslateSlab; - mappings[611] = ItemType.PolishedDeepslateStairs; - mappings[392] = ItemType.PolishedDeepslateWall; - mappings[5] = ItemType.PolishedDiorite; - mappings[617] = ItemType.PolishedDioriteSlab; - mappings[599] = ItemType.PolishedDioriteStairs; - mappings[3] = ItemType.PolishedGranite; - mappings[614] = ItemType.PolishedGraniteSlab; - mappings[596] = ItemType.PolishedGraniteStairs; - mappings[1101] = ItemType.PoppedChorusFruit; - mappings[196] = ItemType.Poppy; - mappings[837] = ItemType.Porkchop; - mappings[1048] = ItemType.Potato; - mappings[953] = ItemType.Potion; - mappings[1224] = ItemType.ArcherPotterySherd; - mappings[1226] = ItemType.ArmsUpPotterySherd; - mappings[1225] = ItemType.PrizePotterySherd; - mappings[1227] = ItemType.SkullPotterySherd; - mappings[867] = ItemType.PowderSnowBucket; - mappings[719] = ItemType.PoweredRail; - mappings[479] = ItemType.Prismarine; - mappings[255] = ItemType.PrismarineBrickSlab; - mappings[483] = ItemType.PrismarineBrickStairs; - mappings[480] = ItemType.PrismarineBricks; - mappings[1067] = ItemType.PrismarineCrystals; - mappings[1066] = ItemType.PrismarineShard; - mappings[254] = ItemType.PrismarineSlab; - mappings[482] = ItemType.PrismarineStairs; - mappings[376] = ItemType.PrismarineWall; - mappings[894] = ItemType.Pufferfish; - mappings[871] = ItemType.PufferfishBucket; - mappings[1006] = ItemType.PufferfishSpawnEgg; - mappings[298] = ItemType.Pumpkin; - mappings[1061] = ItemType.PumpkinPie; - mappings[941] = ItemType.PumpkinSeeds; - mappings[1093] = ItemType.PurpleBanner; - mappings[930] = ItemType.PurpleBed; - mappings[1195] = ItemType.PurpleCandle; - mappings[432] = ItemType.PurpleCarpet; - mappings[541] = ItemType.PurpleConcrete; - mappings[557] = ItemType.PurpleConcretePowder; - mappings[910] = ItemType.PurpleDye; - mappings[525] = ItemType.PurpleGlazedTerracotta; - mappings[509] = ItemType.PurpleShulkerBox; - mappings[457] = ItemType.PurpleStainedGlass; - mappings[473] = ItemType.PurpleStainedGlassPane; - mappings[413] = ItemType.PurpleTerracotta; - mappings[189] = ItemType.PurpleWool; - mappings[271] = ItemType.PurpurBlock; - mappings[272] = ItemType.PurpurPillar; - mappings[253] = ItemType.PurpurSlab; - mappings[273] = ItemType.PurpurStairs; - mappings[763] = ItemType.Quartz; - mappings[399] = ItemType.QuartzBlock; - mappings[400] = ItemType.QuartzBricks; - mappings[401] = ItemType.QuartzPillar; - mappings[250] = ItemType.QuartzSlab; - mappings[402] = ItemType.QuartzStairs; - mappings[1068] = ItemType.Rabbit; - mappings[1071] = ItemType.RabbitFoot; - mappings[1072] = ItemType.RabbitHide; - mappings[1007] = ItemType.RabbitSpawnEgg; - mappings[1070] = ItemType.RabbitStew; - mappings[721] = ItemType.Rail; - mappings[1008] = ItemType.RavagerSpawnEgg; - mappings[767] = ItemType.RawCopper; - mappings[69] = ItemType.RawCopperBlock; - mappings[769] = ItemType.RawGold; - mappings[70] = ItemType.RawGoldBlock; - mappings[765] = ItemType.RawIron; - mappings[68] = ItemType.RawIronBlock; - mappings[885] = ItemType.RecoveryCompass; - mappings[1097] = ItemType.RedBanner; - mappings[934] = ItemType.RedBed; - mappings[1199] = ItemType.RedCandle; - mappings[436] = ItemType.RedCarpet; - mappings[545] = ItemType.RedConcrete; - mappings[561] = ItemType.RedConcretePowder; - mappings[914] = ItemType.RedDye; - mappings[529] = ItemType.RedGlazedTerracotta; - mappings[211] = ItemType.RedMushroom; - mappings[329] = ItemType.RedMushroomBlock; - mappings[624] = ItemType.RedNetherBrickSlab; - mappings[607] = ItemType.RedNetherBrickStairs; - mappings[384] = ItemType.RedNetherBrickWall; - mappings[495] = ItemType.RedNetherBricks; - mappings[46] = ItemType.RedSand; - mappings[486] = ItemType.RedSandstone; - mappings[251] = ItemType.RedSandstoneSlab; - mappings[489] = ItemType.RedSandstoneStairs; - mappings[377] = ItemType.RedSandstoneWall; - mappings[513] = ItemType.RedShulkerBox; - mappings[461] = ItemType.RedStainedGlass; - mappings[477] = ItemType.RedStainedGlassPane; - mappings[417] = ItemType.RedTerracotta; - mappings[200] = ItemType.RedTulip; - mappings[193] = ItemType.RedWool; - mappings[632] = ItemType.Redstone; - mappings[634] = ItemType.RedstoneBlock; - mappings[654] = ItemType.RedstoneLamp; - mappings[56] = ItemType.RedstoneOre; - mappings[633] = ItemType.RedstoneTorch; - mappings[327] = ItemType.ReinforcedDeepslate; - mappings[635] = ItemType.Repeater; - mappings[490] = ItemType.RepeatingCommandBlock; - mappings[1183] = ItemType.RespawnAnchor; - mappings[1222] = ItemType.RibArmorTrimSmithingTemplate; - mappings[18] = ItemType.RootedDirt; - mappings[443] = ItemType.RoseBush; - mappings[947] = ItemType.RottenFlesh; - mappings[723] = ItemType.Saddle; - mappings[892] = ItemType.Salmon; - mappings[872] = ItemType.SalmonBucket; - mappings[1009] = ItemType.SalmonSpawnEgg; - mappings[44] = ItemType.Sand; - mappings[168] = ItemType.Sandstone; - mappings[242] = ItemType.SandstoneSlab; - mappings[356] = ItemType.SandstoneStairs; - mappings[385] = ItemType.SandstoneWall; - mappings[631] = ItemType.Scaffolding; - mappings[347] = ItemType.Sculk; - mappings[349] = ItemType.SculkCatalyst; - mappings[650] = ItemType.SculkSensor; - mappings[350] = ItemType.SculkShrieker; - mappings[348] = ItemType.SculkVein; - mappings[753] = ItemType.TurtleScute; - mappings[485] = ItemType.SeaLantern; - mappings[178] = ItemType.SeaPickle; - mappings[177] = ItemType.Seagrass; - mappings[1213] = ItemType.SentryArmorTrimSmithingTemplate; - mappings[938] = ItemType.Shears; - mappings[1010] = ItemType.SheepSpawnEgg; - mappings[1111] = ItemType.Shield; - mappings[1163] = ItemType.Shroomlight; - mappings[498] = ItemType.ShulkerBox; - mappings[1113] = ItemType.ShulkerShell; - mappings[1011] = ItemType.ShulkerSpawnEgg; - mappings[1012] = ItemType.SilverfishSpawnEgg; - mappings[1014] = ItemType.SkeletonHorseSpawnEgg; - mappings[1053] = ItemType.SkeletonSkull; - mappings[1013] = ItemType.SkeletonSpawnEgg; - mappings[1142] = ItemType.SkullBannerPattern; - mappings[882] = ItemType.SlimeBall; - mappings[639] = ItemType.SlimeBlock; - mappings[1015] = ItemType.SlimeSpawnEgg; - mappings[1201] = ItemType.SmallAmethystBud; - mappings[226] = ItemType.SmallDripleaf; - mappings[1154] = ItemType.SmithingTable; - mappings[1149] = ItemType.Smoker; - mappings[306] = ItemType.SmoothBasalt; - mappings[257] = ItemType.SmoothQuartz; - mappings[621] = ItemType.SmoothQuartzSlab; - mappings[604] = ItemType.SmoothQuartzStairs; - mappings[258] = ItemType.SmoothRedSandstone; - mappings[615] = ItemType.SmoothRedSandstoneSlab; - mappings[597] = ItemType.SmoothRedSandstoneStairs; - mappings[259] = ItemType.SmoothSandstone; - mappings[620] = ItemType.SmoothSandstoneSlab; - mappings[603] = ItemType.SmoothSandstoneStairs; - mappings[260] = ItemType.SmoothStone; - mappings[241] = ItemType.SmoothStoneSlab; - mappings[1016] = ItemType.SnifferSpawnEgg; - mappings[1221] = ItemType.SnoutArmorTrimSmithingTemplate; - mappings[281] = ItemType.Snow; - mappings[283] = ItemType.SnowBlock; - mappings[1017] = ItemType.SnowGolemSpawnEgg; - mappings[868] = ItemType.Snowball; - mappings[1162] = ItemType.SoulCampfire; - mappings[1158] = ItemType.SoulLantern; - mappings[302] = ItemType.SoulSand; - mappings[303] = ItemType.SoulSoil; - mappings[307] = ItemType.SoulTorch; - mappings[274] = ItemType.Spawner; - mappings[1108] = ItemType.SpectralArrow; - mappings[955] = ItemType.SpiderEye; - mappings[1018] = ItemType.SpiderSpawnEgg; - mappings[1223] = ItemType.SpireArmorTrimSmithingTemplate; - mappings[1107] = ItemType.SplashPotion; - mappings[163] = ItemType.Sponge; - mappings[209] = ItemType.SporeBlossom; - mappings[734] = ItemType.SpruceBoat; - mappings[659] = ItemType.SpruceButton; - mappings[735] = ItemType.SpruceChestBoat; - mappings[686] = ItemType.SpruceDoor; - mappings[288] = ItemType.SpruceFence; - mappings[709] = ItemType.SpruceFenceGate; - mappings[854] = ItemType.SpruceHangingSign; - mappings[154] = ItemType.SpruceLeaves; - mappings[110] = ItemType.SpruceLog; - mappings[24] = ItemType.SprucePlanks; - mappings[674] = ItemType.SprucePressurePlate; - mappings[36] = ItemType.SpruceSapling; - mappings[843] = ItemType.SpruceSign; - mappings[229] = ItemType.SpruceSlab; - mappings[360] = ItemType.SpruceStairs; - mappings[698] = ItemType.SpruceTrapdoor; - mappings[144] = ItemType.SpruceWood; - mappings[889] = ItemType.Spyglass; - mappings[1019] = ItemType.SquidSpawnEgg; - mappings[803] = ItemType.Stick; - mappings[638] = ItemType.StickyPiston; - mappings[1] = ItemType.Stone; - mappings[781] = ItemType.StoneAxe; - mappings[247] = ItemType.StoneBrickSlab; - mappings[338] = ItemType.StoneBrickStairs; - mappings[380] = ItemType.StoneBrickWall; - mappings[316] = ItemType.StoneBricks; - mappings[656] = ItemType.StoneButton; - mappings[782] = ItemType.StoneHoe; - mappings[780] = ItemType.StonePickaxe; - mappings[669] = ItemType.StonePressurePlate; - mappings[779] = ItemType.StoneShovel; - mappings[240] = ItemType.StoneSlab; - mappings[602] = ItemType.StoneStairs; - mappings[778] = ItemType.StoneSword; - mappings[1155] = ItemType.Stonecutter; - mappings[1020] = ItemType.StraySpawnEgg; - mappings[1021] = ItemType.StriderSpawnEgg; - mappings[806] = ItemType.String; - mappings[126] = ItemType.StrippedAcaciaLog; - mappings[136] = ItemType.StrippedAcaciaWood; - mappings[142] = ItemType.StrippedBambooBlock; - mappings[124] = ItemType.StrippedBirchLog; - mappings[134] = ItemType.StrippedBirchWood; - mappings[127] = ItemType.StrippedCherryLog; - mappings[137] = ItemType.StrippedCherryWood; - mappings[140] = ItemType.StrippedCrimsonHyphae; - mappings[130] = ItemType.StrippedCrimsonStem; - mappings[128] = ItemType.StrippedDarkOakLog; - mappings[138] = ItemType.StrippedDarkOakWood; - mappings[125] = ItemType.StrippedJungleLog; - mappings[135] = ItemType.StrippedJungleWood; - mappings[129] = ItemType.StrippedMangroveLog; - mappings[139] = ItemType.StrippedMangroveWood; - mappings[122] = ItemType.StrippedOakLog; - mappings[132] = ItemType.StrippedOakWood; - mappings[123] = ItemType.StrippedSpruceLog; - mappings[133] = ItemType.StrippedSpruceWood; - mappings[141] = ItemType.StrippedWarpedHyphae; - mappings[131] = ItemType.StrippedWarpedStem; - mappings[750] = ItemType.StructureBlock; - mappings[497] = ItemType.StructureVoid; - mappings[918] = ItemType.Sugar; - mappings[219] = ItemType.SugarCane; - mappings[441] = ItemType.Sunflower; - mappings[45] = ItemType.SuspiciousSand; - mappings[1138] = ItemType.SuspiciousStew; - mappings[1159] = ItemType.SweetBerries; - mappings[876] = ItemType.TadpoleBucket; - mappings[1022] = ItemType.TadpoleSpawnEgg; - mappings[445] = ItemType.TallGrass; - mappings[646] = ItemType.Target; - mappings[438] = ItemType.Terracotta; - mappings[1220] = ItemType.TideArmorTrimSmithingTemplate; - mappings[166] = ItemType.TintedGlass; - mappings[1109] = ItemType.TippedArrow; - mappings[653] = ItemType.Tnt; - mappings[727] = ItemType.TntMinecart; - mappings[267] = ItemType.Torch; - mappings[208] = ItemType.Torchflower; - mappings[1102] = ItemType.TorchflowerSeeds; - mappings[1112] = ItemType.TotemOfUndying; - mappings[1023] = ItemType.TraderLlamaSpawnEgg; - mappings[652] = ItemType.TrappedChest; - mappings[1133] = ItemType.Trident; - mappings[651] = ItemType.TripwireHook; - mappings[893] = ItemType.TropicalFish; - mappings[874] = ItemType.TropicalFishBucket; - mappings[1024] = ItemType.TropicalFishSpawnEgg; - mappings[574] = ItemType.TubeCoral; - mappings[569] = ItemType.TubeCoralBlock; - mappings[584] = ItemType.TubeCoralFan; - mappings[12] = ItemType.Tuff; - mappings[563] = ItemType.TurtleEgg; - mappings[752] = ItemType.TurtleHelmet; - mappings[1025] = ItemType.TurtleSpawnEgg; - mappings[218] = ItemType.TwistingVines; - mappings[1207] = ItemType.VerdantFroglight; - mappings[1219] = ItemType.VexArmorTrimSmithingTemplate; - mappings[1026] = ItemType.VexSpawnEgg; - mappings[1027] = ItemType.VillagerSpawnEgg; - mappings[1028] = ItemType.VindicatorSpawnEgg; - mappings[335] = ItemType.Vine; - mappings[1029] = ItemType.WanderingTraderSpawnEgg; - mappings[1217] = ItemType.WardArmorTrimSmithingTemplate; - mappings[1030] = ItemType.WardenSpawnEgg; - mappings[668] = ItemType.WarpedButton; - mappings[695] = ItemType.WarpedDoor; - mappings[297] = ItemType.WarpedFence; - mappings[718] = ItemType.WarpedFenceGate; - mappings[213] = ItemType.WarpedFungus; - mappings[730] = ItemType.WarpedFungusOnAStick; - mappings[863] = ItemType.WarpedHangingSign; - mappings[152] = ItemType.WarpedHyphae; - mappings[21] = ItemType.WarpedNylium; - mappings[33] = ItemType.WarpedPlanks; - mappings[683] = ItemType.WarpedPressurePlate; - mappings[215] = ItemType.WarpedRoots; - mappings[852] = ItemType.WarpedSign; - mappings[239] = ItemType.WarpedSlab; - mappings[370] = ItemType.WarpedStairs; - mappings[120] = ItemType.WarpedStem; - mappings[707] = ItemType.WarpedTrapdoor; - mappings[494] = ItemType.WarpedWartBlock; - mappings[865] = ItemType.WaterBucket; - mappings[93] = ItemType.WaxedCopperBlock; - mappings[97] = ItemType.WaxedCutCopper; - mappings[105] = ItemType.WaxedCutCopperSlab; - mappings[101] = ItemType.WaxedCutCopperStairs; - mappings[94] = ItemType.WaxedExposedCopper; - mappings[98] = ItemType.WaxedExposedCutCopper; - mappings[106] = ItemType.WaxedExposedCutCopperSlab; - mappings[102] = ItemType.WaxedExposedCutCopperStairs; - mappings[96] = ItemType.WaxedOxidizedCopper; - mappings[100] = ItemType.WaxedOxidizedCutCopper; - mappings[108] = ItemType.WaxedOxidizedCutCopperSlab; - mappings[104] = ItemType.WaxedOxidizedCutCopperStairs; - mappings[95] = ItemType.WaxedWeatheredCopper; - mappings[99] = ItemType.WaxedWeatheredCutCopper; - mappings[107] = ItemType.WaxedWeatheredCutCopperSlab; - mappings[103] = ItemType.WaxedWeatheredCutCopperStairs; - mappings[79] = ItemType.WeatheredCopper; - mappings[83] = ItemType.WeatheredCutCopper; - mappings[91] = ItemType.WeatheredCutCopperSlab; - mappings[87] = ItemType.WeatheredCutCopperStairs; - mappings[217] = ItemType.WeepingVines; - mappings[164] = ItemType.WetSponge; - mappings[810] = ItemType.Wheat; - mappings[809] = ItemType.WheatSeeds; - mappings[1083] = ItemType.WhiteBanner; - mappings[920] = ItemType.WhiteBed; - mappings[1185] = ItemType.WhiteCandle; - mappings[422] = ItemType.WhiteCarpet; - mappings[531] = ItemType.WhiteConcrete; - mappings[547] = ItemType.WhiteConcretePowder; - mappings[900] = ItemType.WhiteDye; - mappings[515] = ItemType.WhiteGlazedTerracotta; - mappings[499] = ItemType.WhiteShulkerBox; - mappings[447] = ItemType.WhiteStainedGlass; - mappings[463] = ItemType.WhiteStainedGlassPane; - mappings[403] = ItemType.WhiteTerracotta; - mappings[202] = ItemType.WhiteTulip; - mappings[179] = ItemType.WhiteWool; - mappings[1216] = ItemType.WildArmorTrimSmithingTemplate; - mappings[1031] = ItemType.WitchSpawnEgg; - mappings[207] = ItemType.WitherRose; - mappings[1054] = ItemType.WitherSkeletonSkull; - mappings[1033] = ItemType.WitherSkeletonSpawnEgg; - mappings[1032] = ItemType.WitherSpawnEgg; - mappings[1034] = ItemType.WolfSpawnEgg; - mappings[776] = ItemType.WoodenAxe; - mappings[777] = ItemType.WoodenHoe; - mappings[775] = ItemType.WoodenPickaxe; - mappings[774] = ItemType.WoodenShovel; - mappings[773] = ItemType.WoodenSword; - mappings[1042] = ItemType.WritableBook; - mappings[1043] = ItemType.WrittenBook; - mappings[1087] = ItemType.YellowBanner; - mappings[924] = ItemType.YellowBed; - mappings[1189] = ItemType.YellowCandle; - mappings[426] = ItemType.YellowCarpet; - mappings[535] = ItemType.YellowConcrete; - mappings[551] = ItemType.YellowConcretePowder; - mappings[904] = ItemType.YellowDye; - mappings[519] = ItemType.YellowGlazedTerracotta; - mappings[503] = ItemType.YellowShulkerBox; - mappings[451] = ItemType.YellowStainedGlass; - mappings[467] = ItemType.YellowStainedGlassPane; - mappings[407] = ItemType.YellowTerracotta; - mappings[183] = ItemType.YellowWool; - mappings[1035] = ItemType.ZoglinSpawnEgg; - mappings[1056] = ItemType.ZombieHead; - mappings[1037] = ItemType.ZombieHorseSpawnEgg; - mappings[1036] = ItemType.ZombieSpawnEgg; - mappings[1038] = ItemType.ZombieVillagerSpawnEgg; - mappings[1039] = ItemType.ZombifiedPiglinSpawnEgg; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette120.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette120.cs deleted file mode 100644 index 2ca03bed78..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette120.cs +++ /dev/null @@ -1,1273 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public class ItemPalette120 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette120() - { - mappings[744] = ItemType.AcaciaBoat; - mappings[666] = ItemType.AcaciaButton; - mappings[745] = ItemType.AcaciaChestBoat; - mappings[693] = ItemType.AcaciaDoor; - mappings[293] = ItemType.AcaciaFence; - mappings[716] = ItemType.AcaciaFenceGate; - mappings[861] = ItemType.AcaciaHangingSign; - mappings[158] = ItemType.AcaciaLeaves; - mappings[114] = ItemType.AcaciaLog; - mappings[27] = ItemType.AcaciaPlanks; - mappings[681] = ItemType.AcaciaPressurePlate; - mappings[39] = ItemType.AcaciaSapling; - mappings[850] = ItemType.AcaciaSign; - mappings[234] = ItemType.AcaciaSlab; - mappings[365] = ItemType.AcaciaStairs; - mappings[705] = ItemType.AcaciaTrapdoor; - mappings[148] = ItemType.AcaciaWood; - mappings[726] = ItemType.ActivatorRail; - mappings[0] = ItemType.Air; - mappings[967] = ItemType.AllaySpawnEgg; - mappings[199] = ItemType.Allium; - mappings[72] = ItemType.AmethystBlock; - mappings[1210] = ItemType.AmethystCluster; - mappings[768] = ItemType.AmethystShard; - mappings[67] = ItemType.AncientDebris; - mappings[6] = ItemType.Andesite; - mappings[626] = ItemType.AndesiteSlab; - mappings[609] = ItemType.AndesiteStairs; - mappings[385] = ItemType.AndesiteWall; - mappings[1235] = ItemType.AnglerPotterySherd; - mappings[397] = ItemType.Anvil; - mappings[759] = ItemType.Apple; - mappings[1236] = ItemType.ArcherPotterySherd; - mappings[1077] = ItemType.ArmorStand; - mappings[1237] = ItemType.ArmsUpPotterySherd; - mappings[761] = ItemType.Arrow; - mappings[879] = ItemType.AxolotlBucket; - mappings[968] = ItemType.AxolotlSpawnEgg; - mappings[175] = ItemType.Azalea; - mappings[162] = ItemType.AzaleaLeaves; - mappings[200] = ItemType.AzureBluet; - mappings[1053] = ItemType.BakedPotato; - mappings[229] = ItemType.Bamboo; - mappings[122] = ItemType.BambooBlock; - mappings[670] = ItemType.BambooButton; - mappings[753] = ItemType.BambooChestRaft; - mappings[697] = ItemType.BambooDoor; - mappings[297] = ItemType.BambooFence; - mappings[720] = ItemType.BambooFenceGate; - mappings[865] = ItemType.BambooHangingSign; - mappings[34] = ItemType.BambooMosaic; - mappings[239] = ItemType.BambooMosaicSlab; - mappings[370] = ItemType.BambooMosaicStairs; - mappings[31] = ItemType.BambooPlanks; - mappings[685] = ItemType.BambooPressurePlate; - mappings[752] = ItemType.BambooRaft; - mappings[854] = ItemType.BambooSign; - mappings[238] = ItemType.BambooSlab; - mappings[369] = ItemType.BambooStairs; - mappings[709] = ItemType.BambooTrapdoor; - mappings[1154] = ItemType.Barrel; - mappings[421] = ItemType.Barrier; - mappings[306] = ItemType.Basalt; - mappings[969] = ItemType.BatSpawnEgg; - mappings[374] = ItemType.Beacon; - mappings[43] = ItemType.Bedrock; - mappings[1171] = ItemType.BeeNest; - mappings[970] = ItemType.BeeSpawnEgg; - mappings[947] = ItemType.Beef; - mappings[1172] = ItemType.Beehive; - mappings[1108] = ItemType.Beetroot; - mappings[1109] = ItemType.BeetrootSeeds; - mappings[1110] = ItemType.BeetrootSoup; - mappings[1162] = ItemType.Bell; - mappings[227] = ItemType.BigDripleaf; - mappings[740] = ItemType.BirchBoat; - mappings[664] = ItemType.BirchButton; - mappings[741] = ItemType.BirchChestBoat; - mappings[691] = ItemType.BirchDoor; - mappings[291] = ItemType.BirchFence; - mappings[714] = ItemType.BirchFenceGate; - mappings[859] = ItemType.BirchHangingSign; - mappings[156] = ItemType.BirchLeaves; - mappings[112] = ItemType.BirchLog; - mappings[25] = ItemType.BirchPlanks; - mappings[679] = ItemType.BirchPressurePlate; - mappings[37] = ItemType.BirchSapling; - mappings[848] = ItemType.BirchSign; - mappings[232] = ItemType.BirchSlab; - mappings[363] = ItemType.BirchStairs; - mappings[703] = ItemType.BirchTrapdoor; - mappings[146] = ItemType.BirchWood; - mappings[1102] = ItemType.BlackBanner; - mappings[939] = ItemType.BlackBed; - mappings[1206] = ItemType.BlackCandle; - mappings[439] = ItemType.BlackCarpet; - mappings[548] = ItemType.BlackConcrete; - mappings[564] = ItemType.BlackConcretePowder; - mappings[919] = ItemType.BlackDye; - mappings[532] = ItemType.BlackGlazedTerracotta; - mappings[516] = ItemType.BlackShulkerBox; - mappings[464] = ItemType.BlackStainedGlass; - mappings[480] = ItemType.BlackStainedGlassPane; - mappings[420] = ItemType.BlackTerracotta; - mappings[195] = ItemType.BlackWool; - mappings[1177] = ItemType.Blackstone; - mappings[1178] = ItemType.BlackstoneSlab; - mappings[1179] = ItemType.BlackstoneStairs; - mappings[390] = ItemType.BlackstoneWall; - mappings[1238] = ItemType.BladePotterySherd; - mappings[1156] = ItemType.BlastFurnace; - mappings[961] = ItemType.BlazePowder; - mappings[953] = ItemType.BlazeRod; - mappings[971] = ItemType.BlazeSpawnEgg; - mappings[1098] = ItemType.BlueBanner; - mappings[935] = ItemType.BlueBed; - mappings[1202] = ItemType.BlueCandle; - mappings[435] = ItemType.BlueCarpet; - mappings[544] = ItemType.BlueConcrete; - mappings[560] = ItemType.BlueConcretePowder; - mappings[915] = ItemType.BlueDye; - mappings[528] = ItemType.BlueGlazedTerracotta; - mappings[597] = ItemType.BlueIce; - mappings[198] = ItemType.BlueOrchid; - mappings[512] = ItemType.BlueShulkerBox; - mappings[460] = ItemType.BlueStainedGlass; - mappings[476] = ItemType.BlueStainedGlassPane; - mappings[416] = ItemType.BlueTerracotta; - mappings[191] = ItemType.BlueWool; - mappings[921] = ItemType.Bone; - mappings[498] = ItemType.BoneBlock; - mappings[920] = ItemType.BoneMeal; - mappings[885] = ItemType.Book; - mappings[264] = ItemType.Bookshelf; - mappings[760] = ItemType.Bow; - mappings[808] = ItemType.Bowl; - mappings[578] = ItemType.BrainCoral; - mappings[573] = ItemType.BrainCoralBlock; - mappings[588] = ItemType.BrainCoralFan; - mappings[815] = ItemType.Bread; - mappings[1239] = ItemType.BrewerPotterySherd; - mappings[963] = ItemType.BrewingStand; - mappings[881] = ItemType.Brick; - mappings[248] = ItemType.BrickSlab; - mappings[339] = ItemType.BrickStairs; - mappings[377] = ItemType.BrickWall; - mappings[263] = ItemType.Bricks; - mappings[1099] = ItemType.BrownBanner; - mappings[936] = ItemType.BrownBed; - mappings[1203] = ItemType.BrownCandle; - mappings[436] = ItemType.BrownCarpet; - mappings[545] = ItemType.BrownConcrete; - mappings[561] = ItemType.BrownConcretePowder; - mappings[916] = ItemType.BrownDye; - mappings[529] = ItemType.BrownGlazedTerracotta; - mappings[212] = ItemType.BrownMushroom; - mappings[330] = ItemType.BrownMushroomBlock; - mappings[513] = ItemType.BrownShulkerBox; - mappings[461] = ItemType.BrownStainedGlass; - mappings[477] = ItemType.BrownStainedGlassPane; - mappings[417] = ItemType.BrownTerracotta; - mappings[192] = ItemType.BrownWool; - mappings[1217] = ItemType.Brush; - mappings[579] = ItemType.BubbleCoral; - mappings[574] = ItemType.BubbleCoralBlock; - mappings[589] = ItemType.BubbleCoralFan; - mappings[868] = ItemType.Bucket; - mappings[73] = ItemType.BuddingAmethyst; - mappings[890] = ItemType.Bundle; - mappings[1240] = ItemType.BurnPotterySherd; - mappings[286] = ItemType.Cactus; - mappings[923] = ItemType.Cake; - mappings[11] = ItemType.Calcite; - mappings[654] = ItemType.CalibratedSculkSensor; - mappings[973] = ItemType.CamelSpawnEgg; - mappings[1167] = ItemType.Campfire; - mappings[1190] = ItemType.Candle; - mappings[1051] = ItemType.Carrot; - mappings[733] = ItemType.CarrotOnAStick; - mappings[1157] = ItemType.CartographyTable; - mappings[301] = ItemType.CarvedPumpkin; - mappings[972] = ItemType.CatSpawnEgg; - mappings[964] = ItemType.Cauldron; - mappings[974] = ItemType.CaveSpiderSpawnEgg; - mappings[334] = ItemType.Chain; - mappings[493] = ItemType.ChainCommandBlock; - mappings[823] = ItemType.ChainmailBoots; - mappings[821] = ItemType.ChainmailChestplate; - mappings[820] = ItemType.ChainmailHelmet; - mappings[822] = ItemType.ChainmailLeggings; - mappings[763] = ItemType.Charcoal; - mappings[746] = ItemType.CherryBoat; - mappings[667] = ItemType.CherryButton; - mappings[747] = ItemType.CherryChestBoat; - mappings[694] = ItemType.CherryDoor; - mappings[294] = ItemType.CherryFence; - mappings[717] = ItemType.CherryFenceGate; - mappings[862] = ItemType.CherryHangingSign; - mappings[159] = ItemType.CherryLeaves; - mappings[115] = ItemType.CherryLog; - mappings[28] = ItemType.CherryPlanks; - mappings[682] = ItemType.CherryPressurePlate; - mappings[40] = ItemType.CherrySapling; - mappings[851] = ItemType.CherrySign; - mappings[235] = ItemType.CherrySlab; - mappings[366] = ItemType.CherryStairs; - mappings[706] = ItemType.CherryTrapdoor; - mappings[149] = ItemType.CherryWood; - mappings[277] = ItemType.Chest; - mappings[729] = ItemType.ChestMinecart; - mappings[949] = ItemType.Chicken; - mappings[975] = ItemType.ChickenSpawnEgg; - mappings[398] = ItemType.ChippedAnvil; - mappings[265] = ItemType.ChiseledBookshelf; - mappings[328] = ItemType.ChiseledDeepslate; - mappings[346] = ItemType.ChiseledNetherBricks; - mappings[1184] = ItemType.ChiseledPolishedBlackstone; - mappings[400] = ItemType.ChiseledQuartzBlock; - mappings[489] = ItemType.ChiseledRedSandstone; - mappings[170] = ItemType.ChiseledSandstone; - mappings[321] = ItemType.ChiseledStoneBricks; - mappings[272] = ItemType.ChorusFlower; - mappings[1104] = ItemType.ChorusFruit; - mappings[271] = ItemType.ChorusPlant; - mappings[287] = ItemType.Clay; - mappings[882] = ItemType.ClayBall; - mappings[892] = ItemType.Clock; - mappings[762] = ItemType.Coal; - mappings[68] = ItemType.CoalBlock; - mappings[49] = ItemType.CoalOre; - mappings[16] = ItemType.CoarseDirt; - mappings[1221] = ItemType.CoastArmorTrimSmithingTemplate; - mappings[9] = ItemType.CobbledDeepslate; - mappings[630] = ItemType.CobbledDeepslateSlab; - mappings[613] = ItemType.CobbledDeepslateStairs; - mappings[393] = ItemType.CobbledDeepslateWall; - mappings[22] = ItemType.Cobblestone; - mappings[247] = ItemType.CobblestoneSlab; - mappings[282] = ItemType.CobblestoneStairs; - mappings[375] = ItemType.CobblestoneWall; - mappings[172] = ItemType.Cobweb; - mappings[903] = ItemType.CocoaBeans; - mappings[895] = ItemType.Cod; - mappings[877] = ItemType.CodBucket; - mappings[976] = ItemType.CodSpawnEgg; - mappings[373] = ItemType.CommandBlock; - mappings[1084] = ItemType.CommandBlockMinecart; - mappings[639] = ItemType.Comparator; - mappings[888] = ItemType.Compass; - mappings[1153] = ItemType.Composter; - mappings[598] = ItemType.Conduit; - mappings[948] = ItemType.CookedBeef; - mappings[950] = ItemType.CookedChicken; - mappings[899] = ItemType.CookedCod; - mappings[1086] = ItemType.CookedMutton; - mappings[842] = ItemType.CookedPorkchop; - mappings[1073] = ItemType.CookedRabbit; - mappings[900] = ItemType.CookedSalmon; - mappings[940] = ItemType.Cookie; - mappings[75] = ItemType.CopperBlock; - mappings[772] = ItemType.CopperIngot; - mappings[53] = ItemType.CopperOre; - mappings[206] = ItemType.Cornflower; - mappings[977] = ItemType.CowSpawnEgg; - mappings[325] = ItemType.CrackedDeepslateBricks; - mappings[327] = ItemType.CrackedDeepslateTiles; - mappings[345] = ItemType.CrackedNetherBricks; - mappings[1188] = ItemType.CrackedPolishedBlackstoneBricks; - mappings[320] = ItemType.CrackedStoneBricks; - mappings[278] = ItemType.CraftingTable; - mappings[1147] = ItemType.CreeperBannerPattern; - mappings[1061] = ItemType.CreeperHead; - mappings[978] = ItemType.CreeperSpawnEgg; - mappings[671] = ItemType.CrimsonButton; - mappings[698] = ItemType.CrimsonDoor; - mappings[298] = ItemType.CrimsonFence; - mappings[721] = ItemType.CrimsonFenceGate; - mappings[214] = ItemType.CrimsonFungus; - mappings[866] = ItemType.CrimsonHangingSign; - mappings[152] = ItemType.CrimsonHyphae; - mappings[20] = ItemType.CrimsonNylium; - mappings[32] = ItemType.CrimsonPlanks; - mappings[686] = ItemType.CrimsonPressurePlate; - mappings[216] = ItemType.CrimsonRoots; - mappings[855] = ItemType.CrimsonSign; - mappings[240] = ItemType.CrimsonSlab; - mappings[371] = ItemType.CrimsonStairs; - mappings[120] = ItemType.CrimsonStem; - mappings[710] = ItemType.CrimsonTrapdoor; - mappings[1143] = ItemType.Crossbow; - mappings[1176] = ItemType.CryingObsidian; - mappings[82] = ItemType.CutCopper; - mappings[90] = ItemType.CutCopperSlab; - mappings[86] = ItemType.CutCopperStairs; - mappings[490] = ItemType.CutRedSandstone; - mappings[254] = ItemType.CutRedSandstoneSlab; - mappings[171] = ItemType.CutSandstone; - mappings[245] = ItemType.CutSandstoneSlab; - mappings[1096] = ItemType.CyanBanner; - mappings[933] = ItemType.CyanBed; - mappings[1200] = ItemType.CyanCandle; - mappings[433] = ItemType.CyanCarpet; - mappings[542] = ItemType.CyanConcrete; - mappings[558] = ItemType.CyanConcretePowder; - mappings[913] = ItemType.CyanDye; - mappings[526] = ItemType.CyanGlazedTerracotta; - mappings[510] = ItemType.CyanShulkerBox; - mappings[458] = ItemType.CyanStainedGlass; - mappings[474] = ItemType.CyanStainedGlassPane; - mappings[414] = ItemType.CyanTerracotta; - mappings[189] = ItemType.CyanWool; - mappings[399] = ItemType.DamagedAnvil; - mappings[196] = ItemType.Dandelion; - mappings[1241] = ItemType.DangerPotterySherd; - mappings[748] = ItemType.DarkOakBoat; - mappings[668] = ItemType.DarkOakButton; - mappings[749] = ItemType.DarkOakChestBoat; - mappings[695] = ItemType.DarkOakDoor; - mappings[295] = ItemType.DarkOakFence; - mappings[718] = ItemType.DarkOakFenceGate; - mappings[863] = ItemType.DarkOakHangingSign; - mappings[160] = ItemType.DarkOakLeaves; - mappings[116] = ItemType.DarkOakLog; - mappings[29] = ItemType.DarkOakPlanks; - mappings[683] = ItemType.DarkOakPressurePlate; - mappings[41] = ItemType.DarkOakSapling; - mappings[852] = ItemType.DarkOakSign; - mappings[236] = ItemType.DarkOakSlab; - mappings[367] = ItemType.DarkOakStairs; - mappings[707] = ItemType.DarkOakTrapdoor; - mappings[150] = ItemType.DarkOakWood; - mappings[483] = ItemType.DarkPrismarine; - mappings[258] = ItemType.DarkPrismarineSlab; - mappings[486] = ItemType.DarkPrismarineStairs; - mappings[652] = ItemType.DaylightDetector; - mappings[582] = ItemType.DeadBrainCoral; - mappings[568] = ItemType.DeadBrainCoralBlock; - mappings[593] = ItemType.DeadBrainCoralFan; - mappings[583] = ItemType.DeadBubbleCoral; - mappings[569] = ItemType.DeadBubbleCoralBlock; - mappings[594] = ItemType.DeadBubbleCoralFan; - mappings[177] = ItemType.DeadBush; - mappings[584] = ItemType.DeadFireCoral; - mappings[570] = ItemType.DeadFireCoralBlock; - mappings[595] = ItemType.DeadFireCoralFan; - mappings[585] = ItemType.DeadHornCoral; - mappings[571] = ItemType.DeadHornCoralBlock; - mappings[596] = ItemType.DeadHornCoralFan; - mappings[586] = ItemType.DeadTubeCoral; - mappings[567] = ItemType.DeadTubeCoralBlock; - mappings[592] = ItemType.DeadTubeCoralFan; - mappings[1121] = ItemType.DebugStick; - mappings[266] = ItemType.DecoratedPot; - mappings[8] = ItemType.Deepslate; - mappings[632] = ItemType.DeepslateBrickSlab; - mappings[615] = ItemType.DeepslateBrickStairs; - mappings[395] = ItemType.DeepslateBrickWall; - mappings[324] = ItemType.DeepslateBricks; - mappings[50] = ItemType.DeepslateCoalOre; - mappings[54] = ItemType.DeepslateCopperOre; - mappings[64] = ItemType.DeepslateDiamondOre; - mappings[60] = ItemType.DeepslateEmeraldOre; - mappings[56] = ItemType.DeepslateGoldOre; - mappings[52] = ItemType.DeepslateIronOre; - mappings[62] = ItemType.DeepslateLapisOre; - mappings[58] = ItemType.DeepslateRedstoneOre; - mappings[633] = ItemType.DeepslateTileSlab; - mappings[616] = ItemType.DeepslateTileStairs; - mappings[396] = ItemType.DeepslateTileWall; - mappings[326] = ItemType.DeepslateTiles; - mappings[724] = ItemType.DetectorRail; - mappings[764] = ItemType.Diamond; - mappings[800] = ItemType.DiamondAxe; - mappings[77] = ItemType.DiamondBlock; - mappings[831] = ItemType.DiamondBoots; - mappings[829] = ItemType.DiamondChestplate; - mappings[828] = ItemType.DiamondHelmet; - mappings[801] = ItemType.DiamondHoe; - mappings[1080] = ItemType.DiamondHorseArmor; - mappings[830] = ItemType.DiamondLeggings; - mappings[63] = ItemType.DiamondOre; - mappings[799] = ItemType.DiamondPickaxe; - mappings[798] = ItemType.DiamondShovel; - mappings[797] = ItemType.DiamondSword; - mappings[4] = ItemType.Diorite; - mappings[629] = ItemType.DioriteSlab; - mappings[612] = ItemType.DioriteStairs; - mappings[389] = ItemType.DioriteWall; - mappings[15] = ItemType.Dirt; - mappings[442] = ItemType.DirtPath; - mappings[1138] = ItemType.DiscFragment5; - mappings[646] = ItemType.Dispenser; - mappings[979] = ItemType.DolphinSpawnEgg; - mappings[980] = ItemType.DonkeySpawnEgg; - mappings[1111] = ItemType.DragonBreath; - mappings[357] = ItemType.DragonEgg; - mappings[1062] = ItemType.DragonHead; - mappings[944] = ItemType.DriedKelp; - mappings[883] = ItemType.DriedKelpBlock; - mappings[13] = ItemType.DripstoneBlock; - mappings[647] = ItemType.Dropper; - mappings[981] = ItemType.DrownedSpawnEgg; - mappings[1220] = ItemType.DuneArmorTrimSmithingTemplate; - mappings[1216] = ItemType.EchoShard; - mappings[887] = ItemType.Egg; - mappings[982] = ItemType.ElderGuardianSpawnEgg; - mappings[735] = ItemType.Elytra; - mappings[765] = ItemType.Emerald; - mappings[360] = ItemType.EmeraldBlock; - mappings[59] = ItemType.EmeraldOre; - mappings[1068] = ItemType.EnchantedBook; - mappings[845] = ItemType.EnchantedGoldenApple; - mappings[353] = ItemType.EnchantingTable; - mappings[1103] = ItemType.EndCrystal; - mappings[354] = ItemType.EndPortalFrame; - mappings[270] = ItemType.EndRod; - mappings[355] = ItemType.EndStone; - mappings[622] = ItemType.EndStoneBrickSlab; - mappings[604] = ItemType.EndStoneBrickStairs; - mappings[388] = ItemType.EndStoneBrickWall; - mappings[356] = ItemType.EndStoneBricks; - mappings[359] = ItemType.EnderChest; - mappings[983] = ItemType.EnderDragonSpawnEgg; - mappings[965] = ItemType.EnderEye; - mappings[952] = ItemType.EnderPearl; - mappings[984] = ItemType.EndermanSpawnEgg; - mappings[985] = ItemType.EndermiteSpawnEgg; - mappings[986] = ItemType.EvokerSpawnEgg; - mappings[1044] = ItemType.ExperienceBottle; - mappings[1242] = ItemType.ExplorerPotterySherd; - mappings[79] = ItemType.ExposedCopper; - mappings[83] = ItemType.ExposedCutCopper; - mappings[91] = ItemType.ExposedCutCopperSlab; - mappings[87] = ItemType.ExposedCutCopperStairs; - mappings[1224] = ItemType.EyeArmorTrimSmithingTemplate; - mappings[279] = ItemType.Farmland; - mappings[811] = ItemType.Feather; - mappings[960] = ItemType.FermentedSpiderEye; - mappings[174] = ItemType.Fern; - mappings[941] = ItemType.FilledMap; - mappings[1045] = ItemType.FireCharge; - mappings[580] = ItemType.FireCoral; - mappings[575] = ItemType.FireCoralBlock; - mappings[590] = ItemType.FireCoralFan; - mappings[1066] = ItemType.FireworkRocket; - mappings[1067] = ItemType.FireworkStar; - mappings[891] = ItemType.FishingRod; - mappings[1158] = ItemType.FletchingTable; - mappings[840] = ItemType.Flint; - mappings[758] = ItemType.FlintAndSteel; - mappings[1146] = ItemType.FlowerBannerPattern; - mappings[1050] = ItemType.FlowerPot; - mappings[176] = ItemType.FloweringAzalea; - mappings[163] = ItemType.FloweringAzaleaLeaves; - mappings[987] = ItemType.FoxSpawnEgg; - mappings[1243] = ItemType.FriendPotterySherd; - mappings[988] = ItemType.FrogSpawnEgg; - mappings[1215] = ItemType.Frogspawn; - mappings[280] = ItemType.Furnace; - mappings[730] = ItemType.FurnaceMinecart; - mappings[989] = ItemType.GhastSpawnEgg; - mappings[954] = ItemType.GhastTear; - mappings[1180] = ItemType.GildedBlackstone; - mappings[166] = ItemType.Glass; - mappings[958] = ItemType.GlassBottle; - mappings[335] = ItemType.GlassPane; - mappings[966] = ItemType.GlisteringMelonSlice; - mappings[1150] = ItemType.GlobeBannerPattern; - mappings[1166] = ItemType.GlowBerries; - mappings[902] = ItemType.GlowInkSac; - mappings[1049] = ItemType.GlowItemFrame; - mappings[338] = ItemType.GlowLichen; - mappings[990] = ItemType.GlowSquidSpawnEgg; - mappings[310] = ItemType.Glowstone; - mappings[894] = ItemType.GlowstoneDust; - mappings[1152] = ItemType.GoatHorn; - mappings[991] = ItemType.GoatSpawnEgg; - mappings[76] = ItemType.GoldBlock; - mappings[774] = ItemType.GoldIngot; - mappings[955] = ItemType.GoldNugget; - mappings[55] = ItemType.GoldOre; - mappings[844] = ItemType.GoldenApple; - mappings[790] = ItemType.GoldenAxe; - mappings[835] = ItemType.GoldenBoots; - mappings[1056] = ItemType.GoldenCarrot; - mappings[833] = ItemType.GoldenChestplate; - mappings[832] = ItemType.GoldenHelmet; - mappings[791] = ItemType.GoldenHoe; - mappings[1079] = ItemType.GoldenHorseArmor; - mappings[834] = ItemType.GoldenLeggings; - mappings[789] = ItemType.GoldenPickaxe; - mappings[788] = ItemType.GoldenShovel; - mappings[787] = ItemType.GoldenSword; - mappings[2] = ItemType.Granite; - mappings[625] = ItemType.GraniteSlab; - mappings[608] = ItemType.GraniteStairs; - mappings[381] = ItemType.GraniteWall; - mappings[173] = ItemType.ShortGrass; - mappings[14] = ItemType.GrassBlock; - mappings[48] = ItemType.Gravel; - mappings[1094] = ItemType.GrayBanner; - mappings[931] = ItemType.GrayBed; - mappings[1198] = ItemType.GrayCandle; - mappings[431] = ItemType.GrayCarpet; - mappings[540] = ItemType.GrayConcrete; - mappings[556] = ItemType.GrayConcretePowder; - mappings[911] = ItemType.GrayDye; - mappings[524] = ItemType.GrayGlazedTerracotta; - mappings[508] = ItemType.GrayShulkerBox; - mappings[456] = ItemType.GrayStainedGlass; - mappings[472] = ItemType.GrayStainedGlassPane; - mappings[412] = ItemType.GrayTerracotta; - mappings[187] = ItemType.GrayWool; - mappings[1100] = ItemType.GreenBanner; - mappings[937] = ItemType.GreenBed; - mappings[1204] = ItemType.GreenCandle; - mappings[437] = ItemType.GreenCarpet; - mappings[546] = ItemType.GreenConcrete; - mappings[562] = ItemType.GreenConcretePowder; - mappings[917] = ItemType.GreenDye; - mappings[530] = ItemType.GreenGlazedTerracotta; - mappings[514] = ItemType.GreenShulkerBox; - mappings[462] = ItemType.GreenStainedGlass; - mappings[478] = ItemType.GreenStainedGlassPane; - mappings[418] = ItemType.GreenTerracotta; - mappings[193] = ItemType.GreenWool; - mappings[1159] = ItemType.Grindstone; - mappings[992] = ItemType.GuardianSpawnEgg; - mappings[812] = ItemType.Gunpowder; - mappings[226] = ItemType.HangingRoots; - mappings[423] = ItemType.HayBlock; - mappings[1142] = ItemType.HeartOfTheSea; - mappings[1244] = ItemType.HeartPotterySherd; - mappings[1245] = ItemType.HeartbreakPotterySherd; - mappings[676] = ItemType.HeavyWeightedPressurePlate; - mappings[993] = ItemType.HoglinSpawnEgg; - mappings[643] = ItemType.HoneyBlock; - mappings[1173] = ItemType.HoneyBottle; - mappings[1170] = ItemType.Honeycomb; - mappings[1174] = ItemType.HoneycombBlock; - mappings[645] = ItemType.Hopper; - mappings[732] = ItemType.HopperMinecart; - mappings[581] = ItemType.HornCoral; - mappings[576] = ItemType.HornCoralBlock; - mappings[591] = ItemType.HornCoralFan; - mappings[994] = ItemType.HorseSpawnEgg; - mappings[1234] = ItemType.HostArmorTrimSmithingTemplate; - mappings[1246] = ItemType.HowlPotterySherd; - mappings[995] = ItemType.HuskSpawnEgg; - mappings[284] = ItemType.Ice; - mappings[316] = ItemType.InfestedChiseledStoneBricks; - mappings[312] = ItemType.InfestedCobblestone; - mappings[315] = ItemType.InfestedCrackedStoneBricks; - mappings[317] = ItemType.InfestedDeepslate; - mappings[314] = ItemType.InfestedMossyStoneBricks; - mappings[311] = ItemType.InfestedStone; - mappings[313] = ItemType.InfestedStoneBricks; - mappings[901] = ItemType.InkSac; - mappings[795] = ItemType.IronAxe; - mappings[333] = ItemType.IronBars; - mappings[74] = ItemType.IronBlock; - mappings[827] = ItemType.IronBoots; - mappings[825] = ItemType.IronChestplate; - mappings[688] = ItemType.IronDoor; - mappings[996] = ItemType.IronGolemSpawnEgg; - mappings[824] = ItemType.IronHelmet; - mappings[796] = ItemType.IronHoe; - mappings[1078] = ItemType.IronHorseArmor; - mappings[770] = ItemType.IronIngot; - mappings[826] = ItemType.IronLeggings; - mappings[1119] = ItemType.IronNugget; - mappings[51] = ItemType.IronOre; - mappings[794] = ItemType.IronPickaxe; - mappings[793] = ItemType.IronShovel; - mappings[792] = ItemType.IronSword; - mappings[700] = ItemType.IronTrapdoor; - mappings[1048] = ItemType.ItemFrame; - mappings[302] = ItemType.JackOLantern; - mappings[755] = ItemType.Jigsaw; - mappings[288] = ItemType.Jukebox; - mappings[742] = ItemType.JungleBoat; - mappings[665] = ItemType.JungleButton; - mappings[743] = ItemType.JungleChestBoat; - mappings[692] = ItemType.JungleDoor; - mappings[292] = ItemType.JungleFence; - mappings[715] = ItemType.JungleFenceGate; - mappings[860] = ItemType.JungleHangingSign; - mappings[157] = ItemType.JungleLeaves; - mappings[113] = ItemType.JungleLog; - mappings[26] = ItemType.JunglePlanks; - mappings[680] = ItemType.JunglePressurePlate; - mappings[38] = ItemType.JungleSapling; - mappings[849] = ItemType.JungleSign; - mappings[233] = ItemType.JungleSlab; - mappings[364] = ItemType.JungleStairs; - mappings[704] = ItemType.JungleTrapdoor; - mappings[147] = ItemType.JungleWood; - mappings[222] = ItemType.Kelp; - mappings[1120] = ItemType.KnowledgeBook; - mappings[281] = ItemType.Ladder; - mappings[1163] = ItemType.Lantern; - mappings[168] = ItemType.LapisBlock; - mappings[766] = ItemType.LapisLazuli; - mappings[61] = ItemType.LapisOre; - mappings[1209] = ItemType.LargeAmethystBud; - mappings[448] = ItemType.LargeFern; - mappings[870] = ItemType.LavaBucket; - mappings[1082] = ItemType.Lead; - mappings[873] = ItemType.Leather; - mappings[819] = ItemType.LeatherBoots; - mappings[817] = ItemType.LeatherChestplate; - mappings[816] = ItemType.LeatherHelmet; - mappings[1081] = ItemType.LeatherHorseArmor; - mappings[818] = ItemType.LeatherLeggings; - mappings[648] = ItemType.Lectern; - mappings[650] = ItemType.Lever; - mappings[422] = ItemType.Light; - mappings[1090] = ItemType.LightBlueBanner; - mappings[927] = ItemType.LightBlueBed; - mappings[1194] = ItemType.LightBlueCandle; - mappings[427] = ItemType.LightBlueCarpet; - mappings[536] = ItemType.LightBlueConcrete; - mappings[552] = ItemType.LightBlueConcretePowder; - mappings[907] = ItemType.LightBlueDye; - mappings[520] = ItemType.LightBlueGlazedTerracotta; - mappings[504] = ItemType.LightBlueShulkerBox; - mappings[452] = ItemType.LightBlueStainedGlass; - mappings[468] = ItemType.LightBlueStainedGlassPane; - mappings[408] = ItemType.LightBlueTerracotta; - mappings[183] = ItemType.LightBlueWool; - mappings[1095] = ItemType.LightGrayBanner; - mappings[932] = ItemType.LightGrayBed; - mappings[1199] = ItemType.LightGrayCandle; - mappings[432] = ItemType.LightGrayCarpet; - mappings[541] = ItemType.LightGrayConcrete; - mappings[557] = ItemType.LightGrayConcretePowder; - mappings[912] = ItemType.LightGrayDye; - mappings[525] = ItemType.LightGrayGlazedTerracotta; - mappings[509] = ItemType.LightGrayShulkerBox; - mappings[457] = ItemType.LightGrayStainedGlass; - mappings[473] = ItemType.LightGrayStainedGlassPane; - mappings[413] = ItemType.LightGrayTerracotta; - mappings[188] = ItemType.LightGrayWool; - mappings[675] = ItemType.LightWeightedPressurePlate; - mappings[651] = ItemType.LightningRod; - mappings[444] = ItemType.Lilac; - mappings[207] = ItemType.LilyOfTheValley; - mappings[343] = ItemType.LilyPad; - mappings[1092] = ItemType.LimeBanner; - mappings[929] = ItemType.LimeBed; - mappings[1196] = ItemType.LimeCandle; - mappings[429] = ItemType.LimeCarpet; - mappings[538] = ItemType.LimeConcrete; - mappings[554] = ItemType.LimeConcretePowder; - mappings[909] = ItemType.LimeDye; - mappings[522] = ItemType.LimeGlazedTerracotta; - mappings[506] = ItemType.LimeShulkerBox; - mappings[454] = ItemType.LimeStainedGlass; - mappings[470] = ItemType.LimeStainedGlassPane; - mappings[410] = ItemType.LimeTerracotta; - mappings[185] = ItemType.LimeWool; - mappings[1115] = ItemType.LingeringPotion; - mappings[997] = ItemType.LlamaSpawnEgg; - mappings[1175] = ItemType.Lodestone; - mappings[1145] = ItemType.Loom; - mappings[1089] = ItemType.MagentaBanner; - mappings[926] = ItemType.MagentaBed; - mappings[1193] = ItemType.MagentaCandle; - mappings[426] = ItemType.MagentaCarpet; - mappings[535] = ItemType.MagentaConcrete; - mappings[551] = ItemType.MagentaConcretePowder; - mappings[906] = ItemType.MagentaDye; - mappings[519] = ItemType.MagentaGlazedTerracotta; - mappings[503] = ItemType.MagentaShulkerBox; - mappings[451] = ItemType.MagentaStainedGlass; - mappings[467] = ItemType.MagentaStainedGlassPane; - mappings[407] = ItemType.MagentaTerracotta; - mappings[182] = ItemType.MagentaWool; - mappings[494] = ItemType.MagmaBlock; - mappings[962] = ItemType.MagmaCream; - mappings[998] = ItemType.MagmaCubeSpawnEgg; - mappings[750] = ItemType.MangroveBoat; - mappings[669] = ItemType.MangroveButton; - mappings[751] = ItemType.MangroveChestBoat; - mappings[696] = ItemType.MangroveDoor; - mappings[296] = ItemType.MangroveFence; - mappings[719] = ItemType.MangroveFenceGate; - mappings[864] = ItemType.MangroveHangingSign; - mappings[161] = ItemType.MangroveLeaves; - mappings[117] = ItemType.MangroveLog; - mappings[30] = ItemType.MangrovePlanks; - mappings[684] = ItemType.MangrovePressurePlate; - mappings[42] = ItemType.MangrovePropagule; - mappings[118] = ItemType.MangroveRoots; - mappings[853] = ItemType.MangroveSign; - mappings[237] = ItemType.MangroveSlab; - mappings[368] = ItemType.MangroveStairs; - mappings[708] = ItemType.MangroveTrapdoor; - mappings[151] = ItemType.MangroveWood; - mappings[1055] = ItemType.Map; - mappings[1208] = ItemType.MediumAmethystBud; - mappings[336] = ItemType.Melon; - mappings[946] = ItemType.MelonSeeds; - mappings[943] = ItemType.MelonSlice; - mappings[874] = ItemType.MilkBucket; - mappings[728] = ItemType.Minecart; - mappings[1247] = ItemType.MinerPotterySherd; - mappings[1149] = ItemType.MojangBannerPattern; - mappings[999] = ItemType.MooshroomSpawnEgg; - mappings[225] = ItemType.MossBlock; - mappings[223] = ItemType.MossCarpet; - mappings[267] = ItemType.MossyCobblestone; - mappings[621] = ItemType.MossyCobblestoneSlab; - mappings[603] = ItemType.MossyCobblestoneStairs; - mappings[376] = ItemType.MossyCobblestoneWall; - mappings[619] = ItemType.MossyStoneBrickSlab; - mappings[601] = ItemType.MossyStoneBrickStairs; - mappings[380] = ItemType.MossyStoneBrickWall; - mappings[319] = ItemType.MossyStoneBricks; - mappings[1248] = ItemType.MournerPotterySherd; - mappings[19] = ItemType.Mud; - mappings[250] = ItemType.MudBrickSlab; - mappings[341] = ItemType.MudBrickStairs; - mappings[383] = ItemType.MudBrickWall; - mappings[323] = ItemType.MudBricks; - mappings[119] = ItemType.MuddyMangroveRoots; - mappings[1000] = ItemType.MuleSpawnEgg; - mappings[332] = ItemType.MushroomStem; - mappings[809] = ItemType.MushroomStew; - mappings[1132] = ItemType.MusicDisc11; - mappings[1122] = ItemType.MusicDisc13; - mappings[1136] = ItemType.MusicDisc5; - mappings[1124] = ItemType.MusicDiscBlocks; - mappings[1123] = ItemType.MusicDiscCat; - mappings[1125] = ItemType.MusicDiscChirp; - mappings[1126] = ItemType.MusicDiscFar; - mappings[1127] = ItemType.MusicDiscMall; - mappings[1128] = ItemType.MusicDiscMellohi; - mappings[1134] = ItemType.MusicDiscOtherside; - mappings[1137] = ItemType.MusicDiscPigstep; - mappings[1135] = ItemType.MusicDiscRelic; - mappings[1129] = ItemType.MusicDiscStal; - mappings[1130] = ItemType.MusicDiscStrad; - mappings[1133] = ItemType.MusicDiscWait; - mappings[1131] = ItemType.MusicDiscWard; - mappings[1085] = ItemType.Mutton; - mappings[342] = ItemType.Mycelium; - mappings[1083] = ItemType.NameTag; - mappings[1141] = ItemType.NautilusShell; - mappings[1069] = ItemType.NetherBrick; - mappings[347] = ItemType.NetherBrickFence; - mappings[251] = ItemType.NetherBrickSlab; - mappings[348] = ItemType.NetherBrickStairs; - mappings[384] = ItemType.NetherBrickWall; - mappings[344] = ItemType.NetherBricks; - mappings[65] = ItemType.NetherGoldOre; - mappings[66] = ItemType.NetherQuartzOre; - mappings[218] = ItemType.NetherSprouts; - mappings[1064] = ItemType.NetherStar; - mappings[956] = ItemType.NetherWart; - mappings[495] = ItemType.NetherWartBlock; - mappings[805] = ItemType.NetheriteAxe; - mappings[78] = ItemType.NetheriteBlock; - mappings[839] = ItemType.NetheriteBoots; - mappings[837] = ItemType.NetheriteChestplate; - mappings[836] = ItemType.NetheriteHelmet; - mappings[806] = ItemType.NetheriteHoe; - mappings[775] = ItemType.NetheriteIngot; - mappings[838] = ItemType.NetheriteLeggings; - mappings[804] = ItemType.NetheritePickaxe; - mappings[776] = ItemType.NetheriteScrap; - mappings[803] = ItemType.NetheriteShovel; - mappings[802] = ItemType.NetheriteSword; - mappings[1218] = ItemType.NetheriteUpgradeSmithingTemplate; - mappings[303] = ItemType.Netherrack; - mappings[659] = ItemType.NoteBlock; - mappings[736] = ItemType.OakBoat; - mappings[662] = ItemType.OakButton; - mappings[737] = ItemType.OakChestBoat; - mappings[689] = ItemType.OakDoor; - mappings[289] = ItemType.OakFence; - mappings[712] = ItemType.OakFenceGate; - mappings[857] = ItemType.OakHangingSign; - mappings[154] = ItemType.OakLeaves; - mappings[110] = ItemType.OakLog; - mappings[23] = ItemType.OakPlanks; - mappings[677] = ItemType.OakPressurePlate; - mappings[35] = ItemType.OakSapling; - mappings[846] = ItemType.OakSign; - mappings[230] = ItemType.OakSlab; - mappings[361] = ItemType.OakStairs; - mappings[701] = ItemType.OakTrapdoor; - mappings[144] = ItemType.OakWood; - mappings[644] = ItemType.Observer; - mappings[268] = ItemType.Obsidian; - mappings[1001] = ItemType.OcelotSpawnEgg; - mappings[1212] = ItemType.OchreFroglight; - mappings[1088] = ItemType.OrangeBanner; - mappings[925] = ItemType.OrangeBed; - mappings[1192] = ItemType.OrangeCandle; - mappings[425] = ItemType.OrangeCarpet; - mappings[534] = ItemType.OrangeConcrete; - mappings[550] = ItemType.OrangeConcretePowder; - mappings[905] = ItemType.OrangeDye; - mappings[518] = ItemType.OrangeGlazedTerracotta; - mappings[502] = ItemType.OrangeShulkerBox; - mappings[450] = ItemType.OrangeStainedGlass; - mappings[466] = ItemType.OrangeStainedGlassPane; - mappings[406] = ItemType.OrangeTerracotta; - mappings[202] = ItemType.OrangeTulip; - mappings[181] = ItemType.OrangeWool; - mappings[205] = ItemType.OxeyeDaisy; - mappings[81] = ItemType.OxidizedCopper; - mappings[85] = ItemType.OxidizedCutCopper; - mappings[93] = ItemType.OxidizedCutCopperSlab; - mappings[89] = ItemType.OxidizedCutCopperStairs; - mappings[441] = ItemType.PackedIce; - mappings[322] = ItemType.PackedMud; - mappings[843] = ItemType.Painting; - mappings[1002] = ItemType.PandaSpawnEgg; - mappings[884] = ItemType.Paper; - mappings[1003] = ItemType.ParrotSpawnEgg; - mappings[1214] = ItemType.PearlescentFroglight; - mappings[446] = ItemType.Peony; - mappings[246] = ItemType.PetrifiedOakSlab; - mappings[1140] = ItemType.PhantomMembrane; - mappings[1004] = ItemType.PhantomSpawnEgg; - mappings[1005] = ItemType.PigSpawnEgg; - mappings[1151] = ItemType.PiglinBannerPattern; - mappings[1007] = ItemType.PiglinBruteSpawnEgg; - mappings[1063] = ItemType.PiglinHead; - mappings[1006] = ItemType.PiglinSpawnEgg; - mappings[1008] = ItemType.PillagerSpawnEgg; - mappings[1093] = ItemType.PinkBanner; - mappings[930] = ItemType.PinkBed; - mappings[1197] = ItemType.PinkCandle; - mappings[430] = ItemType.PinkCarpet; - mappings[539] = ItemType.PinkConcrete; - mappings[555] = ItemType.PinkConcretePowder; - mappings[910] = ItemType.PinkDye; - mappings[523] = ItemType.PinkGlazedTerracotta; - mappings[224] = ItemType.PinkPetals; - mappings[507] = ItemType.PinkShulkerBox; - mappings[455] = ItemType.PinkStainedGlass; - mappings[471] = ItemType.PinkStainedGlassPane; - mappings[411] = ItemType.PinkTerracotta; - mappings[204] = ItemType.PinkTulip; - mappings[186] = ItemType.PinkWool; - mappings[640] = ItemType.Piston; - mappings[210] = ItemType.PitcherPlant; - mappings[1107] = ItemType.PitcherPod; - mappings[1059] = ItemType.PlayerHead; - mappings[1249] = ItemType.PlentyPotterySherd; - mappings[17] = ItemType.Podzol; - mappings[1211] = ItemType.PointedDripstone; - mappings[1054] = ItemType.PoisonousPotato; - mappings[1009] = ItemType.PolarBearSpawnEgg; - mappings[7] = ItemType.PolishedAndesite; - mappings[628] = ItemType.PolishedAndesiteSlab; - mappings[611] = ItemType.PolishedAndesiteStairs; - mappings[307] = ItemType.PolishedBasalt; - mappings[1181] = ItemType.PolishedBlackstone; - mappings[1186] = ItemType.PolishedBlackstoneBrickSlab; - mappings[1187] = ItemType.PolishedBlackstoneBrickStairs; - mappings[392] = ItemType.PolishedBlackstoneBrickWall; - mappings[1185] = ItemType.PolishedBlackstoneBricks; - mappings[661] = ItemType.PolishedBlackstoneButton; - mappings[674] = ItemType.PolishedBlackstonePressurePlate; - mappings[1182] = ItemType.PolishedBlackstoneSlab; - mappings[1183] = ItemType.PolishedBlackstoneStairs; - mappings[391] = ItemType.PolishedBlackstoneWall; - mappings[10] = ItemType.PolishedDeepslate; - mappings[631] = ItemType.PolishedDeepslateSlab; - mappings[614] = ItemType.PolishedDeepslateStairs; - mappings[394] = ItemType.PolishedDeepslateWall; - mappings[5] = ItemType.PolishedDiorite; - mappings[620] = ItemType.PolishedDioriteSlab; - mappings[602] = ItemType.PolishedDioriteStairs; - mappings[3] = ItemType.PolishedGranite; - mappings[617] = ItemType.PolishedGraniteSlab; - mappings[599] = ItemType.PolishedGraniteStairs; - mappings[1105] = ItemType.PoppedChorusFruit; - mappings[197] = ItemType.Poppy; - mappings[841] = ItemType.Porkchop; - mappings[1052] = ItemType.Potato; - mappings[957] = ItemType.Potion; - mappings[871] = ItemType.PowderSnowBucket; - mappings[723] = ItemType.PoweredRail; - mappings[481] = ItemType.Prismarine; - mappings[257] = ItemType.PrismarineBrickSlab; - mappings[485] = ItemType.PrismarineBrickStairs; - mappings[482] = ItemType.PrismarineBricks; - mappings[1071] = ItemType.PrismarineCrystals; - mappings[1070] = ItemType.PrismarineShard; - mappings[256] = ItemType.PrismarineSlab; - mappings[484] = ItemType.PrismarineStairs; - mappings[378] = ItemType.PrismarineWall; - mappings[1250] = ItemType.PrizePotterySherd; - mappings[898] = ItemType.Pufferfish; - mappings[875] = ItemType.PufferfishBucket; - mappings[1010] = ItemType.PufferfishSpawnEgg; - mappings[300] = ItemType.Pumpkin; - mappings[1065] = ItemType.PumpkinPie; - mappings[945] = ItemType.PumpkinSeeds; - mappings[1097] = ItemType.PurpleBanner; - mappings[934] = ItemType.PurpleBed; - mappings[1201] = ItemType.PurpleCandle; - mappings[434] = ItemType.PurpleCarpet; - mappings[543] = ItemType.PurpleConcrete; - mappings[559] = ItemType.PurpleConcretePowder; - mappings[914] = ItemType.PurpleDye; - mappings[527] = ItemType.PurpleGlazedTerracotta; - mappings[511] = ItemType.PurpleShulkerBox; - mappings[459] = ItemType.PurpleStainedGlass; - mappings[475] = ItemType.PurpleStainedGlassPane; - mappings[415] = ItemType.PurpleTerracotta; - mappings[190] = ItemType.PurpleWool; - mappings[273] = ItemType.PurpurBlock; - mappings[274] = ItemType.PurpurPillar; - mappings[255] = ItemType.PurpurSlab; - mappings[275] = ItemType.PurpurStairs; - mappings[767] = ItemType.Quartz; - mappings[401] = ItemType.QuartzBlock; - mappings[402] = ItemType.QuartzBricks; - mappings[403] = ItemType.QuartzPillar; - mappings[252] = ItemType.QuartzSlab; - mappings[404] = ItemType.QuartzStairs; - mappings[1072] = ItemType.Rabbit; - mappings[1075] = ItemType.RabbitFoot; - mappings[1076] = ItemType.RabbitHide; - mappings[1011] = ItemType.RabbitSpawnEgg; - mappings[1074] = ItemType.RabbitStew; - mappings[725] = ItemType.Rail; - mappings[1233] = ItemType.RaiserArmorTrimSmithingTemplate; - mappings[1012] = ItemType.RavagerSpawnEgg; - mappings[771] = ItemType.RawCopper; - mappings[70] = ItemType.RawCopperBlock; - mappings[773] = ItemType.RawGold; - mappings[71] = ItemType.RawGoldBlock; - mappings[769] = ItemType.RawIron; - mappings[69] = ItemType.RawIronBlock; - mappings[889] = ItemType.RecoveryCompass; - mappings[1101] = ItemType.RedBanner; - mappings[938] = ItemType.RedBed; - mappings[1205] = ItemType.RedCandle; - mappings[438] = ItemType.RedCarpet; - mappings[547] = ItemType.RedConcrete; - mappings[563] = ItemType.RedConcretePowder; - mappings[918] = ItemType.RedDye; - mappings[531] = ItemType.RedGlazedTerracotta; - mappings[213] = ItemType.RedMushroom; - mappings[331] = ItemType.RedMushroomBlock; - mappings[627] = ItemType.RedNetherBrickSlab; - mappings[610] = ItemType.RedNetherBrickStairs; - mappings[386] = ItemType.RedNetherBrickWall; - mappings[497] = ItemType.RedNetherBricks; - mappings[47] = ItemType.RedSand; - mappings[488] = ItemType.RedSandstone; - mappings[253] = ItemType.RedSandstoneSlab; - mappings[491] = ItemType.RedSandstoneStairs; - mappings[379] = ItemType.RedSandstoneWall; - mappings[515] = ItemType.RedShulkerBox; - mappings[463] = ItemType.RedStainedGlass; - mappings[479] = ItemType.RedStainedGlassPane; - mappings[419] = ItemType.RedTerracotta; - mappings[201] = ItemType.RedTulip; - mappings[194] = ItemType.RedWool; - mappings[635] = ItemType.Redstone; - mappings[637] = ItemType.RedstoneBlock; - mappings[658] = ItemType.RedstoneLamp; - mappings[57] = ItemType.RedstoneOre; - mappings[636] = ItemType.RedstoneTorch; - mappings[329] = ItemType.ReinforcedDeepslate; - mappings[638] = ItemType.Repeater; - mappings[492] = ItemType.RepeatingCommandBlock; - mappings[1189] = ItemType.RespawnAnchor; - mappings[1228] = ItemType.RibArmorTrimSmithingTemplate; - mappings[18] = ItemType.RootedDirt; - mappings[445] = ItemType.RoseBush; - mappings[951] = ItemType.RottenFlesh; - mappings[727] = ItemType.Saddle; - mappings[896] = ItemType.Salmon; - mappings[876] = ItemType.SalmonBucket; - mappings[1013] = ItemType.SalmonSpawnEgg; - mappings[44] = ItemType.Sand; - mappings[169] = ItemType.Sandstone; - mappings[244] = ItemType.SandstoneSlab; - mappings[358] = ItemType.SandstoneStairs; - mappings[387] = ItemType.SandstoneWall; - mappings[634] = ItemType.Scaffolding; - mappings[349] = ItemType.Sculk; - mappings[351] = ItemType.SculkCatalyst; - mappings[653] = ItemType.SculkSensor; - mappings[352] = ItemType.SculkShrieker; - mappings[350] = ItemType.SculkVein; - mappings[757] = ItemType.TurtleScute; - mappings[487] = ItemType.SeaLantern; - mappings[179] = ItemType.SeaPickle; - mappings[178] = ItemType.Seagrass; - mappings[1219] = ItemType.SentryArmorTrimSmithingTemplate; - mappings[1231] = ItemType.ShaperArmorTrimSmithingTemplate; - mappings[1251] = ItemType.SheafPotterySherd; - mappings[942] = ItemType.Shears; - mappings[1014] = ItemType.SheepSpawnEgg; - mappings[1252] = ItemType.ShelterPotterySherd; - mappings[1116] = ItemType.Shield; - mappings[1169] = ItemType.Shroomlight; - mappings[500] = ItemType.ShulkerBox; - mappings[1118] = ItemType.ShulkerShell; - mappings[1015] = ItemType.ShulkerSpawnEgg; - mappings[1232] = ItemType.SilenceArmorTrimSmithingTemplate; - mappings[1016] = ItemType.SilverfishSpawnEgg; - mappings[1018] = ItemType.SkeletonHorseSpawnEgg; - mappings[1057] = ItemType.SkeletonSkull; - mappings[1017] = ItemType.SkeletonSpawnEgg; - mappings[1148] = ItemType.SkullBannerPattern; - mappings[1253] = ItemType.SkullPotterySherd; - mappings[886] = ItemType.SlimeBall; - mappings[642] = ItemType.SlimeBlock; - mappings[1019] = ItemType.SlimeSpawnEgg; - mappings[1207] = ItemType.SmallAmethystBud; - mappings[228] = ItemType.SmallDripleaf; - mappings[1160] = ItemType.SmithingTable; - mappings[1155] = ItemType.Smoker; - mappings[308] = ItemType.SmoothBasalt; - mappings[259] = ItemType.SmoothQuartz; - mappings[624] = ItemType.SmoothQuartzSlab; - mappings[607] = ItemType.SmoothQuartzStairs; - mappings[260] = ItemType.SmoothRedSandstone; - mappings[618] = ItemType.SmoothRedSandstoneSlab; - mappings[600] = ItemType.SmoothRedSandstoneStairs; - mappings[261] = ItemType.SmoothSandstone; - mappings[623] = ItemType.SmoothSandstoneSlab; - mappings[606] = ItemType.SmoothSandstoneStairs; - mappings[262] = ItemType.SmoothStone; - mappings[243] = ItemType.SmoothStoneSlab; - mappings[566] = ItemType.SnifferEgg; - mappings[1020] = ItemType.SnifferSpawnEgg; - mappings[1254] = ItemType.SnortPotterySherd; - mappings[1227] = ItemType.SnoutArmorTrimSmithingTemplate; - mappings[283] = ItemType.Snow; - mappings[285] = ItemType.SnowBlock; - mappings[1021] = ItemType.SnowGolemSpawnEgg; - mappings[872] = ItemType.Snowball; - mappings[1168] = ItemType.SoulCampfire; - mappings[1164] = ItemType.SoulLantern; - mappings[304] = ItemType.SoulSand; - mappings[305] = ItemType.SoulSoil; - mappings[309] = ItemType.SoulTorch; - mappings[276] = ItemType.Spawner; - mappings[1113] = ItemType.SpectralArrow; - mappings[959] = ItemType.SpiderEye; - mappings[1022] = ItemType.SpiderSpawnEgg; - mappings[1229] = ItemType.SpireArmorTrimSmithingTemplate; - mappings[1112] = ItemType.SplashPotion; - mappings[164] = ItemType.Sponge; - mappings[211] = ItemType.SporeBlossom; - mappings[738] = ItemType.SpruceBoat; - mappings[663] = ItemType.SpruceButton; - mappings[739] = ItemType.SpruceChestBoat; - mappings[690] = ItemType.SpruceDoor; - mappings[290] = ItemType.SpruceFence; - mappings[713] = ItemType.SpruceFenceGate; - mappings[858] = ItemType.SpruceHangingSign; - mappings[155] = ItemType.SpruceLeaves; - mappings[111] = ItemType.SpruceLog; - mappings[24] = ItemType.SprucePlanks; - mappings[678] = ItemType.SprucePressurePlate; - mappings[36] = ItemType.SpruceSapling; - mappings[847] = ItemType.SpruceSign; - mappings[231] = ItemType.SpruceSlab; - mappings[362] = ItemType.SpruceStairs; - mappings[702] = ItemType.SpruceTrapdoor; - mappings[145] = ItemType.SpruceWood; - mappings[893] = ItemType.Spyglass; - mappings[1023] = ItemType.SquidSpawnEgg; - mappings[807] = ItemType.Stick; - mappings[641] = ItemType.StickyPiston; - mappings[1] = ItemType.Stone; - mappings[785] = ItemType.StoneAxe; - mappings[249] = ItemType.StoneBrickSlab; - mappings[340] = ItemType.StoneBrickStairs; - mappings[382] = ItemType.StoneBrickWall; - mappings[318] = ItemType.StoneBricks; - mappings[660] = ItemType.StoneButton; - mappings[786] = ItemType.StoneHoe; - mappings[784] = ItemType.StonePickaxe; - mappings[673] = ItemType.StonePressurePlate; - mappings[783] = ItemType.StoneShovel; - mappings[242] = ItemType.StoneSlab; - mappings[605] = ItemType.StoneStairs; - mappings[782] = ItemType.StoneSword; - mappings[1161] = ItemType.Stonecutter; - mappings[1024] = ItemType.StraySpawnEgg; - mappings[1025] = ItemType.StriderSpawnEgg; - mappings[810] = ItemType.String; - mappings[127] = ItemType.StrippedAcaciaLog; - mappings[137] = ItemType.StrippedAcaciaWood; - mappings[143] = ItemType.StrippedBambooBlock; - mappings[125] = ItemType.StrippedBirchLog; - mappings[135] = ItemType.StrippedBirchWood; - mappings[128] = ItemType.StrippedCherryLog; - mappings[138] = ItemType.StrippedCherryWood; - mappings[141] = ItemType.StrippedCrimsonHyphae; - mappings[131] = ItemType.StrippedCrimsonStem; - mappings[129] = ItemType.StrippedDarkOakLog; - mappings[139] = ItemType.StrippedDarkOakWood; - mappings[126] = ItemType.StrippedJungleLog; - mappings[136] = ItemType.StrippedJungleWood; - mappings[130] = ItemType.StrippedMangroveLog; - mappings[140] = ItemType.StrippedMangroveWood; - mappings[123] = ItemType.StrippedOakLog; - mappings[133] = ItemType.StrippedOakWood; - mappings[124] = ItemType.StrippedSpruceLog; - mappings[134] = ItemType.StrippedSpruceWood; - mappings[142] = ItemType.StrippedWarpedHyphae; - mappings[132] = ItemType.StrippedWarpedStem; - mappings[754] = ItemType.StructureBlock; - mappings[499] = ItemType.StructureVoid; - mappings[922] = ItemType.Sugar; - mappings[221] = ItemType.SugarCane; - mappings[443] = ItemType.Sunflower; - mappings[46] = ItemType.SuspiciousGravel; - mappings[45] = ItemType.SuspiciousSand; - mappings[1144] = ItemType.SuspiciousStew; - mappings[1165] = ItemType.SweetBerries; - mappings[880] = ItemType.TadpoleBucket; - mappings[1026] = ItemType.TadpoleSpawnEgg; - mappings[447] = ItemType.TallGrass; - mappings[649] = ItemType.Target; - mappings[440] = ItemType.Terracotta; - mappings[1226] = ItemType.TideArmorTrimSmithingTemplate; - mappings[167] = ItemType.TintedGlass; - mappings[1114] = ItemType.TippedArrow; - mappings[657] = ItemType.Tnt; - mappings[731] = ItemType.TntMinecart; - mappings[269] = ItemType.Torch; - mappings[209] = ItemType.Torchflower; - mappings[1106] = ItemType.TorchflowerSeeds; - mappings[1117] = ItemType.TotemOfUndying; - mappings[1027] = ItemType.TraderLlamaSpawnEgg; - mappings[656] = ItemType.TrappedChest; - mappings[1139] = ItemType.Trident; - mappings[655] = ItemType.TripwireHook; - mappings[897] = ItemType.TropicalFish; - mappings[878] = ItemType.TropicalFishBucket; - mappings[1028] = ItemType.TropicalFishSpawnEgg; - mappings[577] = ItemType.TubeCoral; - mappings[572] = ItemType.TubeCoralBlock; - mappings[587] = ItemType.TubeCoralFan; - mappings[12] = ItemType.Tuff; - mappings[565] = ItemType.TurtleEgg; - mappings[756] = ItemType.TurtleHelmet; - mappings[1029] = ItemType.TurtleSpawnEgg; - mappings[220] = ItemType.TwistingVines; - mappings[1213] = ItemType.VerdantFroglight; - mappings[1225] = ItemType.VexArmorTrimSmithingTemplate; - mappings[1030] = ItemType.VexSpawnEgg; - mappings[1031] = ItemType.VillagerSpawnEgg; - mappings[1032] = ItemType.VindicatorSpawnEgg; - mappings[337] = ItemType.Vine; - mappings[1033] = ItemType.WanderingTraderSpawnEgg; - mappings[1223] = ItemType.WardArmorTrimSmithingTemplate; - mappings[1034] = ItemType.WardenSpawnEgg; - mappings[672] = ItemType.WarpedButton; - mappings[699] = ItemType.WarpedDoor; - mappings[299] = ItemType.WarpedFence; - mappings[722] = ItemType.WarpedFenceGate; - mappings[215] = ItemType.WarpedFungus; - mappings[734] = ItemType.WarpedFungusOnAStick; - mappings[867] = ItemType.WarpedHangingSign; - mappings[153] = ItemType.WarpedHyphae; - mappings[21] = ItemType.WarpedNylium; - mappings[33] = ItemType.WarpedPlanks; - mappings[687] = ItemType.WarpedPressurePlate; - mappings[217] = ItemType.WarpedRoots; - mappings[856] = ItemType.WarpedSign; - mappings[241] = ItemType.WarpedSlab; - mappings[372] = ItemType.WarpedStairs; - mappings[121] = ItemType.WarpedStem; - mappings[711] = ItemType.WarpedTrapdoor; - mappings[496] = ItemType.WarpedWartBlock; - mappings[869] = ItemType.WaterBucket; - mappings[94] = ItemType.WaxedCopperBlock; - mappings[98] = ItemType.WaxedCutCopper; - mappings[106] = ItemType.WaxedCutCopperSlab; - mappings[102] = ItemType.WaxedCutCopperStairs; - mappings[95] = ItemType.WaxedExposedCopper; - mappings[99] = ItemType.WaxedExposedCutCopper; - mappings[107] = ItemType.WaxedExposedCutCopperSlab; - mappings[103] = ItemType.WaxedExposedCutCopperStairs; - mappings[97] = ItemType.WaxedOxidizedCopper; - mappings[101] = ItemType.WaxedOxidizedCutCopper; - mappings[109] = ItemType.WaxedOxidizedCutCopperSlab; - mappings[105] = ItemType.WaxedOxidizedCutCopperStairs; - mappings[96] = ItemType.WaxedWeatheredCopper; - mappings[100] = ItemType.WaxedWeatheredCutCopper; - mappings[108] = ItemType.WaxedWeatheredCutCopperSlab; - mappings[104] = ItemType.WaxedWeatheredCutCopperStairs; - mappings[1230] = ItemType.WayfinderArmorTrimSmithingTemplate; - mappings[80] = ItemType.WeatheredCopper; - mappings[84] = ItemType.WeatheredCutCopper; - mappings[92] = ItemType.WeatheredCutCopperSlab; - mappings[88] = ItemType.WeatheredCutCopperStairs; - mappings[219] = ItemType.WeepingVines; - mappings[165] = ItemType.WetSponge; - mappings[814] = ItemType.Wheat; - mappings[813] = ItemType.WheatSeeds; - mappings[1087] = ItemType.WhiteBanner; - mappings[924] = ItemType.WhiteBed; - mappings[1191] = ItemType.WhiteCandle; - mappings[424] = ItemType.WhiteCarpet; - mappings[533] = ItemType.WhiteConcrete; - mappings[549] = ItemType.WhiteConcretePowder; - mappings[904] = ItemType.WhiteDye; - mappings[517] = ItemType.WhiteGlazedTerracotta; - mappings[501] = ItemType.WhiteShulkerBox; - mappings[449] = ItemType.WhiteStainedGlass; - mappings[465] = ItemType.WhiteStainedGlassPane; - mappings[405] = ItemType.WhiteTerracotta; - mappings[203] = ItemType.WhiteTulip; - mappings[180] = ItemType.WhiteWool; - mappings[1222] = ItemType.WildArmorTrimSmithingTemplate; - mappings[1035] = ItemType.WitchSpawnEgg; - mappings[208] = ItemType.WitherRose; - mappings[1058] = ItemType.WitherSkeletonSkull; - mappings[1037] = ItemType.WitherSkeletonSpawnEgg; - mappings[1036] = ItemType.WitherSpawnEgg; - mappings[1038] = ItemType.WolfSpawnEgg; - mappings[780] = ItemType.WoodenAxe; - mappings[781] = ItemType.WoodenHoe; - mappings[779] = ItemType.WoodenPickaxe; - mappings[778] = ItemType.WoodenShovel; - mappings[777] = ItemType.WoodenSword; - mappings[1046] = ItemType.WritableBook; - mappings[1047] = ItemType.WrittenBook; - mappings[1091] = ItemType.YellowBanner; - mappings[928] = ItemType.YellowBed; - mappings[1195] = ItemType.YellowCandle; - mappings[428] = ItemType.YellowCarpet; - mappings[537] = ItemType.YellowConcrete; - mappings[553] = ItemType.YellowConcretePowder; - mappings[908] = ItemType.YellowDye; - mappings[521] = ItemType.YellowGlazedTerracotta; - mappings[505] = ItemType.YellowShulkerBox; - mappings[453] = ItemType.YellowStainedGlass; - mappings[469] = ItemType.YellowStainedGlassPane; - mappings[409] = ItemType.YellowTerracotta; - mappings[184] = ItemType.YellowWool; - mappings[1039] = ItemType.ZoglinSpawnEgg; - mappings[1060] = ItemType.ZombieHead; - mappings[1041] = ItemType.ZombieHorseSpawnEgg; - mappings[1040] = ItemType.ZombieSpawnEgg; - mappings[1042] = ItemType.ZombieVillagerSpawnEgg; - mappings[1043] = ItemType.ZombifiedPiglinSpawnEgg; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1204.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette1204.cs deleted file mode 100644 index 3796e4cb9f..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1204.cs +++ /dev/null @@ -1,1330 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public class ItemPalette1204 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette1204() - { - mappings[781] = ItemType.AcaciaBoat; - mappings[687] = ItemType.AcaciaButton; - mappings[782] = ItemType.AcaciaChestBoat; - mappings[714] = ItemType.AcaciaDoor; - mappings[314] = ItemType.AcaciaFence; - mappings[753] = ItemType.AcaciaFenceGate; - mappings[898] = ItemType.AcaciaHangingSign; - mappings[179] = ItemType.AcaciaLeaves; - mappings[135] = ItemType.AcaciaLog; - mappings[40] = ItemType.AcaciaPlanks; - mappings[702] = ItemType.AcaciaPressurePlate; - mappings[52] = ItemType.AcaciaSapling; - mappings[887] = ItemType.AcaciaSign; - mappings[255] = ItemType.AcaciaSlab; - mappings[386] = ItemType.AcaciaStairs; - mappings[734] = ItemType.AcaciaTrapdoor; - mappings[169] = ItemType.AcaciaWood; - mappings[763] = ItemType.ActivatorRail; - mappings[0] = ItemType.Air; - mappings[1005] = ItemType.AllaySpawnEgg; - mappings[220] = ItemType.Allium; - mappings[85] = ItemType.AmethystBlock; - mappings[1249] = ItemType.AmethystCluster; - mappings[805] = ItemType.AmethystShard; - mappings[80] = ItemType.AncientDebris; - mappings[6] = ItemType.Andesite; - mappings[647] = ItemType.AndesiteSlab; - mappings[630] = ItemType.AndesiteStairs; - mappings[406] = ItemType.AndesiteWall; - mappings[1274] = ItemType.AnglerPotterySherd; - mappings[418] = ItemType.Anvil; - mappings[796] = ItemType.Apple; - mappings[1275] = ItemType.ArcherPotterySherd; - mappings[1116] = ItemType.ArmorStand; - mappings[1276] = ItemType.ArmsUpPotterySherd; - mappings[798] = ItemType.Arrow; - mappings[916] = ItemType.AxolotlBucket; - mappings[1006] = ItemType.AxolotlSpawnEgg; - mappings[196] = ItemType.Azalea; - mappings[183] = ItemType.AzaleaLeaves; - mappings[221] = ItemType.AzureBluet; - mappings[1092] = ItemType.BakedPotato; - mappings[250] = ItemType.Bamboo; - mappings[143] = ItemType.BambooBlock; - mappings[691] = ItemType.BambooButton; - mappings[790] = ItemType.BambooChestRaft; - mappings[718] = ItemType.BambooDoor; - mappings[318] = ItemType.BambooFence; - mappings[757] = ItemType.BambooFenceGate; - mappings[902] = ItemType.BambooHangingSign; - mappings[47] = ItemType.BambooMosaic; - mappings[260] = ItemType.BambooMosaicSlab; - mappings[391] = ItemType.BambooMosaicStairs; - mappings[44] = ItemType.BambooPlanks; - mappings[706] = ItemType.BambooPressurePlate; - mappings[789] = ItemType.BambooRaft; - mappings[891] = ItemType.BambooSign; - mappings[259] = ItemType.BambooSlab; - mappings[390] = ItemType.BambooStairs; - mappings[738] = ItemType.BambooTrapdoor; - mappings[1193] = ItemType.Barrel; - mappings[442] = ItemType.Barrier; - mappings[327] = ItemType.Basalt; - mappings[1007] = ItemType.BatSpawnEgg; - mappings[395] = ItemType.Beacon; - mappings[56] = ItemType.Bedrock; - mappings[1210] = ItemType.BeeNest; - mappings[1008] = ItemType.BeeSpawnEgg; - mappings[985] = ItemType.Beef; - mappings[1211] = ItemType.Beehive; - mappings[1147] = ItemType.Beetroot; - mappings[1148] = ItemType.BeetrootSeeds; - mappings[1149] = ItemType.BeetrootSoup; - mappings[1201] = ItemType.Bell; - mappings[248] = ItemType.BigDripleaf; - mappings[777] = ItemType.BirchBoat; - mappings[685] = ItemType.BirchButton; - mappings[778] = ItemType.BirchChestBoat; - mappings[712] = ItemType.BirchDoor; - mappings[312] = ItemType.BirchFence; - mappings[751] = ItemType.BirchFenceGate; - mappings[896] = ItemType.BirchHangingSign; - mappings[177] = ItemType.BirchLeaves; - mappings[133] = ItemType.BirchLog; - mappings[38] = ItemType.BirchPlanks; - mappings[700] = ItemType.BirchPressurePlate; - mappings[50] = ItemType.BirchSapling; - mappings[885] = ItemType.BirchSign; - mappings[253] = ItemType.BirchSlab; - mappings[384] = ItemType.BirchStairs; - mappings[732] = ItemType.BirchTrapdoor; - mappings[167] = ItemType.BirchWood; - mappings[1141] = ItemType.BlackBanner; - mappings[976] = ItemType.BlackBed; - mappings[1245] = ItemType.BlackCandle; - mappings[460] = ItemType.BlackCarpet; - mappings[569] = ItemType.BlackConcrete; - mappings[585] = ItemType.BlackConcretePowder; - mappings[956] = ItemType.BlackDye; - mappings[553] = ItemType.BlackGlazedTerracotta; - mappings[537] = ItemType.BlackShulkerBox; - mappings[485] = ItemType.BlackStainedGlass; - mappings[501] = ItemType.BlackStainedGlassPane; - mappings[441] = ItemType.BlackTerracotta; - mappings[216] = ItemType.BlackWool; - mappings[1216] = ItemType.Blackstone; - mappings[1217] = ItemType.BlackstoneSlab; - mappings[1218] = ItemType.BlackstoneStairs; - mappings[411] = ItemType.BlackstoneWall; - mappings[1277] = ItemType.BladePotterySherd; - mappings[1195] = ItemType.BlastFurnace; - mappings[999] = ItemType.BlazePowder; - mappings[991] = ItemType.BlazeRod; - mappings[1009] = ItemType.BlazeSpawnEgg; - mappings[1137] = ItemType.BlueBanner; - mappings[972] = ItemType.BlueBed; - mappings[1241] = ItemType.BlueCandle; - mappings[456] = ItemType.BlueCarpet; - mappings[565] = ItemType.BlueConcrete; - mappings[581] = ItemType.BlueConcretePowder; - mappings[952] = ItemType.BlueDye; - mappings[549] = ItemType.BlueGlazedTerracotta; - mappings[618] = ItemType.BlueIce; - mappings[219] = ItemType.BlueOrchid; - mappings[533] = ItemType.BlueShulkerBox; - mappings[481] = ItemType.BlueStainedGlass; - mappings[497] = ItemType.BlueStainedGlassPane; - mappings[437] = ItemType.BlueTerracotta; - mappings[212] = ItemType.BlueWool; - mappings[958] = ItemType.Bone; - mappings[519] = ItemType.BoneBlock; - mappings[957] = ItemType.BoneMeal; - mappings[922] = ItemType.Book; - mappings[285] = ItemType.Bookshelf; - mappings[797] = ItemType.Bow; - mappings[845] = ItemType.Bowl; - mappings[599] = ItemType.BrainCoral; - mappings[594] = ItemType.BrainCoralBlock; - mappings[609] = ItemType.BrainCoralFan; - mappings[852] = ItemType.Bread; - mappings[1010] = ItemType.BreezeSpawnEgg; - mappings[1278] = ItemType.BrewerPotterySherd; - mappings[1001] = ItemType.BrewingStand; - mappings[918] = ItemType.Brick; - mappings[269] = ItemType.BrickSlab; - mappings[360] = ItemType.BrickStairs; - mappings[398] = ItemType.BrickWall; - mappings[284] = ItemType.Bricks; - mappings[1138] = ItemType.BrownBanner; - mappings[973] = ItemType.BrownBed; - mappings[1242] = ItemType.BrownCandle; - mappings[457] = ItemType.BrownCarpet; - mappings[566] = ItemType.BrownConcrete; - mappings[582] = ItemType.BrownConcretePowder; - mappings[953] = ItemType.BrownDye; - mappings[550] = ItemType.BrownGlazedTerracotta; - mappings[233] = ItemType.BrownMushroom; - mappings[351] = ItemType.BrownMushroomBlock; - mappings[534] = ItemType.BrownShulkerBox; - mappings[482] = ItemType.BrownStainedGlass; - mappings[498] = ItemType.BrownStainedGlassPane; - mappings[438] = ItemType.BrownTerracotta; - mappings[213] = ItemType.BrownWool; - mappings[1256] = ItemType.Brush; - mappings[600] = ItemType.BubbleCoral; - mappings[595] = ItemType.BubbleCoralBlock; - mappings[610] = ItemType.BubbleCoralFan; - mappings[905] = ItemType.Bucket; - mappings[86] = ItemType.BuddingAmethyst; - mappings[927] = ItemType.Bundle; - mappings[1279] = ItemType.BurnPotterySherd; - mappings[307] = ItemType.Cactus; - mappings[960] = ItemType.Cake; - mappings[11] = ItemType.Calcite; - mappings[675] = ItemType.CalibratedSculkSensor; - mappings[1012] = ItemType.CamelSpawnEgg; - mappings[1206] = ItemType.Campfire; - mappings[1229] = ItemType.Candle; - mappings[1090] = ItemType.Carrot; - mappings[770] = ItemType.CarrotOnAStick; - mappings[1196] = ItemType.CartographyTable; - mappings[322] = ItemType.CarvedPumpkin; - mappings[1011] = ItemType.CatSpawnEgg; - mappings[1002] = ItemType.Cauldron; - mappings[1013] = ItemType.CaveSpiderSpawnEgg; - mappings[355] = ItemType.Chain; - mappings[514] = ItemType.ChainCommandBlock; - mappings[860] = ItemType.ChainmailBoots; - mappings[858] = ItemType.ChainmailChestplate; - mappings[857] = ItemType.ChainmailHelmet; - mappings[859] = ItemType.ChainmailLeggings; - mappings[800] = ItemType.Charcoal; - mappings[783] = ItemType.CherryBoat; - mappings[688] = ItemType.CherryButton; - mappings[784] = ItemType.CherryChestBoat; - mappings[715] = ItemType.CherryDoor; - mappings[315] = ItemType.CherryFence; - mappings[754] = ItemType.CherryFenceGate; - mappings[899] = ItemType.CherryHangingSign; - mappings[180] = ItemType.CherryLeaves; - mappings[136] = ItemType.CherryLog; - mappings[41] = ItemType.CherryPlanks; - mappings[703] = ItemType.CherryPressurePlate; - mappings[53] = ItemType.CherrySapling; - mappings[888] = ItemType.CherrySign; - mappings[256] = ItemType.CherrySlab; - mappings[387] = ItemType.CherryStairs; - mappings[735] = ItemType.CherryTrapdoor; - mappings[170] = ItemType.CherryWood; - mappings[298] = ItemType.Chest; - mappings[766] = ItemType.ChestMinecart; - mappings[987] = ItemType.Chicken; - mappings[1014] = ItemType.ChickenSpawnEgg; - mappings[419] = ItemType.ChippedAnvil; - mappings[286] = ItemType.ChiseledBookshelf; - mappings[95] = ItemType.ChiseledCopper; - mappings[349] = ItemType.ChiseledDeepslate; - mappings[367] = ItemType.ChiseledNetherBricks; - mappings[1223] = ItemType.ChiseledPolishedBlackstone; - mappings[421] = ItemType.ChiseledQuartzBlock; - mappings[510] = ItemType.ChiseledRedSandstone; - mappings[191] = ItemType.ChiseledSandstone; - mappings[342] = ItemType.ChiseledStoneBricks; - mappings[16] = ItemType.ChiseledTuff; - mappings[25] = ItemType.ChiseledTuffBricks; - mappings[293] = ItemType.ChorusFlower; - mappings[1143] = ItemType.ChorusFruit; - mappings[292] = ItemType.ChorusPlant; - mappings[308] = ItemType.Clay; - mappings[919] = ItemType.ClayBall; - mappings[929] = ItemType.Clock; - mappings[799] = ItemType.Coal; - mappings[81] = ItemType.CoalBlock; - mappings[62] = ItemType.CoalOre; - mappings[29] = ItemType.CoarseDirt; - mappings[1260] = ItemType.CoastArmorTrimSmithingTemplate; - mappings[9] = ItemType.CobbledDeepslate; - mappings[651] = ItemType.CobbledDeepslateSlab; - mappings[634] = ItemType.CobbledDeepslateStairs; - mappings[414] = ItemType.CobbledDeepslateWall; - mappings[35] = ItemType.Cobblestone; - mappings[268] = ItemType.CobblestoneSlab; - mappings[303] = ItemType.CobblestoneStairs; - mappings[396] = ItemType.CobblestoneWall; - mappings[193] = ItemType.Cobweb; - mappings[940] = ItemType.CocoaBeans; - mappings[932] = ItemType.Cod; - mappings[914] = ItemType.CodBucket; - mappings[1015] = ItemType.CodSpawnEgg; - mappings[394] = ItemType.CommandBlock; - mappings[1123] = ItemType.CommandBlockMinecart; - mappings[660] = ItemType.Comparator; - mappings[925] = ItemType.Compass; - mappings[1192] = ItemType.Composter; - mappings[619] = ItemType.Conduit; - mappings[986] = ItemType.CookedBeef; - mappings[988] = ItemType.CookedChicken; - mappings[936] = ItemType.CookedCod; - mappings[1125] = ItemType.CookedMutton; - mappings[879] = ItemType.CookedPorkchop; - mappings[1112] = ItemType.CookedRabbit; - mappings[937] = ItemType.CookedSalmon; - mappings[977] = ItemType.Cookie; - mappings[88] = ItemType.CopperBlock; - mappings[1302] = ItemType.CopperBulb; - mappings[721] = ItemType.CopperDoor; - mappings[1294] = ItemType.CopperGrate; - mappings[809] = ItemType.CopperIngot; - mappings[66] = ItemType.CopperOre; - mappings[741] = ItemType.CopperTrapdoor; - mappings[227] = ItemType.Cornflower; - mappings[1016] = ItemType.CowSpawnEgg; - mappings[346] = ItemType.CrackedDeepslateBricks; - mappings[348] = ItemType.CrackedDeepslateTiles; - mappings[366] = ItemType.CrackedNetherBricks; - mappings[1227] = ItemType.CrackedPolishedBlackstoneBricks; - mappings[341] = ItemType.CrackedStoneBricks; - mappings[978] = ItemType.Crafter; - mappings[299] = ItemType.CraftingTable; - mappings[1186] = ItemType.CreeperBannerPattern; - mappings[1100] = ItemType.CreeperHead; - mappings[1017] = ItemType.CreeperSpawnEgg; - mappings[692] = ItemType.CrimsonButton; - mappings[719] = ItemType.CrimsonDoor; - mappings[319] = ItemType.CrimsonFence; - mappings[758] = ItemType.CrimsonFenceGate; - mappings[235] = ItemType.CrimsonFungus; - mappings[903] = ItemType.CrimsonHangingSign; - mappings[173] = ItemType.CrimsonHyphae; - mappings[33] = ItemType.CrimsonNylium; - mappings[45] = ItemType.CrimsonPlanks; - mappings[707] = ItemType.CrimsonPressurePlate; - mappings[237] = ItemType.CrimsonRoots; - mappings[892] = ItemType.CrimsonSign; - mappings[261] = ItemType.CrimsonSlab; - mappings[392] = ItemType.CrimsonStairs; - mappings[141] = ItemType.CrimsonStem; - mappings[739] = ItemType.CrimsonTrapdoor; - mappings[1182] = ItemType.Crossbow; - mappings[1215] = ItemType.CryingObsidian; - mappings[99] = ItemType.CutCopper; - mappings[107] = ItemType.CutCopperSlab; - mappings[103] = ItemType.CutCopperStairs; - mappings[511] = ItemType.CutRedSandstone; - mappings[275] = ItemType.CutRedSandstoneSlab; - mappings[192] = ItemType.CutSandstone; - mappings[266] = ItemType.CutSandstoneSlab; - mappings[1135] = ItemType.CyanBanner; - mappings[970] = ItemType.CyanBed; - mappings[1239] = ItemType.CyanCandle; - mappings[454] = ItemType.CyanCarpet; - mappings[563] = ItemType.CyanConcrete; - mappings[579] = ItemType.CyanConcretePowder; - mappings[950] = ItemType.CyanDye; - mappings[547] = ItemType.CyanGlazedTerracotta; - mappings[531] = ItemType.CyanShulkerBox; - mappings[479] = ItemType.CyanStainedGlass; - mappings[495] = ItemType.CyanStainedGlassPane; - mappings[435] = ItemType.CyanTerracotta; - mappings[210] = ItemType.CyanWool; - mappings[420] = ItemType.DamagedAnvil; - mappings[217] = ItemType.Dandelion; - mappings[1280] = ItemType.DangerPotterySherd; - mappings[785] = ItemType.DarkOakBoat; - mappings[689] = ItemType.DarkOakButton; - mappings[786] = ItemType.DarkOakChestBoat; - mappings[716] = ItemType.DarkOakDoor; - mappings[316] = ItemType.DarkOakFence; - mappings[755] = ItemType.DarkOakFenceGate; - mappings[900] = ItemType.DarkOakHangingSign; - mappings[181] = ItemType.DarkOakLeaves; - mappings[137] = ItemType.DarkOakLog; - mappings[42] = ItemType.DarkOakPlanks; - mappings[704] = ItemType.DarkOakPressurePlate; - mappings[54] = ItemType.DarkOakSapling; - mappings[889] = ItemType.DarkOakSign; - mappings[257] = ItemType.DarkOakSlab; - mappings[388] = ItemType.DarkOakStairs; - mappings[736] = ItemType.DarkOakTrapdoor; - mappings[171] = ItemType.DarkOakWood; - mappings[504] = ItemType.DarkPrismarine; - mappings[279] = ItemType.DarkPrismarineSlab; - mappings[507] = ItemType.DarkPrismarineStairs; - mappings[673] = ItemType.DaylightDetector; - mappings[603] = ItemType.DeadBrainCoral; - mappings[589] = ItemType.DeadBrainCoralBlock; - mappings[614] = ItemType.DeadBrainCoralFan; - mappings[604] = ItemType.DeadBubbleCoral; - mappings[590] = ItemType.DeadBubbleCoralBlock; - mappings[615] = ItemType.DeadBubbleCoralFan; - mappings[198] = ItemType.DeadBush; - mappings[605] = ItemType.DeadFireCoral; - mappings[591] = ItemType.DeadFireCoralBlock; - mappings[616] = ItemType.DeadFireCoralFan; - mappings[606] = ItemType.DeadHornCoral; - mappings[592] = ItemType.DeadHornCoralBlock; - mappings[617] = ItemType.DeadHornCoralFan; - mappings[607] = ItemType.DeadTubeCoral; - mappings[588] = ItemType.DeadTubeCoralBlock; - mappings[613] = ItemType.DeadTubeCoralFan; - mappings[1160] = ItemType.DebugStick; - mappings[287] = ItemType.DecoratedPot; - mappings[8] = ItemType.Deepslate; - mappings[653] = ItemType.DeepslateBrickSlab; - mappings[636] = ItemType.DeepslateBrickStairs; - mappings[416] = ItemType.DeepslateBrickWall; - mappings[345] = ItemType.DeepslateBricks; - mappings[63] = ItemType.DeepslateCoalOre; - mappings[67] = ItemType.DeepslateCopperOre; - mappings[77] = ItemType.DeepslateDiamondOre; - mappings[73] = ItemType.DeepslateEmeraldOre; - mappings[69] = ItemType.DeepslateGoldOre; - mappings[65] = ItemType.DeepslateIronOre; - mappings[75] = ItemType.DeepslateLapisOre; - mappings[71] = ItemType.DeepslateRedstoneOre; - mappings[654] = ItemType.DeepslateTileSlab; - mappings[637] = ItemType.DeepslateTileStairs; - mappings[417] = ItemType.DeepslateTileWall; - mappings[347] = ItemType.DeepslateTiles; - mappings[761] = ItemType.DetectorRail; - mappings[801] = ItemType.Diamond; - mappings[837] = ItemType.DiamondAxe; - mappings[90] = ItemType.DiamondBlock; - mappings[868] = ItemType.DiamondBoots; - mappings[866] = ItemType.DiamondChestplate; - mappings[865] = ItemType.DiamondHelmet; - mappings[838] = ItemType.DiamondHoe; - mappings[1119] = ItemType.DiamondHorseArmor; - mappings[867] = ItemType.DiamondLeggings; - mappings[76] = ItemType.DiamondOre; - mappings[836] = ItemType.DiamondPickaxe; - mappings[835] = ItemType.DiamondShovel; - mappings[834] = ItemType.DiamondSword; - mappings[4] = ItemType.Diorite; - mappings[650] = ItemType.DioriteSlab; - mappings[633] = ItemType.DioriteStairs; - mappings[410] = ItemType.DioriteWall; - mappings[28] = ItemType.Dirt; - mappings[463] = ItemType.DirtPath; - mappings[1177] = ItemType.DiscFragment5; - mappings[667] = ItemType.Dispenser; - mappings[1018] = ItemType.DolphinSpawnEgg; - mappings[1019] = ItemType.DonkeySpawnEgg; - mappings[1150] = ItemType.DragonBreath; - mappings[378] = ItemType.DragonEgg; - mappings[1101] = ItemType.DragonHead; - mappings[982] = ItemType.DriedKelp; - mappings[920] = ItemType.DriedKelpBlock; - mappings[26] = ItemType.DripstoneBlock; - mappings[668] = ItemType.Dropper; - mappings[1020] = ItemType.DrownedSpawnEgg; - mappings[1259] = ItemType.DuneArmorTrimSmithingTemplate; - mappings[1255] = ItemType.EchoShard; - mappings[924] = ItemType.Egg; - mappings[1021] = ItemType.ElderGuardianSpawnEgg; - mappings[772] = ItemType.Elytra; - mappings[802] = ItemType.Emerald; - mappings[381] = ItemType.EmeraldBlock; - mappings[72] = ItemType.EmeraldOre; - mappings[1107] = ItemType.EnchantedBook; - mappings[882] = ItemType.EnchantedGoldenApple; - mappings[374] = ItemType.EnchantingTable; - mappings[1142] = ItemType.EndCrystal; - mappings[375] = ItemType.EndPortalFrame; - mappings[291] = ItemType.EndRod; - mappings[376] = ItemType.EndStone; - mappings[643] = ItemType.EndStoneBrickSlab; - mappings[625] = ItemType.EndStoneBrickStairs; - mappings[409] = ItemType.EndStoneBrickWall; - mappings[377] = ItemType.EndStoneBricks; - mappings[380] = ItemType.EnderChest; - mappings[1022] = ItemType.EnderDragonSpawnEgg; - mappings[1003] = ItemType.EnderEye; - mappings[990] = ItemType.EnderPearl; - mappings[1023] = ItemType.EndermanSpawnEgg; - mappings[1024] = ItemType.EndermiteSpawnEgg; - mappings[1025] = ItemType.EvokerSpawnEgg; - mappings[1083] = ItemType.ExperienceBottle; - mappings[1281] = ItemType.ExplorerPotterySherd; - mappings[96] = ItemType.ExposedChiseledCopper; - mappings[92] = ItemType.ExposedCopper; - mappings[1303] = ItemType.ExposedCopperBulb; - mappings[722] = ItemType.ExposedCopperDoor; - mappings[1295] = ItemType.ExposedCopperGrate; - mappings[742] = ItemType.ExposedCopperTrapdoor; - mappings[100] = ItemType.ExposedCutCopper; - mappings[108] = ItemType.ExposedCutCopperSlab; - mappings[104] = ItemType.ExposedCutCopperStairs; - mappings[1263] = ItemType.EyeArmorTrimSmithingTemplate; - mappings[300] = ItemType.Farmland; - mappings[848] = ItemType.Feather; - mappings[998] = ItemType.FermentedSpiderEye; - mappings[195] = ItemType.Fern; - mappings[979] = ItemType.FilledMap; - mappings[1084] = ItemType.FireCharge; - mappings[601] = ItemType.FireCoral; - mappings[596] = ItemType.FireCoralBlock; - mappings[611] = ItemType.FireCoralFan; - mappings[1105] = ItemType.FireworkRocket; - mappings[1106] = ItemType.FireworkStar; - mappings[928] = ItemType.FishingRod; - mappings[1197] = ItemType.FletchingTable; - mappings[877] = ItemType.Flint; - mappings[795] = ItemType.FlintAndSteel; - mappings[1185] = ItemType.FlowerBannerPattern; - mappings[1089] = ItemType.FlowerPot; - mappings[197] = ItemType.FloweringAzalea; - mappings[184] = ItemType.FloweringAzaleaLeaves; - mappings[1026] = ItemType.FoxSpawnEgg; - mappings[1282] = ItemType.FriendPotterySherd; - mappings[1027] = ItemType.FrogSpawnEgg; - mappings[1254] = ItemType.Frogspawn; - mappings[301] = ItemType.Furnace; - mappings[767] = ItemType.FurnaceMinecart; - mappings[1028] = ItemType.GhastSpawnEgg; - mappings[992] = ItemType.GhastTear; - mappings[1219] = ItemType.GildedBlackstone; - mappings[187] = ItemType.Glass; - mappings[996] = ItemType.GlassBottle; - mappings[356] = ItemType.GlassPane; - mappings[1004] = ItemType.GlisteringMelonSlice; - mappings[1189] = ItemType.GlobeBannerPattern; - mappings[1205] = ItemType.GlowBerries; - mappings[939] = ItemType.GlowInkSac; - mappings[1088] = ItemType.GlowItemFrame; - mappings[359] = ItemType.GlowLichen; - mappings[1029] = ItemType.GlowSquidSpawnEgg; - mappings[331] = ItemType.Glowstone; - mappings[931] = ItemType.GlowstoneDust; - mappings[1191] = ItemType.GoatHorn; - mappings[1030] = ItemType.GoatSpawnEgg; - mappings[89] = ItemType.GoldBlock; - mappings[811] = ItemType.GoldIngot; - mappings[993] = ItemType.GoldNugget; - mappings[68] = ItemType.GoldOre; - mappings[881] = ItemType.GoldenApple; - mappings[827] = ItemType.GoldenAxe; - mappings[872] = ItemType.GoldenBoots; - mappings[1095] = ItemType.GoldenCarrot; - mappings[870] = ItemType.GoldenChestplate; - mappings[869] = ItemType.GoldenHelmet; - mappings[828] = ItemType.GoldenHoe; - mappings[1118] = ItemType.GoldenHorseArmor; - mappings[871] = ItemType.GoldenLeggings; - mappings[826] = ItemType.GoldenPickaxe; - mappings[825] = ItemType.GoldenShovel; - mappings[824] = ItemType.GoldenSword; - mappings[2] = ItemType.Granite; - mappings[646] = ItemType.GraniteSlab; - mappings[629] = ItemType.GraniteStairs; - mappings[402] = ItemType.GraniteWall; - mappings[27] = ItemType.GrassBlock; - mappings[61] = ItemType.Gravel; - mappings[1133] = ItemType.GrayBanner; - mappings[968] = ItemType.GrayBed; - mappings[1237] = ItemType.GrayCandle; - mappings[452] = ItemType.GrayCarpet; - mappings[561] = ItemType.GrayConcrete; - mappings[577] = ItemType.GrayConcretePowder; - mappings[948] = ItemType.GrayDye; - mappings[545] = ItemType.GrayGlazedTerracotta; - mappings[529] = ItemType.GrayShulkerBox; - mappings[477] = ItemType.GrayStainedGlass; - mappings[493] = ItemType.GrayStainedGlassPane; - mappings[433] = ItemType.GrayTerracotta; - mappings[208] = ItemType.GrayWool; - mappings[1139] = ItemType.GreenBanner; - mappings[974] = ItemType.GreenBed; - mappings[1243] = ItemType.GreenCandle; - mappings[458] = ItemType.GreenCarpet; - mappings[567] = ItemType.GreenConcrete; - mappings[583] = ItemType.GreenConcretePowder; - mappings[954] = ItemType.GreenDye; - mappings[551] = ItemType.GreenGlazedTerracotta; - mappings[535] = ItemType.GreenShulkerBox; - mappings[483] = ItemType.GreenStainedGlass; - mappings[499] = ItemType.GreenStainedGlassPane; - mappings[439] = ItemType.GreenTerracotta; - mappings[214] = ItemType.GreenWool; - mappings[1198] = ItemType.Grindstone; - mappings[1031] = ItemType.GuardianSpawnEgg; - mappings[849] = ItemType.Gunpowder; - mappings[247] = ItemType.HangingRoots; - mappings[444] = ItemType.HayBlock; - mappings[1181] = ItemType.HeartOfTheSea; - mappings[1283] = ItemType.HeartPotterySherd; - mappings[1284] = ItemType.HeartbreakPotterySherd; - mappings[697] = ItemType.HeavyWeightedPressurePlate; - mappings[1032] = ItemType.HoglinSpawnEgg; - mappings[664] = ItemType.HoneyBlock; - mappings[1212] = ItemType.HoneyBottle; - mappings[1209] = ItemType.Honeycomb; - mappings[1213] = ItemType.HoneycombBlock; - mappings[666] = ItemType.Hopper; - mappings[769] = ItemType.HopperMinecart; - mappings[602] = ItemType.HornCoral; - mappings[597] = ItemType.HornCoralBlock; - mappings[612] = ItemType.HornCoralFan; - mappings[1033] = ItemType.HorseSpawnEgg; - mappings[1273] = ItemType.HostArmorTrimSmithingTemplate; - mappings[1285] = ItemType.HowlPotterySherd; - mappings[1034] = ItemType.HuskSpawnEgg; - mappings[305] = ItemType.Ice; - mappings[337] = ItemType.InfestedChiseledStoneBricks; - mappings[333] = ItemType.InfestedCobblestone; - mappings[336] = ItemType.InfestedCrackedStoneBricks; - mappings[338] = ItemType.InfestedDeepslate; - mappings[335] = ItemType.InfestedMossyStoneBricks; - mappings[332] = ItemType.InfestedStone; - mappings[334] = ItemType.InfestedStoneBricks; - mappings[938] = ItemType.InkSac; - mappings[832] = ItemType.IronAxe; - mappings[354] = ItemType.IronBars; - mappings[87] = ItemType.IronBlock; - mappings[864] = ItemType.IronBoots; - mappings[862] = ItemType.IronChestplate; - mappings[709] = ItemType.IronDoor; - mappings[1035] = ItemType.IronGolemSpawnEgg; - mappings[861] = ItemType.IronHelmet; - mappings[833] = ItemType.IronHoe; - mappings[1117] = ItemType.IronHorseArmor; - mappings[807] = ItemType.IronIngot; - mappings[863] = ItemType.IronLeggings; - mappings[1158] = ItemType.IronNugget; - mappings[64] = ItemType.IronOre; - mappings[831] = ItemType.IronPickaxe; - mappings[830] = ItemType.IronShovel; - mappings[829] = ItemType.IronSword; - mappings[729] = ItemType.IronTrapdoor; - mappings[1087] = ItemType.ItemFrame; - mappings[323] = ItemType.JackOLantern; - mappings[792] = ItemType.Jigsaw; - mappings[309] = ItemType.Jukebox; - mappings[779] = ItemType.JungleBoat; - mappings[686] = ItemType.JungleButton; - mappings[780] = ItemType.JungleChestBoat; - mappings[713] = ItemType.JungleDoor; - mappings[313] = ItemType.JungleFence; - mappings[752] = ItemType.JungleFenceGate; - mappings[897] = ItemType.JungleHangingSign; - mappings[178] = ItemType.JungleLeaves; - mappings[134] = ItemType.JungleLog; - mappings[39] = ItemType.JunglePlanks; - mappings[701] = ItemType.JunglePressurePlate; - mappings[51] = ItemType.JungleSapling; - mappings[886] = ItemType.JungleSign; - mappings[254] = ItemType.JungleSlab; - mappings[385] = ItemType.JungleStairs; - mappings[733] = ItemType.JungleTrapdoor; - mappings[168] = ItemType.JungleWood; - mappings[243] = ItemType.Kelp; - mappings[1159] = ItemType.KnowledgeBook; - mappings[302] = ItemType.Ladder; - mappings[1202] = ItemType.Lantern; - mappings[189] = ItemType.LapisBlock; - mappings[803] = ItemType.LapisLazuli; - mappings[74] = ItemType.LapisOre; - mappings[1248] = ItemType.LargeAmethystBud; - mappings[469] = ItemType.LargeFern; - mappings[907] = ItemType.LavaBucket; - mappings[1121] = ItemType.Lead; - mappings[910] = ItemType.Leather; - mappings[856] = ItemType.LeatherBoots; - mappings[854] = ItemType.LeatherChestplate; - mappings[853] = ItemType.LeatherHelmet; - mappings[1120] = ItemType.LeatherHorseArmor; - mappings[855] = ItemType.LeatherLeggings; - mappings[669] = ItemType.Lectern; - mappings[671] = ItemType.Lever; - mappings[443] = ItemType.Light; - mappings[1129] = ItemType.LightBlueBanner; - mappings[964] = ItemType.LightBlueBed; - mappings[1233] = ItemType.LightBlueCandle; - mappings[448] = ItemType.LightBlueCarpet; - mappings[557] = ItemType.LightBlueConcrete; - mappings[573] = ItemType.LightBlueConcretePowder; - mappings[944] = ItemType.LightBlueDye; - mappings[541] = ItemType.LightBlueGlazedTerracotta; - mappings[525] = ItemType.LightBlueShulkerBox; - mappings[473] = ItemType.LightBlueStainedGlass; - mappings[489] = ItemType.LightBlueStainedGlassPane; - mappings[429] = ItemType.LightBlueTerracotta; - mappings[204] = ItemType.LightBlueWool; - mappings[1134] = ItemType.LightGrayBanner; - mappings[969] = ItemType.LightGrayBed; - mappings[1238] = ItemType.LightGrayCandle; - mappings[453] = ItemType.LightGrayCarpet; - mappings[562] = ItemType.LightGrayConcrete; - mappings[578] = ItemType.LightGrayConcretePowder; - mappings[949] = ItemType.LightGrayDye; - mappings[546] = ItemType.LightGrayGlazedTerracotta; - mappings[530] = ItemType.LightGrayShulkerBox; - mappings[478] = ItemType.LightGrayStainedGlass; - mappings[494] = ItemType.LightGrayStainedGlassPane; - mappings[434] = ItemType.LightGrayTerracotta; - mappings[209] = ItemType.LightGrayWool; - mappings[696] = ItemType.LightWeightedPressurePlate; - mappings[672] = ItemType.LightningRod; - mappings[465] = ItemType.Lilac; - mappings[228] = ItemType.LilyOfTheValley; - mappings[364] = ItemType.LilyPad; - mappings[1131] = ItemType.LimeBanner; - mappings[966] = ItemType.LimeBed; - mappings[1235] = ItemType.LimeCandle; - mappings[450] = ItemType.LimeCarpet; - mappings[559] = ItemType.LimeConcrete; - mappings[575] = ItemType.LimeConcretePowder; - mappings[946] = ItemType.LimeDye; - mappings[543] = ItemType.LimeGlazedTerracotta; - mappings[527] = ItemType.LimeShulkerBox; - mappings[475] = ItemType.LimeStainedGlass; - mappings[491] = ItemType.LimeStainedGlassPane; - mappings[431] = ItemType.LimeTerracotta; - mappings[206] = ItemType.LimeWool; - mappings[1154] = ItemType.LingeringPotion; - mappings[1036] = ItemType.LlamaSpawnEgg; - mappings[1214] = ItemType.Lodestone; - mappings[1184] = ItemType.Loom; - mappings[1128] = ItemType.MagentaBanner; - mappings[963] = ItemType.MagentaBed; - mappings[1232] = ItemType.MagentaCandle; - mappings[447] = ItemType.MagentaCarpet; - mappings[556] = ItemType.MagentaConcrete; - mappings[572] = ItemType.MagentaConcretePowder; - mappings[943] = ItemType.MagentaDye; - mappings[540] = ItemType.MagentaGlazedTerracotta; - mappings[524] = ItemType.MagentaShulkerBox; - mappings[472] = ItemType.MagentaStainedGlass; - mappings[488] = ItemType.MagentaStainedGlassPane; - mappings[428] = ItemType.MagentaTerracotta; - mappings[203] = ItemType.MagentaWool; - mappings[515] = ItemType.MagmaBlock; - mappings[1000] = ItemType.MagmaCream; - mappings[1037] = ItemType.MagmaCubeSpawnEgg; - mappings[787] = ItemType.MangroveBoat; - mappings[690] = ItemType.MangroveButton; - mappings[788] = ItemType.MangroveChestBoat; - mappings[717] = ItemType.MangroveDoor; - mappings[317] = ItemType.MangroveFence; - mappings[756] = ItemType.MangroveFenceGate; - mappings[901] = ItemType.MangroveHangingSign; - mappings[182] = ItemType.MangroveLeaves; - mappings[138] = ItemType.MangroveLog; - mappings[43] = ItemType.MangrovePlanks; - mappings[705] = ItemType.MangrovePressurePlate; - mappings[55] = ItemType.MangrovePropagule; - mappings[139] = ItemType.MangroveRoots; - mappings[890] = ItemType.MangroveSign; - mappings[258] = ItemType.MangroveSlab; - mappings[389] = ItemType.MangroveStairs; - mappings[737] = ItemType.MangroveTrapdoor; - mappings[172] = ItemType.MangroveWood; - mappings[1094] = ItemType.Map; - mappings[1247] = ItemType.MediumAmethystBud; - mappings[357] = ItemType.Melon; - mappings[984] = ItemType.MelonSeeds; - mappings[981] = ItemType.MelonSlice; - mappings[911] = ItemType.MilkBucket; - mappings[765] = ItemType.Minecart; - mappings[1286] = ItemType.MinerPotterySherd; - mappings[1188] = ItemType.MojangBannerPattern; - mappings[1038] = ItemType.MooshroomSpawnEgg; - mappings[246] = ItemType.MossBlock; - mappings[244] = ItemType.MossCarpet; - mappings[288] = ItemType.MossyCobblestone; - mappings[642] = ItemType.MossyCobblestoneSlab; - mappings[624] = ItemType.MossyCobblestoneStairs; - mappings[397] = ItemType.MossyCobblestoneWall; - mappings[640] = ItemType.MossyStoneBrickSlab; - mappings[622] = ItemType.MossyStoneBrickStairs; - mappings[401] = ItemType.MossyStoneBrickWall; - mappings[340] = ItemType.MossyStoneBricks; - mappings[1287] = ItemType.MournerPotterySherd; - mappings[32] = ItemType.Mud; - mappings[271] = ItemType.MudBrickSlab; - mappings[362] = ItemType.MudBrickStairs; - mappings[404] = ItemType.MudBrickWall; - mappings[344] = ItemType.MudBricks; - mappings[140] = ItemType.MuddyMangroveRoots; - mappings[1039] = ItemType.MuleSpawnEgg; - mappings[353] = ItemType.MushroomStem; - mappings[846] = ItemType.MushroomStew; - mappings[1171] = ItemType.MusicDisc11; - mappings[1161] = ItemType.MusicDisc13; - mappings[1175] = ItemType.MusicDisc5; - mappings[1163] = ItemType.MusicDiscBlocks; - mappings[1162] = ItemType.MusicDiscCat; - mappings[1164] = ItemType.MusicDiscChirp; - mappings[1165] = ItemType.MusicDiscFar; - mappings[1166] = ItemType.MusicDiscMall; - mappings[1167] = ItemType.MusicDiscMellohi; - mappings[1173] = ItemType.MusicDiscOtherside; - mappings[1176] = ItemType.MusicDiscPigstep; - mappings[1174] = ItemType.MusicDiscRelic; - mappings[1168] = ItemType.MusicDiscStal; - mappings[1169] = ItemType.MusicDiscStrad; - mappings[1172] = ItemType.MusicDiscWait; - mappings[1170] = ItemType.MusicDiscWard; - mappings[1124] = ItemType.Mutton; - mappings[363] = ItemType.Mycelium; - mappings[1122] = ItemType.NameTag; - mappings[1180] = ItemType.NautilusShell; - mappings[1108] = ItemType.NetherBrick; - mappings[368] = ItemType.NetherBrickFence; - mappings[272] = ItemType.NetherBrickSlab; - mappings[369] = ItemType.NetherBrickStairs; - mappings[405] = ItemType.NetherBrickWall; - mappings[365] = ItemType.NetherBricks; - mappings[78] = ItemType.NetherGoldOre; - mappings[79] = ItemType.NetherQuartzOre; - mappings[239] = ItemType.NetherSprouts; - mappings[1103] = ItemType.NetherStar; - mappings[994] = ItemType.NetherWart; - mappings[516] = ItemType.NetherWartBlock; - mappings[842] = ItemType.NetheriteAxe; - mappings[91] = ItemType.NetheriteBlock; - mappings[876] = ItemType.NetheriteBoots; - mappings[874] = ItemType.NetheriteChestplate; - mappings[873] = ItemType.NetheriteHelmet; - mappings[843] = ItemType.NetheriteHoe; - mappings[812] = ItemType.NetheriteIngot; - mappings[875] = ItemType.NetheriteLeggings; - mappings[841] = ItemType.NetheritePickaxe; - mappings[813] = ItemType.NetheriteScrap; - mappings[840] = ItemType.NetheriteShovel; - mappings[839] = ItemType.NetheriteSword; - mappings[1257] = ItemType.NetheriteUpgradeSmithingTemplate; - mappings[324] = ItemType.Netherrack; - mappings[680] = ItemType.NoteBlock; - mappings[773] = ItemType.OakBoat; - mappings[683] = ItemType.OakButton; - mappings[774] = ItemType.OakChestBoat; - mappings[710] = ItemType.OakDoor; - mappings[310] = ItemType.OakFence; - mappings[749] = ItemType.OakFenceGate; - mappings[894] = ItemType.OakHangingSign; - mappings[175] = ItemType.OakLeaves; - mappings[131] = ItemType.OakLog; - mappings[36] = ItemType.OakPlanks; - mappings[698] = ItemType.OakPressurePlate; - mappings[48] = ItemType.OakSapling; - mappings[883] = ItemType.OakSign; - mappings[251] = ItemType.OakSlab; - mappings[382] = ItemType.OakStairs; - mappings[730] = ItemType.OakTrapdoor; - mappings[165] = ItemType.OakWood; - mappings[665] = ItemType.Observer; - mappings[289] = ItemType.Obsidian; - mappings[1040] = ItemType.OcelotSpawnEgg; - mappings[1251] = ItemType.OchreFroglight; - mappings[1127] = ItemType.OrangeBanner; - mappings[962] = ItemType.OrangeBed; - mappings[1231] = ItemType.OrangeCandle; - mappings[446] = ItemType.OrangeCarpet; - mappings[555] = ItemType.OrangeConcrete; - mappings[571] = ItemType.OrangeConcretePowder; - mappings[942] = ItemType.OrangeDye; - mappings[539] = ItemType.OrangeGlazedTerracotta; - mappings[523] = ItemType.OrangeShulkerBox; - mappings[471] = ItemType.OrangeStainedGlass; - mappings[487] = ItemType.OrangeStainedGlassPane; - mappings[427] = ItemType.OrangeTerracotta; - mappings[223] = ItemType.OrangeTulip; - mappings[202] = ItemType.OrangeWool; - mappings[226] = ItemType.OxeyeDaisy; - mappings[98] = ItemType.OxidizedChiseledCopper; - mappings[94] = ItemType.OxidizedCopper; - mappings[1305] = ItemType.OxidizedCopperBulb; - mappings[724] = ItemType.OxidizedCopperDoor; - mappings[1297] = ItemType.OxidizedCopperGrate; - mappings[744] = ItemType.OxidizedCopperTrapdoor; - mappings[102] = ItemType.OxidizedCutCopper; - mappings[110] = ItemType.OxidizedCutCopperSlab; - mappings[106] = ItemType.OxidizedCutCopperStairs; - mappings[462] = ItemType.PackedIce; - mappings[343] = ItemType.PackedMud; - mappings[880] = ItemType.Painting; - mappings[1041] = ItemType.PandaSpawnEgg; - mappings[921] = ItemType.Paper; - mappings[1042] = ItemType.ParrotSpawnEgg; - mappings[1253] = ItemType.PearlescentFroglight; - mappings[467] = ItemType.Peony; - mappings[267] = ItemType.PetrifiedOakSlab; - mappings[1179] = ItemType.PhantomMembrane; - mappings[1043] = ItemType.PhantomSpawnEgg; - mappings[1044] = ItemType.PigSpawnEgg; - mappings[1190] = ItemType.PiglinBannerPattern; - mappings[1046] = ItemType.PiglinBruteSpawnEgg; - mappings[1102] = ItemType.PiglinHead; - mappings[1045] = ItemType.PiglinSpawnEgg; - mappings[1047] = ItemType.PillagerSpawnEgg; - mappings[1132] = ItemType.PinkBanner; - mappings[967] = ItemType.PinkBed; - mappings[1236] = ItemType.PinkCandle; - mappings[451] = ItemType.PinkCarpet; - mappings[560] = ItemType.PinkConcrete; - mappings[576] = ItemType.PinkConcretePowder; - mappings[947] = ItemType.PinkDye; - mappings[544] = ItemType.PinkGlazedTerracotta; - mappings[245] = ItemType.PinkPetals; - mappings[528] = ItemType.PinkShulkerBox; - mappings[476] = ItemType.PinkStainedGlass; - mappings[492] = ItemType.PinkStainedGlassPane; - mappings[432] = ItemType.PinkTerracotta; - mappings[225] = ItemType.PinkTulip; - mappings[207] = ItemType.PinkWool; - mappings[661] = ItemType.Piston; - mappings[231] = ItemType.PitcherPlant; - mappings[1146] = ItemType.PitcherPod; - mappings[1098] = ItemType.PlayerHead; - mappings[1288] = ItemType.PlentyPotterySherd; - mappings[30] = ItemType.Podzol; - mappings[1250] = ItemType.PointedDripstone; - mappings[1093] = ItemType.PoisonousPotato; - mappings[1048] = ItemType.PolarBearSpawnEgg; - mappings[7] = ItemType.PolishedAndesite; - mappings[649] = ItemType.PolishedAndesiteSlab; - mappings[632] = ItemType.PolishedAndesiteStairs; - mappings[328] = ItemType.PolishedBasalt; - mappings[1220] = ItemType.PolishedBlackstone; - mappings[1225] = ItemType.PolishedBlackstoneBrickSlab; - mappings[1226] = ItemType.PolishedBlackstoneBrickStairs; - mappings[413] = ItemType.PolishedBlackstoneBrickWall; - mappings[1224] = ItemType.PolishedBlackstoneBricks; - mappings[682] = ItemType.PolishedBlackstoneButton; - mappings[695] = ItemType.PolishedBlackstonePressurePlate; - mappings[1221] = ItemType.PolishedBlackstoneSlab; - mappings[1222] = ItemType.PolishedBlackstoneStairs; - mappings[412] = ItemType.PolishedBlackstoneWall; - mappings[10] = ItemType.PolishedDeepslate; - mappings[652] = ItemType.PolishedDeepslateSlab; - mappings[635] = ItemType.PolishedDeepslateStairs; - mappings[415] = ItemType.PolishedDeepslateWall; - mappings[5] = ItemType.PolishedDiorite; - mappings[641] = ItemType.PolishedDioriteSlab; - mappings[623] = ItemType.PolishedDioriteStairs; - mappings[3] = ItemType.PolishedGranite; - mappings[638] = ItemType.PolishedGraniteSlab; - mappings[620] = ItemType.PolishedGraniteStairs; - mappings[17] = ItemType.PolishedTuff; - mappings[18] = ItemType.PolishedTuffSlab; - mappings[19] = ItemType.PolishedTuffStairs; - mappings[20] = ItemType.PolishedTuffWall; - mappings[1144] = ItemType.PoppedChorusFruit; - mappings[218] = ItemType.Poppy; - mappings[878] = ItemType.Porkchop; - mappings[1091] = ItemType.Potato; - mappings[995] = ItemType.Potion; - mappings[908] = ItemType.PowderSnowBucket; - mappings[760] = ItemType.PoweredRail; - mappings[502] = ItemType.Prismarine; - mappings[278] = ItemType.PrismarineBrickSlab; - mappings[506] = ItemType.PrismarineBrickStairs; - mappings[503] = ItemType.PrismarineBricks; - mappings[1110] = ItemType.PrismarineCrystals; - mappings[1109] = ItemType.PrismarineShard; - mappings[277] = ItemType.PrismarineSlab; - mappings[505] = ItemType.PrismarineStairs; - mappings[399] = ItemType.PrismarineWall; - mappings[1289] = ItemType.PrizePotterySherd; - mappings[935] = ItemType.Pufferfish; - mappings[912] = ItemType.PufferfishBucket; - mappings[1049] = ItemType.PufferfishSpawnEgg; - mappings[321] = ItemType.Pumpkin; - mappings[1104] = ItemType.PumpkinPie; - mappings[983] = ItemType.PumpkinSeeds; - mappings[1136] = ItemType.PurpleBanner; - mappings[971] = ItemType.PurpleBed; - mappings[1240] = ItemType.PurpleCandle; - mappings[455] = ItemType.PurpleCarpet; - mappings[564] = ItemType.PurpleConcrete; - mappings[580] = ItemType.PurpleConcretePowder; - mappings[951] = ItemType.PurpleDye; - mappings[548] = ItemType.PurpleGlazedTerracotta; - mappings[532] = ItemType.PurpleShulkerBox; - mappings[480] = ItemType.PurpleStainedGlass; - mappings[496] = ItemType.PurpleStainedGlassPane; - mappings[436] = ItemType.PurpleTerracotta; - mappings[211] = ItemType.PurpleWool; - mappings[294] = ItemType.PurpurBlock; - mappings[295] = ItemType.PurpurPillar; - mappings[276] = ItemType.PurpurSlab; - mappings[296] = ItemType.PurpurStairs; - mappings[804] = ItemType.Quartz; - mappings[422] = ItemType.QuartzBlock; - mappings[423] = ItemType.QuartzBricks; - mappings[424] = ItemType.QuartzPillar; - mappings[273] = ItemType.QuartzSlab; - mappings[425] = ItemType.QuartzStairs; - mappings[1111] = ItemType.Rabbit; - mappings[1114] = ItemType.RabbitFoot; - mappings[1115] = ItemType.RabbitHide; - mappings[1050] = ItemType.RabbitSpawnEgg; - mappings[1113] = ItemType.RabbitStew; - mappings[762] = ItemType.Rail; - mappings[1272] = ItemType.RaiserArmorTrimSmithingTemplate; - mappings[1051] = ItemType.RavagerSpawnEgg; - mappings[808] = ItemType.RawCopper; - mappings[83] = ItemType.RawCopperBlock; - mappings[810] = ItemType.RawGold; - mappings[84] = ItemType.RawGoldBlock; - mappings[806] = ItemType.RawIron; - mappings[82] = ItemType.RawIronBlock; - mappings[926] = ItemType.RecoveryCompass; - mappings[1140] = ItemType.RedBanner; - mappings[975] = ItemType.RedBed; - mappings[1244] = ItemType.RedCandle; - mappings[459] = ItemType.RedCarpet; - mappings[568] = ItemType.RedConcrete; - mappings[584] = ItemType.RedConcretePowder; - mappings[955] = ItemType.RedDye; - mappings[552] = ItemType.RedGlazedTerracotta; - mappings[234] = ItemType.RedMushroom; - mappings[352] = ItemType.RedMushroomBlock; - mappings[648] = ItemType.RedNetherBrickSlab; - mappings[631] = ItemType.RedNetherBrickStairs; - mappings[407] = ItemType.RedNetherBrickWall; - mappings[518] = ItemType.RedNetherBricks; - mappings[60] = ItemType.RedSand; - mappings[509] = ItemType.RedSandstone; - mappings[274] = ItemType.RedSandstoneSlab; - mappings[512] = ItemType.RedSandstoneStairs; - mappings[400] = ItemType.RedSandstoneWall; - mappings[536] = ItemType.RedShulkerBox; - mappings[484] = ItemType.RedStainedGlass; - mappings[500] = ItemType.RedStainedGlassPane; - mappings[440] = ItemType.RedTerracotta; - mappings[222] = ItemType.RedTulip; - mappings[215] = ItemType.RedWool; - mappings[656] = ItemType.Redstone; - mappings[658] = ItemType.RedstoneBlock; - mappings[679] = ItemType.RedstoneLamp; - mappings[70] = ItemType.RedstoneOre; - mappings[657] = ItemType.RedstoneTorch; - mappings[350] = ItemType.ReinforcedDeepslate; - mappings[659] = ItemType.Repeater; - mappings[513] = ItemType.RepeatingCommandBlock; - mappings[1228] = ItemType.RespawnAnchor; - mappings[1267] = ItemType.RibArmorTrimSmithingTemplate; - mappings[31] = ItemType.RootedDirt; - mappings[466] = ItemType.RoseBush; - mappings[989] = ItemType.RottenFlesh; - mappings[764] = ItemType.Saddle; - mappings[933] = ItemType.Salmon; - mappings[913] = ItemType.SalmonBucket; - mappings[1052] = ItemType.SalmonSpawnEgg; - mappings[57] = ItemType.Sand; - mappings[190] = ItemType.Sandstone; - mappings[265] = ItemType.SandstoneSlab; - mappings[379] = ItemType.SandstoneStairs; - mappings[408] = ItemType.SandstoneWall; - mappings[655] = ItemType.Scaffolding; - mappings[370] = ItemType.Sculk; - mappings[372] = ItemType.SculkCatalyst; - mappings[674] = ItemType.SculkSensor; - mappings[373] = ItemType.SculkShrieker; - mappings[371] = ItemType.SculkVein; - mappings[794] = ItemType.TurtleScute; - mappings[508] = ItemType.SeaLantern; - mappings[200] = ItemType.SeaPickle; - mappings[199] = ItemType.Seagrass; - mappings[1258] = ItemType.SentryArmorTrimSmithingTemplate; - mappings[1270] = ItemType.ShaperArmorTrimSmithingTemplate; - mappings[1290] = ItemType.SheafPotterySherd; - mappings[980] = ItemType.Shears; - mappings[1053] = ItemType.SheepSpawnEgg; - mappings[1291] = ItemType.ShelterPotterySherd; - mappings[1155] = ItemType.Shield; - mappings[194] = ItemType.ShortGrass; - mappings[1208] = ItemType.Shroomlight; - mappings[521] = ItemType.ShulkerBox; - mappings[1157] = ItemType.ShulkerShell; - mappings[1054] = ItemType.ShulkerSpawnEgg; - mappings[1271] = ItemType.SilenceArmorTrimSmithingTemplate; - mappings[1055] = ItemType.SilverfishSpawnEgg; - mappings[1057] = ItemType.SkeletonHorseSpawnEgg; - mappings[1096] = ItemType.SkeletonSkull; - mappings[1056] = ItemType.SkeletonSpawnEgg; - mappings[1187] = ItemType.SkullBannerPattern; - mappings[1292] = ItemType.SkullPotterySherd; - mappings[923] = ItemType.SlimeBall; - mappings[663] = ItemType.SlimeBlock; - mappings[1058] = ItemType.SlimeSpawnEgg; - mappings[1246] = ItemType.SmallAmethystBud; - mappings[249] = ItemType.SmallDripleaf; - mappings[1199] = ItemType.SmithingTable; - mappings[1194] = ItemType.Smoker; - mappings[329] = ItemType.SmoothBasalt; - mappings[280] = ItemType.SmoothQuartz; - mappings[645] = ItemType.SmoothQuartzSlab; - mappings[628] = ItemType.SmoothQuartzStairs; - mappings[281] = ItemType.SmoothRedSandstone; - mappings[639] = ItemType.SmoothRedSandstoneSlab; - mappings[621] = ItemType.SmoothRedSandstoneStairs; - mappings[282] = ItemType.SmoothSandstone; - mappings[644] = ItemType.SmoothSandstoneSlab; - mappings[627] = ItemType.SmoothSandstoneStairs; - mappings[283] = ItemType.SmoothStone; - mappings[264] = ItemType.SmoothStoneSlab; - mappings[587] = ItemType.SnifferEgg; - mappings[1059] = ItemType.SnifferSpawnEgg; - mappings[1293] = ItemType.SnortPotterySherd; - mappings[1266] = ItemType.SnoutArmorTrimSmithingTemplate; - mappings[304] = ItemType.Snow; - mappings[306] = ItemType.SnowBlock; - mappings[1060] = ItemType.SnowGolemSpawnEgg; - mappings[909] = ItemType.Snowball; - mappings[1207] = ItemType.SoulCampfire; - mappings[1203] = ItemType.SoulLantern; - mappings[325] = ItemType.SoulSand; - mappings[326] = ItemType.SoulSoil; - mappings[330] = ItemType.SoulTorch; - mappings[297] = ItemType.Spawner; - mappings[1152] = ItemType.SpectralArrow; - mappings[997] = ItemType.SpiderEye; - mappings[1061] = ItemType.SpiderSpawnEgg; - mappings[1268] = ItemType.SpireArmorTrimSmithingTemplate; - mappings[1151] = ItemType.SplashPotion; - mappings[185] = ItemType.Sponge; - mappings[232] = ItemType.SporeBlossom; - mappings[775] = ItemType.SpruceBoat; - mappings[684] = ItemType.SpruceButton; - mappings[776] = ItemType.SpruceChestBoat; - mappings[711] = ItemType.SpruceDoor; - mappings[311] = ItemType.SpruceFence; - mappings[750] = ItemType.SpruceFenceGate; - mappings[895] = ItemType.SpruceHangingSign; - mappings[176] = ItemType.SpruceLeaves; - mappings[132] = ItemType.SpruceLog; - mappings[37] = ItemType.SprucePlanks; - mappings[699] = ItemType.SprucePressurePlate; - mappings[49] = ItemType.SpruceSapling; - mappings[884] = ItemType.SpruceSign; - mappings[252] = ItemType.SpruceSlab; - mappings[383] = ItemType.SpruceStairs; - mappings[731] = ItemType.SpruceTrapdoor; - mappings[166] = ItemType.SpruceWood; - mappings[930] = ItemType.Spyglass; - mappings[1062] = ItemType.SquidSpawnEgg; - mappings[844] = ItemType.Stick; - mappings[662] = ItemType.StickyPiston; - mappings[1] = ItemType.Stone; - mappings[822] = ItemType.StoneAxe; - mappings[270] = ItemType.StoneBrickSlab; - mappings[361] = ItemType.StoneBrickStairs; - mappings[403] = ItemType.StoneBrickWall; - mappings[339] = ItemType.StoneBricks; - mappings[681] = ItemType.StoneButton; - mappings[823] = ItemType.StoneHoe; - mappings[821] = ItemType.StonePickaxe; - mappings[694] = ItemType.StonePressurePlate; - mappings[820] = ItemType.StoneShovel; - mappings[263] = ItemType.StoneSlab; - mappings[626] = ItemType.StoneStairs; - mappings[819] = ItemType.StoneSword; - mappings[1200] = ItemType.Stonecutter; - mappings[1063] = ItemType.StraySpawnEgg; - mappings[1064] = ItemType.StriderSpawnEgg; - mappings[847] = ItemType.String; - mappings[148] = ItemType.StrippedAcaciaLog; - mappings[158] = ItemType.StrippedAcaciaWood; - mappings[164] = ItemType.StrippedBambooBlock; - mappings[146] = ItemType.StrippedBirchLog; - mappings[156] = ItemType.StrippedBirchWood; - mappings[149] = ItemType.StrippedCherryLog; - mappings[159] = ItemType.StrippedCherryWood; - mappings[162] = ItemType.StrippedCrimsonHyphae; - mappings[152] = ItemType.StrippedCrimsonStem; - mappings[150] = ItemType.StrippedDarkOakLog; - mappings[160] = ItemType.StrippedDarkOakWood; - mappings[147] = ItemType.StrippedJungleLog; - mappings[157] = ItemType.StrippedJungleWood; - mappings[151] = ItemType.StrippedMangroveLog; - mappings[161] = ItemType.StrippedMangroveWood; - mappings[144] = ItemType.StrippedOakLog; - mappings[154] = ItemType.StrippedOakWood; - mappings[145] = ItemType.StrippedSpruceLog; - mappings[155] = ItemType.StrippedSpruceWood; - mappings[163] = ItemType.StrippedWarpedHyphae; - mappings[153] = ItemType.StrippedWarpedStem; - mappings[791] = ItemType.StructureBlock; - mappings[520] = ItemType.StructureVoid; - mappings[959] = ItemType.Sugar; - mappings[242] = ItemType.SugarCane; - mappings[464] = ItemType.Sunflower; - mappings[59] = ItemType.SuspiciousGravel; - mappings[58] = ItemType.SuspiciousSand; - mappings[1183] = ItemType.SuspiciousStew; - mappings[1204] = ItemType.SweetBerries; - mappings[917] = ItemType.TadpoleBucket; - mappings[1065] = ItemType.TadpoleSpawnEgg; - mappings[468] = ItemType.TallGrass; - mappings[670] = ItemType.Target; - mappings[461] = ItemType.Terracotta; - mappings[1265] = ItemType.TideArmorTrimSmithingTemplate; - mappings[188] = ItemType.TintedGlass; - mappings[1153] = ItemType.TippedArrow; - mappings[678] = ItemType.Tnt; - mappings[768] = ItemType.TntMinecart; - mappings[290] = ItemType.Torch; - mappings[230] = ItemType.Torchflower; - mappings[1145] = ItemType.TorchflowerSeeds; - mappings[1156] = ItemType.TotemOfUndying; - mappings[1066] = ItemType.TraderLlamaSpawnEgg; - mappings[677] = ItemType.TrappedChest; - mappings[1311] = ItemType.TrialKey; - mappings[1310] = ItemType.TrialSpawner; - mappings[1178] = ItemType.Trident; - mappings[676] = ItemType.TripwireHook; - mappings[934] = ItemType.TropicalFish; - mappings[915] = ItemType.TropicalFishBucket; - mappings[1067] = ItemType.TropicalFishSpawnEgg; - mappings[598] = ItemType.TubeCoral; - mappings[593] = ItemType.TubeCoralBlock; - mappings[608] = ItemType.TubeCoralFan; - mappings[12] = ItemType.Tuff; - mappings[22] = ItemType.TuffBrickSlab; - mappings[23] = ItemType.TuffBrickStairs; - mappings[24] = ItemType.TuffBrickWall; - mappings[21] = ItemType.TuffBricks; - mappings[13] = ItemType.TuffSlab; - mappings[14] = ItemType.TuffStairs; - mappings[15] = ItemType.TuffWall; - mappings[586] = ItemType.TurtleEgg; - mappings[793] = ItemType.TurtleHelmet; - mappings[1068] = ItemType.TurtleSpawnEgg; - mappings[241] = ItemType.TwistingVines; - mappings[1252] = ItemType.VerdantFroglight; - mappings[1264] = ItemType.VexArmorTrimSmithingTemplate; - mappings[1069] = ItemType.VexSpawnEgg; - mappings[1070] = ItemType.VillagerSpawnEgg; - mappings[1071] = ItemType.VindicatorSpawnEgg; - mappings[358] = ItemType.Vine; - mappings[1072] = ItemType.WanderingTraderSpawnEgg; - mappings[1262] = ItemType.WardArmorTrimSmithingTemplate; - mappings[1073] = ItemType.WardenSpawnEgg; - mappings[693] = ItemType.WarpedButton; - mappings[720] = ItemType.WarpedDoor; - mappings[320] = ItemType.WarpedFence; - mappings[759] = ItemType.WarpedFenceGate; - mappings[236] = ItemType.WarpedFungus; - mappings[771] = ItemType.WarpedFungusOnAStick; - mappings[904] = ItemType.WarpedHangingSign; - mappings[174] = ItemType.WarpedHyphae; - mappings[34] = ItemType.WarpedNylium; - mappings[46] = ItemType.WarpedPlanks; - mappings[708] = ItemType.WarpedPressurePlate; - mappings[238] = ItemType.WarpedRoots; - mappings[893] = ItemType.WarpedSign; - mappings[262] = ItemType.WarpedSlab; - mappings[393] = ItemType.WarpedStairs; - mappings[142] = ItemType.WarpedStem; - mappings[740] = ItemType.WarpedTrapdoor; - mappings[517] = ItemType.WarpedWartBlock; - mappings[906] = ItemType.WaterBucket; - mappings[115] = ItemType.WaxedChiseledCopper; - mappings[111] = ItemType.WaxedCopperBlock; - mappings[1306] = ItemType.WaxedCopperBulb; - mappings[725] = ItemType.WaxedCopperDoor; - mappings[1298] = ItemType.WaxedCopperGrate; - mappings[745] = ItemType.WaxedCopperTrapdoor; - mappings[119] = ItemType.WaxedCutCopper; - mappings[127] = ItemType.WaxedCutCopperSlab; - mappings[123] = ItemType.WaxedCutCopperStairs; - mappings[116] = ItemType.WaxedExposedChiseledCopper; - mappings[112] = ItemType.WaxedExposedCopper; - mappings[1307] = ItemType.WaxedExposedCopperBulb; - mappings[726] = ItemType.WaxedExposedCopperDoor; - mappings[1299] = ItemType.WaxedExposedCopperGrate; - mappings[746] = ItemType.WaxedExposedCopperTrapdoor; - mappings[120] = ItemType.WaxedExposedCutCopper; - mappings[128] = ItemType.WaxedExposedCutCopperSlab; - mappings[124] = ItemType.WaxedExposedCutCopperStairs; - mappings[118] = ItemType.WaxedOxidizedChiseledCopper; - mappings[114] = ItemType.WaxedOxidizedCopper; - mappings[1309] = ItemType.WaxedOxidizedCopperBulb; - mappings[728] = ItemType.WaxedOxidizedCopperDoor; - mappings[1301] = ItemType.WaxedOxidizedCopperGrate; - mappings[748] = ItemType.WaxedOxidizedCopperTrapdoor; - mappings[122] = ItemType.WaxedOxidizedCutCopper; - mappings[130] = ItemType.WaxedOxidizedCutCopperSlab; - mappings[126] = ItemType.WaxedOxidizedCutCopperStairs; - mappings[117] = ItemType.WaxedWeatheredChiseledCopper; - mappings[113] = ItemType.WaxedWeatheredCopper; - mappings[1308] = ItemType.WaxedWeatheredCopperBulb; - mappings[727] = ItemType.WaxedWeatheredCopperDoor; - mappings[1300] = ItemType.WaxedWeatheredCopperGrate; - mappings[747] = ItemType.WaxedWeatheredCopperTrapdoor; - mappings[121] = ItemType.WaxedWeatheredCutCopper; - mappings[129] = ItemType.WaxedWeatheredCutCopperSlab; - mappings[125] = ItemType.WaxedWeatheredCutCopperStairs; - mappings[1269] = ItemType.WayfinderArmorTrimSmithingTemplate; - mappings[97] = ItemType.WeatheredChiseledCopper; - mappings[93] = ItemType.WeatheredCopper; - mappings[1304] = ItemType.WeatheredCopperBulb; - mappings[723] = ItemType.WeatheredCopperDoor; - mappings[1296] = ItemType.WeatheredCopperGrate; - mappings[743] = ItemType.WeatheredCopperTrapdoor; - mappings[101] = ItemType.WeatheredCutCopper; - mappings[109] = ItemType.WeatheredCutCopperSlab; - mappings[105] = ItemType.WeatheredCutCopperStairs; - mappings[240] = ItemType.WeepingVines; - mappings[186] = ItemType.WetSponge; - mappings[851] = ItemType.Wheat; - mappings[850] = ItemType.WheatSeeds; - mappings[1126] = ItemType.WhiteBanner; - mappings[961] = ItemType.WhiteBed; - mappings[1230] = ItemType.WhiteCandle; - mappings[445] = ItemType.WhiteCarpet; - mappings[554] = ItemType.WhiteConcrete; - mappings[570] = ItemType.WhiteConcretePowder; - mappings[941] = ItemType.WhiteDye; - mappings[538] = ItemType.WhiteGlazedTerracotta; - mappings[522] = ItemType.WhiteShulkerBox; - mappings[470] = ItemType.WhiteStainedGlass; - mappings[486] = ItemType.WhiteStainedGlassPane; - mappings[426] = ItemType.WhiteTerracotta; - mappings[224] = ItemType.WhiteTulip; - mappings[201] = ItemType.WhiteWool; - mappings[1261] = ItemType.WildArmorTrimSmithingTemplate; - mappings[1074] = ItemType.WitchSpawnEgg; - mappings[229] = ItemType.WitherRose; - mappings[1097] = ItemType.WitherSkeletonSkull; - mappings[1076] = ItemType.WitherSkeletonSpawnEgg; - mappings[1075] = ItemType.WitherSpawnEgg; - mappings[1077] = ItemType.WolfSpawnEgg; - mappings[817] = ItemType.WoodenAxe; - mappings[818] = ItemType.WoodenHoe; - mappings[816] = ItemType.WoodenPickaxe; - mappings[815] = ItemType.WoodenShovel; - mappings[814] = ItemType.WoodenSword; - mappings[1085] = ItemType.WritableBook; - mappings[1086] = ItemType.WrittenBook; - mappings[1130] = ItemType.YellowBanner; - mappings[965] = ItemType.YellowBed; - mappings[1234] = ItemType.YellowCandle; - mappings[449] = ItemType.YellowCarpet; - mappings[558] = ItemType.YellowConcrete; - mappings[574] = ItemType.YellowConcretePowder; - mappings[945] = ItemType.YellowDye; - mappings[542] = ItemType.YellowGlazedTerracotta; - mappings[526] = ItemType.YellowShulkerBox; - mappings[474] = ItemType.YellowStainedGlass; - mappings[490] = ItemType.YellowStainedGlassPane; - mappings[430] = ItemType.YellowTerracotta; - mappings[205] = ItemType.YellowWool; - mappings[1078] = ItemType.ZoglinSpawnEgg; - mappings[1099] = ItemType.ZombieHead; - mappings[1080] = ItemType.ZombieHorseSpawnEgg; - mappings[1079] = ItemType.ZombieSpawnEgg; - mappings[1081] = ItemType.ZombieVillagerSpawnEgg; - mappings[1082] = ItemType.ZombifiedPiglinSpawnEgg; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1206.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette1206.cs deleted file mode 100644 index d0dceeeb09..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1206.cs +++ /dev/null @@ -1,1348 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public class ItemPalette1206 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette1206() - { - mappings[782] = ItemType.AcaciaBoat; - mappings[688] = ItemType.AcaciaButton; - mappings[783] = ItemType.AcaciaChestBoat; - mappings[715] = ItemType.AcaciaDoor; - mappings[315] = ItemType.AcaciaFence; - mappings[754] = ItemType.AcaciaFenceGate; - mappings[901] = ItemType.AcaciaHangingSign; - mappings[180] = ItemType.AcaciaLeaves; - mappings[136] = ItemType.AcaciaLog; - mappings[40] = ItemType.AcaciaPlanks; - mappings[703] = ItemType.AcaciaPressurePlate; - mappings[52] = ItemType.AcaciaSapling; - mappings[890] = ItemType.AcaciaSign; - mappings[256] = ItemType.AcaciaSlab; - mappings[387] = ItemType.AcaciaStairs; - mappings[735] = ItemType.AcaciaTrapdoor; - mappings[170] = ItemType.AcaciaWood; - mappings[764] = ItemType.ActivatorRail; - mappings[0] = ItemType.Air; - mappings[1009] = ItemType.AllaySpawnEgg; - mappings[221] = ItemType.Allium; - mappings[86] = ItemType.AmethystBlock; - mappings[1258] = ItemType.AmethystCluster; - mappings[808] = ItemType.AmethystShard; - mappings[80] = ItemType.AncientDebris; - mappings[6] = ItemType.Andesite; - mappings[648] = ItemType.AndesiteSlab; - mappings[631] = ItemType.AndesiteStairs; - mappings[407] = ItemType.AndesiteWall; - mappings[1285] = ItemType.AnglerPotterySherd; - mappings[419] = ItemType.Anvil; - mappings[799] = ItemType.Apple; - mappings[1286] = ItemType.ArcherPotterySherd; - mappings[796] = ItemType.ArmadilloScute; - mappings[1008] = ItemType.ArmadilloSpawnEgg; - mappings[1123] = ItemType.ArmorStand; - mappings[1287] = ItemType.ArmsUpPotterySherd; - mappings[801] = ItemType.Arrow; - mappings[919] = ItemType.AxolotlBucket; - mappings[1010] = ItemType.AxolotlSpawnEgg; - mappings[197] = ItemType.Azalea; - mappings[184] = ItemType.AzaleaLeaves; - mappings[222] = ItemType.AzureBluet; - mappings[1099] = ItemType.BakedPotato; - mappings[251] = ItemType.Bamboo; - mappings[144] = ItemType.BambooBlock; - mappings[692] = ItemType.BambooButton; - mappings[791] = ItemType.BambooChestRaft; - mappings[719] = ItemType.BambooDoor; - mappings[319] = ItemType.BambooFence; - mappings[758] = ItemType.BambooFenceGate; - mappings[905] = ItemType.BambooHangingSign; - mappings[47] = ItemType.BambooMosaic; - mappings[261] = ItemType.BambooMosaicSlab; - mappings[392] = ItemType.BambooMosaicStairs; - mappings[44] = ItemType.BambooPlanks; - mappings[707] = ItemType.BambooPressurePlate; - mappings[790] = ItemType.BambooRaft; - mappings[894] = ItemType.BambooSign; - mappings[260] = ItemType.BambooSlab; - mappings[391] = ItemType.BambooStairs; - mappings[739] = ItemType.BambooTrapdoor; - mappings[1202] = ItemType.Barrel; - mappings[443] = ItemType.Barrier; - mappings[328] = ItemType.Basalt; - mappings[1011] = ItemType.BatSpawnEgg; - mappings[396] = ItemType.Beacon; - mappings[56] = ItemType.Bedrock; - mappings[1219] = ItemType.BeeNest; - mappings[1012] = ItemType.BeeSpawnEgg; - mappings[988] = ItemType.Beef; - mappings[1220] = ItemType.Beehive; - mappings[1154] = ItemType.Beetroot; - mappings[1155] = ItemType.BeetrootSeeds; - mappings[1156] = ItemType.BeetrootSoup; - mappings[1210] = ItemType.Bell; - mappings[249] = ItemType.BigDripleaf; - mappings[778] = ItemType.BirchBoat; - mappings[686] = ItemType.BirchButton; - mappings[779] = ItemType.BirchChestBoat; - mappings[713] = ItemType.BirchDoor; - mappings[313] = ItemType.BirchFence; - mappings[752] = ItemType.BirchFenceGate; - mappings[899] = ItemType.BirchHangingSign; - mappings[178] = ItemType.BirchLeaves; - mappings[134] = ItemType.BirchLog; - mappings[38] = ItemType.BirchPlanks; - mappings[701] = ItemType.BirchPressurePlate; - mappings[50] = ItemType.BirchSapling; - mappings[888] = ItemType.BirchSign; - mappings[254] = ItemType.BirchSlab; - mappings[385] = ItemType.BirchStairs; - mappings[733] = ItemType.BirchTrapdoor; - mappings[168] = ItemType.BirchWood; - mappings[1148] = ItemType.BlackBanner; - mappings[979] = ItemType.BlackBed; - mappings[1254] = ItemType.BlackCandle; - mappings[461] = ItemType.BlackCarpet; - mappings[570] = ItemType.BlackConcrete; - mappings[586] = ItemType.BlackConcretePowder; - mappings[959] = ItemType.BlackDye; - mappings[554] = ItemType.BlackGlazedTerracotta; - mappings[538] = ItemType.BlackShulkerBox; - mappings[486] = ItemType.BlackStainedGlass; - mappings[502] = ItemType.BlackStainedGlassPane; - mappings[442] = ItemType.BlackTerracotta; - mappings[217] = ItemType.BlackWool; - mappings[1225] = ItemType.Blackstone; - mappings[1226] = ItemType.BlackstoneSlab; - mappings[1227] = ItemType.BlackstoneStairs; - mappings[412] = ItemType.BlackstoneWall; - mappings[1288] = ItemType.BladePotterySherd; - mappings[1204] = ItemType.BlastFurnace; - mappings[1002] = ItemType.BlazePowder; - mappings[994] = ItemType.BlazeRod; - mappings[1013] = ItemType.BlazeSpawnEgg; - mappings[1144] = ItemType.BlueBanner; - mappings[975] = ItemType.BlueBed; - mappings[1250] = ItemType.BlueCandle; - mappings[457] = ItemType.BlueCarpet; - mappings[566] = ItemType.BlueConcrete; - mappings[582] = ItemType.BlueConcretePowder; - mappings[955] = ItemType.BlueDye; - mappings[550] = ItemType.BlueGlazedTerracotta; - mappings[619] = ItemType.BlueIce; - mappings[220] = ItemType.BlueOrchid; - mappings[534] = ItemType.BlueShulkerBox; - mappings[482] = ItemType.BlueStainedGlass; - mappings[498] = ItemType.BlueStainedGlassPane; - mappings[438] = ItemType.BlueTerracotta; - mappings[213] = ItemType.BlueWool; - mappings[1014] = ItemType.BoggedSpawnEgg; - mappings[1284] = ItemType.BoltArmorTrimSmithingTemplate; - mappings[961] = ItemType.Bone; - mappings[520] = ItemType.BoneBlock; - mappings[960] = ItemType.BoneMeal; - mappings[925] = ItemType.Book; - mappings[286] = ItemType.Bookshelf; - mappings[800] = ItemType.Bow; - mappings[848] = ItemType.Bowl; - mappings[600] = ItemType.BrainCoral; - mappings[595] = ItemType.BrainCoralBlock; - mappings[610] = ItemType.BrainCoralFan; - mappings[855] = ItemType.Bread; - mappings[1329] = ItemType.BreezeRod; - mappings[1015] = ItemType.BreezeSpawnEgg; - mappings[1289] = ItemType.BrewerPotterySherd; - mappings[1004] = ItemType.BrewingStand; - mappings[921] = ItemType.Brick; - mappings[270] = ItemType.BrickSlab; - mappings[361] = ItemType.BrickStairs; - mappings[399] = ItemType.BrickWall; - mappings[285] = ItemType.Bricks; - mappings[1145] = ItemType.BrownBanner; - mappings[976] = ItemType.BrownBed; - mappings[1251] = ItemType.BrownCandle; - mappings[458] = ItemType.BrownCarpet; - mappings[567] = ItemType.BrownConcrete; - mappings[583] = ItemType.BrownConcretePowder; - mappings[956] = ItemType.BrownDye; - mappings[551] = ItemType.BrownGlazedTerracotta; - mappings[234] = ItemType.BrownMushroom; - mappings[352] = ItemType.BrownMushroomBlock; - mappings[535] = ItemType.BrownShulkerBox; - mappings[483] = ItemType.BrownStainedGlass; - mappings[499] = ItemType.BrownStainedGlassPane; - mappings[439] = ItemType.BrownTerracotta; - mappings[214] = ItemType.BrownWool; - mappings[1265] = ItemType.Brush; - mappings[601] = ItemType.BubbleCoral; - mappings[596] = ItemType.BubbleCoralBlock; - mappings[611] = ItemType.BubbleCoralFan; - mappings[908] = ItemType.Bucket; - mappings[87] = ItemType.BuddingAmethyst; - mappings[930] = ItemType.Bundle; - mappings[1290] = ItemType.BurnPotterySherd; - mappings[308] = ItemType.Cactus; - mappings[963] = ItemType.Cake; - mappings[11] = ItemType.Calcite; - mappings[676] = ItemType.CalibratedSculkSensor; - mappings[1017] = ItemType.CamelSpawnEgg; - mappings[1215] = ItemType.Campfire; - mappings[1238] = ItemType.Candle; - mappings[1097] = ItemType.Carrot; - mappings[771] = ItemType.CarrotOnAStick; - mappings[1205] = ItemType.CartographyTable; - mappings[323] = ItemType.CarvedPumpkin; - mappings[1016] = ItemType.CatSpawnEgg; - mappings[1005] = ItemType.Cauldron; - mappings[1018] = ItemType.CaveSpiderSpawnEgg; - mappings[356] = ItemType.Chain; - mappings[515] = ItemType.ChainCommandBlock; - mappings[863] = ItemType.ChainmailBoots; - mappings[861] = ItemType.ChainmailChestplate; - mappings[860] = ItemType.ChainmailHelmet; - mappings[862] = ItemType.ChainmailLeggings; - mappings[803] = ItemType.Charcoal; - mappings[784] = ItemType.CherryBoat; - mappings[689] = ItemType.CherryButton; - mappings[785] = ItemType.CherryChestBoat; - mappings[716] = ItemType.CherryDoor; - mappings[316] = ItemType.CherryFence; - mappings[755] = ItemType.CherryFenceGate; - mappings[902] = ItemType.CherryHangingSign; - mappings[181] = ItemType.CherryLeaves; - mappings[137] = ItemType.CherryLog; - mappings[41] = ItemType.CherryPlanks; - mappings[704] = ItemType.CherryPressurePlate; - mappings[53] = ItemType.CherrySapling; - mappings[891] = ItemType.CherrySign; - mappings[257] = ItemType.CherrySlab; - mappings[388] = ItemType.CherryStairs; - mappings[736] = ItemType.CherryTrapdoor; - mappings[171] = ItemType.CherryWood; - mappings[299] = ItemType.Chest; - mappings[767] = ItemType.ChestMinecart; - mappings[990] = ItemType.Chicken; - mappings[1019] = ItemType.ChickenSpawnEgg; - mappings[420] = ItemType.ChippedAnvil; - mappings[287] = ItemType.ChiseledBookshelf; - mappings[96] = ItemType.ChiseledCopper; - mappings[350] = ItemType.ChiseledDeepslate; - mappings[368] = ItemType.ChiseledNetherBricks; - mappings[1232] = ItemType.ChiseledPolishedBlackstone; - mappings[422] = ItemType.ChiseledQuartzBlock; - mappings[511] = ItemType.ChiseledRedSandstone; - mappings[192] = ItemType.ChiseledSandstone; - mappings[343] = ItemType.ChiseledStoneBricks; - mappings[16] = ItemType.ChiseledTuff; - mappings[25] = ItemType.ChiseledTuffBricks; - mappings[294] = ItemType.ChorusFlower; - mappings[1150] = ItemType.ChorusFruit; - mappings[293] = ItemType.ChorusPlant; - mappings[309] = ItemType.Clay; - mappings[922] = ItemType.ClayBall; - mappings[932] = ItemType.Clock; - mappings[802] = ItemType.Coal; - mappings[81] = ItemType.CoalBlock; - mappings[62] = ItemType.CoalOre; - mappings[29] = ItemType.CoarseDirt; - mappings[1269] = ItemType.CoastArmorTrimSmithingTemplate; - mappings[9] = ItemType.CobbledDeepslate; - mappings[652] = ItemType.CobbledDeepslateSlab; - mappings[635] = ItemType.CobbledDeepslateStairs; - mappings[415] = ItemType.CobbledDeepslateWall; - mappings[35] = ItemType.Cobblestone; - mappings[269] = ItemType.CobblestoneSlab; - mappings[304] = ItemType.CobblestoneStairs; - mappings[397] = ItemType.CobblestoneWall; - mappings[194] = ItemType.Cobweb; - mappings[943] = ItemType.CocoaBeans; - mappings[935] = ItemType.Cod; - mappings[917] = ItemType.CodBucket; - mappings[1020] = ItemType.CodSpawnEgg; - mappings[395] = ItemType.CommandBlock; - mappings[1130] = ItemType.CommandBlockMinecart; - mappings[661] = ItemType.Comparator; - mappings[928] = ItemType.Compass; - mappings[1201] = ItemType.Composter; - mappings[620] = ItemType.Conduit; - mappings[989] = ItemType.CookedBeef; - mappings[991] = ItemType.CookedChicken; - mappings[939] = ItemType.CookedCod; - mappings[1132] = ItemType.CookedMutton; - mappings[882] = ItemType.CookedPorkchop; - mappings[1119] = ItemType.CookedRabbit; - mappings[940] = ItemType.CookedSalmon; - mappings[980] = ItemType.Cookie; - mappings[89] = ItemType.CopperBlock; - mappings[1316] = ItemType.CopperBulb; - mappings[722] = ItemType.CopperDoor; - mappings[1308] = ItemType.CopperGrate; - mappings[812] = ItemType.CopperIngot; - mappings[66] = ItemType.CopperOre; - mappings[742] = ItemType.CopperTrapdoor; - mappings[228] = ItemType.Cornflower; - mappings[1021] = ItemType.CowSpawnEgg; - mappings[347] = ItemType.CrackedDeepslateBricks; - mappings[349] = ItemType.CrackedDeepslateTiles; - mappings[367] = ItemType.CrackedNetherBricks; - mappings[1236] = ItemType.CrackedPolishedBlackstoneBricks; - mappings[342] = ItemType.CrackedStoneBricks; - mappings[981] = ItemType.Crafter; - mappings[300] = ItemType.CraftingTable; - mappings[1193] = ItemType.CreeperBannerPattern; - mappings[1107] = ItemType.CreeperHead; - mappings[1022] = ItemType.CreeperSpawnEgg; - mappings[693] = ItemType.CrimsonButton; - mappings[720] = ItemType.CrimsonDoor; - mappings[320] = ItemType.CrimsonFence; - mappings[759] = ItemType.CrimsonFenceGate; - mappings[236] = ItemType.CrimsonFungus; - mappings[906] = ItemType.CrimsonHangingSign; - mappings[174] = ItemType.CrimsonHyphae; - mappings[33] = ItemType.CrimsonNylium; - mappings[45] = ItemType.CrimsonPlanks; - mappings[708] = ItemType.CrimsonPressurePlate; - mappings[238] = ItemType.CrimsonRoots; - mappings[895] = ItemType.CrimsonSign; - mappings[262] = ItemType.CrimsonSlab; - mappings[393] = ItemType.CrimsonStairs; - mappings[142] = ItemType.CrimsonStem; - mappings[740] = ItemType.CrimsonTrapdoor; - mappings[1189] = ItemType.Crossbow; - mappings[1224] = ItemType.CryingObsidian; - mappings[100] = ItemType.CutCopper; - mappings[108] = ItemType.CutCopperSlab; - mappings[104] = ItemType.CutCopperStairs; - mappings[512] = ItemType.CutRedSandstone; - mappings[276] = ItemType.CutRedSandstoneSlab; - mappings[193] = ItemType.CutSandstone; - mappings[267] = ItemType.CutSandstoneSlab; - mappings[1142] = ItemType.CyanBanner; - mappings[973] = ItemType.CyanBed; - mappings[1248] = ItemType.CyanCandle; - mappings[455] = ItemType.CyanCarpet; - mappings[564] = ItemType.CyanConcrete; - mappings[580] = ItemType.CyanConcretePowder; - mappings[953] = ItemType.CyanDye; - mappings[548] = ItemType.CyanGlazedTerracotta; - mappings[532] = ItemType.CyanShulkerBox; - mappings[480] = ItemType.CyanStainedGlass; - mappings[496] = ItemType.CyanStainedGlassPane; - mappings[436] = ItemType.CyanTerracotta; - mappings[211] = ItemType.CyanWool; - mappings[421] = ItemType.DamagedAnvil; - mappings[218] = ItemType.Dandelion; - mappings[1291] = ItemType.DangerPotterySherd; - mappings[786] = ItemType.DarkOakBoat; - mappings[690] = ItemType.DarkOakButton; - mappings[787] = ItemType.DarkOakChestBoat; - mappings[717] = ItemType.DarkOakDoor; - mappings[317] = ItemType.DarkOakFence; - mappings[756] = ItemType.DarkOakFenceGate; - mappings[903] = ItemType.DarkOakHangingSign; - mappings[182] = ItemType.DarkOakLeaves; - mappings[138] = ItemType.DarkOakLog; - mappings[42] = ItemType.DarkOakPlanks; - mappings[705] = ItemType.DarkOakPressurePlate; - mappings[54] = ItemType.DarkOakSapling; - mappings[892] = ItemType.DarkOakSign; - mappings[258] = ItemType.DarkOakSlab; - mappings[389] = ItemType.DarkOakStairs; - mappings[737] = ItemType.DarkOakTrapdoor; - mappings[172] = ItemType.DarkOakWood; - mappings[505] = ItemType.DarkPrismarine; - mappings[280] = ItemType.DarkPrismarineSlab; - mappings[508] = ItemType.DarkPrismarineStairs; - mappings[674] = ItemType.DaylightDetector; - mappings[604] = ItemType.DeadBrainCoral; - mappings[590] = ItemType.DeadBrainCoralBlock; - mappings[615] = ItemType.DeadBrainCoralFan; - mappings[605] = ItemType.DeadBubbleCoral; - mappings[591] = ItemType.DeadBubbleCoralBlock; - mappings[616] = ItemType.DeadBubbleCoralFan; - mappings[199] = ItemType.DeadBush; - mappings[606] = ItemType.DeadFireCoral; - mappings[592] = ItemType.DeadFireCoralBlock; - mappings[617] = ItemType.DeadFireCoralFan; - mappings[607] = ItemType.DeadHornCoral; - mappings[593] = ItemType.DeadHornCoralBlock; - mappings[618] = ItemType.DeadHornCoralFan; - mappings[608] = ItemType.DeadTubeCoral; - mappings[589] = ItemType.DeadTubeCoralBlock; - mappings[614] = ItemType.DeadTubeCoralFan; - mappings[1167] = ItemType.DebugStick; - mappings[288] = ItemType.DecoratedPot; - mappings[8] = ItemType.Deepslate; - mappings[654] = ItemType.DeepslateBrickSlab; - mappings[637] = ItemType.DeepslateBrickStairs; - mappings[417] = ItemType.DeepslateBrickWall; - mappings[346] = ItemType.DeepslateBricks; - mappings[63] = ItemType.DeepslateCoalOre; - mappings[67] = ItemType.DeepslateCopperOre; - mappings[77] = ItemType.DeepslateDiamondOre; - mappings[73] = ItemType.DeepslateEmeraldOre; - mappings[69] = ItemType.DeepslateGoldOre; - mappings[65] = ItemType.DeepslateIronOre; - mappings[75] = ItemType.DeepslateLapisOre; - mappings[71] = ItemType.DeepslateRedstoneOre; - mappings[655] = ItemType.DeepslateTileSlab; - mappings[638] = ItemType.DeepslateTileStairs; - mappings[418] = ItemType.DeepslateTileWall; - mappings[348] = ItemType.DeepslateTiles; - mappings[762] = ItemType.DetectorRail; - mappings[804] = ItemType.Diamond; - mappings[840] = ItemType.DiamondAxe; - mappings[91] = ItemType.DiamondBlock; - mappings[871] = ItemType.DiamondBoots; - mappings[869] = ItemType.DiamondChestplate; - mappings[868] = ItemType.DiamondHelmet; - mappings[841] = ItemType.DiamondHoe; - mappings[1126] = ItemType.DiamondHorseArmor; - mappings[870] = ItemType.DiamondLeggings; - mappings[76] = ItemType.DiamondOre; - mappings[839] = ItemType.DiamondPickaxe; - mappings[838] = ItemType.DiamondShovel; - mappings[837] = ItemType.DiamondSword; - mappings[4] = ItemType.Diorite; - mappings[651] = ItemType.DioriteSlab; - mappings[634] = ItemType.DioriteStairs; - mappings[411] = ItemType.DioriteWall; - mappings[28] = ItemType.Dirt; - mappings[464] = ItemType.DirtPath; - mappings[1184] = ItemType.DiscFragment5; - mappings[668] = ItemType.Dispenser; - mappings[1023] = ItemType.DolphinSpawnEgg; - mappings[1024] = ItemType.DonkeySpawnEgg; - mappings[1157] = ItemType.DragonBreath; - mappings[379] = ItemType.DragonEgg; - mappings[1108] = ItemType.DragonHead; - mappings[985] = ItemType.DriedKelp; - mappings[923] = ItemType.DriedKelpBlock; - mappings[26] = ItemType.DripstoneBlock; - mappings[669] = ItemType.Dropper; - mappings[1025] = ItemType.DrownedSpawnEgg; - mappings[1268] = ItemType.DuneArmorTrimSmithingTemplate; - mappings[1264] = ItemType.EchoShard; - mappings[927] = ItemType.Egg; - mappings[1026] = ItemType.ElderGuardianSpawnEgg; - mappings[773] = ItemType.Elytra; - mappings[805] = ItemType.Emerald; - mappings[382] = ItemType.EmeraldBlock; - mappings[72] = ItemType.EmeraldOre; - mappings[1114] = ItemType.EnchantedBook; - mappings[885] = ItemType.EnchantedGoldenApple; - mappings[375] = ItemType.EnchantingTable; - mappings[1149] = ItemType.EndCrystal; - mappings[376] = ItemType.EndPortalFrame; - mappings[292] = ItemType.EndRod; - mappings[377] = ItemType.EndStone; - mappings[644] = ItemType.EndStoneBrickSlab; - mappings[626] = ItemType.EndStoneBrickStairs; - mappings[410] = ItemType.EndStoneBrickWall; - mappings[378] = ItemType.EndStoneBricks; - mappings[381] = ItemType.EnderChest; - mappings[1027] = ItemType.EnderDragonSpawnEgg; - mappings[1006] = ItemType.EnderEye; - mappings[993] = ItemType.EnderPearl; - mappings[1028] = ItemType.EndermanSpawnEgg; - mappings[1029] = ItemType.EndermiteSpawnEgg; - mappings[1030] = ItemType.EvokerSpawnEgg; - mappings[1088] = ItemType.ExperienceBottle; - mappings[1292] = ItemType.ExplorerPotterySherd; - mappings[97] = ItemType.ExposedChiseledCopper; - mappings[93] = ItemType.ExposedCopper; - mappings[1317] = ItemType.ExposedCopperBulb; - mappings[723] = ItemType.ExposedCopperDoor; - mappings[1309] = ItemType.ExposedCopperGrate; - mappings[743] = ItemType.ExposedCopperTrapdoor; - mappings[101] = ItemType.ExposedCutCopper; - mappings[109] = ItemType.ExposedCutCopperSlab; - mappings[105] = ItemType.ExposedCutCopperStairs; - mappings[1272] = ItemType.EyeArmorTrimSmithingTemplate; - mappings[301] = ItemType.Farmland; - mappings[851] = ItemType.Feather; - mappings[1001] = ItemType.FermentedSpiderEye; - mappings[196] = ItemType.Fern; - mappings[982] = ItemType.FilledMap; - mappings[1089] = ItemType.FireCharge; - mappings[602] = ItemType.FireCoral; - mappings[597] = ItemType.FireCoralBlock; - mappings[612] = ItemType.FireCoralFan; - mappings[1112] = ItemType.FireworkRocket; - mappings[1113] = ItemType.FireworkStar; - mappings[931] = ItemType.FishingRod; - mappings[1206] = ItemType.FletchingTable; - mappings[880] = ItemType.Flint; - mappings[798] = ItemType.FlintAndSteel; - mappings[1283] = ItemType.FlowArmorTrimSmithingTemplate; - mappings[1198] = ItemType.FlowBannerPattern; - mappings[1293] = ItemType.FlowPotterySherd; - mappings[1192] = ItemType.FlowerBannerPattern; - mappings[1096] = ItemType.FlowerPot; - mappings[198] = ItemType.FloweringAzalea; - mappings[185] = ItemType.FloweringAzaleaLeaves; - mappings[1031] = ItemType.FoxSpawnEgg; - mappings[1294] = ItemType.FriendPotterySherd; - mappings[1032] = ItemType.FrogSpawnEgg; - mappings[1263] = ItemType.Frogspawn; - mappings[302] = ItemType.Furnace; - mappings[768] = ItemType.FurnaceMinecart; - mappings[1033] = ItemType.GhastSpawnEgg; - mappings[995] = ItemType.GhastTear; - mappings[1228] = ItemType.GildedBlackstone; - mappings[188] = ItemType.Glass; - mappings[999] = ItemType.GlassBottle; - mappings[357] = ItemType.GlassPane; - mappings[1007] = ItemType.GlisteringMelonSlice; - mappings[1196] = ItemType.GlobeBannerPattern; - mappings[1214] = ItemType.GlowBerries; - mappings[942] = ItemType.GlowInkSac; - mappings[1095] = ItemType.GlowItemFrame; - mappings[360] = ItemType.GlowLichen; - mappings[1034] = ItemType.GlowSquidSpawnEgg; - mappings[332] = ItemType.Glowstone; - mappings[934] = ItemType.GlowstoneDust; - mappings[1200] = ItemType.GoatHorn; - mappings[1035] = ItemType.GoatSpawnEgg; - mappings[90] = ItemType.GoldBlock; - mappings[814] = ItemType.GoldIngot; - mappings[996] = ItemType.GoldNugget; - mappings[68] = ItemType.GoldOre; - mappings[884] = ItemType.GoldenApple; - mappings[830] = ItemType.GoldenAxe; - mappings[875] = ItemType.GoldenBoots; - mappings[1102] = ItemType.GoldenCarrot; - mappings[873] = ItemType.GoldenChestplate; - mappings[872] = ItemType.GoldenHelmet; - mappings[831] = ItemType.GoldenHoe; - mappings[1125] = ItemType.GoldenHorseArmor; - mappings[874] = ItemType.GoldenLeggings; - mappings[829] = ItemType.GoldenPickaxe; - mappings[828] = ItemType.GoldenShovel; - mappings[827] = ItemType.GoldenSword; - mappings[2] = ItemType.Granite; - mappings[647] = ItemType.GraniteSlab; - mappings[630] = ItemType.GraniteStairs; - mappings[403] = ItemType.GraniteWall; - mappings[27] = ItemType.GrassBlock; - mappings[61] = ItemType.Gravel; - mappings[1140] = ItemType.GrayBanner; - mappings[971] = ItemType.GrayBed; - mappings[1246] = ItemType.GrayCandle; - mappings[453] = ItemType.GrayCarpet; - mappings[562] = ItemType.GrayConcrete; - mappings[578] = ItemType.GrayConcretePowder; - mappings[951] = ItemType.GrayDye; - mappings[546] = ItemType.GrayGlazedTerracotta; - mappings[530] = ItemType.GrayShulkerBox; - mappings[478] = ItemType.GrayStainedGlass; - mappings[494] = ItemType.GrayStainedGlassPane; - mappings[434] = ItemType.GrayTerracotta; - mappings[209] = ItemType.GrayWool; - mappings[1146] = ItemType.GreenBanner; - mappings[977] = ItemType.GreenBed; - mappings[1252] = ItemType.GreenCandle; - mappings[459] = ItemType.GreenCarpet; - mappings[568] = ItemType.GreenConcrete; - mappings[584] = ItemType.GreenConcretePowder; - mappings[957] = ItemType.GreenDye; - mappings[552] = ItemType.GreenGlazedTerracotta; - mappings[536] = ItemType.GreenShulkerBox; - mappings[484] = ItemType.GreenStainedGlass; - mappings[500] = ItemType.GreenStainedGlassPane; - mappings[440] = ItemType.GreenTerracotta; - mappings[215] = ItemType.GreenWool; - mappings[1207] = ItemType.Grindstone; - mappings[1036] = ItemType.GuardianSpawnEgg; - mappings[852] = ItemType.Gunpowder; - mappings[1199] = ItemType.GusterBannerPattern; - mappings[1295] = ItemType.GusterPotterySherd; - mappings[248] = ItemType.HangingRoots; - mappings[445] = ItemType.HayBlock; - mappings[1188] = ItemType.HeartOfTheSea; - mappings[1296] = ItemType.HeartPotterySherd; - mappings[1297] = ItemType.HeartbreakPotterySherd; - mappings[85] = ItemType.HeavyCore; - mappings[698] = ItemType.HeavyWeightedPressurePlate; - mappings[1037] = ItemType.HoglinSpawnEgg; - mappings[665] = ItemType.HoneyBlock; - mappings[1221] = ItemType.HoneyBottle; - mappings[1218] = ItemType.Honeycomb; - mappings[1222] = ItemType.HoneycombBlock; - mappings[667] = ItemType.Hopper; - mappings[770] = ItemType.HopperMinecart; - mappings[603] = ItemType.HornCoral; - mappings[598] = ItemType.HornCoralBlock; - mappings[613] = ItemType.HornCoralFan; - mappings[1038] = ItemType.HorseSpawnEgg; - mappings[1282] = ItemType.HostArmorTrimSmithingTemplate; - mappings[1298] = ItemType.HowlPotterySherd; - mappings[1039] = ItemType.HuskSpawnEgg; - mappings[306] = ItemType.Ice; - mappings[338] = ItemType.InfestedChiseledStoneBricks; - mappings[334] = ItemType.InfestedCobblestone; - mappings[337] = ItemType.InfestedCrackedStoneBricks; - mappings[339] = ItemType.InfestedDeepslate; - mappings[336] = ItemType.InfestedMossyStoneBricks; - mappings[333] = ItemType.InfestedStone; - mappings[335] = ItemType.InfestedStoneBricks; - mappings[941] = ItemType.InkSac; - mappings[835] = ItemType.IronAxe; - mappings[355] = ItemType.IronBars; - mappings[88] = ItemType.IronBlock; - mappings[867] = ItemType.IronBoots; - mappings[865] = ItemType.IronChestplate; - mappings[710] = ItemType.IronDoor; - mappings[1040] = ItemType.IronGolemSpawnEgg; - mappings[864] = ItemType.IronHelmet; - mappings[836] = ItemType.IronHoe; - mappings[1124] = ItemType.IronHorseArmor; - mappings[810] = ItemType.IronIngot; - mappings[866] = ItemType.IronLeggings; - mappings[1165] = ItemType.IronNugget; - mappings[64] = ItemType.IronOre; - mappings[834] = ItemType.IronPickaxe; - mappings[833] = ItemType.IronShovel; - mappings[832] = ItemType.IronSword; - mappings[730] = ItemType.IronTrapdoor; - mappings[1094] = ItemType.ItemFrame; - mappings[324] = ItemType.JackOLantern; - mappings[793] = ItemType.Jigsaw; - mappings[310] = ItemType.Jukebox; - mappings[780] = ItemType.JungleBoat; - mappings[687] = ItemType.JungleButton; - mappings[781] = ItemType.JungleChestBoat; - mappings[714] = ItemType.JungleDoor; - mappings[314] = ItemType.JungleFence; - mappings[753] = ItemType.JungleFenceGate; - mappings[900] = ItemType.JungleHangingSign; - mappings[179] = ItemType.JungleLeaves; - mappings[135] = ItemType.JungleLog; - mappings[39] = ItemType.JunglePlanks; - mappings[702] = ItemType.JunglePressurePlate; - mappings[51] = ItemType.JungleSapling; - mappings[889] = ItemType.JungleSign; - mappings[255] = ItemType.JungleSlab; - mappings[386] = ItemType.JungleStairs; - mappings[734] = ItemType.JungleTrapdoor; - mappings[169] = ItemType.JungleWood; - mappings[244] = ItemType.Kelp; - mappings[1166] = ItemType.KnowledgeBook; - mappings[303] = ItemType.Ladder; - mappings[1211] = ItemType.Lantern; - mappings[190] = ItemType.LapisBlock; - mappings[806] = ItemType.LapisLazuli; - mappings[74] = ItemType.LapisOre; - mappings[1257] = ItemType.LargeAmethystBud; - mappings[470] = ItemType.LargeFern; - mappings[910] = ItemType.LavaBucket; - mappings[1128] = ItemType.Lead; - mappings[913] = ItemType.Leather; - mappings[859] = ItemType.LeatherBoots; - mappings[857] = ItemType.LeatherChestplate; - mappings[856] = ItemType.LeatherHelmet; - mappings[1127] = ItemType.LeatherHorseArmor; - mappings[858] = ItemType.LeatherLeggings; - mappings[670] = ItemType.Lectern; - mappings[672] = ItemType.Lever; - mappings[444] = ItemType.Light; - mappings[1136] = ItemType.LightBlueBanner; - mappings[967] = ItemType.LightBlueBed; - mappings[1242] = ItemType.LightBlueCandle; - mappings[449] = ItemType.LightBlueCarpet; - mappings[558] = ItemType.LightBlueConcrete; - mappings[574] = ItemType.LightBlueConcretePowder; - mappings[947] = ItemType.LightBlueDye; - mappings[542] = ItemType.LightBlueGlazedTerracotta; - mappings[526] = ItemType.LightBlueShulkerBox; - mappings[474] = ItemType.LightBlueStainedGlass; - mappings[490] = ItemType.LightBlueStainedGlassPane; - mappings[430] = ItemType.LightBlueTerracotta; - mappings[205] = ItemType.LightBlueWool; - mappings[1141] = ItemType.LightGrayBanner; - mappings[972] = ItemType.LightGrayBed; - mappings[1247] = ItemType.LightGrayCandle; - mappings[454] = ItemType.LightGrayCarpet; - mappings[563] = ItemType.LightGrayConcrete; - mappings[579] = ItemType.LightGrayConcretePowder; - mappings[952] = ItemType.LightGrayDye; - mappings[547] = ItemType.LightGrayGlazedTerracotta; - mappings[531] = ItemType.LightGrayShulkerBox; - mappings[479] = ItemType.LightGrayStainedGlass; - mappings[495] = ItemType.LightGrayStainedGlassPane; - mappings[435] = ItemType.LightGrayTerracotta; - mappings[210] = ItemType.LightGrayWool; - mappings[697] = ItemType.LightWeightedPressurePlate; - mappings[673] = ItemType.LightningRod; - mappings[466] = ItemType.Lilac; - mappings[229] = ItemType.LilyOfTheValley; - mappings[365] = ItemType.LilyPad; - mappings[1138] = ItemType.LimeBanner; - mappings[969] = ItemType.LimeBed; - mappings[1244] = ItemType.LimeCandle; - mappings[451] = ItemType.LimeCarpet; - mappings[560] = ItemType.LimeConcrete; - mappings[576] = ItemType.LimeConcretePowder; - mappings[949] = ItemType.LimeDye; - mappings[544] = ItemType.LimeGlazedTerracotta; - mappings[528] = ItemType.LimeShulkerBox; - mappings[476] = ItemType.LimeStainedGlass; - mappings[492] = ItemType.LimeStainedGlassPane; - mappings[432] = ItemType.LimeTerracotta; - mappings[207] = ItemType.LimeWool; - mappings[1161] = ItemType.LingeringPotion; - mappings[1041] = ItemType.LlamaSpawnEgg; - mappings[1223] = ItemType.Lodestone; - mappings[1191] = ItemType.Loom; - mappings[1093] = ItemType.Mace; - mappings[1135] = ItemType.MagentaBanner; - mappings[966] = ItemType.MagentaBed; - mappings[1241] = ItemType.MagentaCandle; - mappings[448] = ItemType.MagentaCarpet; - mappings[557] = ItemType.MagentaConcrete; - mappings[573] = ItemType.MagentaConcretePowder; - mappings[946] = ItemType.MagentaDye; - mappings[541] = ItemType.MagentaGlazedTerracotta; - mappings[525] = ItemType.MagentaShulkerBox; - mappings[473] = ItemType.MagentaStainedGlass; - mappings[489] = ItemType.MagentaStainedGlassPane; - mappings[429] = ItemType.MagentaTerracotta; - mappings[204] = ItemType.MagentaWool; - mappings[516] = ItemType.MagmaBlock; - mappings[1003] = ItemType.MagmaCream; - mappings[1042] = ItemType.MagmaCubeSpawnEgg; - mappings[788] = ItemType.MangroveBoat; - mappings[691] = ItemType.MangroveButton; - mappings[789] = ItemType.MangroveChestBoat; - mappings[718] = ItemType.MangroveDoor; - mappings[318] = ItemType.MangroveFence; - mappings[757] = ItemType.MangroveFenceGate; - mappings[904] = ItemType.MangroveHangingSign; - mappings[183] = ItemType.MangroveLeaves; - mappings[139] = ItemType.MangroveLog; - mappings[43] = ItemType.MangrovePlanks; - mappings[706] = ItemType.MangrovePressurePlate; - mappings[55] = ItemType.MangrovePropagule; - mappings[140] = ItemType.MangroveRoots; - mappings[893] = ItemType.MangroveSign; - mappings[259] = ItemType.MangroveSlab; - mappings[390] = ItemType.MangroveStairs; - mappings[738] = ItemType.MangroveTrapdoor; - mappings[173] = ItemType.MangroveWood; - mappings[1101] = ItemType.Map; - mappings[1256] = ItemType.MediumAmethystBud; - mappings[358] = ItemType.Melon; - mappings[987] = ItemType.MelonSeeds; - mappings[984] = ItemType.MelonSlice; - mappings[914] = ItemType.MilkBucket; - mappings[766] = ItemType.Minecart; - mappings[1299] = ItemType.MinerPotterySherd; - mappings[1195] = ItemType.MojangBannerPattern; - mappings[1043] = ItemType.MooshroomSpawnEgg; - mappings[247] = ItemType.MossBlock; - mappings[245] = ItemType.MossCarpet; - mappings[289] = ItemType.MossyCobblestone; - mappings[643] = ItemType.MossyCobblestoneSlab; - mappings[625] = ItemType.MossyCobblestoneStairs; - mappings[398] = ItemType.MossyCobblestoneWall; - mappings[641] = ItemType.MossyStoneBrickSlab; - mappings[623] = ItemType.MossyStoneBrickStairs; - mappings[402] = ItemType.MossyStoneBrickWall; - mappings[341] = ItemType.MossyStoneBricks; - mappings[1300] = ItemType.MournerPotterySherd; - mappings[32] = ItemType.Mud; - mappings[272] = ItemType.MudBrickSlab; - mappings[363] = ItemType.MudBrickStairs; - mappings[405] = ItemType.MudBrickWall; - mappings[345] = ItemType.MudBricks; - mappings[141] = ItemType.MuddyMangroveRoots; - mappings[1044] = ItemType.MuleSpawnEgg; - mappings[354] = ItemType.MushroomStem; - mappings[849] = ItemType.MushroomStew; - mappings[1178] = ItemType.MusicDisc11; - mappings[1168] = ItemType.MusicDisc13; - mappings[1182] = ItemType.MusicDisc5; - mappings[1170] = ItemType.MusicDiscBlocks; - mappings[1169] = ItemType.MusicDiscCat; - mappings[1171] = ItemType.MusicDiscChirp; - mappings[1172] = ItemType.MusicDiscFar; - mappings[1173] = ItemType.MusicDiscMall; - mappings[1174] = ItemType.MusicDiscMellohi; - mappings[1180] = ItemType.MusicDiscOtherside; - mappings[1183] = ItemType.MusicDiscPigstep; - mappings[1181] = ItemType.MusicDiscRelic; - mappings[1175] = ItemType.MusicDiscStal; - mappings[1176] = ItemType.MusicDiscStrad; - mappings[1179] = ItemType.MusicDiscWait; - mappings[1177] = ItemType.MusicDiscWard; - mappings[1131] = ItemType.Mutton; - mappings[364] = ItemType.Mycelium; - mappings[1129] = ItemType.NameTag; - mappings[1187] = ItemType.NautilusShell; - mappings[1115] = ItemType.NetherBrick; - mappings[369] = ItemType.NetherBrickFence; - mappings[273] = ItemType.NetherBrickSlab; - mappings[370] = ItemType.NetherBrickStairs; - mappings[406] = ItemType.NetherBrickWall; - mappings[366] = ItemType.NetherBricks; - mappings[78] = ItemType.NetherGoldOre; - mappings[79] = ItemType.NetherQuartzOre; - mappings[240] = ItemType.NetherSprouts; - mappings[1110] = ItemType.NetherStar; - mappings[997] = ItemType.NetherWart; - mappings[517] = ItemType.NetherWartBlock; - mappings[845] = ItemType.NetheriteAxe; - mappings[92] = ItemType.NetheriteBlock; - mappings[879] = ItemType.NetheriteBoots; - mappings[877] = ItemType.NetheriteChestplate; - mappings[876] = ItemType.NetheriteHelmet; - mappings[846] = ItemType.NetheriteHoe; - mappings[815] = ItemType.NetheriteIngot; - mappings[878] = ItemType.NetheriteLeggings; - mappings[844] = ItemType.NetheritePickaxe; - mappings[816] = ItemType.NetheriteScrap; - mappings[843] = ItemType.NetheriteShovel; - mappings[842] = ItemType.NetheriteSword; - mappings[1266] = ItemType.NetheriteUpgradeSmithingTemplate; - mappings[325] = ItemType.Netherrack; - mappings[681] = ItemType.NoteBlock; - mappings[774] = ItemType.OakBoat; - mappings[684] = ItemType.OakButton; - mappings[775] = ItemType.OakChestBoat; - mappings[711] = ItemType.OakDoor; - mappings[311] = ItemType.OakFence; - mappings[750] = ItemType.OakFenceGate; - mappings[897] = ItemType.OakHangingSign; - mappings[176] = ItemType.OakLeaves; - mappings[132] = ItemType.OakLog; - mappings[36] = ItemType.OakPlanks; - mappings[699] = ItemType.OakPressurePlate; - mappings[48] = ItemType.OakSapling; - mappings[886] = ItemType.OakSign; - mappings[252] = ItemType.OakSlab; - mappings[383] = ItemType.OakStairs; - mappings[731] = ItemType.OakTrapdoor; - mappings[166] = ItemType.OakWood; - mappings[666] = ItemType.Observer; - mappings[290] = ItemType.Obsidian; - mappings[1045] = ItemType.OcelotSpawnEgg; - mappings[1260] = ItemType.OchreFroglight; - mappings[1328] = ItemType.OminousBottle; - mappings[1326] = ItemType.OminousTrialKey; - mappings[1134] = ItemType.OrangeBanner; - mappings[965] = ItemType.OrangeBed; - mappings[1240] = ItemType.OrangeCandle; - mappings[447] = ItemType.OrangeCarpet; - mappings[556] = ItemType.OrangeConcrete; - mappings[572] = ItemType.OrangeConcretePowder; - mappings[945] = ItemType.OrangeDye; - mappings[540] = ItemType.OrangeGlazedTerracotta; - mappings[524] = ItemType.OrangeShulkerBox; - mappings[472] = ItemType.OrangeStainedGlass; - mappings[488] = ItemType.OrangeStainedGlassPane; - mappings[428] = ItemType.OrangeTerracotta; - mappings[224] = ItemType.OrangeTulip; - mappings[203] = ItemType.OrangeWool; - mappings[227] = ItemType.OxeyeDaisy; - mappings[99] = ItemType.OxidizedChiseledCopper; - mappings[95] = ItemType.OxidizedCopper; - mappings[1319] = ItemType.OxidizedCopperBulb; - mappings[725] = ItemType.OxidizedCopperDoor; - mappings[1311] = ItemType.OxidizedCopperGrate; - mappings[745] = ItemType.OxidizedCopperTrapdoor; - mappings[103] = ItemType.OxidizedCutCopper; - mappings[111] = ItemType.OxidizedCutCopperSlab; - mappings[107] = ItemType.OxidizedCutCopperStairs; - mappings[463] = ItemType.PackedIce; - mappings[344] = ItemType.PackedMud; - mappings[883] = ItemType.Painting; - mappings[1046] = ItemType.PandaSpawnEgg; - mappings[924] = ItemType.Paper; - mappings[1047] = ItemType.ParrotSpawnEgg; - mappings[1262] = ItemType.PearlescentFroglight; - mappings[468] = ItemType.Peony; - mappings[268] = ItemType.PetrifiedOakSlab; - mappings[1186] = ItemType.PhantomMembrane; - mappings[1048] = ItemType.PhantomSpawnEgg; - mappings[1049] = ItemType.PigSpawnEgg; - mappings[1197] = ItemType.PiglinBannerPattern; - mappings[1051] = ItemType.PiglinBruteSpawnEgg; - mappings[1109] = ItemType.PiglinHead; - mappings[1050] = ItemType.PiglinSpawnEgg; - mappings[1052] = ItemType.PillagerSpawnEgg; - mappings[1139] = ItemType.PinkBanner; - mappings[970] = ItemType.PinkBed; - mappings[1245] = ItemType.PinkCandle; - mappings[452] = ItemType.PinkCarpet; - mappings[561] = ItemType.PinkConcrete; - mappings[577] = ItemType.PinkConcretePowder; - mappings[950] = ItemType.PinkDye; - mappings[545] = ItemType.PinkGlazedTerracotta; - mappings[246] = ItemType.PinkPetals; - mappings[529] = ItemType.PinkShulkerBox; - mappings[477] = ItemType.PinkStainedGlass; - mappings[493] = ItemType.PinkStainedGlassPane; - mappings[433] = ItemType.PinkTerracotta; - mappings[226] = ItemType.PinkTulip; - mappings[208] = ItemType.PinkWool; - mappings[662] = ItemType.Piston; - mappings[232] = ItemType.PitcherPlant; - mappings[1153] = ItemType.PitcherPod; - mappings[1105] = ItemType.PlayerHead; - mappings[1301] = ItemType.PlentyPotterySherd; - mappings[30] = ItemType.Podzol; - mappings[1259] = ItemType.PointedDripstone; - mappings[1100] = ItemType.PoisonousPotato; - mappings[1053] = ItemType.PolarBearSpawnEgg; - mappings[7] = ItemType.PolishedAndesite; - mappings[650] = ItemType.PolishedAndesiteSlab; - mappings[633] = ItemType.PolishedAndesiteStairs; - mappings[329] = ItemType.PolishedBasalt; - mappings[1229] = ItemType.PolishedBlackstone; - mappings[1234] = ItemType.PolishedBlackstoneBrickSlab; - mappings[1235] = ItemType.PolishedBlackstoneBrickStairs; - mappings[414] = ItemType.PolishedBlackstoneBrickWall; - mappings[1233] = ItemType.PolishedBlackstoneBricks; - mappings[683] = ItemType.PolishedBlackstoneButton; - mappings[696] = ItemType.PolishedBlackstonePressurePlate; - mappings[1230] = ItemType.PolishedBlackstoneSlab; - mappings[1231] = ItemType.PolishedBlackstoneStairs; - mappings[413] = ItemType.PolishedBlackstoneWall; - mappings[10] = ItemType.PolishedDeepslate; - mappings[653] = ItemType.PolishedDeepslateSlab; - mappings[636] = ItemType.PolishedDeepslateStairs; - mappings[416] = ItemType.PolishedDeepslateWall; - mappings[5] = ItemType.PolishedDiorite; - mappings[642] = ItemType.PolishedDioriteSlab; - mappings[624] = ItemType.PolishedDioriteStairs; - mappings[3] = ItemType.PolishedGranite; - mappings[639] = ItemType.PolishedGraniteSlab; - mappings[621] = ItemType.PolishedGraniteStairs; - mappings[17] = ItemType.PolishedTuff; - mappings[18] = ItemType.PolishedTuffSlab; - mappings[19] = ItemType.PolishedTuffStairs; - mappings[20] = ItemType.PolishedTuffWall; - mappings[1151] = ItemType.PoppedChorusFruit; - mappings[219] = ItemType.Poppy; - mappings[881] = ItemType.Porkchop; - mappings[1098] = ItemType.Potato; - mappings[998] = ItemType.Potion; - mappings[911] = ItemType.PowderSnowBucket; - mappings[761] = ItemType.PoweredRail; - mappings[503] = ItemType.Prismarine; - mappings[279] = ItemType.PrismarineBrickSlab; - mappings[507] = ItemType.PrismarineBrickStairs; - mappings[504] = ItemType.PrismarineBricks; - mappings[1117] = ItemType.PrismarineCrystals; - mappings[1116] = ItemType.PrismarineShard; - mappings[278] = ItemType.PrismarineSlab; - mappings[506] = ItemType.PrismarineStairs; - mappings[400] = ItemType.PrismarineWall; - mappings[1302] = ItemType.PrizePotterySherd; - mappings[938] = ItemType.Pufferfish; - mappings[915] = ItemType.PufferfishBucket; - mappings[1054] = ItemType.PufferfishSpawnEgg; - mappings[322] = ItemType.Pumpkin; - mappings[1111] = ItemType.PumpkinPie; - mappings[986] = ItemType.PumpkinSeeds; - mappings[1143] = ItemType.PurpleBanner; - mappings[974] = ItemType.PurpleBed; - mappings[1249] = ItemType.PurpleCandle; - mappings[456] = ItemType.PurpleCarpet; - mappings[565] = ItemType.PurpleConcrete; - mappings[581] = ItemType.PurpleConcretePowder; - mappings[954] = ItemType.PurpleDye; - mappings[549] = ItemType.PurpleGlazedTerracotta; - mappings[533] = ItemType.PurpleShulkerBox; - mappings[481] = ItemType.PurpleStainedGlass; - mappings[497] = ItemType.PurpleStainedGlassPane; - mappings[437] = ItemType.PurpleTerracotta; - mappings[212] = ItemType.PurpleWool; - mappings[295] = ItemType.PurpurBlock; - mappings[296] = ItemType.PurpurPillar; - mappings[277] = ItemType.PurpurSlab; - mappings[297] = ItemType.PurpurStairs; - mappings[807] = ItemType.Quartz; - mappings[423] = ItemType.QuartzBlock; - mappings[424] = ItemType.QuartzBricks; - mappings[425] = ItemType.QuartzPillar; - mappings[274] = ItemType.QuartzSlab; - mappings[426] = ItemType.QuartzStairs; - mappings[1118] = ItemType.Rabbit; - mappings[1121] = ItemType.RabbitFoot; - mappings[1122] = ItemType.RabbitHide; - mappings[1055] = ItemType.RabbitSpawnEgg; - mappings[1120] = ItemType.RabbitStew; - mappings[763] = ItemType.Rail; - mappings[1281] = ItemType.RaiserArmorTrimSmithingTemplate; - mappings[1056] = ItemType.RavagerSpawnEgg; - mappings[811] = ItemType.RawCopper; - mappings[83] = ItemType.RawCopperBlock; - mappings[813] = ItemType.RawGold; - mappings[84] = ItemType.RawGoldBlock; - mappings[809] = ItemType.RawIron; - mappings[82] = ItemType.RawIronBlock; - mappings[929] = ItemType.RecoveryCompass; - mappings[1147] = ItemType.RedBanner; - mappings[978] = ItemType.RedBed; - mappings[1253] = ItemType.RedCandle; - mappings[460] = ItemType.RedCarpet; - mappings[569] = ItemType.RedConcrete; - mappings[585] = ItemType.RedConcretePowder; - mappings[958] = ItemType.RedDye; - mappings[553] = ItemType.RedGlazedTerracotta; - mappings[235] = ItemType.RedMushroom; - mappings[353] = ItemType.RedMushroomBlock; - mappings[649] = ItemType.RedNetherBrickSlab; - mappings[632] = ItemType.RedNetherBrickStairs; - mappings[408] = ItemType.RedNetherBrickWall; - mappings[519] = ItemType.RedNetherBricks; - mappings[60] = ItemType.RedSand; - mappings[510] = ItemType.RedSandstone; - mappings[275] = ItemType.RedSandstoneSlab; - mappings[513] = ItemType.RedSandstoneStairs; - mappings[401] = ItemType.RedSandstoneWall; - mappings[537] = ItemType.RedShulkerBox; - mappings[485] = ItemType.RedStainedGlass; - mappings[501] = ItemType.RedStainedGlassPane; - mappings[441] = ItemType.RedTerracotta; - mappings[223] = ItemType.RedTulip; - mappings[216] = ItemType.RedWool; - mappings[657] = ItemType.Redstone; - mappings[659] = ItemType.RedstoneBlock; - mappings[680] = ItemType.RedstoneLamp; - mappings[70] = ItemType.RedstoneOre; - mappings[658] = ItemType.RedstoneTorch; - mappings[351] = ItemType.ReinforcedDeepslate; - mappings[660] = ItemType.Repeater; - mappings[514] = ItemType.RepeatingCommandBlock; - mappings[1237] = ItemType.RespawnAnchor; - mappings[1276] = ItemType.RibArmorTrimSmithingTemplate; - mappings[31] = ItemType.RootedDirt; - mappings[467] = ItemType.RoseBush; - mappings[992] = ItemType.RottenFlesh; - mappings[765] = ItemType.Saddle; - mappings[936] = ItemType.Salmon; - mappings[916] = ItemType.SalmonBucket; - mappings[1057] = ItemType.SalmonSpawnEgg; - mappings[57] = ItemType.Sand; - mappings[191] = ItemType.Sandstone; - mappings[266] = ItemType.SandstoneSlab; - mappings[380] = ItemType.SandstoneStairs; - mappings[409] = ItemType.SandstoneWall; - mappings[656] = ItemType.Scaffolding; - mappings[1303] = ItemType.ScrapePotterySherd; - mappings[371] = ItemType.Sculk; - mappings[373] = ItemType.SculkCatalyst; - mappings[675] = ItemType.SculkSensor; - mappings[374] = ItemType.SculkShrieker; - mappings[372] = ItemType.SculkVein; - mappings[509] = ItemType.SeaLantern; - mappings[201] = ItemType.SeaPickle; - mappings[200] = ItemType.Seagrass; - mappings[1267] = ItemType.SentryArmorTrimSmithingTemplate; - mappings[1279] = ItemType.ShaperArmorTrimSmithingTemplate; - mappings[1304] = ItemType.SheafPotterySherd; - mappings[983] = ItemType.Shears; - mappings[1058] = ItemType.SheepSpawnEgg; - mappings[1305] = ItemType.ShelterPotterySherd; - mappings[1162] = ItemType.Shield; - mappings[195] = ItemType.ShortGrass; - mappings[1217] = ItemType.Shroomlight; - mappings[522] = ItemType.ShulkerBox; - mappings[1164] = ItemType.ShulkerShell; - mappings[1059] = ItemType.ShulkerSpawnEgg; - mappings[1280] = ItemType.SilenceArmorTrimSmithingTemplate; - mappings[1060] = ItemType.SilverfishSpawnEgg; - mappings[1062] = ItemType.SkeletonHorseSpawnEgg; - mappings[1103] = ItemType.SkeletonSkull; - mappings[1061] = ItemType.SkeletonSpawnEgg; - mappings[1194] = ItemType.SkullBannerPattern; - mappings[1306] = ItemType.SkullPotterySherd; - mappings[926] = ItemType.SlimeBall; - mappings[664] = ItemType.SlimeBlock; - mappings[1063] = ItemType.SlimeSpawnEgg; - mappings[1255] = ItemType.SmallAmethystBud; - mappings[250] = ItemType.SmallDripleaf; - mappings[1208] = ItemType.SmithingTable; - mappings[1203] = ItemType.Smoker; - mappings[330] = ItemType.SmoothBasalt; - mappings[281] = ItemType.SmoothQuartz; - mappings[646] = ItemType.SmoothQuartzSlab; - mappings[629] = ItemType.SmoothQuartzStairs; - mappings[282] = ItemType.SmoothRedSandstone; - mappings[640] = ItemType.SmoothRedSandstoneSlab; - mappings[622] = ItemType.SmoothRedSandstoneStairs; - mappings[283] = ItemType.SmoothSandstone; - mappings[645] = ItemType.SmoothSandstoneSlab; - mappings[628] = ItemType.SmoothSandstoneStairs; - mappings[284] = ItemType.SmoothStone; - mappings[265] = ItemType.SmoothStoneSlab; - mappings[588] = ItemType.SnifferEgg; - mappings[1064] = ItemType.SnifferSpawnEgg; - mappings[1307] = ItemType.SnortPotterySherd; - mappings[1275] = ItemType.SnoutArmorTrimSmithingTemplate; - mappings[305] = ItemType.Snow; - mappings[307] = ItemType.SnowBlock; - mappings[1065] = ItemType.SnowGolemSpawnEgg; - mappings[912] = ItemType.Snowball; - mappings[1216] = ItemType.SoulCampfire; - mappings[1212] = ItemType.SoulLantern; - mappings[326] = ItemType.SoulSand; - mappings[327] = ItemType.SoulSoil; - mappings[331] = ItemType.SoulTorch; - mappings[298] = ItemType.Spawner; - mappings[1159] = ItemType.SpectralArrow; - mappings[1000] = ItemType.SpiderEye; - mappings[1066] = ItemType.SpiderSpawnEgg; - mappings[1277] = ItemType.SpireArmorTrimSmithingTemplate; - mappings[1158] = ItemType.SplashPotion; - mappings[186] = ItemType.Sponge; - mappings[233] = ItemType.SporeBlossom; - mappings[776] = ItemType.SpruceBoat; - mappings[685] = ItemType.SpruceButton; - mappings[777] = ItemType.SpruceChestBoat; - mappings[712] = ItemType.SpruceDoor; - mappings[312] = ItemType.SpruceFence; - mappings[751] = ItemType.SpruceFenceGate; - mappings[898] = ItemType.SpruceHangingSign; - mappings[177] = ItemType.SpruceLeaves; - mappings[133] = ItemType.SpruceLog; - mappings[37] = ItemType.SprucePlanks; - mappings[700] = ItemType.SprucePressurePlate; - mappings[49] = ItemType.SpruceSapling; - mappings[887] = ItemType.SpruceSign; - mappings[253] = ItemType.SpruceSlab; - mappings[384] = ItemType.SpruceStairs; - mappings[732] = ItemType.SpruceTrapdoor; - mappings[167] = ItemType.SpruceWood; - mappings[933] = ItemType.Spyglass; - mappings[1067] = ItemType.SquidSpawnEgg; - mappings[847] = ItemType.Stick; - mappings[663] = ItemType.StickyPiston; - mappings[1] = ItemType.Stone; - mappings[825] = ItemType.StoneAxe; - mappings[271] = ItemType.StoneBrickSlab; - mappings[362] = ItemType.StoneBrickStairs; - mappings[404] = ItemType.StoneBrickWall; - mappings[340] = ItemType.StoneBricks; - mappings[682] = ItemType.StoneButton; - mappings[826] = ItemType.StoneHoe; - mappings[824] = ItemType.StonePickaxe; - mappings[695] = ItemType.StonePressurePlate; - mappings[823] = ItemType.StoneShovel; - mappings[264] = ItemType.StoneSlab; - mappings[627] = ItemType.StoneStairs; - mappings[822] = ItemType.StoneSword; - mappings[1209] = ItemType.Stonecutter; - mappings[1068] = ItemType.StraySpawnEgg; - mappings[1069] = ItemType.StriderSpawnEgg; - mappings[850] = ItemType.String; - mappings[149] = ItemType.StrippedAcaciaLog; - mappings[159] = ItemType.StrippedAcaciaWood; - mappings[165] = ItemType.StrippedBambooBlock; - mappings[147] = ItemType.StrippedBirchLog; - mappings[157] = ItemType.StrippedBirchWood; - mappings[150] = ItemType.StrippedCherryLog; - mappings[160] = ItemType.StrippedCherryWood; - mappings[163] = ItemType.StrippedCrimsonHyphae; - mappings[153] = ItemType.StrippedCrimsonStem; - mappings[151] = ItemType.StrippedDarkOakLog; - mappings[161] = ItemType.StrippedDarkOakWood; - mappings[148] = ItemType.StrippedJungleLog; - mappings[158] = ItemType.StrippedJungleWood; - mappings[152] = ItemType.StrippedMangroveLog; - mappings[162] = ItemType.StrippedMangroveWood; - mappings[145] = ItemType.StrippedOakLog; - mappings[155] = ItemType.StrippedOakWood; - mappings[146] = ItemType.StrippedSpruceLog; - mappings[156] = ItemType.StrippedSpruceWood; - mappings[164] = ItemType.StrippedWarpedHyphae; - mappings[154] = ItemType.StrippedWarpedStem; - mappings[792] = ItemType.StructureBlock; - mappings[521] = ItemType.StructureVoid; - mappings[962] = ItemType.Sugar; - mappings[243] = ItemType.SugarCane; - mappings[465] = ItemType.Sunflower; - mappings[59] = ItemType.SuspiciousGravel; - mappings[58] = ItemType.SuspiciousSand; - mappings[1190] = ItemType.SuspiciousStew; - mappings[1213] = ItemType.SweetBerries; - mappings[920] = ItemType.TadpoleBucket; - mappings[1070] = ItemType.TadpoleSpawnEgg; - mappings[469] = ItemType.TallGrass; - mappings[671] = ItemType.Target; - mappings[462] = ItemType.Terracotta; - mappings[1274] = ItemType.TideArmorTrimSmithingTemplate; - mappings[189] = ItemType.TintedGlass; - mappings[1160] = ItemType.TippedArrow; - mappings[679] = ItemType.Tnt; - mappings[769] = ItemType.TntMinecart; - mappings[291] = ItemType.Torch; - mappings[231] = ItemType.Torchflower; - mappings[1152] = ItemType.TorchflowerSeeds; - mappings[1163] = ItemType.TotemOfUndying; - mappings[1071] = ItemType.TraderLlamaSpawnEgg; - mappings[678] = ItemType.TrappedChest; - mappings[1325] = ItemType.TrialKey; - mappings[1324] = ItemType.TrialSpawner; - mappings[1185] = ItemType.Trident; - mappings[677] = ItemType.TripwireHook; - mappings[937] = ItemType.TropicalFish; - mappings[918] = ItemType.TropicalFishBucket; - mappings[1072] = ItemType.TropicalFishSpawnEgg; - mappings[599] = ItemType.TubeCoral; - mappings[594] = ItemType.TubeCoralBlock; - mappings[609] = ItemType.TubeCoralFan; - mappings[12] = ItemType.Tuff; - mappings[22] = ItemType.TuffBrickSlab; - mappings[23] = ItemType.TuffBrickStairs; - mappings[24] = ItemType.TuffBrickWall; - mappings[21] = ItemType.TuffBricks; - mappings[13] = ItemType.TuffSlab; - mappings[14] = ItemType.TuffStairs; - mappings[15] = ItemType.TuffWall; - mappings[587] = ItemType.TurtleEgg; - mappings[794] = ItemType.TurtleHelmet; - mappings[795] = ItemType.TurtleScute; - mappings[1073] = ItemType.TurtleSpawnEgg; - mappings[242] = ItemType.TwistingVines; - mappings[1327] = ItemType.Vault; - mappings[1261] = ItemType.VerdantFroglight; - mappings[1273] = ItemType.VexArmorTrimSmithingTemplate; - mappings[1074] = ItemType.VexSpawnEgg; - mappings[1075] = ItemType.VillagerSpawnEgg; - mappings[1076] = ItemType.VindicatorSpawnEgg; - mappings[359] = ItemType.Vine; - mappings[1077] = ItemType.WanderingTraderSpawnEgg; - mappings[1271] = ItemType.WardArmorTrimSmithingTemplate; - mappings[1078] = ItemType.WardenSpawnEgg; - mappings[694] = ItemType.WarpedButton; - mappings[721] = ItemType.WarpedDoor; - mappings[321] = ItemType.WarpedFence; - mappings[760] = ItemType.WarpedFenceGate; - mappings[237] = ItemType.WarpedFungus; - mappings[772] = ItemType.WarpedFungusOnAStick; - mappings[907] = ItemType.WarpedHangingSign; - mappings[175] = ItemType.WarpedHyphae; - mappings[34] = ItemType.WarpedNylium; - mappings[46] = ItemType.WarpedPlanks; - mappings[709] = ItemType.WarpedPressurePlate; - mappings[239] = ItemType.WarpedRoots; - mappings[896] = ItemType.WarpedSign; - mappings[263] = ItemType.WarpedSlab; - mappings[394] = ItemType.WarpedStairs; - mappings[143] = ItemType.WarpedStem; - mappings[741] = ItemType.WarpedTrapdoor; - mappings[518] = ItemType.WarpedWartBlock; - mappings[909] = ItemType.WaterBucket; - mappings[116] = ItemType.WaxedChiseledCopper; - mappings[112] = ItemType.WaxedCopperBlock; - mappings[1320] = ItemType.WaxedCopperBulb; - mappings[726] = ItemType.WaxedCopperDoor; - mappings[1312] = ItemType.WaxedCopperGrate; - mappings[746] = ItemType.WaxedCopperTrapdoor; - mappings[120] = ItemType.WaxedCutCopper; - mappings[128] = ItemType.WaxedCutCopperSlab; - mappings[124] = ItemType.WaxedCutCopperStairs; - mappings[117] = ItemType.WaxedExposedChiseledCopper; - mappings[113] = ItemType.WaxedExposedCopper; - mappings[1321] = ItemType.WaxedExposedCopperBulb; - mappings[727] = ItemType.WaxedExposedCopperDoor; - mappings[1313] = ItemType.WaxedExposedCopperGrate; - mappings[747] = ItemType.WaxedExposedCopperTrapdoor; - mappings[121] = ItemType.WaxedExposedCutCopper; - mappings[129] = ItemType.WaxedExposedCutCopperSlab; - mappings[125] = ItemType.WaxedExposedCutCopperStairs; - mappings[119] = ItemType.WaxedOxidizedChiseledCopper; - mappings[115] = ItemType.WaxedOxidizedCopper; - mappings[1323] = ItemType.WaxedOxidizedCopperBulb; - mappings[729] = ItemType.WaxedOxidizedCopperDoor; - mappings[1315] = ItemType.WaxedOxidizedCopperGrate; - mappings[749] = ItemType.WaxedOxidizedCopperTrapdoor; - mappings[123] = ItemType.WaxedOxidizedCutCopper; - mappings[131] = ItemType.WaxedOxidizedCutCopperSlab; - mappings[127] = ItemType.WaxedOxidizedCutCopperStairs; - mappings[118] = ItemType.WaxedWeatheredChiseledCopper; - mappings[114] = ItemType.WaxedWeatheredCopper; - mappings[1322] = ItemType.WaxedWeatheredCopperBulb; - mappings[728] = ItemType.WaxedWeatheredCopperDoor; - mappings[1314] = ItemType.WaxedWeatheredCopperGrate; - mappings[748] = ItemType.WaxedWeatheredCopperTrapdoor; - mappings[122] = ItemType.WaxedWeatheredCutCopper; - mappings[130] = ItemType.WaxedWeatheredCutCopperSlab; - mappings[126] = ItemType.WaxedWeatheredCutCopperStairs; - mappings[1278] = ItemType.WayfinderArmorTrimSmithingTemplate; - mappings[98] = ItemType.WeatheredChiseledCopper; - mappings[94] = ItemType.WeatheredCopper; - mappings[1318] = ItemType.WeatheredCopperBulb; - mappings[724] = ItemType.WeatheredCopperDoor; - mappings[1310] = ItemType.WeatheredCopperGrate; - mappings[744] = ItemType.WeatheredCopperTrapdoor; - mappings[102] = ItemType.WeatheredCutCopper; - mappings[110] = ItemType.WeatheredCutCopperSlab; - mappings[106] = ItemType.WeatheredCutCopperStairs; - mappings[241] = ItemType.WeepingVines; - mappings[187] = ItemType.WetSponge; - mappings[854] = ItemType.Wheat; - mappings[853] = ItemType.WheatSeeds; - mappings[1133] = ItemType.WhiteBanner; - mappings[964] = ItemType.WhiteBed; - mappings[1239] = ItemType.WhiteCandle; - mappings[446] = ItemType.WhiteCarpet; - mappings[555] = ItemType.WhiteConcrete; - mappings[571] = ItemType.WhiteConcretePowder; - mappings[944] = ItemType.WhiteDye; - mappings[539] = ItemType.WhiteGlazedTerracotta; - mappings[523] = ItemType.WhiteShulkerBox; - mappings[471] = ItemType.WhiteStainedGlass; - mappings[487] = ItemType.WhiteStainedGlassPane; - mappings[427] = ItemType.WhiteTerracotta; - mappings[225] = ItemType.WhiteTulip; - mappings[202] = ItemType.WhiteWool; - mappings[1270] = ItemType.WildArmorTrimSmithingTemplate; - mappings[1090] = ItemType.WindCharge; - mappings[1079] = ItemType.WitchSpawnEgg; - mappings[230] = ItemType.WitherRose; - mappings[1104] = ItemType.WitherSkeletonSkull; - mappings[1081] = ItemType.WitherSkeletonSpawnEgg; - mappings[1080] = ItemType.WitherSpawnEgg; - mappings[797] = ItemType.WolfArmor; - mappings[1082] = ItemType.WolfSpawnEgg; - mappings[820] = ItemType.WoodenAxe; - mappings[821] = ItemType.WoodenHoe; - mappings[819] = ItemType.WoodenPickaxe; - mappings[818] = ItemType.WoodenShovel; - mappings[817] = ItemType.WoodenSword; - mappings[1091] = ItemType.WritableBook; - mappings[1092] = ItemType.WrittenBook; - mappings[1137] = ItemType.YellowBanner; - mappings[968] = ItemType.YellowBed; - mappings[1243] = ItemType.YellowCandle; - mappings[450] = ItemType.YellowCarpet; - mappings[559] = ItemType.YellowConcrete; - mappings[575] = ItemType.YellowConcretePowder; - mappings[948] = ItemType.YellowDye; - mappings[543] = ItemType.YellowGlazedTerracotta; - mappings[527] = ItemType.YellowShulkerBox; - mappings[475] = ItemType.YellowStainedGlass; - mappings[491] = ItemType.YellowStainedGlassPane; - mappings[431] = ItemType.YellowTerracotta; - mappings[206] = ItemType.YellowWool; - mappings[1083] = ItemType.ZoglinSpawnEgg; - mappings[1106] = ItemType.ZombieHead; - mappings[1085] = ItemType.ZombieHorseSpawnEgg; - mappings[1084] = ItemType.ZombieSpawnEgg; - mappings[1086] = ItemType.ZombieVillagerSpawnEgg; - mappings[1087] = ItemType.ZombifiedPiglinSpawnEgg; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette121.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette121.cs deleted file mode 100644 index 6759d89977..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette121.cs +++ /dev/null @@ -1,1351 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public class ItemPalette121 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette121() - { - mappings[0] = ItemType.Air; - mappings[1] = ItemType.Stone; - mappings[2] = ItemType.Granite; - mappings[3] = ItemType.PolishedGranite; - mappings[4] = ItemType.Diorite; - mappings[5] = ItemType.PolishedDiorite; - mappings[6] = ItemType.Andesite; - mappings[7] = ItemType.PolishedAndesite; - mappings[8] = ItemType.Deepslate; - mappings[9] = ItemType.CobbledDeepslate; - mappings[10] = ItemType.PolishedDeepslate; - mappings[11] = ItemType.Calcite; - mappings[12] = ItemType.Tuff; - mappings[13] = ItemType.TuffSlab; - mappings[14] = ItemType.TuffStairs; - mappings[15] = ItemType.TuffWall; - mappings[16] = ItemType.ChiseledTuff; - mappings[17] = ItemType.PolishedTuff; - mappings[18] = ItemType.PolishedTuffSlab; - mappings[19] = ItemType.PolishedTuffStairs; - mappings[20] = ItemType.PolishedTuffWall; - mappings[21] = ItemType.TuffBricks; - mappings[22] = ItemType.TuffBrickSlab; - mappings[23] = ItemType.TuffBrickStairs; - mappings[24] = ItemType.TuffBrickWall; - mappings[25] = ItemType.ChiseledTuffBricks; - mappings[26] = ItemType.DripstoneBlock; - mappings[27] = ItemType.GrassBlock; - mappings[28] = ItemType.Dirt; - mappings[29] = ItemType.CoarseDirt; - mappings[30] = ItemType.Podzol; - mappings[31] = ItemType.RootedDirt; - mappings[32] = ItemType.Mud; - mappings[33] = ItemType.CrimsonNylium; - mappings[34] = ItemType.WarpedNylium; - mappings[35] = ItemType.Cobblestone; - mappings[36] = ItemType.OakPlanks; - mappings[37] = ItemType.SprucePlanks; - mappings[38] = ItemType.BirchPlanks; - mappings[39] = ItemType.JunglePlanks; - mappings[40] = ItemType.AcaciaPlanks; - mappings[41] = ItemType.CherryPlanks; - mappings[42] = ItemType.DarkOakPlanks; - mappings[43] = ItemType.MangrovePlanks; - mappings[44] = ItemType.BambooPlanks; - mappings[45] = ItemType.CrimsonPlanks; - mappings[46] = ItemType.WarpedPlanks; - mappings[47] = ItemType.BambooMosaic; - mappings[48] = ItemType.OakSapling; - mappings[49] = ItemType.SpruceSapling; - mappings[50] = ItemType.BirchSapling; - mappings[51] = ItemType.JungleSapling; - mappings[52] = ItemType.AcaciaSapling; - mappings[53] = ItemType.CherrySapling; - mappings[54] = ItemType.DarkOakSapling; - mappings[55] = ItemType.MangrovePropagule; - mappings[56] = ItemType.Bedrock; - mappings[57] = ItemType.Sand; - mappings[58] = ItemType.SuspiciousSand; - mappings[59] = ItemType.SuspiciousGravel; - mappings[60] = ItemType.RedSand; - mappings[61] = ItemType.Gravel; - mappings[62] = ItemType.CoalOre; - mappings[63] = ItemType.DeepslateCoalOre; - mappings[64] = ItemType.IronOre; - mappings[65] = ItemType.DeepslateIronOre; - mappings[66] = ItemType.CopperOre; - mappings[67] = ItemType.DeepslateCopperOre; - mappings[68] = ItemType.GoldOre; - mappings[69] = ItemType.DeepslateGoldOre; - mappings[70] = ItemType.RedstoneOre; - mappings[71] = ItemType.DeepslateRedstoneOre; - mappings[72] = ItemType.EmeraldOre; - mappings[73] = ItemType.DeepslateEmeraldOre; - mappings[74] = ItemType.LapisOre; - mappings[75] = ItemType.DeepslateLapisOre; - mappings[76] = ItemType.DiamondOre; - mappings[77] = ItemType.DeepslateDiamondOre; - mappings[78] = ItemType.NetherGoldOre; - mappings[79] = ItemType.NetherQuartzOre; - mappings[80] = ItemType.AncientDebris; - mappings[81] = ItemType.CoalBlock; - mappings[82] = ItemType.RawIronBlock; - mappings[83] = ItemType.RawCopperBlock; - mappings[84] = ItemType.RawGoldBlock; - mappings[85] = ItemType.HeavyCore; - mappings[86] = ItemType.AmethystBlock; - mappings[87] = ItemType.BuddingAmethyst; - mappings[88] = ItemType.IronBlock; - mappings[89] = ItemType.CopperBlock; - mappings[90] = ItemType.GoldBlock; - mappings[91] = ItemType.DiamondBlock; - mappings[92] = ItemType.NetheriteBlock; - mappings[93] = ItemType.ExposedCopper; - mappings[94] = ItemType.WeatheredCopper; - mappings[95] = ItemType.OxidizedCopper; - mappings[96] = ItemType.ChiseledCopper; - mappings[97] = ItemType.ExposedChiseledCopper; - mappings[98] = ItemType.WeatheredChiseledCopper; - mappings[99] = ItemType.OxidizedChiseledCopper; - mappings[100] = ItemType.CutCopper; - mappings[101] = ItemType.ExposedCutCopper; - mappings[102] = ItemType.WeatheredCutCopper; - mappings[103] = ItemType.OxidizedCutCopper; - mappings[104] = ItemType.CutCopperStairs; - mappings[105] = ItemType.ExposedCutCopperStairs; - mappings[106] = ItemType.WeatheredCutCopperStairs; - mappings[107] = ItemType.OxidizedCutCopperStairs; - mappings[108] = ItemType.CutCopperSlab; - mappings[109] = ItemType.ExposedCutCopperSlab; - mappings[110] = ItemType.WeatheredCutCopperSlab; - mappings[111] = ItemType.OxidizedCutCopperSlab; - mappings[112] = ItemType.WaxedCopperBlock; - mappings[113] = ItemType.WaxedExposedCopper; - mappings[114] = ItemType.WaxedWeatheredCopper; - mappings[115] = ItemType.WaxedOxidizedCopper; - mappings[116] = ItemType.WaxedChiseledCopper; - mappings[117] = ItemType.WaxedExposedChiseledCopper; - mappings[118] = ItemType.WaxedWeatheredChiseledCopper; - mappings[119] = ItemType.WaxedOxidizedChiseledCopper; - mappings[120] = ItemType.WaxedCutCopper; - mappings[121] = ItemType.WaxedExposedCutCopper; - mappings[122] = ItemType.WaxedWeatheredCutCopper; - mappings[123] = ItemType.WaxedOxidizedCutCopper; - mappings[124] = ItemType.WaxedCutCopperStairs; - mappings[125] = ItemType.WaxedExposedCutCopperStairs; - mappings[126] = ItemType.WaxedWeatheredCutCopperStairs; - mappings[127] = ItemType.WaxedOxidizedCutCopperStairs; - mappings[128] = ItemType.WaxedCutCopperSlab; - mappings[129] = ItemType.WaxedExposedCutCopperSlab; - mappings[130] = ItemType.WaxedWeatheredCutCopperSlab; - mappings[131] = ItemType.WaxedOxidizedCutCopperSlab; - mappings[132] = ItemType.OakLog; - mappings[133] = ItemType.SpruceLog; - mappings[134] = ItemType.BirchLog; - mappings[135] = ItemType.JungleLog; - mappings[136] = ItemType.AcaciaLog; - mappings[137] = ItemType.CherryLog; - mappings[138] = ItemType.DarkOakLog; - mappings[139] = ItemType.MangroveLog; - mappings[140] = ItemType.MangroveRoots; - mappings[141] = ItemType.MuddyMangroveRoots; - mappings[142] = ItemType.CrimsonStem; - mappings[143] = ItemType.WarpedStem; - mappings[144] = ItemType.BambooBlock; - mappings[145] = ItemType.StrippedOakLog; - mappings[146] = ItemType.StrippedSpruceLog; - mappings[147] = ItemType.StrippedBirchLog; - mappings[148] = ItemType.StrippedJungleLog; - mappings[149] = ItemType.StrippedAcaciaLog; - mappings[150] = ItemType.StrippedCherryLog; - mappings[151] = ItemType.StrippedDarkOakLog; - mappings[152] = ItemType.StrippedMangroveLog; - mappings[153] = ItemType.StrippedCrimsonStem; - mappings[154] = ItemType.StrippedWarpedStem; - mappings[155] = ItemType.StrippedOakWood; - mappings[156] = ItemType.StrippedSpruceWood; - mappings[157] = ItemType.StrippedBirchWood; - mappings[158] = ItemType.StrippedJungleWood; - mappings[159] = ItemType.StrippedAcaciaWood; - mappings[160] = ItemType.StrippedCherryWood; - mappings[161] = ItemType.StrippedDarkOakWood; - mappings[162] = ItemType.StrippedMangroveWood; - mappings[163] = ItemType.StrippedCrimsonHyphae; - mappings[164] = ItemType.StrippedWarpedHyphae; - mappings[165] = ItemType.StrippedBambooBlock; - mappings[166] = ItemType.OakWood; - mappings[167] = ItemType.SpruceWood; - mappings[168] = ItemType.BirchWood; - mappings[169] = ItemType.JungleWood; - mappings[170] = ItemType.AcaciaWood; - mappings[171] = ItemType.CherryWood; - mappings[172] = ItemType.DarkOakWood; - mappings[173] = ItemType.MangroveWood; - mappings[174] = ItemType.CrimsonHyphae; - mappings[175] = ItemType.WarpedHyphae; - mappings[176] = ItemType.OakLeaves; - mappings[177] = ItemType.SpruceLeaves; - mappings[178] = ItemType.BirchLeaves; - mappings[179] = ItemType.JungleLeaves; - mappings[180] = ItemType.AcaciaLeaves; - mappings[181] = ItemType.CherryLeaves; - mappings[182] = ItemType.DarkOakLeaves; - mappings[183] = ItemType.MangroveLeaves; - mappings[184] = ItemType.AzaleaLeaves; - mappings[185] = ItemType.FloweringAzaleaLeaves; - mappings[186] = ItemType.Sponge; - mappings[187] = ItemType.WetSponge; - mappings[188] = ItemType.Glass; - mappings[189] = ItemType.TintedGlass; - mappings[190] = ItemType.LapisBlock; - mappings[191] = ItemType.Sandstone; - mappings[192] = ItemType.ChiseledSandstone; - mappings[193] = ItemType.CutSandstone; - mappings[194] = ItemType.Cobweb; - mappings[195] = ItemType.ShortGrass; - mappings[196] = ItemType.Fern; - mappings[197] = ItemType.Azalea; - mappings[198] = ItemType.FloweringAzalea; - mappings[199] = ItemType.DeadBush; - mappings[200] = ItemType.Seagrass; - mappings[201] = ItemType.SeaPickle; - mappings[202] = ItemType.WhiteWool; - mappings[203] = ItemType.OrangeWool; - mappings[204] = ItemType.MagentaWool; - mappings[205] = ItemType.LightBlueWool; - mappings[206] = ItemType.YellowWool; - mappings[207] = ItemType.LimeWool; - mappings[208] = ItemType.PinkWool; - mappings[209] = ItemType.GrayWool; - mappings[210] = ItemType.LightGrayWool; - mappings[211] = ItemType.CyanWool; - mappings[212] = ItemType.PurpleWool; - mappings[213] = ItemType.BlueWool; - mappings[214] = ItemType.BrownWool; - mappings[215] = ItemType.GreenWool; - mappings[216] = ItemType.RedWool; - mappings[217] = ItemType.BlackWool; - mappings[218] = ItemType.Dandelion; - mappings[219] = ItemType.Poppy; - mappings[220] = ItemType.BlueOrchid; - mappings[221] = ItemType.Allium; - mappings[222] = ItemType.AzureBluet; - mappings[223] = ItemType.RedTulip; - mappings[224] = ItemType.OrangeTulip; - mappings[225] = ItemType.WhiteTulip; - mappings[226] = ItemType.PinkTulip; - mappings[227] = ItemType.OxeyeDaisy; - mappings[228] = ItemType.Cornflower; - mappings[229] = ItemType.LilyOfTheValley; - mappings[230] = ItemType.WitherRose; - mappings[231] = ItemType.Torchflower; - mappings[232] = ItemType.PitcherPlant; - mappings[233] = ItemType.SporeBlossom; - mappings[234] = ItemType.BrownMushroom; - mappings[235] = ItemType.RedMushroom; - mappings[236] = ItemType.CrimsonFungus; - mappings[237] = ItemType.WarpedFungus; - mappings[238] = ItemType.CrimsonRoots; - mappings[239] = ItemType.WarpedRoots; - mappings[240] = ItemType.NetherSprouts; - mappings[241] = ItemType.WeepingVines; - mappings[242] = ItemType.TwistingVines; - mappings[243] = ItemType.SugarCane; - mappings[244] = ItemType.Kelp; - mappings[245] = ItemType.MossCarpet; - mappings[246] = ItemType.PinkPetals; - mappings[247] = ItemType.MossBlock; - mappings[248] = ItemType.HangingRoots; - mappings[249] = ItemType.BigDripleaf; - mappings[250] = ItemType.SmallDripleaf; - mappings[251] = ItemType.Bamboo; - mappings[252] = ItemType.OakSlab; - mappings[253] = ItemType.SpruceSlab; - mappings[254] = ItemType.BirchSlab; - mappings[255] = ItemType.JungleSlab; - mappings[256] = ItemType.AcaciaSlab; - mappings[257] = ItemType.CherrySlab; - mappings[258] = ItemType.DarkOakSlab; - mappings[259] = ItemType.MangroveSlab; - mappings[260] = ItemType.BambooSlab; - mappings[261] = ItemType.BambooMosaicSlab; - mappings[262] = ItemType.CrimsonSlab; - mappings[263] = ItemType.WarpedSlab; - mappings[264] = ItemType.StoneSlab; - mappings[265] = ItemType.SmoothStoneSlab; - mappings[266] = ItemType.SandstoneSlab; - mappings[267] = ItemType.CutSandstoneSlab; - mappings[268] = ItemType.PetrifiedOakSlab; - mappings[269] = ItemType.CobblestoneSlab; - mappings[270] = ItemType.BrickSlab; - mappings[271] = ItemType.StoneBrickSlab; - mappings[272] = ItemType.MudBrickSlab; - mappings[273] = ItemType.NetherBrickSlab; - mappings[274] = ItemType.QuartzSlab; - mappings[275] = ItemType.RedSandstoneSlab; - mappings[276] = ItemType.CutRedSandstoneSlab; - mappings[277] = ItemType.PurpurSlab; - mappings[278] = ItemType.PrismarineSlab; - mappings[279] = ItemType.PrismarineBrickSlab; - mappings[280] = ItemType.DarkPrismarineSlab; - mappings[281] = ItemType.SmoothQuartz; - mappings[282] = ItemType.SmoothRedSandstone; - mappings[283] = ItemType.SmoothSandstone; - mappings[284] = ItemType.SmoothStone; - mappings[285] = ItemType.Bricks; - mappings[286] = ItemType.Bookshelf; - mappings[287] = ItemType.ChiseledBookshelf; - mappings[288] = ItemType.DecoratedPot; - mappings[289] = ItemType.MossyCobblestone; - mappings[290] = ItemType.Obsidian; - mappings[291] = ItemType.Torch; - mappings[292] = ItemType.EndRod; - mappings[293] = ItemType.ChorusPlant; - mappings[294] = ItemType.ChorusFlower; - mappings[295] = ItemType.PurpurBlock; - mappings[296] = ItemType.PurpurPillar; - mappings[297] = ItemType.PurpurStairs; - mappings[298] = ItemType.Spawner; - mappings[299] = ItemType.Chest; - mappings[300] = ItemType.CraftingTable; - mappings[301] = ItemType.Farmland; - mappings[302] = ItemType.Furnace; - mappings[303] = ItemType.Ladder; - mappings[304] = ItemType.CobblestoneStairs; - mappings[305] = ItemType.Snow; - mappings[306] = ItemType.Ice; - mappings[307] = ItemType.SnowBlock; - mappings[308] = ItemType.Cactus; - mappings[309] = ItemType.Clay; - mappings[310] = ItemType.Jukebox; - mappings[311] = ItemType.OakFence; - mappings[312] = ItemType.SpruceFence; - mappings[313] = ItemType.BirchFence; - mappings[314] = ItemType.JungleFence; - mappings[315] = ItemType.AcaciaFence; - mappings[316] = ItemType.CherryFence; - mappings[317] = ItemType.DarkOakFence; - mappings[318] = ItemType.MangroveFence; - mappings[319] = ItemType.BambooFence; - mappings[320] = ItemType.CrimsonFence; - mappings[321] = ItemType.WarpedFence; - mappings[322] = ItemType.Pumpkin; - mappings[323] = ItemType.CarvedPumpkin; - mappings[324] = ItemType.JackOLantern; - mappings[325] = ItemType.Netherrack; - mappings[326] = ItemType.SoulSand; - mappings[327] = ItemType.SoulSoil; - mappings[328] = ItemType.Basalt; - mappings[329] = ItemType.PolishedBasalt; - mappings[330] = ItemType.SmoothBasalt; - mappings[331] = ItemType.SoulTorch; - mappings[332] = ItemType.Glowstone; - mappings[333] = ItemType.InfestedStone; - mappings[334] = ItemType.InfestedCobblestone; - mappings[335] = ItemType.InfestedStoneBricks; - mappings[336] = ItemType.InfestedMossyStoneBricks; - mappings[337] = ItemType.InfestedCrackedStoneBricks; - mappings[338] = ItemType.InfestedChiseledStoneBricks; - mappings[339] = ItemType.InfestedDeepslate; - mappings[340] = ItemType.StoneBricks; - mappings[341] = ItemType.MossyStoneBricks; - mappings[342] = ItemType.CrackedStoneBricks; - mappings[343] = ItemType.ChiseledStoneBricks; - mappings[344] = ItemType.PackedMud; - mappings[345] = ItemType.MudBricks; - mappings[346] = ItemType.DeepslateBricks; - mappings[347] = ItemType.CrackedDeepslateBricks; - mappings[348] = ItemType.DeepslateTiles; - mappings[349] = ItemType.CrackedDeepslateTiles; - mappings[350] = ItemType.ChiseledDeepslate; - mappings[351] = ItemType.ReinforcedDeepslate; - mappings[352] = ItemType.BrownMushroomBlock; - mappings[353] = ItemType.RedMushroomBlock; - mappings[354] = ItemType.MushroomStem; - mappings[355] = ItemType.IronBars; - mappings[356] = ItemType.Chain; - mappings[357] = ItemType.GlassPane; - mappings[358] = ItemType.Melon; - mappings[359] = ItemType.Vine; - mappings[360] = ItemType.GlowLichen; - mappings[361] = ItemType.BrickStairs; - mappings[362] = ItemType.StoneBrickStairs; - mappings[363] = ItemType.MudBrickStairs; - mappings[364] = ItemType.Mycelium; - mappings[365] = ItemType.LilyPad; - mappings[366] = ItemType.NetherBricks; - mappings[367] = ItemType.CrackedNetherBricks; - mappings[368] = ItemType.ChiseledNetherBricks; - mappings[369] = ItemType.NetherBrickFence; - mappings[370] = ItemType.NetherBrickStairs; - mappings[371] = ItemType.Sculk; - mappings[372] = ItemType.SculkVein; - mappings[373] = ItemType.SculkCatalyst; - mappings[374] = ItemType.SculkShrieker; - mappings[375] = ItemType.EnchantingTable; - mappings[376] = ItemType.EndPortalFrame; - mappings[377] = ItemType.EndStone; - mappings[378] = ItemType.EndStoneBricks; - mappings[379] = ItemType.DragonEgg; - mappings[380] = ItemType.SandstoneStairs; - mappings[381] = ItemType.EnderChest; - mappings[382] = ItemType.EmeraldBlock; - mappings[383] = ItemType.OakStairs; - mappings[384] = ItemType.SpruceStairs; - mappings[385] = ItemType.BirchStairs; - mappings[386] = ItemType.JungleStairs; - mappings[387] = ItemType.AcaciaStairs; - mappings[388] = ItemType.CherryStairs; - mappings[389] = ItemType.DarkOakStairs; - mappings[390] = ItemType.MangroveStairs; - mappings[391] = ItemType.BambooStairs; - mappings[392] = ItemType.BambooMosaicStairs; - mappings[393] = ItemType.CrimsonStairs; - mappings[394] = ItemType.WarpedStairs; - mappings[395] = ItemType.CommandBlock; - mappings[396] = ItemType.Beacon; - mappings[397] = ItemType.CobblestoneWall; - mappings[398] = ItemType.MossyCobblestoneWall; - mappings[399] = ItemType.BrickWall; - mappings[400] = ItemType.PrismarineWall; - mappings[401] = ItemType.RedSandstoneWall; - mappings[402] = ItemType.MossyStoneBrickWall; - mappings[403] = ItemType.GraniteWall; - mappings[404] = ItemType.StoneBrickWall; - mappings[405] = ItemType.MudBrickWall; - mappings[406] = ItemType.NetherBrickWall; - mappings[407] = ItemType.AndesiteWall; - mappings[408] = ItemType.RedNetherBrickWall; - mappings[409] = ItemType.SandstoneWall; - mappings[410] = ItemType.EndStoneBrickWall; - mappings[411] = ItemType.DioriteWall; - mappings[412] = ItemType.BlackstoneWall; - mappings[413] = ItemType.PolishedBlackstoneWall; - mappings[414] = ItemType.PolishedBlackstoneBrickWall; - mappings[415] = ItemType.CobbledDeepslateWall; - mappings[416] = ItemType.PolishedDeepslateWall; - mappings[417] = ItemType.DeepslateBrickWall; - mappings[418] = ItemType.DeepslateTileWall; - mappings[419] = ItemType.Anvil; - mappings[420] = ItemType.ChippedAnvil; - mappings[421] = ItemType.DamagedAnvil; - mappings[422] = ItemType.ChiseledQuartzBlock; - mappings[423] = ItemType.QuartzBlock; - mappings[424] = ItemType.QuartzBricks; - mappings[425] = ItemType.QuartzPillar; - mappings[426] = ItemType.QuartzStairs; - mappings[427] = ItemType.WhiteTerracotta; - mappings[428] = ItemType.OrangeTerracotta; - mappings[429] = ItemType.MagentaTerracotta; - mappings[430] = ItemType.LightBlueTerracotta; - mappings[431] = ItemType.YellowTerracotta; - mappings[432] = ItemType.LimeTerracotta; - mappings[433] = ItemType.PinkTerracotta; - mappings[434] = ItemType.GrayTerracotta; - mappings[435] = ItemType.LightGrayTerracotta; - mappings[436] = ItemType.CyanTerracotta; - mappings[437] = ItemType.PurpleTerracotta; - mappings[438] = ItemType.BlueTerracotta; - mappings[439] = ItemType.BrownTerracotta; - mappings[440] = ItemType.GreenTerracotta; - mappings[441] = ItemType.RedTerracotta; - mappings[442] = ItemType.BlackTerracotta; - mappings[443] = ItemType.Barrier; - mappings[444] = ItemType.Light; - mappings[445] = ItemType.HayBlock; - mappings[446] = ItemType.WhiteCarpet; - mappings[447] = ItemType.OrangeCarpet; - mappings[448] = ItemType.MagentaCarpet; - mappings[449] = ItemType.LightBlueCarpet; - mappings[450] = ItemType.YellowCarpet; - mappings[451] = ItemType.LimeCarpet; - mappings[452] = ItemType.PinkCarpet; - mappings[453] = ItemType.GrayCarpet; - mappings[454] = ItemType.LightGrayCarpet; - mappings[455] = ItemType.CyanCarpet; - mappings[456] = ItemType.PurpleCarpet; - mappings[457] = ItemType.BlueCarpet; - mappings[458] = ItemType.BrownCarpet; - mappings[459] = ItemType.GreenCarpet; - mappings[460] = ItemType.RedCarpet; - mappings[461] = ItemType.BlackCarpet; - mappings[462] = ItemType.Terracotta; - mappings[463] = ItemType.PackedIce; - mappings[464] = ItemType.DirtPath; - mappings[465] = ItemType.Sunflower; - mappings[466] = ItemType.Lilac; - mappings[467] = ItemType.RoseBush; - mappings[468] = ItemType.Peony; - mappings[469] = ItemType.TallGrass; - mappings[470] = ItemType.LargeFern; - mappings[471] = ItemType.WhiteStainedGlass; - mappings[472] = ItemType.OrangeStainedGlass; - mappings[473] = ItemType.MagentaStainedGlass; - mappings[474] = ItemType.LightBlueStainedGlass; - mappings[475] = ItemType.YellowStainedGlass; - mappings[476] = ItemType.LimeStainedGlass; - mappings[477] = ItemType.PinkStainedGlass; - mappings[478] = ItemType.GrayStainedGlass; - mappings[479] = ItemType.LightGrayStainedGlass; - mappings[480] = ItemType.CyanStainedGlass; - mappings[481] = ItemType.PurpleStainedGlass; - mappings[482] = ItemType.BlueStainedGlass; - mappings[483] = ItemType.BrownStainedGlass; - mappings[484] = ItemType.GreenStainedGlass; - mappings[485] = ItemType.RedStainedGlass; - mappings[486] = ItemType.BlackStainedGlass; - mappings[487] = ItemType.WhiteStainedGlassPane; - mappings[488] = ItemType.OrangeStainedGlassPane; - mappings[489] = ItemType.MagentaStainedGlassPane; - mappings[490] = ItemType.LightBlueStainedGlassPane; - mappings[491] = ItemType.YellowStainedGlassPane; - mappings[492] = ItemType.LimeStainedGlassPane; - mappings[493] = ItemType.PinkStainedGlassPane; - mappings[494] = ItemType.GrayStainedGlassPane; - mappings[495] = ItemType.LightGrayStainedGlassPane; - mappings[496] = ItemType.CyanStainedGlassPane; - mappings[497] = ItemType.PurpleStainedGlassPane; - mappings[498] = ItemType.BlueStainedGlassPane; - mappings[499] = ItemType.BrownStainedGlassPane; - mappings[500] = ItemType.GreenStainedGlassPane; - mappings[501] = ItemType.RedStainedGlassPane; - mappings[502] = ItemType.BlackStainedGlassPane; - mappings[503] = ItemType.Prismarine; - mappings[504] = ItemType.PrismarineBricks; - mappings[505] = ItemType.DarkPrismarine; - mappings[506] = ItemType.PrismarineStairs; - mappings[507] = ItemType.PrismarineBrickStairs; - mappings[508] = ItemType.DarkPrismarineStairs; - mappings[509] = ItemType.SeaLantern; - mappings[510] = ItemType.RedSandstone; - mappings[511] = ItemType.ChiseledRedSandstone; - mappings[512] = ItemType.CutRedSandstone; - mappings[513] = ItemType.RedSandstoneStairs; - mappings[514] = ItemType.RepeatingCommandBlock; - mappings[515] = ItemType.ChainCommandBlock; - mappings[516] = ItemType.MagmaBlock; - mappings[517] = ItemType.NetherWartBlock; - mappings[518] = ItemType.WarpedWartBlock; - mappings[519] = ItemType.RedNetherBricks; - mappings[520] = ItemType.BoneBlock; - mappings[521] = ItemType.StructureVoid; - mappings[522] = ItemType.ShulkerBox; - mappings[523] = ItemType.WhiteShulkerBox; - mappings[524] = ItemType.OrangeShulkerBox; - mappings[525] = ItemType.MagentaShulkerBox; - mappings[526] = ItemType.LightBlueShulkerBox; - mappings[527] = ItemType.YellowShulkerBox; - mappings[528] = ItemType.LimeShulkerBox; - mappings[529] = ItemType.PinkShulkerBox; - mappings[530] = ItemType.GrayShulkerBox; - mappings[531] = ItemType.LightGrayShulkerBox; - mappings[532] = ItemType.CyanShulkerBox; - mappings[533] = ItemType.PurpleShulkerBox; - mappings[534] = ItemType.BlueShulkerBox; - mappings[535] = ItemType.BrownShulkerBox; - mappings[536] = ItemType.GreenShulkerBox; - mappings[537] = ItemType.RedShulkerBox; - mappings[538] = ItemType.BlackShulkerBox; - mappings[539] = ItemType.WhiteGlazedTerracotta; - mappings[540] = ItemType.OrangeGlazedTerracotta; - mappings[541] = ItemType.MagentaGlazedTerracotta; - mappings[542] = ItemType.LightBlueGlazedTerracotta; - mappings[543] = ItemType.YellowGlazedTerracotta; - mappings[544] = ItemType.LimeGlazedTerracotta; - mappings[545] = ItemType.PinkGlazedTerracotta; - mappings[546] = ItemType.GrayGlazedTerracotta; - mappings[547] = ItemType.LightGrayGlazedTerracotta; - mappings[548] = ItemType.CyanGlazedTerracotta; - mappings[549] = ItemType.PurpleGlazedTerracotta; - mappings[550] = ItemType.BlueGlazedTerracotta; - mappings[551] = ItemType.BrownGlazedTerracotta; - mappings[552] = ItemType.GreenGlazedTerracotta; - mappings[553] = ItemType.RedGlazedTerracotta; - mappings[554] = ItemType.BlackGlazedTerracotta; - mappings[555] = ItemType.WhiteConcrete; - mappings[556] = ItemType.OrangeConcrete; - mappings[557] = ItemType.MagentaConcrete; - mappings[558] = ItemType.LightBlueConcrete; - mappings[559] = ItemType.YellowConcrete; - mappings[560] = ItemType.LimeConcrete; - mappings[561] = ItemType.PinkConcrete; - mappings[562] = ItemType.GrayConcrete; - mappings[563] = ItemType.LightGrayConcrete; - mappings[564] = ItemType.CyanConcrete; - mappings[565] = ItemType.PurpleConcrete; - mappings[566] = ItemType.BlueConcrete; - mappings[567] = ItemType.BrownConcrete; - mappings[568] = ItemType.GreenConcrete; - mappings[569] = ItemType.RedConcrete; - mappings[570] = ItemType.BlackConcrete; - mappings[571] = ItemType.WhiteConcretePowder; - mappings[572] = ItemType.OrangeConcretePowder; - mappings[573] = ItemType.MagentaConcretePowder; - mappings[574] = ItemType.LightBlueConcretePowder; - mappings[575] = ItemType.YellowConcretePowder; - mappings[576] = ItemType.LimeConcretePowder; - mappings[577] = ItemType.PinkConcretePowder; - mappings[578] = ItemType.GrayConcretePowder; - mappings[579] = ItemType.LightGrayConcretePowder; - mappings[580] = ItemType.CyanConcretePowder; - mappings[581] = ItemType.PurpleConcretePowder; - mappings[582] = ItemType.BlueConcretePowder; - mappings[583] = ItemType.BrownConcretePowder; - mappings[584] = ItemType.GreenConcretePowder; - mappings[585] = ItemType.RedConcretePowder; - mappings[586] = ItemType.BlackConcretePowder; - mappings[587] = ItemType.TurtleEgg; - mappings[588] = ItemType.SnifferEgg; - mappings[589] = ItemType.DeadTubeCoralBlock; - mappings[590] = ItemType.DeadBrainCoralBlock; - mappings[591] = ItemType.DeadBubbleCoralBlock; - mappings[592] = ItemType.DeadFireCoralBlock; - mappings[593] = ItemType.DeadHornCoralBlock; - mappings[594] = ItemType.TubeCoralBlock; - mappings[595] = ItemType.BrainCoralBlock; - mappings[596] = ItemType.BubbleCoralBlock; - mappings[597] = ItemType.FireCoralBlock; - mappings[598] = ItemType.HornCoralBlock; - mappings[599] = ItemType.TubeCoral; - mappings[600] = ItemType.BrainCoral; - mappings[601] = ItemType.BubbleCoral; - mappings[602] = ItemType.FireCoral; - mappings[603] = ItemType.HornCoral; - mappings[604] = ItemType.DeadBrainCoral; - mappings[605] = ItemType.DeadBubbleCoral; - mappings[606] = ItemType.DeadFireCoral; - mappings[607] = ItemType.DeadHornCoral; - mappings[608] = ItemType.DeadTubeCoral; - mappings[609] = ItemType.TubeCoralFan; - mappings[610] = ItemType.BrainCoralFan; - mappings[611] = ItemType.BubbleCoralFan; - mappings[612] = ItemType.FireCoralFan; - mappings[613] = ItemType.HornCoralFan; - mappings[614] = ItemType.DeadTubeCoralFan; - mappings[615] = ItemType.DeadBrainCoralFan; - mappings[616] = ItemType.DeadBubbleCoralFan; - mappings[617] = ItemType.DeadFireCoralFan; - mappings[618] = ItemType.DeadHornCoralFan; - mappings[619] = ItemType.BlueIce; - mappings[620] = ItemType.Conduit; - mappings[621] = ItemType.PolishedGraniteStairs; - mappings[622] = ItemType.SmoothRedSandstoneStairs; - mappings[623] = ItemType.MossyStoneBrickStairs; - mappings[624] = ItemType.PolishedDioriteStairs; - mappings[625] = ItemType.MossyCobblestoneStairs; - mappings[626] = ItemType.EndStoneBrickStairs; - mappings[627] = ItemType.StoneStairs; - mappings[628] = ItemType.SmoothSandstoneStairs; - mappings[629] = ItemType.SmoothQuartzStairs; - mappings[630] = ItemType.GraniteStairs; - mappings[631] = ItemType.AndesiteStairs; - mappings[632] = ItemType.RedNetherBrickStairs; - mappings[633] = ItemType.PolishedAndesiteStairs; - mappings[634] = ItemType.DioriteStairs; - mappings[635] = ItemType.CobbledDeepslateStairs; - mappings[636] = ItemType.PolishedDeepslateStairs; - mappings[637] = ItemType.DeepslateBrickStairs; - mappings[638] = ItemType.DeepslateTileStairs; - mappings[639] = ItemType.PolishedGraniteSlab; - mappings[640] = ItemType.SmoothRedSandstoneSlab; - mappings[641] = ItemType.MossyStoneBrickSlab; - mappings[642] = ItemType.PolishedDioriteSlab; - mappings[643] = ItemType.MossyCobblestoneSlab; - mappings[644] = ItemType.EndStoneBrickSlab; - mappings[645] = ItemType.SmoothSandstoneSlab; - mappings[646] = ItemType.SmoothQuartzSlab; - mappings[647] = ItemType.GraniteSlab; - mappings[648] = ItemType.AndesiteSlab; - mappings[649] = ItemType.RedNetherBrickSlab; - mappings[650] = ItemType.PolishedAndesiteSlab; - mappings[651] = ItemType.DioriteSlab; - mappings[652] = ItemType.CobbledDeepslateSlab; - mappings[653] = ItemType.PolishedDeepslateSlab; - mappings[654] = ItemType.DeepslateBrickSlab; - mappings[655] = ItemType.DeepslateTileSlab; - mappings[656] = ItemType.Scaffolding; - mappings[657] = ItemType.Redstone; - mappings[658] = ItemType.RedstoneTorch; - mappings[659] = ItemType.RedstoneBlock; - mappings[660] = ItemType.Repeater; - mappings[661] = ItemType.Comparator; - mappings[662] = ItemType.Piston; - mappings[663] = ItemType.StickyPiston; - mappings[664] = ItemType.SlimeBlock; - mappings[665] = ItemType.HoneyBlock; - mappings[666] = ItemType.Observer; - mappings[667] = ItemType.Hopper; - mappings[668] = ItemType.Dispenser; - mappings[669] = ItemType.Dropper; - mappings[670] = ItemType.Lectern; - mappings[671] = ItemType.Target; - mappings[672] = ItemType.Lever; - mappings[673] = ItemType.LightningRod; - mappings[674] = ItemType.DaylightDetector; - mappings[675] = ItemType.SculkSensor; - mappings[676] = ItemType.CalibratedSculkSensor; - mappings[677] = ItemType.TripwireHook; - mappings[678] = ItemType.TrappedChest; - mappings[679] = ItemType.Tnt; - mappings[680] = ItemType.RedstoneLamp; - mappings[681] = ItemType.NoteBlock; - mappings[682] = ItemType.StoneButton; - mappings[683] = ItemType.PolishedBlackstoneButton; - mappings[684] = ItemType.OakButton; - mappings[685] = ItemType.SpruceButton; - mappings[686] = ItemType.BirchButton; - mappings[687] = ItemType.JungleButton; - mappings[688] = ItemType.AcaciaButton; - mappings[689] = ItemType.CherryButton; - mappings[690] = ItemType.DarkOakButton; - mappings[691] = ItemType.MangroveButton; - mappings[692] = ItemType.BambooButton; - mappings[693] = ItemType.CrimsonButton; - mappings[694] = ItemType.WarpedButton; - mappings[695] = ItemType.StonePressurePlate; - mappings[696] = ItemType.PolishedBlackstonePressurePlate; - mappings[697] = ItemType.LightWeightedPressurePlate; - mappings[698] = ItemType.HeavyWeightedPressurePlate; - mappings[699] = ItemType.OakPressurePlate; - mappings[700] = ItemType.SprucePressurePlate; - mappings[701] = ItemType.BirchPressurePlate; - mappings[702] = ItemType.JunglePressurePlate; - mappings[703] = ItemType.AcaciaPressurePlate; - mappings[704] = ItemType.CherryPressurePlate; - mappings[705] = ItemType.DarkOakPressurePlate; - mappings[706] = ItemType.MangrovePressurePlate; - mappings[707] = ItemType.BambooPressurePlate; - mappings[708] = ItemType.CrimsonPressurePlate; - mappings[709] = ItemType.WarpedPressurePlate; - mappings[710] = ItemType.IronDoor; - mappings[711] = ItemType.OakDoor; - mappings[712] = ItemType.SpruceDoor; - mappings[713] = ItemType.BirchDoor; - mappings[714] = ItemType.JungleDoor; - mappings[715] = ItemType.AcaciaDoor; - mappings[716] = ItemType.CherryDoor; - mappings[717] = ItemType.DarkOakDoor; - mappings[718] = ItemType.MangroveDoor; - mappings[719] = ItemType.BambooDoor; - mappings[720] = ItemType.CrimsonDoor; - mappings[721] = ItemType.WarpedDoor; - mappings[722] = ItemType.CopperDoor; - mappings[723] = ItemType.ExposedCopperDoor; - mappings[724] = ItemType.WeatheredCopperDoor; - mappings[725] = ItemType.OxidizedCopperDoor; - mappings[726] = ItemType.WaxedCopperDoor; - mappings[727] = ItemType.WaxedExposedCopperDoor; - mappings[728] = ItemType.WaxedWeatheredCopperDoor; - mappings[729] = ItemType.WaxedOxidizedCopperDoor; - mappings[730] = ItemType.IronTrapdoor; - mappings[731] = ItemType.OakTrapdoor; - mappings[732] = ItemType.SpruceTrapdoor; - mappings[733] = ItemType.BirchTrapdoor; - mappings[734] = ItemType.JungleTrapdoor; - mappings[735] = ItemType.AcaciaTrapdoor; - mappings[736] = ItemType.CherryTrapdoor; - mappings[737] = ItemType.DarkOakTrapdoor; - mappings[738] = ItemType.MangroveTrapdoor; - mappings[739] = ItemType.BambooTrapdoor; - mappings[740] = ItemType.CrimsonTrapdoor; - mappings[741] = ItemType.WarpedTrapdoor; - mappings[742] = ItemType.CopperTrapdoor; - mappings[743] = ItemType.ExposedCopperTrapdoor; - mappings[744] = ItemType.WeatheredCopperTrapdoor; - mappings[745] = ItemType.OxidizedCopperTrapdoor; - mappings[746] = ItemType.WaxedCopperTrapdoor; - mappings[747] = ItemType.WaxedExposedCopperTrapdoor; - mappings[748] = ItemType.WaxedWeatheredCopperTrapdoor; - mappings[749] = ItemType.WaxedOxidizedCopperTrapdoor; - mappings[750] = ItemType.OakFenceGate; - mappings[751] = ItemType.SpruceFenceGate; - mappings[752] = ItemType.BirchFenceGate; - mappings[753] = ItemType.JungleFenceGate; - mappings[754] = ItemType.AcaciaFenceGate; - mappings[755] = ItemType.CherryFenceGate; - mappings[756] = ItemType.DarkOakFenceGate; - mappings[757] = ItemType.MangroveFenceGate; - mappings[758] = ItemType.BambooFenceGate; - mappings[759] = ItemType.CrimsonFenceGate; - mappings[760] = ItemType.WarpedFenceGate; - mappings[761] = ItemType.PoweredRail; - mappings[762] = ItemType.DetectorRail; - mappings[763] = ItemType.Rail; - mappings[764] = ItemType.ActivatorRail; - mappings[765] = ItemType.Saddle; - mappings[766] = ItemType.Minecart; - mappings[767] = ItemType.ChestMinecart; - mappings[768] = ItemType.FurnaceMinecart; - mappings[769] = ItemType.TntMinecart; - mappings[770] = ItemType.HopperMinecart; - mappings[771] = ItemType.CarrotOnAStick; - mappings[772] = ItemType.WarpedFungusOnAStick; - mappings[773] = ItemType.Elytra; - mappings[774] = ItemType.OakBoat; - mappings[775] = ItemType.OakChestBoat; - mappings[776] = ItemType.SpruceBoat; - mappings[777] = ItemType.SpruceChestBoat; - mappings[778] = ItemType.BirchBoat; - mappings[779] = ItemType.BirchChestBoat; - mappings[780] = ItemType.JungleBoat; - mappings[781] = ItemType.JungleChestBoat; - mappings[782] = ItemType.AcaciaBoat; - mappings[783] = ItemType.AcaciaChestBoat; - mappings[784] = ItemType.CherryBoat; - mappings[785] = ItemType.CherryChestBoat; - mappings[786] = ItemType.DarkOakBoat; - mappings[787] = ItemType.DarkOakChestBoat; - mappings[788] = ItemType.MangroveBoat; - mappings[789] = ItemType.MangroveChestBoat; - mappings[790] = ItemType.BambooRaft; - mappings[791] = ItemType.BambooChestRaft; - mappings[792] = ItemType.StructureBlock; - mappings[793] = ItemType.Jigsaw; - mappings[794] = ItemType.TurtleHelmet; - mappings[795] = ItemType.TurtleScute; - mappings[796] = ItemType.ArmadilloScute; - mappings[797] = ItemType.WolfArmor; - mappings[798] = ItemType.FlintAndSteel; - mappings[799] = ItemType.Bowl; - mappings[800] = ItemType.Apple; - mappings[801] = ItemType.Bow; - mappings[802] = ItemType.Arrow; - mappings[803] = ItemType.Coal; - mappings[804] = ItemType.Charcoal; - mappings[805] = ItemType.Diamond; - mappings[806] = ItemType.Emerald; - mappings[807] = ItemType.LapisLazuli; - mappings[808] = ItemType.Quartz; - mappings[809] = ItemType.AmethystShard; - mappings[810] = ItemType.RawIron; - mappings[811] = ItemType.IronIngot; - mappings[812] = ItemType.RawCopper; - mappings[813] = ItemType.CopperIngot; - mappings[814] = ItemType.RawGold; - mappings[815] = ItemType.GoldIngot; - mappings[816] = ItemType.NetheriteIngot; - mappings[817] = ItemType.NetheriteScrap; - mappings[818] = ItemType.WoodenSword; - mappings[819] = ItemType.WoodenShovel; - mappings[820] = ItemType.WoodenPickaxe; - mappings[821] = ItemType.WoodenAxe; - mappings[822] = ItemType.WoodenHoe; - mappings[823] = ItemType.StoneSword; - mappings[824] = ItemType.StoneShovel; - mappings[825] = ItemType.StonePickaxe; - mappings[826] = ItemType.StoneAxe; - mappings[827] = ItemType.StoneHoe; - mappings[828] = ItemType.GoldenSword; - mappings[829] = ItemType.GoldenShovel; - mappings[830] = ItemType.GoldenPickaxe; - mappings[831] = ItemType.GoldenAxe; - mappings[832] = ItemType.GoldenHoe; - mappings[833] = ItemType.IronSword; - mappings[834] = ItemType.IronShovel; - mappings[835] = ItemType.IronPickaxe; - mappings[836] = ItemType.IronAxe; - mappings[837] = ItemType.IronHoe; - mappings[838] = ItemType.DiamondSword; - mappings[839] = ItemType.DiamondShovel; - mappings[840] = ItemType.DiamondPickaxe; - mappings[841] = ItemType.DiamondAxe; - mappings[842] = ItemType.DiamondHoe; - mappings[843] = ItemType.NetheriteSword; - mappings[844] = ItemType.NetheriteShovel; - mappings[845] = ItemType.NetheritePickaxe; - mappings[846] = ItemType.NetheriteAxe; - mappings[847] = ItemType.NetheriteHoe; - mappings[848] = ItemType.Stick; - mappings[849] = ItemType.MushroomStew; - mappings[850] = ItemType.String; - mappings[851] = ItemType.Feather; - mappings[852] = ItemType.Gunpowder; - mappings[853] = ItemType.WheatSeeds; - mappings[854] = ItemType.Wheat; - mappings[855] = ItemType.Bread; - mappings[856] = ItemType.LeatherHelmet; - mappings[857] = ItemType.LeatherChestplate; - mappings[858] = ItemType.LeatherLeggings; - mappings[859] = ItemType.LeatherBoots; - mappings[860] = ItemType.ChainmailHelmet; - mappings[861] = ItemType.ChainmailChestplate; - mappings[862] = ItemType.ChainmailLeggings; - mappings[863] = ItemType.ChainmailBoots; - mappings[864] = ItemType.IronHelmet; - mappings[865] = ItemType.IronChestplate; - mappings[866] = ItemType.IronLeggings; - mappings[867] = ItemType.IronBoots; - mappings[868] = ItemType.DiamondHelmet; - mappings[869] = ItemType.DiamondChestplate; - mappings[870] = ItemType.DiamondLeggings; - mappings[871] = ItemType.DiamondBoots; - mappings[872] = ItemType.GoldenHelmet; - mappings[873] = ItemType.GoldenChestplate; - mappings[874] = ItemType.GoldenLeggings; - mappings[875] = ItemType.GoldenBoots; - mappings[876] = ItemType.NetheriteHelmet; - mappings[877] = ItemType.NetheriteChestplate; - mappings[878] = ItemType.NetheriteLeggings; - mappings[879] = ItemType.NetheriteBoots; - mappings[880] = ItemType.Flint; - mappings[881] = ItemType.Porkchop; - mappings[882] = ItemType.CookedPorkchop; - mappings[883] = ItemType.Painting; - mappings[884] = ItemType.GoldenApple; - mappings[885] = ItemType.EnchantedGoldenApple; - mappings[886] = ItemType.OakSign; - mappings[887] = ItemType.SpruceSign; - mappings[888] = ItemType.BirchSign; - mappings[889] = ItemType.JungleSign; - mappings[890] = ItemType.AcaciaSign; - mappings[891] = ItemType.CherrySign; - mappings[892] = ItemType.DarkOakSign; - mappings[893] = ItemType.MangroveSign; - mappings[894] = ItemType.BambooSign; - mappings[895] = ItemType.CrimsonSign; - mappings[896] = ItemType.WarpedSign; - mappings[897] = ItemType.OakHangingSign; - mappings[898] = ItemType.SpruceHangingSign; - mappings[899] = ItemType.BirchHangingSign; - mappings[900] = ItemType.JungleHangingSign; - mappings[901] = ItemType.AcaciaHangingSign; - mappings[902] = ItemType.CherryHangingSign; - mappings[903] = ItemType.DarkOakHangingSign; - mappings[904] = ItemType.MangroveHangingSign; - mappings[905] = ItemType.BambooHangingSign; - mappings[906] = ItemType.CrimsonHangingSign; - mappings[907] = ItemType.WarpedHangingSign; - mappings[908] = ItemType.Bucket; - mappings[909] = ItemType.WaterBucket; - mappings[910] = ItemType.LavaBucket; - mappings[911] = ItemType.PowderSnowBucket; - mappings[912] = ItemType.Snowball; - mappings[913] = ItemType.Leather; - mappings[914] = ItemType.MilkBucket; - mappings[915] = ItemType.PufferfishBucket; - mappings[916] = ItemType.SalmonBucket; - mappings[917] = ItemType.CodBucket; - mappings[918] = ItemType.TropicalFishBucket; - mappings[919] = ItemType.AxolotlBucket; - mappings[920] = ItemType.TadpoleBucket; - mappings[921] = ItemType.Brick; - mappings[922] = ItemType.ClayBall; - mappings[923] = ItemType.DriedKelpBlock; - mappings[924] = ItemType.Paper; - mappings[925] = ItemType.Book; - mappings[926] = ItemType.SlimeBall; - mappings[927] = ItemType.Egg; - mappings[928] = ItemType.Compass; - mappings[929] = ItemType.RecoveryCompass; - mappings[930] = ItemType.Bundle; - mappings[931] = ItemType.FishingRod; - mappings[932] = ItemType.Clock; - mappings[933] = ItemType.Spyglass; - mappings[934] = ItemType.GlowstoneDust; - mappings[935] = ItemType.Cod; - mappings[936] = ItemType.Salmon; - mappings[937] = ItemType.TropicalFish; - mappings[938] = ItemType.Pufferfish; - mappings[939] = ItemType.CookedCod; - mappings[940] = ItemType.CookedSalmon; - mappings[941] = ItemType.InkSac; - mappings[942] = ItemType.GlowInkSac; - mappings[943] = ItemType.CocoaBeans; - mappings[944] = ItemType.WhiteDye; - mappings[945] = ItemType.OrangeDye; - mappings[946] = ItemType.MagentaDye; - mappings[947] = ItemType.LightBlueDye; - mappings[948] = ItemType.YellowDye; - mappings[949] = ItemType.LimeDye; - mappings[950] = ItemType.PinkDye; - mappings[951] = ItemType.GrayDye; - mappings[952] = ItemType.LightGrayDye; - mappings[953] = ItemType.CyanDye; - mappings[954] = ItemType.PurpleDye; - mappings[955] = ItemType.BlueDye; - mappings[956] = ItemType.BrownDye; - mappings[957] = ItemType.GreenDye; - mappings[958] = ItemType.RedDye; - mappings[959] = ItemType.BlackDye; - mappings[960] = ItemType.BoneMeal; - mappings[961] = ItemType.Bone; - mappings[962] = ItemType.Sugar; - mappings[963] = ItemType.Cake; - mappings[964] = ItemType.WhiteBed; - mappings[965] = ItemType.OrangeBed; - mappings[966] = ItemType.MagentaBed; - mappings[967] = ItemType.LightBlueBed; - mappings[968] = ItemType.YellowBed; - mappings[969] = ItemType.LimeBed; - mappings[970] = ItemType.PinkBed; - mappings[971] = ItemType.GrayBed; - mappings[972] = ItemType.LightGrayBed; - mappings[973] = ItemType.CyanBed; - mappings[974] = ItemType.PurpleBed; - mappings[975] = ItemType.BlueBed; - mappings[976] = ItemType.BrownBed; - mappings[977] = ItemType.GreenBed; - mappings[978] = ItemType.RedBed; - mappings[979] = ItemType.BlackBed; - mappings[980] = ItemType.Cookie; - mappings[981] = ItemType.Crafter; - mappings[982] = ItemType.FilledMap; - mappings[983] = ItemType.Shears; - mappings[984] = ItemType.MelonSlice; - mappings[985] = ItemType.DriedKelp; - mappings[986] = ItemType.PumpkinSeeds; - mappings[987] = ItemType.MelonSeeds; - mappings[988] = ItemType.Beef; - mappings[989] = ItemType.CookedBeef; - mappings[990] = ItemType.Chicken; - mappings[991] = ItemType.CookedChicken; - mappings[992] = ItemType.RottenFlesh; - mappings[993] = ItemType.EnderPearl; - mappings[994] = ItemType.BlazeRod; - mappings[995] = ItemType.GhastTear; - mappings[996] = ItemType.GoldNugget; - mappings[997] = ItemType.NetherWart; - mappings[998] = ItemType.Potion; - mappings[999] = ItemType.GlassBottle; - mappings[1000] = ItemType.SpiderEye; - mappings[1001] = ItemType.FermentedSpiderEye; - mappings[1002] = ItemType.BlazePowder; - mappings[1003] = ItemType.MagmaCream; - mappings[1004] = ItemType.BrewingStand; - mappings[1005] = ItemType.Cauldron; - mappings[1006] = ItemType.EnderEye; - mappings[1007] = ItemType.GlisteringMelonSlice; - mappings[1008] = ItemType.ArmadilloSpawnEgg; - mappings[1009] = ItemType.AllaySpawnEgg; - mappings[1010] = ItemType.AxolotlSpawnEgg; - mappings[1011] = ItemType.BatSpawnEgg; - mappings[1012] = ItemType.BeeSpawnEgg; - mappings[1013] = ItemType.BlazeSpawnEgg; - mappings[1014] = ItemType.BoggedSpawnEgg; - mappings[1015] = ItemType.BreezeSpawnEgg; - mappings[1016] = ItemType.CatSpawnEgg; - mappings[1017] = ItemType.CamelSpawnEgg; - mappings[1018] = ItemType.CaveSpiderSpawnEgg; - mappings[1019] = ItemType.ChickenSpawnEgg; - mappings[1020] = ItemType.CodSpawnEgg; - mappings[1021] = ItemType.CowSpawnEgg; - mappings[1022] = ItemType.CreeperSpawnEgg; - mappings[1023] = ItemType.DolphinSpawnEgg; - mappings[1024] = ItemType.DonkeySpawnEgg; - mappings[1025] = ItemType.DrownedSpawnEgg; - mappings[1026] = ItemType.ElderGuardianSpawnEgg; - mappings[1027] = ItemType.EnderDragonSpawnEgg; - mappings[1028] = ItemType.EndermanSpawnEgg; - mappings[1029] = ItemType.EndermiteSpawnEgg; - mappings[1030] = ItemType.EvokerSpawnEgg; - mappings[1031] = ItemType.FoxSpawnEgg; - mappings[1032] = ItemType.FrogSpawnEgg; - mappings[1033] = ItemType.GhastSpawnEgg; - mappings[1034] = ItemType.GlowSquidSpawnEgg; - mappings[1035] = ItemType.GoatSpawnEgg; - mappings[1036] = ItemType.GuardianSpawnEgg; - mappings[1037] = ItemType.HoglinSpawnEgg; - mappings[1038] = ItemType.HorseSpawnEgg; - mappings[1039] = ItemType.HuskSpawnEgg; - mappings[1040] = ItemType.IronGolemSpawnEgg; - mappings[1041] = ItemType.LlamaSpawnEgg; - mappings[1042] = ItemType.MagmaCubeSpawnEgg; - mappings[1043] = ItemType.MooshroomSpawnEgg; - mappings[1044] = ItemType.MuleSpawnEgg; - mappings[1045] = ItemType.OcelotSpawnEgg; - mappings[1046] = ItemType.PandaSpawnEgg; - mappings[1047] = ItemType.ParrotSpawnEgg; - mappings[1048] = ItemType.PhantomSpawnEgg; - mappings[1049] = ItemType.PigSpawnEgg; - mappings[1050] = ItemType.PiglinSpawnEgg; - mappings[1051] = ItemType.PiglinBruteSpawnEgg; - mappings[1052] = ItemType.PillagerSpawnEgg; - mappings[1053] = ItemType.PolarBearSpawnEgg; - mappings[1054] = ItemType.PufferfishSpawnEgg; - mappings[1055] = ItemType.RabbitSpawnEgg; - mappings[1056] = ItemType.RavagerSpawnEgg; - mappings[1057] = ItemType.SalmonSpawnEgg; - mappings[1058] = ItemType.SheepSpawnEgg; - mappings[1059] = ItemType.ShulkerSpawnEgg; - mappings[1060] = ItemType.SilverfishSpawnEgg; - mappings[1061] = ItemType.SkeletonSpawnEgg; - mappings[1062] = ItemType.SkeletonHorseSpawnEgg; - mappings[1063] = ItemType.SlimeSpawnEgg; - mappings[1064] = ItemType.SnifferSpawnEgg; - mappings[1065] = ItemType.SnowGolemSpawnEgg; - mappings[1066] = ItemType.SpiderSpawnEgg; - mappings[1067] = ItemType.SquidSpawnEgg; - mappings[1068] = ItemType.StraySpawnEgg; - mappings[1069] = ItemType.StriderSpawnEgg; - mappings[1070] = ItemType.TadpoleSpawnEgg; - mappings[1071] = ItemType.TraderLlamaSpawnEgg; - mappings[1072] = ItemType.TropicalFishSpawnEgg; - mappings[1073] = ItemType.TurtleSpawnEgg; - mappings[1074] = ItemType.VexSpawnEgg; - mappings[1075] = ItemType.VillagerSpawnEgg; - mappings[1076] = ItemType.VindicatorSpawnEgg; - mappings[1077] = ItemType.WanderingTraderSpawnEgg; - mappings[1078] = ItemType.WardenSpawnEgg; - mappings[1079] = ItemType.WitchSpawnEgg; - mappings[1080] = ItemType.WitherSpawnEgg; - mappings[1081] = ItemType.WitherSkeletonSpawnEgg; - mappings[1082] = ItemType.WolfSpawnEgg; - mappings[1083] = ItemType.ZoglinSpawnEgg; - mappings[1084] = ItemType.ZombieSpawnEgg; - mappings[1085] = ItemType.ZombieHorseSpawnEgg; - mappings[1086] = ItemType.ZombieVillagerSpawnEgg; - mappings[1087] = ItemType.ZombifiedPiglinSpawnEgg; - mappings[1088] = ItemType.ExperienceBottle; - mappings[1089] = ItemType.FireCharge; - mappings[1090] = ItemType.WindCharge; - mappings[1091] = ItemType.WritableBook; - mappings[1092] = ItemType.WrittenBook; - mappings[1093] = ItemType.Mace; - mappings[1094] = ItemType.ItemFrame; - mappings[1095] = ItemType.GlowItemFrame; - mappings[1096] = ItemType.FlowerPot; - mappings[1097] = ItemType.Carrot; - mappings[1098] = ItemType.Potato; - mappings[1099] = ItemType.BakedPotato; - mappings[1100] = ItemType.PoisonousPotato; - mappings[1101] = ItemType.Map; - mappings[1102] = ItemType.GoldenCarrot; - mappings[1103] = ItemType.SkeletonSkull; - mappings[1104] = ItemType.WitherSkeletonSkull; - mappings[1105] = ItemType.PlayerHead; - mappings[1106] = ItemType.ZombieHead; - mappings[1107] = ItemType.CreeperHead; - mappings[1108] = ItemType.DragonHead; - mappings[1109] = ItemType.PiglinHead; - mappings[1110] = ItemType.NetherStar; - mappings[1111] = ItemType.PumpkinPie; - mappings[1112] = ItemType.FireworkRocket; - mappings[1113] = ItemType.FireworkStar; - mappings[1114] = ItemType.EnchantedBook; - mappings[1115] = ItemType.NetherBrick; - mappings[1116] = ItemType.PrismarineShard; - mappings[1117] = ItemType.PrismarineCrystals; - mappings[1118] = ItemType.Rabbit; - mappings[1119] = ItemType.CookedRabbit; - mappings[1120] = ItemType.RabbitStew; - mappings[1121] = ItemType.RabbitFoot; - mappings[1122] = ItemType.RabbitHide; - mappings[1123] = ItemType.ArmorStand; - mappings[1124] = ItemType.IronHorseArmor; - mappings[1125] = ItemType.GoldenHorseArmor; - mappings[1126] = ItemType.DiamondHorseArmor; - mappings[1127] = ItemType.LeatherHorseArmor; - mappings[1128] = ItemType.Lead; - mappings[1129] = ItemType.NameTag; - mappings[1130] = ItemType.CommandBlockMinecart; - mappings[1131] = ItemType.Mutton; - mappings[1132] = ItemType.CookedMutton; - mappings[1133] = ItemType.WhiteBanner; - mappings[1134] = ItemType.OrangeBanner; - mappings[1135] = ItemType.MagentaBanner; - mappings[1136] = ItemType.LightBlueBanner; - mappings[1137] = ItemType.YellowBanner; - mappings[1138] = ItemType.LimeBanner; - mappings[1139] = ItemType.PinkBanner; - mappings[1140] = ItemType.GrayBanner; - mappings[1141] = ItemType.LightGrayBanner; - mappings[1142] = ItemType.CyanBanner; - mappings[1143] = ItemType.PurpleBanner; - mappings[1144] = ItemType.BlueBanner; - mappings[1145] = ItemType.BrownBanner; - mappings[1146] = ItemType.GreenBanner; - mappings[1147] = ItemType.RedBanner; - mappings[1148] = ItemType.BlackBanner; - mappings[1149] = ItemType.EndCrystal; - mappings[1150] = ItemType.ChorusFruit; - mappings[1151] = ItemType.PoppedChorusFruit; - mappings[1152] = ItemType.TorchflowerSeeds; - mappings[1153] = ItemType.PitcherPod; - mappings[1154] = ItemType.Beetroot; - mappings[1155] = ItemType.BeetrootSeeds; - mappings[1156] = ItemType.BeetrootSoup; - mappings[1157] = ItemType.DragonBreath; - mappings[1158] = ItemType.SplashPotion; - mappings[1159] = ItemType.SpectralArrow; - mappings[1160] = ItemType.TippedArrow; - mappings[1161] = ItemType.LingeringPotion; - mappings[1162] = ItemType.Shield; - mappings[1163] = ItemType.TotemOfUndying; - mappings[1164] = ItemType.ShulkerShell; - mappings[1165] = ItemType.IronNugget; - mappings[1166] = ItemType.KnowledgeBook; - mappings[1167] = ItemType.DebugStick; - mappings[1168] = ItemType.MusicDisc13; - mappings[1169] = ItemType.MusicDiscCat; - mappings[1170] = ItemType.MusicDiscBlocks; - mappings[1171] = ItemType.MusicDiscChirp; - mappings[1172] = ItemType.MusicDiscCreator; - mappings[1173] = ItemType.MusicDiscCreatorMusicBox; - mappings[1174] = ItemType.MusicDiscFar; - mappings[1175] = ItemType.MusicDiscMall; - mappings[1176] = ItemType.MusicDiscMellohi; - mappings[1177] = ItemType.MusicDiscStal; - mappings[1178] = ItemType.MusicDiscStrad; - mappings[1179] = ItemType.MusicDiscWard; - mappings[1180] = ItemType.MusicDisc11; - mappings[1181] = ItemType.MusicDiscWait; - mappings[1182] = ItemType.MusicDiscOtherside; - mappings[1183] = ItemType.MusicDiscRelic; - mappings[1184] = ItemType.MusicDisc5; - mappings[1185] = ItemType.MusicDiscPigstep; - mappings[1186] = ItemType.MusicDiscPrecipice; - mappings[1187] = ItemType.DiscFragment5; - mappings[1188] = ItemType.Trident; - mappings[1189] = ItemType.PhantomMembrane; - mappings[1190] = ItemType.NautilusShell; - mappings[1191] = ItemType.HeartOfTheSea; - mappings[1192] = ItemType.Crossbow; - mappings[1193] = ItemType.SuspiciousStew; - mappings[1194] = ItemType.Loom; - mappings[1195] = ItemType.FlowerBannerPattern; - mappings[1196] = ItemType.CreeperBannerPattern; - mappings[1197] = ItemType.SkullBannerPattern; - mappings[1198] = ItemType.MojangBannerPattern; - mappings[1199] = ItemType.GlobeBannerPattern; - mappings[1200] = ItemType.PiglinBannerPattern; - mappings[1201] = ItemType.FlowBannerPattern; - mappings[1202] = ItemType.GusterBannerPattern; - mappings[1203] = ItemType.GoatHorn; - mappings[1204] = ItemType.Composter; - mappings[1205] = ItemType.Barrel; - mappings[1206] = ItemType.Smoker; - mappings[1207] = ItemType.BlastFurnace; - mappings[1208] = ItemType.CartographyTable; - mappings[1209] = ItemType.FletchingTable; - mappings[1210] = ItemType.Grindstone; - mappings[1211] = ItemType.SmithingTable; - mappings[1212] = ItemType.Stonecutter; - mappings[1213] = ItemType.Bell; - mappings[1214] = ItemType.Lantern; - mappings[1215] = ItemType.SoulLantern; - mappings[1216] = ItemType.SweetBerries; - mappings[1217] = ItemType.GlowBerries; - mappings[1218] = ItemType.Campfire; - mappings[1219] = ItemType.SoulCampfire; - mappings[1220] = ItemType.Shroomlight; - mappings[1221] = ItemType.Honeycomb; - mappings[1222] = ItemType.BeeNest; - mappings[1223] = ItemType.Beehive; - mappings[1224] = ItemType.HoneyBottle; - mappings[1225] = ItemType.HoneycombBlock; - mappings[1226] = ItemType.Lodestone; - mappings[1227] = ItemType.CryingObsidian; - mappings[1228] = ItemType.Blackstone; - mappings[1229] = ItemType.BlackstoneSlab; - mappings[1230] = ItemType.BlackstoneStairs; - mappings[1231] = ItemType.GildedBlackstone; - mappings[1232] = ItemType.PolishedBlackstone; - mappings[1233] = ItemType.PolishedBlackstoneSlab; - mappings[1234] = ItemType.PolishedBlackstoneStairs; - mappings[1235] = ItemType.ChiseledPolishedBlackstone; - mappings[1236] = ItemType.PolishedBlackstoneBricks; - mappings[1237] = ItemType.PolishedBlackstoneBrickSlab; - mappings[1238] = ItemType.PolishedBlackstoneBrickStairs; - mappings[1239] = ItemType.CrackedPolishedBlackstoneBricks; - mappings[1240] = ItemType.RespawnAnchor; - mappings[1241] = ItemType.Candle; - mappings[1242] = ItemType.WhiteCandle; - mappings[1243] = ItemType.OrangeCandle; - mappings[1244] = ItemType.MagentaCandle; - mappings[1245] = ItemType.LightBlueCandle; - mappings[1246] = ItemType.YellowCandle; - mappings[1247] = ItemType.LimeCandle; - mappings[1248] = ItemType.PinkCandle; - mappings[1249] = ItemType.GrayCandle; - mappings[1250] = ItemType.LightGrayCandle; - mappings[1251] = ItemType.CyanCandle; - mappings[1252] = ItemType.PurpleCandle; - mappings[1253] = ItemType.BlueCandle; - mappings[1254] = ItemType.BrownCandle; - mappings[1255] = ItemType.GreenCandle; - mappings[1256] = ItemType.RedCandle; - mappings[1257] = ItemType.BlackCandle; - mappings[1258] = ItemType.SmallAmethystBud; - mappings[1259] = ItemType.MediumAmethystBud; - mappings[1260] = ItemType.LargeAmethystBud; - mappings[1261] = ItemType.AmethystCluster; - mappings[1262] = ItemType.PointedDripstone; - mappings[1263] = ItemType.OchreFroglight; - mappings[1264] = ItemType.VerdantFroglight; - mappings[1265] = ItemType.PearlescentFroglight; - mappings[1266] = ItemType.Frogspawn; - mappings[1267] = ItemType.EchoShard; - mappings[1268] = ItemType.Brush; - mappings[1269] = ItemType.NetheriteUpgradeSmithingTemplate; - mappings[1270] = ItemType.SentryArmorTrimSmithingTemplate; - mappings[1271] = ItemType.DuneArmorTrimSmithingTemplate; - mappings[1272] = ItemType.CoastArmorTrimSmithingTemplate; - mappings[1273] = ItemType.WildArmorTrimSmithingTemplate; - mappings[1274] = ItemType.WardArmorTrimSmithingTemplate; - mappings[1275] = ItemType.EyeArmorTrimSmithingTemplate; - mappings[1276] = ItemType.VexArmorTrimSmithingTemplate; - mappings[1277] = ItemType.TideArmorTrimSmithingTemplate; - mappings[1278] = ItemType.SnoutArmorTrimSmithingTemplate; - mappings[1279] = ItemType.RibArmorTrimSmithingTemplate; - mappings[1280] = ItemType.SpireArmorTrimSmithingTemplate; - mappings[1281] = ItemType.WayfinderArmorTrimSmithingTemplate; - mappings[1282] = ItemType.ShaperArmorTrimSmithingTemplate; - mappings[1283] = ItemType.SilenceArmorTrimSmithingTemplate; - mappings[1284] = ItemType.RaiserArmorTrimSmithingTemplate; - mappings[1285] = ItemType.HostArmorTrimSmithingTemplate; - mappings[1286] = ItemType.FlowArmorTrimSmithingTemplate; - mappings[1287] = ItemType.BoltArmorTrimSmithingTemplate; - mappings[1288] = ItemType.AnglerPotterySherd; - mappings[1289] = ItemType.ArcherPotterySherd; - mappings[1290] = ItemType.ArmsUpPotterySherd; - mappings[1291] = ItemType.BladePotterySherd; - mappings[1292] = ItemType.BrewerPotterySherd; - mappings[1293] = ItemType.BurnPotterySherd; - mappings[1294] = ItemType.DangerPotterySherd; - mappings[1295] = ItemType.ExplorerPotterySherd; - mappings[1296] = ItemType.FlowPotterySherd; - mappings[1297] = ItemType.FriendPotterySherd; - mappings[1298] = ItemType.GusterPotterySherd; - mappings[1299] = ItemType.HeartPotterySherd; - mappings[1300] = ItemType.HeartbreakPotterySherd; - mappings[1301] = ItemType.HowlPotterySherd; - mappings[1302] = ItemType.MinerPotterySherd; - mappings[1303] = ItemType.MournerPotterySherd; - mappings[1304] = ItemType.PlentyPotterySherd; - mappings[1305] = ItemType.PrizePotterySherd; - mappings[1306] = ItemType.ScrapePotterySherd; - mappings[1307] = ItemType.SheafPotterySherd; - mappings[1308] = ItemType.ShelterPotterySherd; - mappings[1309] = ItemType.SkullPotterySherd; - mappings[1310] = ItemType.SnortPotterySherd; - mappings[1311] = ItemType.CopperGrate; - mappings[1312] = ItemType.ExposedCopperGrate; - mappings[1313] = ItemType.WeatheredCopperGrate; - mappings[1314] = ItemType.OxidizedCopperGrate; - mappings[1315] = ItemType.WaxedCopperGrate; - mappings[1316] = ItemType.WaxedExposedCopperGrate; - mappings[1317] = ItemType.WaxedWeatheredCopperGrate; - mappings[1318] = ItemType.WaxedOxidizedCopperGrate; - mappings[1319] = ItemType.CopperBulb; - mappings[1320] = ItemType.ExposedCopperBulb; - mappings[1321] = ItemType.WeatheredCopperBulb; - mappings[1322] = ItemType.OxidizedCopperBulb; - mappings[1323] = ItemType.WaxedCopperBulb; - mappings[1324] = ItemType.WaxedExposedCopperBulb; - mappings[1325] = ItemType.WaxedWeatheredCopperBulb; - mappings[1326] = ItemType.WaxedOxidizedCopperBulb; - mappings[1327] = ItemType.TrialSpawner; - mappings[1328] = ItemType.TrialKey; - mappings[1329] = ItemType.OminousTrialKey; - mappings[1330] = ItemType.Vault; - mappings[1331] = ItemType.OminousBottle; - mappings[1332] = ItemType.BreezeRod; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette12111.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette12111.cs deleted file mode 100644 index 30de90e84f..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette12111.cs +++ /dev/null @@ -1,1523 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public class ItemPalette12111 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette12111() - { - mappings[0] = ItemType.Air; - mappings[1] = ItemType.Stone; - mappings[2] = ItemType.Granite; - mappings[3] = ItemType.PolishedGranite; - mappings[4] = ItemType.Diorite; - mappings[5] = ItemType.PolishedDiorite; - mappings[6] = ItemType.Andesite; - mappings[7] = ItemType.PolishedAndesite; - mappings[8] = ItemType.Deepslate; - mappings[9] = ItemType.CobbledDeepslate; - mappings[10] = ItemType.PolishedDeepslate; - mappings[11] = ItemType.Calcite; - mappings[12] = ItemType.Tuff; - mappings[13] = ItemType.TuffSlab; - mappings[14] = ItemType.TuffStairs; - mappings[15] = ItemType.TuffWall; - mappings[16] = ItemType.ChiseledTuff; - mappings[17] = ItemType.PolishedTuff; - mappings[18] = ItemType.PolishedTuffSlab; - mappings[19] = ItemType.PolishedTuffStairs; - mappings[20] = ItemType.PolishedTuffWall; - mappings[21] = ItemType.TuffBricks; - mappings[22] = ItemType.TuffBrickSlab; - mappings[23] = ItemType.TuffBrickStairs; - mappings[24] = ItemType.TuffBrickWall; - mappings[25] = ItemType.ChiseledTuffBricks; - mappings[26] = ItemType.DripstoneBlock; - mappings[27] = ItemType.GrassBlock; - mappings[28] = ItemType.Dirt; - mappings[29] = ItemType.CoarseDirt; - mappings[30] = ItemType.Podzol; - mappings[31] = ItemType.RootedDirt; - mappings[32] = ItemType.Mud; - mappings[33] = ItemType.CrimsonNylium; - mappings[34] = ItemType.WarpedNylium; - mappings[35] = ItemType.Cobblestone; - mappings[36] = ItemType.OakPlanks; - mappings[37] = ItemType.SprucePlanks; - mappings[38] = ItemType.BirchPlanks; - mappings[39] = ItemType.JunglePlanks; - mappings[40] = ItemType.AcaciaPlanks; - mappings[41] = ItemType.CherryPlanks; - mappings[42] = ItemType.DarkOakPlanks; - mappings[43] = ItemType.PaleOakPlanks; - mappings[44] = ItemType.MangrovePlanks; - mappings[45] = ItemType.BambooPlanks; - mappings[46] = ItemType.CrimsonPlanks; - mappings[47] = ItemType.WarpedPlanks; - mappings[48] = ItemType.BambooMosaic; - mappings[49] = ItemType.OakSapling; - mappings[50] = ItemType.SpruceSapling; - mappings[51] = ItemType.BirchSapling; - mappings[52] = ItemType.JungleSapling; - mappings[53] = ItemType.AcaciaSapling; - mappings[54] = ItemType.CherrySapling; - mappings[55] = ItemType.DarkOakSapling; - mappings[56] = ItemType.PaleOakSapling; - mappings[57] = ItemType.MangrovePropagule; - mappings[58] = ItemType.Bedrock; - mappings[59] = ItemType.Sand; - mappings[60] = ItemType.SuspiciousSand; - mappings[61] = ItemType.SuspiciousGravel; - mappings[62] = ItemType.RedSand; - mappings[63] = ItemType.Gravel; - mappings[64] = ItemType.CoalOre; - mappings[65] = ItemType.DeepslateCoalOre; - mappings[66] = ItemType.IronOre; - mappings[67] = ItemType.DeepslateIronOre; - mappings[68] = ItemType.CopperOre; - mappings[69] = ItemType.DeepslateCopperOre; - mappings[70] = ItemType.GoldOre; - mappings[71] = ItemType.DeepslateGoldOre; - mappings[72] = ItemType.RedstoneOre; - mappings[73] = ItemType.DeepslateRedstoneOre; - mappings[74] = ItemType.EmeraldOre; - mappings[75] = ItemType.DeepslateEmeraldOre; - mappings[76] = ItemType.LapisOre; - mappings[77] = ItemType.DeepslateLapisOre; - mappings[78] = ItemType.DiamondOre; - mappings[79] = ItemType.DeepslateDiamondOre; - mappings[80] = ItemType.NetherGoldOre; - mappings[81] = ItemType.NetherQuartzOre; - mappings[82] = ItemType.AncientDebris; - mappings[83] = ItemType.CoalBlock; - mappings[84] = ItemType.RawIronBlock; - mappings[85] = ItemType.RawCopperBlock; - mappings[86] = ItemType.RawGoldBlock; - mappings[87] = ItemType.HeavyCore; - mappings[88] = ItemType.AmethystBlock; - mappings[89] = ItemType.BuddingAmethyst; - mappings[90] = ItemType.IronBlock; - mappings[91] = ItemType.CopperBlock; - mappings[92] = ItemType.GoldBlock; - mappings[93] = ItemType.DiamondBlock; - mappings[94] = ItemType.NetheriteBlock; - mappings[95] = ItemType.ExposedCopper; - mappings[96] = ItemType.WeatheredCopper; - mappings[97] = ItemType.OxidizedCopper; - mappings[98] = ItemType.ChiseledCopper; - mappings[99] = ItemType.ExposedChiseledCopper; - mappings[100] = ItemType.WeatheredChiseledCopper; - mappings[101] = ItemType.OxidizedChiseledCopper; - mappings[102] = ItemType.CutCopper; - mappings[103] = ItemType.ExposedCutCopper; - mappings[104] = ItemType.WeatheredCutCopper; - mappings[105] = ItemType.OxidizedCutCopper; - mappings[106] = ItemType.CutCopperStairs; - mappings[107] = ItemType.ExposedCutCopperStairs; - mappings[108] = ItemType.WeatheredCutCopperStairs; - mappings[109] = ItemType.OxidizedCutCopperStairs; - mappings[110] = ItemType.CutCopperSlab; - mappings[111] = ItemType.ExposedCutCopperSlab; - mappings[112] = ItemType.WeatheredCutCopperSlab; - mappings[113] = ItemType.OxidizedCutCopperSlab; - mappings[114] = ItemType.WaxedCopperBlock; - mappings[115] = ItemType.WaxedExposedCopper; - mappings[116] = ItemType.WaxedWeatheredCopper; - mappings[117] = ItemType.WaxedOxidizedCopper; - mappings[118] = ItemType.WaxedChiseledCopper; - mappings[119] = ItemType.WaxedExposedChiseledCopper; - mappings[120] = ItemType.WaxedWeatheredChiseledCopper; - mappings[121] = ItemType.WaxedOxidizedChiseledCopper; - mappings[122] = ItemType.WaxedCutCopper; - mappings[123] = ItemType.WaxedExposedCutCopper; - mappings[124] = ItemType.WaxedWeatheredCutCopper; - mappings[125] = ItemType.WaxedOxidizedCutCopper; - mappings[126] = ItemType.WaxedCutCopperStairs; - mappings[127] = ItemType.WaxedExposedCutCopperStairs; - mappings[128] = ItemType.WaxedWeatheredCutCopperStairs; - mappings[129] = ItemType.WaxedOxidizedCutCopperStairs; - mappings[130] = ItemType.WaxedCutCopperSlab; - mappings[131] = ItemType.WaxedExposedCutCopperSlab; - mappings[132] = ItemType.WaxedWeatheredCutCopperSlab; - mappings[133] = ItemType.WaxedOxidizedCutCopperSlab; - mappings[134] = ItemType.OakLog; - mappings[135] = ItemType.SpruceLog; - mappings[136] = ItemType.BirchLog; - mappings[137] = ItemType.JungleLog; - mappings[138] = ItemType.AcaciaLog; - mappings[139] = ItemType.CherryLog; - mappings[140] = ItemType.PaleOakLog; - mappings[141] = ItemType.DarkOakLog; - mappings[142] = ItemType.MangroveLog; - mappings[143] = ItemType.MangroveRoots; - mappings[144] = ItemType.MuddyMangroveRoots; - mappings[145] = ItemType.CrimsonStem; - mappings[146] = ItemType.WarpedStem; - mappings[147] = ItemType.BambooBlock; - mappings[148] = ItemType.StrippedOakLog; - mappings[149] = ItemType.StrippedSpruceLog; - mappings[150] = ItemType.StrippedBirchLog; - mappings[151] = ItemType.StrippedJungleLog; - mappings[152] = ItemType.StrippedAcaciaLog; - mappings[153] = ItemType.StrippedCherryLog; - mappings[154] = ItemType.StrippedDarkOakLog; - mappings[155] = ItemType.StrippedPaleOakLog; - mappings[156] = ItemType.StrippedMangroveLog; - mappings[157] = ItemType.StrippedCrimsonStem; - mappings[158] = ItemType.StrippedWarpedStem; - mappings[159] = ItemType.StrippedOakWood; - mappings[160] = ItemType.StrippedSpruceWood; - mappings[161] = ItemType.StrippedBirchWood; - mappings[162] = ItemType.StrippedJungleWood; - mappings[163] = ItemType.StrippedAcaciaWood; - mappings[164] = ItemType.StrippedCherryWood; - mappings[165] = ItemType.StrippedDarkOakWood; - mappings[166] = ItemType.StrippedPaleOakWood; - mappings[167] = ItemType.StrippedMangroveWood; - mappings[168] = ItemType.StrippedCrimsonHyphae; - mappings[169] = ItemType.StrippedWarpedHyphae; - mappings[170] = ItemType.StrippedBambooBlock; - mappings[171] = ItemType.OakWood; - mappings[172] = ItemType.SpruceWood; - mappings[173] = ItemType.BirchWood; - mappings[174] = ItemType.JungleWood; - mappings[175] = ItemType.AcaciaWood; - mappings[176] = ItemType.CherryWood; - mappings[177] = ItemType.PaleOakWood; - mappings[178] = ItemType.DarkOakWood; - mappings[179] = ItemType.MangroveWood; - mappings[180] = ItemType.CrimsonHyphae; - mappings[181] = ItemType.WarpedHyphae; - mappings[182] = ItemType.OakLeaves; - mappings[183] = ItemType.SpruceLeaves; - mappings[184] = ItemType.BirchLeaves; - mappings[185] = ItemType.JungleLeaves; - mappings[186] = ItemType.AcaciaLeaves; - mappings[187] = ItemType.CherryLeaves; - mappings[188] = ItemType.DarkOakLeaves; - mappings[189] = ItemType.PaleOakLeaves; - mappings[190] = ItemType.MangroveLeaves; - mappings[191] = ItemType.AzaleaLeaves; - mappings[192] = ItemType.FloweringAzaleaLeaves; - mappings[193] = ItemType.Sponge; - mappings[194] = ItemType.WetSponge; - mappings[195] = ItemType.Glass; - mappings[196] = ItemType.TintedGlass; - mappings[197] = ItemType.LapisBlock; - mappings[198] = ItemType.Sandstone; - mappings[199] = ItemType.ChiseledSandstone; - mappings[200] = ItemType.CutSandstone; - mappings[201] = ItemType.Cobweb; - mappings[202] = ItemType.ShortGrass; - mappings[203] = ItemType.Fern; - mappings[204] = ItemType.Bush; - mappings[205] = ItemType.Azalea; - mappings[206] = ItemType.FloweringAzalea; - mappings[207] = ItemType.DeadBush; - mappings[208] = ItemType.FireflyBush; - mappings[209] = ItemType.ShortDryGrass; - mappings[210] = ItemType.TallDryGrass; - mappings[211] = ItemType.Seagrass; - mappings[212] = ItemType.SeaPickle; - mappings[213] = ItemType.WhiteWool; - mappings[214] = ItemType.OrangeWool; - mappings[215] = ItemType.MagentaWool; - mappings[216] = ItemType.LightBlueWool; - mappings[217] = ItemType.YellowWool; - mappings[218] = ItemType.LimeWool; - mappings[219] = ItemType.PinkWool; - mappings[220] = ItemType.GrayWool; - mappings[221] = ItemType.LightGrayWool; - mappings[222] = ItemType.CyanWool; - mappings[223] = ItemType.PurpleWool; - mappings[224] = ItemType.BlueWool; - mappings[225] = ItemType.BrownWool; - mappings[226] = ItemType.GreenWool; - mappings[227] = ItemType.RedWool; - mappings[228] = ItemType.BlackWool; - mappings[229] = ItemType.Dandelion; - mappings[230] = ItemType.OpenEyeblossom; - mappings[231] = ItemType.ClosedEyeblossom; - mappings[232] = ItemType.Poppy; - mappings[233] = ItemType.BlueOrchid; - mappings[234] = ItemType.Allium; - mappings[235] = ItemType.AzureBluet; - mappings[236] = ItemType.RedTulip; - mappings[237] = ItemType.OrangeTulip; - mappings[238] = ItemType.WhiteTulip; - mappings[239] = ItemType.PinkTulip; - mappings[240] = ItemType.OxeyeDaisy; - mappings[241] = ItemType.Cornflower; - mappings[242] = ItemType.LilyOfTheValley; - mappings[243] = ItemType.WitherRose; - mappings[244] = ItemType.Torchflower; - mappings[245] = ItemType.PitcherPlant; - mappings[246] = ItemType.SporeBlossom; - mappings[247] = ItemType.BrownMushroom; - mappings[248] = ItemType.RedMushroom; - mappings[249] = ItemType.CrimsonFungus; - mappings[250] = ItemType.WarpedFungus; - mappings[251] = ItemType.CrimsonRoots; - mappings[252] = ItemType.WarpedRoots; - mappings[253] = ItemType.NetherSprouts; - mappings[254] = ItemType.WeepingVines; - mappings[255] = ItemType.TwistingVines; - mappings[256] = ItemType.SugarCane; - mappings[257] = ItemType.Kelp; - mappings[258] = ItemType.PinkPetals; - mappings[259] = ItemType.Wildflowers; - mappings[260] = ItemType.LeafLitter; - mappings[261] = ItemType.MossCarpet; - mappings[262] = ItemType.MossBlock; - mappings[263] = ItemType.PaleMossCarpet; - mappings[264] = ItemType.PaleHangingMoss; - mappings[265] = ItemType.PaleMossBlock; - mappings[266] = ItemType.HangingRoots; - mappings[267] = ItemType.BigDripleaf; - mappings[268] = ItemType.SmallDripleaf; - mappings[269] = ItemType.Bamboo; - mappings[270] = ItemType.OakSlab; - mappings[271] = ItemType.SpruceSlab; - mappings[272] = ItemType.BirchSlab; - mappings[273] = ItemType.JungleSlab; - mappings[274] = ItemType.AcaciaSlab; - mappings[275] = ItemType.CherrySlab; - mappings[276] = ItemType.DarkOakSlab; - mappings[277] = ItemType.PaleOakSlab; - mappings[278] = ItemType.MangroveSlab; - mappings[279] = ItemType.BambooSlab; - mappings[280] = ItemType.BambooMosaicSlab; - mappings[281] = ItemType.CrimsonSlab; - mappings[282] = ItemType.WarpedSlab; - mappings[283] = ItemType.StoneSlab; - mappings[284] = ItemType.SmoothStoneSlab; - mappings[285] = ItemType.SandstoneSlab; - mappings[286] = ItemType.CutSandstoneSlab; - mappings[287] = ItemType.PetrifiedOakSlab; - mappings[288] = ItemType.CobblestoneSlab; - mappings[289] = ItemType.BrickSlab; - mappings[290] = ItemType.StoneBrickSlab; - mappings[291] = ItemType.MudBrickSlab; - mappings[292] = ItemType.NetherBrickSlab; - mappings[293] = ItemType.QuartzSlab; - mappings[294] = ItemType.RedSandstoneSlab; - mappings[295] = ItemType.CutRedSandstoneSlab; - mappings[296] = ItemType.PurpurSlab; - mappings[297] = ItemType.PrismarineSlab; - mappings[298] = ItemType.PrismarineBrickSlab; - mappings[299] = ItemType.DarkPrismarineSlab; - mappings[300] = ItemType.SmoothQuartz; - mappings[301] = ItemType.SmoothRedSandstone; - mappings[302] = ItemType.SmoothSandstone; - mappings[303] = ItemType.SmoothStone; - mappings[304] = ItemType.Bricks; - mappings[305] = ItemType.AcaciaShelf; - mappings[306] = ItemType.BambooShelf; - mappings[307] = ItemType.BirchShelf; - mappings[308] = ItemType.CherryShelf; - mappings[309] = ItemType.CrimsonShelf; - mappings[310] = ItemType.DarkOakShelf; - mappings[311] = ItemType.JungleShelf; - mappings[312] = ItemType.MangroveShelf; - mappings[313] = ItemType.OakShelf; - mappings[314] = ItemType.PaleOakShelf; - mappings[315] = ItemType.SpruceShelf; - mappings[316] = ItemType.WarpedShelf; - mappings[317] = ItemType.Bookshelf; - mappings[318] = ItemType.ChiseledBookshelf; - mappings[319] = ItemType.DecoratedPot; - mappings[320] = ItemType.MossyCobblestone; - mappings[321] = ItemType.Obsidian; - mappings[322] = ItemType.Torch; - mappings[323] = ItemType.EndRod; - mappings[324] = ItemType.ChorusPlant; - mappings[325] = ItemType.ChorusFlower; - mappings[326] = ItemType.PurpurBlock; - mappings[327] = ItemType.PurpurPillar; - mappings[328] = ItemType.PurpurStairs; - mappings[329] = ItemType.Spawner; - mappings[330] = ItemType.CreakingHeart; - mappings[331] = ItemType.Chest; - mappings[332] = ItemType.CraftingTable; - mappings[333] = ItemType.Farmland; - mappings[334] = ItemType.Furnace; - mappings[335] = ItemType.Ladder; - mappings[336] = ItemType.CobblestoneStairs; - mappings[337] = ItemType.Snow; - mappings[338] = ItemType.Ice; - mappings[339] = ItemType.SnowBlock; - mappings[340] = ItemType.Cactus; - mappings[341] = ItemType.CactusFlower; - mappings[342] = ItemType.Clay; - mappings[343] = ItemType.Jukebox; - mappings[344] = ItemType.OakFence; - mappings[345] = ItemType.SpruceFence; - mappings[346] = ItemType.BirchFence; - mappings[347] = ItemType.JungleFence; - mappings[348] = ItemType.AcaciaFence; - mappings[349] = ItemType.CherryFence; - mappings[350] = ItemType.DarkOakFence; - mappings[351] = ItemType.PaleOakFence; - mappings[352] = ItemType.MangroveFence; - mappings[353] = ItemType.BambooFence; - mappings[354] = ItemType.CrimsonFence; - mappings[355] = ItemType.WarpedFence; - mappings[356] = ItemType.Pumpkin; - mappings[357] = ItemType.CarvedPumpkin; - mappings[358] = ItemType.JackOLantern; - mappings[359] = ItemType.Netherrack; - mappings[360] = ItemType.SoulSand; - mappings[361] = ItemType.SoulSoil; - mappings[362] = ItemType.Basalt; - mappings[363] = ItemType.PolishedBasalt; - mappings[364] = ItemType.SmoothBasalt; - mappings[365] = ItemType.SoulTorch; - mappings[366] = ItemType.CopperTorch; - mappings[367] = ItemType.Glowstone; - mappings[368] = ItemType.InfestedStone; - mappings[369] = ItemType.InfestedCobblestone; - mappings[370] = ItemType.InfestedStoneBricks; - mappings[371] = ItemType.InfestedMossyStoneBricks; - mappings[372] = ItemType.InfestedCrackedStoneBricks; - mappings[373] = ItemType.InfestedChiseledStoneBricks; - mappings[374] = ItemType.InfestedDeepslate; - mappings[375] = ItemType.StoneBricks; - mappings[376] = ItemType.MossyStoneBricks; - mappings[377] = ItemType.CrackedStoneBricks; - mappings[378] = ItemType.ChiseledStoneBricks; - mappings[379] = ItemType.PackedMud; - mappings[380] = ItemType.MudBricks; - mappings[381] = ItemType.DeepslateBricks; - mappings[382] = ItemType.CrackedDeepslateBricks; - mappings[383] = ItemType.DeepslateTiles; - mappings[384] = ItemType.CrackedDeepslateTiles; - mappings[385] = ItemType.ChiseledDeepslate; - mappings[386] = ItemType.ReinforcedDeepslate; - mappings[387] = ItemType.BrownMushroomBlock; - mappings[388] = ItemType.RedMushroomBlock; - mappings[389] = ItemType.MushroomStem; - mappings[390] = ItemType.IronBars; - mappings[391] = ItemType.CopperBars; - mappings[392] = ItemType.ExposedCopperBars; - mappings[393] = ItemType.WeatheredCopperBars; - mappings[394] = ItemType.OxidizedCopperBars; - mappings[395] = ItemType.WaxedCopperBars; - mappings[396] = ItemType.WaxedExposedCopperBars; - mappings[397] = ItemType.WaxedWeatheredCopperBars; - mappings[398] = ItemType.WaxedOxidizedCopperBars; - mappings[399] = ItemType.IronChain; - mappings[400] = ItemType.CopperChain; - mappings[401] = ItemType.ExposedCopperChain; - mappings[402] = ItemType.WeatheredCopperChain; - mappings[403] = ItemType.OxidizedCopperChain; - mappings[404] = ItemType.WaxedCopperChain; - mappings[405] = ItemType.WaxedExposedCopperChain; - mappings[406] = ItemType.WaxedWeatheredCopperChain; - mappings[407] = ItemType.WaxedOxidizedCopperChain; - mappings[408] = ItemType.GlassPane; - mappings[409] = ItemType.Melon; - mappings[410] = ItemType.Vine; - mappings[411] = ItemType.GlowLichen; - mappings[412] = ItemType.ResinClump; - mappings[413] = ItemType.ResinBlock; - mappings[414] = ItemType.ResinBricks; - mappings[415] = ItemType.ResinBrickStairs; - mappings[416] = ItemType.ResinBrickSlab; - mappings[417] = ItemType.ResinBrickWall; - mappings[418] = ItemType.ChiseledResinBricks; - mappings[419] = ItemType.BrickStairs; - mappings[420] = ItemType.StoneBrickStairs; - mappings[421] = ItemType.MudBrickStairs; - mappings[422] = ItemType.Mycelium; - mappings[423] = ItemType.LilyPad; - mappings[424] = ItemType.NetherBricks; - mappings[425] = ItemType.CrackedNetherBricks; - mappings[426] = ItemType.ChiseledNetherBricks; - mappings[427] = ItemType.NetherBrickFence; - mappings[428] = ItemType.NetherBrickStairs; - mappings[429] = ItemType.Sculk; - mappings[430] = ItemType.SculkVein; - mappings[431] = ItemType.SculkCatalyst; - mappings[432] = ItemType.SculkShrieker; - mappings[433] = ItemType.EnchantingTable; - mappings[434] = ItemType.EndPortalFrame; - mappings[435] = ItemType.EndStone; - mappings[436] = ItemType.EndStoneBricks; - mappings[437] = ItemType.DragonEgg; - mappings[438] = ItemType.SandstoneStairs; - mappings[439] = ItemType.EnderChest; - mappings[440] = ItemType.EmeraldBlock; - mappings[441] = ItemType.OakStairs; - mappings[442] = ItemType.SpruceStairs; - mappings[443] = ItemType.BirchStairs; - mappings[444] = ItemType.JungleStairs; - mappings[445] = ItemType.AcaciaStairs; - mappings[446] = ItemType.CherryStairs; - mappings[447] = ItemType.DarkOakStairs; - mappings[448] = ItemType.PaleOakStairs; - mappings[449] = ItemType.MangroveStairs; - mappings[450] = ItemType.BambooStairs; - mappings[451] = ItemType.BambooMosaicStairs; - mappings[452] = ItemType.CrimsonStairs; - mappings[453] = ItemType.WarpedStairs; - mappings[454] = ItemType.CommandBlock; - mappings[455] = ItemType.Beacon; - mappings[456] = ItemType.CobblestoneWall; - mappings[457] = ItemType.MossyCobblestoneWall; - mappings[458] = ItemType.BrickWall; - mappings[459] = ItemType.PrismarineWall; - mappings[460] = ItemType.RedSandstoneWall; - mappings[461] = ItemType.MossyStoneBrickWall; - mappings[462] = ItemType.GraniteWall; - mappings[463] = ItemType.StoneBrickWall; - mappings[464] = ItemType.MudBrickWall; - mappings[465] = ItemType.NetherBrickWall; - mappings[466] = ItemType.AndesiteWall; - mappings[467] = ItemType.RedNetherBrickWall; - mappings[468] = ItemType.SandstoneWall; - mappings[469] = ItemType.EndStoneBrickWall; - mappings[470] = ItemType.DioriteWall; - mappings[471] = ItemType.BlackstoneWall; - mappings[472] = ItemType.PolishedBlackstoneWall; - mappings[473] = ItemType.PolishedBlackstoneBrickWall; - mappings[474] = ItemType.CobbledDeepslateWall; - mappings[475] = ItemType.PolishedDeepslateWall; - mappings[476] = ItemType.DeepslateBrickWall; - mappings[477] = ItemType.DeepslateTileWall; - mappings[478] = ItemType.Anvil; - mappings[479] = ItemType.ChippedAnvil; - mappings[480] = ItemType.DamagedAnvil; - mappings[481] = ItemType.ChiseledQuartzBlock; - mappings[482] = ItemType.QuartzBlock; - mappings[483] = ItemType.QuartzBricks; - mappings[484] = ItemType.QuartzPillar; - mappings[485] = ItemType.QuartzStairs; - mappings[486] = ItemType.WhiteTerracotta; - mappings[487] = ItemType.OrangeTerracotta; - mappings[488] = ItemType.MagentaTerracotta; - mappings[489] = ItemType.LightBlueTerracotta; - mappings[490] = ItemType.YellowTerracotta; - mappings[491] = ItemType.LimeTerracotta; - mappings[492] = ItemType.PinkTerracotta; - mappings[493] = ItemType.GrayTerracotta; - mappings[494] = ItemType.LightGrayTerracotta; - mappings[495] = ItemType.CyanTerracotta; - mappings[496] = ItemType.PurpleTerracotta; - mappings[497] = ItemType.BlueTerracotta; - mappings[498] = ItemType.BrownTerracotta; - mappings[499] = ItemType.GreenTerracotta; - mappings[500] = ItemType.RedTerracotta; - mappings[501] = ItemType.BlackTerracotta; - mappings[502] = ItemType.Barrier; - mappings[503] = ItemType.Light; - mappings[504] = ItemType.HayBlock; - mappings[505] = ItemType.WhiteCarpet; - mappings[506] = ItemType.OrangeCarpet; - mappings[507] = ItemType.MagentaCarpet; - mappings[508] = ItemType.LightBlueCarpet; - mappings[509] = ItemType.YellowCarpet; - mappings[510] = ItemType.LimeCarpet; - mappings[511] = ItemType.PinkCarpet; - mappings[512] = ItemType.GrayCarpet; - mappings[513] = ItemType.LightGrayCarpet; - mappings[514] = ItemType.CyanCarpet; - mappings[515] = ItemType.PurpleCarpet; - mappings[516] = ItemType.BlueCarpet; - mappings[517] = ItemType.BrownCarpet; - mappings[518] = ItemType.GreenCarpet; - mappings[519] = ItemType.RedCarpet; - mappings[520] = ItemType.BlackCarpet; - mappings[521] = ItemType.Terracotta; - mappings[522] = ItemType.PackedIce; - mappings[523] = ItemType.DirtPath; - mappings[524] = ItemType.Sunflower; - mappings[525] = ItemType.Lilac; - mappings[526] = ItemType.RoseBush; - mappings[527] = ItemType.Peony; - mappings[528] = ItemType.TallGrass; - mappings[529] = ItemType.LargeFern; - mappings[530] = ItemType.WhiteStainedGlass; - mappings[531] = ItemType.OrangeStainedGlass; - mappings[532] = ItemType.MagentaStainedGlass; - mappings[533] = ItemType.LightBlueStainedGlass; - mappings[534] = ItemType.YellowStainedGlass; - mappings[535] = ItemType.LimeStainedGlass; - mappings[536] = ItemType.PinkStainedGlass; - mappings[537] = ItemType.GrayStainedGlass; - mappings[538] = ItemType.LightGrayStainedGlass; - mappings[539] = ItemType.CyanStainedGlass; - mappings[540] = ItemType.PurpleStainedGlass; - mappings[541] = ItemType.BlueStainedGlass; - mappings[542] = ItemType.BrownStainedGlass; - mappings[543] = ItemType.GreenStainedGlass; - mappings[544] = ItemType.RedStainedGlass; - mappings[545] = ItemType.BlackStainedGlass; - mappings[546] = ItemType.WhiteStainedGlassPane; - mappings[547] = ItemType.OrangeStainedGlassPane; - mappings[548] = ItemType.MagentaStainedGlassPane; - mappings[549] = ItemType.LightBlueStainedGlassPane; - mappings[550] = ItemType.YellowStainedGlassPane; - mappings[551] = ItemType.LimeStainedGlassPane; - mappings[552] = ItemType.PinkStainedGlassPane; - mappings[553] = ItemType.GrayStainedGlassPane; - mappings[554] = ItemType.LightGrayStainedGlassPane; - mappings[555] = ItemType.CyanStainedGlassPane; - mappings[556] = ItemType.PurpleStainedGlassPane; - mappings[557] = ItemType.BlueStainedGlassPane; - mappings[558] = ItemType.BrownStainedGlassPane; - mappings[559] = ItemType.GreenStainedGlassPane; - mappings[560] = ItemType.RedStainedGlassPane; - mappings[561] = ItemType.BlackStainedGlassPane; - mappings[562] = ItemType.Prismarine; - mappings[563] = ItemType.PrismarineBricks; - mappings[564] = ItemType.DarkPrismarine; - mappings[565] = ItemType.PrismarineStairs; - mappings[566] = ItemType.PrismarineBrickStairs; - mappings[567] = ItemType.DarkPrismarineStairs; - mappings[568] = ItemType.SeaLantern; - mappings[569] = ItemType.RedSandstone; - mappings[570] = ItemType.ChiseledRedSandstone; - mappings[571] = ItemType.CutRedSandstone; - mappings[572] = ItemType.RedSandstoneStairs; - mappings[573] = ItemType.RepeatingCommandBlock; - mappings[574] = ItemType.ChainCommandBlock; - mappings[575] = ItemType.MagmaBlock; - mappings[576] = ItemType.NetherWartBlock; - mappings[577] = ItemType.WarpedWartBlock; - mappings[578] = ItemType.RedNetherBricks; - mappings[579] = ItemType.BoneBlock; - mappings[580] = ItemType.StructureVoid; - mappings[581] = ItemType.ShulkerBox; - mappings[582] = ItemType.WhiteShulkerBox; - mappings[583] = ItemType.OrangeShulkerBox; - mappings[584] = ItemType.MagentaShulkerBox; - mappings[585] = ItemType.LightBlueShulkerBox; - mappings[586] = ItemType.YellowShulkerBox; - mappings[587] = ItemType.LimeShulkerBox; - mappings[588] = ItemType.PinkShulkerBox; - mappings[589] = ItemType.GrayShulkerBox; - mappings[590] = ItemType.LightGrayShulkerBox; - mappings[591] = ItemType.CyanShulkerBox; - mappings[592] = ItemType.PurpleShulkerBox; - mappings[593] = ItemType.BlueShulkerBox; - mappings[594] = ItemType.BrownShulkerBox; - mappings[595] = ItemType.GreenShulkerBox; - mappings[596] = ItemType.RedShulkerBox; - mappings[597] = ItemType.BlackShulkerBox; - mappings[598] = ItemType.WhiteGlazedTerracotta; - mappings[599] = ItemType.OrangeGlazedTerracotta; - mappings[600] = ItemType.MagentaGlazedTerracotta; - mappings[601] = ItemType.LightBlueGlazedTerracotta; - mappings[602] = ItemType.YellowGlazedTerracotta; - mappings[603] = ItemType.LimeGlazedTerracotta; - mappings[604] = ItemType.PinkGlazedTerracotta; - mappings[605] = ItemType.GrayGlazedTerracotta; - mappings[606] = ItemType.LightGrayGlazedTerracotta; - mappings[607] = ItemType.CyanGlazedTerracotta; - mappings[608] = ItemType.PurpleGlazedTerracotta; - mappings[609] = ItemType.BlueGlazedTerracotta; - mappings[610] = ItemType.BrownGlazedTerracotta; - mappings[611] = ItemType.GreenGlazedTerracotta; - mappings[612] = ItemType.RedGlazedTerracotta; - mappings[613] = ItemType.BlackGlazedTerracotta; - mappings[614] = ItemType.WhiteConcrete; - mappings[615] = ItemType.OrangeConcrete; - mappings[616] = ItemType.MagentaConcrete; - mappings[617] = ItemType.LightBlueConcrete; - mappings[618] = ItemType.YellowConcrete; - mappings[619] = ItemType.LimeConcrete; - mappings[620] = ItemType.PinkConcrete; - mappings[621] = ItemType.GrayConcrete; - mappings[622] = ItemType.LightGrayConcrete; - mappings[623] = ItemType.CyanConcrete; - mappings[624] = ItemType.PurpleConcrete; - mappings[625] = ItemType.BlueConcrete; - mappings[626] = ItemType.BrownConcrete; - mappings[627] = ItemType.GreenConcrete; - mappings[628] = ItemType.RedConcrete; - mappings[629] = ItemType.BlackConcrete; - mappings[630] = ItemType.WhiteConcretePowder; - mappings[631] = ItemType.OrangeConcretePowder; - mappings[632] = ItemType.MagentaConcretePowder; - mappings[633] = ItemType.LightBlueConcretePowder; - mappings[634] = ItemType.YellowConcretePowder; - mappings[635] = ItemType.LimeConcretePowder; - mappings[636] = ItemType.PinkConcretePowder; - mappings[637] = ItemType.GrayConcretePowder; - mappings[638] = ItemType.LightGrayConcretePowder; - mappings[639] = ItemType.CyanConcretePowder; - mappings[640] = ItemType.PurpleConcretePowder; - mappings[641] = ItemType.BlueConcretePowder; - mappings[642] = ItemType.BrownConcretePowder; - mappings[643] = ItemType.GreenConcretePowder; - mappings[644] = ItemType.RedConcretePowder; - mappings[645] = ItemType.BlackConcretePowder; - mappings[646] = ItemType.TurtleEgg; - mappings[647] = ItemType.SnifferEgg; - mappings[648] = ItemType.DriedGhast; - mappings[649] = ItemType.DeadTubeCoralBlock; - mappings[650] = ItemType.DeadBrainCoralBlock; - mappings[651] = ItemType.DeadBubbleCoralBlock; - mappings[652] = ItemType.DeadFireCoralBlock; - mappings[653] = ItemType.DeadHornCoralBlock; - mappings[654] = ItemType.TubeCoralBlock; - mappings[655] = ItemType.BrainCoralBlock; - mappings[656] = ItemType.BubbleCoralBlock; - mappings[657] = ItemType.FireCoralBlock; - mappings[658] = ItemType.HornCoralBlock; - mappings[659] = ItemType.TubeCoral; - mappings[660] = ItemType.BrainCoral; - mappings[661] = ItemType.BubbleCoral; - mappings[662] = ItemType.FireCoral; - mappings[663] = ItemType.HornCoral; - mappings[664] = ItemType.DeadBrainCoral; - mappings[665] = ItemType.DeadBubbleCoral; - mappings[666] = ItemType.DeadFireCoral; - mappings[667] = ItemType.DeadHornCoral; - mappings[668] = ItemType.DeadTubeCoral; - mappings[669] = ItemType.TubeCoralFan; - mappings[670] = ItemType.BrainCoralFan; - mappings[671] = ItemType.BubbleCoralFan; - mappings[672] = ItemType.FireCoralFan; - mappings[673] = ItemType.HornCoralFan; - mappings[674] = ItemType.DeadTubeCoralFan; - mappings[675] = ItemType.DeadBrainCoralFan; - mappings[676] = ItemType.DeadBubbleCoralFan; - mappings[677] = ItemType.DeadFireCoralFan; - mappings[678] = ItemType.DeadHornCoralFan; - mappings[679] = ItemType.BlueIce; - mappings[680] = ItemType.Conduit; - mappings[681] = ItemType.PolishedGraniteStairs; - mappings[682] = ItemType.SmoothRedSandstoneStairs; - mappings[683] = ItemType.MossyStoneBrickStairs; - mappings[684] = ItemType.PolishedDioriteStairs; - mappings[685] = ItemType.MossyCobblestoneStairs; - mappings[686] = ItemType.EndStoneBrickStairs; - mappings[687] = ItemType.StoneStairs; - mappings[688] = ItemType.SmoothSandstoneStairs; - mappings[689] = ItemType.SmoothQuartzStairs; - mappings[690] = ItemType.GraniteStairs; - mappings[691] = ItemType.AndesiteStairs; - mappings[692] = ItemType.RedNetherBrickStairs; - mappings[693] = ItemType.PolishedAndesiteStairs; - mappings[694] = ItemType.DioriteStairs; - mappings[695] = ItemType.CobbledDeepslateStairs; - mappings[696] = ItemType.PolishedDeepslateStairs; - mappings[697] = ItemType.DeepslateBrickStairs; - mappings[698] = ItemType.DeepslateTileStairs; - mappings[699] = ItemType.PolishedGraniteSlab; - mappings[700] = ItemType.SmoothRedSandstoneSlab; - mappings[701] = ItemType.MossyStoneBrickSlab; - mappings[702] = ItemType.PolishedDioriteSlab; - mappings[703] = ItemType.MossyCobblestoneSlab; - mappings[704] = ItemType.EndStoneBrickSlab; - mappings[705] = ItemType.SmoothSandstoneSlab; - mappings[706] = ItemType.SmoothQuartzSlab; - mappings[707] = ItemType.GraniteSlab; - mappings[708] = ItemType.AndesiteSlab; - mappings[709] = ItemType.RedNetherBrickSlab; - mappings[710] = ItemType.PolishedAndesiteSlab; - mappings[711] = ItemType.DioriteSlab; - mappings[712] = ItemType.CobbledDeepslateSlab; - mappings[713] = ItemType.PolishedDeepslateSlab; - mappings[714] = ItemType.DeepslateBrickSlab; - mappings[715] = ItemType.DeepslateTileSlab; - mappings[716] = ItemType.Scaffolding; - mappings[717] = ItemType.Redstone; - mappings[718] = ItemType.RedstoneTorch; - mappings[719] = ItemType.RedstoneBlock; - mappings[720] = ItemType.Repeater; - mappings[721] = ItemType.Comparator; - mappings[722] = ItemType.Piston; - mappings[723] = ItemType.StickyPiston; - mappings[724] = ItemType.SlimeBlock; - mappings[725] = ItemType.HoneyBlock; - mappings[726] = ItemType.Observer; - mappings[727] = ItemType.Hopper; - mappings[728] = ItemType.Dispenser; - mappings[729] = ItemType.Dropper; - mappings[730] = ItemType.Lectern; - mappings[731] = ItemType.Target; - mappings[732] = ItemType.Lever; - mappings[733] = ItemType.LightningRod; - mappings[734] = ItemType.ExposedLightningRod; - mappings[735] = ItemType.WeatheredLightningRod; - mappings[736] = ItemType.OxidizedLightningRod; - mappings[737] = ItemType.WaxedLightningRod; - mappings[738] = ItemType.WaxedExposedLightningRod; - mappings[739] = ItemType.WaxedWeatheredLightningRod; - mappings[740] = ItemType.WaxedOxidizedLightningRod; - mappings[741] = ItemType.DaylightDetector; - mappings[742] = ItemType.SculkSensor; - mappings[743] = ItemType.CalibratedSculkSensor; - mappings[744] = ItemType.TripwireHook; - mappings[745] = ItemType.TrappedChest; - mappings[746] = ItemType.Tnt; - mappings[747] = ItemType.RedstoneLamp; - mappings[748] = ItemType.NoteBlock; - mappings[749] = ItemType.StoneButton; - mappings[750] = ItemType.PolishedBlackstoneButton; - mappings[751] = ItemType.OakButton; - mappings[752] = ItemType.SpruceButton; - mappings[753] = ItemType.BirchButton; - mappings[754] = ItemType.JungleButton; - mappings[755] = ItemType.AcaciaButton; - mappings[756] = ItemType.CherryButton; - mappings[757] = ItemType.DarkOakButton; - mappings[758] = ItemType.PaleOakButton; - mappings[759] = ItemType.MangroveButton; - mappings[760] = ItemType.BambooButton; - mappings[761] = ItemType.CrimsonButton; - mappings[762] = ItemType.WarpedButton; - mappings[763] = ItemType.StonePressurePlate; - mappings[764] = ItemType.PolishedBlackstonePressurePlate; - mappings[765] = ItemType.LightWeightedPressurePlate; - mappings[766] = ItemType.HeavyWeightedPressurePlate; - mappings[767] = ItemType.OakPressurePlate; - mappings[768] = ItemType.SprucePressurePlate; - mappings[769] = ItemType.BirchPressurePlate; - mappings[770] = ItemType.JunglePressurePlate; - mappings[771] = ItemType.AcaciaPressurePlate; - mappings[772] = ItemType.CherryPressurePlate; - mappings[773] = ItemType.DarkOakPressurePlate; - mappings[774] = ItemType.PaleOakPressurePlate; - mappings[775] = ItemType.MangrovePressurePlate; - mappings[776] = ItemType.BambooPressurePlate; - mappings[777] = ItemType.CrimsonPressurePlate; - mappings[778] = ItemType.WarpedPressurePlate; - mappings[779] = ItemType.IronDoor; - mappings[780] = ItemType.OakDoor; - mappings[781] = ItemType.SpruceDoor; - mappings[782] = ItemType.BirchDoor; - mappings[783] = ItemType.JungleDoor; - mappings[784] = ItemType.AcaciaDoor; - mappings[785] = ItemType.CherryDoor; - mappings[786] = ItemType.DarkOakDoor; - mappings[787] = ItemType.PaleOakDoor; - mappings[788] = ItemType.MangroveDoor; - mappings[789] = ItemType.BambooDoor; - mappings[790] = ItemType.CrimsonDoor; - mappings[791] = ItemType.WarpedDoor; - mappings[792] = ItemType.CopperDoor; - mappings[793] = ItemType.ExposedCopperDoor; - mappings[794] = ItemType.WeatheredCopperDoor; - mappings[795] = ItemType.OxidizedCopperDoor; - mappings[796] = ItemType.WaxedCopperDoor; - mappings[797] = ItemType.WaxedExposedCopperDoor; - mappings[798] = ItemType.WaxedWeatheredCopperDoor; - mappings[799] = ItemType.WaxedOxidizedCopperDoor; - mappings[800] = ItemType.IronTrapdoor; - mappings[801] = ItemType.OakTrapdoor; - mappings[802] = ItemType.SpruceTrapdoor; - mappings[803] = ItemType.BirchTrapdoor; - mappings[804] = ItemType.JungleTrapdoor; - mappings[805] = ItemType.AcaciaTrapdoor; - mappings[806] = ItemType.CherryTrapdoor; - mappings[807] = ItemType.DarkOakTrapdoor; - mappings[808] = ItemType.PaleOakTrapdoor; - mappings[809] = ItemType.MangroveTrapdoor; - mappings[810] = ItemType.BambooTrapdoor; - mappings[811] = ItemType.CrimsonTrapdoor; - mappings[812] = ItemType.WarpedTrapdoor; - mappings[813] = ItemType.CopperTrapdoor; - mappings[814] = ItemType.ExposedCopperTrapdoor; - mappings[815] = ItemType.WeatheredCopperTrapdoor; - mappings[816] = ItemType.OxidizedCopperTrapdoor; - mappings[817] = ItemType.WaxedCopperTrapdoor; - mappings[818] = ItemType.WaxedExposedCopperTrapdoor; - mappings[819] = ItemType.WaxedWeatheredCopperTrapdoor; - mappings[820] = ItemType.WaxedOxidizedCopperTrapdoor; - mappings[821] = ItemType.OakFenceGate; - mappings[822] = ItemType.SpruceFenceGate; - mappings[823] = ItemType.BirchFenceGate; - mappings[824] = ItemType.JungleFenceGate; - mappings[825] = ItemType.AcaciaFenceGate; - mappings[826] = ItemType.CherryFenceGate; - mappings[827] = ItemType.DarkOakFenceGate; - mappings[828] = ItemType.PaleOakFenceGate; - mappings[829] = ItemType.MangroveFenceGate; - mappings[830] = ItemType.BambooFenceGate; - mappings[831] = ItemType.CrimsonFenceGate; - mappings[832] = ItemType.WarpedFenceGate; - mappings[833] = ItemType.PoweredRail; - mappings[834] = ItemType.DetectorRail; - mappings[835] = ItemType.Rail; - mappings[836] = ItemType.ActivatorRail; - mappings[837] = ItemType.Saddle; - mappings[838] = ItemType.WhiteHarness; - mappings[839] = ItemType.OrangeHarness; - mappings[840] = ItemType.MagentaHarness; - mappings[841] = ItemType.LightBlueHarness; - mappings[842] = ItemType.YellowHarness; - mappings[843] = ItemType.LimeHarness; - mappings[844] = ItemType.PinkHarness; - mappings[845] = ItemType.GrayHarness; - mappings[846] = ItemType.LightGrayHarness; - mappings[847] = ItemType.CyanHarness; - mappings[848] = ItemType.PurpleHarness; - mappings[849] = ItemType.BlueHarness; - mappings[850] = ItemType.BrownHarness; - mappings[851] = ItemType.GreenHarness; - mappings[852] = ItemType.RedHarness; - mappings[853] = ItemType.BlackHarness; - mappings[854] = ItemType.Minecart; - mappings[855] = ItemType.ChestMinecart; - mappings[856] = ItemType.FurnaceMinecart; - mappings[857] = ItemType.TntMinecart; - mappings[858] = ItemType.HopperMinecart; - mappings[859] = ItemType.CarrotOnAStick; - mappings[860] = ItemType.WarpedFungusOnAStick; - mappings[861] = ItemType.PhantomMembrane; - mappings[862] = ItemType.Elytra; - mappings[863] = ItemType.OakBoat; - mappings[864] = ItemType.OakChestBoat; - mappings[865] = ItemType.SpruceBoat; - mappings[866] = ItemType.SpruceChestBoat; - mappings[867] = ItemType.BirchBoat; - mappings[868] = ItemType.BirchChestBoat; - mappings[869] = ItemType.JungleBoat; - mappings[870] = ItemType.JungleChestBoat; - mappings[871] = ItemType.AcaciaBoat; - mappings[872] = ItemType.AcaciaChestBoat; - mappings[873] = ItemType.CherryBoat; - mappings[874] = ItemType.CherryChestBoat; - mappings[875] = ItemType.DarkOakBoat; - mappings[876] = ItemType.DarkOakChestBoat; - mappings[877] = ItemType.PaleOakBoat; - mappings[878] = ItemType.PaleOakChestBoat; - mappings[879] = ItemType.MangroveBoat; - mappings[880] = ItemType.MangroveChestBoat; - mappings[881] = ItemType.BambooRaft; - mappings[882] = ItemType.BambooChestRaft; - mappings[883] = ItemType.StructureBlock; - mappings[884] = ItemType.Jigsaw; - mappings[885] = ItemType.TestBlock; - mappings[886] = ItemType.TestInstanceBlock; - mappings[887] = ItemType.TurtleHelmet; - mappings[888] = ItemType.TurtleScute; - mappings[889] = ItemType.ArmadilloScute; - mappings[890] = ItemType.WolfArmor; - mappings[891] = ItemType.FlintAndSteel; - mappings[892] = ItemType.Bowl; - mappings[893] = ItemType.Apple; - mappings[894] = ItemType.Bow; - mappings[895] = ItemType.Arrow; - mappings[896] = ItemType.Coal; - mappings[897] = ItemType.Charcoal; - mappings[898] = ItemType.Diamond; - mappings[899] = ItemType.Emerald; - mappings[900] = ItemType.LapisLazuli; - mappings[901] = ItemType.Quartz; - mappings[902] = ItemType.AmethystShard; - mappings[903] = ItemType.RawIron; - mappings[904] = ItemType.IronIngot; - mappings[905] = ItemType.RawCopper; - mappings[906] = ItemType.CopperIngot; - mappings[907] = ItemType.RawGold; - mappings[908] = ItemType.GoldIngot; - mappings[909] = ItemType.NetheriteIngot; - mappings[910] = ItemType.NetheriteScrap; - mappings[911] = ItemType.WoodenSword; - mappings[912] = ItemType.WoodenShovel; - mappings[913] = ItemType.WoodenPickaxe; - mappings[914] = ItemType.WoodenAxe; - mappings[915] = ItemType.WoodenHoe; - mappings[916] = ItemType.CopperSword; - mappings[917] = ItemType.CopperShovel; - mappings[918] = ItemType.CopperPickaxe; - mappings[919] = ItemType.CopperAxe; - mappings[920] = ItemType.CopperHoe; - mappings[921] = ItemType.StoneSword; - mappings[922] = ItemType.StoneShovel; - mappings[923] = ItemType.StonePickaxe; - mappings[924] = ItemType.StoneAxe; - mappings[925] = ItemType.StoneHoe; - mappings[926] = ItemType.GoldenSword; - mappings[927] = ItemType.GoldenShovel; - mappings[928] = ItemType.GoldenPickaxe; - mappings[929] = ItemType.GoldenAxe; - mappings[930] = ItemType.GoldenHoe; - mappings[931] = ItemType.IronSword; - mappings[932] = ItemType.IronShovel; - mappings[933] = ItemType.IronPickaxe; - mappings[934] = ItemType.IronAxe; - mappings[935] = ItemType.IronHoe; - mappings[936] = ItemType.DiamondSword; - mappings[937] = ItemType.DiamondShovel; - mappings[938] = ItemType.DiamondPickaxe; - mappings[939] = ItemType.DiamondAxe; - mappings[940] = ItemType.DiamondHoe; - mappings[941] = ItemType.NetheriteSword; - mappings[942] = ItemType.NetheriteShovel; - mappings[943] = ItemType.NetheritePickaxe; - mappings[944] = ItemType.NetheriteAxe; - mappings[945] = ItemType.NetheriteHoe; - mappings[946] = ItemType.Stick; - mappings[947] = ItemType.MushroomStew; - mappings[948] = ItemType.String; - mappings[949] = ItemType.Feather; - mappings[950] = ItemType.Gunpowder; - mappings[951] = ItemType.WheatSeeds; - mappings[952] = ItemType.Wheat; - mappings[953] = ItemType.Bread; - mappings[954] = ItemType.LeatherHelmet; - mappings[955] = ItemType.LeatherChestplate; - mappings[956] = ItemType.LeatherLeggings; - mappings[957] = ItemType.LeatherBoots; - mappings[958] = ItemType.CopperHelmet; - mappings[959] = ItemType.CopperChestplate; - mappings[960] = ItemType.CopperLeggings; - mappings[961] = ItemType.CopperBoots; - mappings[962] = ItemType.ChainmailHelmet; - mappings[963] = ItemType.ChainmailChestplate; - mappings[964] = ItemType.ChainmailLeggings; - mappings[965] = ItemType.ChainmailBoots; - mappings[966] = ItemType.IronHelmet; - mappings[967] = ItemType.IronChestplate; - mappings[968] = ItemType.IronLeggings; - mappings[969] = ItemType.IronBoots; - mappings[970] = ItemType.DiamondHelmet; - mappings[971] = ItemType.DiamondChestplate; - mappings[972] = ItemType.DiamondLeggings; - mappings[973] = ItemType.DiamondBoots; - mappings[974] = ItemType.GoldenHelmet; - mappings[975] = ItemType.GoldenChestplate; - mappings[976] = ItemType.GoldenLeggings; - mappings[977] = ItemType.GoldenBoots; - mappings[978] = ItemType.NetheriteHelmet; - mappings[979] = ItemType.NetheriteChestplate; - mappings[980] = ItemType.NetheriteLeggings; - mappings[981] = ItemType.NetheriteBoots; - mappings[982] = ItemType.Flint; - mappings[983] = ItemType.Porkchop; - mappings[984] = ItemType.CookedPorkchop; - mappings[985] = ItemType.Painting; - mappings[986] = ItemType.GoldenApple; - mappings[987] = ItemType.EnchantedGoldenApple; - mappings[988] = ItemType.OakSign; - mappings[989] = ItemType.SpruceSign; - mappings[990] = ItemType.BirchSign; - mappings[991] = ItemType.JungleSign; - mappings[992] = ItemType.AcaciaSign; - mappings[993] = ItemType.CherrySign; - mappings[994] = ItemType.DarkOakSign; - mappings[995] = ItemType.PaleOakSign; - mappings[996] = ItemType.MangroveSign; - mappings[997] = ItemType.BambooSign; - mappings[998] = ItemType.CrimsonSign; - mappings[999] = ItemType.WarpedSign; - mappings[1000] = ItemType.OakHangingSign; - mappings[1001] = ItemType.SpruceHangingSign; - mappings[1002] = ItemType.BirchHangingSign; - mappings[1003] = ItemType.JungleHangingSign; - mappings[1004] = ItemType.AcaciaHangingSign; - mappings[1005] = ItemType.CherryHangingSign; - mappings[1006] = ItemType.DarkOakHangingSign; - mappings[1007] = ItemType.PaleOakHangingSign; - mappings[1008] = ItemType.MangroveHangingSign; - mappings[1009] = ItemType.BambooHangingSign; - mappings[1010] = ItemType.CrimsonHangingSign; - mappings[1011] = ItemType.WarpedHangingSign; - mappings[1012] = ItemType.Bucket; - mappings[1013] = ItemType.WaterBucket; - mappings[1014] = ItemType.LavaBucket; - mappings[1015] = ItemType.PowderSnowBucket; - mappings[1016] = ItemType.Snowball; - mappings[1017] = ItemType.Leather; - mappings[1018] = ItemType.MilkBucket; - mappings[1019] = ItemType.PufferfishBucket; - mappings[1020] = ItemType.SalmonBucket; - mappings[1021] = ItemType.CodBucket; - mappings[1022] = ItemType.TropicalFishBucket; - mappings[1023] = ItemType.AxolotlBucket; - mappings[1024] = ItemType.TadpoleBucket; - mappings[1025] = ItemType.Brick; - mappings[1026] = ItemType.ClayBall; - mappings[1027] = ItemType.DriedKelpBlock; - mappings[1028] = ItemType.Paper; - mappings[1029] = ItemType.Book; - mappings[1030] = ItemType.SlimeBall; - mappings[1031] = ItemType.Egg; - mappings[1032] = ItemType.BlueEgg; - mappings[1033] = ItemType.BrownEgg; - mappings[1034] = ItemType.Compass; - mappings[1035] = ItemType.RecoveryCompass; - mappings[1036] = ItemType.Bundle; - mappings[1037] = ItemType.WhiteBundle; - mappings[1038] = ItemType.OrangeBundle; - mappings[1039] = ItemType.MagentaBundle; - mappings[1040] = ItemType.LightBlueBundle; - mappings[1041] = ItemType.YellowBundle; - mappings[1042] = ItemType.LimeBundle; - mappings[1043] = ItemType.PinkBundle; - mappings[1044] = ItemType.GrayBundle; - mappings[1045] = ItemType.LightGrayBundle; - mappings[1046] = ItemType.CyanBundle; - mappings[1047] = ItemType.PurpleBundle; - mappings[1048] = ItemType.BlueBundle; - mappings[1049] = ItemType.BrownBundle; - mappings[1050] = ItemType.GreenBundle; - mappings[1051] = ItemType.RedBundle; - mappings[1052] = ItemType.BlackBundle; - mappings[1053] = ItemType.FishingRod; - mappings[1054] = ItemType.Clock; - mappings[1055] = ItemType.Spyglass; - mappings[1056] = ItemType.GlowstoneDust; - mappings[1057] = ItemType.Cod; - mappings[1058] = ItemType.Salmon; - mappings[1059] = ItemType.TropicalFish; - mappings[1060] = ItemType.Pufferfish; - mappings[1061] = ItemType.CookedCod; - mappings[1062] = ItemType.CookedSalmon; - mappings[1063] = ItemType.InkSac; - mappings[1064] = ItemType.GlowInkSac; - mappings[1065] = ItemType.CocoaBeans; - mappings[1066] = ItemType.WhiteDye; - mappings[1067] = ItemType.OrangeDye; - mappings[1068] = ItemType.MagentaDye; - mappings[1069] = ItemType.LightBlueDye; - mappings[1070] = ItemType.YellowDye; - mappings[1071] = ItemType.LimeDye; - mappings[1072] = ItemType.PinkDye; - mappings[1073] = ItemType.GrayDye; - mappings[1074] = ItemType.LightGrayDye; - mappings[1075] = ItemType.CyanDye; - mappings[1076] = ItemType.PurpleDye; - mappings[1077] = ItemType.BlueDye; - mappings[1078] = ItemType.BrownDye; - mappings[1079] = ItemType.GreenDye; - mappings[1080] = ItemType.RedDye; - mappings[1081] = ItemType.BlackDye; - mappings[1082] = ItemType.BoneMeal; - mappings[1083] = ItemType.Bone; - mappings[1084] = ItemType.Sugar; - mappings[1085] = ItemType.Cake; - mappings[1086] = ItemType.WhiteBed; - mappings[1087] = ItemType.OrangeBed; - mappings[1088] = ItemType.MagentaBed; - mappings[1089] = ItemType.LightBlueBed; - mappings[1090] = ItemType.YellowBed; - mappings[1091] = ItemType.LimeBed; - mappings[1092] = ItemType.PinkBed; - mappings[1093] = ItemType.GrayBed; - mappings[1094] = ItemType.LightGrayBed; - mappings[1095] = ItemType.CyanBed; - mappings[1096] = ItemType.PurpleBed; - mappings[1097] = ItemType.BlueBed; - mappings[1098] = ItemType.BrownBed; - mappings[1099] = ItemType.GreenBed; - mappings[1100] = ItemType.RedBed; - mappings[1101] = ItemType.BlackBed; - mappings[1102] = ItemType.Cookie; - mappings[1103] = ItemType.Crafter; - mappings[1104] = ItemType.FilledMap; - mappings[1105] = ItemType.Shears; - mappings[1106] = ItemType.MelonSlice; - mappings[1107] = ItemType.DriedKelp; - mappings[1108] = ItemType.PumpkinSeeds; - mappings[1109] = ItemType.MelonSeeds; - mappings[1110] = ItemType.Beef; - mappings[1111] = ItemType.CookedBeef; - mappings[1112] = ItemType.Chicken; - mappings[1113] = ItemType.CookedChicken; - mappings[1114] = ItemType.RottenFlesh; - mappings[1115] = ItemType.EnderPearl; - mappings[1116] = ItemType.BlazeRod; - mappings[1117] = ItemType.GhastTear; - mappings[1118] = ItemType.GoldNugget; - mappings[1119] = ItemType.NetherWart; - mappings[1120] = ItemType.GlassBottle; - mappings[1121] = ItemType.Potion; - mappings[1122] = ItemType.SpiderEye; - mappings[1123] = ItemType.FermentedSpiderEye; - mappings[1124] = ItemType.BlazePowder; - mappings[1125] = ItemType.MagmaCream; - mappings[1126] = ItemType.BrewingStand; - mappings[1127] = ItemType.Cauldron; - mappings[1128] = ItemType.EnderEye; - mappings[1129] = ItemType.GlisteringMelonSlice; - mappings[1130] = ItemType.ChickenSpawnEgg; - mappings[1131] = ItemType.CowSpawnEgg; - mappings[1132] = ItemType.PigSpawnEgg; - mappings[1133] = ItemType.SheepSpawnEgg; - mappings[1134] = ItemType.CamelSpawnEgg; - mappings[1135] = ItemType.DonkeySpawnEgg; - mappings[1136] = ItemType.HorseSpawnEgg; - mappings[1137] = ItemType.MuleSpawnEgg; - mappings[1138] = ItemType.CatSpawnEgg; - mappings[1139] = ItemType.ParrotSpawnEgg; - mappings[1140] = ItemType.WolfSpawnEgg; - mappings[1141] = ItemType.ArmadilloSpawnEgg; - mappings[1142] = ItemType.BatSpawnEgg; - mappings[1143] = ItemType.BeeSpawnEgg; - mappings[1144] = ItemType.FoxSpawnEgg; - mappings[1145] = ItemType.GoatSpawnEgg; - mappings[1146] = ItemType.LlamaSpawnEgg; - mappings[1147] = ItemType.OcelotSpawnEgg; - mappings[1148] = ItemType.PandaSpawnEgg; - mappings[1149] = ItemType.PolarBearSpawnEgg; - mappings[1150] = ItemType.RabbitSpawnEgg; - mappings[1151] = ItemType.AxolotlSpawnEgg; - mappings[1152] = ItemType.CodSpawnEgg; - mappings[1153] = ItemType.DolphinSpawnEgg; - mappings[1154] = ItemType.FrogSpawnEgg; - mappings[1155] = ItemType.GlowSquidSpawnEgg; - mappings[1156] = ItemType.NautilusSpawnEgg; - mappings[1157] = ItemType.PufferfishSpawnEgg; - mappings[1158] = ItemType.SalmonSpawnEgg; - mappings[1159] = ItemType.SquidSpawnEgg; - mappings[1160] = ItemType.TadpoleSpawnEgg; - mappings[1161] = ItemType.TropicalFishSpawnEgg; - mappings[1162] = ItemType.TurtleSpawnEgg; - mappings[1163] = ItemType.AllaySpawnEgg; - mappings[1164] = ItemType.MooshroomSpawnEgg; - mappings[1165] = ItemType.SnifferSpawnEgg; - mappings[1166] = ItemType.CopperGolemSpawnEgg; - mappings[1167] = ItemType.IronGolemSpawnEgg; - mappings[1168] = ItemType.SnowGolemSpawnEgg; - mappings[1169] = ItemType.TraderLlamaSpawnEgg; - mappings[1170] = ItemType.VillagerSpawnEgg; - mappings[1171] = ItemType.WanderingTraderSpawnEgg; - mappings[1172] = ItemType.BoggedSpawnEgg; - mappings[1173] = ItemType.CamelHuskSpawnEgg; - mappings[1174] = ItemType.DrownedSpawnEgg; - mappings[1175] = ItemType.HuskSpawnEgg; - mappings[1176] = ItemType.ParchedSpawnEgg; - mappings[1177] = ItemType.SkeletonSpawnEgg; - mappings[1178] = ItemType.SkeletonHorseSpawnEgg; - mappings[1179] = ItemType.StraySpawnEgg; - mappings[1180] = ItemType.WitherSpawnEgg; - mappings[1181] = ItemType.WitherSkeletonSpawnEgg; - mappings[1182] = ItemType.ZombieSpawnEgg; - mappings[1183] = ItemType.ZombieHorseSpawnEgg; - mappings[1184] = ItemType.ZombieNautilusSpawnEgg; - mappings[1185] = ItemType.ZombieVillagerSpawnEgg; - mappings[1186] = ItemType.CaveSpiderSpawnEgg; - mappings[1187] = ItemType.SpiderSpawnEgg; - mappings[1188] = ItemType.BreezeSpawnEgg; - mappings[1189] = ItemType.CreakingSpawnEgg; - mappings[1190] = ItemType.CreeperSpawnEgg; - mappings[1191] = ItemType.ElderGuardianSpawnEgg; - mappings[1192] = ItemType.GuardianSpawnEgg; - mappings[1193] = ItemType.PhantomSpawnEgg; - mappings[1194] = ItemType.SilverfishSpawnEgg; - mappings[1195] = ItemType.SlimeSpawnEgg; - mappings[1196] = ItemType.WardenSpawnEgg; - mappings[1197] = ItemType.WitchSpawnEgg; - mappings[1198] = ItemType.EvokerSpawnEgg; - mappings[1199] = ItemType.PillagerSpawnEgg; - mappings[1200] = ItemType.RavagerSpawnEgg; - mappings[1201] = ItemType.VindicatorSpawnEgg; - mappings[1202] = ItemType.VexSpawnEgg; - mappings[1203] = ItemType.BlazeSpawnEgg; - mappings[1204] = ItemType.GhastSpawnEgg; - mappings[1205] = ItemType.HappyGhastSpawnEgg; - mappings[1206] = ItemType.HoglinSpawnEgg; - mappings[1207] = ItemType.MagmaCubeSpawnEgg; - mappings[1208] = ItemType.PiglinSpawnEgg; - mappings[1209] = ItemType.PiglinBruteSpawnEgg; - mappings[1210] = ItemType.StriderSpawnEgg; - mappings[1211] = ItemType.ZoglinSpawnEgg; - mappings[1212] = ItemType.ZombifiedPiglinSpawnEgg; - mappings[1213] = ItemType.EnderDragonSpawnEgg; - mappings[1214] = ItemType.EndermanSpawnEgg; - mappings[1215] = ItemType.EndermiteSpawnEgg; - mappings[1216] = ItemType.ShulkerSpawnEgg; - mappings[1217] = ItemType.ExperienceBottle; - mappings[1218] = ItemType.FireCharge; - mappings[1219] = ItemType.WindCharge; - mappings[1220] = ItemType.WritableBook; - mappings[1221] = ItemType.WrittenBook; - mappings[1222] = ItemType.BreezeRod; - mappings[1223] = ItemType.Mace; - mappings[1224] = ItemType.ItemFrame; - mappings[1225] = ItemType.GlowItemFrame; - mappings[1226] = ItemType.FlowerPot; - mappings[1227] = ItemType.Carrot; - mappings[1228] = ItemType.Potato; - mappings[1229] = ItemType.BakedPotato; - mappings[1230] = ItemType.PoisonousPotato; - mappings[1231] = ItemType.Map; - mappings[1232] = ItemType.GoldenCarrot; - mappings[1233] = ItemType.SkeletonSkull; - mappings[1234] = ItemType.WitherSkeletonSkull; - mappings[1235] = ItemType.PlayerHead; - mappings[1236] = ItemType.ZombieHead; - mappings[1237] = ItemType.CreeperHead; - mappings[1238] = ItemType.DragonHead; - mappings[1239] = ItemType.PiglinHead; - mappings[1240] = ItemType.NetherStar; - mappings[1241] = ItemType.PumpkinPie; - mappings[1242] = ItemType.FireworkRocket; - mappings[1243] = ItemType.FireworkStar; - mappings[1244] = ItemType.EnchantedBook; - mappings[1245] = ItemType.NetherBrick; - mappings[1246] = ItemType.ResinBrick; - mappings[1247] = ItemType.PrismarineShard; - mappings[1248] = ItemType.PrismarineCrystals; - mappings[1249] = ItemType.Rabbit; - mappings[1250] = ItemType.CookedRabbit; - mappings[1251] = ItemType.RabbitStew; - mappings[1252] = ItemType.RabbitFoot; - mappings[1253] = ItemType.RabbitHide; - mappings[1254] = ItemType.ArmorStand; - mappings[1255] = ItemType.CopperHorseArmor; - mappings[1256] = ItemType.IronHorseArmor; - mappings[1257] = ItemType.GoldenHorseArmor; - mappings[1258] = ItemType.DiamondHorseArmor; - mappings[1259] = ItemType.NetheriteHorseArmor; - mappings[1260] = ItemType.LeatherHorseArmor; - mappings[1261] = ItemType.Lead; - mappings[1262] = ItemType.NameTag; - mappings[1263] = ItemType.CommandBlockMinecart; - mappings[1264] = ItemType.Mutton; - mappings[1265] = ItemType.CookedMutton; - mappings[1266] = ItemType.WhiteBanner; - mappings[1267] = ItemType.OrangeBanner; - mappings[1268] = ItemType.MagentaBanner; - mappings[1269] = ItemType.LightBlueBanner; - mappings[1270] = ItemType.YellowBanner; - mappings[1271] = ItemType.LimeBanner; - mappings[1272] = ItemType.PinkBanner; - mappings[1273] = ItemType.GrayBanner; - mappings[1274] = ItemType.LightGrayBanner; - mappings[1275] = ItemType.CyanBanner; - mappings[1276] = ItemType.PurpleBanner; - mappings[1277] = ItemType.BlueBanner; - mappings[1278] = ItemType.BrownBanner; - mappings[1279] = ItemType.GreenBanner; - mappings[1280] = ItemType.RedBanner; - mappings[1281] = ItemType.BlackBanner; - mappings[1282] = ItemType.EndCrystal; - mappings[1283] = ItemType.ChorusFruit; - mappings[1284] = ItemType.PoppedChorusFruit; - mappings[1285] = ItemType.TorchflowerSeeds; - mappings[1286] = ItemType.PitcherPod; - mappings[1287] = ItemType.Beetroot; - mappings[1288] = ItemType.BeetrootSeeds; - mappings[1289] = ItemType.BeetrootSoup; - mappings[1290] = ItemType.DragonBreath; - mappings[1291] = ItemType.SplashPotion; - mappings[1292] = ItemType.SpectralArrow; - mappings[1293] = ItemType.TippedArrow; - mappings[1294] = ItemType.LingeringPotion; - mappings[1295] = ItemType.Shield; - mappings[1296] = ItemType.WoodenSpear; - mappings[1297] = ItemType.StoneSpear; - mappings[1298] = ItemType.CopperSpear; - mappings[1299] = ItemType.IronSpear; - mappings[1300] = ItemType.GoldenSpear; - mappings[1301] = ItemType.DiamondSpear; - mappings[1302] = ItemType.NetheriteSpear; - mappings[1303] = ItemType.TotemOfUndying; - mappings[1304] = ItemType.ShulkerShell; - mappings[1305] = ItemType.IronNugget; - mappings[1306] = ItemType.CopperNugget; - mappings[1307] = ItemType.KnowledgeBook; - mappings[1308] = ItemType.DebugStick; - mappings[1309] = ItemType.MusicDisc13; - mappings[1310] = ItemType.MusicDiscCat; - mappings[1311] = ItemType.MusicDiscBlocks; - mappings[1312] = ItemType.MusicDiscChirp; - mappings[1313] = ItemType.MusicDiscCreator; - mappings[1314] = ItemType.MusicDiscCreatorMusicBox; - mappings[1315] = ItemType.MusicDiscFar; - mappings[1316] = ItemType.MusicDiscLavaChicken; - mappings[1317] = ItemType.MusicDiscMall; - mappings[1318] = ItemType.MusicDiscMellohi; - mappings[1319] = ItemType.MusicDiscStal; - mappings[1320] = ItemType.MusicDiscStrad; - mappings[1321] = ItemType.MusicDiscWard; - mappings[1322] = ItemType.MusicDisc11; - mappings[1323] = ItemType.MusicDiscWait; - mappings[1324] = ItemType.MusicDiscOtherside; - mappings[1325] = ItemType.MusicDiscRelic; - mappings[1326] = ItemType.MusicDisc5; - mappings[1327] = ItemType.MusicDiscPigstep; - mappings[1328] = ItemType.MusicDiscPrecipice; - mappings[1329] = ItemType.MusicDiscTears; - mappings[1330] = ItemType.DiscFragment5; - mappings[1331] = ItemType.Trident; - mappings[1332] = ItemType.NautilusShell; - mappings[1333] = ItemType.IronNautilusArmor; - mappings[1334] = ItemType.GoldenNautilusArmor; - mappings[1335] = ItemType.DiamondNautilusArmor; - mappings[1336] = ItemType.NetheriteNautilusArmor; - mappings[1337] = ItemType.CopperNautilusArmor; - mappings[1338] = ItemType.HeartOfTheSea; - mappings[1339] = ItemType.Crossbow; - mappings[1340] = ItemType.SuspiciousStew; - mappings[1341] = ItemType.Loom; - mappings[1342] = ItemType.FlowerBannerPattern; - mappings[1343] = ItemType.CreeperBannerPattern; - mappings[1344] = ItemType.SkullBannerPattern; - mappings[1345] = ItemType.MojangBannerPattern; - mappings[1346] = ItemType.GlobeBannerPattern; - mappings[1347] = ItemType.PiglinBannerPattern; - mappings[1348] = ItemType.FlowBannerPattern; - mappings[1349] = ItemType.GusterBannerPattern; - mappings[1350] = ItemType.FieldMasonedBannerPattern; - mappings[1351] = ItemType.BordureIndentedBannerPattern; - mappings[1352] = ItemType.GoatHorn; - mappings[1353] = ItemType.Composter; - mappings[1354] = ItemType.Barrel; - mappings[1355] = ItemType.Smoker; - mappings[1356] = ItemType.BlastFurnace; - mappings[1357] = ItemType.CartographyTable; - mappings[1358] = ItemType.FletchingTable; - mappings[1359] = ItemType.Grindstone; - mappings[1360] = ItemType.SmithingTable; - mappings[1361] = ItemType.Stonecutter; - mappings[1362] = ItemType.Bell; - mappings[1363] = ItemType.Lantern; - mappings[1364] = ItemType.SoulLantern; - mappings[1365] = ItemType.CopperLantern; - mappings[1366] = ItemType.ExposedCopperLantern; - mappings[1367] = ItemType.WeatheredCopperLantern; - mappings[1368] = ItemType.OxidizedCopperLantern; - mappings[1369] = ItemType.WaxedCopperLantern; - mappings[1370] = ItemType.WaxedExposedCopperLantern; - mappings[1371] = ItemType.WaxedWeatheredCopperLantern; - mappings[1372] = ItemType.WaxedOxidizedCopperLantern; - mappings[1373] = ItemType.SweetBerries; - mappings[1374] = ItemType.GlowBerries; - mappings[1375] = ItemType.Campfire; - mappings[1376] = ItemType.SoulCampfire; - mappings[1377] = ItemType.Shroomlight; - mappings[1378] = ItemType.Honeycomb; - mappings[1379] = ItemType.BeeNest; - mappings[1380] = ItemType.Beehive; - mappings[1381] = ItemType.HoneyBottle; - mappings[1382] = ItemType.HoneycombBlock; - mappings[1383] = ItemType.Lodestone; - mappings[1384] = ItemType.CryingObsidian; - mappings[1385] = ItemType.Blackstone; - mappings[1386] = ItemType.BlackstoneSlab; - mappings[1387] = ItemType.BlackstoneStairs; - mappings[1388] = ItemType.GildedBlackstone; - mappings[1389] = ItemType.PolishedBlackstone; - mappings[1390] = ItemType.PolishedBlackstoneSlab; - mappings[1391] = ItemType.PolishedBlackstoneStairs; - mappings[1392] = ItemType.ChiseledPolishedBlackstone; - mappings[1393] = ItemType.PolishedBlackstoneBricks; - mappings[1394] = ItemType.PolishedBlackstoneBrickSlab; - mappings[1395] = ItemType.PolishedBlackstoneBrickStairs; - mappings[1396] = ItemType.CrackedPolishedBlackstoneBricks; - mappings[1397] = ItemType.RespawnAnchor; - mappings[1398] = ItemType.Candle; - mappings[1399] = ItemType.WhiteCandle; - mappings[1400] = ItemType.OrangeCandle; - mappings[1401] = ItemType.MagentaCandle; - mappings[1402] = ItemType.LightBlueCandle; - mappings[1403] = ItemType.YellowCandle; - mappings[1404] = ItemType.LimeCandle; - mappings[1405] = ItemType.PinkCandle; - mappings[1406] = ItemType.GrayCandle; - mappings[1407] = ItemType.LightGrayCandle; - mappings[1408] = ItemType.CyanCandle; - mappings[1409] = ItemType.PurpleCandle; - mappings[1410] = ItemType.BlueCandle; - mappings[1411] = ItemType.BrownCandle; - mappings[1412] = ItemType.GreenCandle; - mappings[1413] = ItemType.RedCandle; - mappings[1414] = ItemType.BlackCandle; - mappings[1415] = ItemType.SmallAmethystBud; - mappings[1416] = ItemType.MediumAmethystBud; - mappings[1417] = ItemType.LargeAmethystBud; - mappings[1418] = ItemType.AmethystCluster; - mappings[1419] = ItemType.PointedDripstone; - mappings[1420] = ItemType.OchreFroglight; - mappings[1421] = ItemType.VerdantFroglight; - mappings[1422] = ItemType.PearlescentFroglight; - mappings[1423] = ItemType.Frogspawn; - mappings[1424] = ItemType.EchoShard; - mappings[1425] = ItemType.Brush; - mappings[1426] = ItemType.NetheriteUpgradeSmithingTemplate; - mappings[1427] = ItemType.SentryArmorTrimSmithingTemplate; - mappings[1428] = ItemType.DuneArmorTrimSmithingTemplate; - mappings[1429] = ItemType.CoastArmorTrimSmithingTemplate; - mappings[1430] = ItemType.WildArmorTrimSmithingTemplate; - mappings[1431] = ItemType.WardArmorTrimSmithingTemplate; - mappings[1432] = ItemType.EyeArmorTrimSmithingTemplate; - mappings[1433] = ItemType.VexArmorTrimSmithingTemplate; - mappings[1434] = ItemType.TideArmorTrimSmithingTemplate; - mappings[1435] = ItemType.SnoutArmorTrimSmithingTemplate; - mappings[1436] = ItemType.RibArmorTrimSmithingTemplate; - mappings[1437] = ItemType.SpireArmorTrimSmithingTemplate; - mappings[1438] = ItemType.WayfinderArmorTrimSmithingTemplate; - mappings[1439] = ItemType.ShaperArmorTrimSmithingTemplate; - mappings[1440] = ItemType.SilenceArmorTrimSmithingTemplate; - mappings[1441] = ItemType.RaiserArmorTrimSmithingTemplate; - mappings[1442] = ItemType.HostArmorTrimSmithingTemplate; - mappings[1443] = ItemType.FlowArmorTrimSmithingTemplate; - mappings[1444] = ItemType.BoltArmorTrimSmithingTemplate; - mappings[1445] = ItemType.AnglerPotterySherd; - mappings[1446] = ItemType.ArcherPotterySherd; - mappings[1447] = ItemType.ArmsUpPotterySherd; - mappings[1448] = ItemType.BladePotterySherd; - mappings[1449] = ItemType.BrewerPotterySherd; - mappings[1450] = ItemType.BurnPotterySherd; - mappings[1451] = ItemType.DangerPotterySherd; - mappings[1452] = ItemType.ExplorerPotterySherd; - mappings[1453] = ItemType.FlowPotterySherd; - mappings[1454] = ItemType.FriendPotterySherd; - mappings[1455] = ItemType.GusterPotterySherd; - mappings[1456] = ItemType.HeartPotterySherd; - mappings[1457] = ItemType.HeartbreakPotterySherd; - mappings[1458] = ItemType.HowlPotterySherd; - mappings[1459] = ItemType.MinerPotterySherd; - mappings[1460] = ItemType.MournerPotterySherd; - mappings[1461] = ItemType.PlentyPotterySherd; - mappings[1462] = ItemType.PrizePotterySherd; - mappings[1463] = ItemType.ScrapePotterySherd; - mappings[1464] = ItemType.SheafPotterySherd; - mappings[1465] = ItemType.ShelterPotterySherd; - mappings[1466] = ItemType.SkullPotterySherd; - mappings[1467] = ItemType.SnortPotterySherd; - mappings[1468] = ItemType.CopperGrate; - mappings[1469] = ItemType.ExposedCopperGrate; - mappings[1470] = ItemType.WeatheredCopperGrate; - mappings[1471] = ItemType.OxidizedCopperGrate; - mappings[1472] = ItemType.WaxedCopperGrate; - mappings[1473] = ItemType.WaxedExposedCopperGrate; - mappings[1474] = ItemType.WaxedWeatheredCopperGrate; - mappings[1475] = ItemType.WaxedOxidizedCopperGrate; - mappings[1476] = ItemType.CopperBulb; - mappings[1477] = ItemType.ExposedCopperBulb; - mappings[1478] = ItemType.WeatheredCopperBulb; - mappings[1479] = ItemType.OxidizedCopperBulb; - mappings[1480] = ItemType.WaxedCopperBulb; - mappings[1481] = ItemType.WaxedExposedCopperBulb; - mappings[1482] = ItemType.WaxedWeatheredCopperBulb; - mappings[1483] = ItemType.WaxedOxidizedCopperBulb; - mappings[1484] = ItemType.CopperChest; - mappings[1485] = ItemType.ExposedCopperChest; - mappings[1486] = ItemType.WeatheredCopperChest; - mappings[1487] = ItemType.OxidizedCopperChest; - mappings[1488] = ItemType.WaxedCopperChest; - mappings[1489] = ItemType.WaxedExposedCopperChest; - mappings[1490] = ItemType.WaxedWeatheredCopperChest; - mappings[1491] = ItemType.WaxedOxidizedCopperChest; - mappings[1492] = ItemType.CopperGolemStatue; - mappings[1493] = ItemType.ExposedCopperGolemStatue; - mappings[1494] = ItemType.WeatheredCopperGolemStatue; - mappings[1495] = ItemType.OxidizedCopperGolemStatue; - mappings[1496] = ItemType.WaxedCopperGolemStatue; - mappings[1497] = ItemType.WaxedExposedCopperGolemStatue; - mappings[1498] = ItemType.WaxedWeatheredCopperGolemStatue; - mappings[1499] = ItemType.WaxedOxidizedCopperGolemStatue; - mappings[1500] = ItemType.TrialSpawner; - mappings[1501] = ItemType.TrialKey; - mappings[1502] = ItemType.OminousTrialKey; - mappings[1503] = ItemType.Vault; - mappings[1504] = ItemType.OminousBottle; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1212.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette1212.cs deleted file mode 100644 index 42edc7fd36..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1212.cs +++ /dev/null @@ -1,1393 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public class ItemPalette1212 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette1212() - { - mappings[0] = ItemType.Air; - mappings[1] = ItemType.Stone; - mappings[2] = ItemType.Granite; - mappings[3] = ItemType.PolishedGranite; - mappings[4] = ItemType.Diorite; - mappings[5] = ItemType.PolishedDiorite; - mappings[6] = ItemType.Andesite; - mappings[7] = ItemType.PolishedAndesite; - mappings[8] = ItemType.Deepslate; - mappings[9] = ItemType.CobbledDeepslate; - mappings[10] = ItemType.PolishedDeepslate; - mappings[11] = ItemType.Calcite; - mappings[12] = ItemType.Tuff; - mappings[13] = ItemType.TuffSlab; - mappings[14] = ItemType.TuffStairs; - mappings[15] = ItemType.TuffWall; - mappings[16] = ItemType.ChiseledTuff; - mappings[17] = ItemType.PolishedTuff; - mappings[18] = ItemType.PolishedTuffSlab; - mappings[19] = ItemType.PolishedTuffStairs; - mappings[20] = ItemType.PolishedTuffWall; - mappings[21] = ItemType.TuffBricks; - mappings[22] = ItemType.TuffBrickSlab; - mappings[23] = ItemType.TuffBrickStairs; - mappings[24] = ItemType.TuffBrickWall; - mappings[25] = ItemType.ChiseledTuffBricks; - mappings[26] = ItemType.DripstoneBlock; - mappings[27] = ItemType.GrassBlock; - mappings[28] = ItemType.Dirt; - mappings[29] = ItemType.CoarseDirt; - mappings[30] = ItemType.Podzol; - mappings[31] = ItemType.RootedDirt; - mappings[32] = ItemType.Mud; - mappings[33] = ItemType.CrimsonNylium; - mappings[34] = ItemType.WarpedNylium; - mappings[35] = ItemType.Cobblestone; - mappings[36] = ItemType.OakPlanks; - mappings[37] = ItemType.SprucePlanks; - mappings[38] = ItemType.BirchPlanks; - mappings[39] = ItemType.JunglePlanks; - mappings[40] = ItemType.AcaciaPlanks; - mappings[41] = ItemType.CherryPlanks; - mappings[42] = ItemType.DarkOakPlanks; - mappings[43] = ItemType.PaleOakPlanks; - mappings[44] = ItemType.MangrovePlanks; - mappings[45] = ItemType.BambooPlanks; - mappings[46] = ItemType.CrimsonPlanks; - mappings[47] = ItemType.WarpedPlanks; - mappings[48] = ItemType.BambooMosaic; - mappings[49] = ItemType.OakSapling; - mappings[50] = ItemType.SpruceSapling; - mappings[51] = ItemType.BirchSapling; - mappings[52] = ItemType.JungleSapling; - mappings[53] = ItemType.AcaciaSapling; - mappings[54] = ItemType.CherrySapling; - mappings[55] = ItemType.DarkOakSapling; - mappings[56] = ItemType.PaleOakSapling; - mappings[57] = ItemType.MangrovePropagule; - mappings[58] = ItemType.Bedrock; - mappings[59] = ItemType.Sand; - mappings[60] = ItemType.SuspiciousSand; - mappings[61] = ItemType.SuspiciousGravel; - mappings[62] = ItemType.RedSand; - mappings[63] = ItemType.Gravel; - mappings[64] = ItemType.CoalOre; - mappings[65] = ItemType.DeepslateCoalOre; - mappings[66] = ItemType.IronOre; - mappings[67] = ItemType.DeepslateIronOre; - mappings[68] = ItemType.CopperOre; - mappings[69] = ItemType.DeepslateCopperOre; - mappings[70] = ItemType.GoldOre; - mappings[71] = ItemType.DeepslateGoldOre; - mappings[72] = ItemType.RedstoneOre; - mappings[73] = ItemType.DeepslateRedstoneOre; - mappings[74] = ItemType.EmeraldOre; - mappings[75] = ItemType.DeepslateEmeraldOre; - mappings[76] = ItemType.LapisOre; - mappings[77] = ItemType.DeepslateLapisOre; - mappings[78] = ItemType.DiamondOre; - mappings[79] = ItemType.DeepslateDiamondOre; - mappings[80] = ItemType.NetherGoldOre; - mappings[81] = ItemType.NetherQuartzOre; - mappings[82] = ItemType.AncientDebris; - mappings[83] = ItemType.CoalBlock; - mappings[84] = ItemType.RawIronBlock; - mappings[85] = ItemType.RawCopperBlock; - mappings[86] = ItemType.RawGoldBlock; - mappings[87] = ItemType.HeavyCore; - mappings[88] = ItemType.AmethystBlock; - mappings[89] = ItemType.BuddingAmethyst; - mappings[90] = ItemType.IronBlock; - mappings[91] = ItemType.CopperBlock; - mappings[92] = ItemType.GoldBlock; - mappings[93] = ItemType.DiamondBlock; - mappings[94] = ItemType.NetheriteBlock; - mappings[95] = ItemType.ExposedCopper; - mappings[96] = ItemType.WeatheredCopper; - mappings[97] = ItemType.OxidizedCopper; - mappings[98] = ItemType.ChiseledCopper; - mappings[99] = ItemType.ExposedChiseledCopper; - mappings[100] = ItemType.WeatheredChiseledCopper; - mappings[101] = ItemType.OxidizedChiseledCopper; - mappings[102] = ItemType.CutCopper; - mappings[103] = ItemType.ExposedCutCopper; - mappings[104] = ItemType.WeatheredCutCopper; - mappings[105] = ItemType.OxidizedCutCopper; - mappings[106] = ItemType.CutCopperStairs; - mappings[107] = ItemType.ExposedCutCopperStairs; - mappings[108] = ItemType.WeatheredCutCopperStairs; - mappings[109] = ItemType.OxidizedCutCopperStairs; - mappings[110] = ItemType.CutCopperSlab; - mappings[111] = ItemType.ExposedCutCopperSlab; - mappings[112] = ItemType.WeatheredCutCopperSlab; - mappings[113] = ItemType.OxidizedCutCopperSlab; - mappings[114] = ItemType.WaxedCopperBlock; - mappings[115] = ItemType.WaxedExposedCopper; - mappings[116] = ItemType.WaxedWeatheredCopper; - mappings[117] = ItemType.WaxedOxidizedCopper; - mappings[118] = ItemType.WaxedChiseledCopper; - mappings[119] = ItemType.WaxedExposedChiseledCopper; - mappings[120] = ItemType.WaxedWeatheredChiseledCopper; - mappings[121] = ItemType.WaxedOxidizedChiseledCopper; - mappings[122] = ItemType.WaxedCutCopper; - mappings[123] = ItemType.WaxedExposedCutCopper; - mappings[124] = ItemType.WaxedWeatheredCutCopper; - mappings[125] = ItemType.WaxedOxidizedCutCopper; - mappings[126] = ItemType.WaxedCutCopperStairs; - mappings[127] = ItemType.WaxedExposedCutCopperStairs; - mappings[128] = ItemType.WaxedWeatheredCutCopperStairs; - mappings[129] = ItemType.WaxedOxidizedCutCopperStairs; - mappings[130] = ItemType.WaxedCutCopperSlab; - mappings[131] = ItemType.WaxedExposedCutCopperSlab; - mappings[132] = ItemType.WaxedWeatheredCutCopperSlab; - mappings[133] = ItemType.WaxedOxidizedCutCopperSlab; - mappings[134] = ItemType.OakLog; - mappings[135] = ItemType.SpruceLog; - mappings[136] = ItemType.BirchLog; - mappings[137] = ItemType.JungleLog; - mappings[138] = ItemType.AcaciaLog; - mappings[139] = ItemType.CherryLog; - mappings[140] = ItemType.PaleOakLog; - mappings[141] = ItemType.DarkOakLog; - mappings[142] = ItemType.MangroveLog; - mappings[143] = ItemType.MangroveRoots; - mappings[144] = ItemType.MuddyMangroveRoots; - mappings[145] = ItemType.CrimsonStem; - mappings[146] = ItemType.WarpedStem; - mappings[147] = ItemType.BambooBlock; - mappings[148] = ItemType.StrippedOakLog; - mappings[149] = ItemType.StrippedSpruceLog; - mappings[150] = ItemType.StrippedBirchLog; - mappings[151] = ItemType.StrippedJungleLog; - mappings[152] = ItemType.StrippedAcaciaLog; - mappings[153] = ItemType.StrippedCherryLog; - mappings[154] = ItemType.StrippedDarkOakLog; - mappings[155] = ItemType.StrippedPaleOakLog; - mappings[156] = ItemType.StrippedMangroveLog; - mappings[157] = ItemType.StrippedCrimsonStem; - mappings[158] = ItemType.StrippedWarpedStem; - mappings[159] = ItemType.StrippedOakWood; - mappings[160] = ItemType.StrippedSpruceWood; - mappings[161] = ItemType.StrippedBirchWood; - mappings[162] = ItemType.StrippedJungleWood; - mappings[163] = ItemType.StrippedAcaciaWood; - mappings[164] = ItemType.StrippedCherryWood; - mappings[165] = ItemType.StrippedDarkOakWood; - mappings[166] = ItemType.StrippedPaleOakWood; - mappings[167] = ItemType.StrippedMangroveWood; - mappings[168] = ItemType.StrippedCrimsonHyphae; - mappings[169] = ItemType.StrippedWarpedHyphae; - mappings[170] = ItemType.StrippedBambooBlock; - mappings[171] = ItemType.OakWood; - mappings[172] = ItemType.SpruceWood; - mappings[173] = ItemType.BirchWood; - mappings[174] = ItemType.JungleWood; - mappings[175] = ItemType.AcaciaWood; - mappings[176] = ItemType.CherryWood; - mappings[177] = ItemType.PaleOakWood; - mappings[178] = ItemType.DarkOakWood; - mappings[179] = ItemType.MangroveWood; - mappings[180] = ItemType.CrimsonHyphae; - mappings[181] = ItemType.WarpedHyphae; - mappings[182] = ItemType.OakLeaves; - mappings[183] = ItemType.SpruceLeaves; - mappings[184] = ItemType.BirchLeaves; - mappings[185] = ItemType.JungleLeaves; - mappings[186] = ItemType.AcaciaLeaves; - mappings[187] = ItemType.CherryLeaves; - mappings[188] = ItemType.DarkOakLeaves; - mappings[189] = ItemType.PaleOakLeaves; - mappings[190] = ItemType.MangroveLeaves; - mappings[191] = ItemType.AzaleaLeaves; - mappings[192] = ItemType.FloweringAzaleaLeaves; - mappings[193] = ItemType.Sponge; - mappings[194] = ItemType.WetSponge; - mappings[195] = ItemType.Glass; - mappings[196] = ItemType.TintedGlass; - mappings[197] = ItemType.LapisBlock; - mappings[198] = ItemType.Sandstone; - mappings[199] = ItemType.ChiseledSandstone; - mappings[200] = ItemType.CutSandstone; - mappings[201] = ItemType.Cobweb; - mappings[202] = ItemType.ShortGrass; - mappings[203] = ItemType.Fern; - mappings[204] = ItemType.Azalea; - mappings[205] = ItemType.FloweringAzalea; - mappings[206] = ItemType.DeadBush; - mappings[207] = ItemType.Seagrass; - mappings[208] = ItemType.SeaPickle; - mappings[209] = ItemType.WhiteWool; - mappings[210] = ItemType.OrangeWool; - mappings[211] = ItemType.MagentaWool; - mappings[212] = ItemType.LightBlueWool; - mappings[213] = ItemType.YellowWool; - mappings[214] = ItemType.LimeWool; - mappings[215] = ItemType.PinkWool; - mappings[216] = ItemType.GrayWool; - mappings[217] = ItemType.LightGrayWool; - mappings[218] = ItemType.CyanWool; - mappings[219] = ItemType.PurpleWool; - mappings[220] = ItemType.BlueWool; - mappings[221] = ItemType.BrownWool; - mappings[222] = ItemType.GreenWool; - mappings[223] = ItemType.RedWool; - mappings[224] = ItemType.BlackWool; - mappings[225] = ItemType.Dandelion; - mappings[226] = ItemType.Poppy; - mappings[227] = ItemType.BlueOrchid; - mappings[228] = ItemType.Allium; - mappings[229] = ItemType.AzureBluet; - mappings[230] = ItemType.RedTulip; - mappings[231] = ItemType.OrangeTulip; - mappings[232] = ItemType.WhiteTulip; - mappings[233] = ItemType.PinkTulip; - mappings[234] = ItemType.OxeyeDaisy; - mappings[235] = ItemType.Cornflower; - mappings[236] = ItemType.LilyOfTheValley; - mappings[237] = ItemType.WitherRose; - mappings[238] = ItemType.Torchflower; - mappings[239] = ItemType.PitcherPlant; - mappings[240] = ItemType.SporeBlossom; - mappings[241] = ItemType.BrownMushroom; - mappings[242] = ItemType.RedMushroom; - mappings[243] = ItemType.CrimsonFungus; - mappings[244] = ItemType.WarpedFungus; - mappings[245] = ItemType.CrimsonRoots; - mappings[246] = ItemType.WarpedRoots; - mappings[247] = ItemType.NetherSprouts; - mappings[248] = ItemType.WeepingVines; - mappings[249] = ItemType.TwistingVines; - mappings[250] = ItemType.SugarCane; - mappings[251] = ItemType.Kelp; - mappings[252] = ItemType.PinkPetals; - mappings[253] = ItemType.MossCarpet; - mappings[254] = ItemType.MossBlock; - mappings[255] = ItemType.PaleMossCarpet; - mappings[256] = ItemType.PaleHangingMoss; - mappings[257] = ItemType.PaleMossBlock; - mappings[258] = ItemType.HangingRoots; - mappings[259] = ItemType.BigDripleaf; - mappings[260] = ItemType.SmallDripleaf; - mappings[261] = ItemType.Bamboo; - mappings[262] = ItemType.OakSlab; - mappings[263] = ItemType.SpruceSlab; - mappings[264] = ItemType.BirchSlab; - mappings[265] = ItemType.JungleSlab; - mappings[266] = ItemType.AcaciaSlab; - mappings[267] = ItemType.CherrySlab; - mappings[268] = ItemType.DarkOakSlab; - mappings[269] = ItemType.PaleOakSlab; - mappings[270] = ItemType.MangroveSlab; - mappings[271] = ItemType.BambooSlab; - mappings[272] = ItemType.BambooMosaicSlab; - mappings[273] = ItemType.CrimsonSlab; - mappings[274] = ItemType.WarpedSlab; - mappings[275] = ItemType.StoneSlab; - mappings[276] = ItemType.SmoothStoneSlab; - mappings[277] = ItemType.SandstoneSlab; - mappings[278] = ItemType.CutSandstoneSlab; - mappings[279] = ItemType.PetrifiedOakSlab; - mappings[280] = ItemType.CobblestoneSlab; - mappings[281] = ItemType.BrickSlab; - mappings[282] = ItemType.StoneBrickSlab; - mappings[283] = ItemType.MudBrickSlab; - mappings[284] = ItemType.NetherBrickSlab; - mappings[285] = ItemType.QuartzSlab; - mappings[286] = ItemType.RedSandstoneSlab; - mappings[287] = ItemType.CutRedSandstoneSlab; - mappings[288] = ItemType.PurpurSlab; - mappings[289] = ItemType.PrismarineSlab; - mappings[290] = ItemType.PrismarineBrickSlab; - mappings[291] = ItemType.DarkPrismarineSlab; - mappings[292] = ItemType.SmoothQuartz; - mappings[293] = ItemType.SmoothRedSandstone; - mappings[294] = ItemType.SmoothSandstone; - mappings[295] = ItemType.SmoothStone; - mappings[296] = ItemType.Bricks; - mappings[297] = ItemType.Bookshelf; - mappings[298] = ItemType.ChiseledBookshelf; - mappings[299] = ItemType.DecoratedPot; - mappings[300] = ItemType.MossyCobblestone; - mappings[301] = ItemType.Obsidian; - mappings[302] = ItemType.Torch; - mappings[303] = ItemType.EndRod; - mappings[304] = ItemType.ChorusPlant; - mappings[305] = ItemType.ChorusFlower; - mappings[306] = ItemType.PurpurBlock; - mappings[307] = ItemType.PurpurPillar; - mappings[308] = ItemType.PurpurStairs; - mappings[309] = ItemType.Spawner; - mappings[310] = ItemType.CreakingHeart; - mappings[311] = ItemType.Chest; - mappings[312] = ItemType.CraftingTable; - mappings[313] = ItemType.Farmland; - mappings[314] = ItemType.Furnace; - mappings[315] = ItemType.Ladder; - mappings[316] = ItemType.CobblestoneStairs; - mappings[317] = ItemType.Snow; - mappings[318] = ItemType.Ice; - mappings[319] = ItemType.SnowBlock; - mappings[320] = ItemType.Cactus; - mappings[321] = ItemType.Clay; - mappings[322] = ItemType.Jukebox; - mappings[323] = ItemType.OakFence; - mappings[324] = ItemType.SpruceFence; - mappings[325] = ItemType.BirchFence; - mappings[326] = ItemType.JungleFence; - mappings[327] = ItemType.AcaciaFence; - mappings[328] = ItemType.CherryFence; - mappings[329] = ItemType.DarkOakFence; - mappings[330] = ItemType.PaleOakFence; - mappings[331] = ItemType.MangroveFence; - mappings[332] = ItemType.BambooFence; - mappings[333] = ItemType.CrimsonFence; - mappings[334] = ItemType.WarpedFence; - mappings[335] = ItemType.Pumpkin; - mappings[336] = ItemType.CarvedPumpkin; - mappings[337] = ItemType.JackOLantern; - mappings[338] = ItemType.Netherrack; - mappings[339] = ItemType.SoulSand; - mappings[340] = ItemType.SoulSoil; - mappings[341] = ItemType.Basalt; - mappings[342] = ItemType.PolishedBasalt; - mappings[343] = ItemType.SmoothBasalt; - mappings[344] = ItemType.SoulTorch; - mappings[345] = ItemType.Glowstone; - mappings[346] = ItemType.InfestedStone; - mappings[347] = ItemType.InfestedCobblestone; - mappings[348] = ItemType.InfestedStoneBricks; - mappings[349] = ItemType.InfestedMossyStoneBricks; - mappings[350] = ItemType.InfestedCrackedStoneBricks; - mappings[351] = ItemType.InfestedChiseledStoneBricks; - mappings[352] = ItemType.InfestedDeepslate; - mappings[353] = ItemType.StoneBricks; - mappings[354] = ItemType.MossyStoneBricks; - mappings[355] = ItemType.CrackedStoneBricks; - mappings[356] = ItemType.ChiseledStoneBricks; - mappings[357] = ItemType.PackedMud; - mappings[358] = ItemType.MudBricks; - mappings[359] = ItemType.DeepslateBricks; - mappings[360] = ItemType.CrackedDeepslateBricks; - mappings[361] = ItemType.DeepslateTiles; - mappings[362] = ItemType.CrackedDeepslateTiles; - mappings[363] = ItemType.ChiseledDeepslate; - mappings[364] = ItemType.ReinforcedDeepslate; - mappings[365] = ItemType.BrownMushroomBlock; - mappings[366] = ItemType.RedMushroomBlock; - mappings[367] = ItemType.MushroomStem; - mappings[368] = ItemType.IronBars; - mappings[369] = ItemType.Chain; - mappings[370] = ItemType.GlassPane; - mappings[371] = ItemType.Melon; - mappings[372] = ItemType.Vine; - mappings[373] = ItemType.GlowLichen; - mappings[374] = ItemType.BrickStairs; - mappings[375] = ItemType.StoneBrickStairs; - mappings[376] = ItemType.MudBrickStairs; - mappings[377] = ItemType.Mycelium; - mappings[378] = ItemType.LilyPad; - mappings[379] = ItemType.NetherBricks; - mappings[380] = ItemType.CrackedNetherBricks; - mappings[381] = ItemType.ChiseledNetherBricks; - mappings[382] = ItemType.NetherBrickFence; - mappings[383] = ItemType.NetherBrickStairs; - mappings[384] = ItemType.Sculk; - mappings[385] = ItemType.SculkVein; - mappings[386] = ItemType.SculkCatalyst; - mappings[387] = ItemType.SculkShrieker; - mappings[388] = ItemType.EnchantingTable; - mappings[389] = ItemType.EndPortalFrame; - mappings[390] = ItemType.EndStone; - mappings[391] = ItemType.EndStoneBricks; - mappings[392] = ItemType.DragonEgg; - mappings[393] = ItemType.SandstoneStairs; - mappings[394] = ItemType.EnderChest; - mappings[395] = ItemType.EmeraldBlock; - mappings[396] = ItemType.OakStairs; - mappings[397] = ItemType.SpruceStairs; - mappings[398] = ItemType.BirchStairs; - mappings[399] = ItemType.JungleStairs; - mappings[400] = ItemType.AcaciaStairs; - mappings[401] = ItemType.CherryStairs; - mappings[402] = ItemType.DarkOakStairs; - mappings[403] = ItemType.PaleOakStairs; - mappings[404] = ItemType.MangroveStairs; - mappings[405] = ItemType.BambooStairs; - mappings[406] = ItemType.BambooMosaicStairs; - mappings[407] = ItemType.CrimsonStairs; - mappings[408] = ItemType.WarpedStairs; - mappings[409] = ItemType.CommandBlock; - mappings[410] = ItemType.Beacon; - mappings[411] = ItemType.CobblestoneWall; - mappings[412] = ItemType.MossyCobblestoneWall; - mappings[413] = ItemType.BrickWall; - mappings[414] = ItemType.PrismarineWall; - mappings[415] = ItemType.RedSandstoneWall; - mappings[416] = ItemType.MossyStoneBrickWall; - mappings[417] = ItemType.GraniteWall; - mappings[418] = ItemType.StoneBrickWall; - mappings[419] = ItemType.MudBrickWall; - mappings[420] = ItemType.NetherBrickWall; - mappings[421] = ItemType.AndesiteWall; - mappings[422] = ItemType.RedNetherBrickWall; - mappings[423] = ItemType.SandstoneWall; - mappings[424] = ItemType.EndStoneBrickWall; - mappings[425] = ItemType.DioriteWall; - mappings[426] = ItemType.BlackstoneWall; - mappings[427] = ItemType.PolishedBlackstoneWall; - mappings[428] = ItemType.PolishedBlackstoneBrickWall; - mappings[429] = ItemType.CobbledDeepslateWall; - mappings[430] = ItemType.PolishedDeepslateWall; - mappings[431] = ItemType.DeepslateBrickWall; - mappings[432] = ItemType.DeepslateTileWall; - mappings[433] = ItemType.Anvil; - mappings[434] = ItemType.ChippedAnvil; - mappings[435] = ItemType.DamagedAnvil; - mappings[436] = ItemType.ChiseledQuartzBlock; - mappings[437] = ItemType.QuartzBlock; - mappings[438] = ItemType.QuartzBricks; - mappings[439] = ItemType.QuartzPillar; - mappings[440] = ItemType.QuartzStairs; - mappings[441] = ItemType.WhiteTerracotta; - mappings[442] = ItemType.OrangeTerracotta; - mappings[443] = ItemType.MagentaTerracotta; - mappings[444] = ItemType.LightBlueTerracotta; - mappings[445] = ItemType.YellowTerracotta; - mappings[446] = ItemType.LimeTerracotta; - mappings[447] = ItemType.PinkTerracotta; - mappings[448] = ItemType.GrayTerracotta; - mappings[449] = ItemType.LightGrayTerracotta; - mappings[450] = ItemType.CyanTerracotta; - mappings[451] = ItemType.PurpleTerracotta; - mappings[452] = ItemType.BlueTerracotta; - mappings[453] = ItemType.BrownTerracotta; - mappings[454] = ItemType.GreenTerracotta; - mappings[455] = ItemType.RedTerracotta; - mappings[456] = ItemType.BlackTerracotta; - mappings[457] = ItemType.Barrier; - mappings[458] = ItemType.Light; - mappings[459] = ItemType.HayBlock; - mappings[460] = ItemType.WhiteCarpet; - mappings[461] = ItemType.OrangeCarpet; - mappings[462] = ItemType.MagentaCarpet; - mappings[463] = ItemType.LightBlueCarpet; - mappings[464] = ItemType.YellowCarpet; - mappings[465] = ItemType.LimeCarpet; - mappings[466] = ItemType.PinkCarpet; - mappings[467] = ItemType.GrayCarpet; - mappings[468] = ItemType.LightGrayCarpet; - mappings[469] = ItemType.CyanCarpet; - mappings[470] = ItemType.PurpleCarpet; - mappings[471] = ItemType.BlueCarpet; - mappings[472] = ItemType.BrownCarpet; - mappings[473] = ItemType.GreenCarpet; - mappings[474] = ItemType.RedCarpet; - mappings[475] = ItemType.BlackCarpet; - mappings[476] = ItemType.Terracotta; - mappings[477] = ItemType.PackedIce; - mappings[478] = ItemType.DirtPath; - mappings[479] = ItemType.Sunflower; - mappings[480] = ItemType.Lilac; - mappings[481] = ItemType.RoseBush; - mappings[482] = ItemType.Peony; - mappings[483] = ItemType.TallGrass; - mappings[484] = ItemType.LargeFern; - mappings[485] = ItemType.WhiteStainedGlass; - mappings[486] = ItemType.OrangeStainedGlass; - mappings[487] = ItemType.MagentaStainedGlass; - mappings[488] = ItemType.LightBlueStainedGlass; - mappings[489] = ItemType.YellowStainedGlass; - mappings[490] = ItemType.LimeStainedGlass; - mappings[491] = ItemType.PinkStainedGlass; - mappings[492] = ItemType.GrayStainedGlass; - mappings[493] = ItemType.LightGrayStainedGlass; - mappings[494] = ItemType.CyanStainedGlass; - mappings[495] = ItemType.PurpleStainedGlass; - mappings[496] = ItemType.BlueStainedGlass; - mappings[497] = ItemType.BrownStainedGlass; - mappings[498] = ItemType.GreenStainedGlass; - mappings[499] = ItemType.RedStainedGlass; - mappings[500] = ItemType.BlackStainedGlass; - mappings[501] = ItemType.WhiteStainedGlassPane; - mappings[502] = ItemType.OrangeStainedGlassPane; - mappings[503] = ItemType.MagentaStainedGlassPane; - mappings[504] = ItemType.LightBlueStainedGlassPane; - mappings[505] = ItemType.YellowStainedGlassPane; - mappings[506] = ItemType.LimeStainedGlassPane; - mappings[507] = ItemType.PinkStainedGlassPane; - mappings[508] = ItemType.GrayStainedGlassPane; - mappings[509] = ItemType.LightGrayStainedGlassPane; - mappings[510] = ItemType.CyanStainedGlassPane; - mappings[511] = ItemType.PurpleStainedGlassPane; - mappings[512] = ItemType.BlueStainedGlassPane; - mappings[513] = ItemType.BrownStainedGlassPane; - mappings[514] = ItemType.GreenStainedGlassPane; - mappings[515] = ItemType.RedStainedGlassPane; - mappings[516] = ItemType.BlackStainedGlassPane; - mappings[517] = ItemType.Prismarine; - mappings[518] = ItemType.PrismarineBricks; - mappings[519] = ItemType.DarkPrismarine; - mappings[520] = ItemType.PrismarineStairs; - mappings[521] = ItemType.PrismarineBrickStairs; - mappings[522] = ItemType.DarkPrismarineStairs; - mappings[523] = ItemType.SeaLantern; - mappings[524] = ItemType.RedSandstone; - mappings[525] = ItemType.ChiseledRedSandstone; - mappings[526] = ItemType.CutRedSandstone; - mappings[527] = ItemType.RedSandstoneStairs; - mappings[528] = ItemType.RepeatingCommandBlock; - mappings[529] = ItemType.ChainCommandBlock; - mappings[530] = ItemType.MagmaBlock; - mappings[531] = ItemType.NetherWartBlock; - mappings[532] = ItemType.WarpedWartBlock; - mappings[533] = ItemType.RedNetherBricks; - mappings[534] = ItemType.BoneBlock; - mappings[535] = ItemType.StructureVoid; - mappings[536] = ItemType.ShulkerBox; - mappings[537] = ItemType.WhiteShulkerBox; - mappings[538] = ItemType.OrangeShulkerBox; - mappings[539] = ItemType.MagentaShulkerBox; - mappings[540] = ItemType.LightBlueShulkerBox; - mappings[541] = ItemType.YellowShulkerBox; - mappings[542] = ItemType.LimeShulkerBox; - mappings[543] = ItemType.PinkShulkerBox; - mappings[544] = ItemType.GrayShulkerBox; - mappings[545] = ItemType.LightGrayShulkerBox; - mappings[546] = ItemType.CyanShulkerBox; - mappings[547] = ItemType.PurpleShulkerBox; - mappings[548] = ItemType.BlueShulkerBox; - mappings[549] = ItemType.BrownShulkerBox; - mappings[550] = ItemType.GreenShulkerBox; - mappings[551] = ItemType.RedShulkerBox; - mappings[552] = ItemType.BlackShulkerBox; - mappings[553] = ItemType.WhiteGlazedTerracotta; - mappings[554] = ItemType.OrangeGlazedTerracotta; - mappings[555] = ItemType.MagentaGlazedTerracotta; - mappings[556] = ItemType.LightBlueGlazedTerracotta; - mappings[557] = ItemType.YellowGlazedTerracotta; - mappings[558] = ItemType.LimeGlazedTerracotta; - mappings[559] = ItemType.PinkGlazedTerracotta; - mappings[560] = ItemType.GrayGlazedTerracotta; - mappings[561] = ItemType.LightGrayGlazedTerracotta; - mappings[562] = ItemType.CyanGlazedTerracotta; - mappings[563] = ItemType.PurpleGlazedTerracotta; - mappings[564] = ItemType.BlueGlazedTerracotta; - mappings[565] = ItemType.BrownGlazedTerracotta; - mappings[566] = ItemType.GreenGlazedTerracotta; - mappings[567] = ItemType.RedGlazedTerracotta; - mappings[568] = ItemType.BlackGlazedTerracotta; - mappings[569] = ItemType.WhiteConcrete; - mappings[570] = ItemType.OrangeConcrete; - mappings[571] = ItemType.MagentaConcrete; - mappings[572] = ItemType.LightBlueConcrete; - mappings[573] = ItemType.YellowConcrete; - mappings[574] = ItemType.LimeConcrete; - mappings[575] = ItemType.PinkConcrete; - mappings[576] = ItemType.GrayConcrete; - mappings[577] = ItemType.LightGrayConcrete; - mappings[578] = ItemType.CyanConcrete; - mappings[579] = ItemType.PurpleConcrete; - mappings[580] = ItemType.BlueConcrete; - mappings[581] = ItemType.BrownConcrete; - mappings[582] = ItemType.GreenConcrete; - mappings[583] = ItemType.RedConcrete; - mappings[584] = ItemType.BlackConcrete; - mappings[585] = ItemType.WhiteConcretePowder; - mappings[586] = ItemType.OrangeConcretePowder; - mappings[587] = ItemType.MagentaConcretePowder; - mappings[588] = ItemType.LightBlueConcretePowder; - mappings[589] = ItemType.YellowConcretePowder; - mappings[590] = ItemType.LimeConcretePowder; - mappings[591] = ItemType.PinkConcretePowder; - mappings[592] = ItemType.GrayConcretePowder; - mappings[593] = ItemType.LightGrayConcretePowder; - mappings[594] = ItemType.CyanConcretePowder; - mappings[595] = ItemType.PurpleConcretePowder; - mappings[596] = ItemType.BlueConcretePowder; - mappings[597] = ItemType.BrownConcretePowder; - mappings[598] = ItemType.GreenConcretePowder; - mappings[599] = ItemType.RedConcretePowder; - mappings[600] = ItemType.BlackConcretePowder; - mappings[601] = ItemType.TurtleEgg; - mappings[602] = ItemType.SnifferEgg; - mappings[603] = ItemType.DeadTubeCoralBlock; - mappings[604] = ItemType.DeadBrainCoralBlock; - mappings[605] = ItemType.DeadBubbleCoralBlock; - mappings[606] = ItemType.DeadFireCoralBlock; - mappings[607] = ItemType.DeadHornCoralBlock; - mappings[608] = ItemType.TubeCoralBlock; - mappings[609] = ItemType.BrainCoralBlock; - mappings[610] = ItemType.BubbleCoralBlock; - mappings[611] = ItemType.FireCoralBlock; - mappings[612] = ItemType.HornCoralBlock; - mappings[613] = ItemType.TubeCoral; - mappings[614] = ItemType.BrainCoral; - mappings[615] = ItemType.BubbleCoral; - mappings[616] = ItemType.FireCoral; - mappings[617] = ItemType.HornCoral; - mappings[618] = ItemType.DeadBrainCoral; - mappings[619] = ItemType.DeadBubbleCoral; - mappings[620] = ItemType.DeadFireCoral; - mappings[621] = ItemType.DeadHornCoral; - mappings[622] = ItemType.DeadTubeCoral; - mappings[623] = ItemType.TubeCoralFan; - mappings[624] = ItemType.BrainCoralFan; - mappings[625] = ItemType.BubbleCoralFan; - mappings[626] = ItemType.FireCoralFan; - mappings[627] = ItemType.HornCoralFan; - mappings[628] = ItemType.DeadTubeCoralFan; - mappings[629] = ItemType.DeadBrainCoralFan; - mappings[630] = ItemType.DeadBubbleCoralFan; - mappings[631] = ItemType.DeadFireCoralFan; - mappings[632] = ItemType.DeadHornCoralFan; - mappings[633] = ItemType.BlueIce; - mappings[634] = ItemType.Conduit; - mappings[635] = ItemType.PolishedGraniteStairs; - mappings[636] = ItemType.SmoothRedSandstoneStairs; - mappings[637] = ItemType.MossyStoneBrickStairs; - mappings[638] = ItemType.PolishedDioriteStairs; - mappings[639] = ItemType.MossyCobblestoneStairs; - mappings[640] = ItemType.EndStoneBrickStairs; - mappings[641] = ItemType.StoneStairs; - mappings[642] = ItemType.SmoothSandstoneStairs; - mappings[643] = ItemType.SmoothQuartzStairs; - mappings[644] = ItemType.GraniteStairs; - mappings[645] = ItemType.AndesiteStairs; - mappings[646] = ItemType.RedNetherBrickStairs; - mappings[647] = ItemType.PolishedAndesiteStairs; - mappings[648] = ItemType.DioriteStairs; - mappings[649] = ItemType.CobbledDeepslateStairs; - mappings[650] = ItemType.PolishedDeepslateStairs; - mappings[651] = ItemType.DeepslateBrickStairs; - mappings[652] = ItemType.DeepslateTileStairs; - mappings[653] = ItemType.PolishedGraniteSlab; - mappings[654] = ItemType.SmoothRedSandstoneSlab; - mappings[655] = ItemType.MossyStoneBrickSlab; - mappings[656] = ItemType.PolishedDioriteSlab; - mappings[657] = ItemType.MossyCobblestoneSlab; - mappings[658] = ItemType.EndStoneBrickSlab; - mappings[659] = ItemType.SmoothSandstoneSlab; - mappings[660] = ItemType.SmoothQuartzSlab; - mappings[661] = ItemType.GraniteSlab; - mappings[662] = ItemType.AndesiteSlab; - mappings[663] = ItemType.RedNetherBrickSlab; - mappings[664] = ItemType.PolishedAndesiteSlab; - mappings[665] = ItemType.DioriteSlab; - mappings[666] = ItemType.CobbledDeepslateSlab; - mappings[667] = ItemType.PolishedDeepslateSlab; - mappings[668] = ItemType.DeepslateBrickSlab; - mappings[669] = ItemType.DeepslateTileSlab; - mappings[670] = ItemType.Scaffolding; - mappings[671] = ItemType.Redstone; - mappings[672] = ItemType.RedstoneTorch; - mappings[673] = ItemType.RedstoneBlock; - mappings[674] = ItemType.Repeater; - mappings[675] = ItemType.Comparator; - mappings[676] = ItemType.Piston; - mappings[677] = ItemType.StickyPiston; - mappings[678] = ItemType.SlimeBlock; - mappings[679] = ItemType.HoneyBlock; - mappings[680] = ItemType.Observer; - mappings[681] = ItemType.Hopper; - mappings[682] = ItemType.Dispenser; - mappings[683] = ItemType.Dropper; - mappings[684] = ItemType.Lectern; - mappings[685] = ItemType.Target; - mappings[686] = ItemType.Lever; - mappings[687] = ItemType.LightningRod; - mappings[688] = ItemType.DaylightDetector; - mappings[689] = ItemType.SculkSensor; - mappings[690] = ItemType.CalibratedSculkSensor; - mappings[691] = ItemType.TripwireHook; - mappings[692] = ItemType.TrappedChest; - mappings[693] = ItemType.Tnt; - mappings[694] = ItemType.RedstoneLamp; - mappings[695] = ItemType.NoteBlock; - mappings[696] = ItemType.StoneButton; - mappings[697] = ItemType.PolishedBlackstoneButton; - mappings[698] = ItemType.OakButton; - mappings[699] = ItemType.SpruceButton; - mappings[700] = ItemType.BirchButton; - mappings[701] = ItemType.JungleButton; - mappings[702] = ItemType.AcaciaButton; - mappings[703] = ItemType.CherryButton; - mappings[704] = ItemType.DarkOakButton; - mappings[705] = ItemType.PaleOakButton; - mappings[706] = ItemType.MangroveButton; - mappings[707] = ItemType.BambooButton; - mappings[708] = ItemType.CrimsonButton; - mappings[709] = ItemType.WarpedButton; - mappings[710] = ItemType.StonePressurePlate; - mappings[711] = ItemType.PolishedBlackstonePressurePlate; - mappings[712] = ItemType.LightWeightedPressurePlate; - mappings[713] = ItemType.HeavyWeightedPressurePlate; - mappings[714] = ItemType.OakPressurePlate; - mappings[715] = ItemType.SprucePressurePlate; - mappings[716] = ItemType.BirchPressurePlate; - mappings[717] = ItemType.JunglePressurePlate; - mappings[718] = ItemType.AcaciaPressurePlate; - mappings[719] = ItemType.CherryPressurePlate; - mappings[720] = ItemType.DarkOakPressurePlate; - mappings[721] = ItemType.PaleOakPressurePlate; - mappings[722] = ItemType.MangrovePressurePlate; - mappings[723] = ItemType.BambooPressurePlate; - mappings[724] = ItemType.CrimsonPressurePlate; - mappings[725] = ItemType.WarpedPressurePlate; - mappings[726] = ItemType.IronDoor; - mappings[727] = ItemType.OakDoor; - mappings[728] = ItemType.SpruceDoor; - mappings[729] = ItemType.BirchDoor; - mappings[730] = ItemType.JungleDoor; - mappings[731] = ItemType.AcaciaDoor; - mappings[732] = ItemType.CherryDoor; - mappings[733] = ItemType.DarkOakDoor; - mappings[734] = ItemType.PaleOakDoor; - mappings[735] = ItemType.MangroveDoor; - mappings[736] = ItemType.BambooDoor; - mappings[737] = ItemType.CrimsonDoor; - mappings[738] = ItemType.WarpedDoor; - mappings[739] = ItemType.CopperDoor; - mappings[740] = ItemType.ExposedCopperDoor; - mappings[741] = ItemType.WeatheredCopperDoor; - mappings[742] = ItemType.OxidizedCopperDoor; - mappings[743] = ItemType.WaxedCopperDoor; - mappings[744] = ItemType.WaxedExposedCopperDoor; - mappings[745] = ItemType.WaxedWeatheredCopperDoor; - mappings[746] = ItemType.WaxedOxidizedCopperDoor; - mappings[747] = ItemType.IronTrapdoor; - mappings[748] = ItemType.OakTrapdoor; - mappings[749] = ItemType.SpruceTrapdoor; - mappings[750] = ItemType.BirchTrapdoor; - mappings[751] = ItemType.JungleTrapdoor; - mappings[752] = ItemType.AcaciaTrapdoor; - mappings[753] = ItemType.CherryTrapdoor; - mappings[754] = ItemType.DarkOakTrapdoor; - mappings[755] = ItemType.PaleOakTrapdoor; - mappings[756] = ItemType.MangroveTrapdoor; - mappings[757] = ItemType.BambooTrapdoor; - mappings[758] = ItemType.CrimsonTrapdoor; - mappings[759] = ItemType.WarpedTrapdoor; - mappings[760] = ItemType.CopperTrapdoor; - mappings[761] = ItemType.ExposedCopperTrapdoor; - mappings[762] = ItemType.WeatheredCopperTrapdoor; - mappings[763] = ItemType.OxidizedCopperTrapdoor; - mappings[764] = ItemType.WaxedCopperTrapdoor; - mappings[765] = ItemType.WaxedExposedCopperTrapdoor; - mappings[766] = ItemType.WaxedWeatheredCopperTrapdoor; - mappings[767] = ItemType.WaxedOxidizedCopperTrapdoor; - mappings[768] = ItemType.OakFenceGate; - mappings[769] = ItemType.SpruceFenceGate; - mappings[770] = ItemType.BirchFenceGate; - mappings[771] = ItemType.JungleFenceGate; - mappings[772] = ItemType.AcaciaFenceGate; - mappings[773] = ItemType.CherryFenceGate; - mappings[774] = ItemType.DarkOakFenceGate; - mappings[775] = ItemType.PaleOakFenceGate; - mappings[776] = ItemType.MangroveFenceGate; - mappings[777] = ItemType.BambooFenceGate; - mappings[778] = ItemType.CrimsonFenceGate; - mappings[779] = ItemType.WarpedFenceGate; - mappings[780] = ItemType.PoweredRail; - mappings[781] = ItemType.DetectorRail; - mappings[782] = ItemType.Rail; - mappings[783] = ItemType.ActivatorRail; - mappings[784] = ItemType.Saddle; - mappings[785] = ItemType.Minecart; - mappings[786] = ItemType.ChestMinecart; - mappings[787] = ItemType.FurnaceMinecart; - mappings[788] = ItemType.TntMinecart; - mappings[789] = ItemType.HopperMinecart; - mappings[790] = ItemType.CarrotOnAStick; - mappings[791] = ItemType.WarpedFungusOnAStick; - mappings[792] = ItemType.PhantomMembrane; - mappings[793] = ItemType.Elytra; - mappings[794] = ItemType.OakBoat; - mappings[795] = ItemType.OakChestBoat; - mappings[796] = ItemType.SpruceBoat; - mappings[797] = ItemType.SpruceChestBoat; - mappings[798] = ItemType.BirchBoat; - mappings[799] = ItemType.BirchChestBoat; - mappings[800] = ItemType.JungleBoat; - mappings[801] = ItemType.JungleChestBoat; - mappings[802] = ItemType.AcaciaBoat; - mappings[803] = ItemType.AcaciaChestBoat; - mappings[804] = ItemType.CherryBoat; - mappings[805] = ItemType.CherryChestBoat; - mappings[806] = ItemType.DarkOakBoat; - mappings[807] = ItemType.DarkOakChestBoat; - mappings[808] = ItemType.PaleOakBoat; - mappings[809] = ItemType.PaleOakChestBoat; - mappings[810] = ItemType.MangroveBoat; - mappings[811] = ItemType.MangroveChestBoat; - mappings[812] = ItemType.BambooRaft; - mappings[813] = ItemType.BambooChestRaft; - mappings[814] = ItemType.StructureBlock; - mappings[815] = ItemType.Jigsaw; - mappings[816] = ItemType.TurtleHelmet; - mappings[817] = ItemType.TurtleScute; - mappings[818] = ItemType.ArmadilloScute; - mappings[819] = ItemType.WolfArmor; - mappings[820] = ItemType.FlintAndSteel; - mappings[821] = ItemType.Bowl; - mappings[822] = ItemType.Apple; - mappings[823] = ItemType.Bow; - mappings[824] = ItemType.Arrow; - mappings[825] = ItemType.Coal; - mappings[826] = ItemType.Charcoal; - mappings[827] = ItemType.Diamond; - mappings[828] = ItemType.Emerald; - mappings[829] = ItemType.LapisLazuli; - mappings[830] = ItemType.Quartz; - mappings[831] = ItemType.AmethystShard; - mappings[832] = ItemType.RawIron; - mappings[833] = ItemType.IronIngot; - mappings[834] = ItemType.RawCopper; - mappings[835] = ItemType.CopperIngot; - mappings[836] = ItemType.RawGold; - mappings[837] = ItemType.GoldIngot; - mappings[838] = ItemType.NetheriteIngot; - mappings[839] = ItemType.NetheriteScrap; - mappings[840] = ItemType.WoodenSword; - mappings[841] = ItemType.WoodenShovel; - mappings[842] = ItemType.WoodenPickaxe; - mappings[843] = ItemType.WoodenAxe; - mappings[844] = ItemType.WoodenHoe; - mappings[845] = ItemType.StoneSword; - mappings[846] = ItemType.StoneShovel; - mappings[847] = ItemType.StonePickaxe; - mappings[848] = ItemType.StoneAxe; - mappings[849] = ItemType.StoneHoe; - mappings[850] = ItemType.GoldenSword; - mappings[851] = ItemType.GoldenShovel; - mappings[852] = ItemType.GoldenPickaxe; - mappings[853] = ItemType.GoldenAxe; - mappings[854] = ItemType.GoldenHoe; - mappings[855] = ItemType.IronSword; - mappings[856] = ItemType.IronShovel; - mappings[857] = ItemType.IronPickaxe; - mappings[858] = ItemType.IronAxe; - mappings[859] = ItemType.IronHoe; - mappings[860] = ItemType.DiamondSword; - mappings[861] = ItemType.DiamondShovel; - mappings[862] = ItemType.DiamondPickaxe; - mappings[863] = ItemType.DiamondAxe; - mappings[864] = ItemType.DiamondHoe; - mappings[865] = ItemType.NetheriteSword; - mappings[866] = ItemType.NetheriteShovel; - mappings[867] = ItemType.NetheritePickaxe; - mappings[868] = ItemType.NetheriteAxe; - mappings[869] = ItemType.NetheriteHoe; - mappings[870] = ItemType.Stick; - mappings[871] = ItemType.MushroomStew; - mappings[872] = ItemType.String; - mappings[873] = ItemType.Feather; - mappings[874] = ItemType.Gunpowder; - mappings[875] = ItemType.WheatSeeds; - mappings[876] = ItemType.Wheat; - mappings[877] = ItemType.Bread; - mappings[878] = ItemType.LeatherHelmet; - mappings[879] = ItemType.LeatherChestplate; - mappings[880] = ItemType.LeatherLeggings; - mappings[881] = ItemType.LeatherBoots; - mappings[882] = ItemType.ChainmailHelmet; - mappings[883] = ItemType.ChainmailChestplate; - mappings[884] = ItemType.ChainmailLeggings; - mappings[885] = ItemType.ChainmailBoots; - mappings[886] = ItemType.IronHelmet; - mappings[887] = ItemType.IronChestplate; - mappings[888] = ItemType.IronLeggings; - mappings[889] = ItemType.IronBoots; - mappings[890] = ItemType.DiamondHelmet; - mappings[891] = ItemType.DiamondChestplate; - mappings[892] = ItemType.DiamondLeggings; - mappings[893] = ItemType.DiamondBoots; - mappings[894] = ItemType.GoldenHelmet; - mappings[895] = ItemType.GoldenChestplate; - mappings[896] = ItemType.GoldenLeggings; - mappings[897] = ItemType.GoldenBoots; - mappings[898] = ItemType.NetheriteHelmet; - mappings[899] = ItemType.NetheriteChestplate; - mappings[900] = ItemType.NetheriteLeggings; - mappings[901] = ItemType.NetheriteBoots; - mappings[902] = ItemType.Flint; - mappings[903] = ItemType.Porkchop; - mappings[904] = ItemType.CookedPorkchop; - mappings[905] = ItemType.Painting; - mappings[906] = ItemType.GoldenApple; - mappings[907] = ItemType.EnchantedGoldenApple; - mappings[908] = ItemType.OakSign; - mappings[909] = ItemType.SpruceSign; - mappings[910] = ItemType.BirchSign; - mappings[911] = ItemType.JungleSign; - mappings[912] = ItemType.AcaciaSign; - mappings[913] = ItemType.CherrySign; - mappings[914] = ItemType.DarkOakSign; - mappings[915] = ItemType.PaleOakSign; - mappings[916] = ItemType.MangroveSign; - mappings[917] = ItemType.BambooSign; - mappings[918] = ItemType.CrimsonSign; - mappings[919] = ItemType.WarpedSign; - mappings[920] = ItemType.OakHangingSign; - mappings[921] = ItemType.SpruceHangingSign; - mappings[922] = ItemType.BirchHangingSign; - mappings[923] = ItemType.JungleHangingSign; - mappings[924] = ItemType.AcaciaHangingSign; - mappings[925] = ItemType.CherryHangingSign; - mappings[926] = ItemType.DarkOakHangingSign; - mappings[927] = ItemType.PaleOakHangingSign; - mappings[928] = ItemType.MangroveHangingSign; - mappings[929] = ItemType.BambooHangingSign; - mappings[930] = ItemType.CrimsonHangingSign; - mappings[931] = ItemType.WarpedHangingSign; - mappings[932] = ItemType.Bucket; - mappings[933] = ItemType.WaterBucket; - mappings[934] = ItemType.LavaBucket; - mappings[935] = ItemType.PowderSnowBucket; - mappings[936] = ItemType.Snowball; - mappings[937] = ItemType.Leather; - mappings[938] = ItemType.MilkBucket; - mappings[939] = ItemType.PufferfishBucket; - mappings[940] = ItemType.SalmonBucket; - mappings[941] = ItemType.CodBucket; - mappings[942] = ItemType.TropicalFishBucket; - mappings[943] = ItemType.AxolotlBucket; - mappings[944] = ItemType.TadpoleBucket; - mappings[945] = ItemType.Brick; - mappings[946] = ItemType.ClayBall; - mappings[947] = ItemType.DriedKelpBlock; - mappings[948] = ItemType.Paper; - mappings[949] = ItemType.Book; - mappings[950] = ItemType.SlimeBall; - mappings[951] = ItemType.Egg; - mappings[952] = ItemType.Compass; - mappings[953] = ItemType.RecoveryCompass; - mappings[954] = ItemType.Bundle; - mappings[955] = ItemType.WhiteBundle; - mappings[956] = ItemType.OrangeBundle; - mappings[957] = ItemType.MagentaBundle; - mappings[958] = ItemType.LightBlueBundle; - mappings[959] = ItemType.YellowBundle; - mappings[960] = ItemType.LimeBundle; - mappings[961] = ItemType.PinkBundle; - mappings[962] = ItemType.GrayBundle; - mappings[963] = ItemType.LightGrayBundle; - mappings[964] = ItemType.CyanBundle; - mappings[965] = ItemType.PurpleBundle; - mappings[966] = ItemType.BlueBundle; - mappings[967] = ItemType.BrownBundle; - mappings[968] = ItemType.GreenBundle; - mappings[969] = ItemType.RedBundle; - mappings[970] = ItemType.BlackBundle; - mappings[971] = ItemType.FishingRod; - mappings[972] = ItemType.Clock; - mappings[973] = ItemType.Spyglass; - mappings[974] = ItemType.GlowstoneDust; - mappings[975] = ItemType.Cod; - mappings[976] = ItemType.Salmon; - mappings[977] = ItemType.TropicalFish; - mappings[978] = ItemType.Pufferfish; - mappings[979] = ItemType.CookedCod; - mappings[980] = ItemType.CookedSalmon; - mappings[981] = ItemType.InkSac; - mappings[982] = ItemType.GlowInkSac; - mappings[983] = ItemType.CocoaBeans; - mappings[984] = ItemType.WhiteDye; - mappings[985] = ItemType.OrangeDye; - mappings[986] = ItemType.MagentaDye; - mappings[987] = ItemType.LightBlueDye; - mappings[988] = ItemType.YellowDye; - mappings[989] = ItemType.LimeDye; - mappings[990] = ItemType.PinkDye; - mappings[991] = ItemType.GrayDye; - mappings[992] = ItemType.LightGrayDye; - mappings[993] = ItemType.CyanDye; - mappings[994] = ItemType.PurpleDye; - mappings[995] = ItemType.BlueDye; - mappings[996] = ItemType.BrownDye; - mappings[997] = ItemType.GreenDye; - mappings[998] = ItemType.RedDye; - mappings[999] = ItemType.BlackDye; - mappings[1000] = ItemType.BoneMeal; - mappings[1001] = ItemType.Bone; - mappings[1002] = ItemType.Sugar; - mappings[1003] = ItemType.Cake; - mappings[1004] = ItemType.WhiteBed; - mappings[1005] = ItemType.OrangeBed; - mappings[1006] = ItemType.MagentaBed; - mappings[1007] = ItemType.LightBlueBed; - mappings[1008] = ItemType.YellowBed; - mappings[1009] = ItemType.LimeBed; - mappings[1010] = ItemType.PinkBed; - mappings[1011] = ItemType.GrayBed; - mappings[1012] = ItemType.LightGrayBed; - mappings[1013] = ItemType.CyanBed; - mappings[1014] = ItemType.PurpleBed; - mappings[1015] = ItemType.BlueBed; - mappings[1016] = ItemType.BrownBed; - mappings[1017] = ItemType.GreenBed; - mappings[1018] = ItemType.RedBed; - mappings[1019] = ItemType.BlackBed; - mappings[1020] = ItemType.Cookie; - mappings[1021] = ItemType.Crafter; - mappings[1022] = ItemType.FilledMap; - mappings[1023] = ItemType.Shears; - mappings[1024] = ItemType.MelonSlice; - mappings[1025] = ItemType.DriedKelp; - mappings[1026] = ItemType.PumpkinSeeds; - mappings[1027] = ItemType.MelonSeeds; - mappings[1028] = ItemType.Beef; - mappings[1029] = ItemType.CookedBeef; - mappings[1030] = ItemType.Chicken; - mappings[1031] = ItemType.CookedChicken; - mappings[1032] = ItemType.RottenFlesh; - mappings[1033] = ItemType.EnderPearl; - mappings[1034] = ItemType.BlazeRod; - mappings[1035] = ItemType.GhastTear; - mappings[1036] = ItemType.GoldNugget; - mappings[1037] = ItemType.NetherWart; - mappings[1038] = ItemType.GlassBottle; - mappings[1039] = ItemType.Potion; - mappings[1040] = ItemType.SpiderEye; - mappings[1041] = ItemType.FermentedSpiderEye; - mappings[1042] = ItemType.BlazePowder; - mappings[1043] = ItemType.MagmaCream; - mappings[1044] = ItemType.BrewingStand; - mappings[1045] = ItemType.Cauldron; - mappings[1046] = ItemType.EnderEye; - mappings[1047] = ItemType.GlisteringMelonSlice; - mappings[1048] = ItemType.ArmadilloSpawnEgg; - mappings[1049] = ItemType.AllaySpawnEgg; - mappings[1050] = ItemType.AxolotlSpawnEgg; - mappings[1051] = ItemType.BatSpawnEgg; - mappings[1052] = ItemType.BeeSpawnEgg; - mappings[1053] = ItemType.BlazeSpawnEgg; - mappings[1054] = ItemType.BoggedSpawnEgg; - mappings[1055] = ItemType.BreezeSpawnEgg; - mappings[1056] = ItemType.CatSpawnEgg; - mappings[1057] = ItemType.CamelSpawnEgg; - mappings[1058] = ItemType.CaveSpiderSpawnEgg; - mappings[1059] = ItemType.ChickenSpawnEgg; - mappings[1060] = ItemType.CodSpawnEgg; - mappings[1061] = ItemType.CowSpawnEgg; - mappings[1062] = ItemType.CreeperSpawnEgg; - mappings[1063] = ItemType.DolphinSpawnEgg; - mappings[1064] = ItemType.DonkeySpawnEgg; - mappings[1065] = ItemType.DrownedSpawnEgg; - mappings[1066] = ItemType.ElderGuardianSpawnEgg; - mappings[1067] = ItemType.EnderDragonSpawnEgg; - mappings[1068] = ItemType.EndermanSpawnEgg; - mappings[1069] = ItemType.EndermiteSpawnEgg; - mappings[1070] = ItemType.EvokerSpawnEgg; - mappings[1071] = ItemType.FoxSpawnEgg; - mappings[1072] = ItemType.FrogSpawnEgg; - mappings[1073] = ItemType.GhastSpawnEgg; - mappings[1074] = ItemType.GlowSquidSpawnEgg; - mappings[1075] = ItemType.GoatSpawnEgg; - mappings[1076] = ItemType.GuardianSpawnEgg; - mappings[1077] = ItemType.HoglinSpawnEgg; - mappings[1078] = ItemType.HorseSpawnEgg; - mappings[1079] = ItemType.HuskSpawnEgg; - mappings[1080] = ItemType.IronGolemSpawnEgg; - mappings[1081] = ItemType.LlamaSpawnEgg; - mappings[1082] = ItemType.MagmaCubeSpawnEgg; - mappings[1083] = ItemType.MooshroomSpawnEgg; - mappings[1084] = ItemType.MuleSpawnEgg; - mappings[1085] = ItemType.OcelotSpawnEgg; - mappings[1086] = ItemType.PandaSpawnEgg; - mappings[1087] = ItemType.ParrotSpawnEgg; - mappings[1088] = ItemType.PhantomSpawnEgg; - mappings[1089] = ItemType.PigSpawnEgg; - mappings[1090] = ItemType.PiglinSpawnEgg; - mappings[1091] = ItemType.PiglinBruteSpawnEgg; - mappings[1092] = ItemType.PillagerSpawnEgg; - mappings[1093] = ItemType.PolarBearSpawnEgg; - mappings[1094] = ItemType.PufferfishSpawnEgg; - mappings[1095] = ItemType.RabbitSpawnEgg; - mappings[1096] = ItemType.RavagerSpawnEgg; - mappings[1097] = ItemType.SalmonSpawnEgg; - mappings[1098] = ItemType.SheepSpawnEgg; - mappings[1099] = ItemType.ShulkerSpawnEgg; - mappings[1100] = ItemType.SilverfishSpawnEgg; - mappings[1101] = ItemType.SkeletonSpawnEgg; - mappings[1102] = ItemType.SkeletonHorseSpawnEgg; - mappings[1103] = ItemType.SlimeSpawnEgg; - mappings[1104] = ItemType.SnifferSpawnEgg; - mappings[1105] = ItemType.SnowGolemSpawnEgg; - mappings[1106] = ItemType.SpiderSpawnEgg; - mappings[1107] = ItemType.SquidSpawnEgg; - mappings[1108] = ItemType.StraySpawnEgg; - mappings[1109] = ItemType.StriderSpawnEgg; - mappings[1110] = ItemType.TadpoleSpawnEgg; - mappings[1111] = ItemType.TraderLlamaSpawnEgg; - mappings[1112] = ItemType.TropicalFishSpawnEgg; - mappings[1113] = ItemType.TurtleSpawnEgg; - mappings[1114] = ItemType.VexSpawnEgg; - mappings[1115] = ItemType.VillagerSpawnEgg; - mappings[1116] = ItemType.VindicatorSpawnEgg; - mappings[1117] = ItemType.WanderingTraderSpawnEgg; - mappings[1118] = ItemType.WardenSpawnEgg; - mappings[1119] = ItemType.WitchSpawnEgg; - mappings[1120] = ItemType.WitherSpawnEgg; - mappings[1121] = ItemType.WitherSkeletonSpawnEgg; - mappings[1122] = ItemType.WolfSpawnEgg; - mappings[1123] = ItemType.ZoglinSpawnEgg; - mappings[1124] = ItemType.CreakingSpawnEgg; - mappings[1125] = ItemType.ZombieSpawnEgg; - mappings[1126] = ItemType.ZombieHorseSpawnEgg; - mappings[1127] = ItemType.ZombieVillagerSpawnEgg; - mappings[1128] = ItemType.ZombifiedPiglinSpawnEgg; - mappings[1129] = ItemType.ExperienceBottle; - mappings[1130] = ItemType.FireCharge; - mappings[1131] = ItemType.WindCharge; - mappings[1132] = ItemType.WritableBook; - mappings[1133] = ItemType.WrittenBook; - mappings[1134] = ItemType.BreezeRod; - mappings[1135] = ItemType.Mace; - mappings[1136] = ItemType.ItemFrame; - mappings[1137] = ItemType.GlowItemFrame; - mappings[1138] = ItemType.FlowerPot; - mappings[1139] = ItemType.Carrot; - mappings[1140] = ItemType.Potato; - mappings[1141] = ItemType.BakedPotato; - mappings[1142] = ItemType.PoisonousPotato; - mappings[1143] = ItemType.Map; - mappings[1144] = ItemType.GoldenCarrot; - mappings[1145] = ItemType.SkeletonSkull; - mappings[1146] = ItemType.WitherSkeletonSkull; - mappings[1147] = ItemType.PlayerHead; - mappings[1148] = ItemType.ZombieHead; - mappings[1149] = ItemType.CreeperHead; - mappings[1150] = ItemType.DragonHead; - mappings[1151] = ItemType.PiglinHead; - mappings[1152] = ItemType.NetherStar; - mappings[1153] = ItemType.PumpkinPie; - mappings[1154] = ItemType.FireworkRocket; - mappings[1155] = ItemType.FireworkStar; - mappings[1156] = ItemType.EnchantedBook; - mappings[1157] = ItemType.NetherBrick; - mappings[1158] = ItemType.PrismarineShard; - mappings[1159] = ItemType.PrismarineCrystals; - mappings[1160] = ItemType.Rabbit; - mappings[1161] = ItemType.CookedRabbit; - mappings[1162] = ItemType.RabbitStew; - mappings[1163] = ItemType.RabbitFoot; - mappings[1164] = ItemType.RabbitHide; - mappings[1165] = ItemType.ArmorStand; - mappings[1166] = ItemType.IronHorseArmor; - mappings[1167] = ItemType.GoldenHorseArmor; - mappings[1168] = ItemType.DiamondHorseArmor; - mappings[1169] = ItemType.LeatherHorseArmor; - mappings[1170] = ItemType.Lead; - mappings[1171] = ItemType.NameTag; - mappings[1172] = ItemType.CommandBlockMinecart; - mappings[1173] = ItemType.Mutton; - mappings[1174] = ItemType.CookedMutton; - mappings[1175] = ItemType.WhiteBanner; - mappings[1176] = ItemType.OrangeBanner; - mappings[1177] = ItemType.MagentaBanner; - mappings[1178] = ItemType.LightBlueBanner; - mappings[1179] = ItemType.YellowBanner; - mappings[1180] = ItemType.LimeBanner; - mappings[1181] = ItemType.PinkBanner; - mappings[1182] = ItemType.GrayBanner; - mappings[1183] = ItemType.LightGrayBanner; - mappings[1184] = ItemType.CyanBanner; - mappings[1185] = ItemType.PurpleBanner; - mappings[1186] = ItemType.BlueBanner; - mappings[1187] = ItemType.BrownBanner; - mappings[1188] = ItemType.GreenBanner; - mappings[1189] = ItemType.RedBanner; - mappings[1190] = ItemType.BlackBanner; - mappings[1191] = ItemType.EndCrystal; - mappings[1192] = ItemType.ChorusFruit; - mappings[1193] = ItemType.PoppedChorusFruit; - mappings[1194] = ItemType.TorchflowerSeeds; - mappings[1195] = ItemType.PitcherPod; - mappings[1196] = ItemType.Beetroot; - mappings[1197] = ItemType.BeetrootSeeds; - mappings[1198] = ItemType.BeetrootSoup; - mappings[1199] = ItemType.DragonBreath; - mappings[1200] = ItemType.SplashPotion; - mappings[1201] = ItemType.SpectralArrow; - mappings[1202] = ItemType.TippedArrow; - mappings[1203] = ItemType.LingeringPotion; - mappings[1204] = ItemType.Shield; - mappings[1205] = ItemType.TotemOfUndying; - mappings[1206] = ItemType.ShulkerShell; - mappings[1207] = ItemType.IronNugget; - mappings[1208] = ItemType.KnowledgeBook; - mappings[1209] = ItemType.DebugStick; - mappings[1210] = ItemType.MusicDisc13; - mappings[1211] = ItemType.MusicDiscCat; - mappings[1212] = ItemType.MusicDiscBlocks; - mappings[1213] = ItemType.MusicDiscChirp; - mappings[1214] = ItemType.MusicDiscCreator; - mappings[1215] = ItemType.MusicDiscCreatorMusicBox; - mappings[1216] = ItemType.MusicDiscFar; - mappings[1217] = ItemType.MusicDiscMall; - mappings[1218] = ItemType.MusicDiscMellohi; - mappings[1219] = ItemType.MusicDiscStal; - mappings[1220] = ItemType.MusicDiscStrad; - mappings[1221] = ItemType.MusicDiscWard; - mappings[1222] = ItemType.MusicDisc11; - mappings[1223] = ItemType.MusicDiscWait; - mappings[1224] = ItemType.MusicDiscOtherside; - mappings[1225] = ItemType.MusicDiscRelic; - mappings[1226] = ItemType.MusicDisc5; - mappings[1227] = ItemType.MusicDiscPigstep; - mappings[1228] = ItemType.MusicDiscPrecipice; - mappings[1229] = ItemType.DiscFragment5; - mappings[1230] = ItemType.Trident; - mappings[1231] = ItemType.NautilusShell; - mappings[1232] = ItemType.HeartOfTheSea; - mappings[1233] = ItemType.Crossbow; - mappings[1234] = ItemType.SuspiciousStew; - mappings[1235] = ItemType.Loom; - mappings[1236] = ItemType.FlowerBannerPattern; - mappings[1237] = ItemType.CreeperBannerPattern; - mappings[1238] = ItemType.SkullBannerPattern; - mappings[1239] = ItemType.MojangBannerPattern; - mappings[1240] = ItemType.GlobeBannerPattern; - mappings[1241] = ItemType.PiglinBannerPattern; - mappings[1242] = ItemType.FlowBannerPattern; - mappings[1243] = ItemType.GusterBannerPattern; - mappings[1244] = ItemType.FieldMasonedBannerPattern; - mappings[1245] = ItemType.BordureIndentedBannerPattern; - mappings[1246] = ItemType.GoatHorn; - mappings[1247] = ItemType.Composter; - mappings[1248] = ItemType.Barrel; - mappings[1249] = ItemType.Smoker; - mappings[1250] = ItemType.BlastFurnace; - mappings[1251] = ItemType.CartographyTable; - mappings[1252] = ItemType.FletchingTable; - mappings[1253] = ItemType.Grindstone; - mappings[1254] = ItemType.SmithingTable; - mappings[1255] = ItemType.Stonecutter; - mappings[1256] = ItemType.Bell; - mappings[1257] = ItemType.Lantern; - mappings[1258] = ItemType.SoulLantern; - mappings[1259] = ItemType.SweetBerries; - mappings[1260] = ItemType.GlowBerries; - mappings[1261] = ItemType.Campfire; - mappings[1262] = ItemType.SoulCampfire; - mappings[1263] = ItemType.Shroomlight; - mappings[1264] = ItemType.Honeycomb; - mappings[1265] = ItemType.BeeNest; - mappings[1266] = ItemType.Beehive; - mappings[1267] = ItemType.HoneyBottle; - mappings[1268] = ItemType.HoneycombBlock; - mappings[1269] = ItemType.Lodestone; - mappings[1270] = ItemType.CryingObsidian; - mappings[1271] = ItemType.Blackstone; - mappings[1272] = ItemType.BlackstoneSlab; - mappings[1273] = ItemType.BlackstoneStairs; - mappings[1274] = ItemType.GildedBlackstone; - mappings[1275] = ItemType.PolishedBlackstone; - mappings[1276] = ItemType.PolishedBlackstoneSlab; - mappings[1277] = ItemType.PolishedBlackstoneStairs; - mappings[1278] = ItemType.ChiseledPolishedBlackstone; - mappings[1279] = ItemType.PolishedBlackstoneBricks; - mappings[1280] = ItemType.PolishedBlackstoneBrickSlab; - mappings[1281] = ItemType.PolishedBlackstoneBrickStairs; - mappings[1282] = ItemType.CrackedPolishedBlackstoneBricks; - mappings[1283] = ItemType.RespawnAnchor; - mappings[1284] = ItemType.Candle; - mappings[1285] = ItemType.WhiteCandle; - mappings[1286] = ItemType.OrangeCandle; - mappings[1287] = ItemType.MagentaCandle; - mappings[1288] = ItemType.LightBlueCandle; - mappings[1289] = ItemType.YellowCandle; - mappings[1290] = ItemType.LimeCandle; - mappings[1291] = ItemType.PinkCandle; - mappings[1292] = ItemType.GrayCandle; - mappings[1293] = ItemType.LightGrayCandle; - mappings[1294] = ItemType.CyanCandle; - mappings[1295] = ItemType.PurpleCandle; - mappings[1296] = ItemType.BlueCandle; - mappings[1297] = ItemType.BrownCandle; - mappings[1298] = ItemType.GreenCandle; - mappings[1299] = ItemType.RedCandle; - mappings[1300] = ItemType.BlackCandle; - mappings[1301] = ItemType.SmallAmethystBud; - mappings[1302] = ItemType.MediumAmethystBud; - mappings[1303] = ItemType.LargeAmethystBud; - mappings[1304] = ItemType.AmethystCluster; - mappings[1305] = ItemType.PointedDripstone; - mappings[1306] = ItemType.OchreFroglight; - mappings[1307] = ItemType.VerdantFroglight; - mappings[1308] = ItemType.PearlescentFroglight; - mappings[1309] = ItemType.Frogspawn; - mappings[1310] = ItemType.EchoShard; - mappings[1311] = ItemType.Brush; - mappings[1312] = ItemType.NetheriteUpgradeSmithingTemplate; - mappings[1313] = ItemType.SentryArmorTrimSmithingTemplate; - mappings[1314] = ItemType.DuneArmorTrimSmithingTemplate; - mappings[1315] = ItemType.CoastArmorTrimSmithingTemplate; - mappings[1316] = ItemType.WildArmorTrimSmithingTemplate; - mappings[1317] = ItemType.WardArmorTrimSmithingTemplate; - mappings[1318] = ItemType.EyeArmorTrimSmithingTemplate; - mappings[1319] = ItemType.VexArmorTrimSmithingTemplate; - mappings[1320] = ItemType.TideArmorTrimSmithingTemplate; - mappings[1321] = ItemType.SnoutArmorTrimSmithingTemplate; - mappings[1322] = ItemType.RibArmorTrimSmithingTemplate; - mappings[1323] = ItemType.SpireArmorTrimSmithingTemplate; - mappings[1324] = ItemType.WayfinderArmorTrimSmithingTemplate; - mappings[1325] = ItemType.ShaperArmorTrimSmithingTemplate; - mappings[1326] = ItemType.SilenceArmorTrimSmithingTemplate; - mappings[1327] = ItemType.RaiserArmorTrimSmithingTemplate; - mappings[1328] = ItemType.HostArmorTrimSmithingTemplate; - mappings[1329] = ItemType.FlowArmorTrimSmithingTemplate; - mappings[1330] = ItemType.BoltArmorTrimSmithingTemplate; - mappings[1331] = ItemType.AnglerPotterySherd; - mappings[1332] = ItemType.ArcherPotterySherd; - mappings[1333] = ItemType.ArmsUpPotterySherd; - mappings[1334] = ItemType.BladePotterySherd; - mappings[1335] = ItemType.BrewerPotterySherd; - mappings[1336] = ItemType.BurnPotterySherd; - mappings[1337] = ItemType.DangerPotterySherd; - mappings[1338] = ItemType.ExplorerPotterySherd; - mappings[1339] = ItemType.FlowPotterySherd; - mappings[1340] = ItemType.FriendPotterySherd; - mappings[1341] = ItemType.GusterPotterySherd; - mappings[1342] = ItemType.HeartPotterySherd; - mappings[1343] = ItemType.HeartbreakPotterySherd; - mappings[1344] = ItemType.HowlPotterySherd; - mappings[1345] = ItemType.MinerPotterySherd; - mappings[1346] = ItemType.MournerPotterySherd; - mappings[1347] = ItemType.PlentyPotterySherd; - mappings[1348] = ItemType.PrizePotterySherd; - mappings[1349] = ItemType.ScrapePotterySherd; - mappings[1350] = ItemType.SheafPotterySherd; - mappings[1351] = ItemType.ShelterPotterySherd; - mappings[1352] = ItemType.SkullPotterySherd; - mappings[1353] = ItemType.SnortPotterySherd; - mappings[1354] = ItemType.CopperGrate; - mappings[1355] = ItemType.ExposedCopperGrate; - mappings[1356] = ItemType.WeatheredCopperGrate; - mappings[1357] = ItemType.OxidizedCopperGrate; - mappings[1358] = ItemType.WaxedCopperGrate; - mappings[1359] = ItemType.WaxedExposedCopperGrate; - mappings[1360] = ItemType.WaxedWeatheredCopperGrate; - mappings[1361] = ItemType.WaxedOxidizedCopperGrate; - mappings[1362] = ItemType.CopperBulb; - mappings[1363] = ItemType.ExposedCopperBulb; - mappings[1364] = ItemType.WeatheredCopperBulb; - mappings[1365] = ItemType.OxidizedCopperBulb; - mappings[1366] = ItemType.WaxedCopperBulb; - mappings[1367] = ItemType.WaxedExposedCopperBulb; - mappings[1368] = ItemType.WaxedWeatheredCopperBulb; - mappings[1369] = ItemType.WaxedOxidizedCopperBulb; - mappings[1370] = ItemType.TrialSpawner; - mappings[1371] = ItemType.TrialKey; - mappings[1372] = ItemType.OminousTrialKey; - mappings[1373] = ItemType.Vault; - mappings[1374] = ItemType.OminousBottle; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1214.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette1214.cs deleted file mode 100644 index c0cf85a8fd..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1214.cs +++ /dev/null @@ -1,1403 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public class ItemPalette1214 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette1214() - { - mappings[0] = ItemType.Air; - mappings[1] = ItemType.Stone; - mappings[2] = ItemType.Granite; - mappings[3] = ItemType.PolishedGranite; - mappings[4] = ItemType.Diorite; - mappings[5] = ItemType.PolishedDiorite; - mappings[6] = ItemType.Andesite; - mappings[7] = ItemType.PolishedAndesite; - mappings[8] = ItemType.Deepslate; - mappings[9] = ItemType.CobbledDeepslate; - mappings[10] = ItemType.PolishedDeepslate; - mappings[11] = ItemType.Calcite; - mappings[12] = ItemType.Tuff; - mappings[13] = ItemType.TuffSlab; - mappings[14] = ItemType.TuffStairs; - mappings[15] = ItemType.TuffWall; - mappings[16] = ItemType.ChiseledTuff; - mappings[17] = ItemType.PolishedTuff; - mappings[18] = ItemType.PolishedTuffSlab; - mappings[19] = ItemType.PolishedTuffStairs; - mappings[20] = ItemType.PolishedTuffWall; - mappings[21] = ItemType.TuffBricks; - mappings[22] = ItemType.TuffBrickSlab; - mappings[23] = ItemType.TuffBrickStairs; - mappings[24] = ItemType.TuffBrickWall; - mappings[25] = ItemType.ChiseledTuffBricks; - mappings[26] = ItemType.DripstoneBlock; - mappings[27] = ItemType.GrassBlock; - mappings[28] = ItemType.Dirt; - mappings[29] = ItemType.CoarseDirt; - mappings[30] = ItemType.Podzol; - mappings[31] = ItemType.RootedDirt; - mappings[32] = ItemType.Mud; - mappings[33] = ItemType.CrimsonNylium; - mappings[34] = ItemType.WarpedNylium; - mappings[35] = ItemType.Cobblestone; - mappings[36] = ItemType.OakPlanks; - mappings[37] = ItemType.SprucePlanks; - mappings[38] = ItemType.BirchPlanks; - mappings[39] = ItemType.JunglePlanks; - mappings[40] = ItemType.AcaciaPlanks; - mappings[41] = ItemType.CherryPlanks; - mappings[42] = ItemType.DarkOakPlanks; - mappings[43] = ItemType.PaleOakPlanks; - mappings[44] = ItemType.MangrovePlanks; - mappings[45] = ItemType.BambooPlanks; - mappings[46] = ItemType.CrimsonPlanks; - mappings[47] = ItemType.WarpedPlanks; - mappings[48] = ItemType.BambooMosaic; - mappings[49] = ItemType.OakSapling; - mappings[50] = ItemType.SpruceSapling; - mappings[51] = ItemType.BirchSapling; - mappings[52] = ItemType.JungleSapling; - mappings[53] = ItemType.AcaciaSapling; - mappings[54] = ItemType.CherrySapling; - mappings[55] = ItemType.DarkOakSapling; - mappings[56] = ItemType.PaleOakSapling; - mappings[57] = ItemType.MangrovePropagule; - mappings[58] = ItemType.Bedrock; - mappings[59] = ItemType.Sand; - mappings[60] = ItemType.SuspiciousSand; - mappings[61] = ItemType.SuspiciousGravel; - mappings[62] = ItemType.RedSand; - mappings[63] = ItemType.Gravel; - mappings[64] = ItemType.CoalOre; - mappings[65] = ItemType.DeepslateCoalOre; - mappings[66] = ItemType.IronOre; - mappings[67] = ItemType.DeepslateIronOre; - mappings[68] = ItemType.CopperOre; - mappings[69] = ItemType.DeepslateCopperOre; - mappings[70] = ItemType.GoldOre; - mappings[71] = ItemType.DeepslateGoldOre; - mappings[72] = ItemType.RedstoneOre; - mappings[73] = ItemType.DeepslateRedstoneOre; - mappings[74] = ItemType.EmeraldOre; - mappings[75] = ItemType.DeepslateEmeraldOre; - mappings[76] = ItemType.LapisOre; - mappings[77] = ItemType.DeepslateLapisOre; - mappings[78] = ItemType.DiamondOre; - mappings[79] = ItemType.DeepslateDiamondOre; - mappings[80] = ItemType.NetherGoldOre; - mappings[81] = ItemType.NetherQuartzOre; - mappings[82] = ItemType.AncientDebris; - mappings[83] = ItemType.CoalBlock; - mappings[84] = ItemType.RawIronBlock; - mappings[85] = ItemType.RawCopperBlock; - mappings[86] = ItemType.RawGoldBlock; - mappings[87] = ItemType.HeavyCore; - mappings[88] = ItemType.AmethystBlock; - mappings[89] = ItemType.BuddingAmethyst; - mappings[90] = ItemType.IronBlock; - mappings[91] = ItemType.CopperBlock; - mappings[92] = ItemType.GoldBlock; - mappings[93] = ItemType.DiamondBlock; - mappings[94] = ItemType.NetheriteBlock; - mappings[95] = ItemType.ExposedCopper; - mappings[96] = ItemType.WeatheredCopper; - mappings[97] = ItemType.OxidizedCopper; - mappings[98] = ItemType.ChiseledCopper; - mappings[99] = ItemType.ExposedChiseledCopper; - mappings[100] = ItemType.WeatheredChiseledCopper; - mappings[101] = ItemType.OxidizedChiseledCopper; - mappings[102] = ItemType.CutCopper; - mappings[103] = ItemType.ExposedCutCopper; - mappings[104] = ItemType.WeatheredCutCopper; - mappings[105] = ItemType.OxidizedCutCopper; - mappings[106] = ItemType.CutCopperStairs; - mappings[107] = ItemType.ExposedCutCopperStairs; - mappings[108] = ItemType.WeatheredCutCopperStairs; - mappings[109] = ItemType.OxidizedCutCopperStairs; - mappings[110] = ItemType.CutCopperSlab; - mappings[111] = ItemType.ExposedCutCopperSlab; - mappings[112] = ItemType.WeatheredCutCopperSlab; - mappings[113] = ItemType.OxidizedCutCopperSlab; - mappings[114] = ItemType.WaxedCopperBlock; - mappings[115] = ItemType.WaxedExposedCopper; - mappings[116] = ItemType.WaxedWeatheredCopper; - mappings[117] = ItemType.WaxedOxidizedCopper; - mappings[118] = ItemType.WaxedChiseledCopper; - mappings[119] = ItemType.WaxedExposedChiseledCopper; - mappings[120] = ItemType.WaxedWeatheredChiseledCopper; - mappings[121] = ItemType.WaxedOxidizedChiseledCopper; - mappings[122] = ItemType.WaxedCutCopper; - mappings[123] = ItemType.WaxedExposedCutCopper; - mappings[124] = ItemType.WaxedWeatheredCutCopper; - mappings[125] = ItemType.WaxedOxidizedCutCopper; - mappings[126] = ItemType.WaxedCutCopperStairs; - mappings[127] = ItemType.WaxedExposedCutCopperStairs; - mappings[128] = ItemType.WaxedWeatheredCutCopperStairs; - mappings[129] = ItemType.WaxedOxidizedCutCopperStairs; - mappings[130] = ItemType.WaxedCutCopperSlab; - mappings[131] = ItemType.WaxedExposedCutCopperSlab; - mappings[132] = ItemType.WaxedWeatheredCutCopperSlab; - mappings[133] = ItemType.WaxedOxidizedCutCopperSlab; - mappings[134] = ItemType.OakLog; - mappings[135] = ItemType.SpruceLog; - mappings[136] = ItemType.BirchLog; - mappings[137] = ItemType.JungleLog; - mappings[138] = ItemType.AcaciaLog; - mappings[139] = ItemType.CherryLog; - mappings[140] = ItemType.PaleOakLog; - mappings[141] = ItemType.DarkOakLog; - mappings[142] = ItemType.MangroveLog; - mappings[143] = ItemType.MangroveRoots; - mappings[144] = ItemType.MuddyMangroveRoots; - mappings[145] = ItemType.CrimsonStem; - mappings[146] = ItemType.WarpedStem; - mappings[147] = ItemType.BambooBlock; - mappings[148] = ItemType.StrippedOakLog; - mappings[149] = ItemType.StrippedSpruceLog; - mappings[150] = ItemType.StrippedBirchLog; - mappings[151] = ItemType.StrippedJungleLog; - mappings[152] = ItemType.StrippedAcaciaLog; - mappings[153] = ItemType.StrippedCherryLog; - mappings[154] = ItemType.StrippedDarkOakLog; - mappings[155] = ItemType.StrippedPaleOakLog; - mappings[156] = ItemType.StrippedMangroveLog; - mappings[157] = ItemType.StrippedCrimsonStem; - mappings[158] = ItemType.StrippedWarpedStem; - mappings[159] = ItemType.StrippedOakWood; - mappings[160] = ItemType.StrippedSpruceWood; - mappings[161] = ItemType.StrippedBirchWood; - mappings[162] = ItemType.StrippedJungleWood; - mappings[163] = ItemType.StrippedAcaciaWood; - mappings[164] = ItemType.StrippedCherryWood; - mappings[165] = ItemType.StrippedDarkOakWood; - mappings[166] = ItemType.StrippedPaleOakWood; - mappings[167] = ItemType.StrippedMangroveWood; - mappings[168] = ItemType.StrippedCrimsonHyphae; - mappings[169] = ItemType.StrippedWarpedHyphae; - mappings[170] = ItemType.StrippedBambooBlock; - mappings[171] = ItemType.OakWood; - mappings[172] = ItemType.SpruceWood; - mappings[173] = ItemType.BirchWood; - mappings[174] = ItemType.JungleWood; - mappings[175] = ItemType.AcaciaWood; - mappings[176] = ItemType.CherryWood; - mappings[177] = ItemType.PaleOakWood; - mappings[178] = ItemType.DarkOakWood; - mappings[179] = ItemType.MangroveWood; - mappings[180] = ItemType.CrimsonHyphae; - mappings[181] = ItemType.WarpedHyphae; - mappings[182] = ItemType.OakLeaves; - mappings[183] = ItemType.SpruceLeaves; - mappings[184] = ItemType.BirchLeaves; - mappings[185] = ItemType.JungleLeaves; - mappings[186] = ItemType.AcaciaLeaves; - mappings[187] = ItemType.CherryLeaves; - mappings[188] = ItemType.DarkOakLeaves; - mappings[189] = ItemType.PaleOakLeaves; - mappings[190] = ItemType.MangroveLeaves; - mappings[191] = ItemType.AzaleaLeaves; - mappings[192] = ItemType.FloweringAzaleaLeaves; - mappings[193] = ItemType.Sponge; - mappings[194] = ItemType.WetSponge; - mappings[195] = ItemType.Glass; - mappings[196] = ItemType.TintedGlass; - mappings[197] = ItemType.LapisBlock; - mappings[198] = ItemType.Sandstone; - mappings[199] = ItemType.ChiseledSandstone; - mappings[200] = ItemType.CutSandstone; - mappings[201] = ItemType.Cobweb; - mappings[202] = ItemType.ShortGrass; - mappings[203] = ItemType.Fern; - mappings[204] = ItemType.Azalea; - mappings[205] = ItemType.FloweringAzalea; - mappings[206] = ItemType.DeadBush; - mappings[207] = ItemType.Seagrass; - mappings[208] = ItemType.SeaPickle; - mappings[209] = ItemType.WhiteWool; - mappings[210] = ItemType.OrangeWool; - mappings[211] = ItemType.MagentaWool; - mappings[212] = ItemType.LightBlueWool; - mappings[213] = ItemType.YellowWool; - mappings[214] = ItemType.LimeWool; - mappings[215] = ItemType.PinkWool; - mappings[216] = ItemType.GrayWool; - mappings[217] = ItemType.LightGrayWool; - mappings[218] = ItemType.CyanWool; - mappings[219] = ItemType.PurpleWool; - mappings[220] = ItemType.BlueWool; - mappings[221] = ItemType.BrownWool; - mappings[222] = ItemType.GreenWool; - mappings[223] = ItemType.RedWool; - mappings[224] = ItemType.BlackWool; - mappings[225] = ItemType.Dandelion; - mappings[226] = ItemType.OpenEyeblossom; - mappings[227] = ItemType.ClosedEyeblossom; - mappings[228] = ItemType.Poppy; - mappings[229] = ItemType.BlueOrchid; - mappings[230] = ItemType.Allium; - mappings[231] = ItemType.AzureBluet; - mappings[232] = ItemType.RedTulip; - mappings[233] = ItemType.OrangeTulip; - mappings[234] = ItemType.WhiteTulip; - mappings[235] = ItemType.PinkTulip; - mappings[236] = ItemType.OxeyeDaisy; - mappings[237] = ItemType.Cornflower; - mappings[238] = ItemType.LilyOfTheValley; - mappings[239] = ItemType.WitherRose; - mappings[240] = ItemType.Torchflower; - mappings[241] = ItemType.PitcherPlant; - mappings[242] = ItemType.SporeBlossom; - mappings[243] = ItemType.BrownMushroom; - mappings[244] = ItemType.RedMushroom; - mappings[245] = ItemType.CrimsonFungus; - mappings[246] = ItemType.WarpedFungus; - mappings[247] = ItemType.CrimsonRoots; - mappings[248] = ItemType.WarpedRoots; - mappings[249] = ItemType.NetherSprouts; - mappings[250] = ItemType.WeepingVines; - mappings[251] = ItemType.TwistingVines; - mappings[252] = ItemType.SugarCane; - mappings[253] = ItemType.Kelp; - mappings[254] = ItemType.PinkPetals; - mappings[255] = ItemType.MossCarpet; - mappings[256] = ItemType.MossBlock; - mappings[257] = ItemType.PaleMossCarpet; - mappings[258] = ItemType.PaleHangingMoss; - mappings[259] = ItemType.PaleMossBlock; - mappings[260] = ItemType.HangingRoots; - mappings[261] = ItemType.BigDripleaf; - mappings[262] = ItemType.SmallDripleaf; - mappings[263] = ItemType.Bamboo; - mappings[264] = ItemType.OakSlab; - mappings[265] = ItemType.SpruceSlab; - mappings[266] = ItemType.BirchSlab; - mappings[267] = ItemType.JungleSlab; - mappings[268] = ItemType.AcaciaSlab; - mappings[269] = ItemType.CherrySlab; - mappings[270] = ItemType.DarkOakSlab; - mappings[271] = ItemType.PaleOakSlab; - mappings[272] = ItemType.MangroveSlab; - mappings[273] = ItemType.BambooSlab; - mappings[274] = ItemType.BambooMosaicSlab; - mappings[275] = ItemType.CrimsonSlab; - mappings[276] = ItemType.WarpedSlab; - mappings[277] = ItemType.StoneSlab; - mappings[278] = ItemType.SmoothStoneSlab; - mappings[279] = ItemType.SandstoneSlab; - mappings[280] = ItemType.CutSandstoneSlab; - mappings[281] = ItemType.PetrifiedOakSlab; - mappings[282] = ItemType.CobblestoneSlab; - mappings[283] = ItemType.BrickSlab; - mappings[284] = ItemType.StoneBrickSlab; - mappings[285] = ItemType.MudBrickSlab; - mappings[286] = ItemType.NetherBrickSlab; - mappings[287] = ItemType.QuartzSlab; - mappings[288] = ItemType.RedSandstoneSlab; - mappings[289] = ItemType.CutRedSandstoneSlab; - mappings[290] = ItemType.PurpurSlab; - mappings[291] = ItemType.PrismarineSlab; - mappings[292] = ItemType.PrismarineBrickSlab; - mappings[293] = ItemType.DarkPrismarineSlab; - mappings[294] = ItemType.SmoothQuartz; - mappings[295] = ItemType.SmoothRedSandstone; - mappings[296] = ItemType.SmoothSandstone; - mappings[297] = ItemType.SmoothStone; - mappings[298] = ItemType.Bricks; - mappings[299] = ItemType.Bookshelf; - mappings[300] = ItemType.ChiseledBookshelf; - mappings[301] = ItemType.DecoratedPot; - mappings[302] = ItemType.MossyCobblestone; - mappings[303] = ItemType.Obsidian; - mappings[304] = ItemType.Torch; - mappings[305] = ItemType.EndRod; - mappings[306] = ItemType.ChorusPlant; - mappings[307] = ItemType.ChorusFlower; - mappings[308] = ItemType.PurpurBlock; - mappings[309] = ItemType.PurpurPillar; - mappings[310] = ItemType.PurpurStairs; - mappings[311] = ItemType.Spawner; - mappings[312] = ItemType.CreakingHeart; - mappings[313] = ItemType.Chest; - mappings[314] = ItemType.CraftingTable; - mappings[315] = ItemType.Farmland; - mappings[316] = ItemType.Furnace; - mappings[317] = ItemType.Ladder; - mappings[318] = ItemType.CobblestoneStairs; - mappings[319] = ItemType.Snow; - mappings[320] = ItemType.Ice; - mappings[321] = ItemType.SnowBlock; - mappings[322] = ItemType.Cactus; - mappings[323] = ItemType.Clay; - mappings[324] = ItemType.Jukebox; - mappings[325] = ItemType.OakFence; - mappings[326] = ItemType.SpruceFence; - mappings[327] = ItemType.BirchFence; - mappings[328] = ItemType.JungleFence; - mappings[329] = ItemType.AcaciaFence; - mappings[330] = ItemType.CherryFence; - mappings[331] = ItemType.DarkOakFence; - mappings[332] = ItemType.PaleOakFence; - mappings[333] = ItemType.MangroveFence; - mappings[334] = ItemType.BambooFence; - mappings[335] = ItemType.CrimsonFence; - mappings[336] = ItemType.WarpedFence; - mappings[337] = ItemType.Pumpkin; - mappings[338] = ItemType.CarvedPumpkin; - mappings[339] = ItemType.JackOLantern; - mappings[340] = ItemType.Netherrack; - mappings[341] = ItemType.SoulSand; - mappings[342] = ItemType.SoulSoil; - mappings[343] = ItemType.Basalt; - mappings[344] = ItemType.PolishedBasalt; - mappings[345] = ItemType.SmoothBasalt; - mappings[346] = ItemType.SoulTorch; - mappings[347] = ItemType.Glowstone; - mappings[348] = ItemType.InfestedStone; - mappings[349] = ItemType.InfestedCobblestone; - mappings[350] = ItemType.InfestedStoneBricks; - mappings[351] = ItemType.InfestedMossyStoneBricks; - mappings[352] = ItemType.InfestedCrackedStoneBricks; - mappings[353] = ItemType.InfestedChiseledStoneBricks; - mappings[354] = ItemType.InfestedDeepslate; - mappings[355] = ItemType.StoneBricks; - mappings[356] = ItemType.MossyStoneBricks; - mappings[357] = ItemType.CrackedStoneBricks; - mappings[358] = ItemType.ChiseledStoneBricks; - mappings[359] = ItemType.PackedMud; - mappings[360] = ItemType.MudBricks; - mappings[361] = ItemType.DeepslateBricks; - mappings[362] = ItemType.CrackedDeepslateBricks; - mappings[363] = ItemType.DeepslateTiles; - mappings[364] = ItemType.CrackedDeepslateTiles; - mappings[365] = ItemType.ChiseledDeepslate; - mappings[366] = ItemType.ReinforcedDeepslate; - mappings[367] = ItemType.BrownMushroomBlock; - mappings[368] = ItemType.RedMushroomBlock; - mappings[369] = ItemType.MushroomStem; - mappings[370] = ItemType.IronBars; - mappings[371] = ItemType.Chain; - mappings[372] = ItemType.GlassPane; - mappings[373] = ItemType.Melon; - mappings[374] = ItemType.Vine; - mappings[375] = ItemType.GlowLichen; - mappings[376] = ItemType.ResinClump; - mappings[377] = ItemType.ResinBlock; - mappings[378] = ItemType.ResinBricks; - mappings[379] = ItemType.ResinBrickStairs; - mappings[380] = ItemType.ResinBrickSlab; - mappings[381] = ItemType.ResinBrickWall; - mappings[382] = ItemType.ChiseledResinBricks; - mappings[383] = ItemType.BrickStairs; - mappings[384] = ItemType.StoneBrickStairs; - mappings[385] = ItemType.MudBrickStairs; - mappings[386] = ItemType.Mycelium; - mappings[387] = ItemType.LilyPad; - mappings[388] = ItemType.NetherBricks; - mappings[389] = ItemType.CrackedNetherBricks; - mappings[390] = ItemType.ChiseledNetherBricks; - mappings[391] = ItemType.NetherBrickFence; - mappings[392] = ItemType.NetherBrickStairs; - mappings[393] = ItemType.Sculk; - mappings[394] = ItemType.SculkVein; - mappings[395] = ItemType.SculkCatalyst; - mappings[396] = ItemType.SculkShrieker; - mappings[397] = ItemType.EnchantingTable; - mappings[398] = ItemType.EndPortalFrame; - mappings[399] = ItemType.EndStone; - mappings[400] = ItemType.EndStoneBricks; - mappings[401] = ItemType.DragonEgg; - mappings[402] = ItemType.SandstoneStairs; - mappings[403] = ItemType.EnderChest; - mappings[404] = ItemType.EmeraldBlock; - mappings[405] = ItemType.OakStairs; - mappings[406] = ItemType.SpruceStairs; - mappings[407] = ItemType.BirchStairs; - mappings[408] = ItemType.JungleStairs; - mappings[409] = ItemType.AcaciaStairs; - mappings[410] = ItemType.CherryStairs; - mappings[411] = ItemType.DarkOakStairs; - mappings[412] = ItemType.PaleOakStairs; - mappings[413] = ItemType.MangroveStairs; - mappings[414] = ItemType.BambooStairs; - mappings[415] = ItemType.BambooMosaicStairs; - mappings[416] = ItemType.CrimsonStairs; - mappings[417] = ItemType.WarpedStairs; - mappings[418] = ItemType.CommandBlock; - mappings[419] = ItemType.Beacon; - mappings[420] = ItemType.CobblestoneWall; - mappings[421] = ItemType.MossyCobblestoneWall; - mappings[422] = ItemType.BrickWall; - mappings[423] = ItemType.PrismarineWall; - mappings[424] = ItemType.RedSandstoneWall; - mappings[425] = ItemType.MossyStoneBrickWall; - mappings[426] = ItemType.GraniteWall; - mappings[427] = ItemType.StoneBrickWall; - mappings[428] = ItemType.MudBrickWall; - mappings[429] = ItemType.NetherBrickWall; - mappings[430] = ItemType.AndesiteWall; - mappings[431] = ItemType.RedNetherBrickWall; - mappings[432] = ItemType.SandstoneWall; - mappings[433] = ItemType.EndStoneBrickWall; - mappings[434] = ItemType.DioriteWall; - mappings[435] = ItemType.BlackstoneWall; - mappings[436] = ItemType.PolishedBlackstoneWall; - mappings[437] = ItemType.PolishedBlackstoneBrickWall; - mappings[438] = ItemType.CobbledDeepslateWall; - mappings[439] = ItemType.PolishedDeepslateWall; - mappings[440] = ItemType.DeepslateBrickWall; - mappings[441] = ItemType.DeepslateTileWall; - mappings[442] = ItemType.Anvil; - mappings[443] = ItemType.ChippedAnvil; - mappings[444] = ItemType.DamagedAnvil; - mappings[445] = ItemType.ChiseledQuartzBlock; - mappings[446] = ItemType.QuartzBlock; - mappings[447] = ItemType.QuartzBricks; - mappings[448] = ItemType.QuartzPillar; - mappings[449] = ItemType.QuartzStairs; - mappings[450] = ItemType.WhiteTerracotta; - mappings[451] = ItemType.OrangeTerracotta; - mappings[452] = ItemType.MagentaTerracotta; - mappings[453] = ItemType.LightBlueTerracotta; - mappings[454] = ItemType.YellowTerracotta; - mappings[455] = ItemType.LimeTerracotta; - mappings[456] = ItemType.PinkTerracotta; - mappings[457] = ItemType.GrayTerracotta; - mappings[458] = ItemType.LightGrayTerracotta; - mappings[459] = ItemType.CyanTerracotta; - mappings[460] = ItemType.PurpleTerracotta; - mappings[461] = ItemType.BlueTerracotta; - mappings[462] = ItemType.BrownTerracotta; - mappings[463] = ItemType.GreenTerracotta; - mappings[464] = ItemType.RedTerracotta; - mappings[465] = ItemType.BlackTerracotta; - mappings[466] = ItemType.Barrier; - mappings[467] = ItemType.Light; - mappings[468] = ItemType.HayBlock; - mappings[469] = ItemType.WhiteCarpet; - mappings[470] = ItemType.OrangeCarpet; - mappings[471] = ItemType.MagentaCarpet; - mappings[472] = ItemType.LightBlueCarpet; - mappings[473] = ItemType.YellowCarpet; - mappings[474] = ItemType.LimeCarpet; - mappings[475] = ItemType.PinkCarpet; - mappings[476] = ItemType.GrayCarpet; - mappings[477] = ItemType.LightGrayCarpet; - mappings[478] = ItemType.CyanCarpet; - mappings[479] = ItemType.PurpleCarpet; - mappings[480] = ItemType.BlueCarpet; - mappings[481] = ItemType.BrownCarpet; - mappings[482] = ItemType.GreenCarpet; - mappings[483] = ItemType.RedCarpet; - mappings[484] = ItemType.BlackCarpet; - mappings[485] = ItemType.Terracotta; - mappings[486] = ItemType.PackedIce; - mappings[487] = ItemType.DirtPath; - mappings[488] = ItemType.Sunflower; - mappings[489] = ItemType.Lilac; - mappings[490] = ItemType.RoseBush; - mappings[491] = ItemType.Peony; - mappings[492] = ItemType.TallGrass; - mappings[493] = ItemType.LargeFern; - mappings[494] = ItemType.WhiteStainedGlass; - mappings[495] = ItemType.OrangeStainedGlass; - mappings[496] = ItemType.MagentaStainedGlass; - mappings[497] = ItemType.LightBlueStainedGlass; - mappings[498] = ItemType.YellowStainedGlass; - mappings[499] = ItemType.LimeStainedGlass; - mappings[500] = ItemType.PinkStainedGlass; - mappings[501] = ItemType.GrayStainedGlass; - mappings[502] = ItemType.LightGrayStainedGlass; - mappings[503] = ItemType.CyanStainedGlass; - mappings[504] = ItemType.PurpleStainedGlass; - mappings[505] = ItemType.BlueStainedGlass; - mappings[506] = ItemType.BrownStainedGlass; - mappings[507] = ItemType.GreenStainedGlass; - mappings[508] = ItemType.RedStainedGlass; - mappings[509] = ItemType.BlackStainedGlass; - mappings[510] = ItemType.WhiteStainedGlassPane; - mappings[511] = ItemType.OrangeStainedGlassPane; - mappings[512] = ItemType.MagentaStainedGlassPane; - mappings[513] = ItemType.LightBlueStainedGlassPane; - mappings[514] = ItemType.YellowStainedGlassPane; - mappings[515] = ItemType.LimeStainedGlassPane; - mappings[516] = ItemType.PinkStainedGlassPane; - mappings[517] = ItemType.GrayStainedGlassPane; - mappings[518] = ItemType.LightGrayStainedGlassPane; - mappings[519] = ItemType.CyanStainedGlassPane; - mappings[520] = ItemType.PurpleStainedGlassPane; - mappings[521] = ItemType.BlueStainedGlassPane; - mappings[522] = ItemType.BrownStainedGlassPane; - mappings[523] = ItemType.GreenStainedGlassPane; - mappings[524] = ItemType.RedStainedGlassPane; - mappings[525] = ItemType.BlackStainedGlassPane; - mappings[526] = ItemType.Prismarine; - mappings[527] = ItemType.PrismarineBricks; - mappings[528] = ItemType.DarkPrismarine; - mappings[529] = ItemType.PrismarineStairs; - mappings[530] = ItemType.PrismarineBrickStairs; - mappings[531] = ItemType.DarkPrismarineStairs; - mappings[532] = ItemType.SeaLantern; - mappings[533] = ItemType.RedSandstone; - mappings[534] = ItemType.ChiseledRedSandstone; - mappings[535] = ItemType.CutRedSandstone; - mappings[536] = ItemType.RedSandstoneStairs; - mappings[537] = ItemType.RepeatingCommandBlock; - mappings[538] = ItemType.ChainCommandBlock; - mappings[539] = ItemType.MagmaBlock; - mappings[540] = ItemType.NetherWartBlock; - mappings[541] = ItemType.WarpedWartBlock; - mappings[542] = ItemType.RedNetherBricks; - mappings[543] = ItemType.BoneBlock; - mappings[544] = ItemType.StructureVoid; - mappings[545] = ItemType.ShulkerBox; - mappings[546] = ItemType.WhiteShulkerBox; - mappings[547] = ItemType.OrangeShulkerBox; - mappings[548] = ItemType.MagentaShulkerBox; - mappings[549] = ItemType.LightBlueShulkerBox; - mappings[550] = ItemType.YellowShulkerBox; - mappings[551] = ItemType.LimeShulkerBox; - mappings[552] = ItemType.PinkShulkerBox; - mappings[553] = ItemType.GrayShulkerBox; - mappings[554] = ItemType.LightGrayShulkerBox; - mappings[555] = ItemType.CyanShulkerBox; - mappings[556] = ItemType.PurpleShulkerBox; - mappings[557] = ItemType.BlueShulkerBox; - mappings[558] = ItemType.BrownShulkerBox; - mappings[559] = ItemType.GreenShulkerBox; - mappings[560] = ItemType.RedShulkerBox; - mappings[561] = ItemType.BlackShulkerBox; - mappings[562] = ItemType.WhiteGlazedTerracotta; - mappings[563] = ItemType.OrangeGlazedTerracotta; - mappings[564] = ItemType.MagentaGlazedTerracotta; - mappings[565] = ItemType.LightBlueGlazedTerracotta; - mappings[566] = ItemType.YellowGlazedTerracotta; - mappings[567] = ItemType.LimeGlazedTerracotta; - mappings[568] = ItemType.PinkGlazedTerracotta; - mappings[569] = ItemType.GrayGlazedTerracotta; - mappings[570] = ItemType.LightGrayGlazedTerracotta; - mappings[571] = ItemType.CyanGlazedTerracotta; - mappings[572] = ItemType.PurpleGlazedTerracotta; - mappings[573] = ItemType.BlueGlazedTerracotta; - mappings[574] = ItemType.BrownGlazedTerracotta; - mappings[575] = ItemType.GreenGlazedTerracotta; - mappings[576] = ItemType.RedGlazedTerracotta; - mappings[577] = ItemType.BlackGlazedTerracotta; - mappings[578] = ItemType.WhiteConcrete; - mappings[579] = ItemType.OrangeConcrete; - mappings[580] = ItemType.MagentaConcrete; - mappings[581] = ItemType.LightBlueConcrete; - mappings[582] = ItemType.YellowConcrete; - mappings[583] = ItemType.LimeConcrete; - mappings[584] = ItemType.PinkConcrete; - mappings[585] = ItemType.GrayConcrete; - mappings[586] = ItemType.LightGrayConcrete; - mappings[587] = ItemType.CyanConcrete; - mappings[588] = ItemType.PurpleConcrete; - mappings[589] = ItemType.BlueConcrete; - mappings[590] = ItemType.BrownConcrete; - mappings[591] = ItemType.GreenConcrete; - mappings[592] = ItemType.RedConcrete; - mappings[593] = ItemType.BlackConcrete; - mappings[594] = ItemType.WhiteConcretePowder; - mappings[595] = ItemType.OrangeConcretePowder; - mappings[596] = ItemType.MagentaConcretePowder; - mappings[597] = ItemType.LightBlueConcretePowder; - mappings[598] = ItemType.YellowConcretePowder; - mappings[599] = ItemType.LimeConcretePowder; - mappings[600] = ItemType.PinkConcretePowder; - mappings[601] = ItemType.GrayConcretePowder; - mappings[602] = ItemType.LightGrayConcretePowder; - mappings[603] = ItemType.CyanConcretePowder; - mappings[604] = ItemType.PurpleConcretePowder; - mappings[605] = ItemType.BlueConcretePowder; - mappings[606] = ItemType.BrownConcretePowder; - mappings[607] = ItemType.GreenConcretePowder; - mappings[608] = ItemType.RedConcretePowder; - mappings[609] = ItemType.BlackConcretePowder; - mappings[610] = ItemType.TurtleEgg; - mappings[611] = ItemType.SnifferEgg; - mappings[612] = ItemType.DeadTubeCoralBlock; - mappings[613] = ItemType.DeadBrainCoralBlock; - mappings[614] = ItemType.DeadBubbleCoralBlock; - mappings[615] = ItemType.DeadFireCoralBlock; - mappings[616] = ItemType.DeadHornCoralBlock; - mappings[617] = ItemType.TubeCoralBlock; - mappings[618] = ItemType.BrainCoralBlock; - mappings[619] = ItemType.BubbleCoralBlock; - mappings[620] = ItemType.FireCoralBlock; - mappings[621] = ItemType.HornCoralBlock; - mappings[622] = ItemType.TubeCoral; - mappings[623] = ItemType.BrainCoral; - mappings[624] = ItemType.BubbleCoral; - mappings[625] = ItemType.FireCoral; - mappings[626] = ItemType.HornCoral; - mappings[627] = ItemType.DeadBrainCoral; - mappings[628] = ItemType.DeadBubbleCoral; - mappings[629] = ItemType.DeadFireCoral; - mappings[630] = ItemType.DeadHornCoral; - mappings[631] = ItemType.DeadTubeCoral; - mappings[632] = ItemType.TubeCoralFan; - mappings[633] = ItemType.BrainCoralFan; - mappings[634] = ItemType.BubbleCoralFan; - mappings[635] = ItemType.FireCoralFan; - mappings[636] = ItemType.HornCoralFan; - mappings[637] = ItemType.DeadTubeCoralFan; - mappings[638] = ItemType.DeadBrainCoralFan; - mappings[639] = ItemType.DeadBubbleCoralFan; - mappings[640] = ItemType.DeadFireCoralFan; - mappings[641] = ItemType.DeadHornCoralFan; - mappings[642] = ItemType.BlueIce; - mappings[643] = ItemType.Conduit; - mappings[644] = ItemType.PolishedGraniteStairs; - mappings[645] = ItemType.SmoothRedSandstoneStairs; - mappings[646] = ItemType.MossyStoneBrickStairs; - mappings[647] = ItemType.PolishedDioriteStairs; - mappings[648] = ItemType.MossyCobblestoneStairs; - mappings[649] = ItemType.EndStoneBrickStairs; - mappings[650] = ItemType.StoneStairs; - mappings[651] = ItemType.SmoothSandstoneStairs; - mappings[652] = ItemType.SmoothQuartzStairs; - mappings[653] = ItemType.GraniteStairs; - mappings[654] = ItemType.AndesiteStairs; - mappings[655] = ItemType.RedNetherBrickStairs; - mappings[656] = ItemType.PolishedAndesiteStairs; - mappings[657] = ItemType.DioriteStairs; - mappings[658] = ItemType.CobbledDeepslateStairs; - mappings[659] = ItemType.PolishedDeepslateStairs; - mappings[660] = ItemType.DeepslateBrickStairs; - mappings[661] = ItemType.DeepslateTileStairs; - mappings[662] = ItemType.PolishedGraniteSlab; - mappings[663] = ItemType.SmoothRedSandstoneSlab; - mappings[664] = ItemType.MossyStoneBrickSlab; - mappings[665] = ItemType.PolishedDioriteSlab; - mappings[666] = ItemType.MossyCobblestoneSlab; - mappings[667] = ItemType.EndStoneBrickSlab; - mappings[668] = ItemType.SmoothSandstoneSlab; - mappings[669] = ItemType.SmoothQuartzSlab; - mappings[670] = ItemType.GraniteSlab; - mappings[671] = ItemType.AndesiteSlab; - mappings[672] = ItemType.RedNetherBrickSlab; - mappings[673] = ItemType.PolishedAndesiteSlab; - mappings[674] = ItemType.DioriteSlab; - mappings[675] = ItemType.CobbledDeepslateSlab; - mappings[676] = ItemType.PolishedDeepslateSlab; - mappings[677] = ItemType.DeepslateBrickSlab; - mappings[678] = ItemType.DeepslateTileSlab; - mappings[679] = ItemType.Scaffolding; - mappings[680] = ItemType.Redstone; - mappings[681] = ItemType.RedstoneTorch; - mappings[682] = ItemType.RedstoneBlock; - mappings[683] = ItemType.Repeater; - mappings[684] = ItemType.Comparator; - mappings[685] = ItemType.Piston; - mappings[686] = ItemType.StickyPiston; - mappings[687] = ItemType.SlimeBlock; - mappings[688] = ItemType.HoneyBlock; - mappings[689] = ItemType.Observer; - mappings[690] = ItemType.Hopper; - mappings[691] = ItemType.Dispenser; - mappings[692] = ItemType.Dropper; - mappings[693] = ItemType.Lectern; - mappings[694] = ItemType.Target; - mappings[695] = ItemType.Lever; - mappings[696] = ItemType.LightningRod; - mappings[697] = ItemType.DaylightDetector; - mappings[698] = ItemType.SculkSensor; - mappings[699] = ItemType.CalibratedSculkSensor; - mappings[700] = ItemType.TripwireHook; - mappings[701] = ItemType.TrappedChest; - mappings[702] = ItemType.Tnt; - mappings[703] = ItemType.RedstoneLamp; - mappings[704] = ItemType.NoteBlock; - mappings[705] = ItemType.StoneButton; - mappings[706] = ItemType.PolishedBlackstoneButton; - mappings[707] = ItemType.OakButton; - mappings[708] = ItemType.SpruceButton; - mappings[709] = ItemType.BirchButton; - mappings[710] = ItemType.JungleButton; - mappings[711] = ItemType.AcaciaButton; - mappings[712] = ItemType.CherryButton; - mappings[713] = ItemType.DarkOakButton; - mappings[714] = ItemType.PaleOakButton; - mappings[715] = ItemType.MangroveButton; - mappings[716] = ItemType.BambooButton; - mappings[717] = ItemType.CrimsonButton; - mappings[718] = ItemType.WarpedButton; - mappings[719] = ItemType.StonePressurePlate; - mappings[720] = ItemType.PolishedBlackstonePressurePlate; - mappings[721] = ItemType.LightWeightedPressurePlate; - mappings[722] = ItemType.HeavyWeightedPressurePlate; - mappings[723] = ItemType.OakPressurePlate; - mappings[724] = ItemType.SprucePressurePlate; - mappings[725] = ItemType.BirchPressurePlate; - mappings[726] = ItemType.JunglePressurePlate; - mappings[727] = ItemType.AcaciaPressurePlate; - mappings[728] = ItemType.CherryPressurePlate; - mappings[729] = ItemType.DarkOakPressurePlate; - mappings[730] = ItemType.PaleOakPressurePlate; - mappings[731] = ItemType.MangrovePressurePlate; - mappings[732] = ItemType.BambooPressurePlate; - mappings[733] = ItemType.CrimsonPressurePlate; - mappings[734] = ItemType.WarpedPressurePlate; - mappings[735] = ItemType.IronDoor; - mappings[736] = ItemType.OakDoor; - mappings[737] = ItemType.SpruceDoor; - mappings[738] = ItemType.BirchDoor; - mappings[739] = ItemType.JungleDoor; - mappings[740] = ItemType.AcaciaDoor; - mappings[741] = ItemType.CherryDoor; - mappings[742] = ItemType.DarkOakDoor; - mappings[743] = ItemType.PaleOakDoor; - mappings[744] = ItemType.MangroveDoor; - mappings[745] = ItemType.BambooDoor; - mappings[746] = ItemType.CrimsonDoor; - mappings[747] = ItemType.WarpedDoor; - mappings[748] = ItemType.CopperDoor; - mappings[749] = ItemType.ExposedCopperDoor; - mappings[750] = ItemType.WeatheredCopperDoor; - mappings[751] = ItemType.OxidizedCopperDoor; - mappings[752] = ItemType.WaxedCopperDoor; - mappings[753] = ItemType.WaxedExposedCopperDoor; - mappings[754] = ItemType.WaxedWeatheredCopperDoor; - mappings[755] = ItemType.WaxedOxidizedCopperDoor; - mappings[756] = ItemType.IronTrapdoor; - mappings[757] = ItemType.OakTrapdoor; - mappings[758] = ItemType.SpruceTrapdoor; - mappings[759] = ItemType.BirchTrapdoor; - mappings[760] = ItemType.JungleTrapdoor; - mappings[761] = ItemType.AcaciaTrapdoor; - mappings[762] = ItemType.CherryTrapdoor; - mappings[763] = ItemType.DarkOakTrapdoor; - mappings[764] = ItemType.PaleOakTrapdoor; - mappings[765] = ItemType.MangroveTrapdoor; - mappings[766] = ItemType.BambooTrapdoor; - mappings[767] = ItemType.CrimsonTrapdoor; - mappings[768] = ItemType.WarpedTrapdoor; - mappings[769] = ItemType.CopperTrapdoor; - mappings[770] = ItemType.ExposedCopperTrapdoor; - mappings[771] = ItemType.WeatheredCopperTrapdoor; - mappings[772] = ItemType.OxidizedCopperTrapdoor; - mappings[773] = ItemType.WaxedCopperTrapdoor; - mappings[774] = ItemType.WaxedExposedCopperTrapdoor; - mappings[775] = ItemType.WaxedWeatheredCopperTrapdoor; - mappings[776] = ItemType.WaxedOxidizedCopperTrapdoor; - mappings[777] = ItemType.OakFenceGate; - mappings[778] = ItemType.SpruceFenceGate; - mappings[779] = ItemType.BirchFenceGate; - mappings[780] = ItemType.JungleFenceGate; - mappings[781] = ItemType.AcaciaFenceGate; - mappings[782] = ItemType.CherryFenceGate; - mappings[783] = ItemType.DarkOakFenceGate; - mappings[784] = ItemType.PaleOakFenceGate; - mappings[785] = ItemType.MangroveFenceGate; - mappings[786] = ItemType.BambooFenceGate; - mappings[787] = ItemType.CrimsonFenceGate; - mappings[788] = ItemType.WarpedFenceGate; - mappings[789] = ItemType.PoweredRail; - mappings[790] = ItemType.DetectorRail; - mappings[791] = ItemType.Rail; - mappings[792] = ItemType.ActivatorRail; - mappings[793] = ItemType.Saddle; - mappings[794] = ItemType.Minecart; - mappings[795] = ItemType.ChestMinecart; - mappings[796] = ItemType.FurnaceMinecart; - mappings[797] = ItemType.TntMinecart; - mappings[798] = ItemType.HopperMinecart; - mappings[799] = ItemType.CarrotOnAStick; - mappings[800] = ItemType.WarpedFungusOnAStick; - mappings[801] = ItemType.PhantomMembrane; - mappings[802] = ItemType.Elytra; - mappings[803] = ItemType.OakBoat; - mappings[804] = ItemType.OakChestBoat; - mappings[805] = ItemType.SpruceBoat; - mappings[806] = ItemType.SpruceChestBoat; - mappings[807] = ItemType.BirchBoat; - mappings[808] = ItemType.BirchChestBoat; - mappings[809] = ItemType.JungleBoat; - mappings[810] = ItemType.JungleChestBoat; - mappings[811] = ItemType.AcaciaBoat; - mappings[812] = ItemType.AcaciaChestBoat; - mappings[813] = ItemType.CherryBoat; - mappings[814] = ItemType.CherryChestBoat; - mappings[815] = ItemType.DarkOakBoat; - mappings[816] = ItemType.DarkOakChestBoat; - mappings[817] = ItemType.PaleOakBoat; - mappings[818] = ItemType.PaleOakChestBoat; - mappings[819] = ItemType.MangroveBoat; - mappings[820] = ItemType.MangroveChestBoat; - mappings[821] = ItemType.BambooRaft; - mappings[822] = ItemType.BambooChestRaft; - mappings[823] = ItemType.StructureBlock; - mappings[824] = ItemType.Jigsaw; - mappings[825] = ItemType.TurtleHelmet; - mappings[826] = ItemType.TurtleScute; - mappings[827] = ItemType.ArmadilloScute; - mappings[828] = ItemType.WolfArmor; - mappings[829] = ItemType.FlintAndSteel; - mappings[830] = ItemType.Bowl; - mappings[831] = ItemType.Apple; - mappings[832] = ItemType.Bow; - mappings[833] = ItemType.Arrow; - mappings[834] = ItemType.Coal; - mappings[835] = ItemType.Charcoal; - mappings[836] = ItemType.Diamond; - mappings[837] = ItemType.Emerald; - mappings[838] = ItemType.LapisLazuli; - mappings[839] = ItemType.Quartz; - mappings[840] = ItemType.AmethystShard; - mappings[841] = ItemType.RawIron; - mappings[842] = ItemType.IronIngot; - mappings[843] = ItemType.RawCopper; - mappings[844] = ItemType.CopperIngot; - mappings[845] = ItemType.RawGold; - mappings[846] = ItemType.GoldIngot; - mappings[847] = ItemType.NetheriteIngot; - mappings[848] = ItemType.NetheriteScrap; - mappings[849] = ItemType.WoodenSword; - mappings[850] = ItemType.WoodenShovel; - mappings[851] = ItemType.WoodenPickaxe; - mappings[852] = ItemType.WoodenAxe; - mappings[853] = ItemType.WoodenHoe; - mappings[854] = ItemType.StoneSword; - mappings[855] = ItemType.StoneShovel; - mappings[856] = ItemType.StonePickaxe; - mappings[857] = ItemType.StoneAxe; - mappings[858] = ItemType.StoneHoe; - mappings[859] = ItemType.GoldenSword; - mappings[860] = ItemType.GoldenShovel; - mappings[861] = ItemType.GoldenPickaxe; - mappings[862] = ItemType.GoldenAxe; - mappings[863] = ItemType.GoldenHoe; - mappings[864] = ItemType.IronSword; - mappings[865] = ItemType.IronShovel; - mappings[866] = ItemType.IronPickaxe; - mappings[867] = ItemType.IronAxe; - mappings[868] = ItemType.IronHoe; - mappings[869] = ItemType.DiamondSword; - mappings[870] = ItemType.DiamondShovel; - mappings[871] = ItemType.DiamondPickaxe; - mappings[872] = ItemType.DiamondAxe; - mappings[873] = ItemType.DiamondHoe; - mappings[874] = ItemType.NetheriteSword; - mappings[875] = ItemType.NetheriteShovel; - mappings[876] = ItemType.NetheritePickaxe; - mappings[877] = ItemType.NetheriteAxe; - mappings[878] = ItemType.NetheriteHoe; - mappings[879] = ItemType.Stick; - mappings[880] = ItemType.MushroomStew; - mappings[881] = ItemType.String; - mappings[882] = ItemType.Feather; - mappings[883] = ItemType.Gunpowder; - mappings[884] = ItemType.WheatSeeds; - mappings[885] = ItemType.Wheat; - mappings[886] = ItemType.Bread; - mappings[887] = ItemType.LeatherHelmet; - mappings[888] = ItemType.LeatherChestplate; - mappings[889] = ItemType.LeatherLeggings; - mappings[890] = ItemType.LeatherBoots; - mappings[891] = ItemType.ChainmailHelmet; - mappings[892] = ItemType.ChainmailChestplate; - mappings[893] = ItemType.ChainmailLeggings; - mappings[894] = ItemType.ChainmailBoots; - mappings[895] = ItemType.IronHelmet; - mappings[896] = ItemType.IronChestplate; - mappings[897] = ItemType.IronLeggings; - mappings[898] = ItemType.IronBoots; - mappings[899] = ItemType.DiamondHelmet; - mappings[900] = ItemType.DiamondChestplate; - mappings[901] = ItemType.DiamondLeggings; - mappings[902] = ItemType.DiamondBoots; - mappings[903] = ItemType.GoldenHelmet; - mappings[904] = ItemType.GoldenChestplate; - mappings[905] = ItemType.GoldenLeggings; - mappings[906] = ItemType.GoldenBoots; - mappings[907] = ItemType.NetheriteHelmet; - mappings[908] = ItemType.NetheriteChestplate; - mappings[909] = ItemType.NetheriteLeggings; - mappings[910] = ItemType.NetheriteBoots; - mappings[911] = ItemType.Flint; - mappings[912] = ItemType.Porkchop; - mappings[913] = ItemType.CookedPorkchop; - mappings[914] = ItemType.Painting; - mappings[915] = ItemType.GoldenApple; - mappings[916] = ItemType.EnchantedGoldenApple; - mappings[917] = ItemType.OakSign; - mappings[918] = ItemType.SpruceSign; - mappings[919] = ItemType.BirchSign; - mappings[920] = ItemType.JungleSign; - mappings[921] = ItemType.AcaciaSign; - mappings[922] = ItemType.CherrySign; - mappings[923] = ItemType.DarkOakSign; - mappings[924] = ItemType.PaleOakSign; - mappings[925] = ItemType.MangroveSign; - mappings[926] = ItemType.BambooSign; - mappings[927] = ItemType.CrimsonSign; - mappings[928] = ItemType.WarpedSign; - mappings[929] = ItemType.OakHangingSign; - mappings[930] = ItemType.SpruceHangingSign; - mappings[931] = ItemType.BirchHangingSign; - mappings[932] = ItemType.JungleHangingSign; - mappings[933] = ItemType.AcaciaHangingSign; - mappings[934] = ItemType.CherryHangingSign; - mappings[935] = ItemType.DarkOakHangingSign; - mappings[936] = ItemType.PaleOakHangingSign; - mappings[937] = ItemType.MangroveHangingSign; - mappings[938] = ItemType.BambooHangingSign; - mappings[939] = ItemType.CrimsonHangingSign; - mappings[940] = ItemType.WarpedHangingSign; - mappings[941] = ItemType.Bucket; - mappings[942] = ItemType.WaterBucket; - mappings[943] = ItemType.LavaBucket; - mappings[944] = ItemType.PowderSnowBucket; - mappings[945] = ItemType.Snowball; - mappings[946] = ItemType.Leather; - mappings[947] = ItemType.MilkBucket; - mappings[948] = ItemType.PufferfishBucket; - mappings[949] = ItemType.SalmonBucket; - mappings[950] = ItemType.CodBucket; - mappings[951] = ItemType.TropicalFishBucket; - mappings[952] = ItemType.AxolotlBucket; - mappings[953] = ItemType.TadpoleBucket; - mappings[954] = ItemType.Brick; - mappings[955] = ItemType.ClayBall; - mappings[956] = ItemType.DriedKelpBlock; - mappings[957] = ItemType.Paper; - mappings[958] = ItemType.Book; - mappings[959] = ItemType.SlimeBall; - mappings[960] = ItemType.Egg; - mappings[961] = ItemType.Compass; - mappings[962] = ItemType.RecoveryCompass; - mappings[963] = ItemType.Bundle; - mappings[964] = ItemType.WhiteBundle; - mappings[965] = ItemType.OrangeBundle; - mappings[966] = ItemType.MagentaBundle; - mappings[967] = ItemType.LightBlueBundle; - mappings[968] = ItemType.YellowBundle; - mappings[969] = ItemType.LimeBundle; - mappings[970] = ItemType.PinkBundle; - mappings[971] = ItemType.GrayBundle; - mappings[972] = ItemType.LightGrayBundle; - mappings[973] = ItemType.CyanBundle; - mappings[974] = ItemType.PurpleBundle; - mappings[975] = ItemType.BlueBundle; - mappings[976] = ItemType.BrownBundle; - mappings[977] = ItemType.GreenBundle; - mappings[978] = ItemType.RedBundle; - mappings[979] = ItemType.BlackBundle; - mappings[980] = ItemType.FishingRod; - mappings[981] = ItemType.Clock; - mappings[982] = ItemType.Spyglass; - mappings[983] = ItemType.GlowstoneDust; - mappings[984] = ItemType.Cod; - mappings[985] = ItemType.Salmon; - mappings[986] = ItemType.TropicalFish; - mappings[987] = ItemType.Pufferfish; - mappings[988] = ItemType.CookedCod; - mappings[989] = ItemType.CookedSalmon; - mappings[990] = ItemType.InkSac; - mappings[991] = ItemType.GlowInkSac; - mappings[992] = ItemType.CocoaBeans; - mappings[993] = ItemType.WhiteDye; - mappings[994] = ItemType.OrangeDye; - mappings[995] = ItemType.MagentaDye; - mappings[996] = ItemType.LightBlueDye; - mappings[997] = ItemType.YellowDye; - mappings[998] = ItemType.LimeDye; - mappings[999] = ItemType.PinkDye; - mappings[1000] = ItemType.GrayDye; - mappings[1001] = ItemType.LightGrayDye; - mappings[1002] = ItemType.CyanDye; - mappings[1003] = ItemType.PurpleDye; - mappings[1004] = ItemType.BlueDye; - mappings[1005] = ItemType.BrownDye; - mappings[1006] = ItemType.GreenDye; - mappings[1007] = ItemType.RedDye; - mappings[1008] = ItemType.BlackDye; - mappings[1009] = ItemType.BoneMeal; - mappings[1010] = ItemType.Bone; - mappings[1011] = ItemType.Sugar; - mappings[1012] = ItemType.Cake; - mappings[1013] = ItemType.WhiteBed; - mappings[1014] = ItemType.OrangeBed; - mappings[1015] = ItemType.MagentaBed; - mappings[1016] = ItemType.LightBlueBed; - mappings[1017] = ItemType.YellowBed; - mappings[1018] = ItemType.LimeBed; - mappings[1019] = ItemType.PinkBed; - mappings[1020] = ItemType.GrayBed; - mappings[1021] = ItemType.LightGrayBed; - mappings[1022] = ItemType.CyanBed; - mappings[1023] = ItemType.PurpleBed; - mappings[1024] = ItemType.BlueBed; - mappings[1025] = ItemType.BrownBed; - mappings[1026] = ItemType.GreenBed; - mappings[1027] = ItemType.RedBed; - mappings[1028] = ItemType.BlackBed; - mappings[1029] = ItemType.Cookie; - mappings[1030] = ItemType.Crafter; - mappings[1031] = ItemType.FilledMap; - mappings[1032] = ItemType.Shears; - mappings[1033] = ItemType.MelonSlice; - mappings[1034] = ItemType.DriedKelp; - mappings[1035] = ItemType.PumpkinSeeds; - mappings[1036] = ItemType.MelonSeeds; - mappings[1037] = ItemType.Beef; - mappings[1038] = ItemType.CookedBeef; - mappings[1039] = ItemType.Chicken; - mappings[1040] = ItemType.CookedChicken; - mappings[1041] = ItemType.RottenFlesh; - mappings[1042] = ItemType.EnderPearl; - mappings[1043] = ItemType.BlazeRod; - mappings[1044] = ItemType.GhastTear; - mappings[1045] = ItemType.GoldNugget; - mappings[1046] = ItemType.NetherWart; - mappings[1047] = ItemType.GlassBottle; - mappings[1048] = ItemType.Potion; - mappings[1049] = ItemType.SpiderEye; - mappings[1050] = ItemType.FermentedSpiderEye; - mappings[1051] = ItemType.BlazePowder; - mappings[1052] = ItemType.MagmaCream; - mappings[1053] = ItemType.BrewingStand; - mappings[1054] = ItemType.Cauldron; - mappings[1055] = ItemType.EnderEye; - mappings[1056] = ItemType.GlisteringMelonSlice; - mappings[1057] = ItemType.ArmadilloSpawnEgg; - mappings[1058] = ItemType.AllaySpawnEgg; - mappings[1059] = ItemType.AxolotlSpawnEgg; - mappings[1060] = ItemType.BatSpawnEgg; - mappings[1061] = ItemType.BeeSpawnEgg; - mappings[1062] = ItemType.BlazeSpawnEgg; - mappings[1063] = ItemType.BoggedSpawnEgg; - mappings[1064] = ItemType.BreezeSpawnEgg; - mappings[1065] = ItemType.CatSpawnEgg; - mappings[1066] = ItemType.CamelSpawnEgg; - mappings[1067] = ItemType.CaveSpiderSpawnEgg; - mappings[1068] = ItemType.ChickenSpawnEgg; - mappings[1069] = ItemType.CodSpawnEgg; - mappings[1070] = ItemType.CowSpawnEgg; - mappings[1071] = ItemType.CreeperSpawnEgg; - mappings[1072] = ItemType.DolphinSpawnEgg; - mappings[1073] = ItemType.DonkeySpawnEgg; - mappings[1074] = ItemType.DrownedSpawnEgg; - mappings[1075] = ItemType.ElderGuardianSpawnEgg; - mappings[1076] = ItemType.EnderDragonSpawnEgg; - mappings[1077] = ItemType.EndermanSpawnEgg; - mappings[1078] = ItemType.EndermiteSpawnEgg; - mappings[1079] = ItemType.EvokerSpawnEgg; - mappings[1080] = ItemType.FoxSpawnEgg; - mappings[1081] = ItemType.FrogSpawnEgg; - mappings[1082] = ItemType.GhastSpawnEgg; - mappings[1083] = ItemType.GlowSquidSpawnEgg; - mappings[1084] = ItemType.GoatSpawnEgg; - mappings[1085] = ItemType.GuardianSpawnEgg; - mappings[1086] = ItemType.HoglinSpawnEgg; - mappings[1087] = ItemType.HorseSpawnEgg; - mappings[1088] = ItemType.HuskSpawnEgg; - mappings[1089] = ItemType.IronGolemSpawnEgg; - mappings[1090] = ItemType.LlamaSpawnEgg; - mappings[1091] = ItemType.MagmaCubeSpawnEgg; - mappings[1092] = ItemType.MooshroomSpawnEgg; - mappings[1093] = ItemType.MuleSpawnEgg; - mappings[1094] = ItemType.OcelotSpawnEgg; - mappings[1095] = ItemType.PandaSpawnEgg; - mappings[1096] = ItemType.ParrotSpawnEgg; - mappings[1097] = ItemType.PhantomSpawnEgg; - mappings[1098] = ItemType.PigSpawnEgg; - mappings[1099] = ItemType.PiglinSpawnEgg; - mappings[1100] = ItemType.PiglinBruteSpawnEgg; - mappings[1101] = ItemType.PillagerSpawnEgg; - mappings[1102] = ItemType.PolarBearSpawnEgg; - mappings[1103] = ItemType.PufferfishSpawnEgg; - mappings[1104] = ItemType.RabbitSpawnEgg; - mappings[1105] = ItemType.RavagerSpawnEgg; - mappings[1106] = ItemType.SalmonSpawnEgg; - mappings[1107] = ItemType.SheepSpawnEgg; - mappings[1108] = ItemType.ShulkerSpawnEgg; - mappings[1109] = ItemType.SilverfishSpawnEgg; - mappings[1110] = ItemType.SkeletonSpawnEgg; - mappings[1111] = ItemType.SkeletonHorseSpawnEgg; - mappings[1112] = ItemType.SlimeSpawnEgg; - mappings[1113] = ItemType.SnifferSpawnEgg; - mappings[1114] = ItemType.SnowGolemSpawnEgg; - mappings[1115] = ItemType.SpiderSpawnEgg; - mappings[1116] = ItemType.SquidSpawnEgg; - mappings[1117] = ItemType.StraySpawnEgg; - mappings[1118] = ItemType.StriderSpawnEgg; - mappings[1119] = ItemType.TadpoleSpawnEgg; - mappings[1120] = ItemType.TraderLlamaSpawnEgg; - mappings[1121] = ItemType.TropicalFishSpawnEgg; - mappings[1122] = ItemType.TurtleSpawnEgg; - mappings[1123] = ItemType.VexSpawnEgg; - mappings[1124] = ItemType.VillagerSpawnEgg; - mappings[1125] = ItemType.VindicatorSpawnEgg; - mappings[1126] = ItemType.WanderingTraderSpawnEgg; - mappings[1127] = ItemType.WardenSpawnEgg; - mappings[1128] = ItemType.WitchSpawnEgg; - mappings[1129] = ItemType.WitherSpawnEgg; - mappings[1130] = ItemType.WitherSkeletonSpawnEgg; - mappings[1131] = ItemType.WolfSpawnEgg; - mappings[1132] = ItemType.ZoglinSpawnEgg; - mappings[1133] = ItemType.CreakingSpawnEgg; - mappings[1134] = ItemType.ZombieSpawnEgg; - mappings[1135] = ItemType.ZombieHorseSpawnEgg; - mappings[1136] = ItemType.ZombieVillagerSpawnEgg; - mappings[1137] = ItemType.ZombifiedPiglinSpawnEgg; - mappings[1138] = ItemType.ExperienceBottle; - mappings[1139] = ItemType.FireCharge; - mappings[1140] = ItemType.WindCharge; - mappings[1141] = ItemType.WritableBook; - mappings[1142] = ItemType.WrittenBook; - mappings[1143] = ItemType.BreezeRod; - mappings[1144] = ItemType.Mace; - mappings[1145] = ItemType.ItemFrame; - mappings[1146] = ItemType.GlowItemFrame; - mappings[1147] = ItemType.FlowerPot; - mappings[1148] = ItemType.Carrot; - mappings[1149] = ItemType.Potato; - mappings[1150] = ItemType.BakedPotato; - mappings[1151] = ItemType.PoisonousPotato; - mappings[1152] = ItemType.Map; - mappings[1153] = ItemType.GoldenCarrot; - mappings[1154] = ItemType.SkeletonSkull; - mappings[1155] = ItemType.WitherSkeletonSkull; - mappings[1156] = ItemType.PlayerHead; - mappings[1157] = ItemType.ZombieHead; - mappings[1158] = ItemType.CreeperHead; - mappings[1159] = ItemType.DragonHead; - mappings[1160] = ItemType.PiglinHead; - mappings[1161] = ItemType.NetherStar; - mappings[1162] = ItemType.PumpkinPie; - mappings[1163] = ItemType.FireworkRocket; - mappings[1164] = ItemType.FireworkStar; - mappings[1165] = ItemType.EnchantedBook; - mappings[1166] = ItemType.NetherBrick; - mappings[1167] = ItemType.ResinBrick; - mappings[1168] = ItemType.PrismarineShard; - mappings[1169] = ItemType.PrismarineCrystals; - mappings[1170] = ItemType.Rabbit; - mappings[1171] = ItemType.CookedRabbit; - mappings[1172] = ItemType.RabbitStew; - mappings[1173] = ItemType.RabbitFoot; - mappings[1174] = ItemType.RabbitHide; - mappings[1175] = ItemType.ArmorStand; - mappings[1176] = ItemType.IronHorseArmor; - mappings[1177] = ItemType.GoldenHorseArmor; - mappings[1178] = ItemType.DiamondHorseArmor; - mappings[1179] = ItemType.LeatherHorseArmor; - mappings[1180] = ItemType.Lead; - mappings[1181] = ItemType.NameTag; - mappings[1182] = ItemType.CommandBlockMinecart; - mappings[1183] = ItemType.Mutton; - mappings[1184] = ItemType.CookedMutton; - mappings[1185] = ItemType.WhiteBanner; - mappings[1186] = ItemType.OrangeBanner; - mappings[1187] = ItemType.MagentaBanner; - mappings[1188] = ItemType.LightBlueBanner; - mappings[1189] = ItemType.YellowBanner; - mappings[1190] = ItemType.LimeBanner; - mappings[1191] = ItemType.PinkBanner; - mappings[1192] = ItemType.GrayBanner; - mappings[1193] = ItemType.LightGrayBanner; - mappings[1194] = ItemType.CyanBanner; - mappings[1195] = ItemType.PurpleBanner; - mappings[1196] = ItemType.BlueBanner; - mappings[1197] = ItemType.BrownBanner; - mappings[1198] = ItemType.GreenBanner; - mappings[1199] = ItemType.RedBanner; - mappings[1200] = ItemType.BlackBanner; - mappings[1201] = ItemType.EndCrystal; - mappings[1202] = ItemType.ChorusFruit; - mappings[1203] = ItemType.PoppedChorusFruit; - mappings[1204] = ItemType.TorchflowerSeeds; - mappings[1205] = ItemType.PitcherPod; - mappings[1206] = ItemType.Beetroot; - mappings[1207] = ItemType.BeetrootSeeds; - mappings[1208] = ItemType.BeetrootSoup; - mappings[1209] = ItemType.DragonBreath; - mappings[1210] = ItemType.SplashPotion; - mappings[1211] = ItemType.SpectralArrow; - mappings[1212] = ItemType.TippedArrow; - mappings[1213] = ItemType.LingeringPotion; - mappings[1214] = ItemType.Shield; - mappings[1215] = ItemType.TotemOfUndying; - mappings[1216] = ItemType.ShulkerShell; - mappings[1217] = ItemType.IronNugget; - mappings[1218] = ItemType.KnowledgeBook; - mappings[1219] = ItemType.DebugStick; - mappings[1220] = ItemType.MusicDisc13; - mappings[1221] = ItemType.MusicDiscCat; - mappings[1222] = ItemType.MusicDiscBlocks; - mappings[1223] = ItemType.MusicDiscChirp; - mappings[1224] = ItemType.MusicDiscCreator; - mappings[1225] = ItemType.MusicDiscCreatorMusicBox; - mappings[1226] = ItemType.MusicDiscFar; - mappings[1227] = ItemType.MusicDiscMall; - mappings[1228] = ItemType.MusicDiscMellohi; - mappings[1229] = ItemType.MusicDiscStal; - mappings[1230] = ItemType.MusicDiscStrad; - mappings[1231] = ItemType.MusicDiscWard; - mappings[1232] = ItemType.MusicDisc11; - mappings[1233] = ItemType.MusicDiscWait; - mappings[1234] = ItemType.MusicDiscOtherside; - mappings[1235] = ItemType.MusicDiscRelic; - mappings[1236] = ItemType.MusicDisc5; - mappings[1237] = ItemType.MusicDiscPigstep; - mappings[1238] = ItemType.MusicDiscPrecipice; - mappings[1239] = ItemType.DiscFragment5; - mappings[1240] = ItemType.Trident; - mappings[1241] = ItemType.NautilusShell; - mappings[1242] = ItemType.HeartOfTheSea; - mappings[1243] = ItemType.Crossbow; - mappings[1244] = ItemType.SuspiciousStew; - mappings[1245] = ItemType.Loom; - mappings[1246] = ItemType.FlowerBannerPattern; - mappings[1247] = ItemType.CreeperBannerPattern; - mappings[1248] = ItemType.SkullBannerPattern; - mappings[1249] = ItemType.MojangBannerPattern; - mappings[1250] = ItemType.GlobeBannerPattern; - mappings[1251] = ItemType.PiglinBannerPattern; - mappings[1252] = ItemType.FlowBannerPattern; - mappings[1253] = ItemType.GusterBannerPattern; - mappings[1254] = ItemType.FieldMasonedBannerPattern; - mappings[1255] = ItemType.BordureIndentedBannerPattern; - mappings[1256] = ItemType.GoatHorn; - mappings[1257] = ItemType.Composter; - mappings[1258] = ItemType.Barrel; - mappings[1259] = ItemType.Smoker; - mappings[1260] = ItemType.BlastFurnace; - mappings[1261] = ItemType.CartographyTable; - mappings[1262] = ItemType.FletchingTable; - mappings[1263] = ItemType.Grindstone; - mappings[1264] = ItemType.SmithingTable; - mappings[1265] = ItemType.Stonecutter; - mappings[1266] = ItemType.Bell; - mappings[1267] = ItemType.Lantern; - mappings[1268] = ItemType.SoulLantern; - mappings[1269] = ItemType.SweetBerries; - mappings[1270] = ItemType.GlowBerries; - mappings[1271] = ItemType.Campfire; - mappings[1272] = ItemType.SoulCampfire; - mappings[1273] = ItemType.Shroomlight; - mappings[1274] = ItemType.Honeycomb; - mappings[1275] = ItemType.BeeNest; - mappings[1276] = ItemType.Beehive; - mappings[1277] = ItemType.HoneyBottle; - mappings[1278] = ItemType.HoneycombBlock; - mappings[1279] = ItemType.Lodestone; - mappings[1280] = ItemType.CryingObsidian; - mappings[1281] = ItemType.Blackstone; - mappings[1282] = ItemType.BlackstoneSlab; - mappings[1283] = ItemType.BlackstoneStairs; - mappings[1284] = ItemType.GildedBlackstone; - mappings[1285] = ItemType.PolishedBlackstone; - mappings[1286] = ItemType.PolishedBlackstoneSlab; - mappings[1287] = ItemType.PolishedBlackstoneStairs; - mappings[1288] = ItemType.ChiseledPolishedBlackstone; - mappings[1289] = ItemType.PolishedBlackstoneBricks; - mappings[1290] = ItemType.PolishedBlackstoneBrickSlab; - mappings[1291] = ItemType.PolishedBlackstoneBrickStairs; - mappings[1292] = ItemType.CrackedPolishedBlackstoneBricks; - mappings[1293] = ItemType.RespawnAnchor; - mappings[1294] = ItemType.Candle; - mappings[1295] = ItemType.WhiteCandle; - mappings[1296] = ItemType.OrangeCandle; - mappings[1297] = ItemType.MagentaCandle; - mappings[1298] = ItemType.LightBlueCandle; - mappings[1299] = ItemType.YellowCandle; - mappings[1300] = ItemType.LimeCandle; - mappings[1301] = ItemType.PinkCandle; - mappings[1302] = ItemType.GrayCandle; - mappings[1303] = ItemType.LightGrayCandle; - mappings[1304] = ItemType.CyanCandle; - mappings[1305] = ItemType.PurpleCandle; - mappings[1306] = ItemType.BlueCandle; - mappings[1307] = ItemType.BrownCandle; - mappings[1308] = ItemType.GreenCandle; - mappings[1309] = ItemType.RedCandle; - mappings[1310] = ItemType.BlackCandle; - mappings[1311] = ItemType.SmallAmethystBud; - mappings[1312] = ItemType.MediumAmethystBud; - mappings[1313] = ItemType.LargeAmethystBud; - mappings[1314] = ItemType.AmethystCluster; - mappings[1315] = ItemType.PointedDripstone; - mappings[1316] = ItemType.OchreFroglight; - mappings[1317] = ItemType.VerdantFroglight; - mappings[1318] = ItemType.PearlescentFroglight; - mappings[1319] = ItemType.Frogspawn; - mappings[1320] = ItemType.EchoShard; - mappings[1321] = ItemType.Brush; - mappings[1322] = ItemType.NetheriteUpgradeSmithingTemplate; - mappings[1323] = ItemType.SentryArmorTrimSmithingTemplate; - mappings[1324] = ItemType.DuneArmorTrimSmithingTemplate; - mappings[1325] = ItemType.CoastArmorTrimSmithingTemplate; - mappings[1326] = ItemType.WildArmorTrimSmithingTemplate; - mappings[1327] = ItemType.WardArmorTrimSmithingTemplate; - mappings[1328] = ItemType.EyeArmorTrimSmithingTemplate; - mappings[1329] = ItemType.VexArmorTrimSmithingTemplate; - mappings[1330] = ItemType.TideArmorTrimSmithingTemplate; - mappings[1331] = ItemType.SnoutArmorTrimSmithingTemplate; - mappings[1332] = ItemType.RibArmorTrimSmithingTemplate; - mappings[1333] = ItemType.SpireArmorTrimSmithingTemplate; - mappings[1334] = ItemType.WayfinderArmorTrimSmithingTemplate; - mappings[1335] = ItemType.ShaperArmorTrimSmithingTemplate; - mappings[1336] = ItemType.SilenceArmorTrimSmithingTemplate; - mappings[1337] = ItemType.RaiserArmorTrimSmithingTemplate; - mappings[1338] = ItemType.HostArmorTrimSmithingTemplate; - mappings[1339] = ItemType.FlowArmorTrimSmithingTemplate; - mappings[1340] = ItemType.BoltArmorTrimSmithingTemplate; - mappings[1341] = ItemType.AnglerPotterySherd; - mappings[1342] = ItemType.ArcherPotterySherd; - mappings[1343] = ItemType.ArmsUpPotterySherd; - mappings[1344] = ItemType.BladePotterySherd; - mappings[1345] = ItemType.BrewerPotterySherd; - mappings[1346] = ItemType.BurnPotterySherd; - mappings[1347] = ItemType.DangerPotterySherd; - mappings[1348] = ItemType.ExplorerPotterySherd; - mappings[1349] = ItemType.FlowPotterySherd; - mappings[1350] = ItemType.FriendPotterySherd; - mappings[1351] = ItemType.GusterPotterySherd; - mappings[1352] = ItemType.HeartPotterySherd; - mappings[1353] = ItemType.HeartbreakPotterySherd; - mappings[1354] = ItemType.HowlPotterySherd; - mappings[1355] = ItemType.MinerPotterySherd; - mappings[1356] = ItemType.MournerPotterySherd; - mappings[1357] = ItemType.PlentyPotterySherd; - mappings[1358] = ItemType.PrizePotterySherd; - mappings[1359] = ItemType.ScrapePotterySherd; - mappings[1360] = ItemType.SheafPotterySherd; - mappings[1361] = ItemType.ShelterPotterySherd; - mappings[1362] = ItemType.SkullPotterySherd; - mappings[1363] = ItemType.SnortPotterySherd; - mappings[1364] = ItemType.CopperGrate; - mappings[1365] = ItemType.ExposedCopperGrate; - mappings[1366] = ItemType.WeatheredCopperGrate; - mappings[1367] = ItemType.OxidizedCopperGrate; - mappings[1368] = ItemType.WaxedCopperGrate; - mappings[1369] = ItemType.WaxedExposedCopperGrate; - mappings[1370] = ItemType.WaxedWeatheredCopperGrate; - mappings[1371] = ItemType.WaxedOxidizedCopperGrate; - mappings[1372] = ItemType.CopperBulb; - mappings[1373] = ItemType.ExposedCopperBulb; - mappings[1374] = ItemType.WeatheredCopperBulb; - mappings[1375] = ItemType.OxidizedCopperBulb; - mappings[1376] = ItemType.WaxedCopperBulb; - mappings[1377] = ItemType.WaxedExposedCopperBulb; - mappings[1378] = ItemType.WaxedWeatheredCopperBulb; - mappings[1379] = ItemType.WaxedOxidizedCopperBulb; - mappings[1380] = ItemType.TrialSpawner; - mappings[1381] = ItemType.TrialKey; - mappings[1382] = ItemType.OminousTrialKey; - mappings[1383] = ItemType.Vault; - mappings[1384] = ItemType.OminousBottle; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1215.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette1215.cs deleted file mode 100644 index 19795e509a..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1215.cs +++ /dev/null @@ -1,1414 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public class ItemPalette1215 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette1215() - { - mappings[0] = ItemType.Air; - mappings[1] = ItemType.Stone; - mappings[2] = ItemType.Granite; - mappings[3] = ItemType.PolishedGranite; - mappings[4] = ItemType.Diorite; - mappings[5] = ItemType.PolishedDiorite; - mappings[6] = ItemType.Andesite; - mappings[7] = ItemType.PolishedAndesite; - mappings[8] = ItemType.Deepslate; - mappings[9] = ItemType.CobbledDeepslate; - mappings[10] = ItemType.PolishedDeepslate; - mappings[11] = ItemType.Calcite; - mappings[12] = ItemType.Tuff; - mappings[13] = ItemType.TuffSlab; - mappings[14] = ItemType.TuffStairs; - mappings[15] = ItemType.TuffWall; - mappings[16] = ItemType.ChiseledTuff; - mappings[17] = ItemType.PolishedTuff; - mappings[18] = ItemType.PolishedTuffSlab; - mappings[19] = ItemType.PolishedTuffStairs; - mappings[20] = ItemType.PolishedTuffWall; - mappings[21] = ItemType.TuffBricks; - mappings[22] = ItemType.TuffBrickSlab; - mappings[23] = ItemType.TuffBrickStairs; - mappings[24] = ItemType.TuffBrickWall; - mappings[25] = ItemType.ChiseledTuffBricks; - mappings[26] = ItemType.DripstoneBlock; - mappings[27] = ItemType.GrassBlock; - mappings[28] = ItemType.Dirt; - mappings[29] = ItemType.CoarseDirt; - mappings[30] = ItemType.Podzol; - mappings[31] = ItemType.RootedDirt; - mappings[32] = ItemType.Mud; - mappings[33] = ItemType.CrimsonNylium; - mappings[34] = ItemType.WarpedNylium; - mappings[35] = ItemType.Cobblestone; - mappings[36] = ItemType.OakPlanks; - mappings[37] = ItemType.SprucePlanks; - mappings[38] = ItemType.BirchPlanks; - mappings[39] = ItemType.JunglePlanks; - mappings[40] = ItemType.AcaciaPlanks; - mappings[41] = ItemType.CherryPlanks; - mappings[42] = ItemType.DarkOakPlanks; - mappings[43] = ItemType.PaleOakPlanks; - mappings[44] = ItemType.MangrovePlanks; - mappings[45] = ItemType.BambooPlanks; - mappings[46] = ItemType.CrimsonPlanks; - mappings[47] = ItemType.WarpedPlanks; - mappings[48] = ItemType.BambooMosaic; - mappings[49] = ItemType.OakSapling; - mappings[50] = ItemType.SpruceSapling; - mappings[51] = ItemType.BirchSapling; - mappings[52] = ItemType.JungleSapling; - mappings[53] = ItemType.AcaciaSapling; - mappings[54] = ItemType.CherrySapling; - mappings[55] = ItemType.DarkOakSapling; - mappings[56] = ItemType.PaleOakSapling; - mappings[57] = ItemType.MangrovePropagule; - mappings[58] = ItemType.Bedrock; - mappings[59] = ItemType.Sand; - mappings[60] = ItemType.SuspiciousSand; - mappings[61] = ItemType.SuspiciousGravel; - mappings[62] = ItemType.RedSand; - mappings[63] = ItemType.Gravel; - mappings[64] = ItemType.CoalOre; - mappings[65] = ItemType.DeepslateCoalOre; - mappings[66] = ItemType.IronOre; - mappings[67] = ItemType.DeepslateIronOre; - mappings[68] = ItemType.CopperOre; - mappings[69] = ItemType.DeepslateCopperOre; - mappings[70] = ItemType.GoldOre; - mappings[71] = ItemType.DeepslateGoldOre; - mappings[72] = ItemType.RedstoneOre; - mappings[73] = ItemType.DeepslateRedstoneOre; - mappings[74] = ItemType.EmeraldOre; - mappings[75] = ItemType.DeepslateEmeraldOre; - mappings[76] = ItemType.LapisOre; - mappings[77] = ItemType.DeepslateLapisOre; - mappings[78] = ItemType.DiamondOre; - mappings[79] = ItemType.DeepslateDiamondOre; - mappings[80] = ItemType.NetherGoldOre; - mappings[81] = ItemType.NetherQuartzOre; - mappings[82] = ItemType.AncientDebris; - mappings[83] = ItemType.CoalBlock; - mappings[84] = ItemType.RawIronBlock; - mappings[85] = ItemType.RawCopperBlock; - mappings[86] = ItemType.RawGoldBlock; - mappings[87] = ItemType.HeavyCore; - mappings[88] = ItemType.AmethystBlock; - mappings[89] = ItemType.BuddingAmethyst; - mappings[90] = ItemType.IronBlock; - mappings[91] = ItemType.CopperBlock; - mappings[92] = ItemType.GoldBlock; - mappings[93] = ItemType.DiamondBlock; - mappings[94] = ItemType.NetheriteBlock; - mappings[95] = ItemType.ExposedCopper; - mappings[96] = ItemType.WeatheredCopper; - mappings[97] = ItemType.OxidizedCopper; - mappings[98] = ItemType.ChiseledCopper; - mappings[99] = ItemType.ExposedChiseledCopper; - mappings[100] = ItemType.WeatheredChiseledCopper; - mappings[101] = ItemType.OxidizedChiseledCopper; - mappings[102] = ItemType.CutCopper; - mappings[103] = ItemType.ExposedCutCopper; - mappings[104] = ItemType.WeatheredCutCopper; - mappings[105] = ItemType.OxidizedCutCopper; - mappings[106] = ItemType.CutCopperStairs; - mappings[107] = ItemType.ExposedCutCopperStairs; - mappings[108] = ItemType.WeatheredCutCopperStairs; - mappings[109] = ItemType.OxidizedCutCopperStairs; - mappings[110] = ItemType.CutCopperSlab; - mappings[111] = ItemType.ExposedCutCopperSlab; - mappings[112] = ItemType.WeatheredCutCopperSlab; - mappings[113] = ItemType.OxidizedCutCopperSlab; - mappings[114] = ItemType.WaxedCopperBlock; - mappings[115] = ItemType.WaxedExposedCopper; - mappings[116] = ItemType.WaxedWeatheredCopper; - mappings[117] = ItemType.WaxedOxidizedCopper; - mappings[118] = ItemType.WaxedChiseledCopper; - mappings[119] = ItemType.WaxedExposedChiseledCopper; - mappings[120] = ItemType.WaxedWeatheredChiseledCopper; - mappings[121] = ItemType.WaxedOxidizedChiseledCopper; - mappings[122] = ItemType.WaxedCutCopper; - mappings[123] = ItemType.WaxedExposedCutCopper; - mappings[124] = ItemType.WaxedWeatheredCutCopper; - mappings[125] = ItemType.WaxedOxidizedCutCopper; - mappings[126] = ItemType.WaxedCutCopperStairs; - mappings[127] = ItemType.WaxedExposedCutCopperStairs; - mappings[128] = ItemType.WaxedWeatheredCutCopperStairs; - mappings[129] = ItemType.WaxedOxidizedCutCopperStairs; - mappings[130] = ItemType.WaxedCutCopperSlab; - mappings[131] = ItemType.WaxedExposedCutCopperSlab; - mappings[132] = ItemType.WaxedWeatheredCutCopperSlab; - mappings[133] = ItemType.WaxedOxidizedCutCopperSlab; - mappings[134] = ItemType.OakLog; - mappings[135] = ItemType.SpruceLog; - mappings[136] = ItemType.BirchLog; - mappings[137] = ItemType.JungleLog; - mappings[138] = ItemType.AcaciaLog; - mappings[139] = ItemType.CherryLog; - mappings[140] = ItemType.PaleOakLog; - mappings[141] = ItemType.DarkOakLog; - mappings[142] = ItemType.MangroveLog; - mappings[143] = ItemType.MangroveRoots; - mappings[144] = ItemType.MuddyMangroveRoots; - mappings[145] = ItemType.CrimsonStem; - mappings[146] = ItemType.WarpedStem; - mappings[147] = ItemType.BambooBlock; - mappings[148] = ItemType.StrippedOakLog; - mappings[149] = ItemType.StrippedSpruceLog; - mappings[150] = ItemType.StrippedBirchLog; - mappings[151] = ItemType.StrippedJungleLog; - mappings[152] = ItemType.StrippedAcaciaLog; - mappings[153] = ItemType.StrippedCherryLog; - mappings[154] = ItemType.StrippedDarkOakLog; - mappings[155] = ItemType.StrippedPaleOakLog; - mappings[156] = ItemType.StrippedMangroveLog; - mappings[157] = ItemType.StrippedCrimsonStem; - mappings[158] = ItemType.StrippedWarpedStem; - mappings[159] = ItemType.StrippedOakWood; - mappings[160] = ItemType.StrippedSpruceWood; - mappings[161] = ItemType.StrippedBirchWood; - mappings[162] = ItemType.StrippedJungleWood; - mappings[163] = ItemType.StrippedAcaciaWood; - mappings[164] = ItemType.StrippedCherryWood; - mappings[165] = ItemType.StrippedDarkOakWood; - mappings[166] = ItemType.StrippedPaleOakWood; - mappings[167] = ItemType.StrippedMangroveWood; - mappings[168] = ItemType.StrippedCrimsonHyphae; - mappings[169] = ItemType.StrippedWarpedHyphae; - mappings[170] = ItemType.StrippedBambooBlock; - mappings[171] = ItemType.OakWood; - mappings[172] = ItemType.SpruceWood; - mappings[173] = ItemType.BirchWood; - mappings[174] = ItemType.JungleWood; - mappings[175] = ItemType.AcaciaWood; - mappings[176] = ItemType.CherryWood; - mappings[177] = ItemType.PaleOakWood; - mappings[178] = ItemType.DarkOakWood; - mappings[179] = ItemType.MangroveWood; - mappings[180] = ItemType.CrimsonHyphae; - mappings[181] = ItemType.WarpedHyphae; - mappings[182] = ItemType.OakLeaves; - mappings[183] = ItemType.SpruceLeaves; - mappings[184] = ItemType.BirchLeaves; - mappings[185] = ItemType.JungleLeaves; - mappings[186] = ItemType.AcaciaLeaves; - mappings[187] = ItemType.CherryLeaves; - mappings[188] = ItemType.DarkOakLeaves; - mappings[189] = ItemType.PaleOakLeaves; - mappings[190] = ItemType.MangroveLeaves; - mappings[191] = ItemType.AzaleaLeaves; - mappings[192] = ItemType.FloweringAzaleaLeaves; - mappings[193] = ItemType.Sponge; - mappings[194] = ItemType.WetSponge; - mappings[195] = ItemType.Glass; - mappings[196] = ItemType.TintedGlass; - mappings[197] = ItemType.LapisBlock; - mappings[198] = ItemType.Sandstone; - mappings[199] = ItemType.ChiseledSandstone; - mappings[200] = ItemType.CutSandstone; - mappings[201] = ItemType.Cobweb; - mappings[202] = ItemType.ShortGrass; - mappings[203] = ItemType.Fern; - mappings[204] = ItemType.Bush; - mappings[205] = ItemType.Azalea; - mappings[206] = ItemType.FloweringAzalea; - mappings[207] = ItemType.DeadBush; - mappings[208] = ItemType.FireflyBush; - mappings[209] = ItemType.DryShortGrass; - mappings[210] = ItemType.DryTallGrass; - mappings[211] = ItemType.Seagrass; - mappings[212] = ItemType.SeaPickle; - mappings[213] = ItemType.WhiteWool; - mappings[214] = ItemType.OrangeWool; - mappings[215] = ItemType.MagentaWool; - mappings[216] = ItemType.LightBlueWool; - mappings[217] = ItemType.YellowWool; - mappings[218] = ItemType.LimeWool; - mappings[219] = ItemType.PinkWool; - mappings[220] = ItemType.GrayWool; - mappings[221] = ItemType.LightGrayWool; - mappings[222] = ItemType.CyanWool; - mappings[223] = ItemType.PurpleWool; - mappings[224] = ItemType.BlueWool; - mappings[225] = ItemType.BrownWool; - mappings[226] = ItemType.GreenWool; - mappings[227] = ItemType.RedWool; - mappings[228] = ItemType.BlackWool; - mappings[229] = ItemType.Dandelion; - mappings[230] = ItemType.OpenEyeblossom; - mappings[231] = ItemType.ClosedEyeblossom; - mappings[232] = ItemType.Poppy; - mappings[233] = ItemType.BlueOrchid; - mappings[234] = ItemType.Allium; - mappings[235] = ItemType.AzureBluet; - mappings[236] = ItemType.RedTulip; - mappings[237] = ItemType.OrangeTulip; - mappings[238] = ItemType.WhiteTulip; - mappings[239] = ItemType.PinkTulip; - mappings[240] = ItemType.OxeyeDaisy; - mappings[241] = ItemType.Cornflower; - mappings[242] = ItemType.LilyOfTheValley; - mappings[243] = ItemType.WitherRose; - mappings[244] = ItemType.Torchflower; - mappings[245] = ItemType.PitcherPlant; - mappings[246] = ItemType.SporeBlossom; - mappings[247] = ItemType.BrownMushroom; - mappings[248] = ItemType.RedMushroom; - mappings[249] = ItemType.CrimsonFungus; - mappings[250] = ItemType.WarpedFungus; - mappings[251] = ItemType.CrimsonRoots; - mappings[252] = ItemType.WarpedRoots; - mappings[253] = ItemType.NetherSprouts; - mappings[254] = ItemType.WeepingVines; - mappings[255] = ItemType.TwistingVines; - mappings[256] = ItemType.SugarCane; - mappings[257] = ItemType.Kelp; - mappings[258] = ItemType.PinkPetals; - mappings[259] = ItemType.Wildflowers; - mappings[260] = ItemType.LeafLitter; - mappings[261] = ItemType.MossCarpet; - mappings[262] = ItemType.MossBlock; - mappings[263] = ItemType.PaleMossCarpet; - mappings[264] = ItemType.PaleHangingMoss; - mappings[265] = ItemType.PaleMossBlock; - mappings[266] = ItemType.HangingRoots; - mappings[267] = ItemType.BigDripleaf; - mappings[268] = ItemType.SmallDripleaf; - mappings[269] = ItemType.Bamboo; - mappings[270] = ItemType.OakSlab; - mappings[271] = ItemType.SpruceSlab; - mappings[272] = ItemType.BirchSlab; - mappings[273] = ItemType.JungleSlab; - mappings[274] = ItemType.AcaciaSlab; - mappings[275] = ItemType.CherrySlab; - mappings[276] = ItemType.DarkOakSlab; - mappings[277] = ItemType.PaleOakSlab; - mappings[278] = ItemType.MangroveSlab; - mappings[279] = ItemType.BambooSlab; - mappings[280] = ItemType.BambooMosaicSlab; - mappings[281] = ItemType.CrimsonSlab; - mappings[282] = ItemType.WarpedSlab; - mappings[283] = ItemType.StoneSlab; - mappings[284] = ItemType.SmoothStoneSlab; - mappings[285] = ItemType.SandstoneSlab; - mappings[286] = ItemType.CutSandstoneSlab; - mappings[287] = ItemType.PetrifiedOakSlab; - mappings[288] = ItemType.CobblestoneSlab; - mappings[289] = ItemType.BrickSlab; - mappings[290] = ItemType.StoneBrickSlab; - mappings[291] = ItemType.MudBrickSlab; - mappings[292] = ItemType.NetherBrickSlab; - mappings[293] = ItemType.QuartzSlab; - mappings[294] = ItemType.RedSandstoneSlab; - mappings[295] = ItemType.CutRedSandstoneSlab; - mappings[296] = ItemType.PurpurSlab; - mappings[297] = ItemType.PrismarineSlab; - mappings[298] = ItemType.PrismarineBrickSlab; - mappings[299] = ItemType.DarkPrismarineSlab; - mappings[300] = ItemType.SmoothQuartz; - mappings[301] = ItemType.SmoothRedSandstone; - mappings[302] = ItemType.SmoothSandstone; - mappings[303] = ItemType.SmoothStone; - mappings[304] = ItemType.Bricks; - mappings[305] = ItemType.Bookshelf; - mappings[306] = ItemType.ChiseledBookshelf; - mappings[307] = ItemType.DecoratedPot; - mappings[308] = ItemType.MossyCobblestone; - mappings[309] = ItemType.Obsidian; - mappings[310] = ItemType.Torch; - mappings[311] = ItemType.EndRod; - mappings[312] = ItemType.ChorusPlant; - mappings[313] = ItemType.ChorusFlower; - mappings[314] = ItemType.PurpurBlock; - mappings[315] = ItemType.PurpurPillar; - mappings[316] = ItemType.PurpurStairs; - mappings[317] = ItemType.Spawner; - mappings[318] = ItemType.CreakingHeart; - mappings[319] = ItemType.Chest; - mappings[320] = ItemType.CraftingTable; - mappings[321] = ItemType.Farmland; - mappings[322] = ItemType.Furnace; - mappings[323] = ItemType.Ladder; - mappings[324] = ItemType.CobblestoneStairs; - mappings[325] = ItemType.Snow; - mappings[326] = ItemType.Ice; - mappings[327] = ItemType.SnowBlock; - mappings[328] = ItemType.Cactus; - mappings[329] = ItemType.CactusFlower; - mappings[330] = ItemType.Clay; - mappings[331] = ItemType.Jukebox; - mappings[332] = ItemType.OakFence; - mappings[333] = ItemType.SpruceFence; - mappings[334] = ItemType.BirchFence; - mappings[335] = ItemType.JungleFence; - mappings[336] = ItemType.AcaciaFence; - mappings[337] = ItemType.CherryFence; - mappings[338] = ItemType.DarkOakFence; - mappings[339] = ItemType.PaleOakFence; - mappings[340] = ItemType.MangroveFence; - mappings[341] = ItemType.BambooFence; - mappings[342] = ItemType.CrimsonFence; - mappings[343] = ItemType.WarpedFence; - mappings[344] = ItemType.Pumpkin; - mappings[345] = ItemType.CarvedPumpkin; - mappings[346] = ItemType.JackOLantern; - mappings[347] = ItemType.Netherrack; - mappings[348] = ItemType.SoulSand; - mappings[349] = ItemType.SoulSoil; - mappings[350] = ItemType.Basalt; - mappings[351] = ItemType.PolishedBasalt; - mappings[352] = ItemType.SmoothBasalt; - mappings[353] = ItemType.SoulTorch; - mappings[354] = ItemType.Glowstone; - mappings[355] = ItemType.InfestedStone; - mappings[356] = ItemType.InfestedCobblestone; - mappings[357] = ItemType.InfestedStoneBricks; - mappings[358] = ItemType.InfestedMossyStoneBricks; - mappings[359] = ItemType.InfestedCrackedStoneBricks; - mappings[360] = ItemType.InfestedChiseledStoneBricks; - mappings[361] = ItemType.InfestedDeepslate; - mappings[362] = ItemType.StoneBricks; - mappings[363] = ItemType.MossyStoneBricks; - mappings[364] = ItemType.CrackedStoneBricks; - mappings[365] = ItemType.ChiseledStoneBricks; - mappings[366] = ItemType.PackedMud; - mappings[367] = ItemType.MudBricks; - mappings[368] = ItemType.DeepslateBricks; - mappings[369] = ItemType.CrackedDeepslateBricks; - mappings[370] = ItemType.DeepslateTiles; - mappings[371] = ItemType.CrackedDeepslateTiles; - mappings[372] = ItemType.ChiseledDeepslate; - mappings[373] = ItemType.ReinforcedDeepslate; - mappings[374] = ItemType.BrownMushroomBlock; - mappings[375] = ItemType.RedMushroomBlock; - mappings[376] = ItemType.MushroomStem; - mappings[377] = ItemType.IronBars; - mappings[378] = ItemType.Chain; - mappings[379] = ItemType.GlassPane; - mappings[380] = ItemType.Melon; - mappings[381] = ItemType.Vine; - mappings[382] = ItemType.GlowLichen; - mappings[383] = ItemType.ResinClump; - mappings[384] = ItemType.ResinBlock; - mappings[385] = ItemType.ResinBricks; - mappings[386] = ItemType.ResinBrickStairs; - mappings[387] = ItemType.ResinBrickSlab; - mappings[388] = ItemType.ResinBrickWall; - mappings[389] = ItemType.ChiseledResinBricks; - mappings[390] = ItemType.BrickStairs; - mappings[391] = ItemType.StoneBrickStairs; - mappings[392] = ItemType.MudBrickStairs; - mappings[393] = ItemType.Mycelium; - mappings[394] = ItemType.LilyPad; - mappings[395] = ItemType.NetherBricks; - mappings[396] = ItemType.CrackedNetherBricks; - mappings[397] = ItemType.ChiseledNetherBricks; - mappings[398] = ItemType.NetherBrickFence; - mappings[399] = ItemType.NetherBrickStairs; - mappings[400] = ItemType.Sculk; - mappings[401] = ItemType.SculkVein; - mappings[402] = ItemType.SculkCatalyst; - mappings[403] = ItemType.SculkShrieker; - mappings[404] = ItemType.EnchantingTable; - mappings[405] = ItemType.EndPortalFrame; - mappings[406] = ItemType.EndStone; - mappings[407] = ItemType.EndStoneBricks; - mappings[408] = ItemType.DragonEgg; - mappings[409] = ItemType.SandstoneStairs; - mappings[410] = ItemType.EnderChest; - mappings[411] = ItemType.EmeraldBlock; - mappings[412] = ItemType.OakStairs; - mappings[413] = ItemType.SpruceStairs; - mappings[414] = ItemType.BirchStairs; - mappings[415] = ItemType.JungleStairs; - mappings[416] = ItemType.AcaciaStairs; - mappings[417] = ItemType.CherryStairs; - mappings[418] = ItemType.DarkOakStairs; - mappings[419] = ItemType.PaleOakStairs; - mappings[420] = ItemType.MangroveStairs; - mappings[421] = ItemType.BambooStairs; - mappings[422] = ItemType.BambooMosaicStairs; - mappings[423] = ItemType.CrimsonStairs; - mappings[424] = ItemType.WarpedStairs; - mappings[425] = ItemType.CommandBlock; - mappings[426] = ItemType.Beacon; - mappings[427] = ItemType.CobblestoneWall; - mappings[428] = ItemType.MossyCobblestoneWall; - mappings[429] = ItemType.BrickWall; - mappings[430] = ItemType.PrismarineWall; - mappings[431] = ItemType.RedSandstoneWall; - mappings[432] = ItemType.MossyStoneBrickWall; - mappings[433] = ItemType.GraniteWall; - mappings[434] = ItemType.StoneBrickWall; - mappings[435] = ItemType.MudBrickWall; - mappings[436] = ItemType.NetherBrickWall; - mappings[437] = ItemType.AndesiteWall; - mappings[438] = ItemType.RedNetherBrickWall; - mappings[439] = ItemType.SandstoneWall; - mappings[440] = ItemType.EndStoneBrickWall; - mappings[441] = ItemType.DioriteWall; - mappings[442] = ItemType.BlackstoneWall; - mappings[443] = ItemType.PolishedBlackstoneWall; - mappings[444] = ItemType.PolishedBlackstoneBrickWall; - mappings[445] = ItemType.CobbledDeepslateWall; - mappings[446] = ItemType.PolishedDeepslateWall; - mappings[447] = ItemType.DeepslateBrickWall; - mappings[448] = ItemType.DeepslateTileWall; - mappings[449] = ItemType.Anvil; - mappings[450] = ItemType.ChippedAnvil; - mappings[451] = ItemType.DamagedAnvil; - mappings[452] = ItemType.ChiseledQuartzBlock; - mappings[453] = ItemType.QuartzBlock; - mappings[454] = ItemType.QuartzBricks; - mappings[455] = ItemType.QuartzPillar; - mappings[456] = ItemType.QuartzStairs; - mappings[457] = ItemType.WhiteTerracotta; - mappings[458] = ItemType.OrangeTerracotta; - mappings[459] = ItemType.MagentaTerracotta; - mappings[460] = ItemType.LightBlueTerracotta; - mappings[461] = ItemType.YellowTerracotta; - mappings[462] = ItemType.LimeTerracotta; - mappings[463] = ItemType.PinkTerracotta; - mappings[464] = ItemType.GrayTerracotta; - mappings[465] = ItemType.LightGrayTerracotta; - mappings[466] = ItemType.CyanTerracotta; - mappings[467] = ItemType.PurpleTerracotta; - mappings[468] = ItemType.BlueTerracotta; - mappings[469] = ItemType.BrownTerracotta; - mappings[470] = ItemType.GreenTerracotta; - mappings[471] = ItemType.RedTerracotta; - mappings[472] = ItemType.BlackTerracotta; - mappings[473] = ItemType.Barrier; - mappings[474] = ItemType.Light; - mappings[475] = ItemType.HayBlock; - mappings[476] = ItemType.WhiteCarpet; - mappings[477] = ItemType.OrangeCarpet; - mappings[478] = ItemType.MagentaCarpet; - mappings[479] = ItemType.LightBlueCarpet; - mappings[480] = ItemType.YellowCarpet; - mappings[481] = ItemType.LimeCarpet; - mappings[482] = ItemType.PinkCarpet; - mappings[483] = ItemType.GrayCarpet; - mappings[484] = ItemType.LightGrayCarpet; - mappings[485] = ItemType.CyanCarpet; - mappings[486] = ItemType.PurpleCarpet; - mappings[487] = ItemType.BlueCarpet; - mappings[488] = ItemType.BrownCarpet; - mappings[489] = ItemType.GreenCarpet; - mappings[490] = ItemType.RedCarpet; - mappings[491] = ItemType.BlackCarpet; - mappings[492] = ItemType.Terracotta; - mappings[493] = ItemType.PackedIce; - mappings[494] = ItemType.DirtPath; - mappings[495] = ItemType.Sunflower; - mappings[496] = ItemType.Lilac; - mappings[497] = ItemType.RoseBush; - mappings[498] = ItemType.Peony; - mappings[499] = ItemType.TallGrass; - mappings[500] = ItemType.LargeFern; - mappings[501] = ItemType.WhiteStainedGlass; - mappings[502] = ItemType.OrangeStainedGlass; - mappings[503] = ItemType.MagentaStainedGlass; - mappings[504] = ItemType.LightBlueStainedGlass; - mappings[505] = ItemType.YellowStainedGlass; - mappings[506] = ItemType.LimeStainedGlass; - mappings[507] = ItemType.PinkStainedGlass; - mappings[508] = ItemType.GrayStainedGlass; - mappings[509] = ItemType.LightGrayStainedGlass; - mappings[510] = ItemType.CyanStainedGlass; - mappings[511] = ItemType.PurpleStainedGlass; - mappings[512] = ItemType.BlueStainedGlass; - mappings[513] = ItemType.BrownStainedGlass; - mappings[514] = ItemType.GreenStainedGlass; - mappings[515] = ItemType.RedStainedGlass; - mappings[516] = ItemType.BlackStainedGlass; - mappings[517] = ItemType.WhiteStainedGlassPane; - mappings[518] = ItemType.OrangeStainedGlassPane; - mappings[519] = ItemType.MagentaStainedGlassPane; - mappings[520] = ItemType.LightBlueStainedGlassPane; - mappings[521] = ItemType.YellowStainedGlassPane; - mappings[522] = ItemType.LimeStainedGlassPane; - mappings[523] = ItemType.PinkStainedGlassPane; - mappings[524] = ItemType.GrayStainedGlassPane; - mappings[525] = ItemType.LightGrayStainedGlassPane; - mappings[526] = ItemType.CyanStainedGlassPane; - mappings[527] = ItemType.PurpleStainedGlassPane; - mappings[528] = ItemType.BlueStainedGlassPane; - mappings[529] = ItemType.BrownStainedGlassPane; - mappings[530] = ItemType.GreenStainedGlassPane; - mappings[531] = ItemType.RedStainedGlassPane; - mappings[532] = ItemType.BlackStainedGlassPane; - mappings[533] = ItemType.Prismarine; - mappings[534] = ItemType.PrismarineBricks; - mappings[535] = ItemType.DarkPrismarine; - mappings[536] = ItemType.PrismarineStairs; - mappings[537] = ItemType.PrismarineBrickStairs; - mappings[538] = ItemType.DarkPrismarineStairs; - mappings[539] = ItemType.SeaLantern; - mappings[540] = ItemType.RedSandstone; - mappings[541] = ItemType.ChiseledRedSandstone; - mappings[542] = ItemType.CutRedSandstone; - mappings[543] = ItemType.RedSandstoneStairs; - mappings[544] = ItemType.RepeatingCommandBlock; - mappings[545] = ItemType.ChainCommandBlock; - mappings[546] = ItemType.MagmaBlock; - mappings[547] = ItemType.NetherWartBlock; - mappings[548] = ItemType.WarpedWartBlock; - mappings[549] = ItemType.RedNetherBricks; - mappings[550] = ItemType.BoneBlock; - mappings[551] = ItemType.StructureVoid; - mappings[552] = ItemType.ShulkerBox; - mappings[553] = ItemType.WhiteShulkerBox; - mappings[554] = ItemType.OrangeShulkerBox; - mappings[555] = ItemType.MagentaShulkerBox; - mappings[556] = ItemType.LightBlueShulkerBox; - mappings[557] = ItemType.YellowShulkerBox; - mappings[558] = ItemType.LimeShulkerBox; - mappings[559] = ItemType.PinkShulkerBox; - mappings[560] = ItemType.GrayShulkerBox; - mappings[561] = ItemType.LightGrayShulkerBox; - mappings[562] = ItemType.CyanShulkerBox; - mappings[563] = ItemType.PurpleShulkerBox; - mappings[564] = ItemType.BlueShulkerBox; - mappings[565] = ItemType.BrownShulkerBox; - mappings[566] = ItemType.GreenShulkerBox; - mappings[567] = ItemType.RedShulkerBox; - mappings[568] = ItemType.BlackShulkerBox; - mappings[569] = ItemType.WhiteGlazedTerracotta; - mappings[570] = ItemType.OrangeGlazedTerracotta; - mappings[571] = ItemType.MagentaGlazedTerracotta; - mappings[572] = ItemType.LightBlueGlazedTerracotta; - mappings[573] = ItemType.YellowGlazedTerracotta; - mappings[574] = ItemType.LimeGlazedTerracotta; - mappings[575] = ItemType.PinkGlazedTerracotta; - mappings[576] = ItemType.GrayGlazedTerracotta; - mappings[577] = ItemType.LightGrayGlazedTerracotta; - mappings[578] = ItemType.CyanGlazedTerracotta; - mappings[579] = ItemType.PurpleGlazedTerracotta; - mappings[580] = ItemType.BlueGlazedTerracotta; - mappings[581] = ItemType.BrownGlazedTerracotta; - mappings[582] = ItemType.GreenGlazedTerracotta; - mappings[583] = ItemType.RedGlazedTerracotta; - mappings[584] = ItemType.BlackGlazedTerracotta; - mappings[585] = ItemType.WhiteConcrete; - mappings[586] = ItemType.OrangeConcrete; - mappings[587] = ItemType.MagentaConcrete; - mappings[588] = ItemType.LightBlueConcrete; - mappings[589] = ItemType.YellowConcrete; - mappings[590] = ItemType.LimeConcrete; - mappings[591] = ItemType.PinkConcrete; - mappings[592] = ItemType.GrayConcrete; - mappings[593] = ItemType.LightGrayConcrete; - mappings[594] = ItemType.CyanConcrete; - mappings[595] = ItemType.PurpleConcrete; - mappings[596] = ItemType.BlueConcrete; - mappings[597] = ItemType.BrownConcrete; - mappings[598] = ItemType.GreenConcrete; - mappings[599] = ItemType.RedConcrete; - mappings[600] = ItemType.BlackConcrete; - mappings[601] = ItemType.WhiteConcretePowder; - mappings[602] = ItemType.OrangeConcretePowder; - mappings[603] = ItemType.MagentaConcretePowder; - mappings[604] = ItemType.LightBlueConcretePowder; - mappings[605] = ItemType.YellowConcretePowder; - mappings[606] = ItemType.LimeConcretePowder; - mappings[607] = ItemType.PinkConcretePowder; - mappings[608] = ItemType.GrayConcretePowder; - mappings[609] = ItemType.LightGrayConcretePowder; - mappings[610] = ItemType.CyanConcretePowder; - mappings[611] = ItemType.PurpleConcretePowder; - mappings[612] = ItemType.BlueConcretePowder; - mappings[613] = ItemType.BrownConcretePowder; - mappings[614] = ItemType.GreenConcretePowder; - mappings[615] = ItemType.RedConcretePowder; - mappings[616] = ItemType.BlackConcretePowder; - mappings[617] = ItemType.TurtleEgg; - mappings[618] = ItemType.SnifferEgg; - mappings[619] = ItemType.DeadTubeCoralBlock; - mappings[620] = ItemType.DeadBrainCoralBlock; - mappings[621] = ItemType.DeadBubbleCoralBlock; - mappings[622] = ItemType.DeadFireCoralBlock; - mappings[623] = ItemType.DeadHornCoralBlock; - mappings[624] = ItemType.TubeCoralBlock; - mappings[625] = ItemType.BrainCoralBlock; - mappings[626] = ItemType.BubbleCoralBlock; - mappings[627] = ItemType.FireCoralBlock; - mappings[628] = ItemType.HornCoralBlock; - mappings[629] = ItemType.TubeCoral; - mappings[630] = ItemType.BrainCoral; - mappings[631] = ItemType.BubbleCoral; - mappings[632] = ItemType.FireCoral; - mappings[633] = ItemType.HornCoral; - mappings[634] = ItemType.DeadBrainCoral; - mappings[635] = ItemType.DeadBubbleCoral; - mappings[636] = ItemType.DeadFireCoral; - mappings[637] = ItemType.DeadHornCoral; - mappings[638] = ItemType.DeadTubeCoral; - mappings[639] = ItemType.TubeCoralFan; - mappings[640] = ItemType.BrainCoralFan; - mappings[641] = ItemType.BubbleCoralFan; - mappings[642] = ItemType.FireCoralFan; - mappings[643] = ItemType.HornCoralFan; - mappings[644] = ItemType.DeadTubeCoralFan; - mappings[645] = ItemType.DeadBrainCoralFan; - mappings[646] = ItemType.DeadBubbleCoralFan; - mappings[647] = ItemType.DeadFireCoralFan; - mappings[648] = ItemType.DeadHornCoralFan; - mappings[649] = ItemType.BlueIce; - mappings[650] = ItemType.Conduit; - mappings[651] = ItemType.PolishedGraniteStairs; - mappings[652] = ItemType.SmoothRedSandstoneStairs; - mappings[653] = ItemType.MossyStoneBrickStairs; - mappings[654] = ItemType.PolishedDioriteStairs; - mappings[655] = ItemType.MossyCobblestoneStairs; - mappings[656] = ItemType.EndStoneBrickStairs; - mappings[657] = ItemType.StoneStairs; - mappings[658] = ItemType.SmoothSandstoneStairs; - mappings[659] = ItemType.SmoothQuartzStairs; - mappings[660] = ItemType.GraniteStairs; - mappings[661] = ItemType.AndesiteStairs; - mappings[662] = ItemType.RedNetherBrickStairs; - mappings[663] = ItemType.PolishedAndesiteStairs; - mappings[664] = ItemType.DioriteStairs; - mappings[665] = ItemType.CobbledDeepslateStairs; - mappings[666] = ItemType.PolishedDeepslateStairs; - mappings[667] = ItemType.DeepslateBrickStairs; - mappings[668] = ItemType.DeepslateTileStairs; - mappings[669] = ItemType.PolishedGraniteSlab; - mappings[670] = ItemType.SmoothRedSandstoneSlab; - mappings[671] = ItemType.MossyStoneBrickSlab; - mappings[672] = ItemType.PolishedDioriteSlab; - mappings[673] = ItemType.MossyCobblestoneSlab; - mappings[674] = ItemType.EndStoneBrickSlab; - mappings[675] = ItemType.SmoothSandstoneSlab; - mappings[676] = ItemType.SmoothQuartzSlab; - mappings[677] = ItemType.GraniteSlab; - mappings[678] = ItemType.AndesiteSlab; - mappings[679] = ItemType.RedNetherBrickSlab; - mappings[680] = ItemType.PolishedAndesiteSlab; - mappings[681] = ItemType.DioriteSlab; - mappings[682] = ItemType.CobbledDeepslateSlab; - mappings[683] = ItemType.PolishedDeepslateSlab; - mappings[684] = ItemType.DeepslateBrickSlab; - mappings[685] = ItemType.DeepslateTileSlab; - mappings[686] = ItemType.Scaffolding; - mappings[687] = ItemType.Redstone; - mappings[688] = ItemType.RedstoneTorch; - mappings[689] = ItemType.RedstoneBlock; - mappings[690] = ItemType.Repeater; - mappings[691] = ItemType.Comparator; - mappings[692] = ItemType.Piston; - mappings[693] = ItemType.StickyPiston; - mappings[694] = ItemType.SlimeBlock; - mappings[695] = ItemType.HoneyBlock; - mappings[696] = ItemType.Observer; - mappings[697] = ItemType.Hopper; - mappings[698] = ItemType.Dispenser; - mappings[699] = ItemType.Dropper; - mappings[700] = ItemType.Lectern; - mappings[701] = ItemType.Target; - mappings[702] = ItemType.Lever; - mappings[703] = ItemType.LightningRod; - mappings[704] = ItemType.DaylightDetector; - mappings[705] = ItemType.SculkSensor; - mappings[706] = ItemType.CalibratedSculkSensor; - mappings[707] = ItemType.TripwireHook; - mappings[708] = ItemType.TrappedChest; - mappings[709] = ItemType.Tnt; - mappings[710] = ItemType.RedstoneLamp; - mappings[711] = ItemType.NoteBlock; - mappings[712] = ItemType.StoneButton; - mappings[713] = ItemType.PolishedBlackstoneButton; - mappings[714] = ItemType.OakButton; - mappings[715] = ItemType.SpruceButton; - mappings[716] = ItemType.BirchButton; - mappings[717] = ItemType.JungleButton; - mappings[718] = ItemType.AcaciaButton; - mappings[719] = ItemType.CherryButton; - mappings[720] = ItemType.DarkOakButton; - mappings[721] = ItemType.PaleOakButton; - mappings[722] = ItemType.MangroveButton; - mappings[723] = ItemType.BambooButton; - mappings[724] = ItemType.CrimsonButton; - mappings[725] = ItemType.WarpedButton; - mappings[726] = ItemType.StonePressurePlate; - mappings[727] = ItemType.PolishedBlackstonePressurePlate; - mappings[728] = ItemType.LightWeightedPressurePlate; - mappings[729] = ItemType.HeavyWeightedPressurePlate; - mappings[730] = ItemType.OakPressurePlate; - mappings[731] = ItemType.SprucePressurePlate; - mappings[732] = ItemType.BirchPressurePlate; - mappings[733] = ItemType.JunglePressurePlate; - mappings[734] = ItemType.AcaciaPressurePlate; - mappings[735] = ItemType.CherryPressurePlate; - mappings[736] = ItemType.DarkOakPressurePlate; - mappings[737] = ItemType.PaleOakPressurePlate; - mappings[738] = ItemType.MangrovePressurePlate; - mappings[739] = ItemType.BambooPressurePlate; - mappings[740] = ItemType.CrimsonPressurePlate; - mappings[741] = ItemType.WarpedPressurePlate; - mappings[742] = ItemType.IronDoor; - mappings[743] = ItemType.OakDoor; - mappings[744] = ItemType.SpruceDoor; - mappings[745] = ItemType.BirchDoor; - mappings[746] = ItemType.JungleDoor; - mappings[747] = ItemType.AcaciaDoor; - mappings[748] = ItemType.CherryDoor; - mappings[749] = ItemType.DarkOakDoor; - mappings[750] = ItemType.PaleOakDoor; - mappings[751] = ItemType.MangroveDoor; - mappings[752] = ItemType.BambooDoor; - mappings[753] = ItemType.CrimsonDoor; - mappings[754] = ItemType.WarpedDoor; - mappings[755] = ItemType.CopperDoor; - mappings[756] = ItemType.ExposedCopperDoor; - mappings[757] = ItemType.WeatheredCopperDoor; - mappings[758] = ItemType.OxidizedCopperDoor; - mappings[759] = ItemType.WaxedCopperDoor; - mappings[760] = ItemType.WaxedExposedCopperDoor; - mappings[761] = ItemType.WaxedWeatheredCopperDoor; - mappings[762] = ItemType.WaxedOxidizedCopperDoor; - mappings[763] = ItemType.IronTrapdoor; - mappings[764] = ItemType.OakTrapdoor; - mappings[765] = ItemType.SpruceTrapdoor; - mappings[766] = ItemType.BirchTrapdoor; - mappings[767] = ItemType.JungleTrapdoor; - mappings[768] = ItemType.AcaciaTrapdoor; - mappings[769] = ItemType.CherryTrapdoor; - mappings[770] = ItemType.DarkOakTrapdoor; - mappings[771] = ItemType.PaleOakTrapdoor; - mappings[772] = ItemType.MangroveTrapdoor; - mappings[773] = ItemType.BambooTrapdoor; - mappings[774] = ItemType.CrimsonTrapdoor; - mappings[775] = ItemType.WarpedTrapdoor; - mappings[776] = ItemType.CopperTrapdoor; - mappings[777] = ItemType.ExposedCopperTrapdoor; - mappings[778] = ItemType.WeatheredCopperTrapdoor; - mappings[779] = ItemType.OxidizedCopperTrapdoor; - mappings[780] = ItemType.WaxedCopperTrapdoor; - mappings[781] = ItemType.WaxedExposedCopperTrapdoor; - mappings[782] = ItemType.WaxedWeatheredCopperTrapdoor; - mappings[783] = ItemType.WaxedOxidizedCopperTrapdoor; - mappings[784] = ItemType.OakFenceGate; - mappings[785] = ItemType.SpruceFenceGate; - mappings[786] = ItemType.BirchFenceGate; - mappings[787] = ItemType.JungleFenceGate; - mappings[788] = ItemType.AcaciaFenceGate; - mappings[789] = ItemType.CherryFenceGate; - mappings[790] = ItemType.DarkOakFenceGate; - mappings[791] = ItemType.PaleOakFenceGate; - mappings[792] = ItemType.MangroveFenceGate; - mappings[793] = ItemType.BambooFenceGate; - mappings[794] = ItemType.CrimsonFenceGate; - mappings[795] = ItemType.WarpedFenceGate; - mappings[796] = ItemType.PoweredRail; - mappings[797] = ItemType.DetectorRail; - mappings[798] = ItemType.Rail; - mappings[799] = ItemType.ActivatorRail; - mappings[800] = ItemType.Saddle; - mappings[801] = ItemType.Minecart; - mappings[802] = ItemType.ChestMinecart; - mappings[803] = ItemType.FurnaceMinecart; - mappings[804] = ItemType.TntMinecart; - mappings[805] = ItemType.HopperMinecart; - mappings[806] = ItemType.CarrotOnAStick; - mappings[807] = ItemType.WarpedFungusOnAStick; - mappings[808] = ItemType.PhantomMembrane; - mappings[809] = ItemType.Elytra; - mappings[810] = ItemType.OakBoat; - mappings[811] = ItemType.OakChestBoat; - mappings[812] = ItemType.SpruceBoat; - mappings[813] = ItemType.SpruceChestBoat; - mappings[814] = ItemType.BirchBoat; - mappings[815] = ItemType.BirchChestBoat; - mappings[816] = ItemType.JungleBoat; - mappings[817] = ItemType.JungleChestBoat; - mappings[818] = ItemType.AcaciaBoat; - mappings[819] = ItemType.AcaciaChestBoat; - mappings[820] = ItemType.CherryBoat; - mappings[821] = ItemType.CherryChestBoat; - mappings[822] = ItemType.DarkOakBoat; - mappings[823] = ItemType.DarkOakChestBoat; - mappings[824] = ItemType.PaleOakBoat; - mappings[825] = ItemType.PaleOakChestBoat; - mappings[826] = ItemType.MangroveBoat; - mappings[827] = ItemType.MangroveChestBoat; - mappings[828] = ItemType.BambooRaft; - mappings[829] = ItemType.BambooChestRaft; - mappings[830] = ItemType.StructureBlock; - mappings[831] = ItemType.Jigsaw; - mappings[832] = ItemType.TestBlock; - mappings[833] = ItemType.TestInstanceBlock; - mappings[834] = ItemType.TurtleHelmet; - mappings[835] = ItemType.TurtleScute; - mappings[836] = ItemType.ArmadilloScute; - mappings[837] = ItemType.WolfArmor; - mappings[838] = ItemType.FlintAndSteel; - mappings[839] = ItemType.Bowl; - mappings[840] = ItemType.Apple; - mappings[841] = ItemType.Bow; - mappings[842] = ItemType.Arrow; - mappings[843] = ItemType.Coal; - mappings[844] = ItemType.Charcoal; - mappings[845] = ItemType.Diamond; - mappings[846] = ItemType.Emerald; - mappings[847] = ItemType.LapisLazuli; - mappings[848] = ItemType.Quartz; - mappings[849] = ItemType.AmethystShard; - mappings[850] = ItemType.RawIron; - mappings[851] = ItemType.IronIngot; - mappings[852] = ItemType.RawCopper; - mappings[853] = ItemType.CopperIngot; - mappings[854] = ItemType.RawGold; - mappings[855] = ItemType.GoldIngot; - mappings[856] = ItemType.NetheriteIngot; - mappings[857] = ItemType.NetheriteScrap; - mappings[858] = ItemType.WoodenSword; - mappings[859] = ItemType.WoodenShovel; - mappings[860] = ItemType.WoodenPickaxe; - mappings[861] = ItemType.WoodenAxe; - mappings[862] = ItemType.WoodenHoe; - mappings[863] = ItemType.StoneSword; - mappings[864] = ItemType.StoneShovel; - mappings[865] = ItemType.StonePickaxe; - mappings[866] = ItemType.StoneAxe; - mappings[867] = ItemType.StoneHoe; - mappings[868] = ItemType.GoldenSword; - mappings[869] = ItemType.GoldenShovel; - mappings[870] = ItemType.GoldenPickaxe; - mappings[871] = ItemType.GoldenAxe; - mappings[872] = ItemType.GoldenHoe; - mappings[873] = ItemType.IronSword; - mappings[874] = ItemType.IronShovel; - mappings[875] = ItemType.IronPickaxe; - mappings[876] = ItemType.IronAxe; - mappings[877] = ItemType.IronHoe; - mappings[878] = ItemType.DiamondSword; - mappings[879] = ItemType.DiamondShovel; - mappings[880] = ItemType.DiamondPickaxe; - mappings[881] = ItemType.DiamondAxe; - mappings[882] = ItemType.DiamondHoe; - mappings[883] = ItemType.NetheriteSword; - mappings[884] = ItemType.NetheriteShovel; - mappings[885] = ItemType.NetheritePickaxe; - mappings[886] = ItemType.NetheriteAxe; - mappings[887] = ItemType.NetheriteHoe; - mappings[888] = ItemType.Stick; - mappings[889] = ItemType.MushroomStew; - mappings[890] = ItemType.String; - mappings[891] = ItemType.Feather; - mappings[892] = ItemType.Gunpowder; - mappings[893] = ItemType.WheatSeeds; - mappings[894] = ItemType.Wheat; - mappings[895] = ItemType.Bread; - mappings[896] = ItemType.LeatherHelmet; - mappings[897] = ItemType.LeatherChestplate; - mappings[898] = ItemType.LeatherLeggings; - mappings[899] = ItemType.LeatherBoots; - mappings[900] = ItemType.ChainmailHelmet; - mappings[901] = ItemType.ChainmailChestplate; - mappings[902] = ItemType.ChainmailLeggings; - mappings[903] = ItemType.ChainmailBoots; - mappings[904] = ItemType.IronHelmet; - mappings[905] = ItemType.IronChestplate; - mappings[906] = ItemType.IronLeggings; - mappings[907] = ItemType.IronBoots; - mappings[908] = ItemType.DiamondHelmet; - mappings[909] = ItemType.DiamondChestplate; - mappings[910] = ItemType.DiamondLeggings; - mappings[911] = ItemType.DiamondBoots; - mappings[912] = ItemType.GoldenHelmet; - mappings[913] = ItemType.GoldenChestplate; - mappings[914] = ItemType.GoldenLeggings; - mappings[915] = ItemType.GoldenBoots; - mappings[916] = ItemType.NetheriteHelmet; - mappings[917] = ItemType.NetheriteChestplate; - mappings[918] = ItemType.NetheriteLeggings; - mappings[919] = ItemType.NetheriteBoots; - mappings[920] = ItemType.Flint; - mappings[921] = ItemType.Porkchop; - mappings[922] = ItemType.CookedPorkchop; - mappings[923] = ItemType.Painting; - mappings[924] = ItemType.GoldenApple; - mappings[925] = ItemType.EnchantedGoldenApple; - mappings[926] = ItemType.OakSign; - mappings[927] = ItemType.SpruceSign; - mappings[928] = ItemType.BirchSign; - mappings[929] = ItemType.JungleSign; - mappings[930] = ItemType.AcaciaSign; - mappings[931] = ItemType.CherrySign; - mappings[932] = ItemType.DarkOakSign; - mappings[933] = ItemType.PaleOakSign; - mappings[934] = ItemType.MangroveSign; - mappings[935] = ItemType.BambooSign; - mappings[936] = ItemType.CrimsonSign; - mappings[937] = ItemType.WarpedSign; - mappings[938] = ItemType.OakHangingSign; - mappings[939] = ItemType.SpruceHangingSign; - mappings[940] = ItemType.BirchHangingSign; - mappings[941] = ItemType.JungleHangingSign; - mappings[942] = ItemType.AcaciaHangingSign; - mappings[943] = ItemType.CherryHangingSign; - mappings[944] = ItemType.DarkOakHangingSign; - mappings[945] = ItemType.PaleOakHangingSign; - mappings[946] = ItemType.MangroveHangingSign; - mappings[947] = ItemType.BambooHangingSign; - mappings[948] = ItemType.CrimsonHangingSign; - mappings[949] = ItemType.WarpedHangingSign; - mappings[950] = ItemType.Bucket; - mappings[951] = ItemType.WaterBucket; - mappings[952] = ItemType.LavaBucket; - mappings[953] = ItemType.PowderSnowBucket; - mappings[954] = ItemType.Snowball; - mappings[955] = ItemType.Leather; - mappings[956] = ItemType.MilkBucket; - mappings[957] = ItemType.PufferfishBucket; - mappings[958] = ItemType.SalmonBucket; - mappings[959] = ItemType.CodBucket; - mappings[960] = ItemType.TropicalFishBucket; - mappings[961] = ItemType.AxolotlBucket; - mappings[962] = ItemType.TadpoleBucket; - mappings[963] = ItemType.Brick; - mappings[964] = ItemType.ClayBall; - mappings[965] = ItemType.DriedKelpBlock; - mappings[966] = ItemType.Paper; - mappings[967] = ItemType.Book; - mappings[968] = ItemType.SlimeBall; - mappings[969] = ItemType.Egg; - mappings[970] = ItemType.BlueEgg; - mappings[971] = ItemType.BrownEgg; - mappings[972] = ItemType.Compass; - mappings[973] = ItemType.RecoveryCompass; - mappings[974] = ItemType.Bundle; - mappings[975] = ItemType.WhiteBundle; - mappings[976] = ItemType.OrangeBundle; - mappings[977] = ItemType.MagentaBundle; - mappings[978] = ItemType.LightBlueBundle; - mappings[979] = ItemType.YellowBundle; - mappings[980] = ItemType.LimeBundle; - mappings[981] = ItemType.PinkBundle; - mappings[982] = ItemType.GrayBundle; - mappings[983] = ItemType.LightGrayBundle; - mappings[984] = ItemType.CyanBundle; - mappings[985] = ItemType.PurpleBundle; - mappings[986] = ItemType.BlueBundle; - mappings[987] = ItemType.BrownBundle; - mappings[988] = ItemType.GreenBundle; - mappings[989] = ItemType.RedBundle; - mappings[990] = ItemType.BlackBundle; - mappings[991] = ItemType.FishingRod; - mappings[992] = ItemType.Clock; - mappings[993] = ItemType.Spyglass; - mappings[994] = ItemType.GlowstoneDust; - mappings[995] = ItemType.Cod; - mappings[996] = ItemType.Salmon; - mappings[997] = ItemType.TropicalFish; - mappings[998] = ItemType.Pufferfish; - mappings[999] = ItemType.CookedCod; - mappings[1000] = ItemType.CookedSalmon; - mappings[1001] = ItemType.InkSac; - mappings[1002] = ItemType.GlowInkSac; - mappings[1003] = ItemType.CocoaBeans; - mappings[1004] = ItemType.WhiteDye; - mappings[1005] = ItemType.OrangeDye; - mappings[1006] = ItemType.MagentaDye; - mappings[1007] = ItemType.LightBlueDye; - mappings[1008] = ItemType.YellowDye; - mappings[1009] = ItemType.LimeDye; - mappings[1010] = ItemType.PinkDye; - mappings[1011] = ItemType.GrayDye; - mappings[1012] = ItemType.LightGrayDye; - mappings[1013] = ItemType.CyanDye; - mappings[1014] = ItemType.PurpleDye; - mappings[1015] = ItemType.BlueDye; - mappings[1016] = ItemType.BrownDye; - mappings[1017] = ItemType.GreenDye; - mappings[1018] = ItemType.RedDye; - mappings[1019] = ItemType.BlackDye; - mappings[1020] = ItemType.BoneMeal; - mappings[1021] = ItemType.Bone; - mappings[1022] = ItemType.Sugar; - mappings[1023] = ItemType.Cake; - mappings[1024] = ItemType.WhiteBed; - mappings[1025] = ItemType.OrangeBed; - mappings[1026] = ItemType.MagentaBed; - mappings[1027] = ItemType.LightBlueBed; - mappings[1028] = ItemType.YellowBed; - mappings[1029] = ItemType.LimeBed; - mappings[1030] = ItemType.PinkBed; - mappings[1031] = ItemType.GrayBed; - mappings[1032] = ItemType.LightGrayBed; - mappings[1033] = ItemType.CyanBed; - mappings[1034] = ItemType.PurpleBed; - mappings[1035] = ItemType.BlueBed; - mappings[1036] = ItemType.BrownBed; - mappings[1037] = ItemType.GreenBed; - mappings[1038] = ItemType.RedBed; - mappings[1039] = ItemType.BlackBed; - mappings[1040] = ItemType.Cookie; - mappings[1041] = ItemType.Crafter; - mappings[1042] = ItemType.FilledMap; - mappings[1043] = ItemType.Shears; - mappings[1044] = ItemType.MelonSlice; - mappings[1045] = ItemType.DriedKelp; - mappings[1046] = ItemType.PumpkinSeeds; - mappings[1047] = ItemType.MelonSeeds; - mappings[1048] = ItemType.Beef; - mappings[1049] = ItemType.CookedBeef; - mappings[1050] = ItemType.Chicken; - mappings[1051] = ItemType.CookedChicken; - mappings[1052] = ItemType.RottenFlesh; - mappings[1053] = ItemType.EnderPearl; - mappings[1054] = ItemType.BlazeRod; - mappings[1055] = ItemType.GhastTear; - mappings[1056] = ItemType.GoldNugget; - mappings[1057] = ItemType.NetherWart; - mappings[1058] = ItemType.GlassBottle; - mappings[1059] = ItemType.Potion; - mappings[1060] = ItemType.SpiderEye; - mappings[1061] = ItemType.FermentedSpiderEye; - mappings[1062] = ItemType.BlazePowder; - mappings[1063] = ItemType.MagmaCream; - mappings[1064] = ItemType.BrewingStand; - mappings[1065] = ItemType.Cauldron; - mappings[1066] = ItemType.EnderEye; - mappings[1067] = ItemType.GlisteringMelonSlice; - mappings[1068] = ItemType.ArmadilloSpawnEgg; - mappings[1069] = ItemType.AllaySpawnEgg; - mappings[1070] = ItemType.AxolotlSpawnEgg; - mappings[1071] = ItemType.BatSpawnEgg; - mappings[1072] = ItemType.BeeSpawnEgg; - mappings[1073] = ItemType.BlazeSpawnEgg; - mappings[1074] = ItemType.BoggedSpawnEgg; - mappings[1075] = ItemType.BreezeSpawnEgg; - mappings[1076] = ItemType.CatSpawnEgg; - mappings[1077] = ItemType.CamelSpawnEgg; - mappings[1078] = ItemType.CaveSpiderSpawnEgg; - mappings[1079] = ItemType.ChickenSpawnEgg; - mappings[1080] = ItemType.CodSpawnEgg; - mappings[1081] = ItemType.CowSpawnEgg; - mappings[1082] = ItemType.CreeperSpawnEgg; - mappings[1083] = ItemType.DolphinSpawnEgg; - mappings[1084] = ItemType.DonkeySpawnEgg; - mappings[1085] = ItemType.DrownedSpawnEgg; - mappings[1086] = ItemType.ElderGuardianSpawnEgg; - mappings[1087] = ItemType.EnderDragonSpawnEgg; - mappings[1088] = ItemType.EndermanSpawnEgg; - mappings[1089] = ItemType.EndermiteSpawnEgg; - mappings[1090] = ItemType.EvokerSpawnEgg; - mappings[1091] = ItemType.FoxSpawnEgg; - mappings[1092] = ItemType.FrogSpawnEgg; - mappings[1093] = ItemType.GhastSpawnEgg; - mappings[1094] = ItemType.GlowSquidSpawnEgg; - mappings[1095] = ItemType.GoatSpawnEgg; - mappings[1096] = ItemType.GuardianSpawnEgg; - mappings[1097] = ItemType.HoglinSpawnEgg; - mappings[1098] = ItemType.HorseSpawnEgg; - mappings[1099] = ItemType.HuskSpawnEgg; - mappings[1100] = ItemType.IronGolemSpawnEgg; - mappings[1101] = ItemType.LlamaSpawnEgg; - mappings[1102] = ItemType.MagmaCubeSpawnEgg; - mappings[1103] = ItemType.MooshroomSpawnEgg; - mappings[1104] = ItemType.MuleSpawnEgg; - mappings[1105] = ItemType.OcelotSpawnEgg; - mappings[1106] = ItemType.PandaSpawnEgg; - mappings[1107] = ItemType.ParrotSpawnEgg; - mappings[1108] = ItemType.PhantomSpawnEgg; - mappings[1109] = ItemType.PigSpawnEgg; - mappings[1110] = ItemType.PiglinSpawnEgg; - mappings[1111] = ItemType.PiglinBruteSpawnEgg; - mappings[1112] = ItemType.PillagerSpawnEgg; - mappings[1113] = ItemType.PolarBearSpawnEgg; - mappings[1114] = ItemType.PufferfishSpawnEgg; - mappings[1115] = ItemType.RabbitSpawnEgg; - mappings[1116] = ItemType.RavagerSpawnEgg; - mappings[1117] = ItemType.SalmonSpawnEgg; - mappings[1118] = ItemType.SheepSpawnEgg; - mappings[1119] = ItemType.ShulkerSpawnEgg; - mappings[1120] = ItemType.SilverfishSpawnEgg; - mappings[1121] = ItemType.SkeletonSpawnEgg; - mappings[1122] = ItemType.SkeletonHorseSpawnEgg; - mappings[1123] = ItemType.SlimeSpawnEgg; - mappings[1124] = ItemType.SnifferSpawnEgg; - mappings[1125] = ItemType.SnowGolemSpawnEgg; - mappings[1126] = ItemType.SpiderSpawnEgg; - mappings[1127] = ItemType.SquidSpawnEgg; - mappings[1128] = ItemType.StraySpawnEgg; - mappings[1129] = ItemType.StriderSpawnEgg; - mappings[1130] = ItemType.TadpoleSpawnEgg; - mappings[1131] = ItemType.TraderLlamaSpawnEgg; - mappings[1132] = ItemType.TropicalFishSpawnEgg; - mappings[1133] = ItemType.TurtleSpawnEgg; - mappings[1134] = ItemType.VexSpawnEgg; - mappings[1135] = ItemType.VillagerSpawnEgg; - mappings[1136] = ItemType.VindicatorSpawnEgg; - mappings[1137] = ItemType.WanderingTraderSpawnEgg; - mappings[1138] = ItemType.WardenSpawnEgg; - mappings[1139] = ItemType.WitchSpawnEgg; - mappings[1140] = ItemType.WitherSpawnEgg; - mappings[1141] = ItemType.WitherSkeletonSpawnEgg; - mappings[1142] = ItemType.WolfSpawnEgg; - mappings[1143] = ItemType.ZoglinSpawnEgg; - mappings[1144] = ItemType.CreakingSpawnEgg; - mappings[1145] = ItemType.ZombieSpawnEgg; - mappings[1146] = ItemType.ZombieHorseSpawnEgg; - mappings[1147] = ItemType.ZombieVillagerSpawnEgg; - mappings[1148] = ItemType.ZombifiedPiglinSpawnEgg; - mappings[1149] = ItemType.ExperienceBottle; - mappings[1150] = ItemType.FireCharge; - mappings[1151] = ItemType.WindCharge; - mappings[1152] = ItemType.WritableBook; - mappings[1153] = ItemType.WrittenBook; - mappings[1154] = ItemType.BreezeRod; - mappings[1155] = ItemType.Mace; - mappings[1156] = ItemType.ItemFrame; - mappings[1157] = ItemType.GlowItemFrame; - mappings[1158] = ItemType.FlowerPot; - mappings[1159] = ItemType.Carrot; - mappings[1160] = ItemType.Potato; - mappings[1161] = ItemType.BakedPotato; - mappings[1162] = ItemType.PoisonousPotato; - mappings[1163] = ItemType.Map; - mappings[1164] = ItemType.GoldenCarrot; - mappings[1165] = ItemType.SkeletonSkull; - mappings[1166] = ItemType.WitherSkeletonSkull; - mappings[1167] = ItemType.PlayerHead; - mappings[1168] = ItemType.ZombieHead; - mappings[1169] = ItemType.CreeperHead; - mappings[1170] = ItemType.DragonHead; - mappings[1171] = ItemType.PiglinHead; - mappings[1172] = ItemType.NetherStar; - mappings[1173] = ItemType.PumpkinPie; - mappings[1174] = ItemType.FireworkRocket; - mappings[1175] = ItemType.FireworkStar; - mappings[1176] = ItemType.EnchantedBook; - mappings[1177] = ItemType.NetherBrick; - mappings[1178] = ItemType.ResinBrick; - mappings[1179] = ItemType.PrismarineShard; - mappings[1180] = ItemType.PrismarineCrystals; - mappings[1181] = ItemType.Rabbit; - mappings[1182] = ItemType.CookedRabbit; - mappings[1183] = ItemType.RabbitStew; - mappings[1184] = ItemType.RabbitFoot; - mappings[1185] = ItemType.RabbitHide; - mappings[1186] = ItemType.ArmorStand; - mappings[1187] = ItemType.IronHorseArmor; - mappings[1188] = ItemType.GoldenHorseArmor; - mappings[1189] = ItemType.DiamondHorseArmor; - mappings[1190] = ItemType.LeatherHorseArmor; - mappings[1191] = ItemType.Lead; - mappings[1192] = ItemType.NameTag; - mappings[1193] = ItemType.CommandBlockMinecart; - mappings[1194] = ItemType.Mutton; - mappings[1195] = ItemType.CookedMutton; - mappings[1196] = ItemType.WhiteBanner; - mappings[1197] = ItemType.OrangeBanner; - mappings[1198] = ItemType.MagentaBanner; - mappings[1199] = ItemType.LightBlueBanner; - mappings[1200] = ItemType.YellowBanner; - mappings[1201] = ItemType.LimeBanner; - mappings[1202] = ItemType.PinkBanner; - mappings[1203] = ItemType.GrayBanner; - mappings[1204] = ItemType.LightGrayBanner; - mappings[1205] = ItemType.CyanBanner; - mappings[1206] = ItemType.PurpleBanner; - mappings[1207] = ItemType.BlueBanner; - mappings[1208] = ItemType.BrownBanner; - mappings[1209] = ItemType.GreenBanner; - mappings[1210] = ItemType.RedBanner; - mappings[1211] = ItemType.BlackBanner; - mappings[1212] = ItemType.EndCrystal; - mappings[1213] = ItemType.ChorusFruit; - mappings[1214] = ItemType.PoppedChorusFruit; - mappings[1215] = ItemType.TorchflowerSeeds; - mappings[1216] = ItemType.PitcherPod; - mappings[1217] = ItemType.Beetroot; - mappings[1218] = ItemType.BeetrootSeeds; - mappings[1219] = ItemType.BeetrootSoup; - mappings[1220] = ItemType.DragonBreath; - mappings[1221] = ItemType.SplashPotion; - mappings[1222] = ItemType.SpectralArrow; - mappings[1223] = ItemType.TippedArrow; - mappings[1224] = ItemType.LingeringPotion; - mappings[1225] = ItemType.Shield; - mappings[1226] = ItemType.TotemOfUndying; - mappings[1227] = ItemType.ShulkerShell; - mappings[1228] = ItemType.IronNugget; - mappings[1229] = ItemType.KnowledgeBook; - mappings[1230] = ItemType.DebugStick; - mappings[1231] = ItemType.MusicDisc13; - mappings[1232] = ItemType.MusicDiscCat; - mappings[1233] = ItemType.MusicDiscBlocks; - mappings[1234] = ItemType.MusicDiscChirp; - mappings[1235] = ItemType.MusicDiscCreator; - mappings[1236] = ItemType.MusicDiscCreatorMusicBox; - mappings[1237] = ItemType.MusicDiscFar; - mappings[1238] = ItemType.MusicDiscMall; - mappings[1239] = ItemType.MusicDiscMellohi; - mappings[1240] = ItemType.MusicDiscStal; - mappings[1241] = ItemType.MusicDiscStrad; - mappings[1242] = ItemType.MusicDiscWard; - mappings[1243] = ItemType.MusicDisc11; - mappings[1244] = ItemType.MusicDiscWait; - mappings[1245] = ItemType.MusicDiscOtherside; - mappings[1246] = ItemType.MusicDiscRelic; - mappings[1247] = ItemType.MusicDisc5; - mappings[1248] = ItemType.MusicDiscPigstep; - mappings[1249] = ItemType.MusicDiscPrecipice; - mappings[1250] = ItemType.DiscFragment5; - mappings[1251] = ItemType.Trident; - mappings[1252] = ItemType.NautilusShell; - mappings[1253] = ItemType.HeartOfTheSea; - mappings[1254] = ItemType.Crossbow; - mappings[1255] = ItemType.SuspiciousStew; - mappings[1256] = ItemType.Loom; - mappings[1257] = ItemType.FlowerBannerPattern; - mappings[1258] = ItemType.CreeperBannerPattern; - mappings[1259] = ItemType.SkullBannerPattern; - mappings[1260] = ItemType.MojangBannerPattern; - mappings[1261] = ItemType.GlobeBannerPattern; - mappings[1262] = ItemType.PiglinBannerPattern; - mappings[1263] = ItemType.FlowBannerPattern; - mappings[1264] = ItemType.GusterBannerPattern; - mappings[1265] = ItemType.FieldMasonedBannerPattern; - mappings[1266] = ItemType.BordureIndentedBannerPattern; - mappings[1267] = ItemType.GoatHorn; - mappings[1268] = ItemType.Composter; - mappings[1269] = ItemType.Barrel; - mappings[1270] = ItemType.Smoker; - mappings[1271] = ItemType.BlastFurnace; - mappings[1272] = ItemType.CartographyTable; - mappings[1273] = ItemType.FletchingTable; - mappings[1274] = ItemType.Grindstone; - mappings[1275] = ItemType.SmithingTable; - mappings[1276] = ItemType.Stonecutter; - mappings[1277] = ItemType.Bell; - mappings[1278] = ItemType.Lantern; - mappings[1279] = ItemType.SoulLantern; - mappings[1280] = ItemType.SweetBerries; - mappings[1281] = ItemType.GlowBerries; - mappings[1282] = ItemType.Campfire; - mappings[1283] = ItemType.SoulCampfire; - mappings[1284] = ItemType.Shroomlight; - mappings[1285] = ItemType.Honeycomb; - mappings[1286] = ItemType.BeeNest; - mappings[1287] = ItemType.Beehive; - mappings[1288] = ItemType.HoneyBottle; - mappings[1289] = ItemType.HoneycombBlock; - mappings[1290] = ItemType.Lodestone; - mappings[1291] = ItemType.CryingObsidian; - mappings[1292] = ItemType.Blackstone; - mappings[1293] = ItemType.BlackstoneSlab; - mappings[1294] = ItemType.BlackstoneStairs; - mappings[1295] = ItemType.GildedBlackstone; - mappings[1296] = ItemType.PolishedBlackstone; - mappings[1297] = ItemType.PolishedBlackstoneSlab; - mappings[1298] = ItemType.PolishedBlackstoneStairs; - mappings[1299] = ItemType.ChiseledPolishedBlackstone; - mappings[1300] = ItemType.PolishedBlackstoneBricks; - mappings[1301] = ItemType.PolishedBlackstoneBrickSlab; - mappings[1302] = ItemType.PolishedBlackstoneBrickStairs; - mappings[1303] = ItemType.CrackedPolishedBlackstoneBricks; - mappings[1304] = ItemType.RespawnAnchor; - mappings[1305] = ItemType.Candle; - mappings[1306] = ItemType.WhiteCandle; - mappings[1307] = ItemType.OrangeCandle; - mappings[1308] = ItemType.MagentaCandle; - mappings[1309] = ItemType.LightBlueCandle; - mappings[1310] = ItemType.YellowCandle; - mappings[1311] = ItemType.LimeCandle; - mappings[1312] = ItemType.PinkCandle; - mappings[1313] = ItemType.GrayCandle; - mappings[1314] = ItemType.LightGrayCandle; - mappings[1315] = ItemType.CyanCandle; - mappings[1316] = ItemType.PurpleCandle; - mappings[1317] = ItemType.BlueCandle; - mappings[1318] = ItemType.BrownCandle; - mappings[1319] = ItemType.GreenCandle; - mappings[1320] = ItemType.RedCandle; - mappings[1321] = ItemType.BlackCandle; - mappings[1322] = ItemType.SmallAmethystBud; - mappings[1323] = ItemType.MediumAmethystBud; - mappings[1324] = ItemType.LargeAmethystBud; - mappings[1325] = ItemType.AmethystCluster; - mappings[1326] = ItemType.PointedDripstone; - mappings[1327] = ItemType.OchreFroglight; - mappings[1328] = ItemType.VerdantFroglight; - mappings[1329] = ItemType.PearlescentFroglight; - mappings[1330] = ItemType.Frogspawn; - mappings[1331] = ItemType.EchoShard; - mappings[1332] = ItemType.Brush; - mappings[1333] = ItemType.NetheriteUpgradeSmithingTemplate; - mappings[1334] = ItemType.SentryArmorTrimSmithingTemplate; - mappings[1335] = ItemType.DuneArmorTrimSmithingTemplate; - mappings[1336] = ItemType.CoastArmorTrimSmithingTemplate; - mappings[1337] = ItemType.WildArmorTrimSmithingTemplate; - mappings[1338] = ItemType.WardArmorTrimSmithingTemplate; - mappings[1339] = ItemType.EyeArmorTrimSmithingTemplate; - mappings[1340] = ItemType.VexArmorTrimSmithingTemplate; - mappings[1341] = ItemType.TideArmorTrimSmithingTemplate; - mappings[1342] = ItemType.SnoutArmorTrimSmithingTemplate; - mappings[1343] = ItemType.RibArmorTrimSmithingTemplate; - mappings[1344] = ItemType.SpireArmorTrimSmithingTemplate; - mappings[1345] = ItemType.WayfinderArmorTrimSmithingTemplate; - mappings[1346] = ItemType.ShaperArmorTrimSmithingTemplate; - mappings[1347] = ItemType.SilenceArmorTrimSmithingTemplate; - mappings[1348] = ItemType.RaiserArmorTrimSmithingTemplate; - mappings[1349] = ItemType.HostArmorTrimSmithingTemplate; - mappings[1350] = ItemType.FlowArmorTrimSmithingTemplate; - mappings[1351] = ItemType.BoltArmorTrimSmithingTemplate; - mappings[1352] = ItemType.AnglerPotterySherd; - mappings[1353] = ItemType.ArcherPotterySherd; - mappings[1354] = ItemType.ArmsUpPotterySherd; - mappings[1355] = ItemType.BladePotterySherd; - mappings[1356] = ItemType.BrewerPotterySherd; - mappings[1357] = ItemType.BurnPotterySherd; - mappings[1358] = ItemType.DangerPotterySherd; - mappings[1359] = ItemType.ExplorerPotterySherd; - mappings[1360] = ItemType.FlowPotterySherd; - mappings[1361] = ItemType.FriendPotterySherd; - mappings[1362] = ItemType.GusterPotterySherd; - mappings[1363] = ItemType.HeartPotterySherd; - mappings[1364] = ItemType.HeartbreakPotterySherd; - mappings[1365] = ItemType.HowlPotterySherd; - mappings[1366] = ItemType.MinerPotterySherd; - mappings[1367] = ItemType.MournerPotterySherd; - mappings[1368] = ItemType.PlentyPotterySherd; - mappings[1369] = ItemType.PrizePotterySherd; - mappings[1370] = ItemType.ScrapePotterySherd; - mappings[1371] = ItemType.SheafPotterySherd; - mappings[1372] = ItemType.ShelterPotterySherd; - mappings[1373] = ItemType.SkullPotterySherd; - mappings[1374] = ItemType.SnortPotterySherd; - mappings[1375] = ItemType.CopperGrate; - mappings[1376] = ItemType.ExposedCopperGrate; - mappings[1377] = ItemType.WeatheredCopperGrate; - mappings[1378] = ItemType.OxidizedCopperGrate; - mappings[1379] = ItemType.WaxedCopperGrate; - mappings[1380] = ItemType.WaxedExposedCopperGrate; - mappings[1381] = ItemType.WaxedWeatheredCopperGrate; - mappings[1382] = ItemType.WaxedOxidizedCopperGrate; - mappings[1383] = ItemType.CopperBulb; - mappings[1384] = ItemType.ExposedCopperBulb; - mappings[1385] = ItemType.WeatheredCopperBulb; - mappings[1386] = ItemType.OxidizedCopperBulb; - mappings[1387] = ItemType.WaxedCopperBulb; - mappings[1388] = ItemType.WaxedExposedCopperBulb; - mappings[1389] = ItemType.WaxedWeatheredCopperBulb; - mappings[1390] = ItemType.WaxedOxidizedCopperBulb; - mappings[1391] = ItemType.TrialSpawner; - mappings[1392] = ItemType.TrialKey; - mappings[1393] = ItemType.OminousTrialKey; - mappings[1394] = ItemType.Vault; - mappings[1395] = ItemType.OminousBottle; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1216.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette1216.cs deleted file mode 100644 index 91472a53e6..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1216.cs +++ /dev/null @@ -1,1433 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public class ItemPalette1216 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette1216() - { - mappings[0] = ItemType.Air; - mappings[1] = ItemType.Stone; - mappings[2] = ItemType.Granite; - mappings[3] = ItemType.PolishedGranite; - mappings[4] = ItemType.Diorite; - mappings[5] = ItemType.PolishedDiorite; - mappings[6] = ItemType.Andesite; - mappings[7] = ItemType.PolishedAndesite; - mappings[8] = ItemType.Deepslate; - mappings[9] = ItemType.CobbledDeepslate; - mappings[10] = ItemType.PolishedDeepslate; - mappings[11] = ItemType.Calcite; - mappings[12] = ItemType.Tuff; - mappings[13] = ItemType.TuffSlab; - mappings[14] = ItemType.TuffStairs; - mappings[15] = ItemType.TuffWall; - mappings[16] = ItemType.ChiseledTuff; - mappings[17] = ItemType.PolishedTuff; - mappings[18] = ItemType.PolishedTuffSlab; - mappings[19] = ItemType.PolishedTuffStairs; - mappings[20] = ItemType.PolishedTuffWall; - mappings[21] = ItemType.TuffBricks; - mappings[22] = ItemType.TuffBrickSlab; - mappings[23] = ItemType.TuffBrickStairs; - mappings[24] = ItemType.TuffBrickWall; - mappings[25] = ItemType.ChiseledTuffBricks; - mappings[26] = ItemType.DripstoneBlock; - mappings[27] = ItemType.GrassBlock; - mappings[28] = ItemType.Dirt; - mappings[29] = ItemType.CoarseDirt; - mappings[30] = ItemType.Podzol; - mappings[31] = ItemType.RootedDirt; - mappings[32] = ItemType.Mud; - mappings[33] = ItemType.CrimsonNylium; - mappings[34] = ItemType.WarpedNylium; - mappings[35] = ItemType.Cobblestone; - mappings[36] = ItemType.OakPlanks; - mappings[37] = ItemType.SprucePlanks; - mappings[38] = ItemType.BirchPlanks; - mappings[39] = ItemType.JunglePlanks; - mappings[40] = ItemType.AcaciaPlanks; - mappings[41] = ItemType.CherryPlanks; - mappings[42] = ItemType.DarkOakPlanks; - mappings[43] = ItemType.PaleOakPlanks; - mappings[44] = ItemType.MangrovePlanks; - mappings[45] = ItemType.BambooPlanks; - mappings[46] = ItemType.CrimsonPlanks; - mappings[47] = ItemType.WarpedPlanks; - mappings[48] = ItemType.BambooMosaic; - mappings[49] = ItemType.OakSapling; - mappings[50] = ItemType.SpruceSapling; - mappings[51] = ItemType.BirchSapling; - mappings[52] = ItemType.JungleSapling; - mappings[53] = ItemType.AcaciaSapling; - mappings[54] = ItemType.CherrySapling; - mappings[55] = ItemType.DarkOakSapling; - mappings[56] = ItemType.PaleOakSapling; - mappings[57] = ItemType.MangrovePropagule; - mappings[58] = ItemType.Bedrock; - mappings[59] = ItemType.Sand; - mappings[60] = ItemType.SuspiciousSand; - mappings[61] = ItemType.SuspiciousGravel; - mappings[62] = ItemType.RedSand; - mappings[63] = ItemType.Gravel; - mappings[64] = ItemType.CoalOre; - mappings[65] = ItemType.DeepslateCoalOre; - mappings[66] = ItemType.IronOre; - mappings[67] = ItemType.DeepslateIronOre; - mappings[68] = ItemType.CopperOre; - mappings[69] = ItemType.DeepslateCopperOre; - mappings[70] = ItemType.GoldOre; - mappings[71] = ItemType.DeepslateGoldOre; - mappings[72] = ItemType.RedstoneOre; - mappings[73] = ItemType.DeepslateRedstoneOre; - mappings[74] = ItemType.EmeraldOre; - mappings[75] = ItemType.DeepslateEmeraldOre; - mappings[76] = ItemType.LapisOre; - mappings[77] = ItemType.DeepslateLapisOre; - mappings[78] = ItemType.DiamondOre; - mappings[79] = ItemType.DeepslateDiamondOre; - mappings[80] = ItemType.NetherGoldOre; - mappings[81] = ItemType.NetherQuartzOre; - mappings[82] = ItemType.AncientDebris; - mappings[83] = ItemType.CoalBlock; - mappings[84] = ItemType.RawIronBlock; - mappings[85] = ItemType.RawCopperBlock; - mappings[86] = ItemType.RawGoldBlock; - mappings[87] = ItemType.HeavyCore; - mappings[88] = ItemType.AmethystBlock; - mappings[89] = ItemType.BuddingAmethyst; - mappings[90] = ItemType.IronBlock; - mappings[91] = ItemType.CopperBlock; - mappings[92] = ItemType.GoldBlock; - mappings[93] = ItemType.DiamondBlock; - mappings[94] = ItemType.NetheriteBlock; - mappings[95] = ItemType.ExposedCopper; - mappings[96] = ItemType.WeatheredCopper; - mappings[97] = ItemType.OxidizedCopper; - mappings[98] = ItemType.ChiseledCopper; - mappings[99] = ItemType.ExposedChiseledCopper; - mappings[100] = ItemType.WeatheredChiseledCopper; - mappings[101] = ItemType.OxidizedChiseledCopper; - mappings[102] = ItemType.CutCopper; - mappings[103] = ItemType.ExposedCutCopper; - mappings[104] = ItemType.WeatheredCutCopper; - mappings[105] = ItemType.OxidizedCutCopper; - mappings[106] = ItemType.CutCopperStairs; - mappings[107] = ItemType.ExposedCutCopperStairs; - mappings[108] = ItemType.WeatheredCutCopperStairs; - mappings[109] = ItemType.OxidizedCutCopperStairs; - mappings[110] = ItemType.CutCopperSlab; - mappings[111] = ItemType.ExposedCutCopperSlab; - mappings[112] = ItemType.WeatheredCutCopperSlab; - mappings[113] = ItemType.OxidizedCutCopperSlab; - mappings[114] = ItemType.WaxedCopperBlock; - mappings[115] = ItemType.WaxedExposedCopper; - mappings[116] = ItemType.WaxedWeatheredCopper; - mappings[117] = ItemType.WaxedOxidizedCopper; - mappings[118] = ItemType.WaxedChiseledCopper; - mappings[119] = ItemType.WaxedExposedChiseledCopper; - mappings[120] = ItemType.WaxedWeatheredChiseledCopper; - mappings[121] = ItemType.WaxedOxidizedChiseledCopper; - mappings[122] = ItemType.WaxedCutCopper; - mappings[123] = ItemType.WaxedExposedCutCopper; - mappings[124] = ItemType.WaxedWeatheredCutCopper; - mappings[125] = ItemType.WaxedOxidizedCutCopper; - mappings[126] = ItemType.WaxedCutCopperStairs; - mappings[127] = ItemType.WaxedExposedCutCopperStairs; - mappings[128] = ItemType.WaxedWeatheredCutCopperStairs; - mappings[129] = ItemType.WaxedOxidizedCutCopperStairs; - mappings[130] = ItemType.WaxedCutCopperSlab; - mappings[131] = ItemType.WaxedExposedCutCopperSlab; - mappings[132] = ItemType.WaxedWeatheredCutCopperSlab; - mappings[133] = ItemType.WaxedOxidizedCutCopperSlab; - mappings[134] = ItemType.OakLog; - mappings[135] = ItemType.SpruceLog; - mappings[136] = ItemType.BirchLog; - mappings[137] = ItemType.JungleLog; - mappings[138] = ItemType.AcaciaLog; - mappings[139] = ItemType.CherryLog; - mappings[140] = ItemType.PaleOakLog; - mappings[141] = ItemType.DarkOakLog; - mappings[142] = ItemType.MangroveLog; - mappings[143] = ItemType.MangroveRoots; - mappings[144] = ItemType.MuddyMangroveRoots; - mappings[145] = ItemType.CrimsonStem; - mappings[146] = ItemType.WarpedStem; - mappings[147] = ItemType.BambooBlock; - mappings[148] = ItemType.StrippedOakLog; - mappings[149] = ItemType.StrippedSpruceLog; - mappings[150] = ItemType.StrippedBirchLog; - mappings[151] = ItemType.StrippedJungleLog; - mappings[152] = ItemType.StrippedAcaciaLog; - mappings[153] = ItemType.StrippedCherryLog; - mappings[154] = ItemType.StrippedDarkOakLog; - mappings[155] = ItemType.StrippedPaleOakLog; - mappings[156] = ItemType.StrippedMangroveLog; - mappings[157] = ItemType.StrippedCrimsonStem; - mappings[158] = ItemType.StrippedWarpedStem; - mappings[159] = ItemType.StrippedOakWood; - mappings[160] = ItemType.StrippedSpruceWood; - mappings[161] = ItemType.StrippedBirchWood; - mappings[162] = ItemType.StrippedJungleWood; - mappings[163] = ItemType.StrippedAcaciaWood; - mappings[164] = ItemType.StrippedCherryWood; - mappings[165] = ItemType.StrippedDarkOakWood; - mappings[166] = ItemType.StrippedPaleOakWood; - mappings[167] = ItemType.StrippedMangroveWood; - mappings[168] = ItemType.StrippedCrimsonHyphae; - mappings[169] = ItemType.StrippedWarpedHyphae; - mappings[170] = ItemType.StrippedBambooBlock; - mappings[171] = ItemType.OakWood; - mappings[172] = ItemType.SpruceWood; - mappings[173] = ItemType.BirchWood; - mappings[174] = ItemType.JungleWood; - mappings[175] = ItemType.AcaciaWood; - mappings[176] = ItemType.CherryWood; - mappings[177] = ItemType.PaleOakWood; - mappings[178] = ItemType.DarkOakWood; - mappings[179] = ItemType.MangroveWood; - mappings[180] = ItemType.CrimsonHyphae; - mappings[181] = ItemType.WarpedHyphae; - mappings[182] = ItemType.OakLeaves; - mappings[183] = ItemType.SpruceLeaves; - mappings[184] = ItemType.BirchLeaves; - mappings[185] = ItemType.JungleLeaves; - mappings[186] = ItemType.AcaciaLeaves; - mappings[187] = ItemType.CherryLeaves; - mappings[188] = ItemType.DarkOakLeaves; - mappings[189] = ItemType.PaleOakLeaves; - mappings[190] = ItemType.MangroveLeaves; - mappings[191] = ItemType.AzaleaLeaves; - mappings[192] = ItemType.FloweringAzaleaLeaves; - mappings[193] = ItemType.Sponge; - mappings[194] = ItemType.WetSponge; - mappings[195] = ItemType.Glass; - mappings[196] = ItemType.TintedGlass; - mappings[197] = ItemType.LapisBlock; - mappings[198] = ItemType.Sandstone; - mappings[199] = ItemType.ChiseledSandstone; - mappings[200] = ItemType.CutSandstone; - mappings[201] = ItemType.Cobweb; - mappings[202] = ItemType.ShortGrass; - mappings[203] = ItemType.Fern; - mappings[204] = ItemType.Bush; - mappings[205] = ItemType.Azalea; - mappings[206] = ItemType.FloweringAzalea; - mappings[207] = ItemType.DeadBush; - mappings[208] = ItemType.FireflyBush; - mappings[209] = ItemType.DryShortGrass; - mappings[210] = ItemType.DryTallGrass; - mappings[211] = ItemType.Seagrass; - mappings[212] = ItemType.SeaPickle; - mappings[213] = ItemType.WhiteWool; - mappings[214] = ItemType.OrangeWool; - mappings[215] = ItemType.MagentaWool; - mappings[216] = ItemType.LightBlueWool; - mappings[217] = ItemType.YellowWool; - mappings[218] = ItemType.LimeWool; - mappings[219] = ItemType.PinkWool; - mappings[220] = ItemType.GrayWool; - mappings[221] = ItemType.LightGrayWool; - mappings[222] = ItemType.CyanWool; - mappings[223] = ItemType.PurpleWool; - mappings[224] = ItemType.BlueWool; - mappings[225] = ItemType.BrownWool; - mappings[226] = ItemType.GreenWool; - mappings[227] = ItemType.RedWool; - mappings[228] = ItemType.BlackWool; - mappings[229] = ItemType.Dandelion; - mappings[230] = ItemType.OpenEyeblossom; - mappings[231] = ItemType.ClosedEyeblossom; - mappings[232] = ItemType.Poppy; - mappings[233] = ItemType.BlueOrchid; - mappings[234] = ItemType.Allium; - mappings[235] = ItemType.AzureBluet; - mappings[236] = ItemType.RedTulip; - mappings[237] = ItemType.OrangeTulip; - mappings[238] = ItemType.WhiteTulip; - mappings[239] = ItemType.PinkTulip; - mappings[240] = ItemType.OxeyeDaisy; - mappings[241] = ItemType.Cornflower; - mappings[242] = ItemType.LilyOfTheValley; - mappings[243] = ItemType.WitherRose; - mappings[244] = ItemType.Torchflower; - mappings[245] = ItemType.PitcherPlant; - mappings[246] = ItemType.SporeBlossom; - mappings[247] = ItemType.BrownMushroom; - mappings[248] = ItemType.RedMushroom; - mappings[249] = ItemType.CrimsonFungus; - mappings[250] = ItemType.WarpedFungus; - mappings[251] = ItemType.CrimsonRoots; - mappings[252] = ItemType.WarpedRoots; - mappings[253] = ItemType.NetherSprouts; - mappings[254] = ItemType.WeepingVines; - mappings[255] = ItemType.TwistingVines; - mappings[256] = ItemType.SugarCane; - mappings[257] = ItemType.Kelp; - mappings[258] = ItemType.PinkPetals; - mappings[259] = ItemType.Wildflowers; - mappings[260] = ItemType.LeafLitter; - mappings[261] = ItemType.MossCarpet; - mappings[262] = ItemType.MossBlock; - mappings[263] = ItemType.PaleMossCarpet; - mappings[264] = ItemType.PaleHangingMoss; - mappings[265] = ItemType.PaleMossBlock; - mappings[266] = ItemType.HangingRoots; - mappings[267] = ItemType.BigDripleaf; - mappings[268] = ItemType.SmallDripleaf; - mappings[269] = ItemType.Bamboo; - mappings[270] = ItemType.OakSlab; - mappings[271] = ItemType.SpruceSlab; - mappings[272] = ItemType.BirchSlab; - mappings[273] = ItemType.JungleSlab; - mappings[274] = ItemType.AcaciaSlab; - mappings[275] = ItemType.CherrySlab; - mappings[276] = ItemType.DarkOakSlab; - mappings[277] = ItemType.PaleOakSlab; - mappings[278] = ItemType.MangroveSlab; - mappings[279] = ItemType.BambooSlab; - mappings[280] = ItemType.BambooMosaicSlab; - mappings[281] = ItemType.CrimsonSlab; - mappings[282] = ItemType.WarpedSlab; - mappings[283] = ItemType.StoneSlab; - mappings[284] = ItemType.SmoothStoneSlab; - mappings[285] = ItemType.SandstoneSlab; - mappings[286] = ItemType.CutSandstoneSlab; - mappings[287] = ItemType.PetrifiedOakSlab; - mappings[288] = ItemType.CobblestoneSlab; - mappings[289] = ItemType.BrickSlab; - mappings[290] = ItemType.StoneBrickSlab; - mappings[291] = ItemType.MudBrickSlab; - mappings[292] = ItemType.NetherBrickSlab; - mappings[293] = ItemType.QuartzSlab; - mappings[294] = ItemType.RedSandstoneSlab; - mappings[295] = ItemType.CutRedSandstoneSlab; - mappings[296] = ItemType.PurpurSlab; - mappings[297] = ItemType.PrismarineSlab; - mappings[298] = ItemType.PrismarineBrickSlab; - mappings[299] = ItemType.DarkPrismarineSlab; - mappings[300] = ItemType.SmoothQuartz; - mappings[301] = ItemType.SmoothRedSandstone; - mappings[302] = ItemType.SmoothSandstone; - mappings[303] = ItemType.SmoothStone; - mappings[304] = ItemType.Bricks; - mappings[305] = ItemType.Bookshelf; - mappings[306] = ItemType.ChiseledBookshelf; - mappings[307] = ItemType.DecoratedPot; - mappings[308] = ItemType.MossyCobblestone; - mappings[309] = ItemType.Obsidian; - mappings[310] = ItemType.Torch; - mappings[311] = ItemType.EndRod; - mappings[312] = ItemType.ChorusPlant; - mappings[313] = ItemType.ChorusFlower; - mappings[314] = ItemType.PurpurBlock; - mappings[315] = ItemType.PurpurPillar; - mappings[316] = ItemType.PurpurStairs; - mappings[317] = ItemType.Spawner; - mappings[318] = ItemType.CreakingHeart; - mappings[319] = ItemType.Chest; - mappings[320] = ItemType.CraftingTable; - mappings[321] = ItemType.Farmland; - mappings[322] = ItemType.Furnace; - mappings[323] = ItemType.Ladder; - mappings[324] = ItemType.CobblestoneStairs; - mappings[325] = ItemType.Snow; - mappings[326] = ItemType.Ice; - mappings[327] = ItemType.SnowBlock; - mappings[328] = ItemType.Cactus; - mappings[329] = ItemType.CactusFlower; - mappings[330] = ItemType.Clay; - mappings[331] = ItemType.Jukebox; - mappings[332] = ItemType.OakFence; - mappings[333] = ItemType.SpruceFence; - mappings[334] = ItemType.BirchFence; - mappings[335] = ItemType.JungleFence; - mappings[336] = ItemType.AcaciaFence; - mappings[337] = ItemType.CherryFence; - mappings[338] = ItemType.DarkOakFence; - mappings[339] = ItemType.PaleOakFence; - mappings[340] = ItemType.MangroveFence; - mappings[341] = ItemType.BambooFence; - mappings[342] = ItemType.CrimsonFence; - mappings[343] = ItemType.WarpedFence; - mappings[344] = ItemType.Pumpkin; - mappings[345] = ItemType.CarvedPumpkin; - mappings[346] = ItemType.JackOLantern; - mappings[347] = ItemType.Netherrack; - mappings[348] = ItemType.SoulSand; - mappings[349] = ItemType.SoulSoil; - mappings[350] = ItemType.Basalt; - mappings[351] = ItemType.PolishedBasalt; - mappings[352] = ItemType.SmoothBasalt; - mappings[353] = ItemType.SoulTorch; - mappings[354] = ItemType.Glowstone; - mappings[355] = ItemType.InfestedStone; - mappings[356] = ItemType.InfestedCobblestone; - mappings[357] = ItemType.InfestedStoneBricks; - mappings[358] = ItemType.InfestedMossyStoneBricks; - mappings[359] = ItemType.InfestedCrackedStoneBricks; - mappings[360] = ItemType.InfestedChiseledStoneBricks; - mappings[361] = ItemType.InfestedDeepslate; - mappings[362] = ItemType.StoneBricks; - mappings[363] = ItemType.MossyStoneBricks; - mappings[364] = ItemType.CrackedStoneBricks; - mappings[365] = ItemType.ChiseledStoneBricks; - mappings[366] = ItemType.PackedMud; - mappings[367] = ItemType.MudBricks; - mappings[368] = ItemType.DeepslateBricks; - mappings[369] = ItemType.CrackedDeepslateBricks; - mappings[370] = ItemType.DeepslateTiles; - mappings[371] = ItemType.CrackedDeepslateTiles; - mappings[372] = ItemType.ChiseledDeepslate; - mappings[373] = ItemType.ReinforcedDeepslate; - mappings[374] = ItemType.BrownMushroomBlock; - mappings[375] = ItemType.RedMushroomBlock; - mappings[376] = ItemType.MushroomStem; - mappings[377] = ItemType.IronBars; - mappings[378] = ItemType.Chain; - mappings[379] = ItemType.GlassPane; - mappings[380] = ItemType.Melon; - mappings[381] = ItemType.Vine; - mappings[382] = ItemType.GlowLichen; - mappings[383] = ItemType.ResinClump; - mappings[384] = ItemType.ResinBlock; - mappings[385] = ItemType.ResinBricks; - mappings[386] = ItemType.ResinBrickStairs; - mappings[387] = ItemType.ResinBrickSlab; - mappings[388] = ItemType.ResinBrickWall; - mappings[389] = ItemType.ChiseledResinBricks; - mappings[390] = ItemType.BrickStairs; - mappings[391] = ItemType.StoneBrickStairs; - mappings[392] = ItemType.MudBrickStairs; - mappings[393] = ItemType.Mycelium; - mappings[394] = ItemType.LilyPad; - mappings[395] = ItemType.NetherBricks; - mappings[396] = ItemType.CrackedNetherBricks; - mappings[397] = ItemType.ChiseledNetherBricks; - mappings[398] = ItemType.NetherBrickFence; - mappings[399] = ItemType.NetherBrickStairs; - mappings[400] = ItemType.Sculk; - mappings[401] = ItemType.SculkVein; - mappings[402] = ItemType.SculkCatalyst; - mappings[403] = ItemType.SculkShrieker; - mappings[404] = ItemType.EnchantingTable; - mappings[405] = ItemType.EndPortalFrame; - mappings[406] = ItemType.EndStone; - mappings[407] = ItemType.EndStoneBricks; - mappings[408] = ItemType.DragonEgg; - mappings[409] = ItemType.SandstoneStairs; - mappings[410] = ItemType.EnderChest; - mappings[411] = ItemType.EmeraldBlock; - mappings[412] = ItemType.OakStairs; - mappings[413] = ItemType.SpruceStairs; - mappings[414] = ItemType.BirchStairs; - mappings[415] = ItemType.JungleStairs; - mappings[416] = ItemType.AcaciaStairs; - mappings[417] = ItemType.CherryStairs; - mappings[418] = ItemType.DarkOakStairs; - mappings[419] = ItemType.PaleOakStairs; - mappings[420] = ItemType.MangroveStairs; - mappings[421] = ItemType.BambooStairs; - mappings[422] = ItemType.BambooMosaicStairs; - mappings[423] = ItemType.CrimsonStairs; - mappings[424] = ItemType.WarpedStairs; - mappings[425] = ItemType.CommandBlock; - mappings[426] = ItemType.Beacon; - mappings[427] = ItemType.CobblestoneWall; - mappings[428] = ItemType.MossyCobblestoneWall; - mappings[429] = ItemType.BrickWall; - mappings[430] = ItemType.PrismarineWall; - mappings[431] = ItemType.RedSandstoneWall; - mappings[432] = ItemType.MossyStoneBrickWall; - mappings[433] = ItemType.GraniteWall; - mappings[434] = ItemType.StoneBrickWall; - mappings[435] = ItemType.MudBrickWall; - mappings[436] = ItemType.NetherBrickWall; - mappings[437] = ItemType.AndesiteWall; - mappings[438] = ItemType.RedNetherBrickWall; - mappings[439] = ItemType.SandstoneWall; - mappings[440] = ItemType.EndStoneBrickWall; - mappings[441] = ItemType.DioriteWall; - mappings[442] = ItemType.BlackstoneWall; - mappings[443] = ItemType.PolishedBlackstoneWall; - mappings[444] = ItemType.PolishedBlackstoneBrickWall; - mappings[445] = ItemType.CobbledDeepslateWall; - mappings[446] = ItemType.PolishedDeepslateWall; - mappings[447] = ItemType.DeepslateBrickWall; - mappings[448] = ItemType.DeepslateTileWall; - mappings[449] = ItemType.Anvil; - mappings[450] = ItemType.ChippedAnvil; - mappings[451] = ItemType.DamagedAnvil; - mappings[452] = ItemType.ChiseledQuartzBlock; - mappings[453] = ItemType.QuartzBlock; - mappings[454] = ItemType.QuartzBricks; - mappings[455] = ItemType.QuartzPillar; - mappings[456] = ItemType.QuartzStairs; - mappings[457] = ItemType.WhiteTerracotta; - mappings[458] = ItemType.OrangeTerracotta; - mappings[459] = ItemType.MagentaTerracotta; - mappings[460] = ItemType.LightBlueTerracotta; - mappings[461] = ItemType.YellowTerracotta; - mappings[462] = ItemType.LimeTerracotta; - mappings[463] = ItemType.PinkTerracotta; - mappings[464] = ItemType.GrayTerracotta; - mappings[465] = ItemType.LightGrayTerracotta; - mappings[466] = ItemType.CyanTerracotta; - mappings[467] = ItemType.PurpleTerracotta; - mappings[468] = ItemType.BlueTerracotta; - mappings[469] = ItemType.BrownTerracotta; - mappings[470] = ItemType.GreenTerracotta; - mappings[471] = ItemType.RedTerracotta; - mappings[472] = ItemType.BlackTerracotta; - mappings[473] = ItemType.Barrier; - mappings[474] = ItemType.Light; - mappings[475] = ItemType.HayBlock; - mappings[476] = ItemType.WhiteCarpet; - mappings[477] = ItemType.OrangeCarpet; - mappings[478] = ItemType.MagentaCarpet; - mappings[479] = ItemType.LightBlueCarpet; - mappings[480] = ItemType.YellowCarpet; - mappings[481] = ItemType.LimeCarpet; - mappings[482] = ItemType.PinkCarpet; - mappings[483] = ItemType.GrayCarpet; - mappings[484] = ItemType.LightGrayCarpet; - mappings[485] = ItemType.CyanCarpet; - mappings[486] = ItemType.PurpleCarpet; - mappings[487] = ItemType.BlueCarpet; - mappings[488] = ItemType.BrownCarpet; - mappings[489] = ItemType.GreenCarpet; - mappings[490] = ItemType.RedCarpet; - mappings[491] = ItemType.BlackCarpet; - mappings[492] = ItemType.Terracotta; - mappings[493] = ItemType.PackedIce; - mappings[494] = ItemType.DirtPath; - mappings[495] = ItemType.Sunflower; - mappings[496] = ItemType.Lilac; - mappings[497] = ItemType.RoseBush; - mappings[498] = ItemType.Peony; - mappings[499] = ItemType.TallGrass; - mappings[500] = ItemType.LargeFern; - mappings[501] = ItemType.WhiteStainedGlass; - mappings[502] = ItemType.OrangeStainedGlass; - mappings[503] = ItemType.MagentaStainedGlass; - mappings[504] = ItemType.LightBlueStainedGlass; - mappings[505] = ItemType.YellowStainedGlass; - mappings[506] = ItemType.LimeStainedGlass; - mappings[507] = ItemType.PinkStainedGlass; - mappings[508] = ItemType.GrayStainedGlass; - mappings[509] = ItemType.LightGrayStainedGlass; - mappings[510] = ItemType.CyanStainedGlass; - mappings[511] = ItemType.PurpleStainedGlass; - mappings[512] = ItemType.BlueStainedGlass; - mappings[513] = ItemType.BrownStainedGlass; - mappings[514] = ItemType.GreenStainedGlass; - mappings[515] = ItemType.RedStainedGlass; - mappings[516] = ItemType.BlackStainedGlass; - mappings[517] = ItemType.WhiteStainedGlassPane; - mappings[518] = ItemType.OrangeStainedGlassPane; - mappings[519] = ItemType.MagentaStainedGlassPane; - mappings[520] = ItemType.LightBlueStainedGlassPane; - mappings[521] = ItemType.YellowStainedGlassPane; - mappings[522] = ItemType.LimeStainedGlassPane; - mappings[523] = ItemType.PinkStainedGlassPane; - mappings[524] = ItemType.GrayStainedGlassPane; - mappings[525] = ItemType.LightGrayStainedGlassPane; - mappings[526] = ItemType.CyanStainedGlassPane; - mappings[527] = ItemType.PurpleStainedGlassPane; - mappings[528] = ItemType.BlueStainedGlassPane; - mappings[529] = ItemType.BrownStainedGlassPane; - mappings[530] = ItemType.GreenStainedGlassPane; - mappings[531] = ItemType.RedStainedGlassPane; - mappings[532] = ItemType.BlackStainedGlassPane; - mappings[533] = ItemType.Prismarine; - mappings[534] = ItemType.PrismarineBricks; - mappings[535] = ItemType.DarkPrismarine; - mappings[536] = ItemType.PrismarineStairs; - mappings[537] = ItemType.PrismarineBrickStairs; - mappings[538] = ItemType.DarkPrismarineStairs; - mappings[539] = ItemType.SeaLantern; - mappings[540] = ItemType.RedSandstone; - mappings[541] = ItemType.ChiseledRedSandstone; - mappings[542] = ItemType.CutRedSandstone; - mappings[543] = ItemType.RedSandstoneStairs; - mappings[544] = ItemType.RepeatingCommandBlock; - mappings[545] = ItemType.ChainCommandBlock; - mappings[546] = ItemType.MagmaBlock; - mappings[547] = ItemType.NetherWartBlock; - mappings[548] = ItemType.WarpedWartBlock; - mappings[549] = ItemType.RedNetherBricks; - mappings[550] = ItemType.BoneBlock; - mappings[551] = ItemType.StructureVoid; - mappings[552] = ItemType.ShulkerBox; - mappings[553] = ItemType.WhiteShulkerBox; - mappings[554] = ItemType.OrangeShulkerBox; - mappings[555] = ItemType.MagentaShulkerBox; - mappings[556] = ItemType.LightBlueShulkerBox; - mappings[557] = ItemType.YellowShulkerBox; - mappings[558] = ItemType.LimeShulkerBox; - mappings[559] = ItemType.PinkShulkerBox; - mappings[560] = ItemType.GrayShulkerBox; - mappings[561] = ItemType.LightGrayShulkerBox; - mappings[562] = ItemType.CyanShulkerBox; - mappings[563] = ItemType.PurpleShulkerBox; - mappings[564] = ItemType.BlueShulkerBox; - mappings[565] = ItemType.BrownShulkerBox; - mappings[566] = ItemType.GreenShulkerBox; - mappings[567] = ItemType.RedShulkerBox; - mappings[568] = ItemType.BlackShulkerBox; - mappings[569] = ItemType.WhiteGlazedTerracotta; - mappings[570] = ItemType.OrangeGlazedTerracotta; - mappings[571] = ItemType.MagentaGlazedTerracotta; - mappings[572] = ItemType.LightBlueGlazedTerracotta; - mappings[573] = ItemType.YellowGlazedTerracotta; - mappings[574] = ItemType.LimeGlazedTerracotta; - mappings[575] = ItemType.PinkGlazedTerracotta; - mappings[576] = ItemType.GrayGlazedTerracotta; - mappings[577] = ItemType.LightGrayGlazedTerracotta; - mappings[578] = ItemType.CyanGlazedTerracotta; - mappings[579] = ItemType.PurpleGlazedTerracotta; - mappings[580] = ItemType.BlueGlazedTerracotta; - mappings[581] = ItemType.BrownGlazedTerracotta; - mappings[582] = ItemType.GreenGlazedTerracotta; - mappings[583] = ItemType.RedGlazedTerracotta; - mappings[584] = ItemType.BlackGlazedTerracotta; - mappings[585] = ItemType.WhiteConcrete; - mappings[586] = ItemType.OrangeConcrete; - mappings[587] = ItemType.MagentaConcrete; - mappings[588] = ItemType.LightBlueConcrete; - mappings[589] = ItemType.YellowConcrete; - mappings[590] = ItemType.LimeConcrete; - mappings[591] = ItemType.PinkConcrete; - mappings[592] = ItemType.GrayConcrete; - mappings[593] = ItemType.LightGrayConcrete; - mappings[594] = ItemType.CyanConcrete; - mappings[595] = ItemType.PurpleConcrete; - mappings[596] = ItemType.BlueConcrete; - mappings[597] = ItemType.BrownConcrete; - mappings[598] = ItemType.GreenConcrete; - mappings[599] = ItemType.RedConcrete; - mappings[600] = ItemType.BlackConcrete; - mappings[601] = ItemType.WhiteConcretePowder; - mappings[602] = ItemType.OrangeConcretePowder; - mappings[603] = ItemType.MagentaConcretePowder; - mappings[604] = ItemType.LightBlueConcretePowder; - mappings[605] = ItemType.YellowConcretePowder; - mappings[606] = ItemType.LimeConcretePowder; - mappings[607] = ItemType.PinkConcretePowder; - mappings[608] = ItemType.GrayConcretePowder; - mappings[609] = ItemType.LightGrayConcretePowder; - mappings[610] = ItemType.CyanConcretePowder; - mappings[611] = ItemType.PurpleConcretePowder; - mappings[612] = ItemType.BlueConcretePowder; - mappings[613] = ItemType.BrownConcretePowder; - mappings[614] = ItemType.GreenConcretePowder; - mappings[615] = ItemType.RedConcretePowder; - mappings[616] = ItemType.BlackConcretePowder; - mappings[617] = ItemType.TurtleEgg; - mappings[618] = ItemType.SnifferEgg; - mappings[619] = ItemType.DriedGhast; - mappings[620] = ItemType.DeadTubeCoralBlock; - mappings[621] = ItemType.DeadBrainCoralBlock; - mappings[622] = ItemType.DeadBubbleCoralBlock; - mappings[623] = ItemType.DeadFireCoralBlock; - mappings[624] = ItemType.DeadHornCoralBlock; - mappings[625] = ItemType.TubeCoralBlock; - mappings[626] = ItemType.BrainCoralBlock; - mappings[627] = ItemType.BubbleCoralBlock; - mappings[628] = ItemType.FireCoralBlock; - mappings[629] = ItemType.HornCoralBlock; - mappings[630] = ItemType.TubeCoral; - mappings[631] = ItemType.BrainCoral; - mappings[632] = ItemType.BubbleCoral; - mappings[633] = ItemType.FireCoral; - mappings[634] = ItemType.HornCoral; - mappings[635] = ItemType.DeadBrainCoral; - mappings[636] = ItemType.DeadBubbleCoral; - mappings[637] = ItemType.DeadFireCoral; - mappings[638] = ItemType.DeadHornCoral; - mappings[639] = ItemType.DeadTubeCoral; - mappings[640] = ItemType.TubeCoralFan; - mappings[641] = ItemType.BrainCoralFan; - mappings[642] = ItemType.BubbleCoralFan; - mappings[643] = ItemType.FireCoralFan; - mappings[644] = ItemType.HornCoralFan; - mappings[645] = ItemType.DeadTubeCoralFan; - mappings[646] = ItemType.DeadBrainCoralFan; - mappings[647] = ItemType.DeadBubbleCoralFan; - mappings[648] = ItemType.DeadFireCoralFan; - mappings[649] = ItemType.DeadHornCoralFan; - mappings[650] = ItemType.BlueIce; - mappings[651] = ItemType.Conduit; - mappings[652] = ItemType.PolishedGraniteStairs; - mappings[653] = ItemType.SmoothRedSandstoneStairs; - mappings[654] = ItemType.MossyStoneBrickStairs; - mappings[655] = ItemType.PolishedDioriteStairs; - mappings[656] = ItemType.MossyCobblestoneStairs; - mappings[657] = ItemType.EndStoneBrickStairs; - mappings[658] = ItemType.StoneStairs; - mappings[659] = ItemType.SmoothSandstoneStairs; - mappings[660] = ItemType.SmoothQuartzStairs; - mappings[661] = ItemType.GraniteStairs; - mappings[662] = ItemType.AndesiteStairs; - mappings[663] = ItemType.RedNetherBrickStairs; - mappings[664] = ItemType.PolishedAndesiteStairs; - mappings[665] = ItemType.DioriteStairs; - mappings[666] = ItemType.CobbledDeepslateStairs; - mappings[667] = ItemType.PolishedDeepslateStairs; - mappings[668] = ItemType.DeepslateBrickStairs; - mappings[669] = ItemType.DeepslateTileStairs; - mappings[670] = ItemType.PolishedGraniteSlab; - mappings[671] = ItemType.SmoothRedSandstoneSlab; - mappings[672] = ItemType.MossyStoneBrickSlab; - mappings[673] = ItemType.PolishedDioriteSlab; - mappings[674] = ItemType.MossyCobblestoneSlab; - mappings[675] = ItemType.EndStoneBrickSlab; - mappings[676] = ItemType.SmoothSandstoneSlab; - mappings[677] = ItemType.SmoothQuartzSlab; - mappings[678] = ItemType.GraniteSlab; - mappings[679] = ItemType.AndesiteSlab; - mappings[680] = ItemType.RedNetherBrickSlab; - mappings[681] = ItemType.PolishedAndesiteSlab; - mappings[682] = ItemType.DioriteSlab; - mappings[683] = ItemType.CobbledDeepslateSlab; - mappings[684] = ItemType.PolishedDeepslateSlab; - mappings[685] = ItemType.DeepslateBrickSlab; - mappings[686] = ItemType.DeepslateTileSlab; - mappings[687] = ItemType.Scaffolding; - mappings[688] = ItemType.Redstone; - mappings[689] = ItemType.RedstoneTorch; - mappings[690] = ItemType.RedstoneBlock; - mappings[691] = ItemType.Repeater; - mappings[692] = ItemType.Comparator; - mappings[693] = ItemType.Piston; - mappings[694] = ItemType.StickyPiston; - mappings[695] = ItemType.SlimeBlock; - mappings[696] = ItemType.HoneyBlock; - mappings[697] = ItemType.Observer; - mappings[698] = ItemType.Hopper; - mappings[699] = ItemType.Dispenser; - mappings[700] = ItemType.Dropper; - mappings[701] = ItemType.Lectern; - mappings[702] = ItemType.Target; - mappings[703] = ItemType.Lever; - mappings[704] = ItemType.LightningRod; - mappings[705] = ItemType.DaylightDetector; - mappings[706] = ItemType.SculkSensor; - mappings[707] = ItemType.CalibratedSculkSensor; - mappings[708] = ItemType.TripwireHook; - mappings[709] = ItemType.TrappedChest; - mappings[710] = ItemType.Tnt; - mappings[711] = ItemType.RedstoneLamp; - mappings[712] = ItemType.NoteBlock; - mappings[713] = ItemType.StoneButton; - mappings[714] = ItemType.PolishedBlackstoneButton; - mappings[715] = ItemType.OakButton; - mappings[716] = ItemType.SpruceButton; - mappings[717] = ItemType.BirchButton; - mappings[718] = ItemType.JungleButton; - mappings[719] = ItemType.AcaciaButton; - mappings[720] = ItemType.CherryButton; - mappings[721] = ItemType.DarkOakButton; - mappings[722] = ItemType.PaleOakButton; - mappings[723] = ItemType.MangroveButton; - mappings[724] = ItemType.BambooButton; - mappings[725] = ItemType.CrimsonButton; - mappings[726] = ItemType.WarpedButton; - mappings[727] = ItemType.StonePressurePlate; - mappings[728] = ItemType.PolishedBlackstonePressurePlate; - mappings[729] = ItemType.LightWeightedPressurePlate; - mappings[730] = ItemType.HeavyWeightedPressurePlate; - mappings[731] = ItemType.OakPressurePlate; - mappings[732] = ItemType.SprucePressurePlate; - mappings[733] = ItemType.BirchPressurePlate; - mappings[734] = ItemType.JunglePressurePlate; - mappings[735] = ItemType.AcaciaPressurePlate; - mappings[736] = ItemType.CherryPressurePlate; - mappings[737] = ItemType.DarkOakPressurePlate; - mappings[738] = ItemType.PaleOakPressurePlate; - mappings[739] = ItemType.MangrovePressurePlate; - mappings[740] = ItemType.BambooPressurePlate; - mappings[741] = ItemType.CrimsonPressurePlate; - mappings[742] = ItemType.WarpedPressurePlate; - mappings[743] = ItemType.IronDoor; - mappings[744] = ItemType.OakDoor; - mappings[745] = ItemType.SpruceDoor; - mappings[746] = ItemType.BirchDoor; - mappings[747] = ItemType.JungleDoor; - mappings[748] = ItemType.AcaciaDoor; - mappings[749] = ItemType.CherryDoor; - mappings[750] = ItemType.DarkOakDoor; - mappings[751] = ItemType.PaleOakDoor; - mappings[752] = ItemType.MangroveDoor; - mappings[753] = ItemType.BambooDoor; - mappings[754] = ItemType.CrimsonDoor; - mappings[755] = ItemType.WarpedDoor; - mappings[756] = ItemType.CopperDoor; - mappings[757] = ItemType.ExposedCopperDoor; - mappings[758] = ItemType.WeatheredCopperDoor; - mappings[759] = ItemType.OxidizedCopperDoor; - mappings[760] = ItemType.WaxedCopperDoor; - mappings[761] = ItemType.WaxedExposedCopperDoor; - mappings[762] = ItemType.WaxedWeatheredCopperDoor; - mappings[763] = ItemType.WaxedOxidizedCopperDoor; - mappings[764] = ItemType.IronTrapdoor; - mappings[765] = ItemType.OakTrapdoor; - mappings[766] = ItemType.SpruceTrapdoor; - mappings[767] = ItemType.BirchTrapdoor; - mappings[768] = ItemType.JungleTrapdoor; - mappings[769] = ItemType.AcaciaTrapdoor; - mappings[770] = ItemType.CherryTrapdoor; - mappings[771] = ItemType.DarkOakTrapdoor; - mappings[772] = ItemType.PaleOakTrapdoor; - mappings[773] = ItemType.MangroveTrapdoor; - mappings[774] = ItemType.BambooTrapdoor; - mappings[775] = ItemType.CrimsonTrapdoor; - mappings[776] = ItemType.WarpedTrapdoor; - mappings[777] = ItemType.CopperTrapdoor; - mappings[778] = ItemType.ExposedCopperTrapdoor; - mappings[779] = ItemType.WeatheredCopperTrapdoor; - mappings[780] = ItemType.OxidizedCopperTrapdoor; - mappings[781] = ItemType.WaxedCopperTrapdoor; - mappings[782] = ItemType.WaxedExposedCopperTrapdoor; - mappings[783] = ItemType.WaxedWeatheredCopperTrapdoor; - mappings[784] = ItemType.WaxedOxidizedCopperTrapdoor; - mappings[785] = ItemType.OakFenceGate; - mappings[786] = ItemType.SpruceFenceGate; - mappings[787] = ItemType.BirchFenceGate; - mappings[788] = ItemType.JungleFenceGate; - mappings[789] = ItemType.AcaciaFenceGate; - mappings[790] = ItemType.CherryFenceGate; - mappings[791] = ItemType.DarkOakFenceGate; - mappings[792] = ItemType.PaleOakFenceGate; - mappings[793] = ItemType.MangroveFenceGate; - mappings[794] = ItemType.BambooFenceGate; - mappings[795] = ItemType.CrimsonFenceGate; - mappings[796] = ItemType.WarpedFenceGate; - mappings[797] = ItemType.PoweredRail; - mappings[798] = ItemType.DetectorRail; - mappings[799] = ItemType.Rail; - mappings[800] = ItemType.ActivatorRail; - mappings[801] = ItemType.Saddle; - mappings[802] = ItemType.WhiteHarness; - mappings[803] = ItemType.OrangeHarness; - mappings[804] = ItemType.MagentaHarness; - mappings[805] = ItemType.LightBlueHarness; - mappings[806] = ItemType.YellowHarness; - mappings[807] = ItemType.LimeHarness; - mappings[808] = ItemType.PinkHarness; - mappings[809] = ItemType.GrayHarness; - mappings[810] = ItemType.LightGrayHarness; - mappings[811] = ItemType.CyanHarness; - mappings[812] = ItemType.PurpleHarness; - mappings[813] = ItemType.BlueHarness; - mappings[814] = ItemType.BrownHarness; - mappings[815] = ItemType.GreenHarness; - mappings[816] = ItemType.RedHarness; - mappings[817] = ItemType.BlackHarness; - mappings[818] = ItemType.Minecart; - mappings[819] = ItemType.ChestMinecart; - mappings[820] = ItemType.FurnaceMinecart; - mappings[821] = ItemType.TntMinecart; - mappings[822] = ItemType.HopperMinecart; - mappings[823] = ItemType.CarrotOnAStick; - mappings[824] = ItemType.WarpedFungusOnAStick; - mappings[825] = ItemType.PhantomMembrane; - mappings[826] = ItemType.Elytra; - mappings[827] = ItemType.OakBoat; - mappings[828] = ItemType.OakChestBoat; - mappings[829] = ItemType.SpruceBoat; - mappings[830] = ItemType.SpruceChestBoat; - mappings[831] = ItemType.BirchBoat; - mappings[832] = ItemType.BirchChestBoat; - mappings[833] = ItemType.JungleBoat; - mappings[834] = ItemType.JungleChestBoat; - mappings[835] = ItemType.AcaciaBoat; - mappings[836] = ItemType.AcaciaChestBoat; - mappings[837] = ItemType.CherryBoat; - mappings[838] = ItemType.CherryChestBoat; - mappings[839] = ItemType.DarkOakBoat; - mappings[840] = ItemType.DarkOakChestBoat; - mappings[841] = ItemType.PaleOakBoat; - mappings[842] = ItemType.PaleOakChestBoat; - mappings[843] = ItemType.MangroveBoat; - mappings[844] = ItemType.MangroveChestBoat; - mappings[845] = ItemType.BambooRaft; - mappings[846] = ItemType.BambooChestRaft; - mappings[847] = ItemType.StructureBlock; - mappings[848] = ItemType.Jigsaw; - mappings[849] = ItemType.TestBlock; - mappings[850] = ItemType.TestInstanceBlock; - mappings[851] = ItemType.TurtleHelmet; - mappings[852] = ItemType.TurtleScute; - mappings[853] = ItemType.ArmadilloScute; - mappings[854] = ItemType.WolfArmor; - mappings[855] = ItemType.FlintAndSteel; - mappings[856] = ItemType.Bowl; - mappings[857] = ItemType.Apple; - mappings[858] = ItemType.Bow; - mappings[859] = ItemType.Arrow; - mappings[860] = ItemType.Coal; - mappings[861] = ItemType.Charcoal; - mappings[862] = ItemType.Diamond; - mappings[863] = ItemType.Emerald; - mappings[864] = ItemType.LapisLazuli; - mappings[865] = ItemType.Quartz; - mappings[866] = ItemType.AmethystShard; - mappings[867] = ItemType.RawIron; - mappings[868] = ItemType.IronIngot; - mappings[869] = ItemType.RawCopper; - mappings[870] = ItemType.CopperIngot; - mappings[871] = ItemType.RawGold; - mappings[872] = ItemType.GoldIngot; - mappings[873] = ItemType.NetheriteIngot; - mappings[874] = ItemType.NetheriteScrap; - mappings[875] = ItemType.WoodenSword; - mappings[876] = ItemType.WoodenShovel; - mappings[877] = ItemType.WoodenPickaxe; - mappings[878] = ItemType.WoodenAxe; - mappings[879] = ItemType.WoodenHoe; - mappings[880] = ItemType.StoneSword; - mappings[881] = ItemType.StoneShovel; - mappings[882] = ItemType.StonePickaxe; - mappings[883] = ItemType.StoneAxe; - mappings[884] = ItemType.StoneHoe; - mappings[885] = ItemType.GoldenSword; - mappings[886] = ItemType.GoldenShovel; - mappings[887] = ItemType.GoldenPickaxe; - mappings[888] = ItemType.GoldenAxe; - mappings[889] = ItemType.GoldenHoe; - mappings[890] = ItemType.IronSword; - mappings[891] = ItemType.IronShovel; - mappings[892] = ItemType.IronPickaxe; - mappings[893] = ItemType.IronAxe; - mappings[894] = ItemType.IronHoe; - mappings[895] = ItemType.DiamondSword; - mappings[896] = ItemType.DiamondShovel; - mappings[897] = ItemType.DiamondPickaxe; - mappings[898] = ItemType.DiamondAxe; - mappings[899] = ItemType.DiamondHoe; - mappings[900] = ItemType.NetheriteSword; - mappings[901] = ItemType.NetheriteShovel; - mappings[902] = ItemType.NetheritePickaxe; - mappings[903] = ItemType.NetheriteAxe; - mappings[904] = ItemType.NetheriteHoe; - mappings[905] = ItemType.Stick; - mappings[906] = ItemType.MushroomStew; - mappings[907] = ItemType.String; - mappings[908] = ItemType.Feather; - mappings[909] = ItemType.Gunpowder; - mappings[910] = ItemType.WheatSeeds; - mappings[911] = ItemType.Wheat; - mappings[912] = ItemType.Bread; - mappings[913] = ItemType.LeatherHelmet; - mappings[914] = ItemType.LeatherChestplate; - mappings[915] = ItemType.LeatherLeggings; - mappings[916] = ItemType.LeatherBoots; - mappings[917] = ItemType.ChainmailHelmet; - mappings[918] = ItemType.ChainmailChestplate; - mappings[919] = ItemType.ChainmailLeggings; - mappings[920] = ItemType.ChainmailBoots; - mappings[921] = ItemType.IronHelmet; - mappings[922] = ItemType.IronChestplate; - mappings[923] = ItemType.IronLeggings; - mappings[924] = ItemType.IronBoots; - mappings[925] = ItemType.DiamondHelmet; - mappings[926] = ItemType.DiamondChestplate; - mappings[927] = ItemType.DiamondLeggings; - mappings[928] = ItemType.DiamondBoots; - mappings[929] = ItemType.GoldenHelmet; - mappings[930] = ItemType.GoldenChestplate; - mappings[931] = ItemType.GoldenLeggings; - mappings[932] = ItemType.GoldenBoots; - mappings[933] = ItemType.NetheriteHelmet; - mappings[934] = ItemType.NetheriteChestplate; - mappings[935] = ItemType.NetheriteLeggings; - mappings[936] = ItemType.NetheriteBoots; - mappings[937] = ItemType.Flint; - mappings[938] = ItemType.Porkchop; - mappings[939] = ItemType.CookedPorkchop; - mappings[940] = ItemType.Painting; - mappings[941] = ItemType.GoldenApple; - mappings[942] = ItemType.EnchantedGoldenApple; - mappings[943] = ItemType.OakSign; - mappings[944] = ItemType.SpruceSign; - mappings[945] = ItemType.BirchSign; - mappings[946] = ItemType.JungleSign; - mappings[947] = ItemType.AcaciaSign; - mappings[948] = ItemType.CherrySign; - mappings[949] = ItemType.DarkOakSign; - mappings[950] = ItemType.PaleOakSign; - mappings[951] = ItemType.MangroveSign; - mappings[952] = ItemType.BambooSign; - mappings[953] = ItemType.CrimsonSign; - mappings[954] = ItemType.WarpedSign; - mappings[955] = ItemType.OakHangingSign; - mappings[956] = ItemType.SpruceHangingSign; - mappings[957] = ItemType.BirchHangingSign; - mappings[958] = ItemType.JungleHangingSign; - mappings[959] = ItemType.AcaciaHangingSign; - mappings[960] = ItemType.CherryHangingSign; - mappings[961] = ItemType.DarkOakHangingSign; - mappings[962] = ItemType.PaleOakHangingSign; - mappings[963] = ItemType.MangroveHangingSign; - mappings[964] = ItemType.BambooHangingSign; - mappings[965] = ItemType.CrimsonHangingSign; - mappings[966] = ItemType.WarpedHangingSign; - mappings[967] = ItemType.Bucket; - mappings[968] = ItemType.WaterBucket; - mappings[969] = ItemType.LavaBucket; - mappings[970] = ItemType.PowderSnowBucket; - mappings[971] = ItemType.Snowball; - mappings[972] = ItemType.Leather; - mappings[973] = ItemType.MilkBucket; - mappings[974] = ItemType.PufferfishBucket; - mappings[975] = ItemType.SalmonBucket; - mappings[976] = ItemType.CodBucket; - mappings[977] = ItemType.TropicalFishBucket; - mappings[978] = ItemType.AxolotlBucket; - mappings[979] = ItemType.TadpoleBucket; - mappings[980] = ItemType.Brick; - mappings[981] = ItemType.ClayBall; - mappings[982] = ItemType.DriedKelpBlock; - mappings[983] = ItemType.Paper; - mappings[984] = ItemType.Book; - mappings[985] = ItemType.SlimeBall; - mappings[986] = ItemType.Egg; - mappings[987] = ItemType.BlueEgg; - mappings[988] = ItemType.BrownEgg; - mappings[989] = ItemType.Compass; - mappings[990] = ItemType.RecoveryCompass; - mappings[991] = ItemType.Bundle; - mappings[992] = ItemType.WhiteBundle; - mappings[993] = ItemType.OrangeBundle; - mappings[994] = ItemType.MagentaBundle; - mappings[995] = ItemType.LightBlueBundle; - mappings[996] = ItemType.YellowBundle; - mappings[997] = ItemType.LimeBundle; - mappings[998] = ItemType.PinkBundle; - mappings[999] = ItemType.GrayBundle; - mappings[1000] = ItemType.LightGrayBundle; - mappings[1001] = ItemType.CyanBundle; - mappings[1002] = ItemType.PurpleBundle; - mappings[1003] = ItemType.BlueBundle; - mappings[1004] = ItemType.BrownBundle; - mappings[1005] = ItemType.GreenBundle; - mappings[1006] = ItemType.RedBundle; - mappings[1007] = ItemType.BlackBundle; - mappings[1008] = ItemType.FishingRod; - mappings[1009] = ItemType.Clock; - mappings[1010] = ItemType.Spyglass; - mappings[1011] = ItemType.GlowstoneDust; - mappings[1012] = ItemType.Cod; - mappings[1013] = ItemType.Salmon; - mappings[1014] = ItemType.TropicalFish; - mappings[1015] = ItemType.Pufferfish; - mappings[1016] = ItemType.CookedCod; - mappings[1017] = ItemType.CookedSalmon; - mappings[1018] = ItemType.InkSac; - mappings[1019] = ItemType.GlowInkSac; - mappings[1020] = ItemType.CocoaBeans; - mappings[1021] = ItemType.WhiteDye; - mappings[1022] = ItemType.OrangeDye; - mappings[1023] = ItemType.MagentaDye; - mappings[1024] = ItemType.LightBlueDye; - mappings[1025] = ItemType.YellowDye; - mappings[1026] = ItemType.LimeDye; - mappings[1027] = ItemType.PinkDye; - mappings[1028] = ItemType.GrayDye; - mappings[1029] = ItemType.LightGrayDye; - mappings[1030] = ItemType.CyanDye; - mappings[1031] = ItemType.PurpleDye; - mappings[1032] = ItemType.BlueDye; - mappings[1033] = ItemType.BrownDye; - mappings[1034] = ItemType.GreenDye; - mappings[1035] = ItemType.RedDye; - mappings[1036] = ItemType.BlackDye; - mappings[1037] = ItemType.BoneMeal; - mappings[1038] = ItemType.Bone; - mappings[1039] = ItemType.Sugar; - mappings[1040] = ItemType.Cake; - mappings[1041] = ItemType.WhiteBed; - mappings[1042] = ItemType.OrangeBed; - mappings[1043] = ItemType.MagentaBed; - mappings[1044] = ItemType.LightBlueBed; - mappings[1045] = ItemType.YellowBed; - mappings[1046] = ItemType.LimeBed; - mappings[1047] = ItemType.PinkBed; - mappings[1048] = ItemType.GrayBed; - mappings[1049] = ItemType.LightGrayBed; - mappings[1050] = ItemType.CyanBed; - mappings[1051] = ItemType.PurpleBed; - mappings[1052] = ItemType.BlueBed; - mappings[1053] = ItemType.BrownBed; - mappings[1054] = ItemType.GreenBed; - mappings[1055] = ItemType.RedBed; - mappings[1056] = ItemType.BlackBed; - mappings[1057] = ItemType.Cookie; - mappings[1058] = ItemType.Crafter; - mappings[1059] = ItemType.FilledMap; - mappings[1060] = ItemType.Shears; - mappings[1061] = ItemType.MelonSlice; - mappings[1062] = ItemType.DriedKelp; - mappings[1063] = ItemType.PumpkinSeeds; - mappings[1064] = ItemType.MelonSeeds; - mappings[1065] = ItemType.Beef; - mappings[1066] = ItemType.CookedBeef; - mappings[1067] = ItemType.Chicken; - mappings[1068] = ItemType.CookedChicken; - mappings[1069] = ItemType.RottenFlesh; - mappings[1070] = ItemType.EnderPearl; - mappings[1071] = ItemType.BlazeRod; - mappings[1072] = ItemType.GhastTear; - mappings[1073] = ItemType.GoldNugget; - mappings[1074] = ItemType.NetherWart; - mappings[1075] = ItemType.GlassBottle; - mappings[1076] = ItemType.Potion; - mappings[1077] = ItemType.SpiderEye; - mappings[1078] = ItemType.FermentedSpiderEye; - mappings[1079] = ItemType.BlazePowder; - mappings[1080] = ItemType.MagmaCream; - mappings[1081] = ItemType.BrewingStand; - mappings[1082] = ItemType.Cauldron; - mappings[1083] = ItemType.EnderEye; - mappings[1084] = ItemType.GlisteringMelonSlice; - mappings[1085] = ItemType.ArmadilloSpawnEgg; - mappings[1086] = ItemType.AllaySpawnEgg; - mappings[1087] = ItemType.AxolotlSpawnEgg; - mappings[1088] = ItemType.BatSpawnEgg; - mappings[1089] = ItemType.BeeSpawnEgg; - mappings[1090] = ItemType.BlazeSpawnEgg; - mappings[1091] = ItemType.BoggedSpawnEgg; - mappings[1092] = ItemType.BreezeSpawnEgg; - mappings[1093] = ItemType.CatSpawnEgg; - mappings[1094] = ItemType.CamelSpawnEgg; - mappings[1095] = ItemType.CaveSpiderSpawnEgg; - mappings[1096] = ItemType.ChickenSpawnEgg; - mappings[1097] = ItemType.CodSpawnEgg; - mappings[1098] = ItemType.CowSpawnEgg; - mappings[1099] = ItemType.CreeperSpawnEgg; - mappings[1100] = ItemType.DolphinSpawnEgg; - mappings[1101] = ItemType.DonkeySpawnEgg; - mappings[1102] = ItemType.DrownedSpawnEgg; - mappings[1103] = ItemType.ElderGuardianSpawnEgg; - mappings[1104] = ItemType.EnderDragonSpawnEgg; - mappings[1105] = ItemType.EndermanSpawnEgg; - mappings[1106] = ItemType.EndermiteSpawnEgg; - mappings[1107] = ItemType.EvokerSpawnEgg; - mappings[1108] = ItemType.FoxSpawnEgg; - mappings[1109] = ItemType.FrogSpawnEgg; - mappings[1110] = ItemType.GhastSpawnEgg; - mappings[1111] = ItemType.HappyGhastSpawnEgg; - mappings[1112] = ItemType.GlowSquidSpawnEgg; - mappings[1113] = ItemType.GoatSpawnEgg; - mappings[1114] = ItemType.GuardianSpawnEgg; - mappings[1115] = ItemType.HoglinSpawnEgg; - mappings[1116] = ItemType.HorseSpawnEgg; - mappings[1117] = ItemType.HuskSpawnEgg; - mappings[1118] = ItemType.IronGolemSpawnEgg; - mappings[1119] = ItemType.LlamaSpawnEgg; - mappings[1120] = ItemType.MagmaCubeSpawnEgg; - mappings[1121] = ItemType.MooshroomSpawnEgg; - mappings[1122] = ItemType.MuleSpawnEgg; - mappings[1123] = ItemType.OcelotSpawnEgg; - mappings[1124] = ItemType.PandaSpawnEgg; - mappings[1125] = ItemType.ParrotSpawnEgg; - mappings[1126] = ItemType.PhantomSpawnEgg; - mappings[1127] = ItemType.PigSpawnEgg; - mappings[1128] = ItemType.PiglinSpawnEgg; - mappings[1129] = ItemType.PiglinBruteSpawnEgg; - mappings[1130] = ItemType.PillagerSpawnEgg; - mappings[1131] = ItemType.PolarBearSpawnEgg; - mappings[1132] = ItemType.PufferfishSpawnEgg; - mappings[1133] = ItemType.RabbitSpawnEgg; - mappings[1134] = ItemType.RavagerSpawnEgg; - mappings[1135] = ItemType.SalmonSpawnEgg; - mappings[1136] = ItemType.SheepSpawnEgg; - mappings[1137] = ItemType.ShulkerSpawnEgg; - mappings[1138] = ItemType.SilverfishSpawnEgg; - mappings[1139] = ItemType.SkeletonSpawnEgg; - mappings[1140] = ItemType.SkeletonHorseSpawnEgg; - mappings[1141] = ItemType.SlimeSpawnEgg; - mappings[1142] = ItemType.SnifferSpawnEgg; - mappings[1143] = ItemType.SnowGolemSpawnEgg; - mappings[1144] = ItemType.SpiderSpawnEgg; - mappings[1145] = ItemType.SquidSpawnEgg; - mappings[1146] = ItemType.StraySpawnEgg; - mappings[1147] = ItemType.StriderSpawnEgg; - mappings[1148] = ItemType.TadpoleSpawnEgg; - mappings[1149] = ItemType.TraderLlamaSpawnEgg; - mappings[1150] = ItemType.TropicalFishSpawnEgg; - mappings[1151] = ItemType.TurtleSpawnEgg; - mappings[1152] = ItemType.VexSpawnEgg; - mappings[1153] = ItemType.VillagerSpawnEgg; - mappings[1154] = ItemType.VindicatorSpawnEgg; - mappings[1155] = ItemType.WanderingTraderSpawnEgg; - mappings[1156] = ItemType.WardenSpawnEgg; - mappings[1157] = ItemType.WitchSpawnEgg; - mappings[1158] = ItemType.WitherSpawnEgg; - mappings[1159] = ItemType.WitherSkeletonSpawnEgg; - mappings[1160] = ItemType.WolfSpawnEgg; - mappings[1161] = ItemType.ZoglinSpawnEgg; - mappings[1162] = ItemType.CreakingSpawnEgg; - mappings[1163] = ItemType.ZombieSpawnEgg; - mappings[1164] = ItemType.ZombieHorseSpawnEgg; - mappings[1165] = ItemType.ZombieVillagerSpawnEgg; - mappings[1166] = ItemType.ZombifiedPiglinSpawnEgg; - mappings[1167] = ItemType.ExperienceBottle; - mappings[1168] = ItemType.FireCharge; - mappings[1169] = ItemType.WindCharge; - mappings[1170] = ItemType.WritableBook; - mappings[1171] = ItemType.WrittenBook; - mappings[1172] = ItemType.BreezeRod; - mappings[1173] = ItemType.Mace; - mappings[1174] = ItemType.ItemFrame; - mappings[1175] = ItemType.GlowItemFrame; - mappings[1176] = ItemType.FlowerPot; - mappings[1177] = ItemType.Carrot; - mappings[1178] = ItemType.Potato; - mappings[1179] = ItemType.BakedPotato; - mappings[1180] = ItemType.PoisonousPotato; - mappings[1181] = ItemType.Map; - mappings[1182] = ItemType.GoldenCarrot; - mappings[1183] = ItemType.SkeletonSkull; - mappings[1184] = ItemType.WitherSkeletonSkull; - mappings[1185] = ItemType.PlayerHead; - mappings[1186] = ItemType.ZombieHead; - mappings[1187] = ItemType.CreeperHead; - mappings[1188] = ItemType.DragonHead; - mappings[1189] = ItemType.PiglinHead; - mappings[1190] = ItemType.NetherStar; - mappings[1191] = ItemType.PumpkinPie; - mappings[1192] = ItemType.FireworkRocket; - mappings[1193] = ItemType.FireworkStar; - mappings[1194] = ItemType.EnchantedBook; - mappings[1195] = ItemType.NetherBrick; - mappings[1196] = ItemType.ResinBrick; - mappings[1197] = ItemType.PrismarineShard; - mappings[1198] = ItemType.PrismarineCrystals; - mappings[1199] = ItemType.Rabbit; - mappings[1200] = ItemType.CookedRabbit; - mappings[1201] = ItemType.RabbitStew; - mappings[1202] = ItemType.RabbitFoot; - mappings[1203] = ItemType.RabbitHide; - mappings[1204] = ItemType.ArmorStand; - mappings[1205] = ItemType.IronHorseArmor; - mappings[1206] = ItemType.GoldenHorseArmor; - mappings[1207] = ItemType.DiamondHorseArmor; - mappings[1208] = ItemType.LeatherHorseArmor; - mappings[1209] = ItemType.Lead; - mappings[1210] = ItemType.NameTag; - mappings[1211] = ItemType.CommandBlockMinecart; - mappings[1212] = ItemType.Mutton; - mappings[1213] = ItemType.CookedMutton; - mappings[1214] = ItemType.WhiteBanner; - mappings[1215] = ItemType.OrangeBanner; - mappings[1216] = ItemType.MagentaBanner; - mappings[1217] = ItemType.LightBlueBanner; - mappings[1218] = ItemType.YellowBanner; - mappings[1219] = ItemType.LimeBanner; - mappings[1220] = ItemType.PinkBanner; - mappings[1221] = ItemType.GrayBanner; - mappings[1222] = ItemType.LightGrayBanner; - mappings[1223] = ItemType.CyanBanner; - mappings[1224] = ItemType.PurpleBanner; - mappings[1225] = ItemType.BlueBanner; - mappings[1226] = ItemType.BrownBanner; - mappings[1227] = ItemType.GreenBanner; - mappings[1228] = ItemType.RedBanner; - mappings[1229] = ItemType.BlackBanner; - mappings[1230] = ItemType.EndCrystal; - mappings[1231] = ItemType.ChorusFruit; - mappings[1232] = ItemType.PoppedChorusFruit; - mappings[1233] = ItemType.TorchflowerSeeds; - mappings[1234] = ItemType.PitcherPod; - mappings[1235] = ItemType.Beetroot; - mappings[1236] = ItemType.BeetrootSeeds; - mappings[1237] = ItemType.BeetrootSoup; - mappings[1238] = ItemType.DragonBreath; - mappings[1239] = ItemType.SplashPotion; - mappings[1240] = ItemType.SpectralArrow; - mappings[1241] = ItemType.TippedArrow; - mappings[1242] = ItemType.LingeringPotion; - mappings[1243] = ItemType.Shield; - mappings[1244] = ItemType.TotemOfUndying; - mappings[1245] = ItemType.ShulkerShell; - mappings[1246] = ItemType.IronNugget; - mappings[1247] = ItemType.KnowledgeBook; - mappings[1248] = ItemType.DebugStick; - mappings[1249] = ItemType.MusicDisc13; - mappings[1250] = ItemType.MusicDiscCat; - mappings[1251] = ItemType.MusicDiscBlocks; - mappings[1252] = ItemType.MusicDiscChirp; - mappings[1253] = ItemType.MusicDiscCreator; - mappings[1254] = ItemType.MusicDiscCreatorMusicBox; - mappings[1255] = ItemType.MusicDiscFar; - mappings[1256] = ItemType.MusicDiscMall; - mappings[1257] = ItemType.MusicDiscMellohi; - mappings[1258] = ItemType.MusicDiscStal; - mappings[1259] = ItemType.MusicDiscStrad; - mappings[1260] = ItemType.MusicDiscWard; - mappings[1261] = ItemType.MusicDisc11; - mappings[1262] = ItemType.MusicDiscWait; - mappings[1263] = ItemType.MusicDiscOtherside; - mappings[1264] = ItemType.MusicDiscRelic; - mappings[1265] = ItemType.MusicDisc5; - mappings[1266] = ItemType.MusicDiscPigstep; - mappings[1267] = ItemType.MusicDiscPrecipice; - mappings[1268] = ItemType.MusicDiscTears; - mappings[1269] = ItemType.DiscFragment5; - mappings[1270] = ItemType.Trident; - mappings[1271] = ItemType.NautilusShell; - mappings[1272] = ItemType.HeartOfTheSea; - mappings[1273] = ItemType.Crossbow; - mappings[1274] = ItemType.SuspiciousStew; - mappings[1275] = ItemType.Loom; - mappings[1276] = ItemType.FlowerBannerPattern; - mappings[1277] = ItemType.CreeperBannerPattern; - mappings[1278] = ItemType.SkullBannerPattern; - mappings[1279] = ItemType.MojangBannerPattern; - mappings[1280] = ItemType.GlobeBannerPattern; - mappings[1281] = ItemType.PiglinBannerPattern; - mappings[1282] = ItemType.FlowBannerPattern; - mappings[1283] = ItemType.GusterBannerPattern; - mappings[1284] = ItemType.FieldMasonedBannerPattern; - mappings[1285] = ItemType.BordureIndentedBannerPattern; - mappings[1286] = ItemType.GoatHorn; - mappings[1287] = ItemType.Composter; - mappings[1288] = ItemType.Barrel; - mappings[1289] = ItemType.Smoker; - mappings[1290] = ItemType.BlastFurnace; - mappings[1291] = ItemType.CartographyTable; - mappings[1292] = ItemType.FletchingTable; - mappings[1293] = ItemType.Grindstone; - mappings[1294] = ItemType.SmithingTable; - mappings[1295] = ItemType.Stonecutter; - mappings[1296] = ItemType.Bell; - mappings[1297] = ItemType.Lantern; - mappings[1298] = ItemType.SoulLantern; - mappings[1299] = ItemType.SweetBerries; - mappings[1300] = ItemType.GlowBerries; - mappings[1301] = ItemType.Campfire; - mappings[1302] = ItemType.SoulCampfire; - mappings[1303] = ItemType.Shroomlight; - mappings[1304] = ItemType.Honeycomb; - mappings[1305] = ItemType.BeeNest; - mappings[1306] = ItemType.Beehive; - mappings[1307] = ItemType.HoneyBottle; - mappings[1308] = ItemType.HoneycombBlock; - mappings[1309] = ItemType.Lodestone; - mappings[1310] = ItemType.CryingObsidian; - mappings[1311] = ItemType.Blackstone; - mappings[1312] = ItemType.BlackstoneSlab; - mappings[1313] = ItemType.BlackstoneStairs; - mappings[1314] = ItemType.GildedBlackstone; - mappings[1315] = ItemType.PolishedBlackstone; - mappings[1316] = ItemType.PolishedBlackstoneSlab; - mappings[1317] = ItemType.PolishedBlackstoneStairs; - mappings[1318] = ItemType.ChiseledPolishedBlackstone; - mappings[1319] = ItemType.PolishedBlackstoneBricks; - mappings[1320] = ItemType.PolishedBlackstoneBrickSlab; - mappings[1321] = ItemType.PolishedBlackstoneBrickStairs; - mappings[1322] = ItemType.CrackedPolishedBlackstoneBricks; - mappings[1323] = ItemType.RespawnAnchor; - mappings[1324] = ItemType.Candle; - mappings[1325] = ItemType.WhiteCandle; - mappings[1326] = ItemType.OrangeCandle; - mappings[1327] = ItemType.MagentaCandle; - mappings[1328] = ItemType.LightBlueCandle; - mappings[1329] = ItemType.YellowCandle; - mappings[1330] = ItemType.LimeCandle; - mappings[1331] = ItemType.PinkCandle; - mappings[1332] = ItemType.GrayCandle; - mappings[1333] = ItemType.LightGrayCandle; - mappings[1334] = ItemType.CyanCandle; - mappings[1335] = ItemType.PurpleCandle; - mappings[1336] = ItemType.BlueCandle; - mappings[1337] = ItemType.BrownCandle; - mappings[1338] = ItemType.GreenCandle; - mappings[1339] = ItemType.RedCandle; - mappings[1340] = ItemType.BlackCandle; - mappings[1341] = ItemType.SmallAmethystBud; - mappings[1342] = ItemType.MediumAmethystBud; - mappings[1343] = ItemType.LargeAmethystBud; - mappings[1344] = ItemType.AmethystCluster; - mappings[1345] = ItemType.PointedDripstone; - mappings[1346] = ItemType.OchreFroglight; - mappings[1347] = ItemType.VerdantFroglight; - mappings[1348] = ItemType.PearlescentFroglight; - mappings[1349] = ItemType.Frogspawn; - mappings[1350] = ItemType.EchoShard; - mappings[1351] = ItemType.Brush; - mappings[1352] = ItemType.NetheriteUpgradeSmithingTemplate; - mappings[1353] = ItemType.SentryArmorTrimSmithingTemplate; - mappings[1354] = ItemType.DuneArmorTrimSmithingTemplate; - mappings[1355] = ItemType.CoastArmorTrimSmithingTemplate; - mappings[1356] = ItemType.WildArmorTrimSmithingTemplate; - mappings[1357] = ItemType.WardArmorTrimSmithingTemplate; - mappings[1358] = ItemType.EyeArmorTrimSmithingTemplate; - mappings[1359] = ItemType.VexArmorTrimSmithingTemplate; - mappings[1360] = ItemType.TideArmorTrimSmithingTemplate; - mappings[1361] = ItemType.SnoutArmorTrimSmithingTemplate; - mappings[1362] = ItemType.RibArmorTrimSmithingTemplate; - mappings[1363] = ItemType.SpireArmorTrimSmithingTemplate; - mappings[1364] = ItemType.WayfinderArmorTrimSmithingTemplate; - mappings[1365] = ItemType.ShaperArmorTrimSmithingTemplate; - mappings[1366] = ItemType.SilenceArmorTrimSmithingTemplate; - mappings[1367] = ItemType.RaiserArmorTrimSmithingTemplate; - mappings[1368] = ItemType.HostArmorTrimSmithingTemplate; - mappings[1369] = ItemType.FlowArmorTrimSmithingTemplate; - mappings[1370] = ItemType.BoltArmorTrimSmithingTemplate; - mappings[1371] = ItemType.AnglerPotterySherd; - mappings[1372] = ItemType.ArcherPotterySherd; - mappings[1373] = ItemType.ArmsUpPotterySherd; - mappings[1374] = ItemType.BladePotterySherd; - mappings[1375] = ItemType.BrewerPotterySherd; - mappings[1376] = ItemType.BurnPotterySherd; - mappings[1377] = ItemType.DangerPotterySherd; - mappings[1378] = ItemType.ExplorerPotterySherd; - mappings[1379] = ItemType.FlowPotterySherd; - mappings[1380] = ItemType.FriendPotterySherd; - mappings[1381] = ItemType.GusterPotterySherd; - mappings[1382] = ItemType.HeartPotterySherd; - mappings[1383] = ItemType.HeartbreakPotterySherd; - mappings[1384] = ItemType.HowlPotterySherd; - mappings[1385] = ItemType.MinerPotterySherd; - mappings[1386] = ItemType.MournerPotterySherd; - mappings[1387] = ItemType.PlentyPotterySherd; - mappings[1388] = ItemType.PrizePotterySherd; - mappings[1389] = ItemType.ScrapePotterySherd; - mappings[1390] = ItemType.SheafPotterySherd; - mappings[1391] = ItemType.ShelterPotterySherd; - mappings[1392] = ItemType.SkullPotterySherd; - mappings[1393] = ItemType.SnortPotterySherd; - mappings[1394] = ItemType.CopperGrate; - mappings[1395] = ItemType.ExposedCopperGrate; - mappings[1396] = ItemType.WeatheredCopperGrate; - mappings[1397] = ItemType.OxidizedCopperGrate; - mappings[1398] = ItemType.WaxedCopperGrate; - mappings[1399] = ItemType.WaxedExposedCopperGrate; - mappings[1400] = ItemType.WaxedWeatheredCopperGrate; - mappings[1401] = ItemType.WaxedOxidizedCopperGrate; - mappings[1402] = ItemType.CopperBulb; - mappings[1403] = ItemType.ExposedCopperBulb; - mappings[1404] = ItemType.WeatheredCopperBulb; - mappings[1405] = ItemType.OxidizedCopperBulb; - mappings[1406] = ItemType.WaxedCopperBulb; - mappings[1407] = ItemType.WaxedExposedCopperBulb; - mappings[1408] = ItemType.WaxedWeatheredCopperBulb; - mappings[1409] = ItemType.WaxedOxidizedCopperBulb; - mappings[1410] = ItemType.TrialSpawner; - mappings[1411] = ItemType.TrialKey; - mappings[1412] = ItemType.OminousTrialKey; - mappings[1413] = ItemType.Vault; - mappings[1414] = ItemType.OminousBottle; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1217.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette1217.cs deleted file mode 100644 index a7026b9227..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1217.cs +++ /dev/null @@ -1,1434 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public class ItemPalette1217 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette1217() - { - mappings[0] = ItemType.Air; - mappings[1] = ItemType.Stone; - mappings[2] = ItemType.Granite; - mappings[3] = ItemType.PolishedGranite; - mappings[4] = ItemType.Diorite; - mappings[5] = ItemType.PolishedDiorite; - mappings[6] = ItemType.Andesite; - mappings[7] = ItemType.PolishedAndesite; - mappings[8] = ItemType.Deepslate; - mappings[9] = ItemType.CobbledDeepslate; - mappings[10] = ItemType.PolishedDeepslate; - mappings[11] = ItemType.Calcite; - mappings[12] = ItemType.Tuff; - mappings[13] = ItemType.TuffSlab; - mappings[14] = ItemType.TuffStairs; - mappings[15] = ItemType.TuffWall; - mappings[16] = ItemType.ChiseledTuff; - mappings[17] = ItemType.PolishedTuff; - mappings[18] = ItemType.PolishedTuffSlab; - mappings[19] = ItemType.PolishedTuffStairs; - mappings[20] = ItemType.PolishedTuffWall; - mappings[21] = ItemType.TuffBricks; - mappings[22] = ItemType.TuffBrickSlab; - mappings[23] = ItemType.TuffBrickStairs; - mappings[24] = ItemType.TuffBrickWall; - mappings[25] = ItemType.ChiseledTuffBricks; - mappings[26] = ItemType.DripstoneBlock; - mappings[27] = ItemType.GrassBlock; - mappings[28] = ItemType.Dirt; - mappings[29] = ItemType.CoarseDirt; - mappings[30] = ItemType.Podzol; - mappings[31] = ItemType.RootedDirt; - mappings[32] = ItemType.Mud; - mappings[33] = ItemType.CrimsonNylium; - mappings[34] = ItemType.WarpedNylium; - mappings[35] = ItemType.Cobblestone; - mappings[36] = ItemType.OakPlanks; - mappings[37] = ItemType.SprucePlanks; - mappings[38] = ItemType.BirchPlanks; - mappings[39] = ItemType.JunglePlanks; - mappings[40] = ItemType.AcaciaPlanks; - mappings[41] = ItemType.CherryPlanks; - mappings[42] = ItemType.DarkOakPlanks; - mappings[43] = ItemType.PaleOakPlanks; - mappings[44] = ItemType.MangrovePlanks; - mappings[45] = ItemType.BambooPlanks; - mappings[46] = ItemType.CrimsonPlanks; - mappings[47] = ItemType.WarpedPlanks; - mappings[48] = ItemType.BambooMosaic; - mappings[49] = ItemType.OakSapling; - mappings[50] = ItemType.SpruceSapling; - mappings[51] = ItemType.BirchSapling; - mappings[52] = ItemType.JungleSapling; - mappings[53] = ItemType.AcaciaSapling; - mappings[54] = ItemType.CherrySapling; - mappings[55] = ItemType.DarkOakSapling; - mappings[56] = ItemType.PaleOakSapling; - mappings[57] = ItemType.MangrovePropagule; - mappings[58] = ItemType.Bedrock; - mappings[59] = ItemType.Sand; - mappings[60] = ItemType.SuspiciousSand; - mappings[61] = ItemType.SuspiciousGravel; - mappings[62] = ItemType.RedSand; - mappings[63] = ItemType.Gravel; - mappings[64] = ItemType.CoalOre; - mappings[65] = ItemType.DeepslateCoalOre; - mappings[66] = ItemType.IronOre; - mappings[67] = ItemType.DeepslateIronOre; - mappings[68] = ItemType.CopperOre; - mappings[69] = ItemType.DeepslateCopperOre; - mappings[70] = ItemType.GoldOre; - mappings[71] = ItemType.DeepslateGoldOre; - mappings[72] = ItemType.RedstoneOre; - mappings[73] = ItemType.DeepslateRedstoneOre; - mappings[74] = ItemType.EmeraldOre; - mappings[75] = ItemType.DeepslateEmeraldOre; - mappings[76] = ItemType.LapisOre; - mappings[77] = ItemType.DeepslateLapisOre; - mappings[78] = ItemType.DiamondOre; - mappings[79] = ItemType.DeepslateDiamondOre; - mappings[80] = ItemType.NetherGoldOre; - mappings[81] = ItemType.NetherQuartzOre; - mappings[82] = ItemType.AncientDebris; - mappings[83] = ItemType.CoalBlock; - mappings[84] = ItemType.RawIronBlock; - mappings[85] = ItemType.RawCopperBlock; - mappings[86] = ItemType.RawGoldBlock; - mappings[87] = ItemType.HeavyCore; - mappings[88] = ItemType.AmethystBlock; - mappings[89] = ItemType.BuddingAmethyst; - mappings[90] = ItemType.IronBlock; - mappings[91] = ItemType.CopperBlock; - mappings[92] = ItemType.GoldBlock; - mappings[93] = ItemType.DiamondBlock; - mappings[94] = ItemType.NetheriteBlock; - mappings[95] = ItemType.ExposedCopper; - mappings[96] = ItemType.WeatheredCopper; - mappings[97] = ItemType.OxidizedCopper; - mappings[98] = ItemType.ChiseledCopper; - mappings[99] = ItemType.ExposedChiseledCopper; - mappings[100] = ItemType.WeatheredChiseledCopper; - mappings[101] = ItemType.OxidizedChiseledCopper; - mappings[102] = ItemType.CutCopper; - mappings[103] = ItemType.ExposedCutCopper; - mappings[104] = ItemType.WeatheredCutCopper; - mappings[105] = ItemType.OxidizedCutCopper; - mappings[106] = ItemType.CutCopperStairs; - mappings[107] = ItemType.ExposedCutCopperStairs; - mappings[108] = ItemType.WeatheredCutCopperStairs; - mappings[109] = ItemType.OxidizedCutCopperStairs; - mappings[110] = ItemType.CutCopperSlab; - mappings[111] = ItemType.ExposedCutCopperSlab; - mappings[112] = ItemType.WeatheredCutCopperSlab; - mappings[113] = ItemType.OxidizedCutCopperSlab; - mappings[114] = ItemType.WaxedCopperBlock; - mappings[115] = ItemType.WaxedExposedCopper; - mappings[116] = ItemType.WaxedWeatheredCopper; - mappings[117] = ItemType.WaxedOxidizedCopper; - mappings[118] = ItemType.WaxedChiseledCopper; - mappings[119] = ItemType.WaxedExposedChiseledCopper; - mappings[120] = ItemType.WaxedWeatheredChiseledCopper; - mappings[121] = ItemType.WaxedOxidizedChiseledCopper; - mappings[122] = ItemType.WaxedCutCopper; - mappings[123] = ItemType.WaxedExposedCutCopper; - mappings[124] = ItemType.WaxedWeatheredCutCopper; - mappings[125] = ItemType.WaxedOxidizedCutCopper; - mappings[126] = ItemType.WaxedCutCopperStairs; - mappings[127] = ItemType.WaxedExposedCutCopperStairs; - mappings[128] = ItemType.WaxedWeatheredCutCopperStairs; - mappings[129] = ItemType.WaxedOxidizedCutCopperStairs; - mappings[130] = ItemType.WaxedCutCopperSlab; - mappings[131] = ItemType.WaxedExposedCutCopperSlab; - mappings[132] = ItemType.WaxedWeatheredCutCopperSlab; - mappings[133] = ItemType.WaxedOxidizedCutCopperSlab; - mappings[134] = ItemType.OakLog; - mappings[135] = ItemType.SpruceLog; - mappings[136] = ItemType.BirchLog; - mappings[137] = ItemType.JungleLog; - mappings[138] = ItemType.AcaciaLog; - mappings[139] = ItemType.CherryLog; - mappings[140] = ItemType.PaleOakLog; - mappings[141] = ItemType.DarkOakLog; - mappings[142] = ItemType.MangroveLog; - mappings[143] = ItemType.MangroveRoots; - mappings[144] = ItemType.MuddyMangroveRoots; - mappings[145] = ItemType.CrimsonStem; - mappings[146] = ItemType.WarpedStem; - mappings[147] = ItemType.BambooBlock; - mappings[148] = ItemType.StrippedOakLog; - mappings[149] = ItemType.StrippedSpruceLog; - mappings[150] = ItemType.StrippedBirchLog; - mappings[151] = ItemType.StrippedJungleLog; - mappings[152] = ItemType.StrippedAcaciaLog; - mappings[153] = ItemType.StrippedCherryLog; - mappings[154] = ItemType.StrippedDarkOakLog; - mappings[155] = ItemType.StrippedPaleOakLog; - mappings[156] = ItemType.StrippedMangroveLog; - mappings[157] = ItemType.StrippedCrimsonStem; - mappings[158] = ItemType.StrippedWarpedStem; - mappings[159] = ItemType.StrippedOakWood; - mappings[160] = ItemType.StrippedSpruceWood; - mappings[161] = ItemType.StrippedBirchWood; - mappings[162] = ItemType.StrippedJungleWood; - mappings[163] = ItemType.StrippedAcaciaWood; - mappings[164] = ItemType.StrippedCherryWood; - mappings[165] = ItemType.StrippedDarkOakWood; - mappings[166] = ItemType.StrippedPaleOakWood; - mappings[167] = ItemType.StrippedMangroveWood; - mappings[168] = ItemType.StrippedCrimsonHyphae; - mappings[169] = ItemType.StrippedWarpedHyphae; - mappings[170] = ItemType.StrippedBambooBlock; - mappings[171] = ItemType.OakWood; - mappings[172] = ItemType.SpruceWood; - mappings[173] = ItemType.BirchWood; - mappings[174] = ItemType.JungleWood; - mappings[175] = ItemType.AcaciaWood; - mappings[176] = ItemType.CherryWood; - mappings[177] = ItemType.PaleOakWood; - mappings[178] = ItemType.DarkOakWood; - mappings[179] = ItemType.MangroveWood; - mappings[180] = ItemType.CrimsonHyphae; - mappings[181] = ItemType.WarpedHyphae; - mappings[182] = ItemType.OakLeaves; - mappings[183] = ItemType.SpruceLeaves; - mappings[184] = ItemType.BirchLeaves; - mappings[185] = ItemType.JungleLeaves; - mappings[186] = ItemType.AcaciaLeaves; - mappings[187] = ItemType.CherryLeaves; - mappings[188] = ItemType.DarkOakLeaves; - mappings[189] = ItemType.PaleOakLeaves; - mappings[190] = ItemType.MangroveLeaves; - mappings[191] = ItemType.AzaleaLeaves; - mappings[192] = ItemType.FloweringAzaleaLeaves; - mappings[193] = ItemType.Sponge; - mappings[194] = ItemType.WetSponge; - mappings[195] = ItemType.Glass; - mappings[196] = ItemType.TintedGlass; - mappings[197] = ItemType.LapisBlock; - mappings[198] = ItemType.Sandstone; - mappings[199] = ItemType.ChiseledSandstone; - mappings[200] = ItemType.CutSandstone; - mappings[201] = ItemType.Cobweb; - mappings[202] = ItemType.ShortGrass; - mappings[203] = ItemType.Fern; - mappings[204] = ItemType.Bush; - mappings[205] = ItemType.Azalea; - mappings[206] = ItemType.FloweringAzalea; - mappings[207] = ItemType.DeadBush; - mappings[208] = ItemType.FireflyBush; - mappings[209] = ItemType.DryShortGrass; - mappings[210] = ItemType.DryTallGrass; - mappings[211] = ItemType.Seagrass; - mappings[212] = ItemType.SeaPickle; - mappings[213] = ItemType.WhiteWool; - mappings[214] = ItemType.OrangeWool; - mappings[215] = ItemType.MagentaWool; - mappings[216] = ItemType.LightBlueWool; - mappings[217] = ItemType.YellowWool; - mappings[218] = ItemType.LimeWool; - mappings[219] = ItemType.PinkWool; - mappings[220] = ItemType.GrayWool; - mappings[221] = ItemType.LightGrayWool; - mappings[222] = ItemType.CyanWool; - mappings[223] = ItemType.PurpleWool; - mappings[224] = ItemType.BlueWool; - mappings[225] = ItemType.BrownWool; - mappings[226] = ItemType.GreenWool; - mappings[227] = ItemType.RedWool; - mappings[228] = ItemType.BlackWool; - mappings[229] = ItemType.Dandelion; - mappings[230] = ItemType.OpenEyeblossom; - mappings[231] = ItemType.ClosedEyeblossom; - mappings[232] = ItemType.Poppy; - mappings[233] = ItemType.BlueOrchid; - mappings[234] = ItemType.Allium; - mappings[235] = ItemType.AzureBluet; - mappings[236] = ItemType.RedTulip; - mappings[237] = ItemType.OrangeTulip; - mappings[238] = ItemType.WhiteTulip; - mappings[239] = ItemType.PinkTulip; - mappings[240] = ItemType.OxeyeDaisy; - mappings[241] = ItemType.Cornflower; - mappings[242] = ItemType.LilyOfTheValley; - mappings[243] = ItemType.WitherRose; - mappings[244] = ItemType.Torchflower; - mappings[245] = ItemType.PitcherPlant; - mappings[246] = ItemType.SporeBlossom; - mappings[247] = ItemType.BrownMushroom; - mappings[248] = ItemType.RedMushroom; - mappings[249] = ItemType.CrimsonFungus; - mappings[250] = ItemType.WarpedFungus; - mappings[251] = ItemType.CrimsonRoots; - mappings[252] = ItemType.WarpedRoots; - mappings[253] = ItemType.NetherSprouts; - mappings[254] = ItemType.WeepingVines; - mappings[255] = ItemType.TwistingVines; - mappings[256] = ItemType.SugarCane; - mappings[257] = ItemType.Kelp; - mappings[258] = ItemType.PinkPetals; - mappings[259] = ItemType.Wildflowers; - mappings[260] = ItemType.LeafLitter; - mappings[261] = ItemType.MossCarpet; - mappings[262] = ItemType.MossBlock; - mappings[263] = ItemType.PaleMossCarpet; - mappings[264] = ItemType.PaleHangingMoss; - mappings[265] = ItemType.PaleMossBlock; - mappings[266] = ItemType.HangingRoots; - mappings[267] = ItemType.BigDripleaf; - mappings[268] = ItemType.SmallDripleaf; - mappings[269] = ItemType.Bamboo; - mappings[270] = ItemType.OakSlab; - mappings[271] = ItemType.SpruceSlab; - mappings[272] = ItemType.BirchSlab; - mappings[273] = ItemType.JungleSlab; - mappings[274] = ItemType.AcaciaSlab; - mappings[275] = ItemType.CherrySlab; - mappings[276] = ItemType.DarkOakSlab; - mappings[277] = ItemType.PaleOakSlab; - mappings[278] = ItemType.MangroveSlab; - mappings[279] = ItemType.BambooSlab; - mappings[280] = ItemType.BambooMosaicSlab; - mappings[281] = ItemType.CrimsonSlab; - mappings[282] = ItemType.WarpedSlab; - mappings[283] = ItemType.StoneSlab; - mappings[284] = ItemType.SmoothStoneSlab; - mappings[285] = ItemType.SandstoneSlab; - mappings[286] = ItemType.CutSandstoneSlab; - mappings[287] = ItemType.PetrifiedOakSlab; - mappings[288] = ItemType.CobblestoneSlab; - mappings[289] = ItemType.BrickSlab; - mappings[290] = ItemType.StoneBrickSlab; - mappings[291] = ItemType.MudBrickSlab; - mappings[292] = ItemType.NetherBrickSlab; - mappings[293] = ItemType.QuartzSlab; - mappings[294] = ItemType.RedSandstoneSlab; - mappings[295] = ItemType.CutRedSandstoneSlab; - mappings[296] = ItemType.PurpurSlab; - mappings[297] = ItemType.PrismarineSlab; - mappings[298] = ItemType.PrismarineBrickSlab; - mappings[299] = ItemType.DarkPrismarineSlab; - mappings[300] = ItemType.SmoothQuartz; - mappings[301] = ItemType.SmoothRedSandstone; - mappings[302] = ItemType.SmoothSandstone; - mappings[303] = ItemType.SmoothStone; - mappings[304] = ItemType.Bricks; - mappings[305] = ItemType.Bookshelf; - mappings[306] = ItemType.ChiseledBookshelf; - mappings[307] = ItemType.DecoratedPot; - mappings[308] = ItemType.MossyCobblestone; - mappings[309] = ItemType.Obsidian; - mappings[310] = ItemType.Torch; - mappings[311] = ItemType.EndRod; - mappings[312] = ItemType.ChorusPlant; - mappings[313] = ItemType.ChorusFlower; - mappings[314] = ItemType.PurpurBlock; - mappings[315] = ItemType.PurpurPillar; - mappings[316] = ItemType.PurpurStairs; - mappings[317] = ItemType.Spawner; - mappings[318] = ItemType.CreakingHeart; - mappings[319] = ItemType.Chest; - mappings[320] = ItemType.CraftingTable; - mappings[321] = ItemType.Farmland; - mappings[322] = ItemType.Furnace; - mappings[323] = ItemType.Ladder; - mappings[324] = ItemType.CobblestoneStairs; - mappings[325] = ItemType.Snow; - mappings[326] = ItemType.Ice; - mappings[327] = ItemType.SnowBlock; - mappings[328] = ItemType.Cactus; - mappings[329] = ItemType.CactusFlower; - mappings[330] = ItemType.Clay; - mappings[331] = ItemType.Jukebox; - mappings[332] = ItemType.OakFence; - mappings[333] = ItemType.SpruceFence; - mappings[334] = ItemType.BirchFence; - mappings[335] = ItemType.JungleFence; - mappings[336] = ItemType.AcaciaFence; - mappings[337] = ItemType.CherryFence; - mappings[338] = ItemType.DarkOakFence; - mappings[339] = ItemType.PaleOakFence; - mappings[340] = ItemType.MangroveFence; - mappings[341] = ItemType.BambooFence; - mappings[342] = ItemType.CrimsonFence; - mappings[343] = ItemType.WarpedFence; - mappings[344] = ItemType.Pumpkin; - mappings[345] = ItemType.CarvedPumpkin; - mappings[346] = ItemType.JackOLantern; - mappings[347] = ItemType.Netherrack; - mappings[348] = ItemType.SoulSand; - mappings[349] = ItemType.SoulSoil; - mappings[350] = ItemType.Basalt; - mappings[351] = ItemType.PolishedBasalt; - mappings[352] = ItemType.SmoothBasalt; - mappings[353] = ItemType.SoulTorch; - mappings[354] = ItemType.Glowstone; - mappings[355] = ItemType.InfestedStone; - mappings[356] = ItemType.InfestedCobblestone; - mappings[357] = ItemType.InfestedStoneBricks; - mappings[358] = ItemType.InfestedMossyStoneBricks; - mappings[359] = ItemType.InfestedCrackedStoneBricks; - mappings[360] = ItemType.InfestedChiseledStoneBricks; - mappings[361] = ItemType.InfestedDeepslate; - mappings[362] = ItemType.StoneBricks; - mappings[363] = ItemType.MossyStoneBricks; - mappings[364] = ItemType.CrackedStoneBricks; - mappings[365] = ItemType.ChiseledStoneBricks; - mappings[366] = ItemType.PackedMud; - mappings[367] = ItemType.MudBricks; - mappings[368] = ItemType.DeepslateBricks; - mappings[369] = ItemType.CrackedDeepslateBricks; - mappings[370] = ItemType.DeepslateTiles; - mappings[371] = ItemType.CrackedDeepslateTiles; - mappings[372] = ItemType.ChiseledDeepslate; - mappings[373] = ItemType.ReinforcedDeepslate; - mappings[374] = ItemType.BrownMushroomBlock; - mappings[375] = ItemType.RedMushroomBlock; - mappings[376] = ItemType.MushroomStem; - mappings[377] = ItemType.IronBars; - mappings[378] = ItemType.Chain; - mappings[379] = ItemType.GlassPane; - mappings[380] = ItemType.Melon; - mappings[381] = ItemType.Vine; - mappings[382] = ItemType.GlowLichen; - mappings[383] = ItemType.ResinClump; - mappings[384] = ItemType.ResinBlock; - mappings[385] = ItemType.ResinBricks; - mappings[386] = ItemType.ResinBrickStairs; - mappings[387] = ItemType.ResinBrickSlab; - mappings[388] = ItemType.ResinBrickWall; - mappings[389] = ItemType.ChiseledResinBricks; - mappings[390] = ItemType.BrickStairs; - mappings[391] = ItemType.StoneBrickStairs; - mappings[392] = ItemType.MudBrickStairs; - mappings[393] = ItemType.Mycelium; - mappings[394] = ItemType.LilyPad; - mappings[395] = ItemType.NetherBricks; - mappings[396] = ItemType.CrackedNetherBricks; - mappings[397] = ItemType.ChiseledNetherBricks; - mappings[398] = ItemType.NetherBrickFence; - mappings[399] = ItemType.NetherBrickStairs; - mappings[400] = ItemType.Sculk; - mappings[401] = ItemType.SculkVein; - mappings[402] = ItemType.SculkCatalyst; - mappings[403] = ItemType.SculkShrieker; - mappings[404] = ItemType.EnchantingTable; - mappings[405] = ItemType.EndPortalFrame; - mappings[406] = ItemType.EndStone; - mappings[407] = ItemType.EndStoneBricks; - mappings[408] = ItemType.DragonEgg; - mappings[409] = ItemType.SandstoneStairs; - mappings[410] = ItemType.EnderChest; - mappings[411] = ItemType.EmeraldBlock; - mappings[412] = ItemType.OakStairs; - mappings[413] = ItemType.SpruceStairs; - mappings[414] = ItemType.BirchStairs; - mappings[415] = ItemType.JungleStairs; - mappings[416] = ItemType.AcaciaStairs; - mappings[417] = ItemType.CherryStairs; - mappings[418] = ItemType.DarkOakStairs; - mappings[419] = ItemType.PaleOakStairs; - mappings[420] = ItemType.MangroveStairs; - mappings[421] = ItemType.BambooStairs; - mappings[422] = ItemType.BambooMosaicStairs; - mappings[423] = ItemType.CrimsonStairs; - mappings[424] = ItemType.WarpedStairs; - mappings[425] = ItemType.CommandBlock; - mappings[426] = ItemType.Beacon; - mappings[427] = ItemType.CobblestoneWall; - mappings[428] = ItemType.MossyCobblestoneWall; - mappings[429] = ItemType.BrickWall; - mappings[430] = ItemType.PrismarineWall; - mappings[431] = ItemType.RedSandstoneWall; - mappings[432] = ItemType.MossyStoneBrickWall; - mappings[433] = ItemType.GraniteWall; - mappings[434] = ItemType.StoneBrickWall; - mappings[435] = ItemType.MudBrickWall; - mappings[436] = ItemType.NetherBrickWall; - mappings[437] = ItemType.AndesiteWall; - mappings[438] = ItemType.RedNetherBrickWall; - mappings[439] = ItemType.SandstoneWall; - mappings[440] = ItemType.EndStoneBrickWall; - mappings[441] = ItemType.DioriteWall; - mappings[442] = ItemType.BlackstoneWall; - mappings[443] = ItemType.PolishedBlackstoneWall; - mappings[444] = ItemType.PolishedBlackstoneBrickWall; - mappings[445] = ItemType.CobbledDeepslateWall; - mappings[446] = ItemType.PolishedDeepslateWall; - mappings[447] = ItemType.DeepslateBrickWall; - mappings[448] = ItemType.DeepslateTileWall; - mappings[449] = ItemType.Anvil; - mappings[450] = ItemType.ChippedAnvil; - mappings[451] = ItemType.DamagedAnvil; - mappings[452] = ItemType.ChiseledQuartzBlock; - mappings[453] = ItemType.QuartzBlock; - mappings[454] = ItemType.QuartzBricks; - mappings[455] = ItemType.QuartzPillar; - mappings[456] = ItemType.QuartzStairs; - mappings[457] = ItemType.WhiteTerracotta; - mappings[458] = ItemType.OrangeTerracotta; - mappings[459] = ItemType.MagentaTerracotta; - mappings[460] = ItemType.LightBlueTerracotta; - mappings[461] = ItemType.YellowTerracotta; - mappings[462] = ItemType.LimeTerracotta; - mappings[463] = ItemType.PinkTerracotta; - mappings[464] = ItemType.GrayTerracotta; - mappings[465] = ItemType.LightGrayTerracotta; - mappings[466] = ItemType.CyanTerracotta; - mappings[467] = ItemType.PurpleTerracotta; - mappings[468] = ItemType.BlueTerracotta; - mappings[469] = ItemType.BrownTerracotta; - mappings[470] = ItemType.GreenTerracotta; - mappings[471] = ItemType.RedTerracotta; - mappings[472] = ItemType.BlackTerracotta; - mappings[473] = ItemType.Barrier; - mappings[474] = ItemType.Light; - mappings[475] = ItemType.HayBlock; - mappings[476] = ItemType.WhiteCarpet; - mappings[477] = ItemType.OrangeCarpet; - mappings[478] = ItemType.MagentaCarpet; - mappings[479] = ItemType.LightBlueCarpet; - mappings[480] = ItemType.YellowCarpet; - mappings[481] = ItemType.LimeCarpet; - mappings[482] = ItemType.PinkCarpet; - mappings[483] = ItemType.GrayCarpet; - mappings[484] = ItemType.LightGrayCarpet; - mappings[485] = ItemType.CyanCarpet; - mappings[486] = ItemType.PurpleCarpet; - mappings[487] = ItemType.BlueCarpet; - mappings[488] = ItemType.BrownCarpet; - mappings[489] = ItemType.GreenCarpet; - mappings[490] = ItemType.RedCarpet; - mappings[491] = ItemType.BlackCarpet; - mappings[492] = ItemType.Terracotta; - mappings[493] = ItemType.PackedIce; - mappings[494] = ItemType.DirtPath; - mappings[495] = ItemType.Sunflower; - mappings[496] = ItemType.Lilac; - mappings[497] = ItemType.RoseBush; - mappings[498] = ItemType.Peony; - mappings[499] = ItemType.TallGrass; - mappings[500] = ItemType.LargeFern; - mappings[501] = ItemType.WhiteStainedGlass; - mappings[502] = ItemType.OrangeStainedGlass; - mappings[503] = ItemType.MagentaStainedGlass; - mappings[504] = ItemType.LightBlueStainedGlass; - mappings[505] = ItemType.YellowStainedGlass; - mappings[506] = ItemType.LimeStainedGlass; - mappings[507] = ItemType.PinkStainedGlass; - mappings[508] = ItemType.GrayStainedGlass; - mappings[509] = ItemType.LightGrayStainedGlass; - mappings[510] = ItemType.CyanStainedGlass; - mappings[511] = ItemType.PurpleStainedGlass; - mappings[512] = ItemType.BlueStainedGlass; - mappings[513] = ItemType.BrownStainedGlass; - mappings[514] = ItemType.GreenStainedGlass; - mappings[515] = ItemType.RedStainedGlass; - mappings[516] = ItemType.BlackStainedGlass; - mappings[517] = ItemType.WhiteStainedGlassPane; - mappings[518] = ItemType.OrangeStainedGlassPane; - mappings[519] = ItemType.MagentaStainedGlassPane; - mappings[520] = ItemType.LightBlueStainedGlassPane; - mappings[521] = ItemType.YellowStainedGlassPane; - mappings[522] = ItemType.LimeStainedGlassPane; - mappings[523] = ItemType.PinkStainedGlassPane; - mappings[524] = ItemType.GrayStainedGlassPane; - mappings[525] = ItemType.LightGrayStainedGlassPane; - mappings[526] = ItemType.CyanStainedGlassPane; - mappings[527] = ItemType.PurpleStainedGlassPane; - mappings[528] = ItemType.BlueStainedGlassPane; - mappings[529] = ItemType.BrownStainedGlassPane; - mappings[530] = ItemType.GreenStainedGlassPane; - mappings[531] = ItemType.RedStainedGlassPane; - mappings[532] = ItemType.BlackStainedGlassPane; - mappings[533] = ItemType.Prismarine; - mappings[534] = ItemType.PrismarineBricks; - mappings[535] = ItemType.DarkPrismarine; - mappings[536] = ItemType.PrismarineStairs; - mappings[537] = ItemType.PrismarineBrickStairs; - mappings[538] = ItemType.DarkPrismarineStairs; - mappings[539] = ItemType.SeaLantern; - mappings[540] = ItemType.RedSandstone; - mappings[541] = ItemType.ChiseledRedSandstone; - mappings[542] = ItemType.CutRedSandstone; - mappings[543] = ItemType.RedSandstoneStairs; - mappings[544] = ItemType.RepeatingCommandBlock; - mappings[545] = ItemType.ChainCommandBlock; - mappings[546] = ItemType.MagmaBlock; - mappings[547] = ItemType.NetherWartBlock; - mappings[548] = ItemType.WarpedWartBlock; - mappings[549] = ItemType.RedNetherBricks; - mappings[550] = ItemType.BoneBlock; - mappings[551] = ItemType.StructureVoid; - mappings[552] = ItemType.ShulkerBox; - mappings[553] = ItemType.WhiteShulkerBox; - mappings[554] = ItemType.OrangeShulkerBox; - mappings[555] = ItemType.MagentaShulkerBox; - mappings[556] = ItemType.LightBlueShulkerBox; - mappings[557] = ItemType.YellowShulkerBox; - mappings[558] = ItemType.LimeShulkerBox; - mappings[559] = ItemType.PinkShulkerBox; - mappings[560] = ItemType.GrayShulkerBox; - mappings[561] = ItemType.LightGrayShulkerBox; - mappings[562] = ItemType.CyanShulkerBox; - mappings[563] = ItemType.PurpleShulkerBox; - mappings[564] = ItemType.BlueShulkerBox; - mappings[565] = ItemType.BrownShulkerBox; - mappings[566] = ItemType.GreenShulkerBox; - mappings[567] = ItemType.RedShulkerBox; - mappings[568] = ItemType.BlackShulkerBox; - mappings[569] = ItemType.WhiteGlazedTerracotta; - mappings[570] = ItemType.OrangeGlazedTerracotta; - mappings[571] = ItemType.MagentaGlazedTerracotta; - mappings[572] = ItemType.LightBlueGlazedTerracotta; - mappings[573] = ItemType.YellowGlazedTerracotta; - mappings[574] = ItemType.LimeGlazedTerracotta; - mappings[575] = ItemType.PinkGlazedTerracotta; - mappings[576] = ItemType.GrayGlazedTerracotta; - mappings[577] = ItemType.LightGrayGlazedTerracotta; - mappings[578] = ItemType.CyanGlazedTerracotta; - mappings[579] = ItemType.PurpleGlazedTerracotta; - mappings[580] = ItemType.BlueGlazedTerracotta; - mappings[581] = ItemType.BrownGlazedTerracotta; - mappings[582] = ItemType.GreenGlazedTerracotta; - mappings[583] = ItemType.RedGlazedTerracotta; - mappings[584] = ItemType.BlackGlazedTerracotta; - mappings[585] = ItemType.WhiteConcrete; - mappings[586] = ItemType.OrangeConcrete; - mappings[587] = ItemType.MagentaConcrete; - mappings[588] = ItemType.LightBlueConcrete; - mappings[589] = ItemType.YellowConcrete; - mappings[590] = ItemType.LimeConcrete; - mappings[591] = ItemType.PinkConcrete; - mappings[592] = ItemType.GrayConcrete; - mappings[593] = ItemType.LightGrayConcrete; - mappings[594] = ItemType.CyanConcrete; - mappings[595] = ItemType.PurpleConcrete; - mappings[596] = ItemType.BlueConcrete; - mappings[597] = ItemType.BrownConcrete; - mappings[598] = ItemType.GreenConcrete; - mappings[599] = ItemType.RedConcrete; - mappings[600] = ItemType.BlackConcrete; - mappings[601] = ItemType.WhiteConcretePowder; - mappings[602] = ItemType.OrangeConcretePowder; - mappings[603] = ItemType.MagentaConcretePowder; - mappings[604] = ItemType.LightBlueConcretePowder; - mappings[605] = ItemType.YellowConcretePowder; - mappings[606] = ItemType.LimeConcretePowder; - mappings[607] = ItemType.PinkConcretePowder; - mappings[608] = ItemType.GrayConcretePowder; - mappings[609] = ItemType.LightGrayConcretePowder; - mappings[610] = ItemType.CyanConcretePowder; - mappings[611] = ItemType.PurpleConcretePowder; - mappings[612] = ItemType.BlueConcretePowder; - mappings[613] = ItemType.BrownConcretePowder; - mappings[614] = ItemType.GreenConcretePowder; - mappings[615] = ItemType.RedConcretePowder; - mappings[616] = ItemType.BlackConcretePowder; - mappings[617] = ItemType.TurtleEgg; - mappings[618] = ItemType.SnifferEgg; - mappings[619] = ItemType.DriedGhast; - mappings[620] = ItemType.DeadTubeCoralBlock; - mappings[621] = ItemType.DeadBrainCoralBlock; - mappings[622] = ItemType.DeadBubbleCoralBlock; - mappings[623] = ItemType.DeadFireCoralBlock; - mappings[624] = ItemType.DeadHornCoralBlock; - mappings[625] = ItemType.TubeCoralBlock; - mappings[626] = ItemType.BrainCoralBlock; - mappings[627] = ItemType.BubbleCoralBlock; - mappings[628] = ItemType.FireCoralBlock; - mappings[629] = ItemType.HornCoralBlock; - mappings[630] = ItemType.TubeCoral; - mappings[631] = ItemType.BrainCoral; - mappings[632] = ItemType.BubbleCoral; - mappings[633] = ItemType.FireCoral; - mappings[634] = ItemType.HornCoral; - mappings[635] = ItemType.DeadBrainCoral; - mappings[636] = ItemType.DeadBubbleCoral; - mappings[637] = ItemType.DeadFireCoral; - mappings[638] = ItemType.DeadHornCoral; - mappings[639] = ItemType.DeadTubeCoral; - mappings[640] = ItemType.TubeCoralFan; - mappings[641] = ItemType.BrainCoralFan; - mappings[642] = ItemType.BubbleCoralFan; - mappings[643] = ItemType.FireCoralFan; - mappings[644] = ItemType.HornCoralFan; - mappings[645] = ItemType.DeadTubeCoralFan; - mappings[646] = ItemType.DeadBrainCoralFan; - mappings[647] = ItemType.DeadBubbleCoralFan; - mappings[648] = ItemType.DeadFireCoralFan; - mappings[649] = ItemType.DeadHornCoralFan; - mappings[650] = ItemType.BlueIce; - mappings[651] = ItemType.Conduit; - mappings[652] = ItemType.PolishedGraniteStairs; - mappings[653] = ItemType.SmoothRedSandstoneStairs; - mappings[654] = ItemType.MossyStoneBrickStairs; - mappings[655] = ItemType.PolishedDioriteStairs; - mappings[656] = ItemType.MossyCobblestoneStairs; - mappings[657] = ItemType.EndStoneBrickStairs; - mappings[658] = ItemType.StoneStairs; - mappings[659] = ItemType.SmoothSandstoneStairs; - mappings[660] = ItemType.SmoothQuartzStairs; - mappings[661] = ItemType.GraniteStairs; - mappings[662] = ItemType.AndesiteStairs; - mappings[663] = ItemType.RedNetherBrickStairs; - mappings[664] = ItemType.PolishedAndesiteStairs; - mappings[665] = ItemType.DioriteStairs; - mappings[666] = ItemType.CobbledDeepslateStairs; - mappings[667] = ItemType.PolishedDeepslateStairs; - mappings[668] = ItemType.DeepslateBrickStairs; - mappings[669] = ItemType.DeepslateTileStairs; - mappings[670] = ItemType.PolishedGraniteSlab; - mappings[671] = ItemType.SmoothRedSandstoneSlab; - mappings[672] = ItemType.MossyStoneBrickSlab; - mappings[673] = ItemType.PolishedDioriteSlab; - mappings[674] = ItemType.MossyCobblestoneSlab; - mappings[675] = ItemType.EndStoneBrickSlab; - mappings[676] = ItemType.SmoothSandstoneSlab; - mappings[677] = ItemType.SmoothQuartzSlab; - mappings[678] = ItemType.GraniteSlab; - mappings[679] = ItemType.AndesiteSlab; - mappings[680] = ItemType.RedNetherBrickSlab; - mappings[681] = ItemType.PolishedAndesiteSlab; - mappings[682] = ItemType.DioriteSlab; - mappings[683] = ItemType.CobbledDeepslateSlab; - mappings[684] = ItemType.PolishedDeepslateSlab; - mappings[685] = ItemType.DeepslateBrickSlab; - mappings[686] = ItemType.DeepslateTileSlab; - mappings[687] = ItemType.Scaffolding; - mappings[688] = ItemType.Redstone; - mappings[689] = ItemType.RedstoneTorch; - mappings[690] = ItemType.RedstoneBlock; - mappings[691] = ItemType.Repeater; - mappings[692] = ItemType.Comparator; - mappings[693] = ItemType.Piston; - mappings[694] = ItemType.StickyPiston; - mappings[695] = ItemType.SlimeBlock; - mappings[696] = ItemType.HoneyBlock; - mappings[697] = ItemType.Observer; - mappings[698] = ItemType.Hopper; - mappings[699] = ItemType.Dispenser; - mappings[700] = ItemType.Dropper; - mappings[701] = ItemType.Lectern; - mappings[702] = ItemType.Target; - mappings[703] = ItemType.Lever; - mappings[704] = ItemType.LightningRod; - mappings[705] = ItemType.DaylightDetector; - mappings[706] = ItemType.SculkSensor; - mappings[707] = ItemType.CalibratedSculkSensor; - mappings[708] = ItemType.TripwireHook; - mappings[709] = ItemType.TrappedChest; - mappings[710] = ItemType.Tnt; - mappings[711] = ItemType.RedstoneLamp; - mappings[712] = ItemType.NoteBlock; - mappings[713] = ItemType.StoneButton; - mappings[714] = ItemType.PolishedBlackstoneButton; - mappings[715] = ItemType.OakButton; - mappings[716] = ItemType.SpruceButton; - mappings[717] = ItemType.BirchButton; - mappings[718] = ItemType.JungleButton; - mappings[719] = ItemType.AcaciaButton; - mappings[720] = ItemType.CherryButton; - mappings[721] = ItemType.DarkOakButton; - mappings[722] = ItemType.PaleOakButton; - mappings[723] = ItemType.MangroveButton; - mappings[724] = ItemType.BambooButton; - mappings[725] = ItemType.CrimsonButton; - mappings[726] = ItemType.WarpedButton; - mappings[727] = ItemType.StonePressurePlate; - mappings[728] = ItemType.PolishedBlackstonePressurePlate; - mappings[729] = ItemType.LightWeightedPressurePlate; - mappings[730] = ItemType.HeavyWeightedPressurePlate; - mappings[731] = ItemType.OakPressurePlate; - mappings[732] = ItemType.SprucePressurePlate; - mappings[733] = ItemType.BirchPressurePlate; - mappings[734] = ItemType.JunglePressurePlate; - mappings[735] = ItemType.AcaciaPressurePlate; - mappings[736] = ItemType.CherryPressurePlate; - mappings[737] = ItemType.DarkOakPressurePlate; - mappings[738] = ItemType.PaleOakPressurePlate; - mappings[739] = ItemType.MangrovePressurePlate; - mappings[740] = ItemType.BambooPressurePlate; - mappings[741] = ItemType.CrimsonPressurePlate; - mappings[742] = ItemType.WarpedPressurePlate; - mappings[743] = ItemType.IronDoor; - mappings[744] = ItemType.OakDoor; - mappings[745] = ItemType.SpruceDoor; - mappings[746] = ItemType.BirchDoor; - mappings[747] = ItemType.JungleDoor; - mappings[748] = ItemType.AcaciaDoor; - mappings[749] = ItemType.CherryDoor; - mappings[750] = ItemType.DarkOakDoor; - mappings[751] = ItemType.PaleOakDoor; - mappings[752] = ItemType.MangroveDoor; - mappings[753] = ItemType.BambooDoor; - mappings[754] = ItemType.CrimsonDoor; - mappings[755] = ItemType.WarpedDoor; - mappings[756] = ItemType.CopperDoor; - mappings[757] = ItemType.ExposedCopperDoor; - mappings[758] = ItemType.WeatheredCopperDoor; - mappings[759] = ItemType.OxidizedCopperDoor; - mappings[760] = ItemType.WaxedCopperDoor; - mappings[761] = ItemType.WaxedExposedCopperDoor; - mappings[762] = ItemType.WaxedWeatheredCopperDoor; - mappings[763] = ItemType.WaxedOxidizedCopperDoor; - mappings[764] = ItemType.IronTrapdoor; - mappings[765] = ItemType.OakTrapdoor; - mappings[766] = ItemType.SpruceTrapdoor; - mappings[767] = ItemType.BirchTrapdoor; - mappings[768] = ItemType.JungleTrapdoor; - mappings[769] = ItemType.AcaciaTrapdoor; - mappings[770] = ItemType.CherryTrapdoor; - mappings[771] = ItemType.DarkOakTrapdoor; - mappings[772] = ItemType.PaleOakTrapdoor; - mappings[773] = ItemType.MangroveTrapdoor; - mappings[774] = ItemType.BambooTrapdoor; - mappings[775] = ItemType.CrimsonTrapdoor; - mappings[776] = ItemType.WarpedTrapdoor; - mappings[777] = ItemType.CopperTrapdoor; - mappings[778] = ItemType.ExposedCopperTrapdoor; - mappings[779] = ItemType.WeatheredCopperTrapdoor; - mappings[780] = ItemType.OxidizedCopperTrapdoor; - mappings[781] = ItemType.WaxedCopperTrapdoor; - mappings[782] = ItemType.WaxedExposedCopperTrapdoor; - mappings[783] = ItemType.WaxedWeatheredCopperTrapdoor; - mappings[784] = ItemType.WaxedOxidizedCopperTrapdoor; - mappings[785] = ItemType.OakFenceGate; - mappings[786] = ItemType.SpruceFenceGate; - mappings[787] = ItemType.BirchFenceGate; - mappings[788] = ItemType.JungleFenceGate; - mappings[789] = ItemType.AcaciaFenceGate; - mappings[790] = ItemType.CherryFenceGate; - mappings[791] = ItemType.DarkOakFenceGate; - mappings[792] = ItemType.PaleOakFenceGate; - mappings[793] = ItemType.MangroveFenceGate; - mappings[794] = ItemType.BambooFenceGate; - mappings[795] = ItemType.CrimsonFenceGate; - mappings[796] = ItemType.WarpedFenceGate; - mappings[797] = ItemType.PoweredRail; - mappings[798] = ItemType.DetectorRail; - mappings[799] = ItemType.Rail; - mappings[800] = ItemType.ActivatorRail; - mappings[801] = ItemType.Saddle; - mappings[802] = ItemType.WhiteHarness; - mappings[803] = ItemType.OrangeHarness; - mappings[804] = ItemType.MagentaHarness; - mappings[805] = ItemType.LightBlueHarness; - mappings[806] = ItemType.YellowHarness; - mappings[807] = ItemType.LimeHarness; - mappings[808] = ItemType.PinkHarness; - mappings[809] = ItemType.GrayHarness; - mappings[810] = ItemType.LightGrayHarness; - mappings[811] = ItemType.CyanHarness; - mappings[812] = ItemType.PurpleHarness; - mappings[813] = ItemType.BlueHarness; - mappings[814] = ItemType.BrownHarness; - mappings[815] = ItemType.GreenHarness; - mappings[816] = ItemType.RedHarness; - mappings[817] = ItemType.BlackHarness; - mappings[818] = ItemType.Minecart; - mappings[819] = ItemType.ChestMinecart; - mappings[820] = ItemType.FurnaceMinecart; - mappings[821] = ItemType.TntMinecart; - mappings[822] = ItemType.HopperMinecart; - mappings[823] = ItemType.CarrotOnAStick; - mappings[824] = ItemType.WarpedFungusOnAStick; - mappings[825] = ItemType.PhantomMembrane; - mappings[826] = ItemType.Elytra; - mappings[827] = ItemType.OakBoat; - mappings[828] = ItemType.OakChestBoat; - mappings[829] = ItemType.SpruceBoat; - mappings[830] = ItemType.SpruceChestBoat; - mappings[831] = ItemType.BirchBoat; - mappings[832] = ItemType.BirchChestBoat; - mappings[833] = ItemType.JungleBoat; - mappings[834] = ItemType.JungleChestBoat; - mappings[835] = ItemType.AcaciaBoat; - mappings[836] = ItemType.AcaciaChestBoat; - mappings[837] = ItemType.CherryBoat; - mappings[838] = ItemType.CherryChestBoat; - mappings[839] = ItemType.DarkOakBoat; - mappings[840] = ItemType.DarkOakChestBoat; - mappings[841] = ItemType.PaleOakBoat; - mappings[842] = ItemType.PaleOakChestBoat; - mappings[843] = ItemType.MangroveBoat; - mappings[844] = ItemType.MangroveChestBoat; - mappings[845] = ItemType.BambooRaft; - mappings[846] = ItemType.BambooChestRaft; - mappings[847] = ItemType.StructureBlock; - mappings[848] = ItemType.Jigsaw; - mappings[849] = ItemType.TestBlock; - mappings[850] = ItemType.TestInstanceBlock; - mappings[851] = ItemType.TurtleHelmet; - mappings[852] = ItemType.TurtleScute; - mappings[853] = ItemType.ArmadilloScute; - mappings[854] = ItemType.WolfArmor; - mappings[855] = ItemType.FlintAndSteel; - mappings[856] = ItemType.Bowl; - mappings[857] = ItemType.Apple; - mappings[858] = ItemType.Bow; - mappings[859] = ItemType.Arrow; - mappings[860] = ItemType.Coal; - mappings[861] = ItemType.Charcoal; - mappings[862] = ItemType.Diamond; - mappings[863] = ItemType.Emerald; - mappings[864] = ItemType.LapisLazuli; - mappings[865] = ItemType.Quartz; - mappings[866] = ItemType.AmethystShard; - mappings[867] = ItemType.RawIron; - mappings[868] = ItemType.IronIngot; - mappings[869] = ItemType.RawCopper; - mappings[870] = ItemType.CopperIngot; - mappings[871] = ItemType.RawGold; - mappings[872] = ItemType.GoldIngot; - mappings[873] = ItemType.NetheriteIngot; - mappings[874] = ItemType.NetheriteScrap; - mappings[875] = ItemType.WoodenSword; - mappings[876] = ItemType.WoodenShovel; - mappings[877] = ItemType.WoodenPickaxe; - mappings[878] = ItemType.WoodenAxe; - mappings[879] = ItemType.WoodenHoe; - mappings[880] = ItemType.StoneSword; - mappings[881] = ItemType.StoneShovel; - mappings[882] = ItemType.StonePickaxe; - mappings[883] = ItemType.StoneAxe; - mappings[884] = ItemType.StoneHoe; - mappings[885] = ItemType.GoldenSword; - mappings[886] = ItemType.GoldenShovel; - mappings[887] = ItemType.GoldenPickaxe; - mappings[888] = ItemType.GoldenAxe; - mappings[889] = ItemType.GoldenHoe; - mappings[890] = ItemType.IronSword; - mappings[891] = ItemType.IronShovel; - mappings[892] = ItemType.IronPickaxe; - mappings[893] = ItemType.IronAxe; - mappings[894] = ItemType.IronHoe; - mappings[895] = ItemType.DiamondSword; - mappings[896] = ItemType.DiamondShovel; - mappings[897] = ItemType.DiamondPickaxe; - mappings[898] = ItemType.DiamondAxe; - mappings[899] = ItemType.DiamondHoe; - mappings[900] = ItemType.NetheriteSword; - mappings[901] = ItemType.NetheriteShovel; - mappings[902] = ItemType.NetheritePickaxe; - mappings[903] = ItemType.NetheriteAxe; - mappings[904] = ItemType.NetheriteHoe; - mappings[905] = ItemType.Stick; - mappings[906] = ItemType.MushroomStew; - mappings[907] = ItemType.String; - mappings[908] = ItemType.Feather; - mappings[909] = ItemType.Gunpowder; - mappings[910] = ItemType.WheatSeeds; - mappings[911] = ItemType.Wheat; - mappings[912] = ItemType.Bread; - mappings[913] = ItemType.LeatherHelmet; - mappings[914] = ItemType.LeatherChestplate; - mappings[915] = ItemType.LeatherLeggings; - mappings[916] = ItemType.LeatherBoots; - mappings[917] = ItemType.ChainmailHelmet; - mappings[918] = ItemType.ChainmailChestplate; - mappings[919] = ItemType.ChainmailLeggings; - mappings[920] = ItemType.ChainmailBoots; - mappings[921] = ItemType.IronHelmet; - mappings[922] = ItemType.IronChestplate; - mappings[923] = ItemType.IronLeggings; - mappings[924] = ItemType.IronBoots; - mappings[925] = ItemType.DiamondHelmet; - mappings[926] = ItemType.DiamondChestplate; - mappings[927] = ItemType.DiamondLeggings; - mappings[928] = ItemType.DiamondBoots; - mappings[929] = ItemType.GoldenHelmet; - mappings[930] = ItemType.GoldenChestplate; - mappings[931] = ItemType.GoldenLeggings; - mappings[932] = ItemType.GoldenBoots; - mappings[933] = ItemType.NetheriteHelmet; - mappings[934] = ItemType.NetheriteChestplate; - mappings[935] = ItemType.NetheriteLeggings; - mappings[936] = ItemType.NetheriteBoots; - mappings[937] = ItemType.Flint; - mappings[938] = ItemType.Porkchop; - mappings[939] = ItemType.CookedPorkchop; - mappings[940] = ItemType.Painting; - mappings[941] = ItemType.GoldenApple; - mappings[942] = ItemType.EnchantedGoldenApple; - mappings[943] = ItemType.OakSign; - mappings[944] = ItemType.SpruceSign; - mappings[945] = ItemType.BirchSign; - mappings[946] = ItemType.JungleSign; - mappings[947] = ItemType.AcaciaSign; - mappings[948] = ItemType.CherrySign; - mappings[949] = ItemType.DarkOakSign; - mappings[950] = ItemType.PaleOakSign; - mappings[951] = ItemType.MangroveSign; - mappings[952] = ItemType.BambooSign; - mappings[953] = ItemType.CrimsonSign; - mappings[954] = ItemType.WarpedSign; - mappings[955] = ItemType.OakHangingSign; - mappings[956] = ItemType.SpruceHangingSign; - mappings[957] = ItemType.BirchHangingSign; - mappings[958] = ItemType.JungleHangingSign; - mappings[959] = ItemType.AcaciaHangingSign; - mappings[960] = ItemType.CherryHangingSign; - mappings[961] = ItemType.DarkOakHangingSign; - mappings[962] = ItemType.PaleOakHangingSign; - mappings[963] = ItemType.MangroveHangingSign; - mappings[964] = ItemType.BambooHangingSign; - mappings[965] = ItemType.CrimsonHangingSign; - mappings[966] = ItemType.WarpedHangingSign; - mappings[967] = ItemType.Bucket; - mappings[968] = ItemType.WaterBucket; - mappings[969] = ItemType.LavaBucket; - mappings[970] = ItemType.PowderSnowBucket; - mappings[971] = ItemType.Snowball; - mappings[972] = ItemType.Leather; - mappings[973] = ItemType.MilkBucket; - mappings[974] = ItemType.PufferfishBucket; - mappings[975] = ItemType.SalmonBucket; - mappings[976] = ItemType.CodBucket; - mappings[977] = ItemType.TropicalFishBucket; - mappings[978] = ItemType.AxolotlBucket; - mappings[979] = ItemType.TadpoleBucket; - mappings[980] = ItemType.Brick; - mappings[981] = ItemType.ClayBall; - mappings[982] = ItemType.DriedKelpBlock; - mappings[983] = ItemType.Paper; - mappings[984] = ItemType.Book; - mappings[985] = ItemType.SlimeBall; - mappings[986] = ItemType.Egg; - mappings[987] = ItemType.BlueEgg; - mappings[988] = ItemType.BrownEgg; - mappings[989] = ItemType.Compass; - mappings[990] = ItemType.RecoveryCompass; - mappings[991] = ItemType.Bundle; - mappings[992] = ItemType.WhiteBundle; - mappings[993] = ItemType.OrangeBundle; - mappings[994] = ItemType.MagentaBundle; - mappings[995] = ItemType.LightBlueBundle; - mappings[996] = ItemType.YellowBundle; - mappings[997] = ItemType.LimeBundle; - mappings[998] = ItemType.PinkBundle; - mappings[999] = ItemType.GrayBundle; - mappings[1000] = ItemType.LightGrayBundle; - mappings[1001] = ItemType.CyanBundle; - mappings[1002] = ItemType.PurpleBundle; - mappings[1003] = ItemType.BlueBundle; - mappings[1004] = ItemType.BrownBundle; - mappings[1005] = ItemType.GreenBundle; - mappings[1006] = ItemType.RedBundle; - mappings[1007] = ItemType.BlackBundle; - mappings[1008] = ItemType.FishingRod; - mappings[1009] = ItemType.Clock; - mappings[1010] = ItemType.Spyglass; - mappings[1011] = ItemType.GlowstoneDust; - mappings[1012] = ItemType.Cod; - mappings[1013] = ItemType.Salmon; - mappings[1014] = ItemType.TropicalFish; - mappings[1015] = ItemType.Pufferfish; - mappings[1016] = ItemType.CookedCod; - mappings[1017] = ItemType.CookedSalmon; - mappings[1018] = ItemType.InkSac; - mappings[1019] = ItemType.GlowInkSac; - mappings[1020] = ItemType.CocoaBeans; - mappings[1021] = ItemType.WhiteDye; - mappings[1022] = ItemType.OrangeDye; - mappings[1023] = ItemType.MagentaDye; - mappings[1024] = ItemType.LightBlueDye; - mappings[1025] = ItemType.YellowDye; - mappings[1026] = ItemType.LimeDye; - mappings[1027] = ItemType.PinkDye; - mappings[1028] = ItemType.GrayDye; - mappings[1029] = ItemType.LightGrayDye; - mappings[1030] = ItemType.CyanDye; - mappings[1031] = ItemType.PurpleDye; - mappings[1032] = ItemType.BlueDye; - mappings[1033] = ItemType.BrownDye; - mappings[1034] = ItemType.GreenDye; - mappings[1035] = ItemType.RedDye; - mappings[1036] = ItemType.BlackDye; - mappings[1037] = ItemType.BoneMeal; - mappings[1038] = ItemType.Bone; - mappings[1039] = ItemType.Sugar; - mappings[1040] = ItemType.Cake; - mappings[1041] = ItemType.WhiteBed; - mappings[1042] = ItemType.OrangeBed; - mappings[1043] = ItemType.MagentaBed; - mappings[1044] = ItemType.LightBlueBed; - mappings[1045] = ItemType.YellowBed; - mappings[1046] = ItemType.LimeBed; - mappings[1047] = ItemType.PinkBed; - mappings[1048] = ItemType.GrayBed; - mappings[1049] = ItemType.LightGrayBed; - mappings[1050] = ItemType.CyanBed; - mappings[1051] = ItemType.PurpleBed; - mappings[1052] = ItemType.BlueBed; - mappings[1053] = ItemType.BrownBed; - mappings[1054] = ItemType.GreenBed; - mappings[1055] = ItemType.RedBed; - mappings[1056] = ItemType.BlackBed; - mappings[1057] = ItemType.Cookie; - mappings[1058] = ItemType.Crafter; - mappings[1059] = ItemType.FilledMap; - mappings[1060] = ItemType.Shears; - mappings[1061] = ItemType.MelonSlice; - mappings[1062] = ItemType.DriedKelp; - mappings[1063] = ItemType.PumpkinSeeds; - mappings[1064] = ItemType.MelonSeeds; - mappings[1065] = ItemType.Beef; - mappings[1066] = ItemType.CookedBeef; - mappings[1067] = ItemType.Chicken; - mappings[1068] = ItemType.CookedChicken; - mappings[1069] = ItemType.RottenFlesh; - mappings[1070] = ItemType.EnderPearl; - mappings[1071] = ItemType.BlazeRod; - mappings[1072] = ItemType.GhastTear; - mappings[1073] = ItemType.GoldNugget; - mappings[1074] = ItemType.NetherWart; - mappings[1075] = ItemType.GlassBottle; - mappings[1076] = ItemType.Potion; - mappings[1077] = ItemType.SpiderEye; - mappings[1078] = ItemType.FermentedSpiderEye; - mappings[1079] = ItemType.BlazePowder; - mappings[1080] = ItemType.MagmaCream; - mappings[1081] = ItemType.BrewingStand; - mappings[1082] = ItemType.Cauldron; - mappings[1083] = ItemType.EnderEye; - mappings[1084] = ItemType.GlisteringMelonSlice; - mappings[1085] = ItemType.ArmadilloSpawnEgg; - mappings[1086] = ItemType.AllaySpawnEgg; - mappings[1087] = ItemType.AxolotlSpawnEgg; - mappings[1088] = ItemType.BatSpawnEgg; - mappings[1089] = ItemType.BeeSpawnEgg; - mappings[1090] = ItemType.BlazeSpawnEgg; - mappings[1091] = ItemType.BoggedSpawnEgg; - mappings[1092] = ItemType.BreezeSpawnEgg; - mappings[1093] = ItemType.CatSpawnEgg; - mappings[1094] = ItemType.CamelSpawnEgg; - mappings[1095] = ItemType.CaveSpiderSpawnEgg; - mappings[1096] = ItemType.ChickenSpawnEgg; - mappings[1097] = ItemType.CodSpawnEgg; - mappings[1098] = ItemType.CowSpawnEgg; - mappings[1099] = ItemType.CreeperSpawnEgg; - mappings[1100] = ItemType.DolphinSpawnEgg; - mappings[1101] = ItemType.DonkeySpawnEgg; - mappings[1102] = ItemType.DrownedSpawnEgg; - mappings[1103] = ItemType.ElderGuardianSpawnEgg; - mappings[1104] = ItemType.EnderDragonSpawnEgg; - mappings[1105] = ItemType.EndermanSpawnEgg; - mappings[1106] = ItemType.EndermiteSpawnEgg; - mappings[1107] = ItemType.EvokerSpawnEgg; - mappings[1108] = ItemType.FoxSpawnEgg; - mappings[1109] = ItemType.FrogSpawnEgg; - mappings[1110] = ItemType.GhastSpawnEgg; - mappings[1111] = ItemType.HappyGhastSpawnEgg; - mappings[1112] = ItemType.GlowSquidSpawnEgg; - mappings[1113] = ItemType.GoatSpawnEgg; - mappings[1114] = ItemType.GuardianSpawnEgg; - mappings[1115] = ItemType.HoglinSpawnEgg; - mappings[1116] = ItemType.HorseSpawnEgg; - mappings[1117] = ItemType.HuskSpawnEgg; - mappings[1118] = ItemType.IronGolemSpawnEgg; - mappings[1119] = ItemType.LlamaSpawnEgg; - mappings[1120] = ItemType.MagmaCubeSpawnEgg; - mappings[1121] = ItemType.MooshroomSpawnEgg; - mappings[1122] = ItemType.MuleSpawnEgg; - mappings[1123] = ItemType.OcelotSpawnEgg; - mappings[1124] = ItemType.PandaSpawnEgg; - mappings[1125] = ItemType.ParrotSpawnEgg; - mappings[1126] = ItemType.PhantomSpawnEgg; - mappings[1127] = ItemType.PigSpawnEgg; - mappings[1128] = ItemType.PiglinSpawnEgg; - mappings[1129] = ItemType.PiglinBruteSpawnEgg; - mappings[1130] = ItemType.PillagerSpawnEgg; - mappings[1131] = ItemType.PolarBearSpawnEgg; - mappings[1132] = ItemType.PufferfishSpawnEgg; - mappings[1133] = ItemType.RabbitSpawnEgg; - mappings[1134] = ItemType.RavagerSpawnEgg; - mappings[1135] = ItemType.SalmonSpawnEgg; - mappings[1136] = ItemType.SheepSpawnEgg; - mappings[1137] = ItemType.ShulkerSpawnEgg; - mappings[1138] = ItemType.SilverfishSpawnEgg; - mappings[1139] = ItemType.SkeletonSpawnEgg; - mappings[1140] = ItemType.SkeletonHorseSpawnEgg; - mappings[1141] = ItemType.SlimeSpawnEgg; - mappings[1142] = ItemType.SnifferSpawnEgg; - mappings[1143] = ItemType.SnowGolemSpawnEgg; - mappings[1144] = ItemType.SpiderSpawnEgg; - mappings[1145] = ItemType.SquidSpawnEgg; - mappings[1146] = ItemType.StraySpawnEgg; - mappings[1147] = ItemType.StriderSpawnEgg; - mappings[1148] = ItemType.TadpoleSpawnEgg; - mappings[1149] = ItemType.TraderLlamaSpawnEgg; - mappings[1150] = ItemType.TropicalFishSpawnEgg; - mappings[1151] = ItemType.TurtleSpawnEgg; - mappings[1152] = ItemType.VexSpawnEgg; - mappings[1153] = ItemType.VillagerSpawnEgg; - mappings[1154] = ItemType.VindicatorSpawnEgg; - mappings[1155] = ItemType.WanderingTraderSpawnEgg; - mappings[1156] = ItemType.WardenSpawnEgg; - mappings[1157] = ItemType.WitchSpawnEgg; - mappings[1158] = ItemType.WitherSpawnEgg; - mappings[1159] = ItemType.WitherSkeletonSpawnEgg; - mappings[1160] = ItemType.WolfSpawnEgg; - mappings[1161] = ItemType.ZoglinSpawnEgg; - mappings[1162] = ItemType.CreakingSpawnEgg; - mappings[1163] = ItemType.ZombieSpawnEgg; - mappings[1164] = ItemType.ZombieHorseSpawnEgg; - mappings[1165] = ItemType.ZombieVillagerSpawnEgg; - mappings[1166] = ItemType.ZombifiedPiglinSpawnEgg; - mappings[1167] = ItemType.ExperienceBottle; - mappings[1168] = ItemType.FireCharge; - mappings[1169] = ItemType.WindCharge; - mappings[1170] = ItemType.WritableBook; - mappings[1171] = ItemType.WrittenBook; - mappings[1172] = ItemType.BreezeRod; - mappings[1173] = ItemType.Mace; - mappings[1174] = ItemType.ItemFrame; - mappings[1175] = ItemType.GlowItemFrame; - mappings[1176] = ItemType.FlowerPot; - mappings[1177] = ItemType.Carrot; - mappings[1178] = ItemType.Potato; - mappings[1179] = ItemType.BakedPotato; - mappings[1180] = ItemType.PoisonousPotato; - mappings[1181] = ItemType.Map; - mappings[1182] = ItemType.GoldenCarrot; - mappings[1183] = ItemType.SkeletonSkull; - mappings[1184] = ItemType.WitherSkeletonSkull; - mappings[1185] = ItemType.PlayerHead; - mappings[1186] = ItemType.ZombieHead; - mappings[1187] = ItemType.CreeperHead; - mappings[1188] = ItemType.DragonHead; - mappings[1189] = ItemType.PiglinHead; - mappings[1190] = ItemType.NetherStar; - mappings[1191] = ItemType.PumpkinPie; - mappings[1192] = ItemType.FireworkRocket; - mappings[1193] = ItemType.FireworkStar; - mappings[1194] = ItemType.EnchantedBook; - mappings[1195] = ItemType.NetherBrick; - mappings[1196] = ItemType.ResinBrick; - mappings[1197] = ItemType.PrismarineShard; - mappings[1198] = ItemType.PrismarineCrystals; - mappings[1199] = ItemType.Rabbit; - mappings[1200] = ItemType.CookedRabbit; - mappings[1201] = ItemType.RabbitStew; - mappings[1202] = ItemType.RabbitFoot; - mappings[1203] = ItemType.RabbitHide; - mappings[1204] = ItemType.ArmorStand; - mappings[1205] = ItemType.IronHorseArmor; - mappings[1206] = ItemType.GoldenHorseArmor; - mappings[1207] = ItemType.DiamondHorseArmor; - mappings[1208] = ItemType.LeatherHorseArmor; - mappings[1209] = ItemType.Lead; - mappings[1210] = ItemType.NameTag; - mappings[1211] = ItemType.CommandBlockMinecart; - mappings[1212] = ItemType.Mutton; - mappings[1213] = ItemType.CookedMutton; - mappings[1214] = ItemType.WhiteBanner; - mappings[1215] = ItemType.OrangeBanner; - mappings[1216] = ItemType.MagentaBanner; - mappings[1217] = ItemType.LightBlueBanner; - mappings[1218] = ItemType.YellowBanner; - mappings[1219] = ItemType.LimeBanner; - mappings[1220] = ItemType.PinkBanner; - mappings[1221] = ItemType.GrayBanner; - mappings[1222] = ItemType.LightGrayBanner; - mappings[1223] = ItemType.CyanBanner; - mappings[1224] = ItemType.PurpleBanner; - mappings[1225] = ItemType.BlueBanner; - mappings[1226] = ItemType.BrownBanner; - mappings[1227] = ItemType.GreenBanner; - mappings[1228] = ItemType.RedBanner; - mappings[1229] = ItemType.BlackBanner; - mappings[1230] = ItemType.EndCrystal; - mappings[1231] = ItemType.ChorusFruit; - mappings[1232] = ItemType.PoppedChorusFruit; - mappings[1233] = ItemType.TorchflowerSeeds; - mappings[1234] = ItemType.PitcherPod; - mappings[1235] = ItemType.Beetroot; - mappings[1236] = ItemType.BeetrootSeeds; - mappings[1237] = ItemType.BeetrootSoup; - mappings[1238] = ItemType.DragonBreath; - mappings[1239] = ItemType.SplashPotion; - mappings[1240] = ItemType.SpectralArrow; - mappings[1241] = ItemType.TippedArrow; - mappings[1242] = ItemType.LingeringPotion; - mappings[1243] = ItemType.Shield; - mappings[1244] = ItemType.TotemOfUndying; - mappings[1245] = ItemType.ShulkerShell; - mappings[1246] = ItemType.IronNugget; - mappings[1247] = ItemType.KnowledgeBook; - mappings[1248] = ItemType.DebugStick; - mappings[1249] = ItemType.MusicDisc13; - mappings[1250] = ItemType.MusicDiscCat; - mappings[1251] = ItemType.MusicDiscBlocks; - mappings[1252] = ItemType.MusicDiscChirp; - mappings[1253] = ItemType.MusicDiscCreator; - mappings[1254] = ItemType.MusicDiscCreatorMusicBox; - mappings[1255] = ItemType.MusicDiscFar; - mappings[1256] = ItemType.MusicDiscLavaChicken; - mappings[1257] = ItemType.MusicDiscMall; - mappings[1258] = ItemType.MusicDiscMellohi; - mappings[1259] = ItemType.MusicDiscStal; - mappings[1260] = ItemType.MusicDiscStrad; - mappings[1261] = ItemType.MusicDiscWard; - mappings[1262] = ItemType.MusicDisc11; - mappings[1263] = ItemType.MusicDiscWait; - mappings[1264] = ItemType.MusicDiscOtherside; - mappings[1265] = ItemType.MusicDiscRelic; - mappings[1266] = ItemType.MusicDisc5; - mappings[1267] = ItemType.MusicDiscPigstep; - mappings[1268] = ItemType.MusicDiscPrecipice; - mappings[1269] = ItemType.MusicDiscTears; - mappings[1270] = ItemType.DiscFragment5; - mappings[1271] = ItemType.Trident; - mappings[1272] = ItemType.NautilusShell; - mappings[1273] = ItemType.HeartOfTheSea; - mappings[1274] = ItemType.Crossbow; - mappings[1275] = ItemType.SuspiciousStew; - mappings[1276] = ItemType.Loom; - mappings[1277] = ItemType.FlowerBannerPattern; - mappings[1278] = ItemType.CreeperBannerPattern; - mappings[1279] = ItemType.SkullBannerPattern; - mappings[1280] = ItemType.MojangBannerPattern; - mappings[1281] = ItemType.GlobeBannerPattern; - mappings[1282] = ItemType.PiglinBannerPattern; - mappings[1283] = ItemType.FlowBannerPattern; - mappings[1284] = ItemType.GusterBannerPattern; - mappings[1285] = ItemType.FieldMasonedBannerPattern; - mappings[1286] = ItemType.BordureIndentedBannerPattern; - mappings[1287] = ItemType.GoatHorn; - mappings[1288] = ItemType.Composter; - mappings[1289] = ItemType.Barrel; - mappings[1290] = ItemType.Smoker; - mappings[1291] = ItemType.BlastFurnace; - mappings[1292] = ItemType.CartographyTable; - mappings[1293] = ItemType.FletchingTable; - mappings[1294] = ItemType.Grindstone; - mappings[1295] = ItemType.SmithingTable; - mappings[1296] = ItemType.Stonecutter; - mappings[1297] = ItemType.Bell; - mappings[1298] = ItemType.Lantern; - mappings[1299] = ItemType.SoulLantern; - mappings[1300] = ItemType.SweetBerries; - mappings[1301] = ItemType.GlowBerries; - mappings[1302] = ItemType.Campfire; - mappings[1303] = ItemType.SoulCampfire; - mappings[1304] = ItemType.Shroomlight; - mappings[1305] = ItemType.Honeycomb; - mappings[1306] = ItemType.BeeNest; - mappings[1307] = ItemType.Beehive; - mappings[1308] = ItemType.HoneyBottle; - mappings[1309] = ItemType.HoneycombBlock; - mappings[1310] = ItemType.Lodestone; - mappings[1311] = ItemType.CryingObsidian; - mappings[1312] = ItemType.Blackstone; - mappings[1313] = ItemType.BlackstoneSlab; - mappings[1314] = ItemType.BlackstoneStairs; - mappings[1315] = ItemType.GildedBlackstone; - mappings[1316] = ItemType.PolishedBlackstone; - mappings[1317] = ItemType.PolishedBlackstoneSlab; - mappings[1318] = ItemType.PolishedBlackstoneStairs; - mappings[1319] = ItemType.ChiseledPolishedBlackstone; - mappings[1320] = ItemType.PolishedBlackstoneBricks; - mappings[1321] = ItemType.PolishedBlackstoneBrickSlab; - mappings[1322] = ItemType.PolishedBlackstoneBrickStairs; - mappings[1323] = ItemType.CrackedPolishedBlackstoneBricks; - mappings[1324] = ItemType.RespawnAnchor; - mappings[1325] = ItemType.Candle; - mappings[1326] = ItemType.WhiteCandle; - mappings[1327] = ItemType.OrangeCandle; - mappings[1328] = ItemType.MagentaCandle; - mappings[1329] = ItemType.LightBlueCandle; - mappings[1330] = ItemType.YellowCandle; - mappings[1331] = ItemType.LimeCandle; - mappings[1332] = ItemType.PinkCandle; - mappings[1333] = ItemType.GrayCandle; - mappings[1334] = ItemType.LightGrayCandle; - mappings[1335] = ItemType.CyanCandle; - mappings[1336] = ItemType.PurpleCandle; - mappings[1337] = ItemType.BlueCandle; - mappings[1338] = ItemType.BrownCandle; - mappings[1339] = ItemType.GreenCandle; - mappings[1340] = ItemType.RedCandle; - mappings[1341] = ItemType.BlackCandle; - mappings[1342] = ItemType.SmallAmethystBud; - mappings[1343] = ItemType.MediumAmethystBud; - mappings[1344] = ItemType.LargeAmethystBud; - mappings[1345] = ItemType.AmethystCluster; - mappings[1346] = ItemType.PointedDripstone; - mappings[1347] = ItemType.OchreFroglight; - mappings[1348] = ItemType.VerdantFroglight; - mappings[1349] = ItemType.PearlescentFroglight; - mappings[1350] = ItemType.Frogspawn; - mappings[1351] = ItemType.EchoShard; - mappings[1352] = ItemType.Brush; - mappings[1353] = ItemType.NetheriteUpgradeSmithingTemplate; - mappings[1354] = ItemType.SentryArmorTrimSmithingTemplate; - mappings[1355] = ItemType.DuneArmorTrimSmithingTemplate; - mappings[1356] = ItemType.CoastArmorTrimSmithingTemplate; - mappings[1357] = ItemType.WildArmorTrimSmithingTemplate; - mappings[1358] = ItemType.WardArmorTrimSmithingTemplate; - mappings[1359] = ItemType.EyeArmorTrimSmithingTemplate; - mappings[1360] = ItemType.VexArmorTrimSmithingTemplate; - mappings[1361] = ItemType.TideArmorTrimSmithingTemplate; - mappings[1362] = ItemType.SnoutArmorTrimSmithingTemplate; - mappings[1363] = ItemType.RibArmorTrimSmithingTemplate; - mappings[1364] = ItemType.SpireArmorTrimSmithingTemplate; - mappings[1365] = ItemType.WayfinderArmorTrimSmithingTemplate; - mappings[1366] = ItemType.ShaperArmorTrimSmithingTemplate; - mappings[1367] = ItemType.SilenceArmorTrimSmithingTemplate; - mappings[1368] = ItemType.RaiserArmorTrimSmithingTemplate; - mappings[1369] = ItemType.HostArmorTrimSmithingTemplate; - mappings[1370] = ItemType.FlowArmorTrimSmithingTemplate; - mappings[1371] = ItemType.BoltArmorTrimSmithingTemplate; - mappings[1372] = ItemType.AnglerPotterySherd; - mappings[1373] = ItemType.ArcherPotterySherd; - mappings[1374] = ItemType.ArmsUpPotterySherd; - mappings[1375] = ItemType.BladePotterySherd; - mappings[1376] = ItemType.BrewerPotterySherd; - mappings[1377] = ItemType.BurnPotterySherd; - mappings[1378] = ItemType.DangerPotterySherd; - mappings[1379] = ItemType.ExplorerPotterySherd; - mappings[1380] = ItemType.FlowPotterySherd; - mappings[1381] = ItemType.FriendPotterySherd; - mappings[1382] = ItemType.GusterPotterySherd; - mappings[1383] = ItemType.HeartPotterySherd; - mappings[1384] = ItemType.HeartbreakPotterySherd; - mappings[1385] = ItemType.HowlPotterySherd; - mappings[1386] = ItemType.MinerPotterySherd; - mappings[1387] = ItemType.MournerPotterySherd; - mappings[1388] = ItemType.PlentyPotterySherd; - mappings[1389] = ItemType.PrizePotterySherd; - mappings[1390] = ItemType.ScrapePotterySherd; - mappings[1391] = ItemType.SheafPotterySherd; - mappings[1392] = ItemType.ShelterPotterySherd; - mappings[1393] = ItemType.SkullPotterySherd; - mappings[1394] = ItemType.SnortPotterySherd; - mappings[1395] = ItemType.CopperGrate; - mappings[1396] = ItemType.ExposedCopperGrate; - mappings[1397] = ItemType.WeatheredCopperGrate; - mappings[1398] = ItemType.OxidizedCopperGrate; - mappings[1399] = ItemType.WaxedCopperGrate; - mappings[1400] = ItemType.WaxedExposedCopperGrate; - mappings[1401] = ItemType.WaxedWeatheredCopperGrate; - mappings[1402] = ItemType.WaxedOxidizedCopperGrate; - mappings[1403] = ItemType.CopperBulb; - mappings[1404] = ItemType.ExposedCopperBulb; - mappings[1405] = ItemType.WeatheredCopperBulb; - mappings[1406] = ItemType.OxidizedCopperBulb; - mappings[1407] = ItemType.WaxedCopperBulb; - mappings[1408] = ItemType.WaxedExposedCopperBulb; - mappings[1409] = ItemType.WaxedWeatheredCopperBulb; - mappings[1410] = ItemType.WaxedOxidizedCopperBulb; - mappings[1411] = ItemType.TrialSpawner; - mappings[1412] = ItemType.TrialKey; - mappings[1413] = ItemType.OminousTrialKey; - mappings[1414] = ItemType.Vault; - mappings[1415] = ItemType.OminousBottle; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1219.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette1219.cs deleted file mode 100644 index db6985f7b0..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette1219.cs +++ /dev/null @@ -1,1506 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public class ItemPalette1219 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette1219() - { - mappings[0] = ItemType.Air; - mappings[1] = ItemType.Stone; - mappings[2] = ItemType.Granite; - mappings[3] = ItemType.PolishedGranite; - mappings[4] = ItemType.Diorite; - mappings[5] = ItemType.PolishedDiorite; - mappings[6] = ItemType.Andesite; - mappings[7] = ItemType.PolishedAndesite; - mappings[8] = ItemType.Deepslate; - mappings[9] = ItemType.CobbledDeepslate; - mappings[10] = ItemType.PolishedDeepslate; - mappings[11] = ItemType.Calcite; - mappings[12] = ItemType.Tuff; - mappings[13] = ItemType.TuffSlab; - mappings[14] = ItemType.TuffStairs; - mappings[15] = ItemType.TuffWall; - mappings[16] = ItemType.ChiseledTuff; - mappings[17] = ItemType.PolishedTuff; - mappings[18] = ItemType.PolishedTuffSlab; - mappings[19] = ItemType.PolishedTuffStairs; - mappings[20] = ItemType.PolishedTuffWall; - mappings[21] = ItemType.TuffBricks; - mappings[22] = ItemType.TuffBrickSlab; - mappings[23] = ItemType.TuffBrickStairs; - mappings[24] = ItemType.TuffBrickWall; - mappings[25] = ItemType.ChiseledTuffBricks; - mappings[26] = ItemType.DripstoneBlock; - mappings[27] = ItemType.GrassBlock; - mappings[28] = ItemType.Dirt; - mappings[29] = ItemType.CoarseDirt; - mappings[30] = ItemType.Podzol; - mappings[31] = ItemType.RootedDirt; - mappings[32] = ItemType.Mud; - mappings[33] = ItemType.CrimsonNylium; - mappings[34] = ItemType.WarpedNylium; - mappings[35] = ItemType.Cobblestone; - mappings[36] = ItemType.OakPlanks; - mappings[37] = ItemType.SprucePlanks; - mappings[38] = ItemType.BirchPlanks; - mappings[39] = ItemType.JunglePlanks; - mappings[40] = ItemType.AcaciaPlanks; - mappings[41] = ItemType.CherryPlanks; - mappings[42] = ItemType.DarkOakPlanks; - mappings[43] = ItemType.PaleOakPlanks; - mappings[44] = ItemType.MangrovePlanks; - mappings[45] = ItemType.BambooPlanks; - mappings[46] = ItemType.CrimsonPlanks; - mappings[47] = ItemType.WarpedPlanks; - mappings[48] = ItemType.BambooMosaic; - mappings[49] = ItemType.OakSapling; - mappings[50] = ItemType.SpruceSapling; - mappings[51] = ItemType.BirchSapling; - mappings[52] = ItemType.JungleSapling; - mappings[53] = ItemType.AcaciaSapling; - mappings[54] = ItemType.CherrySapling; - mappings[55] = ItemType.DarkOakSapling; - mappings[56] = ItemType.PaleOakSapling; - mappings[57] = ItemType.MangrovePropagule; - mappings[58] = ItemType.Bedrock; - mappings[59] = ItemType.Sand; - mappings[60] = ItemType.SuspiciousSand; - mappings[61] = ItemType.SuspiciousGravel; - mappings[62] = ItemType.RedSand; - mappings[63] = ItemType.Gravel; - mappings[64] = ItemType.CoalOre; - mappings[65] = ItemType.DeepslateCoalOre; - mappings[66] = ItemType.IronOre; - mappings[67] = ItemType.DeepslateIronOre; - mappings[68] = ItemType.CopperOre; - mappings[69] = ItemType.DeepslateCopperOre; - mappings[70] = ItemType.GoldOre; - mappings[71] = ItemType.DeepslateGoldOre; - mappings[72] = ItemType.RedstoneOre; - mappings[73] = ItemType.DeepslateRedstoneOre; - mappings[74] = ItemType.EmeraldOre; - mappings[75] = ItemType.DeepslateEmeraldOre; - mappings[76] = ItemType.LapisOre; - mappings[77] = ItemType.DeepslateLapisOre; - mappings[78] = ItemType.DiamondOre; - mappings[79] = ItemType.DeepslateDiamondOre; - mappings[80] = ItemType.NetherGoldOre; - mappings[81] = ItemType.NetherQuartzOre; - mappings[82] = ItemType.AncientDebris; - mappings[83] = ItemType.CoalBlock; - mappings[84] = ItemType.RawIronBlock; - mappings[85] = ItemType.RawCopperBlock; - mappings[86] = ItemType.RawGoldBlock; - mappings[87] = ItemType.HeavyCore; - mappings[88] = ItemType.AmethystBlock; - mappings[89] = ItemType.BuddingAmethyst; - mappings[90] = ItemType.IronBlock; - mappings[91] = ItemType.CopperBlock; - mappings[92] = ItemType.GoldBlock; - mappings[93] = ItemType.DiamondBlock; - mappings[94] = ItemType.NetheriteBlock; - mappings[95] = ItemType.ExposedCopper; - mappings[96] = ItemType.WeatheredCopper; - mappings[97] = ItemType.OxidizedCopper; - mappings[98] = ItemType.ChiseledCopper; - mappings[99] = ItemType.ExposedChiseledCopper; - mappings[100] = ItemType.WeatheredChiseledCopper; - mappings[101] = ItemType.OxidizedChiseledCopper; - mappings[102] = ItemType.CutCopper; - mappings[103] = ItemType.ExposedCutCopper; - mappings[104] = ItemType.WeatheredCutCopper; - mappings[105] = ItemType.OxidizedCutCopper; - mappings[106] = ItemType.CutCopperStairs; - mappings[107] = ItemType.ExposedCutCopperStairs; - mappings[108] = ItemType.WeatheredCutCopperStairs; - mappings[109] = ItemType.OxidizedCutCopperStairs; - mappings[110] = ItemType.CutCopperSlab; - mappings[111] = ItemType.ExposedCutCopperSlab; - mappings[112] = ItemType.WeatheredCutCopperSlab; - mappings[113] = ItemType.OxidizedCutCopperSlab; - mappings[114] = ItemType.WaxedCopperBlock; - mappings[115] = ItemType.WaxedExposedCopper; - mappings[116] = ItemType.WaxedWeatheredCopper; - mappings[117] = ItemType.WaxedOxidizedCopper; - mappings[118] = ItemType.WaxedChiseledCopper; - mappings[119] = ItemType.WaxedExposedChiseledCopper; - mappings[120] = ItemType.WaxedWeatheredChiseledCopper; - mappings[121] = ItemType.WaxedOxidizedChiseledCopper; - mappings[122] = ItemType.WaxedCutCopper; - mappings[123] = ItemType.WaxedExposedCutCopper; - mappings[124] = ItemType.WaxedWeatheredCutCopper; - mappings[125] = ItemType.WaxedOxidizedCutCopper; - mappings[126] = ItemType.WaxedCutCopperStairs; - mappings[127] = ItemType.WaxedExposedCutCopperStairs; - mappings[128] = ItemType.WaxedWeatheredCutCopperStairs; - mappings[129] = ItemType.WaxedOxidizedCutCopperStairs; - mappings[130] = ItemType.WaxedCutCopperSlab; - mappings[131] = ItemType.WaxedExposedCutCopperSlab; - mappings[132] = ItemType.WaxedWeatheredCutCopperSlab; - mappings[133] = ItemType.WaxedOxidizedCutCopperSlab; - mappings[134] = ItemType.OakLog; - mappings[135] = ItemType.SpruceLog; - mappings[136] = ItemType.BirchLog; - mappings[137] = ItemType.JungleLog; - mappings[138] = ItemType.AcaciaLog; - mappings[139] = ItemType.CherryLog; - mappings[140] = ItemType.PaleOakLog; - mappings[141] = ItemType.DarkOakLog; - mappings[142] = ItemType.MangroveLog; - mappings[143] = ItemType.MangroveRoots; - mappings[144] = ItemType.MuddyMangroveRoots; - mappings[145] = ItemType.CrimsonStem; - mappings[146] = ItemType.WarpedStem; - mappings[147] = ItemType.BambooBlock; - mappings[148] = ItemType.StrippedOakLog; - mappings[149] = ItemType.StrippedSpruceLog; - mappings[150] = ItemType.StrippedBirchLog; - mappings[151] = ItemType.StrippedJungleLog; - mappings[152] = ItemType.StrippedAcaciaLog; - mappings[153] = ItemType.StrippedCherryLog; - mappings[154] = ItemType.StrippedDarkOakLog; - mappings[155] = ItemType.StrippedPaleOakLog; - mappings[156] = ItemType.StrippedMangroveLog; - mappings[157] = ItemType.StrippedCrimsonStem; - mappings[158] = ItemType.StrippedWarpedStem; - mappings[159] = ItemType.StrippedOakWood; - mappings[160] = ItemType.StrippedSpruceWood; - mappings[161] = ItemType.StrippedBirchWood; - mappings[162] = ItemType.StrippedJungleWood; - mappings[163] = ItemType.StrippedAcaciaWood; - mappings[164] = ItemType.StrippedCherryWood; - mappings[165] = ItemType.StrippedDarkOakWood; - mappings[166] = ItemType.StrippedPaleOakWood; - mappings[167] = ItemType.StrippedMangroveWood; - mappings[168] = ItemType.StrippedCrimsonHyphae; - mappings[169] = ItemType.StrippedWarpedHyphae; - mappings[170] = ItemType.StrippedBambooBlock; - mappings[171] = ItemType.OakWood; - mappings[172] = ItemType.SpruceWood; - mappings[173] = ItemType.BirchWood; - mappings[174] = ItemType.JungleWood; - mappings[175] = ItemType.AcaciaWood; - mappings[176] = ItemType.CherryWood; - mappings[177] = ItemType.PaleOakWood; - mappings[178] = ItemType.DarkOakWood; - mappings[179] = ItemType.MangroveWood; - mappings[180] = ItemType.CrimsonHyphae; - mappings[181] = ItemType.WarpedHyphae; - mappings[182] = ItemType.OakLeaves; - mappings[183] = ItemType.SpruceLeaves; - mappings[184] = ItemType.BirchLeaves; - mappings[185] = ItemType.JungleLeaves; - mappings[186] = ItemType.AcaciaLeaves; - mappings[187] = ItemType.CherryLeaves; - mappings[188] = ItemType.DarkOakLeaves; - mappings[189] = ItemType.PaleOakLeaves; - mappings[190] = ItemType.MangroveLeaves; - mappings[191] = ItemType.AzaleaLeaves; - mappings[192] = ItemType.FloweringAzaleaLeaves; - mappings[193] = ItemType.Sponge; - mappings[194] = ItemType.WetSponge; - mappings[195] = ItemType.Glass; - mappings[196] = ItemType.TintedGlass; - mappings[197] = ItemType.LapisBlock; - mappings[198] = ItemType.Sandstone; - mappings[199] = ItemType.ChiseledSandstone; - mappings[200] = ItemType.CutSandstone; - mappings[201] = ItemType.Cobweb; - mappings[202] = ItemType.ShortGrass; - mappings[203] = ItemType.Fern; - mappings[204] = ItemType.Bush; - mappings[205] = ItemType.Azalea; - mappings[206] = ItemType.FloweringAzalea; - mappings[207] = ItemType.DeadBush; - mappings[208] = ItemType.FireflyBush; - mappings[209] = ItemType.ShortDryGrass; - mappings[210] = ItemType.TallDryGrass; - mappings[211] = ItemType.Seagrass; - mappings[212] = ItemType.SeaPickle; - mappings[213] = ItemType.WhiteWool; - mappings[214] = ItemType.OrangeWool; - mappings[215] = ItemType.MagentaWool; - mappings[216] = ItemType.LightBlueWool; - mappings[217] = ItemType.YellowWool; - mappings[218] = ItemType.LimeWool; - mappings[219] = ItemType.PinkWool; - mappings[220] = ItemType.GrayWool; - mappings[221] = ItemType.LightGrayWool; - mappings[222] = ItemType.CyanWool; - mappings[223] = ItemType.PurpleWool; - mappings[224] = ItemType.BlueWool; - mappings[225] = ItemType.BrownWool; - mappings[226] = ItemType.GreenWool; - mappings[227] = ItemType.RedWool; - mappings[228] = ItemType.BlackWool; - mappings[229] = ItemType.Dandelion; - mappings[230] = ItemType.OpenEyeblossom; - mappings[231] = ItemType.ClosedEyeblossom; - mappings[232] = ItemType.Poppy; - mappings[233] = ItemType.BlueOrchid; - mappings[234] = ItemType.Allium; - mappings[235] = ItemType.AzureBluet; - mappings[236] = ItemType.RedTulip; - mappings[237] = ItemType.OrangeTulip; - mappings[238] = ItemType.WhiteTulip; - mappings[239] = ItemType.PinkTulip; - mappings[240] = ItemType.OxeyeDaisy; - mappings[241] = ItemType.Cornflower; - mappings[242] = ItemType.LilyOfTheValley; - mappings[243] = ItemType.WitherRose; - mappings[244] = ItemType.Torchflower; - mappings[245] = ItemType.PitcherPlant; - mappings[246] = ItemType.SporeBlossom; - mappings[247] = ItemType.BrownMushroom; - mappings[248] = ItemType.RedMushroom; - mappings[249] = ItemType.CrimsonFungus; - mappings[250] = ItemType.WarpedFungus; - mappings[251] = ItemType.CrimsonRoots; - mappings[252] = ItemType.WarpedRoots; - mappings[253] = ItemType.NetherSprouts; - mappings[254] = ItemType.WeepingVines; - mappings[255] = ItemType.TwistingVines; - mappings[256] = ItemType.SugarCane; - mappings[257] = ItemType.Kelp; - mappings[258] = ItemType.PinkPetals; - mappings[259] = ItemType.Wildflowers; - mappings[260] = ItemType.LeafLitter; - mappings[261] = ItemType.MossCarpet; - mappings[262] = ItemType.MossBlock; - mappings[263] = ItemType.PaleMossCarpet; - mappings[264] = ItemType.PaleHangingMoss; - mappings[265] = ItemType.PaleMossBlock; - mappings[266] = ItemType.HangingRoots; - mappings[267] = ItemType.BigDripleaf; - mappings[268] = ItemType.SmallDripleaf; - mappings[269] = ItemType.Bamboo; - mappings[270] = ItemType.OakSlab; - mappings[271] = ItemType.SpruceSlab; - mappings[272] = ItemType.BirchSlab; - mappings[273] = ItemType.JungleSlab; - mappings[274] = ItemType.AcaciaSlab; - mappings[275] = ItemType.CherrySlab; - mappings[276] = ItemType.DarkOakSlab; - mappings[277] = ItemType.PaleOakSlab; - mappings[278] = ItemType.MangroveSlab; - mappings[279] = ItemType.BambooSlab; - mappings[280] = ItemType.BambooMosaicSlab; - mappings[281] = ItemType.CrimsonSlab; - mappings[282] = ItemType.WarpedSlab; - mappings[283] = ItemType.StoneSlab; - mappings[284] = ItemType.SmoothStoneSlab; - mappings[285] = ItemType.SandstoneSlab; - mappings[286] = ItemType.CutSandstoneSlab; - mappings[287] = ItemType.PetrifiedOakSlab; - mappings[288] = ItemType.CobblestoneSlab; - mappings[289] = ItemType.BrickSlab; - mappings[290] = ItemType.StoneBrickSlab; - mappings[291] = ItemType.MudBrickSlab; - mappings[292] = ItemType.NetherBrickSlab; - mappings[293] = ItemType.QuartzSlab; - mappings[294] = ItemType.RedSandstoneSlab; - mappings[295] = ItemType.CutRedSandstoneSlab; - mappings[296] = ItemType.PurpurSlab; - mappings[297] = ItemType.PrismarineSlab; - mappings[298] = ItemType.PrismarineBrickSlab; - mappings[299] = ItemType.DarkPrismarineSlab; - mappings[300] = ItemType.SmoothQuartz; - mappings[301] = ItemType.SmoothRedSandstone; - mappings[302] = ItemType.SmoothSandstone; - mappings[303] = ItemType.SmoothStone; - mappings[304] = ItemType.Bricks; - mappings[305] = ItemType.AcaciaShelf; - mappings[306] = ItemType.BambooShelf; - mappings[307] = ItemType.BirchShelf; - mappings[308] = ItemType.CherryShelf; - mappings[309] = ItemType.CrimsonShelf; - mappings[310] = ItemType.DarkOakShelf; - mappings[311] = ItemType.JungleShelf; - mappings[312] = ItemType.MangroveShelf; - mappings[313] = ItemType.OakShelf; - mappings[314] = ItemType.PaleOakShelf; - mappings[315] = ItemType.SpruceShelf; - mappings[316] = ItemType.WarpedShelf; - mappings[317] = ItemType.Bookshelf; - mappings[318] = ItemType.ChiseledBookshelf; - mappings[319] = ItemType.DecoratedPot; - mappings[320] = ItemType.MossyCobblestone; - mappings[321] = ItemType.Obsidian; - mappings[322] = ItemType.Torch; - mappings[323] = ItemType.EndRod; - mappings[324] = ItemType.ChorusPlant; - mappings[325] = ItemType.ChorusFlower; - mappings[326] = ItemType.PurpurBlock; - mappings[327] = ItemType.PurpurPillar; - mappings[328] = ItemType.PurpurStairs; - mappings[329] = ItemType.Spawner; - mappings[330] = ItemType.CreakingHeart; - mappings[331] = ItemType.Chest; - mappings[332] = ItemType.CraftingTable; - mappings[333] = ItemType.Farmland; - mappings[334] = ItemType.Furnace; - mappings[335] = ItemType.Ladder; - mappings[336] = ItemType.CobblestoneStairs; - mappings[337] = ItemType.Snow; - mappings[338] = ItemType.Ice; - mappings[339] = ItemType.SnowBlock; - mappings[340] = ItemType.Cactus; - mappings[341] = ItemType.CactusFlower; - mappings[342] = ItemType.Clay; - mappings[343] = ItemType.Jukebox; - mappings[344] = ItemType.OakFence; - mappings[345] = ItemType.SpruceFence; - mappings[346] = ItemType.BirchFence; - mappings[347] = ItemType.JungleFence; - mappings[348] = ItemType.AcaciaFence; - mappings[349] = ItemType.CherryFence; - mappings[350] = ItemType.DarkOakFence; - mappings[351] = ItemType.PaleOakFence; - mappings[352] = ItemType.MangroveFence; - mappings[353] = ItemType.BambooFence; - mappings[354] = ItemType.CrimsonFence; - mappings[355] = ItemType.WarpedFence; - mappings[356] = ItemType.Pumpkin; - mappings[357] = ItemType.CarvedPumpkin; - mappings[358] = ItemType.JackOLantern; - mappings[359] = ItemType.Netherrack; - mappings[360] = ItemType.SoulSand; - mappings[361] = ItemType.SoulSoil; - mappings[362] = ItemType.Basalt; - mappings[363] = ItemType.PolishedBasalt; - mappings[364] = ItemType.SmoothBasalt; - mappings[365] = ItemType.SoulTorch; - mappings[366] = ItemType.CopperTorch; - mappings[367] = ItemType.Glowstone; - mappings[368] = ItemType.InfestedStone; - mappings[369] = ItemType.InfestedCobblestone; - mappings[370] = ItemType.InfestedStoneBricks; - mappings[371] = ItemType.InfestedMossyStoneBricks; - mappings[372] = ItemType.InfestedCrackedStoneBricks; - mappings[373] = ItemType.InfestedChiseledStoneBricks; - mappings[374] = ItemType.InfestedDeepslate; - mappings[375] = ItemType.StoneBricks; - mappings[376] = ItemType.MossyStoneBricks; - mappings[377] = ItemType.CrackedStoneBricks; - mappings[378] = ItemType.ChiseledStoneBricks; - mappings[379] = ItemType.PackedMud; - mappings[380] = ItemType.MudBricks; - mappings[381] = ItemType.DeepslateBricks; - mappings[382] = ItemType.CrackedDeepslateBricks; - mappings[383] = ItemType.DeepslateTiles; - mappings[384] = ItemType.CrackedDeepslateTiles; - mappings[385] = ItemType.ChiseledDeepslate; - mappings[386] = ItemType.ReinforcedDeepslate; - mappings[387] = ItemType.BrownMushroomBlock; - mappings[388] = ItemType.RedMushroomBlock; - mappings[389] = ItemType.MushroomStem; - mappings[390] = ItemType.IronBars; - mappings[391] = ItemType.CopperBars; - mappings[392] = ItemType.ExposedCopperBars; - mappings[393] = ItemType.WeatheredCopperBars; - mappings[394] = ItemType.OxidizedCopperBars; - mappings[395] = ItemType.WaxedCopperBars; - mappings[396] = ItemType.WaxedExposedCopperBars; - mappings[397] = ItemType.WaxedWeatheredCopperBars; - mappings[398] = ItemType.WaxedOxidizedCopperBars; - mappings[399] = ItemType.IronChain; - mappings[400] = ItemType.CopperChain; - mappings[401] = ItemType.ExposedCopperChain; - mappings[402] = ItemType.WeatheredCopperChain; - mappings[403] = ItemType.OxidizedCopperChain; - mappings[404] = ItemType.WaxedCopperChain; - mappings[405] = ItemType.WaxedExposedCopperChain; - mappings[406] = ItemType.WaxedWeatheredCopperChain; - mappings[407] = ItemType.WaxedOxidizedCopperChain; - mappings[408] = ItemType.GlassPane; - mappings[409] = ItemType.Melon; - mappings[410] = ItemType.Vine; - mappings[411] = ItemType.GlowLichen; - mappings[412] = ItemType.ResinClump; - mappings[413] = ItemType.ResinBlock; - mappings[414] = ItemType.ResinBricks; - mappings[415] = ItemType.ResinBrickStairs; - mappings[416] = ItemType.ResinBrickSlab; - mappings[417] = ItemType.ResinBrickWall; - mappings[418] = ItemType.ChiseledResinBricks; - mappings[419] = ItemType.BrickStairs; - mappings[420] = ItemType.StoneBrickStairs; - mappings[421] = ItemType.MudBrickStairs; - mappings[422] = ItemType.Mycelium; - mappings[423] = ItemType.LilyPad; - mappings[424] = ItemType.NetherBricks; - mappings[425] = ItemType.CrackedNetherBricks; - mappings[426] = ItemType.ChiseledNetherBricks; - mappings[427] = ItemType.NetherBrickFence; - mappings[428] = ItemType.NetherBrickStairs; - mappings[429] = ItemType.Sculk; - mappings[430] = ItemType.SculkVein; - mappings[431] = ItemType.SculkCatalyst; - mappings[432] = ItemType.SculkShrieker; - mappings[433] = ItemType.EnchantingTable; - mappings[434] = ItemType.EndPortalFrame; - mappings[435] = ItemType.EndStone; - mappings[436] = ItemType.EndStoneBricks; - mappings[437] = ItemType.DragonEgg; - mappings[438] = ItemType.SandstoneStairs; - mappings[439] = ItemType.EnderChest; - mappings[440] = ItemType.EmeraldBlock; - mappings[441] = ItemType.OakStairs; - mappings[442] = ItemType.SpruceStairs; - mappings[443] = ItemType.BirchStairs; - mappings[444] = ItemType.JungleStairs; - mappings[445] = ItemType.AcaciaStairs; - mappings[446] = ItemType.CherryStairs; - mappings[447] = ItemType.DarkOakStairs; - mappings[448] = ItemType.PaleOakStairs; - mappings[449] = ItemType.MangroveStairs; - mappings[450] = ItemType.BambooStairs; - mappings[451] = ItemType.BambooMosaicStairs; - mappings[452] = ItemType.CrimsonStairs; - mappings[453] = ItemType.WarpedStairs; - mappings[454] = ItemType.CommandBlock; - mappings[455] = ItemType.Beacon; - mappings[456] = ItemType.CobblestoneWall; - mappings[457] = ItemType.MossyCobblestoneWall; - mappings[458] = ItemType.BrickWall; - mappings[459] = ItemType.PrismarineWall; - mappings[460] = ItemType.RedSandstoneWall; - mappings[461] = ItemType.MossyStoneBrickWall; - mappings[462] = ItemType.GraniteWall; - mappings[463] = ItemType.StoneBrickWall; - mappings[464] = ItemType.MudBrickWall; - mappings[465] = ItemType.NetherBrickWall; - mappings[466] = ItemType.AndesiteWall; - mappings[467] = ItemType.RedNetherBrickWall; - mappings[468] = ItemType.SandstoneWall; - mappings[469] = ItemType.EndStoneBrickWall; - mappings[470] = ItemType.DioriteWall; - mappings[471] = ItemType.BlackstoneWall; - mappings[472] = ItemType.PolishedBlackstoneWall; - mappings[473] = ItemType.PolishedBlackstoneBrickWall; - mappings[474] = ItemType.CobbledDeepslateWall; - mappings[475] = ItemType.PolishedDeepslateWall; - mappings[476] = ItemType.DeepslateBrickWall; - mappings[477] = ItemType.DeepslateTileWall; - mappings[478] = ItemType.Anvil; - mappings[479] = ItemType.ChippedAnvil; - mappings[480] = ItemType.DamagedAnvil; - mappings[481] = ItemType.ChiseledQuartzBlock; - mappings[482] = ItemType.QuartzBlock; - mappings[483] = ItemType.QuartzBricks; - mappings[484] = ItemType.QuartzPillar; - mappings[485] = ItemType.QuartzStairs; - mappings[486] = ItemType.WhiteTerracotta; - mappings[487] = ItemType.OrangeTerracotta; - mappings[488] = ItemType.MagentaTerracotta; - mappings[489] = ItemType.LightBlueTerracotta; - mappings[490] = ItemType.YellowTerracotta; - mappings[491] = ItemType.LimeTerracotta; - mappings[492] = ItemType.PinkTerracotta; - mappings[493] = ItemType.GrayTerracotta; - mappings[494] = ItemType.LightGrayTerracotta; - mappings[495] = ItemType.CyanTerracotta; - mappings[496] = ItemType.PurpleTerracotta; - mappings[497] = ItemType.BlueTerracotta; - mappings[498] = ItemType.BrownTerracotta; - mappings[499] = ItemType.GreenTerracotta; - mappings[500] = ItemType.RedTerracotta; - mappings[501] = ItemType.BlackTerracotta; - mappings[502] = ItemType.Barrier; - mappings[503] = ItemType.Light; - mappings[504] = ItemType.HayBlock; - mappings[505] = ItemType.WhiteCarpet; - mappings[506] = ItemType.OrangeCarpet; - mappings[507] = ItemType.MagentaCarpet; - mappings[508] = ItemType.LightBlueCarpet; - mappings[509] = ItemType.YellowCarpet; - mappings[510] = ItemType.LimeCarpet; - mappings[511] = ItemType.PinkCarpet; - mappings[512] = ItemType.GrayCarpet; - mappings[513] = ItemType.LightGrayCarpet; - mappings[514] = ItemType.CyanCarpet; - mappings[515] = ItemType.PurpleCarpet; - mappings[516] = ItemType.BlueCarpet; - mappings[517] = ItemType.BrownCarpet; - mappings[518] = ItemType.GreenCarpet; - mappings[519] = ItemType.RedCarpet; - mappings[520] = ItemType.BlackCarpet; - mappings[521] = ItemType.Terracotta; - mappings[522] = ItemType.PackedIce; - mappings[523] = ItemType.DirtPath; - mappings[524] = ItemType.Sunflower; - mappings[525] = ItemType.Lilac; - mappings[526] = ItemType.RoseBush; - mappings[527] = ItemType.Peony; - mappings[528] = ItemType.TallGrass; - mappings[529] = ItemType.LargeFern; - mappings[530] = ItemType.WhiteStainedGlass; - mappings[531] = ItemType.OrangeStainedGlass; - mappings[532] = ItemType.MagentaStainedGlass; - mappings[533] = ItemType.LightBlueStainedGlass; - mappings[534] = ItemType.YellowStainedGlass; - mappings[535] = ItemType.LimeStainedGlass; - mappings[536] = ItemType.PinkStainedGlass; - mappings[537] = ItemType.GrayStainedGlass; - mappings[538] = ItemType.LightGrayStainedGlass; - mappings[539] = ItemType.CyanStainedGlass; - mappings[540] = ItemType.PurpleStainedGlass; - mappings[541] = ItemType.BlueStainedGlass; - mappings[542] = ItemType.BrownStainedGlass; - mappings[543] = ItemType.GreenStainedGlass; - mappings[544] = ItemType.RedStainedGlass; - mappings[545] = ItemType.BlackStainedGlass; - mappings[546] = ItemType.WhiteStainedGlassPane; - mappings[547] = ItemType.OrangeStainedGlassPane; - mappings[548] = ItemType.MagentaStainedGlassPane; - mappings[549] = ItemType.LightBlueStainedGlassPane; - mappings[550] = ItemType.YellowStainedGlassPane; - mappings[551] = ItemType.LimeStainedGlassPane; - mappings[552] = ItemType.PinkStainedGlassPane; - mappings[553] = ItemType.GrayStainedGlassPane; - mappings[554] = ItemType.LightGrayStainedGlassPane; - mappings[555] = ItemType.CyanStainedGlassPane; - mappings[556] = ItemType.PurpleStainedGlassPane; - mappings[557] = ItemType.BlueStainedGlassPane; - mappings[558] = ItemType.BrownStainedGlassPane; - mappings[559] = ItemType.GreenStainedGlassPane; - mappings[560] = ItemType.RedStainedGlassPane; - mappings[561] = ItemType.BlackStainedGlassPane; - mappings[562] = ItemType.Prismarine; - mappings[563] = ItemType.PrismarineBricks; - mappings[564] = ItemType.DarkPrismarine; - mappings[565] = ItemType.PrismarineStairs; - mappings[566] = ItemType.PrismarineBrickStairs; - mappings[567] = ItemType.DarkPrismarineStairs; - mappings[568] = ItemType.SeaLantern; - mappings[569] = ItemType.RedSandstone; - mappings[570] = ItemType.ChiseledRedSandstone; - mappings[571] = ItemType.CutRedSandstone; - mappings[572] = ItemType.RedSandstoneStairs; - mappings[573] = ItemType.RepeatingCommandBlock; - mappings[574] = ItemType.ChainCommandBlock; - mappings[575] = ItemType.MagmaBlock; - mappings[576] = ItemType.NetherWartBlock; - mappings[577] = ItemType.WarpedWartBlock; - mappings[578] = ItemType.RedNetherBricks; - mappings[579] = ItemType.BoneBlock; - mappings[580] = ItemType.StructureVoid; - mappings[581] = ItemType.ShulkerBox; - mappings[582] = ItemType.WhiteShulkerBox; - mappings[583] = ItemType.OrangeShulkerBox; - mappings[584] = ItemType.MagentaShulkerBox; - mappings[585] = ItemType.LightBlueShulkerBox; - mappings[586] = ItemType.YellowShulkerBox; - mappings[587] = ItemType.LimeShulkerBox; - mappings[588] = ItemType.PinkShulkerBox; - mappings[589] = ItemType.GrayShulkerBox; - mappings[590] = ItemType.LightGrayShulkerBox; - mappings[591] = ItemType.CyanShulkerBox; - mappings[592] = ItemType.PurpleShulkerBox; - mappings[593] = ItemType.BlueShulkerBox; - mappings[594] = ItemType.BrownShulkerBox; - mappings[595] = ItemType.GreenShulkerBox; - mappings[596] = ItemType.RedShulkerBox; - mappings[597] = ItemType.BlackShulkerBox; - mappings[598] = ItemType.WhiteGlazedTerracotta; - mappings[599] = ItemType.OrangeGlazedTerracotta; - mappings[600] = ItemType.MagentaGlazedTerracotta; - mappings[601] = ItemType.LightBlueGlazedTerracotta; - mappings[602] = ItemType.YellowGlazedTerracotta; - mappings[603] = ItemType.LimeGlazedTerracotta; - mappings[604] = ItemType.PinkGlazedTerracotta; - mappings[605] = ItemType.GrayGlazedTerracotta; - mappings[606] = ItemType.LightGrayGlazedTerracotta; - mappings[607] = ItemType.CyanGlazedTerracotta; - mappings[608] = ItemType.PurpleGlazedTerracotta; - mappings[609] = ItemType.BlueGlazedTerracotta; - mappings[610] = ItemType.BrownGlazedTerracotta; - mappings[611] = ItemType.GreenGlazedTerracotta; - mappings[612] = ItemType.RedGlazedTerracotta; - mappings[613] = ItemType.BlackGlazedTerracotta; - mappings[614] = ItemType.WhiteConcrete; - mappings[615] = ItemType.OrangeConcrete; - mappings[616] = ItemType.MagentaConcrete; - mappings[617] = ItemType.LightBlueConcrete; - mappings[618] = ItemType.YellowConcrete; - mappings[619] = ItemType.LimeConcrete; - mappings[620] = ItemType.PinkConcrete; - mappings[621] = ItemType.GrayConcrete; - mappings[622] = ItemType.LightGrayConcrete; - mappings[623] = ItemType.CyanConcrete; - mappings[624] = ItemType.PurpleConcrete; - mappings[625] = ItemType.BlueConcrete; - mappings[626] = ItemType.BrownConcrete; - mappings[627] = ItemType.GreenConcrete; - mappings[628] = ItemType.RedConcrete; - mappings[629] = ItemType.BlackConcrete; - mappings[630] = ItemType.WhiteConcretePowder; - mappings[631] = ItemType.OrangeConcretePowder; - mappings[632] = ItemType.MagentaConcretePowder; - mappings[633] = ItemType.LightBlueConcretePowder; - mappings[634] = ItemType.YellowConcretePowder; - mappings[635] = ItemType.LimeConcretePowder; - mappings[636] = ItemType.PinkConcretePowder; - mappings[637] = ItemType.GrayConcretePowder; - mappings[638] = ItemType.LightGrayConcretePowder; - mappings[639] = ItemType.CyanConcretePowder; - mappings[640] = ItemType.PurpleConcretePowder; - mappings[641] = ItemType.BlueConcretePowder; - mappings[642] = ItemType.BrownConcretePowder; - mappings[643] = ItemType.GreenConcretePowder; - mappings[644] = ItemType.RedConcretePowder; - mappings[645] = ItemType.BlackConcretePowder; - mappings[646] = ItemType.TurtleEgg; - mappings[647] = ItemType.SnifferEgg; - mappings[648] = ItemType.DriedGhast; - mappings[649] = ItemType.DeadTubeCoralBlock; - mappings[650] = ItemType.DeadBrainCoralBlock; - mappings[651] = ItemType.DeadBubbleCoralBlock; - mappings[652] = ItemType.DeadFireCoralBlock; - mappings[653] = ItemType.DeadHornCoralBlock; - mappings[654] = ItemType.TubeCoralBlock; - mappings[655] = ItemType.BrainCoralBlock; - mappings[656] = ItemType.BubbleCoralBlock; - mappings[657] = ItemType.FireCoralBlock; - mappings[658] = ItemType.HornCoralBlock; - mappings[659] = ItemType.TubeCoral; - mappings[660] = ItemType.BrainCoral; - mappings[661] = ItemType.BubbleCoral; - mappings[662] = ItemType.FireCoral; - mappings[663] = ItemType.HornCoral; - mappings[664] = ItemType.DeadBrainCoral; - mappings[665] = ItemType.DeadBubbleCoral; - mappings[666] = ItemType.DeadFireCoral; - mappings[667] = ItemType.DeadHornCoral; - mappings[668] = ItemType.DeadTubeCoral; - mappings[669] = ItemType.TubeCoralFan; - mappings[670] = ItemType.BrainCoralFan; - mappings[671] = ItemType.BubbleCoralFan; - mappings[672] = ItemType.FireCoralFan; - mappings[673] = ItemType.HornCoralFan; - mappings[674] = ItemType.DeadTubeCoralFan; - mappings[675] = ItemType.DeadBrainCoralFan; - mappings[676] = ItemType.DeadBubbleCoralFan; - mappings[677] = ItemType.DeadFireCoralFan; - mappings[678] = ItemType.DeadHornCoralFan; - mappings[679] = ItemType.BlueIce; - mappings[680] = ItemType.Conduit; - mappings[681] = ItemType.PolishedGraniteStairs; - mappings[682] = ItemType.SmoothRedSandstoneStairs; - mappings[683] = ItemType.MossyStoneBrickStairs; - mappings[684] = ItemType.PolishedDioriteStairs; - mappings[685] = ItemType.MossyCobblestoneStairs; - mappings[686] = ItemType.EndStoneBrickStairs; - mappings[687] = ItemType.StoneStairs; - mappings[688] = ItemType.SmoothSandstoneStairs; - mappings[689] = ItemType.SmoothQuartzStairs; - mappings[690] = ItemType.GraniteStairs; - mappings[691] = ItemType.AndesiteStairs; - mappings[692] = ItemType.RedNetherBrickStairs; - mappings[693] = ItemType.PolishedAndesiteStairs; - mappings[694] = ItemType.DioriteStairs; - mappings[695] = ItemType.CobbledDeepslateStairs; - mappings[696] = ItemType.PolishedDeepslateStairs; - mappings[697] = ItemType.DeepslateBrickStairs; - mappings[698] = ItemType.DeepslateTileStairs; - mappings[699] = ItemType.PolishedGraniteSlab; - mappings[700] = ItemType.SmoothRedSandstoneSlab; - mappings[701] = ItemType.MossyStoneBrickSlab; - mappings[702] = ItemType.PolishedDioriteSlab; - mappings[703] = ItemType.MossyCobblestoneSlab; - mappings[704] = ItemType.EndStoneBrickSlab; - mappings[705] = ItemType.SmoothSandstoneSlab; - mappings[706] = ItemType.SmoothQuartzSlab; - mappings[707] = ItemType.GraniteSlab; - mappings[708] = ItemType.AndesiteSlab; - mappings[709] = ItemType.RedNetherBrickSlab; - mappings[710] = ItemType.PolishedAndesiteSlab; - mappings[711] = ItemType.DioriteSlab; - mappings[712] = ItemType.CobbledDeepslateSlab; - mappings[713] = ItemType.PolishedDeepslateSlab; - mappings[714] = ItemType.DeepslateBrickSlab; - mappings[715] = ItemType.DeepslateTileSlab; - mappings[716] = ItemType.Scaffolding; - mappings[717] = ItemType.Redstone; - mappings[718] = ItemType.RedstoneTorch; - mappings[719] = ItemType.RedstoneBlock; - mappings[720] = ItemType.Repeater; - mappings[721] = ItemType.Comparator; - mappings[722] = ItemType.Piston; - mappings[723] = ItemType.StickyPiston; - mappings[724] = ItemType.SlimeBlock; - mappings[725] = ItemType.HoneyBlock; - mappings[726] = ItemType.Observer; - mappings[727] = ItemType.Hopper; - mappings[728] = ItemType.Dispenser; - mappings[729] = ItemType.Dropper; - mappings[730] = ItemType.Lectern; - mappings[731] = ItemType.Target; - mappings[732] = ItemType.Lever; - mappings[733] = ItemType.LightningRod; - mappings[734] = ItemType.ExposedLightningRod; - mappings[735] = ItemType.WeatheredLightningRod; - mappings[736] = ItemType.OxidizedLightningRod; - mappings[737] = ItemType.WaxedLightningRod; - mappings[738] = ItemType.WaxedExposedLightningRod; - mappings[739] = ItemType.WaxedWeatheredLightningRod; - mappings[740] = ItemType.WaxedOxidizedLightningRod; - mappings[741] = ItemType.DaylightDetector; - mappings[742] = ItemType.SculkSensor; - mappings[743] = ItemType.CalibratedSculkSensor; - mappings[744] = ItemType.TripwireHook; - mappings[745] = ItemType.TrappedChest; - mappings[746] = ItemType.Tnt; - mappings[747] = ItemType.RedstoneLamp; - mappings[748] = ItemType.NoteBlock; - mappings[749] = ItemType.StoneButton; - mappings[750] = ItemType.PolishedBlackstoneButton; - mappings[751] = ItemType.OakButton; - mappings[752] = ItemType.SpruceButton; - mappings[753] = ItemType.BirchButton; - mappings[754] = ItemType.JungleButton; - mappings[755] = ItemType.AcaciaButton; - mappings[756] = ItemType.CherryButton; - mappings[757] = ItemType.DarkOakButton; - mappings[758] = ItemType.PaleOakButton; - mappings[759] = ItemType.MangroveButton; - mappings[760] = ItemType.BambooButton; - mappings[761] = ItemType.CrimsonButton; - mappings[762] = ItemType.WarpedButton; - mappings[763] = ItemType.StonePressurePlate; - mappings[764] = ItemType.PolishedBlackstonePressurePlate; - mappings[765] = ItemType.LightWeightedPressurePlate; - mappings[766] = ItemType.HeavyWeightedPressurePlate; - mappings[767] = ItemType.OakPressurePlate; - mappings[768] = ItemType.SprucePressurePlate; - mappings[769] = ItemType.BirchPressurePlate; - mappings[770] = ItemType.JunglePressurePlate; - mappings[771] = ItemType.AcaciaPressurePlate; - mappings[772] = ItemType.CherryPressurePlate; - mappings[773] = ItemType.DarkOakPressurePlate; - mappings[774] = ItemType.PaleOakPressurePlate; - mappings[775] = ItemType.MangrovePressurePlate; - mappings[776] = ItemType.BambooPressurePlate; - mappings[777] = ItemType.CrimsonPressurePlate; - mappings[778] = ItemType.WarpedPressurePlate; - mappings[779] = ItemType.IronDoor; - mappings[780] = ItemType.OakDoor; - mappings[781] = ItemType.SpruceDoor; - mappings[782] = ItemType.BirchDoor; - mappings[783] = ItemType.JungleDoor; - mappings[784] = ItemType.AcaciaDoor; - mappings[785] = ItemType.CherryDoor; - mappings[786] = ItemType.DarkOakDoor; - mappings[787] = ItemType.PaleOakDoor; - mappings[788] = ItemType.MangroveDoor; - mappings[789] = ItemType.BambooDoor; - mappings[790] = ItemType.CrimsonDoor; - mappings[791] = ItemType.WarpedDoor; - mappings[792] = ItemType.CopperDoor; - mappings[793] = ItemType.ExposedCopperDoor; - mappings[794] = ItemType.WeatheredCopperDoor; - mappings[795] = ItemType.OxidizedCopperDoor; - mappings[796] = ItemType.WaxedCopperDoor; - mappings[797] = ItemType.WaxedExposedCopperDoor; - mappings[798] = ItemType.WaxedWeatheredCopperDoor; - mappings[799] = ItemType.WaxedOxidizedCopperDoor; - mappings[800] = ItemType.IronTrapdoor; - mappings[801] = ItemType.OakTrapdoor; - mappings[802] = ItemType.SpruceTrapdoor; - mappings[803] = ItemType.BirchTrapdoor; - mappings[804] = ItemType.JungleTrapdoor; - mappings[805] = ItemType.AcaciaTrapdoor; - mappings[806] = ItemType.CherryTrapdoor; - mappings[807] = ItemType.DarkOakTrapdoor; - mappings[808] = ItemType.PaleOakTrapdoor; - mappings[809] = ItemType.MangroveTrapdoor; - mappings[810] = ItemType.BambooTrapdoor; - mappings[811] = ItemType.CrimsonTrapdoor; - mappings[812] = ItemType.WarpedTrapdoor; - mappings[813] = ItemType.CopperTrapdoor; - mappings[814] = ItemType.ExposedCopperTrapdoor; - mappings[815] = ItemType.WeatheredCopperTrapdoor; - mappings[816] = ItemType.OxidizedCopperTrapdoor; - mappings[817] = ItemType.WaxedCopperTrapdoor; - mappings[818] = ItemType.WaxedExposedCopperTrapdoor; - mappings[819] = ItemType.WaxedWeatheredCopperTrapdoor; - mappings[820] = ItemType.WaxedOxidizedCopperTrapdoor; - mappings[821] = ItemType.OakFenceGate; - mappings[822] = ItemType.SpruceFenceGate; - mappings[823] = ItemType.BirchFenceGate; - mappings[824] = ItemType.JungleFenceGate; - mappings[825] = ItemType.AcaciaFenceGate; - mappings[826] = ItemType.CherryFenceGate; - mappings[827] = ItemType.DarkOakFenceGate; - mappings[828] = ItemType.PaleOakFenceGate; - mappings[829] = ItemType.MangroveFenceGate; - mappings[830] = ItemType.BambooFenceGate; - mappings[831] = ItemType.CrimsonFenceGate; - mappings[832] = ItemType.WarpedFenceGate; - mappings[833] = ItemType.PoweredRail; - mappings[834] = ItemType.DetectorRail; - mappings[835] = ItemType.Rail; - mappings[836] = ItemType.ActivatorRail; - mappings[837] = ItemType.Saddle; - mappings[838] = ItemType.WhiteHarness; - mappings[839] = ItemType.OrangeHarness; - mappings[840] = ItemType.MagentaHarness; - mappings[841] = ItemType.LightBlueHarness; - mappings[842] = ItemType.YellowHarness; - mappings[843] = ItemType.LimeHarness; - mappings[844] = ItemType.PinkHarness; - mappings[845] = ItemType.GrayHarness; - mappings[846] = ItemType.LightGrayHarness; - mappings[847] = ItemType.CyanHarness; - mappings[848] = ItemType.PurpleHarness; - mappings[849] = ItemType.BlueHarness; - mappings[850] = ItemType.BrownHarness; - mappings[851] = ItemType.GreenHarness; - mappings[852] = ItemType.RedHarness; - mappings[853] = ItemType.BlackHarness; - mappings[854] = ItemType.Minecart; - mappings[855] = ItemType.ChestMinecart; - mappings[856] = ItemType.FurnaceMinecart; - mappings[857] = ItemType.TntMinecart; - mappings[858] = ItemType.HopperMinecart; - mappings[859] = ItemType.CarrotOnAStick; - mappings[860] = ItemType.WarpedFungusOnAStick; - mappings[861] = ItemType.PhantomMembrane; - mappings[862] = ItemType.Elytra; - mappings[863] = ItemType.OakBoat; - mappings[864] = ItemType.OakChestBoat; - mappings[865] = ItemType.SpruceBoat; - mappings[866] = ItemType.SpruceChestBoat; - mappings[867] = ItemType.BirchBoat; - mappings[868] = ItemType.BirchChestBoat; - mappings[869] = ItemType.JungleBoat; - mappings[870] = ItemType.JungleChestBoat; - mappings[871] = ItemType.AcaciaBoat; - mappings[872] = ItemType.AcaciaChestBoat; - mappings[873] = ItemType.CherryBoat; - mappings[874] = ItemType.CherryChestBoat; - mappings[875] = ItemType.DarkOakBoat; - mappings[876] = ItemType.DarkOakChestBoat; - mappings[877] = ItemType.PaleOakBoat; - mappings[878] = ItemType.PaleOakChestBoat; - mappings[879] = ItemType.MangroveBoat; - mappings[880] = ItemType.MangroveChestBoat; - mappings[881] = ItemType.BambooRaft; - mappings[882] = ItemType.BambooChestRaft; - mappings[883] = ItemType.StructureBlock; - mappings[884] = ItemType.Jigsaw; - mappings[885] = ItemType.TestBlock; - mappings[886] = ItemType.TestInstanceBlock; - mappings[887] = ItemType.TurtleHelmet; - mappings[888] = ItemType.TurtleScute; - mappings[889] = ItemType.ArmadilloScute; - mappings[890] = ItemType.WolfArmor; - mappings[891] = ItemType.FlintAndSteel; - mappings[892] = ItemType.Bowl; - mappings[893] = ItemType.Apple; - mappings[894] = ItemType.Bow; - mappings[895] = ItemType.Arrow; - mappings[896] = ItemType.Coal; - mappings[897] = ItemType.Charcoal; - mappings[898] = ItemType.Diamond; - mappings[899] = ItemType.Emerald; - mappings[900] = ItemType.LapisLazuli; - mappings[901] = ItemType.Quartz; - mappings[902] = ItemType.AmethystShard; - mappings[903] = ItemType.RawIron; - mappings[904] = ItemType.IronIngot; - mappings[905] = ItemType.RawCopper; - mappings[906] = ItemType.CopperIngot; - mappings[907] = ItemType.RawGold; - mappings[908] = ItemType.GoldIngot; - mappings[909] = ItemType.NetheriteIngot; - mappings[910] = ItemType.NetheriteScrap; - mappings[911] = ItemType.WoodenSword; - mappings[912] = ItemType.WoodenShovel; - mappings[913] = ItemType.WoodenPickaxe; - mappings[914] = ItemType.WoodenAxe; - mappings[915] = ItemType.WoodenHoe; - mappings[916] = ItemType.CopperSword; - mappings[917] = ItemType.CopperShovel; - mappings[918] = ItemType.CopperPickaxe; - mappings[919] = ItemType.CopperAxe; - mappings[920] = ItemType.CopperHoe; - mappings[921] = ItemType.StoneSword; - mappings[922] = ItemType.StoneShovel; - mappings[923] = ItemType.StonePickaxe; - mappings[924] = ItemType.StoneAxe; - mappings[925] = ItemType.StoneHoe; - mappings[926] = ItemType.GoldenSword; - mappings[927] = ItemType.GoldenShovel; - mappings[928] = ItemType.GoldenPickaxe; - mappings[929] = ItemType.GoldenAxe; - mappings[930] = ItemType.GoldenHoe; - mappings[931] = ItemType.IronSword; - mappings[932] = ItemType.IronShovel; - mappings[933] = ItemType.IronPickaxe; - mappings[934] = ItemType.IronAxe; - mappings[935] = ItemType.IronHoe; - mappings[936] = ItemType.DiamondSword; - mappings[937] = ItemType.DiamondShovel; - mappings[938] = ItemType.DiamondPickaxe; - mappings[939] = ItemType.DiamondAxe; - mappings[940] = ItemType.DiamondHoe; - mappings[941] = ItemType.NetheriteSword; - mappings[942] = ItemType.NetheriteShovel; - mappings[943] = ItemType.NetheritePickaxe; - mappings[944] = ItemType.NetheriteAxe; - mappings[945] = ItemType.NetheriteHoe; - mappings[946] = ItemType.Stick; - mappings[947] = ItemType.MushroomStew; - mappings[948] = ItemType.String; - mappings[949] = ItemType.Feather; - mappings[950] = ItemType.Gunpowder; - mappings[951] = ItemType.WheatSeeds; - mappings[952] = ItemType.Wheat; - mappings[953] = ItemType.Bread; - mappings[954] = ItemType.LeatherHelmet; - mappings[955] = ItemType.LeatherChestplate; - mappings[956] = ItemType.LeatherLeggings; - mappings[957] = ItemType.LeatherBoots; - mappings[958] = ItemType.CopperHelmet; - mappings[959] = ItemType.CopperChestplate; - mappings[960] = ItemType.CopperLeggings; - mappings[961] = ItemType.CopperBoots; - mappings[962] = ItemType.ChainmailHelmet; - mappings[963] = ItemType.ChainmailChestplate; - mappings[964] = ItemType.ChainmailLeggings; - mappings[965] = ItemType.ChainmailBoots; - mappings[966] = ItemType.IronHelmet; - mappings[967] = ItemType.IronChestplate; - mappings[968] = ItemType.IronLeggings; - mappings[969] = ItemType.IronBoots; - mappings[970] = ItemType.DiamondHelmet; - mappings[971] = ItemType.DiamondChestplate; - mappings[972] = ItemType.DiamondLeggings; - mappings[973] = ItemType.DiamondBoots; - mappings[974] = ItemType.GoldenHelmet; - mappings[975] = ItemType.GoldenChestplate; - mappings[976] = ItemType.GoldenLeggings; - mappings[977] = ItemType.GoldenBoots; - mappings[978] = ItemType.NetheriteHelmet; - mappings[979] = ItemType.NetheriteChestplate; - mappings[980] = ItemType.NetheriteLeggings; - mappings[981] = ItemType.NetheriteBoots; - mappings[982] = ItemType.Flint; - mappings[983] = ItemType.Porkchop; - mappings[984] = ItemType.CookedPorkchop; - mappings[985] = ItemType.Painting; - mappings[986] = ItemType.GoldenApple; - mappings[987] = ItemType.EnchantedGoldenApple; - mappings[988] = ItemType.OakSign; - mappings[989] = ItemType.SpruceSign; - mappings[990] = ItemType.BirchSign; - mappings[991] = ItemType.JungleSign; - mappings[992] = ItemType.AcaciaSign; - mappings[993] = ItemType.CherrySign; - mappings[994] = ItemType.DarkOakSign; - mappings[995] = ItemType.PaleOakSign; - mappings[996] = ItemType.MangroveSign; - mappings[997] = ItemType.BambooSign; - mappings[998] = ItemType.CrimsonSign; - mappings[999] = ItemType.WarpedSign; - mappings[1000] = ItemType.OakHangingSign; - mappings[1001] = ItemType.SpruceHangingSign; - mappings[1002] = ItemType.BirchHangingSign; - mappings[1003] = ItemType.JungleHangingSign; - mappings[1004] = ItemType.AcaciaHangingSign; - mappings[1005] = ItemType.CherryHangingSign; - mappings[1006] = ItemType.DarkOakHangingSign; - mappings[1007] = ItemType.PaleOakHangingSign; - mappings[1008] = ItemType.MangroveHangingSign; - mappings[1009] = ItemType.BambooHangingSign; - mappings[1010] = ItemType.CrimsonHangingSign; - mappings[1011] = ItemType.WarpedHangingSign; - mappings[1012] = ItemType.Bucket; - mappings[1013] = ItemType.WaterBucket; - mappings[1014] = ItemType.LavaBucket; - mappings[1015] = ItemType.PowderSnowBucket; - mappings[1016] = ItemType.Snowball; - mappings[1017] = ItemType.Leather; - mappings[1018] = ItemType.MilkBucket; - mappings[1019] = ItemType.PufferfishBucket; - mappings[1020] = ItemType.SalmonBucket; - mappings[1021] = ItemType.CodBucket; - mappings[1022] = ItemType.TropicalFishBucket; - mappings[1023] = ItemType.AxolotlBucket; - mappings[1024] = ItemType.TadpoleBucket; - mappings[1025] = ItemType.Brick; - mappings[1026] = ItemType.ClayBall; - mappings[1027] = ItemType.DriedKelpBlock; - mappings[1028] = ItemType.Paper; - mappings[1029] = ItemType.Book; - mappings[1030] = ItemType.SlimeBall; - mappings[1031] = ItemType.Egg; - mappings[1032] = ItemType.BlueEgg; - mappings[1033] = ItemType.BrownEgg; - mappings[1034] = ItemType.Compass; - mappings[1035] = ItemType.RecoveryCompass; - mappings[1036] = ItemType.Bundle; - mappings[1037] = ItemType.WhiteBundle; - mappings[1038] = ItemType.OrangeBundle; - mappings[1039] = ItemType.MagentaBundle; - mappings[1040] = ItemType.LightBlueBundle; - mappings[1041] = ItemType.YellowBundle; - mappings[1042] = ItemType.LimeBundle; - mappings[1043] = ItemType.PinkBundle; - mappings[1044] = ItemType.GrayBundle; - mappings[1045] = ItemType.LightGrayBundle; - mappings[1046] = ItemType.CyanBundle; - mappings[1047] = ItemType.PurpleBundle; - mappings[1048] = ItemType.BlueBundle; - mappings[1049] = ItemType.BrownBundle; - mappings[1050] = ItemType.GreenBundle; - mappings[1051] = ItemType.RedBundle; - mappings[1052] = ItemType.BlackBundle; - mappings[1053] = ItemType.FishingRod; - mappings[1054] = ItemType.Clock; - mappings[1055] = ItemType.Spyglass; - mappings[1056] = ItemType.GlowstoneDust; - mappings[1057] = ItemType.Cod; - mappings[1058] = ItemType.Salmon; - mappings[1059] = ItemType.TropicalFish; - mappings[1060] = ItemType.Pufferfish; - mappings[1061] = ItemType.CookedCod; - mappings[1062] = ItemType.CookedSalmon; - mappings[1063] = ItemType.InkSac; - mappings[1064] = ItemType.GlowInkSac; - mappings[1065] = ItemType.CocoaBeans; - mappings[1066] = ItemType.WhiteDye; - mappings[1067] = ItemType.OrangeDye; - mappings[1068] = ItemType.MagentaDye; - mappings[1069] = ItemType.LightBlueDye; - mappings[1070] = ItemType.YellowDye; - mappings[1071] = ItemType.LimeDye; - mappings[1072] = ItemType.PinkDye; - mappings[1073] = ItemType.GrayDye; - mappings[1074] = ItemType.LightGrayDye; - mappings[1075] = ItemType.CyanDye; - mappings[1076] = ItemType.PurpleDye; - mappings[1077] = ItemType.BlueDye; - mappings[1078] = ItemType.BrownDye; - mappings[1079] = ItemType.GreenDye; - mappings[1080] = ItemType.RedDye; - mappings[1081] = ItemType.BlackDye; - mappings[1082] = ItemType.BoneMeal; - mappings[1083] = ItemType.Bone; - mappings[1084] = ItemType.Sugar; - mappings[1085] = ItemType.Cake; - mappings[1086] = ItemType.WhiteBed; - mappings[1087] = ItemType.OrangeBed; - mappings[1088] = ItemType.MagentaBed; - mappings[1089] = ItemType.LightBlueBed; - mappings[1090] = ItemType.YellowBed; - mappings[1091] = ItemType.LimeBed; - mappings[1092] = ItemType.PinkBed; - mappings[1093] = ItemType.GrayBed; - mappings[1094] = ItemType.LightGrayBed; - mappings[1095] = ItemType.CyanBed; - mappings[1096] = ItemType.PurpleBed; - mappings[1097] = ItemType.BlueBed; - mappings[1098] = ItemType.BrownBed; - mappings[1099] = ItemType.GreenBed; - mappings[1100] = ItemType.RedBed; - mappings[1101] = ItemType.BlackBed; - mappings[1102] = ItemType.Cookie; - mappings[1103] = ItemType.Crafter; - mappings[1104] = ItemType.FilledMap; - mappings[1105] = ItemType.Shears; - mappings[1106] = ItemType.MelonSlice; - mappings[1107] = ItemType.DriedKelp; - mappings[1108] = ItemType.PumpkinSeeds; - mappings[1109] = ItemType.MelonSeeds; - mappings[1110] = ItemType.Beef; - mappings[1111] = ItemType.CookedBeef; - mappings[1112] = ItemType.Chicken; - mappings[1113] = ItemType.CookedChicken; - mappings[1114] = ItemType.RottenFlesh; - mappings[1115] = ItemType.EnderPearl; - mappings[1116] = ItemType.BlazeRod; - mappings[1117] = ItemType.GhastTear; - mappings[1118] = ItemType.GoldNugget; - mappings[1119] = ItemType.NetherWart; - mappings[1120] = ItemType.GlassBottle; - mappings[1121] = ItemType.Potion; - mappings[1122] = ItemType.SpiderEye; - mappings[1123] = ItemType.FermentedSpiderEye; - mappings[1124] = ItemType.BlazePowder; - mappings[1125] = ItemType.MagmaCream; - mappings[1126] = ItemType.BrewingStand; - mappings[1127] = ItemType.Cauldron; - mappings[1128] = ItemType.EnderEye; - mappings[1129] = ItemType.GlisteringMelonSlice; - mappings[1130] = ItemType.ArmadilloSpawnEgg; - mappings[1131] = ItemType.AllaySpawnEgg; - mappings[1132] = ItemType.AxolotlSpawnEgg; - mappings[1133] = ItemType.BatSpawnEgg; - mappings[1134] = ItemType.BeeSpawnEgg; - mappings[1135] = ItemType.BlazeSpawnEgg; - mappings[1136] = ItemType.BoggedSpawnEgg; - mappings[1137] = ItemType.BreezeSpawnEgg; - mappings[1138] = ItemType.CatSpawnEgg; - mappings[1139] = ItemType.CamelSpawnEgg; - mappings[1140] = ItemType.CaveSpiderSpawnEgg; - mappings[1141] = ItemType.ChickenSpawnEgg; - mappings[1142] = ItemType.CodSpawnEgg; - mappings[1143] = ItemType.CopperGolemSpawnEgg; - mappings[1144] = ItemType.CowSpawnEgg; - mappings[1145] = ItemType.CreeperSpawnEgg; - mappings[1146] = ItemType.DolphinSpawnEgg; - mappings[1147] = ItemType.DonkeySpawnEgg; - mappings[1148] = ItemType.DrownedSpawnEgg; - mappings[1149] = ItemType.ElderGuardianSpawnEgg; - mappings[1150] = ItemType.EnderDragonSpawnEgg; - mappings[1151] = ItemType.EndermanSpawnEgg; - mappings[1152] = ItemType.EndermiteSpawnEgg; - mappings[1153] = ItemType.EvokerSpawnEgg; - mappings[1154] = ItemType.FoxSpawnEgg; - mappings[1155] = ItemType.FrogSpawnEgg; - mappings[1156] = ItemType.GhastSpawnEgg; - mappings[1157] = ItemType.HappyGhastSpawnEgg; - mappings[1158] = ItemType.GlowSquidSpawnEgg; - mappings[1159] = ItemType.GoatSpawnEgg; - mappings[1160] = ItemType.GuardianSpawnEgg; - mappings[1161] = ItemType.HoglinSpawnEgg; - mappings[1162] = ItemType.HorseSpawnEgg; - mappings[1163] = ItemType.HuskSpawnEgg; - mappings[1164] = ItemType.IronGolemSpawnEgg; - mappings[1165] = ItemType.LlamaSpawnEgg; - mappings[1166] = ItemType.MagmaCubeSpawnEgg; - mappings[1167] = ItemType.MooshroomSpawnEgg; - mappings[1168] = ItemType.MuleSpawnEgg; - mappings[1169] = ItemType.OcelotSpawnEgg; - mappings[1170] = ItemType.PandaSpawnEgg; - mappings[1171] = ItemType.ParrotSpawnEgg; - mappings[1172] = ItemType.PhantomSpawnEgg; - mappings[1173] = ItemType.PigSpawnEgg; - mappings[1174] = ItemType.PiglinSpawnEgg; - mappings[1175] = ItemType.PiglinBruteSpawnEgg; - mappings[1176] = ItemType.PillagerSpawnEgg; - mappings[1177] = ItemType.PolarBearSpawnEgg; - mappings[1178] = ItemType.PufferfishSpawnEgg; - mappings[1179] = ItemType.RabbitSpawnEgg; - mappings[1180] = ItemType.RavagerSpawnEgg; - mappings[1181] = ItemType.SalmonSpawnEgg; - mappings[1182] = ItemType.SheepSpawnEgg; - mappings[1183] = ItemType.ShulkerSpawnEgg; - mappings[1184] = ItemType.SilverfishSpawnEgg; - mappings[1185] = ItemType.SkeletonSpawnEgg; - mappings[1186] = ItemType.SkeletonHorseSpawnEgg; - mappings[1187] = ItemType.SlimeSpawnEgg; - mappings[1188] = ItemType.SnifferSpawnEgg; - mappings[1189] = ItemType.SnowGolemSpawnEgg; - mappings[1190] = ItemType.SpiderSpawnEgg; - mappings[1191] = ItemType.SquidSpawnEgg; - mappings[1192] = ItemType.StraySpawnEgg; - mappings[1193] = ItemType.StriderSpawnEgg; - mappings[1194] = ItemType.TadpoleSpawnEgg; - mappings[1195] = ItemType.TraderLlamaSpawnEgg; - mappings[1196] = ItemType.TropicalFishSpawnEgg; - mappings[1197] = ItemType.TurtleSpawnEgg; - mappings[1198] = ItemType.VexSpawnEgg; - mappings[1199] = ItemType.VillagerSpawnEgg; - mappings[1200] = ItemType.VindicatorSpawnEgg; - mappings[1201] = ItemType.WanderingTraderSpawnEgg; - mappings[1202] = ItemType.WardenSpawnEgg; - mappings[1203] = ItemType.WitchSpawnEgg; - mappings[1204] = ItemType.WitherSpawnEgg; - mappings[1205] = ItemType.WitherSkeletonSpawnEgg; - mappings[1206] = ItemType.WolfSpawnEgg; - mappings[1207] = ItemType.ZoglinSpawnEgg; - mappings[1208] = ItemType.CreakingSpawnEgg; - mappings[1209] = ItemType.ZombieSpawnEgg; - mappings[1210] = ItemType.ZombieHorseSpawnEgg; - mappings[1211] = ItemType.ZombieVillagerSpawnEgg; - mappings[1212] = ItemType.ZombifiedPiglinSpawnEgg; - mappings[1213] = ItemType.ExperienceBottle; - mappings[1214] = ItemType.FireCharge; - mappings[1215] = ItemType.WindCharge; - mappings[1216] = ItemType.WritableBook; - mappings[1217] = ItemType.WrittenBook; - mappings[1218] = ItemType.BreezeRod; - mappings[1219] = ItemType.Mace; - mappings[1220] = ItemType.ItemFrame; - mappings[1221] = ItemType.GlowItemFrame; - mappings[1222] = ItemType.FlowerPot; - mappings[1223] = ItemType.Carrot; - mappings[1224] = ItemType.Potato; - mappings[1225] = ItemType.BakedPotato; - mappings[1226] = ItemType.PoisonousPotato; - mappings[1227] = ItemType.Map; - mappings[1228] = ItemType.GoldenCarrot; - mappings[1229] = ItemType.SkeletonSkull; - mappings[1230] = ItemType.WitherSkeletonSkull; - mappings[1231] = ItemType.PlayerHead; - mappings[1232] = ItemType.ZombieHead; - mappings[1233] = ItemType.CreeperHead; - mappings[1234] = ItemType.DragonHead; - mappings[1235] = ItemType.PiglinHead; - mappings[1236] = ItemType.NetherStar; - mappings[1237] = ItemType.PumpkinPie; - mappings[1238] = ItemType.FireworkRocket; - mappings[1239] = ItemType.FireworkStar; - mappings[1240] = ItemType.EnchantedBook; - mappings[1241] = ItemType.NetherBrick; - mappings[1242] = ItemType.ResinBrick; - mappings[1243] = ItemType.PrismarineShard; - mappings[1244] = ItemType.PrismarineCrystals; - mappings[1245] = ItemType.Rabbit; - mappings[1246] = ItemType.CookedRabbit; - mappings[1247] = ItemType.RabbitStew; - mappings[1248] = ItemType.RabbitFoot; - mappings[1249] = ItemType.RabbitHide; - mappings[1250] = ItemType.ArmorStand; - mappings[1251] = ItemType.CopperHorseArmor; - mappings[1252] = ItemType.IronHorseArmor; - mappings[1253] = ItemType.GoldenHorseArmor; - mappings[1254] = ItemType.DiamondHorseArmor; - mappings[1255] = ItemType.LeatherHorseArmor; - mappings[1256] = ItemType.Lead; - mappings[1257] = ItemType.NameTag; - mappings[1258] = ItemType.CommandBlockMinecart; - mappings[1259] = ItemType.Mutton; - mappings[1260] = ItemType.CookedMutton; - mappings[1261] = ItemType.WhiteBanner; - mappings[1262] = ItemType.OrangeBanner; - mappings[1263] = ItemType.MagentaBanner; - mappings[1264] = ItemType.LightBlueBanner; - mappings[1265] = ItemType.YellowBanner; - mappings[1266] = ItemType.LimeBanner; - mappings[1267] = ItemType.PinkBanner; - mappings[1268] = ItemType.GrayBanner; - mappings[1269] = ItemType.LightGrayBanner; - mappings[1270] = ItemType.CyanBanner; - mappings[1271] = ItemType.PurpleBanner; - mappings[1272] = ItemType.BlueBanner; - mappings[1273] = ItemType.BrownBanner; - mappings[1274] = ItemType.GreenBanner; - mappings[1275] = ItemType.RedBanner; - mappings[1276] = ItemType.BlackBanner; - mappings[1277] = ItemType.EndCrystal; - mappings[1278] = ItemType.ChorusFruit; - mappings[1279] = ItemType.PoppedChorusFruit; - mappings[1280] = ItemType.TorchflowerSeeds; - mappings[1281] = ItemType.PitcherPod; - mappings[1282] = ItemType.Beetroot; - mappings[1283] = ItemType.BeetrootSeeds; - mappings[1284] = ItemType.BeetrootSoup; - mappings[1285] = ItemType.DragonBreath; - mappings[1286] = ItemType.SplashPotion; - mappings[1287] = ItemType.SpectralArrow; - mappings[1288] = ItemType.TippedArrow; - mappings[1289] = ItemType.LingeringPotion; - mappings[1290] = ItemType.Shield; - mappings[1291] = ItemType.TotemOfUndying; - mappings[1292] = ItemType.ShulkerShell; - mappings[1293] = ItemType.IronNugget; - mappings[1294] = ItemType.CopperNugget; - mappings[1295] = ItemType.KnowledgeBook; - mappings[1296] = ItemType.DebugStick; - mappings[1297] = ItemType.MusicDisc13; - mappings[1298] = ItemType.MusicDiscCat; - mappings[1299] = ItemType.MusicDiscBlocks; - mappings[1300] = ItemType.MusicDiscChirp; - mappings[1301] = ItemType.MusicDiscCreator; - mappings[1302] = ItemType.MusicDiscCreatorMusicBox; - mappings[1303] = ItemType.MusicDiscFar; - mappings[1304] = ItemType.MusicDiscLavaChicken; - mappings[1305] = ItemType.MusicDiscMall; - mappings[1306] = ItemType.MusicDiscMellohi; - mappings[1307] = ItemType.MusicDiscStal; - mappings[1308] = ItemType.MusicDiscStrad; - mappings[1309] = ItemType.MusicDiscWard; - mappings[1310] = ItemType.MusicDisc11; - mappings[1311] = ItemType.MusicDiscWait; - mappings[1312] = ItemType.MusicDiscOtherside; - mappings[1313] = ItemType.MusicDiscRelic; - mappings[1314] = ItemType.MusicDisc5; - mappings[1315] = ItemType.MusicDiscPigstep; - mappings[1316] = ItemType.MusicDiscPrecipice; - mappings[1317] = ItemType.MusicDiscTears; - mappings[1318] = ItemType.DiscFragment5; - mappings[1319] = ItemType.Trident; - mappings[1320] = ItemType.NautilusShell; - mappings[1321] = ItemType.HeartOfTheSea; - mappings[1322] = ItemType.Crossbow; - mappings[1323] = ItemType.SuspiciousStew; - mappings[1324] = ItemType.Loom; - mappings[1325] = ItemType.FlowerBannerPattern; - mappings[1326] = ItemType.CreeperBannerPattern; - mappings[1327] = ItemType.SkullBannerPattern; - mappings[1328] = ItemType.MojangBannerPattern; - mappings[1329] = ItemType.GlobeBannerPattern; - mappings[1330] = ItemType.PiglinBannerPattern; - mappings[1331] = ItemType.FlowBannerPattern; - mappings[1332] = ItemType.GusterBannerPattern; - mappings[1333] = ItemType.FieldMasonedBannerPattern; - mappings[1334] = ItemType.BordureIndentedBannerPattern; - mappings[1335] = ItemType.GoatHorn; - mappings[1336] = ItemType.Composter; - mappings[1337] = ItemType.Barrel; - mappings[1338] = ItemType.Smoker; - mappings[1339] = ItemType.BlastFurnace; - mappings[1340] = ItemType.CartographyTable; - mappings[1341] = ItemType.FletchingTable; - mappings[1342] = ItemType.Grindstone; - mappings[1343] = ItemType.SmithingTable; - mappings[1344] = ItemType.Stonecutter; - mappings[1345] = ItemType.Bell; - mappings[1346] = ItemType.Lantern; - mappings[1347] = ItemType.SoulLantern; - mappings[1348] = ItemType.CopperLantern; - mappings[1349] = ItemType.ExposedCopperLantern; - mappings[1350] = ItemType.WeatheredCopperLantern; - mappings[1351] = ItemType.OxidizedCopperLantern; - mappings[1352] = ItemType.WaxedCopperLantern; - mappings[1353] = ItemType.WaxedExposedCopperLantern; - mappings[1354] = ItemType.WaxedWeatheredCopperLantern; - mappings[1355] = ItemType.WaxedOxidizedCopperLantern; - mappings[1356] = ItemType.SweetBerries; - mappings[1357] = ItemType.GlowBerries; - mappings[1358] = ItemType.Campfire; - mappings[1359] = ItemType.SoulCampfire; - mappings[1360] = ItemType.Shroomlight; - mappings[1361] = ItemType.Honeycomb; - mappings[1362] = ItemType.BeeNest; - mappings[1363] = ItemType.Beehive; - mappings[1364] = ItemType.HoneyBottle; - mappings[1365] = ItemType.HoneycombBlock; - mappings[1366] = ItemType.Lodestone; - mappings[1367] = ItemType.CryingObsidian; - mappings[1368] = ItemType.Blackstone; - mappings[1369] = ItemType.BlackstoneSlab; - mappings[1370] = ItemType.BlackstoneStairs; - mappings[1371] = ItemType.GildedBlackstone; - mappings[1372] = ItemType.PolishedBlackstone; - mappings[1373] = ItemType.PolishedBlackstoneSlab; - mappings[1374] = ItemType.PolishedBlackstoneStairs; - mappings[1375] = ItemType.ChiseledPolishedBlackstone; - mappings[1376] = ItemType.PolishedBlackstoneBricks; - mappings[1377] = ItemType.PolishedBlackstoneBrickSlab; - mappings[1378] = ItemType.PolishedBlackstoneBrickStairs; - mappings[1379] = ItemType.CrackedPolishedBlackstoneBricks; - mappings[1380] = ItemType.RespawnAnchor; - mappings[1381] = ItemType.Candle; - mappings[1382] = ItemType.WhiteCandle; - mappings[1383] = ItemType.OrangeCandle; - mappings[1384] = ItemType.MagentaCandle; - mappings[1385] = ItemType.LightBlueCandle; - mappings[1386] = ItemType.YellowCandle; - mappings[1387] = ItemType.LimeCandle; - mappings[1388] = ItemType.PinkCandle; - mappings[1389] = ItemType.GrayCandle; - mappings[1390] = ItemType.LightGrayCandle; - mappings[1391] = ItemType.CyanCandle; - mappings[1392] = ItemType.PurpleCandle; - mappings[1393] = ItemType.BlueCandle; - mappings[1394] = ItemType.BrownCandle; - mappings[1395] = ItemType.GreenCandle; - mappings[1396] = ItemType.RedCandle; - mappings[1397] = ItemType.BlackCandle; - mappings[1398] = ItemType.SmallAmethystBud; - mappings[1399] = ItemType.MediumAmethystBud; - mappings[1400] = ItemType.LargeAmethystBud; - mappings[1401] = ItemType.AmethystCluster; - mappings[1402] = ItemType.PointedDripstone; - mappings[1403] = ItemType.OchreFroglight; - mappings[1404] = ItemType.VerdantFroglight; - mappings[1405] = ItemType.PearlescentFroglight; - mappings[1406] = ItemType.Frogspawn; - mappings[1407] = ItemType.EchoShard; - mappings[1408] = ItemType.Brush; - mappings[1409] = ItemType.NetheriteUpgradeSmithingTemplate; - mappings[1410] = ItemType.SentryArmorTrimSmithingTemplate; - mappings[1411] = ItemType.DuneArmorTrimSmithingTemplate; - mappings[1412] = ItemType.CoastArmorTrimSmithingTemplate; - mappings[1413] = ItemType.WildArmorTrimSmithingTemplate; - mappings[1414] = ItemType.WardArmorTrimSmithingTemplate; - mappings[1415] = ItemType.EyeArmorTrimSmithingTemplate; - mappings[1416] = ItemType.VexArmorTrimSmithingTemplate; - mappings[1417] = ItemType.TideArmorTrimSmithingTemplate; - mappings[1418] = ItemType.SnoutArmorTrimSmithingTemplate; - mappings[1419] = ItemType.RibArmorTrimSmithingTemplate; - mappings[1420] = ItemType.SpireArmorTrimSmithingTemplate; - mappings[1421] = ItemType.WayfinderArmorTrimSmithingTemplate; - mappings[1422] = ItemType.ShaperArmorTrimSmithingTemplate; - mappings[1423] = ItemType.SilenceArmorTrimSmithingTemplate; - mappings[1424] = ItemType.RaiserArmorTrimSmithingTemplate; - mappings[1425] = ItemType.HostArmorTrimSmithingTemplate; - mappings[1426] = ItemType.FlowArmorTrimSmithingTemplate; - mappings[1427] = ItemType.BoltArmorTrimSmithingTemplate; - mappings[1428] = ItemType.AnglerPotterySherd; - mappings[1429] = ItemType.ArcherPotterySherd; - mappings[1430] = ItemType.ArmsUpPotterySherd; - mappings[1431] = ItemType.BladePotterySherd; - mappings[1432] = ItemType.BrewerPotterySherd; - mappings[1433] = ItemType.BurnPotterySherd; - mappings[1434] = ItemType.DangerPotterySherd; - mappings[1435] = ItemType.ExplorerPotterySherd; - mappings[1436] = ItemType.FlowPotterySherd; - mappings[1437] = ItemType.FriendPotterySherd; - mappings[1438] = ItemType.GusterPotterySherd; - mappings[1439] = ItemType.HeartPotterySherd; - mappings[1440] = ItemType.HeartbreakPotterySherd; - mappings[1441] = ItemType.HowlPotterySherd; - mappings[1442] = ItemType.MinerPotterySherd; - mappings[1443] = ItemType.MournerPotterySherd; - mappings[1444] = ItemType.PlentyPotterySherd; - mappings[1445] = ItemType.PrizePotterySherd; - mappings[1446] = ItemType.ScrapePotterySherd; - mappings[1447] = ItemType.SheafPotterySherd; - mappings[1448] = ItemType.ShelterPotterySherd; - mappings[1449] = ItemType.SkullPotterySherd; - mappings[1450] = ItemType.SnortPotterySherd; - mappings[1451] = ItemType.CopperGrate; - mappings[1452] = ItemType.ExposedCopperGrate; - mappings[1453] = ItemType.WeatheredCopperGrate; - mappings[1454] = ItemType.OxidizedCopperGrate; - mappings[1455] = ItemType.WaxedCopperGrate; - mappings[1456] = ItemType.WaxedExposedCopperGrate; - mappings[1457] = ItemType.WaxedWeatheredCopperGrate; - mappings[1458] = ItemType.WaxedOxidizedCopperGrate; - mappings[1459] = ItemType.CopperBulb; - mappings[1460] = ItemType.ExposedCopperBulb; - mappings[1461] = ItemType.WeatheredCopperBulb; - mappings[1462] = ItemType.OxidizedCopperBulb; - mappings[1463] = ItemType.WaxedCopperBulb; - mappings[1464] = ItemType.WaxedExposedCopperBulb; - mappings[1465] = ItemType.WaxedWeatheredCopperBulb; - mappings[1466] = ItemType.WaxedOxidizedCopperBulb; - mappings[1467] = ItemType.CopperChest; - mappings[1468] = ItemType.ExposedCopperChest; - mappings[1469] = ItemType.WeatheredCopperChest; - mappings[1470] = ItemType.OxidizedCopperChest; - mappings[1471] = ItemType.WaxedCopperChest; - mappings[1472] = ItemType.WaxedExposedCopperChest; - mappings[1473] = ItemType.WaxedWeatheredCopperChest; - mappings[1474] = ItemType.WaxedOxidizedCopperChest; - mappings[1475] = ItemType.CopperGolemStatue; - mappings[1476] = ItemType.ExposedCopperGolemStatue; - mappings[1477] = ItemType.WeatheredCopperGolemStatue; - mappings[1478] = ItemType.OxidizedCopperGolemStatue; - mappings[1479] = ItemType.WaxedCopperGolemStatue; - mappings[1480] = ItemType.WaxedExposedCopperGolemStatue; - mappings[1481] = ItemType.WaxedWeatheredCopperGolemStatue; - mappings[1482] = ItemType.WaxedOxidizedCopperGolemStatue; - mappings[1483] = ItemType.TrialSpawner; - mappings[1484] = ItemType.TrialKey; - mappings[1485] = ItemType.OminousTrialKey; - mappings[1486] = ItemType.Vault; - mappings[1487] = ItemType.OminousBottle; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette18.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette18.cs deleted file mode 100644 index 57f942d9f9..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette18.cs +++ /dev/null @@ -1,640 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - /// - /// For MC 1.8 - /// Done manually by Milutinke :( - /// - public class ItemPalette18 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette18() - { - // Mapping IDs are a derived from: (Item ID << 16) | Data - mappings[0] = ItemType.Air; - mappings[65536] = ItemType.Stone; - mappings[65537] = ItemType.Granite; - mappings[65538] = ItemType.PolishedGranite; - mappings[65539] = ItemType.Diorite; - mappings[65540] = ItemType.PolishedDiorite; - mappings[65541] = ItemType.Andesite; - mappings[65542] = ItemType.PolishedAndesite; - mappings[131072] = ItemType.GrassBlock; - mappings[196608] = ItemType.Dirt; - mappings[196609] = ItemType.CoarseDirt; - mappings[196610] = ItemType.Podzol; - mappings[262144] = ItemType.Cobblestone; - mappings[327680] = ItemType.OakPlanks; - mappings[327681] = ItemType.SprucePlanks; - mappings[327682] = ItemType.BirchPlanks; - mappings[327683] = ItemType.JunglePlanks; - mappings[327684] = ItemType.AcaciaPlanks; - mappings[327685] = ItemType.DarkOakPlanks; - mappings[393216] = ItemType.OakSapling; - mappings[393217] = ItemType.SpruceSapling; - mappings[393218] = ItemType.BirchSapling; - mappings[393219] = ItemType.JungleSapling; - mappings[393220] = ItemType.AcaciaSapling; - mappings[393221] = ItemType.DarkOakSapling; - mappings[458752] = ItemType.Bedrock; - mappings[524288] = ItemType.WaterBucket; // Still Water Block Item - mappings[589824] = ItemType.WaterBucket; // Flowing Water Block Item - mappings[655360] = ItemType.LavaBucket; // Still Lava Block Item - mappings[720896] = ItemType.LavaBucket; // Flowing Lava Block Item - mappings[786432] = ItemType.Sand; - mappings[786433] = ItemType.RedSand; - mappings[851968] = ItemType.Gravel; - mappings[917504] = ItemType.GoldOre; - mappings[983040] = ItemType.IronOre; - mappings[1048576] = ItemType.CoalOre; - mappings[1114112] = ItemType.OakLog; - mappings[1114113] = ItemType.SpruceLog; - mappings[1114114] = ItemType.BirchLog; - mappings[1114115] = ItemType.JungleLog; - mappings[1179648] = ItemType.OakLeaves; - mappings[1179649] = ItemType.SpruceLeaves; - mappings[1179650] = ItemType.BirchLeaves; - mappings[1179651] = ItemType.JungleLeaves; - mappings[1245184] = ItemType.Sponge; - mappings[1245185] = ItemType.WetSponge; - mappings[1310720] = ItemType.Glass; - mappings[1376256] = ItemType.LapisOre; - mappings[1441792] = ItemType.LapisBlock; - mappings[1507328] = ItemType.Dispenser; - mappings[1572864] = ItemType.Sandstone; - mappings[1572865] = ItemType.ChiseledSandstone; - mappings[1572866] = ItemType.SmoothSandstone; - mappings[1638400] = ItemType.NoteBlock; - mappings[1769472] = ItemType.PoweredRail; - mappings[1835008] = ItemType.DetectorRail; - mappings[1900544] = ItemType.StickyPiston; - mappings[2031617] = ItemType.ShortGrass; - mappings[2031618] = ItemType.Fern; - mappings[2097152] = ItemType.DeadBush; - mappings[2162688] = ItemType.Piston; - mappings[2490368] = ItemType.Poppy; - mappings[2490369] = ItemType.BlueOrchid; - mappings[2490370] = ItemType.Allium; - mappings[2490371] = ItemType.AzureBluet; - mappings[2490372] = ItemType.RedTulip; - mappings[2490373] = ItemType.OrangeTulip; - mappings[2490374] = ItemType.WhiteTulip; - mappings[2490375] = ItemType.PinkTulip; - mappings[2490376] = ItemType.OxeyeDaisy; - mappings[2555904] = ItemType.BrownMushroom; - mappings[2621440] = ItemType.RedMushroom; - mappings[2686976] = ItemType.GoldBlock; - mappings[2752512] = ItemType.IronBlock; - mappings[2883584] = ItemType.StoneSlab; - mappings[2883585] = ItemType.SandstoneSlab; - mappings[2883587] = ItemType.CobblestoneSlab; - mappings[2883588] = ItemType.BrickSlab; - mappings[2883589] = ItemType.StoneBrickSlab; - mappings[2883590] = ItemType.NetherBrickSlab; - mappings[2883591] = ItemType.QuartzSlab; - mappings[2949120] = ItemType.Bricks; - mappings[3014656] = ItemType.Tnt; - mappings[3080192] = ItemType.Bookshelf; - mappings[3145728] = ItemType.MossyCobblestone; - mappings[3211264] = ItemType.Obsidian; - mappings[3276800] = ItemType.Torch; - mappings[3407872] = ItemType.Spawner; - mappings[3473408] = ItemType.OakStairs; - mappings[3538944] = ItemType.Chest; - mappings[3670016] = ItemType.DiamondOre; - mappings[3735552] = ItemType.DiamondBlock; - mappings[3801088] = ItemType.CraftingTable; - mappings[3932160] = ItemType.Farmland; - mappings[3997696] = ItemType.Furnace; - mappings[4259840] = ItemType.Ladder; - mappings[4325376] = ItemType.Rail; - mappings[4390912] = ItemType.CobblestoneStairs; - mappings[4521984] = ItemType.Lever; - mappings[4587520] = ItemType.StonePressurePlate; - mappings[4784128] = ItemType.RedstoneOre; - mappings[4980736] = ItemType.RedstoneTorch; - mappings[5046272] = ItemType.StoneButton; - mappings[5111808] = ItemType.Snow; - mappings[5177344] = ItemType.Ice; - mappings[5242880] = ItemType.SnowBlock; - mappings[5308416] = ItemType.Cactus; - mappings[5373952] = ItemType.Clay; - mappings[5505024] = ItemType.Jukebox; - mappings[5570560] = ItemType.OakFence; - mappings[5636096] = ItemType.Pumpkin; - mappings[5701632] = ItemType.Netherrack; - mappings[5767168] = ItemType.SoulSand; - mappings[5832704] = ItemType.Glowstone; - mappings[5963776] = ItemType.JackOLantern; - mappings[6225920] = ItemType.WhiteStainedGlass; - mappings[6225921] = ItemType.OrangeStainedGlass; - mappings[6225922] = ItemType.MagentaStainedGlass; - mappings[6225923] = ItemType.LightBlueStainedGlass; - mappings[6225924] = ItemType.YellowStainedGlass; - mappings[6225925] = ItemType.LimeStainedGlass; - mappings[6225926] = ItemType.PinkStainedGlass; - mappings[6225927] = ItemType.GrayStainedGlass; - mappings[6225928] = ItemType.LightGrayStainedGlass; - mappings[6225929] = ItemType.CyanStainedGlass; - mappings[6225930] = ItemType.PurpleStainedGlass; - mappings[6225931] = ItemType.BlueStainedGlass; - mappings[6225932] = ItemType.BrownStainedGlass; - mappings[6225933] = ItemType.GreenStainedGlass; - mappings[6225934] = ItemType.RedStainedGlass; - mappings[6225935] = ItemType.BlackStainedGlass; - mappings[6291456] = ItemType.OakTrapdoor; - mappings[6356992] = ItemType.InfestedStone; - mappings[6356993] = ItemType.InfestedCobblestone; - mappings[6356994] = ItemType.InfestedStoneBricks; - mappings[6356995] = ItemType.InfestedMossyStoneBricks; - mappings[6356996] = ItemType.InfestedCrackedStoneBricks; - mappings[6356997] = ItemType.InfestedChiseledStoneBricks; - mappings[6422528] = ItemType.StoneBricks; - mappings[6422529] = ItemType.MossyStoneBricks; - mappings[6422530] = ItemType.CrackedStoneBricks; - mappings[6422531] = ItemType.ChiseledStoneBricks; - mappings[6488064] = ItemType.BrownMushroomBlock; - mappings[6553600] = ItemType.RedMushroomBlock; - mappings[6619136] = ItemType.IronBars; - mappings[6684672] = ItemType.GlassPane; - mappings[6750208] = ItemType.Melon; - mappings[6946816] = ItemType.Vine; - mappings[7012352] = ItemType.OakFenceGate; - mappings[7077888] = ItemType.BrickStairs; - mappings[7143424] = ItemType.StoneBrickStairs; - mappings[7208960] = ItemType.Mycelium; - mappings[7340032] = ItemType.NetherBricks; - mappings[7405568] = ItemType.NetherBrickFence; - mappings[7471104] = ItemType.NetherBrickStairs; - mappings[7602176] = ItemType.EnchantingTable; - mappings[7864320] = ItemType.EndPortalFrame; - mappings[7929856] = ItemType.EndStone; - mappings[7995392] = ItemType.DragonEgg; - mappings[8060928] = ItemType.RedstoneLamp; - mappings[8388608] = ItemType.SandstoneStairs; - mappings[8454144] = ItemType.EmeraldOre; - mappings[8519680] = ItemType.EnderChest; - mappings[8585216] = ItemType.TripwireHook; - mappings[8716288] = ItemType.EmeraldBlock; - mappings[8781824] = ItemType.SpruceStairs; - mappings[8847360] = ItemType.BirchStairs; - mappings[8912896] = ItemType.JungleStairs; - mappings[8978432] = ItemType.CommandBlock; - mappings[9043968] = ItemType.Beacon; - mappings[9109504] = ItemType.CobblestoneWall; - mappings[9109505] = ItemType.MossyCobblestoneWall; - mappings[9502720] = ItemType.Anvil; - mappings[9502721] = ItemType.ChippedAnvil; - mappings[9502722] = ItemType.DamagedAnvil; - mappings[9568256] = ItemType.TrappedChest; - mappings[9633792] = ItemType.LightWeightedPressurePlate; - mappings[9699328] = ItemType.HeavyWeightedPressurePlate; - mappings[9895936] = ItemType.DaylightDetector; - mappings[9961472] = ItemType.RedstoneBlock; - mappings[10027008] = ItemType.NetherQuartzOre; - mappings[10092544] = ItemType.Hopper; - mappings[10158080] = ItemType.QuartzBlock; - mappings[10158081] = ItemType.ChiseledQuartzBlock; - mappings[10158082] = ItemType.QuartzPillar; - mappings[10223616] = ItemType.QuartzStairs; - mappings[10289152] = ItemType.ActivatorRail; - mappings[10354688] = ItemType.Dropper; - mappings[10420224] = ItemType.WhiteTerracotta; - mappings[10420225] = ItemType.OrangeTerracotta; - mappings[10420226] = ItemType.MagentaTerracotta; - mappings[10420227] = ItemType.LightBlueTerracotta; - mappings[10420228] = ItemType.YellowTerracotta; - mappings[10420229] = ItemType.LimeTerracotta; - mappings[10420230] = ItemType.PinkTerracotta; - mappings[10420231] = ItemType.GrayTerracotta; - mappings[10420232] = ItemType.LightGrayTerracotta; - mappings[10420233] = ItemType.CyanTerracotta; - mappings[10420234] = ItemType.PurpleTerracotta; - mappings[10420235] = ItemType.BlueTerracotta; - mappings[10420236] = ItemType.BrownTerracotta; - mappings[10420237] = ItemType.GreenTerracotta; - mappings[10420238] = ItemType.RedTerracotta; - mappings[10420239] = ItemType.BlackTerracotta; - mappings[10485760] = ItemType.WhiteStainedGlassPane; - mappings[10485761] = ItemType.OrangeStainedGlassPane; - mappings[10485762] = ItemType.MagentaStainedGlassPane; - mappings[10485763] = ItemType.LightBlueStainedGlassPane; - mappings[10485764] = ItemType.YellowStainedGlassPane; - mappings[10485765] = ItemType.LimeStainedGlassPane; - mappings[10485766] = ItemType.PinkStainedGlassPane; - mappings[10485767] = ItemType.GrayStainedGlassPane; - mappings[10485768] = ItemType.LightGrayStainedGlassPane; - mappings[10485769] = ItemType.CyanStainedGlassPane; - mappings[10485770] = ItemType.PurpleStainedGlassPane; - mappings[10485771] = ItemType.BlueStainedGlassPane; - mappings[10485772] = ItemType.BrownStainedGlassPane; - mappings[10485773] = ItemType.GreenStainedGlassPane; - mappings[10485774] = ItemType.RedStainedGlassPane; - mappings[10485775] = ItemType.BlackStainedGlassPane; - mappings[10616832] = ItemType.AcaciaLog; - mappings[10616833] = ItemType.DarkOakLog; - mappings[10682368] = ItemType.AcaciaStairs; - mappings[10747904] = ItemType.DarkOakStairs; - mappings[10813440] = ItemType.SlimeBlock; - mappings[10878976] = ItemType.Barrier; - mappings[10944512] = ItemType.IronTrapdoor; - mappings[11010048] = ItemType.Prismarine; - mappings[11010049] = ItemType.PrismarineBricks; - mappings[11010050] = ItemType.DarkPrismarine; - mappings[11075584] = ItemType.SeaLantern; - mappings[11141120] = ItemType.HayBlock; - mappings[11206656] = ItemType.WhiteCarpet; - mappings[11206657] = ItemType.OrangeCarpet; - mappings[11206658] = ItemType.MagentaCarpet; - mappings[11206659] = ItemType.LightBlueCarpet; - mappings[11206660] = ItemType.YellowCarpet; - mappings[11206661] = ItemType.LimeCarpet; - mappings[11206662] = ItemType.PinkCarpet; - mappings[11206663] = ItemType.GrayCarpet; - mappings[11206664] = ItemType.LightGrayCarpet; - mappings[11206665] = ItemType.CyanCarpet; - mappings[11206666] = ItemType.PurpleCarpet; - mappings[11206667] = ItemType.BlueCarpet; - mappings[11206668] = ItemType.BrownCarpet; - mappings[11206669] = ItemType.GreenCarpet; - mappings[11206670] = ItemType.RedCarpet; - mappings[11206671] = ItemType.BlackCarpet; - mappings[11272192] = ItemType.Terracotta; - mappings[11337728] = ItemType.CoalBlock; - mappings[11403264] = ItemType.PackedIce; - mappings[11468800] = ItemType.Sunflower; - mappings[11468801] = ItemType.Lilac; - mappings[11468802] = ItemType.TallGrass; - mappings[11468803] = ItemType.LargeFern; - mappings[11468804] = ItemType.RoseBush; - mappings[11468805] = ItemType.Peony; - mappings[11730944] = ItemType.RedSandstone; - mappings[11730945] = ItemType.ChiseledRedSandstone; - mappings[11730946] = ItemType.SmoothRedSandstone; - mappings[11796480] = ItemType.RedSandstoneStairs; - mappings[11927552] = ItemType.RedSandstoneSlab; - mappings[11993088] = ItemType.SpruceFenceGate; - mappings[12058624] = ItemType.BirchFenceGate; - mappings[12124160] = ItemType.JungleFenceGate; - mappings[12189696] = ItemType.DarkOakFenceGate; - mappings[12255232] = ItemType.AcaciaFenceGate; - mappings[12320768] = ItemType.SpruceFence; - mappings[12386304] = ItemType.BirchFence; - mappings[12451840] = ItemType.JungleFence; - mappings[12517376] = ItemType.DarkOakFence; - mappings[12582912] = ItemType.AcaciaFence; - mappings[16777216] = ItemType.IronShovel; - mappings[16842752] = ItemType.IronPickaxe; - mappings[16908288] = ItemType.IronAxe; - mappings[16973824] = ItemType.FlintAndSteel; - mappings[17039360] = ItemType.Apple; - mappings[17104896] = ItemType.Bow; - mappings[17170432] = ItemType.Arrow; - mappings[17235968] = ItemType.Coal; - mappings[17235969] = ItemType.Charcoal; - mappings[17301504] = ItemType.Diamond; - mappings[17367040] = ItemType.IronIngot; - mappings[17432576] = ItemType.GoldIngot; - mappings[17498112] = ItemType.IronSword; - mappings[17825792] = ItemType.StoneSword; - mappings[17891328] = ItemType.StoneShovel; - mappings[17956864] = ItemType.StonePickaxe; - mappings[18022400] = ItemType.StoneAxe; - mappings[18087936] = ItemType.DiamondSword; - mappings[18153472] = ItemType.DiamondShovel; - mappings[18219008] = ItemType.DiamondPickaxe; - mappings[18284544] = ItemType.DiamondAxe; - mappings[18350080] = ItemType.Stick; - mappings[18415616] = ItemType.Bowl; - mappings[18481152] = ItemType.MushroomStew; - mappings[18546688] = ItemType.GoldenSword; - mappings[18612224] = ItemType.GoldenShovel; - mappings[18677760] = ItemType.GoldenPickaxe; - mappings[18743296] = ItemType.GoldenAxe; - mappings[18808832] = ItemType.String; - mappings[18874368] = ItemType.Feather; - mappings[18939904] = ItemType.Gunpowder; - mappings[19070976] = ItemType.StoneHoe; - mappings[19136512] = ItemType.IronHoe; - mappings[19202048] = ItemType.DiamondHoe; - mappings[19267584] = ItemType.GoldenHoe; - mappings[19464192] = ItemType.Bread; - mappings[19791872] = ItemType.ChainmailHelmet; - mappings[19857408] = ItemType.ChainmailChestplate; - mappings[19922944] = ItemType.ChainmailLeggings; - mappings[19988480] = ItemType.ChainmailBoots; - mappings[20054016] = ItemType.IronHelmet; - mappings[20119552] = ItemType.IronChestplate; - mappings[20185088] = ItemType.IronLeggings; - mappings[20250624] = ItemType.IronBoots; - mappings[20316160] = ItemType.DiamondHelmet; - mappings[20381696] = ItemType.DiamondChestplate; - mappings[20447232] = ItemType.DiamondLeggings; - mappings[20512768] = ItemType.DiamondBoots; - mappings[20578304] = ItemType.GoldenHelmet; - mappings[20643840] = ItemType.GoldenChestplate; - mappings[20709376] = ItemType.GoldenLeggings; - mappings[20774912] = ItemType.GoldenBoots; - mappings[20840448] = ItemType.Flint; - mappings[20905984] = ItemType.Porkchop; - mappings[20971520] = ItemType.CookedPorkchop; - mappings[21037056] = ItemType.Painting; - mappings[21102592] = ItemType.GoldenApple; - mappings[21102593] = ItemType.EnchantedGoldenApple; - mappings[21168128] = ItemType.OakSign; - mappings[21299200] = ItemType.Bucket; - mappings[21495808] = ItemType.Minecart; - mappings[21561344] = ItemType.Saddle; - mappings[21626880] = ItemType.IronDoor; - mappings[21692416] = ItemType.Redstone; - mappings[21757952] = ItemType.Snowball; - mappings[21823488] = ItemType.OakBoat; - mappings[21954560] = ItemType.MilkBucket; - mappings[22020096] = ItemType.Brick; - mappings[22085632] = ItemType.ClayBall; - mappings[22151168] = ItemType.SugarCane; - mappings[22216704] = ItemType.Paper; - mappings[22282240] = ItemType.Book; - mappings[22347776] = ItemType.SlimeBall; - mappings[22413312] = ItemType.ChestMinecart; - mappings[22478848] = ItemType.FurnaceMinecart; - mappings[22544384] = ItemType.Egg; - mappings[22609920] = ItemType.Compass; - mappings[22675456] = ItemType.FishingRod; - mappings[22740992] = ItemType.Clock; - mappings[22806528] = ItemType.GlowstoneDust; - mappings[22872064] = ItemType.Salmon; - mappings[22872065] = ItemType.Salmon; - mappings[22872066] = ItemType.TropicalFish; - mappings[22872067] = ItemType.Pufferfish; - mappings[22937600] = ItemType.CookedSalmon; - mappings[22937601] = ItemType.CookedSalmon; - mappings[23003136] = ItemType.InkSac; - mappings[23003137] = ItemType.RedDye; - mappings[23003138] = ItemType.GreenDye; - mappings[23003139] = ItemType.CocoaBeans; - mappings[23003140] = ItemType.LapisLazuli; - mappings[23003141] = ItemType.PurpleDye; - mappings[23003142] = ItemType.CyanDye; - mappings[23003143] = ItemType.LightGrayDye; - mappings[23003144] = ItemType.GrayDye; - mappings[23003145] = ItemType.PinkDye; - mappings[23003146] = ItemType.LimeDye; - mappings[23003147] = ItemType.YellowDye; - mappings[23003148] = ItemType.LightBlueDye; - mappings[23003149] = ItemType.MagentaDye; - mappings[23003150] = ItemType.OrangeDye; - mappings[23003151] = ItemType.BoneMeal; - mappings[23068672] = ItemType.Bone; - mappings[23134208] = ItemType.Sugar; - mappings[23199744] = ItemType.Cake; - mappings[23265280] = ItemType.RedBed; - mappings[23330816] = ItemType.Repeater; - mappings[23396352] = ItemType.Cookie; - mappings[23461888] = ItemType.FilledMap; - mappings[23527424] = ItemType.Shears; - mappings[23592960] = ItemType.MelonSlice; - mappings[23658496] = ItemType.PumpkinSeeds; - mappings[23724032] = ItemType.MelonSeeds; - mappings[23789568] = ItemType.Beef; - mappings[23855104] = ItemType.CookedBeef; - mappings[23920640] = ItemType.Chicken; - mappings[23986176] = ItemType.CookedChicken; - mappings[24051712] = ItemType.RottenFlesh; - mappings[24117248] = ItemType.EnderPearl; - mappings[24182784] = ItemType.BlazeRod; - mappings[24248320] = ItemType.GhastTear; - mappings[24313856] = ItemType.GoldNugget; - mappings[24379392] = ItemType.NetherWart; - mappings[24444928] = ItemType.Potion; // Water Bottle - mappings[24453121] = ItemType.Potion; // Regeneration - mappings[24453122] = ItemType.Potion; // Speed/Swiftness - mappings[24453124] = ItemType.Potion; // Poison - mappings[24453129] = ItemType.Potion; // Strength 3 min - mappings[24453131] = ItemType.Potion; // Jump Boost potion - mappings[24453153] = ItemType.Potion; // Regeneration II - mappings[24453154] = ItemType.Potion; // Speed/Swiftness II - mappings[24453155] = ItemType.Potion; // Fire Resistance 3 min - mappings[24453156] = ItemType.Potion; // Poison II - mappings[24453157] = ItemType.Potion; // Instant Health II - mappings[24453158] = ItemType.Potion; // Night Vision 3 min - mappings[24453160] = ItemType.Potion; // Weakness 1 min - mappings[24453161] = ItemType.Potion; // Strength 2 min - mappings[24453162] = ItemType.Potion; // Slowness - mappings[24453163] = ItemType.Potion; // Jump Boost/Leaping 1 min - mappings[24453164] = ItemType.Potion; // Instant Damage II - mappings[24453165] = ItemType.Potion; // Water Breathing 3 min - mappings[24453166] = ItemType.Potion; // Invisibility 3 min - mappings[24453185] = ItemType.Potion; // Regeneration 1 min - mappings[24453186] = ItemType.Potion; // Speed 1 min - mappings[24453187] = ItemType.Potion; // Fire Resistance - mappings[24453188] = ItemType.Potion; // Poison - mappings[24453189] = ItemType.Potion; // Instant Health - mappings[24453190] = ItemType.Potion; // Night Vision 8 min - mappings[24453192] = ItemType.Potion; // Weakness 4 min - mappings[24453193] = ItemType.Potion; // Strength 8 min - mappings[24453194] = ItemType.Potion; // Speed/Swiftness 4 min - mappings[24453195] = ItemType.Potion; // Jump Boost - mappings[24453196] = ItemType.Potion; // Harming/Instant Damage - mappings[24453197] = ItemType.Potion; // Water Breathing 8 min - mappings[24453198] = ItemType.Potion; // Invisibility 8 min - mappings[24461313] = ItemType.Potion; // Splash potion of Regeneration - mappings[24461314] = ItemType.Potion; // Splash potion of Speed/Swiftness 3 min - mappings[24461316] = ItemType.Potion; // Splash potion of Poison - mappings[24461321] = ItemType.Potion; // Splash potion of Strength 3 min - mappings[24461323] = ItemType.Potion; // Splash potion of Jump Boost 3 min - mappings[24461345] = ItemType.Potion; // Splash potion of Regeneration - mappings[24461346] = ItemType.Potion; // Splash potion of Speed/Swiftness 1 min - mappings[24461347] = ItemType.Potion; // Splash potion of Resistance 3 min - mappings[24461348] = ItemType.Potion; // Splash potion of Poison II - mappings[24461349] = ItemType.Potion; // Splash potion of Instant Health II - mappings[24461350] = ItemType.Potion; // Splash potion of Night Vision - mappings[24461352] = ItemType.Potion; // Splash potion of Weakness - mappings[24461353] = ItemType.Potion; // Splash potion of Strength - mappings[24461354] = ItemType.Potion; // Splash potion of Slowness - mappings[24461355] = ItemType.Potion; // Splash potion of Jump Boost - mappings[24461356] = ItemType.Potion; // Splash potion of Harming/Instant Damage II - mappings[24461357] = ItemType.Potion; // Splash potion of Water Breathing 3 min - mappings[24461358] = ItemType.Potion; // Splash potion of Invisibility 3 min - mappings[24461377] = ItemType.Potion; // Splash potion of Regeneration - mappings[24461378] = ItemType.Potion; // Splash potion of Speed 8 min - mappings[24461379] = ItemType.Potion; // Splash potion of Fire Resistance 8 min - mappings[24461380] = ItemType.Potion; // Splash potion of Poison - mappings[24461381] = ItemType.Potion; // Splash potion of Instant Health - mappings[24461382] = ItemType.Potion; // Splash potion of Night Vision 8 min - mappings[24461384] = ItemType.Potion; // Splash potion of Weakness 4 min - mappings[24461385] = ItemType.Potion; // Splash potion of Strength 8 min - mappings[24461386] = ItemType.Potion; // Splash potion of Slowness 4 min - mappings[24461387] = ItemType.Potion; // Splash potion of Jump Boost 8 min - mappings[24461388] = ItemType.Potion; // Splash potion of Harming/Instant Damage - mappings[24461389] = ItemType.Potion; // Splash potion of Water breathing 8 min - mappings[24461390] = ItemType.Potion; // Splash potion of Invisibility 7 min - mappings[24510464] = ItemType.GlassBottle; - mappings[24576000] = ItemType.SpiderEye; - mappings[24641536] = ItemType.FermentedSpiderEye; - mappings[24707072] = ItemType.BlazePowder; - mappings[24772608] = ItemType.MagmaCream; - mappings[24838144] = ItemType.BrewingStand; - mappings[24903680] = ItemType.Cauldron; - mappings[24969216] = ItemType.EnderEye; - mappings[25034752] = ItemType.GlisteringMelonSlice; - mappings[25100338] = ItemType.CreeperSpawnEgg; - mappings[25100339] = ItemType.SkeletonSpawnEgg; - mappings[25100340] = ItemType.SpiderSpawnEgg; - mappings[25100342] = ItemType.ZombieSpawnEgg; - mappings[25100343] = ItemType.SlimeSpawnEgg; - mappings[25100344] = ItemType.GhastSpawnEgg; - mappings[25100345] = ItemType.ZombifiedPiglinSpawnEgg; - mappings[25100346] = ItemType.EndermanSpawnEgg; - mappings[25100347] = ItemType.CaveSpiderSpawnEgg; - mappings[25100348] = ItemType.SilverfishSpawnEgg; - mappings[25100349] = ItemType.BlazeSpawnEgg; - mappings[25100350] = ItemType.MagmaCubeSpawnEgg; - mappings[25100353] = ItemType.BatSpawnEgg; - mappings[25100354] = ItemType.WitchSpawnEgg; - mappings[25100355] = ItemType.EndermiteSpawnEgg; - mappings[25100356] = ItemType.GuardianSpawnEgg; - mappings[25100378] = ItemType.PigSpawnEgg; - mappings[25100379] = ItemType.SheepSpawnEgg; - mappings[25100380] = ItemType.CowSpawnEgg; - mappings[25100381] = ItemType.ChickenSpawnEgg; - mappings[25100382] = ItemType.SquidSpawnEgg; - mappings[25100383] = ItemType.WolfSpawnEgg; - mappings[25100384] = ItemType.MooshroomSpawnEgg; - mappings[25100386] = ItemType.OcelotSpawnEgg; - mappings[25100388] = ItemType.HorseSpawnEgg; - mappings[25100389] = ItemType.RabbitSpawnEgg; - mappings[25100408] = ItemType.VillagerSpawnEgg; - mappings[25165824] = ItemType.ExperienceBottle; - mappings[25231360] = ItemType.FireCharge; - mappings[25427968] = ItemType.Emerald; - mappings[25493504] = ItemType.ItemFrame; - mappings[25559040] = ItemType.FlowerPot; - mappings[25624576] = ItemType.Carrot; - mappings[25690112] = ItemType.Potato; - mappings[25755648] = ItemType.BakedPotato; - mappings[25821184] = ItemType.PoisonousPotato; - mappings[25886720] = ItemType.Map; - mappings[25952256] = ItemType.GoldenCarrot; - mappings[26017792] = ItemType.SkeletonSkull; - mappings[26017793] = ItemType.WitherSkeletonSkull; - mappings[26017794] = ItemType.ZombieHead; - mappings[26017795] = ItemType.PlayerHead; - mappings[26017796] = ItemType.CreeperHead; - mappings[26083328] = ItemType.CarrotOnAStick; - mappings[26148864] = ItemType.NetherStar; - mappings[26214400] = ItemType.PumpkinPie; - mappings[26279936] = ItemType.FireworkRocket; - mappings[26345472] = ItemType.FireworkStar; - mappings[26411008] = ItemType.EnchantedBook; - mappings[26476544] = ItemType.Comparator; - mappings[26542080] = ItemType.NetherBrick; - mappings[26607616] = ItemType.Quartz; - mappings[26673152] = ItemType.TntMinecart; - mappings[26738688] = ItemType.HopperMinecart; - mappings[26804224] = ItemType.PrismarineShard; - mappings[26869760] = ItemType.PrismarineCrystals; - mappings[26935296] = ItemType.Rabbit; - mappings[27000832] = ItemType.CookedRabbit; - mappings[27066368] = ItemType.RabbitStew; - mappings[27131904] = ItemType.RabbitFoot; - mappings[27197440] = ItemType.RabbitHide; - mappings[27262976] = ItemType.ArmorStand; - mappings[27328512] = ItemType.IronHorseArmor; - mappings[27394048] = ItemType.GoldenHorseArmor; - mappings[27459584] = ItemType.DiamondHorseArmor; - mappings[27590656] = ItemType.NameTag; - mappings[27656192] = ItemType.CommandBlockMinecart; - mappings[27721728] = ItemType.Mutton; - mappings[27787264] = ItemType.CookedMutton; - mappings[27852800] = ItemType.BlackBanner; - mappings[1966080] = ItemType.Cobweb; - mappings[2293760] = ItemType.WhiteWool; - mappings[2293761] = ItemType.OrangeWool; - mappings[2293762] = ItemType.MagentaWool; - mappings[2293763] = ItemType.LightBlueWool; - mappings[2293764] = ItemType.YellowWool; - mappings[2293765] = ItemType.LimeWool; - mappings[2293766] = ItemType.PinkWool; - mappings[2293767] = ItemType.GrayWool; - mappings[2293768] = ItemType.LightGrayWool; - mappings[2293769] = ItemType.CyanWool; - mappings[2293770] = ItemType.PurpleWool; - mappings[2293771] = ItemType.BlueWool; - mappings[2293772] = ItemType.BrownWool; - mappings[2293773] = ItemType.GreenWool; - mappings[2293774] = ItemType.RedWool; - mappings[2293775] = ItemType.BlackWool; - mappings[2424832] = ItemType.Dandelion; - mappings[4718592] = ItemType.OakPressurePlate; - mappings[7274496] = ItemType.LilyPad; - mappings[8257536] = ItemType.OakSlab; - mappings[8257537] = ItemType.SpruceSlab; - mappings[8257538] = ItemType.BirchSlab; - mappings[8257539] = ItemType.JungleSlab; - mappings[8257540] = ItemType.AcaciaSlab; - mappings[8257541] = ItemType.DarkOakSlab; - mappings[9371648] = ItemType.OakButton; - mappings[17563648] = ItemType.WoodenSword; - mappings[17629184] = ItemType.WoodenShovel; - mappings[17694720] = ItemType.WoodenPickaxe; - mappings[17760256] = ItemType.WoodenAxe; - mappings[19005440] = ItemType.WoodenHoe; - mappings[19333120] = ItemType.WheatSeeds; - mappings[19398656] = ItemType.Wheat; - mappings[21233664] = ItemType.OakDoor; - mappings[21364736] = ItemType.WaterBucket; - mappings[25296896] = ItemType.WritableBook; - mappings[25362432] = ItemType.WrittenBook; - mappings[27852801] = ItemType.RedBanner; - mappings[27852802] = ItemType.GreenBanner; - mappings[27852803] = ItemType.BrownBanner; - mappings[27852804] = ItemType.BlueBanner; - mappings[27852805] = ItemType.PurpleBanner; - mappings[27852806] = ItemType.CyanBanner; - mappings[27852807] = ItemType.LightGrayBanner; - mappings[27852808] = ItemType.GrayBanner; - mappings[27852809] = ItemType.PinkBanner; - mappings[27852810] = ItemType.LimeBanner; - mappings[27852811] = ItemType.YellowBanner; - mappings[27852812] = ItemType.LightBlueBanner; - mappings[27852813] = ItemType.MagentaBanner; - mappings[27852814] = ItemType.OrangeBanner; - mappings[27852815] = ItemType.WhiteBanner; - mappings[27983872] = ItemType.SpruceDoor; - mappings[28049408] = ItemType.BirchDoor; - mappings[28114944] = ItemType.JungleDoor; - mappings[28180480] = ItemType.AcaciaDoor; - mappings[28246016] = ItemType.DarkOakDoor; - mappings[10551296] = ItemType.AcaciaLeaves; - mappings[10551297] = ItemType.DarkOakLeaves; - mappings[19529728] = ItemType.LeatherHelmet; - mappings[19595264] = ItemType.LeatherChestplate; - mappings[19660800] = ItemType.LeatherLeggings; - mappings[19726336] = ItemType.LeatherBoots; - mappings[21430272] = ItemType.LavaBucket; - mappings[21889024] = ItemType.Leather; - mappings[27525120] = ItemType.Lead; - mappings[147849216] = ItemType.MusicDisc13; - mappings[147914752] = ItemType.MusicDiscCat; - mappings[147980288] = ItemType.MusicDiscBlocks; - mappings[148045824] = ItemType.MusicDiscChirp; - mappings[148111360] = ItemType.MusicDiscFar; - mappings[148176896] = ItemType.MusicDiscMall; - mappings[148242432] = ItemType.MusicDiscMellohi; - mappings[148307968] = ItemType.MusicDiscStal; - mappings[148373504] = ItemType.MusicDiscStrad; - mappings[148439040] = ItemType.MusicDiscWard; - mappings[148504576] = ItemType.MusicDisc11; - mappings[148570112] = ItemType.MusicDiscWait; - - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette19.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette19.cs deleted file mode 100644 index c4251f6240..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette19.cs +++ /dev/null @@ -1,607 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - /// - /// For MC 1.8 - /// Done manually by Milutinke :( - /// - public class ItemPalette19 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette19() - { - // Mapping IDs are a derived from: (Item ID << 16) | Data - mappings[0] = ItemType.Air; - mappings[65536] = ItemType.Stone; - mappings[65537] = ItemType.Granite; - mappings[65538] = ItemType.PolishedGranite; - mappings[65539] = ItemType.Diorite; - mappings[65540] = ItemType.PolishedDiorite; - mappings[65541] = ItemType.Andesite; - mappings[65542] = ItemType.PolishedAndesite; - mappings[131072] = ItemType.GrassBlock; - mappings[196608] = ItemType.Dirt; - mappings[196609] = ItemType.CoarseDirt; - mappings[196610] = ItemType.Podzol; - mappings[262144] = ItemType.Cobblestone; - mappings[327680] = ItemType.OakPlanks; - mappings[327681] = ItemType.SprucePlanks; - mappings[327682] = ItemType.BirchPlanks; - mappings[327683] = ItemType.JunglePlanks; - mappings[327684] = ItemType.AcaciaPlanks; - mappings[327685] = ItemType.DarkOakPlanks; - mappings[393216] = ItemType.OakSapling; - mappings[393217] = ItemType.SpruceSapling; - mappings[393218] = ItemType.BirchSapling; - mappings[393219] = ItemType.JungleSapling; - mappings[393220] = ItemType.AcaciaSapling; - mappings[393221] = ItemType.DarkOakSapling; - mappings[458752] = ItemType.Bedrock; - mappings[524288] = ItemType.WaterBucket; // Still Water Block Item - mappings[589824] = ItemType.WaterBucket; // Flowing Water Block Item - mappings[655360] = ItemType.LavaBucket; // Still Lava Block Item - mappings[720896] = ItemType.LavaBucket; // Flowing Lava Block Item - mappings[786432] = ItemType.Sand; - mappings[786433] = ItemType.RedSand; - mappings[851968] = ItemType.Gravel; - mappings[917504] = ItemType.GoldOre; - mappings[983040] = ItemType.IronOre; - mappings[1048576] = ItemType.CoalOre; - mappings[1114112] = ItemType.OakLog; - mappings[1114113] = ItemType.SpruceLog; - mappings[1114114] = ItemType.BirchLog; - mappings[1114115] = ItemType.JungleLog; - mappings[1179648] = ItemType.OakLeaves; - mappings[1179649] = ItemType.SpruceLeaves; - mappings[1179650] = ItemType.BirchLeaves; - mappings[1179651] = ItemType.JungleLeaves; - mappings[1245184] = ItemType.Sponge; - mappings[1245185] = ItemType.WetSponge; - mappings[1310720] = ItemType.Glass; - mappings[1376256] = ItemType.LapisOre; - mappings[1441792] = ItemType.LapisBlock; - mappings[1507328] = ItemType.Dispenser; - mappings[1769472] = ItemType.PoweredRail; - mappings[1835008] = ItemType.DetectorRail; - mappings[1900544] = ItemType.StickyPiston; - mappings[2031617] = ItemType.ShortGrass; - mappings[2031618] = ItemType.Fern; - mappings[2097152] = ItemType.DeadBush; - mappings[2293760] = ItemType.WhiteWool; - mappings[2293761] = ItemType.OrangeWool; - mappings[2293762] = ItemType.MagentaWool; - mappings[2293763] = ItemType.LightBlueWool; - mappings[2293764] = ItemType.YellowWool; - mappings[2293765] = ItemType.LimeWool; - mappings[2293766] = ItemType.PinkWool; - mappings[2293767] = ItemType.GrayWool; - mappings[2293768] = ItemType.LightGrayWool; - mappings[2293769] = ItemType.CyanWool; - mappings[2293770] = ItemType.PurpleWool; - mappings[2293771] = ItemType.BlueWool; - mappings[2293772] = ItemType.BrownWool; - mappings[2293773] = ItemType.GreenWool; - mappings[2293774] = ItemType.RedWool; - mappings[2293775] = ItemType.BlackWool; - mappings[2424832] = ItemType.Dandelion; - mappings[2555904] = ItemType.BrownMushroom; - mappings[2686976] = ItemType.GoldBlock; - mappings[2752512] = ItemType.IronBlock; - mappings[2883584] = ItemType.StoneSlab; - mappings[2883585] = ItemType.SandstoneSlab; - mappings[2883587] = ItemType.CobblestoneSlab; - mappings[2883588] = ItemType.BrickSlab; - mappings[2883589] = ItemType.StoneBrickSlab; - mappings[2883590] = ItemType.NetherBrickSlab; - mappings[2883591] = ItemType.QuartzSlab; - mappings[2949120] = ItemType.Bricks; - mappings[3014656] = ItemType.Tnt; - mappings[3080192] = ItemType.Bookshelf; - mappings[3276800] = ItemType.Torch; - mappings[3538944] = ItemType.Chest; - mappings[3670016] = ItemType.DiamondOre; - mappings[3735552] = ItemType.DiamondBlock; - mappings[3801088] = ItemType.CraftingTable; - mappings[3932160] = ItemType.Farmland; - mappings[3997696] = ItemType.Furnace; - mappings[4259840] = ItemType.Ladder; - mappings[4390912] = ItemType.CobblestoneStairs; - mappings[4587520] = ItemType.StonePressurePlate; - mappings[4718592] = ItemType.OakPressurePlate; - mappings[5046272] = ItemType.StoneButton; - mappings[5177344] = ItemType.Ice; - mappings[5308416] = ItemType.Cactus; - mappings[5373952] = ItemType.Clay; - mappings[5505024] = ItemType.Jukebox; - mappings[5570560] = ItemType.OakFence; - mappings[5832704] = ItemType.Glowstone; - mappings[6225920] = ItemType.WhiteStainedGlass; - mappings[6225921] = ItemType.OrangeStainedGlass; - mappings[6225922] = ItemType.MagentaStainedGlass; - mappings[6225923] = ItemType.LightBlueStainedGlass; - mappings[6225924] = ItemType.YellowStainedGlass; - mappings[6225925] = ItemType.LimeStainedGlass; - mappings[6225926] = ItemType.PinkStainedGlass; - mappings[6225927] = ItemType.GrayStainedGlass; - mappings[6225928] = ItemType.LightGrayStainedGlass; - mappings[6225929] = ItemType.CyanStainedGlass; - mappings[6225930] = ItemType.PurpleStainedGlass; - mappings[6225931] = ItemType.BlueStainedGlass; - mappings[6225932] = ItemType.BrownStainedGlass; - mappings[6225933] = ItemType.GreenStainedGlass; - mappings[6225934] = ItemType.RedStainedGlass; - mappings[6225935] = ItemType.BlackStainedGlass; - mappings[6291456] = ItemType.OakTrapdoor; - mappings[6422528] = ItemType.StoneBricks; - mappings[6422529] = ItemType.MossyStoneBricks; - mappings[6422530] = ItemType.CrackedStoneBricks; - mappings[6422531] = ItemType.ChiseledStoneBricks; - mappings[6488064] = ItemType.BrownMushroomBlock; - mappings[6619136] = ItemType.IronBars; - mappings[6684672] = ItemType.GlassPane; - mappings[6946816] = ItemType.Vine; - mappings[7012352] = ItemType.OakFenceGate; - mappings[7077888] = ItemType.BrickStairs; - mappings[7143424] = ItemType.StoneBrickStairs; - mappings[7602176] = ItemType.EnchantingTable; - mappings[7864320] = ItemType.EndPortalFrame; - mappings[7929856] = ItemType.EndStone; - mappings[7995392] = ItemType.DragonEgg; - mappings[8257536] = ItemType.OakSlab; - mappings[8257537] = ItemType.SpruceSlab; - mappings[8257538] = ItemType.BirchSlab; - mappings[8257539] = ItemType.JungleSlab; - mappings[8257540] = ItemType.AcaciaSlab; - mappings[8257541] = ItemType.DarkOakSlab; - mappings[8454144] = ItemType.EmeraldOre; - mappings[8519680] = ItemType.EnderChest; - mappings[8585216] = ItemType.TripwireHook; - mappings[8716288] = ItemType.EmeraldBlock; - mappings[8781824] = ItemType.SpruceStairs; - mappings[8847360] = ItemType.BirchStairs; - mappings[8912896] = ItemType.JungleStairs; - mappings[8978432] = ItemType.CommandBlock; - mappings[9043968] = ItemType.Beacon; - mappings[9109504] = ItemType.CobblestoneWall; - mappings[1572864] = ItemType.Sandstone; - mappings[1572865] = ItemType.ChiseledSandstone; - mappings[1572866] = ItemType.SmoothSandstone; - mappings[1638400] = ItemType.NoteBlock; - mappings[2162688] = ItemType.Piston; - mappings[2490368] = ItemType.Poppy; - mappings[2490369] = ItemType.BlueOrchid; - mappings[2490370] = ItemType.Allium; - mappings[2490371] = ItemType.AzureBluet; - mappings[2490372] = ItemType.RedTulip; - mappings[2490373] = ItemType.OrangeTulip; - mappings[2490374] = ItemType.WhiteTulip; - mappings[2490375] = ItemType.PinkTulip; - mappings[2490376] = ItemType.OxeyeDaisy; - mappings[2621440] = ItemType.RedMushroom; - mappings[3145728] = ItemType.MossyCobblestone; - mappings[3211264] = ItemType.Obsidian; - mappings[3407872] = ItemType.Spawner; - mappings[3473408] = ItemType.OakStairs; - mappings[4325376] = ItemType.Rail; - mappings[4521984] = ItemType.Lever; - mappings[4784128] = ItemType.RedstoneOre; - mappings[4980736] = ItemType.RedstoneTorch; - mappings[5111808] = ItemType.Snow; - mappings[5242880] = ItemType.SnowBlock; - mappings[5636096] = ItemType.Pumpkin; - mappings[5701632] = ItemType.Netherrack; - mappings[5767168] = ItemType.SoulSand; - mappings[5963776] = ItemType.JackOLantern; - mappings[6356992] = ItemType.InfestedStone; - mappings[6356993] = ItemType.InfestedCobblestone; - mappings[6356994] = ItemType.InfestedStoneBricks; - mappings[6356995] = ItemType.InfestedMossyStoneBricks; - mappings[6356996] = ItemType.InfestedCrackedStoneBricks; - mappings[6356997] = ItemType.InfestedChiseledStoneBricks; - mappings[6553600] = ItemType.RedMushroomBlock; - mappings[6750208] = ItemType.Melon; - mappings[7208960] = ItemType.Mycelium; - mappings[7340032] = ItemType.NetherBricks; - mappings[7405568] = ItemType.NetherBrickFence; - mappings[7471104] = ItemType.NetherBrickStairs; - mappings[8060928] = ItemType.RedstoneLamp; - mappings[8388608] = ItemType.SandstoneStairs; - mappings[9109505] = ItemType.MossyCobblestoneWall; - mappings[9371648] = ItemType.OakButton; - mappings[9502720] = ItemType.Anvil; - mappings[9502721] = ItemType.ChippedAnvil; - mappings[9502722] = ItemType.DamagedAnvil; - mappings[9568256] = ItemType.TrappedChest; - mappings[9633792] = ItemType.LightWeightedPressurePlate; - mappings[9699328] = ItemType.HeavyWeightedPressurePlate; - mappings[9895936] = ItemType.DaylightDetector; - mappings[9961472] = ItemType.RedstoneBlock; - mappings[10027008] = ItemType.NetherQuartzOre; - mappings[10092544] = ItemType.Hopper; - mappings[10158080] = ItemType.QuartzBlock; - mappings[10158081] = ItemType.ChiseledQuartzBlock; - mappings[10158082] = ItemType.QuartzPillar; - mappings[10223616] = ItemType.QuartzStairs; - mappings[10289152] = ItemType.ActivatorRail; - mappings[10354688] = ItemType.Dropper; - mappings[10420224] = ItemType.WhiteTerracotta; - mappings[10420225] = ItemType.OrangeTerracotta; - mappings[10420226] = ItemType.MagentaTerracotta; - mappings[10420227] = ItemType.LightBlueTerracotta; - mappings[10420228] = ItemType.YellowTerracotta; - mappings[10420229] = ItemType.LimeTerracotta; - mappings[10420230] = ItemType.PinkTerracotta; - mappings[10420231] = ItemType.GrayTerracotta; - mappings[10420232] = ItemType.LightGrayTerracotta; - mappings[10420233] = ItemType.CyanTerracotta; - mappings[10420234] = ItemType.PurpleTerracotta; - mappings[10420235] = ItemType.BlueTerracotta; - mappings[10420236] = ItemType.BrownTerracotta; - mappings[10420237] = ItemType.GreenTerracotta; - mappings[10420238] = ItemType.RedTerracotta; - mappings[10420239] = ItemType.BlackTerracotta; - mappings[10485760] = ItemType.WhiteStainedGlassPane; - mappings[10485761] = ItemType.OrangeStainedGlassPane; - mappings[10485762] = ItemType.MagentaStainedGlassPane; - mappings[10485763] = ItemType.LightBlueStainedGlassPane; - mappings[10485764] = ItemType.YellowStainedGlassPane; - mappings[10485765] = ItemType.LimeStainedGlassPane; - mappings[10485766] = ItemType.PinkStainedGlassPane; - mappings[10485767] = ItemType.GrayStainedGlassPane; - mappings[10485768] = ItemType.LightGrayStainedGlassPane; - mappings[10485769] = ItemType.CyanStainedGlassPane; - mappings[10485770] = ItemType.PurpleStainedGlassPane; - mappings[10485771] = ItemType.BlueStainedGlassPane; - mappings[10485772] = ItemType.BrownStainedGlassPane; - mappings[10485773] = ItemType.GreenStainedGlassPane; - mappings[10485774] = ItemType.RedStainedGlassPane; - mappings[10485775] = ItemType.BlackStainedGlassPane; - mappings[10551296] = ItemType.AcaciaLeaves; - mappings[10551297] = ItemType.DarkOakLeaves; - mappings[10616832] = ItemType.AcaciaLog; - mappings[10616833] = ItemType.DarkOakLog; - mappings[10682368] = ItemType.AcaciaStairs; - mappings[10747904] = ItemType.DarkOakStairs; - mappings[10813440] = ItemType.SlimeBlock; - mappings[10878976] = ItemType.Barrier; - mappings[10944512] = ItemType.IronTrapdoor; - mappings[11010048] = ItemType.Prismarine; - mappings[11010049] = ItemType.PrismarineBricks; - mappings[11010050] = ItemType.DarkPrismarine; - mappings[11075584] = ItemType.SeaLantern; - mappings[11141120] = ItemType.HayBlock; - mappings[11206656] = ItemType.WhiteCarpet; - mappings[11206657] = ItemType.OrangeCarpet; - mappings[11206658] = ItemType.MagentaCarpet; - mappings[11206659] = ItemType.LightBlueCarpet; - mappings[11206660] = ItemType.YellowCarpet; - mappings[11206661] = ItemType.LimeCarpet; - mappings[11206662] = ItemType.PinkCarpet; - mappings[11206663] = ItemType.GrayCarpet; - mappings[11206664] = ItemType.LightGrayCarpet; - mappings[11206665] = ItemType.CyanCarpet; - mappings[11206666] = ItemType.PurpleCarpet; - mappings[11206667] = ItemType.BlueCarpet; - mappings[11206668] = ItemType.BrownCarpet; - mappings[11206669] = ItemType.GreenCarpet; - mappings[11206670] = ItemType.RedCarpet; - mappings[11206671] = ItemType.BlackCarpet; - mappings[11272192] = ItemType.Terracotta; - mappings[11337728] = ItemType.CoalBlock; - mappings[11403264] = ItemType.PackedIce; - mappings[11468800] = ItemType.Sunflower; - mappings[11468801] = ItemType.Lilac; - mappings[11468802] = ItemType.TallGrass; - mappings[11468803] = ItemType.LargeFern; - mappings[11468804] = ItemType.RoseBush; - mappings[11468805] = ItemType.Peony; - mappings[11730944] = ItemType.RedSandstone; - mappings[11730945] = ItemType.ChiseledRedSandstone; - mappings[11730946] = ItemType.SmoothRedSandstone; - mappings[11796480] = ItemType.RedSandstoneStairs; - mappings[11927552] = ItemType.RedSandstoneSlab; - mappings[11993088] = ItemType.SpruceFenceGate; - mappings[12058624] = ItemType.BirchFenceGate; - mappings[12124160] = ItemType.JungleFenceGate; - mappings[12189696] = ItemType.DarkOakFenceGate; - mappings[12255232] = ItemType.AcaciaFenceGate; - mappings[12320768] = ItemType.SpruceFence; - mappings[12386304] = ItemType.BirchFence; - mappings[12451840] = ItemType.JungleFence; - mappings[12517376] = ItemType.DarkOakFence; - mappings[12582912] = ItemType.AcaciaFence; - mappings[12976128] = ItemType.EndRod; - mappings[13041664] = ItemType.ChorusPlant; - mappings[13107200] = ItemType.ChorusFlower; - mappings[13172736] = ItemType.PurpurBlock; - mappings[13238272] = ItemType.PurpurPillar; - mappings[13303808] = ItemType.PurpurStairs; - mappings[13434880] = ItemType.PurpurSlab; - mappings[13500416] = ItemType.EndStoneBricks; - mappings[13631488] = ItemType.DirtPath; - mappings[13762560] = ItemType.RepeatingCommandBlock; - mappings[13828096] = ItemType.ChainCommandBlock; - mappings[16777216] = ItemType.IronShovel; - mappings[16842752] = ItemType.IronPickaxe; - mappings[16908288] = ItemType.IronAxe; - mappings[16973824] = ItemType.FlintAndSteel; - mappings[17039360] = ItemType.Apple; - mappings[17104896] = ItemType.Bow; - mappings[17170432] = ItemType.Arrow; - mappings[17235968] = ItemType.Coal; - mappings[17235969] = ItemType.Charcoal; - mappings[17301504] = ItemType.Diamond; - mappings[17367040] = ItemType.IronIngot; - mappings[17432576] = ItemType.GoldIngot; - mappings[17498112] = ItemType.IronSword; - mappings[17563648] = ItemType.WoodenSword; - mappings[17629184] = ItemType.WoodenShovel; - mappings[17694720] = ItemType.WoodenPickaxe; - mappings[17760256] = ItemType.WoodenAxe; - mappings[17825792] = ItemType.StoneSword; - mappings[17891328] = ItemType.StoneShovel; - mappings[17956864] = ItemType.StonePickaxe; - mappings[18022400] = ItemType.StoneAxe; - mappings[18087936] = ItemType.DiamondSword; - mappings[18153472] = ItemType.DiamondShovel; - mappings[18219008] = ItemType.DiamondPickaxe; - mappings[18284544] = ItemType.DiamondAxe; - mappings[18350080] = ItemType.Stick; - mappings[18415616] = ItemType.Bowl; - mappings[18481152] = ItemType.MushroomStew; - mappings[18546688] = ItemType.GoldenSword; - mappings[18612224] = ItemType.GoldenShovel; - mappings[18677760] = ItemType.GoldenPickaxe; - mappings[18743296] = ItemType.GoldenAxe; - mappings[18808832] = ItemType.String; - mappings[18874368] = ItemType.Feather; - mappings[18939904] = ItemType.Gunpowder; - mappings[19005440] = ItemType.WoodenHoe; - mappings[19070976] = ItemType.StoneHoe; - mappings[19136512] = ItemType.IronHoe; - mappings[19202048] = ItemType.DiamondHoe; - mappings[19267584] = ItemType.GoldenHoe; - mappings[19333120] = ItemType.WheatSeeds; - mappings[19464192] = ItemType.Bread; - mappings[19529728] = ItemType.LeatherHelmet; - mappings[19595264] = ItemType.LeatherChestplate; - mappings[19660800] = ItemType.LeatherLeggings; - mappings[19726336] = ItemType.LeatherBoots; - mappings[19791872] = ItemType.ChainmailHelmet; - mappings[19857408] = ItemType.ChainmailChestplate; - mappings[19922944] = ItemType.ChainmailLeggings; - mappings[19988480] = ItemType.ChainmailBoots; - mappings[20054016] = ItemType.IronHelmet; - mappings[20119552] = ItemType.IronChestplate; - mappings[20185088] = ItemType.IronLeggings; - mappings[20250624] = ItemType.IronBoots; - mappings[20316160] = ItemType.DiamondHelmet; - mappings[20381696] = ItemType.DiamondChestplate; - mappings[20447232] = ItemType.DiamondLeggings; - mappings[20512768] = ItemType.DiamondBoots; - mappings[20578304] = ItemType.GoldenHelmet; - mappings[20643840] = ItemType.GoldenChestplate; - mappings[20709376] = ItemType.GoldenLeggings; - mappings[20774912] = ItemType.GoldenBoots; - mappings[20840448] = ItemType.Flint; - mappings[20905984] = ItemType.Porkchop; - mappings[20971520] = ItemType.CookedPorkchop; - mappings[21037056] = ItemType.Painting; - mappings[21102592] = ItemType.GoldenApple; - mappings[21102593] = ItemType.EnchantedGoldenApple; - mappings[21168128] = ItemType.OakSign; - mappings[21233664] = ItemType.OakDoor; - mappings[21299200] = ItemType.Bucket; - mappings[21430272] = ItemType.LavaBucket; - mappings[21495808] = ItemType.Minecart; - mappings[21561344] = ItemType.Saddle; - mappings[21626880] = ItemType.IronDoor; - mappings[21692416] = ItemType.Redstone; - mappings[21757952] = ItemType.Snowball; - mappings[21823488] = ItemType.OakBoat; - mappings[21889024] = ItemType.Leather; - mappings[21954560] = ItemType.MilkBucket; - mappings[22020096] = ItemType.Brick; - mappings[22085632] = ItemType.ClayBall; - mappings[22151168] = ItemType.SugarCane; - mappings[22216704] = ItemType.Paper; - mappings[22282240] = ItemType.Book; - mappings[22347776] = ItemType.SlimeBall; - mappings[22413312] = ItemType.ChestMinecart; - mappings[22478848] = ItemType.FurnaceMinecart; - mappings[22544384] = ItemType.Egg; - mappings[22609920] = ItemType.Compass; - mappings[22675456] = ItemType.FishingRod; - mappings[22740992] = ItemType.Clock; - mappings[22806528] = ItemType.GlowstoneDust; - mappings[22872064] = ItemType.Salmon; - mappings[22872065] = ItemType.Salmon; - mappings[22872066] = ItemType.TropicalFish; - mappings[22872067] = ItemType.Pufferfish; - mappings[22937600] = ItemType.CookedSalmon; - mappings[22937601] = ItemType.CookedSalmon; - mappings[23003136] = ItemType.InkSac; - mappings[23003137] = ItemType.RedDye; - mappings[23003138] = ItemType.GreenDye; - mappings[23003139] = ItemType.CocoaBeans; - mappings[23003140] = ItemType.LapisLazuli; - mappings[23003141] = ItemType.PurpleDye; - mappings[23003142] = ItemType.CyanDye; - mappings[23003143] = ItemType.LightGrayDye; - mappings[23003144] = ItemType.GrayDye; - mappings[23003145] = ItemType.PinkDye; - mappings[23003146] = ItemType.LimeDye; - mappings[23003147] = ItemType.YellowDye; - mappings[23003148] = ItemType.LightBlueDye; - mappings[23003149] = ItemType.MagentaDye; - mappings[23003150] = ItemType.OrangeDye; - mappings[23003151] = ItemType.BoneMeal; - mappings[23068672] = ItemType.Bone; - mappings[23134208] = ItemType.Sugar; - mappings[23199744] = ItemType.Cake; - mappings[23265280] = ItemType.RedBed; - mappings[23330816] = ItemType.Repeater; - mappings[23396352] = ItemType.Cookie; - mappings[23527424] = ItemType.Shears; - mappings[23592960] = ItemType.MelonSlice; - mappings[23658496] = ItemType.PumpkinSeeds; - mappings[23724032] = ItemType.MelonSeeds; - mappings[23789568] = ItemType.Beef; - mappings[23855104] = ItemType.CookedBeef; - mappings[23920640] = ItemType.Chicken; - mappings[23986176] = ItemType.CookedChicken; - mappings[24051712] = ItemType.RottenFlesh; - mappings[24117248] = ItemType.EnderPearl; - mappings[24182784] = ItemType.BlazeRod; - mappings[24248320] = ItemType.GhastTear; - mappings[24313856] = ItemType.GoldNugget; - mappings[24379392] = ItemType.NetherWart; - mappings[24444928] = ItemType.Potion; - mappings[24510464] = ItemType.GlassBottle; - mappings[24576000] = ItemType.SpiderEye; - mappings[24641536] = ItemType.FermentedSpiderEye; - mappings[24707072] = ItemType.BlazePowder; - mappings[24772608] = ItemType.MagmaCream; - mappings[24838144] = ItemType.BrewingStand; - mappings[24903680] = ItemType.Cauldron; - mappings[24969216] = ItemType.EnderEye; - mappings[25034752] = ItemType.GlisteringMelonSlice; - mappings[25100288] = ItemType.BatSpawnEgg; - mappings[25100288] = ItemType.BlazeSpawnEgg; - mappings[25100288] = ItemType.CaveSpiderSpawnEgg; - mappings[25100288] = ItemType.ChickenSpawnEgg; - mappings[25100288] = ItemType.CowSpawnEgg; - mappings[25100288] = ItemType.CreeperSpawnEgg; - mappings[25100288] = ItemType.EndermanSpawnEgg; - mappings[25100288] = ItemType.EndermiteSpawnEgg; - mappings[25100288] = ItemType.GhastSpawnEgg; - mappings[25100288] = ItemType.GuardianSpawnEgg; - mappings[25100288] = ItemType.HorseSpawnEgg; - mappings[25100288] = ItemType.MagmaCubeSpawnEgg; - mappings[25100288] = ItemType.MooshroomSpawnEgg; - mappings[25100288] = ItemType.OcelotSpawnEgg; - mappings[25100288] = ItemType.PigSpawnEgg; - mappings[25100288] = ItemType.RabbitSpawnEgg; - mappings[25100288] = ItemType.SheepSpawnEgg; - mappings[25100288] = ItemType.ShulkerSpawnEgg; - mappings[25100288] = ItemType.SilverfishSpawnEgg; - mappings[25100288] = ItemType.SkeletonSpawnEgg; - mappings[25100288] = ItemType.SlimeSpawnEgg; - mappings[25100288] = ItemType.SpiderSpawnEgg; - mappings[25100288] = ItemType.SquidSpawnEgg; - mappings[25100288] = ItemType.VillagerSpawnEgg; - mappings[25100288] = ItemType.WitchSpawnEgg; - mappings[25100288] = ItemType.WolfSpawnEgg; - mappings[25100288] = ItemType.ZombieSpawnEgg; - mappings[25100288] = ItemType.ZombifiedPiglinSpawnEgg; - mappings[25165824] = ItemType.ExperienceBottle; - mappings[25231360] = ItemType.FireCharge; - mappings[25296896] = ItemType.WritableBook; - mappings[25362432] = ItemType.WrittenBook; - mappings[25427968] = ItemType.Emerald; - mappings[25493504] = ItemType.ItemFrame; - mappings[25559040] = ItemType.FlowerPot; - mappings[25624576] = ItemType.Carrot; - mappings[25690112] = ItemType.Potato; - mappings[25755648] = ItemType.BakedPotato; - mappings[25821184] = ItemType.PoisonousPotato; - mappings[25886720] = ItemType.Map; - mappings[25952256] = ItemType.GoldenCarrot; - mappings[26017792] = ItemType.SkeletonSkull; - mappings[26017793] = ItemType.WitherSkeletonSkull; - mappings[26017794] = ItemType.ZombieHead; - mappings[26017795] = ItemType.PlayerHead; - mappings[26017796] = ItemType.CreeperHead; - mappings[26017797] = ItemType.DragonHead; - mappings[26083328] = ItemType.CarrotOnAStick; - mappings[26148864] = ItemType.NetherStar; - mappings[26214400] = ItemType.PumpkinPie; - mappings[26279936] = ItemType.FireworkRocket; - mappings[26411008] = ItemType.EnchantedBook; - mappings[26476544] = ItemType.Comparator; - mappings[26542080] = ItemType.NetherBrick; - mappings[26607616] = ItemType.Quartz; - mappings[26673152] = ItemType.TntMinecart; - mappings[26738688] = ItemType.HopperMinecart; - mappings[26804224] = ItemType.PrismarineShard; - mappings[26869760] = ItemType.PrismarineCrystals; - mappings[26935296] = ItemType.Rabbit; - mappings[27000832] = ItemType.CookedRabbit; - mappings[27066368] = ItemType.RabbitStew; - mappings[27131904] = ItemType.RabbitFoot; - mappings[27197440] = ItemType.RabbitHide; - mappings[27262976] = ItemType.ArmorStand; - mappings[27328512] = ItemType.IronHorseArmor; - mappings[27394048] = ItemType.GoldenHorseArmor; - mappings[27459584] = ItemType.DiamondHorseArmor; - mappings[27525120] = ItemType.Lead; - mappings[27590656] = ItemType.NameTag; - mappings[27656192] = ItemType.CommandBlockMinecart; - mappings[27721728] = ItemType.Mutton; - mappings[27787264] = ItemType.CookedMutton; - mappings[27852800] = ItemType.BlackBanner; - mappings[27852801] = ItemType.RedBanner; - mappings[27852802] = ItemType.GreenBanner; - mappings[27852803] = ItemType.BrownBanner; - mappings[27852804] = ItemType.BlueBanner; - mappings[27852805] = ItemType.PurpleBanner; - mappings[27852806] = ItemType.CyanBanner; - mappings[27852807] = ItemType.LightGrayBanner; - mappings[27852808] = ItemType.GrayBanner; - mappings[27852809] = ItemType.PinkBanner; - mappings[27852810] = ItemType.LimeBanner; - mappings[27852811] = ItemType.YellowBanner; - mappings[27852812] = ItemType.LightBlueBanner; - mappings[27852813] = ItemType.MagentaBanner; - mappings[27852814] = ItemType.OrangeBanner; - mappings[27852815] = ItemType.WhiteBanner; - mappings[27918336] = ItemType.EndCrystal; - mappings[27983872] = ItemType.SpruceDoor; - mappings[28049408] = ItemType.BirchDoor; - mappings[28114944] = ItemType.JungleDoor; - mappings[28180480] = ItemType.AcaciaDoor; - mappings[28246016] = ItemType.DarkOakDoor; - mappings[28311552] = ItemType.ChorusFruit; - mappings[28377088] = ItemType.PoppedChorusFruit; - mappings[28442624] = ItemType.Beetroot; - mappings[28508160] = ItemType.BeetrootSeeds; - mappings[28573696] = ItemType.BeetrootSoup; - mappings[28639232] = ItemType.DragonBreath; - mappings[28704768] = ItemType.Potion; - mappings[28770304] = ItemType.SpectralArrow; - mappings[28835840] = ItemType.Arrow; - mappings[28901376] = ItemType.LingeringPotion; - mappings[28966912] = ItemType.Shield; - mappings[29032448] = ItemType.Elytra; - mappings[29097984] = ItemType.SpruceBoat; - mappings[29163520] = ItemType.BirchBoat; - mappings[29229056] = ItemType.JungleBoat; - mappings[29294592] = ItemType.AcaciaBoat; - mappings[29360128] = ItemType.DarkOakBoat; - mappings[147849216] = ItemType.MusicDisc13; - mappings[147914752] = ItemType.MusicDiscCat; - mappings[147980288] = ItemType.MusicDiscBlocks; - mappings[148045824] = ItemType.MusicDiscChirp; - mappings[148111360] = ItemType.MusicDiscFar; - mappings[148176896] = ItemType.MusicDiscMall; - mappings[148242432] = ItemType.MusicDiscMellohi; - mappings[148307968] = ItemType.MusicDiscStal; - mappings[148373504] = ItemType.MusicDiscStrad; - mappings[148439040] = ItemType.MusicDiscWard; - mappings[148504576] = ItemType.MusicDisc11; - mappings[148570112] = ItemType.MusicDiscWait; - mappings[1966080] = ItemType.Cobweb; - mappings[7274496] = ItemType.LilyPad; - mappings[19398656] = ItemType.Wheat; - mappings[21364736] = ItemType.WaterBucket; - - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette261.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette261.cs deleted file mode 100644 index 4acbe64456..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette261.cs +++ /dev/null @@ -1,1524 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public class ItemPalette261 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette261() - { - mappings[0] = ItemType.Air; - mappings[1] = ItemType.Stone; - mappings[2] = ItemType.Granite; - mappings[3] = ItemType.PolishedGranite; - mappings[4] = ItemType.Diorite; - mappings[5] = ItemType.PolishedDiorite; - mappings[6] = ItemType.Andesite; - mappings[7] = ItemType.PolishedAndesite; - mappings[8] = ItemType.Deepslate; - mappings[9] = ItemType.CobbledDeepslate; - mappings[10] = ItemType.PolishedDeepslate; - mappings[11] = ItemType.Calcite; - mappings[12] = ItemType.Tuff; - mappings[13] = ItemType.TuffSlab; - mappings[14] = ItemType.TuffStairs; - mappings[15] = ItemType.TuffWall; - mappings[16] = ItemType.ChiseledTuff; - mappings[17] = ItemType.PolishedTuff; - mappings[18] = ItemType.PolishedTuffSlab; - mappings[19] = ItemType.PolishedTuffStairs; - mappings[20] = ItemType.PolishedTuffWall; - mappings[21] = ItemType.TuffBricks; - mappings[22] = ItemType.TuffBrickSlab; - mappings[23] = ItemType.TuffBrickStairs; - mappings[24] = ItemType.TuffBrickWall; - mappings[25] = ItemType.ChiseledTuffBricks; - mappings[26] = ItemType.DripstoneBlock; - mappings[27] = ItemType.GrassBlock; - mappings[28] = ItemType.Dirt; - mappings[29] = ItemType.CoarseDirt; - mappings[30] = ItemType.Podzol; - mappings[31] = ItemType.RootedDirt; - mappings[32] = ItemType.Mud; - mappings[33] = ItemType.CrimsonNylium; - mappings[34] = ItemType.WarpedNylium; - mappings[35] = ItemType.Cobblestone; - mappings[36] = ItemType.OakPlanks; - mappings[37] = ItemType.SprucePlanks; - mappings[38] = ItemType.BirchPlanks; - mappings[39] = ItemType.JunglePlanks; - mappings[40] = ItemType.AcaciaPlanks; - mappings[41] = ItemType.CherryPlanks; - mappings[42] = ItemType.DarkOakPlanks; - mappings[43] = ItemType.PaleOakPlanks; - mappings[44] = ItemType.MangrovePlanks; - mappings[45] = ItemType.BambooPlanks; - mappings[46] = ItemType.CrimsonPlanks; - mappings[47] = ItemType.WarpedPlanks; - mappings[48] = ItemType.BambooMosaic; - mappings[49] = ItemType.OakSapling; - mappings[50] = ItemType.SpruceSapling; - mappings[51] = ItemType.BirchSapling; - mappings[52] = ItemType.JungleSapling; - mappings[53] = ItemType.AcaciaSapling; - mappings[54] = ItemType.CherrySapling; - mappings[55] = ItemType.DarkOakSapling; - mappings[56] = ItemType.PaleOakSapling; - mappings[57] = ItemType.MangrovePropagule; - mappings[58] = ItemType.Bedrock; - mappings[59] = ItemType.Sand; - mappings[60] = ItemType.SuspiciousSand; - mappings[61] = ItemType.SuspiciousGravel; - mappings[62] = ItemType.RedSand; - mappings[63] = ItemType.Gravel; - mappings[64] = ItemType.CoalOre; - mappings[65] = ItemType.DeepslateCoalOre; - mappings[66] = ItemType.IronOre; - mappings[67] = ItemType.DeepslateIronOre; - mappings[68] = ItemType.CopperOre; - mappings[69] = ItemType.DeepslateCopperOre; - mappings[70] = ItemType.GoldOre; - mappings[71] = ItemType.DeepslateGoldOre; - mappings[72] = ItemType.RedstoneOre; - mappings[73] = ItemType.DeepslateRedstoneOre; - mappings[74] = ItemType.EmeraldOre; - mappings[75] = ItemType.DeepslateEmeraldOre; - mappings[76] = ItemType.LapisOre; - mappings[77] = ItemType.DeepslateLapisOre; - mappings[78] = ItemType.DiamondOre; - mappings[79] = ItemType.DeepslateDiamondOre; - mappings[80] = ItemType.NetherGoldOre; - mappings[81] = ItemType.NetherQuartzOre; - mappings[82] = ItemType.AncientDebris; - mappings[83] = ItemType.CoalBlock; - mappings[84] = ItemType.RawIronBlock; - mappings[85] = ItemType.RawCopperBlock; - mappings[86] = ItemType.RawGoldBlock; - mappings[87] = ItemType.HeavyCore; - mappings[88] = ItemType.AmethystBlock; - mappings[89] = ItemType.BuddingAmethyst; - mappings[90] = ItemType.IronBlock; - mappings[91] = ItemType.CopperBlock; - mappings[92] = ItemType.GoldBlock; - mappings[93] = ItemType.DiamondBlock; - mappings[94] = ItemType.NetheriteBlock; - mappings[95] = ItemType.ExposedCopper; - mappings[96] = ItemType.WeatheredCopper; - mappings[97] = ItemType.OxidizedCopper; - mappings[98] = ItemType.ChiseledCopper; - mappings[99] = ItemType.ExposedChiseledCopper; - mappings[100] = ItemType.WeatheredChiseledCopper; - mappings[101] = ItemType.OxidizedChiseledCopper; - mappings[102] = ItemType.CutCopper; - mappings[103] = ItemType.ExposedCutCopper; - mappings[104] = ItemType.WeatheredCutCopper; - mappings[105] = ItemType.OxidizedCutCopper; - mappings[106] = ItemType.CutCopperStairs; - mappings[107] = ItemType.ExposedCutCopperStairs; - mappings[108] = ItemType.WeatheredCutCopperStairs; - mappings[109] = ItemType.OxidizedCutCopperStairs; - mappings[110] = ItemType.CutCopperSlab; - mappings[111] = ItemType.ExposedCutCopperSlab; - mappings[112] = ItemType.WeatheredCutCopperSlab; - mappings[113] = ItemType.OxidizedCutCopperSlab; - mappings[114] = ItemType.WaxedCopperBlock; - mappings[115] = ItemType.WaxedExposedCopper; - mappings[116] = ItemType.WaxedWeatheredCopper; - mappings[117] = ItemType.WaxedOxidizedCopper; - mappings[118] = ItemType.WaxedChiseledCopper; - mappings[119] = ItemType.WaxedExposedChiseledCopper; - mappings[120] = ItemType.WaxedWeatheredChiseledCopper; - mappings[121] = ItemType.WaxedOxidizedChiseledCopper; - mappings[122] = ItemType.WaxedCutCopper; - mappings[123] = ItemType.WaxedExposedCutCopper; - mappings[124] = ItemType.WaxedWeatheredCutCopper; - mappings[125] = ItemType.WaxedOxidizedCutCopper; - mappings[126] = ItemType.WaxedCutCopperStairs; - mappings[127] = ItemType.WaxedExposedCutCopperStairs; - mappings[128] = ItemType.WaxedWeatheredCutCopperStairs; - mappings[129] = ItemType.WaxedOxidizedCutCopperStairs; - mappings[130] = ItemType.WaxedCutCopperSlab; - mappings[131] = ItemType.WaxedExposedCutCopperSlab; - mappings[132] = ItemType.WaxedWeatheredCutCopperSlab; - mappings[133] = ItemType.WaxedOxidizedCutCopperSlab; - mappings[134] = ItemType.OakLog; - mappings[135] = ItemType.SpruceLog; - mappings[136] = ItemType.BirchLog; - mappings[137] = ItemType.JungleLog; - mappings[138] = ItemType.AcaciaLog; - mappings[139] = ItemType.CherryLog; - mappings[140] = ItemType.PaleOakLog; - mappings[141] = ItemType.DarkOakLog; - mappings[142] = ItemType.MangroveLog; - mappings[143] = ItemType.MangroveRoots; - mappings[144] = ItemType.MuddyMangroveRoots; - mappings[145] = ItemType.CrimsonStem; - mappings[146] = ItemType.WarpedStem; - mappings[147] = ItemType.BambooBlock; - mappings[148] = ItemType.StrippedOakLog; - mappings[149] = ItemType.StrippedSpruceLog; - mappings[150] = ItemType.StrippedBirchLog; - mappings[151] = ItemType.StrippedJungleLog; - mappings[152] = ItemType.StrippedAcaciaLog; - mappings[153] = ItemType.StrippedCherryLog; - mappings[154] = ItemType.StrippedDarkOakLog; - mappings[155] = ItemType.StrippedPaleOakLog; - mappings[156] = ItemType.StrippedMangroveLog; - mappings[157] = ItemType.StrippedCrimsonStem; - mappings[158] = ItemType.StrippedWarpedStem; - mappings[159] = ItemType.StrippedOakWood; - mappings[160] = ItemType.StrippedSpruceWood; - mappings[161] = ItemType.StrippedBirchWood; - mappings[162] = ItemType.StrippedJungleWood; - mappings[163] = ItemType.StrippedAcaciaWood; - mappings[164] = ItemType.StrippedCherryWood; - mappings[165] = ItemType.StrippedDarkOakWood; - mappings[166] = ItemType.StrippedPaleOakWood; - mappings[167] = ItemType.StrippedMangroveWood; - mappings[168] = ItemType.StrippedCrimsonHyphae; - mappings[169] = ItemType.StrippedWarpedHyphae; - mappings[170] = ItemType.StrippedBambooBlock; - mappings[171] = ItemType.OakWood; - mappings[172] = ItemType.SpruceWood; - mappings[173] = ItemType.BirchWood; - mappings[174] = ItemType.JungleWood; - mappings[175] = ItemType.AcaciaWood; - mappings[176] = ItemType.CherryWood; - mappings[177] = ItemType.PaleOakWood; - mappings[178] = ItemType.DarkOakWood; - mappings[179] = ItemType.MangroveWood; - mappings[180] = ItemType.CrimsonHyphae; - mappings[181] = ItemType.WarpedHyphae; - mappings[182] = ItemType.OakLeaves; - mappings[183] = ItemType.SpruceLeaves; - mappings[184] = ItemType.BirchLeaves; - mappings[185] = ItemType.JungleLeaves; - mappings[186] = ItemType.AcaciaLeaves; - mappings[187] = ItemType.CherryLeaves; - mappings[188] = ItemType.DarkOakLeaves; - mappings[189] = ItemType.PaleOakLeaves; - mappings[190] = ItemType.MangroveLeaves; - mappings[191] = ItemType.AzaleaLeaves; - mappings[192] = ItemType.FloweringAzaleaLeaves; - mappings[193] = ItemType.Sponge; - mappings[194] = ItemType.WetSponge; - mappings[195] = ItemType.Glass; - mappings[196] = ItemType.TintedGlass; - mappings[197] = ItemType.LapisBlock; - mappings[198] = ItemType.Sandstone; - mappings[199] = ItemType.ChiseledSandstone; - mappings[200] = ItemType.CutSandstone; - mappings[201] = ItemType.Cobweb; - mappings[202] = ItemType.ShortGrass; - mappings[203] = ItemType.Fern; - mappings[204] = ItemType.Bush; - mappings[205] = ItemType.Azalea; - mappings[206] = ItemType.FloweringAzalea; - mappings[207] = ItemType.DeadBush; - mappings[208] = ItemType.FireflyBush; - mappings[209] = ItemType.ShortDryGrass; - mappings[210] = ItemType.TallDryGrass; - mappings[211] = ItemType.Seagrass; - mappings[212] = ItemType.SeaPickle; - mappings[213] = ItemType.WhiteWool; - mappings[214] = ItemType.OrangeWool; - mappings[215] = ItemType.MagentaWool; - mappings[216] = ItemType.LightBlueWool; - mappings[217] = ItemType.YellowWool; - mappings[218] = ItemType.LimeWool; - mappings[219] = ItemType.PinkWool; - mappings[220] = ItemType.GrayWool; - mappings[221] = ItemType.LightGrayWool; - mappings[222] = ItemType.CyanWool; - mappings[223] = ItemType.PurpleWool; - mappings[224] = ItemType.BlueWool; - mappings[225] = ItemType.BrownWool; - mappings[226] = ItemType.GreenWool; - mappings[227] = ItemType.RedWool; - mappings[228] = ItemType.BlackWool; - mappings[229] = ItemType.Dandelion; - mappings[230] = ItemType.GoldenDandelion; - mappings[231] = ItemType.OpenEyeblossom; - mappings[232] = ItemType.ClosedEyeblossom; - mappings[233] = ItemType.Poppy; - mappings[234] = ItemType.BlueOrchid; - mappings[235] = ItemType.Allium; - mappings[236] = ItemType.AzureBluet; - mappings[237] = ItemType.RedTulip; - mappings[238] = ItemType.OrangeTulip; - mappings[239] = ItemType.WhiteTulip; - mappings[240] = ItemType.PinkTulip; - mappings[241] = ItemType.OxeyeDaisy; - mappings[242] = ItemType.Cornflower; - mappings[243] = ItemType.LilyOfTheValley; - mappings[244] = ItemType.WitherRose; - mappings[245] = ItemType.Torchflower; - mappings[246] = ItemType.PitcherPlant; - mappings[247] = ItemType.SporeBlossom; - mappings[248] = ItemType.BrownMushroom; - mappings[249] = ItemType.RedMushroom; - mappings[250] = ItemType.CrimsonFungus; - mappings[251] = ItemType.WarpedFungus; - mappings[252] = ItemType.CrimsonRoots; - mappings[253] = ItemType.WarpedRoots; - mappings[254] = ItemType.NetherSprouts; - mappings[255] = ItemType.WeepingVines; - mappings[256] = ItemType.TwistingVines; - mappings[257] = ItemType.SugarCane; - mappings[258] = ItemType.Kelp; - mappings[259] = ItemType.PinkPetals; - mappings[260] = ItemType.Wildflowers; - mappings[261] = ItemType.LeafLitter; - mappings[262] = ItemType.MossCarpet; - mappings[263] = ItemType.MossBlock; - mappings[264] = ItemType.PaleMossCarpet; - mappings[265] = ItemType.PaleHangingMoss; - mappings[266] = ItemType.PaleMossBlock; - mappings[267] = ItemType.HangingRoots; - mappings[268] = ItemType.BigDripleaf; - mappings[269] = ItemType.SmallDripleaf; - mappings[270] = ItemType.Bamboo; - mappings[271] = ItemType.OakSlab; - mappings[272] = ItemType.SpruceSlab; - mappings[273] = ItemType.BirchSlab; - mappings[274] = ItemType.JungleSlab; - mappings[275] = ItemType.AcaciaSlab; - mappings[276] = ItemType.CherrySlab; - mappings[277] = ItemType.DarkOakSlab; - mappings[278] = ItemType.PaleOakSlab; - mappings[279] = ItemType.MangroveSlab; - mappings[280] = ItemType.BambooSlab; - mappings[281] = ItemType.BambooMosaicSlab; - mappings[282] = ItemType.CrimsonSlab; - mappings[283] = ItemType.WarpedSlab; - mappings[284] = ItemType.StoneSlab; - mappings[285] = ItemType.SmoothStoneSlab; - mappings[286] = ItemType.SandstoneSlab; - mappings[287] = ItemType.CutSandstoneSlab; - mappings[288] = ItemType.PetrifiedOakSlab; - mappings[289] = ItemType.CobblestoneSlab; - mappings[290] = ItemType.BrickSlab; - mappings[291] = ItemType.StoneBrickSlab; - mappings[292] = ItemType.MudBrickSlab; - mappings[293] = ItemType.NetherBrickSlab; - mappings[294] = ItemType.QuartzSlab; - mappings[295] = ItemType.RedSandstoneSlab; - mappings[296] = ItemType.CutRedSandstoneSlab; - mappings[297] = ItemType.PurpurSlab; - mappings[298] = ItemType.PrismarineSlab; - mappings[299] = ItemType.PrismarineBrickSlab; - mappings[300] = ItemType.DarkPrismarineSlab; - mappings[301] = ItemType.SmoothQuartz; - mappings[302] = ItemType.SmoothRedSandstone; - mappings[303] = ItemType.SmoothSandstone; - mappings[304] = ItemType.SmoothStone; - mappings[305] = ItemType.Bricks; - mappings[306] = ItemType.AcaciaShelf; - mappings[307] = ItemType.BambooShelf; - mappings[308] = ItemType.BirchShelf; - mappings[309] = ItemType.CherryShelf; - mappings[310] = ItemType.CrimsonShelf; - mappings[311] = ItemType.DarkOakShelf; - mappings[312] = ItemType.JungleShelf; - mappings[313] = ItemType.MangroveShelf; - mappings[314] = ItemType.OakShelf; - mappings[315] = ItemType.PaleOakShelf; - mappings[316] = ItemType.SpruceShelf; - mappings[317] = ItemType.WarpedShelf; - mappings[318] = ItemType.Bookshelf; - mappings[319] = ItemType.ChiseledBookshelf; - mappings[320] = ItemType.DecoratedPot; - mappings[321] = ItemType.MossyCobblestone; - mappings[322] = ItemType.Obsidian; - mappings[323] = ItemType.Torch; - mappings[324] = ItemType.EndRod; - mappings[325] = ItemType.ChorusPlant; - mappings[326] = ItemType.ChorusFlower; - mappings[327] = ItemType.PurpurBlock; - mappings[328] = ItemType.PurpurPillar; - mappings[329] = ItemType.PurpurStairs; - mappings[330] = ItemType.Spawner; - mappings[331] = ItemType.CreakingHeart; - mappings[332] = ItemType.Chest; - mappings[333] = ItemType.CraftingTable; - mappings[334] = ItemType.Farmland; - mappings[335] = ItemType.Furnace; - mappings[336] = ItemType.Ladder; - mappings[337] = ItemType.CobblestoneStairs; - mappings[338] = ItemType.Snow; - mappings[339] = ItemType.Ice; - mappings[340] = ItemType.SnowBlock; - mappings[341] = ItemType.Cactus; - mappings[342] = ItemType.CactusFlower; - mappings[343] = ItemType.Clay; - mappings[344] = ItemType.Jukebox; - mappings[345] = ItemType.OakFence; - mappings[346] = ItemType.SpruceFence; - mappings[347] = ItemType.BirchFence; - mappings[348] = ItemType.JungleFence; - mappings[349] = ItemType.AcaciaFence; - mappings[350] = ItemType.CherryFence; - mappings[351] = ItemType.DarkOakFence; - mappings[352] = ItemType.PaleOakFence; - mappings[353] = ItemType.MangroveFence; - mappings[354] = ItemType.BambooFence; - mappings[355] = ItemType.CrimsonFence; - mappings[356] = ItemType.WarpedFence; - mappings[357] = ItemType.Pumpkin; - mappings[358] = ItemType.CarvedPumpkin; - mappings[359] = ItemType.JackOLantern; - mappings[360] = ItemType.Netherrack; - mappings[361] = ItemType.SoulSand; - mappings[362] = ItemType.SoulSoil; - mappings[363] = ItemType.Basalt; - mappings[364] = ItemType.PolishedBasalt; - mappings[365] = ItemType.SmoothBasalt; - mappings[366] = ItemType.SoulTorch; - mappings[367] = ItemType.CopperTorch; - mappings[368] = ItemType.Glowstone; - mappings[369] = ItemType.InfestedStone; - mappings[370] = ItemType.InfestedCobblestone; - mappings[371] = ItemType.InfestedStoneBricks; - mappings[372] = ItemType.InfestedMossyStoneBricks; - mappings[373] = ItemType.InfestedCrackedStoneBricks; - mappings[374] = ItemType.InfestedChiseledStoneBricks; - mappings[375] = ItemType.InfestedDeepslate; - mappings[376] = ItemType.StoneBricks; - mappings[377] = ItemType.MossyStoneBricks; - mappings[378] = ItemType.CrackedStoneBricks; - mappings[379] = ItemType.ChiseledStoneBricks; - mappings[380] = ItemType.PackedMud; - mappings[381] = ItemType.MudBricks; - mappings[382] = ItemType.DeepslateBricks; - mappings[383] = ItemType.CrackedDeepslateBricks; - mappings[384] = ItemType.DeepslateTiles; - mappings[385] = ItemType.CrackedDeepslateTiles; - mappings[386] = ItemType.ChiseledDeepslate; - mappings[387] = ItemType.ReinforcedDeepslate; - mappings[388] = ItemType.BrownMushroomBlock; - mappings[389] = ItemType.RedMushroomBlock; - mappings[390] = ItemType.MushroomStem; - mappings[391] = ItemType.IronBars; - mappings[392] = ItemType.CopperBars; - mappings[393] = ItemType.ExposedCopperBars; - mappings[394] = ItemType.WeatheredCopperBars; - mappings[395] = ItemType.OxidizedCopperBars; - mappings[396] = ItemType.WaxedCopperBars; - mappings[397] = ItemType.WaxedExposedCopperBars; - mappings[398] = ItemType.WaxedWeatheredCopperBars; - mappings[399] = ItemType.WaxedOxidizedCopperBars; - mappings[400] = ItemType.IronChain; - mappings[401] = ItemType.CopperChain; - mappings[402] = ItemType.ExposedCopperChain; - mappings[403] = ItemType.WeatheredCopperChain; - mappings[404] = ItemType.OxidizedCopperChain; - mappings[405] = ItemType.WaxedCopperChain; - mappings[406] = ItemType.WaxedExposedCopperChain; - mappings[407] = ItemType.WaxedWeatheredCopperChain; - mappings[408] = ItemType.WaxedOxidizedCopperChain; - mappings[409] = ItemType.GlassPane; - mappings[410] = ItemType.Melon; - mappings[411] = ItemType.Vine; - mappings[412] = ItemType.GlowLichen; - mappings[413] = ItemType.ResinClump; - mappings[414] = ItemType.ResinBlock; - mappings[415] = ItemType.ResinBricks; - mappings[416] = ItemType.ResinBrickStairs; - mappings[417] = ItemType.ResinBrickSlab; - mappings[418] = ItemType.ResinBrickWall; - mappings[419] = ItemType.ChiseledResinBricks; - mappings[420] = ItemType.BrickStairs; - mappings[421] = ItemType.StoneBrickStairs; - mappings[422] = ItemType.MudBrickStairs; - mappings[423] = ItemType.Mycelium; - mappings[424] = ItemType.LilyPad; - mappings[425] = ItemType.NetherBricks; - mappings[426] = ItemType.CrackedNetherBricks; - mappings[427] = ItemType.ChiseledNetherBricks; - mappings[428] = ItemType.NetherBrickFence; - mappings[429] = ItemType.NetherBrickStairs; - mappings[430] = ItemType.Sculk; - mappings[431] = ItemType.SculkVein; - mappings[432] = ItemType.SculkCatalyst; - mappings[433] = ItemType.SculkShrieker; - mappings[434] = ItemType.EnchantingTable; - mappings[435] = ItemType.EndPortalFrame; - mappings[436] = ItemType.EndStone; - mappings[437] = ItemType.EndStoneBricks; - mappings[438] = ItemType.DragonEgg; - mappings[439] = ItemType.SandstoneStairs; - mappings[440] = ItemType.EnderChest; - mappings[441] = ItemType.EmeraldBlock; - mappings[442] = ItemType.OakStairs; - mappings[443] = ItemType.SpruceStairs; - mappings[444] = ItemType.BirchStairs; - mappings[445] = ItemType.JungleStairs; - mappings[446] = ItemType.AcaciaStairs; - mappings[447] = ItemType.CherryStairs; - mappings[448] = ItemType.DarkOakStairs; - mappings[449] = ItemType.PaleOakStairs; - mappings[450] = ItemType.MangroveStairs; - mappings[451] = ItemType.BambooStairs; - mappings[452] = ItemType.BambooMosaicStairs; - mappings[453] = ItemType.CrimsonStairs; - mappings[454] = ItemType.WarpedStairs; - mappings[455] = ItemType.CommandBlock; - mappings[456] = ItemType.Beacon; - mappings[457] = ItemType.CobblestoneWall; - mappings[458] = ItemType.MossyCobblestoneWall; - mappings[459] = ItemType.BrickWall; - mappings[460] = ItemType.PrismarineWall; - mappings[461] = ItemType.RedSandstoneWall; - mappings[462] = ItemType.MossyStoneBrickWall; - mappings[463] = ItemType.GraniteWall; - mappings[464] = ItemType.StoneBrickWall; - mappings[465] = ItemType.MudBrickWall; - mappings[466] = ItemType.NetherBrickWall; - mappings[467] = ItemType.AndesiteWall; - mappings[468] = ItemType.RedNetherBrickWall; - mappings[469] = ItemType.SandstoneWall; - mappings[470] = ItemType.EndStoneBrickWall; - mappings[471] = ItemType.DioriteWall; - mappings[472] = ItemType.BlackstoneWall; - mappings[473] = ItemType.PolishedBlackstoneWall; - mappings[474] = ItemType.PolishedBlackstoneBrickWall; - mappings[475] = ItemType.CobbledDeepslateWall; - mappings[476] = ItemType.PolishedDeepslateWall; - mappings[477] = ItemType.DeepslateBrickWall; - mappings[478] = ItemType.DeepslateTileWall; - mappings[479] = ItemType.Anvil; - mappings[480] = ItemType.ChippedAnvil; - mappings[481] = ItemType.DamagedAnvil; - mappings[482] = ItemType.ChiseledQuartzBlock; - mappings[483] = ItemType.QuartzBlock; - mappings[484] = ItemType.QuartzBricks; - mappings[485] = ItemType.QuartzPillar; - mappings[486] = ItemType.QuartzStairs; - mappings[487] = ItemType.WhiteTerracotta; - mappings[488] = ItemType.OrangeTerracotta; - mappings[489] = ItemType.MagentaTerracotta; - mappings[490] = ItemType.LightBlueTerracotta; - mappings[491] = ItemType.YellowTerracotta; - mappings[492] = ItemType.LimeTerracotta; - mappings[493] = ItemType.PinkTerracotta; - mappings[494] = ItemType.GrayTerracotta; - mappings[495] = ItemType.LightGrayTerracotta; - mappings[496] = ItemType.CyanTerracotta; - mappings[497] = ItemType.PurpleTerracotta; - mappings[498] = ItemType.BlueTerracotta; - mappings[499] = ItemType.BrownTerracotta; - mappings[500] = ItemType.GreenTerracotta; - mappings[501] = ItemType.RedTerracotta; - mappings[502] = ItemType.BlackTerracotta; - mappings[503] = ItemType.Barrier; - mappings[504] = ItemType.Light; - mappings[505] = ItemType.HayBlock; - mappings[506] = ItemType.WhiteCarpet; - mappings[507] = ItemType.OrangeCarpet; - mappings[508] = ItemType.MagentaCarpet; - mappings[509] = ItemType.LightBlueCarpet; - mappings[510] = ItemType.YellowCarpet; - mappings[511] = ItemType.LimeCarpet; - mappings[512] = ItemType.PinkCarpet; - mappings[513] = ItemType.GrayCarpet; - mappings[514] = ItemType.LightGrayCarpet; - mappings[515] = ItemType.CyanCarpet; - mappings[516] = ItemType.PurpleCarpet; - mappings[517] = ItemType.BlueCarpet; - mappings[518] = ItemType.BrownCarpet; - mappings[519] = ItemType.GreenCarpet; - mappings[520] = ItemType.RedCarpet; - mappings[521] = ItemType.BlackCarpet; - mappings[522] = ItemType.Terracotta; - mappings[523] = ItemType.PackedIce; - mappings[524] = ItemType.DirtPath; - mappings[525] = ItemType.Sunflower; - mappings[526] = ItemType.Lilac; - mappings[527] = ItemType.RoseBush; - mappings[528] = ItemType.Peony; - mappings[529] = ItemType.TallGrass; - mappings[530] = ItemType.LargeFern; - mappings[531] = ItemType.WhiteStainedGlass; - mappings[532] = ItemType.OrangeStainedGlass; - mappings[533] = ItemType.MagentaStainedGlass; - mappings[534] = ItemType.LightBlueStainedGlass; - mappings[535] = ItemType.YellowStainedGlass; - mappings[536] = ItemType.LimeStainedGlass; - mappings[537] = ItemType.PinkStainedGlass; - mappings[538] = ItemType.GrayStainedGlass; - mappings[539] = ItemType.LightGrayStainedGlass; - mappings[540] = ItemType.CyanStainedGlass; - mappings[541] = ItemType.PurpleStainedGlass; - mappings[542] = ItemType.BlueStainedGlass; - mappings[543] = ItemType.BrownStainedGlass; - mappings[544] = ItemType.GreenStainedGlass; - mappings[545] = ItemType.RedStainedGlass; - mappings[546] = ItemType.BlackStainedGlass; - mappings[547] = ItemType.WhiteStainedGlassPane; - mappings[548] = ItemType.OrangeStainedGlassPane; - mappings[549] = ItemType.MagentaStainedGlassPane; - mappings[550] = ItemType.LightBlueStainedGlassPane; - mappings[551] = ItemType.YellowStainedGlassPane; - mappings[552] = ItemType.LimeStainedGlassPane; - mappings[553] = ItemType.PinkStainedGlassPane; - mappings[554] = ItemType.GrayStainedGlassPane; - mappings[555] = ItemType.LightGrayStainedGlassPane; - mappings[556] = ItemType.CyanStainedGlassPane; - mappings[557] = ItemType.PurpleStainedGlassPane; - mappings[558] = ItemType.BlueStainedGlassPane; - mappings[559] = ItemType.BrownStainedGlassPane; - mappings[560] = ItemType.GreenStainedGlassPane; - mappings[561] = ItemType.RedStainedGlassPane; - mappings[562] = ItemType.BlackStainedGlassPane; - mappings[563] = ItemType.Prismarine; - mappings[564] = ItemType.PrismarineBricks; - mappings[565] = ItemType.DarkPrismarine; - mappings[566] = ItemType.PrismarineStairs; - mappings[567] = ItemType.PrismarineBrickStairs; - mappings[568] = ItemType.DarkPrismarineStairs; - mappings[569] = ItemType.SeaLantern; - mappings[570] = ItemType.RedSandstone; - mappings[571] = ItemType.ChiseledRedSandstone; - mappings[572] = ItemType.CutRedSandstone; - mappings[573] = ItemType.RedSandstoneStairs; - mappings[574] = ItemType.RepeatingCommandBlock; - mappings[575] = ItemType.ChainCommandBlock; - mappings[576] = ItemType.MagmaBlock; - mappings[577] = ItemType.NetherWartBlock; - mappings[578] = ItemType.WarpedWartBlock; - mappings[579] = ItemType.RedNetherBricks; - mappings[580] = ItemType.BoneBlock; - mappings[581] = ItemType.StructureVoid; - mappings[582] = ItemType.ShulkerBox; - mappings[583] = ItemType.WhiteShulkerBox; - mappings[584] = ItemType.OrangeShulkerBox; - mappings[585] = ItemType.MagentaShulkerBox; - mappings[586] = ItemType.LightBlueShulkerBox; - mappings[587] = ItemType.YellowShulkerBox; - mappings[588] = ItemType.LimeShulkerBox; - mappings[589] = ItemType.PinkShulkerBox; - mappings[590] = ItemType.GrayShulkerBox; - mappings[591] = ItemType.LightGrayShulkerBox; - mappings[592] = ItemType.CyanShulkerBox; - mappings[593] = ItemType.PurpleShulkerBox; - mappings[594] = ItemType.BlueShulkerBox; - mappings[595] = ItemType.BrownShulkerBox; - mappings[596] = ItemType.GreenShulkerBox; - mappings[597] = ItemType.RedShulkerBox; - mappings[598] = ItemType.BlackShulkerBox; - mappings[599] = ItemType.WhiteGlazedTerracotta; - mappings[600] = ItemType.OrangeGlazedTerracotta; - mappings[601] = ItemType.MagentaGlazedTerracotta; - mappings[602] = ItemType.LightBlueGlazedTerracotta; - mappings[603] = ItemType.YellowGlazedTerracotta; - mappings[604] = ItemType.LimeGlazedTerracotta; - mappings[605] = ItemType.PinkGlazedTerracotta; - mappings[606] = ItemType.GrayGlazedTerracotta; - mappings[607] = ItemType.LightGrayGlazedTerracotta; - mappings[608] = ItemType.CyanGlazedTerracotta; - mappings[609] = ItemType.PurpleGlazedTerracotta; - mappings[610] = ItemType.BlueGlazedTerracotta; - mappings[611] = ItemType.BrownGlazedTerracotta; - mappings[612] = ItemType.GreenGlazedTerracotta; - mappings[613] = ItemType.RedGlazedTerracotta; - mappings[614] = ItemType.BlackGlazedTerracotta; - mappings[615] = ItemType.WhiteConcrete; - mappings[616] = ItemType.OrangeConcrete; - mappings[617] = ItemType.MagentaConcrete; - mappings[618] = ItemType.LightBlueConcrete; - mappings[619] = ItemType.YellowConcrete; - mappings[620] = ItemType.LimeConcrete; - mappings[621] = ItemType.PinkConcrete; - mappings[622] = ItemType.GrayConcrete; - mappings[623] = ItemType.LightGrayConcrete; - mappings[624] = ItemType.CyanConcrete; - mappings[625] = ItemType.PurpleConcrete; - mappings[626] = ItemType.BlueConcrete; - mappings[627] = ItemType.BrownConcrete; - mappings[628] = ItemType.GreenConcrete; - mappings[629] = ItemType.RedConcrete; - mappings[630] = ItemType.BlackConcrete; - mappings[631] = ItemType.WhiteConcretePowder; - mappings[632] = ItemType.OrangeConcretePowder; - mappings[633] = ItemType.MagentaConcretePowder; - mappings[634] = ItemType.LightBlueConcretePowder; - mappings[635] = ItemType.YellowConcretePowder; - mappings[636] = ItemType.LimeConcretePowder; - mappings[637] = ItemType.PinkConcretePowder; - mappings[638] = ItemType.GrayConcretePowder; - mappings[639] = ItemType.LightGrayConcretePowder; - mappings[640] = ItemType.CyanConcretePowder; - mappings[641] = ItemType.PurpleConcretePowder; - mappings[642] = ItemType.BlueConcretePowder; - mappings[643] = ItemType.BrownConcretePowder; - mappings[644] = ItemType.GreenConcretePowder; - mappings[645] = ItemType.RedConcretePowder; - mappings[646] = ItemType.BlackConcretePowder; - mappings[647] = ItemType.TurtleEgg; - mappings[648] = ItemType.SnifferEgg; - mappings[649] = ItemType.DriedGhast; - mappings[650] = ItemType.DeadTubeCoralBlock; - mappings[651] = ItemType.DeadBrainCoralBlock; - mappings[652] = ItemType.DeadBubbleCoralBlock; - mappings[653] = ItemType.DeadFireCoralBlock; - mappings[654] = ItemType.DeadHornCoralBlock; - mappings[655] = ItemType.TubeCoralBlock; - mappings[656] = ItemType.BrainCoralBlock; - mappings[657] = ItemType.BubbleCoralBlock; - mappings[658] = ItemType.FireCoralBlock; - mappings[659] = ItemType.HornCoralBlock; - mappings[660] = ItemType.TubeCoral; - mappings[661] = ItemType.BrainCoral; - mappings[662] = ItemType.BubbleCoral; - mappings[663] = ItemType.FireCoral; - mappings[664] = ItemType.HornCoral; - mappings[665] = ItemType.DeadBrainCoral; - mappings[666] = ItemType.DeadBubbleCoral; - mappings[667] = ItemType.DeadFireCoral; - mappings[668] = ItemType.DeadHornCoral; - mappings[669] = ItemType.DeadTubeCoral; - mappings[670] = ItemType.TubeCoralFan; - mappings[671] = ItemType.BrainCoralFan; - mappings[672] = ItemType.BubbleCoralFan; - mappings[673] = ItemType.FireCoralFan; - mappings[674] = ItemType.HornCoralFan; - mappings[675] = ItemType.DeadTubeCoralFan; - mappings[676] = ItemType.DeadBrainCoralFan; - mappings[677] = ItemType.DeadBubbleCoralFan; - mappings[678] = ItemType.DeadFireCoralFan; - mappings[679] = ItemType.DeadHornCoralFan; - mappings[680] = ItemType.BlueIce; - mappings[681] = ItemType.Conduit; - mappings[682] = ItemType.PolishedGraniteStairs; - mappings[683] = ItemType.SmoothRedSandstoneStairs; - mappings[684] = ItemType.MossyStoneBrickStairs; - mappings[685] = ItemType.PolishedDioriteStairs; - mappings[686] = ItemType.MossyCobblestoneStairs; - mappings[687] = ItemType.EndStoneBrickStairs; - mappings[688] = ItemType.StoneStairs; - mappings[689] = ItemType.SmoothSandstoneStairs; - mappings[690] = ItemType.SmoothQuartzStairs; - mappings[691] = ItemType.GraniteStairs; - mappings[692] = ItemType.AndesiteStairs; - mappings[693] = ItemType.RedNetherBrickStairs; - mappings[694] = ItemType.PolishedAndesiteStairs; - mappings[695] = ItemType.DioriteStairs; - mappings[696] = ItemType.CobbledDeepslateStairs; - mappings[697] = ItemType.PolishedDeepslateStairs; - mappings[698] = ItemType.DeepslateBrickStairs; - mappings[699] = ItemType.DeepslateTileStairs; - mappings[700] = ItemType.PolishedGraniteSlab; - mappings[701] = ItemType.SmoothRedSandstoneSlab; - mappings[702] = ItemType.MossyStoneBrickSlab; - mappings[703] = ItemType.PolishedDioriteSlab; - mappings[704] = ItemType.MossyCobblestoneSlab; - mappings[705] = ItemType.EndStoneBrickSlab; - mappings[706] = ItemType.SmoothSandstoneSlab; - mappings[707] = ItemType.SmoothQuartzSlab; - mappings[708] = ItemType.GraniteSlab; - mappings[709] = ItemType.AndesiteSlab; - mappings[710] = ItemType.RedNetherBrickSlab; - mappings[711] = ItemType.PolishedAndesiteSlab; - mappings[712] = ItemType.DioriteSlab; - mappings[713] = ItemType.CobbledDeepslateSlab; - mappings[714] = ItemType.PolishedDeepslateSlab; - mappings[715] = ItemType.DeepslateBrickSlab; - mappings[716] = ItemType.DeepslateTileSlab; - mappings[717] = ItemType.Scaffolding; - mappings[718] = ItemType.Redstone; - mappings[719] = ItemType.RedstoneTorch; - mappings[720] = ItemType.RedstoneBlock; - mappings[721] = ItemType.Repeater; - mappings[722] = ItemType.Comparator; - mappings[723] = ItemType.Piston; - mappings[724] = ItemType.StickyPiston; - mappings[725] = ItemType.SlimeBlock; - mappings[726] = ItemType.HoneyBlock; - mappings[727] = ItemType.Observer; - mappings[728] = ItemType.Hopper; - mappings[729] = ItemType.Dispenser; - mappings[730] = ItemType.Dropper; - mappings[731] = ItemType.Lectern; - mappings[732] = ItemType.Target; - mappings[733] = ItemType.Lever; - mappings[734] = ItemType.LightningRod; - mappings[735] = ItemType.ExposedLightningRod; - mappings[736] = ItemType.WeatheredLightningRod; - mappings[737] = ItemType.OxidizedLightningRod; - mappings[738] = ItemType.WaxedLightningRod; - mappings[739] = ItemType.WaxedExposedLightningRod; - mappings[740] = ItemType.WaxedWeatheredLightningRod; - mappings[741] = ItemType.WaxedOxidizedLightningRod; - mappings[742] = ItemType.DaylightDetector; - mappings[743] = ItemType.SculkSensor; - mappings[744] = ItemType.CalibratedSculkSensor; - mappings[745] = ItemType.TripwireHook; - mappings[746] = ItemType.TrappedChest; - mappings[747] = ItemType.Tnt; - mappings[748] = ItemType.RedstoneLamp; - mappings[749] = ItemType.NoteBlock; - mappings[750] = ItemType.StoneButton; - mappings[751] = ItemType.PolishedBlackstoneButton; - mappings[752] = ItemType.OakButton; - mappings[753] = ItemType.SpruceButton; - mappings[754] = ItemType.BirchButton; - mappings[755] = ItemType.JungleButton; - mappings[756] = ItemType.AcaciaButton; - mappings[757] = ItemType.CherryButton; - mappings[758] = ItemType.DarkOakButton; - mappings[759] = ItemType.PaleOakButton; - mappings[760] = ItemType.MangroveButton; - mappings[761] = ItemType.BambooButton; - mappings[762] = ItemType.CrimsonButton; - mappings[763] = ItemType.WarpedButton; - mappings[764] = ItemType.StonePressurePlate; - mappings[765] = ItemType.PolishedBlackstonePressurePlate; - mappings[766] = ItemType.LightWeightedPressurePlate; - mappings[767] = ItemType.HeavyWeightedPressurePlate; - mappings[768] = ItemType.OakPressurePlate; - mappings[769] = ItemType.SprucePressurePlate; - mappings[770] = ItemType.BirchPressurePlate; - mappings[771] = ItemType.JunglePressurePlate; - mappings[772] = ItemType.AcaciaPressurePlate; - mappings[773] = ItemType.CherryPressurePlate; - mappings[774] = ItemType.DarkOakPressurePlate; - mappings[775] = ItemType.PaleOakPressurePlate; - mappings[776] = ItemType.MangrovePressurePlate; - mappings[777] = ItemType.BambooPressurePlate; - mappings[778] = ItemType.CrimsonPressurePlate; - mappings[779] = ItemType.WarpedPressurePlate; - mappings[780] = ItemType.IronDoor; - mappings[781] = ItemType.OakDoor; - mappings[782] = ItemType.SpruceDoor; - mappings[783] = ItemType.BirchDoor; - mappings[784] = ItemType.JungleDoor; - mappings[785] = ItemType.AcaciaDoor; - mappings[786] = ItemType.CherryDoor; - mappings[787] = ItemType.DarkOakDoor; - mappings[788] = ItemType.PaleOakDoor; - mappings[789] = ItemType.MangroveDoor; - mappings[790] = ItemType.BambooDoor; - mappings[791] = ItemType.CrimsonDoor; - mappings[792] = ItemType.WarpedDoor; - mappings[793] = ItemType.CopperDoor; - mappings[794] = ItemType.ExposedCopperDoor; - mappings[795] = ItemType.WeatheredCopperDoor; - mappings[796] = ItemType.OxidizedCopperDoor; - mappings[797] = ItemType.WaxedCopperDoor; - mappings[798] = ItemType.WaxedExposedCopperDoor; - mappings[799] = ItemType.WaxedWeatheredCopperDoor; - mappings[800] = ItemType.WaxedOxidizedCopperDoor; - mappings[801] = ItemType.IronTrapdoor; - mappings[802] = ItemType.OakTrapdoor; - mappings[803] = ItemType.SpruceTrapdoor; - mappings[804] = ItemType.BirchTrapdoor; - mappings[805] = ItemType.JungleTrapdoor; - mappings[806] = ItemType.AcaciaTrapdoor; - mappings[807] = ItemType.CherryTrapdoor; - mappings[808] = ItemType.DarkOakTrapdoor; - mappings[809] = ItemType.PaleOakTrapdoor; - mappings[810] = ItemType.MangroveTrapdoor; - mappings[811] = ItemType.BambooTrapdoor; - mappings[812] = ItemType.CrimsonTrapdoor; - mappings[813] = ItemType.WarpedTrapdoor; - mappings[814] = ItemType.CopperTrapdoor; - mappings[815] = ItemType.ExposedCopperTrapdoor; - mappings[816] = ItemType.WeatheredCopperTrapdoor; - mappings[817] = ItemType.OxidizedCopperTrapdoor; - mappings[818] = ItemType.WaxedCopperTrapdoor; - mappings[819] = ItemType.WaxedExposedCopperTrapdoor; - mappings[820] = ItemType.WaxedWeatheredCopperTrapdoor; - mappings[821] = ItemType.WaxedOxidizedCopperTrapdoor; - mappings[822] = ItemType.OakFenceGate; - mappings[823] = ItemType.SpruceFenceGate; - mappings[824] = ItemType.BirchFenceGate; - mappings[825] = ItemType.JungleFenceGate; - mappings[826] = ItemType.AcaciaFenceGate; - mappings[827] = ItemType.CherryFenceGate; - mappings[828] = ItemType.DarkOakFenceGate; - mappings[829] = ItemType.PaleOakFenceGate; - mappings[830] = ItemType.MangroveFenceGate; - mappings[831] = ItemType.BambooFenceGate; - mappings[832] = ItemType.CrimsonFenceGate; - mappings[833] = ItemType.WarpedFenceGate; - mappings[834] = ItemType.PoweredRail; - mappings[835] = ItemType.DetectorRail; - mappings[836] = ItemType.Rail; - mappings[837] = ItemType.ActivatorRail; - mappings[838] = ItemType.Saddle; - mappings[839] = ItemType.WhiteHarness; - mappings[840] = ItemType.OrangeHarness; - mappings[841] = ItemType.MagentaHarness; - mappings[842] = ItemType.LightBlueHarness; - mappings[843] = ItemType.YellowHarness; - mappings[844] = ItemType.LimeHarness; - mappings[845] = ItemType.PinkHarness; - mappings[846] = ItemType.GrayHarness; - mappings[847] = ItemType.LightGrayHarness; - mappings[848] = ItemType.CyanHarness; - mappings[849] = ItemType.PurpleHarness; - mappings[850] = ItemType.BlueHarness; - mappings[851] = ItemType.BrownHarness; - mappings[852] = ItemType.GreenHarness; - mappings[853] = ItemType.RedHarness; - mappings[854] = ItemType.BlackHarness; - mappings[855] = ItemType.Minecart; - mappings[856] = ItemType.ChestMinecart; - mappings[857] = ItemType.FurnaceMinecart; - mappings[858] = ItemType.TntMinecart; - mappings[859] = ItemType.HopperMinecart; - mappings[860] = ItemType.CarrotOnAStick; - mappings[861] = ItemType.WarpedFungusOnAStick; - mappings[862] = ItemType.PhantomMembrane; - mappings[863] = ItemType.Elytra; - mappings[864] = ItemType.OakBoat; - mappings[865] = ItemType.OakChestBoat; - mappings[866] = ItemType.SpruceBoat; - mappings[867] = ItemType.SpruceChestBoat; - mappings[868] = ItemType.BirchBoat; - mappings[869] = ItemType.BirchChestBoat; - mappings[870] = ItemType.JungleBoat; - mappings[871] = ItemType.JungleChestBoat; - mappings[872] = ItemType.AcaciaBoat; - mappings[873] = ItemType.AcaciaChestBoat; - mappings[874] = ItemType.CherryBoat; - mappings[875] = ItemType.CherryChestBoat; - mappings[876] = ItemType.DarkOakBoat; - mappings[877] = ItemType.DarkOakChestBoat; - mappings[878] = ItemType.PaleOakBoat; - mappings[879] = ItemType.PaleOakChestBoat; - mappings[880] = ItemType.MangroveBoat; - mappings[881] = ItemType.MangroveChestBoat; - mappings[882] = ItemType.BambooRaft; - mappings[883] = ItemType.BambooChestRaft; - mappings[884] = ItemType.StructureBlock; - mappings[885] = ItemType.Jigsaw; - mappings[886] = ItemType.TestBlock; - mappings[887] = ItemType.TestInstanceBlock; - mappings[888] = ItemType.TurtleHelmet; - mappings[889] = ItemType.TurtleScute; - mappings[890] = ItemType.ArmadilloScute; - mappings[891] = ItemType.WolfArmor; - mappings[892] = ItemType.FlintAndSteel; - mappings[893] = ItemType.Bowl; - mappings[894] = ItemType.Apple; - mappings[895] = ItemType.Bow; - mappings[896] = ItemType.Arrow; - mappings[897] = ItemType.Coal; - mappings[898] = ItemType.Charcoal; - mappings[899] = ItemType.Diamond; - mappings[900] = ItemType.Emerald; - mappings[901] = ItemType.LapisLazuli; - mappings[902] = ItemType.Quartz; - mappings[903] = ItemType.AmethystShard; - mappings[904] = ItemType.RawIron; - mappings[905] = ItemType.IronIngot; - mappings[906] = ItemType.RawCopper; - mappings[907] = ItemType.CopperIngot; - mappings[908] = ItemType.RawGold; - mappings[909] = ItemType.GoldIngot; - mappings[910] = ItemType.NetheriteIngot; - mappings[911] = ItemType.NetheriteScrap; - mappings[912] = ItemType.WoodenSword; - mappings[913] = ItemType.WoodenShovel; - mappings[914] = ItemType.WoodenPickaxe; - mappings[915] = ItemType.WoodenAxe; - mappings[916] = ItemType.WoodenHoe; - mappings[917] = ItemType.CopperSword; - mappings[918] = ItemType.CopperShovel; - mappings[919] = ItemType.CopperPickaxe; - mappings[920] = ItemType.CopperAxe; - mappings[921] = ItemType.CopperHoe; - mappings[922] = ItemType.StoneSword; - mappings[923] = ItemType.StoneShovel; - mappings[924] = ItemType.StonePickaxe; - mappings[925] = ItemType.StoneAxe; - mappings[926] = ItemType.StoneHoe; - mappings[927] = ItemType.GoldenSword; - mappings[928] = ItemType.GoldenShovel; - mappings[929] = ItemType.GoldenPickaxe; - mappings[930] = ItemType.GoldenAxe; - mappings[931] = ItemType.GoldenHoe; - mappings[932] = ItemType.IronSword; - mappings[933] = ItemType.IronShovel; - mappings[934] = ItemType.IronPickaxe; - mappings[935] = ItemType.IronAxe; - mappings[936] = ItemType.IronHoe; - mappings[937] = ItemType.DiamondSword; - mappings[938] = ItemType.DiamondShovel; - mappings[939] = ItemType.DiamondPickaxe; - mappings[940] = ItemType.DiamondAxe; - mappings[941] = ItemType.DiamondHoe; - mappings[942] = ItemType.NetheriteSword; - mappings[943] = ItemType.NetheriteShovel; - mappings[944] = ItemType.NetheritePickaxe; - mappings[945] = ItemType.NetheriteAxe; - mappings[946] = ItemType.NetheriteHoe; - mappings[947] = ItemType.Stick; - mappings[948] = ItemType.MushroomStew; - mappings[949] = ItemType.String; - mappings[950] = ItemType.Feather; - mappings[951] = ItemType.Gunpowder; - mappings[952] = ItemType.WheatSeeds; - mappings[953] = ItemType.Wheat; - mappings[954] = ItemType.Bread; - mappings[955] = ItemType.LeatherHelmet; - mappings[956] = ItemType.LeatherChestplate; - mappings[957] = ItemType.LeatherLeggings; - mappings[958] = ItemType.LeatherBoots; - mappings[959] = ItemType.CopperHelmet; - mappings[960] = ItemType.CopperChestplate; - mappings[961] = ItemType.CopperLeggings; - mappings[962] = ItemType.CopperBoots; - mappings[963] = ItemType.ChainmailHelmet; - mappings[964] = ItemType.ChainmailChestplate; - mappings[965] = ItemType.ChainmailLeggings; - mappings[966] = ItemType.ChainmailBoots; - mappings[967] = ItemType.IronHelmet; - mappings[968] = ItemType.IronChestplate; - mappings[969] = ItemType.IronLeggings; - mappings[970] = ItemType.IronBoots; - mappings[971] = ItemType.DiamondHelmet; - mappings[972] = ItemType.DiamondChestplate; - mappings[973] = ItemType.DiamondLeggings; - mappings[974] = ItemType.DiamondBoots; - mappings[975] = ItemType.GoldenHelmet; - mappings[976] = ItemType.GoldenChestplate; - mappings[977] = ItemType.GoldenLeggings; - mappings[978] = ItemType.GoldenBoots; - mappings[979] = ItemType.NetheriteHelmet; - mappings[980] = ItemType.NetheriteChestplate; - mappings[981] = ItemType.NetheriteLeggings; - mappings[982] = ItemType.NetheriteBoots; - mappings[983] = ItemType.Flint; - mappings[984] = ItemType.Porkchop; - mappings[985] = ItemType.CookedPorkchop; - mappings[986] = ItemType.Painting; - mappings[987] = ItemType.GoldenApple; - mappings[988] = ItemType.EnchantedGoldenApple; - mappings[989] = ItemType.OakSign; - mappings[990] = ItemType.SpruceSign; - mappings[991] = ItemType.BirchSign; - mappings[992] = ItemType.JungleSign; - mappings[993] = ItemType.AcaciaSign; - mappings[994] = ItemType.CherrySign; - mappings[995] = ItemType.DarkOakSign; - mappings[996] = ItemType.PaleOakSign; - mappings[997] = ItemType.MangroveSign; - mappings[998] = ItemType.BambooSign; - mappings[999] = ItemType.CrimsonSign; - mappings[1000] = ItemType.WarpedSign; - mappings[1001] = ItemType.OakHangingSign; - mappings[1002] = ItemType.SpruceHangingSign; - mappings[1003] = ItemType.BirchHangingSign; - mappings[1004] = ItemType.JungleHangingSign; - mappings[1005] = ItemType.AcaciaHangingSign; - mappings[1006] = ItemType.CherryHangingSign; - mappings[1007] = ItemType.DarkOakHangingSign; - mappings[1008] = ItemType.PaleOakHangingSign; - mappings[1009] = ItemType.MangroveHangingSign; - mappings[1010] = ItemType.BambooHangingSign; - mappings[1011] = ItemType.CrimsonHangingSign; - mappings[1012] = ItemType.WarpedHangingSign; - mappings[1013] = ItemType.Bucket; - mappings[1014] = ItemType.WaterBucket; - mappings[1015] = ItemType.LavaBucket; - mappings[1016] = ItemType.PowderSnowBucket; - mappings[1017] = ItemType.Snowball; - mappings[1018] = ItemType.Leather; - mappings[1019] = ItemType.MilkBucket; - mappings[1020] = ItemType.PufferfishBucket; - mappings[1021] = ItemType.SalmonBucket; - mappings[1022] = ItemType.CodBucket; - mappings[1023] = ItemType.TropicalFishBucket; - mappings[1024] = ItemType.AxolotlBucket; - mappings[1025] = ItemType.TadpoleBucket; - mappings[1026] = ItemType.Brick; - mappings[1027] = ItemType.ClayBall; - mappings[1028] = ItemType.DriedKelpBlock; - mappings[1029] = ItemType.Paper; - mappings[1030] = ItemType.Book; - mappings[1031] = ItemType.SlimeBall; - mappings[1032] = ItemType.Egg; - mappings[1033] = ItemType.BlueEgg; - mappings[1034] = ItemType.BrownEgg; - mappings[1035] = ItemType.Compass; - mappings[1036] = ItemType.RecoveryCompass; - mappings[1037] = ItemType.Bundle; - mappings[1038] = ItemType.WhiteBundle; - mappings[1039] = ItemType.OrangeBundle; - mappings[1040] = ItemType.MagentaBundle; - mappings[1041] = ItemType.LightBlueBundle; - mappings[1042] = ItemType.YellowBundle; - mappings[1043] = ItemType.LimeBundle; - mappings[1044] = ItemType.PinkBundle; - mappings[1045] = ItemType.GrayBundle; - mappings[1046] = ItemType.LightGrayBundle; - mappings[1047] = ItemType.CyanBundle; - mappings[1048] = ItemType.PurpleBundle; - mappings[1049] = ItemType.BlueBundle; - mappings[1050] = ItemType.BrownBundle; - mappings[1051] = ItemType.GreenBundle; - mappings[1052] = ItemType.RedBundle; - mappings[1053] = ItemType.BlackBundle; - mappings[1054] = ItemType.FishingRod; - mappings[1055] = ItemType.Clock; - mappings[1056] = ItemType.Spyglass; - mappings[1057] = ItemType.GlowstoneDust; - mappings[1058] = ItemType.Cod; - mappings[1059] = ItemType.Salmon; - mappings[1060] = ItemType.TropicalFish; - mappings[1061] = ItemType.Pufferfish; - mappings[1062] = ItemType.CookedCod; - mappings[1063] = ItemType.CookedSalmon; - mappings[1064] = ItemType.InkSac; - mappings[1065] = ItemType.GlowInkSac; - mappings[1066] = ItemType.CocoaBeans; - mappings[1067] = ItemType.WhiteDye; - mappings[1068] = ItemType.OrangeDye; - mappings[1069] = ItemType.MagentaDye; - mappings[1070] = ItemType.LightBlueDye; - mappings[1071] = ItemType.YellowDye; - mappings[1072] = ItemType.LimeDye; - mappings[1073] = ItemType.PinkDye; - mappings[1074] = ItemType.GrayDye; - mappings[1075] = ItemType.LightGrayDye; - mappings[1076] = ItemType.CyanDye; - mappings[1077] = ItemType.PurpleDye; - mappings[1078] = ItemType.BlueDye; - mappings[1079] = ItemType.BrownDye; - mappings[1080] = ItemType.GreenDye; - mappings[1081] = ItemType.RedDye; - mappings[1082] = ItemType.BlackDye; - mappings[1083] = ItemType.BoneMeal; - mappings[1084] = ItemType.Bone; - mappings[1085] = ItemType.Sugar; - mappings[1086] = ItemType.Cake; - mappings[1087] = ItemType.WhiteBed; - mappings[1088] = ItemType.OrangeBed; - mappings[1089] = ItemType.MagentaBed; - mappings[1090] = ItemType.LightBlueBed; - mappings[1091] = ItemType.YellowBed; - mappings[1092] = ItemType.LimeBed; - mappings[1093] = ItemType.PinkBed; - mappings[1094] = ItemType.GrayBed; - mappings[1095] = ItemType.LightGrayBed; - mappings[1096] = ItemType.CyanBed; - mappings[1097] = ItemType.PurpleBed; - mappings[1098] = ItemType.BlueBed; - mappings[1099] = ItemType.BrownBed; - mappings[1100] = ItemType.GreenBed; - mappings[1101] = ItemType.RedBed; - mappings[1102] = ItemType.BlackBed; - mappings[1103] = ItemType.Cookie; - mappings[1104] = ItemType.Crafter; - mappings[1105] = ItemType.FilledMap; - mappings[1106] = ItemType.Shears; - mappings[1107] = ItemType.MelonSlice; - mappings[1108] = ItemType.DriedKelp; - mappings[1109] = ItemType.PumpkinSeeds; - mappings[1110] = ItemType.MelonSeeds; - mappings[1111] = ItemType.Beef; - mappings[1112] = ItemType.CookedBeef; - mappings[1113] = ItemType.Chicken; - mappings[1114] = ItemType.CookedChicken; - mappings[1115] = ItemType.RottenFlesh; - mappings[1116] = ItemType.EnderPearl; - mappings[1117] = ItemType.BlazeRod; - mappings[1118] = ItemType.GhastTear; - mappings[1119] = ItemType.GoldNugget; - mappings[1120] = ItemType.NetherWart; - mappings[1121] = ItemType.GlassBottle; - mappings[1122] = ItemType.Potion; - mappings[1123] = ItemType.SpiderEye; - mappings[1124] = ItemType.FermentedSpiderEye; - mappings[1125] = ItemType.BlazePowder; - mappings[1126] = ItemType.MagmaCream; - mappings[1127] = ItemType.BrewingStand; - mappings[1128] = ItemType.Cauldron; - mappings[1129] = ItemType.EnderEye; - mappings[1130] = ItemType.GlisteringMelonSlice; - mappings[1131] = ItemType.ChickenSpawnEgg; - mappings[1132] = ItemType.CowSpawnEgg; - mappings[1133] = ItemType.PigSpawnEgg; - mappings[1134] = ItemType.SheepSpawnEgg; - mappings[1135] = ItemType.CamelSpawnEgg; - mappings[1136] = ItemType.DonkeySpawnEgg; - mappings[1137] = ItemType.HorseSpawnEgg; - mappings[1138] = ItemType.MuleSpawnEgg; - mappings[1139] = ItemType.CatSpawnEgg; - mappings[1140] = ItemType.ParrotSpawnEgg; - mappings[1141] = ItemType.WolfSpawnEgg; - mappings[1142] = ItemType.ArmadilloSpawnEgg; - mappings[1143] = ItemType.BatSpawnEgg; - mappings[1144] = ItemType.BeeSpawnEgg; - mappings[1145] = ItemType.FoxSpawnEgg; - mappings[1146] = ItemType.GoatSpawnEgg; - mappings[1147] = ItemType.LlamaSpawnEgg; - mappings[1148] = ItemType.OcelotSpawnEgg; - mappings[1149] = ItemType.PandaSpawnEgg; - mappings[1150] = ItemType.PolarBearSpawnEgg; - mappings[1151] = ItemType.RabbitSpawnEgg; - mappings[1152] = ItemType.AxolotlSpawnEgg; - mappings[1153] = ItemType.CodSpawnEgg; - mappings[1154] = ItemType.DolphinSpawnEgg; - mappings[1155] = ItemType.FrogSpawnEgg; - mappings[1156] = ItemType.GlowSquidSpawnEgg; - mappings[1157] = ItemType.NautilusSpawnEgg; - mappings[1158] = ItemType.PufferfishSpawnEgg; - mappings[1159] = ItemType.SalmonSpawnEgg; - mappings[1160] = ItemType.SquidSpawnEgg; - mappings[1161] = ItemType.TadpoleSpawnEgg; - mappings[1162] = ItemType.TropicalFishSpawnEgg; - mappings[1163] = ItemType.TurtleSpawnEgg; - mappings[1164] = ItemType.AllaySpawnEgg; - mappings[1165] = ItemType.MooshroomSpawnEgg; - mappings[1166] = ItemType.SnifferSpawnEgg; - mappings[1167] = ItemType.CopperGolemSpawnEgg; - mappings[1168] = ItemType.IronGolemSpawnEgg; - mappings[1169] = ItemType.SnowGolemSpawnEgg; - mappings[1170] = ItemType.TraderLlamaSpawnEgg; - mappings[1171] = ItemType.VillagerSpawnEgg; - mappings[1172] = ItemType.WanderingTraderSpawnEgg; - mappings[1173] = ItemType.BoggedSpawnEgg; - mappings[1174] = ItemType.CamelHuskSpawnEgg; - mappings[1175] = ItemType.DrownedSpawnEgg; - mappings[1176] = ItemType.HuskSpawnEgg; - mappings[1177] = ItemType.ParchedSpawnEgg; - mappings[1178] = ItemType.SkeletonSpawnEgg; - mappings[1179] = ItemType.SkeletonHorseSpawnEgg; - mappings[1180] = ItemType.StraySpawnEgg; - mappings[1181] = ItemType.WitherSpawnEgg; - mappings[1182] = ItemType.WitherSkeletonSpawnEgg; - mappings[1183] = ItemType.ZombieSpawnEgg; - mappings[1184] = ItemType.ZombieHorseSpawnEgg; - mappings[1185] = ItemType.ZombieNautilusSpawnEgg; - mappings[1186] = ItemType.ZombieVillagerSpawnEgg; - mappings[1187] = ItemType.CaveSpiderSpawnEgg; - mappings[1188] = ItemType.SpiderSpawnEgg; - mappings[1189] = ItemType.BreezeSpawnEgg; - mappings[1190] = ItemType.CreakingSpawnEgg; - mappings[1191] = ItemType.CreeperSpawnEgg; - mappings[1192] = ItemType.ElderGuardianSpawnEgg; - mappings[1193] = ItemType.GuardianSpawnEgg; - mappings[1194] = ItemType.PhantomSpawnEgg; - mappings[1195] = ItemType.SilverfishSpawnEgg; - mappings[1196] = ItemType.SlimeSpawnEgg; - mappings[1197] = ItemType.WardenSpawnEgg; - mappings[1198] = ItemType.WitchSpawnEgg; - mappings[1199] = ItemType.EvokerSpawnEgg; - mappings[1200] = ItemType.PillagerSpawnEgg; - mappings[1201] = ItemType.RavagerSpawnEgg; - mappings[1202] = ItemType.VindicatorSpawnEgg; - mappings[1203] = ItemType.VexSpawnEgg; - mappings[1204] = ItemType.BlazeSpawnEgg; - mappings[1205] = ItemType.GhastSpawnEgg; - mappings[1206] = ItemType.HappyGhastSpawnEgg; - mappings[1207] = ItemType.HoglinSpawnEgg; - mappings[1208] = ItemType.MagmaCubeSpawnEgg; - mappings[1209] = ItemType.PiglinSpawnEgg; - mappings[1210] = ItemType.PiglinBruteSpawnEgg; - mappings[1211] = ItemType.StriderSpawnEgg; - mappings[1212] = ItemType.ZoglinSpawnEgg; - mappings[1213] = ItemType.ZombifiedPiglinSpawnEgg; - mappings[1214] = ItemType.EnderDragonSpawnEgg; - mappings[1215] = ItemType.EndermanSpawnEgg; - mappings[1216] = ItemType.EndermiteSpawnEgg; - mappings[1217] = ItemType.ShulkerSpawnEgg; - mappings[1218] = ItemType.ExperienceBottle; - mappings[1219] = ItemType.FireCharge; - mappings[1220] = ItemType.WindCharge; - mappings[1221] = ItemType.WritableBook; - mappings[1222] = ItemType.WrittenBook; - mappings[1223] = ItemType.BreezeRod; - mappings[1224] = ItemType.Mace; - mappings[1225] = ItemType.ItemFrame; - mappings[1226] = ItemType.GlowItemFrame; - mappings[1227] = ItemType.FlowerPot; - mappings[1228] = ItemType.Carrot; - mappings[1229] = ItemType.Potato; - mappings[1230] = ItemType.BakedPotato; - mappings[1231] = ItemType.PoisonousPotato; - mappings[1232] = ItemType.Map; - mappings[1233] = ItemType.GoldenCarrot; - mappings[1234] = ItemType.SkeletonSkull; - mappings[1235] = ItemType.WitherSkeletonSkull; - mappings[1236] = ItemType.PlayerHead; - mappings[1237] = ItemType.ZombieHead; - mappings[1238] = ItemType.CreeperHead; - mappings[1239] = ItemType.DragonHead; - mappings[1240] = ItemType.PiglinHead; - mappings[1241] = ItemType.NetherStar; - mappings[1242] = ItemType.PumpkinPie; - mappings[1243] = ItemType.FireworkRocket; - mappings[1244] = ItemType.FireworkStar; - mappings[1245] = ItemType.EnchantedBook; - mappings[1246] = ItemType.NetherBrick; - mappings[1247] = ItemType.ResinBrick; - mappings[1248] = ItemType.PrismarineShard; - mappings[1249] = ItemType.PrismarineCrystals; - mappings[1250] = ItemType.Rabbit; - mappings[1251] = ItemType.CookedRabbit; - mappings[1252] = ItemType.RabbitStew; - mappings[1253] = ItemType.RabbitFoot; - mappings[1254] = ItemType.RabbitHide; - mappings[1255] = ItemType.ArmorStand; - mappings[1256] = ItemType.CopperHorseArmor; - mappings[1257] = ItemType.IronHorseArmor; - mappings[1258] = ItemType.GoldenHorseArmor; - mappings[1259] = ItemType.DiamondHorseArmor; - mappings[1260] = ItemType.NetheriteHorseArmor; - mappings[1261] = ItemType.LeatherHorseArmor; - mappings[1262] = ItemType.Lead; - mappings[1263] = ItemType.NameTag; - mappings[1264] = ItemType.CommandBlockMinecart; - mappings[1265] = ItemType.Mutton; - mappings[1266] = ItemType.CookedMutton; - mappings[1267] = ItemType.WhiteBanner; - mappings[1268] = ItemType.OrangeBanner; - mappings[1269] = ItemType.MagentaBanner; - mappings[1270] = ItemType.LightBlueBanner; - mappings[1271] = ItemType.YellowBanner; - mappings[1272] = ItemType.LimeBanner; - mappings[1273] = ItemType.PinkBanner; - mappings[1274] = ItemType.GrayBanner; - mappings[1275] = ItemType.LightGrayBanner; - mappings[1276] = ItemType.CyanBanner; - mappings[1277] = ItemType.PurpleBanner; - mappings[1278] = ItemType.BlueBanner; - mappings[1279] = ItemType.BrownBanner; - mappings[1280] = ItemType.GreenBanner; - mappings[1281] = ItemType.RedBanner; - mappings[1282] = ItemType.BlackBanner; - mappings[1283] = ItemType.EndCrystal; - mappings[1284] = ItemType.ChorusFruit; - mappings[1285] = ItemType.PoppedChorusFruit; - mappings[1286] = ItemType.TorchflowerSeeds; - mappings[1287] = ItemType.PitcherPod; - mappings[1288] = ItemType.Beetroot; - mappings[1289] = ItemType.BeetrootSeeds; - mappings[1290] = ItemType.BeetrootSoup; - mappings[1291] = ItemType.DragonBreath; - mappings[1292] = ItemType.SplashPotion; - mappings[1293] = ItemType.SpectralArrow; - mappings[1294] = ItemType.TippedArrow; - mappings[1295] = ItemType.LingeringPotion; - mappings[1296] = ItemType.Shield; - mappings[1297] = ItemType.WoodenSpear; - mappings[1298] = ItemType.StoneSpear; - mappings[1299] = ItemType.CopperSpear; - mappings[1300] = ItemType.IronSpear; - mappings[1301] = ItemType.GoldenSpear; - mappings[1302] = ItemType.DiamondSpear; - mappings[1303] = ItemType.NetheriteSpear; - mappings[1304] = ItemType.TotemOfUndying; - mappings[1305] = ItemType.ShulkerShell; - mappings[1306] = ItemType.IronNugget; - mappings[1307] = ItemType.CopperNugget; - mappings[1308] = ItemType.KnowledgeBook; - mappings[1309] = ItemType.DebugStick; - mappings[1310] = ItemType.MusicDisc13; - mappings[1311] = ItemType.MusicDiscCat; - mappings[1312] = ItemType.MusicDiscBlocks; - mappings[1313] = ItemType.MusicDiscChirp; - mappings[1314] = ItemType.MusicDiscCreator; - mappings[1315] = ItemType.MusicDiscCreatorMusicBox; - mappings[1316] = ItemType.MusicDiscFar; - mappings[1317] = ItemType.MusicDiscLavaChicken; - mappings[1318] = ItemType.MusicDiscMall; - mappings[1319] = ItemType.MusicDiscMellohi; - mappings[1320] = ItemType.MusicDiscStal; - mappings[1321] = ItemType.MusicDiscStrad; - mappings[1322] = ItemType.MusicDiscWard; - mappings[1323] = ItemType.MusicDisc11; - mappings[1324] = ItemType.MusicDiscWait; - mappings[1325] = ItemType.MusicDiscOtherside; - mappings[1326] = ItemType.MusicDiscRelic; - mappings[1327] = ItemType.MusicDisc5; - mappings[1328] = ItemType.MusicDiscPigstep; - mappings[1329] = ItemType.MusicDiscPrecipice; - mappings[1330] = ItemType.MusicDiscTears; - mappings[1331] = ItemType.DiscFragment5; - mappings[1332] = ItemType.Trident; - mappings[1333] = ItemType.NautilusShell; - mappings[1334] = ItemType.IronNautilusArmor; - mappings[1335] = ItemType.GoldenNautilusArmor; - mappings[1336] = ItemType.DiamondNautilusArmor; - mappings[1337] = ItemType.NetheriteNautilusArmor; - mappings[1338] = ItemType.CopperNautilusArmor; - mappings[1339] = ItemType.HeartOfTheSea; - mappings[1340] = ItemType.Crossbow; - mappings[1341] = ItemType.SuspiciousStew; - mappings[1342] = ItemType.Loom; - mappings[1343] = ItemType.FlowerBannerPattern; - mappings[1344] = ItemType.CreeperBannerPattern; - mappings[1345] = ItemType.SkullBannerPattern; - mappings[1346] = ItemType.MojangBannerPattern; - mappings[1347] = ItemType.GlobeBannerPattern; - mappings[1348] = ItemType.PiglinBannerPattern; - mappings[1349] = ItemType.FlowBannerPattern; - mappings[1350] = ItemType.GusterBannerPattern; - mappings[1351] = ItemType.FieldMasonedBannerPattern; - mappings[1352] = ItemType.BordureIndentedBannerPattern; - mappings[1353] = ItemType.GoatHorn; - mappings[1354] = ItemType.Composter; - mappings[1355] = ItemType.Barrel; - mappings[1356] = ItemType.Smoker; - mappings[1357] = ItemType.BlastFurnace; - mappings[1358] = ItemType.CartographyTable; - mappings[1359] = ItemType.FletchingTable; - mappings[1360] = ItemType.Grindstone; - mappings[1361] = ItemType.SmithingTable; - mappings[1362] = ItemType.Stonecutter; - mappings[1363] = ItemType.Bell; - mappings[1364] = ItemType.Lantern; - mappings[1365] = ItemType.SoulLantern; - mappings[1366] = ItemType.CopperLantern; - mappings[1367] = ItemType.ExposedCopperLantern; - mappings[1368] = ItemType.WeatheredCopperLantern; - mappings[1369] = ItemType.OxidizedCopperLantern; - mappings[1370] = ItemType.WaxedCopperLantern; - mappings[1371] = ItemType.WaxedExposedCopperLantern; - mappings[1372] = ItemType.WaxedWeatheredCopperLantern; - mappings[1373] = ItemType.WaxedOxidizedCopperLantern; - mappings[1374] = ItemType.SweetBerries; - mappings[1375] = ItemType.GlowBerries; - mappings[1376] = ItemType.Campfire; - mappings[1377] = ItemType.SoulCampfire; - mappings[1378] = ItemType.Shroomlight; - mappings[1379] = ItemType.Honeycomb; - mappings[1380] = ItemType.BeeNest; - mappings[1381] = ItemType.Beehive; - mappings[1382] = ItemType.HoneyBottle; - mappings[1383] = ItemType.HoneycombBlock; - mappings[1384] = ItemType.Lodestone; - mappings[1385] = ItemType.CryingObsidian; - mappings[1386] = ItemType.Blackstone; - mappings[1387] = ItemType.BlackstoneSlab; - mappings[1388] = ItemType.BlackstoneStairs; - mappings[1389] = ItemType.GildedBlackstone; - mappings[1390] = ItemType.PolishedBlackstone; - mappings[1391] = ItemType.PolishedBlackstoneSlab; - mappings[1392] = ItemType.PolishedBlackstoneStairs; - mappings[1393] = ItemType.ChiseledPolishedBlackstone; - mappings[1394] = ItemType.PolishedBlackstoneBricks; - mappings[1395] = ItemType.PolishedBlackstoneBrickSlab; - mappings[1396] = ItemType.PolishedBlackstoneBrickStairs; - mappings[1397] = ItemType.CrackedPolishedBlackstoneBricks; - mappings[1398] = ItemType.RespawnAnchor; - mappings[1399] = ItemType.Candle; - mappings[1400] = ItemType.WhiteCandle; - mappings[1401] = ItemType.OrangeCandle; - mappings[1402] = ItemType.MagentaCandle; - mappings[1403] = ItemType.LightBlueCandle; - mappings[1404] = ItemType.YellowCandle; - mappings[1405] = ItemType.LimeCandle; - mappings[1406] = ItemType.PinkCandle; - mappings[1407] = ItemType.GrayCandle; - mappings[1408] = ItemType.LightGrayCandle; - mappings[1409] = ItemType.CyanCandle; - mappings[1410] = ItemType.PurpleCandle; - mappings[1411] = ItemType.BlueCandle; - mappings[1412] = ItemType.BrownCandle; - mappings[1413] = ItemType.GreenCandle; - mappings[1414] = ItemType.RedCandle; - mappings[1415] = ItemType.BlackCandle; - mappings[1416] = ItemType.SmallAmethystBud; - mappings[1417] = ItemType.MediumAmethystBud; - mappings[1418] = ItemType.LargeAmethystBud; - mappings[1419] = ItemType.AmethystCluster; - mappings[1420] = ItemType.PointedDripstone; - mappings[1421] = ItemType.OchreFroglight; - mappings[1422] = ItemType.VerdantFroglight; - mappings[1423] = ItemType.PearlescentFroglight; - mappings[1424] = ItemType.Frogspawn; - mappings[1425] = ItemType.EchoShard; - mappings[1426] = ItemType.Brush; - mappings[1427] = ItemType.NetheriteUpgradeSmithingTemplate; - mappings[1428] = ItemType.SentryArmorTrimSmithingTemplate; - mappings[1429] = ItemType.DuneArmorTrimSmithingTemplate; - mappings[1430] = ItemType.CoastArmorTrimSmithingTemplate; - mappings[1431] = ItemType.WildArmorTrimSmithingTemplate; - mappings[1432] = ItemType.WardArmorTrimSmithingTemplate; - mappings[1433] = ItemType.EyeArmorTrimSmithingTemplate; - mappings[1434] = ItemType.VexArmorTrimSmithingTemplate; - mappings[1435] = ItemType.TideArmorTrimSmithingTemplate; - mappings[1436] = ItemType.SnoutArmorTrimSmithingTemplate; - mappings[1437] = ItemType.RibArmorTrimSmithingTemplate; - mappings[1438] = ItemType.SpireArmorTrimSmithingTemplate; - mappings[1439] = ItemType.WayfinderArmorTrimSmithingTemplate; - mappings[1440] = ItemType.ShaperArmorTrimSmithingTemplate; - mappings[1441] = ItemType.SilenceArmorTrimSmithingTemplate; - mappings[1442] = ItemType.RaiserArmorTrimSmithingTemplate; - mappings[1443] = ItemType.HostArmorTrimSmithingTemplate; - mappings[1444] = ItemType.FlowArmorTrimSmithingTemplate; - mappings[1445] = ItemType.BoltArmorTrimSmithingTemplate; - mappings[1446] = ItemType.AnglerPotterySherd; - mappings[1447] = ItemType.ArcherPotterySherd; - mappings[1448] = ItemType.ArmsUpPotterySherd; - mappings[1449] = ItemType.BladePotterySherd; - mappings[1450] = ItemType.BrewerPotterySherd; - mappings[1451] = ItemType.BurnPotterySherd; - mappings[1452] = ItemType.DangerPotterySherd; - mappings[1453] = ItemType.ExplorerPotterySherd; - mappings[1454] = ItemType.FlowPotterySherd; - mappings[1455] = ItemType.FriendPotterySherd; - mappings[1456] = ItemType.GusterPotterySherd; - mappings[1457] = ItemType.HeartPotterySherd; - mappings[1458] = ItemType.HeartbreakPotterySherd; - mappings[1459] = ItemType.HowlPotterySherd; - mappings[1460] = ItemType.MinerPotterySherd; - mappings[1461] = ItemType.MournerPotterySherd; - mappings[1462] = ItemType.PlentyPotterySherd; - mappings[1463] = ItemType.PrizePotterySherd; - mappings[1464] = ItemType.ScrapePotterySherd; - mappings[1465] = ItemType.SheafPotterySherd; - mappings[1466] = ItemType.ShelterPotterySherd; - mappings[1467] = ItemType.SkullPotterySherd; - mappings[1468] = ItemType.SnortPotterySherd; - mappings[1469] = ItemType.CopperGrate; - mappings[1470] = ItemType.ExposedCopperGrate; - mappings[1471] = ItemType.WeatheredCopperGrate; - mappings[1472] = ItemType.OxidizedCopperGrate; - mappings[1473] = ItemType.WaxedCopperGrate; - mappings[1474] = ItemType.WaxedExposedCopperGrate; - mappings[1475] = ItemType.WaxedWeatheredCopperGrate; - mappings[1476] = ItemType.WaxedOxidizedCopperGrate; - mappings[1477] = ItemType.CopperBulb; - mappings[1478] = ItemType.ExposedCopperBulb; - mappings[1479] = ItemType.WeatheredCopperBulb; - mappings[1480] = ItemType.OxidizedCopperBulb; - mappings[1481] = ItemType.WaxedCopperBulb; - mappings[1482] = ItemType.WaxedExposedCopperBulb; - mappings[1483] = ItemType.WaxedWeatheredCopperBulb; - mappings[1484] = ItemType.WaxedOxidizedCopperBulb; - mappings[1485] = ItemType.CopperChest; - mappings[1486] = ItemType.ExposedCopperChest; - mappings[1487] = ItemType.WeatheredCopperChest; - mappings[1488] = ItemType.OxidizedCopperChest; - mappings[1489] = ItemType.WaxedCopperChest; - mappings[1490] = ItemType.WaxedExposedCopperChest; - mappings[1491] = ItemType.WaxedWeatheredCopperChest; - mappings[1492] = ItemType.WaxedOxidizedCopperChest; - mappings[1493] = ItemType.CopperGolemStatue; - mappings[1494] = ItemType.ExposedCopperGolemStatue; - mappings[1495] = ItemType.WeatheredCopperGolemStatue; - mappings[1496] = ItemType.OxidizedCopperGolemStatue; - mappings[1497] = ItemType.WaxedCopperGolemStatue; - mappings[1498] = ItemType.WaxedExposedCopperGolemStatue; - mappings[1499] = ItemType.WaxedWeatheredCopperGolemStatue; - mappings[1500] = ItemType.WaxedOxidizedCopperGolemStatue; - mappings[1501] = ItemType.TrialSpawner; - mappings[1502] = ItemType.TrialKey; - mappings[1503] = ItemType.OminousTrialKey; - mappings[1504] = ItemType.Vault; - mappings[1505] = ItemType.OminousBottle; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPalette262.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPalette262.cs deleted file mode 100644 index 9d92f488fd..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPalette262.cs +++ /dev/null @@ -1,1555 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public class ItemPalette262 : ItemPalette - { - private static readonly Dictionary mappings = new(); - - static ItemPalette262() - { - mappings[0] = ItemType.Air; - mappings[1] = ItemType.Stone; - mappings[2] = ItemType.Granite; - mappings[3] = ItemType.PolishedGranite; - mappings[4] = ItemType.Diorite; - mappings[5] = ItemType.PolishedDiorite; - mappings[6] = ItemType.Andesite; - mappings[7] = ItemType.PolishedAndesite; - mappings[8] = ItemType.Deepslate; - mappings[9] = ItemType.CobbledDeepslate; - mappings[10] = ItemType.PolishedDeepslate; - mappings[11] = ItemType.Calcite; - mappings[12] = ItemType.Tuff; - mappings[13] = ItemType.TuffSlab; - mappings[14] = ItemType.TuffStairs; - mappings[15] = ItemType.TuffWall; - mappings[16] = ItemType.ChiseledTuff; - mappings[17] = ItemType.PolishedTuff; - mappings[18] = ItemType.PolishedTuffSlab; - mappings[19] = ItemType.PolishedTuffStairs; - mappings[20] = ItemType.PolishedTuffWall; - mappings[21] = ItemType.TuffBricks; - mappings[22] = ItemType.TuffBrickSlab; - mappings[23] = ItemType.TuffBrickStairs; - mappings[24] = ItemType.TuffBrickWall; - mappings[25] = ItemType.ChiseledTuffBricks; - mappings[26] = ItemType.Sulfur; - mappings[27] = ItemType.PotentSulfur; - mappings[28] = ItemType.SulfurSlab; - mappings[29] = ItemType.SulfurStairs; - mappings[30] = ItemType.SulfurWall; - mappings[31] = ItemType.PolishedSulfur; - mappings[32] = ItemType.PolishedSulfurSlab; - mappings[33] = ItemType.PolishedSulfurStairs; - mappings[34] = ItemType.PolishedSulfurWall; - mappings[35] = ItemType.SulfurBricks; - mappings[36] = ItemType.SulfurBrickSlab; - mappings[37] = ItemType.SulfurBrickStairs; - mappings[38] = ItemType.SulfurBrickWall; - mappings[39] = ItemType.ChiseledSulfur; - mappings[40] = ItemType.Cinnabar; - mappings[41] = ItemType.CinnabarSlab; - mappings[42] = ItemType.CinnabarStairs; - mappings[43] = ItemType.CinnabarWall; - mappings[44] = ItemType.PolishedCinnabar; - mappings[45] = ItemType.PolishedCinnabarSlab; - mappings[46] = ItemType.PolishedCinnabarStairs; - mappings[47] = ItemType.PolishedCinnabarWall; - mappings[48] = ItemType.CinnabarBricks; - mappings[49] = ItemType.CinnabarBrickSlab; - mappings[50] = ItemType.CinnabarBrickStairs; - mappings[51] = ItemType.CinnabarBrickWall; - mappings[52] = ItemType.ChiseledCinnabar; - mappings[53] = ItemType.DripstoneBlock; - mappings[54] = ItemType.GrassBlock; - mappings[55] = ItemType.Dirt; - mappings[56] = ItemType.CoarseDirt; - mappings[57] = ItemType.Podzol; - mappings[58] = ItemType.RootedDirt; - mappings[59] = ItemType.Mud; - mappings[60] = ItemType.CrimsonNylium; - mappings[61] = ItemType.WarpedNylium; - mappings[62] = ItemType.Cobblestone; - mappings[63] = ItemType.OakPlanks; - mappings[64] = ItemType.SprucePlanks; - mappings[65] = ItemType.BirchPlanks; - mappings[66] = ItemType.JunglePlanks; - mappings[67] = ItemType.AcaciaPlanks; - mappings[68] = ItemType.CherryPlanks; - mappings[69] = ItemType.DarkOakPlanks; - mappings[70] = ItemType.PaleOakPlanks; - mappings[71] = ItemType.MangrovePlanks; - mappings[72] = ItemType.BambooPlanks; - mappings[73] = ItemType.CrimsonPlanks; - mappings[74] = ItemType.WarpedPlanks; - mappings[75] = ItemType.BambooMosaic; - mappings[76] = ItemType.OakSapling; - mappings[77] = ItemType.SpruceSapling; - mappings[78] = ItemType.BirchSapling; - mappings[79] = ItemType.JungleSapling; - mappings[80] = ItemType.AcaciaSapling; - mappings[81] = ItemType.CherrySapling; - mappings[82] = ItemType.DarkOakSapling; - mappings[83] = ItemType.PaleOakSapling; - mappings[84] = ItemType.MangrovePropagule; - mappings[85] = ItemType.Bedrock; - mappings[86] = ItemType.Sand; - mappings[87] = ItemType.SuspiciousSand; - mappings[88] = ItemType.SuspiciousGravel; - mappings[89] = ItemType.RedSand; - mappings[90] = ItemType.Gravel; - mappings[91] = ItemType.CoalOre; - mappings[92] = ItemType.DeepslateCoalOre; - mappings[93] = ItemType.IronOre; - mappings[94] = ItemType.DeepslateIronOre; - mappings[95] = ItemType.CopperOre; - mappings[96] = ItemType.DeepslateCopperOre; - mappings[97] = ItemType.GoldOre; - mappings[98] = ItemType.DeepslateGoldOre; - mappings[99] = ItemType.RedstoneOre; - mappings[100] = ItemType.DeepslateRedstoneOre; - mappings[101] = ItemType.EmeraldOre; - mappings[102] = ItemType.DeepslateEmeraldOre; - mappings[103] = ItemType.LapisOre; - mappings[104] = ItemType.DeepslateLapisOre; - mappings[105] = ItemType.DiamondOre; - mappings[106] = ItemType.DeepslateDiamondOre; - mappings[107] = ItemType.NetherGoldOre; - mappings[108] = ItemType.NetherQuartzOre; - mappings[109] = ItemType.AncientDebris; - mappings[110] = ItemType.CoalBlock; - mappings[111] = ItemType.RawIronBlock; - mappings[112] = ItemType.RawCopperBlock; - mappings[113] = ItemType.RawGoldBlock; - mappings[114] = ItemType.HeavyCore; - mappings[115] = ItemType.AmethystBlock; - mappings[116] = ItemType.BuddingAmethyst; - mappings[117] = ItemType.IronBlock; - mappings[118] = ItemType.CopperBlock; - mappings[119] = ItemType.ExposedCopper; - mappings[120] = ItemType.WeatheredCopper; - mappings[121] = ItemType.OxidizedCopper; - mappings[122] = ItemType.WaxedCopperBlock; - mappings[123] = ItemType.WaxedExposedCopper; - mappings[124] = ItemType.WaxedWeatheredCopper; - mappings[125] = ItemType.WaxedOxidizedCopper; - mappings[126] = ItemType.GoldBlock; - mappings[127] = ItemType.DiamondBlock; - mappings[128] = ItemType.NetheriteBlock; - mappings[129] = ItemType.ChiseledCopper; - mappings[130] = ItemType.ExposedChiseledCopper; - mappings[131] = ItemType.WeatheredChiseledCopper; - mappings[132] = ItemType.OxidizedChiseledCopper; - mappings[133] = ItemType.WaxedChiseledCopper; - mappings[134] = ItemType.WaxedExposedChiseledCopper; - mappings[135] = ItemType.WaxedWeatheredChiseledCopper; - mappings[136] = ItemType.WaxedOxidizedChiseledCopper; - mappings[137] = ItemType.CutCopper; - mappings[138] = ItemType.ExposedCutCopper; - mappings[139] = ItemType.WeatheredCutCopper; - mappings[140] = ItemType.OxidizedCutCopper; - mappings[141] = ItemType.WaxedCutCopper; - mappings[142] = ItemType.WaxedExposedCutCopper; - mappings[143] = ItemType.WaxedWeatheredCutCopper; - mappings[144] = ItemType.WaxedOxidizedCutCopper; - mappings[145] = ItemType.CutCopperStairs; - mappings[146] = ItemType.ExposedCutCopperStairs; - mappings[147] = ItemType.WeatheredCutCopperStairs; - mappings[148] = ItemType.OxidizedCutCopperStairs; - mappings[149] = ItemType.WaxedCutCopperStairs; - mappings[150] = ItemType.WaxedExposedCutCopperStairs; - mappings[151] = ItemType.WaxedWeatheredCutCopperStairs; - mappings[152] = ItemType.WaxedOxidizedCutCopperStairs; - mappings[153] = ItemType.CutCopperSlab; - mappings[154] = ItemType.ExposedCutCopperSlab; - mappings[155] = ItemType.WeatheredCutCopperSlab; - mappings[156] = ItemType.OxidizedCutCopperSlab; - mappings[157] = ItemType.WaxedCutCopperSlab; - mappings[158] = ItemType.WaxedExposedCutCopperSlab; - mappings[159] = ItemType.WaxedWeatheredCutCopperSlab; - mappings[160] = ItemType.WaxedOxidizedCutCopperSlab; - mappings[161] = ItemType.OakLog; - mappings[162] = ItemType.SpruceLog; - mappings[163] = ItemType.BirchLog; - mappings[164] = ItemType.JungleLog; - mappings[165] = ItemType.AcaciaLog; - mappings[166] = ItemType.CherryLog; - mappings[167] = ItemType.PaleOakLog; - mappings[168] = ItemType.DarkOakLog; - mappings[169] = ItemType.MangroveLog; - mappings[170] = ItemType.MangroveRoots; - mappings[171] = ItemType.MuddyMangroveRoots; - mappings[172] = ItemType.CrimsonStem; - mappings[173] = ItemType.WarpedStem; - mappings[174] = ItemType.BambooBlock; - mappings[175] = ItemType.StrippedOakLog; - mappings[176] = ItemType.StrippedSpruceLog; - mappings[177] = ItemType.StrippedBirchLog; - mappings[178] = ItemType.StrippedJungleLog; - mappings[179] = ItemType.StrippedAcaciaLog; - mappings[180] = ItemType.StrippedCherryLog; - mappings[181] = ItemType.StrippedDarkOakLog; - mappings[182] = ItemType.StrippedPaleOakLog; - mappings[183] = ItemType.StrippedMangroveLog; - mappings[184] = ItemType.StrippedCrimsonStem; - mappings[185] = ItemType.StrippedWarpedStem; - mappings[186] = ItemType.StrippedOakWood; - mappings[187] = ItemType.StrippedSpruceWood; - mappings[188] = ItemType.StrippedBirchWood; - mappings[189] = ItemType.StrippedJungleWood; - mappings[190] = ItemType.StrippedAcaciaWood; - mappings[191] = ItemType.StrippedCherryWood; - mappings[192] = ItemType.StrippedDarkOakWood; - mappings[193] = ItemType.StrippedPaleOakWood; - mappings[194] = ItemType.StrippedMangroveWood; - mappings[195] = ItemType.StrippedCrimsonHyphae; - mappings[196] = ItemType.StrippedWarpedHyphae; - mappings[197] = ItemType.StrippedBambooBlock; - mappings[198] = ItemType.OakWood; - mappings[199] = ItemType.SpruceWood; - mappings[200] = ItemType.BirchWood; - mappings[201] = ItemType.JungleWood; - mappings[202] = ItemType.AcaciaWood; - mappings[203] = ItemType.CherryWood; - mappings[204] = ItemType.PaleOakWood; - mappings[205] = ItemType.DarkOakWood; - mappings[206] = ItemType.MangroveWood; - mappings[207] = ItemType.CrimsonHyphae; - mappings[208] = ItemType.WarpedHyphae; - mappings[209] = ItemType.OakLeaves; - mappings[210] = ItemType.SpruceLeaves; - mappings[211] = ItemType.BirchLeaves; - mappings[212] = ItemType.JungleLeaves; - mappings[213] = ItemType.AcaciaLeaves; - mappings[214] = ItemType.CherryLeaves; - mappings[215] = ItemType.DarkOakLeaves; - mappings[216] = ItemType.PaleOakLeaves; - mappings[217] = ItemType.MangroveLeaves; - mappings[218] = ItemType.AzaleaLeaves; - mappings[219] = ItemType.FloweringAzaleaLeaves; - mappings[220] = ItemType.Sponge; - mappings[221] = ItemType.WetSponge; - mappings[222] = ItemType.Glass; - mappings[223] = ItemType.TintedGlass; - mappings[224] = ItemType.LapisBlock; - mappings[225] = ItemType.Sandstone; - mappings[226] = ItemType.ChiseledSandstone; - mappings[227] = ItemType.CutSandstone; - mappings[228] = ItemType.Cobweb; - mappings[229] = ItemType.ShortGrass; - mappings[230] = ItemType.Fern; - mappings[231] = ItemType.Bush; - mappings[232] = ItemType.Azalea; - mappings[233] = ItemType.FloweringAzalea; - mappings[234] = ItemType.DeadBush; - mappings[235] = ItemType.FireflyBush; - mappings[236] = ItemType.ShortDryGrass; - mappings[237] = ItemType.TallDryGrass; - mappings[238] = ItemType.Seagrass; - mappings[239] = ItemType.SeaPickle; - mappings[240] = ItemType.WhiteWool; - mappings[241] = ItemType.OrangeWool; - mappings[242] = ItemType.MagentaWool; - mappings[243] = ItemType.LightBlueWool; - mappings[244] = ItemType.YellowWool; - mappings[245] = ItemType.LimeWool; - mappings[246] = ItemType.PinkWool; - mappings[247] = ItemType.GrayWool; - mappings[248] = ItemType.LightGrayWool; - mappings[249] = ItemType.CyanWool; - mappings[250] = ItemType.PurpleWool; - mappings[251] = ItemType.BlueWool; - mappings[252] = ItemType.BrownWool; - mappings[253] = ItemType.GreenWool; - mappings[254] = ItemType.RedWool; - mappings[255] = ItemType.BlackWool; - mappings[256] = ItemType.Dandelion; - mappings[257] = ItemType.GoldenDandelion; - mappings[258] = ItemType.OpenEyeblossom; - mappings[259] = ItemType.ClosedEyeblossom; - mappings[260] = ItemType.Poppy; - mappings[261] = ItemType.BlueOrchid; - mappings[262] = ItemType.Allium; - mappings[263] = ItemType.AzureBluet; - mappings[264] = ItemType.RedTulip; - mappings[265] = ItemType.OrangeTulip; - mappings[266] = ItemType.WhiteTulip; - mappings[267] = ItemType.PinkTulip; - mappings[268] = ItemType.OxeyeDaisy; - mappings[269] = ItemType.Cornflower; - mappings[270] = ItemType.LilyOfTheValley; - mappings[271] = ItemType.WitherRose; - mappings[272] = ItemType.Torchflower; - mappings[273] = ItemType.PitcherPlant; - mappings[274] = ItemType.SporeBlossom; - mappings[275] = ItemType.BrownMushroom; - mappings[276] = ItemType.RedMushroom; - mappings[277] = ItemType.CrimsonFungus; - mappings[278] = ItemType.WarpedFungus; - mappings[279] = ItemType.CrimsonRoots; - mappings[280] = ItemType.WarpedRoots; - mappings[281] = ItemType.NetherSprouts; - mappings[282] = ItemType.WeepingVines; - mappings[283] = ItemType.TwistingVines; - mappings[284] = ItemType.SugarCane; - mappings[285] = ItemType.Kelp; - mappings[286] = ItemType.PinkPetals; - mappings[287] = ItemType.Wildflowers; - mappings[288] = ItemType.LeafLitter; - mappings[289] = ItemType.MossCarpet; - mappings[290] = ItemType.MossBlock; - mappings[291] = ItemType.PaleMossCarpet; - mappings[292] = ItemType.PaleHangingMoss; - mappings[293] = ItemType.PaleMossBlock; - mappings[294] = ItemType.HangingRoots; - mappings[295] = ItemType.BigDripleaf; - mappings[296] = ItemType.SmallDripleaf; - mappings[297] = ItemType.Bamboo; - mappings[298] = ItemType.OakSlab; - mappings[299] = ItemType.SpruceSlab; - mappings[300] = ItemType.BirchSlab; - mappings[301] = ItemType.JungleSlab; - mappings[302] = ItemType.AcaciaSlab; - mappings[303] = ItemType.CherrySlab; - mappings[304] = ItemType.DarkOakSlab; - mappings[305] = ItemType.PaleOakSlab; - mappings[306] = ItemType.MangroveSlab; - mappings[307] = ItemType.BambooSlab; - mappings[308] = ItemType.BambooMosaicSlab; - mappings[309] = ItemType.CrimsonSlab; - mappings[310] = ItemType.WarpedSlab; - mappings[311] = ItemType.StoneSlab; - mappings[312] = ItemType.SmoothStoneSlab; - mappings[313] = ItemType.SandstoneSlab; - mappings[314] = ItemType.CutSandstoneSlab; - mappings[315] = ItemType.PetrifiedOakSlab; - mappings[316] = ItemType.CobblestoneSlab; - mappings[317] = ItemType.BrickSlab; - mappings[318] = ItemType.StoneBrickSlab; - mappings[319] = ItemType.MudBrickSlab; - mappings[320] = ItemType.NetherBrickSlab; - mappings[321] = ItemType.QuartzSlab; - mappings[322] = ItemType.RedSandstoneSlab; - mappings[323] = ItemType.CutRedSandstoneSlab; - mappings[324] = ItemType.PurpurSlab; - mappings[325] = ItemType.PrismarineSlab; - mappings[326] = ItemType.PrismarineBrickSlab; - mappings[327] = ItemType.DarkPrismarineSlab; - mappings[328] = ItemType.SmoothQuartz; - mappings[329] = ItemType.SmoothRedSandstone; - mappings[330] = ItemType.SmoothSandstone; - mappings[331] = ItemType.SmoothStone; - mappings[332] = ItemType.Bricks; - mappings[333] = ItemType.AcaciaShelf; - mappings[334] = ItemType.BambooShelf; - mappings[335] = ItemType.BirchShelf; - mappings[336] = ItemType.CherryShelf; - mappings[337] = ItemType.CrimsonShelf; - mappings[338] = ItemType.DarkOakShelf; - mappings[339] = ItemType.JungleShelf; - mappings[340] = ItemType.MangroveShelf; - mappings[341] = ItemType.OakShelf; - mappings[342] = ItemType.PaleOakShelf; - mappings[343] = ItemType.SpruceShelf; - mappings[344] = ItemType.WarpedShelf; - mappings[345] = ItemType.Bookshelf; - mappings[346] = ItemType.ChiseledBookshelf; - mappings[347] = ItemType.DecoratedPot; - mappings[348] = ItemType.MossyCobblestone; - mappings[349] = ItemType.Obsidian; - mappings[350] = ItemType.Torch; - mappings[351] = ItemType.EndRod; - mappings[352] = ItemType.ChorusPlant; - mappings[353] = ItemType.ChorusFlower; - mappings[354] = ItemType.PurpurBlock; - mappings[355] = ItemType.PurpurPillar; - mappings[356] = ItemType.PurpurStairs; - mappings[357] = ItemType.Spawner; - mappings[358] = ItemType.CreakingHeart; - mappings[359] = ItemType.Chest; - mappings[360] = ItemType.CraftingTable; - mappings[361] = ItemType.Farmland; - mappings[362] = ItemType.Furnace; - mappings[363] = ItemType.Ladder; - mappings[364] = ItemType.CobblestoneStairs; - mappings[365] = ItemType.Snow; - mappings[366] = ItemType.Ice; - mappings[367] = ItemType.SnowBlock; - mappings[368] = ItemType.Cactus; - mappings[369] = ItemType.CactusFlower; - mappings[370] = ItemType.Clay; - mappings[371] = ItemType.Jukebox; - mappings[372] = ItemType.OakFence; - mappings[373] = ItemType.SpruceFence; - mappings[374] = ItemType.BirchFence; - mappings[375] = ItemType.JungleFence; - mappings[376] = ItemType.AcaciaFence; - mappings[377] = ItemType.CherryFence; - mappings[378] = ItemType.DarkOakFence; - mappings[379] = ItemType.PaleOakFence; - mappings[380] = ItemType.MangroveFence; - mappings[381] = ItemType.BambooFence; - mappings[382] = ItemType.CrimsonFence; - mappings[383] = ItemType.WarpedFence; - mappings[384] = ItemType.Pumpkin; - mappings[385] = ItemType.CarvedPumpkin; - mappings[386] = ItemType.JackOLantern; - mappings[387] = ItemType.Netherrack; - mappings[388] = ItemType.SoulSand; - mappings[389] = ItemType.SoulSoil; - mappings[390] = ItemType.Basalt; - mappings[391] = ItemType.PolishedBasalt; - mappings[392] = ItemType.SmoothBasalt; - mappings[393] = ItemType.SoulTorch; - mappings[394] = ItemType.CopperTorch; - mappings[395] = ItemType.Glowstone; - mappings[396] = ItemType.InfestedStone; - mappings[397] = ItemType.InfestedCobblestone; - mappings[398] = ItemType.InfestedStoneBricks; - mappings[399] = ItemType.InfestedMossyStoneBricks; - mappings[400] = ItemType.InfestedCrackedStoneBricks; - mappings[401] = ItemType.InfestedChiseledStoneBricks; - mappings[402] = ItemType.InfestedDeepslate; - mappings[403] = ItemType.StoneBricks; - mappings[404] = ItemType.MossyStoneBricks; - mappings[405] = ItemType.CrackedStoneBricks; - mappings[406] = ItemType.ChiseledStoneBricks; - mappings[407] = ItemType.PackedMud; - mappings[408] = ItemType.MudBricks; - mappings[409] = ItemType.DeepslateBricks; - mappings[410] = ItemType.CrackedDeepslateBricks; - mappings[411] = ItemType.DeepslateTiles; - mappings[412] = ItemType.CrackedDeepslateTiles; - mappings[413] = ItemType.ChiseledDeepslate; - mappings[414] = ItemType.ReinforcedDeepslate; - mappings[415] = ItemType.BrownMushroomBlock; - mappings[416] = ItemType.RedMushroomBlock; - mappings[417] = ItemType.MushroomStem; - mappings[418] = ItemType.IronBars; - mappings[419] = ItemType.CopperBars; - mappings[420] = ItemType.ExposedCopperBars; - mappings[421] = ItemType.WeatheredCopperBars; - mappings[422] = ItemType.OxidizedCopperBars; - mappings[423] = ItemType.WaxedCopperBars; - mappings[424] = ItemType.WaxedExposedCopperBars; - mappings[425] = ItemType.WaxedWeatheredCopperBars; - mappings[426] = ItemType.WaxedOxidizedCopperBars; - mappings[427] = ItemType.IronChain; - mappings[428] = ItemType.CopperChain; - mappings[429] = ItemType.ExposedCopperChain; - mappings[430] = ItemType.WeatheredCopperChain; - mappings[431] = ItemType.OxidizedCopperChain; - mappings[432] = ItemType.WaxedCopperChain; - mappings[433] = ItemType.WaxedExposedCopperChain; - mappings[434] = ItemType.WaxedWeatheredCopperChain; - mappings[435] = ItemType.WaxedOxidizedCopperChain; - mappings[436] = ItemType.GlassPane; - mappings[437] = ItemType.Melon; - mappings[438] = ItemType.Vine; - mappings[439] = ItemType.GlowLichen; - mappings[440] = ItemType.ResinClump; - mappings[441] = ItemType.ResinBlock; - mappings[442] = ItemType.ResinBricks; - mappings[443] = ItemType.ResinBrickStairs; - mappings[444] = ItemType.ResinBrickSlab; - mappings[445] = ItemType.ResinBrickWall; - mappings[446] = ItemType.ChiseledResinBricks; - mappings[447] = ItemType.BrickStairs; - mappings[448] = ItemType.StoneBrickStairs; - mappings[449] = ItemType.MudBrickStairs; - mappings[450] = ItemType.Mycelium; - mappings[451] = ItemType.LilyPad; - mappings[452] = ItemType.NetherBricks; - mappings[453] = ItemType.CrackedNetherBricks; - mappings[454] = ItemType.ChiseledNetherBricks; - mappings[455] = ItemType.NetherBrickFence; - mappings[456] = ItemType.NetherBrickStairs; - mappings[457] = ItemType.Sculk; - mappings[458] = ItemType.SculkVein; - mappings[459] = ItemType.SculkCatalyst; - mappings[460] = ItemType.SculkShrieker; - mappings[461] = ItemType.EnchantingTable; - mappings[462] = ItemType.EndPortalFrame; - mappings[463] = ItemType.EndStone; - mappings[464] = ItemType.EndStoneBricks; - mappings[465] = ItemType.DragonEgg; - mappings[466] = ItemType.SandstoneStairs; - mappings[467] = ItemType.EnderChest; - mappings[468] = ItemType.EmeraldBlock; - mappings[469] = ItemType.OakStairs; - mappings[470] = ItemType.SpruceStairs; - mappings[471] = ItemType.BirchStairs; - mappings[472] = ItemType.JungleStairs; - mappings[473] = ItemType.AcaciaStairs; - mappings[474] = ItemType.CherryStairs; - mappings[475] = ItemType.DarkOakStairs; - mappings[476] = ItemType.PaleOakStairs; - mappings[477] = ItemType.MangroveStairs; - mappings[478] = ItemType.BambooStairs; - mappings[479] = ItemType.BambooMosaicStairs; - mappings[480] = ItemType.CrimsonStairs; - mappings[481] = ItemType.WarpedStairs; - mappings[482] = ItemType.CommandBlock; - mappings[483] = ItemType.Beacon; - mappings[484] = ItemType.CobblestoneWall; - mappings[485] = ItemType.MossyCobblestoneWall; - mappings[486] = ItemType.BrickWall; - mappings[487] = ItemType.PrismarineWall; - mappings[488] = ItemType.RedSandstoneWall; - mappings[489] = ItemType.MossyStoneBrickWall; - mappings[490] = ItemType.GraniteWall; - mappings[491] = ItemType.StoneBrickWall; - mappings[492] = ItemType.MudBrickWall; - mappings[493] = ItemType.NetherBrickWall; - mappings[494] = ItemType.AndesiteWall; - mappings[495] = ItemType.RedNetherBrickWall; - mappings[496] = ItemType.SandstoneWall; - mappings[497] = ItemType.EndStoneBrickWall; - mappings[498] = ItemType.DioriteWall; - mappings[499] = ItemType.BlackstoneWall; - mappings[500] = ItemType.PolishedBlackstoneWall; - mappings[501] = ItemType.PolishedBlackstoneBrickWall; - mappings[502] = ItemType.CobbledDeepslateWall; - mappings[503] = ItemType.PolishedDeepslateWall; - mappings[504] = ItemType.DeepslateBrickWall; - mappings[505] = ItemType.DeepslateTileWall; - mappings[506] = ItemType.Anvil; - mappings[507] = ItemType.ChippedAnvil; - mappings[508] = ItemType.DamagedAnvil; - mappings[509] = ItemType.ChiseledQuartzBlock; - mappings[510] = ItemType.QuartzBlock; - mappings[511] = ItemType.QuartzBricks; - mappings[512] = ItemType.QuartzPillar; - mappings[513] = ItemType.QuartzStairs; - mappings[514] = ItemType.WhiteTerracotta; - mappings[515] = ItemType.OrangeTerracotta; - mappings[516] = ItemType.MagentaTerracotta; - mappings[517] = ItemType.LightBlueTerracotta; - mappings[518] = ItemType.YellowTerracotta; - mappings[519] = ItemType.LimeTerracotta; - mappings[520] = ItemType.PinkTerracotta; - mappings[521] = ItemType.GrayTerracotta; - mappings[522] = ItemType.LightGrayTerracotta; - mappings[523] = ItemType.CyanTerracotta; - mappings[524] = ItemType.PurpleTerracotta; - mappings[525] = ItemType.BlueTerracotta; - mappings[526] = ItemType.BrownTerracotta; - mappings[527] = ItemType.GreenTerracotta; - mappings[528] = ItemType.RedTerracotta; - mappings[529] = ItemType.BlackTerracotta; - mappings[530] = ItemType.Barrier; - mappings[531] = ItemType.Light; - mappings[532] = ItemType.HayBlock; - mappings[533] = ItemType.WhiteCarpet; - mappings[534] = ItemType.OrangeCarpet; - mappings[535] = ItemType.MagentaCarpet; - mappings[536] = ItemType.LightBlueCarpet; - mappings[537] = ItemType.YellowCarpet; - mappings[538] = ItemType.LimeCarpet; - mappings[539] = ItemType.PinkCarpet; - mappings[540] = ItemType.GrayCarpet; - mappings[541] = ItemType.LightGrayCarpet; - mappings[542] = ItemType.CyanCarpet; - mappings[543] = ItemType.PurpleCarpet; - mappings[544] = ItemType.BlueCarpet; - mappings[545] = ItemType.BrownCarpet; - mappings[546] = ItemType.GreenCarpet; - mappings[547] = ItemType.RedCarpet; - mappings[548] = ItemType.BlackCarpet; - mappings[549] = ItemType.Terracotta; - mappings[550] = ItemType.PackedIce; - mappings[551] = ItemType.DirtPath; - mappings[552] = ItemType.Sunflower; - mappings[553] = ItemType.Lilac; - mappings[554] = ItemType.RoseBush; - mappings[555] = ItemType.Peony; - mappings[556] = ItemType.TallGrass; - mappings[557] = ItemType.LargeFern; - mappings[558] = ItemType.WhiteStainedGlass; - mappings[559] = ItemType.OrangeStainedGlass; - mappings[560] = ItemType.MagentaStainedGlass; - mappings[561] = ItemType.LightBlueStainedGlass; - mappings[562] = ItemType.YellowStainedGlass; - mappings[563] = ItemType.LimeStainedGlass; - mappings[564] = ItemType.PinkStainedGlass; - mappings[565] = ItemType.GrayStainedGlass; - mappings[566] = ItemType.LightGrayStainedGlass; - mappings[567] = ItemType.CyanStainedGlass; - mappings[568] = ItemType.PurpleStainedGlass; - mappings[569] = ItemType.BlueStainedGlass; - mappings[570] = ItemType.BrownStainedGlass; - mappings[571] = ItemType.GreenStainedGlass; - mappings[572] = ItemType.RedStainedGlass; - mappings[573] = ItemType.BlackStainedGlass; - mappings[574] = ItemType.WhiteStainedGlassPane; - mappings[575] = ItemType.OrangeStainedGlassPane; - mappings[576] = ItemType.MagentaStainedGlassPane; - mappings[577] = ItemType.LightBlueStainedGlassPane; - mappings[578] = ItemType.YellowStainedGlassPane; - mappings[579] = ItemType.LimeStainedGlassPane; - mappings[580] = ItemType.PinkStainedGlassPane; - mappings[581] = ItemType.GrayStainedGlassPane; - mappings[582] = ItemType.LightGrayStainedGlassPane; - mappings[583] = ItemType.CyanStainedGlassPane; - mappings[584] = ItemType.PurpleStainedGlassPane; - mappings[585] = ItemType.BlueStainedGlassPane; - mappings[586] = ItemType.BrownStainedGlassPane; - mappings[587] = ItemType.GreenStainedGlassPane; - mappings[588] = ItemType.RedStainedGlassPane; - mappings[589] = ItemType.BlackStainedGlassPane; - mappings[590] = ItemType.Prismarine; - mappings[591] = ItemType.PrismarineBricks; - mappings[592] = ItemType.DarkPrismarine; - mappings[593] = ItemType.PrismarineStairs; - mappings[594] = ItemType.PrismarineBrickStairs; - mappings[595] = ItemType.DarkPrismarineStairs; - mappings[596] = ItemType.SeaLantern; - mappings[597] = ItemType.RedSandstone; - mappings[598] = ItemType.ChiseledRedSandstone; - mappings[599] = ItemType.CutRedSandstone; - mappings[600] = ItemType.RedSandstoneStairs; - mappings[601] = ItemType.RepeatingCommandBlock; - mappings[602] = ItemType.ChainCommandBlock; - mappings[603] = ItemType.MagmaBlock; - mappings[604] = ItemType.NetherWartBlock; - mappings[605] = ItemType.WarpedWartBlock; - mappings[606] = ItemType.RedNetherBricks; - mappings[607] = ItemType.BoneBlock; - mappings[608] = ItemType.StructureVoid; - mappings[609] = ItemType.ShulkerBox; - mappings[610] = ItemType.WhiteShulkerBox; - mappings[611] = ItemType.OrangeShulkerBox; - mappings[612] = ItemType.MagentaShulkerBox; - mappings[613] = ItemType.LightBlueShulkerBox; - mappings[614] = ItemType.YellowShulkerBox; - mappings[615] = ItemType.LimeShulkerBox; - mappings[616] = ItemType.PinkShulkerBox; - mappings[617] = ItemType.GrayShulkerBox; - mappings[618] = ItemType.LightGrayShulkerBox; - mappings[619] = ItemType.CyanShulkerBox; - mappings[620] = ItemType.PurpleShulkerBox; - mappings[621] = ItemType.BlueShulkerBox; - mappings[622] = ItemType.BrownShulkerBox; - mappings[623] = ItemType.GreenShulkerBox; - mappings[624] = ItemType.RedShulkerBox; - mappings[625] = ItemType.BlackShulkerBox; - mappings[626] = ItemType.WhiteGlazedTerracotta; - mappings[627] = ItemType.OrangeGlazedTerracotta; - mappings[628] = ItemType.MagentaGlazedTerracotta; - mappings[629] = ItemType.LightBlueGlazedTerracotta; - mappings[630] = ItemType.YellowGlazedTerracotta; - mappings[631] = ItemType.LimeGlazedTerracotta; - mappings[632] = ItemType.PinkGlazedTerracotta; - mappings[633] = ItemType.GrayGlazedTerracotta; - mappings[634] = ItemType.LightGrayGlazedTerracotta; - mappings[635] = ItemType.CyanGlazedTerracotta; - mappings[636] = ItemType.PurpleGlazedTerracotta; - mappings[637] = ItemType.BlueGlazedTerracotta; - mappings[638] = ItemType.BrownGlazedTerracotta; - mappings[639] = ItemType.GreenGlazedTerracotta; - mappings[640] = ItemType.RedGlazedTerracotta; - mappings[641] = ItemType.BlackGlazedTerracotta; - mappings[642] = ItemType.WhiteConcrete; - mappings[643] = ItemType.OrangeConcrete; - mappings[644] = ItemType.MagentaConcrete; - mappings[645] = ItemType.LightBlueConcrete; - mappings[646] = ItemType.YellowConcrete; - mappings[647] = ItemType.LimeConcrete; - mappings[648] = ItemType.PinkConcrete; - mappings[649] = ItemType.GrayConcrete; - mappings[650] = ItemType.LightGrayConcrete; - mappings[651] = ItemType.CyanConcrete; - mappings[652] = ItemType.PurpleConcrete; - mappings[653] = ItemType.BlueConcrete; - mappings[654] = ItemType.BrownConcrete; - mappings[655] = ItemType.GreenConcrete; - mappings[656] = ItemType.RedConcrete; - mappings[657] = ItemType.BlackConcrete; - mappings[658] = ItemType.WhiteConcretePowder; - mappings[659] = ItemType.OrangeConcretePowder; - mappings[660] = ItemType.MagentaConcretePowder; - mappings[661] = ItemType.LightBlueConcretePowder; - mappings[662] = ItemType.YellowConcretePowder; - mappings[663] = ItemType.LimeConcretePowder; - mappings[664] = ItemType.PinkConcretePowder; - mappings[665] = ItemType.GrayConcretePowder; - mappings[666] = ItemType.LightGrayConcretePowder; - mappings[667] = ItemType.CyanConcretePowder; - mappings[668] = ItemType.PurpleConcretePowder; - mappings[669] = ItemType.BlueConcretePowder; - mappings[670] = ItemType.BrownConcretePowder; - mappings[671] = ItemType.GreenConcretePowder; - mappings[672] = ItemType.RedConcretePowder; - mappings[673] = ItemType.BlackConcretePowder; - mappings[674] = ItemType.TurtleEgg; - mappings[675] = ItemType.SnifferEgg; - mappings[676] = ItemType.DriedGhast; - mappings[677] = ItemType.DeadTubeCoralBlock; - mappings[678] = ItemType.DeadBrainCoralBlock; - mappings[679] = ItemType.DeadBubbleCoralBlock; - mappings[680] = ItemType.DeadFireCoralBlock; - mappings[681] = ItemType.DeadHornCoralBlock; - mappings[682] = ItemType.TubeCoralBlock; - mappings[683] = ItemType.BrainCoralBlock; - mappings[684] = ItemType.BubbleCoralBlock; - mappings[685] = ItemType.FireCoralBlock; - mappings[686] = ItemType.HornCoralBlock; - mappings[687] = ItemType.TubeCoral; - mappings[688] = ItemType.BrainCoral; - mappings[689] = ItemType.BubbleCoral; - mappings[690] = ItemType.FireCoral; - mappings[691] = ItemType.HornCoral; - mappings[692] = ItemType.DeadBrainCoral; - mappings[693] = ItemType.DeadBubbleCoral; - mappings[694] = ItemType.DeadFireCoral; - mappings[695] = ItemType.DeadHornCoral; - mappings[696] = ItemType.DeadTubeCoral; - mappings[697] = ItemType.TubeCoralFan; - mappings[698] = ItemType.BrainCoralFan; - mappings[699] = ItemType.BubbleCoralFan; - mappings[700] = ItemType.FireCoralFan; - mappings[701] = ItemType.HornCoralFan; - mappings[702] = ItemType.DeadTubeCoralFan; - mappings[703] = ItemType.DeadBrainCoralFan; - mappings[704] = ItemType.DeadBubbleCoralFan; - mappings[705] = ItemType.DeadFireCoralFan; - mappings[706] = ItemType.DeadHornCoralFan; - mappings[707] = ItemType.BlueIce; - mappings[708] = ItemType.Conduit; - mappings[709] = ItemType.PolishedGraniteStairs; - mappings[710] = ItemType.SmoothRedSandstoneStairs; - mappings[711] = ItemType.MossyStoneBrickStairs; - mappings[712] = ItemType.PolishedDioriteStairs; - mappings[713] = ItemType.MossyCobblestoneStairs; - mappings[714] = ItemType.EndStoneBrickStairs; - mappings[715] = ItemType.StoneStairs; - mappings[716] = ItemType.SmoothSandstoneStairs; - mappings[717] = ItemType.SmoothQuartzStairs; - mappings[718] = ItemType.GraniteStairs; - mappings[719] = ItemType.AndesiteStairs; - mappings[720] = ItemType.RedNetherBrickStairs; - mappings[721] = ItemType.PolishedAndesiteStairs; - mappings[722] = ItemType.DioriteStairs; - mappings[723] = ItemType.CobbledDeepslateStairs; - mappings[724] = ItemType.PolishedDeepslateStairs; - mappings[725] = ItemType.DeepslateBrickStairs; - mappings[726] = ItemType.DeepslateTileStairs; - mappings[727] = ItemType.PolishedGraniteSlab; - mappings[728] = ItemType.SmoothRedSandstoneSlab; - mappings[729] = ItemType.MossyStoneBrickSlab; - mappings[730] = ItemType.PolishedDioriteSlab; - mappings[731] = ItemType.MossyCobblestoneSlab; - mappings[732] = ItemType.EndStoneBrickSlab; - mappings[733] = ItemType.SmoothSandstoneSlab; - mappings[734] = ItemType.SmoothQuartzSlab; - mappings[735] = ItemType.GraniteSlab; - mappings[736] = ItemType.AndesiteSlab; - mappings[737] = ItemType.RedNetherBrickSlab; - mappings[738] = ItemType.PolishedAndesiteSlab; - mappings[739] = ItemType.DioriteSlab; - mappings[740] = ItemType.CobbledDeepslateSlab; - mappings[741] = ItemType.PolishedDeepslateSlab; - mappings[742] = ItemType.DeepslateBrickSlab; - mappings[743] = ItemType.DeepslateTileSlab; - mappings[744] = ItemType.Scaffolding; - mappings[745] = ItemType.Redstone; - mappings[746] = ItemType.RedstoneTorch; - mappings[747] = ItemType.RedstoneBlock; - mappings[748] = ItemType.Repeater; - mappings[749] = ItemType.Comparator; - mappings[750] = ItemType.Piston; - mappings[751] = ItemType.StickyPiston; - mappings[752] = ItemType.SlimeBlock; - mappings[753] = ItemType.HoneyBlock; - mappings[754] = ItemType.Observer; - mappings[755] = ItemType.Hopper; - mappings[756] = ItemType.Dispenser; - mappings[757] = ItemType.Dropper; - mappings[758] = ItemType.Lectern; - mappings[759] = ItemType.Target; - mappings[760] = ItemType.Lever; - mappings[761] = ItemType.LightningRod; - mappings[762] = ItemType.ExposedLightningRod; - mappings[763] = ItemType.WeatheredLightningRod; - mappings[764] = ItemType.OxidizedLightningRod; - mappings[765] = ItemType.WaxedLightningRod; - mappings[766] = ItemType.WaxedExposedLightningRod; - mappings[767] = ItemType.WaxedWeatheredLightningRod; - mappings[768] = ItemType.WaxedOxidizedLightningRod; - mappings[769] = ItemType.DaylightDetector; - mappings[770] = ItemType.SculkSensor; - mappings[771] = ItemType.CalibratedSculkSensor; - mappings[772] = ItemType.TripwireHook; - mappings[773] = ItemType.TrappedChest; - mappings[774] = ItemType.Tnt; - mappings[775] = ItemType.RedstoneLamp; - mappings[776] = ItemType.NoteBlock; - mappings[777] = ItemType.StoneButton; - mappings[778] = ItemType.PolishedBlackstoneButton; - mappings[779] = ItemType.OakButton; - mappings[780] = ItemType.SpruceButton; - mappings[781] = ItemType.BirchButton; - mappings[782] = ItemType.JungleButton; - mappings[783] = ItemType.AcaciaButton; - mappings[784] = ItemType.CherryButton; - mappings[785] = ItemType.DarkOakButton; - mappings[786] = ItemType.PaleOakButton; - mappings[787] = ItemType.MangroveButton; - mappings[788] = ItemType.BambooButton; - mappings[789] = ItemType.CrimsonButton; - mappings[790] = ItemType.WarpedButton; - mappings[791] = ItemType.StonePressurePlate; - mappings[792] = ItemType.PolishedBlackstonePressurePlate; - mappings[793] = ItemType.LightWeightedPressurePlate; - mappings[794] = ItemType.HeavyWeightedPressurePlate; - mappings[795] = ItemType.OakPressurePlate; - mappings[796] = ItemType.SprucePressurePlate; - mappings[797] = ItemType.BirchPressurePlate; - mappings[798] = ItemType.JunglePressurePlate; - mappings[799] = ItemType.AcaciaPressurePlate; - mappings[800] = ItemType.CherryPressurePlate; - mappings[801] = ItemType.DarkOakPressurePlate; - mappings[802] = ItemType.PaleOakPressurePlate; - mappings[803] = ItemType.MangrovePressurePlate; - mappings[804] = ItemType.BambooPressurePlate; - mappings[805] = ItemType.CrimsonPressurePlate; - mappings[806] = ItemType.WarpedPressurePlate; - mappings[807] = ItemType.IronDoor; - mappings[808] = ItemType.OakDoor; - mappings[809] = ItemType.SpruceDoor; - mappings[810] = ItemType.BirchDoor; - mappings[811] = ItemType.JungleDoor; - mappings[812] = ItemType.AcaciaDoor; - mappings[813] = ItemType.CherryDoor; - mappings[814] = ItemType.DarkOakDoor; - mappings[815] = ItemType.PaleOakDoor; - mappings[816] = ItemType.MangroveDoor; - mappings[817] = ItemType.BambooDoor; - mappings[818] = ItemType.CrimsonDoor; - mappings[819] = ItemType.WarpedDoor; - mappings[820] = ItemType.CopperDoor; - mappings[821] = ItemType.ExposedCopperDoor; - mappings[822] = ItemType.WeatheredCopperDoor; - mappings[823] = ItemType.OxidizedCopperDoor; - mappings[824] = ItemType.WaxedCopperDoor; - mappings[825] = ItemType.WaxedExposedCopperDoor; - mappings[826] = ItemType.WaxedWeatheredCopperDoor; - mappings[827] = ItemType.WaxedOxidizedCopperDoor; - mappings[828] = ItemType.IronTrapdoor; - mappings[829] = ItemType.OakTrapdoor; - mappings[830] = ItemType.SpruceTrapdoor; - mappings[831] = ItemType.BirchTrapdoor; - mappings[832] = ItemType.JungleTrapdoor; - mappings[833] = ItemType.AcaciaTrapdoor; - mappings[834] = ItemType.CherryTrapdoor; - mappings[835] = ItemType.DarkOakTrapdoor; - mappings[836] = ItemType.PaleOakTrapdoor; - mappings[837] = ItemType.MangroveTrapdoor; - mappings[838] = ItemType.BambooTrapdoor; - mappings[839] = ItemType.CrimsonTrapdoor; - mappings[840] = ItemType.WarpedTrapdoor; - mappings[841] = ItemType.CopperTrapdoor; - mappings[842] = ItemType.ExposedCopperTrapdoor; - mappings[843] = ItemType.WeatheredCopperTrapdoor; - mappings[844] = ItemType.OxidizedCopperTrapdoor; - mappings[845] = ItemType.WaxedCopperTrapdoor; - mappings[846] = ItemType.WaxedExposedCopperTrapdoor; - mappings[847] = ItemType.WaxedWeatheredCopperTrapdoor; - mappings[848] = ItemType.WaxedOxidizedCopperTrapdoor; - mappings[849] = ItemType.OakFenceGate; - mappings[850] = ItemType.SpruceFenceGate; - mappings[851] = ItemType.BirchFenceGate; - mappings[852] = ItemType.JungleFenceGate; - mappings[853] = ItemType.AcaciaFenceGate; - mappings[854] = ItemType.CherryFenceGate; - mappings[855] = ItemType.DarkOakFenceGate; - mappings[856] = ItemType.PaleOakFenceGate; - mappings[857] = ItemType.MangroveFenceGate; - mappings[858] = ItemType.BambooFenceGate; - mappings[859] = ItemType.CrimsonFenceGate; - mappings[860] = ItemType.WarpedFenceGate; - mappings[861] = ItemType.PoweredRail; - mappings[862] = ItemType.DetectorRail; - mappings[863] = ItemType.Rail; - mappings[864] = ItemType.ActivatorRail; - mappings[865] = ItemType.Saddle; - mappings[866] = ItemType.WhiteHarness; - mappings[867] = ItemType.OrangeHarness; - mappings[868] = ItemType.MagentaHarness; - mappings[869] = ItemType.LightBlueHarness; - mappings[870] = ItemType.YellowHarness; - mappings[871] = ItemType.LimeHarness; - mappings[872] = ItemType.PinkHarness; - mappings[873] = ItemType.GrayHarness; - mappings[874] = ItemType.LightGrayHarness; - mappings[875] = ItemType.CyanHarness; - mappings[876] = ItemType.PurpleHarness; - mappings[877] = ItemType.BlueHarness; - mappings[878] = ItemType.BrownHarness; - mappings[879] = ItemType.GreenHarness; - mappings[880] = ItemType.RedHarness; - mappings[881] = ItemType.BlackHarness; - mappings[882] = ItemType.Minecart; - mappings[883] = ItemType.ChestMinecart; - mappings[884] = ItemType.FurnaceMinecart; - mappings[885] = ItemType.TntMinecart; - mappings[886] = ItemType.HopperMinecart; - mappings[887] = ItemType.CarrotOnAStick; - mappings[888] = ItemType.WarpedFungusOnAStick; - mappings[889] = ItemType.PhantomMembrane; - mappings[890] = ItemType.Elytra; - mappings[891] = ItemType.OakBoat; - mappings[892] = ItemType.OakChestBoat; - mappings[893] = ItemType.SpruceBoat; - mappings[894] = ItemType.SpruceChestBoat; - mappings[895] = ItemType.BirchBoat; - mappings[896] = ItemType.BirchChestBoat; - mappings[897] = ItemType.JungleBoat; - mappings[898] = ItemType.JungleChestBoat; - mappings[899] = ItemType.AcaciaBoat; - mappings[900] = ItemType.AcaciaChestBoat; - mappings[901] = ItemType.CherryBoat; - mappings[902] = ItemType.CherryChestBoat; - mappings[903] = ItemType.DarkOakBoat; - mappings[904] = ItemType.DarkOakChestBoat; - mappings[905] = ItemType.PaleOakBoat; - mappings[906] = ItemType.PaleOakChestBoat; - mappings[907] = ItemType.MangroveBoat; - mappings[908] = ItemType.MangroveChestBoat; - mappings[909] = ItemType.BambooRaft; - mappings[910] = ItemType.BambooChestRaft; - mappings[911] = ItemType.StructureBlock; - mappings[912] = ItemType.Jigsaw; - mappings[913] = ItemType.TestBlock; - mappings[914] = ItemType.TestInstanceBlock; - mappings[915] = ItemType.TurtleHelmet; - mappings[916] = ItemType.TurtleScute; - mappings[917] = ItemType.ArmadilloScute; - mappings[918] = ItemType.WolfArmor; - mappings[919] = ItemType.FlintAndSteel; - mappings[920] = ItemType.Bowl; - mappings[921] = ItemType.Apple; - mappings[922] = ItemType.Bow; - mappings[923] = ItemType.Arrow; - mappings[924] = ItemType.Coal; - mappings[925] = ItemType.Charcoal; - mappings[926] = ItemType.Diamond; - mappings[927] = ItemType.Emerald; - mappings[928] = ItemType.LapisLazuli; - mappings[929] = ItemType.Quartz; - mappings[930] = ItemType.AmethystShard; - mappings[931] = ItemType.RawIron; - mappings[932] = ItemType.IronIngot; - mappings[933] = ItemType.RawCopper; - mappings[934] = ItemType.CopperIngot; - mappings[935] = ItemType.RawGold; - mappings[936] = ItemType.GoldIngot; - mappings[937] = ItemType.NetheriteIngot; - mappings[938] = ItemType.NetheriteScrap; - mappings[939] = ItemType.WoodenSword; - mappings[940] = ItemType.WoodenShovel; - mappings[941] = ItemType.WoodenPickaxe; - mappings[942] = ItemType.WoodenAxe; - mappings[943] = ItemType.WoodenHoe; - mappings[944] = ItemType.CopperSword; - mappings[945] = ItemType.CopperShovel; - mappings[946] = ItemType.CopperPickaxe; - mappings[947] = ItemType.CopperAxe; - mappings[948] = ItemType.CopperHoe; - mappings[949] = ItemType.StoneSword; - mappings[950] = ItemType.StoneShovel; - mappings[951] = ItemType.StonePickaxe; - mappings[952] = ItemType.StoneAxe; - mappings[953] = ItemType.StoneHoe; - mappings[954] = ItemType.GoldenSword; - mappings[955] = ItemType.GoldenShovel; - mappings[956] = ItemType.GoldenPickaxe; - mappings[957] = ItemType.GoldenAxe; - mappings[958] = ItemType.GoldenHoe; - mappings[959] = ItemType.IronSword; - mappings[960] = ItemType.IronShovel; - mappings[961] = ItemType.IronPickaxe; - mappings[962] = ItemType.IronAxe; - mappings[963] = ItemType.IronHoe; - mappings[964] = ItemType.DiamondSword; - mappings[965] = ItemType.DiamondShovel; - mappings[966] = ItemType.DiamondPickaxe; - mappings[967] = ItemType.DiamondAxe; - mappings[968] = ItemType.DiamondHoe; - mappings[969] = ItemType.NetheriteSword; - mappings[970] = ItemType.NetheriteShovel; - mappings[971] = ItemType.NetheritePickaxe; - mappings[972] = ItemType.NetheriteAxe; - mappings[973] = ItemType.NetheriteHoe; - mappings[974] = ItemType.Stick; - mappings[975] = ItemType.MushroomStew; - mappings[976] = ItemType.String; - mappings[977] = ItemType.Feather; - mappings[978] = ItemType.Gunpowder; - mappings[979] = ItemType.WheatSeeds; - mappings[980] = ItemType.Wheat; - mappings[981] = ItemType.Bread; - mappings[982] = ItemType.LeatherHelmet; - mappings[983] = ItemType.LeatherChestplate; - mappings[984] = ItemType.LeatherLeggings; - mappings[985] = ItemType.LeatherBoots; - mappings[986] = ItemType.CopperHelmet; - mappings[987] = ItemType.CopperChestplate; - mappings[988] = ItemType.CopperLeggings; - mappings[989] = ItemType.CopperBoots; - mappings[990] = ItemType.ChainmailHelmet; - mappings[991] = ItemType.ChainmailChestplate; - mappings[992] = ItemType.ChainmailLeggings; - mappings[993] = ItemType.ChainmailBoots; - mappings[994] = ItemType.IronHelmet; - mappings[995] = ItemType.IronChestplate; - mappings[996] = ItemType.IronLeggings; - mappings[997] = ItemType.IronBoots; - mappings[998] = ItemType.DiamondHelmet; - mappings[999] = ItemType.DiamondChestplate; - mappings[1000] = ItemType.DiamondLeggings; - mappings[1001] = ItemType.DiamondBoots; - mappings[1002] = ItemType.GoldenHelmet; - mappings[1003] = ItemType.GoldenChestplate; - mappings[1004] = ItemType.GoldenLeggings; - mappings[1005] = ItemType.GoldenBoots; - mappings[1006] = ItemType.NetheriteHelmet; - mappings[1007] = ItemType.NetheriteChestplate; - mappings[1008] = ItemType.NetheriteLeggings; - mappings[1009] = ItemType.NetheriteBoots; - mappings[1010] = ItemType.Flint; - mappings[1011] = ItemType.Porkchop; - mappings[1012] = ItemType.CookedPorkchop; - mappings[1013] = ItemType.Painting; - mappings[1014] = ItemType.GoldenApple; - mappings[1015] = ItemType.EnchantedGoldenApple; - mappings[1016] = ItemType.OakSign; - mappings[1017] = ItemType.SpruceSign; - mappings[1018] = ItemType.BirchSign; - mappings[1019] = ItemType.JungleSign; - mappings[1020] = ItemType.AcaciaSign; - mappings[1021] = ItemType.CherrySign; - mappings[1022] = ItemType.DarkOakSign; - mappings[1023] = ItemType.PaleOakSign; - mappings[1024] = ItemType.MangroveSign; - mappings[1025] = ItemType.BambooSign; - mappings[1026] = ItemType.CrimsonSign; - mappings[1027] = ItemType.WarpedSign; - mappings[1028] = ItemType.OakHangingSign; - mappings[1029] = ItemType.SpruceHangingSign; - mappings[1030] = ItemType.BirchHangingSign; - mappings[1031] = ItemType.JungleHangingSign; - mappings[1032] = ItemType.AcaciaHangingSign; - mappings[1033] = ItemType.CherryHangingSign; - mappings[1034] = ItemType.DarkOakHangingSign; - mappings[1035] = ItemType.PaleOakHangingSign; - mappings[1036] = ItemType.MangroveHangingSign; - mappings[1037] = ItemType.BambooHangingSign; - mappings[1038] = ItemType.CrimsonHangingSign; - mappings[1039] = ItemType.WarpedHangingSign; - mappings[1040] = ItemType.Bucket; - mappings[1041] = ItemType.WaterBucket; - mappings[1042] = ItemType.LavaBucket; - mappings[1043] = ItemType.PowderSnowBucket; - mappings[1044] = ItemType.Snowball; - mappings[1045] = ItemType.Leather; - mappings[1046] = ItemType.MilkBucket; - mappings[1047] = ItemType.PufferfishBucket; - mappings[1048] = ItemType.SalmonBucket; - mappings[1049] = ItemType.CodBucket; - mappings[1050] = ItemType.TropicalFishBucket; - mappings[1051] = ItemType.AxolotlBucket; - mappings[1052] = ItemType.SulfurCubeBucket; - mappings[1053] = ItemType.TadpoleBucket; - mappings[1054] = ItemType.Brick; - mappings[1055] = ItemType.ClayBall; - mappings[1056] = ItemType.DriedKelpBlock; - mappings[1057] = ItemType.Paper; - mappings[1058] = ItemType.Book; - mappings[1059] = ItemType.SlimeBall; - mappings[1060] = ItemType.Egg; - mappings[1061] = ItemType.BlueEgg; - mappings[1062] = ItemType.BrownEgg; - mappings[1063] = ItemType.Compass; - mappings[1064] = ItemType.RecoveryCompass; - mappings[1065] = ItemType.Bundle; - mappings[1066] = ItemType.WhiteBundle; - mappings[1067] = ItemType.OrangeBundle; - mappings[1068] = ItemType.MagentaBundle; - mappings[1069] = ItemType.LightBlueBundle; - mappings[1070] = ItemType.YellowBundle; - mappings[1071] = ItemType.LimeBundle; - mappings[1072] = ItemType.PinkBundle; - mappings[1073] = ItemType.GrayBundle; - mappings[1074] = ItemType.LightGrayBundle; - mappings[1075] = ItemType.CyanBundle; - mappings[1076] = ItemType.PurpleBundle; - mappings[1077] = ItemType.BlueBundle; - mappings[1078] = ItemType.BrownBundle; - mappings[1079] = ItemType.GreenBundle; - mappings[1080] = ItemType.RedBundle; - mappings[1081] = ItemType.BlackBundle; - mappings[1082] = ItemType.FishingRod; - mappings[1083] = ItemType.Clock; - mappings[1084] = ItemType.Spyglass; - mappings[1085] = ItemType.GlowstoneDust; - mappings[1086] = ItemType.Cod; - mappings[1087] = ItemType.Salmon; - mappings[1088] = ItemType.TropicalFish; - mappings[1089] = ItemType.Pufferfish; - mappings[1090] = ItemType.CookedCod; - mappings[1091] = ItemType.CookedSalmon; - mappings[1092] = ItemType.InkSac; - mappings[1093] = ItemType.GlowInkSac; - mappings[1094] = ItemType.CocoaBeans; - mappings[1095] = ItemType.WhiteDye; - mappings[1096] = ItemType.OrangeDye; - mappings[1097] = ItemType.MagentaDye; - mappings[1098] = ItemType.LightBlueDye; - mappings[1099] = ItemType.YellowDye; - mappings[1100] = ItemType.LimeDye; - mappings[1101] = ItemType.PinkDye; - mappings[1102] = ItemType.GrayDye; - mappings[1103] = ItemType.LightGrayDye; - mappings[1104] = ItemType.CyanDye; - mappings[1105] = ItemType.PurpleDye; - mappings[1106] = ItemType.BlueDye; - mappings[1107] = ItemType.BrownDye; - mappings[1108] = ItemType.GreenDye; - mappings[1109] = ItemType.RedDye; - mappings[1110] = ItemType.BlackDye; - mappings[1111] = ItemType.BoneMeal; - mappings[1112] = ItemType.Bone; - mappings[1113] = ItemType.Sugar; - mappings[1114] = ItemType.Cake; - mappings[1115] = ItemType.WhiteBed; - mappings[1116] = ItemType.OrangeBed; - mappings[1117] = ItemType.MagentaBed; - mappings[1118] = ItemType.LightBlueBed; - mappings[1119] = ItemType.YellowBed; - mappings[1120] = ItemType.LimeBed; - mappings[1121] = ItemType.PinkBed; - mappings[1122] = ItemType.GrayBed; - mappings[1123] = ItemType.LightGrayBed; - mappings[1124] = ItemType.CyanBed; - mappings[1125] = ItemType.PurpleBed; - mappings[1126] = ItemType.BlueBed; - mappings[1127] = ItemType.BrownBed; - mappings[1128] = ItemType.GreenBed; - mappings[1129] = ItemType.RedBed; - mappings[1130] = ItemType.BlackBed; - mappings[1131] = ItemType.Cookie; - mappings[1132] = ItemType.Crafter; - mappings[1133] = ItemType.FilledMap; - mappings[1134] = ItemType.Shears; - mappings[1135] = ItemType.MelonSlice; - mappings[1136] = ItemType.DriedKelp; - mappings[1137] = ItemType.PumpkinSeeds; - mappings[1138] = ItemType.MelonSeeds; - mappings[1139] = ItemType.Beef; - mappings[1140] = ItemType.CookedBeef; - mappings[1141] = ItemType.Chicken; - mappings[1142] = ItemType.CookedChicken; - mappings[1143] = ItemType.RottenFlesh; - mappings[1144] = ItemType.EnderPearl; - mappings[1145] = ItemType.BlazeRod; - mappings[1146] = ItemType.GhastTear; - mappings[1147] = ItemType.GoldNugget; - mappings[1148] = ItemType.NetherWart; - mappings[1149] = ItemType.GlassBottle; - mappings[1150] = ItemType.Potion; - mappings[1151] = ItemType.SpiderEye; - mappings[1152] = ItemType.FermentedSpiderEye; - mappings[1153] = ItemType.BlazePowder; - mappings[1154] = ItemType.MagmaCream; - mappings[1155] = ItemType.BrewingStand; - mappings[1156] = ItemType.Cauldron; - mappings[1157] = ItemType.EnderEye; - mappings[1158] = ItemType.GlisteringMelonSlice; - mappings[1159] = ItemType.ChickenSpawnEgg; - mappings[1160] = ItemType.CowSpawnEgg; - mappings[1161] = ItemType.PigSpawnEgg; - mappings[1162] = ItemType.SheepSpawnEgg; - mappings[1163] = ItemType.CamelSpawnEgg; - mappings[1164] = ItemType.DonkeySpawnEgg; - mappings[1165] = ItemType.HorseSpawnEgg; - mappings[1166] = ItemType.MuleSpawnEgg; - mappings[1167] = ItemType.CatSpawnEgg; - mappings[1168] = ItemType.ParrotSpawnEgg; - mappings[1169] = ItemType.WolfSpawnEgg; - mappings[1170] = ItemType.ArmadilloSpawnEgg; - mappings[1171] = ItemType.BatSpawnEgg; - mappings[1172] = ItemType.BeeSpawnEgg; - mappings[1173] = ItemType.FoxSpawnEgg; - mappings[1174] = ItemType.GoatSpawnEgg; - mappings[1175] = ItemType.LlamaSpawnEgg; - mappings[1176] = ItemType.OcelotSpawnEgg; - mappings[1177] = ItemType.PandaSpawnEgg; - mappings[1178] = ItemType.PolarBearSpawnEgg; - mappings[1179] = ItemType.RabbitSpawnEgg; - mappings[1180] = ItemType.AxolotlSpawnEgg; - mappings[1181] = ItemType.CodSpawnEgg; - mappings[1182] = ItemType.DolphinSpawnEgg; - mappings[1183] = ItemType.FrogSpawnEgg; - mappings[1184] = ItemType.GlowSquidSpawnEgg; - mappings[1185] = ItemType.NautilusSpawnEgg; - mappings[1186] = ItemType.PufferfishSpawnEgg; - mappings[1187] = ItemType.SalmonSpawnEgg; - mappings[1188] = ItemType.SquidSpawnEgg; - mappings[1189] = ItemType.TadpoleSpawnEgg; - mappings[1190] = ItemType.TropicalFishSpawnEgg; - mappings[1191] = ItemType.TurtleSpawnEgg; - mappings[1192] = ItemType.AllaySpawnEgg; - mappings[1193] = ItemType.MooshroomSpawnEgg; - mappings[1194] = ItemType.SnifferSpawnEgg; - mappings[1195] = ItemType.SulfurCubeSpawnEgg; - mappings[1196] = ItemType.CopperGolemSpawnEgg; - mappings[1197] = ItemType.IronGolemSpawnEgg; - mappings[1198] = ItemType.SnowGolemSpawnEgg; - mappings[1199] = ItemType.TraderLlamaSpawnEgg; - mappings[1200] = ItemType.VillagerSpawnEgg; - mappings[1201] = ItemType.WanderingTraderSpawnEgg; - mappings[1202] = ItemType.BoggedSpawnEgg; - mappings[1203] = ItemType.CamelHuskSpawnEgg; - mappings[1204] = ItemType.DrownedSpawnEgg; - mappings[1205] = ItemType.HuskSpawnEgg; - mappings[1206] = ItemType.ParchedSpawnEgg; - mappings[1207] = ItemType.SkeletonSpawnEgg; - mappings[1208] = ItemType.SkeletonHorseSpawnEgg; - mappings[1209] = ItemType.StraySpawnEgg; - mappings[1210] = ItemType.WitherSpawnEgg; - mappings[1211] = ItemType.WitherSkeletonSpawnEgg; - mappings[1212] = ItemType.ZombieSpawnEgg; - mappings[1213] = ItemType.ZombieHorseSpawnEgg; - mappings[1214] = ItemType.ZombieNautilusSpawnEgg; - mappings[1215] = ItemType.ZombieVillagerSpawnEgg; - mappings[1216] = ItemType.CaveSpiderSpawnEgg; - mappings[1217] = ItemType.SpiderSpawnEgg; - mappings[1218] = ItemType.BreezeSpawnEgg; - mappings[1219] = ItemType.CreakingSpawnEgg; - mappings[1220] = ItemType.CreeperSpawnEgg; - mappings[1221] = ItemType.ElderGuardianSpawnEgg; - mappings[1222] = ItemType.GuardianSpawnEgg; - mappings[1223] = ItemType.PhantomSpawnEgg; - mappings[1224] = ItemType.SilverfishSpawnEgg; - mappings[1225] = ItemType.SlimeSpawnEgg; - mappings[1226] = ItemType.WardenSpawnEgg; - mappings[1227] = ItemType.WitchSpawnEgg; - mappings[1228] = ItemType.EvokerSpawnEgg; - mappings[1229] = ItemType.PillagerSpawnEgg; - mappings[1230] = ItemType.RavagerSpawnEgg; - mappings[1231] = ItemType.VindicatorSpawnEgg; - mappings[1232] = ItemType.VexSpawnEgg; - mappings[1233] = ItemType.BlazeSpawnEgg; - mappings[1234] = ItemType.GhastSpawnEgg; - mappings[1235] = ItemType.HappyGhastSpawnEgg; - mappings[1236] = ItemType.HoglinSpawnEgg; - mappings[1237] = ItemType.MagmaCubeSpawnEgg; - mappings[1238] = ItemType.PiglinSpawnEgg; - mappings[1239] = ItemType.PiglinBruteSpawnEgg; - mappings[1240] = ItemType.StriderSpawnEgg; - mappings[1241] = ItemType.ZoglinSpawnEgg; - mappings[1242] = ItemType.ZombifiedPiglinSpawnEgg; - mappings[1243] = ItemType.EnderDragonSpawnEgg; - mappings[1244] = ItemType.EndermanSpawnEgg; - mappings[1245] = ItemType.EndermiteSpawnEgg; - mappings[1246] = ItemType.ShulkerSpawnEgg; - mappings[1247] = ItemType.ExperienceBottle; - mappings[1248] = ItemType.FireCharge; - mappings[1249] = ItemType.WindCharge; - mappings[1250] = ItemType.WritableBook; - mappings[1251] = ItemType.WrittenBook; - mappings[1252] = ItemType.BreezeRod; - mappings[1253] = ItemType.Mace; - mappings[1254] = ItemType.ItemFrame; - mappings[1255] = ItemType.GlowItemFrame; - mappings[1256] = ItemType.FlowerPot; - mappings[1257] = ItemType.Carrot; - mappings[1258] = ItemType.Potato; - mappings[1259] = ItemType.BakedPotato; - mappings[1260] = ItemType.PoisonousPotato; - mappings[1261] = ItemType.Map; - mappings[1262] = ItemType.GoldenCarrot; - mappings[1263] = ItemType.SkeletonSkull; - mappings[1264] = ItemType.WitherSkeletonSkull; - mappings[1265] = ItemType.PlayerHead; - mappings[1266] = ItemType.ZombieHead; - mappings[1267] = ItemType.CreeperHead; - mappings[1268] = ItemType.DragonHead; - mappings[1269] = ItemType.PiglinHead; - mappings[1270] = ItemType.NetherStar; - mappings[1271] = ItemType.PumpkinPie; - mappings[1272] = ItemType.FireworkRocket; - mappings[1273] = ItemType.FireworkStar; - mappings[1274] = ItemType.EnchantedBook; - mappings[1275] = ItemType.NetherBrick; - mappings[1276] = ItemType.ResinBrick; - mappings[1277] = ItemType.PrismarineShard; - mappings[1278] = ItemType.PrismarineCrystals; - mappings[1279] = ItemType.Rabbit; - mappings[1280] = ItemType.CookedRabbit; - mappings[1281] = ItemType.RabbitStew; - mappings[1282] = ItemType.RabbitFoot; - mappings[1283] = ItemType.RabbitHide; - mappings[1284] = ItemType.ArmorStand; - mappings[1285] = ItemType.CopperHorseArmor; - mappings[1286] = ItemType.IronHorseArmor; - mappings[1287] = ItemType.GoldenHorseArmor; - mappings[1288] = ItemType.DiamondHorseArmor; - mappings[1289] = ItemType.NetheriteHorseArmor; - mappings[1290] = ItemType.LeatherHorseArmor; - mappings[1291] = ItemType.Lead; - mappings[1292] = ItemType.NameTag; - mappings[1293] = ItemType.CommandBlockMinecart; - mappings[1294] = ItemType.Mutton; - mappings[1295] = ItemType.CookedMutton; - mappings[1296] = ItemType.WhiteBanner; - mappings[1297] = ItemType.OrangeBanner; - mappings[1298] = ItemType.MagentaBanner; - mappings[1299] = ItemType.LightBlueBanner; - mappings[1300] = ItemType.YellowBanner; - mappings[1301] = ItemType.LimeBanner; - mappings[1302] = ItemType.PinkBanner; - mappings[1303] = ItemType.GrayBanner; - mappings[1304] = ItemType.LightGrayBanner; - mappings[1305] = ItemType.CyanBanner; - mappings[1306] = ItemType.PurpleBanner; - mappings[1307] = ItemType.BlueBanner; - mappings[1308] = ItemType.BrownBanner; - mappings[1309] = ItemType.GreenBanner; - mappings[1310] = ItemType.RedBanner; - mappings[1311] = ItemType.BlackBanner; - mappings[1312] = ItemType.EndCrystal; - mappings[1313] = ItemType.ChorusFruit; - mappings[1314] = ItemType.PoppedChorusFruit; - mappings[1315] = ItemType.TorchflowerSeeds; - mappings[1316] = ItemType.PitcherPod; - mappings[1317] = ItemType.Beetroot; - mappings[1318] = ItemType.BeetrootSeeds; - mappings[1319] = ItemType.BeetrootSoup; - mappings[1320] = ItemType.DragonBreath; - mappings[1321] = ItemType.SplashPotion; - mappings[1322] = ItemType.SpectralArrow; - mappings[1323] = ItemType.TippedArrow; - mappings[1324] = ItemType.LingeringPotion; - mappings[1325] = ItemType.Shield; - mappings[1326] = ItemType.WoodenSpear; - mappings[1327] = ItemType.StoneSpear; - mappings[1328] = ItemType.CopperSpear; - mappings[1329] = ItemType.IronSpear; - mappings[1330] = ItemType.GoldenSpear; - mappings[1331] = ItemType.DiamondSpear; - mappings[1332] = ItemType.NetheriteSpear; - mappings[1333] = ItemType.TotemOfUndying; - mappings[1334] = ItemType.ShulkerShell; - mappings[1335] = ItemType.IronNugget; - mappings[1336] = ItemType.CopperNugget; - mappings[1337] = ItemType.KnowledgeBook; - mappings[1338] = ItemType.DebugStick; - mappings[1339] = ItemType.MusicDisc13; - mappings[1340] = ItemType.MusicDiscCat; - mappings[1341] = ItemType.MusicDiscBlocks; - mappings[1342] = ItemType.MusicDiscBounce; - mappings[1343] = ItemType.MusicDiscChirp; - mappings[1344] = ItemType.MusicDiscCreator; - mappings[1345] = ItemType.MusicDiscCreatorMusicBox; - mappings[1346] = ItemType.MusicDiscFar; - mappings[1347] = ItemType.MusicDiscLavaChicken; - mappings[1348] = ItemType.MusicDiscMall; - mappings[1349] = ItemType.MusicDiscMellohi; - mappings[1350] = ItemType.MusicDiscStal; - mappings[1351] = ItemType.MusicDiscStrad; - mappings[1352] = ItemType.MusicDiscWard; - mappings[1353] = ItemType.MusicDisc11; - mappings[1354] = ItemType.MusicDiscWait; - mappings[1355] = ItemType.MusicDiscOtherside; - mappings[1356] = ItemType.MusicDiscRelic; - mappings[1357] = ItemType.MusicDisc5; - mappings[1358] = ItemType.MusicDiscPigstep; - mappings[1359] = ItemType.MusicDiscPrecipice; - mappings[1360] = ItemType.MusicDiscTears; - mappings[1361] = ItemType.DiscFragment5; - mappings[1362] = ItemType.Trident; - mappings[1363] = ItemType.NautilusShell; - mappings[1364] = ItemType.IronNautilusArmor; - mappings[1365] = ItemType.GoldenNautilusArmor; - mappings[1366] = ItemType.DiamondNautilusArmor; - mappings[1367] = ItemType.NetheriteNautilusArmor; - mappings[1368] = ItemType.CopperNautilusArmor; - mappings[1369] = ItemType.HeartOfTheSea; - mappings[1370] = ItemType.Crossbow; - mappings[1371] = ItemType.SuspiciousStew; - mappings[1372] = ItemType.Loom; - mappings[1373] = ItemType.FlowerBannerPattern; - mappings[1374] = ItemType.CreeperBannerPattern; - mappings[1375] = ItemType.SkullBannerPattern; - mappings[1376] = ItemType.MojangBannerPattern; - mappings[1377] = ItemType.GlobeBannerPattern; - mappings[1378] = ItemType.PiglinBannerPattern; - mappings[1379] = ItemType.FlowBannerPattern; - mappings[1380] = ItemType.GusterBannerPattern; - mappings[1381] = ItemType.FieldMasonedBannerPattern; - mappings[1382] = ItemType.BordureIndentedBannerPattern; - mappings[1383] = ItemType.GoatHorn; - mappings[1384] = ItemType.Composter; - mappings[1385] = ItemType.Barrel; - mappings[1386] = ItemType.Smoker; - mappings[1387] = ItemType.BlastFurnace; - mappings[1388] = ItemType.CartographyTable; - mappings[1389] = ItemType.FletchingTable; - mappings[1390] = ItemType.Grindstone; - mappings[1391] = ItemType.SmithingTable; - mappings[1392] = ItemType.Stonecutter; - mappings[1393] = ItemType.Bell; - mappings[1394] = ItemType.Lantern; - mappings[1395] = ItemType.SoulLantern; - mappings[1396] = ItemType.CopperLantern; - mappings[1397] = ItemType.ExposedCopperLantern; - mappings[1398] = ItemType.WeatheredCopperLantern; - mappings[1399] = ItemType.OxidizedCopperLantern; - mappings[1400] = ItemType.WaxedCopperLantern; - mappings[1401] = ItemType.WaxedExposedCopperLantern; - mappings[1402] = ItemType.WaxedWeatheredCopperLantern; - mappings[1403] = ItemType.WaxedOxidizedCopperLantern; - mappings[1404] = ItemType.SweetBerries; - mappings[1405] = ItemType.GlowBerries; - mappings[1406] = ItemType.Campfire; - mappings[1407] = ItemType.SoulCampfire; - mappings[1408] = ItemType.Shroomlight; - mappings[1409] = ItemType.Honeycomb; - mappings[1410] = ItemType.BeeNest; - mappings[1411] = ItemType.Beehive; - mappings[1412] = ItemType.HoneyBottle; - mappings[1413] = ItemType.HoneycombBlock; - mappings[1414] = ItemType.Lodestone; - mappings[1415] = ItemType.CryingObsidian; - mappings[1416] = ItemType.Blackstone; - mappings[1417] = ItemType.BlackstoneSlab; - mappings[1418] = ItemType.BlackstoneStairs; - mappings[1419] = ItemType.GildedBlackstone; - mappings[1420] = ItemType.PolishedBlackstone; - mappings[1421] = ItemType.PolishedBlackstoneSlab; - mappings[1422] = ItemType.PolishedBlackstoneStairs; - mappings[1423] = ItemType.ChiseledPolishedBlackstone; - mappings[1424] = ItemType.PolishedBlackstoneBricks; - mappings[1425] = ItemType.PolishedBlackstoneBrickSlab; - mappings[1426] = ItemType.PolishedBlackstoneBrickStairs; - mappings[1427] = ItemType.CrackedPolishedBlackstoneBricks; - mappings[1428] = ItemType.RespawnAnchor; - mappings[1429] = ItemType.Candle; - mappings[1430] = ItemType.WhiteCandle; - mappings[1431] = ItemType.OrangeCandle; - mappings[1432] = ItemType.MagentaCandle; - mappings[1433] = ItemType.LightBlueCandle; - mappings[1434] = ItemType.YellowCandle; - mappings[1435] = ItemType.LimeCandle; - mappings[1436] = ItemType.PinkCandle; - mappings[1437] = ItemType.GrayCandle; - mappings[1438] = ItemType.LightGrayCandle; - mappings[1439] = ItemType.CyanCandle; - mappings[1440] = ItemType.PurpleCandle; - mappings[1441] = ItemType.BlueCandle; - mappings[1442] = ItemType.BrownCandle; - mappings[1443] = ItemType.GreenCandle; - mappings[1444] = ItemType.RedCandle; - mappings[1445] = ItemType.BlackCandle; - mappings[1446] = ItemType.SmallAmethystBud; - mappings[1447] = ItemType.MediumAmethystBud; - mappings[1448] = ItemType.LargeAmethystBud; - mappings[1449] = ItemType.AmethystCluster; - mappings[1450] = ItemType.PointedDripstone; - mappings[1451] = ItemType.SulfurSpike; - mappings[1452] = ItemType.OchreFroglight; - mappings[1453] = ItemType.VerdantFroglight; - mappings[1454] = ItemType.PearlescentFroglight; - mappings[1455] = ItemType.Frogspawn; - mappings[1456] = ItemType.EchoShard; - mappings[1457] = ItemType.Brush; - mappings[1458] = ItemType.NetheriteUpgradeSmithingTemplate; - mappings[1459] = ItemType.SentryArmorTrimSmithingTemplate; - mappings[1460] = ItemType.DuneArmorTrimSmithingTemplate; - mappings[1461] = ItemType.CoastArmorTrimSmithingTemplate; - mappings[1462] = ItemType.WildArmorTrimSmithingTemplate; - mappings[1463] = ItemType.WardArmorTrimSmithingTemplate; - mappings[1464] = ItemType.EyeArmorTrimSmithingTemplate; - mappings[1465] = ItemType.VexArmorTrimSmithingTemplate; - mappings[1466] = ItemType.TideArmorTrimSmithingTemplate; - mappings[1467] = ItemType.SnoutArmorTrimSmithingTemplate; - mappings[1468] = ItemType.RibArmorTrimSmithingTemplate; - mappings[1469] = ItemType.SpireArmorTrimSmithingTemplate; - mappings[1470] = ItemType.WayfinderArmorTrimSmithingTemplate; - mappings[1471] = ItemType.ShaperArmorTrimSmithingTemplate; - mappings[1472] = ItemType.SilenceArmorTrimSmithingTemplate; - mappings[1473] = ItemType.RaiserArmorTrimSmithingTemplate; - mappings[1474] = ItemType.HostArmorTrimSmithingTemplate; - mappings[1475] = ItemType.FlowArmorTrimSmithingTemplate; - mappings[1476] = ItemType.BoltArmorTrimSmithingTemplate; - mappings[1477] = ItemType.AnglerPotterySherd; - mappings[1478] = ItemType.ArcherPotterySherd; - mappings[1479] = ItemType.ArmsUpPotterySherd; - mappings[1480] = ItemType.BladePotterySherd; - mappings[1481] = ItemType.BrewerPotterySherd; - mappings[1482] = ItemType.BurnPotterySherd; - mappings[1483] = ItemType.DangerPotterySherd; - mappings[1484] = ItemType.ExplorerPotterySherd; - mappings[1485] = ItemType.FlowPotterySherd; - mappings[1486] = ItemType.FriendPotterySherd; - mappings[1487] = ItemType.GusterPotterySherd; - mappings[1488] = ItemType.HeartPotterySherd; - mappings[1489] = ItemType.HeartbreakPotterySherd; - mappings[1490] = ItemType.HowlPotterySherd; - mappings[1491] = ItemType.MinerPotterySherd; - mappings[1492] = ItemType.MournerPotterySherd; - mappings[1493] = ItemType.PlentyPotterySherd; - mappings[1494] = ItemType.PrizePotterySherd; - mappings[1495] = ItemType.ScrapePotterySherd; - mappings[1496] = ItemType.SheafPotterySherd; - mappings[1497] = ItemType.ShelterPotterySherd; - mappings[1498] = ItemType.SkullPotterySherd; - mappings[1499] = ItemType.SnortPotterySherd; - mappings[1500] = ItemType.CopperGrate; - mappings[1501] = ItemType.ExposedCopperGrate; - mappings[1502] = ItemType.WeatheredCopperGrate; - mappings[1503] = ItemType.OxidizedCopperGrate; - mappings[1504] = ItemType.WaxedCopperGrate; - mappings[1505] = ItemType.WaxedExposedCopperGrate; - mappings[1506] = ItemType.WaxedWeatheredCopperGrate; - mappings[1507] = ItemType.WaxedOxidizedCopperGrate; - mappings[1508] = ItemType.CopperBulb; - mappings[1509] = ItemType.ExposedCopperBulb; - mappings[1510] = ItemType.WeatheredCopperBulb; - mappings[1511] = ItemType.OxidizedCopperBulb; - mappings[1512] = ItemType.WaxedCopperBulb; - mappings[1513] = ItemType.WaxedExposedCopperBulb; - mappings[1514] = ItemType.WaxedWeatheredCopperBulb; - mappings[1515] = ItemType.WaxedOxidizedCopperBulb; - mappings[1516] = ItemType.CopperChest; - mappings[1517] = ItemType.ExposedCopperChest; - mappings[1518] = ItemType.WeatheredCopperChest; - mappings[1519] = ItemType.OxidizedCopperChest; - mappings[1520] = ItemType.WaxedCopperChest; - mappings[1521] = ItemType.WaxedExposedCopperChest; - mappings[1522] = ItemType.WaxedWeatheredCopperChest; - mappings[1523] = ItemType.WaxedOxidizedCopperChest; - mappings[1524] = ItemType.CopperGolemStatue; - mappings[1525] = ItemType.ExposedCopperGolemStatue; - mappings[1526] = ItemType.WeatheredCopperGolemStatue; - mappings[1527] = ItemType.OxidizedCopperGolemStatue; - mappings[1528] = ItemType.WaxedCopperGolemStatue; - mappings[1529] = ItemType.WaxedExposedCopperGolemStatue; - mappings[1530] = ItemType.WaxedWeatheredCopperGolemStatue; - mappings[1531] = ItemType.WaxedOxidizedCopperGolemStatue; - mappings[1532] = ItemType.TrialSpawner; - mappings[1533] = ItemType.TrialKey; - mappings[1534] = ItemType.OminousTrialKey; - mappings[1535] = ItemType.Vault; - mappings[1536] = ItemType.OminousBottle; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Inventory/ItemPalettes/ItemPaletteGenerator.cs b/MinecraftClient/Inventory/ItemPalettes/ItemPaletteGenerator.cs deleted file mode 100644 index eed9b84435..0000000000 --- a/MinecraftClient/Inventory/ItemPalettes/ItemPaletteGenerator.cs +++ /dev/null @@ -1,24 +0,0 @@ -using MinecraftClient.Protocol; - -namespace MinecraftClient.Inventory.ItemPalettes -{ - public static class ItemPaletteGenerator - { - /// - /// Place below line to Program.cs - /// Inventory.ItemPalettes.ItemPaletteGenerator.GenerateItemType(@"your\path\to\registries.json"); - /// See https://wiki.vg/Data_Generators for getting those .json - /// - /// - public static void GenerateItemType(string registriesJsonFile) - { - DataTypeGenerator.GenerateEnumWithPalette( - registriesJsonFile, - "minecraft:item", - "ItemType", - "MinecraftClient.Inventory", - "ItemPalette", - "MinecraftClient.Inventory.ItemPalettes"); - } - } -} diff --git a/MinecraftClient/Inventory/ItemRarity.cs b/MinecraftClient/Inventory/ItemRarity.cs deleted file mode 100644 index a6cc03308e..0000000000 --- a/MinecraftClient/Inventory/ItemRarity.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace MinecraftClient.Inventory; - -public enum ItemRarity : int -{ - Common = 0, - Uncommon, - Rare, - Epic -} \ No newline at end of file diff --git a/MinecraftClient/Inventory/ItemType.cs b/MinecraftClient/Inventory/ItemType.cs deleted file mode 100644 index a6586b6715..0000000000 --- a/MinecraftClient/Inventory/ItemType.cs +++ /dev/null @@ -1,1558 +0,0 @@ -namespace MinecraftClient.Inventory -{ - /// - /// Generated using the --generator flag on the client - /// Typical steps to handle new item IDs for newer Minecraft versions: - /// 1. Generate registries.json using data reporting on Vanilla Minecraft (https://wiki.vg/Data_Generators) or download it from: https://github.com/PixiGeko/Minecraft-generated-data - /// 2. Generate temporary ItemTypeXXX.cs and ItemPaletteXXX.cs using the --generator flag on the client - /// 3. Perform a diff with existing versions, add missing entries in ItemType.cs and ItemTypeExtensions.cs - /// 4. If existing entity IDs were not randomized by Mojang, simply add missing entries to the latest existing ItemPaletteXXX.cs - /// 5. If existing entity IDs were randomized, add a new palette as ItemPaletteXXX.cs into the codebase - /// - public enum ItemType - { - Unknown = -2, // Unsupported item type (Forge mod custom item...) - Null = -1, // Unspecified item type (Used in the network protocol) - - AcaciaBoat, - AcaciaButton, - AcaciaChestBoat, - AcaciaDoor, - AcaciaFence, - AcaciaFenceGate, - AcaciaHangingSign, - AcaciaLeaves, - AcaciaLog, - AcaciaPlanks, - AcaciaPressurePlate, - AcaciaSapling, - AcaciaShelf, - AcaciaSign, - AcaciaSlab, - AcaciaStairs, - AcaciaTrapdoor, - AcaciaWood, - ActivatorRail, - Air, - AllaySpawnEgg, - Allium, - AmethystBlock, - AmethystCluster, - AmethystShard, - AncientDebris, - Andesite, - AndesiteSlab, - AndesiteStairs, - AndesiteWall, - AnglerPotterySherd, - Anvil, - Apple, - ArcherPotterySherd, - ArmadilloScute, - ArmadilloSpawnEgg, - ArmorStand, - ArmsUpPotterySherd, - Arrow, - AxolotlBucket, - AxolotlSpawnEgg, - Azalea, - AzaleaLeaves, - AzureBluet, - BakedPotato, - Bamboo, - BambooBlock, - BambooButton, - BambooChestRaft, - BambooDoor, - BambooFence, - BambooFenceGate, - BambooHangingSign, - BambooMosaic, - BambooMosaicSlab, - BambooMosaicStairs, - BambooPlanks, - BambooPressurePlate, - BambooRaft, - BambooShelf, - BambooSign, - BambooSlab, - BambooStairs, - BambooTrapdoor, - Barrel, - Barrier, - Basalt, - BatSpawnEgg, - Beacon, - Bedrock, - BeeNest, - BeeSpawnEgg, - Beef, - Beehive, - Beetroot, - BeetrootSeeds, - BeetrootSoup, - Bell, - BigDripleaf, - BirchBoat, - BirchButton, - BirchChestBoat, - BirchDoor, - BirchFence, - BirchFenceGate, - BirchHangingSign, - BirchLeaves, - BirchLog, - BirchPlanks, - BirchPressurePlate, - BirchSapling, - BirchShelf, - BirchSign, - BirchSlab, - BirchStairs, - BirchTrapdoor, - BirchWood, - BlackBanner, - BlackBed, - BlackBundle, - BlackCandle, - BlackCarpet, - BlackConcrete, - BlackConcretePowder, - BlackDye, - BlackGlazedTerracotta, - BlackHarness, - BlackShulkerBox, - BlackStainedGlass, - BlackStainedGlassPane, - BlackTerracotta, - BlackWool, - Blackstone, - BlackstoneSlab, - BlackstoneStairs, - BlackstoneWall, - BladePotterySherd, - BlastFurnace, - BlazePowder, - BlazeRod, - BlazeSpawnEgg, - BlueBanner, - BlueBed, - BlueBundle, - BlueCandle, - BlueCarpet, - BlueConcrete, - BlueConcretePowder, - BlueDye, - BlueEgg, - BlueGlazedTerracotta, - BlueHarness, - BlueIce, - BlueOrchid, - BlueShulkerBox, - BlueStainedGlass, - BlueStainedGlassPane, - BlueTerracotta, - BlueWool, - BoggedSpawnEgg, - BoltArmorTrimSmithingTemplate, - Bone, - BoneBlock, - BoneMeal, - Book, - Bookshelf, - BordureIndentedBannerPattern, - Bow, - Bowl, - BrainCoral, - BrainCoralBlock, - BrainCoralFan, - Bread, - BreezeRod, - BreezeSpawnEgg, - BrewerPotterySherd, - BrewingStand, - Brick, - BrickSlab, - BrickStairs, - BrickWall, - Bricks, - BrownBanner, - BrownBed, - BrownBundle, - BrownCandle, - BrownCarpet, - BrownConcrete, - BrownConcretePowder, - BrownDye, - BrownEgg, - BrownGlazedTerracotta, - BrownHarness, - BrownMushroom, - BrownMushroomBlock, - BrownShulkerBox, - BrownStainedGlass, - BrownStainedGlassPane, - BrownTerracotta, - BrownWool, - Brush, - BubbleCoral, - BubbleCoralBlock, - BubbleCoralFan, - Bucket, - BuddingAmethyst, - Bundle, - BurnPotterySherd, - Bush, - Cactus, - CactusFlower, - Cake, - Calcite, - CalibratedSculkSensor, - CamelHuskSpawnEgg, - CamelSpawnEgg, - Campfire, - Candle, - Carrot, - CarrotOnAStick, - CartographyTable, - CarvedPumpkin, - CatSpawnEgg, - Cauldron, - CaveSpiderSpawnEgg, - Chain, - ChainCommandBlock, - ChainmailBoots, - ChainmailChestplate, - ChainmailHelmet, - ChainmailLeggings, - Charcoal, - CherryBoat, - CherryButton, - CherryChestBoat, - CherryDoor, - CherryFence, - CherryFenceGate, - CherryHangingSign, - CherryLeaves, - CherryLog, - CherryPlanks, - CherryPressurePlate, - CherrySapling, - CherryShelf, - CherrySign, - CherrySlab, - CherryStairs, - CherryTrapdoor, - CherryWood, - Chest, - ChestMinecart, - Chicken, - ChickenSpawnEgg, - ChippedAnvil, - ChiseledBookshelf, - ChiseledCinnabar, - ChiseledCopper, - ChiseledDeepslate, - ChiseledNetherBricks, - ChiseledPolishedBlackstone, - ChiseledQuartzBlock, - ChiseledRedSandstone, - ChiseledResinBricks, - ChiseledSandstone, - ChiseledStoneBricks, - ChiseledSulfur, - ChiseledTuff, - ChiseledTuffBricks, - ChorusFlower, - ChorusFruit, - ChorusPlant, - Cinnabar, - CinnabarBrickSlab, - CinnabarBrickStairs, - CinnabarBrickWall, - CinnabarBricks, - CinnabarSlab, - CinnabarStairs, - CinnabarWall, - Clay, - ClayBall, - Clock, - ClosedEyeblossom, - Coal, - CoalBlock, - CoalOre, - CoarseDirt, - CoastArmorTrimSmithingTemplate, - CobbledDeepslate, - CobbledDeepslateSlab, - CobbledDeepslateStairs, - CobbledDeepslateWall, - Cobblestone, - CobblestoneSlab, - CobblestoneStairs, - CobblestoneWall, - Cobweb, - CocoaBeans, - Cod, - CodBucket, - CodSpawnEgg, - CommandBlock, - CommandBlockMinecart, - Comparator, - Compass, - Composter, - Conduit, - CookedBeef, - CookedChicken, - CookedCod, - CookedMutton, - CookedPorkchop, - CookedRabbit, - CookedSalmon, - Cookie, - CopperAxe, - CopperBars, - CopperBlock, - CopperBoots, - CopperBulb, - CopperChain, - CopperChest, - CopperChestplate, - CopperDoor, - CopperGolemSpawnEgg, - CopperGolemStatue, - CopperGrate, - CopperHelmet, - CopperHoe, - CopperHorseArmor, - CopperIngot, - CopperLantern, - CopperLeggings, - CopperNugget, - CopperNautilusArmor, - CopperOre, - CopperPickaxe, - CopperShovel, - CopperSpear, - CopperSword, - CopperTorch, - CopperTrapdoor, - Cornflower, - CowSpawnEgg, - CrackedDeepslateBricks, - CrackedDeepslateTiles, - CrackedNetherBricks, - CrackedPolishedBlackstoneBricks, - CrackedStoneBricks, - Crafter, - CraftingTable, - CreakingHeart, - CreakingSpawnEgg, - CreeperBannerPattern, - CreeperHead, - CreeperSpawnEgg, - CrimsonButton, - CrimsonDoor, - CrimsonFence, - CrimsonFenceGate, - CrimsonFungus, - CrimsonHangingSign, - CrimsonHyphae, - CrimsonNylium, - CrimsonPlanks, - CrimsonPressurePlate, - CrimsonRoots, - CrimsonShelf, - CrimsonSign, - CrimsonSlab, - CrimsonStairs, - CrimsonStem, - CrimsonTrapdoor, - Crossbow, - CryingObsidian, - CutCopper, - CutCopperSlab, - CutCopperStairs, - CutRedSandstone, - CutRedSandstoneSlab, - CutSandstone, - CutSandstoneSlab, - CyanBanner, - CyanBed, - CyanBundle, - CyanCandle, - CyanCarpet, - CyanConcrete, - CyanConcretePowder, - CyanDye, - CyanGlazedTerracotta, - CyanHarness, - CyanShulkerBox, - CyanStainedGlass, - CyanStainedGlassPane, - CyanTerracotta, - CyanWool, - DamagedAnvil, - Dandelion, - DangerPotterySherd, - DarkOakBoat, - DarkOakButton, - DarkOakChestBoat, - DarkOakDoor, - DarkOakFence, - DarkOakFenceGate, - DarkOakHangingSign, - DarkOakLeaves, - DarkOakLog, - DarkOakPlanks, - DarkOakPressurePlate, - DarkOakSapling, - DarkOakShelf, - DarkOakSign, - DarkOakSlab, - DarkOakStairs, - DarkOakTrapdoor, - DarkOakWood, - DarkPrismarine, - DarkPrismarineSlab, - DarkPrismarineStairs, - DaylightDetector, - DeadBrainCoral, - DeadBrainCoralBlock, - DeadBrainCoralFan, - DeadBubbleCoral, - DeadBubbleCoralBlock, - DeadBubbleCoralFan, - DeadBush, - DeadFireCoral, - DeadFireCoralBlock, - DeadFireCoralFan, - DeadHornCoral, - DeadHornCoralBlock, - DeadHornCoralFan, - DeadTubeCoral, - DeadTubeCoralBlock, - DeadTubeCoralFan, - DebugStick, - DecoratedPot, - Deepslate, - DeepslateBrickSlab, - DeepslateBrickStairs, - DeepslateBrickWall, - DeepslateBricks, - DeepslateCoalOre, - DeepslateCopperOre, - DeepslateDiamondOre, - DeepslateEmeraldOre, - DeepslateGoldOre, - DeepslateIronOre, - DeepslateLapisOre, - DeepslateRedstoneOre, - DeepslateTileSlab, - DeepslateTileStairs, - DeepslateTileWall, - DeepslateTiles, - DetectorRail, - Diamond, - DiamondAxe, - DiamondBlock, - DiamondBoots, - DiamondChestplate, - DiamondHelmet, - DiamondHoe, - DiamondHorseArmor, - DiamondLeggings, - DiamondNautilusArmor, - DiamondOre, - DiamondPickaxe, - DiamondSpear, - DiamondShovel, - DiamondSword, - Diorite, - DioriteSlab, - DioriteStairs, - DioriteWall, - Dirt, - DirtPath, - DiscFragment5, - Dispenser, - DolphinSpawnEgg, - DonkeySpawnEgg, - DragonBreath, - DragonEgg, - DragonHead, - DriedGhast, - DriedKelp, - DriedKelpBlock, - DripstoneBlock, - Dropper, - DrownedSpawnEgg, - DryShortGrass, - DryTallGrass, - DuneArmorTrimSmithingTemplate, - EchoShard, - Egg, - ElderGuardianSpawnEgg, - Elytra, - Emerald, - EmeraldBlock, - EmeraldOre, - EnchantedBook, - EnchantedGoldenApple, - EnchantingTable, - EndCrystal, - EndPortalFrame, - EndRod, - EndStone, - EndStoneBrickSlab, - EndStoneBrickStairs, - EndStoneBrickWall, - EndStoneBricks, - EnderChest, - EnderDragonSpawnEgg, - EnderEye, - EnderPearl, - EndermanSpawnEgg, - EndermiteSpawnEgg, - EvokerSpawnEgg, - ExperienceBottle, - ExplorerPotterySherd, - ExposedChiseledCopper, - ExposedCopper, - ExposedCopperBars, - ExposedCopperBulb, - ExposedCopperChain, - ExposedCopperChest, - ExposedCopperDoor, - ExposedCopperGolemStatue, - ExposedCopperGrate, - ExposedCopperLantern, - ExposedCopperTrapdoor, - ExposedCutCopper, - ExposedCutCopperSlab, - ExposedCutCopperStairs, - ExposedLightningRod, - EyeArmorTrimSmithingTemplate, - Farmland, - Feather, - FermentedSpiderEye, - Fern, - FieldMasonedBannerPattern, - FilledMap, - FireCharge, - FireCoral, - FireCoralBlock, - FireCoralFan, - FireflyBush, - FireworkRocket, - FireworkStar, - FishingRod, - FletchingTable, - Flint, - FlintAndSteel, - FlowArmorTrimSmithingTemplate, - FlowBannerPattern, - FlowPotterySherd, - FlowerBannerPattern, - FlowerPot, - FloweringAzalea, - FloweringAzaleaLeaves, - FoxSpawnEgg, - FriendPotterySherd, - FrogSpawnEgg, - Frogspawn, - Furnace, - FurnaceMinecart, - GhastSpawnEgg, - GhastTear, - GildedBlackstone, - Glass, - GlassBottle, - GlassPane, - GlisteringMelonSlice, - GlobeBannerPattern, - GlowBerries, - GlowInkSac, - GlowItemFrame, - GlowLichen, - GlowSquidSpawnEgg, - Glowstone, - GlowstoneDust, - GoatHorn, - GoatSpawnEgg, - GoldBlock, - GoldIngot, - GoldNugget, - GoldOre, - GoldenApple, - GoldenAxe, - GoldenBoots, - GoldenCarrot, - GoldenDandelion, - GoldenChestplate, - GoldenHelmet, - GoldenHoe, - GoldenHorseArmor, - GoldenLeggings, - GoldenNautilusArmor, - GoldenPickaxe, - GoldenShovel, - GoldenSpear, - GoldenSword, - Granite, - GraniteSlab, - GraniteStairs, - GraniteWall, - GrassBlock, - Gravel, - GrayBanner, - GrayBed, - GrayBundle, - GrayCandle, - GrayCarpet, - GrayConcrete, - GrayConcretePowder, - GrayDye, - GrayGlazedTerracotta, - GrayHarness, - GrayShulkerBox, - GrayStainedGlass, - GrayStainedGlassPane, - GrayTerracotta, - GrayWool, - GreenBanner, - GreenBed, - GreenBundle, - GreenCandle, - GreenCarpet, - GreenConcrete, - GreenConcretePowder, - GreenDye, - GreenGlazedTerracotta, - GreenHarness, - GreenShulkerBox, - GreenStainedGlass, - GreenStainedGlassPane, - GreenTerracotta, - GreenWool, - Grindstone, - GuardianSpawnEgg, - Gunpowder, - GusterBannerPattern, - GusterPotterySherd, - HangingRoots, - HappyGhastSpawnEgg, - HayBlock, - HeartOfTheSea, - HeartPotterySherd, - HeartbreakPotterySherd, - HeavyCore, - HeavyWeightedPressurePlate, - HoglinSpawnEgg, - HoneyBlock, - HoneyBottle, - Honeycomb, - HoneycombBlock, - Hopper, - HopperMinecart, - HornCoral, - HornCoralBlock, - HornCoralFan, - HorseSpawnEgg, - HostArmorTrimSmithingTemplate, - HowlPotterySherd, - HuskSpawnEgg, - Ice, - InfestedChiseledStoneBricks, - InfestedCobblestone, - InfestedCrackedStoneBricks, - InfestedDeepslate, - InfestedMossyStoneBricks, - InfestedStone, - InfestedStoneBricks, - InkSac, - IronAxe, - IronBars, - IronBlock, - IronBoots, - IronChain, - IronChestplate, - IronDoor, - IronGolemSpawnEgg, - IronHelmet, - IronHoe, - IronHorseArmor, - IronIngot, - IronLeggings, - IronNautilusArmor, - IronNugget, - IronOre, - IronPickaxe, - IronSpear, - IronShovel, - IronSword, - IronTrapdoor, - ItemFrame, - JackOLantern, - Jigsaw, - Jukebox, - JungleBoat, - JungleButton, - JungleChestBoat, - JungleDoor, - JungleFence, - JungleFenceGate, - JungleHangingSign, - JungleLeaves, - JungleLog, - JunglePlanks, - JunglePressurePlate, - JungleSapling, - JungleShelf, - JungleSign, - JungleSlab, - JungleStairs, - JungleTrapdoor, - JungleWood, - Kelp, - KnowledgeBook, - Ladder, - Lantern, - LapisBlock, - LapisLazuli, - LapisOre, - LargeAmethystBud, - LargeFern, - LavaBucket, - Lead, - LeafLitter, - Leather, - LeatherBoots, - LeatherChestplate, - LeatherHelmet, - LeatherHorseArmor, - LeatherLeggings, - Lectern, - Lever, - Light, - LightBlueBanner, - LightBlueBed, - LightBlueBundle, - LightBlueCandle, - LightBlueCarpet, - LightBlueConcrete, - LightBlueConcretePowder, - LightBlueDye, - LightBlueGlazedTerracotta, - LightBlueHarness, - LightBlueShulkerBox, - LightBlueStainedGlass, - LightBlueStainedGlassPane, - LightBlueTerracotta, - LightBlueWool, - LightGrayBanner, - LightGrayBed, - LightGrayBundle, - LightGrayCandle, - LightGrayCarpet, - LightGrayConcrete, - LightGrayConcretePowder, - LightGrayDye, - LightGrayGlazedTerracotta, - LightGrayHarness, - LightGrayShulkerBox, - LightGrayStainedGlass, - LightGrayStainedGlassPane, - LightGrayTerracotta, - LightGrayWool, - LightWeightedPressurePlate, - LightningRod, - Lilac, - LilyOfTheValley, - LilyPad, - LimeBanner, - LimeBed, - LimeBundle, - LimeCandle, - LimeCarpet, - LimeConcrete, - LimeConcretePowder, - LimeDye, - LimeGlazedTerracotta, - LimeHarness, - LimeShulkerBox, - LimeStainedGlass, - LimeStainedGlassPane, - LimeTerracotta, - LimeWool, - LingeringPotion, - LlamaSpawnEgg, - Lodestone, - Loom, - Mace, - MagentaBanner, - MagentaBed, - MagentaBundle, - MagentaCandle, - MagentaCarpet, - MagentaConcrete, - MagentaConcretePowder, - MagentaDye, - MagentaGlazedTerracotta, - MagentaHarness, - MagentaShulkerBox, - MagentaStainedGlass, - MagentaStainedGlassPane, - MagentaTerracotta, - MagentaWool, - MagmaBlock, - MagmaCream, - MagmaCubeSpawnEgg, - MangroveBoat, - MangroveButton, - MangroveChestBoat, - MangroveDoor, - MangroveFence, - MangroveFenceGate, - MangroveHangingSign, - MangroveLeaves, - MangroveLog, - MangrovePlanks, - MangrovePressurePlate, - MangrovePropagule, - MangroveRoots, - MangroveShelf, - MangroveSign, - MangroveSlab, - MangroveStairs, - MangroveTrapdoor, - MangroveWood, - Map, - MediumAmethystBud, - Melon, - MelonSeeds, - MelonSlice, - MilkBucket, - Minecart, - MinerPotterySherd, - MojangBannerPattern, - MooshroomSpawnEgg, - MossBlock, - MossCarpet, - MossyCobblestone, - MossyCobblestoneSlab, - MossyCobblestoneStairs, - MossyCobblestoneWall, - MossyStoneBrickSlab, - MossyStoneBrickStairs, - MossyStoneBrickWall, - MossyStoneBricks, - MournerPotterySherd, - Mud, - MudBrickSlab, - MudBrickStairs, - MudBrickWall, - MudBricks, - MuddyMangroveRoots, - MuleSpawnEgg, - MushroomStem, - MushroomStew, - MusicDisc11, - MusicDisc13, - MusicDisc5, - MusicDiscBlocks, - MusicDiscBounce, - MusicDiscCat, - MusicDiscChirp, - MusicDiscCreator, - MusicDiscCreatorMusicBox, - MusicDiscFar, - MusicDiscLavaChicken, - MusicDiscMall, - MusicDiscMellohi, - MusicDiscOtherside, - MusicDiscPigstep, - MusicDiscPrecipice, - MusicDiscRelic, - MusicDiscStal, - MusicDiscStrad, - MusicDiscTears, - MusicDiscWait, - MusicDiscWard, - Mutton, - Mycelium, - NameTag, - NautilusShell, - NautilusSpawnEgg, - NetherBrick, - NetherBrickFence, - NetherBrickSlab, - NetherBrickStairs, - NetherBrickWall, - NetherBricks, - NetherGoldOre, - NetherQuartzOre, - NetherSprouts, - NetherStar, - NetherWart, - NetherWartBlock, - NetheriteAxe, - NetheriteBlock, - NetheriteBoots, - NetheriteChestplate, - NetheriteHelmet, - NetheriteHoe, - NetheriteHorseArmor, - NetheriteIngot, - NetheriteLeggings, - NetheriteNautilusArmor, - NetheritePickaxe, - NetheriteScrap, - NetheriteShovel, - NetheriteSpear, - NetheriteSword, - NetheriteUpgradeSmithingTemplate, - Netherrack, - NoteBlock, - OakBoat, - OakButton, - OakChestBoat, - OakDoor, - OakFence, - OakFenceGate, - OakHangingSign, - OakLeaves, - OakLog, - OakPlanks, - OakPressurePlate, - OakSapling, - OakShelf, - OakSign, - OakSlab, - OakStairs, - OakTrapdoor, - OakWood, - Observer, - Obsidian, - OcelotSpawnEgg, - OchreFroglight, - OminousBottle, - OminousTrialKey, - OpenEyeblossom, - OrangeBanner, - OrangeBed, - OrangeBundle, - OrangeCandle, - OrangeCarpet, - OrangeConcrete, - OrangeConcretePowder, - OrangeDye, - OrangeGlazedTerracotta, - OrangeHarness, - OrangeShulkerBox, - OrangeStainedGlass, - OrangeStainedGlassPane, - OrangeTerracotta, - OrangeTulip, - OrangeWool, - OxeyeDaisy, - OxidizedChiseledCopper, - OxidizedCopper, - OxidizedCopperBars, - OxidizedCopperBulb, - OxidizedCopperChain, - OxidizedCopperChest, - OxidizedCopperDoor, - OxidizedCopperGolemStatue, - OxidizedCopperGrate, - OxidizedCopperLantern, - OxidizedCopperTrapdoor, - OxidizedCutCopper, - OxidizedCutCopperSlab, - OxidizedCutCopperStairs, - OxidizedLightningRod, - PackedIce, - PackedMud, - Painting, - PaleHangingMoss, - PaleMossBlock, - PaleMossCarpet, - PaleOakBoat, - PaleOakButton, - PaleOakChestBoat, - PaleOakDoor, - PaleOakFence, - PaleOakFenceGate, - PaleOakHangingSign, - PaleOakLeaves, - PaleOakLog, - PaleOakPlanks, - PaleOakPressurePlate, - PaleOakSapling, - PaleOakShelf, - PaleOakSign, - PaleOakSlab, - PaleOakStairs, - PaleOakTrapdoor, - PaleOakWood, - PandaSpawnEgg, - Paper, - ParchedSpawnEgg, - ParrotSpawnEgg, - PearlescentFroglight, - Peony, - PetrifiedOakSlab, - PhantomMembrane, - PhantomSpawnEgg, - PigSpawnEgg, - PiglinBannerPattern, - PiglinBruteSpawnEgg, - PiglinHead, - PiglinSpawnEgg, - PillagerSpawnEgg, - PinkBanner, - PinkBed, - PinkBundle, - PinkCandle, - PinkCarpet, - PinkConcrete, - PinkConcretePowder, - PinkDye, - PinkGlazedTerracotta, - PinkHarness, - PinkPetals, - PinkShulkerBox, - PinkStainedGlass, - PinkStainedGlassPane, - PinkTerracotta, - PinkTulip, - PinkWool, - Piston, - PitcherPlant, - PitcherPod, - PlayerHead, - PlentyPotterySherd, - Podzol, - PointedDripstone, - PoisonousPotato, - PolarBearSpawnEgg, - PolishedAndesite, - PolishedAndesiteSlab, - PolishedAndesiteStairs, - PolishedBasalt, - PolishedBlackstone, - PolishedBlackstoneBrickSlab, - PolishedBlackstoneBrickStairs, - PolishedBlackstoneBrickWall, - PolishedBlackstoneBricks, - PolishedBlackstoneButton, - PolishedBlackstonePressurePlate, - PolishedBlackstoneSlab, - PolishedBlackstoneStairs, - PolishedBlackstoneWall, - PolishedCinnabar, - PolishedCinnabarSlab, - PolishedCinnabarStairs, - PolishedCinnabarWall, - PolishedDeepslate, - PolishedDeepslateSlab, - PolishedDeepslateStairs, - PolishedDeepslateWall, - PolishedDiorite, - PolishedDioriteSlab, - PolishedDioriteStairs, - PolishedGranite, - PolishedGraniteSlab, - PolishedGraniteStairs, - PolishedSulfur, - PolishedSulfurSlab, - PolishedSulfurStairs, - PolishedSulfurWall, - PolishedTuff, - PolishedTuffSlab, - PolishedTuffStairs, - PolishedTuffWall, - PoppedChorusFruit, - Poppy, - Porkchop, - Potato, - PotentSulfur, - Potion, - PowderSnowBucket, - PoweredRail, - Prismarine, - PrismarineBrickSlab, - PrismarineBrickStairs, - PrismarineBricks, - PrismarineCrystals, - PrismarineShard, - PrismarineSlab, - PrismarineStairs, - PrismarineWall, - PrizePotterySherd, - Pufferfish, - PufferfishBucket, - PufferfishSpawnEgg, - Pumpkin, - PumpkinPie, - PumpkinSeeds, - PurpleBanner, - PurpleBed, - PurpleBundle, - PurpleCandle, - PurpleCarpet, - PurpleConcrete, - PurpleConcretePowder, - PurpleDye, - PurpleGlazedTerracotta, - PurpleHarness, - PurpleShulkerBox, - PurpleStainedGlass, - PurpleStainedGlassPane, - PurpleTerracotta, - PurpleWool, - PurpurBlock, - PurpurPillar, - PurpurSlab, - PurpurStairs, - Quartz, - QuartzBlock, - QuartzBricks, - QuartzPillar, - QuartzSlab, - QuartzStairs, - Rabbit, - RabbitFoot, - RabbitHide, - RabbitSpawnEgg, - RabbitStew, - Rail, - RaiserArmorTrimSmithingTemplate, - RavagerSpawnEgg, - RawCopper, - RawCopperBlock, - RawGold, - RawGoldBlock, - RawIron, - RawIronBlock, - RecoveryCompass, - RedBanner, - RedBed, - RedBundle, - RedCandle, - RedCarpet, - RedConcrete, - RedConcretePowder, - RedDye, - RedGlazedTerracotta, - RedHarness, - RedMushroom, - RedMushroomBlock, - RedNetherBrickSlab, - RedNetherBrickStairs, - RedNetherBrickWall, - RedNetherBricks, - RedSand, - RedSandstone, - RedSandstoneSlab, - RedSandstoneStairs, - RedSandstoneWall, - RedShulkerBox, - RedStainedGlass, - RedStainedGlassPane, - RedTerracotta, - RedTulip, - RedWool, - Redstone, - RedstoneBlock, - RedstoneLamp, - RedstoneOre, - RedstoneTorch, - ReinforcedDeepslate, - Repeater, - RepeatingCommandBlock, - ResinBlock, - ResinBrick, - ResinBrickSlab, - ResinBrickStairs, - ResinBrickWall, - ResinBricks, - ResinClump, - RespawnAnchor, - RibArmorTrimSmithingTemplate, - RootedDirt, - RoseBush, - RottenFlesh, - Saddle, - Salmon, - SalmonBucket, - SalmonSpawnEgg, - Sand, - Sandstone, - SandstoneSlab, - SandstoneStairs, - SandstoneWall, - Scaffolding, - ScrapePotterySherd, - Sculk, - SculkCatalyst, - SculkSensor, - SculkShrieker, - SculkVein, - SeaLantern, - SeaPickle, - Seagrass, - SentryArmorTrimSmithingTemplate, - ShaperArmorTrimSmithingTemplate, - SheafPotterySherd, - Shears, - SheepSpawnEgg, - ShelterPotterySherd, - Shield, - ShortDryGrass, - ShortGrass, - Shroomlight, - ShulkerBox, - ShulkerShell, - ShulkerSpawnEgg, - SilenceArmorTrimSmithingTemplate, - SilverfishSpawnEgg, - SkeletonHorseSpawnEgg, - SkeletonSkull, - SkeletonSpawnEgg, - SkullBannerPattern, - SkullPotterySherd, - SlimeBall, - SlimeBlock, - SlimeSpawnEgg, - SmallAmethystBud, - SmallDripleaf, - SmithingTable, - Smoker, - SmoothBasalt, - SmoothQuartz, - SmoothQuartzSlab, - SmoothQuartzStairs, - SmoothRedSandstone, - SmoothRedSandstoneSlab, - SmoothRedSandstoneStairs, - SmoothSandstone, - SmoothSandstoneSlab, - SmoothSandstoneStairs, - SmoothStone, - SmoothStoneSlab, - SnifferEgg, - SnifferSpawnEgg, - SnortPotterySherd, - SnoutArmorTrimSmithingTemplate, - Snow, - SnowBlock, - SnowGolemSpawnEgg, - Snowball, - SoulCampfire, - SoulLantern, - SoulSand, - SoulSoil, - SoulTorch, - Spawner, - SpectralArrow, - SpiderEye, - SpiderSpawnEgg, - SpireArmorTrimSmithingTemplate, - SplashPotion, - Sponge, - SporeBlossom, - SpruceBoat, - SpruceButton, - SpruceChestBoat, - SpruceDoor, - SpruceFence, - SpruceFenceGate, - SpruceHangingSign, - SpruceLeaves, - SpruceLog, - SprucePlanks, - SprucePressurePlate, - SpruceSapling, - SpruceShelf, - SpruceSign, - SpruceSlab, - SpruceStairs, - SpruceTrapdoor, - SpruceWood, - Spyglass, - SquidSpawnEgg, - Stick, - StickyPiston, - Stone, - StoneAxe, - StoneBrickSlab, - StoneBrickStairs, - StoneBrickWall, - StoneBricks, - StoneButton, - StoneHoe, - StonePickaxe, - StonePressurePlate, - StoneShovel, - StoneSlab, - StoneSpear, - StoneStairs, - StoneSword, - Stonecutter, - StraySpawnEgg, - StriderSpawnEgg, - String, - StrippedAcaciaLog, - StrippedAcaciaWood, - StrippedBambooBlock, - StrippedBirchLog, - StrippedBirchWood, - StrippedCherryLog, - StrippedCherryWood, - StrippedCrimsonHyphae, - StrippedCrimsonStem, - StrippedDarkOakLog, - StrippedDarkOakWood, - StrippedJungleLog, - StrippedJungleWood, - StrippedMangroveLog, - StrippedMangroveWood, - StrippedOakLog, - StrippedOakWood, - StrippedPaleOakLog, - StrippedPaleOakWood, - StrippedSpruceLog, - StrippedSpruceWood, - StrippedWarpedHyphae, - StrippedWarpedStem, - StructureBlock, - StructureVoid, - Sugar, - SugarCane, - Sulfur, - SulfurBrickSlab, - SulfurBrickStairs, - SulfurBrickWall, - SulfurBricks, - SulfurCubeBucket, - SulfurCubeSpawnEgg, - SulfurSlab, - SulfurSpike, - SulfurStairs, - SulfurWall, - Sunflower, - SuspiciousGravel, - SuspiciousSand, - SuspiciousStew, - SweetBerries, - TadpoleBucket, - TadpoleSpawnEgg, - TallDryGrass, - TallGrass, - Target, - Terracotta, - TestBlock, - TestInstanceBlock, - TideArmorTrimSmithingTemplate, - TintedGlass, - TippedArrow, - Tnt, - TntMinecart, - Torch, - Torchflower, - TorchflowerSeeds, - TotemOfUndying, - TraderLlamaSpawnEgg, - TrappedChest, - TrialKey, - TrialSpawner, - Trident, - TripwireHook, - TropicalFish, - TropicalFishBucket, - TropicalFishSpawnEgg, - TubeCoral, - TubeCoralBlock, - TubeCoralFan, - Tuff, - TuffBrickSlab, - TuffBrickStairs, - TuffBrickWall, - TuffBricks, - TuffSlab, - TuffStairs, - TuffWall, - TurtleEgg, - TurtleHelmet, - TurtleScute, - TurtleSpawnEgg, - TwistingVines, - Vault, - VerdantFroglight, - VexArmorTrimSmithingTemplate, - VexSpawnEgg, - VillagerSpawnEgg, - VindicatorSpawnEgg, - Vine, - WanderingTraderSpawnEgg, - WardArmorTrimSmithingTemplate, - WardenSpawnEgg, - WarpedButton, - WarpedDoor, - WarpedFence, - WarpedFenceGate, - WarpedFungus, - WarpedFungusOnAStick, - WarpedHangingSign, - WarpedHyphae, - WarpedNylium, - WarpedPlanks, - WarpedPressurePlate, - WarpedRoots, - WarpedShelf, - WarpedSign, - WarpedSlab, - WarpedStairs, - WarpedStem, - WarpedTrapdoor, - WarpedWartBlock, - WaterBucket, - WaxedChiseledCopper, - WaxedCopperBars, - WaxedCopperBlock, - WaxedCopperBulb, - WaxedCopperChain, - WaxedCopperChest, - WaxedCopperDoor, - WaxedCopperGolemStatue, - WaxedCopperGrate, - WaxedCopperLantern, - WaxedCopperTrapdoor, - WaxedCutCopper, - WaxedCutCopperSlab, - WaxedCutCopperStairs, - WaxedExposedChiseledCopper, - WaxedExposedCopper, - WaxedExposedCopperBars, - WaxedExposedCopperBulb, - WaxedExposedCopperChain, - WaxedExposedCopperChest, - WaxedExposedCopperDoor, - WaxedExposedCopperGolemStatue, - WaxedExposedCopperGrate, - WaxedExposedCopperLantern, - WaxedExposedCopperTrapdoor, - WaxedExposedCutCopper, - WaxedExposedCutCopperSlab, - WaxedExposedCutCopperStairs, - WaxedExposedLightningRod, - WaxedLightningRod, - WaxedOxidizedChiseledCopper, - WaxedOxidizedCopper, - WaxedOxidizedCopperBars, - WaxedOxidizedCopperBulb, - WaxedOxidizedCopperChain, - WaxedOxidizedCopperChest, - WaxedOxidizedCopperDoor, - WaxedOxidizedCopperGolemStatue, - WaxedOxidizedCopperGrate, - WaxedOxidizedCopperLantern, - WaxedOxidizedCopperTrapdoor, - WaxedOxidizedCutCopper, - WaxedOxidizedCutCopperSlab, - WaxedOxidizedCutCopperStairs, - WaxedOxidizedLightningRod, - WaxedWeatheredChiseledCopper, - WaxedWeatheredCopper, - WaxedWeatheredCopperBars, - WaxedWeatheredCopperBulb, - WaxedWeatheredCopperChain, - WaxedWeatheredCopperChest, - WaxedWeatheredCopperDoor, - WaxedWeatheredCopperGolemStatue, - WaxedWeatheredCopperGrate, - WaxedWeatheredCopperLantern, - WaxedWeatheredCopperTrapdoor, - WaxedWeatheredCutCopper, - WaxedWeatheredCutCopperSlab, - WaxedWeatheredCutCopperStairs, - WaxedWeatheredLightningRod, - WayfinderArmorTrimSmithingTemplate, - WeatheredChiseledCopper, - WeatheredCopper, - WeatheredCopperBars, - WeatheredCopperBulb, - WeatheredCopperChain, - WeatheredCopperChest, - WeatheredCopperDoor, - WeatheredCopperGolemStatue, - WeatheredCopperGrate, - WeatheredCopperLantern, - WeatheredCopperTrapdoor, - WeatheredCutCopper, - WeatheredCutCopperSlab, - WeatheredCutCopperStairs, - WeatheredLightningRod, - WeepingVines, - WetSponge, - Wheat, - WheatSeeds, - WhiteBanner, - WhiteBed, - WhiteBundle, - WhiteCandle, - WhiteCarpet, - WhiteConcrete, - WhiteConcretePowder, - WhiteDye, - WhiteGlazedTerracotta, - WhiteHarness, - WhiteShulkerBox, - WhiteStainedGlass, - WhiteStainedGlassPane, - WhiteTerracotta, - WhiteTulip, - WhiteWool, - WildArmorTrimSmithingTemplate, - Wildflowers, - WindCharge, - WitchSpawnEgg, - WitherRose, - WitherSkeletonSkull, - WitherSkeletonSpawnEgg, - WitherSpawnEgg, - WolfArmor, - WolfSpawnEgg, - WoodenAxe, - WoodenHoe, - WoodenPickaxe, - WoodenSpear, - WoodenShovel, - WoodenSword, - WritableBook, - WrittenBook, - YellowBanner, - YellowBed, - YellowBundle, - YellowCandle, - YellowCarpet, - YellowConcrete, - YellowConcretePowder, - YellowDye, - YellowGlazedTerracotta, - YellowHarness, - YellowShulkerBox, - YellowStainedGlass, - YellowStainedGlassPane, - YellowTerracotta, - YellowWool, - ZoglinSpawnEgg, - ZombieHead, - ZombieHorseSpawnEgg, - ZombieSpawnEgg, - ZombieNautilusSpawnEgg, - ZombieVillagerSpawnEgg, - ZombifiedPiglinSpawnEgg, - } -} diff --git a/MinecraftClient/Inventory/ItemTypeExtensions.cs b/MinecraftClient/Inventory/ItemTypeExtensions.cs deleted file mode 100644 index 0aac00ba07..0000000000 --- a/MinecraftClient/Inventory/ItemTypeExtensions.cs +++ /dev/null @@ -1,325 +0,0 @@ -using System; -using System.Linq; - -namespace MinecraftClient.Inventory -{ - public static class ItemTypeExtensions - { - public static bool IsFood(this ItemType m) - { - ItemType[] t = - { - ItemType.Apple, - ItemType.BakedPotato, - ItemType.Beetroot, - ItemType.Bread, - ItemType.Carrot, - ItemType.CookedChicken, - ItemType.CookedCod, - ItemType.CookedMutton, - ItemType.CookedPorkchop, - ItemType.CookedRabbit, - ItemType.CookedSalmon, - ItemType.Cookie, - ItemType.DriedKelp, - ItemType.EnchantedGoldenApple, - ItemType.GoldenApple, - ItemType.GoldenCarrot, - ItemType.MelonSlice, - ItemType.Potato, - ItemType.PumpkinPie, - ItemType.Beef, - ItemType.Chicken, - ItemType.Cod, - ItemType.Mutton, - ItemType.Porkchop, - ItemType.Rabbit, - ItemType.Salmon, - ItemType.CookedBeef, - ItemType.SweetBerries, - ItemType.TropicalFish - }; - return t.Contains(m); - } - - public static bool IsStackable(this ItemType m) - { - // these are non-stackable - ItemType[] t = - { - ItemType.AcaciaBoat, - ItemType.AcaciaChestBoat, - ItemType.AxolotlBucket, - ItemType.BirchBoat, - ItemType.BirchChestBoat, - ItemType.BlackBed, - ItemType.BlackBundle, - ItemType.BlackHarness, - ItemType.BlackShulkerBox, - ItemType.BlueBed, - ItemType.BlueBundle, - ItemType.BlueHarness, - ItemType.BlueShulkerBox, - ItemType.Bundle, - ItemType.Bow, - ItemType.BrownBed, - ItemType.BrownBundle, - ItemType.BrownHarness, - ItemType.BrownShulkerBox, - ItemType.BordureIndentedBannerPattern, - ItemType.BambooChestRaft, - ItemType.BambooRaft, - ItemType.Cake, - ItemType.ChainmailBoots, - ItemType.ChainmailChestplate, - ItemType.ChainmailHelmet, - ItemType.ChainmailLeggings, - ItemType.ChestMinecart, - ItemType.CodBucket, - ItemType.CommandBlockMinecart, - ItemType.CreeperBannerPattern, - ItemType.Crossbow, - ItemType.CopperAxe, - ItemType.CopperBoots, - ItemType.CopperChestplate, - ItemType.CopperHelmet, - ItemType.CopperHoe, - ItemType.CopperHorseArmor, - ItemType.CopperLeggings, - ItemType.CopperNautilusArmor, - ItemType.CopperPickaxe, - ItemType.CopperShovel, - ItemType.CopperSpear, - ItemType.CopperSword, - ItemType.CyanBed, - ItemType.CyanBundle, - ItemType.CyanHarness, - ItemType.CyanShulkerBox, - ItemType.CherryBoat, - ItemType.CherryChestBoat, - ItemType.DarkOakBoat, - ItemType.DarkOakChestBoat, - ItemType.DebugStick, - ItemType.DiamondAxe, - ItemType.DiamondBoots, - ItemType.DiamondChestplate, - ItemType.DiamondHelmet, - ItemType.DiamondHoe, - ItemType.DiamondHorseArmor, - ItemType.DiamondLeggings, - ItemType.DiamondNautilusArmor, - ItemType.DiamondPickaxe, - ItemType.DiamondShovel, - ItemType.DiamondSpear, - ItemType.DiamondSword, - ItemType.Elytra, - ItemType.EnchantedBook, - ItemType.FilledMap, - ItemType.FishingRod, - ItemType.FieldMasonedBannerPattern, - ItemType.FlintAndSteel, - ItemType.FurnaceMinecart, - ItemType.FlowBannerPattern, - ItemType.FlowerBannerPattern, - ItemType.GoatHorn, - ItemType.GlobeBannerPattern, - ItemType.GusterBannerPattern, - ItemType.GoldenAxe, - ItemType.GoldenBoots, - ItemType.GoldenChestplate, - ItemType.GoldenHelmet, - ItemType.GoldenHoe, - ItemType.GoldenHorseArmor, - ItemType.GoldenLeggings, - ItemType.GoldenNautilusArmor, - ItemType.GoldenPickaxe, - ItemType.GoldenShovel, - ItemType.GoldenSpear, - ItemType.GoldenSword, - ItemType.GrayBed, - ItemType.GrayBundle, - ItemType.GrayHarness, - ItemType.GrayShulkerBox, - ItemType.GreenBed, - ItemType.GreenBundle, - ItemType.GreenHarness, - ItemType.GreenShulkerBox, - ItemType.HopperMinecart, - ItemType.IronNautilusArmor, - ItemType.IronSpear, - ItemType.IronAxe, - ItemType.IronBoots, - ItemType.IronChestplate, - ItemType.IronHelmet, - ItemType.IronHoe, - ItemType.IronHorseArmor, - ItemType.IronLeggings, - ItemType.IronPickaxe, - ItemType.IronShovel, - ItemType.IronSword, - ItemType.Jigsaw, - ItemType.JungleBoat, - ItemType.JungleChestBoat, - ItemType.LavaBucket, - ItemType.LeatherBoots, - ItemType.LeatherChestplate, - ItemType.LeatherHelmet, - ItemType.LeatherHorseArmor, - ItemType.LeatherLeggings, - ItemType.LightBlueBed, - ItemType.LightBlueBundle, - ItemType.LightBlueHarness, - ItemType.LightBlueShulkerBox, - ItemType.LightGrayBed, - ItemType.LightGrayBundle, - ItemType.LightGrayHarness, - ItemType.LightGrayShulkerBox, - ItemType.LimeBed, - ItemType.LimeBundle, - ItemType.LimeHarness, - ItemType.LimeShulkerBox, - ItemType.LingeringPotion, - ItemType.Mace, - ItemType.MagentaBed, - ItemType.MagentaBundle, - ItemType.MagentaHarness, - ItemType.MagentaShulkerBox, - ItemType.MilkBucket, - ItemType.Minecart, - ItemType.MangroveBoat, - ItemType.MangroveChestBoat, - ItemType.MojangBannerPattern, - ItemType.MusicDisc5, - ItemType.MushroomStew, - ItemType.MusicDisc11, - ItemType.MusicDisc13, - ItemType.MusicDiscBlocks, - ItemType.MusicDiscCat, - ItemType.MusicDiscChirp, - ItemType.MusicDiscCreator, - ItemType.MusicDiscCreatorMusicBox, - ItemType.MusicDiscFar, - ItemType.MusicDiscLavaChicken, - ItemType.MusicDiscMall, - ItemType.MusicDiscMellohi, - ItemType.MusicDiscOtherside, - ItemType.MusicDiscPigstep, - ItemType.MusicDiscPrecipice, - ItemType.MusicDiscRelic, - ItemType.MusicDiscStal, - ItemType.MusicDiscStrad, - ItemType.MusicDiscTears, - ItemType.MusicDiscWait, - ItemType.MusicDiscWard, - ItemType.NetheriteHorseArmor, - ItemType.NetheriteNautilusArmor, - ItemType.NetheriteSpear, - ItemType.OakBoat, - ItemType.OakChestBoat, - ItemType.OrangeBed, - ItemType.OrangeBundle, - ItemType.OrangeHarness, - ItemType.OrangeShulkerBox, - ItemType.PaleOakBoat, - ItemType.PaleOakChestBoat, - ItemType.PinkBed, - ItemType.PinkBundle, - ItemType.PinkHarness, - ItemType.PinkShulkerBox, - ItemType.Potion, - ItemType.PowderSnowBucket, - ItemType.PufferfishBucket, - ItemType.PiglinBannerPattern, - ItemType.PurpleBed, - ItemType.PurpleBundle, - ItemType.PurpleHarness, - ItemType.PurpleShulkerBox, - ItemType.RabbitStew, - ItemType.RedBed, - ItemType.RedBundle, - ItemType.RedHarness, - ItemType.RedShulkerBox, - ItemType.Saddle, - ItemType.SalmonBucket, - ItemType.Shears, - ItemType.Shield, - ItemType.ShulkerBox, - ItemType.SkullBannerPattern, - ItemType.SplashPotion, - ItemType.SpruceBoat, - ItemType.SpruceChestBoat, - ItemType.Spyglass, - ItemType.StoneSpear, - ItemType.StoneAxe, - ItemType.StoneHoe, - ItemType.StonePickaxe, - ItemType.StoneShovel, - ItemType.StoneSword, - ItemType.StructureBlock, - ItemType.SuspiciousStew, - ItemType.TntMinecart, - ItemType.TotemOfUndying, - ItemType.Trident, - ItemType.TropicalFishBucket, - ItemType.TurtleHelmet, - ItemType.WaterBucket, - ItemType.WhiteBed, - ItemType.WhiteBundle, - ItemType.WhiteHarness, - ItemType.WhiteShulkerBox, - ItemType.WolfArmor, - ItemType.WoodenSpear, - ItemType.WoodenAxe, - ItemType.WoodenHoe, - ItemType.WoodenPickaxe, - ItemType.WoodenShovel, - ItemType.WoodenSword, - ItemType.WritableBook, - ItemType.WrittenBook, - ItemType.YellowBed, - ItemType.YellowBundle, - ItemType.YellowHarness, - ItemType.YellowShulkerBox - }; - return !t.Contains(m); - } - - public static int StackCount(this ItemType m) - { - // These are stack to 16 only - ItemType[] t = - { - ItemType.BlackBanner, - ItemType.BlueBanner, - ItemType.BrownBanner, - ItemType.CyanBanner, - ItemType.GrayBanner, - ItemType.GreenBanner, - ItemType.LightBlueBanner, - ItemType.LightGrayBanner, - ItemType.LimeBanner, - ItemType.MagentaBanner, - ItemType.OrangeBanner, - ItemType.PinkBanner, - ItemType.PurpleBanner, - ItemType.RedBanner, - ItemType.WhiteBanner, - ItemType.YellowBanner, - ItemType.ArmorStand, - ItemType.Bucket, - ItemType.BlueEgg, - ItemType.BrownEgg, - ItemType.Egg, - ItemType.EnderEye, - ItemType.HoneyBottle, - ItemType.Snowball - }; - if (m.IsStackable()) - return 64; - else if (t.Contains(m)) - return 16; - else - return 1; - } - } -} diff --git a/MinecraftClient/Inventory/SuspiciousStewEffect.cs b/MinecraftClient/Inventory/SuspiciousStewEffect.cs deleted file mode 100644 index 7b1b555395..0000000000 --- a/MinecraftClient/Inventory/SuspiciousStewEffect.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace MinecraftClient.Inventory; - -public record SuspiciousStewEffect(int TypeId, int Duration); \ No newline at end of file diff --git a/MinecraftClient/Inventory/TrimAssetOverride.cs b/MinecraftClient/Inventory/TrimAssetOverride.cs deleted file mode 100644 index 7047bde249..0000000000 --- a/MinecraftClient/Inventory/TrimAssetOverride.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace MinecraftClient.Inventory; - -public record TrimAssetOverride(int ArmorMaterialType, string AssetName); \ No newline at end of file diff --git a/MinecraftClient/Inventory/VillagerInfo.cs b/MinecraftClient/Inventory/VillagerInfo.cs deleted file mode 100644 index 426cd112c7..0000000000 --- a/MinecraftClient/Inventory/VillagerInfo.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace MinecraftClient.Inventory -{ - /// - /// Properties of a villager - /// - public record VillagerInfo - { - public int Level { get; set; } - public int Experience { get; set; } - public bool IsRegularVillager { get; set; } - public bool CanRestock { get; set; } - } -} diff --git a/MinecraftClient/Inventory/VillagerTrade.cs b/MinecraftClient/Inventory/VillagerTrade.cs deleted file mode 100644 index 46cd13e9da..0000000000 --- a/MinecraftClient/Inventory/VillagerTrade.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace MinecraftClient.Inventory -{ - /// - /// Represents a trade of a villager - /// - public record VillagerTrade( - Item InputItem1, - Item OutputItem, - Item? InputItem2, - bool TradeDisabled, - int NumberOfTradeUses, - int MaximumNumberOfTradeUses, - int Xp, - int SpecialPrice, - float PriceMultiplier, - int Demand); -} diff --git a/MinecraftClient/Inventory/WindowActionType.cs b/MinecraftClient/Inventory/WindowActionType.cs deleted file mode 100644 index 340a16ed59..0000000000 --- a/MinecraftClient/Inventory/WindowActionType.cs +++ /dev/null @@ -1,88 +0,0 @@ -namespace MinecraftClient.Inventory -{ - /// - /// Represents mouse interactions with an inventory window - /// - public enum WindowActionType - { - /// - /// Left click with mouse on a slot: grab or drop a whole item stack - /// - LeftClick, - - /// - /// Right click with mouse on a slot: grab half a stack or drop a single item - /// - RightClick, - - /// - /// Middle click with mouse on a slot: grab a full stack from creative inventory - /// - MiddleClick, - - /// - /// Shift+Left click with mouse on a slot: send a whole item stack to the hotbar or other inventory - /// - ShiftClick, - - /// - /// Shift+Right click with mouse on a slot: send a whole item stack to the hotbar or other inventory. Differece from ShiftClick is how it reported to server - /// - ShiftRightClick, - - /// - /// Drop a single item on ground - /// - DropItem, - - /// - /// Drop a whole item stack on ground - /// - DropItemStack, - - /// - /// Start hovering slots with left button pressed: Distribute evenly the stack on hovered slots - /// - StartDragLeft, - - /// - /// Start hovering slots with right button pressed: Drop one item on each hovered slot - /// - StartDragRight, - - /// - /// Start hovering slots with middle button pressed: Create one item stack on each hovered slot in creative mode - /// - StartDragMiddle, - - /// - /// Hover a slot to distribute evenly an item stack - /// - AddDragLeft, - - /// - /// Hover a slot to drop one item from an item stack - /// - AddDragRight, - - /// - /// Hover a slot to create one item stack in creative mode - /// - AddDragMiddle, - - /// - /// Stop hovering slots with left button pressed - /// - EndDragLeft, - - /// - /// Stop hovering slots with right button pressed - /// - EndDragRight, - - /// - /// Stop hovering slots with middble button pressed - /// - EndDragMiddle, - } -} diff --git a/MinecraftClient/Json.cs b/MinecraftClient/Json.cs deleted file mode 100644 index 08f5b24c4f..0000000000 --- a/MinecraftClient/Json.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; -using System.Text.Encodings.Web; -using System.Text.Json; -using System.Text.Json.Nodes; - -namespace MinecraftClient; - -/// -/// JSON utilities backed by System.Text.Json. -/// -public static class Json -{ - private static readonly JsonSerializerOptions s_escapeOptions = new() - { - Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping - }; - - /// - /// Parse a JSON string into a mutable DOM. - /// Returns null for null, empty, or whitespace-only input. - /// Returns a wrapping the raw string when the input - /// is not valid JSON (e.g. a plain-text Minecraft MOTD or chat message). - /// - public static JsonNode? ParseJson(string? json) - { - if (string.IsNullOrWhiteSpace(json)) return null; - ReadOnlySpan text = json.AsSpan().TrimStart(); - if (!LooksLikeJson(text)) - return JsonValue.Create(json); - - try { return JsonNode.Parse(json); } - catch (JsonException) { return JsonValue.Create(json); } - } - - private static bool LooksLikeJson(ReadOnlySpan text) - { - if (text.IsEmpty) - return false; - - return text[0] switch - { - '{' or '"' => true, - '[' => LooksLikeJsonArray(text[1..]), - '-' => text.Length > 1 && char.IsAsciiDigit(text[1]), - >= '0' and <= '9' => true, - 't' or 'f' or 'n' => true, - _ => false - }; - } - - private static bool LooksLikeJsonArray(ReadOnlySpan text) - { - text = text.TrimStart(); - if (text.IsEmpty) - return false; - - return text[0] switch - { - ']' or '{' or '[' or '"' => true, - '-' => text.Length > 1 && char.IsAsciiDigit(text[1]), - >= '0' and <= '9' => true, - 't' or 'f' or 'n' => true, - _ => false - }; - } - - /// - /// Escape a string for embedding inside a JSON string literal. - /// Uses System.Text.Json serialization and strips the surrounding quotes. - /// - public static string EscapeString(string src) => - JsonSerializer.Serialize(src, s_escapeOptions)[1..^1]; -} - -/// -/// Extension helpers for that replicate the access patterns -/// of the former JSONData.StringValue property. -/// -public static class JsonNodeExtensions -{ - /// - /// Return the string representation of any JSON value. - /// Strings are returned without quotes; numbers, booleans, and null - /// are returned as their text representation. - /// - public static string GetStringValue(this JsonNode? node) => node switch - { - null => "null", - JsonValue val when val.TryGetValue(out var s) => s, - _ => node.ToJsonString() - }; -} diff --git a/MinecraftClient/LegacyAchievementCatalog.cs b/MinecraftClient/LegacyAchievementCatalog.cs deleted file mode 100644 index bce17f8d81..0000000000 --- a/MinecraftClient/LegacyAchievementCatalog.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace MinecraftClient -{ - internal static class LegacyAchievementCatalog - { - public static IReadOnlyList Ids { get; } = - [ - "achievement.openInventory", - "achievement.mineWood", - "achievement.buildWorkBench", - "achievement.buildPickaxe", - "achievement.buildFurnace", - "achievement.acquireIron", - "achievement.buildHoe", - "achievement.makeBread", - "achievement.bakeCake", - "achievement.buildBetterPickaxe", - "achievement.cookFish", - "achievement.onARail", - "achievement.buildSword", - "achievement.killEnemy", - "achievement.killCow", - "achievement.flyPig", - "achievement.snipeSkeleton", - "achievement.diamonds", - "achievement.diamondsToYou", - "achievement.portal", - "achievement.ghast", - "achievement.blazeRod", - "achievement.potion", - "achievement.theEnd", - "achievement.theEnd2", - "achievement.enchantments", - "achievement.overkill", - "achievement.bookcase", - "achievement.breedCow", - "achievement.spawnWither", - "achievement.killWither", - "achievement.fullBeacon", - "achievement.exploreAllBiomes", - "achievement.overpowered" - ]; - - private static readonly HashSet s_idSet = new(Ids, StringComparer.Ordinal); - - public static bool Contains(string id) - { - return s_idSet.Contains(id); - } - } -} diff --git a/MinecraftClient/Logger/FileLogLogger.cs b/MinecraftClient/Logger/FileLogLogger.cs deleted file mode 100644 index ab660bdf41..0000000000 --- a/MinecraftClient/Logger/FileLogLogger.cs +++ /dev/null @@ -1,125 +0,0 @@ -using System; -using System.IO; -using System.Threading; -using MinecraftClient.Scripting; - -namespace MinecraftClient.Logger -{ - public class FileLogLogger : FilteredLogger - { - private readonly string logFile; - private readonly bool prependTimestamp; - private readonly Lock logFileLock = new(); - - public FileLogLogger(string file, bool prependTimestamp = false) - { - logFile = file; - this.prependTimestamp = prependTimestamp; - Save("### Log started at " + GetTimestamp() + " ###"); - } - - private void LogAndSave(string msg) - { - Log(msg); - Save(msg); - } - - private void Save(string msg) - { - try - { - if (!Settings.Config.Logging.SaveColorCodes) - msg = ChatBot.GetVerbatim(msg); - if (prependTimestamp) - msg = GetTimestamp() + ' ' + msg; - - string? directory = Path.GetDirectoryName(logFile); - if (!String.IsNullOrEmpty(directory) && !Directory.Exists(directory)) - Directory.CreateDirectory(directory); - lock (logFileLock) - { - FileStream stream = new(logFile, FileMode.OpenOrCreate); - StreamWriter writer = new(stream); - stream.Seek(0, SeekOrigin.End); - writer.WriteLine(msg); - writer.Dispose(); - stream.Close(); - } - } - catch (Exception e) - { - // Must use base since we already failed to write log - base.Error("Cannot write to log file: " + e.Message); - base.Debug("Stack trace: \n" + e.StackTrace); - } - } - - private static string GetTimestamp() - { - DateTime time = DateTime.Now; - return String.Format("{0}-{1}-{2} {3}:{4}:{5}", - time.Year.ToString("0000"), - time.Month.ToString("00"), - time.Day.ToString("00"), - time.Hour.ToString("00"), - time.Minute.ToString("00"), - time.Second.ToString("00")); - } - - public override void Chat(string msg) - { - if (ChatEnabled) - { - if (ShouldDisplay(FilterChannel.Chat, msg)) - { - ConsoleIO.WriteChatLineIfVisible(msg); - Save(msg); - } - else Debug("[Logger] One Chat message filtered: " + msg); - } - } - - public override void Debug(string msg) - { - if (DebugEnabled) - { - if (ShouldDisplay(FilterChannel.Debug, msg)) - { - LogAndSave("§8[DEBUG] " + msg); - } - } - } - - public override void PacketDebug(string msg) - { - if (Settings.Config.Logging.PacketDebugMessages) - { - if (ShouldDisplay(FilterChannel.Debug, msg)) - { - LogAndSave("§8[DEBUG] " + msg); - } - } - } - - public override void Error(string msg) - { - base.Error(msg); - if (ErrorEnabled) - Save(msg); - } - - public override void Info(string msg) - { - base.Info(msg); - if (InfoEnabled) - Save(msg); - } - - public override void Warn(string msg) - { - base.Warn(msg); - if (WarnEnabled) - Save(msg); - } - } -} diff --git a/MinecraftClient/Logger/FilteredLogger.cs b/MinecraftClient/Logger/FilteredLogger.cs deleted file mode 100644 index a520434c73..0000000000 --- a/MinecraftClient/Logger/FilteredLogger.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System.Text.RegularExpressions; -using static MinecraftClient.Settings; - -namespace MinecraftClient.Logger -{ - public class FilteredLogger : LoggerBase - { - protected enum FilterChannel { Debug, Chat } - - protected bool ShouldDisplay(FilterChannel channel, string msg) - { - if (Config.Logging.FilterMode == LoggingConfigHealper.LoggingConfig.FilterModeEnum.disable) - return true; - - Regex? regexToUse = null; - // Convert to bool for XOR later. Whitelist = 0, Blacklist = 1 - switch (channel) - { - case FilterChannel.Chat: - string chat = Config.Logging.ChatFilterRegex; - if (string.IsNullOrEmpty(chat)) - regexToUse = null; - else - regexToUse = new(chat); - break; - case FilterChannel.Debug: - string debug = Config.Logging.DebugFilterRegex; - if (string.IsNullOrEmpty(debug)) - regexToUse = null; - else - regexToUse = new(debug); - break; - } - if (regexToUse is not null) - { - // IsMatch and white/blacklist result can be represented using XOR - // e.g. matched(true) ^ blacklist(true) => shouldn't log(false) - if (Config.Logging.FilterMode == LoggingConfigHealper.LoggingConfig.FilterModeEnum.blacklist) - return !regexToUse.IsMatch(msg); - else if (Config.Logging.FilterMode == LoggingConfigHealper.LoggingConfig.FilterModeEnum.whitelist) - return regexToUse.IsMatch(msg); - else - return true; - } - else return true; - } - - public override void Debug(string msg) - { - if (DebugEnabled) - { - if (ShouldDisplay(FilterChannel.Debug, msg)) - { - Log("§8[DEBUG] " + msg); - } - // Don't write debug lines here as it could cause a stack overflow - } - } - - public override void PacketDebug(string msg) - { - if (Settings.Config.Logging.PacketDebugMessages) - { - if (ShouldDisplay(FilterChannel.Debug, msg)) - { - Log("§8[DEBUG] " + msg); - } - } - } - - public override void Info(string msg) - { - if (InfoEnabled) - ConsoleIO.WriteLogLine(msg); - } - - public override void Warn(string msg) - { - if (WarnEnabled) - Log("§6[WARN] " + msg); - } - - public override void Error(string msg) - { - if (ErrorEnabled) - Log("§c[ERROR] " + msg); - } - - public override void Chat(string msg) - { - if (ChatEnabled) - { - if (ShouldDisplay(FilterChannel.Chat, msg)) - { - ConsoleIO.WriteChatLineIfVisible(msg); - } - else Debug("[Logger] One Chat message filtered: " + msg); - } - } - } -} diff --git a/MinecraftClient/Logger/ILogger.cs b/MinecraftClient/Logger/ILogger.cs deleted file mode 100644 index 89a1b68667..0000000000 --- a/MinecraftClient/Logger/ILogger.cs +++ /dev/null @@ -1,35 +0,0 @@ -namespace MinecraftClient.Logger -{ - public interface ILogger - { - bool DebugEnabled { get; set; } - bool WarnEnabled { get; set; } - bool InfoEnabled { get; set; } - bool ErrorEnabled { get; set; } - bool ChatEnabled { get; set; } - - void Info(string msg); - void Info(string msg, params object[] args); - void Info(object msg); - - void Debug(string msg); - void Debug(string msg, params object[] args); - void Debug(object msg); - - void PacketDebug(string msg); - void PacketDebug(string msg, params object[] args); - void PacketDebug(object msg); - - void Warn(string msg); - void Warn(string msg, params object[] args); - void Warn(object msg); - - void Error(string msg); - void Error(string msg, params object[] args); - void Error(object msg); - - void Chat(string msg); - void Chat(string msg, params object[] args); - void Chat(object msg); - } -} diff --git a/MinecraftClient/Logger/LoggerBase.cs b/MinecraftClient/Logger/LoggerBase.cs deleted file mode 100644 index 500c43b6ea..0000000000 --- a/MinecraftClient/Logger/LoggerBase.cs +++ /dev/null @@ -1,106 +0,0 @@ -namespace MinecraftClient.Logger -{ - /// - /// Abstract class providing basic implementation of the ILogger interface - /// - public abstract class LoggerBase : ILogger - { - private bool debugEnabled = false; - private bool warnEnabled = true; - private bool infoEnabled = true; - private bool errorEnabled = true; - private bool chatEnabled = true; - public bool DebugEnabled { get { return debugEnabled; } set { debugEnabled = value; } } - public bool WarnEnabled { get { return warnEnabled; } set { warnEnabled = value; } } - public bool InfoEnabled { get { return infoEnabled; } set { infoEnabled = value; } } - public bool ErrorEnabled { get { return errorEnabled; } set { errorEnabled = value; } } - public bool ChatEnabled { get { return chatEnabled; } set { chatEnabled = value; } } - - public abstract void Chat(string msg); - - public void Chat(string msg, params object[] args) - { - Chat(string.Format(msg, args)); - } - - public void Chat(object msg) - { - Chat(msg.ToString() ?? string.Empty); - } - - public abstract void Debug(string msg); - - public void Debug(string msg, params object[] args) - { - Debug(string.Format(msg, args)); - } - - public void Debug(object msg) - { - Debug(msg.ToString() ?? string.Empty); - } - - public abstract void PacketDebug(string msg); - - public void PacketDebug(string msg, params object[] args) - { - PacketDebug(string.Format(msg, args)); - } - - public void PacketDebug(object msg) - { - PacketDebug(msg.ToString() ?? string.Empty); - } - - public abstract void Error(string msg); - - public void Error(string msg, params object[] args) - { - Error(string.Format(msg, args)); - } - - public void Error(object msg) - { - Error(msg.ToString() ?? string.Empty); - } - - public abstract void Info(string msg); - - public void Info(string msg, params object[] args) - { - Info(string.Format(msg, args)); - } - - public void Info(object msg) - { - Info(msg.ToString() ?? string.Empty); - } - - public abstract void Warn(string msg); - - public void Warn(string msg, params object[] args) - { - Warn(string.Format(msg, args)); - } - - public void Warn(object msg) - { - Warn(msg.ToString() ?? string.Empty); - } - - protected virtual void Log(object msg) - { - ConsoleIO.WriteLineFormatted(msg.ToString() ?? string.Empty); - } - - protected virtual void Log(string msg) - { - ConsoleIO.WriteLineFormatted(msg); - } - - protected virtual void Log(string msg, params object[] args) - { - ConsoleIO.WriteLineFormatted(string.Format(msg, args)); - } - } -} diff --git a/MinecraftClient/Mapping/Block.cs b/MinecraftClient/Mapping/Block.cs deleted file mode 100644 index 0bbe192c01..0000000000 --- a/MinecraftClient/Mapping/Block.cs +++ /dev/null @@ -1,153 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using MinecraftClient.Mapping.BlockPalettes; -using MinecraftClient.Protocol.Message; - -namespace MinecraftClient.Mapping -{ - /// - /// Represents a Minecraft Block - /// - public struct Block - { - public static readonly Block Air = new(0); - - /// - /// Get or set global block ID to Material mapping - /// The global Palette is a concept introduced with Minecraft 1.13 - /// - public static BlockPalette Palette { get; set; } = new Palette112(); - - /// - /// Storage for block ID and metadata, as ushort for compatibility, performance and lower memory footprint - /// For Minecraft 1.12 and lower, first 12 bits contain block ID (0-4095), last 4 bits contain metadata (0-15) - /// For Minecraft 1.13 and greater, all 16 bits are used to store block state ID (0-65535) - /// - private ushort blockIdAndMeta; - - /// - /// Id of the block - /// - public int BlockId - { - get - { - if (Palette.IdHasMetadata) - { - return blockIdAndMeta >> 4; - } - return blockIdAndMeta; - } - set - { - if (Palette.IdHasMetadata) - { - if (value > (ushort.MaxValue >> 4) || value < 0) - throw new ArgumentOutOfRangeException(nameof(value), "Invalid block ID. Accepted range: 0-4095"); - blockIdAndMeta = (ushort)(value << 4 | BlockMeta); - } - else - { - if (value > ushort.MaxValue || value < 0) - throw new ArgumentOutOfRangeException(nameof(value), "Invalid block ID. Accepted range: 0-65535"); - blockIdAndMeta = (ushort)value; - } - } - } - - /// - /// Metadata of the block. - /// This field has no effect starting with Minecraft 1.13. - /// - public byte BlockMeta - { - get - { - if (Palette.IdHasMetadata) - { - return (byte)(blockIdAndMeta & 0x0F); - } - return 0; - } - set - { - if (Palette.IdHasMetadata) - { - blockIdAndMeta = (ushort)((blockIdAndMeta & ~0x0F) | (value & 0x0F)); - } - } - } - - /// - /// Exact raw block state ID. For Minecraft 1.12 and older this contains the packed block ID and metadata. - /// - public int StateId => blockIdAndMeta; - - /// - /// Get the properties associated with this block's exact state ID. - /// - public IReadOnlyDictionary GetStateProperties() - { - if (Palette.IdHasMetadata) - { - return new Dictionary - { - ["metadata"] = BlockMeta.ToString(System.Globalization.CultureInfo.InvariantCulture) - }; - } - - return Palette.GetStateProperties(StateId); - } - - /// - /// Material of the block - /// - public Material Type - { - get - { - return Palette.FromId(BlockId); - } - } - - /// - /// Get a block of the specified type and metadata - /// - /// Block type - /// Block metadata - public Block(short type, byte metadata) - { - if (!Palette.IdHasMetadata) - throw new InvalidOperationException("Current global Palette does not support block Metadata"); - blockIdAndMeta = 0; - BlockId = type; - BlockMeta = metadata; - } - - /// - /// Get a block of the specified type and metadata OR block state - /// - /// Type and metadata packed in the same value OR block state - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public Block(ushort typeAndMeta) - { - blockIdAndMeta = typeAndMeta; - } - - public string GetTypeString() - { - string typeStr = Type.ToString(); - string? trans = ChatParser.TranslateString("block.minecraft." + typeStr.ToUnderscoreCase()); - return string.IsNullOrEmpty(trans) ? typeStr : trans; - } - - /// - /// String representation of the block - /// - public override string ToString() - { - return BlockId.ToString() + (BlockMeta != 0 ? ":" + BlockMeta.ToString() : ""); - } - } -} diff --git a/MinecraftClient/Mapping/BlockExtension.cs b/MinecraftClient/Mapping/BlockExtension.cs deleted file mode 100644 index a08057adc7..0000000000 --- a/MinecraftClient/Mapping/BlockExtension.cs +++ /dev/null @@ -1,444 +0,0 @@ -using MinecraftClient.Protocol.Handlers; - -namespace MinecraftClient.Mapping; - -public static class BlockExtension -{ - public static bool IsTopSlab(this Block block, int protocolVersion) - { - switch (protocolVersion) - { - case >= Protocol18Handler.MC_1_20_Version: - switch (block.BlockId) - { - case 11022: //OakSlab - case 11028: //SpruceSlab - case 11034: //BirchSlab - case 11040: //JungleSlab - case 11046: //AcaciaSlab - case 11058: //DarkOakSlab - case 11064: //MangroveSlab - case 18528: //CrimsonSlab - case 18534: //WarpedSlab - case 11082: //StoneSlab - case 11112: //CobblestoneSlab - case 13966: //MossyCobblestoneSlab - case 11088: //SmoothStoneSlab - case 11124: //StoneBrickSlab - case 13954: //MossyStoneBrickSlab - case 13990: //GraniteSlab - case 13942: //PolishedGraniteSlab - case 14014: //DioriteSlab - case 13960: //PolishedDioriteSlab - case 13996: //AndesiteSlab - case 14008: //PolishedAndesiteSlab - case 22534: //CobbledDeepslateSlab - case 22945: //PolishedDeepslateSlab - case 23767: //DeepslateBrickSlab - case 23356: //DeepslateTileSlab - case 11118: //BrickSlab - case 11130: //MudBrickSlab - case 11094: //SandstoneSlab - case 13978: //SmoothSandstoneSlab - case 11100: //CutSandstoneSlab - case 11148: //RedSandstoneSlab - case 13948: //SmoothRedSandstoneSlab - case 11154: //CutRedSandstoneSlab - case 10566: //PrismarineSlab - case 10572: //PrismarineBrickSlab - case 10578: //DarkPrismarineSlab - case 11136: //NetherBrickSlab - case 14002: //RedNetherBrickSlab - case 19725: //BlackstoneSlab - case 20226: //PolishedBlackstoneSlab - case 19735: //PolishedBlackstoneBrickSlab - case 13972: //EndStoneBrickSlab - case 11160: //PurpurSlab - case 11142: //QuartzSlab - case 13984: //SmoothQuartzSlab - case 21912: //CutCopperSlab - case 21906: //ExposedCutCopperSlab - case 21900: //WeatheredCutCopperSlab - case 21894: //OxidizedCutCopperSlab - case 22264: //WaxedCutCopperSlab - case 22258: //WaxedExposedCutCopperSlab - case 22252: //WaxedWeatheredCutCopperSlab - return true; - } - - break; - case Protocol18Handler.MC_1_19_4_Version: - switch (block.BlockId) - { - case 11018: // OakSlab - case 11024: // SpruceSlab - case 11030: // BirchSlab - case 11036: // JungleSlab - case 11042: // AcaciaSlab - case 11054: // DarkOakSlab - case 11060: // MangroveSlab - case 18510: // CrimsonSlab - case 18516: // WarpedSlab - case 11078: // StoneSlab - case 11108: // CobblestoneSlab - case 13948: // MossyCobblestoneSlab - case 11084: // SmoothStoneSlab - case 11120: // StoneBrickSlab - case 13936: // MossyStoneBrickSlab - case 13972: // GraniteSlab - case 13924: // PolishedGraniteSlab - case 13996: // DioriteSlab - case 13942: // PolishedDioriteSlab - case 13978: // AndesiteSlab - case 13990: // PolishedAndesiteSlab - case 22132: // CobbledDeepslateSlab - case 22543: // PolishedDeepslateSlab - case 23365: // DeepslateBrickSlab - case 22954: // DeepslateTileSlab - case 11114: // BrickSlab - case 11126: // MudBrickSlab - case 11090: // SandstoneSlab - case 13960: // SmoothSandstoneSlab - case 11096: // CutSandstoneSlab - case 11144: // RedSandstoneSlab - case 13930: // SmoothRedSandstoneSlab - case 11150: // CutRedSandstoneSlab - case 10562: // PrismarineSlab - case 10568: // PrismarineBrickSlab - case 10574: // DarkPrismarineSlab - case 11132: // NetherBrickSlab - case 13984: // RedNetherBrickSlab - case 19707: // BlackstoneSlab - case 20208: // PolishedBlackstoneSlab - case 19717: // PolishedBlackstoneBrickSlab - case 13954: // EndStoneBrickSlab - case 11156: // PurpurSlab - case 11138: // QuartzSlab - case 13966: // SmoothQuartzSlab - case 21510: // CutCopperSlab - case 21504: // ExposedCutCopperSlab - case 21498: // WeatheredCutCopperSlab - case 21492: // OxidizedCutCopperSlab - case 21862: // WaxedCutCopperSlab - case 21856: // WaxedExposedCutCopperSlab - case 21850: // WaxedWeatheredCutCopperSlab - case 21844: // WaxedOxidizedCutCopperSlab - return true; - } - - break; - case Protocol18Handler.MC_1_19_3_Version: - switch (block.BlockId) - { - case 10686: // OakSlab - case 10692: // SpruceSlab - case 10698: // BirchSlab - case 10704: // JungleSlab - case 10710: // AcaciaSlab - case 10716: // DarkOakSlab - case 10722: // MangroveSlab - case 18041: // CrimsonSlab - case 18047: // WarpedSlab - case 10740: // StoneSlab - case 10770: // CobblestoneSlab - case 13479: // MossyCobblestoneSlab - case 10746: // SmoothStoneSlab - case 10782: // StoneBrickSlab - case 13467: // MossyStoneBrickSlab - case 13503: // GraniteSlab - case 13455: // PolishedGraniteSlab - case 13527: // DioriteSlab - case 13473: // PolishedDioriteSlab - case 13509: // AndesiteSlab - case 13521: // PolishedAndesiteSlab - case 21647: // CobbledDeepslateSlab - case 22058: // PolishedDeepslateSlab - case 22880: // DeepslateBrickSlab - case 22469: // DeepslateTileSlab - case 10776: // BrickSlab - case 10788: // MudBrickSlab - case 10752: // SandstoneSlab - case 13491: // SmoothSandstoneSlab - case 10758: // CutSandstoneSlab - case 10806: // RedSandstoneSlab - case 13461: // SmoothRedSandstoneSlab - case 10812: // CutRedSandstoneSlab - case 10230: // PrismarineSlab - case 10236: // PrismarineBrickSlab - case 10242: // DarkPrismarineSlab - case 10794: // NetherBrickSlab - case 13515: // RedNetherBrickSlab - case 19238: // BlackstoneSlab - case 19739: // PolishedBlackstoneSlab - case 19248: // PolishedBlackstoneBrickSlab - case 13485: // EndStoneBrickSlab - case 10818: // PurpurSlab - case 10800: // QuartzSlab - case 13497: // SmoothQuartzSlab - case 21041: // CutCopperSlab - case 21035: // ExposedCutCopperSlab - case 21029: // WeatheredCutCopperSlab - case 21023: // OxidizedCutCopperSlab - case 21393: // WaxedCutCopperSlab - case 21387: // WaxedExposedCutCopperSlab - case 21381: // WaxedWeatheredCutCopperSlab - case 21375: // WaxedOxidizedCutCopperSlab - return true; - } - - break; - case >= Protocol18Handler.MC_1_19_Version: - switch (block.BlockId) - { - case 19257: // CutCopperSlab - case 19251: // ExposedCutCopperSlab - case 19245: // WeatheredCutCopperSlab - case 19239: // OxidizedCutCopperSlab - case 19609: // WaxedCutCopperSlab - case 19603: // WaxedExposedCutCopperSlab - case 19597: // WaxedWeatheredCutCopperSlab - case 19591: // WaxedOxidizedCutCopperSlab - case 9042: // OakSlab - case 9048: // SpruceSlab - case 9054: // BirchSlab - case 9060: // JungleSlab - case 9066: // AcaciaSlab - case 9072: // DarkOakSlab - case 9078: // MangroveSlab - case 16257: // CrimsonSlab - case 16263: // WarpedSlab - case 9084: // StoneSlab - case 9090: // SmoothStoneSlab - case 9096: // SandstoneSlab - case 9102: // CutSandstoneSlab - case 9108: // PetrifiedOakSlab - case 9114: // CobblestoneSlab - case 9120: // BrickSlab - case 9126: // StoneBrickSlab - case 9132: // MudBrickSlab - case 9138: // NetherBrickSlab - case 9144: // QuartzSlab - case 9150: // RedSandstoneSlab - case 9156: // CutRedSandstoneSlab - case 9162: // PurpurSlab - case 8586: // PrismarineSlab - case 8592: // PrismarineBrickSlab - case 8598: // DarkPrismarineSlab - case 11671: // PolishedGraniteSlab - case 11677: // SmoothRedSandstoneSlab - case 11683: // MossyStoneBrickSlab - case 11689: // PolishedDioriteSlab - case 11695: // MossyCobblestoneSlab - case 11701: // EndStoneBrickSlab - case 11707: // SmoothSandstoneSlab - case 11713: // SmoothQuartzSlab - case 11719: // GraniteSlab - case 11725: // AndesiteSlab - case 11731: // RedNetherBrickSlab - case 11737: // PolishedAndesiteSlab - case 11743: // DioriteSlab - case 19863: // CobbledDeepslateSlab - case 20274: // PolishedDeepslateSlab - case 21096: // DeepslateBrickSlab - case 20685: // DeepslateTileSlab - case 17454: // BlackstoneSlab - case 17955: // PolishedBlackstoneSlab - case 17464: // PolishedBlackstoneBrickSlab - return true; - } - - break; - case >= Protocol18Handler.MC_1_17_Version: - switch (block.BlockId) - { - case 18163: // CutCopperSlab - case 18157: // ExposedCutCopperSlab - case 18151: // WeatheredCutCopperSlab - case 18145: // OxidizedCutCopperSlab - case 18515: // WaxedCutCopperSlab - case 18509: // WaxedExposedCutCopperSlab - case 18503: // WaxedWeatheredCutCopperSlab - case 18497: // WaxedOxidizedCutCopperSlab - case 8551: // OakSlab - case 8557: // SpruceSlab - case 8563: // BirchSlab - case 8569: // JungleSlab - case 8575: // AcaciaSlab - case 8581: // DarkOakSlab - case 15302: // CrimsonSlab - case 15308: // WarpedSlab - case 8587: // StoneSlab - case 8593: // SmoothStoneSlab - case 8599: // SandstoneSlab - case 8605: // CutSandstoneSlab - case 8611: // PetrifiedOakSlab - case 8617: // CobblestoneSlab - case 8623: // BrickSlab - case 8629: // StoneBrickSlab - case 8635: // NetherBrickSlab - case 8641: // QuartzSlab - case 8647: // RedSandstoneSlab - case 8653: // CutRedSandstoneSlab - case 8659: // PurpurSlab - case 8095: // PrismarineSlab - case 8101: // PrismarineBrickSlab - case 8107: // DarkPrismarineSlab - case 11040: // PolishedGraniteSlab - case 11046: // SmoothRedSandstoneSlab - case 11052: // MossyStoneBrickSlab - case 11058: // PolishedDioriteSlab - case 11064: // MossyCobblestoneSlab - case 11070: // EndStoneBrickSlab - case 11076: // SmoothSandstoneSlab - case 11082: // SmoothQuartzSlab - case 11088: // GraniteSlab - case 11094: // AndesiteSlab - case 11100: // RedNetherBrickSlab - case 11106: // PolishedAndesiteSlab - case 11112: // DioriteSlab - case 18768: // CobbledDeepslateSlab - case 19179: // PolishedDeepslateSlab - case 20001: // DeepslateBrickSlab - case 19590: // DeepslateTileSlab - case 16499: // BlackstoneSlab - case 17000: // PolishedBlackstoneSlab - case 16509: // PolishedBlackstoneBrickSlab - return true; - } - - break; - case >= Protocol18Handler.MC_1_16_Version: - switch (block.BlockId) - { - case 8305: // OakSlab - case 8311: // SpruceSlab - case 8317: // BirchSlab - case 8323: // JungleSlab - case 8329: // AcaciaSlab - case 8335: // DarkOakSlab - case 15056: // CrimsonSlab - case 15062: // WarpedSlab - case 8341: // StoneSlab - case 8347: // SmoothStoneSlab - case 8353: // SandstoneSlab - case 8359: // CutSandstoneSlab - case 8365: // PetrifiedOakSlab - case 8371: // CobblestoneSlab - case 8377: // BrickSlab - case 8383: // StoneBrickSlab - case 8389: // NetherBrickSlab - case 8395: // QuartzSlab - case 8401: // RedSandstoneSlab - case 8407: // CutRedSandstoneSlab - case 8413: // PurpurSlab - case 7849: // PrismarineSlab - case 7855: // PrismarineBrickSlab - case 7861: // DarkPrismarineSlab - case 10794: // PolishedGraniteSlab - case 10800: // SmoothRedSandstoneSlab - case 10806: // MossyStoneBrickSlab - case 10812: // PolishedDioriteSlab - case 10818: // MossyCobblestoneSlab - case 10824: // EndStoneBrickSlab - case 10830: // SmoothSandstoneSlab - case 10836: // SmoothQuartzSlab - case 10842: // GraniteSlab - case 10848: // AndesiteSlab - case 10854: // RedNetherBrickSlab - case 10860: // PolishedAndesiteSlab - case 10866: // DioriteSlab - case 16253: // BlackstoneSlab - case 16754: // PolishedBlackstoneSlab - case 16263: // PolishedBlackstoneBrickSlab - return true; - } - - break; - case >= Protocol18Handler.MC_1_15_Version: - switch (block.BlockId) - { - case 7765: // OakSlab - case 7771: // SpruceSlab - case 7777: // BirchSlab - case 7783: // JungleSlab - case 7789: // AcaciaSlab - case 7795: // DarkOakSlab - case 7801: // StoneSlab - case 7807: // SmoothStoneSlab - case 7813: // SandstoneSlab - case 7819: // CutSandstoneSlab - case 7825: // PetrifiedOakSlab - case 7831: // CobblestoneSlab - case 7837: // BrickSlab - case 7843: // StoneBrickSlab - case 7849: // NetherBrickSlab - case 7855: // QuartzSlab - case 7861: // RedSandstoneSlab - case 7867: // CutRedSandstoneSlab - case 7873: // PurpurSlab - case 7309: // PrismarineSlab - case 7321: // DarkPrismarineSlab - case 10254: // PolishedGraniteSlab - case 10260: // SmoothRedSandstoneSlab - case 10266: // MossyStoneBrickSlab - case 10272: // PolishedDioriteSlab - case 10278: // MossyCobblestoneSlab - case 10284: // EndStoneBrickSlab - case 10290: // SmoothSandstoneSlab - case 10296: // SmoothQuartzSlab - case 10302: // GraniteSlab - case 10308: // AndesiteSlab - case 10314: // RedNetherBrickSlab - case 10320: // PolishedAndesiteSlab - case 10326: // DioriteSlab - return true; - } - - break; - case >= Protocol18Handler.MC_1_14_Version: - switch (block.BlockId) - { - case 7765: // OakSlab - case 7771: // SpruceSlab - case 7777: // BirchSlab - case 7783: // JungleSlab - case 7789: // AcaciaSlab - case 7795: // DarkOakSlab - case 7801: // StoneSlab - case 7807: // SmoothStoneSlab - case 7813: // SandstoneSlab - case 7819: // CutSandstoneSlab - case 7825: // PetrifiedOakSlab - case 7831: // CobblestoneSlab - case 7837: // BrickSlab - case 7843: // StoneBrickSlab - case 7849: // NetherBrickSlab - case 7855: // QuartzSlab - case 7861: // RedSandstoneSlab - case 7867: // CutRedSandstoneSlab - case 7873: // PurpurSlab - case 7309: // PrismarineSlab - case 7315: // PrismarineBrickSlab - case 7321: // DarkPrismarineSlab - case 10254: // PolishedGraniteSlab - case 10260: // SmoothRedSandstoneSlab - case 10266: // MossyStoneBrickSlab - case 10272: // PolishedDioriteSlab - case 10278: // MossyCobblestoneSlab - case 10284: // EndStoneBrickSlab - case 10290: // SmoothSandstoneSlab - case 10296: // SmoothQuartzSlab - case 10302: // GraniteSlab - case 10308: // AndesiteSlab - case 10314: // RedNetherBrickSlab - case 10320: // PolishedAndesiteSlab - case 10326: // DioriteSlab - return true; - } - - break; - } - - return false; - } -} \ No newline at end of file diff --git a/MinecraftClient/Mapping/BlockHardness.cs b/MinecraftClient/Mapping/BlockHardness.cs deleted file mode 100644 index 97d1df94a2..0000000000 --- a/MinecraftClient/Mapping/BlockHardness.cs +++ /dev/null @@ -1,1582 +0,0 @@ -using System.Collections.Frozen; -using System.Collections.Generic; - -namespace MinecraftClient.Mapping -{ - /// - /// Provides block hardness values and tool requirement data for mining calculations. - /// Data extracted from Minecraft 1.21.11 decompiled Blocks.java. - /// - public static class BlockHardness - { - /// - /// Default hardness for blocks not in the table. Uses stone-like hardness as a safe fallback. - /// - public const float DefaultHardness = 1.5f; - - /// - /// Get the hardness value for a block material. - /// Returns -1 for unbreakable blocks, 0 for instant-break blocks. - /// - public static float GetHardness(Material material) - { - if (HardnessTable.TryGetValue(material, out float hardness)) - return hardness; - return DefaultHardness; - } - - /// - /// Check whether a block requires the correct tool to get drops - /// and uses the 100 divisor instead of 30 when mined without the correct tool. - /// - public static bool RequiresCorrectTool(Material material) - { - return RequiresCorrectToolSet.Contains(material); - } - - private static readonly FrozenDictionary HardnessTable = new Dictionary - { - { Material.AcaciaButton, 0.5f }, - { Material.AcaciaDoor, 3.0f }, - { Material.AcaciaFence, 2.0f }, - { Material.AcaciaFenceGate, 2.0f }, - { Material.AcaciaHangingSign, 1.0f }, - { Material.AcaciaLeaves, 0.2f }, - { Material.AcaciaLog, 2.0f }, - { Material.AcaciaPlanks, 2.0f }, - { Material.AcaciaPressurePlate, 0.5f }, - { Material.AcaciaSapling, 0.0f }, - { Material.AcaciaShelf, 2.0f }, - { Material.AcaciaSign, 1.0f }, - { Material.AcaciaSlab, 2.0f }, - { Material.AcaciaStairs, 2.0f }, - { Material.AcaciaTrapdoor, 3.0f }, - { Material.AcaciaWallHangingSign, 1.0f }, - { Material.AcaciaWallSign, 1.0f }, - { Material.AcaciaWood, 2.0f }, - { Material.ActivatorRail, 0.7f }, - { Material.Air, 0.0f }, - { Material.Allium, 0.0f }, - { Material.AmethystBlock, 1.5f }, - { Material.AmethystCluster, 1.5f }, - { Material.AncientDebris, 30.0f }, - { Material.Andesite, 1.5f }, - { Material.AndesiteSlab, 1.5f }, - { Material.AndesiteStairs, 1.5f }, - { Material.AndesiteWall, 1.5f }, - { Material.Anvil, 5.0f }, - { Material.AttachedMelonStem, 0.0f }, - { Material.AttachedPumpkinStem, 0.0f }, - { Material.Azalea, 0.0f }, - { Material.AzaleaLeaves, 0.2f }, - { Material.AzureBluet, 0.0f }, - { Material.Bamboo, 0.0f }, - { Material.BambooBlock, 2.0f }, - { Material.BambooButton, 0.5f }, - { Material.BambooDoor, 3.0f }, - { Material.BambooFence, 2.0f }, - { Material.BambooFenceGate, 2.0f }, - { Material.BambooHangingSign, 1.0f }, - { Material.BambooMosaic, 2.0f }, - { Material.BambooMosaicSlab, 2.0f }, - { Material.BambooMosaicStairs, 2.0f }, - { Material.BambooPlanks, 2.0f }, - { Material.BambooPressurePlate, 0.5f }, - { Material.BambooSapling, 0.0f }, - { Material.BambooShelf, 2.0f }, - { Material.BambooSign, 1.0f }, - { Material.BambooSlab, 2.0f }, - { Material.BambooStairs, 2.0f }, - { Material.BambooTrapdoor, 3.0f }, - { Material.BambooWallHangingSign, 1.0f }, - { Material.BambooWallSign, 1.0f }, - { Material.Barrel, 2.5f }, - { Material.Barrier, -1.0f }, - { Material.Basalt, 1.25f }, - { Material.Beacon, 3.0f }, - { Material.Bedrock, -1.0f }, - { Material.BeeNest, 0.3f }, - { Material.Beehive, 0.6f }, - { Material.Beetroots, 0.0f }, - { Material.Bell, 5.0f }, - { Material.BigDripleaf, 0.1f }, - { Material.BigDripleafStem, 0.1f }, - { Material.BirchButton, 0.5f }, - { Material.BirchDoor, 3.0f }, - { Material.BirchFence, 2.0f }, - { Material.BirchFenceGate, 2.0f }, - { Material.BirchHangingSign, 1.0f }, - { Material.BirchLeaves, 0.2f }, - { Material.BirchLog, 2.0f }, - { Material.BirchPlanks, 2.0f }, - { Material.BirchPressurePlate, 0.5f }, - { Material.BirchSapling, 0.0f }, - { Material.BirchShelf, 2.0f }, - { Material.BirchSign, 1.0f }, - { Material.BirchSlab, 2.0f }, - { Material.BirchStairs, 2.0f }, - { Material.BirchTrapdoor, 3.0f }, - { Material.BirchWallHangingSign, 1.0f }, - { Material.BirchWallSign, 1.0f }, - { Material.BirchWood, 2.0f }, - { Material.BlackBanner, 1.0f }, - { Material.BlackBed, 0.2f }, - { Material.BlackCandle, 0.1f }, - { Material.BlackCandleCake, 0.5f }, - { Material.BlackCarpet, 0.1f }, - { Material.BlackConcrete, 1.8f }, - { Material.BlackConcretePowder, 0.5f }, - { Material.BlackGlazedTerracotta, 1.4f }, - { Material.BlackShulkerBox, 2.0f }, - { Material.BlackStainedGlass, 0.3f }, - { Material.BlackStainedGlassPane, 0.3f }, - { Material.BlackTerracotta, 1.25f }, - { Material.BlackWallBanner, 1.0f }, - { Material.BlackWool, 0.8f }, - { Material.Blackstone, 1.5f }, - { Material.BlackstoneSlab, 2.0f }, - { Material.BlackstoneStairs, 1.5f }, - { Material.BlackstoneWall, 1.5f }, - { Material.BlastFurnace, 3.5f }, - { Material.BlueBanner, 1.0f }, - { Material.BlueBed, 0.2f }, - { Material.BlueCandle, 0.1f }, - { Material.BlueCandleCake, 0.5f }, - { Material.BlueCarpet, 0.1f }, - { Material.BlueConcrete, 1.8f }, - { Material.BlueConcretePowder, 0.5f }, - { Material.BlueGlazedTerracotta, 1.4f }, - { Material.BlueIce, 2.8f }, - { Material.BlueOrchid, 0.0f }, - { Material.BlueShulkerBox, 2.0f }, - { Material.BlueStainedGlass, 0.3f }, - { Material.BlueStainedGlassPane, 0.3f }, - { Material.BlueTerracotta, 1.25f }, - { Material.BlueWallBanner, 1.0f }, - { Material.BlueWool, 0.8f }, - { Material.BoneBlock, 2.0f }, - { Material.Bookshelf, 1.5f }, - { Material.BrainCoral, 0.0f }, - { Material.BrainCoralBlock, 1.5f }, - { Material.BrainCoralFan, 0.0f }, - { Material.BrainCoralWallFan, 0.0f }, - { Material.BrewingStand, 0.5f }, - { Material.BrickSlab, 2.0f }, - { Material.BrickStairs, 2.0f }, - { Material.BrickWall, 2.0f }, - { Material.Bricks, 2.0f }, - { Material.BrownBanner, 1.0f }, - { Material.BrownBed, 0.2f }, - { Material.BrownCandle, 0.1f }, - { Material.BrownCandleCake, 0.5f }, - { Material.BrownCarpet, 0.1f }, - { Material.BrownConcrete, 1.8f }, - { Material.BrownConcretePowder, 0.5f }, - { Material.BrownGlazedTerracotta, 1.4f }, - { Material.BrownMushroom, 0.0f }, - { Material.BrownMushroomBlock, 0.2f }, - { Material.BrownShulkerBox, 2.0f }, - { Material.BrownStainedGlass, 0.3f }, - { Material.BrownStainedGlassPane, 0.3f }, - { Material.BrownTerracotta, 1.25f }, - { Material.BrownWallBanner, 1.0f }, - { Material.BrownWool, 0.8f }, - { Material.BubbleColumn, 0.0f }, - { Material.BubbleCoral, 0.0f }, - { Material.BubbleCoralBlock, 1.5f }, - { Material.BubbleCoralFan, 0.0f }, - { Material.BubbleCoralWallFan, 0.0f }, - { Material.BuddingAmethyst, 1.5f }, - { Material.Bush, 0.0f }, - { Material.Cactus, 0.4f }, - { Material.CactusFlower, 0.0f }, - { Material.Cake, 0.5f }, - { Material.Calcite, 0.75f }, - { Material.CalibratedSculkSensor, 1.5f }, - { Material.Campfire, 2.0f }, - { Material.Candle, 0.1f }, - { Material.CandleCake, 0.5f }, - { Material.Carrots, 0.0f }, - { Material.CartographyTable, 2.5f }, - { Material.CarvedPumpkin, 1.0f }, - { Material.Cauldron, 2.0f }, - { Material.CaveAir, 0.0f }, - { Material.CaveVines, 0.0f }, - { Material.CaveVinesPlant, 0.0f }, - { Material.ChainCommandBlock, -1.0f }, - { Material.CherryButton, 0.5f }, - { Material.CherryDoor, 3.0f }, - { Material.CherryFence, 2.0f }, - { Material.CherryFenceGate, 2.0f }, - { Material.CherryHangingSign, 1.0f }, - { Material.CherryLeaves, 0.2f }, - { Material.CherryLog, 2.0f }, - { Material.CherryPlanks, 2.0f }, - { Material.CherryPressurePlate, 0.5f }, - { Material.CherrySapling, 0.0f }, - { Material.CherryShelf, 2.0f }, - { Material.CherrySign, 1.0f }, - { Material.CherrySlab, 2.0f }, - { Material.CherryStairs, 2.0f }, - { Material.CherryTrapdoor, 3.0f }, - { Material.CherryWallHangingSign, 1.0f }, - { Material.CherryWallSign, 1.0f }, - { Material.CherryWood, 2.0f }, - { Material.Chest, 2.5f }, - { Material.ChippedAnvil, 5.0f }, - { Material.ChiseledBookshelf, 1.5f }, - { Material.ChiseledCopper, 3.0f }, - { Material.ChiseledDeepslate, 3.5f }, - { Material.ChiseledNetherBricks, 2.0f }, - { Material.ChiseledPolishedBlackstone, 1.5f }, - { Material.ChiseledQuartzBlock, 0.8f }, - { Material.ChiseledRedSandstone, 0.8f }, - { Material.ChiseledResinBricks, 1.5f }, - { Material.ChiseledSandstone, 0.8f }, - { Material.ChiseledStoneBricks, 1.5f }, - { Material.ChiseledTuff, 1.5f }, - { Material.ChiseledTuffBricks, 1.5f }, - { Material.ChorusFlower, 0.4f }, - { Material.ChorusPlant, 0.4f }, - { Material.Clay, 0.6f }, - { Material.ClosedEyeblossom, 0.0f }, - { Material.CoalBlock, 5.0f }, - { Material.CoalOre, 3.0f }, - { Material.CoarseDirt, 0.5f }, - { Material.CobbledDeepslate, 3.5f }, - { Material.CobbledDeepslateSlab, 3.5f }, - { Material.CobbledDeepslateStairs, 3.5f }, - { Material.CobbledDeepslateWall, 3.5f }, - { Material.Cobblestone, 2.0f }, - { Material.CobblestoneSlab, 2.0f }, - { Material.CobblestoneStairs, 2.0f }, - { Material.CobblestoneWall, 2.0f }, - { Material.Cobweb, 4.0f }, - { Material.Cocoa, 0.2f }, - { Material.CommandBlock, -1.0f }, - { Material.Comparator, 0.0f }, - { Material.Composter, 0.6f }, - { Material.Conduit, 3.0f }, - { Material.CopperBlock, 3.0f }, - { Material.CopperBulb, 3.0f }, - { Material.CopperChest, 3.0f }, - { Material.CopperDoor, 3.0f }, - { Material.CopperGolemStatue, 3.0f }, - { Material.CopperGrate, 3.0f }, - { Material.CopperOre, 3.0f }, - { Material.CopperTorch, 0.0f }, - { Material.CopperTrapdoor, 3.0f }, - { Material.CopperWallTorch, 0.0f }, - { Material.Cornflower, 0.0f }, - { Material.CrackedDeepslateBricks, 3.5f }, - { Material.CrackedDeepslateTiles, 3.5f }, - { Material.CrackedNetherBricks, 2.0f }, - { Material.CrackedPolishedBlackstoneBricks, 1.5f }, - { Material.CrackedStoneBricks, 1.5f }, - { Material.Crafter, 1.5f }, - { Material.CraftingTable, 2.5f }, - { Material.CreakingHeart, 10.0f }, - { Material.CreeperHead, 1.0f }, - { Material.CreeperWallHead, 1.0f }, - { Material.CrimsonButton, 0.5f }, - { Material.CrimsonDoor, 3.0f }, - { Material.CrimsonFence, 2.0f }, - { Material.CrimsonFenceGate, 2.0f }, - { Material.CrimsonFungus, 0.0f }, - { Material.CrimsonHangingSign, 1.0f }, - { Material.CrimsonHyphae, 2.0f }, - { Material.CrimsonNylium, 0.4f }, - { Material.CrimsonPlanks, 2.0f }, - { Material.CrimsonPressurePlate, 0.5f }, - { Material.CrimsonRoots, 0.0f }, - { Material.CrimsonShelf, 2.0f }, - { Material.CrimsonSign, 1.0f }, - { Material.CrimsonSlab, 2.0f }, - { Material.CrimsonStairs, 2.0f }, - { Material.CrimsonStem, 2.0f }, - { Material.CrimsonTrapdoor, 3.0f }, - { Material.CrimsonWallHangingSign, 1.0f }, - { Material.CrimsonWallSign, 1.0f }, - { Material.CryingObsidian, 50.0f }, - { Material.CutCopper, 3.0f }, - { Material.CutCopperSlab, 3.0f }, - { Material.CutCopperStairs, 3.0f }, - { Material.CutRedSandstone, 0.8f }, - { Material.CutRedSandstoneSlab, 2.0f }, - { Material.CutSandstone, 0.8f }, - { Material.CutSandstoneSlab, 2.0f }, - { Material.CyanBanner, 1.0f }, - { Material.CyanBed, 0.2f }, - { Material.CyanCandle, 0.1f }, - { Material.CyanCandleCake, 0.5f }, - { Material.CyanCarpet, 0.1f }, - { Material.CyanConcrete, 1.8f }, - { Material.CyanConcretePowder, 0.5f }, - { Material.CyanGlazedTerracotta, 1.4f }, - { Material.CyanShulkerBox, 2.0f }, - { Material.CyanStainedGlass, 0.3f }, - { Material.CyanStainedGlassPane, 0.3f }, - { Material.CyanTerracotta, 1.25f }, - { Material.CyanWallBanner, 1.0f }, - { Material.CyanWool, 0.8f }, - { Material.DamagedAnvil, 5.0f }, - { Material.Dandelion, 0.0f }, - { Material.DarkOakButton, 0.5f }, - { Material.DarkOakDoor, 3.0f }, - { Material.DarkOakFence, 2.0f }, - { Material.DarkOakFenceGate, 2.0f }, - { Material.DarkOakHangingSign, 1.0f }, - { Material.DarkOakLeaves, 0.2f }, - { Material.DarkOakLog, 2.0f }, - { Material.DarkOakPlanks, 2.0f }, - { Material.DarkOakPressurePlate, 0.5f }, - { Material.DarkOakSapling, 0.0f }, - { Material.DarkOakShelf, 2.0f }, - { Material.DarkOakSign, 1.0f }, - { Material.DarkOakSlab, 2.0f }, - { Material.DarkOakStairs, 2.0f }, - { Material.DarkOakTrapdoor, 3.0f }, - { Material.DarkOakWallHangingSign, 1.0f }, - { Material.DarkOakWallSign, 1.0f }, - { Material.DarkOakWood, 2.0f }, - { Material.DarkPrismarine, 1.5f }, - { Material.DarkPrismarineSlab, 1.5f }, - { Material.DarkPrismarineStairs, 1.5f }, - { Material.DaylightDetector, 0.2f }, - { Material.DeadBrainCoral, 0.0f }, - { Material.DeadBrainCoralBlock, 1.5f }, - { Material.DeadBrainCoralFan, 0.0f }, - { Material.DeadBrainCoralWallFan, 0.0f }, - { Material.DeadBubbleCoral, 0.0f }, - { Material.DeadBubbleCoralBlock, 1.5f }, - { Material.DeadBubbleCoralFan, 0.0f }, - { Material.DeadBubbleCoralWallFan, 0.0f }, - { Material.DeadBush, 0.0f }, - { Material.DeadFireCoral, 0.0f }, - { Material.DeadFireCoralBlock, 1.5f }, - { Material.DeadFireCoralFan, 0.0f }, - { Material.DeadFireCoralWallFan, 0.0f }, - { Material.DeadHornCoral, 0.0f }, - { Material.DeadHornCoralBlock, 1.5f }, - { Material.DeadHornCoralFan, 0.0f }, - { Material.DeadHornCoralWallFan, 0.0f }, - { Material.DeadTubeCoral, 0.0f }, - { Material.DeadTubeCoralBlock, 1.5f }, - { Material.DeadTubeCoralFan, 0.0f }, - { Material.DeadTubeCoralWallFan, 0.0f }, - { Material.DecoratedPot, 0.0f }, - { Material.Deepslate, 3.0f }, - { Material.DeepslateBrickSlab, 3.5f }, - { Material.DeepslateBrickStairs, 3.5f }, - { Material.DeepslateBrickWall, 3.5f }, - { Material.DeepslateBricks, 3.5f }, - { Material.DeepslateCoalOre, 4.5f }, - { Material.DeepslateCopperOre, 4.5f }, - { Material.DeepslateDiamondOre, 4.5f }, - { Material.DeepslateEmeraldOre, 4.5f }, - { Material.DeepslateGoldOre, 4.5f }, - { Material.DeepslateIronOre, 4.5f }, - { Material.DeepslateLapisOre, 4.5f }, - { Material.DeepslateRedstoneOre, 4.5f }, - { Material.DeepslateTileSlab, 3.5f }, - { Material.DeepslateTileStairs, 3.5f }, - { Material.DeepslateTileWall, 3.5f }, - { Material.DeepslateTiles, 3.5f }, - { Material.DetectorRail, 0.7f }, - { Material.DiamondBlock, 5.0f }, - { Material.DiamondOre, 3.0f }, - { Material.Diorite, 1.5f }, - { Material.DioriteSlab, 1.5f }, - { Material.DioriteStairs, 1.5f }, - { Material.DioriteWall, 1.5f }, - { Material.Dirt, 0.5f }, - { Material.DirtPath, 0.65f }, - { Material.Dispenser, 3.5f }, - { Material.DragonEgg, 3.0f }, - { Material.DragonHead, 1.0f }, - { Material.DragonWallHead, 1.0f }, - { Material.DriedGhast, 0.0f }, - { Material.DriedKelpBlock, 0.5f }, - { Material.DripstoneBlock, 1.5f }, - { Material.Dropper, 3.5f }, - { Material.EmeraldBlock, 5.0f }, - { Material.EmeraldOre, 3.0f }, - { Material.EnchantingTable, 5.0f }, - { Material.EndGateway, -1.0f }, - { Material.EndPortal, -1.0f }, - { Material.EndPortalFrame, -1.0f }, - { Material.EndRod, 0.0f }, - { Material.EndStone, 3.0f }, - { Material.EndStoneBrickSlab, 3.0f }, - { Material.EndStoneBrickStairs, 3.0f }, - { Material.EndStoneBrickWall, 3.0f }, - { Material.EndStoneBricks, 3.0f }, - { Material.EnderChest, 22.5f }, - { Material.ExposedChiseledCopper, 3.0f }, - { Material.ExposedCopper, 3.0f }, - { Material.ExposedCopperBulb, 3.0f }, - { Material.ExposedCopperChest, 3.0f }, - { Material.ExposedCopperDoor, 3.0f }, - { Material.ExposedCopperGolemStatue, 3.0f }, - { Material.ExposedCopperGrate, 3.0f }, - { Material.ExposedCopperTrapdoor, 3.0f }, - { Material.ExposedCutCopper, 3.0f }, - { Material.ExposedCutCopperSlab, 3.0f }, - { Material.ExposedCutCopperStairs, 3.0f }, - { Material.ExposedLightningRod, 3.0f }, - { Material.Farmland, 0.6f }, - { Material.Fern, 0.0f }, - { Material.Fire, 0.0f }, - { Material.FireCoral, 0.0f }, - { Material.FireCoralBlock, 1.5f }, - { Material.FireCoralFan, 0.0f }, - { Material.FireCoralWallFan, 0.0f }, - { Material.FireflyBush, 0.0f }, - { Material.FletchingTable, 2.5f }, - { Material.FlowerPot, 0.0f }, - { Material.FloweringAzalea, 0.0f }, - { Material.FloweringAzaleaLeaves, 0.2f }, - { Material.Frogspawn, 0.0f }, - { Material.FrostedIce, 0.5f }, - { Material.Furnace, 3.5f }, - { Material.GildedBlackstone, 1.5f }, - { Material.Glass, 0.3f }, - { Material.GlassPane, 0.3f }, - { Material.GlowLichen, 0.2f }, - { Material.Glowstone, 0.3f }, - { Material.GoldBlock, 3.0f }, - { Material.GoldOre, 3.0f }, - { Material.Granite, 1.5f }, - { Material.GraniteSlab, 1.5f }, - { Material.GraniteStairs, 1.5f }, - { Material.GraniteWall, 1.5f }, - { Material.GrassBlock, 0.6f }, - { Material.Gravel, 0.6f }, - { Material.GrayBanner, 1.0f }, - { Material.GrayBed, 0.2f }, - { Material.GrayCandle, 0.1f }, - { Material.GrayCandleCake, 0.5f }, - { Material.GrayCarpet, 0.1f }, - { Material.GrayConcrete, 1.8f }, - { Material.GrayConcretePowder, 0.5f }, - { Material.GrayGlazedTerracotta, 1.4f }, - { Material.GrayShulkerBox, 2.0f }, - { Material.GrayStainedGlass, 0.3f }, - { Material.GrayStainedGlassPane, 0.3f }, - { Material.GrayTerracotta, 1.25f }, - { Material.GrayWallBanner, 1.0f }, - { Material.GrayWool, 0.8f }, - { Material.GreenBanner, 1.0f }, - { Material.GreenBed, 0.2f }, - { Material.GreenCandle, 0.1f }, - { Material.GreenCandleCake, 0.5f }, - { Material.GreenCarpet, 0.1f }, - { Material.GreenConcrete, 1.8f }, - { Material.GreenConcretePowder, 0.5f }, - { Material.GreenGlazedTerracotta, 1.4f }, - { Material.GreenShulkerBox, 2.0f }, - { Material.GreenStainedGlass, 0.3f }, - { Material.GreenStainedGlassPane, 0.3f }, - { Material.GreenTerracotta, 1.25f }, - { Material.GreenWallBanner, 1.0f }, - { Material.GreenWool, 0.8f }, - { Material.Grindstone, 2.0f }, - { Material.HangingRoots, 0.0f }, - { Material.HayBlock, 0.5f }, - { Material.HeavyCore, 10.0f }, - { Material.HeavyWeightedPressurePlate, 0.5f }, - { Material.HoneyBlock, 0.0f }, - { Material.HoneycombBlock, 0.6f }, - { Material.Hopper, 3.0f }, - { Material.HornCoral, 0.0f }, - { Material.HornCoralBlock, 1.5f }, - { Material.HornCoralFan, 0.0f }, - { Material.HornCoralWallFan, 0.0f }, - { Material.Ice, 0.5f }, - { Material.InfestedChiseledStoneBricks, 0.0f }, - { Material.InfestedCobblestone, 0.0f }, - { Material.InfestedCrackedStoneBricks, 0.0f }, - { Material.InfestedDeepslate, 0.0f }, - { Material.InfestedMossyStoneBricks, 0.0f }, - { Material.InfestedStone, 0.0f }, - { Material.InfestedStoneBricks, 0.0f }, - { Material.IronBars, 5.0f }, - { Material.IronBlock, 5.0f }, - { Material.IronChain, 5.0f }, - { Material.IronDoor, 5.0f }, - { Material.IronOre, 3.0f }, - { Material.IronTrapdoor, 5.0f }, - { Material.JackOLantern, 1.0f }, - { Material.Jigsaw, -1.0f }, - { Material.Jukebox, 2.0f }, - { Material.JungleButton, 0.5f }, - { Material.JungleDoor, 3.0f }, - { Material.JungleFence, 2.0f }, - { Material.JungleFenceGate, 2.0f }, - { Material.JungleHangingSign, 1.0f }, - { Material.JungleLeaves, 0.2f }, - { Material.JungleLog, 2.0f }, - { Material.JunglePlanks, 2.0f }, - { Material.JunglePressurePlate, 0.5f }, - { Material.JungleSapling, 0.0f }, - { Material.JungleShelf, 2.0f }, - { Material.JungleSign, 1.0f }, - { Material.JungleSlab, 2.0f }, - { Material.JungleStairs, 2.0f }, - { Material.JungleTrapdoor, 3.0f }, - { Material.JungleWallHangingSign, 1.0f }, - { Material.JungleWallSign, 1.0f }, - { Material.JungleWood, 2.0f }, - { Material.Kelp, 0.0f }, - { Material.KelpPlant, 0.0f }, - { Material.Ladder, 0.4f }, - { Material.Lantern, 3.5f }, - { Material.LapisBlock, 3.0f }, - { Material.LapisOre, 3.0f }, - { Material.LargeAmethystBud, 1.5f }, - { Material.LargeFern, 0.0f }, - { Material.Lava, 100.0f }, - { Material.LavaCauldron, 2.0f }, - { Material.LeafLitter, 0.0f }, - { Material.Lectern, 2.5f }, - { Material.Lever, 0.5f }, - { Material.Light, -1.0f }, - { Material.LightBlueBanner, 1.0f }, - { Material.LightBlueBed, 0.2f }, - { Material.LightBlueCandle, 0.1f }, - { Material.LightBlueCandleCake, 0.5f }, - { Material.LightBlueCarpet, 0.1f }, - { Material.LightBlueConcrete, 1.8f }, - { Material.LightBlueConcretePowder, 0.5f }, - { Material.LightBlueGlazedTerracotta, 1.4f }, - { Material.LightBlueShulkerBox, 2.0f }, - { Material.LightBlueStainedGlass, 0.3f }, - { Material.LightBlueStainedGlassPane, 0.3f }, - { Material.LightBlueTerracotta, 1.25f }, - { Material.LightBlueWallBanner, 1.0f }, - { Material.LightBlueWool, 0.8f }, - { Material.LightGrayBanner, 1.0f }, - { Material.LightGrayBed, 0.2f }, - { Material.LightGrayCandle, 0.1f }, - { Material.LightGrayCandleCake, 0.5f }, - { Material.LightGrayCarpet, 0.1f }, - { Material.LightGrayConcrete, 1.8f }, - { Material.LightGrayConcretePowder, 0.5f }, - { Material.LightGrayGlazedTerracotta, 1.4f }, - { Material.LightGrayShulkerBox, 2.0f }, - { Material.LightGrayStainedGlass, 0.3f }, - { Material.LightGrayStainedGlassPane, 0.3f }, - { Material.LightGrayTerracotta, 1.25f }, - { Material.LightGrayWallBanner, 1.0f }, - { Material.LightGrayWool, 0.8f }, - { Material.LightWeightedPressurePlate, 0.5f }, - { Material.LightningRod, 3.0f }, - { Material.Lilac, 0.0f }, - { Material.LilyOfTheValley, 0.0f }, - { Material.LilyPad, 0.0f }, - { Material.LimeBanner, 1.0f }, - { Material.LimeBed, 0.2f }, - { Material.LimeCandle, 0.1f }, - { Material.LimeCandleCake, 0.5f }, - { Material.LimeCarpet, 0.1f }, - { Material.LimeConcrete, 1.8f }, - { Material.LimeConcretePowder, 0.5f }, - { Material.LimeGlazedTerracotta, 1.4f }, - { Material.LimeShulkerBox, 2.0f }, - { Material.LimeStainedGlass, 0.3f }, - { Material.LimeStainedGlassPane, 0.3f }, - { Material.LimeTerracotta, 1.25f }, - { Material.LimeWallBanner, 1.0f }, - { Material.LimeWool, 0.8f }, - { Material.Lodestone, 3.5f }, - { Material.Loom, 2.5f }, - { Material.MagentaBanner, 1.0f }, - { Material.MagentaBed, 0.2f }, - { Material.MagentaCandle, 0.1f }, - { Material.MagentaCandleCake, 0.5f }, - { Material.MagentaCarpet, 0.1f }, - { Material.MagentaConcrete, 1.8f }, - { Material.MagentaConcretePowder, 0.5f }, - { Material.MagentaGlazedTerracotta, 1.4f }, - { Material.MagentaShulkerBox, 2.0f }, - { Material.MagentaStainedGlass, 0.3f }, - { Material.MagentaStainedGlassPane, 0.3f }, - { Material.MagentaTerracotta, 1.25f }, - { Material.MagentaWallBanner, 1.0f }, - { Material.MagentaWool, 0.8f }, - { Material.MagmaBlock, 0.5f }, - { Material.MangroveButton, 0.5f }, - { Material.MangroveDoor, 3.0f }, - { Material.MangroveFence, 2.0f }, - { Material.MangroveFenceGate, 2.0f }, - { Material.MangroveHangingSign, 1.0f }, - { Material.MangroveLeaves, 0.2f }, - { Material.MangroveLog, 2.0f }, - { Material.MangrovePlanks, 2.0f }, - { Material.MangrovePressurePlate, 0.5f }, - { Material.MangrovePropagule, 0.0f }, - { Material.MangroveRoots, 0.7f }, - { Material.MangroveShelf, 2.0f }, - { Material.MangroveSign, 1.0f }, - { Material.MangroveSlab, 2.0f }, - { Material.MangroveStairs, 2.0f }, - { Material.MangroveTrapdoor, 3.0f }, - { Material.MangroveWallHangingSign, 1.0f }, - { Material.MangroveWallSign, 1.0f }, - { Material.MangroveWood, 2.0f }, - { Material.MediumAmethystBud, 1.5f }, - { Material.Melon, 1.0f }, - { Material.MelonStem, 0.0f }, - { Material.MossBlock, 0.1f }, - { Material.MossCarpet, 0.1f }, - { Material.MossyCobblestone, 2.0f }, - { Material.MossyCobblestoneSlab, 2.0f }, - { Material.MossyCobblestoneStairs, 2.0f }, - { Material.MossyCobblestoneWall, 2.0f }, - { Material.MossyStoneBrickSlab, 1.5f }, - { Material.MossyStoneBrickStairs, 1.5f }, - { Material.MossyStoneBrickWall, 1.5f }, - { Material.MossyStoneBricks, 1.5f }, - { Material.MovingPiston, -1.0f }, - { Material.Mud, 0.5f }, - { Material.MudBrickSlab, 1.5f }, - { Material.MudBrickStairs, 1.5f }, - { Material.MudBrickWall, 1.5f }, - { Material.MudBricks, 1.5f }, - { Material.MuddyMangroveRoots, 0.7f }, - { Material.MushroomStem, 0.2f }, - { Material.Mycelium, 0.6f }, - { Material.NetherBrickFence, 2.0f }, - { Material.NetherBrickSlab, 2.0f }, - { Material.NetherBrickStairs, 2.0f }, - { Material.NetherBrickWall, 2.0f }, - { Material.NetherBricks, 2.0f }, - { Material.NetherGoldOre, 3.0f }, - { Material.NetherPortal, -1.0f }, - { Material.NetherQuartzOre, 3.0f }, - { Material.NetherSprouts, 0.0f }, - { Material.NetherWart, 0.0f }, - { Material.NetherWartBlock, 1.0f }, - { Material.NetheriteBlock, 50.0f }, - { Material.Netherrack, 0.4f }, - { Material.NoteBlock, 0.8f }, - { Material.OakButton, 0.5f }, - { Material.OakDoor, 3.0f }, - { Material.OakFence, 2.0f }, - { Material.OakFenceGate, 2.0f }, - { Material.OakHangingSign, 1.0f }, - { Material.OakLeaves, 0.2f }, - { Material.OakLog, 2.0f }, - { Material.OakPlanks, 2.0f }, - { Material.OakPressurePlate, 0.5f }, - { Material.OakSapling, 0.0f }, - { Material.OakShelf, 2.0f }, - { Material.OakSign, 1.0f }, - { Material.OakSlab, 2.0f }, - { Material.OakStairs, 2.0f }, - { Material.OakTrapdoor, 3.0f }, - { Material.OakWallHangingSign, 1.0f }, - { Material.OakWallSign, 1.0f }, - { Material.OakWood, 2.0f }, - { Material.Observer, 3.0f }, - { Material.Obsidian, 50.0f }, - { Material.OchreFroglight, 0.3f }, - { Material.OpenEyeblossom, 0.0f }, - { Material.OrangeBanner, 1.0f }, - { Material.OrangeBed, 0.2f }, - { Material.OrangeCandle, 0.1f }, - { Material.OrangeCandleCake, 0.5f }, - { Material.OrangeCarpet, 0.1f }, - { Material.OrangeConcrete, 1.8f }, - { Material.OrangeConcretePowder, 0.5f }, - { Material.OrangeGlazedTerracotta, 1.4f }, - { Material.OrangeShulkerBox, 2.0f }, - { Material.OrangeStainedGlass, 0.3f }, - { Material.OrangeStainedGlassPane, 0.3f }, - { Material.OrangeTerracotta, 1.25f }, - { Material.OrangeTulip, 0.0f }, - { Material.OrangeWallBanner, 1.0f }, - { Material.OrangeWool, 0.8f }, - { Material.OxeyeDaisy, 0.0f }, - { Material.OxidizedChiseledCopper, 3.0f }, - { Material.OxidizedCopper, 3.0f }, - { Material.OxidizedCopperBulb, 3.0f }, - { Material.OxidizedCopperChest, 3.0f }, - { Material.OxidizedCopperDoor, 3.0f }, - { Material.OxidizedCopperGolemStatue, 3.0f }, - { Material.OxidizedCopperGrate, 3.0f }, - { Material.OxidizedCopperTrapdoor, 3.0f }, - { Material.OxidizedCutCopper, 3.0f }, - { Material.OxidizedCutCopperSlab, 3.0f }, - { Material.OxidizedCutCopperStairs, 3.0f }, - { Material.OxidizedLightningRod, 3.0f }, - { Material.PackedIce, 0.5f }, - { Material.PackedMud, 1.0f }, - { Material.PaleHangingMoss, 0.0f }, - { Material.PaleMossBlock, 0.1f }, - { Material.PaleMossCarpet, 0.1f }, - { Material.PaleOakButton, 0.5f }, - { Material.PaleOakDoor, 3.0f }, - { Material.PaleOakFence, 2.0f }, - { Material.PaleOakFenceGate, 2.0f }, - { Material.PaleOakHangingSign, 1.0f }, - { Material.PaleOakLeaves, 0.2f }, - { Material.PaleOakLog, 2.0f }, - { Material.PaleOakPlanks, 2.0f }, - { Material.PaleOakPressurePlate, 0.5f }, - { Material.PaleOakSapling, 0.0f }, - { Material.PaleOakShelf, 2.0f }, - { Material.PaleOakSign, 1.0f }, - { Material.PaleOakSlab, 2.0f }, - { Material.PaleOakStairs, 2.0f }, - { Material.PaleOakTrapdoor, 3.0f }, - { Material.PaleOakWallHangingSign, 1.0f }, - { Material.PaleOakWallSign, 1.0f }, - { Material.PaleOakWood, 2.0f }, - { Material.PearlescentFroglight, 0.3f }, - { Material.Peony, 0.0f }, - { Material.PetrifiedOakSlab, 2.0f }, - { Material.PiglinHead, 1.0f }, - { Material.PiglinWallHead, 1.0f }, - { Material.PinkBanner, 1.0f }, - { Material.PinkBed, 0.2f }, - { Material.PinkCandle, 0.1f }, - { Material.PinkCandleCake, 0.5f }, - { Material.PinkCarpet, 0.1f }, - { Material.PinkConcrete, 1.8f }, - { Material.PinkConcretePowder, 0.5f }, - { Material.PinkGlazedTerracotta, 1.4f }, - { Material.PinkPetals, 0.0f }, - { Material.PinkShulkerBox, 2.0f }, - { Material.PinkStainedGlass, 0.3f }, - { Material.PinkStainedGlassPane, 0.3f }, - { Material.PinkTerracotta, 1.25f }, - { Material.PinkTulip, 0.0f }, - { Material.PinkWallBanner, 1.0f }, - { Material.PinkWool, 0.8f }, - { Material.Piston, 0.0f }, - { Material.PistonHead, 1.5f }, - { Material.PitcherCrop, 0.0f }, - { Material.PitcherPlant, 0.0f }, - { Material.PlayerHead, 1.0f }, - { Material.PlayerWallHead, 1.0f }, - { Material.Podzol, 0.5f }, - { Material.PointedDripstone, 1.5f }, - { Material.PolishedAndesite, 1.5f }, - { Material.PolishedAndesiteSlab, 1.5f }, - { Material.PolishedAndesiteStairs, 1.5f }, - { Material.PolishedBasalt, 1.25f }, - { Material.PolishedBlackstone, 2.0f }, - { Material.PolishedBlackstoneBrickSlab, 2.0f }, - { Material.PolishedBlackstoneBrickStairs, 1.5f }, - { Material.PolishedBlackstoneBrickWall, 1.5f }, - { Material.PolishedBlackstoneBricks, 1.5f }, - { Material.PolishedBlackstoneButton, 0.5f }, - { Material.PolishedBlackstonePressurePlate, 0.5f }, - { Material.PolishedBlackstoneSlab, 2.0f }, - { Material.PolishedBlackstoneStairs, 2.0f }, - { Material.PolishedBlackstoneWall, 2.0f }, - { Material.PolishedDeepslate, 3.5f }, - { Material.PolishedDeepslateSlab, 3.5f }, - { Material.PolishedDeepslateStairs, 3.5f }, - { Material.PolishedDeepslateWall, 3.5f }, - { Material.PolishedDiorite, 1.5f }, - { Material.PolishedDioriteSlab, 1.5f }, - { Material.PolishedDioriteStairs, 1.5f }, - { Material.PolishedGranite, 1.5f }, - { Material.PolishedGraniteSlab, 1.5f }, - { Material.PolishedGraniteStairs, 1.5f }, - { Material.PolishedTuff, 1.5f }, - { Material.PolishedTuffSlab, 1.5f }, - { Material.PolishedTuffStairs, 1.5f }, - { Material.PolishedTuffWall, 1.5f }, - { Material.Poppy, 0.0f }, - { Material.Potatoes, 0.0f }, - { Material.PottedAcaciaSapling, 0.0f }, - { Material.PottedAllium, 0.0f }, - { Material.PottedAzaleaBush, 0.0f }, - { Material.PottedAzureBluet, 0.0f }, - { Material.PottedBamboo, 0.0f }, - { Material.PottedBirchSapling, 0.0f }, - { Material.PottedBlueOrchid, 0.0f }, - { Material.PottedBrownMushroom, 0.0f }, - { Material.PottedCactus, 0.0f }, - { Material.PottedCherrySapling, 0.0f }, - { Material.PottedClosedEyeblossom, 0.0f }, - { Material.PottedCornflower, 0.0f }, - { Material.PottedCrimsonFungus, 0.0f }, - { Material.PottedCrimsonRoots, 0.0f }, - { Material.PottedDandelion, 0.0f }, - { Material.PottedDarkOakSapling, 0.0f }, - { Material.PottedDeadBush, 0.0f }, - { Material.PottedFern, 0.0f }, - { Material.PottedFloweringAzaleaBush, 0.0f }, - { Material.PottedJungleSapling, 0.0f }, - { Material.PottedLilyOfTheValley, 0.0f }, - { Material.PottedMangrovePropagule, 0.0f }, - { Material.PottedOakSapling, 0.0f }, - { Material.PottedOpenEyeblossom, 0.0f }, - { Material.PottedOrangeTulip, 0.0f }, - { Material.PottedOxeyeDaisy, 0.0f }, - { Material.PottedPaleOakSapling, 0.0f }, - { Material.PottedPinkTulip, 0.0f }, - { Material.PottedPoppy, 0.0f }, - { Material.PottedRedMushroom, 0.0f }, - { Material.PottedRedTulip, 0.0f }, - { Material.PottedSpruceSapling, 0.0f }, - { Material.PottedTorchflower, 0.0f }, - { Material.PottedWarpedFungus, 0.0f }, - { Material.PottedWarpedRoots, 0.0f }, - { Material.PottedWhiteTulip, 0.0f }, - { Material.PottedWitherRose, 0.0f }, - { Material.PowderSnow, 0.25f }, - { Material.PowderSnowCauldron, 2.0f }, - { Material.PoweredRail, 0.7f }, - { Material.Prismarine, 1.5f }, - { Material.PrismarineBrickSlab, 1.5f }, - { Material.PrismarineBrickStairs, 1.5f }, - { Material.PrismarineBricks, 1.5f }, - { Material.PrismarineSlab, 1.5f }, - { Material.PrismarineStairs, 1.5f }, - { Material.PrismarineWall, 1.5f }, - { Material.Pumpkin, 1.0f }, - { Material.PumpkinStem, 0.0f }, - { Material.PurpleBanner, 1.0f }, - { Material.PurpleBed, 0.2f }, - { Material.PurpleCandle, 0.1f }, - { Material.PurpleCandleCake, 0.5f }, - { Material.PurpleCarpet, 0.1f }, - { Material.PurpleConcrete, 1.8f }, - { Material.PurpleConcretePowder, 0.5f }, - { Material.PurpleGlazedTerracotta, 1.4f }, - { Material.PurpleShulkerBox, 2.0f }, - { Material.PurpleStainedGlass, 0.3f }, - { Material.PurpleStainedGlassPane, 0.3f }, - { Material.PurpleTerracotta, 1.25f }, - { Material.PurpleWallBanner, 1.0f }, - { Material.PurpleWool, 0.8f }, - { Material.PurpurBlock, 1.5f }, - { Material.PurpurPillar, 1.5f }, - { Material.PurpurSlab, 2.0f }, - { Material.PurpurStairs, 1.5f }, - { Material.QuartzBlock, 0.8f }, - { Material.QuartzBricks, 0.8f }, - { Material.QuartzPillar, 0.8f }, - { Material.QuartzSlab, 2.0f }, - { Material.QuartzStairs, 0.8f }, - { Material.Rail, 0.7f }, - { Material.RawCopperBlock, 5.0f }, - { Material.RawGoldBlock, 5.0f }, - { Material.RawIronBlock, 5.0f }, - { Material.RedBanner, 1.0f }, - { Material.RedBed, 0.2f }, - { Material.RedCandle, 0.1f }, - { Material.RedCandleCake, 0.5f }, - { Material.RedCarpet, 0.1f }, - { Material.RedConcrete, 1.8f }, - { Material.RedConcretePowder, 0.5f }, - { Material.RedGlazedTerracotta, 1.4f }, - { Material.RedMushroom, 0.0f }, - { Material.RedMushroomBlock, 0.2f }, - { Material.RedNetherBrickSlab, 2.0f }, - { Material.RedNetherBrickStairs, 2.0f }, - { Material.RedNetherBrickWall, 2.0f }, - { Material.RedNetherBricks, 2.0f }, - { Material.RedSand, 0.5f }, - { Material.RedSandstone, 0.8f }, - { Material.RedSandstoneSlab, 2.0f }, - { Material.RedSandstoneStairs, 0.8f }, - { Material.RedSandstoneWall, 0.8f }, - { Material.RedShulkerBox, 2.0f }, - { Material.RedStainedGlass, 0.3f }, - { Material.RedStainedGlassPane, 0.3f }, - { Material.RedTerracotta, 1.25f }, - { Material.RedTulip, 0.0f }, - { Material.RedWallBanner, 1.0f }, - { Material.RedWool, 0.8f }, - { Material.RedstoneBlock, 5.0f }, - { Material.RedstoneLamp, 0.3f }, - { Material.RedstoneOre, 3.0f }, - { Material.RedstoneTorch, 0.0f }, - { Material.RedstoneWallTorch, 0.0f }, - { Material.RedstoneWire, 0.0f }, - { Material.ReinforcedDeepslate, 55.0f }, - { Material.Repeater, 0.0f }, - { Material.RepeatingCommandBlock, -1.0f }, - { Material.ResinBlock, 0.0f }, - { Material.ResinBrickSlab, 1.5f }, - { Material.ResinBrickStairs, 1.5f }, - { Material.ResinBrickWall, 1.5f }, - { Material.ResinBricks, 1.5f }, - { Material.ResinClump, 0.0f }, - { Material.RespawnAnchor, 50.0f }, - { Material.RootedDirt, 0.5f }, - { Material.RoseBush, 0.0f }, - { Material.Sand, 0.5f }, - { Material.Sandstone, 0.8f }, - { Material.SandstoneSlab, 2.0f }, - { Material.SandstoneStairs, 0.8f }, - { Material.SandstoneWall, 0.8f }, - { Material.Scaffolding, 0.0f }, - { Material.Sculk, 0.2f }, - { Material.SculkCatalyst, 3.0f }, - { Material.SculkSensor, 1.5f }, - { Material.SculkShrieker, 3.0f }, - { Material.SculkVein, 0.2f }, - { Material.SeaLantern, 0.3f }, - { Material.SeaPickle, 0.0f }, - { Material.Seagrass, 0.0f }, - { Material.ShortDryGrass, 0.0f }, - { Material.ShortGrass, 0.0f }, - { Material.Shroomlight, 1.0f }, - { Material.ShulkerBox, 2.0f }, - { Material.SkeletonSkull, 1.0f }, - { Material.SkeletonWallSkull, 1.0f }, - { Material.SlimeBlock, 0.0f }, - { Material.SmallAmethystBud, 1.5f }, - { Material.SmallDripleaf, 0.0f }, - { Material.SmithingTable, 2.5f }, - { Material.Smoker, 3.5f }, - { Material.SmoothBasalt, 1.25f }, - { Material.SmoothQuartz, 2.0f }, - { Material.SmoothQuartzSlab, 2.0f }, - { Material.SmoothQuartzStairs, 2.0f }, - { Material.SmoothRedSandstone, 2.0f }, - { Material.SmoothRedSandstoneSlab, 2.0f }, - { Material.SmoothRedSandstoneStairs, 2.0f }, - { Material.SmoothSandstone, 2.0f }, - { Material.SmoothSandstoneSlab, 2.0f }, - { Material.SmoothSandstoneStairs, 2.0f }, - { Material.SmoothStone, 2.0f }, - { Material.SmoothStoneSlab, 2.0f }, - { Material.SnifferEgg, 0.5f }, - { Material.Snow, 0.1f }, - { Material.SnowBlock, 0.2f }, - { Material.SoulCampfire, 2.0f }, - { Material.SoulFire, 0.0f }, - { Material.SoulLantern, 3.5f }, - { Material.SoulSand, 0.5f }, - { Material.SoulSoil, 0.5f }, - { Material.SoulTorch, 0.0f }, - { Material.SoulWallTorch, 0.0f }, - { Material.Spawner, 5.0f }, - { Material.Sponge, 0.6f }, - { Material.SporeBlossom, 0.0f }, - { Material.SpruceButton, 0.5f }, - { Material.SpruceDoor, 3.0f }, - { Material.SpruceFence, 2.0f }, - { Material.SpruceFenceGate, 2.0f }, - { Material.SpruceHangingSign, 1.0f }, - { Material.SpruceLeaves, 0.2f }, - { Material.SpruceLog, 2.0f }, - { Material.SprucePlanks, 2.0f }, - { Material.SprucePressurePlate, 0.5f }, - { Material.SpruceSapling, 0.0f }, - { Material.SpruceShelf, 2.0f }, - { Material.SpruceSign, 1.0f }, - { Material.SpruceSlab, 2.0f }, - { Material.SpruceStairs, 2.0f }, - { Material.SpruceTrapdoor, 3.0f }, - { Material.SpruceWallHangingSign, 1.0f }, - { Material.SpruceWallSign, 1.0f }, - { Material.SpruceWood, 2.0f }, - { Material.StickyPiston, 0.0f }, - { Material.Stone, 1.5f }, - { Material.StoneBrickSlab, 2.0f }, - { Material.StoneBrickStairs, 1.5f }, - { Material.StoneBrickWall, 1.5f }, - { Material.StoneBricks, 1.5f }, - { Material.StoneButton, 0.5f }, - { Material.StonePressurePlate, 0.5f }, - { Material.StoneSlab, 2.0f }, - { Material.StoneStairs, 1.5f }, - { Material.Stonecutter, 3.5f }, - { Material.StrippedAcaciaLog, 2.0f }, - { Material.StrippedAcaciaWood, 2.0f }, - { Material.StrippedBambooBlock, 2.0f }, - { Material.StrippedBirchLog, 2.0f }, - { Material.StrippedBirchWood, 2.0f }, - { Material.StrippedCherryLog, 2.0f }, - { Material.StrippedCherryWood, 2.0f }, - { Material.StrippedCrimsonHyphae, 2.0f }, - { Material.StrippedCrimsonStem, 2.0f }, - { Material.StrippedDarkOakLog, 2.0f }, - { Material.StrippedDarkOakWood, 2.0f }, - { Material.StrippedJungleLog, 2.0f }, - { Material.StrippedJungleWood, 2.0f }, - { Material.StrippedMangroveLog, 2.0f }, - { Material.StrippedMangroveWood, 2.0f }, - { Material.StrippedOakLog, 2.0f }, - { Material.StrippedOakWood, 2.0f }, - { Material.StrippedPaleOakLog, 2.0f }, - { Material.StrippedPaleOakWood, 2.0f }, - { Material.StrippedSpruceLog, 2.0f }, - { Material.StrippedSpruceWood, 2.0f }, - { Material.StrippedWarpedHyphae, 2.0f }, - { Material.StrippedWarpedStem, 2.0f }, - { Material.StructureBlock, -1.0f }, - { Material.StructureVoid, 0.0f }, - { Material.SugarCane, 0.0f }, - { Material.Sunflower, 0.0f }, - { Material.SuspiciousGravel, 0.25f }, - { Material.SuspiciousSand, 0.25f }, - { Material.SweetBerryBush, 0.0f }, - { Material.TallDryGrass, 0.0f }, - { Material.TallGrass, 0.0f }, - { Material.TallSeagrass, 0.0f }, - { Material.Target, 0.5f }, - { Material.Terracotta, 1.25f }, - { Material.TestBlock, -1.0f }, - { Material.TestInstanceBlock, -1.0f }, - { Material.TintedGlass, 0.3f }, - { Material.Tnt, 0.0f }, - { Material.Torch, 0.0f }, - { Material.Torchflower, 0.0f }, - { Material.TorchflowerCrop, 0.0f }, - { Material.TrappedChest, 2.5f }, - { Material.TrialSpawner, 50.0f }, - { Material.Tripwire, 0.0f }, - { Material.TripwireHook, 0.0f }, - { Material.TubeCoral, 0.0f }, - { Material.TubeCoralBlock, 1.5f }, - { Material.TubeCoralFan, 0.0f }, - { Material.TubeCoralWallFan, 0.0f }, - { Material.Tuff, 1.5f }, - { Material.TuffBrickSlab, 1.5f }, - { Material.TuffBrickStairs, 1.5f }, - { Material.TuffBrickWall, 1.5f }, - { Material.TuffBricks, 1.5f }, - { Material.TuffSlab, 1.5f }, - { Material.TuffStairs, 1.5f }, - { Material.TuffWall, 1.5f }, - { Material.TurtleEgg, 0.5f }, - { Material.TwistingVines, 0.0f }, - { Material.TwistingVinesPlant, 0.0f }, - { Material.Vault, 50.0f }, - { Material.VerdantFroglight, 0.3f }, - { Material.Vine, 0.2f }, - { Material.VoidAir, 0.0f }, - { Material.WallTorch, 0.0f }, - { Material.WarpedButton, 0.5f }, - { Material.WarpedDoor, 3.0f }, - { Material.WarpedFence, 2.0f }, - { Material.WarpedFenceGate, 2.0f }, - { Material.WarpedFungus, 0.0f }, - { Material.WarpedHangingSign, 1.0f }, - { Material.WarpedHyphae, 2.0f }, - { Material.WarpedNylium, 0.4f }, - { Material.WarpedPlanks, 2.0f }, - { Material.WarpedPressurePlate, 0.5f }, - { Material.WarpedRoots, 0.0f }, - { Material.WarpedShelf, 2.0f }, - { Material.WarpedSign, 1.0f }, - { Material.WarpedSlab, 2.0f }, - { Material.WarpedStairs, 2.0f }, - { Material.WarpedStem, 2.0f }, - { Material.WarpedTrapdoor, 3.0f }, - { Material.WarpedWallHangingSign, 1.0f }, - { Material.WarpedWallSign, 1.0f }, - { Material.WarpedWartBlock, 1.0f }, - { Material.Water, 100.0f }, - { Material.WaterCauldron, 2.0f }, - { Material.WaxedChiseledCopper, 3.0f }, - { Material.WaxedCopperBlock, 3.0f }, - { Material.WaxedCopperBulb, 3.0f }, - { Material.WaxedCopperChest, 3.0f }, - { Material.WaxedCopperDoor, 3.0f }, - { Material.WaxedCopperGolemStatue, 3.0f }, - { Material.WaxedCopperGrate, 3.0f }, - { Material.WaxedCopperTrapdoor, 3.0f }, - { Material.WaxedCutCopper, 3.0f }, - { Material.WaxedCutCopperSlab, 3.0f }, - { Material.WaxedCutCopperStairs, 3.0f }, - { Material.WaxedExposedChiseledCopper, 3.0f }, - { Material.WaxedExposedCopper, 3.0f }, - { Material.WaxedExposedCopperBulb, 3.0f }, - { Material.WaxedExposedCopperChest, 3.0f }, - { Material.WaxedExposedCopperDoor, 3.0f }, - { Material.WaxedExposedCopperGolemStatue, 3.0f }, - { Material.WaxedExposedCopperGrate, 3.0f }, - { Material.WaxedExposedCopperTrapdoor, 3.0f }, - { Material.WaxedExposedCutCopper, 3.0f }, - { Material.WaxedExposedCutCopperSlab, 3.0f }, - { Material.WaxedExposedCutCopperStairs, 3.0f }, - { Material.WaxedExposedLightningRod, 3.0f }, - { Material.WaxedLightningRod, 3.0f }, - { Material.WaxedOxidizedChiseledCopper, 3.0f }, - { Material.WaxedOxidizedCopper, 3.0f }, - { Material.WaxedOxidizedCopperBulb, 3.0f }, - { Material.WaxedOxidizedCopperChest, 3.0f }, - { Material.WaxedOxidizedCopperDoor, 3.0f }, - { Material.WaxedOxidizedCopperGolemStatue, 3.0f }, - { Material.WaxedOxidizedCopperGrate, 3.0f }, - { Material.WaxedOxidizedCopperTrapdoor, 3.0f }, - { Material.WaxedOxidizedCutCopper, 3.0f }, - { Material.WaxedOxidizedCutCopperSlab, 3.0f }, - { Material.WaxedOxidizedCutCopperStairs, 3.0f }, - { Material.WaxedOxidizedLightningRod, 3.0f }, - { Material.WaxedWeatheredChiseledCopper, 3.0f }, - { Material.WaxedWeatheredCopper, 3.0f }, - { Material.WaxedWeatheredCopperBulb, 3.0f }, - { Material.WaxedWeatheredCopperChest, 3.0f }, - { Material.WaxedWeatheredCopperDoor, 3.0f }, - { Material.WaxedWeatheredCopperGolemStatue, 3.0f }, - { Material.WaxedWeatheredCopperGrate, 3.0f }, - { Material.WaxedWeatheredCopperTrapdoor, 3.0f }, - { Material.WaxedWeatheredCutCopper, 3.0f }, - { Material.WaxedWeatheredCutCopperSlab, 3.0f }, - { Material.WaxedWeatheredCutCopperStairs, 3.0f }, - { Material.WaxedWeatheredLightningRod, 3.0f }, - { Material.WeatheredChiseledCopper, 3.0f }, - { Material.WeatheredCopper, 3.0f }, - { Material.WeatheredCopperBulb, 3.0f }, - { Material.WeatheredCopperChest, 3.0f }, - { Material.WeatheredCopperDoor, 3.0f }, - { Material.WeatheredCopperGolemStatue, 3.0f }, - { Material.WeatheredCopperGrate, 3.0f }, - { Material.WeatheredCopperTrapdoor, 3.0f }, - { Material.WeatheredCutCopper, 3.0f }, - { Material.WeatheredCutCopperSlab, 3.0f }, - { Material.WeatheredCutCopperStairs, 3.0f }, - { Material.WeatheredLightningRod, 3.0f }, - { Material.WeepingVines, 0.0f }, - { Material.WeepingVinesPlant, 0.0f }, - { Material.WetSponge, 0.6f }, - { Material.Wheat, 0.0f }, - { Material.WhiteBanner, 1.0f }, - { Material.WhiteBed, 0.2f }, - { Material.WhiteCandle, 0.1f }, - { Material.WhiteCandleCake, 0.5f }, - { Material.WhiteCarpet, 0.1f }, - { Material.WhiteConcrete, 1.8f }, - { Material.WhiteConcretePowder, 0.5f }, - { Material.WhiteGlazedTerracotta, 1.4f }, - { Material.WhiteShulkerBox, 2.0f }, - { Material.WhiteStainedGlass, 0.3f }, - { Material.WhiteStainedGlassPane, 0.3f }, - { Material.WhiteTerracotta, 1.25f }, - { Material.WhiteTulip, 0.0f }, - { Material.WhiteWallBanner, 1.0f }, - { Material.WhiteWool, 0.8f }, - { Material.Wildflowers, 0.0f }, - { Material.WitherRose, 0.0f }, - { Material.WitherSkeletonSkull, 1.0f }, - { Material.WitherSkeletonWallSkull, 1.0f }, - { Material.YellowBanner, 1.0f }, - { Material.YellowBed, 0.2f }, - { Material.YellowCandle, 0.1f }, - { Material.YellowCandleCake, 0.5f }, - { Material.YellowCarpet, 0.1f }, - { Material.YellowConcrete, 1.8f }, - { Material.YellowConcretePowder, 0.5f }, - { Material.YellowGlazedTerracotta, 1.4f }, - { Material.YellowShulkerBox, 2.0f }, - { Material.YellowStainedGlass, 0.3f }, - { Material.YellowStainedGlassPane, 0.3f }, - { Material.YellowTerracotta, 1.25f }, - { Material.YellowWallBanner, 1.0f }, - { Material.YellowWool, 0.8f }, - { Material.ZombieHead, 1.0f }, - { Material.ZombieWallHead, 1.0f }, - }.ToFrozenDictionary(); - - private static readonly FrozenSet RequiresCorrectToolSet = new HashSet - { - Material.AmethystBlock, - Material.AncientDebris, - Material.Andesite, - Material.AndesiteSlab, - Material.AndesiteStairs, - Material.AndesiteWall, - Material.Anvil, - Material.Basalt, - Material.BlackConcrete, - Material.BlackGlazedTerracotta, - Material.BlackTerracotta, - Material.Blackstone, - Material.BlackstoneSlab, - Material.BlackstoneStairs, - Material.BlackstoneWall, - Material.BlastFurnace, - Material.BlueConcrete, - Material.BlueGlazedTerracotta, - Material.BlueTerracotta, - Material.BoneBlock, - Material.BrainCoralBlock, - Material.BrickSlab, - Material.BrickStairs, - Material.BrickWall, - Material.Bricks, - Material.BrownConcrete, - Material.BrownGlazedTerracotta, - Material.BrownTerracotta, - Material.BubbleCoralBlock, - Material.BuddingAmethyst, - Material.Calcite, - Material.Cauldron, - Material.ChainCommandBlock, - Material.ChippedAnvil, - Material.ChiseledCopper, - Material.ChiseledDeepslate, - Material.ChiseledNetherBricks, - Material.ChiseledPolishedBlackstone, - Material.ChiseledQuartzBlock, - Material.ChiseledRedSandstone, - Material.ChiseledResinBricks, - Material.ChiseledSandstone, - Material.ChiseledStoneBricks, - Material.ChiseledTuff, - Material.ChiseledTuffBricks, - Material.CoalBlock, - Material.CoalOre, - Material.CobbledDeepslate, - Material.CobbledDeepslateSlab, - Material.CobbledDeepslateStairs, - Material.CobbledDeepslateWall, - Material.Cobblestone, - Material.CobblestoneSlab, - Material.CobblestoneStairs, - Material.CobblestoneWall, - Material.Cobweb, - Material.CommandBlock, - Material.CopperBlock, - Material.CopperBulb, - Material.CopperChest, - Material.CopperGrate, - Material.CopperOre, - Material.CopperTrapdoor, - Material.CrackedDeepslateBricks, - Material.CrackedDeepslateTiles, - Material.CrackedNetherBricks, - Material.CrackedPolishedBlackstoneBricks, - Material.CrackedStoneBricks, - Material.CrimsonNylium, - Material.CryingObsidian, - Material.CutCopper, - Material.CutCopperSlab, - Material.CutCopperStairs, - Material.CutRedSandstone, - Material.CutRedSandstoneSlab, - Material.CutSandstone, - Material.CutSandstoneSlab, - Material.CyanConcrete, - Material.CyanGlazedTerracotta, - Material.CyanTerracotta, - Material.DamagedAnvil, - Material.DarkPrismarine, - Material.DarkPrismarineSlab, - Material.DarkPrismarineStairs, - Material.DeadBrainCoral, - Material.DeadBrainCoralBlock, - Material.DeadBrainCoralFan, - Material.DeadBrainCoralWallFan, - Material.DeadBubbleCoral, - Material.DeadBubbleCoralBlock, - Material.DeadBubbleCoralFan, - Material.DeadBubbleCoralWallFan, - Material.DeadFireCoral, - Material.DeadFireCoralBlock, - Material.DeadFireCoralFan, - Material.DeadFireCoralWallFan, - Material.DeadHornCoral, - Material.DeadHornCoralBlock, - Material.DeadHornCoralFan, - Material.DeadHornCoralWallFan, - Material.DeadTubeCoral, - Material.DeadTubeCoralBlock, - Material.DeadTubeCoralFan, - Material.DeadTubeCoralWallFan, - Material.Deepslate, - Material.DeepslateBrickSlab, - Material.DeepslateBrickStairs, - Material.DeepslateBrickWall, - Material.DeepslateBricks, - Material.DeepslateCoalOre, - Material.DeepslateCopperOre, - Material.DeepslateDiamondOre, - Material.DeepslateEmeraldOre, - Material.DeepslateGoldOre, - Material.DeepslateIronOre, - Material.DeepslateLapisOre, - Material.DeepslateRedstoneOre, - Material.DeepslateTileSlab, - Material.DeepslateTileStairs, - Material.DeepslateTileWall, - Material.DeepslateTiles, - Material.DiamondBlock, - Material.DiamondOre, - Material.Diorite, - Material.DioriteSlab, - Material.DioriteStairs, - Material.DioriteWall, - Material.Dispenser, - Material.DripstoneBlock, - Material.Dropper, - Material.EmeraldBlock, - Material.EmeraldOre, - Material.EnchantingTable, - Material.EndStone, - Material.EndStoneBrickSlab, - Material.EndStoneBrickStairs, - Material.EndStoneBrickWall, - Material.EndStoneBricks, - Material.ExposedChiseledCopper, - Material.ExposedCopper, - Material.ExposedCopperBulb, - Material.ExposedCopperChest, - Material.ExposedCopperGrate, - Material.ExposedCopperTrapdoor, - Material.ExposedCutCopper, - Material.ExposedCutCopperSlab, - Material.ExposedCutCopperStairs, - Material.ExposedLightningRod, - Material.FireCoralBlock, - Material.Furnace, - Material.GildedBlackstone, - Material.GoldBlock, - Material.GoldOre, - Material.Granite, - Material.GraniteSlab, - Material.GraniteStairs, - Material.GraniteWall, - Material.GrayConcrete, - Material.GrayGlazedTerracotta, - Material.GrayTerracotta, - Material.GreenConcrete, - Material.GreenGlazedTerracotta, - Material.GreenTerracotta, - Material.Grindstone, - Material.Hopper, - Material.HornCoralBlock, - Material.IronBars, - Material.IronBlock, - Material.IronChain, - Material.IronOre, - Material.IronTrapdoor, - Material.Jigsaw, - Material.LapisBlock, - Material.LapisOre, - Material.LavaCauldron, - Material.LightBlueConcrete, - Material.LightBlueGlazedTerracotta, - Material.LightBlueTerracotta, - Material.LightGrayConcrete, - Material.LightGrayGlazedTerracotta, - Material.LightGrayTerracotta, - Material.LightningRod, - Material.LimeConcrete, - Material.LimeGlazedTerracotta, - Material.LimeTerracotta, - Material.Lodestone, - Material.MagentaConcrete, - Material.MagentaGlazedTerracotta, - Material.MagentaTerracotta, - Material.MagmaBlock, - Material.MossyCobblestone, - Material.MossyCobblestoneSlab, - Material.MossyCobblestoneStairs, - Material.MossyCobblestoneWall, - Material.MossyStoneBrickSlab, - Material.MossyStoneBrickStairs, - Material.MossyStoneBrickWall, - Material.MossyStoneBricks, - Material.MudBrickSlab, - Material.MudBrickStairs, - Material.MudBrickWall, - Material.MudBricks, - Material.NetherBrickFence, - Material.NetherBrickSlab, - Material.NetherBrickStairs, - Material.NetherBrickWall, - Material.NetherBricks, - Material.NetherGoldOre, - Material.NetherQuartzOre, - Material.NetheriteBlock, - Material.Netherrack, - Material.Observer, - Material.Obsidian, - Material.OrangeConcrete, - Material.OrangeGlazedTerracotta, - Material.OrangeTerracotta, - Material.OxidizedChiseledCopper, - Material.OxidizedCopper, - Material.OxidizedCopperBulb, - Material.OxidizedCopperChest, - Material.OxidizedCopperGrate, - Material.OxidizedCopperTrapdoor, - Material.OxidizedCutCopper, - Material.OxidizedCutCopperSlab, - Material.OxidizedCutCopperStairs, - Material.OxidizedLightningRod, - Material.PetrifiedOakSlab, - Material.PinkConcrete, - Material.PinkGlazedTerracotta, - Material.PinkTerracotta, - Material.PolishedAndesite, - Material.PolishedAndesiteSlab, - Material.PolishedAndesiteStairs, - Material.PolishedBasalt, - Material.PolishedBlackstone, - Material.PolishedBlackstoneBrickSlab, - Material.PolishedBlackstoneBrickStairs, - Material.PolishedBlackstoneBrickWall, - Material.PolishedBlackstoneBricks, - Material.PolishedBlackstoneSlab, - Material.PolishedBlackstoneStairs, - Material.PolishedBlackstoneWall, - Material.PolishedDeepslate, - Material.PolishedDeepslateSlab, - Material.PolishedDeepslateStairs, - Material.PolishedDeepslateWall, - Material.PolishedDiorite, - Material.PolishedDioriteSlab, - Material.PolishedDioriteStairs, - Material.PolishedGranite, - Material.PolishedGraniteSlab, - Material.PolishedGraniteStairs, - Material.PolishedTuff, - Material.PolishedTuffSlab, - Material.PolishedTuffStairs, - Material.PolishedTuffWall, - Material.PowderSnowCauldron, - Material.Prismarine, - Material.PrismarineBrickSlab, - Material.PrismarineBrickStairs, - Material.PrismarineBricks, - Material.PrismarineSlab, - Material.PrismarineStairs, - Material.PrismarineWall, - Material.PurpleConcrete, - Material.PurpleGlazedTerracotta, - Material.PurpleTerracotta, - Material.PurpurBlock, - Material.PurpurPillar, - Material.PurpurSlab, - Material.PurpurStairs, - Material.QuartzBlock, - Material.QuartzBricks, - Material.QuartzPillar, - Material.QuartzSlab, - Material.QuartzStairs, - Material.RawCopperBlock, - Material.RawGoldBlock, - Material.RawIronBlock, - Material.RedConcrete, - Material.RedGlazedTerracotta, - Material.RedNetherBrickSlab, - Material.RedNetherBrickStairs, - Material.RedNetherBrickWall, - Material.RedNetherBricks, - Material.RedSandstone, - Material.RedSandstoneSlab, - Material.RedSandstoneStairs, - Material.RedSandstoneWall, - Material.RedTerracotta, - Material.RedstoneBlock, - Material.RedstoneOre, - Material.RepeatingCommandBlock, - Material.ResinBrickSlab, - Material.ResinBrickStairs, - Material.ResinBrickWall, - Material.ResinBricks, - Material.RespawnAnchor, - Material.Sandstone, - Material.SandstoneSlab, - Material.SandstoneStairs, - Material.SandstoneWall, - Material.Smoker, - Material.SmoothBasalt, - Material.SmoothQuartz, - Material.SmoothQuartzSlab, - Material.SmoothQuartzStairs, - Material.SmoothRedSandstone, - Material.SmoothRedSandstoneSlab, - Material.SmoothRedSandstoneStairs, - Material.SmoothSandstone, - Material.SmoothSandstoneSlab, - Material.SmoothSandstoneStairs, - Material.SmoothStone, - Material.SmoothStoneSlab, - Material.Snow, - Material.SnowBlock, - Material.Spawner, - Material.Stone, - Material.StoneBrickSlab, - Material.StoneBrickStairs, - Material.StoneBrickWall, - Material.StoneBricks, - Material.StoneSlab, - Material.StoneStairs, - Material.Stonecutter, - Material.StructureBlock, - Material.Terracotta, - Material.TubeCoralBlock, - Material.Tuff, - Material.TuffBrickSlab, - Material.TuffBrickStairs, - Material.TuffBrickWall, - Material.TuffBricks, - Material.TuffSlab, - Material.TuffStairs, - Material.TuffWall, - Material.WarpedNylium, - Material.WaterCauldron, - Material.WaxedChiseledCopper, - Material.WaxedCopperBlock, - Material.WaxedCopperBulb, - Material.WaxedCopperChest, - Material.WaxedCopperGrate, - Material.WaxedCopperTrapdoor, - Material.WaxedCutCopper, - Material.WaxedCutCopperSlab, - Material.WaxedCutCopperStairs, - Material.WaxedExposedChiseledCopper, - Material.WaxedExposedCopper, - Material.WaxedExposedCopperBulb, - Material.WaxedExposedCopperChest, - Material.WaxedExposedCopperGrate, - Material.WaxedExposedCopperTrapdoor, - Material.WaxedExposedCutCopper, - Material.WaxedExposedCutCopperSlab, - Material.WaxedExposedCutCopperStairs, - Material.WaxedExposedLightningRod, - Material.WaxedLightningRod, - Material.WaxedOxidizedChiseledCopper, - Material.WaxedOxidizedCopper, - Material.WaxedOxidizedCopperBulb, - Material.WaxedOxidizedCopperChest, - Material.WaxedOxidizedCopperGrate, - Material.WaxedOxidizedCopperTrapdoor, - Material.WaxedOxidizedCutCopper, - Material.WaxedOxidizedCutCopperSlab, - Material.WaxedOxidizedCutCopperStairs, - Material.WaxedOxidizedLightningRod, - Material.WaxedWeatheredChiseledCopper, - Material.WaxedWeatheredCopper, - Material.WaxedWeatheredCopperBulb, - Material.WaxedWeatheredCopperChest, - Material.WaxedWeatheredCopperGrate, - Material.WaxedWeatheredCopperTrapdoor, - Material.WaxedWeatheredCutCopper, - Material.WaxedWeatheredCutCopperSlab, - Material.WaxedWeatheredCutCopperStairs, - Material.WaxedWeatheredLightningRod, - Material.WeatheredChiseledCopper, - Material.WeatheredCopper, - Material.WeatheredCopperBulb, - Material.WeatheredCopperChest, - Material.WeatheredCopperGrate, - Material.WeatheredCopperTrapdoor, - Material.WeatheredCutCopper, - Material.WeatheredCutCopperSlab, - Material.WeatheredCutCopperStairs, - Material.WeatheredLightningRod, - Material.WhiteConcrete, - Material.WhiteGlazedTerracotta, - Material.WhiteTerracotta, - Material.YellowConcrete, - Material.YellowGlazedTerracotta, - Material.YellowTerracotta, - }.ToFrozenSet(); - } -} diff --git a/MinecraftClient/Mapping/BlockPalettes/BlockPalette.cs b/MinecraftClient/Mapping/BlockPalettes/BlockPalette.cs deleted file mode 100644 index 41d24caa7d..0000000000 --- a/MinecraftClient/Mapping/BlockPalettes/BlockPalette.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.BlockPalettes -{ - public abstract class BlockPalette - { - /// - /// Get mapping dictionary. Must be overriden with proper implementation. - /// - /// Palette dictionary - protected abstract Dictionary GetDict(); - - /// - /// Get material from block ID or block state ID - /// - /// Block ID (up to MC 1.12) or block state (MC 1.13+) - /// Material corresponding to the specified ID - public Material FromId(int id) - { - Dictionary materials = GetDict(); - if (materials.ContainsKey(id)) - return materials[id]; - return Material.Air; - } - - /// - /// Get block-state properties for a modern block state ID. - /// - /// Raw block state ID. - /// Block-state property names and values, or an empty map when unavailable. - public IReadOnlyDictionary GetStateProperties(int stateId) - { - BlockStateDefinition[] definitions = GetStateDefinitions(); - int low = 0; - int high = definitions.Length - 1; - - while (low <= high) - { - int middle = low + ((high - low) / 2); - BlockStateDefinition definition = definitions[middle]; - if (stateId < definition.FirstStateId) - { - high = middle - 1; - } - else if (stateId > definition.LastStateId) - { - low = middle + 1; - } - else - { - return definition.GetProperties(stateId); - } - } - - return BlockStateDefinition.EmptyProperties; - } - - /// - /// Get compact block-state definitions sorted by their first state ID. - /// - protected virtual BlockStateDefinition[] GetStateDefinitions() - { - return Array.Empty(); - } - - /// - /// Returns TRUE if block ID uses old metadata encoding with ID and Meta inside one ushort - /// Only Palette112 should override this. - /// - public virtual bool IdHasMetadata - { - get - { - return false; - } - } - } -} diff --git a/MinecraftClient/Mapping/BlockPalettes/BlockPalette120.cs b/MinecraftClient/Mapping/BlockPalettes/BlockPalette120.cs deleted file mode 100644 index fc85d5a85b..0000000000 --- a/MinecraftClient/Mapping/BlockPalettes/BlockPalette120.cs +++ /dev/null @@ -1,5148 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.BlockPalettes -{ - public class Palette120 : BlockPalette - { - private static readonly Dictionary materials = new(); - - static Palette120() - { - for (int i = 8707; i <= 8730; i++) - materials[i] = Material.AcaciaButton; - for (int i = 11873; i <= 11936; i++) - materials[i] = Material.AcaciaDoor; - for (int i = 11521; i <= 11552; i++) - materials[i] = Material.AcaciaFence; - for (int i = 11265; i <= 11296; i++) - materials[i] = Material.AcaciaFenceGate; - for (int i = 5026; i <= 5089; i++) - materials[i] = Material.AcaciaHangingSign; - for (int i = 349; i <= 376; i++) - materials[i] = Material.AcaciaLeaves; - for (int i = 142; i <= 144; i++) - materials[i] = Material.AcaciaLog; - materials[19] = Material.AcaciaPlanks; - for (int i = 5724; i <= 5725; i++) - materials[i] = Material.AcaciaPressurePlate; - for (int i = 33; i <= 34; i++) - materials[i] = Material.AcaciaSapling; - for (int i = 4398; i <= 4429; i++) - materials[i] = Material.AcaciaSign; - for (int i = 11045; i <= 11050; i++) - materials[i] = Material.AcaciaSlab; - for (int i = 9744; i <= 9823; i++) - materials[i] = Material.AcaciaStairs; - for (int i = 6218; i <= 6281; i++) - materials[i] = Material.AcaciaTrapdoor; - for (int i = 5562; i <= 5569; i++) - materials[i] = Material.AcaciaWallHangingSign; - for (int i = 4786; i <= 4793; i++) - materials[i] = Material.AcaciaWallSign; - for (int i = 201; i <= 203; i++) - materials[i] = Material.AcaciaWood; - for (int i = 9180; i <= 9203; i++) - materials[i] = Material.ActivatorRail; - materials[0] = Material.Air; - materials[2079] = Material.Allium; - materials[20890] = Material.AmethystBlock; - for (int i = 20892; i <= 20903; i++) - materials[i] = Material.AmethystCluster; - materials[19307] = Material.AncientDebris; - materials[6] = Material.Andesite; - for (int i = 13995; i <= 14000; i++) - materials[i] = Material.AndesiteSlab; - for (int i = 13621; i <= 13700; i++) - materials[i] = Material.AndesiteStairs; - for (int i = 16611; i <= 16934; i++) - materials[i] = Material.AndesiteWall; - for (int i = 8967; i <= 8970; i++) - materials[i] = Material.Anvil; - for (int i = 6817; i <= 6820; i++) - materials[i] = Material.AttachedMelonStem; - for (int i = 6813; i <= 6816; i++) - materials[i] = Material.AttachedPumpkinStem; - materials[22369] = Material.Azalea; - for (int i = 461; i <= 488; i++) - materials[i] = Material.AzaleaLeaves; - materials[2080] = Material.AzureBluet; - for (int i = 12804; i <= 12815; i++) - materials[i] = Material.Bamboo; - for (int i = 159; i <= 161; i++) - materials[i] = Material.BambooBlock; - for (int i = 8803; i <= 8826; i++) - materials[i] = Material.BambooButton; - for (int i = 12129; i <= 12192; i++) - materials[i] = Material.BambooDoor; - for (int i = 11649; i <= 11680; i++) - materials[i] = Material.BambooFence; - for (int i = 11393; i <= 11424; i++) - materials[i] = Material.BambooFenceGate; - for (int i = 5474; i <= 5537; i++) - materials[i] = Material.BambooHangingSign; - materials[24] = Material.BambooMosaic; - for (int i = 11075; i <= 11080; i++) - materials[i] = Material.BambooMosaicSlab; - for (int i = 10144; i <= 10223; i++) - materials[i] = Material.BambooMosaicStairs; - materials[23] = Material.BambooPlanks; - for (int i = 5732; i <= 5733; i++) - materials[i] = Material.BambooPressurePlate; - materials[12803] = Material.BambooSapling; - for (int i = 4558; i <= 4589; i++) - materials[i] = Material.BambooSign; - for (int i = 11069; i <= 11074; i++) - materials[i] = Material.BambooSlab; - for (int i = 10064; i <= 10143; i++) - materials[i] = Material.BambooStairs; - for (int i = 6474; i <= 6537; i++) - materials[i] = Material.BambooTrapdoor; - for (int i = 5618; i <= 5625; i++) - materials[i] = Material.BambooWallHangingSign; - for (int i = 4826; i <= 4833; i++) - materials[i] = Material.BambooWallSign; - for (int i = 18267; i <= 18278; i++) - materials[i] = Material.Barrel; - materials[10225] = Material.Barrier; - for (int i = 5853; i <= 5855; i++) - materials[i] = Material.Basalt; - materials[7918] = Material.Beacon; - materials[79] = Material.Bedrock; - for (int i = 19256; i <= 19279; i++) - materials[i] = Material.BeeNest; - for (int i = 19280; i <= 19303; i++) - materials[i] = Material.Beehive; - for (int i = 12368; i <= 12371; i++) - materials[i] = Material.Beetroots; - for (int i = 18330; i <= 18361; i++) - materials[i] = Material.Bell; - for (int i = 22389; i <= 22420; i++) - materials[i] = Material.BigDripleaf; - for (int i = 22421; i <= 22428; i++) - materials[i] = Material.BigDripleafStem; - for (int i = 8659; i <= 8682; i++) - materials[i] = Material.BirchButton; - for (int i = 11745; i <= 11808; i++) - materials[i] = Material.BirchDoor; - for (int i = 11457; i <= 11488; i++) - materials[i] = Material.BirchFence; - for (int i = 11201; i <= 11232; i++) - materials[i] = Material.BirchFenceGate; - for (int i = 4962; i <= 5025; i++) - materials[i] = Material.BirchHangingSign; - for (int i = 293; i <= 320; i++) - materials[i] = Material.BirchLeaves; - for (int i = 136; i <= 138; i++) - materials[i] = Material.BirchLog; - materials[17] = Material.BirchPlanks; - for (int i = 5720; i <= 5721; i++) - materials[i] = Material.BirchPressurePlate; - for (int i = 29; i <= 30; i++) - materials[i] = Material.BirchSapling; - for (int i = 4366; i <= 4397; i++) - materials[i] = Material.BirchSign; - for (int i = 11033; i <= 11038; i++) - materials[i] = Material.BirchSlab; - for (int i = 7746; i <= 7825; i++) - materials[i] = Material.BirchStairs; - for (int i = 6090; i <= 6153; i++) - materials[i] = Material.BirchTrapdoor; - for (int i = 5554; i <= 5561; i++) - materials[i] = Material.BirchWallHangingSign; - for (int i = 4778; i <= 4785; i++) - materials[i] = Material.BirchWallSign; - for (int i = 195; i <= 197; i++) - materials[i] = Material.BirchWood; - for (int i = 10858; i <= 10873; i++) - materials[i] = Material.BlackBanner; - for (int i = 1928; i <= 1943; i++) - materials[i] = Material.BlackBed; - for (int i = 20840; i <= 20855; i++) - materials[i] = Material.BlackCandle; - for (int i = 20888; i <= 20889; i++) - materials[i] = Material.BlackCandleCake; - materials[10602] = Material.BlackCarpet; - materials[12602] = Material.BlackConcrete; - materials[12618] = Material.BlackConcretePowder; - for (int i = 12583; i <= 12586; i++) - materials[i] = Material.BlackGlazedTerracotta; - for (int i = 12517; i <= 12522; i++) - materials[i] = Material.BlackShulkerBox; - materials[5961] = Material.BlackStainedGlass; - for (int i = 9712; i <= 9743; i++) - materials[i] = Material.BlackStainedGlassPane; - materials[9231] = Material.BlackTerracotta; - for (int i = 10934; i <= 10937; i++) - materials[i] = Material.BlackWallBanner; - materials[2062] = Material.BlackWool; - materials[19319] = Material.Blackstone; - for (int i = 19724; i <= 19729; i++) - materials[i] = Material.BlackstoneSlab; - for (int i = 19320; i <= 19399; i++) - materials[i] = Material.BlackstoneStairs; - for (int i = 19400; i <= 19723; i++) - materials[i] = Material.BlackstoneWall; - for (int i = 18287; i <= 18294; i++) - materials[i] = Material.BlastFurnace; - for (int i = 10794; i <= 10809; i++) - materials[i] = Material.BlueBanner; - for (int i = 1864; i <= 1879; i++) - materials[i] = Material.BlueBed; - for (int i = 20776; i <= 20791; i++) - materials[i] = Material.BlueCandle; - for (int i = 20880; i <= 20881; i++) - materials[i] = Material.BlueCandleCake; - materials[10598] = Material.BlueCarpet; - materials[12598] = Material.BlueConcrete; - materials[12614] = Material.BlueConcretePowder; - for (int i = 12567; i <= 12570; i++) - materials[i] = Material.BlueGlazedTerracotta; - materials[12800] = Material.BlueIce; - materials[2078] = Material.BlueOrchid; - for (int i = 12493; i <= 12498; i++) - materials[i] = Material.BlueShulkerBox; - materials[5957] = Material.BlueStainedGlass; - for (int i = 9584; i <= 9615; i++) - materials[i] = Material.BlueStainedGlassPane; - materials[9227] = Material.BlueTerracotta; - for (int i = 10918; i <= 10921; i++) - materials[i] = Material.BlueWallBanner; - materials[2058] = Material.BlueWool; - for (int i = 12405; i <= 12407; i++) - materials[i] = Material.BoneBlock; - materials[2096] = Material.Bookshelf; - for (int i = 12684; i <= 12685; i++) - materials[i] = Material.BrainCoral; - materials[12668] = Material.BrainCoralBlock; - for (int i = 12704; i <= 12705; i++) - materials[i] = Material.BrainCoralFan; - for (int i = 12760; i <= 12767; i++) - materials[i] = Material.BrainCoralWallFan; - for (int i = 7390; i <= 7397; i++) - materials[i] = Material.BrewingStand; - for (int i = 11117; i <= 11122; i++) - materials[i] = Material.BrickSlab; - for (int i = 7029; i <= 7108; i++) - materials[i] = Material.BrickStairs; - for (int i = 14019; i <= 14342; i++) - materials[i] = Material.BrickWall; - materials[2093] = Material.Bricks; - for (int i = 10810; i <= 10825; i++) - materials[i] = Material.BrownBanner; - for (int i = 1880; i <= 1895; i++) - materials[i] = Material.BrownBed; - for (int i = 20792; i <= 20807; i++) - materials[i] = Material.BrownCandle; - for (int i = 20882; i <= 20883; i++) - materials[i] = Material.BrownCandleCake; - materials[10599] = Material.BrownCarpet; - materials[12599] = Material.BrownConcrete; - materials[12615] = Material.BrownConcretePowder; - for (int i = 12571; i <= 12574; i++) - materials[i] = Material.BrownGlazedTerracotta; - materials[2089] = Material.BrownMushroom; - for (int i = 6550; i <= 6613; i++) - materials[i] = Material.BrownMushroomBlock; - for (int i = 12499; i <= 12504; i++) - materials[i] = Material.BrownShulkerBox; - materials[5958] = Material.BrownStainedGlass; - for (int i = 9616; i <= 9647; i++) - materials[i] = Material.BrownStainedGlassPane; - materials[9228] = Material.BrownTerracotta; - for (int i = 10922; i <= 10925; i++) - materials[i] = Material.BrownWallBanner; - materials[2059] = Material.BrownWool; - for (int i = 12819; i <= 12820; i++) - materials[i] = Material.BubbleColumn; - for (int i = 12686; i <= 12687; i++) - materials[i] = Material.BubbleCoral; - materials[12669] = Material.BubbleCoralBlock; - for (int i = 12706; i <= 12707; i++) - materials[i] = Material.BubbleCoralFan; - for (int i = 12768; i <= 12775; i++) - materials[i] = Material.BubbleCoralWallFan; - materials[20891] = Material.BuddingAmethyst; - for (int i = 5782; i <= 5797; i++) - materials[i] = Material.Cactus; - for (int i = 5875; i <= 5881; i++) - materials[i] = Material.Cake; - materials[20941] = Material.Calcite; - for (int i = 21040; i <= 21423; i++) - materials[i] = Material.CalibratedSculkSensor; - for (int i = 18370; i <= 18401; i++) - materials[i] = Material.Campfire; - for (int i = 20584; i <= 20599; i++) - materials[i] = Material.Candle; - for (int i = 20856; i <= 20857; i++) - materials[i] = Material.CandleCake; - for (int i = 8595; i <= 8602; i++) - materials[i] = Material.Carrots; - materials[18295] = Material.CartographyTable; - for (int i = 5867; i <= 5870; i++) - materials[i] = Material.CarvedPumpkin; - materials[7398] = Material.Cauldron; - materials[12818] = Material.CaveAir; - for (int i = 22314; i <= 22365; i++) - materials[i] = Material.CaveVines; - for (int i = 22366; i <= 22367; i++) - materials[i] = Material.CaveVinesPlant; - for (int i = 6774; i <= 6779; i++) - materials[i] = Material.Chain; - for (int i = 12386; i <= 12397; i++) - materials[i] = Material.ChainCommandBlock; - for (int i = 8731; i <= 8754; i++) - materials[i] = Material.CherryButton; - for (int i = 11937; i <= 12000; i++) - materials[i] = Material.CherryDoor; - for (int i = 11553; i <= 11584; i++) - materials[i] = Material.CherryFence; - for (int i = 11297; i <= 11328; i++) - materials[i] = Material.CherryFenceGate; - for (int i = 5090; i <= 5153; i++) - materials[i] = Material.CherryHangingSign; - for (int i = 377; i <= 404; i++) - materials[i] = Material.CherryLeaves; - for (int i = 145; i <= 147; i++) - materials[i] = Material.CherryLog; - materials[20] = Material.CherryPlanks; - for (int i = 5726; i <= 5727; i++) - materials[i] = Material.CherryPressurePlate; - for (int i = 35; i <= 36; i++) - materials[i] = Material.CherrySapling; - for (int i = 4430; i <= 4461; i++) - materials[i] = Material.CherrySign; - for (int i = 11051; i <= 11056; i++) - materials[i] = Material.CherrySlab; - for (int i = 9824; i <= 9903; i++) - materials[i] = Material.CherryStairs; - for (int i = 6282; i <= 6345; i++) - materials[i] = Material.CherryTrapdoor; - for (int i = 5570; i <= 5577; i++) - materials[i] = Material.CherryWallHangingSign; - for (int i = 4794; i <= 4801; i++) - materials[i] = Material.CherryWallSign; - for (int i = 204; i <= 206; i++) - materials[i] = Material.CherryWood; - for (int i = 2954; i <= 2977; i++) - materials[i] = Material.Chest; - for (int i = 8971; i <= 8974; i++) - materials[i] = Material.ChippedAnvil; - for (int i = 2097; i <= 2352; i++) - materials[i] = Material.ChiseledBookshelf; - materials[24096] = Material.ChiseledDeepslate; - materials[20581] = Material.ChiseledNetherBricks; - materials[19733] = Material.ChiseledPolishedBlackstone; - materials[9096] = Material.ChiseledQuartzBlock; - materials[10939] = Material.ChiseledRedSandstone; - materials[536] = Material.ChiseledSandstone; - materials[6541] = Material.ChiseledStoneBricks; - for (int i = 12263; i <= 12268; i++) - materials[i] = Material.ChorusFlower; - for (int i = 12199; i <= 12262; i++) - materials[i] = Material.ChorusPlant; - materials[5798] = Material.Clay; - materials[10604] = Material.CoalBlock; - materials[127] = Material.CoalOre; - materials[11] = Material.CoarseDirt; - materials[22452] = Material.CobbledDeepslate; - for (int i = 22533; i <= 22538; i++) - materials[i] = Material.CobbledDeepslateSlab; - for (int i = 22453; i <= 22532; i++) - materials[i] = Material.CobbledDeepslateStairs; - for (int i = 22539; i <= 22862; i++) - materials[i] = Material.CobbledDeepslateWall; - materials[14] = Material.Cobblestone; - for (int i = 11111; i <= 11116; i++) - materials[i] = Material.CobblestoneSlab; - for (int i = 4682; i <= 4761; i++) - materials[i] = Material.CobblestoneStairs; - for (int i = 7919; i <= 8242; i++) - materials[i] = Material.CobblestoneWall; - materials[2004] = Material.Cobweb; - for (int i = 7419; i <= 7430; i++) - materials[i] = Material.Cocoa; - for (int i = 7906; i <= 7917; i++) - materials[i] = Material.CommandBlock; - for (int i = 9035; i <= 9050; i++) - materials[i] = Material.Comparator; - for (int i = 19231; i <= 19239; i++) - materials[i] = Material.Composter; - for (int i = 12801; i <= 12802; i++) - materials[i] = Material.Conduit; - materials[21566] = Material.CopperBlock; - materials[21567] = Material.CopperOre; - materials[2086] = Material.Cornflower; - materials[24097] = Material.CrackedDeepslateBricks; - materials[24098] = Material.CrackedDeepslateTiles; - materials[20582] = Material.CrackedNetherBricks; - materials[19732] = Material.CrackedPolishedBlackstoneBricks; - materials[6540] = Material.CrackedStoneBricks; - materials[4277] = Material.CraftingTable; - for (int i = 8907; i <= 8922; i++) - materials[i] = Material.CreeperHead; - for (int i = 8923; i <= 8926; i++) - materials[i] = Material.CreeperWallHead; - for (int i = 18959; i <= 18982; i++) - materials[i] = Material.CrimsonButton; - for (int i = 19007; i <= 19070; i++) - materials[i] = Material.CrimsonDoor; - for (int i = 18543; i <= 18574; i++) - materials[i] = Material.CrimsonFence; - for (int i = 18735; i <= 18766; i++) - materials[i] = Material.CrimsonFenceGate; - materials[18468] = Material.CrimsonFungus; - for (int i = 5282; i <= 5345; i++) - materials[i] = Material.CrimsonHangingSign; - for (int i = 18461; i <= 18463; i++) - materials[i] = Material.CrimsonHyphae; - materials[18467] = Material.CrimsonNylium; - materials[18525] = Material.CrimsonPlanks; - for (int i = 18539; i <= 18540; i++) - materials[i] = Material.CrimsonPressurePlate; - materials[18524] = Material.CrimsonRoots; - for (int i = 19135; i <= 19166; i++) - materials[i] = Material.CrimsonSign; - for (int i = 18527; i <= 18532; i++) - materials[i] = Material.CrimsonSlab; - for (int i = 18799; i <= 18878; i++) - materials[i] = Material.CrimsonStairs; - for (int i = 18455; i <= 18457; i++) - materials[i] = Material.CrimsonStem; - for (int i = 18607; i <= 18670; i++) - materials[i] = Material.CrimsonTrapdoor; - for (int i = 5602; i <= 5609; i++) - materials[i] = Material.CrimsonWallHangingSign; - for (int i = 19199; i <= 19206; i++) - materials[i] = Material.CrimsonWallSign; - materials[19308] = Material.CryingObsidian; - materials[21572] = Material.CutCopper; - for (int i = 21911; i <= 21916; i++) - materials[i] = Material.CutCopperSlab; - for (int i = 21813; i <= 21892; i++) - materials[i] = Material.CutCopperStairs; - materials[10940] = Material.CutRedSandstone; - for (int i = 11153; i <= 11158; i++) - materials[i] = Material.CutRedSandstoneSlab; - materials[537] = Material.CutSandstone; - for (int i = 11099; i <= 11104; i++) - materials[i] = Material.CutSandstoneSlab; - for (int i = 10762; i <= 10777; i++) - materials[i] = Material.CyanBanner; - for (int i = 1832; i <= 1847; i++) - materials[i] = Material.CyanBed; - for (int i = 20744; i <= 20759; i++) - materials[i] = Material.CyanCandle; - for (int i = 20876; i <= 20877; i++) - materials[i] = Material.CyanCandleCake; - materials[10596] = Material.CyanCarpet; - materials[12596] = Material.CyanConcrete; - materials[12612] = Material.CyanConcretePowder; - for (int i = 12559; i <= 12562; i++) - materials[i] = Material.CyanGlazedTerracotta; - for (int i = 12481; i <= 12486; i++) - materials[i] = Material.CyanShulkerBox; - materials[5955] = Material.CyanStainedGlass; - for (int i = 9520; i <= 9551; i++) - materials[i] = Material.CyanStainedGlassPane; - materials[9225] = Material.CyanTerracotta; - for (int i = 10910; i <= 10913; i++) - materials[i] = Material.CyanWallBanner; - materials[2056] = Material.CyanWool; - for (int i = 8975; i <= 8978; i++) - materials[i] = Material.DamagedAnvil; - materials[2075] = Material.Dandelion; - for (int i = 8755; i <= 8778; i++) - materials[i] = Material.DarkOakButton; - for (int i = 12001; i <= 12064; i++) - materials[i] = Material.DarkOakDoor; - for (int i = 11585; i <= 11616; i++) - materials[i] = Material.DarkOakFence; - for (int i = 11329; i <= 11360; i++) - materials[i] = Material.DarkOakFenceGate; - for (int i = 5218; i <= 5281; i++) - materials[i] = Material.DarkOakHangingSign; - for (int i = 405; i <= 432; i++) - materials[i] = Material.DarkOakLeaves; - for (int i = 148; i <= 150; i++) - materials[i] = Material.DarkOakLog; - materials[21] = Material.DarkOakPlanks; - for (int i = 5728; i <= 5729; i++) - materials[i] = Material.DarkOakPressurePlate; - for (int i = 37; i <= 38; i++) - materials[i] = Material.DarkOakSapling; - for (int i = 4494; i <= 4525; i++) - materials[i] = Material.DarkOakSign; - for (int i = 11057; i <= 11062; i++) - materials[i] = Material.DarkOakSlab; - for (int i = 9904; i <= 9983; i++) - materials[i] = Material.DarkOakStairs; - for (int i = 6346; i <= 6409; i++) - materials[i] = Material.DarkOakTrapdoor; - for (int i = 5586; i <= 5593; i++) - materials[i] = Material.DarkOakWallHangingSign; - for (int i = 4810; i <= 4817; i++) - materials[i] = Material.DarkOakWallSign; - for (int i = 207; i <= 209; i++) - materials[i] = Material.DarkOakWood; - materials[10324] = Material.DarkPrismarine; - for (int i = 10577; i <= 10582; i++) - materials[i] = Material.DarkPrismarineSlab; - for (int i = 10485; i <= 10564; i++) - materials[i] = Material.DarkPrismarineStairs; - for (int i = 9051; i <= 9082; i++) - materials[i] = Material.DaylightDetector; - for (int i = 12674; i <= 12675; i++) - materials[i] = Material.DeadBrainCoral; - materials[12663] = Material.DeadBrainCoralBlock; - for (int i = 12694; i <= 12695; i++) - materials[i] = Material.DeadBrainCoralFan; - for (int i = 12720; i <= 12727; i++) - materials[i] = Material.DeadBrainCoralWallFan; - for (int i = 12676; i <= 12677; i++) - materials[i] = Material.DeadBubbleCoral; - materials[12664] = Material.DeadBubbleCoralBlock; - for (int i = 12696; i <= 12697; i++) - materials[i] = Material.DeadBubbleCoralFan; - for (int i = 12728; i <= 12735; i++) - materials[i] = Material.DeadBubbleCoralWallFan; - materials[2007] = Material.DeadBush; - for (int i = 12678; i <= 12679; i++) - materials[i] = Material.DeadFireCoral; - materials[12665] = Material.DeadFireCoralBlock; - for (int i = 12698; i <= 12699; i++) - materials[i] = Material.DeadFireCoralFan; - for (int i = 12736; i <= 12743; i++) - materials[i] = Material.DeadFireCoralWallFan; - for (int i = 12680; i <= 12681; i++) - materials[i] = Material.DeadHornCoral; - materials[12666] = Material.DeadHornCoralBlock; - for (int i = 12700; i <= 12701; i++) - materials[i] = Material.DeadHornCoralFan; - for (int i = 12744; i <= 12751; i++) - materials[i] = Material.DeadHornCoralWallFan; - for (int i = 12672; i <= 12673; i++) - materials[i] = Material.DeadTubeCoral; - materials[12662] = Material.DeadTubeCoralBlock; - for (int i = 12692; i <= 12693; i++) - materials[i] = Material.DeadTubeCoralFan; - for (int i = 12712; i <= 12719; i++) - materials[i] = Material.DeadTubeCoralWallFan; - for (int i = 24119; i <= 24134; i++) - materials[i] = Material.DecoratedPot; - for (int i = 22449; i <= 22451; i++) - materials[i] = Material.Deepslate; - for (int i = 23766; i <= 23771; i++) - materials[i] = Material.DeepslateBrickSlab; - for (int i = 23686; i <= 23765; i++) - materials[i] = Material.DeepslateBrickStairs; - for (int i = 23772; i <= 24095; i++) - materials[i] = Material.DeepslateBrickWall; - materials[23685] = Material.DeepslateBricks; - materials[128] = Material.DeepslateCoalOre; - materials[21568] = Material.DeepslateCopperOre; - materials[4275] = Material.DeepslateDiamondOre; - materials[7512] = Material.DeepslateEmeraldOre; - materials[124] = Material.DeepslateGoldOre; - materials[126] = Material.DeepslateIronOre; - materials[521] = Material.DeepslateLapisOre; - for (int i = 5736; i <= 5737; i++) - materials[i] = Material.DeepslateRedstoneOre; - for (int i = 23355; i <= 23360; i++) - materials[i] = Material.DeepslateTileSlab; - for (int i = 23275; i <= 23354; i++) - materials[i] = Material.DeepslateTileStairs; - for (int i = 23361; i <= 23684; i++) - materials[i] = Material.DeepslateTileWall; - materials[23274] = Material.DeepslateTiles; - for (int i = 1968; i <= 1991; i++) - materials[i] = Material.DetectorRail; - materials[4276] = Material.DiamondBlock; - materials[4274] = Material.DiamondOre; - materials[4] = Material.Diorite; - for (int i = 14013; i <= 14018; i++) - materials[i] = Material.DioriteSlab; - for (int i = 13861; i <= 13940; i++) - materials[i] = Material.DioriteStairs; - for (int i = 17907; i <= 18230; i++) - materials[i] = Material.DioriteWall; - materials[10] = Material.Dirt; - materials[12372] = Material.DirtPath; - for (int i = 523; i <= 534; i++) - materials[i] = Material.Dispenser; - materials[7416] = Material.DragonEgg; - for (int i = 8927; i <= 8942; i++) - materials[i] = Material.DragonHead; - for (int i = 8943; i <= 8946; i++) - materials[i] = Material.DragonWallHead; - materials[12646] = Material.DriedKelpBlock; - materials[22313] = Material.DripstoneBlock; - for (int i = 9204; i <= 9215; i++) - materials[i] = Material.Dropper; - materials[7665] = Material.EmeraldBlock; - materials[7511] = Material.EmeraldOre; - materials[7389] = Material.EnchantingTable; - materials[12373] = Material.EndGateway; - materials[7406] = Material.EndPortal; - for (int i = 7407; i <= 7414; i++) - materials[i] = Material.EndPortalFrame; - for (int i = 12193; i <= 12198; i++) - materials[i] = Material.EndRod; - materials[7415] = Material.EndStone; - for (int i = 13971; i <= 13976; i++) - materials[i] = Material.EndStoneBrickSlab; - for (int i = 13221; i <= 13300; i++) - materials[i] = Material.EndStoneBrickStairs; - for (int i = 17583; i <= 17906; i++) - materials[i] = Material.EndStoneBrickWall; - materials[12353] = Material.EndStoneBricks; - for (int i = 7513; i <= 7520; i++) - materials[i] = Material.EnderChest; - materials[21565] = Material.ExposedCopper; - materials[21571] = Material.ExposedCutCopper; - for (int i = 21905; i <= 21910; i++) - materials[i] = Material.ExposedCutCopperSlab; - for (int i = 21733; i <= 21812; i++) - materials[i] = Material.ExposedCutCopperStairs; - for (int i = 4286; i <= 4293; i++) - materials[i] = Material.Farmland; - materials[2006] = Material.Fern; - for (int i = 2360; i <= 2871; i++) - materials[i] = Material.Fire; - for (int i = 12688; i <= 12689; i++) - materials[i] = Material.FireCoral; - materials[12670] = Material.FireCoralBlock; - for (int i = 12708; i <= 12709; i++) - materials[i] = Material.FireCoralFan; - for (int i = 12776; i <= 12783; i++) - materials[i] = Material.FireCoralWallFan; - materials[18296] = Material.FletchingTable; - materials[8567] = Material.FlowerPot; - materials[22370] = Material.FloweringAzalea; - for (int i = 489; i <= 516; i++) - materials[i] = Material.FloweringAzaleaLeaves; - materials[24117] = Material.Frogspawn; - for (int i = 12398; i <= 12401; i++) - materials[i] = Material.FrostedIce; - for (int i = 4294; i <= 4301; i++) - materials[i] = Material.Furnace; - materials[20144] = Material.GildedBlackstone; - materials[519] = Material.Glass; - for (int i = 6780; i <= 6811; i++) - materials[i] = Material.GlassPane; - for (int i = 6869; i <= 6996; i++) - materials[i] = Material.GlowLichen; - materials[5864] = Material.Glowstone; - materials[2091] = Material.GoldBlock; - materials[123] = Material.GoldOre; - materials[2] = Material.Granite; - for (int i = 13989; i <= 13994; i++) - materials[i] = Material.GraniteSlab; - for (int i = 13541; i <= 13620; i++) - materials[i] = Material.GraniteStairs; - for (int i = 15315; i <= 15638; i++) - materials[i] = Material.GraniteWall; - materials[2005] = Material.ShortGrass; - for (int i = 8; i <= 9; i++) - materials[i] = Material.GrassBlock; - materials[118] = Material.Gravel; - for (int i = 10730; i <= 10745; i++) - materials[i] = Material.GrayBanner; - for (int i = 1800; i <= 1815; i++) - materials[i] = Material.GrayBed; - for (int i = 20712; i <= 20727; i++) - materials[i] = Material.GrayCandle; - for (int i = 20872; i <= 20873; i++) - materials[i] = Material.GrayCandleCake; - materials[10594] = Material.GrayCarpet; - materials[12594] = Material.GrayConcrete; - materials[12610] = Material.GrayConcretePowder; - for (int i = 12551; i <= 12554; i++) - materials[i] = Material.GrayGlazedTerracotta; - for (int i = 12469; i <= 12474; i++) - materials[i] = Material.GrayShulkerBox; - materials[5953] = Material.GrayStainedGlass; - for (int i = 9456; i <= 9487; i++) - materials[i] = Material.GrayStainedGlassPane; - materials[9223] = Material.GrayTerracotta; - for (int i = 10902; i <= 10905; i++) - materials[i] = Material.GrayWallBanner; - materials[2054] = Material.GrayWool; - for (int i = 10826; i <= 10841; i++) - materials[i] = Material.GreenBanner; - for (int i = 1896; i <= 1911; i++) - materials[i] = Material.GreenBed; - for (int i = 20808; i <= 20823; i++) - materials[i] = Material.GreenCandle; - for (int i = 20884; i <= 20885; i++) - materials[i] = Material.GreenCandleCake; - materials[10600] = Material.GreenCarpet; - materials[12600] = Material.GreenConcrete; - materials[12616] = Material.GreenConcretePowder; - for (int i = 12575; i <= 12578; i++) - materials[i] = Material.GreenGlazedTerracotta; - for (int i = 12505; i <= 12510; i++) - materials[i] = Material.GreenShulkerBox; - materials[5959] = Material.GreenStainedGlass; - for (int i = 9648; i <= 9679; i++) - materials[i] = Material.GreenStainedGlassPane; - materials[9229] = Material.GreenTerracotta; - for (int i = 10926; i <= 10929; i++) - materials[i] = Material.GreenWallBanner; - materials[2060] = Material.GreenWool; - for (int i = 18297; i <= 18308; i++) - materials[i] = Material.Grindstone; - for (int i = 22445; i <= 22446; i++) - materials[i] = Material.HangingRoots; - for (int i = 10584; i <= 10586; i++) - materials[i] = Material.HayBlock; - for (int i = 9019; i <= 9034; i++) - materials[i] = Material.HeavyWeightedPressurePlate; - materials[19304] = Material.HoneyBlock; - materials[19305] = Material.HoneycombBlock; - for (int i = 9085; i <= 9094; i++) - materials[i] = Material.Hopper; - for (int i = 12690; i <= 12691; i++) - materials[i] = Material.HornCoral; - materials[12671] = Material.HornCoralBlock; - for (int i = 12710; i <= 12711; i++) - materials[i] = Material.HornCoralFan; - for (int i = 12784; i <= 12791; i++) - materials[i] = Material.HornCoralWallFan; - materials[5780] = Material.Ice; - materials[6549] = Material.InfestedChiseledStoneBricks; - materials[6545] = Material.InfestedCobblestone; - materials[6548] = Material.InfestedCrackedStoneBricks; - for (int i = 24099; i <= 24101; i++) - materials[i] = Material.InfestedDeepslate; - materials[6547] = Material.InfestedMossyStoneBricks; - materials[6544] = Material.InfestedStone; - materials[6546] = Material.InfestedStoneBricks; - for (int i = 6742; i <= 6773; i++) - materials[i] = Material.IronBars; - materials[2092] = Material.IronBlock; - for (int i = 5652; i <= 5715; i++) - materials[i] = Material.IronDoor; - materials[125] = Material.IronOre; - for (int i = 10258; i <= 10321; i++) - materials[i] = Material.IronTrapdoor; - for (int i = 5871; i <= 5874; i++) - materials[i] = Material.JackOLantern; - for (int i = 19219; i <= 19230; i++) - materials[i] = Material.Jigsaw; - for (int i = 5815; i <= 5816; i++) - materials[i] = Material.Jukebox; - for (int i = 8683; i <= 8706; i++) - materials[i] = Material.JungleButton; - for (int i = 11809; i <= 11872; i++) - materials[i] = Material.JungleDoor; - for (int i = 11489; i <= 11520; i++) - materials[i] = Material.JungleFence; - for (int i = 11233; i <= 11264; i++) - materials[i] = Material.JungleFenceGate; - for (int i = 5154; i <= 5217; i++) - materials[i] = Material.JungleHangingSign; - for (int i = 321; i <= 348; i++) - materials[i] = Material.JungleLeaves; - for (int i = 139; i <= 141; i++) - materials[i] = Material.JungleLog; - materials[18] = Material.JunglePlanks; - for (int i = 5722; i <= 5723; i++) - materials[i] = Material.JunglePressurePlate; - for (int i = 31; i <= 32; i++) - materials[i] = Material.JungleSapling; - for (int i = 4462; i <= 4493; i++) - materials[i] = Material.JungleSign; - for (int i = 11039; i <= 11044; i++) - materials[i] = Material.JungleSlab; - for (int i = 7826; i <= 7905; i++) - materials[i] = Material.JungleStairs; - for (int i = 6154; i <= 6217; i++) - materials[i] = Material.JungleTrapdoor; - for (int i = 5578; i <= 5585; i++) - materials[i] = Material.JungleWallHangingSign; - for (int i = 4802; i <= 4809; i++) - materials[i] = Material.JungleWallSign; - for (int i = 198; i <= 200; i++) - materials[i] = Material.JungleWood; - for (int i = 12619; i <= 12644; i++) - materials[i] = Material.Kelp; - materials[12645] = Material.KelpPlant; - for (int i = 4654; i <= 4661; i++) - materials[i] = Material.Ladder; - for (int i = 18362; i <= 18365; i++) - materials[i] = Material.Lantern; - materials[522] = Material.LapisBlock; - materials[520] = Material.LapisOre; - for (int i = 20904; i <= 20915; i++) - materials[i] = Material.LargeAmethystBud; - for (int i = 10616; i <= 10617; i++) - materials[i] = Material.LargeFern; - for (int i = 96; i <= 111; i++) - materials[i] = Material.Lava; - materials[7402] = Material.LavaCauldron; - for (int i = 18309; i <= 18324; i++) - materials[i] = Material.Lectern; - for (int i = 5626; i <= 5649; i++) - materials[i] = Material.Lever; - for (int i = 10226; i <= 10257; i++) - materials[i] = Material.Light; - for (int i = 10666; i <= 10681; i++) - materials[i] = Material.LightBlueBanner; - for (int i = 1736; i <= 1751; i++) - materials[i] = Material.LightBlueBed; - for (int i = 20648; i <= 20663; i++) - materials[i] = Material.LightBlueCandle; - for (int i = 20864; i <= 20865; i++) - materials[i] = Material.LightBlueCandleCake; - materials[10590] = Material.LightBlueCarpet; - materials[12590] = Material.LightBlueConcrete; - materials[12606] = Material.LightBlueConcretePowder; - for (int i = 12535; i <= 12538; i++) - materials[i] = Material.LightBlueGlazedTerracotta; - for (int i = 12445; i <= 12450; i++) - materials[i] = Material.LightBlueShulkerBox; - materials[5949] = Material.LightBlueStainedGlass; - for (int i = 9328; i <= 9359; i++) - materials[i] = Material.LightBlueStainedGlassPane; - materials[9219] = Material.LightBlueTerracotta; - for (int i = 10886; i <= 10889; i++) - materials[i] = Material.LightBlueWallBanner; - materials[2050] = Material.LightBlueWool; - for (int i = 10746; i <= 10761; i++) - materials[i] = Material.LightGrayBanner; - for (int i = 1816; i <= 1831; i++) - materials[i] = Material.LightGrayBed; - for (int i = 20728; i <= 20743; i++) - materials[i] = Material.LightGrayCandle; - for (int i = 20874; i <= 20875; i++) - materials[i] = Material.LightGrayCandleCake; - materials[10595] = Material.LightGrayCarpet; - materials[12595] = Material.LightGrayConcrete; - materials[12611] = Material.LightGrayConcretePowder; - for (int i = 12555; i <= 12558; i++) - materials[i] = Material.LightGrayGlazedTerracotta; - for (int i = 12475; i <= 12480; i++) - materials[i] = Material.LightGrayShulkerBox; - materials[5954] = Material.LightGrayStainedGlass; - for (int i = 9488; i <= 9519; i++) - materials[i] = Material.LightGrayStainedGlassPane; - materials[9224] = Material.LightGrayTerracotta; - for (int i = 10906; i <= 10909; i++) - materials[i] = Material.LightGrayWallBanner; - materials[2055] = Material.LightGrayWool; - for (int i = 9003; i <= 9018; i++) - materials[i] = Material.LightWeightedPressurePlate; - for (int i = 22269; i <= 22292; i++) - materials[i] = Material.LightningRod; - for (int i = 10608; i <= 10609; i++) - materials[i] = Material.Lilac; - materials[2088] = Material.LilyOfTheValley; - materials[7271] = Material.LilyPad; - for (int i = 10698; i <= 10713; i++) - materials[i] = Material.LimeBanner; - for (int i = 1768; i <= 1783; i++) - materials[i] = Material.LimeBed; - for (int i = 20680; i <= 20695; i++) - materials[i] = Material.LimeCandle; - for (int i = 20868; i <= 20869; i++) - materials[i] = Material.LimeCandleCake; - materials[10592] = Material.LimeCarpet; - materials[12592] = Material.LimeConcrete; - materials[12608] = Material.LimeConcretePowder; - for (int i = 12543; i <= 12546; i++) - materials[i] = Material.LimeGlazedTerracotta; - for (int i = 12457; i <= 12462; i++) - materials[i] = Material.LimeShulkerBox; - materials[5951] = Material.LimeStainedGlass; - for (int i = 9392; i <= 9423; i++) - materials[i] = Material.LimeStainedGlassPane; - materials[9221] = Material.LimeTerracotta; - for (int i = 10894; i <= 10897; i++) - materials[i] = Material.LimeWallBanner; - materials[2052] = Material.LimeWool; - materials[19318] = Material.Lodestone; - for (int i = 18263; i <= 18266; i++) - materials[i] = Material.Loom; - for (int i = 10650; i <= 10665; i++) - materials[i] = Material.MagentaBanner; - for (int i = 1720; i <= 1735; i++) - materials[i] = Material.MagentaBed; - for (int i = 20632; i <= 20647; i++) - materials[i] = Material.MagentaCandle; - for (int i = 20862; i <= 20863; i++) - materials[i] = Material.MagentaCandleCake; - materials[10589] = Material.MagentaCarpet; - materials[12589] = Material.MagentaConcrete; - materials[12605] = Material.MagentaConcretePowder; - for (int i = 12531; i <= 12534; i++) - materials[i] = Material.MagentaGlazedTerracotta; - for (int i = 12439; i <= 12444; i++) - materials[i] = Material.MagentaShulkerBox; - materials[5948] = Material.MagentaStainedGlass; - for (int i = 9296; i <= 9327; i++) - materials[i] = Material.MagentaStainedGlassPane; - materials[9218] = Material.MagentaTerracotta; - for (int i = 10882; i <= 10885; i++) - materials[i] = Material.MagentaWallBanner; - materials[2049] = Material.MagentaWool; - materials[12402] = Material.MagmaBlock; - for (int i = 8779; i <= 8802; i++) - materials[i] = Material.MangroveButton; - for (int i = 12065; i <= 12128; i++) - materials[i] = Material.MangroveDoor; - for (int i = 11617; i <= 11648; i++) - materials[i] = Material.MangroveFence; - for (int i = 11361; i <= 11392; i++) - materials[i] = Material.MangroveFenceGate; - for (int i = 5410; i <= 5473; i++) - materials[i] = Material.MangroveHangingSign; - for (int i = 433; i <= 460; i++) - materials[i] = Material.MangroveLeaves; - for (int i = 151; i <= 153; i++) - materials[i] = Material.MangroveLog; - materials[22] = Material.MangrovePlanks; - for (int i = 5730; i <= 5731; i++) - materials[i] = Material.MangrovePressurePlate; - for (int i = 39; i <= 78; i++) - materials[i] = Material.MangrovePropagule; - for (int i = 154; i <= 155; i++) - materials[i] = Material.MangroveRoots; - for (int i = 4526; i <= 4557; i++) - materials[i] = Material.MangroveSign; - for (int i = 11063; i <= 11068; i++) - materials[i] = Material.MangroveSlab; - for (int i = 9984; i <= 10063; i++) - materials[i] = Material.MangroveStairs; - for (int i = 6410; i <= 6473; i++) - materials[i] = Material.MangroveTrapdoor; - for (int i = 5594; i <= 5601; i++) - materials[i] = Material.MangroveWallHangingSign; - for (int i = 4818; i <= 4825; i++) - materials[i] = Material.MangroveWallSign; - for (int i = 210; i <= 212; i++) - materials[i] = Material.MangroveWood; - for (int i = 20916; i <= 20927; i++) - materials[i] = Material.MediumAmethystBud; - materials[6812] = Material.Melon; - for (int i = 6829; i <= 6836; i++) - materials[i] = Material.MelonStem; - materials[22388] = Material.MossBlock; - materials[22371] = Material.MossCarpet; - materials[2353] = Material.MossyCobblestone; - for (int i = 13965; i <= 13970; i++) - materials[i] = Material.MossyCobblestoneSlab; - for (int i = 13141; i <= 13220; i++) - materials[i] = Material.MossyCobblestoneStairs; - for (int i = 8243; i <= 8566; i++) - materials[i] = Material.MossyCobblestoneWall; - for (int i = 13953; i <= 13958; i++) - materials[i] = Material.MossyStoneBrickSlab; - for (int i = 12981; i <= 13060; i++) - materials[i] = Material.MossyStoneBrickStairs; - for (int i = 14991; i <= 15314; i++) - materials[i] = Material.MossyStoneBrickWall; - materials[6539] = Material.MossyStoneBricks; - for (int i = 2063; i <= 2074; i++) - materials[i] = Material.MovingPiston; - materials[22448] = Material.Mud; - for (int i = 11129; i <= 11134; i++) - materials[i] = Material.MudBrickSlab; - for (int i = 7189; i <= 7268; i++) - materials[i] = Material.MudBrickStairs; - for (int i = 15963; i <= 16286; i++) - materials[i] = Material.MudBrickWall; - materials[6543] = Material.MudBricks; - for (int i = 156; i <= 158; i++) - materials[i] = Material.MuddyMangroveRoots; - for (int i = 6678; i <= 6741; i++) - materials[i] = Material.MushroomStem; - for (int i = 7269; i <= 7270; i++) - materials[i] = Material.Mycelium; - for (int i = 7273; i <= 7304; i++) - materials[i] = Material.NetherBrickFence; - for (int i = 11135; i <= 11140; i++) - materials[i] = Material.NetherBrickSlab; - for (int i = 7305; i <= 7384; i++) - materials[i] = Material.NetherBrickStairs; - for (int i = 16287; i <= 16610; i++) - materials[i] = Material.NetherBrickWall; - materials[7272] = Material.NetherBricks; - materials[129] = Material.NetherGoldOre; - for (int i = 5865; i <= 5866; i++) - materials[i] = Material.NetherPortal; - materials[9084] = Material.NetherQuartzOre; - materials[18454] = Material.NetherSprouts; - for (int i = 7385; i <= 7388; i++) - materials[i] = Material.NetherWart; - materials[12403] = Material.NetherWartBlock; - materials[19306] = Material.NetheriteBlock; - materials[5850] = Material.Netherrack; - for (int i = 538; i <= 1687; i++) - materials[i] = Material.NoteBlock; - for (int i = 8611; i <= 8634; i++) - materials[i] = Material.OakButton; - for (int i = 4590; i <= 4653; i++) - materials[i] = Material.OakDoor; - for (int i = 5817; i <= 5848; i++) - materials[i] = Material.OakFence; - for (int i = 6997; i <= 7028; i++) - materials[i] = Material.OakFenceGate; - for (int i = 4834; i <= 4897; i++) - materials[i] = Material.OakHangingSign; - for (int i = 237; i <= 264; i++) - materials[i] = Material.OakLeaves; - for (int i = 130; i <= 132; i++) - materials[i] = Material.OakLog; - materials[15] = Material.OakPlanks; - for (int i = 5716; i <= 5717; i++) - materials[i] = Material.OakPressurePlate; - for (int i = 25; i <= 26; i++) - materials[i] = Material.OakSapling; - for (int i = 4302; i <= 4333; i++) - materials[i] = Material.OakSign; - for (int i = 11021; i <= 11026; i++) - materials[i] = Material.OakSlab; - for (int i = 2874; i <= 2953; i++) - materials[i] = Material.OakStairs; - for (int i = 5962; i <= 6025; i++) - materials[i] = Material.OakTrapdoor; - for (int i = 5538; i <= 5545; i++) - materials[i] = Material.OakWallHangingSign; - for (int i = 4762; i <= 4769; i++) - materials[i] = Material.OakWallSign; - for (int i = 189; i <= 191; i++) - materials[i] = Material.OakWood; - for (int i = 12409; i <= 12420; i++) - materials[i] = Material.Observer; - materials[2354] = Material.Obsidian; - for (int i = 24108; i <= 24110; i++) - materials[i] = Material.OchreFroglight; - for (int i = 10634; i <= 10649; i++) - materials[i] = Material.OrangeBanner; - for (int i = 1704; i <= 1719; i++) - materials[i] = Material.OrangeBed; - for (int i = 20616; i <= 20631; i++) - materials[i] = Material.OrangeCandle; - for (int i = 20860; i <= 20861; i++) - materials[i] = Material.OrangeCandleCake; - materials[10588] = Material.OrangeCarpet; - materials[12588] = Material.OrangeConcrete; - materials[12604] = Material.OrangeConcretePowder; - for (int i = 12527; i <= 12530; i++) - materials[i] = Material.OrangeGlazedTerracotta; - for (int i = 12433; i <= 12438; i++) - materials[i] = Material.OrangeShulkerBox; - materials[5947] = Material.OrangeStainedGlass; - for (int i = 9264; i <= 9295; i++) - materials[i] = Material.OrangeStainedGlassPane; - materials[9217] = Material.OrangeTerracotta; - materials[2082] = Material.OrangeTulip; - for (int i = 10878; i <= 10881; i++) - materials[i] = Material.OrangeWallBanner; - materials[2048] = Material.OrangeWool; - materials[2085] = Material.OxeyeDaisy; - materials[21563] = Material.OxidizedCopper; - materials[21569] = Material.OxidizedCutCopper; - for (int i = 21893; i <= 21898; i++) - materials[i] = Material.OxidizedCutCopperSlab; - for (int i = 21573; i <= 21652; i++) - materials[i] = Material.OxidizedCutCopperStairs; - materials[10605] = Material.PackedIce; - materials[6542] = Material.PackedMud; - for (int i = 24114; i <= 24116; i++) - materials[i] = Material.PearlescentFroglight; - for (int i = 10612; i <= 10613; i++) - materials[i] = Material.Peony; - for (int i = 11105; i <= 11110; i++) - materials[i] = Material.PetrifiedOakSlab; - for (int i = 8947; i <= 8962; i++) - materials[i] = Material.PiglinHead; - for (int i = 8963; i <= 8966; i++) - materials[i] = Material.PiglinWallHead; - for (int i = 10714; i <= 10729; i++) - materials[i] = Material.PinkBanner; - for (int i = 1784; i <= 1799; i++) - materials[i] = Material.PinkBed; - for (int i = 20696; i <= 20711; i++) - materials[i] = Material.PinkCandle; - for (int i = 20870; i <= 20871; i++) - materials[i] = Material.PinkCandleCake; - materials[10593] = Material.PinkCarpet; - materials[12593] = Material.PinkConcrete; - materials[12609] = Material.PinkConcretePowder; - for (int i = 12547; i <= 12550; i++) - materials[i] = Material.PinkGlazedTerracotta; - for (int i = 22372; i <= 22387; i++) - materials[i] = Material.PinkPetals; - for (int i = 12463; i <= 12468; i++) - materials[i] = Material.PinkShulkerBox; - materials[5952] = Material.PinkStainedGlass; - for (int i = 9424; i <= 9455; i++) - materials[i] = Material.PinkStainedGlassPane; - materials[9222] = Material.PinkTerracotta; - materials[2084] = Material.PinkTulip; - for (int i = 10898; i <= 10901; i++) - materials[i] = Material.PinkWallBanner; - materials[2053] = Material.PinkWool; - for (int i = 2011; i <= 2022; i++) - materials[i] = Material.Piston; - for (int i = 2023; i <= 2046; i++) - materials[i] = Material.PistonHead; - for (int i = 12356; i <= 12365; i++) - materials[i] = Material.PitcherCrop; - for (int i = 12366; i <= 12367; i++) - materials[i] = Material.PitcherPlant; - for (int i = 8887; i <= 8902; i++) - materials[i] = Material.PlayerHead; - for (int i = 8903; i <= 8906; i++) - materials[i] = Material.PlayerWallHead; - for (int i = 12; i <= 13; i++) - materials[i] = Material.Podzol; - for (int i = 22293; i <= 22312; i++) - materials[i] = Material.PointedDripstone; - materials[7] = Material.PolishedAndesite; - for (int i = 14007; i <= 14012; i++) - materials[i] = Material.PolishedAndesiteSlab; - for (int i = 13781; i <= 13860; i++) - materials[i] = Material.PolishedAndesiteStairs; - for (int i = 5856; i <= 5858; i++) - materials[i] = Material.PolishedBasalt; - materials[19730] = Material.PolishedBlackstone; - for (int i = 19734; i <= 19739; i++) - materials[i] = Material.PolishedBlackstoneBrickSlab; - for (int i = 19740; i <= 19819; i++) - materials[i] = Material.PolishedBlackstoneBrickStairs; - for (int i = 19820; i <= 20143; i++) - materials[i] = Material.PolishedBlackstoneBrickWall; - materials[19731] = Material.PolishedBlackstoneBricks; - for (int i = 20233; i <= 20256; i++) - materials[i] = Material.PolishedBlackstoneButton; - for (int i = 20231; i <= 20232; i++) - materials[i] = Material.PolishedBlackstonePressurePlate; - for (int i = 20225; i <= 20230; i++) - materials[i] = Material.PolishedBlackstoneSlab; - for (int i = 20145; i <= 20224; i++) - materials[i] = Material.PolishedBlackstoneStairs; - for (int i = 20257; i <= 20580; i++) - materials[i] = Material.PolishedBlackstoneWall; - materials[22863] = Material.PolishedDeepslate; - for (int i = 22944; i <= 22949; i++) - materials[i] = Material.PolishedDeepslateSlab; - for (int i = 22864; i <= 22943; i++) - materials[i] = Material.PolishedDeepslateStairs; - for (int i = 22950; i <= 23273; i++) - materials[i] = Material.PolishedDeepslateWall; - materials[5] = Material.PolishedDiorite; - for (int i = 13959; i <= 13964; i++) - materials[i] = Material.PolishedDioriteSlab; - for (int i = 13061; i <= 13140; i++) - materials[i] = Material.PolishedDioriteStairs; - materials[3] = Material.PolishedGranite; - for (int i = 13941; i <= 13946; i++) - materials[i] = Material.PolishedGraniteSlab; - for (int i = 12821; i <= 12900; i++) - materials[i] = Material.PolishedGraniteStairs; - materials[2077] = Material.Poppy; - for (int i = 8603; i <= 8610; i++) - materials[i] = Material.Potatoes; - materials[8573] = Material.PottedAcaciaSapling; - materials[8581] = Material.PottedAllium; - materials[24106] = Material.PottedAzaleaBush; - materials[8582] = Material.PottedAzureBluet; - materials[12816] = Material.PottedBamboo; - materials[8571] = Material.PottedBirchSapling; - materials[8580] = Material.PottedBlueOrchid; - materials[8592] = Material.PottedBrownMushroom; - materials[8594] = Material.PottedCactus; - materials[8574] = Material.PottedCherrySapling; - materials[8588] = Material.PottedCornflower; - materials[19314] = Material.PottedCrimsonFungus; - materials[19316] = Material.PottedCrimsonRoots; - materials[8578] = Material.PottedDandelion; - materials[8575] = Material.PottedDarkOakSapling; - materials[8593] = Material.PottedDeadBush; - materials[8577] = Material.PottedFern; - materials[24107] = Material.PottedFloweringAzaleaBush; - materials[8572] = Material.PottedJungleSapling; - materials[8589] = Material.PottedLilyOfTheValley; - materials[8576] = Material.PottedMangrovePropagule; - materials[8569] = Material.PottedOakSapling; - materials[8584] = Material.PottedOrangeTulip; - materials[8587] = Material.PottedOxeyeDaisy; - materials[8586] = Material.PottedPinkTulip; - materials[8579] = Material.PottedPoppy; - materials[8591] = Material.PottedRedMushroom; - materials[8583] = Material.PottedRedTulip; - materials[8570] = Material.PottedSpruceSapling; - materials[8568] = Material.PottedTorchflower; - materials[19315] = Material.PottedWarpedFungus; - materials[19317] = Material.PottedWarpedRoots; - materials[8585] = Material.PottedWhiteTulip; - materials[8590] = Material.PottedWitherRose; - materials[20943] = Material.PowderSnow; - for (int i = 7403; i <= 7405; i++) - materials[i] = Material.PowderSnowCauldron; - for (int i = 1944; i <= 1967; i++) - materials[i] = Material.PoweredRail; - materials[10322] = Material.Prismarine; - for (int i = 10571; i <= 10576; i++) - materials[i] = Material.PrismarineBrickSlab; - for (int i = 10405; i <= 10484; i++) - materials[i] = Material.PrismarineBrickStairs; - materials[10323] = Material.PrismarineBricks; - for (int i = 10565; i <= 10570; i++) - materials[i] = Material.PrismarineSlab; - for (int i = 10325; i <= 10404; i++) - materials[i] = Material.PrismarineStairs; - for (int i = 14343; i <= 14666; i++) - materials[i] = Material.PrismarineWall; - materials[5849] = Material.Pumpkin; - for (int i = 6821; i <= 6828; i++) - materials[i] = Material.PumpkinStem; - for (int i = 10778; i <= 10793; i++) - materials[i] = Material.PurpleBanner; - for (int i = 1848; i <= 1863; i++) - materials[i] = Material.PurpleBed; - for (int i = 20760; i <= 20775; i++) - materials[i] = Material.PurpleCandle; - for (int i = 20878; i <= 20879; i++) - materials[i] = Material.PurpleCandleCake; - materials[10597] = Material.PurpleCarpet; - materials[12597] = Material.PurpleConcrete; - materials[12613] = Material.PurpleConcretePowder; - for (int i = 12563; i <= 12566; i++) - materials[i] = Material.PurpleGlazedTerracotta; - for (int i = 12487; i <= 12492; i++) - materials[i] = Material.PurpleShulkerBox; - materials[5956] = Material.PurpleStainedGlass; - for (int i = 9552; i <= 9583; i++) - materials[i] = Material.PurpleStainedGlassPane; - materials[9226] = Material.PurpleTerracotta; - for (int i = 10914; i <= 10917; i++) - materials[i] = Material.PurpleWallBanner; - materials[2057] = Material.PurpleWool; - materials[12269] = Material.PurpurBlock; - for (int i = 12270; i <= 12272; i++) - materials[i] = Material.PurpurPillar; - for (int i = 11159; i <= 11164; i++) - materials[i] = Material.PurpurSlab; - for (int i = 12273; i <= 12352; i++) - materials[i] = Material.PurpurStairs; - materials[9095] = Material.QuartzBlock; - materials[20583] = Material.QuartzBricks; - for (int i = 9097; i <= 9099; i++) - materials[i] = Material.QuartzPillar; - for (int i = 11141; i <= 11146; i++) - materials[i] = Material.QuartzSlab; - for (int i = 9100; i <= 9179; i++) - materials[i] = Material.QuartzStairs; - for (int i = 4662; i <= 4681; i++) - materials[i] = Material.Rail; - materials[24104] = Material.RawCopperBlock; - materials[24105] = Material.RawGoldBlock; - materials[24103] = Material.RawIronBlock; - for (int i = 10842; i <= 10857; i++) - materials[i] = Material.RedBanner; - for (int i = 1912; i <= 1927; i++) - materials[i] = Material.RedBed; - for (int i = 20824; i <= 20839; i++) - materials[i] = Material.RedCandle; - for (int i = 20886; i <= 20887; i++) - materials[i] = Material.RedCandleCake; - materials[10601] = Material.RedCarpet; - materials[12601] = Material.RedConcrete; - materials[12617] = Material.RedConcretePowder; - for (int i = 12579; i <= 12582; i++) - materials[i] = Material.RedGlazedTerracotta; - materials[2090] = Material.RedMushroom; - for (int i = 6614; i <= 6677; i++) - materials[i] = Material.RedMushroomBlock; - for (int i = 14001; i <= 14006; i++) - materials[i] = Material.RedNetherBrickSlab; - for (int i = 13701; i <= 13780; i++) - materials[i] = Material.RedNetherBrickStairs; - for (int i = 16935; i <= 17258; i++) - materials[i] = Material.RedNetherBrickWall; - materials[12404] = Material.RedNetherBricks; - materials[117] = Material.RedSand; - materials[10938] = Material.RedSandstone; - for (int i = 11147; i <= 11152; i++) - materials[i] = Material.RedSandstoneSlab; - for (int i = 10941; i <= 11020; i++) - materials[i] = Material.RedSandstoneStairs; - for (int i = 14667; i <= 14990; i++) - materials[i] = Material.RedSandstoneWall; - for (int i = 12511; i <= 12516; i++) - materials[i] = Material.RedShulkerBox; - materials[5960] = Material.RedStainedGlass; - for (int i = 9680; i <= 9711; i++) - materials[i] = Material.RedStainedGlassPane; - materials[9230] = Material.RedTerracotta; - materials[2081] = Material.RedTulip; - for (int i = 10930; i <= 10933; i++) - materials[i] = Material.RedWallBanner; - materials[2061] = Material.RedWool; - materials[9083] = Material.RedstoneBlock; - for (int i = 7417; i <= 7418; i++) - materials[i] = Material.RedstoneLamp; - for (int i = 5734; i <= 5735; i++) - materials[i] = Material.RedstoneOre; - for (int i = 5738; i <= 5739; i++) - materials[i] = Material.RedstoneTorch; - for (int i = 5740; i <= 5747; i++) - materials[i] = Material.RedstoneWallTorch; - for (int i = 2978; i <= 4273; i++) - materials[i] = Material.RedstoneWire; - materials[24118] = Material.ReinforcedDeepslate; - for (int i = 5882; i <= 5945; i++) - materials[i] = Material.Repeater; - for (int i = 12374; i <= 12385; i++) - materials[i] = Material.RepeatingCommandBlock; - for (int i = 19309; i <= 19313; i++) - materials[i] = Material.RespawnAnchor; - materials[22447] = Material.RootedDirt; - for (int i = 10610; i <= 10611; i++) - materials[i] = Material.RoseBush; - materials[112] = Material.Sand; - materials[535] = Material.Sandstone; - for (int i = 11093; i <= 11098; i++) - materials[i] = Material.SandstoneSlab; - for (int i = 7431; i <= 7510; i++) - materials[i] = Material.SandstoneStairs; - for (int i = 17259; i <= 17582; i++) - materials[i] = Material.SandstoneWall; - for (int i = 18231; i <= 18262; i++) - materials[i] = Material.Scaffolding; - materials[21424] = Material.Sculk; - for (int i = 21553; i <= 21554; i++) - materials[i] = Material.SculkCatalyst; - for (int i = 20944; i <= 21039; i++) - materials[i] = Material.SculkSensor; - for (int i = 21555; i <= 21562; i++) - materials[i] = Material.SculkShrieker; - for (int i = 21425; i <= 21552; i++) - materials[i] = Material.SculkVein; - materials[10583] = Material.SeaLantern; - for (int i = 12792; i <= 12799; i++) - materials[i] = Material.SeaPickle; - materials[2008] = Material.Seagrass; - materials[18469] = Material.Shroomlight; - for (int i = 12421; i <= 12426; i++) - materials[i] = Material.ShulkerBox; - for (int i = 8827; i <= 8842; i++) - materials[i] = Material.SkeletonSkull; - for (int i = 8843; i <= 8846; i++) - materials[i] = Material.SkeletonWallSkull; - materials[10224] = Material.SlimeBlock; - for (int i = 20928; i <= 20939; i++) - materials[i] = Material.SmallAmethystBud; - for (int i = 22429; i <= 22444; i++) - materials[i] = Material.SmallDripleaf; - materials[18325] = Material.SmithingTable; - for (int i = 18279; i <= 18286; i++) - materials[i] = Material.Smoker; - materials[24102] = Material.SmoothBasalt; - materials[11167] = Material.SmoothQuartz; - for (int i = 13983; i <= 13988; i++) - materials[i] = Material.SmoothQuartzSlab; - for (int i = 13461; i <= 13540; i++) - materials[i] = Material.SmoothQuartzStairs; - materials[11168] = Material.SmoothRedSandstone; - for (int i = 13947; i <= 13952; i++) - materials[i] = Material.SmoothRedSandstoneSlab; - for (int i = 12901; i <= 12980; i++) - materials[i] = Material.SmoothRedSandstoneStairs; - materials[11166] = Material.SmoothSandstone; - for (int i = 13977; i <= 13982; i++) - materials[i] = Material.SmoothSandstoneSlab; - for (int i = 13381; i <= 13460; i++) - materials[i] = Material.SmoothSandstoneStairs; - materials[11165] = Material.SmoothStone; - for (int i = 11087; i <= 11092; i++) - materials[i] = Material.SmoothStoneSlab; - for (int i = 12659; i <= 12661; i++) - materials[i] = Material.SnifferEgg; - for (int i = 5772; i <= 5779; i++) - materials[i] = Material.Snow; - materials[5781] = Material.SnowBlock; - for (int i = 18402; i <= 18433; i++) - materials[i] = Material.SoulCampfire; - materials[2872] = Material.SoulFire; - for (int i = 18366; i <= 18369; i++) - materials[i] = Material.SoulLantern; - materials[5851] = Material.SoulSand; - materials[5852] = Material.SoulSoil; - materials[5859] = Material.SoulTorch; - for (int i = 5860; i <= 5863; i++) - materials[i] = Material.SoulWallTorch; - materials[2873] = Material.Spawner; - materials[517] = Material.Sponge; - materials[22368] = Material.SporeBlossom; - for (int i = 8635; i <= 8658; i++) - materials[i] = Material.SpruceButton; - for (int i = 11681; i <= 11744; i++) - materials[i] = Material.SpruceDoor; - for (int i = 11425; i <= 11456; i++) - materials[i] = Material.SpruceFence; - for (int i = 11169; i <= 11200; i++) - materials[i] = Material.SpruceFenceGate; - for (int i = 4898; i <= 4961; i++) - materials[i] = Material.SpruceHangingSign; - for (int i = 265; i <= 292; i++) - materials[i] = Material.SpruceLeaves; - for (int i = 133; i <= 135; i++) - materials[i] = Material.SpruceLog; - materials[16] = Material.SprucePlanks; - for (int i = 5718; i <= 5719; i++) - materials[i] = Material.SprucePressurePlate; - for (int i = 27; i <= 28; i++) - materials[i] = Material.SpruceSapling; - for (int i = 4334; i <= 4365; i++) - materials[i] = Material.SpruceSign; - for (int i = 11027; i <= 11032; i++) - materials[i] = Material.SpruceSlab; - for (int i = 7666; i <= 7745; i++) - materials[i] = Material.SpruceStairs; - for (int i = 6026; i <= 6089; i++) - materials[i] = Material.SpruceTrapdoor; - for (int i = 5546; i <= 5553; i++) - materials[i] = Material.SpruceWallHangingSign; - for (int i = 4770; i <= 4777; i++) - materials[i] = Material.SpruceWallSign; - for (int i = 192; i <= 194; i++) - materials[i] = Material.SpruceWood; - for (int i = 1992; i <= 2003; i++) - materials[i] = Material.StickyPiston; - materials[1] = Material.Stone; - for (int i = 11123; i <= 11128; i++) - materials[i] = Material.StoneBrickSlab; - for (int i = 7109; i <= 7188; i++) - materials[i] = Material.StoneBrickStairs; - for (int i = 15639; i <= 15962; i++) - materials[i] = Material.StoneBrickWall; - materials[6538] = Material.StoneBricks; - for (int i = 5748; i <= 5771; i++) - materials[i] = Material.StoneButton; - for (int i = 5650; i <= 5651; i++) - materials[i] = Material.StonePressurePlate; - for (int i = 11081; i <= 11086; i++) - materials[i] = Material.StoneSlab; - for (int i = 13301; i <= 13380; i++) - materials[i] = Material.StoneStairs; - for (int i = 18326; i <= 18329; i++) - materials[i] = Material.Stonecutter; - for (int i = 171; i <= 173; i++) - materials[i] = Material.StrippedAcaciaLog; - for (int i = 225; i <= 227; i++) - materials[i] = Material.StrippedAcaciaWood; - for (int i = 186; i <= 188; i++) - materials[i] = Material.StrippedBambooBlock; - for (int i = 165; i <= 167; i++) - materials[i] = Material.StrippedBirchLog; - for (int i = 219; i <= 221; i++) - materials[i] = Material.StrippedBirchWood; - for (int i = 174; i <= 176; i++) - materials[i] = Material.StrippedCherryLog; - for (int i = 228; i <= 230; i++) - materials[i] = Material.StrippedCherryWood; - for (int i = 18464; i <= 18466; i++) - materials[i] = Material.StrippedCrimsonHyphae; - for (int i = 18458; i <= 18460; i++) - materials[i] = Material.StrippedCrimsonStem; - for (int i = 177; i <= 179; i++) - materials[i] = Material.StrippedDarkOakLog; - for (int i = 231; i <= 233; i++) - materials[i] = Material.StrippedDarkOakWood; - for (int i = 168; i <= 170; i++) - materials[i] = Material.StrippedJungleLog; - for (int i = 222; i <= 224; i++) - materials[i] = Material.StrippedJungleWood; - for (int i = 183; i <= 185; i++) - materials[i] = Material.StrippedMangroveLog; - for (int i = 234; i <= 236; i++) - materials[i] = Material.StrippedMangroveWood; - for (int i = 180; i <= 182; i++) - materials[i] = Material.StrippedOakLog; - for (int i = 213; i <= 215; i++) - materials[i] = Material.StrippedOakWood; - for (int i = 162; i <= 164; i++) - materials[i] = Material.StrippedSpruceLog; - for (int i = 216; i <= 218; i++) - materials[i] = Material.StrippedSpruceWood; - for (int i = 18447; i <= 18449; i++) - materials[i] = Material.StrippedWarpedHyphae; - for (int i = 18441; i <= 18443; i++) - materials[i] = Material.StrippedWarpedStem; - for (int i = 19215; i <= 19218; i++) - materials[i] = Material.StructureBlock; - materials[12408] = Material.StructureVoid; - for (int i = 5799; i <= 5814; i++) - materials[i] = Material.SugarCane; - for (int i = 10606; i <= 10607; i++) - materials[i] = Material.Sunflower; - for (int i = 119; i <= 122; i++) - materials[i] = Material.SuspiciousGravel; - for (int i = 113; i <= 116; i++) - materials[i] = Material.SuspiciousSand; - for (int i = 18434; i <= 18437; i++) - materials[i] = Material.SweetBerryBush; - for (int i = 10614; i <= 10615; i++) - materials[i] = Material.TallGrass; - for (int i = 2009; i <= 2010; i++) - materials[i] = Material.TallSeagrass; - for (int i = 19240; i <= 19255; i++) - materials[i] = Material.Target; - materials[10603] = Material.Terracotta; - materials[20942] = Material.TintedGlass; - for (int i = 2094; i <= 2095; i++) - materials[i] = Material.Tnt; - materials[2355] = Material.Torch; - materials[2076] = Material.Torchflower; - for (int i = 12354; i <= 12355; i++) - materials[i] = Material.TorchflowerCrop; - for (int i = 8979; i <= 9002; i++) - materials[i] = Material.TrappedChest; - for (int i = 7537; i <= 7664; i++) - materials[i] = Material.Tripwire; - for (int i = 7521; i <= 7536; i++) - materials[i] = Material.TripwireHook; - for (int i = 12682; i <= 12683; i++) - materials[i] = Material.TubeCoral; - materials[12667] = Material.TubeCoralBlock; - for (int i = 12702; i <= 12703; i++) - materials[i] = Material.TubeCoralFan; - for (int i = 12752; i <= 12759; i++) - materials[i] = Material.TubeCoralWallFan; - materials[20940] = Material.Tuff; - for (int i = 12647; i <= 12658; i++) - materials[i] = Material.TurtleEgg; - for (int i = 18497; i <= 18522; i++) - materials[i] = Material.TwistingVines; - materials[18523] = Material.TwistingVinesPlant; - for (int i = 24111; i <= 24113; i++) - materials[i] = Material.VerdantFroglight; - for (int i = 6837; i <= 6868; i++) - materials[i] = Material.Vine; - materials[12817] = Material.VoidAir; - for (int i = 2356; i <= 2359; i++) - materials[i] = Material.WallTorch; - for (int i = 18983; i <= 19006; i++) - materials[i] = Material.WarpedButton; - for (int i = 19071; i <= 19134; i++) - materials[i] = Material.WarpedDoor; - for (int i = 18575; i <= 18606; i++) - materials[i] = Material.WarpedFence; - for (int i = 18767; i <= 18798; i++) - materials[i] = Material.WarpedFenceGate; - materials[18451] = Material.WarpedFungus; - for (int i = 5346; i <= 5409; i++) - materials[i] = Material.WarpedHangingSign; - for (int i = 18444; i <= 18446; i++) - materials[i] = Material.WarpedHyphae; - materials[18450] = Material.WarpedNylium; - materials[18526] = Material.WarpedPlanks; - for (int i = 18541; i <= 18542; i++) - materials[i] = Material.WarpedPressurePlate; - materials[18453] = Material.WarpedRoots; - for (int i = 19167; i <= 19198; i++) - materials[i] = Material.WarpedSign; - for (int i = 18533; i <= 18538; i++) - materials[i] = Material.WarpedSlab; - for (int i = 18879; i <= 18958; i++) - materials[i] = Material.WarpedStairs; - for (int i = 18438; i <= 18440; i++) - materials[i] = Material.WarpedStem; - for (int i = 18671; i <= 18734; i++) - materials[i] = Material.WarpedTrapdoor; - for (int i = 5610; i <= 5617; i++) - materials[i] = Material.WarpedWallHangingSign; - for (int i = 19207; i <= 19214; i++) - materials[i] = Material.WarpedWallSign; - materials[18452] = Material.WarpedWartBlock; - for (int i = 80; i <= 95; i++) - materials[i] = Material.Water; - for (int i = 7399; i <= 7401; i++) - materials[i] = Material.WaterCauldron; - materials[21917] = Material.WaxedCopperBlock; - materials[21924] = Material.WaxedCutCopper; - for (int i = 22263; i <= 22268; i++) - materials[i] = Material.WaxedCutCopperSlab; - for (int i = 22165; i <= 22244; i++) - materials[i] = Material.WaxedCutCopperStairs; - materials[21919] = Material.WaxedExposedCopper; - materials[21923] = Material.WaxedExposedCutCopper; - for (int i = 22257; i <= 22262; i++) - materials[i] = Material.WaxedExposedCutCopperSlab; - for (int i = 22085; i <= 22164; i++) - materials[i] = Material.WaxedExposedCutCopperStairs; - materials[21920] = Material.WaxedOxidizedCopper; - materials[21921] = Material.WaxedOxidizedCutCopper; - for (int i = 22245; i <= 22250; i++) - materials[i] = Material.WaxedOxidizedCutCopperSlab; - for (int i = 21925; i <= 22004; i++) - materials[i] = Material.WaxedOxidizedCutCopperStairs; - materials[21918] = Material.WaxedWeatheredCopper; - materials[21922] = Material.WaxedWeatheredCutCopper; - for (int i = 22251; i <= 22256; i++) - materials[i] = Material.WaxedWeatheredCutCopperSlab; - for (int i = 22005; i <= 22084; i++) - materials[i] = Material.WaxedWeatheredCutCopperStairs; - materials[21564] = Material.WeatheredCopper; - materials[21570] = Material.WeatheredCutCopper; - for (int i = 21899; i <= 21904; i++) - materials[i] = Material.WeatheredCutCopperSlab; - for (int i = 21653; i <= 21732; i++) - materials[i] = Material.WeatheredCutCopperStairs; - for (int i = 18470; i <= 18495; i++) - materials[i] = Material.WeepingVines; - materials[18496] = Material.WeepingVinesPlant; - materials[518] = Material.WetSponge; - for (int i = 4278; i <= 4285; i++) - materials[i] = Material.Wheat; - for (int i = 10618; i <= 10633; i++) - materials[i] = Material.WhiteBanner; - for (int i = 1688; i <= 1703; i++) - materials[i] = Material.WhiteBed; - for (int i = 20600; i <= 20615; i++) - materials[i] = Material.WhiteCandle; - for (int i = 20858; i <= 20859; i++) - materials[i] = Material.WhiteCandleCake; - materials[10587] = Material.WhiteCarpet; - materials[12587] = Material.WhiteConcrete; - materials[12603] = Material.WhiteConcretePowder; - for (int i = 12523; i <= 12526; i++) - materials[i] = Material.WhiteGlazedTerracotta; - for (int i = 12427; i <= 12432; i++) - materials[i] = Material.WhiteShulkerBox; - materials[5946] = Material.WhiteStainedGlass; - for (int i = 9232; i <= 9263; i++) - materials[i] = Material.WhiteStainedGlassPane; - materials[9216] = Material.WhiteTerracotta; - materials[2083] = Material.WhiteTulip; - for (int i = 10874; i <= 10877; i++) - materials[i] = Material.WhiteWallBanner; - materials[2047] = Material.WhiteWool; - materials[2087] = Material.WitherRose; - for (int i = 8847; i <= 8862; i++) - materials[i] = Material.WitherSkeletonSkull; - for (int i = 8863; i <= 8866; i++) - materials[i] = Material.WitherSkeletonWallSkull; - for (int i = 10682; i <= 10697; i++) - materials[i] = Material.YellowBanner; - for (int i = 1752; i <= 1767; i++) - materials[i] = Material.YellowBed; - for (int i = 20664; i <= 20679; i++) - materials[i] = Material.YellowCandle; - for (int i = 20866; i <= 20867; i++) - materials[i] = Material.YellowCandleCake; - materials[10591] = Material.YellowCarpet; - materials[12591] = Material.YellowConcrete; - materials[12607] = Material.YellowConcretePowder; - for (int i = 12539; i <= 12542; i++) - materials[i] = Material.YellowGlazedTerracotta; - for (int i = 12451; i <= 12456; i++) - materials[i] = Material.YellowShulkerBox; - materials[5950] = Material.YellowStainedGlass; - for (int i = 9360; i <= 9391; i++) - materials[i] = Material.YellowStainedGlassPane; - materials[9220] = Material.YellowTerracotta; - for (int i = 10890; i <= 10893; i++) - materials[i] = Material.YellowWallBanner; - materials[2051] = Material.YellowWool; - for (int i = 8867; i <= 8882; i++) - materials[i] = Material.ZombieHead; - for (int i = 8883; i <= 8886; i++) - materials[i] = Material.ZombieWallHead; - } - - // - private static readonly BlockStateDefinition[] stateDefinitions = - [ - new(8, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(12, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(25, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(27, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(29, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(31, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(33, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(35, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(37, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(39, 40, - [ - new("age", ["0", "1", "2", "3", "4"], 8), - new("hanging", ["true", "false"], 4), - new("stage", ["0", "1"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(80, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(96, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(113, 4, - [ - new("dusted", ["0", "1", "2", "3"], 1) - ]), - new(119, 4, - [ - new("dusted", ["0", "1", "2", "3"], 1) - ]), - new(130, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(133, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(136, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(139, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(142, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(145, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(148, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(151, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(154, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(156, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(159, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(162, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(165, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(168, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(171, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(174, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(177, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(180, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(183, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(186, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(189, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(192, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(195, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(198, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(201, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(204, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(207, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(210, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(213, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(216, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(219, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(222, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(225, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(228, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(231, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(234, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(237, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(265, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(293, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(321, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(349, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(377, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(405, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(433, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(461, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(489, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(523, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(538, 1150, - [ - new("instrument", ["harp", "basedrum", "snare", "hat", "bass", "flute", "bell", "guitar", "chime", "xylophone", "iron_xylophone", "cow_bell", "didgeridoo", "bit", "banjo", "pling", "zombie", "skeleton", "creeper", "dragon", "wither_skeleton", "piglin", "custom_head"], 50), - new("note", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"], 2), - new("powered", ["true", "false"], 1) - ]), - new(1688, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1704, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1720, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1736, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1752, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1768, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1784, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1800, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1816, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1832, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1848, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1864, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1880, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1896, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1912, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1928, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1944, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(1968, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(1992, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(2009, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(2011, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(2023, 24, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("short", ["true", "false"], 2) - ]), - new(2063, 12, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 2) - ]), - new(2094, 2, - [ - new("unstable", ["true", "false"], 1) - ]), - new(2097, 256, - [ - new("facing", ["north", "south", "west", "east"], 64), - new("slot_0_occupied", ["true", "false"], 32), - new("slot_1_occupied", ["true", "false"], 16), - new("slot_2_occupied", ["true", "false"], 8), - new("slot_3_occupied", ["true", "false"], 4), - new("slot_4_occupied", ["true", "false"], 2), - new("slot_5_occupied", ["true", "false"], 1) - ]), - new(2356, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(2360, 512, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(2874, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2954, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(2978, 1296, - [ - new("east", ["up", "side", "none"], 432), - new("north", ["up", "side", "none"], 144), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 9), - new("south", ["up", "side", "none"], 3), - new("west", ["up", "side", "none"], 1) - ]), - new(4278, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4286, 8, - [ - new("moisture", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4294, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(4302, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4334, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4366, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4398, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4430, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4462, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4494, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4526, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4558, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4590, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(4654, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4662, 20, - [ - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south", "south_east", "south_west", "north_west", "north_east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4682, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4762, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4770, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4778, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4786, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4794, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4802, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4810, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4818, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4826, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4834, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4898, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4962, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5026, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5090, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5154, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5218, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5282, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5346, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5410, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5474, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5538, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5546, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5554, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5562, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5570, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5578, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5586, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5594, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5602, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5610, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5618, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5626, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5650, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5652, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5716, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5718, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5720, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5722, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5724, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5726, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5728, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5730, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5732, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5734, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5736, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5738, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5740, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(5748, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5772, 8, - [ - new("layers", ["1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(5782, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5799, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5815, 2, - [ - new("has_record", ["true", "false"], 1) - ]), - new(5817, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5853, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(5856, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(5860, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5865, 2, - [ - new("axis", ["x", "z"], 1) - ]), - new(5867, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5871, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5875, 7, - [ - new("bites", ["0", "1", "2", "3", "4", "5", "6"], 1) - ]), - new(5882, 64, - [ - new("delay", ["1", "2", "3", "4"], 16), - new("facing", ["north", "south", "west", "east"], 4), - new("locked", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5962, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6026, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6090, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6154, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6218, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6282, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6346, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6410, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6474, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6550, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6614, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6678, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6742, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6774, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6780, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6813, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6817, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6821, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(6829, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(6837, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6869, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6997, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7029, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7109, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7189, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7269, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(7273, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7305, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7385, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(7390, 8, - [ - new("has_bottle_0", ["true", "false"], 4), - new("has_bottle_1", ["true", "false"], 2), - new("has_bottle_2", ["true", "false"], 1) - ]), - new(7399, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(7403, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(7407, 8, - [ - new("eye", ["true", "false"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7417, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(7419, 12, - [ - new("age", ["0", "1", "2"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7431, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7513, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7521, 16, - [ - new("attached", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7537, 128, - [ - new("attached", ["true", "false"], 64), - new("disarmed", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("powered", ["true", "false"], 4), - new("south", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7666, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7746, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7826, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7906, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(7919, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(8243, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(8595, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(8603, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(8611, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8635, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8659, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8683, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8707, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8731, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8755, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8779, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8803, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8827, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8843, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8847, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8863, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8867, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8883, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8887, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8903, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8907, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8923, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8927, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8943, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8947, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8963, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8967, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8971, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8975, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8979, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(9003, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9019, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9035, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("mode", ["compare", "subtract"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9051, 32, - [ - new("inverted", ["true", "false"], 16), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9085, 10, - [ - new("enabled", ["true", "false"], 5), - new("facing", ["down", "north", "south", "west", "east"], 1) - ]), - new(9097, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(9100, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9180, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9204, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(9232, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9264, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9296, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9328, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9360, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9392, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9424, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9456, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9488, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9520, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9552, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9584, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9616, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9648, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9680, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9712, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9744, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9824, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9904, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9984, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10064, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10144, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10226, 32, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10258, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10325, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10405, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10485, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10565, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10571, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10577, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10584, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(10606, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10608, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10610, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10612, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10614, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10616, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10618, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10634, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10650, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10666, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10682, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10698, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10714, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10730, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10746, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10762, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10778, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10794, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10810, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10826, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10842, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10858, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10874, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10878, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10882, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10886, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10890, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10894, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10898, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10902, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10906, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10910, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10914, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10918, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10922, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10926, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10930, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10934, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10941, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11021, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11027, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11033, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11039, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11045, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11051, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11057, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11063, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11069, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11075, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11081, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11087, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11093, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11099, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11105, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11111, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11117, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11123, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11129, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11135, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11141, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11147, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11153, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11159, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11169, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11201, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11233, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11265, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11297, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11329, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11361, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11393, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11425, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11457, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11489, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11521, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11553, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11585, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11617, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11649, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11681, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11745, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11809, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11873, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11937, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12001, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12065, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12129, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12193, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12199, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12263, 6, - [ - new("age", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(12270, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(12273, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12354, 2, - [ - new("age", ["0", "1"], 1) - ]), - new(12356, 10, - [ - new("age", ["0", "1", "2", "3", "4"], 2), - new("half", ["upper", "lower"], 1) - ]), - new(12366, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(12368, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(12374, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12386, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12398, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(12405, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(12409, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12421, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12427, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12433, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12439, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12445, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12451, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12457, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12463, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12469, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12475, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12481, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12487, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12493, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12499, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12505, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12511, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12517, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12523, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12527, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12531, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12535, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12539, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12543, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12547, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12551, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12555, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12559, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12563, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12567, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12571, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12575, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12579, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12583, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12619, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(12647, 12, - [ - new("eggs", ["1", "2", "3", "4"], 3), - new("hatch", ["0", "1", "2"], 1) - ]), - new(12659, 3, - [ - new("hatch", ["0", "1", "2"], 1) - ]), - new(12672, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12674, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12676, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12678, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12680, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12682, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12684, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12686, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12688, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12690, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12692, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12694, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12696, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12698, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12700, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12702, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12704, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12706, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12708, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12710, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12712, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12720, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12728, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12736, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12744, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12752, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12760, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12768, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12776, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12784, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12792, 8, - [ - new("pickles", ["1", "2", "3", "4"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12801, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12804, 12, - [ - new("age", ["0", "1"], 6), - new("leaves", ["none", "small", "large"], 2), - new("stage", ["0", "1"], 1) - ]), - new(12819, 2, - [ - new("drag", ["true", "false"], 1) - ]), - new(12821, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12901, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12981, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13061, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13141, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13221, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13301, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13381, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13461, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13541, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13621, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13701, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13781, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13861, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13941, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13947, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13953, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13959, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13965, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13971, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13977, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13983, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13989, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13995, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14001, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14007, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14013, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14019, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14343, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14667, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14991, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15315, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15639, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15963, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16287, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16611, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16935, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17259, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17583, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17907, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18231, 32, - [ - new("bottom", ["true", "false"], 16), - new("distance", ["0", "1", "2", "3", "4", "5", "6", "7"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18263, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(18267, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("open", ["true", "false"], 1) - ]), - new(18279, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(18287, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(18297, 12, - [ - new("face", ["floor", "wall", "ceiling"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(18309, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("has_book", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18326, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(18330, 32, - [ - new("attachment", ["floor", "ceiling", "single_wall", "double_wall"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18362, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18366, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18370, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18402, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18434, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(18438, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18441, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18444, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18447, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18455, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18458, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18461, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18464, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18470, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(18497, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(18527, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18533, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18539, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(18541, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(18543, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(18575, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(18607, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18671, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18735, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18767, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18799, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18879, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18959, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18983, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19007, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19071, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19135, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19167, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19199, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19207, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19215, 4, - [ - new("mode", ["save", "load", "corner", "data"], 1) - ]), - new(19219, 12, - [ - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 1) - ]), - new(19231, 9, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(19240, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(19256, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(19280, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(19309, 5, - [ - new("charges", ["0", "1", "2", "3", "4"], 1) - ]), - new(19320, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19400, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19724, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19734, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19740, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19820, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20145, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20225, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20231, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(20233, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20257, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20584, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20600, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20616, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20632, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20648, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20664, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20680, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20696, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20712, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20728, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20744, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20760, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20776, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20792, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20808, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20824, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20840, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20856, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20858, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20860, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20862, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20864, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20866, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20868, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20870, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20872, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20874, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20876, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20878, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20880, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20882, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20884, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20886, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20888, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20892, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20904, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20916, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20928, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20944, 96, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21040, 384, - [ - new("facing", ["north", "south", "west", "east"], 96), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21425, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(21553, 2, - [ - new("bloom", ["true", "false"], 1) - ]), - new(21555, 8, - [ - new("can_summon", ["true", "false"], 4), - new("shrieking", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21573, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21653, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21733, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21813, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21893, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21899, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21905, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21911, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21925, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22005, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22085, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22165, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22245, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22251, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22257, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22263, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22269, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22293, 20, - [ - new("thickness", ["tip_merge", "tip", "frustum", "middle", "base"], 4), - new("vertical_direction", ["up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22314, 52, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 2), - new("berries", ["true", "false"], 1) - ]), - new(22366, 2, - [ - new("berries", ["true", "false"], 1) - ]), - new(22372, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("flower_amount", ["1", "2", "3", "4"], 1) - ]), - new(22389, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("tilt", ["none", "unstable", "partial", "full"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22421, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22429, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("half", ["upper", "lower"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22445, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(22449, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(22453, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22533, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22539, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(22864, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22944, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22950, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(23275, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23355, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23361, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(23686, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23766, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23772, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(24099, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(24108, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(24111, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(24114, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(24119, 16, - [ - new("cracked", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - ]; - // - - protected override Dictionary GetDict() - { - return materials; - } - - protected override BlockStateDefinition[] GetStateDefinitions() - { - return stateDefinitions; - } - } -} diff --git a/MinecraftClient/Mapping/BlockPalettes/BlockPaletteGenerator.cs b/MinecraftClient/Mapping/BlockPalettes/BlockPaletteGenerator.cs deleted file mode 100644 index 11f7f5d26b..0000000000 --- a/MinecraftClient/Mapping/BlockPalettes/BlockPaletteGenerator.cs +++ /dev/null @@ -1,159 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; - -namespace MinecraftClient.Mapping.BlockPalettes -{ - /// - /// Generator for MCC Block Palette mappings - /// - /// - /// Example for generating MaterialXXX.cs and PaletteXXX.cs from blocks.json: - /// - /// MinecraftClient.Mapping.BlockPalettes.BlockPaletteGenerator.JsonToClass( - /// @"C:\Path\To\blocks.json", - /// @"C:\Path\To\Output\PaletteXXX.cs", - /// @"C:\Path\To\Output\MaterialXXX.cs" - /// ); - /// - /// Place the above example inside the Main() method of Program.cs, adjust paths then compile and run. - /// Do not forget to remove the temporay call to JsonToClass() from Main() once you are done. - /// - public static class BlockPaletteGenerator - { - /// - /// Generate mapping from Minecraft blocks.json - /// - /// path to blocks.json - /// java -cp minecraft_server.jar net.minecraft.data.Main --reports - /// state => block name mappings - public static void GenerateBlockPalette(string blocksJsonFile) - { - BlockPaletteGenerator.JsonToClass(blocksJsonFile, "Palette", "Material"); - } - - /// - /// Generate mapping from Minecraft blocks.json - /// - /// path to blocks.json - /// output path for blocks.cs - /// output path for material.cs - /// java -cp minecraft_server.jar net.minecraft.data.Main --reports - /// state => block name mappings - public static void JsonToClass(string blocksJsonFile, string outputClass, string? outputEnum = null) - { - string outputPalettePath = Path.Combine(Path.GetDirectoryName(blocksJsonFile)!, outputClass + "XXX.cs"); - string outputEnumPath = Path.Combine(Path.GetDirectoryName(blocksJsonFile)!, outputEnum + "XXX.cs"); - - HashSet knownStates = new(); - Dictionary> blocks = new(); - - var palette = Json.ParseJson(File.ReadAllText(blocksJsonFile, Encoding.UTF8))!.AsObject(); - foreach (var item in palette) - { - //minecraft:item_name => ItemName - string blockType = String.Concat( - item.Key.Replace("minecraft:", "") - .Split('_') - .Select(word => char.ToUpper(word[0]) + word.Substring(1)) - ); - - if (blocks.ContainsKey(blockType)) - throw new InvalidDataException("Duplicate block type " + blockType + "!?"); - blocks[blockType] = new HashSet(); - - foreach (var state in item.Value!["states"]!.AsArray()) - { - int id = int.Parse(state!["id"].GetStringValue(), NumberStyles.Any, CultureInfo.CurrentCulture); - - if (knownStates.Contains(id)) - throw new InvalidDataException("Duplicate state id " + id + "!?"); - - knownStates.Add(id); - blocks[blockType].Add(id); - } - } - - HashSet materials = new(); - List outFile = new(); - outFile.AddRange(new[] { - "using System.Collections.Generic;", - "", - "namespace MinecraftClient.Mapping.BlockPalettes", - "{", - " public class PaletteXXX : BlockPalette", - " {", - " private static readonly Dictionary materials = new();", - "", - " static PaletteXXX()", - " {", - }); - - foreach (KeyValuePair> blockType in blocks) - { - if (blockType.Value.Count > 0) - { - List idList = blockType.Value.ToList(); - string materialName = blockType.Key; - materials.Add(materialName); - - if (idList.Count > 1) - { - idList.Sort(); - Queue idQueue = new(idList); - - while (idQueue.Count > 0) - { - int startValue = idQueue.Dequeue(); - int endValue = startValue; - while (idQueue.Count > 0 && idQueue.Peek() == endValue + 1) - endValue = idQueue.Dequeue(); - if (endValue > startValue) - { - outFile.Add(" for (int i = " + startValue + "; i <= " + endValue + "; i++)"); - outFile.Add(" materials[i] = Material." + materialName + ";"); - } - else outFile.Add(" materials[" + startValue + "] = Material." + materialName + ";"); - } - } - else outFile.Add(" materials[" + idList[0] + "] = Material." + materialName + ";"); - } - else throw new InvalidDataException("No state id for block type " + blockType.Key + "!?"); - } - - outFile.AddRange(new[] { - " }", - "", - " protected override Dictionary GetDict()", - " {", - " return materials;", - " }", - " }", - "}" - }); - - File.WriteAllLines(outputPalettePath, outFile); - - if (outputEnum is not null) - { - outFile = new List(); - outFile.AddRange(new[] { - "namespace MinecraftClient.Mapping", - "{", - " public enum Material", - " {" - }); - foreach (string material in materials) - outFile.Add(" " + material + ","); - outFile.AddRange(new[] { - " }", - "}" - }); - File.WriteAllLines(outputEnumPath, outFile); - } - } - } -} diff --git a/MinecraftClient/Mapping/BlockPalettes/BlockStateDefinition.cs b/MinecraftClient/Mapping/BlockPalettes/BlockStateDefinition.cs deleted file mode 100644 index 2578f9aea8..0000000000 --- a/MinecraftClient/Mapping/BlockPalettes/BlockStateDefinition.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; - -namespace MinecraftClient.Mapping.BlockPalettes -{ - /// - /// Compact description of the property combinations in a contiguous block-state range. - /// - public sealed class BlockStateDefinition - { - private static readonly IReadOnlyDictionary s_emptyProperties = - new ReadOnlyDictionary(new Dictionary()); - - private readonly BlockStatePropertyDefinition[] _properties; - public int FirstStateId { get; } - public int LastStateId { get; } - public static IReadOnlyDictionary EmptyProperties => s_emptyProperties; - - public BlockStateDefinition(int firstStateId, int stateCount, BlockStatePropertyDefinition[] properties) - { - ArgumentOutOfRangeException.ThrowIfNegative(firstStateId); - ArgumentOutOfRangeException.ThrowIfNegativeOrZero(stateCount); - ArgumentNullException.ThrowIfNull(properties); - - FirstStateId = firstStateId; - LastStateId = checked(firstStateId + stateCount - 1); - _properties = properties; - } - - public IReadOnlyDictionary GetProperties(int stateId) - { - if (stateId < FirstStateId || stateId > LastStateId) - return EmptyProperties; - - int offset = stateId - FirstStateId; - Dictionary result = new(_properties.Length, StringComparer.Ordinal); - for (int i = 0; i < _properties.Length; i++) - { - BlockStatePropertyDefinition property = _properties[i]; - int valueIndex = (offset / property.Stride) % property.Values.Length; - result[property.Name] = property.Values[valueIndex]; - } - - return result; - } - } - - /// - /// Property name and its values in Minecraft's block-state iteration order. - /// - public sealed class BlockStatePropertyDefinition - { - public string Name { get; } - public string[] Values { get; } - public int Stride { get; } - - public BlockStatePropertyDefinition(string name, string[] values, int stride) - { - ArgumentException.ThrowIfNullOrEmpty(name); - ArgumentNullException.ThrowIfNull(values); - if (values.Length == 0) - throw new ArgumentException("A block-state property must define at least one value.", nameof(values)); - ArgumentOutOfRangeException.ThrowIfNegativeOrZero(stride); - - Name = name; - Values = values; - Stride = stride; - } - } -} diff --git a/MinecraftClient/Mapping/BlockPalettes/Palette112.cs b/MinecraftClient/Mapping/BlockPalettes/Palette112.cs deleted file mode 100644 index 0a9aa9473d..0000000000 --- a/MinecraftClient/Mapping/BlockPalettes/Palette112.cs +++ /dev/null @@ -1,202 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.BlockPalettes -{ - /// - /// Defines mappings for pre-1.13 block IDs to post-1.13 Materials - /// Some block Ids could map to different blocks depending on BlockMeta, here we assumed BlockMeta = 0 - /// Some blocks previously had different IDs depending on state, they have been merged here - /// Comments correspond to changed material names since previous MCC versions - /// - public class Palette112 : BlockPalette - { - private static readonly Dictionary materials = new() - { - { 0, Material.Air }, - { 1, Material.Stone }, - { 2, Material.GrassBlock }, // Grass - { 3, Material.Dirt }, - { 4, Material.Cobblestone }, - { 5, Material.OakPlanks }, // Wood:0 - { 6, Material.OakSapling }, // Sapling:0 - { 7, Material.Bedrock }, - { 8, Material.Water }, // FlowingWater - { 9, Material.Water }, // StationaryWater - { 10, Material.Lava }, // FlowingLava - { 11, Material.Lava }, // StationaryLava - { 12, Material.Sand }, - { 13, Material.Gravel }, - { 14, Material.GoldOre }, - { 15, Material.IronOre }, - { 16, Material.CoalOre }, - { 17, Material.OakLog }, // Log:0 - { 18, Material.OakLeaves }, // Leaves:0 - { 19, Material.Sponge }, - { 20, Material.Glass }, - { 21, Material.LapisOre }, - { 22, Material.LapisBlock }, - { 23, Material.Dispenser }, - { 24, Material.Sandstone }, - { 25, Material.NoteBlock }, - { 26, Material.RedBed }, // Bed:0 - { 27, Material.PoweredRail }, - { 28, Material.DetectorRail }, - { 29, Material.StickyPiston }, // PistonStickyBase - { 30, Material.Cobweb }, // Web - { 31, Material.TallGrass }, // LongGrass - { 32, Material.DeadBush }, - { 33, Material.Piston }, // PistonBase - { 34, Material.PistonHead }, // PistonExtension - { 35, Material.WhiteWool }, // Wool:0 - { 36, Material.MovingPiston }, // PistonMovingPiece - { 37, Material.Dandelion }, // YellowFlower - { 38, Material.Poppy }, // RedRose - { 39, Material.BrownMushroom }, - { 40, Material.RedMushroom }, - { 41, Material.GoldBlock }, - { 42, Material.IronBlock }, - { 43, Material.StoneSlab }, // DoubleStep - { 44, Material.StoneSlab }, // Step - { 45, Material.Bricks }, // Brick - { 46, Material.Tnt }, - { 47, Material.Bookshelf }, - { 48, Material.MossyCobblestone }, - { 49, Material.Obsidian }, - { 50, Material.Torch }, - { 51, Material.Fire }, - { 52, Material.Spawner }, // MobSpawner - { 53, Material.OakStairs }, // WoodStairs:0 - { 54, Material.Chest }, - { 55, Material.RedstoneWire }, - { 56, Material.DiamondOre }, - { 57, Material.DiamondBlock }, - { 58, Material.CraftingTable }, // Workbench - { 59, Material.Wheat }, // Crops - { 60, Material.Farmland }, // Soil - { 61, Material.Furnace }, // Furnace - { 62, Material.Furnace }, // BurningFurnace - { 63, Material.OakWallSign }, // SignPost - { 64, Material.OakDoor }, // WoodenDoor:0 - { 65, Material.Ladder }, - { 66, Material.Rail }, // Rails - { 67, Material.CobblestoneStairs }, - { 68, Material.OakWallSign }, // WallSign - { 69, Material.Lever }, - { 70, Material.StonePressurePlate }, // StonePlate - { 71, Material.IronDoor }, // IronDoorBlock - { 72, Material.OakPressurePlate }, // WoodPlate:0 - { 73, Material.RedstoneOre }, // RedstoneOre - { 74, Material.RedstoneOre }, // GlowingRedstoneOre - { 75, Material.RedstoneTorch }, // RedstoneTorchOff - { 76, Material.RedstoneTorch }, // RedstoneTorchOn - { 77, Material.StoneButton }, - { 78, Material.Snow }, - { 79, Material.Ice }, - { 80, Material.SnowBlock }, - { 81, Material.Cactus }, - { 82, Material.Clay }, - { 83, Material.SugarCane }, // SugarCaneBlock - { 84, Material.Jukebox }, - { 85, Material.OakFence }, // Fence:0 - { 86, Material.Pumpkin }, - { 87, Material.Netherrack }, - { 88, Material.SoulSand }, - { 89, Material.Glowstone }, - { 90, Material.NetherPortal }, // Portal - { 91, Material.JackOLantern }, - { 92, Material.Cake }, // CakeBlock - { 93, Material.Repeater }, // DiodeBlockOff - { 94, Material.Repeater }, // DiodeBlockOn - { 95, Material.WhiteStainedGlass }, // StainedGlass:0 - { 96, Material.OakTrapdoor }, // TrapDoor - { 97, Material.InfestedStone }, // MonsterEggs:0 - { 98, Material.StoneBricks }, // SmoothBrick - { 99, Material.BrownMushroomBlock }, // HugeMushroom1 - { 100, Material.BrownMushroomBlock }, // HugeMushroom2 - { 101, Material.IronBars }, // IronFence - { 102, Material.GlassPane }, // ThinGlass - { 103, Material.Melon }, // MelonBlock - { 104, Material.PumpkinStem }, - { 105, Material.MelonStem }, - { 106, Material.Vine }, - { 107, Material.OakFenceGate }, // FenceGate:0 - { 108, Material.BrickStairs }, - { 109, Material.StoneBrickStairs }, // SmoothStairs - { 110, Material.Mycelium }, // Mycel - { 111, Material.LilyPad }, // WaterLily - { 112, Material.NetherBricks}, // NetherBrick - { 113, Material.NetherBrickFence }, // NetherFence - { 114, Material.NetherBrickStairs }, - { 115, Material.NetherWart }, // NetherWarts - { 116, Material.EnchantingTable }, // EnchantmentTable - { 117, Material.BrewingStand }, - { 118, Material.Cauldron }, - { 119, Material.EndPortal }, // EnderPortal - { 120, Material.EndPortalFrame }, // EnderPortalFrame - { 121, Material.EndStone }, // EnderStone - { 122, Material.DragonEgg }, - { 123, Material.RedstoneLamp }, // RedstoneLampOff - { 124, Material.RedstoneLamp }, // RedstoneLampOn - { 125, Material.OakSlab }, // WoodDoubleStep:0 - { 126, Material.OakSlab }, // WoodStep - { 127, Material.Cocoa }, - { 128, Material.SandstoneStairs }, - { 129, Material.EmeraldOre }, - { 130, Material.EnderChest }, - { 131, Material.TripwireHook }, - { 132, Material.Tripwire }, - { 133, Material.EmeraldBlock }, - { 134, Material.SpruceStairs }, // SpruceWoodStairs - { 135, Material.BirchStairs }, // BirchWoodStairs - { 136, Material.JungleStairs }, // JungleWoodStairs - { 137, Material.CommandBlock }, // Command - { 138, Material.Beacon }, - { 139, Material.CobblestoneWall }, // CobbleWall - { 140, Material.FlowerPot }, - { 141, Material.Carrots }, // Carrot - { 142, Material.Potatoes }, // Potato - { 143, Material.OakButton }, // WoodButton - { 144, Material.SkeletonSkull }, // Skull:0 - { 145, Material.Anvil }, - { 146, Material.TrappedChest }, - { 147, Material.LightWeightedPressurePlate }, // GoldPlate - { 148, Material.HeavyWeightedPressurePlate }, // IronPlate - { 149, Material.Comparator }, // RedstoneComparatorOff - { 150, Material.Comparator }, // RedstoneComparatorOn - { 151, Material.DaylightDetector }, - { 152, Material.RedstoneBlock }, - { 153, Material.QuartzBlock }, // QuartzOre - { 154, Material.Hopper }, - { 155, Material.QuartzBlock }, - { 156, Material.QuartzStairs }, - { 157, Material.ActivatorRail }, - { 158, Material.Dropper }, - { 159, Material.WhiteConcrete }, // StainedClay:0 - { 160, Material.WhiteStainedGlassPane }, // StainedGlassPane:0 - { 161, Material.OakLeaves }, // Leaves2:0 - { 162, Material.OakLog }, // Log2:0 - { 163, Material.AcaciaStairs }, - { 164, Material.DarkOakStairs }, - { 170, Material.HayBlock }, - { 171, Material.WhiteCarpet }, // Carpet:0 - { 172, Material.WhiteConcrete }, // HardClay - { 173, Material.CoalBlock }, - { 174, Material.PackedIce }, - { 175, Material.TallGrass }, // DoublePlant - { 207, Material.Beetroots }, // BeetrootBlock - }; - - protected override Dictionary GetDict() - { - return materials; - } - - public override bool IdHasMetadata - { - get - { - return true; - } - } - } -} diff --git a/MinecraftClient/Mapping/BlockPalettes/Palette113.cs b/MinecraftClient/Mapping/BlockPalettes/Palette113.cs deleted file mode 100644 index f70b239318..0000000000 --- a/MinecraftClient/Mapping/BlockPalettes/Palette113.cs +++ /dev/null @@ -1,2779 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.BlockPalettes -{ - /// - /// Defines mappings for Minecraft 1.13. - /// Automatically generated using BlockPaletteGenerator.cs - /// - public class Palette113 : BlockPalette - { - private static readonly Dictionary materials = new(); - - static Palette113() - { - materials[0] = Material.Air; - materials[1] = Material.Stone; - materials[2] = Material.Granite; - materials[3] = Material.PolishedGranite; - materials[4] = Material.Diorite; - materials[5] = Material.PolishedDiorite; - materials[6] = Material.Andesite; - materials[7] = Material.PolishedAndesite; - for (int i = 8; i <= 9; i++) - materials[i] = Material.GrassBlock; - materials[10] = Material.Dirt; - materials[11] = Material.CoarseDirt; - for (int i = 12; i <= 13; i++) - materials[i] = Material.Podzol; - materials[14] = Material.Cobblestone; - materials[15] = Material.OakPlanks; - materials[16] = Material.SprucePlanks; - materials[17] = Material.BirchPlanks; - materials[18] = Material.JunglePlanks; - materials[19] = Material.AcaciaPlanks; - materials[20] = Material.DarkOakPlanks; - for (int i = 21; i <= 22; i++) - materials[i] = Material.OakSapling; - for (int i = 23; i <= 24; i++) - materials[i] = Material.SpruceSapling; - for (int i = 25; i <= 26; i++) - materials[i] = Material.BirchSapling; - for (int i = 27; i <= 28; i++) - materials[i] = Material.JungleSapling; - for (int i = 29; i <= 30; i++) - materials[i] = Material.AcaciaSapling; - for (int i = 31; i <= 32; i++) - materials[i] = Material.DarkOakSapling; - materials[33] = Material.Bedrock; - for (int i = 34; i <= 49; i++) - materials[i] = Material.Water; - for (int i = 50; i <= 65; i++) - materials[i] = Material.Lava; - materials[66] = Material.Sand; - materials[67] = Material.RedSand; - materials[68] = Material.Gravel; - materials[69] = Material.GoldOre; - materials[70] = Material.IronOre; - materials[71] = Material.CoalOre; - for (int i = 72; i <= 74; i++) - materials[i] = Material.OakLog; - for (int i = 75; i <= 77; i++) - materials[i] = Material.SpruceLog; - for (int i = 78; i <= 80; i++) - materials[i] = Material.BirchLog; - for (int i = 81; i <= 83; i++) - materials[i] = Material.JungleLog; - for (int i = 84; i <= 86; i++) - materials[i] = Material.AcaciaLog; - for (int i = 87; i <= 89; i++) - materials[i] = Material.DarkOakLog; - for (int i = 90; i <= 92; i++) - materials[i] = Material.StrippedSpruceLog; - for (int i = 93; i <= 95; i++) - materials[i] = Material.StrippedBirchLog; - for (int i = 96; i <= 98; i++) - materials[i] = Material.StrippedJungleLog; - for (int i = 99; i <= 101; i++) - materials[i] = Material.StrippedAcaciaLog; - for (int i = 102; i <= 104; i++) - materials[i] = Material.StrippedDarkOakLog; - for (int i = 105; i <= 107; i++) - materials[i] = Material.StrippedOakLog; - for (int i = 108; i <= 110; i++) - materials[i] = Material.OakWood; - for (int i = 111; i <= 113; i++) - materials[i] = Material.SpruceWood; - for (int i = 114; i <= 116; i++) - materials[i] = Material.BirchWood; - for (int i = 117; i <= 119; i++) - materials[i] = Material.JungleWood; - for (int i = 120; i <= 122; i++) - materials[i] = Material.AcaciaWood; - for (int i = 123; i <= 125; i++) - materials[i] = Material.DarkOakWood; - for (int i = 126; i <= 128; i++) - materials[i] = Material.StrippedOakWood; - for (int i = 129; i <= 131; i++) - materials[i] = Material.StrippedSpruceWood; - for (int i = 132; i <= 134; i++) - materials[i] = Material.StrippedBirchWood; - for (int i = 135; i <= 137; i++) - materials[i] = Material.StrippedJungleWood; - for (int i = 138; i <= 140; i++) - materials[i] = Material.StrippedAcaciaWood; - for (int i = 141; i <= 143; i++) - materials[i] = Material.StrippedDarkOakWood; - for (int i = 144; i <= 157; i++) - materials[i] = Material.OakLeaves; - for (int i = 158; i <= 171; i++) - materials[i] = Material.SpruceLeaves; - for (int i = 172; i <= 185; i++) - materials[i] = Material.BirchLeaves; - for (int i = 186; i <= 199; i++) - materials[i] = Material.JungleLeaves; - for (int i = 200; i <= 213; i++) - materials[i] = Material.AcaciaLeaves; - for (int i = 214; i <= 227; i++) - materials[i] = Material.DarkOakLeaves; - materials[228] = Material.Sponge; - materials[229] = Material.WetSponge; - materials[230] = Material.Glass; - materials[231] = Material.LapisOre; - materials[232] = Material.LapisBlock; - for (int i = 233; i <= 244; i++) - materials[i] = Material.Dispenser; - materials[245] = Material.Sandstone; - materials[246] = Material.ChiseledSandstone; - materials[247] = Material.CutSandstone; - for (int i = 248; i <= 747; i++) - materials[i] = Material.NoteBlock; - for (int i = 748; i <= 763; i++) - materials[i] = Material.WhiteBed; - for (int i = 764; i <= 779; i++) - materials[i] = Material.OrangeBed; - for (int i = 780; i <= 795; i++) - materials[i] = Material.MagentaBed; - for (int i = 796; i <= 811; i++) - materials[i] = Material.LightBlueBed; - for (int i = 812; i <= 827; i++) - materials[i] = Material.YellowBed; - for (int i = 828; i <= 843; i++) - materials[i] = Material.LimeBed; - for (int i = 844; i <= 859; i++) - materials[i] = Material.PinkBed; - for (int i = 860; i <= 875; i++) - materials[i] = Material.GrayBed; - for (int i = 876; i <= 891; i++) - materials[i] = Material.LightGrayBed; - for (int i = 892; i <= 907; i++) - materials[i] = Material.CyanBed; - for (int i = 908; i <= 923; i++) - materials[i] = Material.PurpleBed; - for (int i = 924; i <= 939; i++) - materials[i] = Material.BlueBed; - for (int i = 940; i <= 955; i++) - materials[i] = Material.BrownBed; - for (int i = 956; i <= 971; i++) - materials[i] = Material.GreenBed; - for (int i = 972; i <= 987; i++) - materials[i] = Material.RedBed; - for (int i = 988; i <= 1003; i++) - materials[i] = Material.BlackBed; - for (int i = 1004; i <= 1015; i++) - materials[i] = Material.PoweredRail; - for (int i = 1016; i <= 1027; i++) - materials[i] = Material.DetectorRail; - for (int i = 1028; i <= 1039; i++) - materials[i] = Material.StickyPiston; - materials[1040] = Material.Cobweb; - materials[1041] = Material.ShortGrass; - materials[1042] = Material.Fern; - materials[1043] = Material.DeadBush; - materials[1044] = Material.Seagrass; - for (int i = 1045; i <= 1046; i++) - materials[i] = Material.TallSeagrass; - for (int i = 1047; i <= 1058; i++) - materials[i] = Material.Piston; - for (int i = 1059; i <= 1082; i++) - materials[i] = Material.PistonHead; - materials[1083] = Material.WhiteWool; - materials[1084] = Material.OrangeWool; - materials[1085] = Material.MagentaWool; - materials[1086] = Material.LightBlueWool; - materials[1087] = Material.YellowWool; - materials[1088] = Material.LimeWool; - materials[1089] = Material.PinkWool; - materials[1090] = Material.GrayWool; - materials[1091] = Material.LightGrayWool; - materials[1092] = Material.CyanWool; - materials[1093] = Material.PurpleWool; - materials[1094] = Material.BlueWool; - materials[1095] = Material.BrownWool; - materials[1096] = Material.GreenWool; - materials[1097] = Material.RedWool; - materials[1098] = Material.BlackWool; - for (int i = 1099; i <= 1110; i++) - materials[i] = Material.MovingPiston; - materials[1111] = Material.Dandelion; - materials[1112] = Material.Poppy; - materials[1113] = Material.BlueOrchid; - materials[1114] = Material.Allium; - materials[1115] = Material.AzureBluet; - materials[1116] = Material.RedTulip; - materials[1117] = Material.OrangeTulip; - materials[1118] = Material.WhiteTulip; - materials[1119] = Material.PinkTulip; - materials[1120] = Material.OxeyeDaisy; - materials[1121] = Material.BrownMushroom; - materials[1122] = Material.RedMushroom; - materials[1123] = Material.GoldBlock; - materials[1124] = Material.IronBlock; - materials[1125] = Material.Bricks; - for (int i = 1126; i <= 1127; i++) - materials[i] = Material.Tnt; - materials[1128] = Material.Bookshelf; - materials[1129] = Material.MossyCobblestone; - materials[1130] = Material.Obsidian; - materials[1131] = Material.Torch; - for (int i = 1132; i <= 1135; i++) - materials[i] = Material.WallTorch; - for (int i = 1136; i <= 1647; i++) - materials[i] = Material.Fire; - materials[1648] = Material.Spawner; - for (int i = 1649; i <= 1728; i++) - materials[i] = Material.OakStairs; - for (int i = 1729; i <= 1752; i++) - materials[i] = Material.Chest; - for (int i = 1753; i <= 3048; i++) - materials[i] = Material.RedstoneWire; - materials[3049] = Material.DiamondOre; - materials[3050] = Material.DiamondBlock; - materials[3051] = Material.CraftingTable; - for (int i = 3052; i <= 3059; i++) - materials[i] = Material.Wheat; - for (int i = 3060; i <= 3067; i++) - materials[i] = Material.Farmland; - for (int i = 3068; i <= 3075; i++) - materials[i] = Material.Furnace; - for (int i = 3076; i <= 3107; i++) - materials[i] = Material.OakSign; - for (int i = 3108; i <= 3171; i++) - materials[i] = Material.OakDoor; - for (int i = 3172; i <= 3179; i++) - materials[i] = Material.Ladder; - for (int i = 3180; i <= 3189; i++) - materials[i] = Material.Rail; - for (int i = 3190; i <= 3269; i++) - materials[i] = Material.CobblestoneStairs; - for (int i = 3270; i <= 3277; i++) - materials[i] = Material.OakWallSign; - for (int i = 3278; i <= 3301; i++) - materials[i] = Material.Lever; - for (int i = 3302; i <= 3303; i++) - materials[i] = Material.StonePressurePlate; - for (int i = 3304; i <= 3367; i++) - materials[i] = Material.IronDoor; - for (int i = 3368; i <= 3369; i++) - materials[i] = Material.OakPressurePlate; - for (int i = 3370; i <= 3371; i++) - materials[i] = Material.SprucePressurePlate; - for (int i = 3372; i <= 3373; i++) - materials[i] = Material.BirchPressurePlate; - for (int i = 3374; i <= 3375; i++) - materials[i] = Material.JunglePressurePlate; - for (int i = 3376; i <= 3377; i++) - materials[i] = Material.AcaciaPressurePlate; - for (int i = 3378; i <= 3379; i++) - materials[i] = Material.DarkOakPressurePlate; - for (int i = 3380; i <= 3381; i++) - materials[i] = Material.RedstoneOre; - for (int i = 3382; i <= 3383; i++) - materials[i] = Material.RedstoneTorch; - for (int i = 3384; i <= 3391; i++) - materials[i] = Material.RedstoneWallTorch; - for (int i = 3392; i <= 3415; i++) - materials[i] = Material.StoneButton; - for (int i = 3416; i <= 3423; i++) - materials[i] = Material.Snow; - materials[3424] = Material.Ice; - materials[3425] = Material.SnowBlock; - for (int i = 3426; i <= 3441; i++) - materials[i] = Material.Cactus; - materials[3442] = Material.Clay; - for (int i = 3443; i <= 3458; i++) - materials[i] = Material.SugarCane; - for (int i = 3459; i <= 3460; i++) - materials[i] = Material.Jukebox; - for (int i = 3461; i <= 3492; i++) - materials[i] = Material.OakFence; - materials[3493] = Material.Pumpkin; - materials[3494] = Material.Netherrack; - materials[3495] = Material.SoulSand; - materials[3496] = Material.Glowstone; - for (int i = 3497; i <= 3498; i++) - materials[i] = Material.NetherPortal; - for (int i = 3499; i <= 3502; i++) - materials[i] = Material.CarvedPumpkin; - for (int i = 3503; i <= 3506; i++) - materials[i] = Material.JackOLantern; - for (int i = 3507; i <= 3513; i++) - materials[i] = Material.Cake; - for (int i = 3514; i <= 3577; i++) - materials[i] = Material.Repeater; - materials[3578] = Material.WhiteStainedGlass; - materials[3579] = Material.OrangeStainedGlass; - materials[3580] = Material.MagentaStainedGlass; - materials[3581] = Material.LightBlueStainedGlass; - materials[3582] = Material.YellowStainedGlass; - materials[3583] = Material.LimeStainedGlass; - materials[3584] = Material.PinkStainedGlass; - materials[3585] = Material.GrayStainedGlass; - materials[3586] = Material.LightGrayStainedGlass; - materials[3587] = Material.CyanStainedGlass; - materials[3588] = Material.PurpleStainedGlass; - materials[3589] = Material.BlueStainedGlass; - materials[3590] = Material.BrownStainedGlass; - materials[3591] = Material.GreenStainedGlass; - materials[3592] = Material.RedStainedGlass; - materials[3593] = Material.BlackStainedGlass; - for (int i = 3594; i <= 3657; i++) - materials[i] = Material.OakTrapdoor; - for (int i = 3658; i <= 3721; i++) - materials[i] = Material.SpruceTrapdoor; - for (int i = 3722; i <= 3785; i++) - materials[i] = Material.BirchTrapdoor; - for (int i = 3786; i <= 3849; i++) - materials[i] = Material.JungleTrapdoor; - for (int i = 3850; i <= 3913; i++) - materials[i] = Material.AcaciaTrapdoor; - for (int i = 3914; i <= 3977; i++) - materials[i] = Material.DarkOakTrapdoor; - materials[3978] = Material.InfestedStone; - materials[3979] = Material.InfestedCobblestone; - materials[3980] = Material.InfestedStoneBricks; - materials[3981] = Material.InfestedMossyStoneBricks; - materials[3982] = Material.InfestedCrackedStoneBricks; - materials[3983] = Material.InfestedChiseledStoneBricks; - materials[3984] = Material.StoneBricks; - materials[3985] = Material.MossyStoneBricks; - materials[3986] = Material.CrackedStoneBricks; - materials[3987] = Material.ChiseledStoneBricks; - for (int i = 3988; i <= 4051; i++) - materials[i] = Material.BrownMushroomBlock; - for (int i = 4052; i <= 4115; i++) - materials[i] = Material.RedMushroomBlock; - for (int i = 4116; i <= 4179; i++) - materials[i] = Material.MushroomStem; - for (int i = 4180; i <= 4211; i++) - materials[i] = Material.IronBars; - for (int i = 4212; i <= 4243; i++) - materials[i] = Material.GlassPane; - materials[4244] = Material.Melon; - for (int i = 4245; i <= 4248; i++) - materials[i] = Material.AttachedPumpkinStem; - for (int i = 4249; i <= 4252; i++) - materials[i] = Material.AttachedMelonStem; - for (int i = 4253; i <= 4260; i++) - materials[i] = Material.PumpkinStem; - for (int i = 4261; i <= 4268; i++) - materials[i] = Material.MelonStem; - for (int i = 4269; i <= 4300; i++) - materials[i] = Material.Vine; - for (int i = 4301; i <= 4332; i++) - materials[i] = Material.OakFenceGate; - for (int i = 4333; i <= 4412; i++) - materials[i] = Material.BrickStairs; - for (int i = 4413; i <= 4492; i++) - materials[i] = Material.StoneBrickStairs; - for (int i = 4493; i <= 4494; i++) - materials[i] = Material.Mycelium; - materials[4495] = Material.LilyPad; - materials[4496] = Material.NetherBricks; - for (int i = 4497; i <= 4528; i++) - materials[i] = Material.NetherBrickFence; - for (int i = 4529; i <= 4608; i++) - materials[i] = Material.NetherBrickStairs; - for (int i = 4609; i <= 4612; i++) - materials[i] = Material.NetherWart; - materials[4613] = Material.EnchantingTable; - for (int i = 4614; i <= 4621; i++) - materials[i] = Material.BrewingStand; - for (int i = 4622; i <= 4625; i++) - materials[i] = Material.Cauldron; - materials[4626] = Material.EndPortal; - for (int i = 4627; i <= 4634; i++) - materials[i] = Material.EndPortalFrame; - materials[4635] = Material.EndStone; - materials[4636] = Material.DragonEgg; - for (int i = 4637; i <= 4638; i++) - materials[i] = Material.RedstoneLamp; - for (int i = 4639; i <= 4650; i++) - materials[i] = Material.Cocoa; - for (int i = 4651; i <= 4730; i++) - materials[i] = Material.SandstoneStairs; - materials[4731] = Material.EmeraldOre; - for (int i = 4732; i <= 4739; i++) - materials[i] = Material.EnderChest; - for (int i = 4740; i <= 4755; i++) - materials[i] = Material.TripwireHook; - for (int i = 4756; i <= 4883; i++) - materials[i] = Material.Tripwire; - materials[4884] = Material.EmeraldBlock; - for (int i = 4885; i <= 4964; i++) - materials[i] = Material.SpruceStairs; - for (int i = 4965; i <= 5044; i++) - materials[i] = Material.BirchStairs; - for (int i = 5045; i <= 5124; i++) - materials[i] = Material.JungleStairs; - for (int i = 5125; i <= 5136; i++) - materials[i] = Material.CommandBlock; - materials[5137] = Material.Beacon; - for (int i = 5138; i <= 5201; i++) - materials[i] = Material.CobblestoneWall; - for (int i = 5202; i <= 5265; i++) - materials[i] = Material.MossyCobblestoneWall; - materials[5266] = Material.FlowerPot; - materials[5267] = Material.PottedOakSapling; - materials[5268] = Material.PottedSpruceSapling; - materials[5269] = Material.PottedBirchSapling; - materials[5270] = Material.PottedJungleSapling; - materials[5271] = Material.PottedAcaciaSapling; - materials[5272] = Material.PottedDarkOakSapling; - materials[5273] = Material.PottedFern; - materials[5274] = Material.PottedDandelion; - materials[5275] = Material.PottedPoppy; - materials[5276] = Material.PottedBlueOrchid; - materials[5277] = Material.PottedAllium; - materials[5278] = Material.PottedAzureBluet; - materials[5279] = Material.PottedRedTulip; - materials[5280] = Material.PottedOrangeTulip; - materials[5281] = Material.PottedWhiteTulip; - materials[5282] = Material.PottedPinkTulip; - materials[5283] = Material.PottedOxeyeDaisy; - materials[5284] = Material.PottedRedMushroom; - materials[5285] = Material.PottedBrownMushroom; - materials[5286] = Material.PottedDeadBush; - materials[5287] = Material.PottedCactus; - for (int i = 5288; i <= 5295; i++) - materials[i] = Material.Carrots; - for (int i = 5296; i <= 5303; i++) - materials[i] = Material.Potatoes; - for (int i = 5304; i <= 5327; i++) - materials[i] = Material.OakButton; - for (int i = 5328; i <= 5351; i++) - materials[i] = Material.SpruceButton; - for (int i = 5352; i <= 5375; i++) - materials[i] = Material.BirchButton; - for (int i = 5376; i <= 5399; i++) - materials[i] = Material.JungleButton; - for (int i = 5400; i <= 5423; i++) - materials[i] = Material.AcaciaButton; - for (int i = 5424; i <= 5447; i++) - materials[i] = Material.DarkOakButton; - for (int i = 5448; i <= 5451; i++) - materials[i] = Material.SkeletonWallSkull; - for (int i = 5452; i <= 5467; i++) - materials[i] = Material.SkeletonSkull; - for (int i = 5468; i <= 5471; i++) - materials[i] = Material.WitherSkeletonWallSkull; - for (int i = 5472; i <= 5487; i++) - materials[i] = Material.WitherSkeletonSkull; - for (int i = 5488; i <= 5491; i++) - materials[i] = Material.ZombieWallHead; - for (int i = 5492; i <= 5507; i++) - materials[i] = Material.ZombieHead; - for (int i = 5508; i <= 5511; i++) - materials[i] = Material.PlayerWallHead; - for (int i = 5512; i <= 5527; i++) - materials[i] = Material.PlayerHead; - for (int i = 5528; i <= 5531; i++) - materials[i] = Material.CreeperWallHead; - for (int i = 5532; i <= 5547; i++) - materials[i] = Material.CreeperHead; - for (int i = 5548; i <= 5551; i++) - materials[i] = Material.DragonWallHead; - for (int i = 5552; i <= 5567; i++) - materials[i] = Material.DragonHead; - for (int i = 5568; i <= 5571; i++) - materials[i] = Material.Anvil; - for (int i = 5572; i <= 5575; i++) - materials[i] = Material.ChippedAnvil; - for (int i = 5576; i <= 5579; i++) - materials[i] = Material.DamagedAnvil; - for (int i = 5580; i <= 5603; i++) - materials[i] = Material.TrappedChest; - for (int i = 5604; i <= 5619; i++) - materials[i] = Material.LightWeightedPressurePlate; - for (int i = 5620; i <= 5635; i++) - materials[i] = Material.HeavyWeightedPressurePlate; - for (int i = 5636; i <= 5651; i++) - materials[i] = Material.Comparator; - for (int i = 5652; i <= 5683; i++) - materials[i] = Material.DaylightDetector; - materials[5684] = Material.RedstoneBlock; - materials[5685] = Material.NetherQuartzOre; - for (int i = 5686; i <= 5695; i++) - materials[i] = Material.Hopper; - materials[5696] = Material.QuartzBlock; - materials[5697] = Material.ChiseledQuartzBlock; - for (int i = 5698; i <= 5700; i++) - materials[i] = Material.QuartzPillar; - for (int i = 5701; i <= 5780; i++) - materials[i] = Material.QuartzStairs; - for (int i = 5781; i <= 5792; i++) - materials[i] = Material.ActivatorRail; - for (int i = 5793; i <= 5804; i++) - materials[i] = Material.Dropper; - materials[5805] = Material.WhiteTerracotta; - materials[5806] = Material.OrangeTerracotta; - materials[5807] = Material.MagentaTerracotta; - materials[5808] = Material.LightBlueTerracotta; - materials[5809] = Material.YellowTerracotta; - materials[5810] = Material.LimeTerracotta; - materials[5811] = Material.PinkTerracotta; - materials[5812] = Material.GrayTerracotta; - materials[5813] = Material.LightGrayTerracotta; - materials[5814] = Material.CyanTerracotta; - materials[5815] = Material.PurpleTerracotta; - materials[5816] = Material.BlueTerracotta; - materials[5817] = Material.BrownTerracotta; - materials[5818] = Material.GreenTerracotta; - materials[5819] = Material.RedTerracotta; - materials[5820] = Material.BlackTerracotta; - for (int i = 5821; i <= 5852; i++) - materials[i] = Material.WhiteStainedGlassPane; - for (int i = 5853; i <= 5884; i++) - materials[i] = Material.OrangeStainedGlassPane; - for (int i = 5885; i <= 5916; i++) - materials[i] = Material.MagentaStainedGlassPane; - for (int i = 5917; i <= 5948; i++) - materials[i] = Material.LightBlueStainedGlassPane; - for (int i = 5949; i <= 5980; i++) - materials[i] = Material.YellowStainedGlassPane; - for (int i = 5981; i <= 6012; i++) - materials[i] = Material.LimeStainedGlassPane; - for (int i = 6013; i <= 6044; i++) - materials[i] = Material.PinkStainedGlassPane; - for (int i = 6045; i <= 6076; i++) - materials[i] = Material.GrayStainedGlassPane; - for (int i = 6077; i <= 6108; i++) - materials[i] = Material.LightGrayStainedGlassPane; - for (int i = 6109; i <= 6140; i++) - materials[i] = Material.CyanStainedGlassPane; - for (int i = 6141; i <= 6172; i++) - materials[i] = Material.PurpleStainedGlassPane; - for (int i = 6173; i <= 6204; i++) - materials[i] = Material.BlueStainedGlassPane; - for (int i = 6205; i <= 6236; i++) - materials[i] = Material.BrownStainedGlassPane; - for (int i = 6237; i <= 6268; i++) - materials[i] = Material.GreenStainedGlassPane; - for (int i = 6269; i <= 6300; i++) - materials[i] = Material.RedStainedGlassPane; - for (int i = 6301; i <= 6332; i++) - materials[i] = Material.BlackStainedGlassPane; - for (int i = 6333; i <= 6412; i++) - materials[i] = Material.AcaciaStairs; - for (int i = 6413; i <= 6492; i++) - materials[i] = Material.DarkOakStairs; - materials[6493] = Material.SlimeBlock; - materials[6494] = Material.Barrier; - for (int i = 6495; i <= 6558; i++) - materials[i] = Material.IronTrapdoor; - materials[6559] = Material.Prismarine; - materials[6560] = Material.PrismarineBricks; - materials[6561] = Material.DarkPrismarine; - for (int i = 6562; i <= 6641; i++) - materials[i] = Material.PrismarineStairs; - for (int i = 6642; i <= 6721; i++) - materials[i] = Material.PrismarineBrickStairs; - for (int i = 6722; i <= 6801; i++) - materials[i] = Material.DarkPrismarineStairs; - for (int i = 6802; i <= 6807; i++) - materials[i] = Material.PrismarineSlab; - for (int i = 6808; i <= 6813; i++) - materials[i] = Material.PrismarineBrickSlab; - for (int i = 6814; i <= 6819; i++) - materials[i] = Material.DarkPrismarineSlab; - materials[6820] = Material.SeaLantern; - for (int i = 6821; i <= 6823; i++) - materials[i] = Material.HayBlock; - materials[6824] = Material.WhiteCarpet; - materials[6825] = Material.OrangeCarpet; - materials[6826] = Material.MagentaCarpet; - materials[6827] = Material.LightBlueCarpet; - materials[6828] = Material.YellowCarpet; - materials[6829] = Material.LimeCarpet; - materials[6830] = Material.PinkCarpet; - materials[6831] = Material.GrayCarpet; - materials[6832] = Material.LightGrayCarpet; - materials[6833] = Material.CyanCarpet; - materials[6834] = Material.PurpleCarpet; - materials[6835] = Material.BlueCarpet; - materials[6836] = Material.BrownCarpet; - materials[6837] = Material.GreenCarpet; - materials[6838] = Material.RedCarpet; - materials[6839] = Material.BlackCarpet; - materials[6840] = Material.Terracotta; - materials[6841] = Material.CoalBlock; - materials[6842] = Material.PackedIce; - for (int i = 6843; i <= 6844; i++) - materials[i] = Material.Sunflower; - for (int i = 6845; i <= 6846; i++) - materials[i] = Material.Lilac; - for (int i = 6847; i <= 6848; i++) - materials[i] = Material.RoseBush; - for (int i = 6849; i <= 6850; i++) - materials[i] = Material.Peony; - for (int i = 6851; i <= 6852; i++) - materials[i] = Material.TallGrass; - for (int i = 6853; i <= 6854; i++) - materials[i] = Material.LargeFern; - for (int i = 6855; i <= 6870; i++) - materials[i] = Material.WhiteBanner; - for (int i = 6871; i <= 6886; i++) - materials[i] = Material.OrangeBanner; - for (int i = 6887; i <= 6902; i++) - materials[i] = Material.MagentaBanner; - for (int i = 6903; i <= 6918; i++) - materials[i] = Material.LightBlueBanner; - for (int i = 6919; i <= 6934; i++) - materials[i] = Material.YellowBanner; - for (int i = 6935; i <= 6950; i++) - materials[i] = Material.LimeBanner; - for (int i = 6951; i <= 6966; i++) - materials[i] = Material.PinkBanner; - for (int i = 6967; i <= 6982; i++) - materials[i] = Material.GrayBanner; - for (int i = 6983; i <= 6998; i++) - materials[i] = Material.LightGrayBanner; - for (int i = 6999; i <= 7014; i++) - materials[i] = Material.CyanBanner; - for (int i = 7015; i <= 7030; i++) - materials[i] = Material.PurpleBanner; - for (int i = 7031; i <= 7046; i++) - materials[i] = Material.BlueBanner; - for (int i = 7047; i <= 7062; i++) - materials[i] = Material.BrownBanner; - for (int i = 7063; i <= 7078; i++) - materials[i] = Material.GreenBanner; - for (int i = 7079; i <= 7094; i++) - materials[i] = Material.RedBanner; - for (int i = 7095; i <= 7110; i++) - materials[i] = Material.BlackBanner; - for (int i = 7111; i <= 7114; i++) - materials[i] = Material.WhiteWallBanner; - for (int i = 7115; i <= 7118; i++) - materials[i] = Material.OrangeWallBanner; - for (int i = 7119; i <= 7122; i++) - materials[i] = Material.MagentaWallBanner; - for (int i = 7123; i <= 7126; i++) - materials[i] = Material.LightBlueWallBanner; - for (int i = 7127; i <= 7130; i++) - materials[i] = Material.YellowWallBanner; - for (int i = 7131; i <= 7134; i++) - materials[i] = Material.LimeWallBanner; - for (int i = 7135; i <= 7138; i++) - materials[i] = Material.PinkWallBanner; - for (int i = 7139; i <= 7142; i++) - materials[i] = Material.GrayWallBanner; - for (int i = 7143; i <= 7146; i++) - materials[i] = Material.LightGrayWallBanner; - for (int i = 7147; i <= 7150; i++) - materials[i] = Material.CyanWallBanner; - for (int i = 7151; i <= 7154; i++) - materials[i] = Material.PurpleWallBanner; - for (int i = 7155; i <= 7158; i++) - materials[i] = Material.BlueWallBanner; - for (int i = 7159; i <= 7162; i++) - materials[i] = Material.BrownWallBanner; - for (int i = 7163; i <= 7166; i++) - materials[i] = Material.GreenWallBanner; - for (int i = 7167; i <= 7170; i++) - materials[i] = Material.RedWallBanner; - for (int i = 7171; i <= 7174; i++) - materials[i] = Material.BlackWallBanner; - materials[7175] = Material.RedSandstone; - materials[7176] = Material.ChiseledRedSandstone; - materials[7177] = Material.CutRedSandstone; - for (int i = 7178; i <= 7257; i++) - materials[i] = Material.RedSandstoneStairs; - for (int i = 7258; i <= 7263; i++) - materials[i] = Material.OakSlab; - for (int i = 7264; i <= 7269; i++) - materials[i] = Material.SpruceSlab; - for (int i = 7270; i <= 7275; i++) - materials[i] = Material.BirchSlab; - for (int i = 7276; i <= 7281; i++) - materials[i] = Material.JungleSlab; - for (int i = 7282; i <= 7287; i++) - materials[i] = Material.AcaciaSlab; - for (int i = 7288; i <= 7293; i++) - materials[i] = Material.DarkOakSlab; - for (int i = 7294; i <= 7299; i++) - materials[i] = Material.StoneSlab; - for (int i = 7300; i <= 7305; i++) - materials[i] = Material.SandstoneSlab; - for (int i = 7306; i <= 7311; i++) - materials[i] = Material.PetrifiedOakSlab; - for (int i = 7312; i <= 7317; i++) - materials[i] = Material.CobblestoneSlab; - for (int i = 7318; i <= 7323; i++) - materials[i] = Material.BrickSlab; - for (int i = 7324; i <= 7329; i++) - materials[i] = Material.StoneBrickSlab; - for (int i = 7330; i <= 7335; i++) - materials[i] = Material.NetherBrickSlab; - for (int i = 7336; i <= 7341; i++) - materials[i] = Material.QuartzSlab; - for (int i = 7342; i <= 7347; i++) - materials[i] = Material.RedSandstoneSlab; - for (int i = 7348; i <= 7353; i++) - materials[i] = Material.PurpurSlab; - materials[7354] = Material.SmoothStone; - materials[7355] = Material.SmoothSandstone; - materials[7356] = Material.SmoothQuartz; - materials[7357] = Material.SmoothRedSandstone; - for (int i = 7358; i <= 7389; i++) - materials[i] = Material.SpruceFenceGate; - for (int i = 7390; i <= 7421; i++) - materials[i] = Material.BirchFenceGate; - for (int i = 7422; i <= 7453; i++) - materials[i] = Material.JungleFenceGate; - for (int i = 7454; i <= 7485; i++) - materials[i] = Material.AcaciaFenceGate; - for (int i = 7486; i <= 7517; i++) - materials[i] = Material.DarkOakFenceGate; - for (int i = 7518; i <= 7549; i++) - materials[i] = Material.SpruceFence; - for (int i = 7550; i <= 7581; i++) - materials[i] = Material.BirchFence; - for (int i = 7582; i <= 7613; i++) - materials[i] = Material.JungleFence; - for (int i = 7614; i <= 7645; i++) - materials[i] = Material.AcaciaFence; - for (int i = 7646; i <= 7677; i++) - materials[i] = Material.DarkOakFence; - for (int i = 7678; i <= 7741; i++) - materials[i] = Material.SpruceDoor; - for (int i = 7742; i <= 7805; i++) - materials[i] = Material.BirchDoor; - for (int i = 7806; i <= 7869; i++) - materials[i] = Material.JungleDoor; - for (int i = 7870; i <= 7933; i++) - materials[i] = Material.AcaciaDoor; - for (int i = 7934; i <= 7997; i++) - materials[i] = Material.DarkOakDoor; - for (int i = 7998; i <= 8003; i++) - materials[i] = Material.EndRod; - for (int i = 8004; i <= 8067; i++) - materials[i] = Material.ChorusPlant; - for (int i = 8068; i <= 8073; i++) - materials[i] = Material.ChorusFlower; - materials[8074] = Material.PurpurBlock; - for (int i = 8075; i <= 8077; i++) - materials[i] = Material.PurpurPillar; - for (int i = 8078; i <= 8157; i++) - materials[i] = Material.PurpurStairs; - materials[8158] = Material.EndStoneBricks; - for (int i = 8159; i <= 8162; i++) - materials[i] = Material.Beetroots; - materials[8163] = Material.DirtPath; - materials[8164] = Material.EndGateway; - for (int i = 8165; i <= 8176; i++) - materials[i] = Material.RepeatingCommandBlock; - for (int i = 8177; i <= 8188; i++) - materials[i] = Material.ChainCommandBlock; - for (int i = 8189; i <= 8192; i++) - materials[i] = Material.FrostedIce; - materials[8193] = Material.MagmaBlock; - materials[8194] = Material.NetherWartBlock; - materials[8195] = Material.RedNetherBricks; - for (int i = 8196; i <= 8198; i++) - materials[i] = Material.BoneBlock; - materials[8199] = Material.StructureVoid; - for (int i = 8200; i <= 8211; i++) - materials[i] = Material.Observer; - for (int i = 8212; i <= 8217; i++) - materials[i] = Material.ShulkerBox; - for (int i = 8218; i <= 8223; i++) - materials[i] = Material.WhiteShulkerBox; - for (int i = 8224; i <= 8229; i++) - materials[i] = Material.OrangeShulkerBox; - for (int i = 8230; i <= 8235; i++) - materials[i] = Material.MagentaShulkerBox; - for (int i = 8236; i <= 8241; i++) - materials[i] = Material.LightBlueShulkerBox; - for (int i = 8242; i <= 8247; i++) - materials[i] = Material.YellowShulkerBox; - for (int i = 8248; i <= 8253; i++) - materials[i] = Material.LimeShulkerBox; - for (int i = 8254; i <= 8259; i++) - materials[i] = Material.PinkShulkerBox; - for (int i = 8260; i <= 8265; i++) - materials[i] = Material.GrayShulkerBox; - for (int i = 8266; i <= 8271; i++) - materials[i] = Material.LightGrayShulkerBox; - for (int i = 8272; i <= 8277; i++) - materials[i] = Material.CyanShulkerBox; - for (int i = 8278; i <= 8283; i++) - materials[i] = Material.PurpleShulkerBox; - for (int i = 8284; i <= 8289; i++) - materials[i] = Material.BlueShulkerBox; - for (int i = 8290; i <= 8295; i++) - materials[i] = Material.BrownShulkerBox; - for (int i = 8296; i <= 8301; i++) - materials[i] = Material.GreenShulkerBox; - for (int i = 8302; i <= 8307; i++) - materials[i] = Material.RedShulkerBox; - for (int i = 8308; i <= 8313; i++) - materials[i] = Material.BlackShulkerBox; - for (int i = 8314; i <= 8317; i++) - materials[i] = Material.WhiteGlazedTerracotta; - for (int i = 8318; i <= 8321; i++) - materials[i] = Material.OrangeGlazedTerracotta; - for (int i = 8322; i <= 8325; i++) - materials[i] = Material.MagentaGlazedTerracotta; - for (int i = 8326; i <= 8329; i++) - materials[i] = Material.LightBlueGlazedTerracotta; - for (int i = 8330; i <= 8333; i++) - materials[i] = Material.YellowGlazedTerracotta; - for (int i = 8334; i <= 8337; i++) - materials[i] = Material.LimeGlazedTerracotta; - for (int i = 8338; i <= 8341; i++) - materials[i] = Material.PinkGlazedTerracotta; - for (int i = 8342; i <= 8345; i++) - materials[i] = Material.GrayGlazedTerracotta; - for (int i = 8346; i <= 8349; i++) - materials[i] = Material.LightGrayGlazedTerracotta; - for (int i = 8350; i <= 8353; i++) - materials[i] = Material.CyanGlazedTerracotta; - for (int i = 8354; i <= 8357; i++) - materials[i] = Material.PurpleGlazedTerracotta; - for (int i = 8358; i <= 8361; i++) - materials[i] = Material.BlueGlazedTerracotta; - for (int i = 8362; i <= 8365; i++) - materials[i] = Material.BrownGlazedTerracotta; - for (int i = 8366; i <= 8369; i++) - materials[i] = Material.GreenGlazedTerracotta; - for (int i = 8370; i <= 8373; i++) - materials[i] = Material.RedGlazedTerracotta; - for (int i = 8374; i <= 8377; i++) - materials[i] = Material.BlackGlazedTerracotta; - materials[8378] = Material.WhiteConcrete; - materials[8379] = Material.OrangeConcrete; - materials[8380] = Material.MagentaConcrete; - materials[8381] = Material.LightBlueConcrete; - materials[8382] = Material.YellowConcrete; - materials[8383] = Material.LimeConcrete; - materials[8384] = Material.PinkConcrete; - materials[8385] = Material.GrayConcrete; - materials[8386] = Material.LightGrayConcrete; - materials[8387] = Material.CyanConcrete; - materials[8388] = Material.PurpleConcrete; - materials[8389] = Material.BlueConcrete; - materials[8390] = Material.BrownConcrete; - materials[8391] = Material.GreenConcrete; - materials[8392] = Material.RedConcrete; - materials[8393] = Material.BlackConcrete; - materials[8394] = Material.WhiteConcretePowder; - materials[8395] = Material.OrangeConcretePowder; - materials[8396] = Material.MagentaConcretePowder; - materials[8397] = Material.LightBlueConcretePowder; - materials[8398] = Material.YellowConcretePowder; - materials[8399] = Material.LimeConcretePowder; - materials[8400] = Material.PinkConcretePowder; - materials[8401] = Material.GrayConcretePowder; - materials[8402] = Material.LightGrayConcretePowder; - materials[8403] = Material.CyanConcretePowder; - materials[8404] = Material.PurpleConcretePowder; - materials[8405] = Material.BlueConcretePowder; - materials[8406] = Material.BrownConcretePowder; - materials[8407] = Material.GreenConcretePowder; - materials[8408] = Material.RedConcretePowder; - materials[8409] = Material.BlackConcretePowder; - for (int i = 8410; i <= 8435; i++) - materials[i] = Material.Kelp; - materials[8436] = Material.KelpPlant; - materials[8437] = Material.DriedKelpBlock; - for (int i = 8438; i <= 8449; i++) - materials[i] = Material.TurtleEgg; - materials[8450] = Material.DeadTubeCoralBlock; - materials[8451] = Material.DeadBrainCoralBlock; - materials[8452] = Material.DeadBubbleCoralBlock; - materials[8453] = Material.DeadFireCoralBlock; - materials[8454] = Material.DeadHornCoralBlock; - materials[8455] = Material.TubeCoralBlock; - materials[8456] = Material.BrainCoralBlock; - materials[8457] = Material.BubbleCoralBlock; - materials[8458] = Material.FireCoralBlock; - materials[8459] = Material.HornCoralBlock; - for (int i = 8460; i <= 8461; i++) - materials[i] = Material.DeadTubeCoral; - for (int i = 8462; i <= 8463; i++) - materials[i] = Material.DeadBrainCoral; - for (int i = 8464; i <= 8465; i++) - materials[i] = Material.DeadBubbleCoral; - for (int i = 8466; i <= 8467; i++) - materials[i] = Material.DeadFireCoral; - for (int i = 8468; i <= 8469; i++) - materials[i] = Material.DeadHornCoral; - for (int i = 8470; i <= 8471; i++) - materials[i] = Material.TubeCoral; - for (int i = 8472; i <= 8473; i++) - materials[i] = Material.BrainCoral; - for (int i = 8474; i <= 8475; i++) - materials[i] = Material.BubbleCoral; - for (int i = 8476; i <= 8477; i++) - materials[i] = Material.FireCoral; - for (int i = 8478; i <= 8479; i++) - materials[i] = Material.HornCoral; - for (int i = 8480; i <= 8487; i++) - materials[i] = Material.DeadTubeCoralWallFan; - for (int i = 8488; i <= 8495; i++) - materials[i] = Material.DeadBrainCoralWallFan; - for (int i = 8496; i <= 8503; i++) - materials[i] = Material.DeadBubbleCoralWallFan; - for (int i = 8504; i <= 8511; i++) - materials[i] = Material.DeadFireCoralWallFan; - for (int i = 8512; i <= 8519; i++) - materials[i] = Material.DeadHornCoralWallFan; - for (int i = 8520; i <= 8527; i++) - materials[i] = Material.TubeCoralWallFan; - for (int i = 8528; i <= 8535; i++) - materials[i] = Material.BrainCoralWallFan; - for (int i = 8536; i <= 8543; i++) - materials[i] = Material.BubbleCoralWallFan; - for (int i = 8544; i <= 8551; i++) - materials[i] = Material.FireCoralWallFan; - for (int i = 8552; i <= 8559; i++) - materials[i] = Material.HornCoralWallFan; - for (int i = 8560; i <= 8561; i++) - materials[i] = Material.DeadTubeCoralFan; - for (int i = 8562; i <= 8563; i++) - materials[i] = Material.DeadBrainCoralFan; - for (int i = 8564; i <= 8565; i++) - materials[i] = Material.DeadBubbleCoralFan; - for (int i = 8566; i <= 8567; i++) - materials[i] = Material.DeadFireCoralFan; - for (int i = 8568; i <= 8569; i++) - materials[i] = Material.DeadHornCoralFan; - for (int i = 8570; i <= 8571; i++) - materials[i] = Material.TubeCoralFan; - for (int i = 8572; i <= 8573; i++) - materials[i] = Material.BrainCoralFan; - for (int i = 8574; i <= 8575; i++) - materials[i] = Material.BubbleCoralFan; - for (int i = 8576; i <= 8577; i++) - materials[i] = Material.FireCoralFan; - for (int i = 8578; i <= 8579; i++) - materials[i] = Material.HornCoralFan; - for (int i = 8580; i <= 8587; i++) - materials[i] = Material.SeaPickle; - materials[8588] = Material.BlueIce; - for (int i = 8589; i <= 8590; i++) - materials[i] = Material.Conduit; - materials[8591] = Material.VoidAir; - materials[8592] = Material.CaveAir; - for (int i = 8593; i <= 8594; i++) - materials[i] = Material.BubbleColumn; - for (int i = 8595; i <= 8598; i++) - materials[i] = Material.StructureBlock; - } - - // - private static readonly BlockStateDefinition[] stateDefinitions = - [ - new(8, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(12, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(21, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(23, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(25, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(27, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(29, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(31, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(34, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(50, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(72, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(75, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(78, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(81, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(84, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(87, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(90, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(93, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(96, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(99, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(102, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(105, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(108, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(111, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(114, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(117, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(120, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(123, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(126, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(129, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(132, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(135, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(138, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(141, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(144, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(158, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(172, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(186, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(200, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(214, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(233, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(248, 500, - [ - new("instrument", ["harp", "basedrum", "snare", "hat", "bass", "flute", "bell", "guitar", "chime", "xylophone"], 50), - new("note", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"], 2), - new("powered", ["true", "false"], 1) - ]), - new(748, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(764, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(780, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(796, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(812, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(828, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(844, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(860, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(876, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(892, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(908, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(924, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(940, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(956, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(972, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(988, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1004, 12, - [ - new("powered", ["true", "false"], 6), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 1) - ]), - new(1016, 12, - [ - new("powered", ["true", "false"], 6), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 1) - ]), - new(1028, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(1045, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(1047, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(1059, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("short", ["true", "false"], 2), - new("type", ["normal", "sticky"], 1) - ]), - new(1099, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("type", ["normal", "sticky"], 1) - ]), - new(1126, 2, - [ - new("unstable", ["true", "false"], 1) - ]), - new(1132, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(1136, 512, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(1649, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(1729, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("type", ["single", "left", "right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(1753, 1296, - [ - new("east", ["up", "side", "none"], 432), - new("north", ["up", "side", "none"], 144), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 9), - new("south", ["up", "side", "none"], 3), - new("west", ["up", "side", "none"], 1) - ]), - new(3052, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(3060, 8, - [ - new("moisture", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(3068, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(3076, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3108, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(3172, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3180, 10, - [ - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south", "south_east", "south_west", "north_west", "north_east"], 1) - ]), - new(3190, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3270, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3278, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(3302, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3304, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(3368, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3370, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3372, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3374, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3376, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3378, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3380, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(3382, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(3384, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(3392, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(3416, 8, - [ - new("layers", ["1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(3426, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(3443, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(3459, 2, - [ - new("has_record", ["true", "false"], 1) - ]), - new(3461, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(3497, 2, - [ - new("axis", ["x", "z"], 1) - ]), - new(3499, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(3503, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(3507, 7, - [ - new("bites", ["0", "1", "2", "3", "4", "5", "6"], 1) - ]), - new(3514, 64, - [ - new("delay", ["1", "2", "3", "4"], 16), - new("facing", ["north", "south", "west", "east"], 4), - new("locked", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(3594, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3658, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3722, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3786, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3850, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3914, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3988, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4052, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4116, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4180, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4212, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4245, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4249, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4253, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4261, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4269, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4301, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(4333, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4413, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4493, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(4497, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4529, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4609, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(4614, 8, - [ - new("has_bottle_0", ["true", "false"], 4), - new("has_bottle_1", ["true", "false"], 2), - new("has_bottle_2", ["true", "false"], 1) - ]), - new(4622, 4, - [ - new("level", ["0", "1", "2", "3"], 1) - ]), - new(4627, 8, - [ - new("eye", ["true", "false"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4637, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(4639, 12, - [ - new("age", ["0", "1", "2"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4651, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4732, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4740, 16, - [ - new("attached", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(4756, 128, - [ - new("attached", ["true", "false"], 64), - new("disarmed", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("powered", ["true", "false"], 4), - new("south", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4885, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4965, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5045, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5125, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(5138, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5202, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5288, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(5296, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(5304, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5328, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5352, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5376, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5400, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5424, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5448, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5452, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5468, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5472, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5488, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5492, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5508, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5512, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5528, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5532, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5548, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5552, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5568, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5572, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5576, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5580, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("type", ["single", "left", "right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5604, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5620, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5636, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("mode", ["compare", "subtract"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5652, 32, - [ - new("inverted", ["true", "false"], 16), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5686, 10, - [ - new("enabled", ["true", "false"], 5), - new("facing", ["down", "north", "south", "west", "east"], 1) - ]), - new(5698, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(5701, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5781, 12, - [ - new("powered", ["true", "false"], 6), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 1) - ]), - new(5793, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(5821, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5853, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5885, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5917, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5949, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5981, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6013, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6045, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6077, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6109, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6141, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6173, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6205, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6237, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6269, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6301, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6333, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6413, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6495, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6562, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6642, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6722, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6802, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6808, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6814, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6821, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(6843, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(6845, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(6847, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(6849, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(6851, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(6853, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(6855, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6871, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6887, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6903, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6919, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6935, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6951, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6967, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6983, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6999, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7015, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7031, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7047, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7063, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7079, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7095, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7111, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7115, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7119, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7123, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7127, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7131, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7135, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7139, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7143, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7147, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7151, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7155, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7159, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7163, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7167, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7171, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7178, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7258, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7264, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7270, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7276, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7282, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7288, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7294, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7300, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7306, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7312, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7318, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7324, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7330, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7336, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7342, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7348, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7358, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7390, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7422, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7454, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7486, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7518, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7550, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7582, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7614, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7646, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7678, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7742, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7806, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7870, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7934, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7998, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8004, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8068, 6, - [ - new("age", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(8075, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(8078, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8159, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(8165, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8177, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8189, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(8196, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(8200, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8212, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8218, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8224, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8230, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8236, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8242, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8248, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8254, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8260, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8266, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8272, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8278, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8284, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8290, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8296, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8302, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8308, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8314, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8318, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8322, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8326, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8330, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8334, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8338, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8342, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8346, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8350, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8354, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8358, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8362, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8366, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8370, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8374, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8410, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(8438, 12, - [ - new("eggs", ["1", "2", "3", "4"], 3), - new("hatch", ["0", "1", "2"], 1) - ]), - new(8460, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8462, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8464, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8466, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8468, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8470, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8472, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8474, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8476, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8478, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8480, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8488, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8496, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8504, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8512, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8520, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8528, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8536, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8544, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8552, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8560, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8562, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8564, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8566, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8568, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8570, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8572, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8574, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8576, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8578, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8580, 8, - [ - new("pickles", ["1", "2", "3", "4"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8589, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8593, 2, - [ - new("drag", ["true", "false"], 1) - ]), - new(8595, 4, - [ - new("mode", ["save", "load", "corner", "data"], 1) - ]), - ]; - // - - protected override Dictionary GetDict() - { - return materials; - } - - protected override BlockStateDefinition[] GetStateDefinitions() - { - return stateDefinitions; - } - } -} diff --git a/MinecraftClient/Mapping/BlockPalettes/Palette114.cs b/MinecraftClient/Mapping/BlockPalettes/Palette114.cs deleted file mode 100644 index 596c6475bf..0000000000 --- a/MinecraftClient/Mapping/BlockPalettes/Palette114.cs +++ /dev/null @@ -1,3334 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.BlockPalettes -{ - /// - /// Defines mappings for Minecraft 1.14. - /// Automatically generated using BlockPaletteGenerator.cs - /// - public class Palette114 : BlockPalette - { - private static readonly Dictionary materials = new(); - - static Palette114() - { - materials[0] = Material.Air; - materials[1] = Material.Stone; - materials[2] = Material.Granite; - materials[3] = Material.PolishedGranite; - materials[4] = Material.Diorite; - materials[5] = Material.PolishedDiorite; - materials[6] = Material.Andesite; - materials[7] = Material.PolishedAndesite; - for (int i = 8; i <= 9; i++) - materials[i] = Material.GrassBlock; - materials[10] = Material.Dirt; - materials[11] = Material.CoarseDirt; - for (int i = 12; i <= 13; i++) - materials[i] = Material.Podzol; - materials[14] = Material.Cobblestone; - materials[15] = Material.OakPlanks; - materials[16] = Material.SprucePlanks; - materials[17] = Material.BirchPlanks; - materials[18] = Material.JunglePlanks; - materials[19] = Material.AcaciaPlanks; - materials[20] = Material.DarkOakPlanks; - for (int i = 21; i <= 22; i++) - materials[i] = Material.OakSapling; - for (int i = 23; i <= 24; i++) - materials[i] = Material.SpruceSapling; - for (int i = 25; i <= 26; i++) - materials[i] = Material.BirchSapling; - for (int i = 27; i <= 28; i++) - materials[i] = Material.JungleSapling; - for (int i = 29; i <= 30; i++) - materials[i] = Material.AcaciaSapling; - for (int i = 31; i <= 32; i++) - materials[i] = Material.DarkOakSapling; - materials[33] = Material.Bedrock; - for (int i = 34; i <= 49; i++) - materials[i] = Material.Water; - for (int i = 50; i <= 65; i++) - materials[i] = Material.Lava; - materials[66] = Material.Sand; - materials[67] = Material.RedSand; - materials[68] = Material.Gravel; - materials[69] = Material.GoldOre; - materials[70] = Material.IronOre; - materials[71] = Material.CoalOre; - for (int i = 72; i <= 74; i++) - materials[i] = Material.OakLog; - for (int i = 75; i <= 77; i++) - materials[i] = Material.SpruceLog; - for (int i = 78; i <= 80; i++) - materials[i] = Material.BirchLog; - for (int i = 81; i <= 83; i++) - materials[i] = Material.JungleLog; - for (int i = 84; i <= 86; i++) - materials[i] = Material.AcaciaLog; - for (int i = 87; i <= 89; i++) - materials[i] = Material.DarkOakLog; - for (int i = 90; i <= 92; i++) - materials[i] = Material.StrippedSpruceLog; - for (int i = 93; i <= 95; i++) - materials[i] = Material.StrippedBirchLog; - for (int i = 96; i <= 98; i++) - materials[i] = Material.StrippedJungleLog; - for (int i = 99; i <= 101; i++) - materials[i] = Material.StrippedAcaciaLog; - for (int i = 102; i <= 104; i++) - materials[i] = Material.StrippedDarkOakLog; - for (int i = 105; i <= 107; i++) - materials[i] = Material.StrippedOakLog; - for (int i = 108; i <= 110; i++) - materials[i] = Material.OakWood; - for (int i = 111; i <= 113; i++) - materials[i] = Material.SpruceWood; - for (int i = 114; i <= 116; i++) - materials[i] = Material.BirchWood; - for (int i = 117; i <= 119; i++) - materials[i] = Material.JungleWood; - for (int i = 120; i <= 122; i++) - materials[i] = Material.AcaciaWood; - for (int i = 123; i <= 125; i++) - materials[i] = Material.DarkOakWood; - for (int i = 126; i <= 128; i++) - materials[i] = Material.StrippedOakWood; - for (int i = 129; i <= 131; i++) - materials[i] = Material.StrippedSpruceWood; - for (int i = 132; i <= 134; i++) - materials[i] = Material.StrippedBirchWood; - for (int i = 135; i <= 137; i++) - materials[i] = Material.StrippedJungleWood; - for (int i = 138; i <= 140; i++) - materials[i] = Material.StrippedAcaciaWood; - for (int i = 141; i <= 143; i++) - materials[i] = Material.StrippedDarkOakWood; - for (int i = 144; i <= 157; i++) - materials[i] = Material.OakLeaves; - for (int i = 158; i <= 171; i++) - materials[i] = Material.SpruceLeaves; - for (int i = 172; i <= 185; i++) - materials[i] = Material.BirchLeaves; - for (int i = 186; i <= 199; i++) - materials[i] = Material.JungleLeaves; - for (int i = 200; i <= 213; i++) - materials[i] = Material.AcaciaLeaves; - for (int i = 214; i <= 227; i++) - materials[i] = Material.DarkOakLeaves; - materials[228] = Material.Sponge; - materials[229] = Material.WetSponge; - materials[230] = Material.Glass; - materials[231] = Material.LapisOre; - materials[232] = Material.LapisBlock; - for (int i = 233; i <= 244; i++) - materials[i] = Material.Dispenser; - materials[245] = Material.Sandstone; - materials[246] = Material.ChiseledSandstone; - materials[247] = Material.CutSandstone; - for (int i = 248; i <= 1047; i++) - materials[i] = Material.NoteBlock; - for (int i = 1048; i <= 1063; i++) - materials[i] = Material.WhiteBed; - for (int i = 1064; i <= 1079; i++) - materials[i] = Material.OrangeBed; - for (int i = 1080; i <= 1095; i++) - materials[i] = Material.MagentaBed; - for (int i = 1096; i <= 1111; i++) - materials[i] = Material.LightBlueBed; - for (int i = 1112; i <= 1127; i++) - materials[i] = Material.YellowBed; - for (int i = 1128; i <= 1143; i++) - materials[i] = Material.LimeBed; - for (int i = 1144; i <= 1159; i++) - materials[i] = Material.PinkBed; - for (int i = 1160; i <= 1175; i++) - materials[i] = Material.GrayBed; - for (int i = 1176; i <= 1191; i++) - materials[i] = Material.LightGrayBed; - for (int i = 1192; i <= 1207; i++) - materials[i] = Material.CyanBed; - for (int i = 1208; i <= 1223; i++) - materials[i] = Material.PurpleBed; - for (int i = 1224; i <= 1239; i++) - materials[i] = Material.BlueBed; - for (int i = 1240; i <= 1255; i++) - materials[i] = Material.BrownBed; - for (int i = 1256; i <= 1271; i++) - materials[i] = Material.GreenBed; - for (int i = 1272; i <= 1287; i++) - materials[i] = Material.RedBed; - for (int i = 1288; i <= 1303; i++) - materials[i] = Material.BlackBed; - for (int i = 1304; i <= 1315; i++) - materials[i] = Material.PoweredRail; - for (int i = 1316; i <= 1327; i++) - materials[i] = Material.DetectorRail; - for (int i = 1328; i <= 1339; i++) - materials[i] = Material.StickyPiston; - materials[1340] = Material.Cobweb; - materials[1341] = Material.ShortGrass; - materials[1342] = Material.Fern; - materials[1343] = Material.DeadBush; - materials[1344] = Material.Seagrass; - for (int i = 1345; i <= 1346; i++) - materials[i] = Material.TallSeagrass; - for (int i = 1347; i <= 1358; i++) - materials[i] = Material.Piston; - for (int i = 1359; i <= 1382; i++) - materials[i] = Material.PistonHead; - materials[1383] = Material.WhiteWool; - materials[1384] = Material.OrangeWool; - materials[1385] = Material.MagentaWool; - materials[1386] = Material.LightBlueWool; - materials[1387] = Material.YellowWool; - materials[1388] = Material.LimeWool; - materials[1389] = Material.PinkWool; - materials[1390] = Material.GrayWool; - materials[1391] = Material.LightGrayWool; - materials[1392] = Material.CyanWool; - materials[1393] = Material.PurpleWool; - materials[1394] = Material.BlueWool; - materials[1395] = Material.BrownWool; - materials[1396] = Material.GreenWool; - materials[1397] = Material.RedWool; - materials[1398] = Material.BlackWool; - for (int i = 1399; i <= 1410; i++) - materials[i] = Material.MovingPiston; - materials[1411] = Material.Dandelion; - materials[1412] = Material.Poppy; - materials[1413] = Material.BlueOrchid; - materials[1414] = Material.Allium; - materials[1415] = Material.AzureBluet; - materials[1416] = Material.RedTulip; - materials[1417] = Material.OrangeTulip; - materials[1418] = Material.WhiteTulip; - materials[1419] = Material.PinkTulip; - materials[1420] = Material.OxeyeDaisy; - materials[1421] = Material.Cornflower; - materials[1422] = Material.WitherRose; - materials[1423] = Material.LilyOfTheValley; - materials[1424] = Material.BrownMushroom; - materials[1425] = Material.RedMushroom; - materials[1426] = Material.GoldBlock; - materials[1427] = Material.IronBlock; - materials[1428] = Material.Bricks; - for (int i = 1429; i <= 1430; i++) - materials[i] = Material.Tnt; - materials[1431] = Material.Bookshelf; - materials[1432] = Material.MossyCobblestone; - materials[1433] = Material.Obsidian; - materials[1434] = Material.Torch; - for (int i = 1435; i <= 1438; i++) - materials[i] = Material.WallTorch; - for (int i = 1439; i <= 1950; i++) - materials[i] = Material.Fire; - materials[1951] = Material.Spawner; - for (int i = 1952; i <= 2031; i++) - materials[i] = Material.OakStairs; - for (int i = 2032; i <= 2055; i++) - materials[i] = Material.Chest; - for (int i = 2056; i <= 3351; i++) - materials[i] = Material.RedstoneWire; - materials[3352] = Material.DiamondOre; - materials[3353] = Material.DiamondBlock; - materials[3354] = Material.CraftingTable; - for (int i = 3355; i <= 3362; i++) - materials[i] = Material.Wheat; - for (int i = 3363; i <= 3370; i++) - materials[i] = Material.Farmland; - for (int i = 3371; i <= 3378; i++) - materials[i] = Material.Furnace; - for (int i = 3379; i <= 3410; i++) - materials[i] = Material.OakSign; - for (int i = 3411; i <= 3442; i++) - materials[i] = Material.SpruceSign; - for (int i = 3443; i <= 3474; i++) - materials[i] = Material.BirchSign; - for (int i = 3475; i <= 3506; i++) - materials[i] = Material.AcaciaSign; - for (int i = 3507; i <= 3538; i++) - materials[i] = Material.JungleSign; - for (int i = 3539; i <= 3570; i++) - materials[i] = Material.DarkOakSign; - for (int i = 3571; i <= 3634; i++) - materials[i] = Material.OakDoor; - for (int i = 3635; i <= 3642; i++) - materials[i] = Material.Ladder; - for (int i = 3643; i <= 3652; i++) - materials[i] = Material.Rail; - for (int i = 3653; i <= 3732; i++) - materials[i] = Material.CobblestoneStairs; - for (int i = 3733; i <= 3740; i++) - materials[i] = Material.OakWallSign; - for (int i = 3741; i <= 3748; i++) - materials[i] = Material.SpruceWallSign; - for (int i = 3749; i <= 3756; i++) - materials[i] = Material.BirchWallSign; - for (int i = 3757; i <= 3764; i++) - materials[i] = Material.AcaciaWallSign; - for (int i = 3765; i <= 3772; i++) - materials[i] = Material.JungleWallSign; - for (int i = 3773; i <= 3780; i++) - materials[i] = Material.DarkOakWallSign; - for (int i = 3781; i <= 3804; i++) - materials[i] = Material.Lever; - for (int i = 3805; i <= 3806; i++) - materials[i] = Material.StonePressurePlate; - for (int i = 3807; i <= 3870; i++) - materials[i] = Material.IronDoor; - for (int i = 3871; i <= 3872; i++) - materials[i] = Material.OakPressurePlate; - for (int i = 3873; i <= 3874; i++) - materials[i] = Material.SprucePressurePlate; - for (int i = 3875; i <= 3876; i++) - materials[i] = Material.BirchPressurePlate; - for (int i = 3877; i <= 3878; i++) - materials[i] = Material.JunglePressurePlate; - for (int i = 3879; i <= 3880; i++) - materials[i] = Material.AcaciaPressurePlate; - for (int i = 3881; i <= 3882; i++) - materials[i] = Material.DarkOakPressurePlate; - for (int i = 3883; i <= 3884; i++) - materials[i] = Material.RedstoneOre; - for (int i = 3885; i <= 3886; i++) - materials[i] = Material.RedstoneTorch; - for (int i = 3887; i <= 3894; i++) - materials[i] = Material.RedstoneWallTorch; - for (int i = 3895; i <= 3918; i++) - materials[i] = Material.StoneButton; - for (int i = 3919; i <= 3926; i++) - materials[i] = Material.Snow; - materials[3927] = Material.Ice; - materials[3928] = Material.SnowBlock; - for (int i = 3929; i <= 3944; i++) - materials[i] = Material.Cactus; - materials[3945] = Material.Clay; - for (int i = 3946; i <= 3961; i++) - materials[i] = Material.SugarCane; - for (int i = 3962; i <= 3963; i++) - materials[i] = Material.Jukebox; - for (int i = 3964; i <= 3995; i++) - materials[i] = Material.OakFence; - materials[3996] = Material.Pumpkin; - materials[3997] = Material.Netherrack; - materials[3998] = Material.SoulSand; - materials[3999] = Material.Glowstone; - for (int i = 4000; i <= 4001; i++) - materials[i] = Material.NetherPortal; - for (int i = 4002; i <= 4005; i++) - materials[i] = Material.CarvedPumpkin; - for (int i = 4006; i <= 4009; i++) - materials[i] = Material.JackOLantern; - for (int i = 4010; i <= 4016; i++) - materials[i] = Material.Cake; - for (int i = 4017; i <= 4080; i++) - materials[i] = Material.Repeater; - materials[4081] = Material.WhiteStainedGlass; - materials[4082] = Material.OrangeStainedGlass; - materials[4083] = Material.MagentaStainedGlass; - materials[4084] = Material.LightBlueStainedGlass; - materials[4085] = Material.YellowStainedGlass; - materials[4086] = Material.LimeStainedGlass; - materials[4087] = Material.PinkStainedGlass; - materials[4088] = Material.GrayStainedGlass; - materials[4089] = Material.LightGrayStainedGlass; - materials[4090] = Material.CyanStainedGlass; - materials[4091] = Material.PurpleStainedGlass; - materials[4092] = Material.BlueStainedGlass; - materials[4093] = Material.BrownStainedGlass; - materials[4094] = Material.GreenStainedGlass; - materials[4095] = Material.RedStainedGlass; - materials[4096] = Material.BlackStainedGlass; - for (int i = 4097; i <= 4160; i++) - materials[i] = Material.OakTrapdoor; - for (int i = 4161; i <= 4224; i++) - materials[i] = Material.SpruceTrapdoor; - for (int i = 4225; i <= 4288; i++) - materials[i] = Material.BirchTrapdoor; - for (int i = 4289; i <= 4352; i++) - materials[i] = Material.JungleTrapdoor; - for (int i = 4353; i <= 4416; i++) - materials[i] = Material.AcaciaTrapdoor; - for (int i = 4417; i <= 4480; i++) - materials[i] = Material.DarkOakTrapdoor; - materials[4481] = Material.StoneBricks; - materials[4482] = Material.MossyStoneBricks; - materials[4483] = Material.CrackedStoneBricks; - materials[4484] = Material.ChiseledStoneBricks; - materials[4485] = Material.InfestedStone; - materials[4486] = Material.InfestedCobblestone; - materials[4487] = Material.InfestedStoneBricks; - materials[4488] = Material.InfestedMossyStoneBricks; - materials[4489] = Material.InfestedCrackedStoneBricks; - materials[4490] = Material.InfestedChiseledStoneBricks; - for (int i = 4491; i <= 4554; i++) - materials[i] = Material.BrownMushroomBlock; - for (int i = 4555; i <= 4618; i++) - materials[i] = Material.RedMushroomBlock; - for (int i = 4619; i <= 4682; i++) - materials[i] = Material.MushroomStem; - for (int i = 4683; i <= 4714; i++) - materials[i] = Material.IronBars; - for (int i = 4715; i <= 4746; i++) - materials[i] = Material.GlassPane; - materials[4747] = Material.Melon; - for (int i = 4748; i <= 4751; i++) - materials[i] = Material.AttachedPumpkinStem; - for (int i = 4752; i <= 4755; i++) - materials[i] = Material.AttachedMelonStem; - for (int i = 4756; i <= 4763; i++) - materials[i] = Material.PumpkinStem; - for (int i = 4764; i <= 4771; i++) - materials[i] = Material.MelonStem; - for (int i = 4772; i <= 4803; i++) - materials[i] = Material.Vine; - for (int i = 4804; i <= 4835; i++) - materials[i] = Material.OakFenceGate; - for (int i = 4836; i <= 4915; i++) - materials[i] = Material.BrickStairs; - for (int i = 4916; i <= 4995; i++) - materials[i] = Material.StoneBrickStairs; - for (int i = 4996; i <= 4997; i++) - materials[i] = Material.Mycelium; - materials[4998] = Material.LilyPad; - materials[4999] = Material.NetherBricks; - for (int i = 5000; i <= 5031; i++) - materials[i] = Material.NetherBrickFence; - for (int i = 5032; i <= 5111; i++) - materials[i] = Material.NetherBrickStairs; - for (int i = 5112; i <= 5115; i++) - materials[i] = Material.NetherWart; - materials[5116] = Material.EnchantingTable; - for (int i = 5117; i <= 5124; i++) - materials[i] = Material.BrewingStand; - for (int i = 5125; i <= 5128; i++) - materials[i] = Material.Cauldron; - materials[5129] = Material.EndPortal; - for (int i = 5130; i <= 5137; i++) - materials[i] = Material.EndPortalFrame; - materials[5138] = Material.EndStone; - materials[5139] = Material.DragonEgg; - for (int i = 5140; i <= 5141; i++) - materials[i] = Material.RedstoneLamp; - for (int i = 5142; i <= 5153; i++) - materials[i] = Material.Cocoa; - for (int i = 5154; i <= 5233; i++) - materials[i] = Material.SandstoneStairs; - materials[5234] = Material.EmeraldOre; - for (int i = 5235; i <= 5242; i++) - materials[i] = Material.EnderChest; - for (int i = 5243; i <= 5258; i++) - materials[i] = Material.TripwireHook; - for (int i = 5259; i <= 5386; i++) - materials[i] = Material.Tripwire; - materials[5387] = Material.EmeraldBlock; - for (int i = 5388; i <= 5467; i++) - materials[i] = Material.SpruceStairs; - for (int i = 5468; i <= 5547; i++) - materials[i] = Material.BirchStairs; - for (int i = 5548; i <= 5627; i++) - materials[i] = Material.JungleStairs; - for (int i = 5628; i <= 5639; i++) - materials[i] = Material.CommandBlock; - materials[5640] = Material.Beacon; - for (int i = 5641; i <= 5704; i++) - materials[i] = Material.CobblestoneWall; - for (int i = 5705; i <= 5768; i++) - materials[i] = Material.MossyCobblestoneWall; - materials[5769] = Material.FlowerPot; - materials[5770] = Material.PottedOakSapling; - materials[5771] = Material.PottedSpruceSapling; - materials[5772] = Material.PottedBirchSapling; - materials[5773] = Material.PottedJungleSapling; - materials[5774] = Material.PottedAcaciaSapling; - materials[5775] = Material.PottedDarkOakSapling; - materials[5776] = Material.PottedFern; - materials[5777] = Material.PottedDandelion; - materials[5778] = Material.PottedPoppy; - materials[5779] = Material.PottedBlueOrchid; - materials[5780] = Material.PottedAllium; - materials[5781] = Material.PottedAzureBluet; - materials[5782] = Material.PottedRedTulip; - materials[5783] = Material.PottedOrangeTulip; - materials[5784] = Material.PottedWhiteTulip; - materials[5785] = Material.PottedPinkTulip; - materials[5786] = Material.PottedOxeyeDaisy; - materials[5787] = Material.PottedCornflower; - materials[5788] = Material.PottedLilyOfTheValley; - materials[5789] = Material.PottedWitherRose; - materials[5790] = Material.PottedRedMushroom; - materials[5791] = Material.PottedBrownMushroom; - materials[5792] = Material.PottedDeadBush; - materials[5793] = Material.PottedCactus; - for (int i = 5794; i <= 5801; i++) - materials[i] = Material.Carrots; - for (int i = 5802; i <= 5809; i++) - materials[i] = Material.Potatoes; - for (int i = 5810; i <= 5833; i++) - materials[i] = Material.OakButton; - for (int i = 5834; i <= 5857; i++) - materials[i] = Material.SpruceButton; - for (int i = 5858; i <= 5881; i++) - materials[i] = Material.BirchButton; - for (int i = 5882; i <= 5905; i++) - materials[i] = Material.JungleButton; - for (int i = 5906; i <= 5929; i++) - materials[i] = Material.AcaciaButton; - for (int i = 5930; i <= 5953; i++) - materials[i] = Material.DarkOakButton; - for (int i = 5954; i <= 5969; i++) - materials[i] = Material.SkeletonSkull; - for (int i = 5970; i <= 5973; i++) - materials[i] = Material.SkeletonWallSkull; - for (int i = 5974; i <= 5989; i++) - materials[i] = Material.WitherSkeletonSkull; - for (int i = 5990; i <= 5993; i++) - materials[i] = Material.WitherSkeletonWallSkull; - for (int i = 5994; i <= 6009; i++) - materials[i] = Material.ZombieHead; - for (int i = 6010; i <= 6013; i++) - materials[i] = Material.ZombieWallHead; - for (int i = 6014; i <= 6029; i++) - materials[i] = Material.PlayerHead; - for (int i = 6030; i <= 6033; i++) - materials[i] = Material.PlayerWallHead; - for (int i = 6034; i <= 6049; i++) - materials[i] = Material.CreeperHead; - for (int i = 6050; i <= 6053; i++) - materials[i] = Material.CreeperWallHead; - for (int i = 6054; i <= 6069; i++) - materials[i] = Material.DragonHead; - for (int i = 6070; i <= 6073; i++) - materials[i] = Material.DragonWallHead; - for (int i = 6074; i <= 6077; i++) - materials[i] = Material.Anvil; - for (int i = 6078; i <= 6081; i++) - materials[i] = Material.ChippedAnvil; - for (int i = 6082; i <= 6085; i++) - materials[i] = Material.DamagedAnvil; - for (int i = 6086; i <= 6109; i++) - materials[i] = Material.TrappedChest; - for (int i = 6110; i <= 6125; i++) - materials[i] = Material.LightWeightedPressurePlate; - for (int i = 6126; i <= 6141; i++) - materials[i] = Material.HeavyWeightedPressurePlate; - for (int i = 6142; i <= 6157; i++) - materials[i] = Material.Comparator; - for (int i = 6158; i <= 6189; i++) - materials[i] = Material.DaylightDetector; - materials[6190] = Material.RedstoneBlock; - materials[6191] = Material.NetherQuartzOre; - for (int i = 6192; i <= 6201; i++) - materials[i] = Material.Hopper; - materials[6202] = Material.QuartzBlock; - materials[6203] = Material.ChiseledQuartzBlock; - for (int i = 6204; i <= 6206; i++) - materials[i] = Material.QuartzPillar; - for (int i = 6207; i <= 6286; i++) - materials[i] = Material.QuartzStairs; - for (int i = 6287; i <= 6298; i++) - materials[i] = Material.ActivatorRail; - for (int i = 6299; i <= 6310; i++) - materials[i] = Material.Dropper; - materials[6311] = Material.WhiteTerracotta; - materials[6312] = Material.OrangeTerracotta; - materials[6313] = Material.MagentaTerracotta; - materials[6314] = Material.LightBlueTerracotta; - materials[6315] = Material.YellowTerracotta; - materials[6316] = Material.LimeTerracotta; - materials[6317] = Material.PinkTerracotta; - materials[6318] = Material.GrayTerracotta; - materials[6319] = Material.LightGrayTerracotta; - materials[6320] = Material.CyanTerracotta; - materials[6321] = Material.PurpleTerracotta; - materials[6322] = Material.BlueTerracotta; - materials[6323] = Material.BrownTerracotta; - materials[6324] = Material.GreenTerracotta; - materials[6325] = Material.RedTerracotta; - materials[6326] = Material.BlackTerracotta; - for (int i = 6327; i <= 6358; i++) - materials[i] = Material.WhiteStainedGlassPane; - for (int i = 6359; i <= 6390; i++) - materials[i] = Material.OrangeStainedGlassPane; - for (int i = 6391; i <= 6422; i++) - materials[i] = Material.MagentaStainedGlassPane; - for (int i = 6423; i <= 6454; i++) - materials[i] = Material.LightBlueStainedGlassPane; - for (int i = 6455; i <= 6486; i++) - materials[i] = Material.YellowStainedGlassPane; - for (int i = 6487; i <= 6518; i++) - materials[i] = Material.LimeStainedGlassPane; - for (int i = 6519; i <= 6550; i++) - materials[i] = Material.PinkStainedGlassPane; - for (int i = 6551; i <= 6582; i++) - materials[i] = Material.GrayStainedGlassPane; - for (int i = 6583; i <= 6614; i++) - materials[i] = Material.LightGrayStainedGlassPane; - for (int i = 6615; i <= 6646; i++) - materials[i] = Material.CyanStainedGlassPane; - for (int i = 6647; i <= 6678; i++) - materials[i] = Material.PurpleStainedGlassPane; - for (int i = 6679; i <= 6710; i++) - materials[i] = Material.BlueStainedGlassPane; - for (int i = 6711; i <= 6742; i++) - materials[i] = Material.BrownStainedGlassPane; - for (int i = 6743; i <= 6774; i++) - materials[i] = Material.GreenStainedGlassPane; - for (int i = 6775; i <= 6806; i++) - materials[i] = Material.RedStainedGlassPane; - for (int i = 6807; i <= 6838; i++) - materials[i] = Material.BlackStainedGlassPane; - for (int i = 6839; i <= 6918; i++) - materials[i] = Material.AcaciaStairs; - for (int i = 6919; i <= 6998; i++) - materials[i] = Material.DarkOakStairs; - materials[6999] = Material.SlimeBlock; - materials[7000] = Material.Barrier; - for (int i = 7001; i <= 7064; i++) - materials[i] = Material.IronTrapdoor; - materials[7065] = Material.Prismarine; - materials[7066] = Material.PrismarineBricks; - materials[7067] = Material.DarkPrismarine; - for (int i = 7068; i <= 7147; i++) - materials[i] = Material.PrismarineStairs; - for (int i = 7148; i <= 7227; i++) - materials[i] = Material.PrismarineBrickStairs; - for (int i = 7228; i <= 7307; i++) - materials[i] = Material.DarkPrismarineStairs; - for (int i = 7308; i <= 7313; i++) - materials[i] = Material.PrismarineSlab; - for (int i = 7314; i <= 7319; i++) - materials[i] = Material.PrismarineBrickSlab; - for (int i = 7320; i <= 7325; i++) - materials[i] = Material.DarkPrismarineSlab; - materials[7326] = Material.SeaLantern; - for (int i = 7327; i <= 7329; i++) - materials[i] = Material.HayBlock; - materials[7330] = Material.WhiteCarpet; - materials[7331] = Material.OrangeCarpet; - materials[7332] = Material.MagentaCarpet; - materials[7333] = Material.LightBlueCarpet; - materials[7334] = Material.YellowCarpet; - materials[7335] = Material.LimeCarpet; - materials[7336] = Material.PinkCarpet; - materials[7337] = Material.GrayCarpet; - materials[7338] = Material.LightGrayCarpet; - materials[7339] = Material.CyanCarpet; - materials[7340] = Material.PurpleCarpet; - materials[7341] = Material.BlueCarpet; - materials[7342] = Material.BrownCarpet; - materials[7343] = Material.GreenCarpet; - materials[7344] = Material.RedCarpet; - materials[7345] = Material.BlackCarpet; - materials[7346] = Material.Terracotta; - materials[7347] = Material.CoalBlock; - materials[7348] = Material.PackedIce; - for (int i = 7349; i <= 7350; i++) - materials[i] = Material.Sunflower; - for (int i = 7351; i <= 7352; i++) - materials[i] = Material.Lilac; - for (int i = 7353; i <= 7354; i++) - materials[i] = Material.RoseBush; - for (int i = 7355; i <= 7356; i++) - materials[i] = Material.Peony; - for (int i = 7357; i <= 7358; i++) - materials[i] = Material.TallGrass; - for (int i = 7359; i <= 7360; i++) - materials[i] = Material.LargeFern; - for (int i = 7361; i <= 7376; i++) - materials[i] = Material.WhiteBanner; - for (int i = 7377; i <= 7392; i++) - materials[i] = Material.OrangeBanner; - for (int i = 7393; i <= 7408; i++) - materials[i] = Material.MagentaBanner; - for (int i = 7409; i <= 7424; i++) - materials[i] = Material.LightBlueBanner; - for (int i = 7425; i <= 7440; i++) - materials[i] = Material.YellowBanner; - for (int i = 7441; i <= 7456; i++) - materials[i] = Material.LimeBanner; - for (int i = 7457; i <= 7472; i++) - materials[i] = Material.PinkBanner; - for (int i = 7473; i <= 7488; i++) - materials[i] = Material.GrayBanner; - for (int i = 7489; i <= 7504; i++) - materials[i] = Material.LightGrayBanner; - for (int i = 7505; i <= 7520; i++) - materials[i] = Material.CyanBanner; - for (int i = 7521; i <= 7536; i++) - materials[i] = Material.PurpleBanner; - for (int i = 7537; i <= 7552; i++) - materials[i] = Material.BlueBanner; - for (int i = 7553; i <= 7568; i++) - materials[i] = Material.BrownBanner; - for (int i = 7569; i <= 7584; i++) - materials[i] = Material.GreenBanner; - for (int i = 7585; i <= 7600; i++) - materials[i] = Material.RedBanner; - for (int i = 7601; i <= 7616; i++) - materials[i] = Material.BlackBanner; - for (int i = 7617; i <= 7620; i++) - materials[i] = Material.WhiteWallBanner; - for (int i = 7621; i <= 7624; i++) - materials[i] = Material.OrangeWallBanner; - for (int i = 7625; i <= 7628; i++) - materials[i] = Material.MagentaWallBanner; - for (int i = 7629; i <= 7632; i++) - materials[i] = Material.LightBlueWallBanner; - for (int i = 7633; i <= 7636; i++) - materials[i] = Material.YellowWallBanner; - for (int i = 7637; i <= 7640; i++) - materials[i] = Material.LimeWallBanner; - for (int i = 7641; i <= 7644; i++) - materials[i] = Material.PinkWallBanner; - for (int i = 7645; i <= 7648; i++) - materials[i] = Material.GrayWallBanner; - for (int i = 7649; i <= 7652; i++) - materials[i] = Material.LightGrayWallBanner; - for (int i = 7653; i <= 7656; i++) - materials[i] = Material.CyanWallBanner; - for (int i = 7657; i <= 7660; i++) - materials[i] = Material.PurpleWallBanner; - for (int i = 7661; i <= 7664; i++) - materials[i] = Material.BlueWallBanner; - for (int i = 7665; i <= 7668; i++) - materials[i] = Material.BrownWallBanner; - for (int i = 7669; i <= 7672; i++) - materials[i] = Material.GreenWallBanner; - for (int i = 7673; i <= 7676; i++) - materials[i] = Material.RedWallBanner; - for (int i = 7677; i <= 7680; i++) - materials[i] = Material.BlackWallBanner; - materials[7681] = Material.RedSandstone; - materials[7682] = Material.ChiseledRedSandstone; - materials[7683] = Material.CutRedSandstone; - for (int i = 7684; i <= 7763; i++) - materials[i] = Material.RedSandstoneStairs; - for (int i = 7764; i <= 7769; i++) - materials[i] = Material.OakSlab; - for (int i = 7770; i <= 7775; i++) - materials[i] = Material.SpruceSlab; - for (int i = 7776; i <= 7781; i++) - materials[i] = Material.BirchSlab; - for (int i = 7782; i <= 7787; i++) - materials[i] = Material.JungleSlab; - for (int i = 7788; i <= 7793; i++) - materials[i] = Material.AcaciaSlab; - for (int i = 7794; i <= 7799; i++) - materials[i] = Material.DarkOakSlab; - for (int i = 7800; i <= 7805; i++) - materials[i] = Material.StoneSlab; - for (int i = 7806; i <= 7811; i++) - materials[i] = Material.SmoothStoneSlab; - for (int i = 7812; i <= 7817; i++) - materials[i] = Material.SandstoneSlab; - for (int i = 7818; i <= 7823; i++) - materials[i] = Material.CutSandstoneSlab; - for (int i = 7824; i <= 7829; i++) - materials[i] = Material.PetrifiedOakSlab; - for (int i = 7830; i <= 7835; i++) - materials[i] = Material.CobblestoneSlab; - for (int i = 7836; i <= 7841; i++) - materials[i] = Material.BrickSlab; - for (int i = 7842; i <= 7847; i++) - materials[i] = Material.StoneBrickSlab; - for (int i = 7848; i <= 7853; i++) - materials[i] = Material.NetherBrickSlab; - for (int i = 7854; i <= 7859; i++) - materials[i] = Material.QuartzSlab; - for (int i = 7860; i <= 7865; i++) - materials[i] = Material.RedSandstoneSlab; - for (int i = 7866; i <= 7871; i++) - materials[i] = Material.CutRedSandstoneSlab; - for (int i = 7872; i <= 7877; i++) - materials[i] = Material.PurpurSlab; - materials[7878] = Material.SmoothStone; - materials[7879] = Material.SmoothSandstone; - materials[7880] = Material.SmoothQuartz; - materials[7881] = Material.SmoothRedSandstone; - for (int i = 7882; i <= 7913; i++) - materials[i] = Material.SpruceFenceGate; - for (int i = 7914; i <= 7945; i++) - materials[i] = Material.BirchFenceGate; - for (int i = 7946; i <= 7977; i++) - materials[i] = Material.JungleFenceGate; - for (int i = 7978; i <= 8009; i++) - materials[i] = Material.AcaciaFenceGate; - for (int i = 8010; i <= 8041; i++) - materials[i] = Material.DarkOakFenceGate; - for (int i = 8042; i <= 8073; i++) - materials[i] = Material.SpruceFence; - for (int i = 8074; i <= 8105; i++) - materials[i] = Material.BirchFence; - for (int i = 8106; i <= 8137; i++) - materials[i] = Material.JungleFence; - for (int i = 8138; i <= 8169; i++) - materials[i] = Material.AcaciaFence; - for (int i = 8170; i <= 8201; i++) - materials[i] = Material.DarkOakFence; - for (int i = 8202; i <= 8265; i++) - materials[i] = Material.SpruceDoor; - for (int i = 8266; i <= 8329; i++) - materials[i] = Material.BirchDoor; - for (int i = 8330; i <= 8393; i++) - materials[i] = Material.JungleDoor; - for (int i = 8394; i <= 8457; i++) - materials[i] = Material.AcaciaDoor; - for (int i = 8458; i <= 8521; i++) - materials[i] = Material.DarkOakDoor; - for (int i = 8522; i <= 8527; i++) - materials[i] = Material.EndRod; - for (int i = 8528; i <= 8591; i++) - materials[i] = Material.ChorusPlant; - for (int i = 8592; i <= 8597; i++) - materials[i] = Material.ChorusFlower; - materials[8598] = Material.PurpurBlock; - for (int i = 8599; i <= 8601; i++) - materials[i] = Material.PurpurPillar; - for (int i = 8602; i <= 8681; i++) - materials[i] = Material.PurpurStairs; - materials[8682] = Material.EndStoneBricks; - for (int i = 8683; i <= 8686; i++) - materials[i] = Material.Beetroots; - materials[8687] = Material.DirtPath; - materials[8688] = Material.EndGateway; - for (int i = 8689; i <= 8700; i++) - materials[i] = Material.RepeatingCommandBlock; - for (int i = 8701; i <= 8712; i++) - materials[i] = Material.ChainCommandBlock; - for (int i = 8713; i <= 8716; i++) - materials[i] = Material.FrostedIce; - materials[8717] = Material.MagmaBlock; - materials[8718] = Material.NetherWartBlock; - materials[8719] = Material.RedNetherBricks; - for (int i = 8720; i <= 8722; i++) - materials[i] = Material.BoneBlock; - materials[8723] = Material.StructureVoid; - for (int i = 8724; i <= 8735; i++) - materials[i] = Material.Observer; - for (int i = 8736; i <= 8741; i++) - materials[i] = Material.ShulkerBox; - for (int i = 8742; i <= 8747; i++) - materials[i] = Material.WhiteShulkerBox; - for (int i = 8748; i <= 8753; i++) - materials[i] = Material.OrangeShulkerBox; - for (int i = 8754; i <= 8759; i++) - materials[i] = Material.MagentaShulkerBox; - for (int i = 8760; i <= 8765; i++) - materials[i] = Material.LightBlueShulkerBox; - for (int i = 8766; i <= 8771; i++) - materials[i] = Material.YellowShulkerBox; - for (int i = 8772; i <= 8777; i++) - materials[i] = Material.LimeShulkerBox; - for (int i = 8778; i <= 8783; i++) - materials[i] = Material.PinkShulkerBox; - for (int i = 8784; i <= 8789; i++) - materials[i] = Material.GrayShulkerBox; - for (int i = 8790; i <= 8795; i++) - materials[i] = Material.LightGrayShulkerBox; - for (int i = 8796; i <= 8801; i++) - materials[i] = Material.CyanShulkerBox; - for (int i = 8802; i <= 8807; i++) - materials[i] = Material.PurpleShulkerBox; - for (int i = 8808; i <= 8813; i++) - materials[i] = Material.BlueShulkerBox; - for (int i = 8814; i <= 8819; i++) - materials[i] = Material.BrownShulkerBox; - for (int i = 8820; i <= 8825; i++) - materials[i] = Material.GreenShulkerBox; - for (int i = 8826; i <= 8831; i++) - materials[i] = Material.RedShulkerBox; - for (int i = 8832; i <= 8837; i++) - materials[i] = Material.BlackShulkerBox; - for (int i = 8838; i <= 8841; i++) - materials[i] = Material.WhiteGlazedTerracotta; - for (int i = 8842; i <= 8845; i++) - materials[i] = Material.OrangeGlazedTerracotta; - for (int i = 8846; i <= 8849; i++) - materials[i] = Material.MagentaGlazedTerracotta; - for (int i = 8850; i <= 8853; i++) - materials[i] = Material.LightBlueGlazedTerracotta; - for (int i = 8854; i <= 8857; i++) - materials[i] = Material.YellowGlazedTerracotta; - for (int i = 8858; i <= 8861; i++) - materials[i] = Material.LimeGlazedTerracotta; - for (int i = 8862; i <= 8865; i++) - materials[i] = Material.PinkGlazedTerracotta; - for (int i = 8866; i <= 8869; i++) - materials[i] = Material.GrayGlazedTerracotta; - for (int i = 8870; i <= 8873; i++) - materials[i] = Material.LightGrayGlazedTerracotta; - for (int i = 8874; i <= 8877; i++) - materials[i] = Material.CyanGlazedTerracotta; - for (int i = 8878; i <= 8881; i++) - materials[i] = Material.PurpleGlazedTerracotta; - for (int i = 8882; i <= 8885; i++) - materials[i] = Material.BlueGlazedTerracotta; - for (int i = 8886; i <= 8889; i++) - materials[i] = Material.BrownGlazedTerracotta; - for (int i = 8890; i <= 8893; i++) - materials[i] = Material.GreenGlazedTerracotta; - for (int i = 8894; i <= 8897; i++) - materials[i] = Material.RedGlazedTerracotta; - for (int i = 8898; i <= 8901; i++) - materials[i] = Material.BlackGlazedTerracotta; - materials[8902] = Material.WhiteConcrete; - materials[8903] = Material.OrangeConcrete; - materials[8904] = Material.MagentaConcrete; - materials[8905] = Material.LightBlueConcrete; - materials[8906] = Material.YellowConcrete; - materials[8907] = Material.LimeConcrete; - materials[8908] = Material.PinkConcrete; - materials[8909] = Material.GrayConcrete; - materials[8910] = Material.LightGrayConcrete; - materials[8911] = Material.CyanConcrete; - materials[8912] = Material.PurpleConcrete; - materials[8913] = Material.BlueConcrete; - materials[8914] = Material.BrownConcrete; - materials[8915] = Material.GreenConcrete; - materials[8916] = Material.RedConcrete; - materials[8917] = Material.BlackConcrete; - materials[8918] = Material.WhiteConcretePowder; - materials[8919] = Material.OrangeConcretePowder; - materials[8920] = Material.MagentaConcretePowder; - materials[8921] = Material.LightBlueConcretePowder; - materials[8922] = Material.YellowConcretePowder; - materials[8923] = Material.LimeConcretePowder; - materials[8924] = Material.PinkConcretePowder; - materials[8925] = Material.GrayConcretePowder; - materials[8926] = Material.LightGrayConcretePowder; - materials[8927] = Material.CyanConcretePowder; - materials[8928] = Material.PurpleConcretePowder; - materials[8929] = Material.BlueConcretePowder; - materials[8930] = Material.BrownConcretePowder; - materials[8931] = Material.GreenConcretePowder; - materials[8932] = Material.RedConcretePowder; - materials[8933] = Material.BlackConcretePowder; - for (int i = 8934; i <= 8959; i++) - materials[i] = Material.Kelp; - materials[8960] = Material.KelpPlant; - materials[8961] = Material.DriedKelpBlock; - for (int i = 8962; i <= 8973; i++) - materials[i] = Material.TurtleEgg; - materials[8974] = Material.DeadTubeCoralBlock; - materials[8975] = Material.DeadBrainCoralBlock; - materials[8976] = Material.DeadBubbleCoralBlock; - materials[8977] = Material.DeadFireCoralBlock; - materials[8978] = Material.DeadHornCoralBlock; - materials[8979] = Material.TubeCoralBlock; - materials[8980] = Material.BrainCoralBlock; - materials[8981] = Material.BubbleCoralBlock; - materials[8982] = Material.FireCoralBlock; - materials[8983] = Material.HornCoralBlock; - for (int i = 8984; i <= 8985; i++) - materials[i] = Material.DeadTubeCoral; - for (int i = 8986; i <= 8987; i++) - materials[i] = Material.DeadBrainCoral; - for (int i = 8988; i <= 8989; i++) - materials[i] = Material.DeadBubbleCoral; - for (int i = 8990; i <= 8991; i++) - materials[i] = Material.DeadFireCoral; - for (int i = 8992; i <= 8993; i++) - materials[i] = Material.DeadHornCoral; - for (int i = 8994; i <= 8995; i++) - materials[i] = Material.TubeCoral; - for (int i = 8996; i <= 8997; i++) - materials[i] = Material.BrainCoral; - for (int i = 8998; i <= 8999; i++) - materials[i] = Material.BubbleCoral; - for (int i = 9000; i <= 9001; i++) - materials[i] = Material.FireCoral; - for (int i = 9002; i <= 9003; i++) - materials[i] = Material.HornCoral; - for (int i = 9004; i <= 9005; i++) - materials[i] = Material.DeadTubeCoralFan; - for (int i = 9006; i <= 9007; i++) - materials[i] = Material.DeadBrainCoralFan; - for (int i = 9008; i <= 9009; i++) - materials[i] = Material.DeadBubbleCoralFan; - for (int i = 9010; i <= 9011; i++) - materials[i] = Material.DeadFireCoralFan; - for (int i = 9012; i <= 9013; i++) - materials[i] = Material.DeadHornCoralFan; - for (int i = 9014; i <= 9015; i++) - materials[i] = Material.TubeCoralFan; - for (int i = 9016; i <= 9017; i++) - materials[i] = Material.BrainCoralFan; - for (int i = 9018; i <= 9019; i++) - materials[i] = Material.BubbleCoralFan; - for (int i = 9020; i <= 9021; i++) - materials[i] = Material.FireCoralFan; - for (int i = 9022; i <= 9023; i++) - materials[i] = Material.HornCoralFan; - for (int i = 9024; i <= 9031; i++) - materials[i] = Material.DeadTubeCoralWallFan; - for (int i = 9032; i <= 9039; i++) - materials[i] = Material.DeadBrainCoralWallFan; - for (int i = 9040; i <= 9047; i++) - materials[i] = Material.DeadBubbleCoralWallFan; - for (int i = 9048; i <= 9055; i++) - materials[i] = Material.DeadFireCoralWallFan; - for (int i = 9056; i <= 9063; i++) - materials[i] = Material.DeadHornCoralWallFan; - for (int i = 9064; i <= 9071; i++) - materials[i] = Material.TubeCoralWallFan; - for (int i = 9072; i <= 9079; i++) - materials[i] = Material.BrainCoralWallFan; - for (int i = 9080; i <= 9087; i++) - materials[i] = Material.BubbleCoralWallFan; - for (int i = 9088; i <= 9095; i++) - materials[i] = Material.FireCoralWallFan; - for (int i = 9096; i <= 9103; i++) - materials[i] = Material.HornCoralWallFan; - for (int i = 9104; i <= 9111; i++) - materials[i] = Material.SeaPickle; - materials[9112] = Material.BlueIce; - for (int i = 9113; i <= 9114; i++) - materials[i] = Material.Conduit; - materials[9115] = Material.BambooSapling; - for (int i = 9116; i <= 9127; i++) - materials[i] = Material.Bamboo; - materials[9128] = Material.PottedBamboo; - materials[9129] = Material.VoidAir; - materials[9130] = Material.CaveAir; - for (int i = 9131; i <= 9132; i++) - materials[i] = Material.BubbleColumn; - for (int i = 9133; i <= 9212; i++) - materials[i] = Material.PolishedGraniteStairs; - for (int i = 9213; i <= 9292; i++) - materials[i] = Material.SmoothRedSandstoneStairs; - for (int i = 9293; i <= 9372; i++) - materials[i] = Material.MossyStoneBrickStairs; - for (int i = 9373; i <= 9452; i++) - materials[i] = Material.PolishedDioriteStairs; - for (int i = 9453; i <= 9532; i++) - materials[i] = Material.MossyCobblestoneStairs; - for (int i = 9533; i <= 9612; i++) - materials[i] = Material.EndStoneBrickStairs; - for (int i = 9613; i <= 9692; i++) - materials[i] = Material.StoneStairs; - for (int i = 9693; i <= 9772; i++) - materials[i] = Material.SmoothSandstoneStairs; - for (int i = 9773; i <= 9852; i++) - materials[i] = Material.SmoothQuartzStairs; - for (int i = 9853; i <= 9932; i++) - materials[i] = Material.GraniteStairs; - for (int i = 9933; i <= 10012; i++) - materials[i] = Material.AndesiteStairs; - for (int i = 10013; i <= 10092; i++) - materials[i] = Material.RedNetherBrickStairs; - for (int i = 10093; i <= 10172; i++) - materials[i] = Material.PolishedAndesiteStairs; - for (int i = 10173; i <= 10252; i++) - materials[i] = Material.DioriteStairs; - for (int i = 10253; i <= 10258; i++) - materials[i] = Material.PolishedGraniteSlab; - for (int i = 10259; i <= 10264; i++) - materials[i] = Material.SmoothRedSandstoneSlab; - for (int i = 10265; i <= 10270; i++) - materials[i] = Material.MossyStoneBrickSlab; - for (int i = 10271; i <= 10276; i++) - materials[i] = Material.PolishedDioriteSlab; - for (int i = 10277; i <= 10282; i++) - materials[i] = Material.MossyCobblestoneSlab; - for (int i = 10283; i <= 10288; i++) - materials[i] = Material.EndStoneBrickSlab; - for (int i = 10289; i <= 10294; i++) - materials[i] = Material.SmoothSandstoneSlab; - for (int i = 10295; i <= 10300; i++) - materials[i] = Material.SmoothQuartzSlab; - for (int i = 10301; i <= 10306; i++) - materials[i] = Material.GraniteSlab; - for (int i = 10307; i <= 10312; i++) - materials[i] = Material.AndesiteSlab; - for (int i = 10313; i <= 10318; i++) - materials[i] = Material.RedNetherBrickSlab; - for (int i = 10319; i <= 10324; i++) - materials[i] = Material.PolishedAndesiteSlab; - for (int i = 10325; i <= 10330; i++) - materials[i] = Material.DioriteSlab; - for (int i = 10331; i <= 10394; i++) - materials[i] = Material.BrickWall; - for (int i = 10395; i <= 10458; i++) - materials[i] = Material.PrismarineWall; - for (int i = 10459; i <= 10522; i++) - materials[i] = Material.RedSandstoneWall; - for (int i = 10523; i <= 10586; i++) - materials[i] = Material.MossyStoneBrickWall; - for (int i = 10587; i <= 10650; i++) - materials[i] = Material.GraniteWall; - for (int i = 10651; i <= 10714; i++) - materials[i] = Material.StoneBrickWall; - for (int i = 10715; i <= 10778; i++) - materials[i] = Material.NetherBrickWall; - for (int i = 10779; i <= 10842; i++) - materials[i] = Material.AndesiteWall; - for (int i = 10843; i <= 10906; i++) - materials[i] = Material.RedNetherBrickWall; - for (int i = 10907; i <= 10970; i++) - materials[i] = Material.SandstoneWall; - for (int i = 10971; i <= 11034; i++) - materials[i] = Material.EndStoneBrickWall; - for (int i = 11035; i <= 11098; i++) - materials[i] = Material.DioriteWall; - for (int i = 11099; i <= 11130; i++) - materials[i] = Material.Scaffolding; - for (int i = 11131; i <= 11134; i++) - materials[i] = Material.Loom; - for (int i = 11135; i <= 11146; i++) - materials[i] = Material.Barrel; - for (int i = 11147; i <= 11154; i++) - materials[i] = Material.Smoker; - for (int i = 11155; i <= 11162; i++) - materials[i] = Material.BlastFurnace; - materials[11163] = Material.CartographyTable; - materials[11164] = Material.FletchingTable; - for (int i = 11165; i <= 11176; i++) - materials[i] = Material.Grindstone; - for (int i = 11177; i <= 11192; i++) - materials[i] = Material.Lectern; - materials[11193] = Material.SmithingTable; - for (int i = 11194; i <= 11197; i++) - materials[i] = Material.Stonecutter; - for (int i = 11198; i <= 11213; i++) - materials[i] = Material.Bell; - for (int i = 11214; i <= 11215; i++) - materials[i] = Material.Lantern; - for (int i = 11216; i <= 11247; i++) - materials[i] = Material.Campfire; - for (int i = 11248; i <= 11251; i++) - materials[i] = Material.SweetBerryBush; - for (int i = 11252; i <= 11255; i++) - materials[i] = Material.StructureBlock; - for (int i = 11256; i <= 11261; i++) - materials[i] = Material.Jigsaw; - for (int i = 11262; i <= 11270; i++) - materials[i] = Material.Composter; - } - - // - private static readonly BlockStateDefinition[] stateDefinitions = - [ - new(8, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(12, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(21, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(23, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(25, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(27, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(29, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(31, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(34, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(50, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(72, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(75, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(78, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(81, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(84, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(87, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(90, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(93, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(96, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(99, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(102, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(105, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(108, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(111, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(114, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(117, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(120, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(123, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(126, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(129, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(132, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(135, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(138, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(141, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(144, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(158, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(172, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(186, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(200, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(214, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(233, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(248, 800, - [ - new("instrument", ["harp", "basedrum", "snare", "hat", "bass", "flute", "bell", "guitar", "chime", "xylophone", "iron_xylophone", "cow_bell", "didgeridoo", "bit", "banjo", "pling"], 50), - new("note", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"], 2), - new("powered", ["true", "false"], 1) - ]), - new(1048, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1064, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1080, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1096, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1112, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1128, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1144, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1160, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1176, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1192, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1208, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1224, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1240, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1256, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1272, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1288, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1304, 12, - [ - new("powered", ["true", "false"], 6), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 1) - ]), - new(1316, 12, - [ - new("powered", ["true", "false"], 6), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 1) - ]), - new(1328, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(1345, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(1347, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(1359, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("short", ["true", "false"], 2), - new("type", ["normal", "sticky"], 1) - ]), - new(1399, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("type", ["normal", "sticky"], 1) - ]), - new(1429, 2, - [ - new("unstable", ["true", "false"], 1) - ]), - new(1435, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(1439, 512, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(1952, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2032, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("type", ["single", "left", "right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2056, 1296, - [ - new("east", ["up", "side", "none"], 432), - new("north", ["up", "side", "none"], 144), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 9), - new("south", ["up", "side", "none"], 3), - new("west", ["up", "side", "none"], 1) - ]), - new(3355, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(3363, 8, - [ - new("moisture", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(3371, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(3379, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3411, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3443, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3475, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3507, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3539, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3571, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(3635, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3643, 10, - [ - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south", "south_east", "south_west", "north_west", "north_east"], 1) - ]), - new(3653, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3733, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3741, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3749, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3757, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3765, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3773, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3781, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(3805, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3807, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(3871, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3873, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3875, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3877, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3879, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3881, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3883, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(3885, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(3887, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(3895, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(3919, 8, - [ - new("layers", ["1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(3929, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(3946, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(3962, 2, - [ - new("has_record", ["true", "false"], 1) - ]), - new(3964, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4000, 2, - [ - new("axis", ["x", "z"], 1) - ]), - new(4002, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4006, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4010, 7, - [ - new("bites", ["0", "1", "2", "3", "4", "5", "6"], 1) - ]), - new(4017, 64, - [ - new("delay", ["1", "2", "3", "4"], 16), - new("facing", ["north", "south", "west", "east"], 4), - new("locked", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(4097, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4161, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4225, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4289, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4353, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4417, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4491, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4555, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4619, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4683, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4715, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4748, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4752, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4756, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4764, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4772, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4804, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(4836, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4916, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4996, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(5000, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5032, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5112, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(5117, 8, - [ - new("has_bottle_0", ["true", "false"], 4), - new("has_bottle_1", ["true", "false"], 2), - new("has_bottle_2", ["true", "false"], 1) - ]), - new(5125, 4, - [ - new("level", ["0", "1", "2", "3"], 1) - ]), - new(5130, 8, - [ - new("eye", ["true", "false"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5140, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5142, 12, - [ - new("age", ["0", "1", "2"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5154, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5235, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5243, 16, - [ - new("attached", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5259, 128, - [ - new("attached", ["true", "false"], 64), - new("disarmed", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("powered", ["true", "false"], 4), - new("south", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5388, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5468, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5548, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5628, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(5641, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5705, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5794, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(5802, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(5810, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5834, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5858, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5882, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5906, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5930, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5954, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5970, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5974, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5990, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5994, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6010, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6014, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6030, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6034, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6050, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6054, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6070, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6074, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6078, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6082, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6086, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("type", ["single", "left", "right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6110, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6126, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6142, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("mode", ["compare", "subtract"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6158, 32, - [ - new("inverted", ["true", "false"], 16), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6192, 10, - [ - new("enabled", ["true", "false"], 5), - new("facing", ["down", "north", "south", "west", "east"], 1) - ]), - new(6204, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(6207, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6287, 12, - [ - new("powered", ["true", "false"], 6), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 1) - ]), - new(6299, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(6327, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6359, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6391, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6423, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6455, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6487, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6519, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6551, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6583, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6615, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6647, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6679, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6711, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6743, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6775, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6807, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6839, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6919, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7001, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7068, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7148, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7228, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7308, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7314, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7320, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7327, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(7349, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(7351, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(7353, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(7355, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(7357, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(7359, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(7361, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7377, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7393, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7409, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7425, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7441, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7457, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7473, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7489, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7505, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7521, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7537, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7553, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7569, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7585, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7601, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7617, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7621, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7625, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7629, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7633, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7637, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7641, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7645, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7649, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7653, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7657, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7661, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7665, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7669, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7673, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7677, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7684, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7764, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7770, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7776, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7782, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7788, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7794, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7800, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7806, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7812, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7818, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7824, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7830, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7836, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7842, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7848, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7854, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7860, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7866, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7872, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7882, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7914, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7946, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7978, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8010, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8042, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8074, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8106, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8138, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8170, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8202, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8266, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8330, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8394, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8458, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8522, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8528, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8592, 6, - [ - new("age", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(8599, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(8602, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8683, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(8689, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8701, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8713, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(8720, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(8724, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8736, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8742, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8748, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8754, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8760, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8766, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8772, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8778, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8784, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8790, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8796, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8802, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8808, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8814, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8820, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8826, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8832, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8838, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8842, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8846, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8850, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8854, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8858, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8862, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8866, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8870, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8874, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8878, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8882, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8886, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8890, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8894, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8898, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8934, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(8962, 12, - [ - new("eggs", ["1", "2", "3", "4"], 3), - new("hatch", ["0", "1", "2"], 1) - ]), - new(8984, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8986, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8988, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8990, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8992, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8994, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8996, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8998, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9000, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9002, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9004, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9006, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9008, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9010, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9012, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9014, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9016, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9018, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9020, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9022, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9024, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9032, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9040, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9048, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9056, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9064, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9072, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9080, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9088, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9096, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9104, 8, - [ - new("pickles", ["1", "2", "3", "4"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9113, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9116, 12, - [ - new("age", ["0", "1"], 6), - new("leaves", ["none", "small", "large"], 2), - new("stage", ["0", "1"], 1) - ]), - new(9131, 2, - [ - new("drag", ["true", "false"], 1) - ]), - new(9133, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9213, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9293, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9373, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9453, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9533, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9613, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9693, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9773, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9853, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9933, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10013, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10093, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10173, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10253, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10259, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10265, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10271, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10277, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10283, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10289, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10295, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10301, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10307, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10313, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10319, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10325, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10331, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10395, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10459, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10523, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10587, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10651, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10715, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10779, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10843, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10907, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10971, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11035, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11099, 32, - [ - new("bottom", ["true", "false"], 16), - new("distance", ["0", "1", "2", "3", "4", "5", "6", "7"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11131, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11135, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("open", ["true", "false"], 1) - ]), - new(11147, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(11155, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(11165, 12, - [ - new("face", ["floor", "wall", "ceiling"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11177, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("has_book", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11194, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11198, 16, - [ - new("attachment", ["floor", "ceiling", "single_wall", "double_wall"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11214, 2, - [ - new("hanging", ["true", "false"], 1) - ]), - new(11216, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11248, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(11252, 4, - [ - new("mode", ["save", "load", "corner", "data"], 1) - ]), - new(11256, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(11262, 9, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - ]; - // - - protected override Dictionary GetDict() - { - return materials; - } - - protected override BlockStateDefinition[] GetStateDefinitions() - { - return stateDefinitions; - } - } -} diff --git a/MinecraftClient/Mapping/BlockPalettes/Palette115.cs b/MinecraftClient/Mapping/BlockPalettes/Palette115.cs deleted file mode 100644 index e17cdd82ef..0000000000 --- a/MinecraftClient/Mapping/BlockPalettes/Palette115.cs +++ /dev/null @@ -1,3351 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.BlockPalettes -{ - /// - /// Defines mappings for Minecraft 1.15. - /// Automatically generated using BlockPaletteGenerator.cs - /// - public class Palette115 : BlockPalette - { - private static readonly Dictionary materials = new(); - - static Palette115() - { - materials[0] = Material.Air; - materials[1] = Material.Stone; - materials[2] = Material.Granite; - materials[3] = Material.PolishedGranite; - materials[4] = Material.Diorite; - materials[5] = Material.PolishedDiorite; - materials[6] = Material.Andesite; - materials[7] = Material.PolishedAndesite; - for (int i = 8; i <= 9; i++) - materials[i] = Material.GrassBlock; - materials[10] = Material.Dirt; - materials[11] = Material.CoarseDirt; - for (int i = 12; i <= 13; i++) - materials[i] = Material.Podzol; - materials[14] = Material.Cobblestone; - materials[15] = Material.OakPlanks; - materials[16] = Material.SprucePlanks; - materials[17] = Material.BirchPlanks; - materials[18] = Material.JunglePlanks; - materials[19] = Material.AcaciaPlanks; - materials[20] = Material.DarkOakPlanks; - for (int i = 21; i <= 22; i++) - materials[i] = Material.OakSapling; - for (int i = 23; i <= 24; i++) - materials[i] = Material.SpruceSapling; - for (int i = 25; i <= 26; i++) - materials[i] = Material.BirchSapling; - for (int i = 27; i <= 28; i++) - materials[i] = Material.JungleSapling; - for (int i = 29; i <= 30; i++) - materials[i] = Material.AcaciaSapling; - for (int i = 31; i <= 32; i++) - materials[i] = Material.DarkOakSapling; - materials[33] = Material.Bedrock; - for (int i = 34; i <= 49; i++) - materials[i] = Material.Water; - for (int i = 50; i <= 65; i++) - materials[i] = Material.Lava; - materials[66] = Material.Sand; - materials[67] = Material.RedSand; - materials[68] = Material.Gravel; - materials[69] = Material.GoldOre; - materials[70] = Material.IronOre; - materials[71] = Material.CoalOre; - for (int i = 72; i <= 74; i++) - materials[i] = Material.OakLog; - for (int i = 75; i <= 77; i++) - materials[i] = Material.SpruceLog; - for (int i = 78; i <= 80; i++) - materials[i] = Material.BirchLog; - for (int i = 81; i <= 83; i++) - materials[i] = Material.JungleLog; - for (int i = 84; i <= 86; i++) - materials[i] = Material.AcaciaLog; - for (int i = 87; i <= 89; i++) - materials[i] = Material.DarkOakLog; - for (int i = 90; i <= 92; i++) - materials[i] = Material.StrippedSpruceLog; - for (int i = 93; i <= 95; i++) - materials[i] = Material.StrippedBirchLog; - for (int i = 96; i <= 98; i++) - materials[i] = Material.StrippedJungleLog; - for (int i = 99; i <= 101; i++) - materials[i] = Material.StrippedAcaciaLog; - for (int i = 102; i <= 104; i++) - materials[i] = Material.StrippedDarkOakLog; - for (int i = 105; i <= 107; i++) - materials[i] = Material.StrippedOakLog; - for (int i = 108; i <= 110; i++) - materials[i] = Material.OakWood; - for (int i = 111; i <= 113; i++) - materials[i] = Material.SpruceWood; - for (int i = 114; i <= 116; i++) - materials[i] = Material.BirchWood; - for (int i = 117; i <= 119; i++) - materials[i] = Material.JungleWood; - for (int i = 120; i <= 122; i++) - materials[i] = Material.AcaciaWood; - for (int i = 123; i <= 125; i++) - materials[i] = Material.DarkOakWood; - for (int i = 126; i <= 128; i++) - materials[i] = Material.StrippedOakWood; - for (int i = 129; i <= 131; i++) - materials[i] = Material.StrippedSpruceWood; - for (int i = 132; i <= 134; i++) - materials[i] = Material.StrippedBirchWood; - for (int i = 135; i <= 137; i++) - materials[i] = Material.StrippedJungleWood; - for (int i = 138; i <= 140; i++) - materials[i] = Material.StrippedAcaciaWood; - for (int i = 141; i <= 143; i++) - materials[i] = Material.StrippedDarkOakWood; - for (int i = 144; i <= 157; i++) - materials[i] = Material.OakLeaves; - for (int i = 158; i <= 171; i++) - materials[i] = Material.SpruceLeaves; - for (int i = 172; i <= 185; i++) - materials[i] = Material.BirchLeaves; - for (int i = 186; i <= 199; i++) - materials[i] = Material.JungleLeaves; - for (int i = 200; i <= 213; i++) - materials[i] = Material.AcaciaLeaves; - for (int i = 214; i <= 227; i++) - materials[i] = Material.DarkOakLeaves; - materials[228] = Material.Sponge; - materials[229] = Material.WetSponge; - materials[230] = Material.Glass; - materials[231] = Material.LapisOre; - materials[232] = Material.LapisBlock; - for (int i = 233; i <= 244; i++) - materials[i] = Material.Dispenser; - materials[245] = Material.Sandstone; - materials[246] = Material.ChiseledSandstone; - materials[247] = Material.CutSandstone; - for (int i = 248; i <= 1047; i++) - materials[i] = Material.NoteBlock; - for (int i = 1048; i <= 1063; i++) - materials[i] = Material.WhiteBed; - for (int i = 1064; i <= 1079; i++) - materials[i] = Material.OrangeBed; - for (int i = 1080; i <= 1095; i++) - materials[i] = Material.MagentaBed; - for (int i = 1096; i <= 1111; i++) - materials[i] = Material.LightBlueBed; - for (int i = 1112; i <= 1127; i++) - materials[i] = Material.YellowBed; - for (int i = 1128; i <= 1143; i++) - materials[i] = Material.LimeBed; - for (int i = 1144; i <= 1159; i++) - materials[i] = Material.PinkBed; - for (int i = 1160; i <= 1175; i++) - materials[i] = Material.GrayBed; - for (int i = 1176; i <= 1191; i++) - materials[i] = Material.LightGrayBed; - for (int i = 1192; i <= 1207; i++) - materials[i] = Material.CyanBed; - for (int i = 1208; i <= 1223; i++) - materials[i] = Material.PurpleBed; - for (int i = 1224; i <= 1239; i++) - materials[i] = Material.BlueBed; - for (int i = 1240; i <= 1255; i++) - materials[i] = Material.BrownBed; - for (int i = 1256; i <= 1271; i++) - materials[i] = Material.GreenBed; - for (int i = 1272; i <= 1287; i++) - materials[i] = Material.RedBed; - for (int i = 1288; i <= 1303; i++) - materials[i] = Material.BlackBed; - for (int i = 1304; i <= 1315; i++) - materials[i] = Material.PoweredRail; - for (int i = 1316; i <= 1327; i++) - materials[i] = Material.DetectorRail; - for (int i = 1328; i <= 1339; i++) - materials[i] = Material.StickyPiston; - materials[1340] = Material.Cobweb; - materials[1341] = Material.ShortGrass; - materials[1342] = Material.Fern; - materials[1343] = Material.DeadBush; - materials[1344] = Material.Seagrass; - for (int i = 1345; i <= 1346; i++) - materials[i] = Material.TallSeagrass; - for (int i = 1347; i <= 1358; i++) - materials[i] = Material.Piston; - for (int i = 1359; i <= 1382; i++) - materials[i] = Material.PistonHead; - materials[1383] = Material.WhiteWool; - materials[1384] = Material.OrangeWool; - materials[1385] = Material.MagentaWool; - materials[1386] = Material.LightBlueWool; - materials[1387] = Material.YellowWool; - materials[1388] = Material.LimeWool; - materials[1389] = Material.PinkWool; - materials[1390] = Material.GrayWool; - materials[1391] = Material.LightGrayWool; - materials[1392] = Material.CyanWool; - materials[1393] = Material.PurpleWool; - materials[1394] = Material.BlueWool; - materials[1395] = Material.BrownWool; - materials[1396] = Material.GreenWool; - materials[1397] = Material.RedWool; - materials[1398] = Material.BlackWool; - for (int i = 1399; i <= 1410; i++) - materials[i] = Material.MovingPiston; - materials[1411] = Material.Dandelion; - materials[1412] = Material.Poppy; - materials[1413] = Material.BlueOrchid; - materials[1414] = Material.Allium; - materials[1415] = Material.AzureBluet; - materials[1416] = Material.RedTulip; - materials[1417] = Material.OrangeTulip; - materials[1418] = Material.WhiteTulip; - materials[1419] = Material.PinkTulip; - materials[1420] = Material.OxeyeDaisy; - materials[1421] = Material.Cornflower; - materials[1422] = Material.WitherRose; - materials[1423] = Material.LilyOfTheValley; - materials[1424] = Material.BrownMushroom; - materials[1425] = Material.RedMushroom; - materials[1426] = Material.GoldBlock; - materials[1427] = Material.IronBlock; - materials[1428] = Material.Bricks; - for (int i = 1429; i <= 1430; i++) - materials[i] = Material.Tnt; - materials[1431] = Material.Bookshelf; - materials[1432] = Material.MossyCobblestone; - materials[1433] = Material.Obsidian; - materials[1434] = Material.Torch; - for (int i = 1435; i <= 1438; i++) - materials[i] = Material.WallTorch; - for (int i = 1439; i <= 1950; i++) - materials[i] = Material.Fire; - materials[1951] = Material.Spawner; - for (int i = 1952; i <= 2031; i++) - materials[i] = Material.OakStairs; - for (int i = 2032; i <= 2055; i++) - materials[i] = Material.Chest; - for (int i = 2056; i <= 3351; i++) - materials[i] = Material.RedstoneWire; - materials[3352] = Material.DiamondOre; - materials[3353] = Material.DiamondBlock; - materials[3354] = Material.CraftingTable; - for (int i = 3355; i <= 3362; i++) - materials[i] = Material.Wheat; - for (int i = 3363; i <= 3370; i++) - materials[i] = Material.Farmland; - for (int i = 3371; i <= 3378; i++) - materials[i] = Material.Furnace; - for (int i = 3379; i <= 3410; i++) - materials[i] = Material.OakSign; - for (int i = 3411; i <= 3442; i++) - materials[i] = Material.SpruceSign; - for (int i = 3443; i <= 3474; i++) - materials[i] = Material.BirchSign; - for (int i = 3475; i <= 3506; i++) - materials[i] = Material.AcaciaSign; - for (int i = 3507; i <= 3538; i++) - materials[i] = Material.JungleSign; - for (int i = 3539; i <= 3570; i++) - materials[i] = Material.DarkOakSign; - for (int i = 3571; i <= 3634; i++) - materials[i] = Material.OakDoor; - for (int i = 3635; i <= 3642; i++) - materials[i] = Material.Ladder; - for (int i = 3643; i <= 3652; i++) - materials[i] = Material.Rail; - for (int i = 3653; i <= 3732; i++) - materials[i] = Material.CobblestoneStairs; - for (int i = 3733; i <= 3740; i++) - materials[i] = Material.OakWallSign; - for (int i = 3741; i <= 3748; i++) - materials[i] = Material.SpruceWallSign; - for (int i = 3749; i <= 3756; i++) - materials[i] = Material.BirchWallSign; - for (int i = 3757; i <= 3764; i++) - materials[i] = Material.AcaciaWallSign; - for (int i = 3765; i <= 3772; i++) - materials[i] = Material.JungleWallSign; - for (int i = 3773; i <= 3780; i++) - materials[i] = Material.DarkOakWallSign; - for (int i = 3781; i <= 3804; i++) - materials[i] = Material.Lever; - for (int i = 3805; i <= 3806; i++) - materials[i] = Material.StonePressurePlate; - for (int i = 3807; i <= 3870; i++) - materials[i] = Material.IronDoor; - for (int i = 3871; i <= 3872; i++) - materials[i] = Material.OakPressurePlate; - for (int i = 3873; i <= 3874; i++) - materials[i] = Material.SprucePressurePlate; - for (int i = 3875; i <= 3876; i++) - materials[i] = Material.BirchPressurePlate; - for (int i = 3877; i <= 3878; i++) - materials[i] = Material.JunglePressurePlate; - for (int i = 3879; i <= 3880; i++) - materials[i] = Material.AcaciaPressurePlate; - for (int i = 3881; i <= 3882; i++) - materials[i] = Material.DarkOakPressurePlate; - for (int i = 3883; i <= 3884; i++) - materials[i] = Material.RedstoneOre; - for (int i = 3885; i <= 3886; i++) - materials[i] = Material.RedstoneTorch; - for (int i = 3887; i <= 3894; i++) - materials[i] = Material.RedstoneWallTorch; - for (int i = 3895; i <= 3918; i++) - materials[i] = Material.StoneButton; - for (int i = 3919; i <= 3926; i++) - materials[i] = Material.Snow; - materials[3927] = Material.Ice; - materials[3928] = Material.SnowBlock; - for (int i = 3929; i <= 3944; i++) - materials[i] = Material.Cactus; - materials[3945] = Material.Clay; - for (int i = 3946; i <= 3961; i++) - materials[i] = Material.SugarCane; - for (int i = 3962; i <= 3963; i++) - materials[i] = Material.Jukebox; - for (int i = 3964; i <= 3995; i++) - materials[i] = Material.OakFence; - materials[3996] = Material.Pumpkin; - materials[3997] = Material.Netherrack; - materials[3998] = Material.SoulSand; - materials[3999] = Material.Glowstone; - for (int i = 4000; i <= 4001; i++) - materials[i] = Material.NetherPortal; - for (int i = 4002; i <= 4005; i++) - materials[i] = Material.CarvedPumpkin; - for (int i = 4006; i <= 4009; i++) - materials[i] = Material.JackOLantern; - for (int i = 4010; i <= 4016; i++) - materials[i] = Material.Cake; - for (int i = 4017; i <= 4080; i++) - materials[i] = Material.Repeater; - materials[4081] = Material.WhiteStainedGlass; - materials[4082] = Material.OrangeStainedGlass; - materials[4083] = Material.MagentaStainedGlass; - materials[4084] = Material.LightBlueStainedGlass; - materials[4085] = Material.YellowStainedGlass; - materials[4086] = Material.LimeStainedGlass; - materials[4087] = Material.PinkStainedGlass; - materials[4088] = Material.GrayStainedGlass; - materials[4089] = Material.LightGrayStainedGlass; - materials[4090] = Material.CyanStainedGlass; - materials[4091] = Material.PurpleStainedGlass; - materials[4092] = Material.BlueStainedGlass; - materials[4093] = Material.BrownStainedGlass; - materials[4094] = Material.GreenStainedGlass; - materials[4095] = Material.RedStainedGlass; - materials[4096] = Material.BlackStainedGlass; - for (int i = 4097; i <= 4160; i++) - materials[i] = Material.OakTrapdoor; - for (int i = 4161; i <= 4224; i++) - materials[i] = Material.SpruceTrapdoor; - for (int i = 4225; i <= 4288; i++) - materials[i] = Material.BirchTrapdoor; - for (int i = 4289; i <= 4352; i++) - materials[i] = Material.JungleTrapdoor; - for (int i = 4353; i <= 4416; i++) - materials[i] = Material.AcaciaTrapdoor; - for (int i = 4417; i <= 4480; i++) - materials[i] = Material.DarkOakTrapdoor; - materials[4481] = Material.StoneBricks; - materials[4482] = Material.MossyStoneBricks; - materials[4483] = Material.CrackedStoneBricks; - materials[4484] = Material.ChiseledStoneBricks; - materials[4485] = Material.InfestedStone; - materials[4486] = Material.InfestedCobblestone; - materials[4487] = Material.InfestedStoneBricks; - materials[4488] = Material.InfestedMossyStoneBricks; - materials[4489] = Material.InfestedCrackedStoneBricks; - materials[4490] = Material.InfestedChiseledStoneBricks; - for (int i = 4491; i <= 4554; i++) - materials[i] = Material.BrownMushroomBlock; - for (int i = 4555; i <= 4618; i++) - materials[i] = Material.RedMushroomBlock; - for (int i = 4619; i <= 4682; i++) - materials[i] = Material.MushroomStem; - for (int i = 4683; i <= 4714; i++) - materials[i] = Material.IronBars; - for (int i = 4715; i <= 4746; i++) - materials[i] = Material.GlassPane; - materials[4747] = Material.Melon; - for (int i = 4748; i <= 4751; i++) - materials[i] = Material.AttachedPumpkinStem; - for (int i = 4752; i <= 4755; i++) - materials[i] = Material.AttachedMelonStem; - for (int i = 4756; i <= 4763; i++) - materials[i] = Material.PumpkinStem; - for (int i = 4764; i <= 4771; i++) - materials[i] = Material.MelonStem; - for (int i = 4772; i <= 4803; i++) - materials[i] = Material.Vine; - for (int i = 4804; i <= 4835; i++) - materials[i] = Material.OakFenceGate; - for (int i = 4836; i <= 4915; i++) - materials[i] = Material.BrickStairs; - for (int i = 4916; i <= 4995; i++) - materials[i] = Material.StoneBrickStairs; - for (int i = 4996; i <= 4997; i++) - materials[i] = Material.Mycelium; - materials[4998] = Material.LilyPad; - materials[4999] = Material.NetherBricks; - for (int i = 5000; i <= 5031; i++) - materials[i] = Material.NetherBrickFence; - for (int i = 5032; i <= 5111; i++) - materials[i] = Material.NetherBrickStairs; - for (int i = 5112; i <= 5115; i++) - materials[i] = Material.NetherWart; - materials[5116] = Material.EnchantingTable; - for (int i = 5117; i <= 5124; i++) - materials[i] = Material.BrewingStand; - for (int i = 5125; i <= 5128; i++) - materials[i] = Material.Cauldron; - materials[5129] = Material.EndPortal; - for (int i = 5130; i <= 5137; i++) - materials[i] = Material.EndPortalFrame; - materials[5138] = Material.EndStone; - materials[5139] = Material.DragonEgg; - for (int i = 5140; i <= 5141; i++) - materials[i] = Material.RedstoneLamp; - for (int i = 5142; i <= 5153; i++) - materials[i] = Material.Cocoa; - for (int i = 5154; i <= 5233; i++) - materials[i] = Material.SandstoneStairs; - materials[5234] = Material.EmeraldOre; - for (int i = 5235; i <= 5242; i++) - materials[i] = Material.EnderChest; - for (int i = 5243; i <= 5258; i++) - materials[i] = Material.TripwireHook; - for (int i = 5259; i <= 5386; i++) - materials[i] = Material.Tripwire; - materials[5387] = Material.EmeraldBlock; - for (int i = 5388; i <= 5467; i++) - materials[i] = Material.SpruceStairs; - for (int i = 5468; i <= 5547; i++) - materials[i] = Material.BirchStairs; - for (int i = 5548; i <= 5627; i++) - materials[i] = Material.JungleStairs; - for (int i = 5628; i <= 5639; i++) - materials[i] = Material.CommandBlock; - materials[5640] = Material.Beacon; - for (int i = 5641; i <= 5704; i++) - materials[i] = Material.CobblestoneWall; - for (int i = 5705; i <= 5768; i++) - materials[i] = Material.MossyCobblestoneWall; - materials[5769] = Material.FlowerPot; - materials[5770] = Material.PottedOakSapling; - materials[5771] = Material.PottedSpruceSapling; - materials[5772] = Material.PottedBirchSapling; - materials[5773] = Material.PottedJungleSapling; - materials[5774] = Material.PottedAcaciaSapling; - materials[5775] = Material.PottedDarkOakSapling; - materials[5776] = Material.PottedFern; - materials[5777] = Material.PottedDandelion; - materials[5778] = Material.PottedPoppy; - materials[5779] = Material.PottedBlueOrchid; - materials[5780] = Material.PottedAllium; - materials[5781] = Material.PottedAzureBluet; - materials[5782] = Material.PottedRedTulip; - materials[5783] = Material.PottedOrangeTulip; - materials[5784] = Material.PottedWhiteTulip; - materials[5785] = Material.PottedPinkTulip; - materials[5786] = Material.PottedOxeyeDaisy; - materials[5787] = Material.PottedCornflower; - materials[5788] = Material.PottedLilyOfTheValley; - materials[5789] = Material.PottedWitherRose; - materials[5790] = Material.PottedRedMushroom; - materials[5791] = Material.PottedBrownMushroom; - materials[5792] = Material.PottedDeadBush; - materials[5793] = Material.PottedCactus; - for (int i = 5794; i <= 5801; i++) - materials[i] = Material.Carrots; - for (int i = 5802; i <= 5809; i++) - materials[i] = Material.Potatoes; - for (int i = 5810; i <= 5833; i++) - materials[i] = Material.OakButton; - for (int i = 5834; i <= 5857; i++) - materials[i] = Material.SpruceButton; - for (int i = 5858; i <= 5881; i++) - materials[i] = Material.BirchButton; - for (int i = 5882; i <= 5905; i++) - materials[i] = Material.JungleButton; - for (int i = 5906; i <= 5929; i++) - materials[i] = Material.AcaciaButton; - for (int i = 5930; i <= 5953; i++) - materials[i] = Material.DarkOakButton; - for (int i = 5954; i <= 5969; i++) - materials[i] = Material.SkeletonSkull; - for (int i = 5970; i <= 5973; i++) - materials[i] = Material.SkeletonWallSkull; - for (int i = 5974; i <= 5989; i++) - materials[i] = Material.WitherSkeletonSkull; - for (int i = 5990; i <= 5993; i++) - materials[i] = Material.WitherSkeletonWallSkull; - for (int i = 5994; i <= 6009; i++) - materials[i] = Material.ZombieHead; - for (int i = 6010; i <= 6013; i++) - materials[i] = Material.ZombieWallHead; - for (int i = 6014; i <= 6029; i++) - materials[i] = Material.PlayerHead; - for (int i = 6030; i <= 6033; i++) - materials[i] = Material.PlayerWallHead; - for (int i = 6034; i <= 6049; i++) - materials[i] = Material.CreeperHead; - for (int i = 6050; i <= 6053; i++) - materials[i] = Material.CreeperWallHead; - for (int i = 6054; i <= 6069; i++) - materials[i] = Material.DragonHead; - for (int i = 6070; i <= 6073; i++) - materials[i] = Material.DragonWallHead; - for (int i = 6074; i <= 6077; i++) - materials[i] = Material.Anvil; - for (int i = 6078; i <= 6081; i++) - materials[i] = Material.ChippedAnvil; - for (int i = 6082; i <= 6085; i++) - materials[i] = Material.DamagedAnvil; - for (int i = 6086; i <= 6109; i++) - materials[i] = Material.TrappedChest; - for (int i = 6110; i <= 6125; i++) - materials[i] = Material.LightWeightedPressurePlate; - for (int i = 6126; i <= 6141; i++) - materials[i] = Material.HeavyWeightedPressurePlate; - for (int i = 6142; i <= 6157; i++) - materials[i] = Material.Comparator; - for (int i = 6158; i <= 6189; i++) - materials[i] = Material.DaylightDetector; - materials[6190] = Material.RedstoneBlock; - materials[6191] = Material.NetherQuartzOre; - for (int i = 6192; i <= 6201; i++) - materials[i] = Material.Hopper; - materials[6202] = Material.QuartzBlock; - materials[6203] = Material.ChiseledQuartzBlock; - for (int i = 6204; i <= 6206; i++) - materials[i] = Material.QuartzPillar; - for (int i = 6207; i <= 6286; i++) - materials[i] = Material.QuartzStairs; - for (int i = 6287; i <= 6298; i++) - materials[i] = Material.ActivatorRail; - for (int i = 6299; i <= 6310; i++) - materials[i] = Material.Dropper; - materials[6311] = Material.WhiteTerracotta; - materials[6312] = Material.OrangeTerracotta; - materials[6313] = Material.MagentaTerracotta; - materials[6314] = Material.LightBlueTerracotta; - materials[6315] = Material.YellowTerracotta; - materials[6316] = Material.LimeTerracotta; - materials[6317] = Material.PinkTerracotta; - materials[6318] = Material.GrayTerracotta; - materials[6319] = Material.LightGrayTerracotta; - materials[6320] = Material.CyanTerracotta; - materials[6321] = Material.PurpleTerracotta; - materials[6322] = Material.BlueTerracotta; - materials[6323] = Material.BrownTerracotta; - materials[6324] = Material.GreenTerracotta; - materials[6325] = Material.RedTerracotta; - materials[6326] = Material.BlackTerracotta; - for (int i = 6327; i <= 6358; i++) - materials[i] = Material.WhiteStainedGlassPane; - for (int i = 6359; i <= 6390; i++) - materials[i] = Material.OrangeStainedGlassPane; - for (int i = 6391; i <= 6422; i++) - materials[i] = Material.MagentaStainedGlassPane; - for (int i = 6423; i <= 6454; i++) - materials[i] = Material.LightBlueStainedGlassPane; - for (int i = 6455; i <= 6486; i++) - materials[i] = Material.YellowStainedGlassPane; - for (int i = 6487; i <= 6518; i++) - materials[i] = Material.LimeStainedGlassPane; - for (int i = 6519; i <= 6550; i++) - materials[i] = Material.PinkStainedGlassPane; - for (int i = 6551; i <= 6582; i++) - materials[i] = Material.GrayStainedGlassPane; - for (int i = 6583; i <= 6614; i++) - materials[i] = Material.LightGrayStainedGlassPane; - for (int i = 6615; i <= 6646; i++) - materials[i] = Material.CyanStainedGlassPane; - for (int i = 6647; i <= 6678; i++) - materials[i] = Material.PurpleStainedGlassPane; - for (int i = 6679; i <= 6710; i++) - materials[i] = Material.BlueStainedGlassPane; - for (int i = 6711; i <= 6742; i++) - materials[i] = Material.BrownStainedGlassPane; - for (int i = 6743; i <= 6774; i++) - materials[i] = Material.GreenStainedGlassPane; - for (int i = 6775; i <= 6806; i++) - materials[i] = Material.RedStainedGlassPane; - for (int i = 6807; i <= 6838; i++) - materials[i] = Material.BlackStainedGlassPane; - for (int i = 6839; i <= 6918; i++) - materials[i] = Material.AcaciaStairs; - for (int i = 6919; i <= 6998; i++) - materials[i] = Material.DarkOakStairs; - materials[6999] = Material.SlimeBlock; - materials[7000] = Material.Barrier; - for (int i = 7001; i <= 7064; i++) - materials[i] = Material.IronTrapdoor; - materials[7065] = Material.Prismarine; - materials[7066] = Material.PrismarineBricks; - materials[7067] = Material.DarkPrismarine; - for (int i = 7068; i <= 7147; i++) - materials[i] = Material.PrismarineStairs; - for (int i = 7148; i <= 7227; i++) - materials[i] = Material.PrismarineBrickStairs; - for (int i = 7228; i <= 7307; i++) - materials[i] = Material.DarkPrismarineStairs; - for (int i = 7308; i <= 7313; i++) - materials[i] = Material.PrismarineSlab; - for (int i = 7314; i <= 7319; i++) - materials[i] = Material.PrismarineBrickSlab; - for (int i = 7320; i <= 7325; i++) - materials[i] = Material.DarkPrismarineSlab; - materials[7326] = Material.SeaLantern; - for (int i = 7327; i <= 7329; i++) - materials[i] = Material.HayBlock; - materials[7330] = Material.WhiteCarpet; - materials[7331] = Material.OrangeCarpet; - materials[7332] = Material.MagentaCarpet; - materials[7333] = Material.LightBlueCarpet; - materials[7334] = Material.YellowCarpet; - materials[7335] = Material.LimeCarpet; - materials[7336] = Material.PinkCarpet; - materials[7337] = Material.GrayCarpet; - materials[7338] = Material.LightGrayCarpet; - materials[7339] = Material.CyanCarpet; - materials[7340] = Material.PurpleCarpet; - materials[7341] = Material.BlueCarpet; - materials[7342] = Material.BrownCarpet; - materials[7343] = Material.GreenCarpet; - materials[7344] = Material.RedCarpet; - materials[7345] = Material.BlackCarpet; - materials[7346] = Material.Terracotta; - materials[7347] = Material.CoalBlock; - materials[7348] = Material.PackedIce; - for (int i = 7349; i <= 7350; i++) - materials[i] = Material.Sunflower; - for (int i = 7351; i <= 7352; i++) - materials[i] = Material.Lilac; - for (int i = 7353; i <= 7354; i++) - materials[i] = Material.RoseBush; - for (int i = 7355; i <= 7356; i++) - materials[i] = Material.Peony; - for (int i = 7357; i <= 7358; i++) - materials[i] = Material.TallGrass; - for (int i = 7359; i <= 7360; i++) - materials[i] = Material.LargeFern; - for (int i = 7361; i <= 7376; i++) - materials[i] = Material.WhiteBanner; - for (int i = 7377; i <= 7392; i++) - materials[i] = Material.OrangeBanner; - for (int i = 7393; i <= 7408; i++) - materials[i] = Material.MagentaBanner; - for (int i = 7409; i <= 7424; i++) - materials[i] = Material.LightBlueBanner; - for (int i = 7425; i <= 7440; i++) - materials[i] = Material.YellowBanner; - for (int i = 7441; i <= 7456; i++) - materials[i] = Material.LimeBanner; - for (int i = 7457; i <= 7472; i++) - materials[i] = Material.PinkBanner; - for (int i = 7473; i <= 7488; i++) - materials[i] = Material.GrayBanner; - for (int i = 7489; i <= 7504; i++) - materials[i] = Material.LightGrayBanner; - for (int i = 7505; i <= 7520; i++) - materials[i] = Material.CyanBanner; - for (int i = 7521; i <= 7536; i++) - materials[i] = Material.PurpleBanner; - for (int i = 7537; i <= 7552; i++) - materials[i] = Material.BlueBanner; - for (int i = 7553; i <= 7568; i++) - materials[i] = Material.BrownBanner; - for (int i = 7569; i <= 7584; i++) - materials[i] = Material.GreenBanner; - for (int i = 7585; i <= 7600; i++) - materials[i] = Material.RedBanner; - for (int i = 7601; i <= 7616; i++) - materials[i] = Material.BlackBanner; - for (int i = 7617; i <= 7620; i++) - materials[i] = Material.WhiteWallBanner; - for (int i = 7621; i <= 7624; i++) - materials[i] = Material.OrangeWallBanner; - for (int i = 7625; i <= 7628; i++) - materials[i] = Material.MagentaWallBanner; - for (int i = 7629; i <= 7632; i++) - materials[i] = Material.LightBlueWallBanner; - for (int i = 7633; i <= 7636; i++) - materials[i] = Material.YellowWallBanner; - for (int i = 7637; i <= 7640; i++) - materials[i] = Material.LimeWallBanner; - for (int i = 7641; i <= 7644; i++) - materials[i] = Material.PinkWallBanner; - for (int i = 7645; i <= 7648; i++) - materials[i] = Material.GrayWallBanner; - for (int i = 7649; i <= 7652; i++) - materials[i] = Material.LightGrayWallBanner; - for (int i = 7653; i <= 7656; i++) - materials[i] = Material.CyanWallBanner; - for (int i = 7657; i <= 7660; i++) - materials[i] = Material.PurpleWallBanner; - for (int i = 7661; i <= 7664; i++) - materials[i] = Material.BlueWallBanner; - for (int i = 7665; i <= 7668; i++) - materials[i] = Material.BrownWallBanner; - for (int i = 7669; i <= 7672; i++) - materials[i] = Material.GreenWallBanner; - for (int i = 7673; i <= 7676; i++) - materials[i] = Material.RedWallBanner; - for (int i = 7677; i <= 7680; i++) - materials[i] = Material.BlackWallBanner; - materials[7681] = Material.RedSandstone; - materials[7682] = Material.ChiseledRedSandstone; - materials[7683] = Material.CutRedSandstone; - for (int i = 7684; i <= 7763; i++) - materials[i] = Material.RedSandstoneStairs; - for (int i = 7764; i <= 7769; i++) - materials[i] = Material.OakSlab; - for (int i = 7770; i <= 7775; i++) - materials[i] = Material.SpruceSlab; - for (int i = 7776; i <= 7781; i++) - materials[i] = Material.BirchSlab; - for (int i = 7782; i <= 7787; i++) - materials[i] = Material.JungleSlab; - for (int i = 7788; i <= 7793; i++) - materials[i] = Material.AcaciaSlab; - for (int i = 7794; i <= 7799; i++) - materials[i] = Material.DarkOakSlab; - for (int i = 7800; i <= 7805; i++) - materials[i] = Material.StoneSlab; - for (int i = 7806; i <= 7811; i++) - materials[i] = Material.SmoothStoneSlab; - for (int i = 7812; i <= 7817; i++) - materials[i] = Material.SandstoneSlab; - for (int i = 7818; i <= 7823; i++) - materials[i] = Material.CutSandstoneSlab; - for (int i = 7824; i <= 7829; i++) - materials[i] = Material.PetrifiedOakSlab; - for (int i = 7830; i <= 7835; i++) - materials[i] = Material.CobblestoneSlab; - for (int i = 7836; i <= 7841; i++) - materials[i] = Material.BrickSlab; - for (int i = 7842; i <= 7847; i++) - materials[i] = Material.StoneBrickSlab; - for (int i = 7848; i <= 7853; i++) - materials[i] = Material.NetherBrickSlab; - for (int i = 7854; i <= 7859; i++) - materials[i] = Material.QuartzSlab; - for (int i = 7860; i <= 7865; i++) - materials[i] = Material.RedSandstoneSlab; - for (int i = 7866; i <= 7871; i++) - materials[i] = Material.CutRedSandstoneSlab; - for (int i = 7872; i <= 7877; i++) - materials[i] = Material.PurpurSlab; - materials[7878] = Material.SmoothStone; - materials[7879] = Material.SmoothSandstone; - materials[7880] = Material.SmoothQuartz; - materials[7881] = Material.SmoothRedSandstone; - for (int i = 7882; i <= 7913; i++) - materials[i] = Material.SpruceFenceGate; - for (int i = 7914; i <= 7945; i++) - materials[i] = Material.BirchFenceGate; - for (int i = 7946; i <= 7977; i++) - materials[i] = Material.JungleFenceGate; - for (int i = 7978; i <= 8009; i++) - materials[i] = Material.AcaciaFenceGate; - for (int i = 8010; i <= 8041; i++) - materials[i] = Material.DarkOakFenceGate; - for (int i = 8042; i <= 8073; i++) - materials[i] = Material.SpruceFence; - for (int i = 8074; i <= 8105; i++) - materials[i] = Material.BirchFence; - for (int i = 8106; i <= 8137; i++) - materials[i] = Material.JungleFence; - for (int i = 8138; i <= 8169; i++) - materials[i] = Material.AcaciaFence; - for (int i = 8170; i <= 8201; i++) - materials[i] = Material.DarkOakFence; - for (int i = 8202; i <= 8265; i++) - materials[i] = Material.SpruceDoor; - for (int i = 8266; i <= 8329; i++) - materials[i] = Material.BirchDoor; - for (int i = 8330; i <= 8393; i++) - materials[i] = Material.JungleDoor; - for (int i = 8394; i <= 8457; i++) - materials[i] = Material.AcaciaDoor; - for (int i = 8458; i <= 8521; i++) - materials[i] = Material.DarkOakDoor; - for (int i = 8522; i <= 8527; i++) - materials[i] = Material.EndRod; - for (int i = 8528; i <= 8591; i++) - materials[i] = Material.ChorusPlant; - for (int i = 8592; i <= 8597; i++) - materials[i] = Material.ChorusFlower; - materials[8598] = Material.PurpurBlock; - for (int i = 8599; i <= 8601; i++) - materials[i] = Material.PurpurPillar; - for (int i = 8602; i <= 8681; i++) - materials[i] = Material.PurpurStairs; - materials[8682] = Material.EndStoneBricks; - for (int i = 8683; i <= 8686; i++) - materials[i] = Material.Beetroots; - materials[8687] = Material.DirtPath; - materials[8688] = Material.EndGateway; - for (int i = 8689; i <= 8700; i++) - materials[i] = Material.RepeatingCommandBlock; - for (int i = 8701; i <= 8712; i++) - materials[i] = Material.ChainCommandBlock; - for (int i = 8713; i <= 8716; i++) - materials[i] = Material.FrostedIce; - materials[8717] = Material.MagmaBlock; - materials[8718] = Material.NetherWartBlock; - materials[8719] = Material.RedNetherBricks; - for (int i = 8720; i <= 8722; i++) - materials[i] = Material.BoneBlock; - materials[8723] = Material.StructureVoid; - for (int i = 8724; i <= 8735; i++) - materials[i] = Material.Observer; - for (int i = 8736; i <= 8741; i++) - materials[i] = Material.ShulkerBox; - for (int i = 8742; i <= 8747; i++) - materials[i] = Material.WhiteShulkerBox; - for (int i = 8748; i <= 8753; i++) - materials[i] = Material.OrangeShulkerBox; - for (int i = 8754; i <= 8759; i++) - materials[i] = Material.MagentaShulkerBox; - for (int i = 8760; i <= 8765; i++) - materials[i] = Material.LightBlueShulkerBox; - for (int i = 8766; i <= 8771; i++) - materials[i] = Material.YellowShulkerBox; - for (int i = 8772; i <= 8777; i++) - materials[i] = Material.LimeShulkerBox; - for (int i = 8778; i <= 8783; i++) - materials[i] = Material.PinkShulkerBox; - for (int i = 8784; i <= 8789; i++) - materials[i] = Material.GrayShulkerBox; - for (int i = 8790; i <= 8795; i++) - materials[i] = Material.LightGrayShulkerBox; - for (int i = 8796; i <= 8801; i++) - materials[i] = Material.CyanShulkerBox; - for (int i = 8802; i <= 8807; i++) - materials[i] = Material.PurpleShulkerBox; - for (int i = 8808; i <= 8813; i++) - materials[i] = Material.BlueShulkerBox; - for (int i = 8814; i <= 8819; i++) - materials[i] = Material.BrownShulkerBox; - for (int i = 8820; i <= 8825; i++) - materials[i] = Material.GreenShulkerBox; - for (int i = 8826; i <= 8831; i++) - materials[i] = Material.RedShulkerBox; - for (int i = 8832; i <= 8837; i++) - materials[i] = Material.BlackShulkerBox; - for (int i = 8838; i <= 8841; i++) - materials[i] = Material.WhiteGlazedTerracotta; - for (int i = 8842; i <= 8845; i++) - materials[i] = Material.OrangeGlazedTerracotta; - for (int i = 8846; i <= 8849; i++) - materials[i] = Material.MagentaGlazedTerracotta; - for (int i = 8850; i <= 8853; i++) - materials[i] = Material.LightBlueGlazedTerracotta; - for (int i = 8854; i <= 8857; i++) - materials[i] = Material.YellowGlazedTerracotta; - for (int i = 8858; i <= 8861; i++) - materials[i] = Material.LimeGlazedTerracotta; - for (int i = 8862; i <= 8865; i++) - materials[i] = Material.PinkGlazedTerracotta; - for (int i = 8866; i <= 8869; i++) - materials[i] = Material.GrayGlazedTerracotta; - for (int i = 8870; i <= 8873; i++) - materials[i] = Material.LightGrayGlazedTerracotta; - for (int i = 8874; i <= 8877; i++) - materials[i] = Material.CyanGlazedTerracotta; - for (int i = 8878; i <= 8881; i++) - materials[i] = Material.PurpleGlazedTerracotta; - for (int i = 8882; i <= 8885; i++) - materials[i] = Material.BlueGlazedTerracotta; - for (int i = 8886; i <= 8889; i++) - materials[i] = Material.BrownGlazedTerracotta; - for (int i = 8890; i <= 8893; i++) - materials[i] = Material.GreenGlazedTerracotta; - for (int i = 8894; i <= 8897; i++) - materials[i] = Material.RedGlazedTerracotta; - for (int i = 8898; i <= 8901; i++) - materials[i] = Material.BlackGlazedTerracotta; - materials[8902] = Material.WhiteConcrete; - materials[8903] = Material.OrangeConcrete; - materials[8904] = Material.MagentaConcrete; - materials[8905] = Material.LightBlueConcrete; - materials[8906] = Material.YellowConcrete; - materials[8907] = Material.LimeConcrete; - materials[8908] = Material.PinkConcrete; - materials[8909] = Material.GrayConcrete; - materials[8910] = Material.LightGrayConcrete; - materials[8911] = Material.CyanConcrete; - materials[8912] = Material.PurpleConcrete; - materials[8913] = Material.BlueConcrete; - materials[8914] = Material.BrownConcrete; - materials[8915] = Material.GreenConcrete; - materials[8916] = Material.RedConcrete; - materials[8917] = Material.BlackConcrete; - materials[8918] = Material.WhiteConcretePowder; - materials[8919] = Material.OrangeConcretePowder; - materials[8920] = Material.MagentaConcretePowder; - materials[8921] = Material.LightBlueConcretePowder; - materials[8922] = Material.YellowConcretePowder; - materials[8923] = Material.LimeConcretePowder; - materials[8924] = Material.PinkConcretePowder; - materials[8925] = Material.GrayConcretePowder; - materials[8926] = Material.LightGrayConcretePowder; - materials[8927] = Material.CyanConcretePowder; - materials[8928] = Material.PurpleConcretePowder; - materials[8929] = Material.BlueConcretePowder; - materials[8930] = Material.BrownConcretePowder; - materials[8931] = Material.GreenConcretePowder; - materials[8932] = Material.RedConcretePowder; - materials[8933] = Material.BlackConcretePowder; - for (int i = 8934; i <= 8959; i++) - materials[i] = Material.Kelp; - materials[8960] = Material.KelpPlant; - materials[8961] = Material.DriedKelpBlock; - for (int i = 8962; i <= 8973; i++) - materials[i] = Material.TurtleEgg; - materials[8974] = Material.DeadTubeCoralBlock; - materials[8975] = Material.DeadBrainCoralBlock; - materials[8976] = Material.DeadBubbleCoralBlock; - materials[8977] = Material.DeadFireCoralBlock; - materials[8978] = Material.DeadHornCoralBlock; - materials[8979] = Material.TubeCoralBlock; - materials[8980] = Material.BrainCoralBlock; - materials[8981] = Material.BubbleCoralBlock; - materials[8982] = Material.FireCoralBlock; - materials[8983] = Material.HornCoralBlock; - for (int i = 8984; i <= 8985; i++) - materials[i] = Material.DeadTubeCoral; - for (int i = 8986; i <= 8987; i++) - materials[i] = Material.DeadBrainCoral; - for (int i = 8988; i <= 8989; i++) - materials[i] = Material.DeadBubbleCoral; - for (int i = 8990; i <= 8991; i++) - materials[i] = Material.DeadFireCoral; - for (int i = 8992; i <= 8993; i++) - materials[i] = Material.DeadHornCoral; - for (int i = 8994; i <= 8995; i++) - materials[i] = Material.TubeCoral; - for (int i = 8996; i <= 8997; i++) - materials[i] = Material.BrainCoral; - for (int i = 8998; i <= 8999; i++) - materials[i] = Material.BubbleCoral; - for (int i = 9000; i <= 9001; i++) - materials[i] = Material.FireCoral; - for (int i = 9002; i <= 9003; i++) - materials[i] = Material.HornCoral; - for (int i = 9004; i <= 9005; i++) - materials[i] = Material.DeadTubeCoralFan; - for (int i = 9006; i <= 9007; i++) - materials[i] = Material.DeadBrainCoralFan; - for (int i = 9008; i <= 9009; i++) - materials[i] = Material.DeadBubbleCoralFan; - for (int i = 9010; i <= 9011; i++) - materials[i] = Material.DeadFireCoralFan; - for (int i = 9012; i <= 9013; i++) - materials[i] = Material.DeadHornCoralFan; - for (int i = 9014; i <= 9015; i++) - materials[i] = Material.TubeCoralFan; - for (int i = 9016; i <= 9017; i++) - materials[i] = Material.BrainCoralFan; - for (int i = 9018; i <= 9019; i++) - materials[i] = Material.BubbleCoralFan; - for (int i = 9020; i <= 9021; i++) - materials[i] = Material.FireCoralFan; - for (int i = 9022; i <= 9023; i++) - materials[i] = Material.HornCoralFan; - for (int i = 9024; i <= 9031; i++) - materials[i] = Material.DeadTubeCoralWallFan; - for (int i = 9032; i <= 9039; i++) - materials[i] = Material.DeadBrainCoralWallFan; - for (int i = 9040; i <= 9047; i++) - materials[i] = Material.DeadBubbleCoralWallFan; - for (int i = 9048; i <= 9055; i++) - materials[i] = Material.DeadFireCoralWallFan; - for (int i = 9056; i <= 9063; i++) - materials[i] = Material.DeadHornCoralWallFan; - for (int i = 9064; i <= 9071; i++) - materials[i] = Material.TubeCoralWallFan; - for (int i = 9072; i <= 9079; i++) - materials[i] = Material.BrainCoralWallFan; - for (int i = 9080; i <= 9087; i++) - materials[i] = Material.BubbleCoralWallFan; - for (int i = 9088; i <= 9095; i++) - materials[i] = Material.FireCoralWallFan; - for (int i = 9096; i <= 9103; i++) - materials[i] = Material.HornCoralWallFan; - for (int i = 9104; i <= 9111; i++) - materials[i] = Material.SeaPickle; - materials[9112] = Material.BlueIce; - for (int i = 9113; i <= 9114; i++) - materials[i] = Material.Conduit; - materials[9115] = Material.BambooSapling; - for (int i = 9116; i <= 9127; i++) - materials[i] = Material.Bamboo; - materials[9128] = Material.PottedBamboo; - materials[9129] = Material.VoidAir; - materials[9130] = Material.CaveAir; - for (int i = 9131; i <= 9132; i++) - materials[i] = Material.BubbleColumn; - for (int i = 9133; i <= 9212; i++) - materials[i] = Material.PolishedGraniteStairs; - for (int i = 9213; i <= 9292; i++) - materials[i] = Material.SmoothRedSandstoneStairs; - for (int i = 9293; i <= 9372; i++) - materials[i] = Material.MossyStoneBrickStairs; - for (int i = 9373; i <= 9452; i++) - materials[i] = Material.PolishedDioriteStairs; - for (int i = 9453; i <= 9532; i++) - materials[i] = Material.MossyCobblestoneStairs; - for (int i = 9533; i <= 9612; i++) - materials[i] = Material.EndStoneBrickStairs; - for (int i = 9613; i <= 9692; i++) - materials[i] = Material.StoneStairs; - for (int i = 9693; i <= 9772; i++) - materials[i] = Material.SmoothSandstoneStairs; - for (int i = 9773; i <= 9852; i++) - materials[i] = Material.SmoothQuartzStairs; - for (int i = 9853; i <= 9932; i++) - materials[i] = Material.GraniteStairs; - for (int i = 9933; i <= 10012; i++) - materials[i] = Material.AndesiteStairs; - for (int i = 10013; i <= 10092; i++) - materials[i] = Material.RedNetherBrickStairs; - for (int i = 10093; i <= 10172; i++) - materials[i] = Material.PolishedAndesiteStairs; - for (int i = 10173; i <= 10252; i++) - materials[i] = Material.DioriteStairs; - for (int i = 10253; i <= 10258; i++) - materials[i] = Material.PolishedGraniteSlab; - for (int i = 10259; i <= 10264; i++) - materials[i] = Material.SmoothRedSandstoneSlab; - for (int i = 10265; i <= 10270; i++) - materials[i] = Material.MossyStoneBrickSlab; - for (int i = 10271; i <= 10276; i++) - materials[i] = Material.PolishedDioriteSlab; - for (int i = 10277; i <= 10282; i++) - materials[i] = Material.MossyCobblestoneSlab; - for (int i = 10283; i <= 10288; i++) - materials[i] = Material.EndStoneBrickSlab; - for (int i = 10289; i <= 10294; i++) - materials[i] = Material.SmoothSandstoneSlab; - for (int i = 10295; i <= 10300; i++) - materials[i] = Material.SmoothQuartzSlab; - for (int i = 10301; i <= 10306; i++) - materials[i] = Material.GraniteSlab; - for (int i = 10307; i <= 10312; i++) - materials[i] = Material.AndesiteSlab; - for (int i = 10313; i <= 10318; i++) - materials[i] = Material.RedNetherBrickSlab; - for (int i = 10319; i <= 10324; i++) - materials[i] = Material.PolishedAndesiteSlab; - for (int i = 10325; i <= 10330; i++) - materials[i] = Material.DioriteSlab; - for (int i = 10331; i <= 10394; i++) - materials[i] = Material.BrickWall; - for (int i = 10395; i <= 10458; i++) - materials[i] = Material.PrismarineWall; - for (int i = 10459; i <= 10522; i++) - materials[i] = Material.RedSandstoneWall; - for (int i = 10523; i <= 10586; i++) - materials[i] = Material.MossyStoneBrickWall; - for (int i = 10587; i <= 10650; i++) - materials[i] = Material.GraniteWall; - for (int i = 10651; i <= 10714; i++) - materials[i] = Material.StoneBrickWall; - for (int i = 10715; i <= 10778; i++) - materials[i] = Material.NetherBrickWall; - for (int i = 10779; i <= 10842; i++) - materials[i] = Material.AndesiteWall; - for (int i = 10843; i <= 10906; i++) - materials[i] = Material.RedNetherBrickWall; - for (int i = 10907; i <= 10970; i++) - materials[i] = Material.SandstoneWall; - for (int i = 10971; i <= 11034; i++) - materials[i] = Material.EndStoneBrickWall; - for (int i = 11035; i <= 11098; i++) - materials[i] = Material.DioriteWall; - for (int i = 11099; i <= 11130; i++) - materials[i] = Material.Scaffolding; - for (int i = 11131; i <= 11134; i++) - materials[i] = Material.Loom; - for (int i = 11135; i <= 11146; i++) - materials[i] = Material.Barrel; - for (int i = 11147; i <= 11154; i++) - materials[i] = Material.Smoker; - for (int i = 11155; i <= 11162; i++) - materials[i] = Material.BlastFurnace; - materials[11163] = Material.CartographyTable; - materials[11164] = Material.FletchingTable; - for (int i = 11165; i <= 11176; i++) - materials[i] = Material.Grindstone; - for (int i = 11177; i <= 11192; i++) - materials[i] = Material.Lectern; - materials[11193] = Material.SmithingTable; - for (int i = 11194; i <= 11197; i++) - materials[i] = Material.Stonecutter; - for (int i = 11198; i <= 11229; i++) - materials[i] = Material.Bell; - for (int i = 11230; i <= 11231; i++) - materials[i] = Material.Lantern; - for (int i = 11232; i <= 11263; i++) - materials[i] = Material.Campfire; - for (int i = 11264; i <= 11267; i++) - materials[i] = Material.SweetBerryBush; - for (int i = 11268; i <= 11271; i++) - materials[i] = Material.StructureBlock; - for (int i = 11272; i <= 11277; i++) - materials[i] = Material.Jigsaw; - for (int i = 11278; i <= 11286; i++) - materials[i] = Material.Composter; - for (int i = 11287; i <= 11310; i++) - materials[i] = Material.BeeNest; - for (int i = 11311; i <= 11334; i++) - materials[i] = Material.Beehive; - materials[11335] = Material.HoneyBlock; - materials[11336] = Material.HoneycombBlock; - } - - // - private static readonly BlockStateDefinition[] stateDefinitions = - [ - new(8, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(12, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(21, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(23, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(25, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(27, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(29, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(31, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(34, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(50, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(72, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(75, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(78, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(81, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(84, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(87, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(90, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(93, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(96, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(99, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(102, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(105, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(108, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(111, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(114, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(117, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(120, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(123, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(126, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(129, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(132, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(135, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(138, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(141, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(144, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(158, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(172, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(186, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(200, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(214, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(233, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(248, 800, - [ - new("instrument", ["harp", "basedrum", "snare", "hat", "bass", "flute", "bell", "guitar", "chime", "xylophone", "iron_xylophone", "cow_bell", "didgeridoo", "bit", "banjo", "pling"], 50), - new("note", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"], 2), - new("powered", ["true", "false"], 1) - ]), - new(1048, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1064, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1080, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1096, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1112, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1128, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1144, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1160, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1176, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1192, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1208, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1224, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1240, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1256, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1272, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1288, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1304, 12, - [ - new("powered", ["true", "false"], 6), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 1) - ]), - new(1316, 12, - [ - new("powered", ["true", "false"], 6), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 1) - ]), - new(1328, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(1345, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(1347, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(1359, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("short", ["true", "false"], 2), - new("type", ["normal", "sticky"], 1) - ]), - new(1399, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("type", ["normal", "sticky"], 1) - ]), - new(1429, 2, - [ - new("unstable", ["true", "false"], 1) - ]), - new(1435, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(1439, 512, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(1952, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2032, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("type", ["single", "left", "right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2056, 1296, - [ - new("east", ["up", "side", "none"], 432), - new("north", ["up", "side", "none"], 144), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 9), - new("south", ["up", "side", "none"], 3), - new("west", ["up", "side", "none"], 1) - ]), - new(3355, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(3363, 8, - [ - new("moisture", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(3371, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(3379, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3411, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3443, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3475, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3507, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3539, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3571, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(3635, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3643, 10, - [ - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south", "south_east", "south_west", "north_west", "north_east"], 1) - ]), - new(3653, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3733, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3741, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3749, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3757, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3765, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3773, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3781, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(3805, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3807, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(3871, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3873, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3875, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3877, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3879, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3881, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3883, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(3885, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(3887, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(3895, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(3919, 8, - [ - new("layers", ["1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(3929, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(3946, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(3962, 2, - [ - new("has_record", ["true", "false"], 1) - ]), - new(3964, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4000, 2, - [ - new("axis", ["x", "z"], 1) - ]), - new(4002, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4006, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4010, 7, - [ - new("bites", ["0", "1", "2", "3", "4", "5", "6"], 1) - ]), - new(4017, 64, - [ - new("delay", ["1", "2", "3", "4"], 16), - new("facing", ["north", "south", "west", "east"], 4), - new("locked", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(4097, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4161, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4225, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4289, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4353, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4417, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4491, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4555, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4619, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4683, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4715, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4748, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4752, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4756, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4764, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4772, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4804, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(4836, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4916, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4996, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(5000, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5032, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5112, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(5117, 8, - [ - new("has_bottle_0", ["true", "false"], 4), - new("has_bottle_1", ["true", "false"], 2), - new("has_bottle_2", ["true", "false"], 1) - ]), - new(5125, 4, - [ - new("level", ["0", "1", "2", "3"], 1) - ]), - new(5130, 8, - [ - new("eye", ["true", "false"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5140, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5142, 12, - [ - new("age", ["0", "1", "2"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5154, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5235, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5243, 16, - [ - new("attached", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5259, 128, - [ - new("attached", ["true", "false"], 64), - new("disarmed", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("powered", ["true", "false"], 4), - new("south", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5388, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5468, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5548, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5628, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(5641, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5705, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5794, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(5802, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(5810, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5834, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5858, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5882, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5906, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5930, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5954, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5970, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5974, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5990, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5994, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6010, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6014, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6030, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6034, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6050, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6054, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6070, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6074, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6078, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6082, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6086, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("type", ["single", "left", "right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6110, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6126, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6142, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("mode", ["compare", "subtract"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6158, 32, - [ - new("inverted", ["true", "false"], 16), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6192, 10, - [ - new("enabled", ["true", "false"], 5), - new("facing", ["down", "north", "south", "west", "east"], 1) - ]), - new(6204, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(6207, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6287, 12, - [ - new("powered", ["true", "false"], 6), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 1) - ]), - new(6299, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(6327, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6359, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6391, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6423, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6455, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6487, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6519, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6551, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6583, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6615, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6647, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6679, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6711, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6743, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6775, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6807, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6839, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6919, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7001, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7068, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7148, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7228, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7308, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7314, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7320, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7327, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(7349, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(7351, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(7353, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(7355, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(7357, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(7359, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(7361, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7377, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7393, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7409, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7425, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7441, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7457, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7473, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7489, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7505, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7521, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7537, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7553, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7569, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7585, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7601, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7617, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7621, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7625, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7629, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7633, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7637, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7641, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7645, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7649, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7653, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7657, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7661, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7665, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7669, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7673, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7677, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7684, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7764, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7770, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7776, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7782, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7788, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7794, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7800, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7806, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7812, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7818, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7824, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7830, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7836, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7842, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7848, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7854, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7860, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7866, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7872, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7882, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7914, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7946, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7978, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8010, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8042, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8074, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8106, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8138, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8170, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8202, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8266, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8330, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8394, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8458, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8522, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8528, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8592, 6, - [ - new("age", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(8599, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(8602, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8683, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(8689, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8701, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8713, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(8720, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(8724, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8736, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8742, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8748, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8754, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8760, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8766, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8772, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8778, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8784, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8790, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8796, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8802, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8808, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8814, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8820, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8826, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8832, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8838, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8842, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8846, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8850, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8854, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8858, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8862, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8866, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8870, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8874, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8878, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8882, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8886, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8890, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8894, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8898, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8934, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(8962, 12, - [ - new("eggs", ["1", "2", "3", "4"], 3), - new("hatch", ["0", "1", "2"], 1) - ]), - new(8984, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8986, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8988, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8990, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8992, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8994, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8996, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(8998, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9000, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9002, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9004, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9006, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9008, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9010, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9012, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9014, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9016, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9018, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9020, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9022, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9024, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9032, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9040, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9048, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9056, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9064, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9072, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9080, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9088, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9096, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9104, 8, - [ - new("pickles", ["1", "2", "3", "4"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9113, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9116, 12, - [ - new("age", ["0", "1"], 6), - new("leaves", ["none", "small", "large"], 2), - new("stage", ["0", "1"], 1) - ]), - new(9131, 2, - [ - new("drag", ["true", "false"], 1) - ]), - new(9133, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9213, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9293, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9373, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9453, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9533, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9613, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9693, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9773, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9853, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9933, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10013, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10093, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10173, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10253, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10259, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10265, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10271, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10277, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10283, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10289, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10295, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10301, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10307, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10313, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10319, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10325, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10331, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10395, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10459, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10523, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10587, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10651, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10715, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10779, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10843, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10907, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10971, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11035, 64, - [ - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11099, 32, - [ - new("bottom", ["true", "false"], 16), - new("distance", ["0", "1", "2", "3", "4", "5", "6", "7"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11131, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11135, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("open", ["true", "false"], 1) - ]), - new(11147, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(11155, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(11165, 12, - [ - new("face", ["floor", "wall", "ceiling"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11177, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("has_book", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11194, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11198, 32, - [ - new("attachment", ["floor", "ceiling", "single_wall", "double_wall"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11230, 2, - [ - new("hanging", ["true", "false"], 1) - ]), - new(11232, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11264, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(11268, 4, - [ - new("mode", ["save", "load", "corner", "data"], 1) - ]), - new(11272, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(11278, 9, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(11287, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(11311, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - ]; - // - - protected override Dictionary GetDict() - { - return materials; - } - - protected override BlockStateDefinition[] GetStateDefinitions() - { - return stateDefinitions; - } - } -} diff --git a/MinecraftClient/Mapping/BlockPalettes/Palette116.cs b/MinecraftClient/Mapping/BlockPalettes/Palette116.cs deleted file mode 100644 index 59b77bf5cb..0000000000 --- a/MinecraftClient/Mapping/BlockPalettes/Palette116.cs +++ /dev/null @@ -1,3756 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.BlockPalettes -{ - public class Palette116 : BlockPalette - { - private static readonly Dictionary materials = new(); - - static Palette116() - { - materials[0] = Material.Air; - materials[1] = Material.Stone; - materials[2] = Material.Granite; - materials[3] = Material.PolishedGranite; - materials[4] = Material.Diorite; - materials[5] = Material.PolishedDiorite; - materials[6] = Material.Andesite; - materials[7] = Material.PolishedAndesite; - for (int i = 8; i <= 9; i++) - materials[i] = Material.GrassBlock; - materials[10] = Material.Dirt; - materials[11] = Material.CoarseDirt; - for (int i = 12; i <= 13; i++) - materials[i] = Material.Podzol; - materials[14] = Material.Cobblestone; - materials[15] = Material.OakPlanks; - materials[16] = Material.SprucePlanks; - materials[17] = Material.BirchPlanks; - materials[18] = Material.JunglePlanks; - materials[19] = Material.AcaciaPlanks; - materials[20] = Material.DarkOakPlanks; - for (int i = 21; i <= 22; i++) - materials[i] = Material.OakSapling; - for (int i = 23; i <= 24; i++) - materials[i] = Material.SpruceSapling; - for (int i = 25; i <= 26; i++) - materials[i] = Material.BirchSapling; - for (int i = 27; i <= 28; i++) - materials[i] = Material.JungleSapling; - for (int i = 29; i <= 30; i++) - materials[i] = Material.AcaciaSapling; - for (int i = 31; i <= 32; i++) - materials[i] = Material.DarkOakSapling; - materials[33] = Material.Bedrock; - for (int i = 34; i <= 49; i++) - materials[i] = Material.Water; - for (int i = 50; i <= 65; i++) - materials[i] = Material.Lava; - materials[66] = Material.Sand; - materials[67] = Material.RedSand; - materials[68] = Material.Gravel; - materials[69] = Material.GoldOre; - materials[70] = Material.IronOre; - materials[71] = Material.CoalOre; - materials[72] = Material.NetherGoldOre; - for (int i = 73; i <= 75; i++) - materials[i] = Material.OakLog; - for (int i = 76; i <= 78; i++) - materials[i] = Material.SpruceLog; - for (int i = 79; i <= 81; i++) - materials[i] = Material.BirchLog; - for (int i = 82; i <= 84; i++) - materials[i] = Material.JungleLog; - for (int i = 85; i <= 87; i++) - materials[i] = Material.AcaciaLog; - for (int i = 88; i <= 90; i++) - materials[i] = Material.DarkOakLog; - for (int i = 91; i <= 93; i++) - materials[i] = Material.StrippedSpruceLog; - for (int i = 94; i <= 96; i++) - materials[i] = Material.StrippedBirchLog; - for (int i = 97; i <= 99; i++) - materials[i] = Material.StrippedJungleLog; - for (int i = 100; i <= 102; i++) - materials[i] = Material.StrippedAcaciaLog; - for (int i = 103; i <= 105; i++) - materials[i] = Material.StrippedDarkOakLog; - for (int i = 106; i <= 108; i++) - materials[i] = Material.StrippedOakLog; - for (int i = 109; i <= 111; i++) - materials[i] = Material.OakWood; - for (int i = 112; i <= 114; i++) - materials[i] = Material.SpruceWood; - for (int i = 115; i <= 117; i++) - materials[i] = Material.BirchWood; - for (int i = 118; i <= 120; i++) - materials[i] = Material.JungleWood; - for (int i = 121; i <= 123; i++) - materials[i] = Material.AcaciaWood; - for (int i = 124; i <= 126; i++) - materials[i] = Material.DarkOakWood; - for (int i = 127; i <= 129; i++) - materials[i] = Material.StrippedOakWood; - for (int i = 130; i <= 132; i++) - materials[i] = Material.StrippedSpruceWood; - for (int i = 133; i <= 135; i++) - materials[i] = Material.StrippedBirchWood; - for (int i = 136; i <= 138; i++) - materials[i] = Material.StrippedJungleWood; - for (int i = 139; i <= 141; i++) - materials[i] = Material.StrippedAcaciaWood; - for (int i = 142; i <= 144; i++) - materials[i] = Material.StrippedDarkOakWood; - for (int i = 145; i <= 158; i++) - materials[i] = Material.OakLeaves; - for (int i = 159; i <= 172; i++) - materials[i] = Material.SpruceLeaves; - for (int i = 173; i <= 186; i++) - materials[i] = Material.BirchLeaves; - for (int i = 187; i <= 200; i++) - materials[i] = Material.JungleLeaves; - for (int i = 201; i <= 214; i++) - materials[i] = Material.AcaciaLeaves; - for (int i = 215; i <= 228; i++) - materials[i] = Material.DarkOakLeaves; - materials[229] = Material.Sponge; - materials[230] = Material.WetSponge; - materials[231] = Material.Glass; - materials[232] = Material.LapisOre; - materials[233] = Material.LapisBlock; - for (int i = 234; i <= 245; i++) - materials[i] = Material.Dispenser; - materials[246] = Material.Sandstone; - materials[247] = Material.ChiseledSandstone; - materials[248] = Material.CutSandstone; - for (int i = 249; i <= 1048; i++) - materials[i] = Material.NoteBlock; - for (int i = 1049; i <= 1064; i++) - materials[i] = Material.WhiteBed; - for (int i = 1065; i <= 1080; i++) - materials[i] = Material.OrangeBed; - for (int i = 1081; i <= 1096; i++) - materials[i] = Material.MagentaBed; - for (int i = 1097; i <= 1112; i++) - materials[i] = Material.LightBlueBed; - for (int i = 1113; i <= 1128; i++) - materials[i] = Material.YellowBed; - for (int i = 1129; i <= 1144; i++) - materials[i] = Material.LimeBed; - for (int i = 1145; i <= 1160; i++) - materials[i] = Material.PinkBed; - for (int i = 1161; i <= 1176; i++) - materials[i] = Material.GrayBed; - for (int i = 1177; i <= 1192; i++) - materials[i] = Material.LightGrayBed; - for (int i = 1193; i <= 1208; i++) - materials[i] = Material.CyanBed; - for (int i = 1209; i <= 1224; i++) - materials[i] = Material.PurpleBed; - for (int i = 1225; i <= 1240; i++) - materials[i] = Material.BlueBed; - for (int i = 1241; i <= 1256; i++) - materials[i] = Material.BrownBed; - for (int i = 1257; i <= 1272; i++) - materials[i] = Material.GreenBed; - for (int i = 1273; i <= 1288; i++) - materials[i] = Material.RedBed; - for (int i = 1289; i <= 1304; i++) - materials[i] = Material.BlackBed; - for (int i = 1305; i <= 1316; i++) - materials[i] = Material.PoweredRail; - for (int i = 1317; i <= 1328; i++) - materials[i] = Material.DetectorRail; - for (int i = 1329; i <= 1340; i++) - materials[i] = Material.StickyPiston; - materials[1341] = Material.Cobweb; - materials[1342] = Material.ShortGrass; - materials[1343] = Material.Fern; - materials[1344] = Material.DeadBush; - materials[1345] = Material.Seagrass; - for (int i = 1346; i <= 1347; i++) - materials[i] = Material.TallSeagrass; - for (int i = 1348; i <= 1359; i++) - materials[i] = Material.Piston; - for (int i = 1360; i <= 1383; i++) - materials[i] = Material.PistonHead; - materials[1384] = Material.WhiteWool; - materials[1385] = Material.OrangeWool; - materials[1386] = Material.MagentaWool; - materials[1387] = Material.LightBlueWool; - materials[1388] = Material.YellowWool; - materials[1389] = Material.LimeWool; - materials[1390] = Material.PinkWool; - materials[1391] = Material.GrayWool; - materials[1392] = Material.LightGrayWool; - materials[1393] = Material.CyanWool; - materials[1394] = Material.PurpleWool; - materials[1395] = Material.BlueWool; - materials[1396] = Material.BrownWool; - materials[1397] = Material.GreenWool; - materials[1398] = Material.RedWool; - materials[1399] = Material.BlackWool; - for (int i = 1400; i <= 1411; i++) - materials[i] = Material.MovingPiston; - materials[1412] = Material.Dandelion; - materials[1413] = Material.Poppy; - materials[1414] = Material.BlueOrchid; - materials[1415] = Material.Allium; - materials[1416] = Material.AzureBluet; - materials[1417] = Material.RedTulip; - materials[1418] = Material.OrangeTulip; - materials[1419] = Material.WhiteTulip; - materials[1420] = Material.PinkTulip; - materials[1421] = Material.OxeyeDaisy; - materials[1422] = Material.Cornflower; - materials[1423] = Material.WitherRose; - materials[1424] = Material.LilyOfTheValley; - materials[1425] = Material.BrownMushroom; - materials[1426] = Material.RedMushroom; - materials[1427] = Material.GoldBlock; - materials[1428] = Material.IronBlock; - materials[1429] = Material.Bricks; - for (int i = 1430; i <= 1431; i++) - materials[i] = Material.Tnt; - materials[1432] = Material.Bookshelf; - materials[1433] = Material.MossyCobblestone; - materials[1434] = Material.Obsidian; - materials[1435] = Material.Torch; - for (int i = 1436; i <= 1439; i++) - materials[i] = Material.WallTorch; - for (int i = 1440; i <= 1951; i++) - materials[i] = Material.Fire; - materials[1952] = Material.SoulFire; - materials[1953] = Material.Spawner; - for (int i = 1954; i <= 2033; i++) - materials[i] = Material.OakStairs; - for (int i = 2034; i <= 2057; i++) - materials[i] = Material.Chest; - for (int i = 2058; i <= 3353; i++) - materials[i] = Material.RedstoneWire; - materials[3354] = Material.DiamondOre; - materials[3355] = Material.DiamondBlock; - materials[3356] = Material.CraftingTable; - for (int i = 3357; i <= 3364; i++) - materials[i] = Material.Wheat; - for (int i = 3365; i <= 3372; i++) - materials[i] = Material.Farmland; - for (int i = 3373; i <= 3380; i++) - materials[i] = Material.Furnace; - for (int i = 3381; i <= 3412; i++) - materials[i] = Material.OakSign; - for (int i = 3413; i <= 3444; i++) - materials[i] = Material.SpruceSign; - for (int i = 3445; i <= 3476; i++) - materials[i] = Material.BirchSign; - for (int i = 3477; i <= 3508; i++) - materials[i] = Material.AcaciaSign; - for (int i = 3509; i <= 3540; i++) - materials[i] = Material.JungleSign; - for (int i = 3541; i <= 3572; i++) - materials[i] = Material.DarkOakSign; - for (int i = 3573; i <= 3636; i++) - materials[i] = Material.OakDoor; - for (int i = 3637; i <= 3644; i++) - materials[i] = Material.Ladder; - for (int i = 3645; i <= 3654; i++) - materials[i] = Material.Rail; - for (int i = 3655; i <= 3734; i++) - materials[i] = Material.CobblestoneStairs; - for (int i = 3735; i <= 3742; i++) - materials[i] = Material.OakWallSign; - for (int i = 3743; i <= 3750; i++) - materials[i] = Material.SpruceWallSign; - for (int i = 3751; i <= 3758; i++) - materials[i] = Material.BirchWallSign; - for (int i = 3759; i <= 3766; i++) - materials[i] = Material.AcaciaWallSign; - for (int i = 3767; i <= 3774; i++) - materials[i] = Material.JungleWallSign; - for (int i = 3775; i <= 3782; i++) - materials[i] = Material.DarkOakWallSign; - for (int i = 3783; i <= 3806; i++) - materials[i] = Material.Lever; - for (int i = 3807; i <= 3808; i++) - materials[i] = Material.StonePressurePlate; - for (int i = 3809; i <= 3872; i++) - materials[i] = Material.IronDoor; - for (int i = 3873; i <= 3874; i++) - materials[i] = Material.OakPressurePlate; - for (int i = 3875; i <= 3876; i++) - materials[i] = Material.SprucePressurePlate; - for (int i = 3877; i <= 3878; i++) - materials[i] = Material.BirchPressurePlate; - for (int i = 3879; i <= 3880; i++) - materials[i] = Material.JunglePressurePlate; - for (int i = 3881; i <= 3882; i++) - materials[i] = Material.AcaciaPressurePlate; - for (int i = 3883; i <= 3884; i++) - materials[i] = Material.DarkOakPressurePlate; - for (int i = 3885; i <= 3886; i++) - materials[i] = Material.RedstoneOre; - for (int i = 3887; i <= 3888; i++) - materials[i] = Material.RedstoneTorch; - for (int i = 3889; i <= 3896; i++) - materials[i] = Material.RedstoneWallTorch; - for (int i = 3897; i <= 3920; i++) - materials[i] = Material.StoneButton; - for (int i = 3921; i <= 3928; i++) - materials[i] = Material.Snow; - materials[3929] = Material.Ice; - materials[3930] = Material.SnowBlock; - for (int i = 3931; i <= 3946; i++) - materials[i] = Material.Cactus; - materials[3947] = Material.Clay; - for (int i = 3948; i <= 3963; i++) - materials[i] = Material.SugarCane; - for (int i = 3964; i <= 3965; i++) - materials[i] = Material.Jukebox; - for (int i = 3966; i <= 3997; i++) - materials[i] = Material.OakFence; - materials[3998] = Material.Pumpkin; - materials[3999] = Material.Netherrack; - materials[4000] = Material.SoulSand; - materials[4001] = Material.SoulSoil; - for (int i = 4002; i <= 4004; i++) - materials[i] = Material.Basalt; - for (int i = 4005; i <= 4007; i++) - materials[i] = Material.PolishedBasalt; - materials[4008] = Material.SoulTorch; - for (int i = 4009; i <= 4012; i++) - materials[i] = Material.SoulWallTorch; - materials[4013] = Material.Glowstone; - for (int i = 4014; i <= 4015; i++) - materials[i] = Material.NetherPortal; - for (int i = 4016; i <= 4019; i++) - materials[i] = Material.CarvedPumpkin; - for (int i = 4020; i <= 4023; i++) - materials[i] = Material.JackOLantern; - for (int i = 4024; i <= 4030; i++) - materials[i] = Material.Cake; - for (int i = 4031; i <= 4094; i++) - materials[i] = Material.Repeater; - materials[4095] = Material.WhiteStainedGlass; - materials[4096] = Material.OrangeStainedGlass; - materials[4097] = Material.MagentaStainedGlass; - materials[4098] = Material.LightBlueStainedGlass; - materials[4099] = Material.YellowStainedGlass; - materials[4100] = Material.LimeStainedGlass; - materials[4101] = Material.PinkStainedGlass; - materials[4102] = Material.GrayStainedGlass; - materials[4103] = Material.LightGrayStainedGlass; - materials[4104] = Material.CyanStainedGlass; - materials[4105] = Material.PurpleStainedGlass; - materials[4106] = Material.BlueStainedGlass; - materials[4107] = Material.BrownStainedGlass; - materials[4108] = Material.GreenStainedGlass; - materials[4109] = Material.RedStainedGlass; - materials[4110] = Material.BlackStainedGlass; - for (int i = 4111; i <= 4174; i++) - materials[i] = Material.OakTrapdoor; - for (int i = 4175; i <= 4238; i++) - materials[i] = Material.SpruceTrapdoor; - for (int i = 4239; i <= 4302; i++) - materials[i] = Material.BirchTrapdoor; - for (int i = 4303; i <= 4366; i++) - materials[i] = Material.JungleTrapdoor; - for (int i = 4367; i <= 4430; i++) - materials[i] = Material.AcaciaTrapdoor; - for (int i = 4431; i <= 4494; i++) - materials[i] = Material.DarkOakTrapdoor; - materials[4495] = Material.StoneBricks; - materials[4496] = Material.MossyStoneBricks; - materials[4497] = Material.CrackedStoneBricks; - materials[4498] = Material.ChiseledStoneBricks; - materials[4499] = Material.InfestedStone; - materials[4500] = Material.InfestedCobblestone; - materials[4501] = Material.InfestedStoneBricks; - materials[4502] = Material.InfestedMossyStoneBricks; - materials[4503] = Material.InfestedCrackedStoneBricks; - materials[4504] = Material.InfestedChiseledStoneBricks; - for (int i = 4505; i <= 4568; i++) - materials[i] = Material.BrownMushroomBlock; - for (int i = 4569; i <= 4632; i++) - materials[i] = Material.RedMushroomBlock; - for (int i = 4633; i <= 4696; i++) - materials[i] = Material.MushroomStem; - for (int i = 4697; i <= 4728; i++) - materials[i] = Material.IronBars; - for (int i = 4729; i <= 4734; i++) - materials[i] = Material.Chain; - for (int i = 4735; i <= 4766; i++) - materials[i] = Material.GlassPane; - materials[4767] = Material.Melon; - for (int i = 4768; i <= 4771; i++) - materials[i] = Material.AttachedPumpkinStem; - for (int i = 4772; i <= 4775; i++) - materials[i] = Material.AttachedMelonStem; - for (int i = 4776; i <= 4783; i++) - materials[i] = Material.PumpkinStem; - for (int i = 4784; i <= 4791; i++) - materials[i] = Material.MelonStem; - for (int i = 4792; i <= 4823; i++) - materials[i] = Material.Vine; - for (int i = 4824; i <= 4855; i++) - materials[i] = Material.OakFenceGate; - for (int i = 4856; i <= 4935; i++) - materials[i] = Material.BrickStairs; - for (int i = 4936; i <= 5015; i++) - materials[i] = Material.StoneBrickStairs; - for (int i = 5016; i <= 5017; i++) - materials[i] = Material.Mycelium; - materials[5018] = Material.LilyPad; - materials[5019] = Material.NetherBricks; - for (int i = 5020; i <= 5051; i++) - materials[i] = Material.NetherBrickFence; - for (int i = 5052; i <= 5131; i++) - materials[i] = Material.NetherBrickStairs; - for (int i = 5132; i <= 5135; i++) - materials[i] = Material.NetherWart; - materials[5136] = Material.EnchantingTable; - for (int i = 5137; i <= 5144; i++) - materials[i] = Material.BrewingStand; - for (int i = 5145; i <= 5148; i++) - materials[i] = Material.Cauldron; - materials[5149] = Material.EndPortal; - for (int i = 5150; i <= 5157; i++) - materials[i] = Material.EndPortalFrame; - materials[5158] = Material.EndStone; - materials[5159] = Material.DragonEgg; - for (int i = 5160; i <= 5161; i++) - materials[i] = Material.RedstoneLamp; - for (int i = 5162; i <= 5173; i++) - materials[i] = Material.Cocoa; - for (int i = 5174; i <= 5253; i++) - materials[i] = Material.SandstoneStairs; - materials[5254] = Material.EmeraldOre; - for (int i = 5255; i <= 5262; i++) - materials[i] = Material.EnderChest; - for (int i = 5263; i <= 5278; i++) - materials[i] = Material.TripwireHook; - for (int i = 5279; i <= 5406; i++) - materials[i] = Material.Tripwire; - materials[5407] = Material.EmeraldBlock; - for (int i = 5408; i <= 5487; i++) - materials[i] = Material.SpruceStairs; - for (int i = 5488; i <= 5567; i++) - materials[i] = Material.BirchStairs; - for (int i = 5568; i <= 5647; i++) - materials[i] = Material.JungleStairs; - for (int i = 5648; i <= 5659; i++) - materials[i] = Material.CommandBlock; - materials[5660] = Material.Beacon; - for (int i = 5661; i <= 5984; i++) - materials[i] = Material.CobblestoneWall; - for (int i = 5985; i <= 6308; i++) - materials[i] = Material.MossyCobblestoneWall; - materials[6309] = Material.FlowerPot; - materials[6310] = Material.PottedOakSapling; - materials[6311] = Material.PottedSpruceSapling; - materials[6312] = Material.PottedBirchSapling; - materials[6313] = Material.PottedJungleSapling; - materials[6314] = Material.PottedAcaciaSapling; - materials[6315] = Material.PottedDarkOakSapling; - materials[6316] = Material.PottedFern; - materials[6317] = Material.PottedDandelion; - materials[6318] = Material.PottedPoppy; - materials[6319] = Material.PottedBlueOrchid; - materials[6320] = Material.PottedAllium; - materials[6321] = Material.PottedAzureBluet; - materials[6322] = Material.PottedRedTulip; - materials[6323] = Material.PottedOrangeTulip; - materials[6324] = Material.PottedWhiteTulip; - materials[6325] = Material.PottedPinkTulip; - materials[6326] = Material.PottedOxeyeDaisy; - materials[6327] = Material.PottedCornflower; - materials[6328] = Material.PottedLilyOfTheValley; - materials[6329] = Material.PottedWitherRose; - materials[6330] = Material.PottedRedMushroom; - materials[6331] = Material.PottedBrownMushroom; - materials[6332] = Material.PottedDeadBush; - materials[6333] = Material.PottedCactus; - for (int i = 6334; i <= 6341; i++) - materials[i] = Material.Carrots; - for (int i = 6342; i <= 6349; i++) - materials[i] = Material.Potatoes; - for (int i = 6350; i <= 6373; i++) - materials[i] = Material.OakButton; - for (int i = 6374; i <= 6397; i++) - materials[i] = Material.SpruceButton; - for (int i = 6398; i <= 6421; i++) - materials[i] = Material.BirchButton; - for (int i = 6422; i <= 6445; i++) - materials[i] = Material.JungleButton; - for (int i = 6446; i <= 6469; i++) - materials[i] = Material.AcaciaButton; - for (int i = 6470; i <= 6493; i++) - materials[i] = Material.DarkOakButton; - for (int i = 6494; i <= 6509; i++) - materials[i] = Material.SkeletonSkull; - for (int i = 6510; i <= 6513; i++) - materials[i] = Material.SkeletonWallSkull; - for (int i = 6514; i <= 6529; i++) - materials[i] = Material.WitherSkeletonSkull; - for (int i = 6530; i <= 6533; i++) - materials[i] = Material.WitherSkeletonWallSkull; - for (int i = 6534; i <= 6549; i++) - materials[i] = Material.ZombieHead; - for (int i = 6550; i <= 6553; i++) - materials[i] = Material.ZombieWallHead; - for (int i = 6554; i <= 6569; i++) - materials[i] = Material.PlayerHead; - for (int i = 6570; i <= 6573; i++) - materials[i] = Material.PlayerWallHead; - for (int i = 6574; i <= 6589; i++) - materials[i] = Material.CreeperHead; - for (int i = 6590; i <= 6593; i++) - materials[i] = Material.CreeperWallHead; - for (int i = 6594; i <= 6609; i++) - materials[i] = Material.DragonHead; - for (int i = 6610; i <= 6613; i++) - materials[i] = Material.DragonWallHead; - for (int i = 6614; i <= 6617; i++) - materials[i] = Material.Anvil; - for (int i = 6618; i <= 6621; i++) - materials[i] = Material.ChippedAnvil; - for (int i = 6622; i <= 6625; i++) - materials[i] = Material.DamagedAnvil; - for (int i = 6626; i <= 6649; i++) - materials[i] = Material.TrappedChest; - for (int i = 6650; i <= 6665; i++) - materials[i] = Material.LightWeightedPressurePlate; - for (int i = 6666; i <= 6681; i++) - materials[i] = Material.HeavyWeightedPressurePlate; - for (int i = 6682; i <= 6697; i++) - materials[i] = Material.Comparator; - for (int i = 6698; i <= 6729; i++) - materials[i] = Material.DaylightDetector; - materials[6730] = Material.RedstoneBlock; - materials[6731] = Material.NetherQuartzOre; - for (int i = 6732; i <= 6741; i++) - materials[i] = Material.Hopper; - materials[6742] = Material.QuartzBlock; - materials[6743] = Material.ChiseledQuartzBlock; - for (int i = 6744; i <= 6746; i++) - materials[i] = Material.QuartzPillar; - for (int i = 6747; i <= 6826; i++) - materials[i] = Material.QuartzStairs; - for (int i = 6827; i <= 6838; i++) - materials[i] = Material.ActivatorRail; - for (int i = 6839; i <= 6850; i++) - materials[i] = Material.Dropper; - materials[6851] = Material.WhiteTerracotta; - materials[6852] = Material.OrangeTerracotta; - materials[6853] = Material.MagentaTerracotta; - materials[6854] = Material.LightBlueTerracotta; - materials[6855] = Material.YellowTerracotta; - materials[6856] = Material.LimeTerracotta; - materials[6857] = Material.PinkTerracotta; - materials[6858] = Material.GrayTerracotta; - materials[6859] = Material.LightGrayTerracotta; - materials[6860] = Material.CyanTerracotta; - materials[6861] = Material.PurpleTerracotta; - materials[6862] = Material.BlueTerracotta; - materials[6863] = Material.BrownTerracotta; - materials[6864] = Material.GreenTerracotta; - materials[6865] = Material.RedTerracotta; - materials[6866] = Material.BlackTerracotta; - for (int i = 6867; i <= 6898; i++) - materials[i] = Material.WhiteStainedGlassPane; - for (int i = 6899; i <= 6930; i++) - materials[i] = Material.OrangeStainedGlassPane; - for (int i = 6931; i <= 6962; i++) - materials[i] = Material.MagentaStainedGlassPane; - for (int i = 6963; i <= 6994; i++) - materials[i] = Material.LightBlueStainedGlassPane; - for (int i = 6995; i <= 7026; i++) - materials[i] = Material.YellowStainedGlassPane; - for (int i = 7027; i <= 7058; i++) - materials[i] = Material.LimeStainedGlassPane; - for (int i = 7059; i <= 7090; i++) - materials[i] = Material.PinkStainedGlassPane; - for (int i = 7091; i <= 7122; i++) - materials[i] = Material.GrayStainedGlassPane; - for (int i = 7123; i <= 7154; i++) - materials[i] = Material.LightGrayStainedGlassPane; - for (int i = 7155; i <= 7186; i++) - materials[i] = Material.CyanStainedGlassPane; - for (int i = 7187; i <= 7218; i++) - materials[i] = Material.PurpleStainedGlassPane; - for (int i = 7219; i <= 7250; i++) - materials[i] = Material.BlueStainedGlassPane; - for (int i = 7251; i <= 7282; i++) - materials[i] = Material.BrownStainedGlassPane; - for (int i = 7283; i <= 7314; i++) - materials[i] = Material.GreenStainedGlassPane; - for (int i = 7315; i <= 7346; i++) - materials[i] = Material.RedStainedGlassPane; - for (int i = 7347; i <= 7378; i++) - materials[i] = Material.BlackStainedGlassPane; - for (int i = 7379; i <= 7458; i++) - materials[i] = Material.AcaciaStairs; - for (int i = 7459; i <= 7538; i++) - materials[i] = Material.DarkOakStairs; - materials[7539] = Material.SlimeBlock; - materials[7540] = Material.Barrier; - for (int i = 7541; i <= 7604; i++) - materials[i] = Material.IronTrapdoor; - materials[7605] = Material.Prismarine; - materials[7606] = Material.PrismarineBricks; - materials[7607] = Material.DarkPrismarine; - for (int i = 7608; i <= 7687; i++) - materials[i] = Material.PrismarineStairs; - for (int i = 7688; i <= 7767; i++) - materials[i] = Material.PrismarineBrickStairs; - for (int i = 7768; i <= 7847; i++) - materials[i] = Material.DarkPrismarineStairs; - for (int i = 7848; i <= 7853; i++) - materials[i] = Material.PrismarineSlab; - for (int i = 7854; i <= 7859; i++) - materials[i] = Material.PrismarineBrickSlab; - for (int i = 7860; i <= 7865; i++) - materials[i] = Material.DarkPrismarineSlab; - materials[7866] = Material.SeaLantern; - for (int i = 7867; i <= 7869; i++) - materials[i] = Material.HayBlock; - materials[7870] = Material.WhiteCarpet; - materials[7871] = Material.OrangeCarpet; - materials[7872] = Material.MagentaCarpet; - materials[7873] = Material.LightBlueCarpet; - materials[7874] = Material.YellowCarpet; - materials[7875] = Material.LimeCarpet; - materials[7876] = Material.PinkCarpet; - materials[7877] = Material.GrayCarpet; - materials[7878] = Material.LightGrayCarpet; - materials[7879] = Material.CyanCarpet; - materials[7880] = Material.PurpleCarpet; - materials[7881] = Material.BlueCarpet; - materials[7882] = Material.BrownCarpet; - materials[7883] = Material.GreenCarpet; - materials[7884] = Material.RedCarpet; - materials[7885] = Material.BlackCarpet; - materials[7886] = Material.Terracotta; - materials[7887] = Material.CoalBlock; - materials[7888] = Material.PackedIce; - for (int i = 7889; i <= 7890; i++) - materials[i] = Material.Sunflower; - for (int i = 7891; i <= 7892; i++) - materials[i] = Material.Lilac; - for (int i = 7893; i <= 7894; i++) - materials[i] = Material.RoseBush; - for (int i = 7895; i <= 7896; i++) - materials[i] = Material.Peony; - for (int i = 7897; i <= 7898; i++) - materials[i] = Material.TallGrass; - for (int i = 7899; i <= 7900; i++) - materials[i] = Material.LargeFern; - for (int i = 7901; i <= 7916; i++) - materials[i] = Material.WhiteBanner; - for (int i = 7917; i <= 7932; i++) - materials[i] = Material.OrangeBanner; - for (int i = 7933; i <= 7948; i++) - materials[i] = Material.MagentaBanner; - for (int i = 7949; i <= 7964; i++) - materials[i] = Material.LightBlueBanner; - for (int i = 7965; i <= 7980; i++) - materials[i] = Material.YellowBanner; - for (int i = 7981; i <= 7996; i++) - materials[i] = Material.LimeBanner; - for (int i = 7997; i <= 8012; i++) - materials[i] = Material.PinkBanner; - for (int i = 8013; i <= 8028; i++) - materials[i] = Material.GrayBanner; - for (int i = 8029; i <= 8044; i++) - materials[i] = Material.LightGrayBanner; - for (int i = 8045; i <= 8060; i++) - materials[i] = Material.CyanBanner; - for (int i = 8061; i <= 8076; i++) - materials[i] = Material.PurpleBanner; - for (int i = 8077; i <= 8092; i++) - materials[i] = Material.BlueBanner; - for (int i = 8093; i <= 8108; i++) - materials[i] = Material.BrownBanner; - for (int i = 8109; i <= 8124; i++) - materials[i] = Material.GreenBanner; - for (int i = 8125; i <= 8140; i++) - materials[i] = Material.RedBanner; - for (int i = 8141; i <= 8156; i++) - materials[i] = Material.BlackBanner; - for (int i = 8157; i <= 8160; i++) - materials[i] = Material.WhiteWallBanner; - for (int i = 8161; i <= 8164; i++) - materials[i] = Material.OrangeWallBanner; - for (int i = 8165; i <= 8168; i++) - materials[i] = Material.MagentaWallBanner; - for (int i = 8169; i <= 8172; i++) - materials[i] = Material.LightBlueWallBanner; - for (int i = 8173; i <= 8176; i++) - materials[i] = Material.YellowWallBanner; - for (int i = 8177; i <= 8180; i++) - materials[i] = Material.LimeWallBanner; - for (int i = 8181; i <= 8184; i++) - materials[i] = Material.PinkWallBanner; - for (int i = 8185; i <= 8188; i++) - materials[i] = Material.GrayWallBanner; - for (int i = 8189; i <= 8192; i++) - materials[i] = Material.LightGrayWallBanner; - for (int i = 8193; i <= 8196; i++) - materials[i] = Material.CyanWallBanner; - for (int i = 8197; i <= 8200; i++) - materials[i] = Material.PurpleWallBanner; - for (int i = 8201; i <= 8204; i++) - materials[i] = Material.BlueWallBanner; - for (int i = 8205; i <= 8208; i++) - materials[i] = Material.BrownWallBanner; - for (int i = 8209; i <= 8212; i++) - materials[i] = Material.GreenWallBanner; - for (int i = 8213; i <= 8216; i++) - materials[i] = Material.RedWallBanner; - for (int i = 8217; i <= 8220; i++) - materials[i] = Material.BlackWallBanner; - materials[8221] = Material.RedSandstone; - materials[8222] = Material.ChiseledRedSandstone; - materials[8223] = Material.CutRedSandstone; - for (int i = 8224; i <= 8303; i++) - materials[i] = Material.RedSandstoneStairs; - for (int i = 8304; i <= 8309; i++) - materials[i] = Material.OakSlab; - for (int i = 8310; i <= 8315; i++) - materials[i] = Material.SpruceSlab; - for (int i = 8316; i <= 8321; i++) - materials[i] = Material.BirchSlab; - for (int i = 8322; i <= 8327; i++) - materials[i] = Material.JungleSlab; - for (int i = 8328; i <= 8333; i++) - materials[i] = Material.AcaciaSlab; - for (int i = 8334; i <= 8339; i++) - materials[i] = Material.DarkOakSlab; - for (int i = 8340; i <= 8345; i++) - materials[i] = Material.StoneSlab; - for (int i = 8346; i <= 8351; i++) - materials[i] = Material.SmoothStoneSlab; - for (int i = 8352; i <= 8357; i++) - materials[i] = Material.SandstoneSlab; - for (int i = 8358; i <= 8363; i++) - materials[i] = Material.CutSandstoneSlab; - for (int i = 8364; i <= 8369; i++) - materials[i] = Material.PetrifiedOakSlab; - for (int i = 8370; i <= 8375; i++) - materials[i] = Material.CobblestoneSlab; - for (int i = 8376; i <= 8381; i++) - materials[i] = Material.BrickSlab; - for (int i = 8382; i <= 8387; i++) - materials[i] = Material.StoneBrickSlab; - for (int i = 8388; i <= 8393; i++) - materials[i] = Material.NetherBrickSlab; - for (int i = 8394; i <= 8399; i++) - materials[i] = Material.QuartzSlab; - for (int i = 8400; i <= 8405; i++) - materials[i] = Material.RedSandstoneSlab; - for (int i = 8406; i <= 8411; i++) - materials[i] = Material.CutRedSandstoneSlab; - for (int i = 8412; i <= 8417; i++) - materials[i] = Material.PurpurSlab; - materials[8418] = Material.SmoothStone; - materials[8419] = Material.SmoothSandstone; - materials[8420] = Material.SmoothQuartz; - materials[8421] = Material.SmoothRedSandstone; - for (int i = 8422; i <= 8453; i++) - materials[i] = Material.SpruceFenceGate; - for (int i = 8454; i <= 8485; i++) - materials[i] = Material.BirchFenceGate; - for (int i = 8486; i <= 8517; i++) - materials[i] = Material.JungleFenceGate; - for (int i = 8518; i <= 8549; i++) - materials[i] = Material.AcaciaFenceGate; - for (int i = 8550; i <= 8581; i++) - materials[i] = Material.DarkOakFenceGate; - for (int i = 8582; i <= 8613; i++) - materials[i] = Material.SpruceFence; - for (int i = 8614; i <= 8645; i++) - materials[i] = Material.BirchFence; - for (int i = 8646; i <= 8677; i++) - materials[i] = Material.JungleFence; - for (int i = 8678; i <= 8709; i++) - materials[i] = Material.AcaciaFence; - for (int i = 8710; i <= 8741; i++) - materials[i] = Material.DarkOakFence; - for (int i = 8742; i <= 8805; i++) - materials[i] = Material.SpruceDoor; - for (int i = 8806; i <= 8869; i++) - materials[i] = Material.BirchDoor; - for (int i = 8870; i <= 8933; i++) - materials[i] = Material.JungleDoor; - for (int i = 8934; i <= 8997; i++) - materials[i] = Material.AcaciaDoor; - for (int i = 8998; i <= 9061; i++) - materials[i] = Material.DarkOakDoor; - for (int i = 9062; i <= 9067; i++) - materials[i] = Material.EndRod; - for (int i = 9068; i <= 9131; i++) - materials[i] = Material.ChorusPlant; - for (int i = 9132; i <= 9137; i++) - materials[i] = Material.ChorusFlower; - materials[9138] = Material.PurpurBlock; - for (int i = 9139; i <= 9141; i++) - materials[i] = Material.PurpurPillar; - for (int i = 9142; i <= 9221; i++) - materials[i] = Material.PurpurStairs; - materials[9222] = Material.EndStoneBricks; - for (int i = 9223; i <= 9226; i++) - materials[i] = Material.Beetroots; - materials[9227] = Material.DirtPath; - materials[9228] = Material.EndGateway; - for (int i = 9229; i <= 9240; i++) - materials[i] = Material.RepeatingCommandBlock; - for (int i = 9241; i <= 9252; i++) - materials[i] = Material.ChainCommandBlock; - for (int i = 9253; i <= 9256; i++) - materials[i] = Material.FrostedIce; - materials[9257] = Material.MagmaBlock; - materials[9258] = Material.NetherWartBlock; - materials[9259] = Material.RedNetherBricks; - for (int i = 9260; i <= 9262; i++) - materials[i] = Material.BoneBlock; - materials[9263] = Material.StructureVoid; - for (int i = 9264; i <= 9275; i++) - materials[i] = Material.Observer; - for (int i = 9276; i <= 9281; i++) - materials[i] = Material.ShulkerBox; - for (int i = 9282; i <= 9287; i++) - materials[i] = Material.WhiteShulkerBox; - for (int i = 9288; i <= 9293; i++) - materials[i] = Material.OrangeShulkerBox; - for (int i = 9294; i <= 9299; i++) - materials[i] = Material.MagentaShulkerBox; - for (int i = 9300; i <= 9305; i++) - materials[i] = Material.LightBlueShulkerBox; - for (int i = 9306; i <= 9311; i++) - materials[i] = Material.YellowShulkerBox; - for (int i = 9312; i <= 9317; i++) - materials[i] = Material.LimeShulkerBox; - for (int i = 9318; i <= 9323; i++) - materials[i] = Material.PinkShulkerBox; - for (int i = 9324; i <= 9329; i++) - materials[i] = Material.GrayShulkerBox; - for (int i = 9330; i <= 9335; i++) - materials[i] = Material.LightGrayShulkerBox; - for (int i = 9336; i <= 9341; i++) - materials[i] = Material.CyanShulkerBox; - for (int i = 9342; i <= 9347; i++) - materials[i] = Material.PurpleShulkerBox; - for (int i = 9348; i <= 9353; i++) - materials[i] = Material.BlueShulkerBox; - for (int i = 9354; i <= 9359; i++) - materials[i] = Material.BrownShulkerBox; - for (int i = 9360; i <= 9365; i++) - materials[i] = Material.GreenShulkerBox; - for (int i = 9366; i <= 9371; i++) - materials[i] = Material.RedShulkerBox; - for (int i = 9372; i <= 9377; i++) - materials[i] = Material.BlackShulkerBox; - for (int i = 9378; i <= 9381; i++) - materials[i] = Material.WhiteGlazedTerracotta; - for (int i = 9382; i <= 9385; i++) - materials[i] = Material.OrangeGlazedTerracotta; - for (int i = 9386; i <= 9389; i++) - materials[i] = Material.MagentaGlazedTerracotta; - for (int i = 9390; i <= 9393; i++) - materials[i] = Material.LightBlueGlazedTerracotta; - for (int i = 9394; i <= 9397; i++) - materials[i] = Material.YellowGlazedTerracotta; - for (int i = 9398; i <= 9401; i++) - materials[i] = Material.LimeGlazedTerracotta; - for (int i = 9402; i <= 9405; i++) - materials[i] = Material.PinkGlazedTerracotta; - for (int i = 9406; i <= 9409; i++) - materials[i] = Material.GrayGlazedTerracotta; - for (int i = 9410; i <= 9413; i++) - materials[i] = Material.LightGrayGlazedTerracotta; - for (int i = 9414; i <= 9417; i++) - materials[i] = Material.CyanGlazedTerracotta; - for (int i = 9418; i <= 9421; i++) - materials[i] = Material.PurpleGlazedTerracotta; - for (int i = 9422; i <= 9425; i++) - materials[i] = Material.BlueGlazedTerracotta; - for (int i = 9426; i <= 9429; i++) - materials[i] = Material.BrownGlazedTerracotta; - for (int i = 9430; i <= 9433; i++) - materials[i] = Material.GreenGlazedTerracotta; - for (int i = 9434; i <= 9437; i++) - materials[i] = Material.RedGlazedTerracotta; - for (int i = 9438; i <= 9441; i++) - materials[i] = Material.BlackGlazedTerracotta; - materials[9442] = Material.WhiteConcrete; - materials[9443] = Material.OrangeConcrete; - materials[9444] = Material.MagentaConcrete; - materials[9445] = Material.LightBlueConcrete; - materials[9446] = Material.YellowConcrete; - materials[9447] = Material.LimeConcrete; - materials[9448] = Material.PinkConcrete; - materials[9449] = Material.GrayConcrete; - materials[9450] = Material.LightGrayConcrete; - materials[9451] = Material.CyanConcrete; - materials[9452] = Material.PurpleConcrete; - materials[9453] = Material.BlueConcrete; - materials[9454] = Material.BrownConcrete; - materials[9455] = Material.GreenConcrete; - materials[9456] = Material.RedConcrete; - materials[9457] = Material.BlackConcrete; - materials[9458] = Material.WhiteConcretePowder; - materials[9459] = Material.OrangeConcretePowder; - materials[9460] = Material.MagentaConcretePowder; - materials[9461] = Material.LightBlueConcretePowder; - materials[9462] = Material.YellowConcretePowder; - materials[9463] = Material.LimeConcretePowder; - materials[9464] = Material.PinkConcretePowder; - materials[9465] = Material.GrayConcretePowder; - materials[9466] = Material.LightGrayConcretePowder; - materials[9467] = Material.CyanConcretePowder; - materials[9468] = Material.PurpleConcretePowder; - materials[9469] = Material.BlueConcretePowder; - materials[9470] = Material.BrownConcretePowder; - materials[9471] = Material.GreenConcretePowder; - materials[9472] = Material.RedConcretePowder; - materials[9473] = Material.BlackConcretePowder; - for (int i = 9474; i <= 9499; i++) - materials[i] = Material.Kelp; - materials[9500] = Material.KelpPlant; - materials[9501] = Material.DriedKelpBlock; - for (int i = 9502; i <= 9513; i++) - materials[i] = Material.TurtleEgg; - materials[9514] = Material.DeadTubeCoralBlock; - materials[9515] = Material.DeadBrainCoralBlock; - materials[9516] = Material.DeadBubbleCoralBlock; - materials[9517] = Material.DeadFireCoralBlock; - materials[9518] = Material.DeadHornCoralBlock; - materials[9519] = Material.TubeCoralBlock; - materials[9520] = Material.BrainCoralBlock; - materials[9521] = Material.BubbleCoralBlock; - materials[9522] = Material.FireCoralBlock; - materials[9523] = Material.HornCoralBlock; - for (int i = 9524; i <= 9525; i++) - materials[i] = Material.DeadTubeCoral; - for (int i = 9526; i <= 9527; i++) - materials[i] = Material.DeadBrainCoral; - for (int i = 9528; i <= 9529; i++) - materials[i] = Material.DeadBubbleCoral; - for (int i = 9530; i <= 9531; i++) - materials[i] = Material.DeadFireCoral; - for (int i = 9532; i <= 9533; i++) - materials[i] = Material.DeadHornCoral; - for (int i = 9534; i <= 9535; i++) - materials[i] = Material.TubeCoral; - for (int i = 9536; i <= 9537; i++) - materials[i] = Material.BrainCoral; - for (int i = 9538; i <= 9539; i++) - materials[i] = Material.BubbleCoral; - for (int i = 9540; i <= 9541; i++) - materials[i] = Material.FireCoral; - for (int i = 9542; i <= 9543; i++) - materials[i] = Material.HornCoral; - for (int i = 9544; i <= 9545; i++) - materials[i] = Material.DeadTubeCoralFan; - for (int i = 9546; i <= 9547; i++) - materials[i] = Material.DeadBrainCoralFan; - for (int i = 9548; i <= 9549; i++) - materials[i] = Material.DeadBubbleCoralFan; - for (int i = 9550; i <= 9551; i++) - materials[i] = Material.DeadFireCoralFan; - for (int i = 9552; i <= 9553; i++) - materials[i] = Material.DeadHornCoralFan; - for (int i = 9554; i <= 9555; i++) - materials[i] = Material.TubeCoralFan; - for (int i = 9556; i <= 9557; i++) - materials[i] = Material.BrainCoralFan; - for (int i = 9558; i <= 9559; i++) - materials[i] = Material.BubbleCoralFan; - for (int i = 9560; i <= 9561; i++) - materials[i] = Material.FireCoralFan; - for (int i = 9562; i <= 9563; i++) - materials[i] = Material.HornCoralFan; - for (int i = 9564; i <= 9571; i++) - materials[i] = Material.DeadTubeCoralWallFan; - for (int i = 9572; i <= 9579; i++) - materials[i] = Material.DeadBrainCoralWallFan; - for (int i = 9580; i <= 9587; i++) - materials[i] = Material.DeadBubbleCoralWallFan; - for (int i = 9588; i <= 9595; i++) - materials[i] = Material.DeadFireCoralWallFan; - for (int i = 9596; i <= 9603; i++) - materials[i] = Material.DeadHornCoralWallFan; - for (int i = 9604; i <= 9611; i++) - materials[i] = Material.TubeCoralWallFan; - for (int i = 9612; i <= 9619; i++) - materials[i] = Material.BrainCoralWallFan; - for (int i = 9620; i <= 9627; i++) - materials[i] = Material.BubbleCoralWallFan; - for (int i = 9628; i <= 9635; i++) - materials[i] = Material.FireCoralWallFan; - for (int i = 9636; i <= 9643; i++) - materials[i] = Material.HornCoralWallFan; - for (int i = 9644; i <= 9651; i++) - materials[i] = Material.SeaPickle; - materials[9652] = Material.BlueIce; - for (int i = 9653; i <= 9654; i++) - materials[i] = Material.Conduit; - materials[9655] = Material.BambooSapling; - for (int i = 9656; i <= 9667; i++) - materials[i] = Material.Bamboo; - materials[9668] = Material.PottedBamboo; - materials[9669] = Material.VoidAir; - materials[9670] = Material.CaveAir; - for (int i = 9671; i <= 9672; i++) - materials[i] = Material.BubbleColumn; - for (int i = 9673; i <= 9752; i++) - materials[i] = Material.PolishedGraniteStairs; - for (int i = 9753; i <= 9832; i++) - materials[i] = Material.SmoothRedSandstoneStairs; - for (int i = 9833; i <= 9912; i++) - materials[i] = Material.MossyStoneBrickStairs; - for (int i = 9913; i <= 9992; i++) - materials[i] = Material.PolishedDioriteStairs; - for (int i = 9993; i <= 10072; i++) - materials[i] = Material.MossyCobblestoneStairs; - for (int i = 10073; i <= 10152; i++) - materials[i] = Material.EndStoneBrickStairs; - for (int i = 10153; i <= 10232; i++) - materials[i] = Material.StoneStairs; - for (int i = 10233; i <= 10312; i++) - materials[i] = Material.SmoothSandstoneStairs; - for (int i = 10313; i <= 10392; i++) - materials[i] = Material.SmoothQuartzStairs; - for (int i = 10393; i <= 10472; i++) - materials[i] = Material.GraniteStairs; - for (int i = 10473; i <= 10552; i++) - materials[i] = Material.AndesiteStairs; - for (int i = 10553; i <= 10632; i++) - materials[i] = Material.RedNetherBrickStairs; - for (int i = 10633; i <= 10712; i++) - materials[i] = Material.PolishedAndesiteStairs; - for (int i = 10713; i <= 10792; i++) - materials[i] = Material.DioriteStairs; - for (int i = 10793; i <= 10798; i++) - materials[i] = Material.PolishedGraniteSlab; - for (int i = 10799; i <= 10804; i++) - materials[i] = Material.SmoothRedSandstoneSlab; - for (int i = 10805; i <= 10810; i++) - materials[i] = Material.MossyStoneBrickSlab; - for (int i = 10811; i <= 10816; i++) - materials[i] = Material.PolishedDioriteSlab; - for (int i = 10817; i <= 10822; i++) - materials[i] = Material.MossyCobblestoneSlab; - for (int i = 10823; i <= 10828; i++) - materials[i] = Material.EndStoneBrickSlab; - for (int i = 10829; i <= 10834; i++) - materials[i] = Material.SmoothSandstoneSlab; - for (int i = 10835; i <= 10840; i++) - materials[i] = Material.SmoothQuartzSlab; - for (int i = 10841; i <= 10846; i++) - materials[i] = Material.GraniteSlab; - for (int i = 10847; i <= 10852; i++) - materials[i] = Material.AndesiteSlab; - for (int i = 10853; i <= 10858; i++) - materials[i] = Material.RedNetherBrickSlab; - for (int i = 10859; i <= 10864; i++) - materials[i] = Material.PolishedAndesiteSlab; - for (int i = 10865; i <= 10870; i++) - materials[i] = Material.DioriteSlab; - for (int i = 10871; i <= 11194; i++) - materials[i] = Material.BrickWall; - for (int i = 11195; i <= 11518; i++) - materials[i] = Material.PrismarineWall; - for (int i = 11519; i <= 11842; i++) - materials[i] = Material.RedSandstoneWall; - for (int i = 11843; i <= 12166; i++) - materials[i] = Material.MossyStoneBrickWall; - for (int i = 12167; i <= 12490; i++) - materials[i] = Material.GraniteWall; - for (int i = 12491; i <= 12814; i++) - materials[i] = Material.StoneBrickWall; - for (int i = 12815; i <= 13138; i++) - materials[i] = Material.NetherBrickWall; - for (int i = 13139; i <= 13462; i++) - materials[i] = Material.AndesiteWall; - for (int i = 13463; i <= 13786; i++) - materials[i] = Material.RedNetherBrickWall; - for (int i = 13787; i <= 14110; i++) - materials[i] = Material.SandstoneWall; - for (int i = 14111; i <= 14434; i++) - materials[i] = Material.EndStoneBrickWall; - for (int i = 14435; i <= 14758; i++) - materials[i] = Material.DioriteWall; - for (int i = 14759; i <= 14790; i++) - materials[i] = Material.Scaffolding; - for (int i = 14791; i <= 14794; i++) - materials[i] = Material.Loom; - for (int i = 14795; i <= 14806; i++) - materials[i] = Material.Barrel; - for (int i = 14807; i <= 14814; i++) - materials[i] = Material.Smoker; - for (int i = 14815; i <= 14822; i++) - materials[i] = Material.BlastFurnace; - materials[14823] = Material.CartographyTable; - materials[14824] = Material.FletchingTable; - for (int i = 14825; i <= 14836; i++) - materials[i] = Material.Grindstone; - for (int i = 14837; i <= 14852; i++) - materials[i] = Material.Lectern; - materials[14853] = Material.SmithingTable; - for (int i = 14854; i <= 14857; i++) - materials[i] = Material.Stonecutter; - for (int i = 14858; i <= 14889; i++) - materials[i] = Material.Bell; - for (int i = 14890; i <= 14893; i++) - materials[i] = Material.Lantern; - for (int i = 14894; i <= 14897; i++) - materials[i] = Material.SoulLantern; - for (int i = 14898; i <= 14929; i++) - materials[i] = Material.Campfire; - for (int i = 14930; i <= 14961; i++) - materials[i] = Material.SoulCampfire; - for (int i = 14962; i <= 14965; i++) - materials[i] = Material.SweetBerryBush; - for (int i = 14966; i <= 14968; i++) - materials[i] = Material.WarpedStem; - for (int i = 14969; i <= 14971; i++) - materials[i] = Material.StrippedWarpedStem; - for (int i = 14972; i <= 14974; i++) - materials[i] = Material.WarpedHyphae; - for (int i = 14975; i <= 14977; i++) - materials[i] = Material.StrippedWarpedHyphae; - materials[14978] = Material.WarpedNylium; - materials[14979] = Material.WarpedFungus; - materials[14980] = Material.WarpedWartBlock; - materials[14981] = Material.WarpedRoots; - materials[14982] = Material.NetherSprouts; - for (int i = 14983; i <= 14985; i++) - materials[i] = Material.CrimsonStem; - for (int i = 14986; i <= 14988; i++) - materials[i] = Material.StrippedCrimsonStem; - for (int i = 14989; i <= 14991; i++) - materials[i] = Material.CrimsonHyphae; - for (int i = 14992; i <= 14994; i++) - materials[i] = Material.StrippedCrimsonHyphae; - materials[14995] = Material.CrimsonNylium; - materials[14996] = Material.CrimsonFungus; - materials[14997] = Material.Shroomlight; - for (int i = 14998; i <= 15023; i++) - materials[i] = Material.WeepingVines; - materials[15024] = Material.WeepingVinesPlant; - for (int i = 15025; i <= 15050; i++) - materials[i] = Material.TwistingVines; - materials[15051] = Material.TwistingVinesPlant; - materials[15052] = Material.CrimsonRoots; - materials[15053] = Material.CrimsonPlanks; - materials[15054] = Material.WarpedPlanks; - for (int i = 15055; i <= 15060; i++) - materials[i] = Material.CrimsonSlab; - for (int i = 15061; i <= 15066; i++) - materials[i] = Material.WarpedSlab; - for (int i = 15067; i <= 15068; i++) - materials[i] = Material.CrimsonPressurePlate; - for (int i = 15069; i <= 15070; i++) - materials[i] = Material.WarpedPressurePlate; - for (int i = 15071; i <= 15102; i++) - materials[i] = Material.CrimsonFence; - for (int i = 15103; i <= 15134; i++) - materials[i] = Material.WarpedFence; - for (int i = 15135; i <= 15198; i++) - materials[i] = Material.CrimsonTrapdoor; - for (int i = 15199; i <= 15262; i++) - materials[i] = Material.WarpedTrapdoor; - for (int i = 15263; i <= 15294; i++) - materials[i] = Material.CrimsonFenceGate; - for (int i = 15295; i <= 15326; i++) - materials[i] = Material.WarpedFenceGate; - for (int i = 15327; i <= 15406; i++) - materials[i] = Material.CrimsonStairs; - for (int i = 15407; i <= 15486; i++) - materials[i] = Material.WarpedStairs; - for (int i = 15487; i <= 15510; i++) - materials[i] = Material.CrimsonButton; - for (int i = 15511; i <= 15534; i++) - materials[i] = Material.WarpedButton; - for (int i = 15535; i <= 15598; i++) - materials[i] = Material.CrimsonDoor; - for (int i = 15599; i <= 15662; i++) - materials[i] = Material.WarpedDoor; - for (int i = 15663; i <= 15694; i++) - materials[i] = Material.CrimsonSign; - for (int i = 15695; i <= 15726; i++) - materials[i] = Material.WarpedSign; - for (int i = 15727; i <= 15734; i++) - materials[i] = Material.CrimsonWallSign; - for (int i = 15735; i <= 15742; i++) - materials[i] = Material.WarpedWallSign; - for (int i = 15743; i <= 15746; i++) - materials[i] = Material.StructureBlock; - for (int i = 15747; i <= 15758; i++) - materials[i] = Material.Jigsaw; - for (int i = 15759; i <= 15767; i++) - materials[i] = Material.Composter; - for (int i = 15768; i <= 15783; i++) - materials[i] = Material.Target; - for (int i = 15784; i <= 15807; i++) - materials[i] = Material.BeeNest; - for (int i = 15808; i <= 15831; i++) - materials[i] = Material.Beehive; - materials[15832] = Material.HoneyBlock; - materials[15833] = Material.HoneycombBlock; - materials[15834] = Material.NetheriteBlock; - materials[15835] = Material.AncientDebris; - materials[15836] = Material.CryingObsidian; - for (int i = 15837; i <= 15841; i++) - materials[i] = Material.RespawnAnchor; - materials[15842] = Material.PottedCrimsonFungus; - materials[15843] = Material.PottedWarpedFungus; - materials[15844] = Material.PottedCrimsonRoots; - materials[15845] = Material.PottedWarpedRoots; - materials[15846] = Material.Lodestone; - materials[15847] = Material.Blackstone; - for (int i = 15848; i <= 15927; i++) - materials[i] = Material.BlackstoneStairs; - for (int i = 15928; i <= 16251; i++) - materials[i] = Material.BlackstoneWall; - for (int i = 16252; i <= 16257; i++) - materials[i] = Material.BlackstoneSlab; - materials[16258] = Material.PolishedBlackstone; - materials[16259] = Material.PolishedBlackstoneBricks; - materials[16260] = Material.CrackedPolishedBlackstoneBricks; - materials[16261] = Material.ChiseledPolishedBlackstone; - for (int i = 16262; i <= 16267; i++) - materials[i] = Material.PolishedBlackstoneBrickSlab; - for (int i = 16268; i <= 16347; i++) - materials[i] = Material.PolishedBlackstoneBrickStairs; - for (int i = 16348; i <= 16671; i++) - materials[i] = Material.PolishedBlackstoneBrickWall; - materials[16672] = Material.GildedBlackstone; - for (int i = 16673; i <= 16752; i++) - materials[i] = Material.PolishedBlackstoneStairs; - for (int i = 16753; i <= 16758; i++) - materials[i] = Material.PolishedBlackstoneSlab; - for (int i = 16759; i <= 16760; i++) - materials[i] = Material.PolishedBlackstonePressurePlate; - for (int i = 16761; i <= 16784; i++) - materials[i] = Material.PolishedBlackstoneButton; - for (int i = 16785; i <= 17108; i++) - materials[i] = Material.PolishedBlackstoneWall; - materials[17109] = Material.ChiseledNetherBricks; - materials[17110] = Material.CrackedNetherBricks; - materials[17111] = Material.QuartzBricks; - } - - // - private static readonly BlockStateDefinition[] stateDefinitions = - [ - new(8, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(12, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(21, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(23, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(25, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(27, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(29, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(31, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(34, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(50, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(73, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(76, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(79, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(82, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(85, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(88, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(91, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(94, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(97, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(100, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(103, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(106, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(109, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(112, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(115, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(118, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(121, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(124, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(127, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(130, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(133, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(136, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(139, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(142, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(145, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(159, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(173, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(187, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(201, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(215, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(234, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(249, 800, - [ - new("instrument", ["harp", "basedrum", "snare", "hat", "bass", "flute", "bell", "guitar", "chime", "xylophone", "iron_xylophone", "cow_bell", "didgeridoo", "bit", "banjo", "pling"], 50), - new("note", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"], 2), - new("powered", ["true", "false"], 1) - ]), - new(1049, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1065, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1081, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1097, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1113, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1129, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1145, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1161, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1177, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1193, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1209, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1225, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1241, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1257, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1273, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1289, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1305, 12, - [ - new("powered", ["true", "false"], 6), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 1) - ]), - new(1317, 12, - [ - new("powered", ["true", "false"], 6), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 1) - ]), - new(1329, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(1346, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(1348, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(1360, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("short", ["true", "false"], 2), - new("type", ["normal", "sticky"], 1) - ]), - new(1400, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("type", ["normal", "sticky"], 1) - ]), - new(1430, 2, - [ - new("unstable", ["true", "false"], 1) - ]), - new(1436, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(1440, 512, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(1954, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2034, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("type", ["single", "left", "right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2058, 1296, - [ - new("east", ["up", "side", "none"], 432), - new("north", ["up", "side", "none"], 144), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 9), - new("south", ["up", "side", "none"], 3), - new("west", ["up", "side", "none"], 1) - ]), - new(3357, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(3365, 8, - [ - new("moisture", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(3373, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(3381, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3413, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3445, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3477, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3509, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3541, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3573, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(3637, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3645, 10, - [ - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south", "south_east", "south_west", "north_west", "north_east"], 1) - ]), - new(3655, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3735, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3743, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3751, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3759, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3767, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3775, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3783, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(3807, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3809, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(3873, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3875, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3877, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3879, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3881, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3883, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3885, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(3887, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(3889, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(3897, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(3921, 8, - [ - new("layers", ["1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(3931, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(3948, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(3964, 2, - [ - new("has_record", ["true", "false"], 1) - ]), - new(3966, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4002, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(4005, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(4009, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4014, 2, - [ - new("axis", ["x", "z"], 1) - ]), - new(4016, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4020, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4024, 7, - [ - new("bites", ["0", "1", "2", "3", "4", "5", "6"], 1) - ]), - new(4031, 64, - [ - new("delay", ["1", "2", "3", "4"], 16), - new("facing", ["north", "south", "west", "east"], 4), - new("locked", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(4111, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4175, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4239, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4303, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4367, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4431, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4505, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4569, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4633, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4697, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4729, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4735, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4768, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4772, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4776, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4784, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4792, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4824, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(4856, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4936, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5016, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(5020, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5052, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5132, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(5137, 8, - [ - new("has_bottle_0", ["true", "false"], 4), - new("has_bottle_1", ["true", "false"], 2), - new("has_bottle_2", ["true", "false"], 1) - ]), - new(5145, 4, - [ - new("level", ["0", "1", "2", "3"], 1) - ]), - new(5150, 8, - [ - new("eye", ["true", "false"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5160, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5162, 12, - [ - new("age", ["0", "1", "2"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5174, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5255, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5263, 16, - [ - new("attached", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5279, 128, - [ - new("attached", ["true", "false"], 64), - new("disarmed", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("powered", ["true", "false"], 4), - new("south", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5408, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5488, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5568, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5648, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(5661, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(5985, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(6334, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(6342, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(6350, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6374, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6398, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6422, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6446, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6470, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6494, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6510, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6514, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6530, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6534, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6550, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6554, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6570, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6574, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6590, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6594, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6610, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6614, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6618, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6622, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6626, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("type", ["single", "left", "right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6650, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6666, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6682, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("mode", ["compare", "subtract"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6698, 32, - [ - new("inverted", ["true", "false"], 16), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6732, 10, - [ - new("enabled", ["true", "false"], 5), - new("facing", ["down", "north", "south", "west", "east"], 1) - ]), - new(6744, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(6747, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6827, 12, - [ - new("powered", ["true", "false"], 6), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 1) - ]), - new(6839, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(6867, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6899, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6931, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6963, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6995, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7027, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7059, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7091, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7123, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7155, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7187, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7219, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7251, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7283, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7315, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7347, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7379, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7459, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7541, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7608, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7688, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7768, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7848, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7854, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7860, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7867, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(7889, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(7891, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(7893, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(7895, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(7897, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(7899, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(7901, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7917, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7933, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7949, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7965, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7981, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7997, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8013, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8029, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8045, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8061, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8077, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8093, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8109, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8125, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8141, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8157, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8161, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8165, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8169, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8173, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8177, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8181, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8185, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8189, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8193, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8197, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8201, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8205, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8209, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8213, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8217, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8224, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8304, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8310, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8316, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8322, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8328, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8334, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8340, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8346, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8352, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8358, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8364, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8370, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8376, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8382, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8388, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8394, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8400, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8406, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8412, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8422, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8454, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8486, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8518, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8550, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8582, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8614, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8646, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8678, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8710, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8742, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8806, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8870, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8934, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8998, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9062, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9068, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9132, 6, - [ - new("age", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(9139, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(9142, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9223, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(9229, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9241, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9253, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(9260, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(9264, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9276, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9282, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9288, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9294, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9300, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9306, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9312, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9318, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9324, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9330, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9336, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9342, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9348, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9354, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9360, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9366, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9372, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9378, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9382, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9386, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9390, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9394, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9398, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9402, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9406, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9410, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9414, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9418, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9422, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9426, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9430, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9434, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9438, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9474, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(9502, 12, - [ - new("eggs", ["1", "2", "3", "4"], 3), - new("hatch", ["0", "1", "2"], 1) - ]), - new(9524, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9526, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9528, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9530, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9532, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9534, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9536, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9538, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9540, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9542, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9544, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9546, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9548, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9550, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9552, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9554, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9556, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9558, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9560, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9562, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9564, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9572, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9580, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9588, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9596, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9604, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9612, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9620, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9628, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9636, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9644, 8, - [ - new("pickles", ["1", "2", "3", "4"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9653, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9656, 12, - [ - new("age", ["0", "1"], 6), - new("leaves", ["none", "small", "large"], 2), - new("stage", ["0", "1"], 1) - ]), - new(9671, 2, - [ - new("drag", ["true", "false"], 1) - ]), - new(9673, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9753, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9833, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9913, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9993, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10073, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10153, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10233, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10313, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10393, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10473, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10553, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10633, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10713, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10793, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10799, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10805, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10811, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10817, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10823, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10829, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10835, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10841, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10847, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10853, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10859, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10865, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10871, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(11195, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(11519, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(11843, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(12167, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(12491, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(12815, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(13139, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(13463, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(13787, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14111, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14435, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14759, 32, - [ - new("bottom", ["true", "false"], 16), - new("distance", ["0", "1", "2", "3", "4", "5", "6", "7"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14791, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14795, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("open", ["true", "false"], 1) - ]), - new(14807, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(14815, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(14825, 12, - [ - new("face", ["floor", "wall", "ceiling"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14837, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("has_book", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14854, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14858, 32, - [ - new("attachment", ["floor", "ceiling", "single_wall", "double_wall"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14890, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14894, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14898, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14930, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14962, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(14966, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(14969, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(14972, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(14975, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(14983, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(14986, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(14989, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(14992, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(14998, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(15025, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(15055, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15061, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15067, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(15069, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(15071, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(15103, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(15135, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15199, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15263, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(15295, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(15327, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15407, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15487, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(15511, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(15535, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(15599, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(15663, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15695, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15727, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15735, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15743, 4, - [ - new("mode", ["save", "load", "corner", "data"], 1) - ]), - new(15747, 12, - [ - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 1) - ]), - new(15759, 9, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(15768, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(15784, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(15808, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(15837, 5, - [ - new("charges", ["0", "1", "2", "3", "4"], 1) - ]), - new(15848, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15928, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16252, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16262, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16268, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16348, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16673, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16753, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16759, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(16761, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(16785, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - ]; - // - - protected override Dictionary GetDict() - { - return materials; - } - - protected override BlockStateDefinition[] GetStateDefinitions() - { - return stateDefinitions; - } - } -} diff --git a/MinecraftClient/Mapping/BlockPalettes/Palette117.cs b/MinecraftClient/Mapping/BlockPalettes/Palette117.cs deleted file mode 100644 index 5bff909ce2..0000000000 --- a/MinecraftClient/Mapping/BlockPalettes/Palette117.cs +++ /dev/null @@ -1,4437 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.BlockPalettes -{ - public class Palette117 : BlockPalette - { - private static readonly Dictionary materials = new(); - - static Palette117() - { - materials[0] = Material.Air; - materials[1] = Material.Stone; - materials[2] = Material.Granite; - materials[3] = Material.PolishedGranite; - materials[4] = Material.Diorite; - materials[5] = Material.PolishedDiorite; - materials[6] = Material.Andesite; - materials[7] = Material.PolishedAndesite; - for (int i = 8; i <= 9; i++) - materials[i] = Material.GrassBlock; - materials[10] = Material.Dirt; - materials[11] = Material.CoarseDirt; - for (int i = 12; i <= 13; i++) - materials[i] = Material.Podzol; - materials[14] = Material.Cobblestone; - materials[15] = Material.OakPlanks; - materials[16] = Material.SprucePlanks; - materials[17] = Material.BirchPlanks; - materials[18] = Material.JunglePlanks; - materials[19] = Material.AcaciaPlanks; - materials[20] = Material.DarkOakPlanks; - for (int i = 21; i <= 22; i++) - materials[i] = Material.OakSapling; - for (int i = 23; i <= 24; i++) - materials[i] = Material.SpruceSapling; - for (int i = 25; i <= 26; i++) - materials[i] = Material.BirchSapling; - for (int i = 27; i <= 28; i++) - materials[i] = Material.JungleSapling; - for (int i = 29; i <= 30; i++) - materials[i] = Material.AcaciaSapling; - for (int i = 31; i <= 32; i++) - materials[i] = Material.DarkOakSapling; - materials[33] = Material.Bedrock; - for (int i = 34; i <= 49; i++) - materials[i] = Material.Water; - for (int i = 50; i <= 65; i++) - materials[i] = Material.Lava; - materials[66] = Material.Sand; - materials[67] = Material.RedSand; - materials[68] = Material.Gravel; - materials[69] = Material.GoldOre; - materials[70] = Material.DeepslateGoldOre; - materials[71] = Material.IronOre; - materials[72] = Material.DeepslateIronOre; - materials[73] = Material.CoalOre; - materials[74] = Material.DeepslateCoalOre; - materials[75] = Material.NetherGoldOre; - for (int i = 76; i <= 78; i++) - materials[i] = Material.OakLog; - for (int i = 79; i <= 81; i++) - materials[i] = Material.SpruceLog; - for (int i = 82; i <= 84; i++) - materials[i] = Material.BirchLog; - for (int i = 85; i <= 87; i++) - materials[i] = Material.JungleLog; - for (int i = 88; i <= 90; i++) - materials[i] = Material.AcaciaLog; - for (int i = 91; i <= 93; i++) - materials[i] = Material.DarkOakLog; - for (int i = 94; i <= 96; i++) - materials[i] = Material.StrippedSpruceLog; - for (int i = 97; i <= 99; i++) - materials[i] = Material.StrippedBirchLog; - for (int i = 100; i <= 102; i++) - materials[i] = Material.StrippedJungleLog; - for (int i = 103; i <= 105; i++) - materials[i] = Material.StrippedAcaciaLog; - for (int i = 106; i <= 108; i++) - materials[i] = Material.StrippedDarkOakLog; - for (int i = 109; i <= 111; i++) - materials[i] = Material.StrippedOakLog; - for (int i = 112; i <= 114; i++) - materials[i] = Material.OakWood; - for (int i = 115; i <= 117; i++) - materials[i] = Material.SpruceWood; - for (int i = 118; i <= 120; i++) - materials[i] = Material.BirchWood; - for (int i = 121; i <= 123; i++) - materials[i] = Material.JungleWood; - for (int i = 124; i <= 126; i++) - materials[i] = Material.AcaciaWood; - for (int i = 127; i <= 129; i++) - materials[i] = Material.DarkOakWood; - for (int i = 130; i <= 132; i++) - materials[i] = Material.StrippedOakWood; - for (int i = 133; i <= 135; i++) - materials[i] = Material.StrippedSpruceWood; - for (int i = 136; i <= 138; i++) - materials[i] = Material.StrippedBirchWood; - for (int i = 139; i <= 141; i++) - materials[i] = Material.StrippedJungleWood; - for (int i = 142; i <= 144; i++) - materials[i] = Material.StrippedAcaciaWood; - for (int i = 145; i <= 147; i++) - materials[i] = Material.StrippedDarkOakWood; - for (int i = 148; i <= 161; i++) - materials[i] = Material.OakLeaves; - for (int i = 162; i <= 175; i++) - materials[i] = Material.SpruceLeaves; - for (int i = 176; i <= 189; i++) - materials[i] = Material.BirchLeaves; - for (int i = 190; i <= 203; i++) - materials[i] = Material.JungleLeaves; - for (int i = 204; i <= 217; i++) - materials[i] = Material.AcaciaLeaves; - for (int i = 218; i <= 231; i++) - materials[i] = Material.DarkOakLeaves; - for (int i = 232; i <= 245; i++) - materials[i] = Material.AzaleaLeaves; - for (int i = 246; i <= 259; i++) - materials[i] = Material.FloweringAzaleaLeaves; - materials[260] = Material.Sponge; - materials[261] = Material.WetSponge; - materials[262] = Material.Glass; - materials[263] = Material.LapisOre; - materials[264] = Material.DeepslateLapisOre; - materials[265] = Material.LapisBlock; - for (int i = 266; i <= 277; i++) - materials[i] = Material.Dispenser; - materials[278] = Material.Sandstone; - materials[279] = Material.ChiseledSandstone; - materials[280] = Material.CutSandstone; - for (int i = 281; i <= 1080; i++) - materials[i] = Material.NoteBlock; - for (int i = 1081; i <= 1096; i++) - materials[i] = Material.WhiteBed; - for (int i = 1097; i <= 1112; i++) - materials[i] = Material.OrangeBed; - for (int i = 1113; i <= 1128; i++) - materials[i] = Material.MagentaBed; - for (int i = 1129; i <= 1144; i++) - materials[i] = Material.LightBlueBed; - for (int i = 1145; i <= 1160; i++) - materials[i] = Material.YellowBed; - for (int i = 1161; i <= 1176; i++) - materials[i] = Material.LimeBed; - for (int i = 1177; i <= 1192; i++) - materials[i] = Material.PinkBed; - for (int i = 1193; i <= 1208; i++) - materials[i] = Material.GrayBed; - for (int i = 1209; i <= 1224; i++) - materials[i] = Material.LightGrayBed; - for (int i = 1225; i <= 1240; i++) - materials[i] = Material.CyanBed; - for (int i = 1241; i <= 1256; i++) - materials[i] = Material.PurpleBed; - for (int i = 1257; i <= 1272; i++) - materials[i] = Material.BlueBed; - for (int i = 1273; i <= 1288; i++) - materials[i] = Material.BrownBed; - for (int i = 1289; i <= 1304; i++) - materials[i] = Material.GreenBed; - for (int i = 1305; i <= 1320; i++) - materials[i] = Material.RedBed; - for (int i = 1321; i <= 1336; i++) - materials[i] = Material.BlackBed; - for (int i = 1337; i <= 1360; i++) - materials[i] = Material.PoweredRail; - for (int i = 1361; i <= 1384; i++) - materials[i] = Material.DetectorRail; - for (int i = 1385; i <= 1396; i++) - materials[i] = Material.StickyPiston; - materials[1397] = Material.Cobweb; - materials[1398] = Material.ShortGrass; - materials[1399] = Material.Fern; - materials[1400] = Material.DeadBush; - materials[1401] = Material.Seagrass; - for (int i = 1402; i <= 1403; i++) - materials[i] = Material.TallSeagrass; - for (int i = 1404; i <= 1415; i++) - materials[i] = Material.Piston; - for (int i = 1416; i <= 1439; i++) - materials[i] = Material.PistonHead; - materials[1440] = Material.WhiteWool; - materials[1441] = Material.OrangeWool; - materials[1442] = Material.MagentaWool; - materials[1443] = Material.LightBlueWool; - materials[1444] = Material.YellowWool; - materials[1445] = Material.LimeWool; - materials[1446] = Material.PinkWool; - materials[1447] = Material.GrayWool; - materials[1448] = Material.LightGrayWool; - materials[1449] = Material.CyanWool; - materials[1450] = Material.PurpleWool; - materials[1451] = Material.BlueWool; - materials[1452] = Material.BrownWool; - materials[1453] = Material.GreenWool; - materials[1454] = Material.RedWool; - materials[1455] = Material.BlackWool; - for (int i = 1456; i <= 1467; i++) - materials[i] = Material.MovingPiston; - materials[1468] = Material.Dandelion; - materials[1469] = Material.Poppy; - materials[1470] = Material.BlueOrchid; - materials[1471] = Material.Allium; - materials[1472] = Material.AzureBluet; - materials[1473] = Material.RedTulip; - materials[1474] = Material.OrangeTulip; - materials[1475] = Material.WhiteTulip; - materials[1476] = Material.PinkTulip; - materials[1477] = Material.OxeyeDaisy; - materials[1478] = Material.Cornflower; - materials[1479] = Material.WitherRose; - materials[1480] = Material.LilyOfTheValley; - materials[1481] = Material.BrownMushroom; - materials[1482] = Material.RedMushroom; - materials[1483] = Material.GoldBlock; - materials[1484] = Material.IronBlock; - materials[1485] = Material.Bricks; - for (int i = 1486; i <= 1487; i++) - materials[i] = Material.Tnt; - materials[1488] = Material.Bookshelf; - materials[1489] = Material.MossyCobblestone; - materials[1490] = Material.Obsidian; - materials[1491] = Material.Torch; - for (int i = 1492; i <= 1495; i++) - materials[i] = Material.WallTorch; - for (int i = 1496; i <= 2007; i++) - materials[i] = Material.Fire; - materials[2008] = Material.SoulFire; - materials[2009] = Material.Spawner; - for (int i = 2010; i <= 2089; i++) - materials[i] = Material.OakStairs; - for (int i = 2090; i <= 2113; i++) - materials[i] = Material.Chest; - for (int i = 2114; i <= 3409; i++) - materials[i] = Material.RedstoneWire; - materials[3410] = Material.DiamondOre; - materials[3411] = Material.DeepslateDiamondOre; - materials[3412] = Material.DiamondBlock; - materials[3413] = Material.CraftingTable; - for (int i = 3414; i <= 3421; i++) - materials[i] = Material.Wheat; - for (int i = 3422; i <= 3429; i++) - materials[i] = Material.Farmland; - for (int i = 3430; i <= 3437; i++) - materials[i] = Material.Furnace; - for (int i = 3438; i <= 3469; i++) - materials[i] = Material.OakSign; - for (int i = 3470; i <= 3501; i++) - materials[i] = Material.SpruceSign; - for (int i = 3502; i <= 3533; i++) - materials[i] = Material.BirchSign; - for (int i = 3534; i <= 3565; i++) - materials[i] = Material.AcaciaSign; - for (int i = 3566; i <= 3597; i++) - materials[i] = Material.JungleSign; - for (int i = 3598; i <= 3629; i++) - materials[i] = Material.DarkOakSign; - for (int i = 3630; i <= 3693; i++) - materials[i] = Material.OakDoor; - for (int i = 3694; i <= 3701; i++) - materials[i] = Material.Ladder; - for (int i = 3702; i <= 3721; i++) - materials[i] = Material.Rail; - for (int i = 3722; i <= 3801; i++) - materials[i] = Material.CobblestoneStairs; - for (int i = 3802; i <= 3809; i++) - materials[i] = Material.OakWallSign; - for (int i = 3810; i <= 3817; i++) - materials[i] = Material.SpruceWallSign; - for (int i = 3818; i <= 3825; i++) - materials[i] = Material.BirchWallSign; - for (int i = 3826; i <= 3833; i++) - materials[i] = Material.AcaciaWallSign; - for (int i = 3834; i <= 3841; i++) - materials[i] = Material.JungleWallSign; - for (int i = 3842; i <= 3849; i++) - materials[i] = Material.DarkOakWallSign; - for (int i = 3850; i <= 3873; i++) - materials[i] = Material.Lever; - for (int i = 3874; i <= 3875; i++) - materials[i] = Material.StonePressurePlate; - for (int i = 3876; i <= 3939; i++) - materials[i] = Material.IronDoor; - for (int i = 3940; i <= 3941; i++) - materials[i] = Material.OakPressurePlate; - for (int i = 3942; i <= 3943; i++) - materials[i] = Material.SprucePressurePlate; - for (int i = 3944; i <= 3945; i++) - materials[i] = Material.BirchPressurePlate; - for (int i = 3946; i <= 3947; i++) - materials[i] = Material.JunglePressurePlate; - for (int i = 3948; i <= 3949; i++) - materials[i] = Material.AcaciaPressurePlate; - for (int i = 3950; i <= 3951; i++) - materials[i] = Material.DarkOakPressurePlate; - for (int i = 3952; i <= 3953; i++) - materials[i] = Material.RedstoneOre; - for (int i = 3954; i <= 3955; i++) - materials[i] = Material.DeepslateRedstoneOre; - for (int i = 3956; i <= 3957; i++) - materials[i] = Material.RedstoneTorch; - for (int i = 3958; i <= 3965; i++) - materials[i] = Material.RedstoneWallTorch; - for (int i = 3966; i <= 3989; i++) - materials[i] = Material.StoneButton; - for (int i = 3990; i <= 3997; i++) - materials[i] = Material.Snow; - materials[3998] = Material.Ice; - materials[3999] = Material.SnowBlock; - for (int i = 4000; i <= 4015; i++) - materials[i] = Material.Cactus; - materials[4016] = Material.Clay; - for (int i = 4017; i <= 4032; i++) - materials[i] = Material.SugarCane; - for (int i = 4033; i <= 4034; i++) - materials[i] = Material.Jukebox; - for (int i = 4035; i <= 4066; i++) - materials[i] = Material.OakFence; - materials[4067] = Material.Pumpkin; - materials[4068] = Material.Netherrack; - materials[4069] = Material.SoulSand; - materials[4070] = Material.SoulSoil; - for (int i = 4071; i <= 4073; i++) - materials[i] = Material.Basalt; - for (int i = 4074; i <= 4076; i++) - materials[i] = Material.PolishedBasalt; - materials[4077] = Material.SoulTorch; - for (int i = 4078; i <= 4081; i++) - materials[i] = Material.SoulWallTorch; - materials[4082] = Material.Glowstone; - for (int i = 4083; i <= 4084; i++) - materials[i] = Material.NetherPortal; - for (int i = 4085; i <= 4088; i++) - materials[i] = Material.CarvedPumpkin; - for (int i = 4089; i <= 4092; i++) - materials[i] = Material.JackOLantern; - for (int i = 4093; i <= 4099; i++) - materials[i] = Material.Cake; - for (int i = 4100; i <= 4163; i++) - materials[i] = Material.Repeater; - materials[4164] = Material.WhiteStainedGlass; - materials[4165] = Material.OrangeStainedGlass; - materials[4166] = Material.MagentaStainedGlass; - materials[4167] = Material.LightBlueStainedGlass; - materials[4168] = Material.YellowStainedGlass; - materials[4169] = Material.LimeStainedGlass; - materials[4170] = Material.PinkStainedGlass; - materials[4171] = Material.GrayStainedGlass; - materials[4172] = Material.LightGrayStainedGlass; - materials[4173] = Material.CyanStainedGlass; - materials[4174] = Material.PurpleStainedGlass; - materials[4175] = Material.BlueStainedGlass; - materials[4176] = Material.BrownStainedGlass; - materials[4177] = Material.GreenStainedGlass; - materials[4178] = Material.RedStainedGlass; - materials[4179] = Material.BlackStainedGlass; - for (int i = 4180; i <= 4243; i++) - materials[i] = Material.OakTrapdoor; - for (int i = 4244; i <= 4307; i++) - materials[i] = Material.SpruceTrapdoor; - for (int i = 4308; i <= 4371; i++) - materials[i] = Material.BirchTrapdoor; - for (int i = 4372; i <= 4435; i++) - materials[i] = Material.JungleTrapdoor; - for (int i = 4436; i <= 4499; i++) - materials[i] = Material.AcaciaTrapdoor; - for (int i = 4500; i <= 4563; i++) - materials[i] = Material.DarkOakTrapdoor; - materials[4564] = Material.StoneBricks; - materials[4565] = Material.MossyStoneBricks; - materials[4566] = Material.CrackedStoneBricks; - materials[4567] = Material.ChiseledStoneBricks; - materials[4568] = Material.InfestedStone; - materials[4569] = Material.InfestedCobblestone; - materials[4570] = Material.InfestedStoneBricks; - materials[4571] = Material.InfestedMossyStoneBricks; - materials[4572] = Material.InfestedCrackedStoneBricks; - materials[4573] = Material.InfestedChiseledStoneBricks; - for (int i = 4574; i <= 4637; i++) - materials[i] = Material.BrownMushroomBlock; - for (int i = 4638; i <= 4701; i++) - materials[i] = Material.RedMushroomBlock; - for (int i = 4702; i <= 4765; i++) - materials[i] = Material.MushroomStem; - for (int i = 4766; i <= 4797; i++) - materials[i] = Material.IronBars; - for (int i = 4798; i <= 4803; i++) - materials[i] = Material.Chain; - for (int i = 4804; i <= 4835; i++) - materials[i] = Material.GlassPane; - materials[4836] = Material.Melon; - for (int i = 4837; i <= 4840; i++) - materials[i] = Material.AttachedPumpkinStem; - for (int i = 4841; i <= 4844; i++) - materials[i] = Material.AttachedMelonStem; - for (int i = 4845; i <= 4852; i++) - materials[i] = Material.PumpkinStem; - for (int i = 4853; i <= 4860; i++) - materials[i] = Material.MelonStem; - for (int i = 4861; i <= 4892; i++) - materials[i] = Material.Vine; - for (int i = 4893; i <= 5020; i++) - materials[i] = Material.GlowLichen; - for (int i = 5021; i <= 5052; i++) - materials[i] = Material.OakFenceGate; - for (int i = 5053; i <= 5132; i++) - materials[i] = Material.BrickStairs; - for (int i = 5133; i <= 5212; i++) - materials[i] = Material.StoneBrickStairs; - for (int i = 5213; i <= 5214; i++) - materials[i] = Material.Mycelium; - materials[5215] = Material.LilyPad; - materials[5216] = Material.NetherBricks; - for (int i = 5217; i <= 5248; i++) - materials[i] = Material.NetherBrickFence; - for (int i = 5249; i <= 5328; i++) - materials[i] = Material.NetherBrickStairs; - for (int i = 5329; i <= 5332; i++) - materials[i] = Material.NetherWart; - materials[5333] = Material.EnchantingTable; - for (int i = 5334; i <= 5341; i++) - materials[i] = Material.BrewingStand; - materials[5342] = Material.Cauldron; - for (int i = 5343; i <= 5345; i++) - materials[i] = Material.WaterCauldron; - materials[5346] = Material.LavaCauldron; - for (int i = 5347; i <= 5349; i++) - materials[i] = Material.PowderSnowCauldron; - materials[5350] = Material.EndPortal; - for (int i = 5351; i <= 5358; i++) - materials[i] = Material.EndPortalFrame; - materials[5359] = Material.EndStone; - materials[5360] = Material.DragonEgg; - for (int i = 5361; i <= 5362; i++) - materials[i] = Material.RedstoneLamp; - for (int i = 5363; i <= 5374; i++) - materials[i] = Material.Cocoa; - for (int i = 5375; i <= 5454; i++) - materials[i] = Material.SandstoneStairs; - materials[5455] = Material.EmeraldOre; - materials[5456] = Material.DeepslateEmeraldOre; - for (int i = 5457; i <= 5464; i++) - materials[i] = Material.EnderChest; - for (int i = 5465; i <= 5480; i++) - materials[i] = Material.TripwireHook; - for (int i = 5481; i <= 5608; i++) - materials[i] = Material.Tripwire; - materials[5609] = Material.EmeraldBlock; - for (int i = 5610; i <= 5689; i++) - materials[i] = Material.SpruceStairs; - for (int i = 5690; i <= 5769; i++) - materials[i] = Material.BirchStairs; - for (int i = 5770; i <= 5849; i++) - materials[i] = Material.JungleStairs; - for (int i = 5850; i <= 5861; i++) - materials[i] = Material.CommandBlock; - materials[5862] = Material.Beacon; - for (int i = 5863; i <= 6186; i++) - materials[i] = Material.CobblestoneWall; - for (int i = 6187; i <= 6510; i++) - materials[i] = Material.MossyCobblestoneWall; - materials[6511] = Material.FlowerPot; - materials[6512] = Material.PottedOakSapling; - materials[6513] = Material.PottedSpruceSapling; - materials[6514] = Material.PottedBirchSapling; - materials[6515] = Material.PottedJungleSapling; - materials[6516] = Material.PottedAcaciaSapling; - materials[6517] = Material.PottedDarkOakSapling; - materials[6518] = Material.PottedFern; - materials[6519] = Material.PottedDandelion; - materials[6520] = Material.PottedPoppy; - materials[6521] = Material.PottedBlueOrchid; - materials[6522] = Material.PottedAllium; - materials[6523] = Material.PottedAzureBluet; - materials[6524] = Material.PottedRedTulip; - materials[6525] = Material.PottedOrangeTulip; - materials[6526] = Material.PottedWhiteTulip; - materials[6527] = Material.PottedPinkTulip; - materials[6528] = Material.PottedOxeyeDaisy; - materials[6529] = Material.PottedCornflower; - materials[6530] = Material.PottedLilyOfTheValley; - materials[6531] = Material.PottedWitherRose; - materials[6532] = Material.PottedRedMushroom; - materials[6533] = Material.PottedBrownMushroom; - materials[6534] = Material.PottedDeadBush; - materials[6535] = Material.PottedCactus; - for (int i = 6536; i <= 6543; i++) - materials[i] = Material.Carrots; - for (int i = 6544; i <= 6551; i++) - materials[i] = Material.Potatoes; - for (int i = 6552; i <= 6575; i++) - materials[i] = Material.OakButton; - for (int i = 6576; i <= 6599; i++) - materials[i] = Material.SpruceButton; - for (int i = 6600; i <= 6623; i++) - materials[i] = Material.BirchButton; - for (int i = 6624; i <= 6647; i++) - materials[i] = Material.JungleButton; - for (int i = 6648; i <= 6671; i++) - materials[i] = Material.AcaciaButton; - for (int i = 6672; i <= 6695; i++) - materials[i] = Material.DarkOakButton; - for (int i = 6696; i <= 6711; i++) - materials[i] = Material.SkeletonSkull; - for (int i = 6712; i <= 6715; i++) - materials[i] = Material.SkeletonWallSkull; - for (int i = 6716; i <= 6731; i++) - materials[i] = Material.WitherSkeletonSkull; - for (int i = 6732; i <= 6735; i++) - materials[i] = Material.WitherSkeletonWallSkull; - for (int i = 6736; i <= 6751; i++) - materials[i] = Material.ZombieHead; - for (int i = 6752; i <= 6755; i++) - materials[i] = Material.ZombieWallHead; - for (int i = 6756; i <= 6771; i++) - materials[i] = Material.PlayerHead; - for (int i = 6772; i <= 6775; i++) - materials[i] = Material.PlayerWallHead; - for (int i = 6776; i <= 6791; i++) - materials[i] = Material.CreeperHead; - for (int i = 6792; i <= 6795; i++) - materials[i] = Material.CreeperWallHead; - for (int i = 6796; i <= 6811; i++) - materials[i] = Material.DragonHead; - for (int i = 6812; i <= 6815; i++) - materials[i] = Material.DragonWallHead; - for (int i = 6816; i <= 6819; i++) - materials[i] = Material.Anvil; - for (int i = 6820; i <= 6823; i++) - materials[i] = Material.ChippedAnvil; - for (int i = 6824; i <= 6827; i++) - materials[i] = Material.DamagedAnvil; - for (int i = 6828; i <= 6851; i++) - materials[i] = Material.TrappedChest; - for (int i = 6852; i <= 6867; i++) - materials[i] = Material.LightWeightedPressurePlate; - for (int i = 6868; i <= 6883; i++) - materials[i] = Material.HeavyWeightedPressurePlate; - for (int i = 6884; i <= 6899; i++) - materials[i] = Material.Comparator; - for (int i = 6900; i <= 6931; i++) - materials[i] = Material.DaylightDetector; - materials[6932] = Material.RedstoneBlock; - materials[6933] = Material.NetherQuartzOre; - for (int i = 6934; i <= 6943; i++) - materials[i] = Material.Hopper; - materials[6944] = Material.QuartzBlock; - materials[6945] = Material.ChiseledQuartzBlock; - for (int i = 6946; i <= 6948; i++) - materials[i] = Material.QuartzPillar; - for (int i = 6949; i <= 7028; i++) - materials[i] = Material.QuartzStairs; - for (int i = 7029; i <= 7052; i++) - materials[i] = Material.ActivatorRail; - for (int i = 7053; i <= 7064; i++) - materials[i] = Material.Dropper; - materials[7065] = Material.WhiteTerracotta; - materials[7066] = Material.OrangeTerracotta; - materials[7067] = Material.MagentaTerracotta; - materials[7068] = Material.LightBlueTerracotta; - materials[7069] = Material.YellowTerracotta; - materials[7070] = Material.LimeTerracotta; - materials[7071] = Material.PinkTerracotta; - materials[7072] = Material.GrayTerracotta; - materials[7073] = Material.LightGrayTerracotta; - materials[7074] = Material.CyanTerracotta; - materials[7075] = Material.PurpleTerracotta; - materials[7076] = Material.BlueTerracotta; - materials[7077] = Material.BrownTerracotta; - materials[7078] = Material.GreenTerracotta; - materials[7079] = Material.RedTerracotta; - materials[7080] = Material.BlackTerracotta; - for (int i = 7081; i <= 7112; i++) - materials[i] = Material.WhiteStainedGlassPane; - for (int i = 7113; i <= 7144; i++) - materials[i] = Material.OrangeStainedGlassPane; - for (int i = 7145; i <= 7176; i++) - materials[i] = Material.MagentaStainedGlassPane; - for (int i = 7177; i <= 7208; i++) - materials[i] = Material.LightBlueStainedGlassPane; - for (int i = 7209; i <= 7240; i++) - materials[i] = Material.YellowStainedGlassPane; - for (int i = 7241; i <= 7272; i++) - materials[i] = Material.LimeStainedGlassPane; - for (int i = 7273; i <= 7304; i++) - materials[i] = Material.PinkStainedGlassPane; - for (int i = 7305; i <= 7336; i++) - materials[i] = Material.GrayStainedGlassPane; - for (int i = 7337; i <= 7368; i++) - materials[i] = Material.LightGrayStainedGlassPane; - for (int i = 7369; i <= 7400; i++) - materials[i] = Material.CyanStainedGlassPane; - for (int i = 7401; i <= 7432; i++) - materials[i] = Material.PurpleStainedGlassPane; - for (int i = 7433; i <= 7464; i++) - materials[i] = Material.BlueStainedGlassPane; - for (int i = 7465; i <= 7496; i++) - materials[i] = Material.BrownStainedGlassPane; - for (int i = 7497; i <= 7528; i++) - materials[i] = Material.GreenStainedGlassPane; - for (int i = 7529; i <= 7560; i++) - materials[i] = Material.RedStainedGlassPane; - for (int i = 7561; i <= 7592; i++) - materials[i] = Material.BlackStainedGlassPane; - for (int i = 7593; i <= 7672; i++) - materials[i] = Material.AcaciaStairs; - for (int i = 7673; i <= 7752; i++) - materials[i] = Material.DarkOakStairs; - materials[7753] = Material.SlimeBlock; - materials[7754] = Material.Barrier; - for (int i = 7755; i <= 7786; i++) - materials[i] = Material.Light; - for (int i = 7787; i <= 7850; i++) - materials[i] = Material.IronTrapdoor; - materials[7851] = Material.Prismarine; - materials[7852] = Material.PrismarineBricks; - materials[7853] = Material.DarkPrismarine; - for (int i = 7854; i <= 7933; i++) - materials[i] = Material.PrismarineStairs; - for (int i = 7934; i <= 8013; i++) - materials[i] = Material.PrismarineBrickStairs; - for (int i = 8014; i <= 8093; i++) - materials[i] = Material.DarkPrismarineStairs; - for (int i = 8094; i <= 8099; i++) - materials[i] = Material.PrismarineSlab; - for (int i = 8100; i <= 8105; i++) - materials[i] = Material.PrismarineBrickSlab; - for (int i = 8106; i <= 8111; i++) - materials[i] = Material.DarkPrismarineSlab; - materials[8112] = Material.SeaLantern; - for (int i = 8113; i <= 8115; i++) - materials[i] = Material.HayBlock; - materials[8116] = Material.WhiteCarpet; - materials[8117] = Material.OrangeCarpet; - materials[8118] = Material.MagentaCarpet; - materials[8119] = Material.LightBlueCarpet; - materials[8120] = Material.YellowCarpet; - materials[8121] = Material.LimeCarpet; - materials[8122] = Material.PinkCarpet; - materials[8123] = Material.GrayCarpet; - materials[8124] = Material.LightGrayCarpet; - materials[8125] = Material.CyanCarpet; - materials[8126] = Material.PurpleCarpet; - materials[8127] = Material.BlueCarpet; - materials[8128] = Material.BrownCarpet; - materials[8129] = Material.GreenCarpet; - materials[8130] = Material.RedCarpet; - materials[8131] = Material.BlackCarpet; - materials[8132] = Material.Terracotta; - materials[8133] = Material.CoalBlock; - materials[8134] = Material.PackedIce; - for (int i = 8135; i <= 8136; i++) - materials[i] = Material.Sunflower; - for (int i = 8137; i <= 8138; i++) - materials[i] = Material.Lilac; - for (int i = 8139; i <= 8140; i++) - materials[i] = Material.RoseBush; - for (int i = 8141; i <= 8142; i++) - materials[i] = Material.Peony; - for (int i = 8143; i <= 8144; i++) - materials[i] = Material.TallGrass; - for (int i = 8145; i <= 8146; i++) - materials[i] = Material.LargeFern; - for (int i = 8147; i <= 8162; i++) - materials[i] = Material.WhiteBanner; - for (int i = 8163; i <= 8178; i++) - materials[i] = Material.OrangeBanner; - for (int i = 8179; i <= 8194; i++) - materials[i] = Material.MagentaBanner; - for (int i = 8195; i <= 8210; i++) - materials[i] = Material.LightBlueBanner; - for (int i = 8211; i <= 8226; i++) - materials[i] = Material.YellowBanner; - for (int i = 8227; i <= 8242; i++) - materials[i] = Material.LimeBanner; - for (int i = 8243; i <= 8258; i++) - materials[i] = Material.PinkBanner; - for (int i = 8259; i <= 8274; i++) - materials[i] = Material.GrayBanner; - for (int i = 8275; i <= 8290; i++) - materials[i] = Material.LightGrayBanner; - for (int i = 8291; i <= 8306; i++) - materials[i] = Material.CyanBanner; - for (int i = 8307; i <= 8322; i++) - materials[i] = Material.PurpleBanner; - for (int i = 8323; i <= 8338; i++) - materials[i] = Material.BlueBanner; - for (int i = 8339; i <= 8354; i++) - materials[i] = Material.BrownBanner; - for (int i = 8355; i <= 8370; i++) - materials[i] = Material.GreenBanner; - for (int i = 8371; i <= 8386; i++) - materials[i] = Material.RedBanner; - for (int i = 8387; i <= 8402; i++) - materials[i] = Material.BlackBanner; - for (int i = 8403; i <= 8406; i++) - materials[i] = Material.WhiteWallBanner; - for (int i = 8407; i <= 8410; i++) - materials[i] = Material.OrangeWallBanner; - for (int i = 8411; i <= 8414; i++) - materials[i] = Material.MagentaWallBanner; - for (int i = 8415; i <= 8418; i++) - materials[i] = Material.LightBlueWallBanner; - for (int i = 8419; i <= 8422; i++) - materials[i] = Material.YellowWallBanner; - for (int i = 8423; i <= 8426; i++) - materials[i] = Material.LimeWallBanner; - for (int i = 8427; i <= 8430; i++) - materials[i] = Material.PinkWallBanner; - for (int i = 8431; i <= 8434; i++) - materials[i] = Material.GrayWallBanner; - for (int i = 8435; i <= 8438; i++) - materials[i] = Material.LightGrayWallBanner; - for (int i = 8439; i <= 8442; i++) - materials[i] = Material.CyanWallBanner; - for (int i = 8443; i <= 8446; i++) - materials[i] = Material.PurpleWallBanner; - for (int i = 8447; i <= 8450; i++) - materials[i] = Material.BlueWallBanner; - for (int i = 8451; i <= 8454; i++) - materials[i] = Material.BrownWallBanner; - for (int i = 8455; i <= 8458; i++) - materials[i] = Material.GreenWallBanner; - for (int i = 8459; i <= 8462; i++) - materials[i] = Material.RedWallBanner; - for (int i = 8463; i <= 8466; i++) - materials[i] = Material.BlackWallBanner; - materials[8467] = Material.RedSandstone; - materials[8468] = Material.ChiseledRedSandstone; - materials[8469] = Material.CutRedSandstone; - for (int i = 8470; i <= 8549; i++) - materials[i] = Material.RedSandstoneStairs; - for (int i = 8550; i <= 8555; i++) - materials[i] = Material.OakSlab; - for (int i = 8556; i <= 8561; i++) - materials[i] = Material.SpruceSlab; - for (int i = 8562; i <= 8567; i++) - materials[i] = Material.BirchSlab; - for (int i = 8568; i <= 8573; i++) - materials[i] = Material.JungleSlab; - for (int i = 8574; i <= 8579; i++) - materials[i] = Material.AcaciaSlab; - for (int i = 8580; i <= 8585; i++) - materials[i] = Material.DarkOakSlab; - for (int i = 8586; i <= 8591; i++) - materials[i] = Material.StoneSlab; - for (int i = 8592; i <= 8597; i++) - materials[i] = Material.SmoothStoneSlab; - for (int i = 8598; i <= 8603; i++) - materials[i] = Material.SandstoneSlab; - for (int i = 8604; i <= 8609; i++) - materials[i] = Material.CutSandstoneSlab; - for (int i = 8610; i <= 8615; i++) - materials[i] = Material.PetrifiedOakSlab; - for (int i = 8616; i <= 8621; i++) - materials[i] = Material.CobblestoneSlab; - for (int i = 8622; i <= 8627; i++) - materials[i] = Material.BrickSlab; - for (int i = 8628; i <= 8633; i++) - materials[i] = Material.StoneBrickSlab; - for (int i = 8634; i <= 8639; i++) - materials[i] = Material.NetherBrickSlab; - for (int i = 8640; i <= 8645; i++) - materials[i] = Material.QuartzSlab; - for (int i = 8646; i <= 8651; i++) - materials[i] = Material.RedSandstoneSlab; - for (int i = 8652; i <= 8657; i++) - materials[i] = Material.CutRedSandstoneSlab; - for (int i = 8658; i <= 8663; i++) - materials[i] = Material.PurpurSlab; - materials[8664] = Material.SmoothStone; - materials[8665] = Material.SmoothSandstone; - materials[8666] = Material.SmoothQuartz; - materials[8667] = Material.SmoothRedSandstone; - for (int i = 8668; i <= 8699; i++) - materials[i] = Material.SpruceFenceGate; - for (int i = 8700; i <= 8731; i++) - materials[i] = Material.BirchFenceGate; - for (int i = 8732; i <= 8763; i++) - materials[i] = Material.JungleFenceGate; - for (int i = 8764; i <= 8795; i++) - materials[i] = Material.AcaciaFenceGate; - for (int i = 8796; i <= 8827; i++) - materials[i] = Material.DarkOakFenceGate; - for (int i = 8828; i <= 8859; i++) - materials[i] = Material.SpruceFence; - for (int i = 8860; i <= 8891; i++) - materials[i] = Material.BirchFence; - for (int i = 8892; i <= 8923; i++) - materials[i] = Material.JungleFence; - for (int i = 8924; i <= 8955; i++) - materials[i] = Material.AcaciaFence; - for (int i = 8956; i <= 8987; i++) - materials[i] = Material.DarkOakFence; - for (int i = 8988; i <= 9051; i++) - materials[i] = Material.SpruceDoor; - for (int i = 9052; i <= 9115; i++) - materials[i] = Material.BirchDoor; - for (int i = 9116; i <= 9179; i++) - materials[i] = Material.JungleDoor; - for (int i = 9180; i <= 9243; i++) - materials[i] = Material.AcaciaDoor; - for (int i = 9244; i <= 9307; i++) - materials[i] = Material.DarkOakDoor; - for (int i = 9308; i <= 9313; i++) - materials[i] = Material.EndRod; - for (int i = 9314; i <= 9377; i++) - materials[i] = Material.ChorusPlant; - for (int i = 9378; i <= 9383; i++) - materials[i] = Material.ChorusFlower; - materials[9384] = Material.PurpurBlock; - for (int i = 9385; i <= 9387; i++) - materials[i] = Material.PurpurPillar; - for (int i = 9388; i <= 9467; i++) - materials[i] = Material.PurpurStairs; - materials[9468] = Material.EndStoneBricks; - for (int i = 9469; i <= 9472; i++) - materials[i] = Material.Beetroots; - materials[9473] = Material.DirtPath; - materials[9474] = Material.EndGateway; - for (int i = 9475; i <= 9486; i++) - materials[i] = Material.RepeatingCommandBlock; - for (int i = 9487; i <= 9498; i++) - materials[i] = Material.ChainCommandBlock; - for (int i = 9499; i <= 9502; i++) - materials[i] = Material.FrostedIce; - materials[9503] = Material.MagmaBlock; - materials[9504] = Material.NetherWartBlock; - materials[9505] = Material.RedNetherBricks; - for (int i = 9506; i <= 9508; i++) - materials[i] = Material.BoneBlock; - materials[9509] = Material.StructureVoid; - for (int i = 9510; i <= 9521; i++) - materials[i] = Material.Observer; - for (int i = 9522; i <= 9527; i++) - materials[i] = Material.ShulkerBox; - for (int i = 9528; i <= 9533; i++) - materials[i] = Material.WhiteShulkerBox; - for (int i = 9534; i <= 9539; i++) - materials[i] = Material.OrangeShulkerBox; - for (int i = 9540; i <= 9545; i++) - materials[i] = Material.MagentaShulkerBox; - for (int i = 9546; i <= 9551; i++) - materials[i] = Material.LightBlueShulkerBox; - for (int i = 9552; i <= 9557; i++) - materials[i] = Material.YellowShulkerBox; - for (int i = 9558; i <= 9563; i++) - materials[i] = Material.LimeShulkerBox; - for (int i = 9564; i <= 9569; i++) - materials[i] = Material.PinkShulkerBox; - for (int i = 9570; i <= 9575; i++) - materials[i] = Material.GrayShulkerBox; - for (int i = 9576; i <= 9581; i++) - materials[i] = Material.LightGrayShulkerBox; - for (int i = 9582; i <= 9587; i++) - materials[i] = Material.CyanShulkerBox; - for (int i = 9588; i <= 9593; i++) - materials[i] = Material.PurpleShulkerBox; - for (int i = 9594; i <= 9599; i++) - materials[i] = Material.BlueShulkerBox; - for (int i = 9600; i <= 9605; i++) - materials[i] = Material.BrownShulkerBox; - for (int i = 9606; i <= 9611; i++) - materials[i] = Material.GreenShulkerBox; - for (int i = 9612; i <= 9617; i++) - materials[i] = Material.RedShulkerBox; - for (int i = 9618; i <= 9623; i++) - materials[i] = Material.BlackShulkerBox; - for (int i = 9624; i <= 9627; i++) - materials[i] = Material.WhiteGlazedTerracotta; - for (int i = 9628; i <= 9631; i++) - materials[i] = Material.OrangeGlazedTerracotta; - for (int i = 9632; i <= 9635; i++) - materials[i] = Material.MagentaGlazedTerracotta; - for (int i = 9636; i <= 9639; i++) - materials[i] = Material.LightBlueGlazedTerracotta; - for (int i = 9640; i <= 9643; i++) - materials[i] = Material.YellowGlazedTerracotta; - for (int i = 9644; i <= 9647; i++) - materials[i] = Material.LimeGlazedTerracotta; - for (int i = 9648; i <= 9651; i++) - materials[i] = Material.PinkGlazedTerracotta; - for (int i = 9652; i <= 9655; i++) - materials[i] = Material.GrayGlazedTerracotta; - for (int i = 9656; i <= 9659; i++) - materials[i] = Material.LightGrayGlazedTerracotta; - for (int i = 9660; i <= 9663; i++) - materials[i] = Material.CyanGlazedTerracotta; - for (int i = 9664; i <= 9667; i++) - materials[i] = Material.PurpleGlazedTerracotta; - for (int i = 9668; i <= 9671; i++) - materials[i] = Material.BlueGlazedTerracotta; - for (int i = 9672; i <= 9675; i++) - materials[i] = Material.BrownGlazedTerracotta; - for (int i = 9676; i <= 9679; i++) - materials[i] = Material.GreenGlazedTerracotta; - for (int i = 9680; i <= 9683; i++) - materials[i] = Material.RedGlazedTerracotta; - for (int i = 9684; i <= 9687; i++) - materials[i] = Material.BlackGlazedTerracotta; - materials[9688] = Material.WhiteConcrete; - materials[9689] = Material.OrangeConcrete; - materials[9690] = Material.MagentaConcrete; - materials[9691] = Material.LightBlueConcrete; - materials[9692] = Material.YellowConcrete; - materials[9693] = Material.LimeConcrete; - materials[9694] = Material.PinkConcrete; - materials[9695] = Material.GrayConcrete; - materials[9696] = Material.LightGrayConcrete; - materials[9697] = Material.CyanConcrete; - materials[9698] = Material.PurpleConcrete; - materials[9699] = Material.BlueConcrete; - materials[9700] = Material.BrownConcrete; - materials[9701] = Material.GreenConcrete; - materials[9702] = Material.RedConcrete; - materials[9703] = Material.BlackConcrete; - materials[9704] = Material.WhiteConcretePowder; - materials[9705] = Material.OrangeConcretePowder; - materials[9706] = Material.MagentaConcretePowder; - materials[9707] = Material.LightBlueConcretePowder; - materials[9708] = Material.YellowConcretePowder; - materials[9709] = Material.LimeConcretePowder; - materials[9710] = Material.PinkConcretePowder; - materials[9711] = Material.GrayConcretePowder; - materials[9712] = Material.LightGrayConcretePowder; - materials[9713] = Material.CyanConcretePowder; - materials[9714] = Material.PurpleConcretePowder; - materials[9715] = Material.BlueConcretePowder; - materials[9716] = Material.BrownConcretePowder; - materials[9717] = Material.GreenConcretePowder; - materials[9718] = Material.RedConcretePowder; - materials[9719] = Material.BlackConcretePowder; - for (int i = 9720; i <= 9745; i++) - materials[i] = Material.Kelp; - materials[9746] = Material.KelpPlant; - materials[9747] = Material.DriedKelpBlock; - for (int i = 9748; i <= 9759; i++) - materials[i] = Material.TurtleEgg; - materials[9760] = Material.DeadTubeCoralBlock; - materials[9761] = Material.DeadBrainCoralBlock; - materials[9762] = Material.DeadBubbleCoralBlock; - materials[9763] = Material.DeadFireCoralBlock; - materials[9764] = Material.DeadHornCoralBlock; - materials[9765] = Material.TubeCoralBlock; - materials[9766] = Material.BrainCoralBlock; - materials[9767] = Material.BubbleCoralBlock; - materials[9768] = Material.FireCoralBlock; - materials[9769] = Material.HornCoralBlock; - for (int i = 9770; i <= 9771; i++) - materials[i] = Material.DeadTubeCoral; - for (int i = 9772; i <= 9773; i++) - materials[i] = Material.DeadBrainCoral; - for (int i = 9774; i <= 9775; i++) - materials[i] = Material.DeadBubbleCoral; - for (int i = 9776; i <= 9777; i++) - materials[i] = Material.DeadFireCoral; - for (int i = 9778; i <= 9779; i++) - materials[i] = Material.DeadHornCoral; - for (int i = 9780; i <= 9781; i++) - materials[i] = Material.TubeCoral; - for (int i = 9782; i <= 9783; i++) - materials[i] = Material.BrainCoral; - for (int i = 9784; i <= 9785; i++) - materials[i] = Material.BubbleCoral; - for (int i = 9786; i <= 9787; i++) - materials[i] = Material.FireCoral; - for (int i = 9788; i <= 9789; i++) - materials[i] = Material.HornCoral; - for (int i = 9790; i <= 9791; i++) - materials[i] = Material.DeadTubeCoralFan; - for (int i = 9792; i <= 9793; i++) - materials[i] = Material.DeadBrainCoralFan; - for (int i = 9794; i <= 9795; i++) - materials[i] = Material.DeadBubbleCoralFan; - for (int i = 9796; i <= 9797; i++) - materials[i] = Material.DeadFireCoralFan; - for (int i = 9798; i <= 9799; i++) - materials[i] = Material.DeadHornCoralFan; - for (int i = 9800; i <= 9801; i++) - materials[i] = Material.TubeCoralFan; - for (int i = 9802; i <= 9803; i++) - materials[i] = Material.BrainCoralFan; - for (int i = 9804; i <= 9805; i++) - materials[i] = Material.BubbleCoralFan; - for (int i = 9806; i <= 9807; i++) - materials[i] = Material.FireCoralFan; - for (int i = 9808; i <= 9809; i++) - materials[i] = Material.HornCoralFan; - for (int i = 9810; i <= 9817; i++) - materials[i] = Material.DeadTubeCoralWallFan; - for (int i = 9818; i <= 9825; i++) - materials[i] = Material.DeadBrainCoralWallFan; - for (int i = 9826; i <= 9833; i++) - materials[i] = Material.DeadBubbleCoralWallFan; - for (int i = 9834; i <= 9841; i++) - materials[i] = Material.DeadFireCoralWallFan; - for (int i = 9842; i <= 9849; i++) - materials[i] = Material.DeadHornCoralWallFan; - for (int i = 9850; i <= 9857; i++) - materials[i] = Material.TubeCoralWallFan; - for (int i = 9858; i <= 9865; i++) - materials[i] = Material.BrainCoralWallFan; - for (int i = 9866; i <= 9873; i++) - materials[i] = Material.BubbleCoralWallFan; - for (int i = 9874; i <= 9881; i++) - materials[i] = Material.FireCoralWallFan; - for (int i = 9882; i <= 9889; i++) - materials[i] = Material.HornCoralWallFan; - for (int i = 9890; i <= 9897; i++) - materials[i] = Material.SeaPickle; - materials[9898] = Material.BlueIce; - for (int i = 9899; i <= 9900; i++) - materials[i] = Material.Conduit; - materials[9901] = Material.BambooSapling; - for (int i = 9902; i <= 9913; i++) - materials[i] = Material.Bamboo; - materials[9914] = Material.PottedBamboo; - materials[9915] = Material.VoidAir; - materials[9916] = Material.CaveAir; - for (int i = 9917; i <= 9918; i++) - materials[i] = Material.BubbleColumn; - for (int i = 9919; i <= 9998; i++) - materials[i] = Material.PolishedGraniteStairs; - for (int i = 9999; i <= 10078; i++) - materials[i] = Material.SmoothRedSandstoneStairs; - for (int i = 10079; i <= 10158; i++) - materials[i] = Material.MossyStoneBrickStairs; - for (int i = 10159; i <= 10238; i++) - materials[i] = Material.PolishedDioriteStairs; - for (int i = 10239; i <= 10318; i++) - materials[i] = Material.MossyCobblestoneStairs; - for (int i = 10319; i <= 10398; i++) - materials[i] = Material.EndStoneBrickStairs; - for (int i = 10399; i <= 10478; i++) - materials[i] = Material.StoneStairs; - for (int i = 10479; i <= 10558; i++) - materials[i] = Material.SmoothSandstoneStairs; - for (int i = 10559; i <= 10638; i++) - materials[i] = Material.SmoothQuartzStairs; - for (int i = 10639; i <= 10718; i++) - materials[i] = Material.GraniteStairs; - for (int i = 10719; i <= 10798; i++) - materials[i] = Material.AndesiteStairs; - for (int i = 10799; i <= 10878; i++) - materials[i] = Material.RedNetherBrickStairs; - for (int i = 10879; i <= 10958; i++) - materials[i] = Material.PolishedAndesiteStairs; - for (int i = 10959; i <= 11038; i++) - materials[i] = Material.DioriteStairs; - for (int i = 11039; i <= 11044; i++) - materials[i] = Material.PolishedGraniteSlab; - for (int i = 11045; i <= 11050; i++) - materials[i] = Material.SmoothRedSandstoneSlab; - for (int i = 11051; i <= 11056; i++) - materials[i] = Material.MossyStoneBrickSlab; - for (int i = 11057; i <= 11062; i++) - materials[i] = Material.PolishedDioriteSlab; - for (int i = 11063; i <= 11068; i++) - materials[i] = Material.MossyCobblestoneSlab; - for (int i = 11069; i <= 11074; i++) - materials[i] = Material.EndStoneBrickSlab; - for (int i = 11075; i <= 11080; i++) - materials[i] = Material.SmoothSandstoneSlab; - for (int i = 11081; i <= 11086; i++) - materials[i] = Material.SmoothQuartzSlab; - for (int i = 11087; i <= 11092; i++) - materials[i] = Material.GraniteSlab; - for (int i = 11093; i <= 11098; i++) - materials[i] = Material.AndesiteSlab; - for (int i = 11099; i <= 11104; i++) - materials[i] = Material.RedNetherBrickSlab; - for (int i = 11105; i <= 11110; i++) - materials[i] = Material.PolishedAndesiteSlab; - for (int i = 11111; i <= 11116; i++) - materials[i] = Material.DioriteSlab; - for (int i = 11117; i <= 11440; i++) - materials[i] = Material.BrickWall; - for (int i = 11441; i <= 11764; i++) - materials[i] = Material.PrismarineWall; - for (int i = 11765; i <= 12088; i++) - materials[i] = Material.RedSandstoneWall; - for (int i = 12089; i <= 12412; i++) - materials[i] = Material.MossyStoneBrickWall; - for (int i = 12413; i <= 12736; i++) - materials[i] = Material.GraniteWall; - for (int i = 12737; i <= 13060; i++) - materials[i] = Material.StoneBrickWall; - for (int i = 13061; i <= 13384; i++) - materials[i] = Material.NetherBrickWall; - for (int i = 13385; i <= 13708; i++) - materials[i] = Material.AndesiteWall; - for (int i = 13709; i <= 14032; i++) - materials[i] = Material.RedNetherBrickWall; - for (int i = 14033; i <= 14356; i++) - materials[i] = Material.SandstoneWall; - for (int i = 14357; i <= 14680; i++) - materials[i] = Material.EndStoneBrickWall; - for (int i = 14681; i <= 15004; i++) - materials[i] = Material.DioriteWall; - for (int i = 15005; i <= 15036; i++) - materials[i] = Material.Scaffolding; - for (int i = 15037; i <= 15040; i++) - materials[i] = Material.Loom; - for (int i = 15041; i <= 15052; i++) - materials[i] = Material.Barrel; - for (int i = 15053; i <= 15060; i++) - materials[i] = Material.Smoker; - for (int i = 15061; i <= 15068; i++) - materials[i] = Material.BlastFurnace; - materials[15069] = Material.CartographyTable; - materials[15070] = Material.FletchingTable; - for (int i = 15071; i <= 15082; i++) - materials[i] = Material.Grindstone; - for (int i = 15083; i <= 15098; i++) - materials[i] = Material.Lectern; - materials[15099] = Material.SmithingTable; - for (int i = 15100; i <= 15103; i++) - materials[i] = Material.Stonecutter; - for (int i = 15104; i <= 15135; i++) - materials[i] = Material.Bell; - for (int i = 15136; i <= 15139; i++) - materials[i] = Material.Lantern; - for (int i = 15140; i <= 15143; i++) - materials[i] = Material.SoulLantern; - for (int i = 15144; i <= 15175; i++) - materials[i] = Material.Campfire; - for (int i = 15176; i <= 15207; i++) - materials[i] = Material.SoulCampfire; - for (int i = 15208; i <= 15211; i++) - materials[i] = Material.SweetBerryBush; - for (int i = 15212; i <= 15214; i++) - materials[i] = Material.WarpedStem; - for (int i = 15215; i <= 15217; i++) - materials[i] = Material.StrippedWarpedStem; - for (int i = 15218; i <= 15220; i++) - materials[i] = Material.WarpedHyphae; - for (int i = 15221; i <= 15223; i++) - materials[i] = Material.StrippedWarpedHyphae; - materials[15224] = Material.WarpedNylium; - materials[15225] = Material.WarpedFungus; - materials[15226] = Material.WarpedWartBlock; - materials[15227] = Material.WarpedRoots; - materials[15228] = Material.NetherSprouts; - for (int i = 15229; i <= 15231; i++) - materials[i] = Material.CrimsonStem; - for (int i = 15232; i <= 15234; i++) - materials[i] = Material.StrippedCrimsonStem; - for (int i = 15235; i <= 15237; i++) - materials[i] = Material.CrimsonHyphae; - for (int i = 15238; i <= 15240; i++) - materials[i] = Material.StrippedCrimsonHyphae; - materials[15241] = Material.CrimsonNylium; - materials[15242] = Material.CrimsonFungus; - materials[15243] = Material.Shroomlight; - for (int i = 15244; i <= 15269; i++) - materials[i] = Material.WeepingVines; - materials[15270] = Material.WeepingVinesPlant; - for (int i = 15271; i <= 15296; i++) - materials[i] = Material.TwistingVines; - materials[15297] = Material.TwistingVinesPlant; - materials[15298] = Material.CrimsonRoots; - materials[15299] = Material.CrimsonPlanks; - materials[15300] = Material.WarpedPlanks; - for (int i = 15301; i <= 15306; i++) - materials[i] = Material.CrimsonSlab; - for (int i = 15307; i <= 15312; i++) - materials[i] = Material.WarpedSlab; - for (int i = 15313; i <= 15314; i++) - materials[i] = Material.CrimsonPressurePlate; - for (int i = 15315; i <= 15316; i++) - materials[i] = Material.WarpedPressurePlate; - for (int i = 15317; i <= 15348; i++) - materials[i] = Material.CrimsonFence; - for (int i = 15349; i <= 15380; i++) - materials[i] = Material.WarpedFence; - for (int i = 15381; i <= 15444; i++) - materials[i] = Material.CrimsonTrapdoor; - for (int i = 15445; i <= 15508; i++) - materials[i] = Material.WarpedTrapdoor; - for (int i = 15509; i <= 15540; i++) - materials[i] = Material.CrimsonFenceGate; - for (int i = 15541; i <= 15572; i++) - materials[i] = Material.WarpedFenceGate; - for (int i = 15573; i <= 15652; i++) - materials[i] = Material.CrimsonStairs; - for (int i = 15653; i <= 15732; i++) - materials[i] = Material.WarpedStairs; - for (int i = 15733; i <= 15756; i++) - materials[i] = Material.CrimsonButton; - for (int i = 15757; i <= 15780; i++) - materials[i] = Material.WarpedButton; - for (int i = 15781; i <= 15844; i++) - materials[i] = Material.CrimsonDoor; - for (int i = 15845; i <= 15908; i++) - materials[i] = Material.WarpedDoor; - for (int i = 15909; i <= 15940; i++) - materials[i] = Material.CrimsonSign; - for (int i = 15941; i <= 15972; i++) - materials[i] = Material.WarpedSign; - for (int i = 15973; i <= 15980; i++) - materials[i] = Material.CrimsonWallSign; - for (int i = 15981; i <= 15988; i++) - materials[i] = Material.WarpedWallSign; - for (int i = 15989; i <= 15992; i++) - materials[i] = Material.StructureBlock; - for (int i = 15993; i <= 16004; i++) - materials[i] = Material.Jigsaw; - for (int i = 16005; i <= 16013; i++) - materials[i] = Material.Composter; - for (int i = 16014; i <= 16029; i++) - materials[i] = Material.Target; - for (int i = 16030; i <= 16053; i++) - materials[i] = Material.BeeNest; - for (int i = 16054; i <= 16077; i++) - materials[i] = Material.Beehive; - materials[16078] = Material.HoneyBlock; - materials[16079] = Material.HoneycombBlock; - materials[16080] = Material.NetheriteBlock; - materials[16081] = Material.AncientDebris; - materials[16082] = Material.CryingObsidian; - for (int i = 16083; i <= 16087; i++) - materials[i] = Material.RespawnAnchor; - materials[16088] = Material.PottedCrimsonFungus; - materials[16089] = Material.PottedWarpedFungus; - materials[16090] = Material.PottedCrimsonRoots; - materials[16091] = Material.PottedWarpedRoots; - materials[16092] = Material.Lodestone; - materials[16093] = Material.Blackstone; - for (int i = 16094; i <= 16173; i++) - materials[i] = Material.BlackstoneStairs; - for (int i = 16174; i <= 16497; i++) - materials[i] = Material.BlackstoneWall; - for (int i = 16498; i <= 16503; i++) - materials[i] = Material.BlackstoneSlab; - materials[16504] = Material.PolishedBlackstone; - materials[16505] = Material.PolishedBlackstoneBricks; - materials[16506] = Material.CrackedPolishedBlackstoneBricks; - materials[16507] = Material.ChiseledPolishedBlackstone; - for (int i = 16508; i <= 16513; i++) - materials[i] = Material.PolishedBlackstoneBrickSlab; - for (int i = 16514; i <= 16593; i++) - materials[i] = Material.PolishedBlackstoneBrickStairs; - for (int i = 16594; i <= 16917; i++) - materials[i] = Material.PolishedBlackstoneBrickWall; - materials[16918] = Material.GildedBlackstone; - for (int i = 16919; i <= 16998; i++) - materials[i] = Material.PolishedBlackstoneStairs; - for (int i = 16999; i <= 17004; i++) - materials[i] = Material.PolishedBlackstoneSlab; - for (int i = 17005; i <= 17006; i++) - materials[i] = Material.PolishedBlackstonePressurePlate; - for (int i = 17007; i <= 17030; i++) - materials[i] = Material.PolishedBlackstoneButton; - for (int i = 17031; i <= 17354; i++) - materials[i] = Material.PolishedBlackstoneWall; - materials[17355] = Material.ChiseledNetherBricks; - materials[17356] = Material.CrackedNetherBricks; - materials[17357] = Material.QuartzBricks; - for (int i = 17358; i <= 17373; i++) - materials[i] = Material.Candle; - for (int i = 17374; i <= 17389; i++) - materials[i] = Material.WhiteCandle; - for (int i = 17390; i <= 17405; i++) - materials[i] = Material.OrangeCandle; - for (int i = 17406; i <= 17421; i++) - materials[i] = Material.MagentaCandle; - for (int i = 17422; i <= 17437; i++) - materials[i] = Material.LightBlueCandle; - for (int i = 17438; i <= 17453; i++) - materials[i] = Material.YellowCandle; - for (int i = 17454; i <= 17469; i++) - materials[i] = Material.LimeCandle; - for (int i = 17470; i <= 17485; i++) - materials[i] = Material.PinkCandle; - for (int i = 17486; i <= 17501; i++) - materials[i] = Material.GrayCandle; - for (int i = 17502; i <= 17517; i++) - materials[i] = Material.LightGrayCandle; - for (int i = 17518; i <= 17533; i++) - materials[i] = Material.CyanCandle; - for (int i = 17534; i <= 17549; i++) - materials[i] = Material.PurpleCandle; - for (int i = 17550; i <= 17565; i++) - materials[i] = Material.BlueCandle; - for (int i = 17566; i <= 17581; i++) - materials[i] = Material.BrownCandle; - for (int i = 17582; i <= 17597; i++) - materials[i] = Material.GreenCandle; - for (int i = 17598; i <= 17613; i++) - materials[i] = Material.RedCandle; - for (int i = 17614; i <= 17629; i++) - materials[i] = Material.BlackCandle; - for (int i = 17630; i <= 17631; i++) - materials[i] = Material.CandleCake; - for (int i = 17632; i <= 17633; i++) - materials[i] = Material.WhiteCandleCake; - for (int i = 17634; i <= 17635; i++) - materials[i] = Material.OrangeCandleCake; - for (int i = 17636; i <= 17637; i++) - materials[i] = Material.MagentaCandleCake; - for (int i = 17638; i <= 17639; i++) - materials[i] = Material.LightBlueCandleCake; - for (int i = 17640; i <= 17641; i++) - materials[i] = Material.YellowCandleCake; - for (int i = 17642; i <= 17643; i++) - materials[i] = Material.LimeCandleCake; - for (int i = 17644; i <= 17645; i++) - materials[i] = Material.PinkCandleCake; - for (int i = 17646; i <= 17647; i++) - materials[i] = Material.GrayCandleCake; - for (int i = 17648; i <= 17649; i++) - materials[i] = Material.LightGrayCandleCake; - for (int i = 17650; i <= 17651; i++) - materials[i] = Material.CyanCandleCake; - for (int i = 17652; i <= 17653; i++) - materials[i] = Material.PurpleCandleCake; - for (int i = 17654; i <= 17655; i++) - materials[i] = Material.BlueCandleCake; - for (int i = 17656; i <= 17657; i++) - materials[i] = Material.BrownCandleCake; - for (int i = 17658; i <= 17659; i++) - materials[i] = Material.GreenCandleCake; - for (int i = 17660; i <= 17661; i++) - materials[i] = Material.RedCandleCake; - for (int i = 17662; i <= 17663; i++) - materials[i] = Material.BlackCandleCake; - materials[17664] = Material.AmethystBlock; - materials[17665] = Material.BuddingAmethyst; - for (int i = 17666; i <= 17677; i++) - materials[i] = Material.AmethystCluster; - for (int i = 17678; i <= 17689; i++) - materials[i] = Material.LargeAmethystBud; - for (int i = 17690; i <= 17701; i++) - materials[i] = Material.MediumAmethystBud; - for (int i = 17702; i <= 17713; i++) - materials[i] = Material.SmallAmethystBud; - materials[17714] = Material.Tuff; - materials[17715] = Material.Calcite; - materials[17716] = Material.TintedGlass; - materials[17717] = Material.PowderSnow; - for (int i = 17718; i <= 17813; i++) - materials[i] = Material.SculkSensor; - materials[17814] = Material.OxidizedCopper; - materials[17815] = Material.WeatheredCopper; - materials[17816] = Material.ExposedCopper; - materials[17817] = Material.CopperBlock; - materials[17818] = Material.CopperOre; - materials[17819] = Material.DeepslateCopperOre; - materials[17820] = Material.OxidizedCutCopper; - materials[17821] = Material.WeatheredCutCopper; - materials[17822] = Material.ExposedCutCopper; - materials[17823] = Material.CutCopper; - for (int i = 17824; i <= 17903; i++) - materials[i] = Material.OxidizedCutCopperStairs; - for (int i = 17904; i <= 17983; i++) - materials[i] = Material.WeatheredCutCopperStairs; - for (int i = 17984; i <= 18063; i++) - materials[i] = Material.ExposedCutCopperStairs; - for (int i = 18064; i <= 18143; i++) - materials[i] = Material.CutCopperStairs; - for (int i = 18144; i <= 18149; i++) - materials[i] = Material.OxidizedCutCopperSlab; - for (int i = 18150; i <= 18155; i++) - materials[i] = Material.WeatheredCutCopperSlab; - for (int i = 18156; i <= 18161; i++) - materials[i] = Material.ExposedCutCopperSlab; - for (int i = 18162; i <= 18167; i++) - materials[i] = Material.CutCopperSlab; - materials[18168] = Material.WaxedCopperBlock; - materials[18169] = Material.WaxedWeatheredCopper; - materials[18170] = Material.WaxedExposedCopper; - materials[18171] = Material.WaxedOxidizedCopper; - materials[18172] = Material.WaxedOxidizedCutCopper; - materials[18173] = Material.WaxedWeatheredCutCopper; - materials[18174] = Material.WaxedExposedCutCopper; - materials[18175] = Material.WaxedCutCopper; - for (int i = 18176; i <= 18255; i++) - materials[i] = Material.WaxedOxidizedCutCopperStairs; - for (int i = 18256; i <= 18335; i++) - materials[i] = Material.WaxedWeatheredCutCopperStairs; - for (int i = 18336; i <= 18415; i++) - materials[i] = Material.WaxedExposedCutCopperStairs; - for (int i = 18416; i <= 18495; i++) - materials[i] = Material.WaxedCutCopperStairs; - for (int i = 18496; i <= 18501; i++) - materials[i] = Material.WaxedOxidizedCutCopperSlab; - for (int i = 18502; i <= 18507; i++) - materials[i] = Material.WaxedWeatheredCutCopperSlab; - for (int i = 18508; i <= 18513; i++) - materials[i] = Material.WaxedExposedCutCopperSlab; - for (int i = 18514; i <= 18519; i++) - materials[i] = Material.WaxedCutCopperSlab; - for (int i = 18520; i <= 18543; i++) - materials[i] = Material.LightningRod; - for (int i = 18544; i <= 18563; i++) - materials[i] = Material.PointedDripstone; - materials[18564] = Material.DripstoneBlock; - for (int i = 18565; i <= 18616; i++) - materials[i] = Material.CaveVines; - for (int i = 18617; i <= 18618; i++) - materials[i] = Material.CaveVinesPlant; - materials[18619] = Material.SporeBlossom; - materials[18620] = Material.Azalea; - materials[18621] = Material.FloweringAzalea; - materials[18622] = Material.MossCarpet; - materials[18623] = Material.MossBlock; - for (int i = 18624; i <= 18655; i++) - materials[i] = Material.BigDripleaf; - for (int i = 18656; i <= 18663; i++) - materials[i] = Material.BigDripleafStem; - for (int i = 18664; i <= 18679; i++) - materials[i] = Material.SmallDripleaf; - for (int i = 18680; i <= 18681; i++) - materials[i] = Material.HangingRoots; - materials[18682] = Material.RootedDirt; - for (int i = 18683; i <= 18685; i++) - materials[i] = Material.Deepslate; - materials[18686] = Material.CobbledDeepslate; - for (int i = 18687; i <= 18766; i++) - materials[i] = Material.CobbledDeepslateStairs; - for (int i = 18767; i <= 18772; i++) - materials[i] = Material.CobbledDeepslateSlab; - for (int i = 18773; i <= 19096; i++) - materials[i] = Material.CobbledDeepslateWall; - materials[19097] = Material.PolishedDeepslate; - for (int i = 19098; i <= 19177; i++) - materials[i] = Material.PolishedDeepslateStairs; - for (int i = 19178; i <= 19183; i++) - materials[i] = Material.PolishedDeepslateSlab; - for (int i = 19184; i <= 19507; i++) - materials[i] = Material.PolishedDeepslateWall; - materials[19508] = Material.DeepslateTiles; - for (int i = 19509; i <= 19588; i++) - materials[i] = Material.DeepslateTileStairs; - for (int i = 19589; i <= 19594; i++) - materials[i] = Material.DeepslateTileSlab; - for (int i = 19595; i <= 19918; i++) - materials[i] = Material.DeepslateTileWall; - materials[19919] = Material.DeepslateBricks; - for (int i = 19920; i <= 19999; i++) - materials[i] = Material.DeepslateBrickStairs; - for (int i = 20000; i <= 20005; i++) - materials[i] = Material.DeepslateBrickSlab; - for (int i = 20006; i <= 20329; i++) - materials[i] = Material.DeepslateBrickWall; - materials[20330] = Material.ChiseledDeepslate; - materials[20331] = Material.CrackedDeepslateBricks; - materials[20332] = Material.CrackedDeepslateTiles; - for (int i = 20333; i <= 20335; i++) - materials[i] = Material.InfestedDeepslate; - materials[20336] = Material.SmoothBasalt; - materials[20337] = Material.RawIronBlock; - materials[20338] = Material.RawCopperBlock; - materials[20339] = Material.RawGoldBlock; - materials[20340] = Material.PottedAzaleaBush; - materials[20341] = Material.PottedFloweringAzaleaBush; - } - - // - private static readonly BlockStateDefinition[] stateDefinitions = - [ - new(8, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(12, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(21, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(23, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(25, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(27, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(29, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(31, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(34, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(50, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(76, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(79, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(82, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(85, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(88, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(91, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(94, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(97, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(100, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(103, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(106, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(109, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(112, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(115, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(118, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(121, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(124, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(127, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(130, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(133, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(136, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(139, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(142, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(145, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(148, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(162, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(176, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(190, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(204, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(218, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(232, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(246, 14, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 2), - new("persistent", ["true", "false"], 1) - ]), - new(266, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(281, 800, - [ - new("instrument", ["harp", "basedrum", "snare", "hat", "bass", "flute", "bell", "guitar", "chime", "xylophone", "iron_xylophone", "cow_bell", "didgeridoo", "bit", "banjo", "pling"], 50), - new("note", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"], 2), - new("powered", ["true", "false"], 1) - ]), - new(1081, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1097, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1113, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1129, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1145, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1161, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1177, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1193, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1209, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1225, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1241, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1257, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1273, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1289, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1305, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1321, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1337, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(1361, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(1385, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(1402, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(1404, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(1416, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("short", ["true", "false"], 2), - new("type", ["normal", "sticky"], 1) - ]), - new(1456, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("type", ["normal", "sticky"], 1) - ]), - new(1486, 2, - [ - new("unstable", ["true", "false"], 1) - ]), - new(1492, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(1496, 512, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(2010, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2090, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("type", ["single", "left", "right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2114, 1296, - [ - new("east", ["up", "side", "none"], 432), - new("north", ["up", "side", "none"], 144), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 9), - new("south", ["up", "side", "none"], 3), - new("west", ["up", "side", "none"], 1) - ]), - new(3414, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(3422, 8, - [ - new("moisture", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(3430, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(3438, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3470, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3502, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3534, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3566, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3598, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3630, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(3694, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3702, 20, - [ - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south", "south_east", "south_west", "north_west", "north_east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3722, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3802, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3810, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3818, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3826, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3834, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3842, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3850, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(3874, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3876, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(3940, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3942, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3944, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3946, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3948, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3950, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(3952, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(3954, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(3956, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(3958, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(3966, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(3990, 8, - [ - new("layers", ["1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(4000, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(4017, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(4033, 2, - [ - new("has_record", ["true", "false"], 1) - ]), - new(4035, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4071, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(4074, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(4078, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4083, 2, - [ - new("axis", ["x", "z"], 1) - ]), - new(4085, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4089, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4093, 7, - [ - new("bites", ["0", "1", "2", "3", "4", "5", "6"], 1) - ]), - new(4100, 64, - [ - new("delay", ["1", "2", "3", "4"], 16), - new("facing", ["north", "south", "west", "east"], 4), - new("locked", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(4180, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4244, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4308, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4372, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4436, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4500, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4574, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4638, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4702, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4766, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4798, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4804, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4837, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4841, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4845, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4853, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4861, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4893, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5021, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5053, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5133, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5213, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(5217, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5249, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5329, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(5334, 8, - [ - new("has_bottle_0", ["true", "false"], 4), - new("has_bottle_1", ["true", "false"], 2), - new("has_bottle_2", ["true", "false"], 1) - ]), - new(5343, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(5347, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(5351, 8, - [ - new("eye", ["true", "false"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5361, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5363, 12, - [ - new("age", ["0", "1", "2"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5375, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5457, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5465, 16, - [ - new("attached", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5481, 128, - [ - new("attached", ["true", "false"], 64), - new("disarmed", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("powered", ["true", "false"], 4), - new("south", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5610, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5690, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5770, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5850, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(5863, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(6187, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(6536, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(6544, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(6552, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6576, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6600, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6624, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6648, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6672, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6696, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6712, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6716, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6732, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6736, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6752, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6756, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6772, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6776, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6792, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6796, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6812, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6816, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6820, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6824, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6828, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("type", ["single", "left", "right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6852, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6868, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6884, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("mode", ["compare", "subtract"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6900, 32, - [ - new("inverted", ["true", "false"], 16), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6934, 10, - [ - new("enabled", ["true", "false"], 5), - new("facing", ["down", "north", "south", "west", "east"], 1) - ]), - new(6946, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(6949, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7029, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7053, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(7081, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7113, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7145, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7177, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7209, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7241, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7273, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7305, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7337, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7369, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7401, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7433, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7465, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7497, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7529, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7561, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7593, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7673, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7755, 32, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7787, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7854, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7934, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8014, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8094, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8100, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8106, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8113, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(8135, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(8137, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(8139, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(8141, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(8143, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(8145, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(8147, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8163, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8179, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8195, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8211, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8227, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8243, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8259, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8275, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8291, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8307, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8323, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8339, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8355, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8371, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8387, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8403, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8407, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8411, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8415, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8419, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8423, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8427, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8431, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8435, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8439, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8443, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8447, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8451, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8455, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8459, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8463, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8470, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8550, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8556, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8562, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8568, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8574, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8580, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8586, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8592, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8598, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8604, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8610, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8616, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8622, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8628, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8634, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8640, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8646, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8652, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8658, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8668, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8700, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8732, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8764, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8796, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8828, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8860, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8892, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8924, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8956, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8988, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9052, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9116, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9180, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9244, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9308, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9314, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9378, 6, - [ - new("age", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(9385, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(9388, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9469, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(9475, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9487, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9499, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(9506, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(9510, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9522, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9528, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9534, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9540, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9546, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9552, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9558, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9564, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9570, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9576, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9582, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9588, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9594, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9600, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9606, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9612, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9618, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9624, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9628, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9632, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9636, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9640, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9644, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9648, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9652, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9656, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9660, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9664, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9668, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9672, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9676, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9680, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9684, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9720, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(9748, 12, - [ - new("eggs", ["1", "2", "3", "4"], 3), - new("hatch", ["0", "1", "2"], 1) - ]), - new(9770, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9772, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9774, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9776, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9778, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9780, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9782, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9784, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9786, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9788, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9790, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9792, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9794, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9796, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9798, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9800, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9802, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9804, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9806, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9808, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9810, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9818, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9826, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9834, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9842, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9850, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9858, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9866, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9874, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9882, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9890, 8, - [ - new("pickles", ["1", "2", "3", "4"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9899, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(9902, 12, - [ - new("age", ["0", "1"], 6), - new("leaves", ["none", "small", "large"], 2), - new("stage", ["0", "1"], 1) - ]), - new(9917, 2, - [ - new("drag", ["true", "false"], 1) - ]), - new(9919, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9999, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10079, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10159, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10239, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10319, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10399, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10479, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10559, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10639, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10719, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10799, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10879, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10959, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11039, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11045, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11051, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11057, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11063, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11069, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11075, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11081, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11087, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11093, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11099, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11105, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11111, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11117, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(11441, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(11765, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(12089, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(12413, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(12737, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(13061, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(13385, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(13709, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14033, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14357, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14681, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15005, 32, - [ - new("bottom", ["true", "false"], 16), - new("distance", ["0", "1", "2", "3", "4", "5", "6", "7"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15037, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(15041, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("open", ["true", "false"], 1) - ]), - new(15053, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(15061, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(15071, 12, - [ - new("face", ["floor", "wall", "ceiling"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(15083, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("has_book", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(15100, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(15104, 32, - [ - new("attachment", ["floor", "ceiling", "single_wall", "double_wall"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(15136, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15140, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15144, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15176, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15208, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(15212, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(15215, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(15218, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(15221, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(15229, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(15232, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(15235, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(15238, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(15244, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(15271, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(15301, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15307, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15313, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(15315, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(15317, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(15349, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(15381, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15445, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15509, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(15541, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(15573, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15653, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15733, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(15757, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(15781, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(15845, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(15909, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15941, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15973, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15981, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15989, 4, - [ - new("mode", ["save", "load", "corner", "data"], 1) - ]), - new(15993, 12, - [ - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 1) - ]), - new(16005, 9, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(16014, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(16030, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(16054, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(16083, 5, - [ - new("charges", ["0", "1", "2", "3", "4"], 1) - ]), - new(16094, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16174, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16498, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16508, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16514, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16594, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16919, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16999, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17005, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(17007, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(17031, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17358, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17374, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17390, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17406, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17422, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17438, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17454, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17470, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17486, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17502, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17518, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17534, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17550, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17566, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17582, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17598, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17614, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17630, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(17632, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(17634, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(17636, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(17638, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(17640, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(17642, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(17644, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(17646, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(17648, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(17650, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(17652, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(17654, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(17656, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(17658, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(17660, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(17662, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(17666, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17678, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17690, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17702, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17718, 96, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17824, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17904, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17984, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18064, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18144, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18150, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18156, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18162, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18176, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18256, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18336, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18416, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18496, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18502, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18508, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18514, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18520, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18544, 20, - [ - new("thickness", ["tip_merge", "tip", "frustum", "middle", "base"], 4), - new("vertical_direction", ["up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18565, 52, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 2), - new("berries", ["true", "false"], 1) - ]), - new(18617, 2, - [ - new("berries", ["true", "false"], 1) - ]), - new(18624, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("tilt", ["none", "unstable", "partial", "full"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18656, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18664, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("half", ["upper", "lower"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18680, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(18683, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18687, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18767, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18773, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19098, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19178, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19184, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19509, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19589, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19595, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19920, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20000, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20006, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20333, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - ]; - // - - protected override Dictionary GetDict() - { - return materials; - } - - protected override BlockStateDefinition[] GetStateDefinitions() - { - return stateDefinitions; - } - } -} diff --git a/MinecraftClient/Mapping/BlockPalettes/Palette119.cs b/MinecraftClient/Mapping/BlockPalettes/Palette119.cs deleted file mode 100644 index 952bcecd0a..0000000000 --- a/MinecraftClient/Mapping/BlockPalettes/Palette119.cs +++ /dev/null @@ -1,4660 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.BlockPalettes -{ - public class Palette119 : BlockPalette - { - private static readonly Dictionary materials = new(); - - static Palette119() - { - for (int i = 7035; i <= 7058; i++) - materials[i] = Material.AcaciaButton; - for (int i = 9747; i <= 9810; i++) - materials[i] = Material.AcaciaDoor; - for (int i = 9459; i <= 9490; i++) - materials[i] = Material.AcaciaFence; - for (int i = 9267; i <= 9298; i++) - materials[i] = Material.AcaciaFenceGate; - for (int i = 318; i <= 345; i++) - materials[i] = Material.AcaciaLeaves; - for (int i = 129; i <= 131; i++) - materials[i] = Material.AcaciaLog; - materials[19] = Material.AcaciaPlanks; - for (int i = 4186; i <= 4187; i++) - materials[i] = Material.AcaciaPressurePlate; - for (int i = 30; i <= 31; i++) - materials[i] = Material.AcaciaSapling; - for (int i = 3732; i <= 3763; i++) - materials[i] = Material.AcaciaSign; - for (int i = 9065; i <= 9070; i++) - materials[i] = Material.AcaciaSlab; - for (int i = 8004; i <= 8083; i++) - materials[i] = Material.AcaciaStairs; - for (int i = 4676; i <= 4739; i++) - materials[i] = Material.AcaciaTrapdoor; - for (int i = 4056; i <= 4063; i++) - materials[i] = Material.AcaciaWallSign; - for (int i = 176; i <= 178; i++) - materials[i] = Material.AcaciaWood; - for (int i = 7440; i <= 7463; i++) - materials[i] = Material.ActivatorRail; - materials[0] = Material.Air; - materials[1669] = Material.Allium; - materials[18619] = Material.AmethystBlock; - for (int i = 18621; i <= 18632; i++) - materials[i] = Material.AmethystCluster; - materials[17036] = Material.AncientDebris; - materials[6] = Material.Andesite; - for (int i = 11724; i <= 11729; i++) - materials[i] = Material.AndesiteSlab; - for (int i = 11350; i <= 11429; i++) - materials[i] = Material.AndesiteStairs; - for (int i = 14340; i <= 14663; i++) - materials[i] = Material.AndesiteWall; - for (int i = 7227; i <= 7230; i++) - materials[i] = Material.Anvil; - for (int i = 5147; i <= 5150; i++) - materials[i] = Material.AttachedMelonStem; - for (int i = 5143; i <= 5146; i++) - materials[i] = Material.AttachedPumpkinStem; - materials[19714] = Material.Azalea; - for (int i = 402; i <= 429; i++) - materials[i] = Material.AzaleaLeaves; - materials[1670] = Material.AzureBluet; - for (int i = 10533; i <= 10544; i++) - materials[i] = Material.Bamboo; - materials[10532] = Material.BambooSapling; - for (int i = 15996; i <= 16007; i++) - materials[i] = Material.Barrel; - materials[8245] = Material.Barrier; - for (int i = 4311; i <= 4313; i++) - materials[i] = Material.Basalt; - materials[6248] = Material.Beacon; - materials[74] = Material.Bedrock; - for (int i = 16985; i <= 17008; i++) - materials[i] = Material.BeeNest; - for (int i = 17009; i <= 17032; i++) - materials[i] = Material.Beehive; - for (int i = 10100; i <= 10103; i++) - materials[i] = Material.Beetroots; - for (int i = 16059; i <= 16090; i++) - materials[i] = Material.Bell; - for (int i = 19718; i <= 19749; i++) - materials[i] = Material.BigDripleaf; - for (int i = 19750; i <= 19757; i++) - materials[i] = Material.BigDripleafStem; - for (int i = 6987; i <= 7010; i++) - materials[i] = Material.BirchButton; - for (int i = 9619; i <= 9682; i++) - materials[i] = Material.BirchDoor; - for (int i = 9395; i <= 9426; i++) - materials[i] = Material.BirchFence; - for (int i = 9203; i <= 9234; i++) - materials[i] = Material.BirchFenceGate; - for (int i = 262; i <= 289; i++) - materials[i] = Material.BirchLeaves; - for (int i = 123; i <= 125; i++) - materials[i] = Material.BirchLog; - materials[17] = Material.BirchPlanks; - for (int i = 4182; i <= 4183; i++) - materials[i] = Material.BirchPressurePlate; - for (int i = 26; i <= 27; i++) - materials[i] = Material.BirchSapling; - for (int i = 3700; i <= 3731; i++) - materials[i] = Material.BirchSign; - for (int i = 9053; i <= 9058; i++) - materials[i] = Material.BirchSlab; - for (int i = 6076; i <= 6155; i++) - materials[i] = Material.BirchStairs; - for (int i = 4548; i <= 4611; i++) - materials[i] = Material.BirchTrapdoor; - for (int i = 4048; i <= 4055; i++) - materials[i] = Material.BirchWallSign; - for (int i = 170; i <= 172; i++) - materials[i] = Material.BirchWood; - for (int i = 8878; i <= 8893; i++) - materials[i] = Material.BlackBanner; - for (int i = 1519; i <= 1534; i++) - materials[i] = Material.BlackBed; - for (int i = 18569; i <= 18584; i++) - materials[i] = Material.BlackCandle; - for (int i = 18617; i <= 18618; i++) - materials[i] = Material.BlackCandleCake; - materials[8622] = Material.BlackCarpet; - materials[10334] = Material.BlackConcrete; - materials[10350] = Material.BlackConcretePowder; - for (int i = 10315; i <= 10318; i++) - materials[i] = Material.BlackGlazedTerracotta; - for (int i = 10249; i <= 10254; i++) - materials[i] = Material.BlackShulkerBox; - materials[4419] = Material.BlackStainedGlass; - for (int i = 7972; i <= 8003; i++) - materials[i] = Material.BlackStainedGlassPane; - materials[7491] = Material.BlackTerracotta; - for (int i = 8954; i <= 8957; i++) - materials[i] = Material.BlackWallBanner; - materials[1653] = Material.BlackWool; - materials[17048] = Material.Blackstone; - for (int i = 17453; i <= 17458; i++) - materials[i] = Material.BlackstoneSlab; - for (int i = 17049; i <= 17128; i++) - materials[i] = Material.BlackstoneStairs; - for (int i = 17129; i <= 17452; i++) - materials[i] = Material.BlackstoneWall; - for (int i = 16016; i <= 16023; i++) - materials[i] = Material.BlastFurnace; - for (int i = 8814; i <= 8829; i++) - materials[i] = Material.BlueBanner; - for (int i = 1455; i <= 1470; i++) - materials[i] = Material.BlueBed; - for (int i = 18505; i <= 18520; i++) - materials[i] = Material.BlueCandle; - for (int i = 18609; i <= 18610; i++) - materials[i] = Material.BlueCandleCake; - materials[8618] = Material.BlueCarpet; - materials[10330] = Material.BlueConcrete; - materials[10346] = Material.BlueConcretePowder; - for (int i = 10299; i <= 10302; i++) - materials[i] = Material.BlueGlazedTerracotta; - materials[10529] = Material.BlueIce; - materials[1668] = Material.BlueOrchid; - for (int i = 10225; i <= 10230; i++) - materials[i] = Material.BlueShulkerBox; - materials[4415] = Material.BlueStainedGlass; - for (int i = 7844; i <= 7875; i++) - materials[i] = Material.BlueStainedGlassPane; - materials[7487] = Material.BlueTerracotta; - for (int i = 8938; i <= 8941; i++) - materials[i] = Material.BlueWallBanner; - materials[1649] = Material.BlueWool; - for (int i = 10137; i <= 10139; i++) - materials[i] = Material.BoneBlock; - materials[1686] = Material.Bookshelf; - for (int i = 10413; i <= 10414; i++) - materials[i] = Material.BrainCoral; - materials[10397] = Material.BrainCoralBlock; - for (int i = 10433; i <= 10434; i++) - materials[i] = Material.BrainCoralFan; - for (int i = 10489; i <= 10496; i++) - materials[i] = Material.BrainCoralWallFan; - for (int i = 5720; i <= 5727; i++) - materials[i] = Material.BrewingStand; - for (int i = 9119; i <= 9124; i++) - materials[i] = Material.BrickSlab; - for (int i = 5359; i <= 5438; i++) - materials[i] = Material.BrickStairs; - for (int i = 11748; i <= 12071; i++) - materials[i] = Material.BrickWall; - materials[1683] = Material.Bricks; - for (int i = 8830; i <= 8845; i++) - materials[i] = Material.BrownBanner; - for (int i = 1471; i <= 1486; i++) - materials[i] = Material.BrownBed; - for (int i = 18521; i <= 18536; i++) - materials[i] = Material.BrownCandle; - for (int i = 18611; i <= 18612; i++) - materials[i] = Material.BrownCandleCake; - materials[8619] = Material.BrownCarpet; - materials[10331] = Material.BrownConcrete; - materials[10347] = Material.BrownConcretePowder; - for (int i = 10303; i <= 10306; i++) - materials[i] = Material.BrownGlazedTerracotta; - materials[1679] = Material.BrownMushroom; - for (int i = 4880; i <= 4943; i++) - materials[i] = Material.BrownMushroomBlock; - for (int i = 10231; i <= 10236; i++) - materials[i] = Material.BrownShulkerBox; - materials[4416] = Material.BrownStainedGlass; - for (int i = 7876; i <= 7907; i++) - materials[i] = Material.BrownStainedGlassPane; - materials[7488] = Material.BrownTerracotta; - for (int i = 8942; i <= 8945; i++) - materials[i] = Material.BrownWallBanner; - materials[1650] = Material.BrownWool; - for (int i = 10548; i <= 10549; i++) - materials[i] = Material.BubbleColumn; - for (int i = 10415; i <= 10416; i++) - materials[i] = Material.BubbleCoral; - materials[10398] = Material.BubbleCoralBlock; - for (int i = 10435; i <= 10436; i++) - materials[i] = Material.BubbleCoralFan; - for (int i = 10497; i <= 10504; i++) - materials[i] = Material.BubbleCoralWallFan; - materials[18620] = Material.BuddingAmethyst; - for (int i = 4240; i <= 4255; i++) - materials[i] = Material.Cactus; - for (int i = 4333; i <= 4339; i++) - materials[i] = Material.Cake; - materials[18670] = Material.Calcite; - for (int i = 16099; i <= 16130; i++) - materials[i] = Material.Campfire; - for (int i = 18313; i <= 18328; i++) - materials[i] = Material.Candle; - for (int i = 18585; i <= 18586; i++) - materials[i] = Material.CandleCake; - for (int i = 6923; i <= 6930; i++) - materials[i] = Material.Carrots; - materials[16024] = Material.CartographyTable; - for (int i = 4325; i <= 4328; i++) - materials[i] = Material.CarvedPumpkin; - materials[5728] = Material.Cauldron; - materials[10547] = Material.CaveAir; - for (int i = 19659; i <= 19710; i++) - materials[i] = Material.CaveVines; - for (int i = 19711; i <= 19712; i++) - materials[i] = Material.CaveVinesPlant; - for (int i = 5104; i <= 5109; i++) - materials[i] = Material.Chain; - for (int i = 10118; i <= 10129; i++) - materials[i] = Material.ChainCommandBlock; - for (int i = 2288; i <= 2311; i++) - materials[i] = Material.Chest; - for (int i = 7231; i <= 7234; i++) - materials[i] = Material.ChippedAnvil; - materials[21425] = Material.ChiseledDeepslate; - materials[18310] = Material.ChiseledNetherBricks; - materials[17462] = Material.ChiseledPolishedBlackstone; - materials[7356] = Material.ChiseledQuartzBlock; - materials[8959] = Material.ChiseledRedSandstone; - materials[477] = Material.ChiseledSandstone; - materials[4871] = Material.ChiseledStoneBricks; - for (int i = 10009; i <= 10014; i++) - materials[i] = Material.ChorusFlower; - for (int i = 9945; i <= 10008; i++) - materials[i] = Material.ChorusPlant; - materials[4256] = Material.Clay; - materials[8624] = Material.CoalBlock; - materials[114] = Material.CoalOre; - materials[11] = Material.CoarseDirt; - materials[19781] = Material.CobbledDeepslate; - for (int i = 19862; i <= 19867; i++) - materials[i] = Material.CobbledDeepslateSlab; - for (int i = 19782; i <= 19861; i++) - materials[i] = Material.CobbledDeepslateStairs; - for (int i = 19868; i <= 20191; i++) - materials[i] = Material.CobbledDeepslateWall; - materials[14] = Material.Cobblestone; - for (int i = 9113; i <= 9118; i++) - materials[i] = Material.CobblestoneSlab; - for (int i = 3952; i <= 4031; i++) - materials[i] = Material.CobblestoneStairs; - for (int i = 6249; i <= 6572; i++) - materials[i] = Material.CobblestoneWall; - materials[1595] = Material.Cobweb; - for (int i = 5749; i <= 5760; i++) - materials[i] = Material.Cocoa; - for (int i = 6236; i <= 6247; i++) - materials[i] = Material.CommandBlock; - for (int i = 7295; i <= 7310; i++) - materials[i] = Material.Comparator; - for (int i = 16960; i <= 16968; i++) - materials[i] = Material.Composter; - for (int i = 10530; i <= 10531; i++) - materials[i] = Material.Conduit; - materials[18911] = Material.CopperBlock; - materials[18912] = Material.CopperOre; - materials[1676] = Material.Cornflower; - materials[21426] = Material.CrackedDeepslateBricks; - materials[21427] = Material.CrackedDeepslateTiles; - materials[18311] = Material.CrackedNetherBricks; - materials[17461] = Material.CrackedPolishedBlackstoneBricks; - materials[4870] = Material.CrackedStoneBricks; - materials[3611] = Material.CraftingTable; - for (int i = 7187; i <= 7202; i++) - materials[i] = Material.CreeperHead; - for (int i = 7203; i <= 7206; i++) - materials[i] = Material.CreeperWallHead; - for (int i = 16688; i <= 16711; i++) - materials[i] = Material.CrimsonButton; - for (int i = 16736; i <= 16799; i++) - materials[i] = Material.CrimsonDoor; - for (int i = 16272; i <= 16303; i++) - materials[i] = Material.CrimsonFence; - for (int i = 16464; i <= 16495; i++) - materials[i] = Material.CrimsonFenceGate; - materials[16197] = Material.CrimsonFungus; - for (int i = 16190; i <= 16192; i++) - materials[i] = Material.CrimsonHyphae; - materials[16196] = Material.CrimsonNylium; - materials[16254] = Material.CrimsonPlanks; - for (int i = 16268; i <= 16269; i++) - materials[i] = Material.CrimsonPressurePlate; - materials[16253] = Material.CrimsonRoots; - for (int i = 16864; i <= 16895; i++) - materials[i] = Material.CrimsonSign; - for (int i = 16256; i <= 16261; i++) - materials[i] = Material.CrimsonSlab; - for (int i = 16528; i <= 16607; i++) - materials[i] = Material.CrimsonStairs; - for (int i = 16184; i <= 16186; i++) - materials[i] = Material.CrimsonStem; - for (int i = 16336; i <= 16399; i++) - materials[i] = Material.CrimsonTrapdoor; - for (int i = 16928; i <= 16935; i++) - materials[i] = Material.CrimsonWallSign; - materials[17037] = Material.CryingObsidian; - materials[18917] = Material.CutCopper; - for (int i = 19256; i <= 19261; i++) - materials[i] = Material.CutCopperSlab; - for (int i = 19158; i <= 19237; i++) - materials[i] = Material.CutCopperStairs; - materials[8960] = Material.CutRedSandstone; - for (int i = 9155; i <= 9160; i++) - materials[i] = Material.CutRedSandstoneSlab; - materials[478] = Material.CutSandstone; - for (int i = 9101; i <= 9106; i++) - materials[i] = Material.CutSandstoneSlab; - for (int i = 8782; i <= 8797; i++) - materials[i] = Material.CyanBanner; - for (int i = 1423; i <= 1438; i++) - materials[i] = Material.CyanBed; - for (int i = 18473; i <= 18488; i++) - materials[i] = Material.CyanCandle; - for (int i = 18605; i <= 18606; i++) - materials[i] = Material.CyanCandleCake; - materials[8616] = Material.CyanCarpet; - materials[10328] = Material.CyanConcrete; - materials[10344] = Material.CyanConcretePowder; - for (int i = 10291; i <= 10294; i++) - materials[i] = Material.CyanGlazedTerracotta; - for (int i = 10213; i <= 10218; i++) - materials[i] = Material.CyanShulkerBox; - materials[4413] = Material.CyanStainedGlass; - for (int i = 7780; i <= 7811; i++) - materials[i] = Material.CyanStainedGlassPane; - materials[7485] = Material.CyanTerracotta; - for (int i = 8930; i <= 8933; i++) - materials[i] = Material.CyanWallBanner; - materials[1647] = Material.CyanWool; - for (int i = 7235; i <= 7238; i++) - materials[i] = Material.DamagedAnvil; - materials[1666] = Material.Dandelion; - for (int i = 7059; i <= 7082; i++) - materials[i] = Material.DarkOakButton; - for (int i = 9811; i <= 9874; i++) - materials[i] = Material.DarkOakDoor; - for (int i = 9491; i <= 9522; i++) - materials[i] = Material.DarkOakFence; - for (int i = 9299; i <= 9330; i++) - materials[i] = Material.DarkOakFenceGate; - for (int i = 346; i <= 373; i++) - materials[i] = Material.DarkOakLeaves; - for (int i = 132; i <= 134; i++) - materials[i] = Material.DarkOakLog; - materials[20] = Material.DarkOakPlanks; - for (int i = 4188; i <= 4189; i++) - materials[i] = Material.DarkOakPressurePlate; - for (int i = 32; i <= 33; i++) - materials[i] = Material.DarkOakSapling; - for (int i = 3796; i <= 3827; i++) - materials[i] = Material.DarkOakSign; - for (int i = 9071; i <= 9076; i++) - materials[i] = Material.DarkOakSlab; - for (int i = 8084; i <= 8163; i++) - materials[i] = Material.DarkOakStairs; - for (int i = 4740; i <= 4803; i++) - materials[i] = Material.DarkOakTrapdoor; - for (int i = 4072; i <= 4079; i++) - materials[i] = Material.DarkOakWallSign; - for (int i = 179; i <= 181; i++) - materials[i] = Material.DarkOakWood; - materials[8344] = Material.DarkPrismarine; - for (int i = 8597; i <= 8602; i++) - materials[i] = Material.DarkPrismarineSlab; - for (int i = 8505; i <= 8584; i++) - materials[i] = Material.DarkPrismarineStairs; - for (int i = 7311; i <= 7342; i++) - materials[i] = Material.DaylightDetector; - for (int i = 10403; i <= 10404; i++) - materials[i] = Material.DeadBrainCoral; - materials[10392] = Material.DeadBrainCoralBlock; - for (int i = 10423; i <= 10424; i++) - materials[i] = Material.DeadBrainCoralFan; - for (int i = 10449; i <= 10456; i++) - materials[i] = Material.DeadBrainCoralWallFan; - for (int i = 10405; i <= 10406; i++) - materials[i] = Material.DeadBubbleCoral; - materials[10393] = Material.DeadBubbleCoralBlock; - for (int i = 10425; i <= 10426; i++) - materials[i] = Material.DeadBubbleCoralFan; - for (int i = 10457; i <= 10464; i++) - materials[i] = Material.DeadBubbleCoralWallFan; - materials[1598] = Material.DeadBush; - for (int i = 10407; i <= 10408; i++) - materials[i] = Material.DeadFireCoral; - materials[10394] = Material.DeadFireCoralBlock; - for (int i = 10427; i <= 10428; i++) - materials[i] = Material.DeadFireCoralFan; - for (int i = 10465; i <= 10472; i++) - materials[i] = Material.DeadFireCoralWallFan; - for (int i = 10409; i <= 10410; i++) - materials[i] = Material.DeadHornCoral; - materials[10395] = Material.DeadHornCoralBlock; - for (int i = 10429; i <= 10430; i++) - materials[i] = Material.DeadHornCoralFan; - for (int i = 10473; i <= 10480; i++) - materials[i] = Material.DeadHornCoralWallFan; - for (int i = 10401; i <= 10402; i++) - materials[i] = Material.DeadTubeCoral; - materials[10391] = Material.DeadTubeCoralBlock; - for (int i = 10421; i <= 10422; i++) - materials[i] = Material.DeadTubeCoralFan; - for (int i = 10441; i <= 10448; i++) - materials[i] = Material.DeadTubeCoralWallFan; - for (int i = 19778; i <= 19780; i++) - materials[i] = Material.Deepslate; - for (int i = 21095; i <= 21100; i++) - materials[i] = Material.DeepslateBrickSlab; - for (int i = 21015; i <= 21094; i++) - materials[i] = Material.DeepslateBrickStairs; - for (int i = 21101; i <= 21424; i++) - materials[i] = Material.DeepslateBrickWall; - materials[21014] = Material.DeepslateBricks; - materials[115] = Material.DeepslateCoalOre; - materials[18913] = Material.DeepslateCopperOre; - materials[3609] = Material.DeepslateDiamondOre; - materials[5842] = Material.DeepslateEmeraldOre; - materials[111] = Material.DeepslateGoldOre; - materials[113] = Material.DeepslateIronOre; - materials[462] = Material.DeepslateLapisOre; - for (int i = 4194; i <= 4195; i++) - materials[i] = Material.DeepslateRedstoneOre; - for (int i = 20684; i <= 20689; i++) - materials[i] = Material.DeepslateTileSlab; - for (int i = 20604; i <= 20683; i++) - materials[i] = Material.DeepslateTileStairs; - for (int i = 20690; i <= 21013; i++) - materials[i] = Material.DeepslateTileWall; - materials[20603] = Material.DeepslateTiles; - for (int i = 1559; i <= 1582; i++) - materials[i] = Material.DetectorRail; - materials[3610] = Material.DiamondBlock; - materials[3608] = Material.DiamondOre; - materials[4] = Material.Diorite; - for (int i = 11742; i <= 11747; i++) - materials[i] = Material.DioriteSlab; - for (int i = 11590; i <= 11669; i++) - materials[i] = Material.DioriteStairs; - for (int i = 15636; i <= 15959; i++) - materials[i] = Material.DioriteWall; - materials[10] = Material.Dirt; - materials[10104] = Material.DirtPath; - for (int i = 464; i <= 475; i++) - materials[i] = Material.Dispenser; - materials[5746] = Material.DragonEgg; - for (int i = 7207; i <= 7222; i++) - materials[i] = Material.DragonHead; - for (int i = 7223; i <= 7226; i++) - materials[i] = Material.DragonWallHead; - materials[10378] = Material.DriedKelpBlock; - materials[19658] = Material.DripstoneBlock; - for (int i = 7464; i <= 7475; i++) - materials[i] = Material.Dropper; - materials[5995] = Material.EmeraldBlock; - materials[5841] = Material.EmeraldOre; - materials[5719] = Material.EnchantingTable; - materials[10105] = Material.EndGateway; - materials[5736] = Material.EndPortal; - for (int i = 5737; i <= 5744; i++) - materials[i] = Material.EndPortalFrame; - for (int i = 9939; i <= 9944; i++) - materials[i] = Material.EndRod; - materials[5745] = Material.EndStone; - for (int i = 11700; i <= 11705; i++) - materials[i] = Material.EndStoneBrickSlab; - for (int i = 10950; i <= 11029; i++) - materials[i] = Material.EndStoneBrickStairs; - for (int i = 15312; i <= 15635; i++) - materials[i] = Material.EndStoneBrickWall; - materials[10099] = Material.EndStoneBricks; - for (int i = 5843; i <= 5850; i++) - materials[i] = Material.EnderChest; - materials[18910] = Material.ExposedCopper; - materials[18916] = Material.ExposedCutCopper; - for (int i = 19250; i <= 19255; i++) - materials[i] = Material.ExposedCutCopperSlab; - for (int i = 19078; i <= 19157; i++) - materials[i] = Material.ExposedCutCopperStairs; - for (int i = 3620; i <= 3627; i++) - materials[i] = Material.Farmland; - materials[1597] = Material.Fern; - for (int i = 1694; i <= 2205; i++) - materials[i] = Material.Fire; - for (int i = 10417; i <= 10418; i++) - materials[i] = Material.FireCoral; - materials[10399] = Material.FireCoralBlock; - for (int i = 10437; i <= 10438; i++) - materials[i] = Material.FireCoralFan; - for (int i = 10505; i <= 10512; i++) - materials[i] = Material.FireCoralWallFan; - materials[16025] = Material.FletchingTable; - materials[6897] = Material.FlowerPot; - materials[19715] = Material.FloweringAzalea; - for (int i = 430; i <= 457; i++) - materials[i] = Material.FloweringAzaleaLeaves; - materials[21446] = Material.Frogspawn; - for (int i = 10130; i <= 10133; i++) - materials[i] = Material.FrostedIce; - for (int i = 3628; i <= 3635; i++) - materials[i] = Material.Furnace; - materials[17873] = Material.GildedBlackstone; - materials[460] = Material.Glass; - for (int i = 5110; i <= 5141; i++) - materials[i] = Material.GlassPane; - for (int i = 5199; i <= 5326; i++) - materials[i] = Material.GlowLichen; - materials[4322] = Material.Glowstone; - materials[1681] = Material.GoldBlock; - materials[110] = Material.GoldOre; - materials[2] = Material.Granite; - for (int i = 11718; i <= 11723; i++) - materials[i] = Material.GraniteSlab; - for (int i = 11270; i <= 11349; i++) - materials[i] = Material.GraniteStairs; - for (int i = 13044; i <= 13367; i++) - materials[i] = Material.GraniteWall; - materials[1596] = Material.ShortGrass; - for (int i = 8; i <= 9; i++) - materials[i] = Material.GrassBlock; - materials[109] = Material.Gravel; - for (int i = 8750; i <= 8765; i++) - materials[i] = Material.GrayBanner; - for (int i = 1391; i <= 1406; i++) - materials[i] = Material.GrayBed; - for (int i = 18441; i <= 18456; i++) - materials[i] = Material.GrayCandle; - for (int i = 18601; i <= 18602; i++) - materials[i] = Material.GrayCandleCake; - materials[8614] = Material.GrayCarpet; - materials[10326] = Material.GrayConcrete; - materials[10342] = Material.GrayConcretePowder; - for (int i = 10283; i <= 10286; i++) - materials[i] = Material.GrayGlazedTerracotta; - for (int i = 10201; i <= 10206; i++) - materials[i] = Material.GrayShulkerBox; - materials[4411] = Material.GrayStainedGlass; - for (int i = 7716; i <= 7747; i++) - materials[i] = Material.GrayStainedGlassPane; - materials[7483] = Material.GrayTerracotta; - for (int i = 8922; i <= 8925; i++) - materials[i] = Material.GrayWallBanner; - materials[1645] = Material.GrayWool; - for (int i = 8846; i <= 8861; i++) - materials[i] = Material.GreenBanner; - for (int i = 1487; i <= 1502; i++) - materials[i] = Material.GreenBed; - for (int i = 18537; i <= 18552; i++) - materials[i] = Material.GreenCandle; - for (int i = 18613; i <= 18614; i++) - materials[i] = Material.GreenCandleCake; - materials[8620] = Material.GreenCarpet; - materials[10332] = Material.GreenConcrete; - materials[10348] = Material.GreenConcretePowder; - for (int i = 10307; i <= 10310; i++) - materials[i] = Material.GreenGlazedTerracotta; - for (int i = 10237; i <= 10242; i++) - materials[i] = Material.GreenShulkerBox; - materials[4417] = Material.GreenStainedGlass; - for (int i = 7908; i <= 7939; i++) - materials[i] = Material.GreenStainedGlassPane; - materials[7489] = Material.GreenTerracotta; - for (int i = 8946; i <= 8949; i++) - materials[i] = Material.GreenWallBanner; - materials[1651] = Material.GreenWool; - for (int i = 16026; i <= 16037; i++) - materials[i] = Material.Grindstone; - for (int i = 19774; i <= 19775; i++) - materials[i] = Material.HangingRoots; - for (int i = 8604; i <= 8606; i++) - materials[i] = Material.HayBlock; - for (int i = 7279; i <= 7294; i++) - materials[i] = Material.HeavyWeightedPressurePlate; - materials[17033] = Material.HoneyBlock; - materials[17034] = Material.HoneycombBlock; - for (int i = 7345; i <= 7354; i++) - materials[i] = Material.Hopper; - for (int i = 10419; i <= 10420; i++) - materials[i] = Material.HornCoral; - materials[10400] = Material.HornCoralBlock; - for (int i = 10439; i <= 10440; i++) - materials[i] = Material.HornCoralFan; - for (int i = 10513; i <= 10520; i++) - materials[i] = Material.HornCoralWallFan; - materials[4238] = Material.Ice; - materials[4879] = Material.InfestedChiseledStoneBricks; - materials[4875] = Material.InfestedCobblestone; - materials[4878] = Material.InfestedCrackedStoneBricks; - for (int i = 21428; i <= 21430; i++) - materials[i] = Material.InfestedDeepslate; - materials[4877] = Material.InfestedMossyStoneBricks; - materials[4874] = Material.InfestedStone; - materials[4876] = Material.InfestedStoneBricks; - for (int i = 5072; i <= 5103; i++) - materials[i] = Material.IronBars; - materials[1682] = Material.IronBlock; - for (int i = 4114; i <= 4177; i++) - materials[i] = Material.IronDoor; - materials[112] = Material.IronOre; - for (int i = 8278; i <= 8341; i++) - materials[i] = Material.IronTrapdoor; - for (int i = 4329; i <= 4332; i++) - materials[i] = Material.JackOLantern; - for (int i = 16948; i <= 16959; i++) - materials[i] = Material.Jigsaw; - for (int i = 4273; i <= 4274; i++) - materials[i] = Material.Jukebox; - for (int i = 7011; i <= 7034; i++) - materials[i] = Material.JungleButton; - for (int i = 9683; i <= 9746; i++) - materials[i] = Material.JungleDoor; - for (int i = 9427; i <= 9458; i++) - materials[i] = Material.JungleFence; - for (int i = 9235; i <= 9266; i++) - materials[i] = Material.JungleFenceGate; - for (int i = 290; i <= 317; i++) - materials[i] = Material.JungleLeaves; - for (int i = 126; i <= 128; i++) - materials[i] = Material.JungleLog; - materials[18] = Material.JunglePlanks; - for (int i = 4184; i <= 4185; i++) - materials[i] = Material.JunglePressurePlate; - for (int i = 28; i <= 29; i++) - materials[i] = Material.JungleSapling; - for (int i = 3764; i <= 3795; i++) - materials[i] = Material.JungleSign; - for (int i = 9059; i <= 9064; i++) - materials[i] = Material.JungleSlab; - for (int i = 6156; i <= 6235; i++) - materials[i] = Material.JungleStairs; - for (int i = 4612; i <= 4675; i++) - materials[i] = Material.JungleTrapdoor; - for (int i = 4064; i <= 4071; i++) - materials[i] = Material.JungleWallSign; - for (int i = 173; i <= 175; i++) - materials[i] = Material.JungleWood; - for (int i = 10351; i <= 10376; i++) - materials[i] = Material.Kelp; - materials[10377] = Material.KelpPlant; - for (int i = 3924; i <= 3931; i++) - materials[i] = Material.Ladder; - for (int i = 16091; i <= 16094; i++) - materials[i] = Material.Lantern; - materials[463] = Material.LapisBlock; - materials[461] = Material.LapisOre; - for (int i = 18633; i <= 18644; i++) - materials[i] = Material.LargeAmethystBud; - for (int i = 8636; i <= 8637; i++) - materials[i] = Material.LargeFern; - for (int i = 91; i <= 106; i++) - materials[i] = Material.Lava; - materials[5732] = Material.LavaCauldron; - for (int i = 16038; i <= 16053; i++) - materials[i] = Material.Lectern; - for (int i = 4088; i <= 4111; i++) - materials[i] = Material.Lever; - for (int i = 8246; i <= 8277; i++) - materials[i] = Material.Light; - for (int i = 8686; i <= 8701; i++) - materials[i] = Material.LightBlueBanner; - for (int i = 1327; i <= 1342; i++) - materials[i] = Material.LightBlueBed; - for (int i = 18377; i <= 18392; i++) - materials[i] = Material.LightBlueCandle; - for (int i = 18593; i <= 18594; i++) - materials[i] = Material.LightBlueCandleCake; - materials[8610] = Material.LightBlueCarpet; - materials[10322] = Material.LightBlueConcrete; - materials[10338] = Material.LightBlueConcretePowder; - for (int i = 10267; i <= 10270; i++) - materials[i] = Material.LightBlueGlazedTerracotta; - for (int i = 10177; i <= 10182; i++) - materials[i] = Material.LightBlueShulkerBox; - materials[4407] = Material.LightBlueStainedGlass; - for (int i = 7588; i <= 7619; i++) - materials[i] = Material.LightBlueStainedGlassPane; - materials[7479] = Material.LightBlueTerracotta; - for (int i = 8906; i <= 8909; i++) - materials[i] = Material.LightBlueWallBanner; - materials[1641] = Material.LightBlueWool; - for (int i = 8766; i <= 8781; i++) - materials[i] = Material.LightGrayBanner; - for (int i = 1407; i <= 1422; i++) - materials[i] = Material.LightGrayBed; - for (int i = 18457; i <= 18472; i++) - materials[i] = Material.LightGrayCandle; - for (int i = 18603; i <= 18604; i++) - materials[i] = Material.LightGrayCandleCake; - materials[8615] = Material.LightGrayCarpet; - materials[10327] = Material.LightGrayConcrete; - materials[10343] = Material.LightGrayConcretePowder; - for (int i = 10287; i <= 10290; i++) - materials[i] = Material.LightGrayGlazedTerracotta; - for (int i = 10207; i <= 10212; i++) - materials[i] = Material.LightGrayShulkerBox; - materials[4412] = Material.LightGrayStainedGlass; - for (int i = 7748; i <= 7779; i++) - materials[i] = Material.LightGrayStainedGlassPane; - materials[7484] = Material.LightGrayTerracotta; - for (int i = 8926; i <= 8929; i++) - materials[i] = Material.LightGrayWallBanner; - materials[1646] = Material.LightGrayWool; - for (int i = 7263; i <= 7278; i++) - materials[i] = Material.LightWeightedPressurePlate; - for (int i = 19614; i <= 19637; i++) - materials[i] = Material.LightningRod; - for (int i = 8628; i <= 8629; i++) - materials[i] = Material.Lilac; - materials[1678] = Material.LilyOfTheValley; - materials[5601] = Material.LilyPad; - for (int i = 8718; i <= 8733; i++) - materials[i] = Material.LimeBanner; - for (int i = 1359; i <= 1374; i++) - materials[i] = Material.LimeBed; - for (int i = 18409; i <= 18424; i++) - materials[i] = Material.LimeCandle; - for (int i = 18597; i <= 18598; i++) - materials[i] = Material.LimeCandleCake; - materials[8612] = Material.LimeCarpet; - materials[10324] = Material.LimeConcrete; - materials[10340] = Material.LimeConcretePowder; - for (int i = 10275; i <= 10278; i++) - materials[i] = Material.LimeGlazedTerracotta; - for (int i = 10189; i <= 10194; i++) - materials[i] = Material.LimeShulkerBox; - materials[4409] = Material.LimeStainedGlass; - for (int i = 7652; i <= 7683; i++) - materials[i] = Material.LimeStainedGlassPane; - materials[7481] = Material.LimeTerracotta; - for (int i = 8914; i <= 8917; i++) - materials[i] = Material.LimeWallBanner; - materials[1643] = Material.LimeWool; - materials[17047] = Material.Lodestone; - for (int i = 15992; i <= 15995; i++) - materials[i] = Material.Loom; - for (int i = 8670; i <= 8685; i++) - materials[i] = Material.MagentaBanner; - for (int i = 1311; i <= 1326; i++) - materials[i] = Material.MagentaBed; - for (int i = 18361; i <= 18376; i++) - materials[i] = Material.MagentaCandle; - for (int i = 18591; i <= 18592; i++) - materials[i] = Material.MagentaCandleCake; - materials[8609] = Material.MagentaCarpet; - materials[10321] = Material.MagentaConcrete; - materials[10337] = Material.MagentaConcretePowder; - for (int i = 10263; i <= 10266; i++) - materials[i] = Material.MagentaGlazedTerracotta; - for (int i = 10171; i <= 10176; i++) - materials[i] = Material.MagentaShulkerBox; - materials[4406] = Material.MagentaStainedGlass; - for (int i = 7556; i <= 7587; i++) - materials[i] = Material.MagentaStainedGlassPane; - materials[7478] = Material.MagentaTerracotta; - for (int i = 8902; i <= 8905; i++) - materials[i] = Material.MagentaWallBanner; - materials[1640] = Material.MagentaWool; - materials[10134] = Material.MagmaBlock; - for (int i = 7083; i <= 7106; i++) - materials[i] = Material.MangroveButton; - for (int i = 9875; i <= 9938; i++) - materials[i] = Material.MangroveDoor; - for (int i = 9523; i <= 9554; i++) - materials[i] = Material.MangroveFence; - for (int i = 9331; i <= 9362; i++) - materials[i] = Material.MangroveFenceGate; - for (int i = 374; i <= 401; i++) - materials[i] = Material.MangroveLeaves; - for (int i = 135; i <= 137; i++) - materials[i] = Material.MangroveLog; - materials[21] = Material.MangrovePlanks; - for (int i = 4190; i <= 4191; i++) - materials[i] = Material.MangrovePressurePlate; - for (int i = 34; i <= 73; i++) - materials[i] = Material.MangrovePropagule; - for (int i = 138; i <= 139; i++) - materials[i] = Material.MangroveRoots; - for (int i = 3828; i <= 3859; i++) - materials[i] = Material.MangroveSign; - for (int i = 9077; i <= 9082; i++) - materials[i] = Material.MangroveSlab; - for (int i = 8164; i <= 8243; i++) - materials[i] = Material.MangroveStairs; - for (int i = 4804; i <= 4867; i++) - materials[i] = Material.MangroveTrapdoor; - for (int i = 4080; i <= 4087; i++) - materials[i] = Material.MangroveWallSign; - for (int i = 182; i <= 184; i++) - materials[i] = Material.MangroveWood; - for (int i = 18645; i <= 18656; i++) - materials[i] = Material.MediumAmethystBud; - materials[5142] = Material.Melon; - for (int i = 5159; i <= 5166; i++) - materials[i] = Material.MelonStem; - materials[19717] = Material.MossBlock; - materials[19716] = Material.MossCarpet; - materials[1687] = Material.MossyCobblestone; - for (int i = 11694; i <= 11699; i++) - materials[i] = Material.MossyCobblestoneSlab; - for (int i = 10870; i <= 10949; i++) - materials[i] = Material.MossyCobblestoneStairs; - for (int i = 6573; i <= 6896; i++) - materials[i] = Material.MossyCobblestoneWall; - for (int i = 11682; i <= 11687; i++) - materials[i] = Material.MossyStoneBrickSlab; - for (int i = 10710; i <= 10789; i++) - materials[i] = Material.MossyStoneBrickStairs; - for (int i = 12720; i <= 13043; i++) - materials[i] = Material.MossyStoneBrickWall; - materials[4869] = Material.MossyStoneBricks; - for (int i = 1654; i <= 1665; i++) - materials[i] = Material.MovingPiston; - materials[19777] = Material.Mud; - for (int i = 9131; i <= 9136; i++) - materials[i] = Material.MudBrickSlab; - for (int i = 5519; i <= 5598; i++) - materials[i] = Material.MudBrickStairs; - for (int i = 13692; i <= 14015; i++) - materials[i] = Material.MudBrickWall; - materials[4873] = Material.MudBricks; - for (int i = 140; i <= 142; i++) - materials[i] = Material.MuddyMangroveRoots; - for (int i = 5008; i <= 5071; i++) - materials[i] = Material.MushroomStem; - for (int i = 5599; i <= 5600; i++) - materials[i] = Material.Mycelium; - for (int i = 5603; i <= 5634; i++) - materials[i] = Material.NetherBrickFence; - for (int i = 9137; i <= 9142; i++) - materials[i] = Material.NetherBrickSlab; - for (int i = 5635; i <= 5714; i++) - materials[i] = Material.NetherBrickStairs; - for (int i = 14016; i <= 14339; i++) - materials[i] = Material.NetherBrickWall; - materials[5602] = Material.NetherBricks; - materials[116] = Material.NetherGoldOre; - for (int i = 4323; i <= 4324; i++) - materials[i] = Material.NetherPortal; - materials[7344] = Material.NetherQuartzOre; - materials[16183] = Material.NetherSprouts; - for (int i = 5715; i <= 5718; i++) - materials[i] = Material.NetherWart; - materials[10135] = Material.NetherWartBlock; - materials[17035] = Material.NetheriteBlock; - materials[4308] = Material.Netherrack; - for (int i = 479; i <= 1278; i++) - materials[i] = Material.NoteBlock; - for (int i = 6939; i <= 6962; i++) - materials[i] = Material.OakButton; - for (int i = 3860; i <= 3923; i++) - materials[i] = Material.OakDoor; - for (int i = 4275; i <= 4306; i++) - materials[i] = Material.OakFence; - for (int i = 5327; i <= 5358; i++) - materials[i] = Material.OakFenceGate; - for (int i = 206; i <= 233; i++) - materials[i] = Material.OakLeaves; - for (int i = 117; i <= 119; i++) - materials[i] = Material.OakLog; - materials[15] = Material.OakPlanks; - for (int i = 4178; i <= 4179; i++) - materials[i] = Material.OakPressurePlate; - for (int i = 22; i <= 23; i++) - materials[i] = Material.OakSapling; - for (int i = 3636; i <= 3667; i++) - materials[i] = Material.OakSign; - for (int i = 9041; i <= 9046; i++) - materials[i] = Material.OakSlab; - for (int i = 2208; i <= 2287; i++) - materials[i] = Material.OakStairs; - for (int i = 4420; i <= 4483; i++) - materials[i] = Material.OakTrapdoor; - for (int i = 4032; i <= 4039; i++) - materials[i] = Material.OakWallSign; - for (int i = 164; i <= 166; i++) - materials[i] = Material.OakWood; - for (int i = 10141; i <= 10152; i++) - materials[i] = Material.Observer; - materials[1688] = Material.Obsidian; - for (int i = 21437; i <= 21439; i++) - materials[i] = Material.OchreFroglight; - for (int i = 8654; i <= 8669; i++) - materials[i] = Material.OrangeBanner; - for (int i = 1295; i <= 1310; i++) - materials[i] = Material.OrangeBed; - for (int i = 18345; i <= 18360; i++) - materials[i] = Material.OrangeCandle; - for (int i = 18589; i <= 18590; i++) - materials[i] = Material.OrangeCandleCake; - materials[8608] = Material.OrangeCarpet; - materials[10320] = Material.OrangeConcrete; - materials[10336] = Material.OrangeConcretePowder; - for (int i = 10259; i <= 10262; i++) - materials[i] = Material.OrangeGlazedTerracotta; - for (int i = 10165; i <= 10170; i++) - materials[i] = Material.OrangeShulkerBox; - materials[4405] = Material.OrangeStainedGlass; - for (int i = 7524; i <= 7555; i++) - materials[i] = Material.OrangeStainedGlassPane; - materials[7477] = Material.OrangeTerracotta; - materials[1672] = Material.OrangeTulip; - for (int i = 8898; i <= 8901; i++) - materials[i] = Material.OrangeWallBanner; - materials[1639] = Material.OrangeWool; - materials[1675] = Material.OxeyeDaisy; - materials[18908] = Material.OxidizedCopper; - materials[18914] = Material.OxidizedCutCopper; - for (int i = 19238; i <= 19243; i++) - materials[i] = Material.OxidizedCutCopperSlab; - for (int i = 18918; i <= 18997; i++) - materials[i] = Material.OxidizedCutCopperStairs; - materials[8625] = Material.PackedIce; - materials[4872] = Material.PackedMud; - for (int i = 21443; i <= 21445; i++) - materials[i] = Material.PearlescentFroglight; - for (int i = 8632; i <= 8633; i++) - materials[i] = Material.Peony; - for (int i = 9107; i <= 9112; i++) - materials[i] = Material.PetrifiedOakSlab; - for (int i = 8734; i <= 8749; i++) - materials[i] = Material.PinkBanner; - for (int i = 1375; i <= 1390; i++) - materials[i] = Material.PinkBed; - for (int i = 18425; i <= 18440; i++) - materials[i] = Material.PinkCandle; - for (int i = 18599; i <= 18600; i++) - materials[i] = Material.PinkCandleCake; - materials[8613] = Material.PinkCarpet; - materials[10325] = Material.PinkConcrete; - materials[10341] = Material.PinkConcretePowder; - for (int i = 10279; i <= 10282; i++) - materials[i] = Material.PinkGlazedTerracotta; - for (int i = 10195; i <= 10200; i++) - materials[i] = Material.PinkShulkerBox; - materials[4410] = Material.PinkStainedGlass; - for (int i = 7684; i <= 7715; i++) - materials[i] = Material.PinkStainedGlassPane; - materials[7482] = Material.PinkTerracotta; - materials[1674] = Material.PinkTulip; - for (int i = 8918; i <= 8921; i++) - materials[i] = Material.PinkWallBanner; - materials[1644] = Material.PinkWool; - for (int i = 1602; i <= 1613; i++) - materials[i] = Material.Piston; - for (int i = 1614; i <= 1637; i++) - materials[i] = Material.PistonHead; - for (int i = 7167; i <= 7182; i++) - materials[i] = Material.PlayerHead; - for (int i = 7183; i <= 7186; i++) - materials[i] = Material.PlayerWallHead; - for (int i = 12; i <= 13; i++) - materials[i] = Material.Podzol; - for (int i = 19638; i <= 19657; i++) - materials[i] = Material.PointedDripstone; - materials[7] = Material.PolishedAndesite; - for (int i = 11736; i <= 11741; i++) - materials[i] = Material.PolishedAndesiteSlab; - for (int i = 11510; i <= 11589; i++) - materials[i] = Material.PolishedAndesiteStairs; - for (int i = 4314; i <= 4316; i++) - materials[i] = Material.PolishedBasalt; - materials[17459] = Material.PolishedBlackstone; - for (int i = 17463; i <= 17468; i++) - materials[i] = Material.PolishedBlackstoneBrickSlab; - for (int i = 17469; i <= 17548; i++) - materials[i] = Material.PolishedBlackstoneBrickStairs; - for (int i = 17549; i <= 17872; i++) - materials[i] = Material.PolishedBlackstoneBrickWall; - materials[17460] = Material.PolishedBlackstoneBricks; - for (int i = 17962; i <= 17985; i++) - materials[i] = Material.PolishedBlackstoneButton; - for (int i = 17960; i <= 17961; i++) - materials[i] = Material.PolishedBlackstonePressurePlate; - for (int i = 17954; i <= 17959; i++) - materials[i] = Material.PolishedBlackstoneSlab; - for (int i = 17874; i <= 17953; i++) - materials[i] = Material.PolishedBlackstoneStairs; - for (int i = 17986; i <= 18309; i++) - materials[i] = Material.PolishedBlackstoneWall; - materials[20192] = Material.PolishedDeepslate; - for (int i = 20273; i <= 20278; i++) - materials[i] = Material.PolishedDeepslateSlab; - for (int i = 20193; i <= 20272; i++) - materials[i] = Material.PolishedDeepslateStairs; - for (int i = 20279; i <= 20602; i++) - materials[i] = Material.PolishedDeepslateWall; - materials[5] = Material.PolishedDiorite; - for (int i = 11688; i <= 11693; i++) - materials[i] = Material.PolishedDioriteSlab; - for (int i = 10790; i <= 10869; i++) - materials[i] = Material.PolishedDioriteStairs; - materials[3] = Material.PolishedGranite; - for (int i = 11670; i <= 11675; i++) - materials[i] = Material.PolishedGraniteSlab; - for (int i = 10550; i <= 10629; i++) - materials[i] = Material.PolishedGraniteStairs; - materials[1667] = Material.Poppy; - for (int i = 6931; i <= 6938; i++) - materials[i] = Material.Potatoes; - materials[6902] = Material.PottedAcaciaSapling; - materials[6909] = Material.PottedAllium; - materials[21435] = Material.PottedAzaleaBush; - materials[6910] = Material.PottedAzureBluet; - materials[10545] = Material.PottedBamboo; - materials[6900] = Material.PottedBirchSapling; - materials[6908] = Material.PottedBlueOrchid; - materials[6920] = Material.PottedBrownMushroom; - materials[6922] = Material.PottedCactus; - materials[6916] = Material.PottedCornflower; - materials[17043] = Material.PottedCrimsonFungus; - materials[17045] = Material.PottedCrimsonRoots; - materials[6906] = Material.PottedDandelion; - materials[6903] = Material.PottedDarkOakSapling; - materials[6921] = Material.PottedDeadBush; - materials[6905] = Material.PottedFern; - materials[21436] = Material.PottedFloweringAzaleaBush; - materials[6901] = Material.PottedJungleSapling; - materials[6917] = Material.PottedLilyOfTheValley; - materials[6904] = Material.PottedMangrovePropagule; - materials[6898] = Material.PottedOakSapling; - materials[6912] = Material.PottedOrangeTulip; - materials[6915] = Material.PottedOxeyeDaisy; - materials[6914] = Material.PottedPinkTulip; - materials[6907] = Material.PottedPoppy; - materials[6919] = Material.PottedRedMushroom; - materials[6911] = Material.PottedRedTulip; - materials[6899] = Material.PottedSpruceSapling; - materials[17044] = Material.PottedWarpedFungus; - materials[17046] = Material.PottedWarpedRoots; - materials[6913] = Material.PottedWhiteTulip; - materials[6918] = Material.PottedWitherRose; - materials[18672] = Material.PowderSnow; - for (int i = 5733; i <= 5735; i++) - materials[i] = Material.PowderSnowCauldron; - for (int i = 1535; i <= 1558; i++) - materials[i] = Material.PoweredRail; - materials[8342] = Material.Prismarine; - for (int i = 8591; i <= 8596; i++) - materials[i] = Material.PrismarineBrickSlab; - for (int i = 8425; i <= 8504; i++) - materials[i] = Material.PrismarineBrickStairs; - materials[8343] = Material.PrismarineBricks; - for (int i = 8585; i <= 8590; i++) - materials[i] = Material.PrismarineSlab; - for (int i = 8345; i <= 8424; i++) - materials[i] = Material.PrismarineStairs; - for (int i = 12072; i <= 12395; i++) - materials[i] = Material.PrismarineWall; - materials[4307] = Material.Pumpkin; - for (int i = 5151; i <= 5158; i++) - materials[i] = Material.PumpkinStem; - for (int i = 8798; i <= 8813; i++) - materials[i] = Material.PurpleBanner; - for (int i = 1439; i <= 1454; i++) - materials[i] = Material.PurpleBed; - for (int i = 18489; i <= 18504; i++) - materials[i] = Material.PurpleCandle; - for (int i = 18607; i <= 18608; i++) - materials[i] = Material.PurpleCandleCake; - materials[8617] = Material.PurpleCarpet; - materials[10329] = Material.PurpleConcrete; - materials[10345] = Material.PurpleConcretePowder; - for (int i = 10295; i <= 10298; i++) - materials[i] = Material.PurpleGlazedTerracotta; - for (int i = 10219; i <= 10224; i++) - materials[i] = Material.PurpleShulkerBox; - materials[4414] = Material.PurpleStainedGlass; - for (int i = 7812; i <= 7843; i++) - materials[i] = Material.PurpleStainedGlassPane; - materials[7486] = Material.PurpleTerracotta; - for (int i = 8934; i <= 8937; i++) - materials[i] = Material.PurpleWallBanner; - materials[1648] = Material.PurpleWool; - materials[10015] = Material.PurpurBlock; - for (int i = 10016; i <= 10018; i++) - materials[i] = Material.PurpurPillar; - for (int i = 9161; i <= 9166; i++) - materials[i] = Material.PurpurSlab; - for (int i = 10019; i <= 10098; i++) - materials[i] = Material.PurpurStairs; - materials[7355] = Material.QuartzBlock; - materials[18312] = Material.QuartzBricks; - for (int i = 7357; i <= 7359; i++) - materials[i] = Material.QuartzPillar; - for (int i = 9143; i <= 9148; i++) - materials[i] = Material.QuartzSlab; - for (int i = 7360; i <= 7439; i++) - materials[i] = Material.QuartzStairs; - for (int i = 3932; i <= 3951; i++) - materials[i] = Material.Rail; - materials[21433] = Material.RawCopperBlock; - materials[21434] = Material.RawGoldBlock; - materials[21432] = Material.RawIronBlock; - for (int i = 8862; i <= 8877; i++) - materials[i] = Material.RedBanner; - for (int i = 1503; i <= 1518; i++) - materials[i] = Material.RedBed; - for (int i = 18553; i <= 18568; i++) - materials[i] = Material.RedCandle; - for (int i = 18615; i <= 18616; i++) - materials[i] = Material.RedCandleCake; - materials[8621] = Material.RedCarpet; - materials[10333] = Material.RedConcrete; - materials[10349] = Material.RedConcretePowder; - for (int i = 10311; i <= 10314; i++) - materials[i] = Material.RedGlazedTerracotta; - materials[1680] = Material.RedMushroom; - for (int i = 4944; i <= 5007; i++) - materials[i] = Material.RedMushroomBlock; - for (int i = 11730; i <= 11735; i++) - materials[i] = Material.RedNetherBrickSlab; - for (int i = 11430; i <= 11509; i++) - materials[i] = Material.RedNetherBrickStairs; - for (int i = 14664; i <= 14987; i++) - materials[i] = Material.RedNetherBrickWall; - materials[10136] = Material.RedNetherBricks; - materials[108] = Material.RedSand; - materials[8958] = Material.RedSandstone; - for (int i = 9149; i <= 9154; i++) - materials[i] = Material.RedSandstoneSlab; - for (int i = 8961; i <= 9040; i++) - materials[i] = Material.RedSandstoneStairs; - for (int i = 12396; i <= 12719; i++) - materials[i] = Material.RedSandstoneWall; - for (int i = 10243; i <= 10248; i++) - materials[i] = Material.RedShulkerBox; - materials[4418] = Material.RedStainedGlass; - for (int i = 7940; i <= 7971; i++) - materials[i] = Material.RedStainedGlassPane; - materials[7490] = Material.RedTerracotta; - materials[1671] = Material.RedTulip; - for (int i = 8950; i <= 8953; i++) - materials[i] = Material.RedWallBanner; - materials[1652] = Material.RedWool; - materials[7343] = Material.RedstoneBlock; - for (int i = 5747; i <= 5748; i++) - materials[i] = Material.RedstoneLamp; - for (int i = 4192; i <= 4193; i++) - materials[i] = Material.RedstoneOre; - for (int i = 4196; i <= 4197; i++) - materials[i] = Material.RedstoneTorch; - for (int i = 4198; i <= 4205; i++) - materials[i] = Material.RedstoneWallTorch; - for (int i = 2312; i <= 3607; i++) - materials[i] = Material.RedstoneWire; - materials[21447] = Material.ReinforcedDeepslate; - for (int i = 4340; i <= 4403; i++) - materials[i] = Material.Repeater; - for (int i = 10106; i <= 10117; i++) - materials[i] = Material.RepeatingCommandBlock; - for (int i = 17038; i <= 17042; i++) - materials[i] = Material.RespawnAnchor; - materials[19776] = Material.RootedDirt; - for (int i = 8630; i <= 8631; i++) - materials[i] = Material.RoseBush; - materials[107] = Material.Sand; - materials[476] = Material.Sandstone; - for (int i = 9095; i <= 9100; i++) - materials[i] = Material.SandstoneSlab; - for (int i = 5761; i <= 5840; i++) - materials[i] = Material.SandstoneStairs; - for (int i = 14988; i <= 15311; i++) - materials[i] = Material.SandstoneWall; - for (int i = 15960; i <= 15991; i++) - materials[i] = Material.Scaffolding; - materials[18769] = Material.Sculk; - for (int i = 18898; i <= 18899; i++) - materials[i] = Material.SculkCatalyst; - for (int i = 18673; i <= 18768; i++) - materials[i] = Material.SculkSensor; - for (int i = 18900; i <= 18907; i++) - materials[i] = Material.SculkShrieker; - for (int i = 18770; i <= 18897; i++) - materials[i] = Material.SculkVein; - materials[8603] = Material.SeaLantern; - for (int i = 10521; i <= 10528; i++) - materials[i] = Material.SeaPickle; - materials[1599] = Material.Seagrass; - materials[16198] = Material.Shroomlight; - for (int i = 10153; i <= 10158; i++) - materials[i] = Material.ShulkerBox; - for (int i = 7107; i <= 7122; i++) - materials[i] = Material.SkeletonSkull; - for (int i = 7123; i <= 7126; i++) - materials[i] = Material.SkeletonWallSkull; - materials[8244] = Material.SlimeBlock; - for (int i = 18657; i <= 18668; i++) - materials[i] = Material.SmallAmethystBud; - for (int i = 19758; i <= 19773; i++) - materials[i] = Material.SmallDripleaf; - materials[16054] = Material.SmithingTable; - for (int i = 16008; i <= 16015; i++) - materials[i] = Material.Smoker; - materials[21431] = Material.SmoothBasalt; - materials[9169] = Material.SmoothQuartz; - for (int i = 11712; i <= 11717; i++) - materials[i] = Material.SmoothQuartzSlab; - for (int i = 11190; i <= 11269; i++) - materials[i] = Material.SmoothQuartzStairs; - materials[9170] = Material.SmoothRedSandstone; - for (int i = 11676; i <= 11681; i++) - materials[i] = Material.SmoothRedSandstoneSlab; - for (int i = 10630; i <= 10709; i++) - materials[i] = Material.SmoothRedSandstoneStairs; - materials[9168] = Material.SmoothSandstone; - for (int i = 11706; i <= 11711; i++) - materials[i] = Material.SmoothSandstoneSlab; - for (int i = 11110; i <= 11189; i++) - materials[i] = Material.SmoothSandstoneStairs; - materials[9167] = Material.SmoothStone; - for (int i = 9089; i <= 9094; i++) - materials[i] = Material.SmoothStoneSlab; - for (int i = 4230; i <= 4237; i++) - materials[i] = Material.Snow; - materials[4239] = Material.SnowBlock; - for (int i = 16131; i <= 16162; i++) - materials[i] = Material.SoulCampfire; - materials[2206] = Material.SoulFire; - for (int i = 16095; i <= 16098; i++) - materials[i] = Material.SoulLantern; - materials[4309] = Material.SoulSand; - materials[4310] = Material.SoulSoil; - materials[4317] = Material.SoulTorch; - for (int i = 4318; i <= 4321; i++) - materials[i] = Material.SoulWallTorch; - materials[2207] = Material.Spawner; - materials[458] = Material.Sponge; - materials[19713] = Material.SporeBlossom; - for (int i = 6963; i <= 6986; i++) - materials[i] = Material.SpruceButton; - for (int i = 9555; i <= 9618; i++) - materials[i] = Material.SpruceDoor; - for (int i = 9363; i <= 9394; i++) - materials[i] = Material.SpruceFence; - for (int i = 9171; i <= 9202; i++) - materials[i] = Material.SpruceFenceGate; - for (int i = 234; i <= 261; i++) - materials[i] = Material.SpruceLeaves; - for (int i = 120; i <= 122; i++) - materials[i] = Material.SpruceLog; - materials[16] = Material.SprucePlanks; - for (int i = 4180; i <= 4181; i++) - materials[i] = Material.SprucePressurePlate; - for (int i = 24; i <= 25; i++) - materials[i] = Material.SpruceSapling; - for (int i = 3668; i <= 3699; i++) - materials[i] = Material.SpruceSign; - for (int i = 9047; i <= 9052; i++) - materials[i] = Material.SpruceSlab; - for (int i = 5996; i <= 6075; i++) - materials[i] = Material.SpruceStairs; - for (int i = 4484; i <= 4547; i++) - materials[i] = Material.SpruceTrapdoor; - for (int i = 4040; i <= 4047; i++) - materials[i] = Material.SpruceWallSign; - for (int i = 167; i <= 169; i++) - materials[i] = Material.SpruceWood; - for (int i = 1583; i <= 1594; i++) - materials[i] = Material.StickyPiston; - materials[1] = Material.Stone; - for (int i = 9125; i <= 9130; i++) - materials[i] = Material.StoneBrickSlab; - for (int i = 5439; i <= 5518; i++) - materials[i] = Material.StoneBrickStairs; - for (int i = 13368; i <= 13691; i++) - materials[i] = Material.StoneBrickWall; - materials[4868] = Material.StoneBricks; - for (int i = 4206; i <= 4229; i++) - materials[i] = Material.StoneButton; - for (int i = 4112; i <= 4113; i++) - materials[i] = Material.StonePressurePlate; - for (int i = 9083; i <= 9088; i++) - materials[i] = Material.StoneSlab; - for (int i = 11030; i <= 11109; i++) - materials[i] = Material.StoneStairs; - for (int i = 16055; i <= 16058; i++) - materials[i] = Material.Stonecutter; - for (int i = 152; i <= 154; i++) - materials[i] = Material.StrippedAcaciaLog; - for (int i = 197; i <= 199; i++) - materials[i] = Material.StrippedAcaciaWood; - for (int i = 146; i <= 148; i++) - materials[i] = Material.StrippedBirchLog; - for (int i = 191; i <= 193; i++) - materials[i] = Material.StrippedBirchWood; - for (int i = 16193; i <= 16195; i++) - materials[i] = Material.StrippedCrimsonHyphae; - for (int i = 16187; i <= 16189; i++) - materials[i] = Material.StrippedCrimsonStem; - for (int i = 155; i <= 157; i++) - materials[i] = Material.StrippedDarkOakLog; - for (int i = 200; i <= 202; i++) - materials[i] = Material.StrippedDarkOakWood; - for (int i = 149; i <= 151; i++) - materials[i] = Material.StrippedJungleLog; - for (int i = 194; i <= 196; i++) - materials[i] = Material.StrippedJungleWood; - for (int i = 161; i <= 163; i++) - materials[i] = Material.StrippedMangroveLog; - for (int i = 203; i <= 205; i++) - materials[i] = Material.StrippedMangroveWood; - for (int i = 158; i <= 160; i++) - materials[i] = Material.StrippedOakLog; - for (int i = 185; i <= 187; i++) - materials[i] = Material.StrippedOakWood; - for (int i = 143; i <= 145; i++) - materials[i] = Material.StrippedSpruceLog; - for (int i = 188; i <= 190; i++) - materials[i] = Material.StrippedSpruceWood; - for (int i = 16176; i <= 16178; i++) - materials[i] = Material.StrippedWarpedHyphae; - for (int i = 16170; i <= 16172; i++) - materials[i] = Material.StrippedWarpedStem; - for (int i = 16944; i <= 16947; i++) - materials[i] = Material.StructureBlock; - materials[10140] = Material.StructureVoid; - for (int i = 4257; i <= 4272; i++) - materials[i] = Material.SugarCane; - for (int i = 8626; i <= 8627; i++) - materials[i] = Material.Sunflower; - for (int i = 16163; i <= 16166; i++) - materials[i] = Material.SweetBerryBush; - for (int i = 8634; i <= 8635; i++) - materials[i] = Material.TallGrass; - for (int i = 1600; i <= 1601; i++) - materials[i] = Material.TallSeagrass; - for (int i = 16969; i <= 16984; i++) - materials[i] = Material.Target; - materials[8623] = Material.Terracotta; - materials[18671] = Material.TintedGlass; - for (int i = 1684; i <= 1685; i++) - materials[i] = Material.Tnt; - materials[1689] = Material.Torch; - for (int i = 7239; i <= 7262; i++) - materials[i] = Material.TrappedChest; - for (int i = 5867; i <= 5994; i++) - materials[i] = Material.Tripwire; - for (int i = 5851; i <= 5866; i++) - materials[i] = Material.TripwireHook; - for (int i = 10411; i <= 10412; i++) - materials[i] = Material.TubeCoral; - materials[10396] = Material.TubeCoralBlock; - for (int i = 10431; i <= 10432; i++) - materials[i] = Material.TubeCoralFan; - for (int i = 10481; i <= 10488; i++) - materials[i] = Material.TubeCoralWallFan; - materials[18669] = Material.Tuff; - for (int i = 10379; i <= 10390; i++) - materials[i] = Material.TurtleEgg; - for (int i = 16226; i <= 16251; i++) - materials[i] = Material.TwistingVines; - materials[16252] = Material.TwistingVinesPlant; - for (int i = 21440; i <= 21442; i++) - materials[i] = Material.VerdantFroglight; - for (int i = 5167; i <= 5198; i++) - materials[i] = Material.Vine; - materials[10546] = Material.VoidAir; - for (int i = 1690; i <= 1693; i++) - materials[i] = Material.WallTorch; - for (int i = 16712; i <= 16735; i++) - materials[i] = Material.WarpedButton; - for (int i = 16800; i <= 16863; i++) - materials[i] = Material.WarpedDoor; - for (int i = 16304; i <= 16335; i++) - materials[i] = Material.WarpedFence; - for (int i = 16496; i <= 16527; i++) - materials[i] = Material.WarpedFenceGate; - materials[16180] = Material.WarpedFungus; - for (int i = 16173; i <= 16175; i++) - materials[i] = Material.WarpedHyphae; - materials[16179] = Material.WarpedNylium; - materials[16255] = Material.WarpedPlanks; - for (int i = 16270; i <= 16271; i++) - materials[i] = Material.WarpedPressurePlate; - materials[16182] = Material.WarpedRoots; - for (int i = 16896; i <= 16927; i++) - materials[i] = Material.WarpedSign; - for (int i = 16262; i <= 16267; i++) - materials[i] = Material.WarpedSlab; - for (int i = 16608; i <= 16687; i++) - materials[i] = Material.WarpedStairs; - for (int i = 16167; i <= 16169; i++) - materials[i] = Material.WarpedStem; - for (int i = 16400; i <= 16463; i++) - materials[i] = Material.WarpedTrapdoor; - for (int i = 16936; i <= 16943; i++) - materials[i] = Material.WarpedWallSign; - materials[16181] = Material.WarpedWartBlock; - for (int i = 75; i <= 90; i++) - materials[i] = Material.Water; - for (int i = 5729; i <= 5731; i++) - materials[i] = Material.WaterCauldron; - materials[19262] = Material.WaxedCopperBlock; - materials[19269] = Material.WaxedCutCopper; - for (int i = 19608; i <= 19613; i++) - materials[i] = Material.WaxedCutCopperSlab; - for (int i = 19510; i <= 19589; i++) - materials[i] = Material.WaxedCutCopperStairs; - materials[19264] = Material.WaxedExposedCopper; - materials[19268] = Material.WaxedExposedCutCopper; - for (int i = 19602; i <= 19607; i++) - materials[i] = Material.WaxedExposedCutCopperSlab; - for (int i = 19430; i <= 19509; i++) - materials[i] = Material.WaxedExposedCutCopperStairs; - materials[19265] = Material.WaxedOxidizedCopper; - materials[19266] = Material.WaxedOxidizedCutCopper; - for (int i = 19590; i <= 19595; i++) - materials[i] = Material.WaxedOxidizedCutCopperSlab; - for (int i = 19270; i <= 19349; i++) - materials[i] = Material.WaxedOxidizedCutCopperStairs; - materials[19263] = Material.WaxedWeatheredCopper; - materials[19267] = Material.WaxedWeatheredCutCopper; - for (int i = 19596; i <= 19601; i++) - materials[i] = Material.WaxedWeatheredCutCopperSlab; - for (int i = 19350; i <= 19429; i++) - materials[i] = Material.WaxedWeatheredCutCopperStairs; - materials[18909] = Material.WeatheredCopper; - materials[18915] = Material.WeatheredCutCopper; - for (int i = 19244; i <= 19249; i++) - materials[i] = Material.WeatheredCutCopperSlab; - for (int i = 18998; i <= 19077; i++) - materials[i] = Material.WeatheredCutCopperStairs; - for (int i = 16199; i <= 16224; i++) - materials[i] = Material.WeepingVines; - materials[16225] = Material.WeepingVinesPlant; - materials[459] = Material.WetSponge; - for (int i = 3612; i <= 3619; i++) - materials[i] = Material.Wheat; - for (int i = 8638; i <= 8653; i++) - materials[i] = Material.WhiteBanner; - for (int i = 1279; i <= 1294; i++) - materials[i] = Material.WhiteBed; - for (int i = 18329; i <= 18344; i++) - materials[i] = Material.WhiteCandle; - for (int i = 18587; i <= 18588; i++) - materials[i] = Material.WhiteCandleCake; - materials[8607] = Material.WhiteCarpet; - materials[10319] = Material.WhiteConcrete; - materials[10335] = Material.WhiteConcretePowder; - for (int i = 10255; i <= 10258; i++) - materials[i] = Material.WhiteGlazedTerracotta; - for (int i = 10159; i <= 10164; i++) - materials[i] = Material.WhiteShulkerBox; - materials[4404] = Material.WhiteStainedGlass; - for (int i = 7492; i <= 7523; i++) - materials[i] = Material.WhiteStainedGlassPane; - materials[7476] = Material.WhiteTerracotta; - materials[1673] = Material.WhiteTulip; - for (int i = 8894; i <= 8897; i++) - materials[i] = Material.WhiteWallBanner; - materials[1638] = Material.WhiteWool; - materials[1677] = Material.WitherRose; - for (int i = 7127; i <= 7142; i++) - materials[i] = Material.WitherSkeletonSkull; - for (int i = 7143; i <= 7146; i++) - materials[i] = Material.WitherSkeletonWallSkull; - for (int i = 8702; i <= 8717; i++) - materials[i] = Material.YellowBanner; - for (int i = 1343; i <= 1358; i++) - materials[i] = Material.YellowBed; - for (int i = 18393; i <= 18408; i++) - materials[i] = Material.YellowCandle; - for (int i = 18595; i <= 18596; i++) - materials[i] = Material.YellowCandleCake; - materials[8611] = Material.YellowCarpet; - materials[10323] = Material.YellowConcrete; - materials[10339] = Material.YellowConcretePowder; - for (int i = 10271; i <= 10274; i++) - materials[i] = Material.YellowGlazedTerracotta; - for (int i = 10183; i <= 10188; i++) - materials[i] = Material.YellowShulkerBox; - materials[4408] = Material.YellowStainedGlass; - for (int i = 7620; i <= 7651; i++) - materials[i] = Material.YellowStainedGlassPane; - materials[7480] = Material.YellowTerracotta; - for (int i = 8910; i <= 8913; i++) - materials[i] = Material.YellowWallBanner; - materials[1642] = Material.YellowWool; - for (int i = 7147; i <= 7162; i++) - materials[i] = Material.ZombieHead; - for (int i = 7163; i <= 7166; i++) - materials[i] = Material.ZombieWallHead; - } - - // - private static readonly BlockStateDefinition[] stateDefinitions = - [ - new(8, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(12, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(22, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(24, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(26, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(28, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(30, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(32, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(34, 40, - [ - new("age", ["0", "1", "2", "3", "4"], 8), - new("hanging", ["true", "false"], 4), - new("stage", ["0", "1"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(75, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(91, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(117, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(120, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(123, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(126, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(129, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(132, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(135, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(138, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(140, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(143, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(146, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(149, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(152, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(155, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(158, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(161, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(164, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(167, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(170, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(173, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(176, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(179, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(182, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(185, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(188, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(191, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(194, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(197, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(200, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(203, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(206, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(234, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(262, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(290, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(318, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(346, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(374, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(402, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(430, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(464, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(479, 800, - [ - new("instrument", ["harp", "basedrum", "snare", "hat", "bass", "flute", "bell", "guitar", "chime", "xylophone", "iron_xylophone", "cow_bell", "didgeridoo", "bit", "banjo", "pling"], 50), - new("note", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"], 2), - new("powered", ["true", "false"], 1) - ]), - new(1279, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1295, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1311, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1327, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1343, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1359, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1375, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1391, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1407, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1423, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1439, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1455, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1471, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1487, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1503, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1519, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1535, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(1559, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(1583, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(1600, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(1602, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(1614, 24, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("short", ["true", "false"], 2) - ]), - new(1654, 12, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 2) - ]), - new(1684, 2, - [ - new("unstable", ["true", "false"], 1) - ]), - new(1690, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(1694, 512, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(2208, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2288, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(2312, 1296, - [ - new("east", ["up", "side", "none"], 432), - new("north", ["up", "side", "none"], 144), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 9), - new("south", ["up", "side", "none"], 3), - new("west", ["up", "side", "none"], 1) - ]), - new(3612, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(3620, 8, - [ - new("moisture", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(3628, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(3636, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3668, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3700, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3732, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3764, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3796, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3828, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3860, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(3924, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3932, 20, - [ - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south", "south_east", "south_west", "north_west", "north_east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3952, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4032, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4040, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4048, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4056, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4064, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4072, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4080, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4088, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(4112, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(4114, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(4178, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(4180, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(4182, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(4184, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(4186, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(4188, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(4190, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(4192, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(4194, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(4196, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(4198, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(4206, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(4230, 8, - [ - new("layers", ["1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(4240, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(4257, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(4273, 2, - [ - new("has_record", ["true", "false"], 1) - ]), - new(4275, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4311, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(4314, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(4318, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4323, 2, - [ - new("axis", ["x", "z"], 1) - ]), - new(4325, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4329, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(4333, 7, - [ - new("bites", ["0", "1", "2", "3", "4", "5", "6"], 1) - ]), - new(4340, 64, - [ - new("delay", ["1", "2", "3", "4"], 16), - new("facing", ["north", "south", "west", "east"], 4), - new("locked", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(4420, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4484, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4548, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4612, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4676, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4740, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4804, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4880, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(4944, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5008, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5072, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5104, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5110, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5143, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5147, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5151, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(5159, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(5167, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5199, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5327, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5359, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5439, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5519, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5599, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(5603, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5635, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5715, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(5720, 8, - [ - new("has_bottle_0", ["true", "false"], 4), - new("has_bottle_1", ["true", "false"], 2), - new("has_bottle_2", ["true", "false"], 1) - ]), - new(5729, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(5733, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(5737, 8, - [ - new("eye", ["true", "false"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5747, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5749, 12, - [ - new("age", ["0", "1", "2"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5761, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5843, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5851, 16, - [ - new("attached", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5867, 128, - [ - new("attached", ["true", "false"], 64), - new("disarmed", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("powered", ["true", "false"], 4), - new("south", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5996, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6076, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6156, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6236, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(6249, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(6573, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(6923, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(6931, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(6939, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6963, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6987, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7011, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7035, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7059, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7083, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7107, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7123, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7127, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7143, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7147, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7163, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7167, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7183, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7187, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7203, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7207, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7223, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7227, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7231, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7235, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7239, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(7263, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7279, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7295, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("mode", ["compare", "subtract"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7311, 32, - [ - new("inverted", ["true", "false"], 16), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(7345, 10, - [ - new("enabled", ["true", "false"], 5), - new("facing", ["down", "north", "south", "west", "east"], 1) - ]), - new(7357, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(7360, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7440, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7464, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(7492, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7524, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7556, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7588, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7620, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7652, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7684, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7716, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7748, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7780, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7812, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7844, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7876, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7908, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7940, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7972, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8004, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8084, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8164, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8246, 32, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8278, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8345, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8425, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8505, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8585, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8591, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8597, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8604, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(8626, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(8628, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(8630, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(8632, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(8634, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(8636, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(8638, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8654, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8670, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8686, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8702, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8718, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8734, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8750, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8766, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8782, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8798, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8814, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8830, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8846, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8862, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8878, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8894, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8898, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8902, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8906, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8910, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8914, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8918, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8922, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8926, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8930, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8934, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8938, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8942, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8946, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8950, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8954, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8961, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9041, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9047, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9053, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9059, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9065, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9071, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9077, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9083, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9089, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9095, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9101, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9107, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9113, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9119, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9125, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9131, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9137, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9143, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9149, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9155, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9161, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9171, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9203, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9235, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9267, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9299, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9331, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9363, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9395, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9427, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9459, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9491, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9523, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9555, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9619, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9683, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9747, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9811, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9875, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9939, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9945, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10009, 6, - [ - new("age", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(10016, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(10019, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10100, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(10106, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(10118, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(10130, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(10137, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(10141, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10153, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(10159, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(10165, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(10171, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(10177, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(10183, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(10189, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(10195, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(10201, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(10207, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(10213, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(10219, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(10225, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(10231, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(10237, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(10243, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(10249, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(10255, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10259, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10263, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10267, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10271, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10275, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10279, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10283, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10287, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10291, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10295, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10299, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10303, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10307, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10311, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10315, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10351, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(10379, 12, - [ - new("eggs", ["1", "2", "3", "4"], 3), - new("hatch", ["0", "1", "2"], 1) - ]), - new(10401, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10403, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10405, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10407, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10409, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10411, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10413, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10415, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10417, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10419, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10421, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10423, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10425, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10427, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10429, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10431, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10433, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10435, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10437, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10439, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10441, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10449, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10457, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10465, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10473, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10481, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10489, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10497, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10505, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10513, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10521, 8, - [ - new("pickles", ["1", "2", "3", "4"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10530, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10533, 12, - [ - new("age", ["0", "1"], 6), - new("leaves", ["none", "small", "large"], 2), - new("stage", ["0", "1"], 1) - ]), - new(10548, 2, - [ - new("drag", ["true", "false"], 1) - ]), - new(10550, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10630, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10710, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10790, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10870, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10950, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11030, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11110, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11190, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11270, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11350, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11430, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11510, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11590, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11670, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11676, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11682, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11688, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11694, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11700, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11706, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11712, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11718, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11724, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11730, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11736, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11742, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11748, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(12072, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(12396, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(12720, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(13044, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(13368, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(13692, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14016, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14340, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14664, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14988, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15312, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15636, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15960, 32, - [ - new("bottom", ["true", "false"], 16), - new("distance", ["0", "1", "2", "3", "4", "5", "6", "7"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15992, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(15996, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("open", ["true", "false"], 1) - ]), - new(16008, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(16016, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(16026, 12, - [ - new("face", ["floor", "wall", "ceiling"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(16038, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("has_book", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(16055, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(16059, 32, - [ - new("attachment", ["floor", "ceiling", "single_wall", "double_wall"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(16091, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16095, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16099, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16131, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16163, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(16167, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(16170, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(16173, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(16176, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(16184, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(16187, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(16190, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(16193, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(16199, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(16226, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(16256, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16262, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16268, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(16270, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(16272, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(16304, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(16336, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16400, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16464, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(16496, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(16528, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16608, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16688, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(16712, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(16736, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(16800, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(16864, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16896, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16928, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16936, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16944, 4, - [ - new("mode", ["save", "load", "corner", "data"], 1) - ]), - new(16948, 12, - [ - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 1) - ]), - new(16960, 9, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(16969, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(16985, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(17009, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(17038, 5, - [ - new("charges", ["0", "1", "2", "3", "4"], 1) - ]), - new(17049, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17129, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17453, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17463, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17469, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17549, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17874, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17954, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17960, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(17962, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(17986, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18313, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18329, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18345, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18361, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18377, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18393, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18409, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18425, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18441, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18457, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18473, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18489, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18505, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18521, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18537, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18553, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18569, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18585, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(18587, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(18589, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(18591, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(18593, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(18595, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(18597, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(18599, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(18601, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(18603, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(18605, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(18607, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(18609, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(18611, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(18613, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(18615, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(18617, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(18621, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18633, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18645, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18657, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18673, 96, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18770, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(18898, 2, - [ - new("bloom", ["true", "false"], 1) - ]), - new(18900, 8, - [ - new("can_summon", ["true", "false"], 4), - new("shrieking", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18918, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18998, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19078, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19158, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19238, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19244, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19250, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19256, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19270, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19350, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19430, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19510, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19590, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19596, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19602, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19608, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19614, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19638, 20, - [ - new("thickness", ["tip_merge", "tip", "frustum", "middle", "base"], 4), - new("vertical_direction", ["up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19659, 52, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 2), - new("berries", ["true", "false"], 1) - ]), - new(19711, 2, - [ - new("berries", ["true", "false"], 1) - ]), - new(19718, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("tilt", ["none", "unstable", "partial", "full"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19750, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19758, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("half", ["upper", "lower"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19774, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(19778, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19782, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19862, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19868, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20193, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20273, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20279, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20604, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20684, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20690, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(21015, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21095, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21101, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(21428, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(21437, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(21440, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(21443, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - ]; - // - - protected override Dictionary GetDict() - { - return materials; - } - - protected override BlockStateDefinition[] GetStateDefinitions() - { - return stateDefinitions; - } - } -} diff --git a/MinecraftClient/Mapping/BlockPalettes/Palette1193.cs b/MinecraftClient/Mapping/BlockPalettes/Palette1193.cs deleted file mode 100644 index 7c5254ede8..0000000000 --- a/MinecraftClient/Mapping/BlockPalettes/Palette1193.cs +++ /dev/null @@ -1,4947 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.BlockPalettes -{ - public class Palette1193 : BlockPalette - { - private static readonly Dictionary materials = new(); - - static Palette1193() - { - for (int i = 8475; i <= 8498; i++) - materials[i] = Material.AcaciaButton; - for (int i = 11467; i <= 11530; i++) - materials[i] = Material.AcaciaDoor; - for (int i = 11147; i <= 11178; i++) - materials[i] = Material.AcaciaFence; - for (int i = 10923; i <= 10954; i++) - materials[i] = Material.AcaciaFenceGate; - for (int i = 4934; i <= 4997; i++) - materials[i] = Material.AcaciaHangingSign; - for (int i = 326; i <= 353; i++) - materials[i] = Material.AcaciaLeaves; - for (int i = 131; i <= 133; i++) - materials[i] = Material.AcaciaLog; - materials[19] = Material.AcaciaPlanks; - for (int i = 5560; i <= 5561; i++) - materials[i] = Material.AcaciaPressurePlate; - for (int i = 32; i <= 33; i++) - materials[i] = Material.AcaciaSapling; - for (int i = 4346; i <= 4377; i++) - materials[i] = Material.AcaciaSign; - for (int i = 10709; i <= 10714; i++) - materials[i] = Material.AcaciaSlab; - for (int i = 9488; i <= 9567; i++) - materials[i] = Material.AcaciaStairs; - for (int i = 6052; i <= 6115; i++) - materials[i] = Material.AcaciaTrapdoor; - for (int i = 5406; i <= 5413; i++) - materials[i] = Material.AcaciaWallHangingSign; - for (int i = 4702; i <= 4709; i++) - materials[i] = Material.AcaciaWallSign; - for (int i = 184; i <= 186; i++) - materials[i] = Material.AcaciaWood; - for (int i = 8924; i <= 8947; i++) - materials[i] = Material.ActivatorRail; - materials[0] = Material.Air; - materials[2027] = Material.Allium; - materials[20403] = Material.AmethystBlock; - for (int i = 20405; i <= 20416; i++) - materials[i] = Material.AmethystCluster; - materials[18820] = Material.AncientDebris; - materials[6] = Material.Andesite; - for (int i = 13508; i <= 13513; i++) - materials[i] = Material.AndesiteSlab; - for (int i = 13134; i <= 13213; i++) - materials[i] = Material.AndesiteStairs; - for (int i = 16124; i <= 16447; i++) - materials[i] = Material.AndesiteWall; - for (int i = 8711; i <= 8714; i++) - materials[i] = Material.Anvil; - for (int i = 6587; i <= 6590; i++) - materials[i] = Material.AttachedMelonStem; - for (int i = 6583; i <= 6586; i++) - materials[i] = Material.AttachedPumpkinStem; - materials[21498] = Material.Azalea; - for (int i = 410; i <= 437; i++) - materials[i] = Material.AzaleaLeaves; - materials[2028] = Material.AzureBluet; - for (int i = 12317; i <= 12328; i++) - materials[i] = Material.Bamboo; - for (int i = 145; i <= 147; i++) - materials[i] = Material.BambooBlock; - for (int i = 8547; i <= 8570; i++) - materials[i] = Material.BambooButton; - for (int i = 11659; i <= 11722; i++) - materials[i] = Material.BambooDoor; - for (int i = 11243; i <= 11274; i++) - materials[i] = Material.BambooFence; - for (int i = 11019; i <= 11050; i++) - materials[i] = Material.BambooFenceGate; - for (int i = 5318; i <= 5381; i++) - materials[i] = Material.BambooHangingSign; - materials[23] = Material.BambooMosaic; - for (int i = 10733; i <= 10738; i++) - materials[i] = Material.BambooMosaicSlab; - for (int i = 9808; i <= 9887; i++) - materials[i] = Material.BambooMosaicStairs; - materials[22] = Material.BambooPlanks; - for (int i = 5566; i <= 5567; i++) - materials[i] = Material.BambooPressurePlate; - materials[12316] = Material.BambooSapling; - for (int i = 4474; i <= 4505; i++) - materials[i] = Material.BambooSign; - for (int i = 10727; i <= 10732; i++) - materials[i] = Material.BambooSlab; - for (int i = 9728; i <= 9807; i++) - materials[i] = Material.BambooStairs; - for (int i = 6244; i <= 6307; i++) - materials[i] = Material.BambooTrapdoor; - for (int i = 5454; i <= 5461; i++) - materials[i] = Material.BambooWallHangingSign; - for (int i = 4734; i <= 4741; i++) - materials[i] = Material.BambooWallSign; - for (int i = 17780; i <= 17791; i++) - materials[i] = Material.Barrel; - materials[9889] = Material.Barrier; - for (int i = 5687; i <= 5689; i++) - materials[i] = Material.Basalt; - materials[7688] = Material.Beacon; - materials[76] = Material.Bedrock; - for (int i = 18769; i <= 18792; i++) - materials[i] = Material.BeeNest; - for (int i = 18793; i <= 18816; i++) - materials[i] = Material.Beehive; - for (int i = 11884; i <= 11887; i++) - materials[i] = Material.Beetroots; - for (int i = 17843; i <= 17874; i++) - materials[i] = Material.Bell; - for (int i = 21502; i <= 21533; i++) - materials[i] = Material.BigDripleaf; - for (int i = 21534; i <= 21541; i++) - materials[i] = Material.BigDripleafStem; - for (int i = 8427; i <= 8450; i++) - materials[i] = Material.BirchButton; - for (int i = 11339; i <= 11402; i++) - materials[i] = Material.BirchDoor; - for (int i = 11083; i <= 11114; i++) - materials[i] = Material.BirchFence; - for (int i = 10859; i <= 10890; i++) - materials[i] = Material.BirchFenceGate; - for (int i = 4870; i <= 4933; i++) - materials[i] = Material.BirchHangingSign; - for (int i = 270; i <= 297; i++) - materials[i] = Material.BirchLeaves; - for (int i = 125; i <= 127; i++) - materials[i] = Material.BirchLog; - materials[17] = Material.BirchPlanks; - for (int i = 5556; i <= 5557; i++) - materials[i] = Material.BirchPressurePlate; - for (int i = 28; i <= 29; i++) - materials[i] = Material.BirchSapling; - for (int i = 4314; i <= 4345; i++) - materials[i] = Material.BirchSign; - for (int i = 10697; i <= 10702; i++) - materials[i] = Material.BirchSlab; - for (int i = 7516; i <= 7595; i++) - materials[i] = Material.BirchStairs; - for (int i = 5924; i <= 5987; i++) - materials[i] = Material.BirchTrapdoor; - for (int i = 5398; i <= 5405; i++) - materials[i] = Material.BirchWallHangingSign; - for (int i = 4694; i <= 4701; i++) - materials[i] = Material.BirchWallSign; - for (int i = 178; i <= 180; i++) - materials[i] = Material.BirchWood; - for (int i = 10522; i <= 10537; i++) - materials[i] = Material.BlackBanner; - for (int i = 1877; i <= 1892; i++) - materials[i] = Material.BlackBed; - for (int i = 20353; i <= 20368; i++) - materials[i] = Material.BlackCandle; - for (int i = 20401; i <= 20402; i++) - materials[i] = Material.BlackCandleCake; - materials[10266] = Material.BlackCarpet; - materials[12118] = Material.BlackConcrete; - materials[12134] = Material.BlackConcretePowder; - for (int i = 12099; i <= 12102; i++) - materials[i] = Material.BlackGlazedTerracotta; - for (int i = 12033; i <= 12038; i++) - materials[i] = Material.BlackShulkerBox; - materials[5795] = Material.BlackStainedGlass; - for (int i = 9456; i <= 9487; i++) - materials[i] = Material.BlackStainedGlassPane; - materials[8975] = Material.BlackTerracotta; - for (int i = 10598; i <= 10601; i++) - materials[i] = Material.BlackWallBanner; - materials[2011] = Material.BlackWool; - materials[18832] = Material.Blackstone; - for (int i = 19237; i <= 19242; i++) - materials[i] = Material.BlackstoneSlab; - for (int i = 18833; i <= 18912; i++) - materials[i] = Material.BlackstoneStairs; - for (int i = 18913; i <= 19236; i++) - materials[i] = Material.BlackstoneWall; - for (int i = 17800; i <= 17807; i++) - materials[i] = Material.BlastFurnace; - for (int i = 10458; i <= 10473; i++) - materials[i] = Material.BlueBanner; - for (int i = 1813; i <= 1828; i++) - materials[i] = Material.BlueBed; - for (int i = 20289; i <= 20304; i++) - materials[i] = Material.BlueCandle; - for (int i = 20393; i <= 20394; i++) - materials[i] = Material.BlueCandleCake; - materials[10262] = Material.BlueCarpet; - materials[12114] = Material.BlueConcrete; - materials[12130] = Material.BlueConcretePowder; - for (int i = 12083; i <= 12086; i++) - materials[i] = Material.BlueGlazedTerracotta; - materials[12313] = Material.BlueIce; - materials[2026] = Material.BlueOrchid; - for (int i = 12009; i <= 12014; i++) - materials[i] = Material.BlueShulkerBox; - materials[5791] = Material.BlueStainedGlass; - for (int i = 9328; i <= 9359; i++) - materials[i] = Material.BlueStainedGlassPane; - materials[8971] = Material.BlueTerracotta; - for (int i = 10582; i <= 10585; i++) - materials[i] = Material.BlueWallBanner; - materials[2007] = Material.BlueWool; - for (int i = 11921; i <= 11923; i++) - materials[i] = Material.BoneBlock; - materials[2044] = Material.Bookshelf; - for (int i = 12197; i <= 12198; i++) - materials[i] = Material.BrainCoral; - materials[12181] = Material.BrainCoralBlock; - for (int i = 12217; i <= 12218; i++) - materials[i] = Material.BrainCoralFan; - for (int i = 12273; i <= 12280; i++) - materials[i] = Material.BrainCoralWallFan; - for (int i = 7160; i <= 7167; i++) - materials[i] = Material.BrewingStand; - for (int i = 10775; i <= 10780; i++) - materials[i] = Material.BrickSlab; - for (int i = 6799; i <= 6878; i++) - materials[i] = Material.BrickStairs; - for (int i = 13532; i <= 13855; i++) - materials[i] = Material.BrickWall; - materials[2041] = Material.Bricks; - for (int i = 10474; i <= 10489; i++) - materials[i] = Material.BrownBanner; - for (int i = 1829; i <= 1844; i++) - materials[i] = Material.BrownBed; - for (int i = 20305; i <= 20320; i++) - materials[i] = Material.BrownCandle; - for (int i = 20395; i <= 20396; i++) - materials[i] = Material.BrownCandleCake; - materials[10263] = Material.BrownCarpet; - materials[12115] = Material.BrownConcrete; - materials[12131] = Material.BrownConcretePowder; - for (int i = 12087; i <= 12090; i++) - materials[i] = Material.BrownGlazedTerracotta; - materials[2037] = Material.BrownMushroom; - for (int i = 6320; i <= 6383; i++) - materials[i] = Material.BrownMushroomBlock; - for (int i = 12015; i <= 12020; i++) - materials[i] = Material.BrownShulkerBox; - materials[5792] = Material.BrownStainedGlass; - for (int i = 9360; i <= 9391; i++) - materials[i] = Material.BrownStainedGlassPane; - materials[8972] = Material.BrownTerracotta; - for (int i = 10586; i <= 10589; i++) - materials[i] = Material.BrownWallBanner; - materials[2008] = Material.BrownWool; - for (int i = 12332; i <= 12333; i++) - materials[i] = Material.BubbleColumn; - for (int i = 12199; i <= 12200; i++) - materials[i] = Material.BubbleCoral; - materials[12182] = Material.BubbleCoralBlock; - for (int i = 12219; i <= 12220; i++) - materials[i] = Material.BubbleCoralFan; - for (int i = 12281; i <= 12288; i++) - materials[i] = Material.BubbleCoralWallFan; - materials[20404] = Material.BuddingAmethyst; - for (int i = 5616; i <= 5631; i++) - materials[i] = Material.Cactus; - for (int i = 5709; i <= 5715; i++) - materials[i] = Material.Cake; - materials[20454] = Material.Calcite; - for (int i = 17883; i <= 17914; i++) - materials[i] = Material.Campfire; - for (int i = 20097; i <= 20112; i++) - materials[i] = Material.Candle; - for (int i = 20369; i <= 20370; i++) - materials[i] = Material.CandleCake; - for (int i = 8363; i <= 8370; i++) - materials[i] = Material.Carrots; - materials[17808] = Material.CartographyTable; - for (int i = 5701; i <= 5704; i++) - materials[i] = Material.CarvedPumpkin; - materials[7168] = Material.Cauldron; - materials[12331] = Material.CaveAir; - for (int i = 21443; i <= 21494; i++) - materials[i] = Material.CaveVines; - for (int i = 21495; i <= 21496; i++) - materials[i] = Material.CaveVinesPlant; - for (int i = 6544; i <= 6549; i++) - materials[i] = Material.Chain; - for (int i = 11902; i <= 11913; i++) - materials[i] = Material.ChainCommandBlock; - for (int i = 2902; i <= 2925; i++) - materials[i] = Material.Chest; - for (int i = 8715; i <= 8718; i++) - materials[i] = Material.ChippedAnvil; - for (int i = 2045; i <= 2300; i++) - materials[i] = Material.ChiseledBookshelf; - materials[23209] = Material.ChiseledDeepslate; - materials[20094] = Material.ChiseledNetherBricks; - materials[19246] = Material.ChiseledPolishedBlackstone; - materials[8840] = Material.ChiseledQuartzBlock; - materials[10603] = Material.ChiseledRedSandstone; - materials[485] = Material.ChiseledSandstone; - materials[6311] = Material.ChiseledStoneBricks; - for (int i = 11793; i <= 11798; i++) - materials[i] = Material.ChorusFlower; - for (int i = 11729; i <= 11792; i++) - materials[i] = Material.ChorusPlant; - materials[5632] = Material.Clay; - materials[10268] = Material.CoalBlock; - materials[116] = Material.CoalOre; - materials[11] = Material.CoarseDirt; - materials[21565] = Material.CobbledDeepslate; - for (int i = 21646; i <= 21651; i++) - materials[i] = Material.CobbledDeepslateSlab; - for (int i = 21566; i <= 21645; i++) - materials[i] = Material.CobbledDeepslateStairs; - for (int i = 21652; i <= 21975; i++) - materials[i] = Material.CobbledDeepslateWall; - materials[14] = Material.Cobblestone; - for (int i = 10769; i <= 10774; i++) - materials[i] = Material.CobblestoneSlab; - for (int i = 4598; i <= 4677; i++) - materials[i] = Material.CobblestoneStairs; - for (int i = 7689; i <= 8012; i++) - materials[i] = Material.CobblestoneWall; - materials[1953] = Material.Cobweb; - for (int i = 7189; i <= 7200; i++) - materials[i] = Material.Cocoa; - for (int i = 7676; i <= 7687; i++) - materials[i] = Material.CommandBlock; - for (int i = 8779; i <= 8794; i++) - materials[i] = Material.Comparator; - for (int i = 18744; i <= 18752; i++) - materials[i] = Material.Composter; - for (int i = 12314; i <= 12315; i++) - materials[i] = Material.Conduit; - materials[20695] = Material.CopperBlock; - materials[20696] = Material.CopperOre; - materials[2034] = Material.Cornflower; - materials[23210] = Material.CrackedDeepslateBricks; - materials[23211] = Material.CrackedDeepslateTiles; - materials[20095] = Material.CrackedNetherBricks; - materials[19245] = Material.CrackedPolishedBlackstoneBricks; - materials[6310] = Material.CrackedStoneBricks; - materials[4225] = Material.CraftingTable; - for (int i = 8651; i <= 8666; i++) - materials[i] = Material.CreeperHead; - for (int i = 8667; i <= 8670; i++) - materials[i] = Material.CreeperWallHead; - for (int i = 18472; i <= 18495; i++) - materials[i] = Material.CrimsonButton; - for (int i = 18520; i <= 18583; i++) - materials[i] = Material.CrimsonDoor; - for (int i = 18056; i <= 18087; i++) - materials[i] = Material.CrimsonFence; - for (int i = 18248; i <= 18279; i++) - materials[i] = Material.CrimsonFenceGate; - materials[17981] = Material.CrimsonFungus; - for (int i = 5126; i <= 5189; i++) - materials[i] = Material.CrimsonHangingSign; - for (int i = 17974; i <= 17976; i++) - materials[i] = Material.CrimsonHyphae; - materials[17980] = Material.CrimsonNylium; - materials[18038] = Material.CrimsonPlanks; - for (int i = 18052; i <= 18053; i++) - materials[i] = Material.CrimsonPressurePlate; - materials[18037] = Material.CrimsonRoots; - for (int i = 18648; i <= 18679; i++) - materials[i] = Material.CrimsonSign; - for (int i = 18040; i <= 18045; i++) - materials[i] = Material.CrimsonSlab; - for (int i = 18312; i <= 18391; i++) - materials[i] = Material.CrimsonStairs; - for (int i = 17968; i <= 17970; i++) - materials[i] = Material.CrimsonStem; - for (int i = 18120; i <= 18183; i++) - materials[i] = Material.CrimsonTrapdoor; - for (int i = 5438; i <= 5445; i++) - materials[i] = Material.CrimsonWallHangingSign; - for (int i = 18712; i <= 18719; i++) - materials[i] = Material.CrimsonWallSign; - materials[18821] = Material.CryingObsidian; - materials[20701] = Material.CutCopper; - for (int i = 21040; i <= 21045; i++) - materials[i] = Material.CutCopperSlab; - for (int i = 20942; i <= 21021; i++) - materials[i] = Material.CutCopperStairs; - materials[10604] = Material.CutRedSandstone; - for (int i = 10811; i <= 10816; i++) - materials[i] = Material.CutRedSandstoneSlab; - materials[486] = Material.CutSandstone; - for (int i = 10757; i <= 10762; i++) - materials[i] = Material.CutSandstoneSlab; - for (int i = 10426; i <= 10441; i++) - materials[i] = Material.CyanBanner; - for (int i = 1781; i <= 1796; i++) - materials[i] = Material.CyanBed; - for (int i = 20257; i <= 20272; i++) - materials[i] = Material.CyanCandle; - for (int i = 20389; i <= 20390; i++) - materials[i] = Material.CyanCandleCake; - materials[10260] = Material.CyanCarpet; - materials[12112] = Material.CyanConcrete; - materials[12128] = Material.CyanConcretePowder; - for (int i = 12075; i <= 12078; i++) - materials[i] = Material.CyanGlazedTerracotta; - for (int i = 11997; i <= 12002; i++) - materials[i] = Material.CyanShulkerBox; - materials[5789] = Material.CyanStainedGlass; - for (int i = 9264; i <= 9295; i++) - materials[i] = Material.CyanStainedGlassPane; - materials[8969] = Material.CyanTerracotta; - for (int i = 10574; i <= 10577; i++) - materials[i] = Material.CyanWallBanner; - materials[2005] = Material.CyanWool; - for (int i = 8719; i <= 8722; i++) - materials[i] = Material.DamagedAnvil; - materials[2024] = Material.Dandelion; - for (int i = 8499; i <= 8522; i++) - materials[i] = Material.DarkOakButton; - for (int i = 11531; i <= 11594; i++) - materials[i] = Material.DarkOakDoor; - for (int i = 11179; i <= 11210; i++) - materials[i] = Material.DarkOakFence; - for (int i = 10955; i <= 10986; i++) - materials[i] = Material.DarkOakFenceGate; - for (int i = 5062; i <= 5125; i++) - materials[i] = Material.DarkOakHangingSign; - for (int i = 354; i <= 381; i++) - materials[i] = Material.DarkOakLeaves; - for (int i = 134; i <= 136; i++) - materials[i] = Material.DarkOakLog; - materials[20] = Material.DarkOakPlanks; - for (int i = 5562; i <= 5563; i++) - materials[i] = Material.DarkOakPressurePlate; - for (int i = 34; i <= 35; i++) - materials[i] = Material.DarkOakSapling; - for (int i = 4410; i <= 4441; i++) - materials[i] = Material.DarkOakSign; - for (int i = 10715; i <= 10720; i++) - materials[i] = Material.DarkOakSlab; - for (int i = 9568; i <= 9647; i++) - materials[i] = Material.DarkOakStairs; - for (int i = 6116; i <= 6179; i++) - materials[i] = Material.DarkOakTrapdoor; - for (int i = 5422; i <= 5429; i++) - materials[i] = Material.DarkOakWallHangingSign; - for (int i = 4718; i <= 4725; i++) - materials[i] = Material.DarkOakWallSign; - for (int i = 187; i <= 189; i++) - materials[i] = Material.DarkOakWood; - materials[9988] = Material.DarkPrismarine; - for (int i = 10241; i <= 10246; i++) - materials[i] = Material.DarkPrismarineSlab; - for (int i = 10149; i <= 10228; i++) - materials[i] = Material.DarkPrismarineStairs; - for (int i = 8795; i <= 8826; i++) - materials[i] = Material.DaylightDetector; - for (int i = 12187; i <= 12188; i++) - materials[i] = Material.DeadBrainCoral; - materials[12176] = Material.DeadBrainCoralBlock; - for (int i = 12207; i <= 12208; i++) - materials[i] = Material.DeadBrainCoralFan; - for (int i = 12233; i <= 12240; i++) - materials[i] = Material.DeadBrainCoralWallFan; - for (int i = 12189; i <= 12190; i++) - materials[i] = Material.DeadBubbleCoral; - materials[12177] = Material.DeadBubbleCoralBlock; - for (int i = 12209; i <= 12210; i++) - materials[i] = Material.DeadBubbleCoralFan; - for (int i = 12241; i <= 12248; i++) - materials[i] = Material.DeadBubbleCoralWallFan; - materials[1956] = Material.DeadBush; - for (int i = 12191; i <= 12192; i++) - materials[i] = Material.DeadFireCoral; - materials[12178] = Material.DeadFireCoralBlock; - for (int i = 12211; i <= 12212; i++) - materials[i] = Material.DeadFireCoralFan; - for (int i = 12249; i <= 12256; i++) - materials[i] = Material.DeadFireCoralWallFan; - for (int i = 12193; i <= 12194; i++) - materials[i] = Material.DeadHornCoral; - materials[12179] = Material.DeadHornCoralBlock; - for (int i = 12213; i <= 12214; i++) - materials[i] = Material.DeadHornCoralFan; - for (int i = 12257; i <= 12264; i++) - materials[i] = Material.DeadHornCoralWallFan; - for (int i = 12185; i <= 12186; i++) - materials[i] = Material.DeadTubeCoral; - materials[12175] = Material.DeadTubeCoralBlock; - for (int i = 12205; i <= 12206; i++) - materials[i] = Material.DeadTubeCoralFan; - for (int i = 12225; i <= 12232; i++) - materials[i] = Material.DeadTubeCoralWallFan; - for (int i = 21562; i <= 21564; i++) - materials[i] = Material.Deepslate; - for (int i = 22879; i <= 22884; i++) - materials[i] = Material.DeepslateBrickSlab; - for (int i = 22799; i <= 22878; i++) - materials[i] = Material.DeepslateBrickStairs; - for (int i = 22885; i <= 23208; i++) - materials[i] = Material.DeepslateBrickWall; - materials[22798] = Material.DeepslateBricks; - materials[117] = Material.DeepslateCoalOre; - materials[20697] = Material.DeepslateCopperOre; - materials[4223] = Material.DeepslateDiamondOre; - materials[7282] = Material.DeepslateEmeraldOre; - materials[113] = Material.DeepslateGoldOre; - materials[115] = Material.DeepslateIronOre; - materials[470] = Material.DeepslateLapisOre; - for (int i = 5570; i <= 5571; i++) - materials[i] = Material.DeepslateRedstoneOre; - for (int i = 22468; i <= 22473; i++) - materials[i] = Material.DeepslateTileSlab; - for (int i = 22388; i <= 22467; i++) - materials[i] = Material.DeepslateTileStairs; - for (int i = 22474; i <= 22797; i++) - materials[i] = Material.DeepslateTileWall; - materials[22387] = Material.DeepslateTiles; - for (int i = 1917; i <= 1940; i++) - materials[i] = Material.DetectorRail; - materials[4224] = Material.DiamondBlock; - materials[4222] = Material.DiamondOre; - materials[4] = Material.Diorite; - for (int i = 13526; i <= 13531; i++) - materials[i] = Material.DioriteSlab; - for (int i = 13374; i <= 13453; i++) - materials[i] = Material.DioriteStairs; - for (int i = 17420; i <= 17743; i++) - materials[i] = Material.DioriteWall; - materials[10] = Material.Dirt; - materials[11888] = Material.DirtPath; - for (int i = 472; i <= 483; i++) - materials[i] = Material.Dispenser; - materials[7186] = Material.DragonEgg; - for (int i = 8671; i <= 8686; i++) - materials[i] = Material.DragonHead; - for (int i = 8687; i <= 8690; i++) - materials[i] = Material.DragonWallHead; - materials[12162] = Material.DriedKelpBlock; - materials[21442] = Material.DripstoneBlock; - for (int i = 8948; i <= 8959; i++) - materials[i] = Material.Dropper; - materials[7435] = Material.EmeraldBlock; - materials[7281] = Material.EmeraldOre; - materials[7159] = Material.EnchantingTable; - materials[11889] = Material.EndGateway; - materials[7176] = Material.EndPortal; - for (int i = 7177; i <= 7184; i++) - materials[i] = Material.EndPortalFrame; - for (int i = 11723; i <= 11728; i++) - materials[i] = Material.EndRod; - materials[7185] = Material.EndStone; - for (int i = 13484; i <= 13489; i++) - materials[i] = Material.EndStoneBrickSlab; - for (int i = 12734; i <= 12813; i++) - materials[i] = Material.EndStoneBrickStairs; - for (int i = 17096; i <= 17419; i++) - materials[i] = Material.EndStoneBrickWall; - materials[11883] = Material.EndStoneBricks; - for (int i = 7283; i <= 7290; i++) - materials[i] = Material.EnderChest; - materials[20694] = Material.ExposedCopper; - materials[20700] = Material.ExposedCutCopper; - for (int i = 21034; i <= 21039; i++) - materials[i] = Material.ExposedCutCopperSlab; - for (int i = 20862; i <= 20941; i++) - materials[i] = Material.ExposedCutCopperStairs; - for (int i = 4234; i <= 4241; i++) - materials[i] = Material.Farmland; - materials[1955] = Material.Fern; - for (int i = 2308; i <= 2819; i++) - materials[i] = Material.Fire; - for (int i = 12201; i <= 12202; i++) - materials[i] = Material.FireCoral; - materials[12183] = Material.FireCoralBlock; - for (int i = 12221; i <= 12222; i++) - materials[i] = Material.FireCoralFan; - for (int i = 12289; i <= 12296; i++) - materials[i] = Material.FireCoralWallFan; - materials[17809] = Material.FletchingTable; - materials[8337] = Material.FlowerPot; - materials[21499] = Material.FloweringAzalea; - for (int i = 438; i <= 465; i++) - materials[i] = Material.FloweringAzaleaLeaves; - materials[23230] = Material.Frogspawn; - for (int i = 11914; i <= 11917; i++) - materials[i] = Material.FrostedIce; - for (int i = 4242; i <= 4249; i++) - materials[i] = Material.Furnace; - materials[19657] = Material.GildedBlackstone; - materials[468] = Material.Glass; - for (int i = 6550; i <= 6581; i++) - materials[i] = Material.GlassPane; - for (int i = 6639; i <= 6766; i++) - materials[i] = Material.GlowLichen; - materials[5698] = Material.Glowstone; - materials[2039] = Material.GoldBlock; - materials[112] = Material.GoldOre; - materials[2] = Material.Granite; - for (int i = 13502; i <= 13507; i++) - materials[i] = Material.GraniteSlab; - for (int i = 13054; i <= 13133; i++) - materials[i] = Material.GraniteStairs; - for (int i = 14828; i <= 15151; i++) - materials[i] = Material.GraniteWall; - materials[1954] = Material.ShortGrass; - for (int i = 8; i <= 9; i++) - materials[i] = Material.GrassBlock; - materials[111] = Material.Gravel; - for (int i = 10394; i <= 10409; i++) - materials[i] = Material.GrayBanner; - for (int i = 1749; i <= 1764; i++) - materials[i] = Material.GrayBed; - for (int i = 20225; i <= 20240; i++) - materials[i] = Material.GrayCandle; - for (int i = 20385; i <= 20386; i++) - materials[i] = Material.GrayCandleCake; - materials[10258] = Material.GrayCarpet; - materials[12110] = Material.GrayConcrete; - materials[12126] = Material.GrayConcretePowder; - for (int i = 12067; i <= 12070; i++) - materials[i] = Material.GrayGlazedTerracotta; - for (int i = 11985; i <= 11990; i++) - materials[i] = Material.GrayShulkerBox; - materials[5787] = Material.GrayStainedGlass; - for (int i = 9200; i <= 9231; i++) - materials[i] = Material.GrayStainedGlassPane; - materials[8967] = Material.GrayTerracotta; - for (int i = 10566; i <= 10569; i++) - materials[i] = Material.GrayWallBanner; - materials[2003] = Material.GrayWool; - for (int i = 10490; i <= 10505; i++) - materials[i] = Material.GreenBanner; - for (int i = 1845; i <= 1860; i++) - materials[i] = Material.GreenBed; - for (int i = 20321; i <= 20336; i++) - materials[i] = Material.GreenCandle; - for (int i = 20397; i <= 20398; i++) - materials[i] = Material.GreenCandleCake; - materials[10264] = Material.GreenCarpet; - materials[12116] = Material.GreenConcrete; - materials[12132] = Material.GreenConcretePowder; - for (int i = 12091; i <= 12094; i++) - materials[i] = Material.GreenGlazedTerracotta; - for (int i = 12021; i <= 12026; i++) - materials[i] = Material.GreenShulkerBox; - materials[5793] = Material.GreenStainedGlass; - for (int i = 9392; i <= 9423; i++) - materials[i] = Material.GreenStainedGlassPane; - materials[8973] = Material.GreenTerracotta; - for (int i = 10590; i <= 10593; i++) - materials[i] = Material.GreenWallBanner; - materials[2009] = Material.GreenWool; - for (int i = 17810; i <= 17821; i++) - materials[i] = Material.Grindstone; - for (int i = 21558; i <= 21559; i++) - materials[i] = Material.HangingRoots; - for (int i = 10248; i <= 10250; i++) - materials[i] = Material.HayBlock; - for (int i = 8763; i <= 8778; i++) - materials[i] = Material.HeavyWeightedPressurePlate; - materials[18817] = Material.HoneyBlock; - materials[18818] = Material.HoneycombBlock; - for (int i = 8829; i <= 8838; i++) - materials[i] = Material.Hopper; - for (int i = 12203; i <= 12204; i++) - materials[i] = Material.HornCoral; - materials[12184] = Material.HornCoralBlock; - for (int i = 12223; i <= 12224; i++) - materials[i] = Material.HornCoralFan; - for (int i = 12297; i <= 12304; i++) - materials[i] = Material.HornCoralWallFan; - materials[5614] = Material.Ice; - materials[6319] = Material.InfestedChiseledStoneBricks; - materials[6315] = Material.InfestedCobblestone; - materials[6318] = Material.InfestedCrackedStoneBricks; - for (int i = 23212; i <= 23214; i++) - materials[i] = Material.InfestedDeepslate; - materials[6317] = Material.InfestedMossyStoneBricks; - materials[6314] = Material.InfestedStone; - materials[6316] = Material.InfestedStoneBricks; - for (int i = 6512; i <= 6543; i++) - materials[i] = Material.IronBars; - materials[2040] = Material.IronBlock; - for (int i = 5488; i <= 5551; i++) - materials[i] = Material.IronDoor; - materials[114] = Material.IronOre; - for (int i = 9922; i <= 9985; i++) - materials[i] = Material.IronTrapdoor; - for (int i = 5705; i <= 5708; i++) - materials[i] = Material.JackOLantern; - for (int i = 18732; i <= 18743; i++) - materials[i] = Material.Jigsaw; - for (int i = 5649; i <= 5650; i++) - materials[i] = Material.Jukebox; - for (int i = 8451; i <= 8474; i++) - materials[i] = Material.JungleButton; - for (int i = 11403; i <= 11466; i++) - materials[i] = Material.JungleDoor; - for (int i = 11115; i <= 11146; i++) - materials[i] = Material.JungleFence; - for (int i = 10891; i <= 10922; i++) - materials[i] = Material.JungleFenceGate; - for (int i = 4998; i <= 5061; i++) - materials[i] = Material.JungleHangingSign; - for (int i = 298; i <= 325; i++) - materials[i] = Material.JungleLeaves; - for (int i = 128; i <= 130; i++) - materials[i] = Material.JungleLog; - materials[18] = Material.JunglePlanks; - for (int i = 5558; i <= 5559; i++) - materials[i] = Material.JunglePressurePlate; - for (int i = 30; i <= 31; i++) - materials[i] = Material.JungleSapling; - for (int i = 4378; i <= 4409; i++) - materials[i] = Material.JungleSign; - for (int i = 10703; i <= 10708; i++) - materials[i] = Material.JungleSlab; - for (int i = 7596; i <= 7675; i++) - materials[i] = Material.JungleStairs; - for (int i = 5988; i <= 6051; i++) - materials[i] = Material.JungleTrapdoor; - for (int i = 5414; i <= 5421; i++) - materials[i] = Material.JungleWallHangingSign; - for (int i = 4710; i <= 4717; i++) - materials[i] = Material.JungleWallSign; - for (int i = 181; i <= 183; i++) - materials[i] = Material.JungleWood; - for (int i = 12135; i <= 12160; i++) - materials[i] = Material.Kelp; - materials[12161] = Material.KelpPlant; - for (int i = 4570; i <= 4577; i++) - materials[i] = Material.Ladder; - for (int i = 17875; i <= 17878; i++) - materials[i] = Material.Lantern; - materials[471] = Material.LapisBlock; - materials[469] = Material.LapisOre; - for (int i = 20417; i <= 20428; i++) - materials[i] = Material.LargeAmethystBud; - for (int i = 10280; i <= 10281; i++) - materials[i] = Material.LargeFern; - for (int i = 93; i <= 108; i++) - materials[i] = Material.Lava; - materials[7172] = Material.LavaCauldron; - for (int i = 17822; i <= 17837; i++) - materials[i] = Material.Lectern; - for (int i = 5462; i <= 5485; i++) - materials[i] = Material.Lever; - for (int i = 9890; i <= 9921; i++) - materials[i] = Material.Light; - for (int i = 10330; i <= 10345; i++) - materials[i] = Material.LightBlueBanner; - for (int i = 1685; i <= 1700; i++) - materials[i] = Material.LightBlueBed; - for (int i = 20161; i <= 20176; i++) - materials[i] = Material.LightBlueCandle; - for (int i = 20377; i <= 20378; i++) - materials[i] = Material.LightBlueCandleCake; - materials[10254] = Material.LightBlueCarpet; - materials[12106] = Material.LightBlueConcrete; - materials[12122] = Material.LightBlueConcretePowder; - for (int i = 12051; i <= 12054; i++) - materials[i] = Material.LightBlueGlazedTerracotta; - for (int i = 11961; i <= 11966; i++) - materials[i] = Material.LightBlueShulkerBox; - materials[5783] = Material.LightBlueStainedGlass; - for (int i = 9072; i <= 9103; i++) - materials[i] = Material.LightBlueStainedGlassPane; - materials[8963] = Material.LightBlueTerracotta; - for (int i = 10550; i <= 10553; i++) - materials[i] = Material.LightBlueWallBanner; - materials[1999] = Material.LightBlueWool; - for (int i = 10410; i <= 10425; i++) - materials[i] = Material.LightGrayBanner; - for (int i = 1765; i <= 1780; i++) - materials[i] = Material.LightGrayBed; - for (int i = 20241; i <= 20256; i++) - materials[i] = Material.LightGrayCandle; - for (int i = 20387; i <= 20388; i++) - materials[i] = Material.LightGrayCandleCake; - materials[10259] = Material.LightGrayCarpet; - materials[12111] = Material.LightGrayConcrete; - materials[12127] = Material.LightGrayConcretePowder; - for (int i = 12071; i <= 12074; i++) - materials[i] = Material.LightGrayGlazedTerracotta; - for (int i = 11991; i <= 11996; i++) - materials[i] = Material.LightGrayShulkerBox; - materials[5788] = Material.LightGrayStainedGlass; - for (int i = 9232; i <= 9263; i++) - materials[i] = Material.LightGrayStainedGlassPane; - materials[8968] = Material.LightGrayTerracotta; - for (int i = 10570; i <= 10573; i++) - materials[i] = Material.LightGrayWallBanner; - materials[2004] = Material.LightGrayWool; - for (int i = 8747; i <= 8762; i++) - materials[i] = Material.LightWeightedPressurePlate; - for (int i = 21398; i <= 21421; i++) - materials[i] = Material.LightningRod; - for (int i = 10272; i <= 10273; i++) - materials[i] = Material.Lilac; - materials[2036] = Material.LilyOfTheValley; - materials[7041] = Material.LilyPad; - for (int i = 10362; i <= 10377; i++) - materials[i] = Material.LimeBanner; - for (int i = 1717; i <= 1732; i++) - materials[i] = Material.LimeBed; - for (int i = 20193; i <= 20208; i++) - materials[i] = Material.LimeCandle; - for (int i = 20381; i <= 20382; i++) - materials[i] = Material.LimeCandleCake; - materials[10256] = Material.LimeCarpet; - materials[12108] = Material.LimeConcrete; - materials[12124] = Material.LimeConcretePowder; - for (int i = 12059; i <= 12062; i++) - materials[i] = Material.LimeGlazedTerracotta; - for (int i = 11973; i <= 11978; i++) - materials[i] = Material.LimeShulkerBox; - materials[5785] = Material.LimeStainedGlass; - for (int i = 9136; i <= 9167; i++) - materials[i] = Material.LimeStainedGlassPane; - materials[8965] = Material.LimeTerracotta; - for (int i = 10558; i <= 10561; i++) - materials[i] = Material.LimeWallBanner; - materials[2001] = Material.LimeWool; - materials[18831] = Material.Lodestone; - for (int i = 17776; i <= 17779; i++) - materials[i] = Material.Loom; - for (int i = 10314; i <= 10329; i++) - materials[i] = Material.MagentaBanner; - for (int i = 1669; i <= 1684; i++) - materials[i] = Material.MagentaBed; - for (int i = 20145; i <= 20160; i++) - materials[i] = Material.MagentaCandle; - for (int i = 20375; i <= 20376; i++) - materials[i] = Material.MagentaCandleCake; - materials[10253] = Material.MagentaCarpet; - materials[12105] = Material.MagentaConcrete; - materials[12121] = Material.MagentaConcretePowder; - for (int i = 12047; i <= 12050; i++) - materials[i] = Material.MagentaGlazedTerracotta; - for (int i = 11955; i <= 11960; i++) - materials[i] = Material.MagentaShulkerBox; - materials[5782] = Material.MagentaStainedGlass; - for (int i = 9040; i <= 9071; i++) - materials[i] = Material.MagentaStainedGlassPane; - materials[8962] = Material.MagentaTerracotta; - for (int i = 10546; i <= 10549; i++) - materials[i] = Material.MagentaWallBanner; - materials[1998] = Material.MagentaWool; - materials[11918] = Material.MagmaBlock; - for (int i = 8523; i <= 8546; i++) - materials[i] = Material.MangroveButton; - for (int i = 11595; i <= 11658; i++) - materials[i] = Material.MangroveDoor; - for (int i = 11211; i <= 11242; i++) - materials[i] = Material.MangroveFence; - for (int i = 10987; i <= 11018; i++) - materials[i] = Material.MangroveFenceGate; - for (int i = 5254; i <= 5317; i++) - materials[i] = Material.MangroveHangingSign; - for (int i = 382; i <= 409; i++) - materials[i] = Material.MangroveLeaves; - for (int i = 137; i <= 139; i++) - materials[i] = Material.MangroveLog; - materials[21] = Material.MangrovePlanks; - for (int i = 5564; i <= 5565; i++) - materials[i] = Material.MangrovePressurePlate; - for (int i = 36; i <= 75; i++) - materials[i] = Material.MangrovePropagule; - for (int i = 140; i <= 141; i++) - materials[i] = Material.MangroveRoots; - for (int i = 4442; i <= 4473; i++) - materials[i] = Material.MangroveSign; - for (int i = 10721; i <= 10726; i++) - materials[i] = Material.MangroveSlab; - for (int i = 9648; i <= 9727; i++) - materials[i] = Material.MangroveStairs; - for (int i = 6180; i <= 6243; i++) - materials[i] = Material.MangroveTrapdoor; - for (int i = 5430; i <= 5437; i++) - materials[i] = Material.MangroveWallHangingSign; - for (int i = 4726; i <= 4733; i++) - materials[i] = Material.MangroveWallSign; - for (int i = 190; i <= 192; i++) - materials[i] = Material.MangroveWood; - for (int i = 20429; i <= 20440; i++) - materials[i] = Material.MediumAmethystBud; - materials[6582] = Material.Melon; - for (int i = 6599; i <= 6606; i++) - materials[i] = Material.MelonStem; - materials[21501] = Material.MossBlock; - materials[21500] = Material.MossCarpet; - materials[2301] = Material.MossyCobblestone; - for (int i = 13478; i <= 13483; i++) - materials[i] = Material.MossyCobblestoneSlab; - for (int i = 12654; i <= 12733; i++) - materials[i] = Material.MossyCobblestoneStairs; - for (int i = 8013; i <= 8336; i++) - materials[i] = Material.MossyCobblestoneWall; - for (int i = 13466; i <= 13471; i++) - materials[i] = Material.MossyStoneBrickSlab; - for (int i = 12494; i <= 12573; i++) - materials[i] = Material.MossyStoneBrickStairs; - for (int i = 14504; i <= 14827; i++) - materials[i] = Material.MossyStoneBrickWall; - materials[6309] = Material.MossyStoneBricks; - for (int i = 2012; i <= 2023; i++) - materials[i] = Material.MovingPiston; - materials[21561] = Material.Mud; - for (int i = 10787; i <= 10792; i++) - materials[i] = Material.MudBrickSlab; - for (int i = 6959; i <= 7038; i++) - materials[i] = Material.MudBrickStairs; - for (int i = 15476; i <= 15799; i++) - materials[i] = Material.MudBrickWall; - materials[6313] = Material.MudBricks; - for (int i = 142; i <= 144; i++) - materials[i] = Material.MuddyMangroveRoots; - for (int i = 6448; i <= 6511; i++) - materials[i] = Material.MushroomStem; - for (int i = 7039; i <= 7040; i++) - materials[i] = Material.Mycelium; - for (int i = 7043; i <= 7074; i++) - materials[i] = Material.NetherBrickFence; - for (int i = 10793; i <= 10798; i++) - materials[i] = Material.NetherBrickSlab; - for (int i = 7075; i <= 7154; i++) - materials[i] = Material.NetherBrickStairs; - for (int i = 15800; i <= 16123; i++) - materials[i] = Material.NetherBrickWall; - materials[7042] = Material.NetherBricks; - materials[118] = Material.NetherGoldOre; - for (int i = 5699; i <= 5700; i++) - materials[i] = Material.NetherPortal; - materials[8828] = Material.NetherQuartzOre; - materials[17967] = Material.NetherSprouts; - for (int i = 7155; i <= 7158; i++) - materials[i] = Material.NetherWart; - materials[11919] = Material.NetherWartBlock; - materials[18819] = Material.NetheriteBlock; - materials[5684] = Material.Netherrack; - for (int i = 487; i <= 1636; i++) - materials[i] = Material.NoteBlock; - for (int i = 8379; i <= 8402; i++) - materials[i] = Material.OakButton; - for (int i = 4506; i <= 4569; i++) - materials[i] = Material.OakDoor; - for (int i = 5651; i <= 5682; i++) - materials[i] = Material.OakFence; - for (int i = 6767; i <= 6798; i++) - materials[i] = Material.OakFenceGate; - for (int i = 4742; i <= 4805; i++) - materials[i] = Material.OakHangingSign; - for (int i = 214; i <= 241; i++) - materials[i] = Material.OakLeaves; - for (int i = 119; i <= 121; i++) - materials[i] = Material.OakLog; - materials[15] = Material.OakPlanks; - for (int i = 5552; i <= 5553; i++) - materials[i] = Material.OakPressurePlate; - for (int i = 24; i <= 25; i++) - materials[i] = Material.OakSapling; - for (int i = 4250; i <= 4281; i++) - materials[i] = Material.OakSign; - for (int i = 10685; i <= 10690; i++) - materials[i] = Material.OakSlab; - for (int i = 2822; i <= 2901; i++) - materials[i] = Material.OakStairs; - for (int i = 5796; i <= 5859; i++) - materials[i] = Material.OakTrapdoor; - for (int i = 5382; i <= 5389; i++) - materials[i] = Material.OakWallHangingSign; - for (int i = 4678; i <= 4685; i++) - materials[i] = Material.OakWallSign; - for (int i = 172; i <= 174; i++) - materials[i] = Material.OakWood; - for (int i = 11925; i <= 11936; i++) - materials[i] = Material.Observer; - materials[2302] = Material.Obsidian; - for (int i = 23221; i <= 23223; i++) - materials[i] = Material.OchreFroglight; - for (int i = 10298; i <= 10313; i++) - materials[i] = Material.OrangeBanner; - for (int i = 1653; i <= 1668; i++) - materials[i] = Material.OrangeBed; - for (int i = 20129; i <= 20144; i++) - materials[i] = Material.OrangeCandle; - for (int i = 20373; i <= 20374; i++) - materials[i] = Material.OrangeCandleCake; - materials[10252] = Material.OrangeCarpet; - materials[12104] = Material.OrangeConcrete; - materials[12120] = Material.OrangeConcretePowder; - for (int i = 12043; i <= 12046; i++) - materials[i] = Material.OrangeGlazedTerracotta; - for (int i = 11949; i <= 11954; i++) - materials[i] = Material.OrangeShulkerBox; - materials[5781] = Material.OrangeStainedGlass; - for (int i = 9008; i <= 9039; i++) - materials[i] = Material.OrangeStainedGlassPane; - materials[8961] = Material.OrangeTerracotta; - materials[2030] = Material.OrangeTulip; - for (int i = 10542; i <= 10545; i++) - materials[i] = Material.OrangeWallBanner; - materials[1997] = Material.OrangeWool; - materials[2033] = Material.OxeyeDaisy; - materials[20692] = Material.OxidizedCopper; - materials[20698] = Material.OxidizedCutCopper; - for (int i = 21022; i <= 21027; i++) - materials[i] = Material.OxidizedCutCopperSlab; - for (int i = 20702; i <= 20781; i++) - materials[i] = Material.OxidizedCutCopperStairs; - materials[10269] = Material.PackedIce; - materials[6312] = Material.PackedMud; - for (int i = 23227; i <= 23229; i++) - materials[i] = Material.PearlescentFroglight; - for (int i = 10276; i <= 10277; i++) - materials[i] = Material.Peony; - for (int i = 10763; i <= 10768; i++) - materials[i] = Material.PetrifiedOakSlab; - for (int i = 8691; i <= 8706; i++) - materials[i] = Material.PiglinHead; - for (int i = 8707; i <= 8710; i++) - materials[i] = Material.PiglinWallHead; - for (int i = 10378; i <= 10393; i++) - materials[i] = Material.PinkBanner; - for (int i = 1733; i <= 1748; i++) - materials[i] = Material.PinkBed; - for (int i = 20209; i <= 20224; i++) - materials[i] = Material.PinkCandle; - for (int i = 20383; i <= 20384; i++) - materials[i] = Material.PinkCandleCake; - materials[10257] = Material.PinkCarpet; - materials[12109] = Material.PinkConcrete; - materials[12125] = Material.PinkConcretePowder; - for (int i = 12063; i <= 12066; i++) - materials[i] = Material.PinkGlazedTerracotta; - for (int i = 11979; i <= 11984; i++) - materials[i] = Material.PinkShulkerBox; - materials[5786] = Material.PinkStainedGlass; - for (int i = 9168; i <= 9199; i++) - materials[i] = Material.PinkStainedGlassPane; - materials[8966] = Material.PinkTerracotta; - materials[2032] = Material.PinkTulip; - for (int i = 10562; i <= 10565; i++) - materials[i] = Material.PinkWallBanner; - materials[2002] = Material.PinkWool; - for (int i = 1960; i <= 1971; i++) - materials[i] = Material.Piston; - for (int i = 1972; i <= 1995; i++) - materials[i] = Material.PistonHead; - for (int i = 8631; i <= 8646; i++) - materials[i] = Material.PlayerHead; - for (int i = 8647; i <= 8650; i++) - materials[i] = Material.PlayerWallHead; - for (int i = 12; i <= 13; i++) - materials[i] = Material.Podzol; - for (int i = 21422; i <= 21441; i++) - materials[i] = Material.PointedDripstone; - materials[7] = Material.PolishedAndesite; - for (int i = 13520; i <= 13525; i++) - materials[i] = Material.PolishedAndesiteSlab; - for (int i = 13294; i <= 13373; i++) - materials[i] = Material.PolishedAndesiteStairs; - for (int i = 5690; i <= 5692; i++) - materials[i] = Material.PolishedBasalt; - materials[19243] = Material.PolishedBlackstone; - for (int i = 19247; i <= 19252; i++) - materials[i] = Material.PolishedBlackstoneBrickSlab; - for (int i = 19253; i <= 19332; i++) - materials[i] = Material.PolishedBlackstoneBrickStairs; - for (int i = 19333; i <= 19656; i++) - materials[i] = Material.PolishedBlackstoneBrickWall; - materials[19244] = Material.PolishedBlackstoneBricks; - for (int i = 19746; i <= 19769; i++) - materials[i] = Material.PolishedBlackstoneButton; - for (int i = 19744; i <= 19745; i++) - materials[i] = Material.PolishedBlackstonePressurePlate; - for (int i = 19738; i <= 19743; i++) - materials[i] = Material.PolishedBlackstoneSlab; - for (int i = 19658; i <= 19737; i++) - materials[i] = Material.PolishedBlackstoneStairs; - for (int i = 19770; i <= 20093; i++) - materials[i] = Material.PolishedBlackstoneWall; - materials[21976] = Material.PolishedDeepslate; - for (int i = 22057; i <= 22062; i++) - materials[i] = Material.PolishedDeepslateSlab; - for (int i = 21977; i <= 22056; i++) - materials[i] = Material.PolishedDeepslateStairs; - for (int i = 22063; i <= 22386; i++) - materials[i] = Material.PolishedDeepslateWall; - materials[5] = Material.PolishedDiorite; - for (int i = 13472; i <= 13477; i++) - materials[i] = Material.PolishedDioriteSlab; - for (int i = 12574; i <= 12653; i++) - materials[i] = Material.PolishedDioriteStairs; - materials[3] = Material.PolishedGranite; - for (int i = 13454; i <= 13459; i++) - materials[i] = Material.PolishedGraniteSlab; - for (int i = 12334; i <= 12413; i++) - materials[i] = Material.PolishedGraniteStairs; - materials[2025] = Material.Poppy; - for (int i = 8371; i <= 8378; i++) - materials[i] = Material.Potatoes; - materials[8342] = Material.PottedAcaciaSapling; - materials[8349] = Material.PottedAllium; - materials[23219] = Material.PottedAzaleaBush; - materials[8350] = Material.PottedAzureBluet; - materials[12329] = Material.PottedBamboo; - materials[8340] = Material.PottedBirchSapling; - materials[8348] = Material.PottedBlueOrchid; - materials[8360] = Material.PottedBrownMushroom; - materials[8362] = Material.PottedCactus; - materials[8356] = Material.PottedCornflower; - materials[18827] = Material.PottedCrimsonFungus; - materials[18829] = Material.PottedCrimsonRoots; - materials[8346] = Material.PottedDandelion; - materials[8343] = Material.PottedDarkOakSapling; - materials[8361] = Material.PottedDeadBush; - materials[8345] = Material.PottedFern; - materials[23220] = Material.PottedFloweringAzaleaBush; - materials[8341] = Material.PottedJungleSapling; - materials[8357] = Material.PottedLilyOfTheValley; - materials[8344] = Material.PottedMangrovePropagule; - materials[8338] = Material.PottedOakSapling; - materials[8352] = Material.PottedOrangeTulip; - materials[8355] = Material.PottedOxeyeDaisy; - materials[8354] = Material.PottedPinkTulip; - materials[8347] = Material.PottedPoppy; - materials[8359] = Material.PottedRedMushroom; - materials[8351] = Material.PottedRedTulip; - materials[8339] = Material.PottedSpruceSapling; - materials[18828] = Material.PottedWarpedFungus; - materials[18830] = Material.PottedWarpedRoots; - materials[8353] = Material.PottedWhiteTulip; - materials[8358] = Material.PottedWitherRose; - materials[20456] = Material.PowderSnow; - for (int i = 7173; i <= 7175; i++) - materials[i] = Material.PowderSnowCauldron; - for (int i = 1893; i <= 1916; i++) - materials[i] = Material.PoweredRail; - materials[9986] = Material.Prismarine; - for (int i = 10235; i <= 10240; i++) - materials[i] = Material.PrismarineBrickSlab; - for (int i = 10069; i <= 10148; i++) - materials[i] = Material.PrismarineBrickStairs; - materials[9987] = Material.PrismarineBricks; - for (int i = 10229; i <= 10234; i++) - materials[i] = Material.PrismarineSlab; - for (int i = 9989; i <= 10068; i++) - materials[i] = Material.PrismarineStairs; - for (int i = 13856; i <= 14179; i++) - materials[i] = Material.PrismarineWall; - materials[5683] = Material.Pumpkin; - for (int i = 6591; i <= 6598; i++) - materials[i] = Material.PumpkinStem; - for (int i = 10442; i <= 10457; i++) - materials[i] = Material.PurpleBanner; - for (int i = 1797; i <= 1812; i++) - materials[i] = Material.PurpleBed; - for (int i = 20273; i <= 20288; i++) - materials[i] = Material.PurpleCandle; - for (int i = 20391; i <= 20392; i++) - materials[i] = Material.PurpleCandleCake; - materials[10261] = Material.PurpleCarpet; - materials[12113] = Material.PurpleConcrete; - materials[12129] = Material.PurpleConcretePowder; - for (int i = 12079; i <= 12082; i++) - materials[i] = Material.PurpleGlazedTerracotta; - for (int i = 12003; i <= 12008; i++) - materials[i] = Material.PurpleShulkerBox; - materials[5790] = Material.PurpleStainedGlass; - for (int i = 9296; i <= 9327; i++) - materials[i] = Material.PurpleStainedGlassPane; - materials[8970] = Material.PurpleTerracotta; - for (int i = 10578; i <= 10581; i++) - materials[i] = Material.PurpleWallBanner; - materials[2006] = Material.PurpleWool; - materials[11799] = Material.PurpurBlock; - for (int i = 11800; i <= 11802; i++) - materials[i] = Material.PurpurPillar; - for (int i = 10817; i <= 10822; i++) - materials[i] = Material.PurpurSlab; - for (int i = 11803; i <= 11882; i++) - materials[i] = Material.PurpurStairs; - materials[8839] = Material.QuartzBlock; - materials[20096] = Material.QuartzBricks; - for (int i = 8841; i <= 8843; i++) - materials[i] = Material.QuartzPillar; - for (int i = 10799; i <= 10804; i++) - materials[i] = Material.QuartzSlab; - for (int i = 8844; i <= 8923; i++) - materials[i] = Material.QuartzStairs; - for (int i = 4578; i <= 4597; i++) - materials[i] = Material.Rail; - materials[23217] = Material.RawCopperBlock; - materials[23218] = Material.RawGoldBlock; - materials[23216] = Material.RawIronBlock; - for (int i = 10506; i <= 10521; i++) - materials[i] = Material.RedBanner; - for (int i = 1861; i <= 1876; i++) - materials[i] = Material.RedBed; - for (int i = 20337; i <= 20352; i++) - materials[i] = Material.RedCandle; - for (int i = 20399; i <= 20400; i++) - materials[i] = Material.RedCandleCake; - materials[10265] = Material.RedCarpet; - materials[12117] = Material.RedConcrete; - materials[12133] = Material.RedConcretePowder; - for (int i = 12095; i <= 12098; i++) - materials[i] = Material.RedGlazedTerracotta; - materials[2038] = Material.RedMushroom; - for (int i = 6384; i <= 6447; i++) - materials[i] = Material.RedMushroomBlock; - for (int i = 13514; i <= 13519; i++) - materials[i] = Material.RedNetherBrickSlab; - for (int i = 13214; i <= 13293; i++) - materials[i] = Material.RedNetherBrickStairs; - for (int i = 16448; i <= 16771; i++) - materials[i] = Material.RedNetherBrickWall; - materials[11920] = Material.RedNetherBricks; - materials[110] = Material.RedSand; - materials[10602] = Material.RedSandstone; - for (int i = 10805; i <= 10810; i++) - materials[i] = Material.RedSandstoneSlab; - for (int i = 10605; i <= 10684; i++) - materials[i] = Material.RedSandstoneStairs; - for (int i = 14180; i <= 14503; i++) - materials[i] = Material.RedSandstoneWall; - for (int i = 12027; i <= 12032; i++) - materials[i] = Material.RedShulkerBox; - materials[5794] = Material.RedStainedGlass; - for (int i = 9424; i <= 9455; i++) - materials[i] = Material.RedStainedGlassPane; - materials[8974] = Material.RedTerracotta; - materials[2029] = Material.RedTulip; - for (int i = 10594; i <= 10597; i++) - materials[i] = Material.RedWallBanner; - materials[2010] = Material.RedWool; - materials[8827] = Material.RedstoneBlock; - for (int i = 7187; i <= 7188; i++) - materials[i] = Material.RedstoneLamp; - for (int i = 5568; i <= 5569; i++) - materials[i] = Material.RedstoneOre; - for (int i = 5572; i <= 5573; i++) - materials[i] = Material.RedstoneTorch; - for (int i = 5574; i <= 5581; i++) - materials[i] = Material.RedstoneWallTorch; - for (int i = 2926; i <= 4221; i++) - materials[i] = Material.RedstoneWire; - materials[23231] = Material.ReinforcedDeepslate; - for (int i = 5716; i <= 5779; i++) - materials[i] = Material.Repeater; - for (int i = 11890; i <= 11901; i++) - materials[i] = Material.RepeatingCommandBlock; - for (int i = 18822; i <= 18826; i++) - materials[i] = Material.RespawnAnchor; - materials[21560] = Material.RootedDirt; - for (int i = 10274; i <= 10275; i++) - materials[i] = Material.RoseBush; - materials[109] = Material.Sand; - materials[484] = Material.Sandstone; - for (int i = 10751; i <= 10756; i++) - materials[i] = Material.SandstoneSlab; - for (int i = 7201; i <= 7280; i++) - materials[i] = Material.SandstoneStairs; - for (int i = 16772; i <= 17095; i++) - materials[i] = Material.SandstoneWall; - for (int i = 17744; i <= 17775; i++) - materials[i] = Material.Scaffolding; - materials[20553] = Material.Sculk; - for (int i = 20682; i <= 20683; i++) - materials[i] = Material.SculkCatalyst; - for (int i = 20457; i <= 20552; i++) - materials[i] = Material.SculkSensor; - for (int i = 20684; i <= 20691; i++) - materials[i] = Material.SculkShrieker; - for (int i = 20554; i <= 20681; i++) - materials[i] = Material.SculkVein; - materials[10247] = Material.SeaLantern; - for (int i = 12305; i <= 12312; i++) - materials[i] = Material.SeaPickle; - materials[1957] = Material.Seagrass; - materials[17982] = Material.Shroomlight; - for (int i = 11937; i <= 11942; i++) - materials[i] = Material.ShulkerBox; - for (int i = 8571; i <= 8586; i++) - materials[i] = Material.SkeletonSkull; - for (int i = 8587; i <= 8590; i++) - materials[i] = Material.SkeletonWallSkull; - materials[9888] = Material.SlimeBlock; - for (int i = 20441; i <= 20452; i++) - materials[i] = Material.SmallAmethystBud; - for (int i = 21542; i <= 21557; i++) - materials[i] = Material.SmallDripleaf; - materials[17838] = Material.SmithingTable; - for (int i = 17792; i <= 17799; i++) - materials[i] = Material.Smoker; - materials[23215] = Material.SmoothBasalt; - materials[10825] = Material.SmoothQuartz; - for (int i = 13496; i <= 13501; i++) - materials[i] = Material.SmoothQuartzSlab; - for (int i = 12974; i <= 13053; i++) - materials[i] = Material.SmoothQuartzStairs; - materials[10826] = Material.SmoothRedSandstone; - for (int i = 13460; i <= 13465; i++) - materials[i] = Material.SmoothRedSandstoneSlab; - for (int i = 12414; i <= 12493; i++) - materials[i] = Material.SmoothRedSandstoneStairs; - materials[10824] = Material.SmoothSandstone; - for (int i = 13490; i <= 13495; i++) - materials[i] = Material.SmoothSandstoneSlab; - for (int i = 12894; i <= 12973; i++) - materials[i] = Material.SmoothSandstoneStairs; - materials[10823] = Material.SmoothStone; - for (int i = 10745; i <= 10750; i++) - materials[i] = Material.SmoothStoneSlab; - for (int i = 5606; i <= 5613; i++) - materials[i] = Material.Snow; - materials[5615] = Material.SnowBlock; - for (int i = 17915; i <= 17946; i++) - materials[i] = Material.SoulCampfire; - materials[2820] = Material.SoulFire; - for (int i = 17879; i <= 17882; i++) - materials[i] = Material.SoulLantern; - materials[5685] = Material.SoulSand; - materials[5686] = Material.SoulSoil; - materials[5693] = Material.SoulTorch; - for (int i = 5694; i <= 5697; i++) - materials[i] = Material.SoulWallTorch; - materials[2821] = Material.Spawner; - materials[466] = Material.Sponge; - materials[21497] = Material.SporeBlossom; - for (int i = 8403; i <= 8426; i++) - materials[i] = Material.SpruceButton; - for (int i = 11275; i <= 11338; i++) - materials[i] = Material.SpruceDoor; - for (int i = 11051; i <= 11082; i++) - materials[i] = Material.SpruceFence; - for (int i = 10827; i <= 10858; i++) - materials[i] = Material.SpruceFenceGate; - for (int i = 4806; i <= 4869; i++) - materials[i] = Material.SpruceHangingSign; - for (int i = 242; i <= 269; i++) - materials[i] = Material.SpruceLeaves; - for (int i = 122; i <= 124; i++) - materials[i] = Material.SpruceLog; - materials[16] = Material.SprucePlanks; - for (int i = 5554; i <= 5555; i++) - materials[i] = Material.SprucePressurePlate; - for (int i = 26; i <= 27; i++) - materials[i] = Material.SpruceSapling; - for (int i = 4282; i <= 4313; i++) - materials[i] = Material.SpruceSign; - for (int i = 10691; i <= 10696; i++) - materials[i] = Material.SpruceSlab; - for (int i = 7436; i <= 7515; i++) - materials[i] = Material.SpruceStairs; - for (int i = 5860; i <= 5923; i++) - materials[i] = Material.SpruceTrapdoor; - for (int i = 5390; i <= 5397; i++) - materials[i] = Material.SpruceWallHangingSign; - for (int i = 4686; i <= 4693; i++) - materials[i] = Material.SpruceWallSign; - for (int i = 175; i <= 177; i++) - materials[i] = Material.SpruceWood; - for (int i = 1941; i <= 1952; i++) - materials[i] = Material.StickyPiston; - materials[1] = Material.Stone; - for (int i = 10781; i <= 10786; i++) - materials[i] = Material.StoneBrickSlab; - for (int i = 6879; i <= 6958; i++) - materials[i] = Material.StoneBrickStairs; - for (int i = 15152; i <= 15475; i++) - materials[i] = Material.StoneBrickWall; - materials[6308] = Material.StoneBricks; - for (int i = 5582; i <= 5605; i++) - materials[i] = Material.StoneButton; - for (int i = 5486; i <= 5487; i++) - materials[i] = Material.StonePressurePlate; - for (int i = 10739; i <= 10744; i++) - materials[i] = Material.StoneSlab; - for (int i = 12814; i <= 12893; i++) - materials[i] = Material.StoneStairs; - for (int i = 17839; i <= 17842; i++) - materials[i] = Material.Stonecutter; - for (int i = 157; i <= 159; i++) - materials[i] = Material.StrippedAcaciaLog; - for (int i = 205; i <= 207; i++) - materials[i] = Material.StrippedAcaciaWood; - for (int i = 169; i <= 171; i++) - materials[i] = Material.StrippedBambooBlock; - for (int i = 151; i <= 153; i++) - materials[i] = Material.StrippedBirchLog; - for (int i = 199; i <= 201; i++) - materials[i] = Material.StrippedBirchWood; - for (int i = 17977; i <= 17979; i++) - materials[i] = Material.StrippedCrimsonHyphae; - for (int i = 17971; i <= 17973; i++) - materials[i] = Material.StrippedCrimsonStem; - for (int i = 160; i <= 162; i++) - materials[i] = Material.StrippedDarkOakLog; - for (int i = 208; i <= 210; i++) - materials[i] = Material.StrippedDarkOakWood; - for (int i = 154; i <= 156; i++) - materials[i] = Material.StrippedJungleLog; - for (int i = 202; i <= 204; i++) - materials[i] = Material.StrippedJungleWood; - for (int i = 166; i <= 168; i++) - materials[i] = Material.StrippedMangroveLog; - for (int i = 211; i <= 213; i++) - materials[i] = Material.StrippedMangroveWood; - for (int i = 163; i <= 165; i++) - materials[i] = Material.StrippedOakLog; - for (int i = 193; i <= 195; i++) - materials[i] = Material.StrippedOakWood; - for (int i = 148; i <= 150; i++) - materials[i] = Material.StrippedSpruceLog; - for (int i = 196; i <= 198; i++) - materials[i] = Material.StrippedSpruceWood; - for (int i = 17960; i <= 17962; i++) - materials[i] = Material.StrippedWarpedHyphae; - for (int i = 17954; i <= 17956; i++) - materials[i] = Material.StrippedWarpedStem; - for (int i = 18728; i <= 18731; i++) - materials[i] = Material.StructureBlock; - materials[11924] = Material.StructureVoid; - for (int i = 5633; i <= 5648; i++) - materials[i] = Material.SugarCane; - for (int i = 10270; i <= 10271; i++) - materials[i] = Material.Sunflower; - for (int i = 17947; i <= 17950; i++) - materials[i] = Material.SweetBerryBush; - for (int i = 10278; i <= 10279; i++) - materials[i] = Material.TallGrass; - for (int i = 1958; i <= 1959; i++) - materials[i] = Material.TallSeagrass; - for (int i = 18753; i <= 18768; i++) - materials[i] = Material.Target; - materials[10267] = Material.Terracotta; - materials[20455] = Material.TintedGlass; - for (int i = 2042; i <= 2043; i++) - materials[i] = Material.Tnt; - materials[2303] = Material.Torch; - for (int i = 8723; i <= 8746; i++) - materials[i] = Material.TrappedChest; - for (int i = 7307; i <= 7434; i++) - materials[i] = Material.Tripwire; - for (int i = 7291; i <= 7306; i++) - materials[i] = Material.TripwireHook; - for (int i = 12195; i <= 12196; i++) - materials[i] = Material.TubeCoral; - materials[12180] = Material.TubeCoralBlock; - for (int i = 12215; i <= 12216; i++) - materials[i] = Material.TubeCoralFan; - for (int i = 12265; i <= 12272; i++) - materials[i] = Material.TubeCoralWallFan; - materials[20453] = Material.Tuff; - for (int i = 12163; i <= 12174; i++) - materials[i] = Material.TurtleEgg; - for (int i = 18010; i <= 18035; i++) - materials[i] = Material.TwistingVines; - materials[18036] = Material.TwistingVinesPlant; - for (int i = 23224; i <= 23226; i++) - materials[i] = Material.VerdantFroglight; - for (int i = 6607; i <= 6638; i++) - materials[i] = Material.Vine; - materials[12330] = Material.VoidAir; - for (int i = 2304; i <= 2307; i++) - materials[i] = Material.WallTorch; - for (int i = 18496; i <= 18519; i++) - materials[i] = Material.WarpedButton; - for (int i = 18584; i <= 18647; i++) - materials[i] = Material.WarpedDoor; - for (int i = 18088; i <= 18119; i++) - materials[i] = Material.WarpedFence; - for (int i = 18280; i <= 18311; i++) - materials[i] = Material.WarpedFenceGate; - materials[17964] = Material.WarpedFungus; - for (int i = 5190; i <= 5253; i++) - materials[i] = Material.WarpedHangingSign; - for (int i = 17957; i <= 17959; i++) - materials[i] = Material.WarpedHyphae; - materials[17963] = Material.WarpedNylium; - materials[18039] = Material.WarpedPlanks; - for (int i = 18054; i <= 18055; i++) - materials[i] = Material.WarpedPressurePlate; - materials[17966] = Material.WarpedRoots; - for (int i = 18680; i <= 18711; i++) - materials[i] = Material.WarpedSign; - for (int i = 18046; i <= 18051; i++) - materials[i] = Material.WarpedSlab; - for (int i = 18392; i <= 18471; i++) - materials[i] = Material.WarpedStairs; - for (int i = 17951; i <= 17953; i++) - materials[i] = Material.WarpedStem; - for (int i = 18184; i <= 18247; i++) - materials[i] = Material.WarpedTrapdoor; - for (int i = 5446; i <= 5453; i++) - materials[i] = Material.WarpedWallHangingSign; - for (int i = 18720; i <= 18727; i++) - materials[i] = Material.WarpedWallSign; - materials[17965] = Material.WarpedWartBlock; - for (int i = 77; i <= 92; i++) - materials[i] = Material.Water; - for (int i = 7169; i <= 7171; i++) - materials[i] = Material.WaterCauldron; - materials[21046] = Material.WaxedCopperBlock; - materials[21053] = Material.WaxedCutCopper; - for (int i = 21392; i <= 21397; i++) - materials[i] = Material.WaxedCutCopperSlab; - for (int i = 21294; i <= 21373; i++) - materials[i] = Material.WaxedCutCopperStairs; - materials[21048] = Material.WaxedExposedCopper; - materials[21052] = Material.WaxedExposedCutCopper; - for (int i = 21386; i <= 21391; i++) - materials[i] = Material.WaxedExposedCutCopperSlab; - for (int i = 21214; i <= 21293; i++) - materials[i] = Material.WaxedExposedCutCopperStairs; - materials[21049] = Material.WaxedOxidizedCopper; - materials[21050] = Material.WaxedOxidizedCutCopper; - for (int i = 21374; i <= 21379; i++) - materials[i] = Material.WaxedOxidizedCutCopperSlab; - for (int i = 21054; i <= 21133; i++) - materials[i] = Material.WaxedOxidizedCutCopperStairs; - materials[21047] = Material.WaxedWeatheredCopper; - materials[21051] = Material.WaxedWeatheredCutCopper; - for (int i = 21380; i <= 21385; i++) - materials[i] = Material.WaxedWeatheredCutCopperSlab; - for (int i = 21134; i <= 21213; i++) - materials[i] = Material.WaxedWeatheredCutCopperStairs; - materials[20693] = Material.WeatheredCopper; - materials[20699] = Material.WeatheredCutCopper; - for (int i = 21028; i <= 21033; i++) - materials[i] = Material.WeatheredCutCopperSlab; - for (int i = 20782; i <= 20861; i++) - materials[i] = Material.WeatheredCutCopperStairs; - for (int i = 17983; i <= 18008; i++) - materials[i] = Material.WeepingVines; - materials[18009] = Material.WeepingVinesPlant; - materials[467] = Material.WetSponge; - for (int i = 4226; i <= 4233; i++) - materials[i] = Material.Wheat; - for (int i = 10282; i <= 10297; i++) - materials[i] = Material.WhiteBanner; - for (int i = 1637; i <= 1652; i++) - materials[i] = Material.WhiteBed; - for (int i = 20113; i <= 20128; i++) - materials[i] = Material.WhiteCandle; - for (int i = 20371; i <= 20372; i++) - materials[i] = Material.WhiteCandleCake; - materials[10251] = Material.WhiteCarpet; - materials[12103] = Material.WhiteConcrete; - materials[12119] = Material.WhiteConcretePowder; - for (int i = 12039; i <= 12042; i++) - materials[i] = Material.WhiteGlazedTerracotta; - for (int i = 11943; i <= 11948; i++) - materials[i] = Material.WhiteShulkerBox; - materials[5780] = Material.WhiteStainedGlass; - for (int i = 8976; i <= 9007; i++) - materials[i] = Material.WhiteStainedGlassPane; - materials[8960] = Material.WhiteTerracotta; - materials[2031] = Material.WhiteTulip; - for (int i = 10538; i <= 10541; i++) - materials[i] = Material.WhiteWallBanner; - materials[1996] = Material.WhiteWool; - materials[2035] = Material.WitherRose; - for (int i = 8591; i <= 8606; i++) - materials[i] = Material.WitherSkeletonSkull; - for (int i = 8607; i <= 8610; i++) - materials[i] = Material.WitherSkeletonWallSkull; - for (int i = 10346; i <= 10361; i++) - materials[i] = Material.YellowBanner; - for (int i = 1701; i <= 1716; i++) - materials[i] = Material.YellowBed; - for (int i = 20177; i <= 20192; i++) - materials[i] = Material.YellowCandle; - for (int i = 20379; i <= 20380; i++) - materials[i] = Material.YellowCandleCake; - materials[10255] = Material.YellowCarpet; - materials[12107] = Material.YellowConcrete; - materials[12123] = Material.YellowConcretePowder; - for (int i = 12055; i <= 12058; i++) - materials[i] = Material.YellowGlazedTerracotta; - for (int i = 11967; i <= 11972; i++) - materials[i] = Material.YellowShulkerBox; - materials[5784] = Material.YellowStainedGlass; - for (int i = 9104; i <= 9135; i++) - materials[i] = Material.YellowStainedGlassPane; - materials[8964] = Material.YellowTerracotta; - for (int i = 10554; i <= 10557; i++) - materials[i] = Material.YellowWallBanner; - materials[2000] = Material.YellowWool; - for (int i = 8611; i <= 8626; i++) - materials[i] = Material.ZombieHead; - for (int i = 8627; i <= 8630; i++) - materials[i] = Material.ZombieWallHead; - } - - // - private static readonly BlockStateDefinition[] stateDefinitions = - [ - new(8, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(12, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(24, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(26, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(28, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(30, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(32, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(34, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(36, 40, - [ - new("age", ["0", "1", "2", "3", "4"], 8), - new("hanging", ["true", "false"], 4), - new("stage", ["0", "1"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(77, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(93, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(119, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(122, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(125, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(128, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(131, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(134, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(137, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(140, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(142, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(145, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(148, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(151, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(154, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(157, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(160, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(163, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(166, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(169, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(172, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(175, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(178, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(181, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(184, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(187, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(190, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(193, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(196, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(199, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(202, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(205, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(208, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(211, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(214, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(242, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(270, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(298, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(326, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(354, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(382, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(410, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(438, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(472, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(487, 1150, - [ - new("instrument", ["harp", "basedrum", "snare", "hat", "bass", "flute", "bell", "guitar", "chime", "xylophone", "iron_xylophone", "cow_bell", "didgeridoo", "bit", "banjo", "pling", "zombie", "skeleton", "creeper", "dragon", "wither_skeleton", "piglin", "custom_head"], 50), - new("note", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"], 2), - new("powered", ["true", "false"], 1) - ]), - new(1637, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1653, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1669, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1685, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1701, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1717, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1733, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1749, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1765, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1781, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1797, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1813, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1829, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1845, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1861, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1877, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1893, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(1917, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(1941, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(1958, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(1960, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(1972, 24, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("short", ["true", "false"], 2) - ]), - new(2012, 12, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 2) - ]), - new(2042, 2, - [ - new("unstable", ["true", "false"], 1) - ]), - new(2045, 256, - [ - new("facing", ["north", "south", "west", "east"], 64), - new("slot_0_occupied", ["true", "false"], 32), - new("slot_1_occupied", ["true", "false"], 16), - new("slot_2_occupied", ["true", "false"], 8), - new("slot_3_occupied", ["true", "false"], 4), - new("slot_4_occupied", ["true", "false"], 2), - new("slot_5_occupied", ["true", "false"], 1) - ]), - new(2304, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(2308, 512, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(2822, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2902, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(2926, 1296, - [ - new("east", ["up", "side", "none"], 432), - new("north", ["up", "side", "none"], 144), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 9), - new("south", ["up", "side", "none"], 3), - new("west", ["up", "side", "none"], 1) - ]), - new(4226, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4234, 8, - [ - new("moisture", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4242, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(4250, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4282, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4314, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4346, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4378, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4410, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4442, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4474, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4506, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(4570, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4578, 20, - [ - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south", "south_east", "south_west", "north_west", "north_east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4598, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4678, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4686, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4694, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4702, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4710, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4718, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4726, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4734, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4742, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4806, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4870, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4934, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4998, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5062, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5126, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5190, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5254, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5318, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5382, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5390, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5398, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5406, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5414, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5422, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5430, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5438, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5446, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5454, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5462, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5486, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5488, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5552, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5554, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5556, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5558, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5560, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5562, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5564, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5566, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5568, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5570, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5572, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5574, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(5582, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5606, 8, - [ - new("layers", ["1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(5616, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5633, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5649, 2, - [ - new("has_record", ["true", "false"], 1) - ]), - new(5651, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5687, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(5690, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(5694, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5699, 2, - [ - new("axis", ["x", "z"], 1) - ]), - new(5701, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5705, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5709, 7, - [ - new("bites", ["0", "1", "2", "3", "4", "5", "6"], 1) - ]), - new(5716, 64, - [ - new("delay", ["1", "2", "3", "4"], 16), - new("facing", ["north", "south", "west", "east"], 4), - new("locked", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5796, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5860, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5924, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5988, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6052, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6116, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6180, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6244, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6320, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6384, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6448, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6512, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6544, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6550, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6583, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6587, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6591, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(6599, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(6607, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6639, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6767, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6799, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6879, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6959, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7039, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(7043, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7075, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7155, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(7160, 8, - [ - new("has_bottle_0", ["true", "false"], 4), - new("has_bottle_1", ["true", "false"], 2), - new("has_bottle_2", ["true", "false"], 1) - ]), - new(7169, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(7173, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(7177, 8, - [ - new("eye", ["true", "false"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7187, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(7189, 12, - [ - new("age", ["0", "1", "2"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7201, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7283, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7291, 16, - [ - new("attached", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7307, 128, - [ - new("attached", ["true", "false"], 64), - new("disarmed", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("powered", ["true", "false"], 4), - new("south", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7436, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7516, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7596, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7676, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(7689, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(8013, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(8363, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(8371, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(8379, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8403, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8427, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8451, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8475, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8499, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8523, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8547, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8571, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8587, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8591, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8607, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8611, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8627, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8631, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8647, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8651, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8667, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8671, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8687, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8691, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8707, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8711, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8715, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8719, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8723, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(8747, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8763, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8779, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("mode", ["compare", "subtract"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8795, 32, - [ - new("inverted", ["true", "false"], 16), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8829, 10, - [ - new("enabled", ["true", "false"], 5), - new("facing", ["down", "north", "south", "west", "east"], 1) - ]), - new(8841, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(8844, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8924, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8948, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(8976, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9008, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9040, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9072, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9104, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9136, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9168, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9200, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9232, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9264, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9296, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9328, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9360, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9392, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9424, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9456, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9488, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9568, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9648, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9728, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9808, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9890, 32, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9922, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9989, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10069, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10149, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10229, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10235, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10241, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10248, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(10270, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10272, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10274, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10276, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10278, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10280, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10282, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10298, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10314, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10330, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10346, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10362, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10378, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10394, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10410, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10426, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10442, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10458, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10474, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10490, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10506, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10522, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10538, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10542, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10546, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10550, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10554, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10558, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10562, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10566, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10570, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10574, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10578, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10582, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10586, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10590, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10594, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10598, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10605, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10685, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10691, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10697, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10703, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10709, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10715, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10721, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10727, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10733, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10739, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10745, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10751, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10757, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10763, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10769, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10775, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10781, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10787, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10793, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10799, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10805, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10811, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10817, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10827, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10859, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10891, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10923, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10955, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10987, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11019, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11051, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11083, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11115, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11147, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11179, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11211, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11243, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11275, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11339, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11403, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11467, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11531, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11595, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11659, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11723, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(11729, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11793, 6, - [ - new("age", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(11800, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(11803, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11884, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(11890, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(11902, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(11914, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(11921, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(11925, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11937, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(11943, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(11949, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(11955, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(11961, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(11967, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(11973, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(11979, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(11985, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(11991, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(11997, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12003, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12009, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12015, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12021, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12027, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12033, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12039, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12043, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12047, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12051, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12055, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12059, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12063, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12067, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12071, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12075, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12079, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12083, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12087, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12091, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12095, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12099, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12135, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(12163, 12, - [ - new("eggs", ["1", "2", "3", "4"], 3), - new("hatch", ["0", "1", "2"], 1) - ]), - new(12185, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12187, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12189, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12191, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12193, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12195, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12197, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12199, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12201, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12203, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12205, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12207, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12209, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12211, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12213, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12215, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12217, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12219, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12221, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12223, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12225, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12233, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12241, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12249, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12257, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12265, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12273, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12281, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12289, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12297, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12305, 8, - [ - new("pickles", ["1", "2", "3", "4"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12314, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12317, 12, - [ - new("age", ["0", "1"], 6), - new("leaves", ["none", "small", "large"], 2), - new("stage", ["0", "1"], 1) - ]), - new(12332, 2, - [ - new("drag", ["true", "false"], 1) - ]), - new(12334, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12414, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12494, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12574, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12654, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12734, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12814, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12894, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12974, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13054, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13134, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13214, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13294, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13374, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13454, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13460, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13466, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13472, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13478, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13484, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13490, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13496, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13502, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13508, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13514, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13520, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13526, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13532, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(13856, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14180, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14504, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14828, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15152, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15476, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15800, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16124, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16448, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16772, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17096, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17420, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17744, 32, - [ - new("bottom", ["true", "false"], 16), - new("distance", ["0", "1", "2", "3", "4", "5", "6", "7"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17776, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(17780, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("open", ["true", "false"], 1) - ]), - new(17792, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(17800, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(17810, 12, - [ - new("face", ["floor", "wall", "ceiling"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(17822, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("has_book", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(17839, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(17843, 32, - [ - new("attachment", ["floor", "ceiling", "single_wall", "double_wall"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(17875, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17879, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17883, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17915, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(17947, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(17951, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(17954, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(17957, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(17960, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(17968, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(17971, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(17974, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(17977, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(17983, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(18010, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(18040, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18046, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18052, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(18054, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(18056, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(18088, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(18120, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18184, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18248, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18280, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18312, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18392, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18472, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18496, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18520, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18584, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18648, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18680, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18712, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18720, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18728, 4, - [ - new("mode", ["save", "load", "corner", "data"], 1) - ]), - new(18732, 12, - [ - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 1) - ]), - new(18744, 9, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(18753, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(18769, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(18793, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(18822, 5, - [ - new("charges", ["0", "1", "2", "3", "4"], 1) - ]), - new(18833, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18913, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19237, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19247, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19253, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19333, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19658, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19738, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19744, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(19746, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19770, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20097, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20113, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20129, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20145, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20161, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20177, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20193, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20209, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20225, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20241, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20257, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20273, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20289, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20305, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20321, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20337, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20353, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20369, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20371, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20373, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20375, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20377, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20379, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20381, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20383, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20385, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20387, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20389, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20391, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20393, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20395, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20397, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20399, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20401, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20405, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20417, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20429, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20441, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20457, 96, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20554, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(20682, 2, - [ - new("bloom", ["true", "false"], 1) - ]), - new(20684, 8, - [ - new("can_summon", ["true", "false"], 4), - new("shrieking", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20702, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20782, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20862, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20942, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21022, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21028, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21034, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21040, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21054, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21134, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21214, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21294, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21374, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21380, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21386, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21392, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21398, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21422, 20, - [ - new("thickness", ["tip_merge", "tip", "frustum", "middle", "base"], 4), - new("vertical_direction", ["up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21443, 52, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 2), - new("berries", ["true", "false"], 1) - ]), - new(21495, 2, - [ - new("berries", ["true", "false"], 1) - ]), - new(21502, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("tilt", ["none", "unstable", "partial", "full"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21534, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21542, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("half", ["upper", "lower"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21558, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(21562, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(21566, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21646, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21652, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(21977, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22057, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22063, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(22388, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22468, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22474, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(22799, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22879, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22885, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(23212, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(23221, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(23224, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(23227, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - ]; - // - - protected override Dictionary GetDict() - { - return materials; - } - - protected override BlockStateDefinition[] GetStateDefinitions() - { - return stateDefinitions; - } - } -} diff --git a/MinecraftClient/Mapping/BlockPalettes/Palette1194.cs b/MinecraftClient/Mapping/BlockPalettes/Palette1194.cs deleted file mode 100644 index 89311f2545..0000000000 --- a/MinecraftClient/Mapping/BlockPalettes/Palette1194.cs +++ /dev/null @@ -1,5113 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.BlockPalettes -{ - public class Palette1194 : BlockPalette - { - private static readonly Dictionary materials = new(); - - static Palette1194() - { - for (int i = 8703; i <= 8726; i++) - materials[i] = Material.AcaciaButton; - for (int i = 11869; i <= 11932; i++) - materials[i] = Material.AcaciaDoor; - for (int i = 11517; i <= 11548; i++) - materials[i] = Material.AcaciaFence; - for (int i = 11261; i <= 11292; i++) - materials[i] = Material.AcaciaFenceGate; - for (int i = 5022; i <= 5085; i++) - materials[i] = Material.AcaciaHangingSign; - for (int i = 345; i <= 372; i++) - materials[i] = Material.AcaciaLeaves; - for (int i = 138; i <= 140; i++) - materials[i] = Material.AcaciaLog; - materials[19] = Material.AcaciaPlanks; - for (int i = 5720; i <= 5721; i++) - materials[i] = Material.AcaciaPressurePlate; - for (int i = 33; i <= 34; i++) - materials[i] = Material.AcaciaSapling; - for (int i = 4394; i <= 4425; i++) - materials[i] = Material.AcaciaSign; - for (int i = 11041; i <= 11046; i++) - materials[i] = Material.AcaciaSlab; - for (int i = 9740; i <= 9819; i++) - materials[i] = Material.AcaciaStairs; - for (int i = 6214; i <= 6277; i++) - materials[i] = Material.AcaciaTrapdoor; - for (int i = 5558; i <= 5565; i++) - materials[i] = Material.AcaciaWallHangingSign; - for (int i = 4782; i <= 4789; i++) - materials[i] = Material.AcaciaWallSign; - for (int i = 197; i <= 199; i++) - materials[i] = Material.AcaciaWood; - for (int i = 9176; i <= 9199; i++) - materials[i] = Material.ActivatorRail; - materials[0] = Material.Air; - materials[2075] = Material.Allium; - materials[20872] = Material.AmethystBlock; - for (int i = 20874; i <= 20885; i++) - materials[i] = Material.AmethystCluster; - materials[19289] = Material.AncientDebris; - materials[6] = Material.Andesite; - for (int i = 13977; i <= 13982; i++) - materials[i] = Material.AndesiteSlab; - for (int i = 13603; i <= 13682; i++) - materials[i] = Material.AndesiteStairs; - for (int i = 16593; i <= 16916; i++) - materials[i] = Material.AndesiteWall; - for (int i = 8963; i <= 8966; i++) - materials[i] = Material.Anvil; - for (int i = 6813; i <= 6816; i++) - materials[i] = Material.AttachedMelonStem; - for (int i = 6809; i <= 6812; i++) - materials[i] = Material.AttachedPumpkinStem; - materials[21967] = Material.Azalea; - for (int i = 457; i <= 484; i++) - materials[i] = Material.AzaleaLeaves; - materials[2076] = Material.AzureBluet; - for (int i = 12786; i <= 12797; i++) - materials[i] = Material.Bamboo; - for (int i = 155; i <= 157; i++) - materials[i] = Material.BambooBlock; - for (int i = 8799; i <= 8822; i++) - materials[i] = Material.BambooButton; - for (int i = 12125; i <= 12188; i++) - materials[i] = Material.BambooDoor; - for (int i = 11645; i <= 11676; i++) - materials[i] = Material.BambooFence; - for (int i = 11389; i <= 11420; i++) - materials[i] = Material.BambooFenceGate; - for (int i = 5470; i <= 5533; i++) - materials[i] = Material.BambooHangingSign; - materials[24] = Material.BambooMosaic; - for (int i = 11071; i <= 11076; i++) - materials[i] = Material.BambooMosaicSlab; - for (int i = 10140; i <= 10219; i++) - materials[i] = Material.BambooMosaicStairs; - materials[23] = Material.BambooPlanks; - for (int i = 5728; i <= 5729; i++) - materials[i] = Material.BambooPressurePlate; - materials[12785] = Material.BambooSapling; - for (int i = 4554; i <= 4585; i++) - materials[i] = Material.BambooSign; - for (int i = 11065; i <= 11070; i++) - materials[i] = Material.BambooSlab; - for (int i = 10060; i <= 10139; i++) - materials[i] = Material.BambooStairs; - for (int i = 6470; i <= 6533; i++) - materials[i] = Material.BambooTrapdoor; - for (int i = 5614; i <= 5621; i++) - materials[i] = Material.BambooWallHangingSign; - for (int i = 4822; i <= 4829; i++) - materials[i] = Material.BambooWallSign; - for (int i = 18249; i <= 18260; i++) - materials[i] = Material.Barrel; - materials[10221] = Material.Barrier; - for (int i = 5849; i <= 5851; i++) - materials[i] = Material.Basalt; - materials[7914] = Material.Beacon; - materials[79] = Material.Bedrock; - for (int i = 19238; i <= 19261; i++) - materials[i] = Material.BeeNest; - for (int i = 19262; i <= 19285; i++) - materials[i] = Material.Beehive; - for (int i = 12353; i <= 12356; i++) - materials[i] = Material.Beetroots; - for (int i = 18312; i <= 18343; i++) - materials[i] = Material.Bell; - for (int i = 21987; i <= 22018; i++) - materials[i] = Material.BigDripleaf; - for (int i = 22019; i <= 22026; i++) - materials[i] = Material.BigDripleafStem; - for (int i = 8655; i <= 8678; i++) - materials[i] = Material.BirchButton; - for (int i = 11741; i <= 11804; i++) - materials[i] = Material.BirchDoor; - for (int i = 11453; i <= 11484; i++) - materials[i] = Material.BirchFence; - for (int i = 11197; i <= 11228; i++) - materials[i] = Material.BirchFenceGate; - for (int i = 4958; i <= 5021; i++) - materials[i] = Material.BirchHangingSign; - for (int i = 289; i <= 316; i++) - materials[i] = Material.BirchLeaves; - for (int i = 132; i <= 134; i++) - materials[i] = Material.BirchLog; - materials[17] = Material.BirchPlanks; - for (int i = 5716; i <= 5717; i++) - materials[i] = Material.BirchPressurePlate; - for (int i = 29; i <= 30; i++) - materials[i] = Material.BirchSapling; - for (int i = 4362; i <= 4393; i++) - materials[i] = Material.BirchSign; - for (int i = 11029; i <= 11034; i++) - materials[i] = Material.BirchSlab; - for (int i = 7742; i <= 7821; i++) - materials[i] = Material.BirchStairs; - for (int i = 6086; i <= 6149; i++) - materials[i] = Material.BirchTrapdoor; - for (int i = 5550; i <= 5557; i++) - materials[i] = Material.BirchWallHangingSign; - for (int i = 4774; i <= 4781; i++) - materials[i] = Material.BirchWallSign; - for (int i = 191; i <= 193; i++) - materials[i] = Material.BirchWood; - for (int i = 10854; i <= 10869; i++) - materials[i] = Material.BlackBanner; - for (int i = 1924; i <= 1939; i++) - materials[i] = Material.BlackBed; - for (int i = 20822; i <= 20837; i++) - materials[i] = Material.BlackCandle; - for (int i = 20870; i <= 20871; i++) - materials[i] = Material.BlackCandleCake; - materials[10598] = Material.BlackCarpet; - materials[12587] = Material.BlackConcrete; - materials[12603] = Material.BlackConcretePowder; - for (int i = 12568; i <= 12571; i++) - materials[i] = Material.BlackGlazedTerracotta; - for (int i = 12502; i <= 12507; i++) - materials[i] = Material.BlackShulkerBox; - materials[5957] = Material.BlackStainedGlass; - for (int i = 9708; i <= 9739; i++) - materials[i] = Material.BlackStainedGlassPane; - materials[9227] = Material.BlackTerracotta; - for (int i = 10930; i <= 10933; i++) - materials[i] = Material.BlackWallBanner; - materials[2058] = Material.BlackWool; - materials[19301] = Material.Blackstone; - for (int i = 19706; i <= 19711; i++) - materials[i] = Material.BlackstoneSlab; - for (int i = 19302; i <= 19381; i++) - materials[i] = Material.BlackstoneStairs; - for (int i = 19382; i <= 19705; i++) - materials[i] = Material.BlackstoneWall; - for (int i = 18269; i <= 18276; i++) - materials[i] = Material.BlastFurnace; - for (int i = 10790; i <= 10805; i++) - materials[i] = Material.BlueBanner; - for (int i = 1860; i <= 1875; i++) - materials[i] = Material.BlueBed; - for (int i = 20758; i <= 20773; i++) - materials[i] = Material.BlueCandle; - for (int i = 20862; i <= 20863; i++) - materials[i] = Material.BlueCandleCake; - materials[10594] = Material.BlueCarpet; - materials[12583] = Material.BlueConcrete; - materials[12599] = Material.BlueConcretePowder; - for (int i = 12552; i <= 12555; i++) - materials[i] = Material.BlueGlazedTerracotta; - materials[12782] = Material.BlueIce; - materials[2074] = Material.BlueOrchid; - for (int i = 12478; i <= 12483; i++) - materials[i] = Material.BlueShulkerBox; - materials[5953] = Material.BlueStainedGlass; - for (int i = 9580; i <= 9611; i++) - materials[i] = Material.BlueStainedGlassPane; - materials[9223] = Material.BlueTerracotta; - for (int i = 10914; i <= 10917; i++) - materials[i] = Material.BlueWallBanner; - materials[2054] = Material.BlueWool; - for (int i = 12390; i <= 12392; i++) - materials[i] = Material.BoneBlock; - materials[2092] = Material.Bookshelf; - for (int i = 12666; i <= 12667; i++) - materials[i] = Material.BrainCoral; - materials[12650] = Material.BrainCoralBlock; - for (int i = 12686; i <= 12687; i++) - materials[i] = Material.BrainCoralFan; - for (int i = 12742; i <= 12749; i++) - materials[i] = Material.BrainCoralWallFan; - for (int i = 7386; i <= 7393; i++) - materials[i] = Material.BrewingStand; - for (int i = 11113; i <= 11118; i++) - materials[i] = Material.BrickSlab; - for (int i = 7025; i <= 7104; i++) - materials[i] = Material.BrickStairs; - for (int i = 14001; i <= 14324; i++) - materials[i] = Material.BrickWall; - materials[2089] = Material.Bricks; - for (int i = 10806; i <= 10821; i++) - materials[i] = Material.BrownBanner; - for (int i = 1876; i <= 1891; i++) - materials[i] = Material.BrownBed; - for (int i = 20774; i <= 20789; i++) - materials[i] = Material.BrownCandle; - for (int i = 20864; i <= 20865; i++) - materials[i] = Material.BrownCandleCake; - materials[10595] = Material.BrownCarpet; - materials[12584] = Material.BrownConcrete; - materials[12600] = Material.BrownConcretePowder; - for (int i = 12556; i <= 12559; i++) - materials[i] = Material.BrownGlazedTerracotta; - materials[2085] = Material.BrownMushroom; - for (int i = 6546; i <= 6609; i++) - materials[i] = Material.BrownMushroomBlock; - for (int i = 12484; i <= 12489; i++) - materials[i] = Material.BrownShulkerBox; - materials[5954] = Material.BrownStainedGlass; - for (int i = 9612; i <= 9643; i++) - materials[i] = Material.BrownStainedGlassPane; - materials[9224] = Material.BrownTerracotta; - for (int i = 10918; i <= 10921; i++) - materials[i] = Material.BrownWallBanner; - materials[2055] = Material.BrownWool; - for (int i = 12801; i <= 12802; i++) - materials[i] = Material.BubbleColumn; - for (int i = 12668; i <= 12669; i++) - materials[i] = Material.BubbleCoral; - materials[12651] = Material.BubbleCoralBlock; - for (int i = 12688; i <= 12689; i++) - materials[i] = Material.BubbleCoralFan; - for (int i = 12750; i <= 12757; i++) - materials[i] = Material.BubbleCoralWallFan; - materials[20873] = Material.BuddingAmethyst; - for (int i = 5778; i <= 5793; i++) - materials[i] = Material.Cactus; - for (int i = 5871; i <= 5877; i++) - materials[i] = Material.Cake; - materials[20923] = Material.Calcite; - for (int i = 18352; i <= 18383; i++) - materials[i] = Material.Campfire; - for (int i = 20566; i <= 20581; i++) - materials[i] = Material.Candle; - for (int i = 20838; i <= 20839; i++) - materials[i] = Material.CandleCake; - for (int i = 8591; i <= 8598; i++) - materials[i] = Material.Carrots; - materials[18277] = Material.CartographyTable; - for (int i = 5863; i <= 5866; i++) - materials[i] = Material.CarvedPumpkin; - materials[7394] = Material.Cauldron; - materials[12800] = Material.CaveAir; - for (int i = 21912; i <= 21963; i++) - materials[i] = Material.CaveVines; - for (int i = 21964; i <= 21965; i++) - materials[i] = Material.CaveVinesPlant; - for (int i = 6770; i <= 6775; i++) - materials[i] = Material.Chain; - for (int i = 12371; i <= 12382; i++) - materials[i] = Material.ChainCommandBlock; - for (int i = 8727; i <= 8750; i++) - materials[i] = Material.CherryButton; - for (int i = 11933; i <= 11996; i++) - materials[i] = Material.CherryDoor; - for (int i = 11549; i <= 11580; i++) - materials[i] = Material.CherryFence; - for (int i = 11293; i <= 11324; i++) - materials[i] = Material.CherryFenceGate; - for (int i = 5086; i <= 5149; i++) - materials[i] = Material.CherryHangingSign; - for (int i = 373; i <= 400; i++) - materials[i] = Material.CherryLeaves; - for (int i = 141; i <= 143; i++) - materials[i] = Material.CherryLog; - materials[20] = Material.CherryPlanks; - for (int i = 5722; i <= 5723; i++) - materials[i] = Material.CherryPressurePlate; - for (int i = 35; i <= 36; i++) - materials[i] = Material.CherrySapling; - for (int i = 4426; i <= 4457; i++) - materials[i] = Material.CherrySign; - for (int i = 11047; i <= 11052; i++) - materials[i] = Material.CherrySlab; - for (int i = 9820; i <= 9899; i++) - materials[i] = Material.CherryStairs; - for (int i = 6278; i <= 6341; i++) - materials[i] = Material.CherryTrapdoor; - for (int i = 5566; i <= 5573; i++) - materials[i] = Material.CherryWallHangingSign; - for (int i = 4790; i <= 4797; i++) - materials[i] = Material.CherryWallSign; - for (int i = 200; i <= 202; i++) - materials[i] = Material.CherryWood; - for (int i = 2950; i <= 2973; i++) - materials[i] = Material.Chest; - for (int i = 8967; i <= 8970; i++) - materials[i] = Material.ChippedAnvil; - for (int i = 2093; i <= 2348; i++) - materials[i] = Material.ChiseledBookshelf; - materials[23694] = Material.ChiseledDeepslate; - materials[20563] = Material.ChiseledNetherBricks; - materials[19715] = Material.ChiseledPolishedBlackstone; - materials[9092] = Material.ChiseledQuartzBlock; - materials[10935] = Material.ChiseledRedSandstone; - materials[532] = Material.ChiseledSandstone; - materials[6537] = Material.ChiseledStoneBricks; - for (int i = 12259; i <= 12264; i++) - materials[i] = Material.ChorusFlower; - for (int i = 12195; i <= 12258; i++) - materials[i] = Material.ChorusPlant; - materials[5794] = Material.Clay; - materials[10600] = Material.CoalBlock; - materials[123] = Material.CoalOre; - materials[11] = Material.CoarseDirt; - materials[22050] = Material.CobbledDeepslate; - for (int i = 22131; i <= 22136; i++) - materials[i] = Material.CobbledDeepslateSlab; - for (int i = 22051; i <= 22130; i++) - materials[i] = Material.CobbledDeepslateStairs; - for (int i = 22137; i <= 22460; i++) - materials[i] = Material.CobbledDeepslateWall; - materials[14] = Material.Cobblestone; - for (int i = 11107; i <= 11112; i++) - materials[i] = Material.CobblestoneSlab; - for (int i = 4678; i <= 4757; i++) - materials[i] = Material.CobblestoneStairs; - for (int i = 7915; i <= 8238; i++) - materials[i] = Material.CobblestoneWall; - materials[2000] = Material.Cobweb; - for (int i = 7415; i <= 7426; i++) - materials[i] = Material.Cocoa; - for (int i = 7902; i <= 7913; i++) - materials[i] = Material.CommandBlock; - for (int i = 9031; i <= 9046; i++) - materials[i] = Material.Comparator; - for (int i = 19213; i <= 19221; i++) - materials[i] = Material.Composter; - for (int i = 12783; i <= 12784; i++) - materials[i] = Material.Conduit; - materials[21164] = Material.CopperBlock; - materials[21165] = Material.CopperOre; - materials[2082] = Material.Cornflower; - materials[23695] = Material.CrackedDeepslateBricks; - materials[23696] = Material.CrackedDeepslateTiles; - materials[20564] = Material.CrackedNetherBricks; - materials[19714] = Material.CrackedPolishedBlackstoneBricks; - materials[6536] = Material.CrackedStoneBricks; - materials[4273] = Material.CraftingTable; - for (int i = 8903; i <= 8918; i++) - materials[i] = Material.CreeperHead; - for (int i = 8919; i <= 8922; i++) - materials[i] = Material.CreeperWallHead; - for (int i = 18941; i <= 18964; i++) - materials[i] = Material.CrimsonButton; - for (int i = 18989; i <= 19052; i++) - materials[i] = Material.CrimsonDoor; - for (int i = 18525; i <= 18556; i++) - materials[i] = Material.CrimsonFence; - for (int i = 18717; i <= 18748; i++) - materials[i] = Material.CrimsonFenceGate; - materials[18450] = Material.CrimsonFungus; - for (int i = 5278; i <= 5341; i++) - materials[i] = Material.CrimsonHangingSign; - for (int i = 18443; i <= 18445; i++) - materials[i] = Material.CrimsonHyphae; - materials[18449] = Material.CrimsonNylium; - materials[18507] = Material.CrimsonPlanks; - for (int i = 18521; i <= 18522; i++) - materials[i] = Material.CrimsonPressurePlate; - materials[18506] = Material.CrimsonRoots; - for (int i = 19117; i <= 19148; i++) - materials[i] = Material.CrimsonSign; - for (int i = 18509; i <= 18514; i++) - materials[i] = Material.CrimsonSlab; - for (int i = 18781; i <= 18860; i++) - materials[i] = Material.CrimsonStairs; - for (int i = 18437; i <= 18439; i++) - materials[i] = Material.CrimsonStem; - for (int i = 18589; i <= 18652; i++) - materials[i] = Material.CrimsonTrapdoor; - for (int i = 5598; i <= 5605; i++) - materials[i] = Material.CrimsonWallHangingSign; - for (int i = 19181; i <= 19188; i++) - materials[i] = Material.CrimsonWallSign; - materials[19290] = Material.CryingObsidian; - materials[21170] = Material.CutCopper; - for (int i = 21509; i <= 21514; i++) - materials[i] = Material.CutCopperSlab; - for (int i = 21411; i <= 21490; i++) - materials[i] = Material.CutCopperStairs; - materials[10936] = Material.CutRedSandstone; - for (int i = 11149; i <= 11154; i++) - materials[i] = Material.CutRedSandstoneSlab; - materials[533] = Material.CutSandstone; - for (int i = 11095; i <= 11100; i++) - materials[i] = Material.CutSandstoneSlab; - for (int i = 10758; i <= 10773; i++) - materials[i] = Material.CyanBanner; - for (int i = 1828; i <= 1843; i++) - materials[i] = Material.CyanBed; - for (int i = 20726; i <= 20741; i++) - materials[i] = Material.CyanCandle; - for (int i = 20858; i <= 20859; i++) - materials[i] = Material.CyanCandleCake; - materials[10592] = Material.CyanCarpet; - materials[12581] = Material.CyanConcrete; - materials[12597] = Material.CyanConcretePowder; - for (int i = 12544; i <= 12547; i++) - materials[i] = Material.CyanGlazedTerracotta; - for (int i = 12466; i <= 12471; i++) - materials[i] = Material.CyanShulkerBox; - materials[5951] = Material.CyanStainedGlass; - for (int i = 9516; i <= 9547; i++) - materials[i] = Material.CyanStainedGlassPane; - materials[9221] = Material.CyanTerracotta; - for (int i = 10906; i <= 10909; i++) - materials[i] = Material.CyanWallBanner; - materials[2052] = Material.CyanWool; - for (int i = 8971; i <= 8974; i++) - materials[i] = Material.DamagedAnvil; - materials[2071] = Material.Dandelion; - for (int i = 8751; i <= 8774; i++) - materials[i] = Material.DarkOakButton; - for (int i = 11997; i <= 12060; i++) - materials[i] = Material.DarkOakDoor; - for (int i = 11581; i <= 11612; i++) - materials[i] = Material.DarkOakFence; - for (int i = 11325; i <= 11356; i++) - materials[i] = Material.DarkOakFenceGate; - for (int i = 5214; i <= 5277; i++) - materials[i] = Material.DarkOakHangingSign; - for (int i = 401; i <= 428; i++) - materials[i] = Material.DarkOakLeaves; - for (int i = 144; i <= 146; i++) - materials[i] = Material.DarkOakLog; - materials[21] = Material.DarkOakPlanks; - for (int i = 5724; i <= 5725; i++) - materials[i] = Material.DarkOakPressurePlate; - for (int i = 37; i <= 38; i++) - materials[i] = Material.DarkOakSapling; - for (int i = 4490; i <= 4521; i++) - materials[i] = Material.DarkOakSign; - for (int i = 11053; i <= 11058; i++) - materials[i] = Material.DarkOakSlab; - for (int i = 9900; i <= 9979; i++) - materials[i] = Material.DarkOakStairs; - for (int i = 6342; i <= 6405; i++) - materials[i] = Material.DarkOakTrapdoor; - for (int i = 5582; i <= 5589; i++) - materials[i] = Material.DarkOakWallHangingSign; - for (int i = 4806; i <= 4813; i++) - materials[i] = Material.DarkOakWallSign; - for (int i = 203; i <= 205; i++) - materials[i] = Material.DarkOakWood; - materials[10320] = Material.DarkPrismarine; - for (int i = 10573; i <= 10578; i++) - materials[i] = Material.DarkPrismarineSlab; - for (int i = 10481; i <= 10560; i++) - materials[i] = Material.DarkPrismarineStairs; - for (int i = 9047; i <= 9078; i++) - materials[i] = Material.DaylightDetector; - for (int i = 12656; i <= 12657; i++) - materials[i] = Material.DeadBrainCoral; - materials[12645] = Material.DeadBrainCoralBlock; - for (int i = 12676; i <= 12677; i++) - materials[i] = Material.DeadBrainCoralFan; - for (int i = 12702; i <= 12709; i++) - materials[i] = Material.DeadBrainCoralWallFan; - for (int i = 12658; i <= 12659; i++) - materials[i] = Material.DeadBubbleCoral; - materials[12646] = Material.DeadBubbleCoralBlock; - for (int i = 12678; i <= 12679; i++) - materials[i] = Material.DeadBubbleCoralFan; - for (int i = 12710; i <= 12717; i++) - materials[i] = Material.DeadBubbleCoralWallFan; - materials[2003] = Material.DeadBush; - for (int i = 12660; i <= 12661; i++) - materials[i] = Material.DeadFireCoral; - materials[12647] = Material.DeadFireCoralBlock; - for (int i = 12680; i <= 12681; i++) - materials[i] = Material.DeadFireCoralFan; - for (int i = 12718; i <= 12725; i++) - materials[i] = Material.DeadFireCoralWallFan; - for (int i = 12662; i <= 12663; i++) - materials[i] = Material.DeadHornCoral; - materials[12648] = Material.DeadHornCoralBlock; - for (int i = 12682; i <= 12683; i++) - materials[i] = Material.DeadHornCoralFan; - for (int i = 12726; i <= 12733; i++) - materials[i] = Material.DeadHornCoralWallFan; - for (int i = 12654; i <= 12655; i++) - materials[i] = Material.DeadTubeCoral; - materials[12644] = Material.DeadTubeCoralBlock; - for (int i = 12674; i <= 12675; i++) - materials[i] = Material.DeadTubeCoralFan; - for (int i = 12694; i <= 12701; i++) - materials[i] = Material.DeadTubeCoralWallFan; - for (int i = 23717; i <= 23724; i++) - materials[i] = Material.DecoratedPot; - for (int i = 22047; i <= 22049; i++) - materials[i] = Material.Deepslate; - for (int i = 23364; i <= 23369; i++) - materials[i] = Material.DeepslateBrickSlab; - for (int i = 23284; i <= 23363; i++) - materials[i] = Material.DeepslateBrickStairs; - for (int i = 23370; i <= 23693; i++) - materials[i] = Material.DeepslateBrickWall; - materials[23283] = Material.DeepslateBricks; - materials[124] = Material.DeepslateCoalOre; - materials[21166] = Material.DeepslateCopperOre; - materials[4271] = Material.DeepslateDiamondOre; - materials[7508] = Material.DeepslateEmeraldOre; - materials[120] = Material.DeepslateGoldOre; - materials[122] = Material.DeepslateIronOre; - materials[517] = Material.DeepslateLapisOre; - for (int i = 5732; i <= 5733; i++) - materials[i] = Material.DeepslateRedstoneOre; - for (int i = 22953; i <= 22958; i++) - materials[i] = Material.DeepslateTileSlab; - for (int i = 22873; i <= 22952; i++) - materials[i] = Material.DeepslateTileStairs; - for (int i = 22959; i <= 23282; i++) - materials[i] = Material.DeepslateTileWall; - materials[22872] = Material.DeepslateTiles; - for (int i = 1964; i <= 1987; i++) - materials[i] = Material.DetectorRail; - materials[4272] = Material.DiamondBlock; - materials[4270] = Material.DiamondOre; - materials[4] = Material.Diorite; - for (int i = 13995; i <= 14000; i++) - materials[i] = Material.DioriteSlab; - for (int i = 13843; i <= 13922; i++) - materials[i] = Material.DioriteStairs; - for (int i = 17889; i <= 18212; i++) - materials[i] = Material.DioriteWall; - materials[10] = Material.Dirt; - materials[12357] = Material.DirtPath; - for (int i = 519; i <= 530; i++) - materials[i] = Material.Dispenser; - materials[7412] = Material.DragonEgg; - for (int i = 8923; i <= 8938; i++) - materials[i] = Material.DragonHead; - for (int i = 8939; i <= 8942; i++) - materials[i] = Material.DragonWallHead; - materials[12631] = Material.DriedKelpBlock; - materials[21911] = Material.DripstoneBlock; - for (int i = 9200; i <= 9211; i++) - materials[i] = Material.Dropper; - materials[7661] = Material.EmeraldBlock; - materials[7507] = Material.EmeraldOre; - materials[7385] = Material.EnchantingTable; - materials[12358] = Material.EndGateway; - materials[7402] = Material.EndPortal; - for (int i = 7403; i <= 7410; i++) - materials[i] = Material.EndPortalFrame; - for (int i = 12189; i <= 12194; i++) - materials[i] = Material.EndRod; - materials[7411] = Material.EndStone; - for (int i = 13953; i <= 13958; i++) - materials[i] = Material.EndStoneBrickSlab; - for (int i = 13203; i <= 13282; i++) - materials[i] = Material.EndStoneBrickStairs; - for (int i = 17565; i <= 17888; i++) - materials[i] = Material.EndStoneBrickWall; - materials[12349] = Material.EndStoneBricks; - for (int i = 7509; i <= 7516; i++) - materials[i] = Material.EnderChest; - materials[21163] = Material.ExposedCopper; - materials[21169] = Material.ExposedCutCopper; - for (int i = 21503; i <= 21508; i++) - materials[i] = Material.ExposedCutCopperSlab; - for (int i = 21331; i <= 21410; i++) - materials[i] = Material.ExposedCutCopperStairs; - for (int i = 4282; i <= 4289; i++) - materials[i] = Material.Farmland; - materials[2002] = Material.Fern; - for (int i = 2356; i <= 2867; i++) - materials[i] = Material.Fire; - for (int i = 12670; i <= 12671; i++) - materials[i] = Material.FireCoral; - materials[12652] = Material.FireCoralBlock; - for (int i = 12690; i <= 12691; i++) - materials[i] = Material.FireCoralFan; - for (int i = 12758; i <= 12765; i++) - materials[i] = Material.FireCoralWallFan; - materials[18278] = Material.FletchingTable; - materials[8563] = Material.FlowerPot; - materials[21968] = Material.FloweringAzalea; - for (int i = 485; i <= 512; i++) - materials[i] = Material.FloweringAzaleaLeaves; - materials[23715] = Material.Frogspawn; - for (int i = 12383; i <= 12386; i++) - materials[i] = Material.FrostedIce; - for (int i = 4290; i <= 4297; i++) - materials[i] = Material.Furnace; - materials[20126] = Material.GildedBlackstone; - materials[515] = Material.Glass; - for (int i = 6776; i <= 6807; i++) - materials[i] = Material.GlassPane; - for (int i = 6865; i <= 6992; i++) - materials[i] = Material.GlowLichen; - materials[5860] = Material.Glowstone; - materials[2087] = Material.GoldBlock; - materials[119] = Material.GoldOre; - materials[2] = Material.Granite; - for (int i = 13971; i <= 13976; i++) - materials[i] = Material.GraniteSlab; - for (int i = 13523; i <= 13602; i++) - materials[i] = Material.GraniteStairs; - for (int i = 15297; i <= 15620; i++) - materials[i] = Material.GraniteWall; - materials[2001] = Material.ShortGrass; - for (int i = 8; i <= 9; i++) - materials[i] = Material.GrassBlock; - materials[118] = Material.Gravel; - for (int i = 10726; i <= 10741; i++) - materials[i] = Material.GrayBanner; - for (int i = 1796; i <= 1811; i++) - materials[i] = Material.GrayBed; - for (int i = 20694; i <= 20709; i++) - materials[i] = Material.GrayCandle; - for (int i = 20854; i <= 20855; i++) - materials[i] = Material.GrayCandleCake; - materials[10590] = Material.GrayCarpet; - materials[12579] = Material.GrayConcrete; - materials[12595] = Material.GrayConcretePowder; - for (int i = 12536; i <= 12539; i++) - materials[i] = Material.GrayGlazedTerracotta; - for (int i = 12454; i <= 12459; i++) - materials[i] = Material.GrayShulkerBox; - materials[5949] = Material.GrayStainedGlass; - for (int i = 9452; i <= 9483; i++) - materials[i] = Material.GrayStainedGlassPane; - materials[9219] = Material.GrayTerracotta; - for (int i = 10898; i <= 10901; i++) - materials[i] = Material.GrayWallBanner; - materials[2050] = Material.GrayWool; - for (int i = 10822; i <= 10837; i++) - materials[i] = Material.GreenBanner; - for (int i = 1892; i <= 1907; i++) - materials[i] = Material.GreenBed; - for (int i = 20790; i <= 20805; i++) - materials[i] = Material.GreenCandle; - for (int i = 20866; i <= 20867; i++) - materials[i] = Material.GreenCandleCake; - materials[10596] = Material.GreenCarpet; - materials[12585] = Material.GreenConcrete; - materials[12601] = Material.GreenConcretePowder; - for (int i = 12560; i <= 12563; i++) - materials[i] = Material.GreenGlazedTerracotta; - for (int i = 12490; i <= 12495; i++) - materials[i] = Material.GreenShulkerBox; - materials[5955] = Material.GreenStainedGlass; - for (int i = 9644; i <= 9675; i++) - materials[i] = Material.GreenStainedGlassPane; - materials[9225] = Material.GreenTerracotta; - for (int i = 10922; i <= 10925; i++) - materials[i] = Material.GreenWallBanner; - materials[2056] = Material.GreenWool; - for (int i = 18279; i <= 18290; i++) - materials[i] = Material.Grindstone; - for (int i = 22043; i <= 22044; i++) - materials[i] = Material.HangingRoots; - for (int i = 10580; i <= 10582; i++) - materials[i] = Material.HayBlock; - for (int i = 9015; i <= 9030; i++) - materials[i] = Material.HeavyWeightedPressurePlate; - materials[19286] = Material.HoneyBlock; - materials[19287] = Material.HoneycombBlock; - for (int i = 9081; i <= 9090; i++) - materials[i] = Material.Hopper; - for (int i = 12672; i <= 12673; i++) - materials[i] = Material.HornCoral; - materials[12653] = Material.HornCoralBlock; - for (int i = 12692; i <= 12693; i++) - materials[i] = Material.HornCoralFan; - for (int i = 12766; i <= 12773; i++) - materials[i] = Material.HornCoralWallFan; - materials[5776] = Material.Ice; - materials[6545] = Material.InfestedChiseledStoneBricks; - materials[6541] = Material.InfestedCobblestone; - materials[6544] = Material.InfestedCrackedStoneBricks; - for (int i = 23697; i <= 23699; i++) - materials[i] = Material.InfestedDeepslate; - materials[6543] = Material.InfestedMossyStoneBricks; - materials[6540] = Material.InfestedStone; - materials[6542] = Material.InfestedStoneBricks; - for (int i = 6738; i <= 6769; i++) - materials[i] = Material.IronBars; - materials[2088] = Material.IronBlock; - for (int i = 5648; i <= 5711; i++) - materials[i] = Material.IronDoor; - materials[121] = Material.IronOre; - for (int i = 10254; i <= 10317; i++) - materials[i] = Material.IronTrapdoor; - for (int i = 5867; i <= 5870; i++) - materials[i] = Material.JackOLantern; - for (int i = 19201; i <= 19212; i++) - materials[i] = Material.Jigsaw; - for (int i = 5811; i <= 5812; i++) - materials[i] = Material.Jukebox; - for (int i = 8679; i <= 8702; i++) - materials[i] = Material.JungleButton; - for (int i = 11805; i <= 11868; i++) - materials[i] = Material.JungleDoor; - for (int i = 11485; i <= 11516; i++) - materials[i] = Material.JungleFence; - for (int i = 11229; i <= 11260; i++) - materials[i] = Material.JungleFenceGate; - for (int i = 5150; i <= 5213; i++) - materials[i] = Material.JungleHangingSign; - for (int i = 317; i <= 344; i++) - materials[i] = Material.JungleLeaves; - for (int i = 135; i <= 137; i++) - materials[i] = Material.JungleLog; - materials[18] = Material.JunglePlanks; - for (int i = 5718; i <= 5719; i++) - materials[i] = Material.JunglePressurePlate; - for (int i = 31; i <= 32; i++) - materials[i] = Material.JungleSapling; - for (int i = 4458; i <= 4489; i++) - materials[i] = Material.JungleSign; - for (int i = 11035; i <= 11040; i++) - materials[i] = Material.JungleSlab; - for (int i = 7822; i <= 7901; i++) - materials[i] = Material.JungleStairs; - for (int i = 6150; i <= 6213; i++) - materials[i] = Material.JungleTrapdoor; - for (int i = 5574; i <= 5581; i++) - materials[i] = Material.JungleWallHangingSign; - for (int i = 4798; i <= 4805; i++) - materials[i] = Material.JungleWallSign; - for (int i = 194; i <= 196; i++) - materials[i] = Material.JungleWood; - for (int i = 12604; i <= 12629; i++) - materials[i] = Material.Kelp; - materials[12630] = Material.KelpPlant; - for (int i = 4650; i <= 4657; i++) - materials[i] = Material.Ladder; - for (int i = 18344; i <= 18347; i++) - materials[i] = Material.Lantern; - materials[518] = Material.LapisBlock; - materials[516] = Material.LapisOre; - for (int i = 20886; i <= 20897; i++) - materials[i] = Material.LargeAmethystBud; - for (int i = 10612; i <= 10613; i++) - materials[i] = Material.LargeFern; - for (int i = 96; i <= 111; i++) - materials[i] = Material.Lava; - materials[7398] = Material.LavaCauldron; - for (int i = 18291; i <= 18306; i++) - materials[i] = Material.Lectern; - for (int i = 5622; i <= 5645; i++) - materials[i] = Material.Lever; - for (int i = 10222; i <= 10253; i++) - materials[i] = Material.Light; - for (int i = 10662; i <= 10677; i++) - materials[i] = Material.LightBlueBanner; - for (int i = 1732; i <= 1747; i++) - materials[i] = Material.LightBlueBed; - for (int i = 20630; i <= 20645; i++) - materials[i] = Material.LightBlueCandle; - for (int i = 20846; i <= 20847; i++) - materials[i] = Material.LightBlueCandleCake; - materials[10586] = Material.LightBlueCarpet; - materials[12575] = Material.LightBlueConcrete; - materials[12591] = Material.LightBlueConcretePowder; - for (int i = 12520; i <= 12523; i++) - materials[i] = Material.LightBlueGlazedTerracotta; - for (int i = 12430; i <= 12435; i++) - materials[i] = Material.LightBlueShulkerBox; - materials[5945] = Material.LightBlueStainedGlass; - for (int i = 9324; i <= 9355; i++) - materials[i] = Material.LightBlueStainedGlassPane; - materials[9215] = Material.LightBlueTerracotta; - for (int i = 10882; i <= 10885; i++) - materials[i] = Material.LightBlueWallBanner; - materials[2046] = Material.LightBlueWool; - for (int i = 10742; i <= 10757; i++) - materials[i] = Material.LightGrayBanner; - for (int i = 1812; i <= 1827; i++) - materials[i] = Material.LightGrayBed; - for (int i = 20710; i <= 20725; i++) - materials[i] = Material.LightGrayCandle; - for (int i = 20856; i <= 20857; i++) - materials[i] = Material.LightGrayCandleCake; - materials[10591] = Material.LightGrayCarpet; - materials[12580] = Material.LightGrayConcrete; - materials[12596] = Material.LightGrayConcretePowder; - for (int i = 12540; i <= 12543; i++) - materials[i] = Material.LightGrayGlazedTerracotta; - for (int i = 12460; i <= 12465; i++) - materials[i] = Material.LightGrayShulkerBox; - materials[5950] = Material.LightGrayStainedGlass; - for (int i = 9484; i <= 9515; i++) - materials[i] = Material.LightGrayStainedGlassPane; - materials[9220] = Material.LightGrayTerracotta; - for (int i = 10902; i <= 10905; i++) - materials[i] = Material.LightGrayWallBanner; - materials[2051] = Material.LightGrayWool; - for (int i = 8999; i <= 9014; i++) - materials[i] = Material.LightWeightedPressurePlate; - for (int i = 21867; i <= 21890; i++) - materials[i] = Material.LightningRod; - for (int i = 10604; i <= 10605; i++) - materials[i] = Material.Lilac; - materials[2084] = Material.LilyOfTheValley; - materials[7267] = Material.LilyPad; - for (int i = 10694; i <= 10709; i++) - materials[i] = Material.LimeBanner; - for (int i = 1764; i <= 1779; i++) - materials[i] = Material.LimeBed; - for (int i = 20662; i <= 20677; i++) - materials[i] = Material.LimeCandle; - for (int i = 20850; i <= 20851; i++) - materials[i] = Material.LimeCandleCake; - materials[10588] = Material.LimeCarpet; - materials[12577] = Material.LimeConcrete; - materials[12593] = Material.LimeConcretePowder; - for (int i = 12528; i <= 12531; i++) - materials[i] = Material.LimeGlazedTerracotta; - for (int i = 12442; i <= 12447; i++) - materials[i] = Material.LimeShulkerBox; - materials[5947] = Material.LimeStainedGlass; - for (int i = 9388; i <= 9419; i++) - materials[i] = Material.LimeStainedGlassPane; - materials[9217] = Material.LimeTerracotta; - for (int i = 10890; i <= 10893; i++) - materials[i] = Material.LimeWallBanner; - materials[2048] = Material.LimeWool; - materials[19300] = Material.Lodestone; - for (int i = 18245; i <= 18248; i++) - materials[i] = Material.Loom; - for (int i = 10646; i <= 10661; i++) - materials[i] = Material.MagentaBanner; - for (int i = 1716; i <= 1731; i++) - materials[i] = Material.MagentaBed; - for (int i = 20614; i <= 20629; i++) - materials[i] = Material.MagentaCandle; - for (int i = 20844; i <= 20845; i++) - materials[i] = Material.MagentaCandleCake; - materials[10585] = Material.MagentaCarpet; - materials[12574] = Material.MagentaConcrete; - materials[12590] = Material.MagentaConcretePowder; - for (int i = 12516; i <= 12519; i++) - materials[i] = Material.MagentaGlazedTerracotta; - for (int i = 12424; i <= 12429; i++) - materials[i] = Material.MagentaShulkerBox; - materials[5944] = Material.MagentaStainedGlass; - for (int i = 9292; i <= 9323; i++) - materials[i] = Material.MagentaStainedGlassPane; - materials[9214] = Material.MagentaTerracotta; - for (int i = 10878; i <= 10881; i++) - materials[i] = Material.MagentaWallBanner; - materials[2045] = Material.MagentaWool; - materials[12387] = Material.MagmaBlock; - for (int i = 8775; i <= 8798; i++) - materials[i] = Material.MangroveButton; - for (int i = 12061; i <= 12124; i++) - materials[i] = Material.MangroveDoor; - for (int i = 11613; i <= 11644; i++) - materials[i] = Material.MangroveFence; - for (int i = 11357; i <= 11388; i++) - materials[i] = Material.MangroveFenceGate; - for (int i = 5406; i <= 5469; i++) - materials[i] = Material.MangroveHangingSign; - for (int i = 429; i <= 456; i++) - materials[i] = Material.MangroveLeaves; - for (int i = 147; i <= 149; i++) - materials[i] = Material.MangroveLog; - materials[22] = Material.MangrovePlanks; - for (int i = 5726; i <= 5727; i++) - materials[i] = Material.MangrovePressurePlate; - for (int i = 39; i <= 78; i++) - materials[i] = Material.MangrovePropagule; - for (int i = 150; i <= 151; i++) - materials[i] = Material.MangroveRoots; - for (int i = 4522; i <= 4553; i++) - materials[i] = Material.MangroveSign; - for (int i = 11059; i <= 11064; i++) - materials[i] = Material.MangroveSlab; - for (int i = 9980; i <= 10059; i++) - materials[i] = Material.MangroveStairs; - for (int i = 6406; i <= 6469; i++) - materials[i] = Material.MangroveTrapdoor; - for (int i = 5590; i <= 5597; i++) - materials[i] = Material.MangroveWallHangingSign; - for (int i = 4814; i <= 4821; i++) - materials[i] = Material.MangroveWallSign; - for (int i = 206; i <= 208; i++) - materials[i] = Material.MangroveWood; - for (int i = 20898; i <= 20909; i++) - materials[i] = Material.MediumAmethystBud; - materials[6808] = Material.Melon; - for (int i = 6825; i <= 6832; i++) - materials[i] = Material.MelonStem; - materials[21986] = Material.MossBlock; - materials[21969] = Material.MossCarpet; - materials[2349] = Material.MossyCobblestone; - for (int i = 13947; i <= 13952; i++) - materials[i] = Material.MossyCobblestoneSlab; - for (int i = 13123; i <= 13202; i++) - materials[i] = Material.MossyCobblestoneStairs; - for (int i = 8239; i <= 8562; i++) - materials[i] = Material.MossyCobblestoneWall; - for (int i = 13935; i <= 13940; i++) - materials[i] = Material.MossyStoneBrickSlab; - for (int i = 12963; i <= 13042; i++) - materials[i] = Material.MossyStoneBrickStairs; - for (int i = 14973; i <= 15296; i++) - materials[i] = Material.MossyStoneBrickWall; - materials[6535] = Material.MossyStoneBricks; - for (int i = 2059; i <= 2070; i++) - materials[i] = Material.MovingPiston; - materials[22046] = Material.Mud; - for (int i = 11125; i <= 11130; i++) - materials[i] = Material.MudBrickSlab; - for (int i = 7185; i <= 7264; i++) - materials[i] = Material.MudBrickStairs; - for (int i = 15945; i <= 16268; i++) - materials[i] = Material.MudBrickWall; - materials[6539] = Material.MudBricks; - for (int i = 152; i <= 154; i++) - materials[i] = Material.MuddyMangroveRoots; - for (int i = 6674; i <= 6737; i++) - materials[i] = Material.MushroomStem; - for (int i = 7265; i <= 7266; i++) - materials[i] = Material.Mycelium; - for (int i = 7269; i <= 7300; i++) - materials[i] = Material.NetherBrickFence; - for (int i = 11131; i <= 11136; i++) - materials[i] = Material.NetherBrickSlab; - for (int i = 7301; i <= 7380; i++) - materials[i] = Material.NetherBrickStairs; - for (int i = 16269; i <= 16592; i++) - materials[i] = Material.NetherBrickWall; - materials[7268] = Material.NetherBricks; - materials[125] = Material.NetherGoldOre; - for (int i = 5861; i <= 5862; i++) - materials[i] = Material.NetherPortal; - materials[9080] = Material.NetherQuartzOre; - materials[18436] = Material.NetherSprouts; - for (int i = 7381; i <= 7384; i++) - materials[i] = Material.NetherWart; - materials[12388] = Material.NetherWartBlock; - materials[19288] = Material.NetheriteBlock; - materials[5846] = Material.Netherrack; - for (int i = 534; i <= 1683; i++) - materials[i] = Material.NoteBlock; - for (int i = 8607; i <= 8630; i++) - materials[i] = Material.OakButton; - for (int i = 4586; i <= 4649; i++) - materials[i] = Material.OakDoor; - for (int i = 5813; i <= 5844; i++) - materials[i] = Material.OakFence; - for (int i = 6993; i <= 7024; i++) - materials[i] = Material.OakFenceGate; - for (int i = 4830; i <= 4893; i++) - materials[i] = Material.OakHangingSign; - for (int i = 233; i <= 260; i++) - materials[i] = Material.OakLeaves; - for (int i = 126; i <= 128; i++) - materials[i] = Material.OakLog; - materials[15] = Material.OakPlanks; - for (int i = 5712; i <= 5713; i++) - materials[i] = Material.OakPressurePlate; - for (int i = 25; i <= 26; i++) - materials[i] = Material.OakSapling; - for (int i = 4298; i <= 4329; i++) - materials[i] = Material.OakSign; - for (int i = 11017; i <= 11022; i++) - materials[i] = Material.OakSlab; - for (int i = 2870; i <= 2949; i++) - materials[i] = Material.OakStairs; - for (int i = 5958; i <= 6021; i++) - materials[i] = Material.OakTrapdoor; - for (int i = 5534; i <= 5541; i++) - materials[i] = Material.OakWallHangingSign; - for (int i = 4758; i <= 4765; i++) - materials[i] = Material.OakWallSign; - for (int i = 185; i <= 187; i++) - materials[i] = Material.OakWood; - for (int i = 12394; i <= 12405; i++) - materials[i] = Material.Observer; - materials[2350] = Material.Obsidian; - for (int i = 23706; i <= 23708; i++) - materials[i] = Material.OchreFroglight; - for (int i = 10630; i <= 10645; i++) - materials[i] = Material.OrangeBanner; - for (int i = 1700; i <= 1715; i++) - materials[i] = Material.OrangeBed; - for (int i = 20598; i <= 20613; i++) - materials[i] = Material.OrangeCandle; - for (int i = 20842; i <= 20843; i++) - materials[i] = Material.OrangeCandleCake; - materials[10584] = Material.OrangeCarpet; - materials[12573] = Material.OrangeConcrete; - materials[12589] = Material.OrangeConcretePowder; - for (int i = 12512; i <= 12515; i++) - materials[i] = Material.OrangeGlazedTerracotta; - for (int i = 12418; i <= 12423; i++) - materials[i] = Material.OrangeShulkerBox; - materials[5943] = Material.OrangeStainedGlass; - for (int i = 9260; i <= 9291; i++) - materials[i] = Material.OrangeStainedGlassPane; - materials[9213] = Material.OrangeTerracotta; - materials[2078] = Material.OrangeTulip; - for (int i = 10874; i <= 10877; i++) - materials[i] = Material.OrangeWallBanner; - materials[2044] = Material.OrangeWool; - materials[2081] = Material.OxeyeDaisy; - materials[21161] = Material.OxidizedCopper; - materials[21167] = Material.OxidizedCutCopper; - for (int i = 21491; i <= 21496; i++) - materials[i] = Material.OxidizedCutCopperSlab; - for (int i = 21171; i <= 21250; i++) - materials[i] = Material.OxidizedCutCopperStairs; - materials[10601] = Material.PackedIce; - materials[6538] = Material.PackedMud; - for (int i = 23712; i <= 23714; i++) - materials[i] = Material.PearlescentFroglight; - for (int i = 10608; i <= 10609; i++) - materials[i] = Material.Peony; - for (int i = 11101; i <= 11106; i++) - materials[i] = Material.PetrifiedOakSlab; - for (int i = 8943; i <= 8958; i++) - materials[i] = Material.PiglinHead; - for (int i = 8959; i <= 8962; i++) - materials[i] = Material.PiglinWallHead; - for (int i = 10710; i <= 10725; i++) - materials[i] = Material.PinkBanner; - for (int i = 1780; i <= 1795; i++) - materials[i] = Material.PinkBed; - for (int i = 20678; i <= 20693; i++) - materials[i] = Material.PinkCandle; - for (int i = 20852; i <= 20853; i++) - materials[i] = Material.PinkCandleCake; - materials[10589] = Material.PinkCarpet; - materials[12578] = Material.PinkConcrete; - materials[12594] = Material.PinkConcretePowder; - for (int i = 12532; i <= 12535; i++) - materials[i] = Material.PinkGlazedTerracotta; - for (int i = 21970; i <= 21985; i++) - materials[i] = Material.PinkPetals; - for (int i = 12448; i <= 12453; i++) - materials[i] = Material.PinkShulkerBox; - materials[5948] = Material.PinkStainedGlass; - for (int i = 9420; i <= 9451; i++) - materials[i] = Material.PinkStainedGlassPane; - materials[9218] = Material.PinkTerracotta; - materials[2080] = Material.PinkTulip; - for (int i = 10894; i <= 10897; i++) - materials[i] = Material.PinkWallBanner; - materials[2049] = Material.PinkWool; - for (int i = 2007; i <= 2018; i++) - materials[i] = Material.Piston; - for (int i = 2019; i <= 2042; i++) - materials[i] = Material.PistonHead; - for (int i = 8883; i <= 8898; i++) - materials[i] = Material.PlayerHead; - for (int i = 8899; i <= 8902; i++) - materials[i] = Material.PlayerWallHead; - for (int i = 12; i <= 13; i++) - materials[i] = Material.Podzol; - for (int i = 21891; i <= 21910; i++) - materials[i] = Material.PointedDripstone; - materials[7] = Material.PolishedAndesite; - for (int i = 13989; i <= 13994; i++) - materials[i] = Material.PolishedAndesiteSlab; - for (int i = 13763; i <= 13842; i++) - materials[i] = Material.PolishedAndesiteStairs; - for (int i = 5852; i <= 5854; i++) - materials[i] = Material.PolishedBasalt; - materials[19712] = Material.PolishedBlackstone; - for (int i = 19716; i <= 19721; i++) - materials[i] = Material.PolishedBlackstoneBrickSlab; - for (int i = 19722; i <= 19801; i++) - materials[i] = Material.PolishedBlackstoneBrickStairs; - for (int i = 19802; i <= 20125; i++) - materials[i] = Material.PolishedBlackstoneBrickWall; - materials[19713] = Material.PolishedBlackstoneBricks; - for (int i = 20215; i <= 20238; i++) - materials[i] = Material.PolishedBlackstoneButton; - for (int i = 20213; i <= 20214; i++) - materials[i] = Material.PolishedBlackstonePressurePlate; - for (int i = 20207; i <= 20212; i++) - materials[i] = Material.PolishedBlackstoneSlab; - for (int i = 20127; i <= 20206; i++) - materials[i] = Material.PolishedBlackstoneStairs; - for (int i = 20239; i <= 20562; i++) - materials[i] = Material.PolishedBlackstoneWall; - materials[22461] = Material.PolishedDeepslate; - for (int i = 22542; i <= 22547; i++) - materials[i] = Material.PolishedDeepslateSlab; - for (int i = 22462; i <= 22541; i++) - materials[i] = Material.PolishedDeepslateStairs; - for (int i = 22548; i <= 22871; i++) - materials[i] = Material.PolishedDeepslateWall; - materials[5] = Material.PolishedDiorite; - for (int i = 13941; i <= 13946; i++) - materials[i] = Material.PolishedDioriteSlab; - for (int i = 13043; i <= 13122; i++) - materials[i] = Material.PolishedDioriteStairs; - materials[3] = Material.PolishedGranite; - for (int i = 13923; i <= 13928; i++) - materials[i] = Material.PolishedGraniteSlab; - for (int i = 12803; i <= 12882; i++) - materials[i] = Material.PolishedGraniteStairs; - materials[2073] = Material.Poppy; - for (int i = 8599; i <= 8606; i++) - materials[i] = Material.Potatoes; - materials[8569] = Material.PottedAcaciaSapling; - materials[8577] = Material.PottedAllium; - materials[23704] = Material.PottedAzaleaBush; - materials[8578] = Material.PottedAzureBluet; - materials[12798] = Material.PottedBamboo; - materials[8567] = Material.PottedBirchSapling; - materials[8576] = Material.PottedBlueOrchid; - materials[8588] = Material.PottedBrownMushroom; - materials[8590] = Material.PottedCactus; - materials[8570] = Material.PottedCherrySapling; - materials[8584] = Material.PottedCornflower; - materials[19296] = Material.PottedCrimsonFungus; - materials[19298] = Material.PottedCrimsonRoots; - materials[8574] = Material.PottedDandelion; - materials[8571] = Material.PottedDarkOakSapling; - materials[8589] = Material.PottedDeadBush; - materials[8573] = Material.PottedFern; - materials[23705] = Material.PottedFloweringAzaleaBush; - materials[8568] = Material.PottedJungleSapling; - materials[8585] = Material.PottedLilyOfTheValley; - materials[8572] = Material.PottedMangrovePropagule; - materials[8565] = Material.PottedOakSapling; - materials[8580] = Material.PottedOrangeTulip; - materials[8583] = Material.PottedOxeyeDaisy; - materials[8582] = Material.PottedPinkTulip; - materials[8575] = Material.PottedPoppy; - materials[8587] = Material.PottedRedMushroom; - materials[8579] = Material.PottedRedTulip; - materials[8566] = Material.PottedSpruceSapling; - materials[8564] = Material.PottedTorchflower; - materials[19297] = Material.PottedWarpedFungus; - materials[19299] = Material.PottedWarpedRoots; - materials[8581] = Material.PottedWhiteTulip; - materials[8586] = Material.PottedWitherRose; - materials[20925] = Material.PowderSnow; - for (int i = 7399; i <= 7401; i++) - materials[i] = Material.PowderSnowCauldron; - for (int i = 1940; i <= 1963; i++) - materials[i] = Material.PoweredRail; - materials[10318] = Material.Prismarine; - for (int i = 10567; i <= 10572; i++) - materials[i] = Material.PrismarineBrickSlab; - for (int i = 10401; i <= 10480; i++) - materials[i] = Material.PrismarineBrickStairs; - materials[10319] = Material.PrismarineBricks; - for (int i = 10561; i <= 10566; i++) - materials[i] = Material.PrismarineSlab; - for (int i = 10321; i <= 10400; i++) - materials[i] = Material.PrismarineStairs; - for (int i = 14325; i <= 14648; i++) - materials[i] = Material.PrismarineWall; - materials[5845] = Material.Pumpkin; - for (int i = 6817; i <= 6824; i++) - materials[i] = Material.PumpkinStem; - for (int i = 10774; i <= 10789; i++) - materials[i] = Material.PurpleBanner; - for (int i = 1844; i <= 1859; i++) - materials[i] = Material.PurpleBed; - for (int i = 20742; i <= 20757; i++) - materials[i] = Material.PurpleCandle; - for (int i = 20860; i <= 20861; i++) - materials[i] = Material.PurpleCandleCake; - materials[10593] = Material.PurpleCarpet; - materials[12582] = Material.PurpleConcrete; - materials[12598] = Material.PurpleConcretePowder; - for (int i = 12548; i <= 12551; i++) - materials[i] = Material.PurpleGlazedTerracotta; - for (int i = 12472; i <= 12477; i++) - materials[i] = Material.PurpleShulkerBox; - materials[5952] = Material.PurpleStainedGlass; - for (int i = 9548; i <= 9579; i++) - materials[i] = Material.PurpleStainedGlassPane; - materials[9222] = Material.PurpleTerracotta; - for (int i = 10910; i <= 10913; i++) - materials[i] = Material.PurpleWallBanner; - materials[2053] = Material.PurpleWool; - materials[12265] = Material.PurpurBlock; - for (int i = 12266; i <= 12268; i++) - materials[i] = Material.PurpurPillar; - for (int i = 11155; i <= 11160; i++) - materials[i] = Material.PurpurSlab; - for (int i = 12269; i <= 12348; i++) - materials[i] = Material.PurpurStairs; - materials[9091] = Material.QuartzBlock; - materials[20565] = Material.QuartzBricks; - for (int i = 9093; i <= 9095; i++) - materials[i] = Material.QuartzPillar; - for (int i = 11137; i <= 11142; i++) - materials[i] = Material.QuartzSlab; - for (int i = 9096; i <= 9175; i++) - materials[i] = Material.QuartzStairs; - for (int i = 4658; i <= 4677; i++) - materials[i] = Material.Rail; - materials[23702] = Material.RawCopperBlock; - materials[23703] = Material.RawGoldBlock; - materials[23701] = Material.RawIronBlock; - for (int i = 10838; i <= 10853; i++) - materials[i] = Material.RedBanner; - for (int i = 1908; i <= 1923; i++) - materials[i] = Material.RedBed; - for (int i = 20806; i <= 20821; i++) - materials[i] = Material.RedCandle; - for (int i = 20868; i <= 20869; i++) - materials[i] = Material.RedCandleCake; - materials[10597] = Material.RedCarpet; - materials[12586] = Material.RedConcrete; - materials[12602] = Material.RedConcretePowder; - for (int i = 12564; i <= 12567; i++) - materials[i] = Material.RedGlazedTerracotta; - materials[2086] = Material.RedMushroom; - for (int i = 6610; i <= 6673; i++) - materials[i] = Material.RedMushroomBlock; - for (int i = 13983; i <= 13988; i++) - materials[i] = Material.RedNetherBrickSlab; - for (int i = 13683; i <= 13762; i++) - materials[i] = Material.RedNetherBrickStairs; - for (int i = 16917; i <= 17240; i++) - materials[i] = Material.RedNetherBrickWall; - materials[12389] = Material.RedNetherBricks; - materials[117] = Material.RedSand; - materials[10934] = Material.RedSandstone; - for (int i = 11143; i <= 11148; i++) - materials[i] = Material.RedSandstoneSlab; - for (int i = 10937; i <= 11016; i++) - materials[i] = Material.RedSandstoneStairs; - for (int i = 14649; i <= 14972; i++) - materials[i] = Material.RedSandstoneWall; - for (int i = 12496; i <= 12501; i++) - materials[i] = Material.RedShulkerBox; - materials[5956] = Material.RedStainedGlass; - for (int i = 9676; i <= 9707; i++) - materials[i] = Material.RedStainedGlassPane; - materials[9226] = Material.RedTerracotta; - materials[2077] = Material.RedTulip; - for (int i = 10926; i <= 10929; i++) - materials[i] = Material.RedWallBanner; - materials[2057] = Material.RedWool; - materials[9079] = Material.RedstoneBlock; - for (int i = 7413; i <= 7414; i++) - materials[i] = Material.RedstoneLamp; - for (int i = 5730; i <= 5731; i++) - materials[i] = Material.RedstoneOre; - for (int i = 5734; i <= 5735; i++) - materials[i] = Material.RedstoneTorch; - for (int i = 5736; i <= 5743; i++) - materials[i] = Material.RedstoneWallTorch; - for (int i = 2974; i <= 4269; i++) - materials[i] = Material.RedstoneWire; - materials[23716] = Material.ReinforcedDeepslate; - for (int i = 5878; i <= 5941; i++) - materials[i] = Material.Repeater; - for (int i = 12359; i <= 12370; i++) - materials[i] = Material.RepeatingCommandBlock; - for (int i = 19291; i <= 19295; i++) - materials[i] = Material.RespawnAnchor; - materials[22045] = Material.RootedDirt; - for (int i = 10606; i <= 10607; i++) - materials[i] = Material.RoseBush; - materials[112] = Material.Sand; - materials[531] = Material.Sandstone; - for (int i = 11089; i <= 11094; i++) - materials[i] = Material.SandstoneSlab; - for (int i = 7427; i <= 7506; i++) - materials[i] = Material.SandstoneStairs; - for (int i = 17241; i <= 17564; i++) - materials[i] = Material.SandstoneWall; - for (int i = 18213; i <= 18244; i++) - materials[i] = Material.Scaffolding; - materials[21022] = Material.Sculk; - for (int i = 21151; i <= 21152; i++) - materials[i] = Material.SculkCatalyst; - for (int i = 20926; i <= 21021; i++) - materials[i] = Material.SculkSensor; - for (int i = 21153; i <= 21160; i++) - materials[i] = Material.SculkShrieker; - for (int i = 21023; i <= 21150; i++) - materials[i] = Material.SculkVein; - materials[10579] = Material.SeaLantern; - for (int i = 12774; i <= 12781; i++) - materials[i] = Material.SeaPickle; - materials[2004] = Material.Seagrass; - materials[18451] = Material.Shroomlight; - for (int i = 12406; i <= 12411; i++) - materials[i] = Material.ShulkerBox; - for (int i = 8823; i <= 8838; i++) - materials[i] = Material.SkeletonSkull; - for (int i = 8839; i <= 8842; i++) - materials[i] = Material.SkeletonWallSkull; - materials[10220] = Material.SlimeBlock; - for (int i = 20910; i <= 20921; i++) - materials[i] = Material.SmallAmethystBud; - for (int i = 22027; i <= 22042; i++) - materials[i] = Material.SmallDripleaf; - materials[18307] = Material.SmithingTable; - for (int i = 18261; i <= 18268; i++) - materials[i] = Material.Smoker; - materials[23700] = Material.SmoothBasalt; - materials[11163] = Material.SmoothQuartz; - for (int i = 13965; i <= 13970; i++) - materials[i] = Material.SmoothQuartzSlab; - for (int i = 13443; i <= 13522; i++) - materials[i] = Material.SmoothQuartzStairs; - materials[11164] = Material.SmoothRedSandstone; - for (int i = 13929; i <= 13934; i++) - materials[i] = Material.SmoothRedSandstoneSlab; - for (int i = 12883; i <= 12962; i++) - materials[i] = Material.SmoothRedSandstoneStairs; - materials[11162] = Material.SmoothSandstone; - for (int i = 13959; i <= 13964; i++) - materials[i] = Material.SmoothSandstoneSlab; - for (int i = 13363; i <= 13442; i++) - materials[i] = Material.SmoothSandstoneStairs; - materials[11161] = Material.SmoothStone; - for (int i = 11083; i <= 11088; i++) - materials[i] = Material.SmoothStoneSlab; - for (int i = 5768; i <= 5775; i++) - materials[i] = Material.Snow; - materials[5777] = Material.SnowBlock; - for (int i = 18384; i <= 18415; i++) - materials[i] = Material.SoulCampfire; - materials[2868] = Material.SoulFire; - for (int i = 18348; i <= 18351; i++) - materials[i] = Material.SoulLantern; - materials[5847] = Material.SoulSand; - materials[5848] = Material.SoulSoil; - materials[5855] = Material.SoulTorch; - for (int i = 5856; i <= 5859; i++) - materials[i] = Material.SoulWallTorch; - materials[2869] = Material.Spawner; - materials[513] = Material.Sponge; - materials[21966] = Material.SporeBlossom; - for (int i = 8631; i <= 8654; i++) - materials[i] = Material.SpruceButton; - for (int i = 11677; i <= 11740; i++) - materials[i] = Material.SpruceDoor; - for (int i = 11421; i <= 11452; i++) - materials[i] = Material.SpruceFence; - for (int i = 11165; i <= 11196; i++) - materials[i] = Material.SpruceFenceGate; - for (int i = 4894; i <= 4957; i++) - materials[i] = Material.SpruceHangingSign; - for (int i = 261; i <= 288; i++) - materials[i] = Material.SpruceLeaves; - for (int i = 129; i <= 131; i++) - materials[i] = Material.SpruceLog; - materials[16] = Material.SprucePlanks; - for (int i = 5714; i <= 5715; i++) - materials[i] = Material.SprucePressurePlate; - for (int i = 27; i <= 28; i++) - materials[i] = Material.SpruceSapling; - for (int i = 4330; i <= 4361; i++) - materials[i] = Material.SpruceSign; - for (int i = 11023; i <= 11028; i++) - materials[i] = Material.SpruceSlab; - for (int i = 7662; i <= 7741; i++) - materials[i] = Material.SpruceStairs; - for (int i = 6022; i <= 6085; i++) - materials[i] = Material.SpruceTrapdoor; - for (int i = 5542; i <= 5549; i++) - materials[i] = Material.SpruceWallHangingSign; - for (int i = 4766; i <= 4773; i++) - materials[i] = Material.SpruceWallSign; - for (int i = 188; i <= 190; i++) - materials[i] = Material.SpruceWood; - for (int i = 1988; i <= 1999; i++) - materials[i] = Material.StickyPiston; - materials[1] = Material.Stone; - for (int i = 11119; i <= 11124; i++) - materials[i] = Material.StoneBrickSlab; - for (int i = 7105; i <= 7184; i++) - materials[i] = Material.StoneBrickStairs; - for (int i = 15621; i <= 15944; i++) - materials[i] = Material.StoneBrickWall; - materials[6534] = Material.StoneBricks; - for (int i = 5744; i <= 5767; i++) - materials[i] = Material.StoneButton; - for (int i = 5646; i <= 5647; i++) - materials[i] = Material.StonePressurePlate; - for (int i = 11077; i <= 11082; i++) - materials[i] = Material.StoneSlab; - for (int i = 13283; i <= 13362; i++) - materials[i] = Material.StoneStairs; - for (int i = 18308; i <= 18311; i++) - materials[i] = Material.Stonecutter; - for (int i = 167; i <= 169; i++) - materials[i] = Material.StrippedAcaciaLog; - for (int i = 221; i <= 223; i++) - materials[i] = Material.StrippedAcaciaWood; - for (int i = 182; i <= 184; i++) - materials[i] = Material.StrippedBambooBlock; - for (int i = 161; i <= 163; i++) - materials[i] = Material.StrippedBirchLog; - for (int i = 215; i <= 217; i++) - materials[i] = Material.StrippedBirchWood; - for (int i = 170; i <= 172; i++) - materials[i] = Material.StrippedCherryLog; - for (int i = 224; i <= 226; i++) - materials[i] = Material.StrippedCherryWood; - for (int i = 18446; i <= 18448; i++) - materials[i] = Material.StrippedCrimsonHyphae; - for (int i = 18440; i <= 18442; i++) - materials[i] = Material.StrippedCrimsonStem; - for (int i = 173; i <= 175; i++) - materials[i] = Material.StrippedDarkOakLog; - for (int i = 227; i <= 229; i++) - materials[i] = Material.StrippedDarkOakWood; - for (int i = 164; i <= 166; i++) - materials[i] = Material.StrippedJungleLog; - for (int i = 218; i <= 220; i++) - materials[i] = Material.StrippedJungleWood; - for (int i = 179; i <= 181; i++) - materials[i] = Material.StrippedMangroveLog; - for (int i = 230; i <= 232; i++) - materials[i] = Material.StrippedMangroveWood; - for (int i = 176; i <= 178; i++) - materials[i] = Material.StrippedOakLog; - for (int i = 209; i <= 211; i++) - materials[i] = Material.StrippedOakWood; - for (int i = 158; i <= 160; i++) - materials[i] = Material.StrippedSpruceLog; - for (int i = 212; i <= 214; i++) - materials[i] = Material.StrippedSpruceWood; - for (int i = 18429; i <= 18431; i++) - materials[i] = Material.StrippedWarpedHyphae; - for (int i = 18423; i <= 18425; i++) - materials[i] = Material.StrippedWarpedStem; - for (int i = 19197; i <= 19200; i++) - materials[i] = Material.StructureBlock; - materials[12393] = Material.StructureVoid; - for (int i = 5795; i <= 5810; i++) - materials[i] = Material.SugarCane; - for (int i = 10602; i <= 10603; i++) - materials[i] = Material.Sunflower; - for (int i = 113; i <= 116; i++) - materials[i] = Material.SuspiciousSand; - for (int i = 18416; i <= 18419; i++) - materials[i] = Material.SweetBerryBush; - for (int i = 10610; i <= 10611; i++) - materials[i] = Material.TallGrass; - for (int i = 2005; i <= 2006; i++) - materials[i] = Material.TallSeagrass; - for (int i = 19222; i <= 19237; i++) - materials[i] = Material.Target; - materials[10599] = Material.Terracotta; - materials[20924] = Material.TintedGlass; - for (int i = 2090; i <= 2091; i++) - materials[i] = Material.Tnt; - materials[2351] = Material.Torch; - materials[2072] = Material.Torchflower; - for (int i = 12350; i <= 12352; i++) - materials[i] = Material.TorchflowerCrop; - for (int i = 8975; i <= 8998; i++) - materials[i] = Material.TrappedChest; - for (int i = 7533; i <= 7660; i++) - materials[i] = Material.Tripwire; - for (int i = 7517; i <= 7532; i++) - materials[i] = Material.TripwireHook; - for (int i = 12664; i <= 12665; i++) - materials[i] = Material.TubeCoral; - materials[12649] = Material.TubeCoralBlock; - for (int i = 12684; i <= 12685; i++) - materials[i] = Material.TubeCoralFan; - for (int i = 12734; i <= 12741; i++) - materials[i] = Material.TubeCoralWallFan; - materials[20922] = Material.Tuff; - for (int i = 12632; i <= 12643; i++) - materials[i] = Material.TurtleEgg; - for (int i = 18479; i <= 18504; i++) - materials[i] = Material.TwistingVines; - materials[18505] = Material.TwistingVinesPlant; - for (int i = 23709; i <= 23711; i++) - materials[i] = Material.VerdantFroglight; - for (int i = 6833; i <= 6864; i++) - materials[i] = Material.Vine; - materials[12799] = Material.VoidAir; - for (int i = 2352; i <= 2355; i++) - materials[i] = Material.WallTorch; - for (int i = 18965; i <= 18988; i++) - materials[i] = Material.WarpedButton; - for (int i = 19053; i <= 19116; i++) - materials[i] = Material.WarpedDoor; - for (int i = 18557; i <= 18588; i++) - materials[i] = Material.WarpedFence; - for (int i = 18749; i <= 18780; i++) - materials[i] = Material.WarpedFenceGate; - materials[18433] = Material.WarpedFungus; - for (int i = 5342; i <= 5405; i++) - materials[i] = Material.WarpedHangingSign; - for (int i = 18426; i <= 18428; i++) - materials[i] = Material.WarpedHyphae; - materials[18432] = Material.WarpedNylium; - materials[18508] = Material.WarpedPlanks; - for (int i = 18523; i <= 18524; i++) - materials[i] = Material.WarpedPressurePlate; - materials[18435] = Material.WarpedRoots; - for (int i = 19149; i <= 19180; i++) - materials[i] = Material.WarpedSign; - for (int i = 18515; i <= 18520; i++) - materials[i] = Material.WarpedSlab; - for (int i = 18861; i <= 18940; i++) - materials[i] = Material.WarpedStairs; - for (int i = 18420; i <= 18422; i++) - materials[i] = Material.WarpedStem; - for (int i = 18653; i <= 18716; i++) - materials[i] = Material.WarpedTrapdoor; - for (int i = 5606; i <= 5613; i++) - materials[i] = Material.WarpedWallHangingSign; - for (int i = 19189; i <= 19196; i++) - materials[i] = Material.WarpedWallSign; - materials[18434] = Material.WarpedWartBlock; - for (int i = 80; i <= 95; i++) - materials[i] = Material.Water; - for (int i = 7395; i <= 7397; i++) - materials[i] = Material.WaterCauldron; - materials[21515] = Material.WaxedCopperBlock; - materials[21522] = Material.WaxedCutCopper; - for (int i = 21861; i <= 21866; i++) - materials[i] = Material.WaxedCutCopperSlab; - for (int i = 21763; i <= 21842; i++) - materials[i] = Material.WaxedCutCopperStairs; - materials[21517] = Material.WaxedExposedCopper; - materials[21521] = Material.WaxedExposedCutCopper; - for (int i = 21855; i <= 21860; i++) - materials[i] = Material.WaxedExposedCutCopperSlab; - for (int i = 21683; i <= 21762; i++) - materials[i] = Material.WaxedExposedCutCopperStairs; - materials[21518] = Material.WaxedOxidizedCopper; - materials[21519] = Material.WaxedOxidizedCutCopper; - for (int i = 21843; i <= 21848; i++) - materials[i] = Material.WaxedOxidizedCutCopperSlab; - for (int i = 21523; i <= 21602; i++) - materials[i] = Material.WaxedOxidizedCutCopperStairs; - materials[21516] = Material.WaxedWeatheredCopper; - materials[21520] = Material.WaxedWeatheredCutCopper; - for (int i = 21849; i <= 21854; i++) - materials[i] = Material.WaxedWeatheredCutCopperSlab; - for (int i = 21603; i <= 21682; i++) - materials[i] = Material.WaxedWeatheredCutCopperStairs; - materials[21162] = Material.WeatheredCopper; - materials[21168] = Material.WeatheredCutCopper; - for (int i = 21497; i <= 21502; i++) - materials[i] = Material.WeatheredCutCopperSlab; - for (int i = 21251; i <= 21330; i++) - materials[i] = Material.WeatheredCutCopperStairs; - for (int i = 18452; i <= 18477; i++) - materials[i] = Material.WeepingVines; - materials[18478] = Material.WeepingVinesPlant; - materials[514] = Material.WetSponge; - for (int i = 4274; i <= 4281; i++) - materials[i] = Material.Wheat; - for (int i = 10614; i <= 10629; i++) - materials[i] = Material.WhiteBanner; - for (int i = 1684; i <= 1699; i++) - materials[i] = Material.WhiteBed; - for (int i = 20582; i <= 20597; i++) - materials[i] = Material.WhiteCandle; - for (int i = 20840; i <= 20841; i++) - materials[i] = Material.WhiteCandleCake; - materials[10583] = Material.WhiteCarpet; - materials[12572] = Material.WhiteConcrete; - materials[12588] = Material.WhiteConcretePowder; - for (int i = 12508; i <= 12511; i++) - materials[i] = Material.WhiteGlazedTerracotta; - for (int i = 12412; i <= 12417; i++) - materials[i] = Material.WhiteShulkerBox; - materials[5942] = Material.WhiteStainedGlass; - for (int i = 9228; i <= 9259; i++) - materials[i] = Material.WhiteStainedGlassPane; - materials[9212] = Material.WhiteTerracotta; - materials[2079] = Material.WhiteTulip; - for (int i = 10870; i <= 10873; i++) - materials[i] = Material.WhiteWallBanner; - materials[2043] = Material.WhiteWool; - materials[2083] = Material.WitherRose; - for (int i = 8843; i <= 8858; i++) - materials[i] = Material.WitherSkeletonSkull; - for (int i = 8859; i <= 8862; i++) - materials[i] = Material.WitherSkeletonWallSkull; - for (int i = 10678; i <= 10693; i++) - materials[i] = Material.YellowBanner; - for (int i = 1748; i <= 1763; i++) - materials[i] = Material.YellowBed; - for (int i = 20646; i <= 20661; i++) - materials[i] = Material.YellowCandle; - for (int i = 20848; i <= 20849; i++) - materials[i] = Material.YellowCandleCake; - materials[10587] = Material.YellowCarpet; - materials[12576] = Material.YellowConcrete; - materials[12592] = Material.YellowConcretePowder; - for (int i = 12524; i <= 12527; i++) - materials[i] = Material.YellowGlazedTerracotta; - for (int i = 12436; i <= 12441; i++) - materials[i] = Material.YellowShulkerBox; - materials[5946] = Material.YellowStainedGlass; - for (int i = 9356; i <= 9387; i++) - materials[i] = Material.YellowStainedGlassPane; - materials[9216] = Material.YellowTerracotta; - for (int i = 10886; i <= 10889; i++) - materials[i] = Material.YellowWallBanner; - materials[2047] = Material.YellowWool; - for (int i = 8863; i <= 8878; i++) - materials[i] = Material.ZombieHead; - for (int i = 8879; i <= 8882; i++) - materials[i] = Material.ZombieWallHead; - } - - // - private static readonly BlockStateDefinition[] stateDefinitions = - [ - new(8, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(12, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(25, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(27, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(29, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(31, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(33, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(35, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(37, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(39, 40, - [ - new("age", ["0", "1", "2", "3", "4"], 8), - new("hanging", ["true", "false"], 4), - new("stage", ["0", "1"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(80, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(96, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(113, 4, - [ - new("dusted", ["0", "1", "2", "3"], 1) - ]), - new(126, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(129, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(132, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(135, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(138, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(141, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(144, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(147, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(150, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(152, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(155, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(158, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(161, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(164, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(167, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(170, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(173, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(176, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(179, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(182, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(185, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(188, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(191, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(194, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(197, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(200, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(203, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(206, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(209, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(212, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(215, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(218, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(221, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(224, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(227, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(230, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(233, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(261, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(289, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(317, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(345, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(373, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(401, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(429, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(457, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(485, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(519, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(534, 1150, - [ - new("instrument", ["harp", "basedrum", "snare", "hat", "bass", "flute", "bell", "guitar", "chime", "xylophone", "iron_xylophone", "cow_bell", "didgeridoo", "bit", "banjo", "pling", "zombie", "skeleton", "creeper", "dragon", "wither_skeleton", "piglin", "custom_head"], 50), - new("note", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"], 2), - new("powered", ["true", "false"], 1) - ]), - new(1684, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1700, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1716, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1732, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1748, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1764, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1780, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1796, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1812, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1828, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1844, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1860, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1876, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1892, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1908, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1924, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1940, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(1964, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(1988, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(2005, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(2007, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(2019, 24, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("short", ["true", "false"], 2) - ]), - new(2059, 12, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 2) - ]), - new(2090, 2, - [ - new("unstable", ["true", "false"], 1) - ]), - new(2093, 256, - [ - new("facing", ["north", "south", "west", "east"], 64), - new("slot_0_occupied", ["true", "false"], 32), - new("slot_1_occupied", ["true", "false"], 16), - new("slot_2_occupied", ["true", "false"], 8), - new("slot_3_occupied", ["true", "false"], 4), - new("slot_4_occupied", ["true", "false"], 2), - new("slot_5_occupied", ["true", "false"], 1) - ]), - new(2352, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(2356, 512, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(2870, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2950, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(2974, 1296, - [ - new("east", ["up", "side", "none"], 432), - new("north", ["up", "side", "none"], 144), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 9), - new("south", ["up", "side", "none"], 3), - new("west", ["up", "side", "none"], 1) - ]), - new(4274, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4282, 8, - [ - new("moisture", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4290, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(4298, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4330, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4362, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4394, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4426, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4458, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4490, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4522, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4554, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4586, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(4650, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4658, 20, - [ - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south", "south_east", "south_west", "north_west", "north_east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4678, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4758, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4766, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4774, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4782, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4790, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4798, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4806, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4814, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4822, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4830, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4894, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4958, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5022, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5086, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5150, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5214, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5278, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5342, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5406, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5470, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5534, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5542, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5550, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5558, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5566, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5574, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5582, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5590, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5598, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5606, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5614, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5622, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5646, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5648, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5712, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5714, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5716, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5718, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5720, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5722, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5724, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5726, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5728, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5730, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5732, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5734, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5736, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(5744, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5768, 8, - [ - new("layers", ["1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(5778, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5795, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5811, 2, - [ - new("has_record", ["true", "false"], 1) - ]), - new(5813, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5849, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(5852, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(5856, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5861, 2, - [ - new("axis", ["x", "z"], 1) - ]), - new(5863, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5867, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5871, 7, - [ - new("bites", ["0", "1", "2", "3", "4", "5", "6"], 1) - ]), - new(5878, 64, - [ - new("delay", ["1", "2", "3", "4"], 16), - new("facing", ["north", "south", "west", "east"], 4), - new("locked", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5958, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6022, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6086, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6150, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6214, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6278, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6342, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6406, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6470, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6546, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6610, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6674, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6738, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6770, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6776, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6809, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6813, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6817, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(6825, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(6833, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6865, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6993, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7025, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7105, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7185, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7265, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(7269, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7301, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7381, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(7386, 8, - [ - new("has_bottle_0", ["true", "false"], 4), - new("has_bottle_1", ["true", "false"], 2), - new("has_bottle_2", ["true", "false"], 1) - ]), - new(7395, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(7399, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(7403, 8, - [ - new("eye", ["true", "false"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7413, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(7415, 12, - [ - new("age", ["0", "1", "2"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7427, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7509, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7517, 16, - [ - new("attached", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7533, 128, - [ - new("attached", ["true", "false"], 64), - new("disarmed", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("powered", ["true", "false"], 4), - new("south", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7662, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7742, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7822, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7902, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(7915, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(8239, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(8591, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(8599, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(8607, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8631, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8655, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8679, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8703, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8727, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8751, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8775, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8799, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8823, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8839, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8843, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8859, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8863, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8879, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8883, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8899, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8903, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8919, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8923, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8939, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8943, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8959, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8963, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8967, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8971, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8975, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(8999, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9015, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9031, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("mode", ["compare", "subtract"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9047, 32, - [ - new("inverted", ["true", "false"], 16), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9081, 10, - [ - new("enabled", ["true", "false"], 5), - new("facing", ["down", "north", "south", "west", "east"], 1) - ]), - new(9093, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(9096, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9176, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9200, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(9228, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9260, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9292, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9324, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9356, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9388, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9420, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9452, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9484, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9516, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9548, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9580, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9612, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9644, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9676, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9708, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9740, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9820, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9900, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9980, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10060, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10140, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10222, 32, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10254, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10321, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10401, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10481, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10561, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10567, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10573, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10580, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(10602, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10604, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10606, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10608, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10610, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10612, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10614, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10630, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10646, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10662, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10678, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10694, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10710, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10726, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10742, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10758, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10774, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10790, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10806, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10822, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10838, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10854, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10870, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10874, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10878, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10882, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10886, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10890, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10894, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10898, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10902, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10906, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10910, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10914, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10918, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10922, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10926, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10930, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10937, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11017, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11023, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11029, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11035, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11041, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11047, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11053, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11059, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11065, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11071, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11077, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11083, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11089, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11095, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11101, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11107, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11113, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11119, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11125, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11131, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11137, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11143, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11149, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11155, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11165, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11197, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11229, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11261, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11293, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11325, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11357, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11389, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11421, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11453, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11485, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11517, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11549, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11581, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11613, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11645, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11677, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11741, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11805, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11869, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11933, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11997, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12061, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12125, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12189, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12195, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12259, 6, - [ - new("age", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(12266, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(12269, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12350, 3, - [ - new("age", ["0", "1", "2"], 1) - ]), - new(12353, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(12359, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12371, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12383, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(12390, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(12394, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12406, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12412, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12418, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12424, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12430, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12436, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12442, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12448, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12454, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12460, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12466, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12472, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12478, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12484, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12490, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12496, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12502, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12508, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12512, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12516, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12520, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12524, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12528, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12532, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12536, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12540, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12544, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12548, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12552, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12556, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12560, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12564, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12568, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12604, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(12632, 12, - [ - new("eggs", ["1", "2", "3", "4"], 3), - new("hatch", ["0", "1", "2"], 1) - ]), - new(12654, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12656, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12658, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12660, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12662, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12664, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12666, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12668, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12670, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12672, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12674, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12676, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12678, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12680, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12682, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12684, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12686, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12688, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12690, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12692, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12694, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12702, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12710, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12718, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12726, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12734, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12742, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12750, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12758, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12766, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12774, 8, - [ - new("pickles", ["1", "2", "3", "4"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12783, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12786, 12, - [ - new("age", ["0", "1"], 6), - new("leaves", ["none", "small", "large"], 2), - new("stage", ["0", "1"], 1) - ]), - new(12801, 2, - [ - new("drag", ["true", "false"], 1) - ]), - new(12803, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12883, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12963, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13043, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13123, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13203, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13283, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13363, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13443, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13523, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13603, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13683, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13763, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13843, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13923, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13929, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13935, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13941, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13947, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13953, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13959, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13965, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13971, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13977, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13983, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13989, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13995, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14001, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14325, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14649, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14973, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15297, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15621, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15945, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16269, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16593, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16917, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17241, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17565, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17889, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18213, 32, - [ - new("bottom", ["true", "false"], 16), - new("distance", ["0", "1", "2", "3", "4", "5", "6", "7"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18245, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(18249, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("open", ["true", "false"], 1) - ]), - new(18261, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(18269, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(18279, 12, - [ - new("face", ["floor", "wall", "ceiling"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(18291, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("has_book", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18308, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(18312, 32, - [ - new("attachment", ["floor", "ceiling", "single_wall", "double_wall"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18344, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18348, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18352, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18384, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18416, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(18420, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18423, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18426, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18429, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18437, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18440, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18443, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18446, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18452, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(18479, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(18509, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18515, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18521, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(18523, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(18525, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(18557, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(18589, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18653, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18717, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18749, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18781, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18861, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18941, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18965, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18989, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19053, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19117, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19149, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19181, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19189, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19197, 4, - [ - new("mode", ["save", "load", "corner", "data"], 1) - ]), - new(19201, 12, - [ - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 1) - ]), - new(19213, 9, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(19222, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(19238, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(19262, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(19291, 5, - [ - new("charges", ["0", "1", "2", "3", "4"], 1) - ]), - new(19302, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19382, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19706, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19716, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19722, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19802, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20127, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20207, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20213, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(20215, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20239, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20566, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20582, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20598, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20614, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20630, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20646, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20662, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20678, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20694, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20710, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20726, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20742, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20758, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20774, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20790, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20806, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20822, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20838, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20840, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20842, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20844, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20846, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20848, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20850, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20852, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20854, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20856, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20858, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20860, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20862, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20864, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20866, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20868, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20870, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20874, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20886, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20898, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20910, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20926, 96, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21023, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(21151, 2, - [ - new("bloom", ["true", "false"], 1) - ]), - new(21153, 8, - [ - new("can_summon", ["true", "false"], 4), - new("shrieking", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21171, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21251, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21331, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21411, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21491, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21497, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21503, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21509, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21523, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21603, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21683, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21763, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21843, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21849, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21855, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21861, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21867, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21891, 20, - [ - new("thickness", ["tip_merge", "tip", "frustum", "middle", "base"], 4), - new("vertical_direction", ["up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21912, 52, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 2), - new("berries", ["true", "false"], 1) - ]), - new(21964, 2, - [ - new("berries", ["true", "false"], 1) - ]), - new(21970, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("flower_amount", ["1", "2", "3", "4"], 1) - ]), - new(21987, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("tilt", ["none", "unstable", "partial", "full"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22019, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22027, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("half", ["upper", "lower"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22043, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(22047, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(22051, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22131, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22137, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(22462, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22542, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22548, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(22873, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22953, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22959, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(23284, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23364, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23370, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(23697, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(23706, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(23709, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(23712, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(23717, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - ]; - // - - protected override Dictionary GetDict() - { - return materials; - } - - protected override BlockStateDefinition[] GetStateDefinitions() - { - return stateDefinitions; - } - } -} diff --git a/MinecraftClient/Mapping/BlockPalettes/Palette1204.cs b/MinecraftClient/Mapping/BlockPalettes/Palette1204.cs deleted file mode 100644 index be64f26f9c..0000000000 --- a/MinecraftClient/Mapping/BlockPalettes/Palette1204.cs +++ /dev/null @@ -1,5538 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.BlockPalettes -{ - public class Palette1204 : BlockPalette - { - private static readonly Dictionary materials = new(); - - static Palette1204() - { - for (int i = 8707; i <= 8730; i++) - materials[i] = Material.AcaciaButton; - for (int i = 12014; i <= 12077; i++) - materials[i] = Material.AcaciaDoor; - for (int i = 11662; i <= 11693; i++) - materials[i] = Material.AcaciaFence; - for (int i = 11406; i <= 11437; i++) - materials[i] = Material.AcaciaFenceGate; - for (int i = 5026; i <= 5089; i++) - materials[i] = Material.AcaciaHangingSign; - for (int i = 349; i <= 376; i++) - materials[i] = Material.AcaciaLeaves; - for (int i = 142; i <= 144; i++) - materials[i] = Material.AcaciaLog; - materials[19] = Material.AcaciaPlanks; - for (int i = 5724; i <= 5725; i++) - materials[i] = Material.AcaciaPressurePlate; - for (int i = 33; i <= 34; i++) - materials[i] = Material.AcaciaSapling; - for (int i = 4398; i <= 4429; i++) - materials[i] = Material.AcaciaSign; - for (int i = 11186; i <= 11191; i++) - materials[i] = Material.AcaciaSlab; - for (int i = 9884; i <= 9963; i++) - materials[i] = Material.AcaciaStairs; - for (int i = 6217; i <= 6280; i++) - materials[i] = Material.AcaciaTrapdoor; - for (int i = 5562; i <= 5569; i++) - materials[i] = Material.AcaciaWallHangingSign; - for (int i = 4786; i <= 4793; i++) - materials[i] = Material.AcaciaWallSign; - for (int i = 201; i <= 203; i++) - materials[i] = Material.AcaciaWood; - for (int i = 9320; i <= 9343; i++) - materials[i] = Material.ActivatorRail; - materials[0] = Material.Air; - materials[2079] = Material.Allium; - materials[21031] = Material.AmethystBlock; - for (int i = 21033; i <= 21044; i++) - materials[i] = Material.AmethystCluster; - materials[19448] = Material.AncientDebris; - materials[6] = Material.Andesite; - for (int i = 14136; i <= 14141; i++) - materials[i] = Material.AndesiteSlab; - for (int i = 13762; i <= 13841; i++) - materials[i] = Material.AndesiteStairs; - for (int i = 16752; i <= 17075; i++) - materials[i] = Material.AndesiteWall; - for (int i = 9107; i <= 9110; i++) - materials[i] = Material.Anvil; - for (int i = 6817; i <= 6820; i++) - materials[i] = Material.AttachedMelonStem; - for (int i = 6813; i <= 6816; i++) - materials[i] = Material.AttachedPumpkinStem; - materials[24824] = Material.Azalea; - for (int i = 461; i <= 488; i++) - materials[i] = Material.AzaleaLeaves; - materials[2080] = Material.AzureBluet; - for (int i = 12945; i <= 12956; i++) - materials[i] = Material.Bamboo; - for (int i = 159; i <= 161; i++) - materials[i] = Material.BambooBlock; - for (int i = 8803; i <= 8826; i++) - materials[i] = Material.BambooButton; - for (int i = 12270; i <= 12333; i++) - materials[i] = Material.BambooDoor; - for (int i = 11790; i <= 11821; i++) - materials[i] = Material.BambooFence; - for (int i = 11534; i <= 11565; i++) - materials[i] = Material.BambooFenceGate; - for (int i = 5474; i <= 5537; i++) - materials[i] = Material.BambooHangingSign; - materials[24] = Material.BambooMosaic; - for (int i = 11216; i <= 11221; i++) - materials[i] = Material.BambooMosaicSlab; - for (int i = 10284; i <= 10363; i++) - materials[i] = Material.BambooMosaicStairs; - materials[23] = Material.BambooPlanks; - for (int i = 5732; i <= 5733; i++) - materials[i] = Material.BambooPressurePlate; - materials[12944] = Material.BambooSapling; - for (int i = 4558; i <= 4589; i++) - materials[i] = Material.BambooSign; - for (int i = 11210; i <= 11215; i++) - materials[i] = Material.BambooSlab; - for (int i = 10204; i <= 10283; i++) - materials[i] = Material.BambooStairs; - for (int i = 6473; i <= 6536; i++) - materials[i] = Material.BambooTrapdoor; - for (int i = 5618; i <= 5625; i++) - materials[i] = Material.BambooWallHangingSign; - for (int i = 4826; i <= 4833; i++) - materials[i] = Material.BambooWallSign; - for (int i = 18408; i <= 18419; i++) - materials[i] = Material.Barrel; - for (int i = 10365; i <= 10366; i++) - materials[i] = Material.Barrier; - for (int i = 5852; i <= 5854; i++) - materials[i] = Material.Basalt; - materials[7918] = Material.Beacon; - materials[79] = Material.Bedrock; - for (int i = 19397; i <= 19420; i++) - materials[i] = Material.BeeNest; - for (int i = 19421; i <= 19444; i++) - materials[i] = Material.Beehive; - for (int i = 12509; i <= 12512; i++) - materials[i] = Material.Beetroots; - for (int i = 18471; i <= 18502; i++) - materials[i] = Material.Bell; - for (int i = 24844; i <= 24875; i++) - materials[i] = Material.BigDripleaf; - for (int i = 24876; i <= 24883; i++) - materials[i] = Material.BigDripleafStem; - for (int i = 8659; i <= 8682; i++) - materials[i] = Material.BirchButton; - for (int i = 11886; i <= 11949; i++) - materials[i] = Material.BirchDoor; - for (int i = 11598; i <= 11629; i++) - materials[i] = Material.BirchFence; - for (int i = 11342; i <= 11373; i++) - materials[i] = Material.BirchFenceGate; - for (int i = 4962; i <= 5025; i++) - materials[i] = Material.BirchHangingSign; - for (int i = 293; i <= 320; i++) - materials[i] = Material.BirchLeaves; - for (int i = 136; i <= 138; i++) - materials[i] = Material.BirchLog; - materials[17] = Material.BirchPlanks; - for (int i = 5720; i <= 5721; i++) - materials[i] = Material.BirchPressurePlate; - for (int i = 29; i <= 30; i++) - materials[i] = Material.BirchSapling; - for (int i = 4366; i <= 4397; i++) - materials[i] = Material.BirchSign; - for (int i = 11174; i <= 11179; i++) - materials[i] = Material.BirchSlab; - for (int i = 7746; i <= 7825; i++) - materials[i] = Material.BirchStairs; - for (int i = 6089; i <= 6152; i++) - materials[i] = Material.BirchTrapdoor; - for (int i = 5554; i <= 5561; i++) - materials[i] = Material.BirchWallHangingSign; - for (int i = 4778; i <= 4785; i++) - materials[i] = Material.BirchWallSign; - for (int i = 195; i <= 197; i++) - materials[i] = Material.BirchWood; - for (int i = 10999; i <= 11014; i++) - materials[i] = Material.BlackBanner; - for (int i = 1928; i <= 1943; i++) - materials[i] = Material.BlackBed; - for (int i = 20981; i <= 20996; i++) - materials[i] = Material.BlackCandle; - for (int i = 21029; i <= 21030; i++) - materials[i] = Material.BlackCandleCake; - materials[10743] = Material.BlackCarpet; - materials[12743] = Material.BlackConcrete; - materials[12759] = Material.BlackConcretePowder; - for (int i = 12724; i <= 12727; i++) - materials[i] = Material.BlackGlazedTerracotta; - for (int i = 12658; i <= 12663; i++) - materials[i] = Material.BlackShulkerBox; - materials[5960] = Material.BlackStainedGlass; - for (int i = 9852; i <= 9883; i++) - materials[i] = Material.BlackStainedGlassPane; - materials[9371] = Material.BlackTerracotta; - for (int i = 11075; i <= 11078; i++) - materials[i] = Material.BlackWallBanner; - materials[2062] = Material.BlackWool; - materials[19460] = Material.Blackstone; - for (int i = 19865; i <= 19870; i++) - materials[i] = Material.BlackstoneSlab; - for (int i = 19461; i <= 19540; i++) - materials[i] = Material.BlackstoneStairs; - for (int i = 19541; i <= 19864; i++) - materials[i] = Material.BlackstoneWall; - for (int i = 18428; i <= 18435; i++) - materials[i] = Material.BlastFurnace; - for (int i = 10935; i <= 10950; i++) - materials[i] = Material.BlueBanner; - for (int i = 1864; i <= 1879; i++) - materials[i] = Material.BlueBed; - for (int i = 20917; i <= 20932; i++) - materials[i] = Material.BlueCandle; - for (int i = 21021; i <= 21022; i++) - materials[i] = Material.BlueCandleCake; - materials[10739] = Material.BlueCarpet; - materials[12739] = Material.BlueConcrete; - materials[12755] = Material.BlueConcretePowder; - for (int i = 12708; i <= 12711; i++) - materials[i] = Material.BlueGlazedTerracotta; - materials[12941] = Material.BlueIce; - materials[2078] = Material.BlueOrchid; - for (int i = 12634; i <= 12639; i++) - materials[i] = Material.BlueShulkerBox; - materials[5956] = Material.BlueStainedGlass; - for (int i = 9724; i <= 9755; i++) - materials[i] = Material.BlueStainedGlassPane; - materials[9367] = Material.BlueTerracotta; - for (int i = 11059; i <= 11062; i++) - materials[i] = Material.BlueWallBanner; - materials[2058] = Material.BlueWool; - for (int i = 12546; i <= 12548; i++) - materials[i] = Material.BoneBlock; - materials[2096] = Material.Bookshelf; - for (int i = 12825; i <= 12826; i++) - materials[i] = Material.BrainCoral; - materials[12809] = Material.BrainCoralBlock; - for (int i = 12845; i <= 12846; i++) - materials[i] = Material.BrainCoralFan; - for (int i = 12901; i <= 12908; i++) - materials[i] = Material.BrainCoralWallFan; - for (int i = 7390; i <= 7397; i++) - materials[i] = Material.BrewingStand; - for (int i = 11258; i <= 11263; i++) - materials[i] = Material.BrickSlab; - for (int i = 7029; i <= 7108; i++) - materials[i] = Material.BrickStairs; - for (int i = 14160; i <= 14483; i++) - materials[i] = Material.BrickWall; - materials[2093] = Material.Bricks; - for (int i = 10951; i <= 10966; i++) - materials[i] = Material.BrownBanner; - for (int i = 1880; i <= 1895; i++) - materials[i] = Material.BrownBed; - for (int i = 20933; i <= 20948; i++) - materials[i] = Material.BrownCandle; - for (int i = 21023; i <= 21024; i++) - materials[i] = Material.BrownCandleCake; - materials[10740] = Material.BrownCarpet; - materials[12740] = Material.BrownConcrete; - materials[12756] = Material.BrownConcretePowder; - for (int i = 12712; i <= 12715; i++) - materials[i] = Material.BrownGlazedTerracotta; - materials[2089] = Material.BrownMushroom; - for (int i = 6549; i <= 6612; i++) - materials[i] = Material.BrownMushroomBlock; - for (int i = 12640; i <= 12645; i++) - materials[i] = Material.BrownShulkerBox; - materials[5957] = Material.BrownStainedGlass; - for (int i = 9756; i <= 9787; i++) - materials[i] = Material.BrownStainedGlassPane; - materials[9368] = Material.BrownTerracotta; - for (int i = 11063; i <= 11066; i++) - materials[i] = Material.BrownWallBanner; - materials[2059] = Material.BrownWool; - for (int i = 12960; i <= 12961; i++) - materials[i] = Material.BubbleColumn; - for (int i = 12827; i <= 12828; i++) - materials[i] = Material.BubbleCoral; - materials[12810] = Material.BubbleCoralBlock; - for (int i = 12847; i <= 12848; i++) - materials[i] = Material.BubbleCoralFan; - for (int i = 12909; i <= 12916; i++) - materials[i] = Material.BubbleCoralWallFan; - materials[21032] = Material.BuddingAmethyst; - for (int i = 5782; i <= 5797; i++) - materials[i] = Material.Cactus; - for (int i = 5874; i <= 5880; i++) - materials[i] = Material.Cake; - materials[22316] = Material.Calcite; - for (int i = 22415; i <= 22798; i++) - materials[i] = Material.CalibratedSculkSensor; - for (int i = 18511; i <= 18542; i++) - materials[i] = Material.Campfire; - for (int i = 20725; i <= 20740; i++) - materials[i] = Material.Candle; - for (int i = 20997; i <= 20998; i++) - materials[i] = Material.CandleCake; - for (int i = 8595; i <= 8602; i++) - materials[i] = Material.Carrots; - materials[18436] = Material.CartographyTable; - for (int i = 5866; i <= 5869; i++) - materials[i] = Material.CarvedPumpkin; - materials[7398] = Material.Cauldron; - materials[12959] = Material.CaveAir; - for (int i = 24769; i <= 24820; i++) - materials[i] = Material.CaveVines; - for (int i = 24821; i <= 24822; i++) - materials[i] = Material.CaveVinesPlant; - for (int i = 6773; i <= 6778; i++) - materials[i] = Material.Chain; - for (int i = 12527; i <= 12538; i++) - materials[i] = Material.ChainCommandBlock; - for (int i = 8731; i <= 8754; i++) - materials[i] = Material.CherryButton; - for (int i = 12078; i <= 12141; i++) - materials[i] = Material.CherryDoor; - for (int i = 11694; i <= 11725; i++) - materials[i] = Material.CherryFence; - for (int i = 11438; i <= 11469; i++) - materials[i] = Material.CherryFenceGate; - for (int i = 5090; i <= 5153; i++) - materials[i] = Material.CherryHangingSign; - for (int i = 377; i <= 404; i++) - materials[i] = Material.CherryLeaves; - for (int i = 145; i <= 147; i++) - materials[i] = Material.CherryLog; - materials[20] = Material.CherryPlanks; - for (int i = 5726; i <= 5727; i++) - materials[i] = Material.CherryPressurePlate; - for (int i = 35; i <= 36; i++) - materials[i] = Material.CherrySapling; - for (int i = 4430; i <= 4461; i++) - materials[i] = Material.CherrySign; - for (int i = 11192; i <= 11197; i++) - materials[i] = Material.CherrySlab; - for (int i = 9964; i <= 10043; i++) - materials[i] = Material.CherryStairs; - for (int i = 6281; i <= 6344; i++) - materials[i] = Material.CherryTrapdoor; - for (int i = 5570; i <= 5577; i++) - materials[i] = Material.CherryWallHangingSign; - for (int i = 4794; i <= 4801; i++) - materials[i] = Material.CherryWallSign; - for (int i = 204; i <= 206; i++) - materials[i] = Material.CherryWood; - for (int i = 2954; i <= 2977; i++) - materials[i] = Material.Chest; - for (int i = 9111; i <= 9114; i++) - materials[i] = Material.ChippedAnvil; - for (int i = 2097; i <= 2352; i++) - materials[i] = Material.ChiseledBookshelf; - materials[22951] = Material.ChiseledCopper; - materials[26551] = Material.ChiseledDeepslate; - materials[20722] = Material.ChiseledNetherBricks; - materials[19874] = Material.ChiseledPolishedBlackstone; - materials[9236] = Material.ChiseledQuartzBlock; - materials[11080] = Material.ChiseledRedSandstone; - materials[536] = Material.ChiseledSandstone; - materials[6540] = Material.ChiseledStoneBricks; - materials[21903] = Material.ChiseledTuff; - materials[22315] = Material.ChiseledTuffBricks; - for (int i = 12404; i <= 12409; i++) - materials[i] = Material.ChorusFlower; - for (int i = 12340; i <= 12403; i++) - materials[i] = Material.ChorusPlant; - materials[5798] = Material.Clay; - materials[10745] = Material.CoalBlock; - materials[127] = Material.CoalOre; - materials[11] = Material.CoarseDirt; - materials[24907] = Material.CobbledDeepslate; - for (int i = 24988; i <= 24993; i++) - materials[i] = Material.CobbledDeepslateSlab; - for (int i = 24908; i <= 24987; i++) - materials[i] = Material.CobbledDeepslateStairs; - for (int i = 24994; i <= 25317; i++) - materials[i] = Material.CobbledDeepslateWall; - materials[14] = Material.Cobblestone; - for (int i = 11252; i <= 11257; i++) - materials[i] = Material.CobblestoneSlab; - for (int i = 4682; i <= 4761; i++) - materials[i] = Material.CobblestoneStairs; - for (int i = 7919; i <= 8242; i++) - materials[i] = Material.CobblestoneWall; - materials[2004] = Material.Cobweb; - for (int i = 7419; i <= 7430; i++) - materials[i] = Material.Cocoa; - for (int i = 7906; i <= 7917; i++) - materials[i] = Material.CommandBlock; - for (int i = 9175; i <= 9190; i++) - materials[i] = Material.Comparator; - for (int i = 19372; i <= 19380; i++) - materials[i] = Material.Composter; - for (int i = 12942; i <= 12943; i++) - materials[i] = Material.Conduit; - materials[22938] = Material.CopperBlock; - for (int i = 24692; i <= 24695; i++) - materials[i] = Material.CopperBulb; - for (int i = 23652; i <= 23715; i++) - materials[i] = Material.CopperDoor; - for (int i = 24676; i <= 24677; i++) - materials[i] = Material.CopperGrate; - materials[22942] = Material.CopperOre; - for (int i = 24164; i <= 24227; i++) - materials[i] = Material.CopperTrapdoor; - materials[2086] = Material.Cornflower; - materials[26552] = Material.CrackedDeepslateBricks; - materials[26553] = Material.CrackedDeepslateTiles; - materials[20723] = Material.CrackedNetherBricks; - materials[19873] = Material.CrackedPolishedBlackstoneBricks; - materials[6539] = Material.CrackedStoneBricks; - for (int i = 26590; i <= 26637; i++) - materials[i] = Material.Crafter; - materials[4277] = Material.CraftingTable; - for (int i = 8987; i <= 9018; i++) - materials[i] = Material.CreeperHead; - for (int i = 9019; i <= 9026; i++) - materials[i] = Material.CreeperWallHead; - for (int i = 19100; i <= 19123; i++) - materials[i] = Material.CrimsonButton; - for (int i = 19148; i <= 19211; i++) - materials[i] = Material.CrimsonDoor; - for (int i = 18684; i <= 18715; i++) - materials[i] = Material.CrimsonFence; - for (int i = 18876; i <= 18907; i++) - materials[i] = Material.CrimsonFenceGate; - materials[18609] = Material.CrimsonFungus; - for (int i = 5282; i <= 5345; i++) - materials[i] = Material.CrimsonHangingSign; - for (int i = 18602; i <= 18604; i++) - materials[i] = Material.CrimsonHyphae; - materials[18608] = Material.CrimsonNylium; - materials[18666] = Material.CrimsonPlanks; - for (int i = 18680; i <= 18681; i++) - materials[i] = Material.CrimsonPressurePlate; - materials[18665] = Material.CrimsonRoots; - for (int i = 19276; i <= 19307; i++) - materials[i] = Material.CrimsonSign; - for (int i = 18668; i <= 18673; i++) - materials[i] = Material.CrimsonSlab; - for (int i = 18940; i <= 19019; i++) - materials[i] = Material.CrimsonStairs; - for (int i = 18596; i <= 18598; i++) - materials[i] = Material.CrimsonStem; - for (int i = 18748; i <= 18811; i++) - materials[i] = Material.CrimsonTrapdoor; - for (int i = 5602; i <= 5609; i++) - materials[i] = Material.CrimsonWallHangingSign; - for (int i = 19340; i <= 19347; i++) - materials[i] = Material.CrimsonWallSign; - materials[19449] = Material.CryingObsidian; - materials[22947] = Material.CutCopper; - for (int i = 23294; i <= 23299; i++) - materials[i] = Material.CutCopperSlab; - for (int i = 23196; i <= 23275; i++) - materials[i] = Material.CutCopperStairs; - materials[11081] = Material.CutRedSandstone; - for (int i = 11294; i <= 11299; i++) - materials[i] = Material.CutRedSandstoneSlab; - materials[537] = Material.CutSandstone; - for (int i = 11240; i <= 11245; i++) - materials[i] = Material.CutSandstoneSlab; - for (int i = 10903; i <= 10918; i++) - materials[i] = Material.CyanBanner; - for (int i = 1832; i <= 1847; i++) - materials[i] = Material.CyanBed; - for (int i = 20885; i <= 20900; i++) - materials[i] = Material.CyanCandle; - for (int i = 21017; i <= 21018; i++) - materials[i] = Material.CyanCandleCake; - materials[10737] = Material.CyanCarpet; - materials[12737] = Material.CyanConcrete; - materials[12753] = Material.CyanConcretePowder; - for (int i = 12700; i <= 12703; i++) - materials[i] = Material.CyanGlazedTerracotta; - for (int i = 12622; i <= 12627; i++) - materials[i] = Material.CyanShulkerBox; - materials[5954] = Material.CyanStainedGlass; - for (int i = 9660; i <= 9691; i++) - materials[i] = Material.CyanStainedGlassPane; - materials[9365] = Material.CyanTerracotta; - for (int i = 11051; i <= 11054; i++) - materials[i] = Material.CyanWallBanner; - materials[2056] = Material.CyanWool; - for (int i = 9115; i <= 9118; i++) - materials[i] = Material.DamagedAnvil; - materials[2075] = Material.Dandelion; - for (int i = 8755; i <= 8778; i++) - materials[i] = Material.DarkOakButton; - for (int i = 12142; i <= 12205; i++) - materials[i] = Material.DarkOakDoor; - for (int i = 11726; i <= 11757; i++) - materials[i] = Material.DarkOakFence; - for (int i = 11470; i <= 11501; i++) - materials[i] = Material.DarkOakFenceGate; - for (int i = 5218; i <= 5281; i++) - materials[i] = Material.DarkOakHangingSign; - for (int i = 405; i <= 432; i++) - materials[i] = Material.DarkOakLeaves; - for (int i = 148; i <= 150; i++) - materials[i] = Material.DarkOakLog; - materials[21] = Material.DarkOakPlanks; - for (int i = 5728; i <= 5729; i++) - materials[i] = Material.DarkOakPressurePlate; - for (int i = 37; i <= 38; i++) - materials[i] = Material.DarkOakSapling; - for (int i = 4494; i <= 4525; i++) - materials[i] = Material.DarkOakSign; - for (int i = 11198; i <= 11203; i++) - materials[i] = Material.DarkOakSlab; - for (int i = 10044; i <= 10123; i++) - materials[i] = Material.DarkOakStairs; - for (int i = 6345; i <= 6408; i++) - materials[i] = Material.DarkOakTrapdoor; - for (int i = 5586; i <= 5593; i++) - materials[i] = Material.DarkOakWallHangingSign; - for (int i = 4810; i <= 4817; i++) - materials[i] = Material.DarkOakWallSign; - for (int i = 207; i <= 209; i++) - materials[i] = Material.DarkOakWood; - materials[10465] = Material.DarkPrismarine; - for (int i = 10718; i <= 10723; i++) - materials[i] = Material.DarkPrismarineSlab; - for (int i = 10626; i <= 10705; i++) - materials[i] = Material.DarkPrismarineStairs; - for (int i = 9191; i <= 9222; i++) - materials[i] = Material.DaylightDetector; - for (int i = 12815; i <= 12816; i++) - materials[i] = Material.DeadBrainCoral; - materials[12804] = Material.DeadBrainCoralBlock; - for (int i = 12835; i <= 12836; i++) - materials[i] = Material.DeadBrainCoralFan; - for (int i = 12861; i <= 12868; i++) - materials[i] = Material.DeadBrainCoralWallFan; - for (int i = 12817; i <= 12818; i++) - materials[i] = Material.DeadBubbleCoral; - materials[12805] = Material.DeadBubbleCoralBlock; - for (int i = 12837; i <= 12838; i++) - materials[i] = Material.DeadBubbleCoralFan; - for (int i = 12869; i <= 12876; i++) - materials[i] = Material.DeadBubbleCoralWallFan; - materials[2007] = Material.DeadBush; - for (int i = 12819; i <= 12820; i++) - materials[i] = Material.DeadFireCoral; - materials[12806] = Material.DeadFireCoralBlock; - for (int i = 12839; i <= 12840; i++) - materials[i] = Material.DeadFireCoralFan; - for (int i = 12877; i <= 12884; i++) - materials[i] = Material.DeadFireCoralWallFan; - for (int i = 12821; i <= 12822; i++) - materials[i] = Material.DeadHornCoral; - materials[12807] = Material.DeadHornCoralBlock; - for (int i = 12841; i <= 12842; i++) - materials[i] = Material.DeadHornCoralFan; - for (int i = 12885; i <= 12892; i++) - materials[i] = Material.DeadHornCoralWallFan; - for (int i = 12813; i <= 12814; i++) - materials[i] = Material.DeadTubeCoral; - materials[12803] = Material.DeadTubeCoralBlock; - for (int i = 12833; i <= 12834; i++) - materials[i] = Material.DeadTubeCoralFan; - for (int i = 12853; i <= 12860; i++) - materials[i] = Material.DeadTubeCoralWallFan; - for (int i = 26574; i <= 26589; i++) - materials[i] = Material.DecoratedPot; - for (int i = 24904; i <= 24906; i++) - materials[i] = Material.Deepslate; - for (int i = 26221; i <= 26226; i++) - materials[i] = Material.DeepslateBrickSlab; - for (int i = 26141; i <= 26220; i++) - materials[i] = Material.DeepslateBrickStairs; - for (int i = 26227; i <= 26550; i++) - materials[i] = Material.DeepslateBrickWall; - materials[26140] = Material.DeepslateBricks; - materials[128] = Material.DeepslateCoalOre; - materials[22943] = Material.DeepslateCopperOre; - materials[4275] = Material.DeepslateDiamondOre; - materials[7512] = Material.DeepslateEmeraldOre; - materials[124] = Material.DeepslateGoldOre; - materials[126] = Material.DeepslateIronOre; - materials[521] = Material.DeepslateLapisOre; - for (int i = 5736; i <= 5737; i++) - materials[i] = Material.DeepslateRedstoneOre; - for (int i = 25810; i <= 25815; i++) - materials[i] = Material.DeepslateTileSlab; - for (int i = 25730; i <= 25809; i++) - materials[i] = Material.DeepslateTileStairs; - for (int i = 25816; i <= 26139; i++) - materials[i] = Material.DeepslateTileWall; - materials[25729] = Material.DeepslateTiles; - for (int i = 1968; i <= 1991; i++) - materials[i] = Material.DetectorRail; - materials[4276] = Material.DiamondBlock; - materials[4274] = Material.DiamondOre; - materials[4] = Material.Diorite; - for (int i = 14154; i <= 14159; i++) - materials[i] = Material.DioriteSlab; - for (int i = 14002; i <= 14081; i++) - materials[i] = Material.DioriteStairs; - for (int i = 18048; i <= 18371; i++) - materials[i] = Material.DioriteWall; - materials[10] = Material.Dirt; - materials[12513] = Material.DirtPath; - for (int i = 523; i <= 534; i++) - materials[i] = Material.Dispenser; - materials[7416] = Material.DragonEgg; - for (int i = 9027; i <= 9058; i++) - materials[i] = Material.DragonHead; - for (int i = 9059; i <= 9066; i++) - materials[i] = Material.DragonWallHead; - materials[12787] = Material.DriedKelpBlock; - materials[24768] = Material.DripstoneBlock; - for (int i = 9344; i <= 9355; i++) - materials[i] = Material.Dropper; - materials[7665] = Material.EmeraldBlock; - materials[7511] = Material.EmeraldOre; - materials[7389] = Material.EnchantingTable; - materials[12514] = Material.EndGateway; - materials[7406] = Material.EndPortal; - for (int i = 7407; i <= 7414; i++) - materials[i] = Material.EndPortalFrame; - for (int i = 12334; i <= 12339; i++) - materials[i] = Material.EndRod; - materials[7415] = Material.EndStone; - for (int i = 14112; i <= 14117; i++) - materials[i] = Material.EndStoneBrickSlab; - for (int i = 13362; i <= 13441; i++) - materials[i] = Material.EndStoneBrickStairs; - for (int i = 17724; i <= 18047; i++) - materials[i] = Material.EndStoneBrickWall; - materials[12494] = Material.EndStoneBricks; - for (int i = 7513; i <= 7520; i++) - materials[i] = Material.EnderChest; - materials[22950] = Material.ExposedChiseledCopper; - materials[22939] = Material.ExposedCopper; - for (int i = 24696; i <= 24699; i++) - materials[i] = Material.ExposedCopperBulb; - for (int i = 23716; i <= 23779; i++) - materials[i] = Material.ExposedCopperDoor; - for (int i = 24678; i <= 24679; i++) - materials[i] = Material.ExposedCopperGrate; - for (int i = 24228; i <= 24291; i++) - materials[i] = Material.ExposedCopperTrapdoor; - materials[22946] = Material.ExposedCutCopper; - for (int i = 23288; i <= 23293; i++) - materials[i] = Material.ExposedCutCopperSlab; - for (int i = 23116; i <= 23195; i++) - materials[i] = Material.ExposedCutCopperStairs; - for (int i = 4286; i <= 4293; i++) - materials[i] = Material.Farmland; - materials[2006] = Material.Fern; - for (int i = 2360; i <= 2871; i++) - materials[i] = Material.Fire; - for (int i = 12829; i <= 12830; i++) - materials[i] = Material.FireCoral; - materials[12811] = Material.FireCoralBlock; - for (int i = 12849; i <= 12850; i++) - materials[i] = Material.FireCoralFan; - for (int i = 12917; i <= 12924; i++) - materials[i] = Material.FireCoralWallFan; - materials[18437] = Material.FletchingTable; - materials[8567] = Material.FlowerPot; - materials[24825] = Material.FloweringAzalea; - for (int i = 489; i <= 516; i++) - materials[i] = Material.FloweringAzaleaLeaves; - materials[26572] = Material.Frogspawn; - for (int i = 12539; i <= 12542; i++) - materials[i] = Material.FrostedIce; - for (int i = 4294; i <= 4301; i++) - materials[i] = Material.Furnace; - materials[20285] = Material.GildedBlackstone; - materials[519] = Material.Glass; - for (int i = 6779; i <= 6810; i++) - materials[i] = Material.GlassPane; - for (int i = 6869; i <= 6996; i++) - materials[i] = Material.GlowLichen; - materials[5863] = Material.Glowstone; - materials[2091] = Material.GoldBlock; - materials[123] = Material.GoldOre; - materials[2] = Material.Granite; - for (int i = 14130; i <= 14135; i++) - materials[i] = Material.GraniteSlab; - for (int i = 13682; i <= 13761; i++) - materials[i] = Material.GraniteStairs; - for (int i = 15456; i <= 15779; i++) - materials[i] = Material.GraniteWall; - for (int i = 8; i <= 9; i++) - materials[i] = Material.GrassBlock; - materials[118] = Material.Gravel; - for (int i = 10871; i <= 10886; i++) - materials[i] = Material.GrayBanner; - for (int i = 1800; i <= 1815; i++) - materials[i] = Material.GrayBed; - for (int i = 20853; i <= 20868; i++) - materials[i] = Material.GrayCandle; - for (int i = 21013; i <= 21014; i++) - materials[i] = Material.GrayCandleCake; - materials[10735] = Material.GrayCarpet; - materials[12735] = Material.GrayConcrete; - materials[12751] = Material.GrayConcretePowder; - for (int i = 12692; i <= 12695; i++) - materials[i] = Material.GrayGlazedTerracotta; - for (int i = 12610; i <= 12615; i++) - materials[i] = Material.GrayShulkerBox; - materials[5952] = Material.GrayStainedGlass; - for (int i = 9596; i <= 9627; i++) - materials[i] = Material.GrayStainedGlassPane; - materials[9363] = Material.GrayTerracotta; - for (int i = 11043; i <= 11046; i++) - materials[i] = Material.GrayWallBanner; - materials[2054] = Material.GrayWool; - for (int i = 10967; i <= 10982; i++) - materials[i] = Material.GreenBanner; - for (int i = 1896; i <= 1911; i++) - materials[i] = Material.GreenBed; - for (int i = 20949; i <= 20964; i++) - materials[i] = Material.GreenCandle; - for (int i = 21025; i <= 21026; i++) - materials[i] = Material.GreenCandleCake; - materials[10741] = Material.GreenCarpet; - materials[12741] = Material.GreenConcrete; - materials[12757] = Material.GreenConcretePowder; - for (int i = 12716; i <= 12719; i++) - materials[i] = Material.GreenGlazedTerracotta; - for (int i = 12646; i <= 12651; i++) - materials[i] = Material.GreenShulkerBox; - materials[5958] = Material.GreenStainedGlass; - for (int i = 9788; i <= 9819; i++) - materials[i] = Material.GreenStainedGlassPane; - materials[9369] = Material.GreenTerracotta; - for (int i = 11067; i <= 11070; i++) - materials[i] = Material.GreenWallBanner; - materials[2060] = Material.GreenWool; - for (int i = 18438; i <= 18449; i++) - materials[i] = Material.Grindstone; - for (int i = 24900; i <= 24901; i++) - materials[i] = Material.HangingRoots; - for (int i = 10725; i <= 10727; i++) - materials[i] = Material.HayBlock; - for (int i = 9159; i <= 9174; i++) - materials[i] = Material.HeavyWeightedPressurePlate; - materials[19445] = Material.HoneyBlock; - materials[19446] = Material.HoneycombBlock; - for (int i = 9225; i <= 9234; i++) - materials[i] = Material.Hopper; - for (int i = 12831; i <= 12832; i++) - materials[i] = Material.HornCoral; - materials[12812] = Material.HornCoralBlock; - for (int i = 12851; i <= 12852; i++) - materials[i] = Material.HornCoralFan; - for (int i = 12925; i <= 12932; i++) - materials[i] = Material.HornCoralWallFan; - materials[5780] = Material.Ice; - materials[6548] = Material.InfestedChiseledStoneBricks; - materials[6544] = Material.InfestedCobblestone; - materials[6547] = Material.InfestedCrackedStoneBricks; - for (int i = 26554; i <= 26556; i++) - materials[i] = Material.InfestedDeepslate; - materials[6546] = Material.InfestedMossyStoneBricks; - materials[6543] = Material.InfestedStone; - materials[6545] = Material.InfestedStoneBricks; - for (int i = 6741; i <= 6772; i++) - materials[i] = Material.IronBars; - materials[2092] = Material.IronBlock; - for (int i = 5652; i <= 5715; i++) - materials[i] = Material.IronDoor; - materials[125] = Material.IronOre; - for (int i = 10399; i <= 10462; i++) - materials[i] = Material.IronTrapdoor; - for (int i = 5870; i <= 5873; i++) - materials[i] = Material.JackOLantern; - for (int i = 19360; i <= 19371; i++) - materials[i] = Material.Jigsaw; - for (int i = 5815; i <= 5816; i++) - materials[i] = Material.Jukebox; - for (int i = 8683; i <= 8706; i++) - materials[i] = Material.JungleButton; - for (int i = 11950; i <= 12013; i++) - materials[i] = Material.JungleDoor; - for (int i = 11630; i <= 11661; i++) - materials[i] = Material.JungleFence; - for (int i = 11374; i <= 11405; i++) - materials[i] = Material.JungleFenceGate; - for (int i = 5154; i <= 5217; i++) - materials[i] = Material.JungleHangingSign; - for (int i = 321; i <= 348; i++) - materials[i] = Material.JungleLeaves; - for (int i = 139; i <= 141; i++) - materials[i] = Material.JungleLog; - materials[18] = Material.JunglePlanks; - for (int i = 5722; i <= 5723; i++) - materials[i] = Material.JunglePressurePlate; - for (int i = 31; i <= 32; i++) - materials[i] = Material.JungleSapling; - for (int i = 4462; i <= 4493; i++) - materials[i] = Material.JungleSign; - for (int i = 11180; i <= 11185; i++) - materials[i] = Material.JungleSlab; - for (int i = 7826; i <= 7905; i++) - materials[i] = Material.JungleStairs; - for (int i = 6153; i <= 6216; i++) - materials[i] = Material.JungleTrapdoor; - for (int i = 5578; i <= 5585; i++) - materials[i] = Material.JungleWallHangingSign; - for (int i = 4802; i <= 4809; i++) - materials[i] = Material.JungleWallSign; - for (int i = 198; i <= 200; i++) - materials[i] = Material.JungleWood; - for (int i = 12760; i <= 12785; i++) - materials[i] = Material.Kelp; - materials[12786] = Material.KelpPlant; - for (int i = 4654; i <= 4661; i++) - materials[i] = Material.Ladder; - for (int i = 18503; i <= 18506; i++) - materials[i] = Material.Lantern; - materials[522] = Material.LapisBlock; - materials[520] = Material.LapisOre; - for (int i = 21045; i <= 21056; i++) - materials[i] = Material.LargeAmethystBud; - for (int i = 10757; i <= 10758; i++) - materials[i] = Material.LargeFern; - for (int i = 96; i <= 111; i++) - materials[i] = Material.Lava; - materials[7402] = Material.LavaCauldron; - for (int i = 18450; i <= 18465; i++) - materials[i] = Material.Lectern; - for (int i = 5626; i <= 5649; i++) - materials[i] = Material.Lever; - for (int i = 10367; i <= 10398; i++) - materials[i] = Material.Light; - for (int i = 10807; i <= 10822; i++) - materials[i] = Material.LightBlueBanner; - for (int i = 1736; i <= 1751; i++) - materials[i] = Material.LightBlueBed; - for (int i = 20789; i <= 20804; i++) - materials[i] = Material.LightBlueCandle; - for (int i = 21005; i <= 21006; i++) - materials[i] = Material.LightBlueCandleCake; - materials[10731] = Material.LightBlueCarpet; - materials[12731] = Material.LightBlueConcrete; - materials[12747] = Material.LightBlueConcretePowder; - for (int i = 12676; i <= 12679; i++) - materials[i] = Material.LightBlueGlazedTerracotta; - for (int i = 12586; i <= 12591; i++) - materials[i] = Material.LightBlueShulkerBox; - materials[5948] = Material.LightBlueStainedGlass; - for (int i = 9468; i <= 9499; i++) - materials[i] = Material.LightBlueStainedGlassPane; - materials[9359] = Material.LightBlueTerracotta; - for (int i = 11027; i <= 11030; i++) - materials[i] = Material.LightBlueWallBanner; - materials[2050] = Material.LightBlueWool; - for (int i = 10887; i <= 10902; i++) - materials[i] = Material.LightGrayBanner; - for (int i = 1816; i <= 1831; i++) - materials[i] = Material.LightGrayBed; - for (int i = 20869; i <= 20884; i++) - materials[i] = Material.LightGrayCandle; - for (int i = 21015; i <= 21016; i++) - materials[i] = Material.LightGrayCandleCake; - materials[10736] = Material.LightGrayCarpet; - materials[12736] = Material.LightGrayConcrete; - materials[12752] = Material.LightGrayConcretePowder; - for (int i = 12696; i <= 12699; i++) - materials[i] = Material.LightGrayGlazedTerracotta; - for (int i = 12616; i <= 12621; i++) - materials[i] = Material.LightGrayShulkerBox; - materials[5953] = Material.LightGrayStainedGlass; - for (int i = 9628; i <= 9659; i++) - materials[i] = Material.LightGrayStainedGlassPane; - materials[9364] = Material.LightGrayTerracotta; - for (int i = 11047; i <= 11050; i++) - materials[i] = Material.LightGrayWallBanner; - materials[2055] = Material.LightGrayWool; - for (int i = 9143; i <= 9158; i++) - materials[i] = Material.LightWeightedPressurePlate; - for (int i = 24724; i <= 24747; i++) - materials[i] = Material.LightningRod; - for (int i = 10749; i <= 10750; i++) - materials[i] = Material.Lilac; - materials[2088] = Material.LilyOfTheValley; - materials[7271] = Material.LilyPad; - for (int i = 10839; i <= 10854; i++) - materials[i] = Material.LimeBanner; - for (int i = 1768; i <= 1783; i++) - materials[i] = Material.LimeBed; - for (int i = 20821; i <= 20836; i++) - materials[i] = Material.LimeCandle; - for (int i = 21009; i <= 21010; i++) - materials[i] = Material.LimeCandleCake; - materials[10733] = Material.LimeCarpet; - materials[12733] = Material.LimeConcrete; - materials[12749] = Material.LimeConcretePowder; - for (int i = 12684; i <= 12687; i++) - materials[i] = Material.LimeGlazedTerracotta; - for (int i = 12598; i <= 12603; i++) - materials[i] = Material.LimeShulkerBox; - materials[5950] = Material.LimeStainedGlass; - for (int i = 9532; i <= 9563; i++) - materials[i] = Material.LimeStainedGlassPane; - materials[9361] = Material.LimeTerracotta; - for (int i = 11035; i <= 11038; i++) - materials[i] = Material.LimeWallBanner; - materials[2052] = Material.LimeWool; - materials[19459] = Material.Lodestone; - for (int i = 18404; i <= 18407; i++) - materials[i] = Material.Loom; - for (int i = 10791; i <= 10806; i++) - materials[i] = Material.MagentaBanner; - for (int i = 1720; i <= 1735; i++) - materials[i] = Material.MagentaBed; - for (int i = 20773; i <= 20788; i++) - materials[i] = Material.MagentaCandle; - for (int i = 21003; i <= 21004; i++) - materials[i] = Material.MagentaCandleCake; - materials[10730] = Material.MagentaCarpet; - materials[12730] = Material.MagentaConcrete; - materials[12746] = Material.MagentaConcretePowder; - for (int i = 12672; i <= 12675; i++) - materials[i] = Material.MagentaGlazedTerracotta; - for (int i = 12580; i <= 12585; i++) - materials[i] = Material.MagentaShulkerBox; - materials[5947] = Material.MagentaStainedGlass; - for (int i = 9436; i <= 9467; i++) - materials[i] = Material.MagentaStainedGlassPane; - materials[9358] = Material.MagentaTerracotta; - for (int i = 11023; i <= 11026; i++) - materials[i] = Material.MagentaWallBanner; - materials[2049] = Material.MagentaWool; - materials[12543] = Material.MagmaBlock; - for (int i = 8779; i <= 8802; i++) - materials[i] = Material.MangroveButton; - for (int i = 12206; i <= 12269; i++) - materials[i] = Material.MangroveDoor; - for (int i = 11758; i <= 11789; i++) - materials[i] = Material.MangroveFence; - for (int i = 11502; i <= 11533; i++) - materials[i] = Material.MangroveFenceGate; - for (int i = 5410; i <= 5473; i++) - materials[i] = Material.MangroveHangingSign; - for (int i = 433; i <= 460; i++) - materials[i] = Material.MangroveLeaves; - for (int i = 151; i <= 153; i++) - materials[i] = Material.MangroveLog; - materials[22] = Material.MangrovePlanks; - for (int i = 5730; i <= 5731; i++) - materials[i] = Material.MangrovePressurePlate; - for (int i = 39; i <= 78; i++) - materials[i] = Material.MangrovePropagule; - for (int i = 154; i <= 155; i++) - materials[i] = Material.MangroveRoots; - for (int i = 4526; i <= 4557; i++) - materials[i] = Material.MangroveSign; - for (int i = 11204; i <= 11209; i++) - materials[i] = Material.MangroveSlab; - for (int i = 10124; i <= 10203; i++) - materials[i] = Material.MangroveStairs; - for (int i = 6409; i <= 6472; i++) - materials[i] = Material.MangroveTrapdoor; - for (int i = 5594; i <= 5601; i++) - materials[i] = Material.MangroveWallHangingSign; - for (int i = 4818; i <= 4825; i++) - materials[i] = Material.MangroveWallSign; - for (int i = 210; i <= 212; i++) - materials[i] = Material.MangroveWood; - for (int i = 21057; i <= 21068; i++) - materials[i] = Material.MediumAmethystBud; - materials[6812] = Material.Melon; - for (int i = 6829; i <= 6836; i++) - materials[i] = Material.MelonStem; - materials[24843] = Material.MossBlock; - materials[24826] = Material.MossCarpet; - materials[2353] = Material.MossyCobblestone; - for (int i = 14106; i <= 14111; i++) - materials[i] = Material.MossyCobblestoneSlab; - for (int i = 13282; i <= 13361; i++) - materials[i] = Material.MossyCobblestoneStairs; - for (int i = 8243; i <= 8566; i++) - materials[i] = Material.MossyCobblestoneWall; - for (int i = 14094; i <= 14099; i++) - materials[i] = Material.MossyStoneBrickSlab; - for (int i = 13122; i <= 13201; i++) - materials[i] = Material.MossyStoneBrickStairs; - for (int i = 15132; i <= 15455; i++) - materials[i] = Material.MossyStoneBrickWall; - materials[6538] = Material.MossyStoneBricks; - for (int i = 2063; i <= 2074; i++) - materials[i] = Material.MovingPiston; - materials[24903] = Material.Mud; - for (int i = 11270; i <= 11275; i++) - materials[i] = Material.MudBrickSlab; - for (int i = 7189; i <= 7268; i++) - materials[i] = Material.MudBrickStairs; - for (int i = 16104; i <= 16427; i++) - materials[i] = Material.MudBrickWall; - materials[6542] = Material.MudBricks; - for (int i = 156; i <= 158; i++) - materials[i] = Material.MuddyMangroveRoots; - for (int i = 6677; i <= 6740; i++) - materials[i] = Material.MushroomStem; - for (int i = 7269; i <= 7270; i++) - materials[i] = Material.Mycelium; - for (int i = 7273; i <= 7304; i++) - materials[i] = Material.NetherBrickFence; - for (int i = 11276; i <= 11281; i++) - materials[i] = Material.NetherBrickSlab; - for (int i = 7305; i <= 7384; i++) - materials[i] = Material.NetherBrickStairs; - for (int i = 16428; i <= 16751; i++) - materials[i] = Material.NetherBrickWall; - materials[7272] = Material.NetherBricks; - materials[129] = Material.NetherGoldOre; - for (int i = 5864; i <= 5865; i++) - materials[i] = Material.NetherPortal; - materials[9224] = Material.NetherQuartzOre; - materials[18595] = Material.NetherSprouts; - for (int i = 7385; i <= 7388; i++) - materials[i] = Material.NetherWart; - materials[12544] = Material.NetherWartBlock; - materials[19447] = Material.NetheriteBlock; - materials[5849] = Material.Netherrack; - for (int i = 538; i <= 1687; i++) - materials[i] = Material.NoteBlock; - for (int i = 8611; i <= 8634; i++) - materials[i] = Material.OakButton; - for (int i = 4590; i <= 4653; i++) - materials[i] = Material.OakDoor; - for (int i = 5817; i <= 5848; i++) - materials[i] = Material.OakFence; - for (int i = 6997; i <= 7028; i++) - materials[i] = Material.OakFenceGate; - for (int i = 4834; i <= 4897; i++) - materials[i] = Material.OakHangingSign; - for (int i = 237; i <= 264; i++) - materials[i] = Material.OakLeaves; - for (int i = 130; i <= 132; i++) - materials[i] = Material.OakLog; - materials[15] = Material.OakPlanks; - for (int i = 5716; i <= 5717; i++) - materials[i] = Material.OakPressurePlate; - for (int i = 25; i <= 26; i++) - materials[i] = Material.OakSapling; - for (int i = 4302; i <= 4333; i++) - materials[i] = Material.OakSign; - for (int i = 11162; i <= 11167; i++) - materials[i] = Material.OakSlab; - for (int i = 2874; i <= 2953; i++) - materials[i] = Material.OakStairs; - for (int i = 5961; i <= 6024; i++) - materials[i] = Material.OakTrapdoor; - for (int i = 5538; i <= 5545; i++) - materials[i] = Material.OakWallHangingSign; - for (int i = 4762; i <= 4769; i++) - materials[i] = Material.OakWallSign; - for (int i = 189; i <= 191; i++) - materials[i] = Material.OakWood; - for (int i = 12550; i <= 12561; i++) - materials[i] = Material.Observer; - materials[2354] = Material.Obsidian; - for (int i = 26563; i <= 26565; i++) - materials[i] = Material.OchreFroglight; - for (int i = 10775; i <= 10790; i++) - materials[i] = Material.OrangeBanner; - for (int i = 1704; i <= 1719; i++) - materials[i] = Material.OrangeBed; - for (int i = 20757; i <= 20772; i++) - materials[i] = Material.OrangeCandle; - for (int i = 21001; i <= 21002; i++) - materials[i] = Material.OrangeCandleCake; - materials[10729] = Material.OrangeCarpet; - materials[12729] = Material.OrangeConcrete; - materials[12745] = Material.OrangeConcretePowder; - for (int i = 12668; i <= 12671; i++) - materials[i] = Material.OrangeGlazedTerracotta; - for (int i = 12574; i <= 12579; i++) - materials[i] = Material.OrangeShulkerBox; - materials[5946] = Material.OrangeStainedGlass; - for (int i = 9404; i <= 9435; i++) - materials[i] = Material.OrangeStainedGlassPane; - materials[9357] = Material.OrangeTerracotta; - materials[2082] = Material.OrangeTulip; - for (int i = 11019; i <= 11022; i++) - materials[i] = Material.OrangeWallBanner; - materials[2048] = Material.OrangeWool; - materials[2085] = Material.OxeyeDaisy; - materials[22948] = Material.OxidizedChiseledCopper; - materials[22941] = Material.OxidizedCopper; - for (int i = 24704; i <= 24707; i++) - materials[i] = Material.OxidizedCopperBulb; - for (int i = 23780; i <= 23843; i++) - materials[i] = Material.OxidizedCopperDoor; - for (int i = 24682; i <= 24683; i++) - materials[i] = Material.OxidizedCopperGrate; - for (int i = 24292; i <= 24355; i++) - materials[i] = Material.OxidizedCopperTrapdoor; - materials[22944] = Material.OxidizedCutCopper; - for (int i = 23276; i <= 23281; i++) - materials[i] = Material.OxidizedCutCopperSlab; - for (int i = 22956; i <= 23035; i++) - materials[i] = Material.OxidizedCutCopperStairs; - materials[10746] = Material.PackedIce; - materials[6541] = Material.PackedMud; - for (int i = 26569; i <= 26571; i++) - materials[i] = Material.PearlescentFroglight; - for (int i = 10753; i <= 10754; i++) - materials[i] = Material.Peony; - for (int i = 11246; i <= 11251; i++) - materials[i] = Material.PetrifiedOakSlab; - for (int i = 9067; i <= 9098; i++) - materials[i] = Material.PiglinHead; - for (int i = 9099; i <= 9106; i++) - materials[i] = Material.PiglinWallHead; - for (int i = 10855; i <= 10870; i++) - materials[i] = Material.PinkBanner; - for (int i = 1784; i <= 1799; i++) - materials[i] = Material.PinkBed; - for (int i = 20837; i <= 20852; i++) - materials[i] = Material.PinkCandle; - for (int i = 21011; i <= 21012; i++) - materials[i] = Material.PinkCandleCake; - materials[10734] = Material.PinkCarpet; - materials[12734] = Material.PinkConcrete; - materials[12750] = Material.PinkConcretePowder; - for (int i = 12688; i <= 12691; i++) - materials[i] = Material.PinkGlazedTerracotta; - for (int i = 24827; i <= 24842; i++) - materials[i] = Material.PinkPetals; - for (int i = 12604; i <= 12609; i++) - materials[i] = Material.PinkShulkerBox; - materials[5951] = Material.PinkStainedGlass; - for (int i = 9564; i <= 9595; i++) - materials[i] = Material.PinkStainedGlassPane; - materials[9362] = Material.PinkTerracotta; - materials[2084] = Material.PinkTulip; - for (int i = 11039; i <= 11042; i++) - materials[i] = Material.PinkWallBanner; - materials[2053] = Material.PinkWool; - for (int i = 2011; i <= 2022; i++) - materials[i] = Material.Piston; - for (int i = 2023; i <= 2046; i++) - materials[i] = Material.PistonHead; - for (int i = 12497; i <= 12506; i++) - materials[i] = Material.PitcherCrop; - for (int i = 12507; i <= 12508; i++) - materials[i] = Material.PitcherPlant; - for (int i = 8947; i <= 8978; i++) - materials[i] = Material.PlayerHead; - for (int i = 8979; i <= 8986; i++) - materials[i] = Material.PlayerWallHead; - for (int i = 12; i <= 13; i++) - materials[i] = Material.Podzol; - for (int i = 24748; i <= 24767; i++) - materials[i] = Material.PointedDripstone; - materials[7] = Material.PolishedAndesite; - for (int i = 14148; i <= 14153; i++) - materials[i] = Material.PolishedAndesiteSlab; - for (int i = 13922; i <= 14001; i++) - materials[i] = Material.PolishedAndesiteStairs; - for (int i = 5855; i <= 5857; i++) - materials[i] = Material.PolishedBasalt; - materials[19871] = Material.PolishedBlackstone; - for (int i = 19875; i <= 19880; i++) - materials[i] = Material.PolishedBlackstoneBrickSlab; - for (int i = 19881; i <= 19960; i++) - materials[i] = Material.PolishedBlackstoneBrickStairs; - for (int i = 19961; i <= 20284; i++) - materials[i] = Material.PolishedBlackstoneBrickWall; - materials[19872] = Material.PolishedBlackstoneBricks; - for (int i = 20374; i <= 20397; i++) - materials[i] = Material.PolishedBlackstoneButton; - for (int i = 20372; i <= 20373; i++) - materials[i] = Material.PolishedBlackstonePressurePlate; - for (int i = 20366; i <= 20371; i++) - materials[i] = Material.PolishedBlackstoneSlab; - for (int i = 20286; i <= 20365; i++) - materials[i] = Material.PolishedBlackstoneStairs; - for (int i = 20398; i <= 20721; i++) - materials[i] = Material.PolishedBlackstoneWall; - materials[25318] = Material.PolishedDeepslate; - for (int i = 25399; i <= 25404; i++) - materials[i] = Material.PolishedDeepslateSlab; - for (int i = 25319; i <= 25398; i++) - materials[i] = Material.PolishedDeepslateStairs; - for (int i = 25405; i <= 25728; i++) - materials[i] = Material.PolishedDeepslateWall; - materials[5] = Material.PolishedDiorite; - for (int i = 14100; i <= 14105; i++) - materials[i] = Material.PolishedDioriteSlab; - for (int i = 13202; i <= 13281; i++) - materials[i] = Material.PolishedDioriteStairs; - materials[3] = Material.PolishedGranite; - for (int i = 14082; i <= 14087; i++) - materials[i] = Material.PolishedGraniteSlab; - for (int i = 12962; i <= 13041; i++) - materials[i] = Material.PolishedGraniteStairs; - materials[21492] = Material.PolishedTuff; - for (int i = 21493; i <= 21498; i++) - materials[i] = Material.PolishedTuffSlab; - for (int i = 21499; i <= 21578; i++) - materials[i] = Material.PolishedTuffStairs; - for (int i = 21579; i <= 21902; i++) - materials[i] = Material.PolishedTuffWall; - materials[2077] = Material.Poppy; - for (int i = 8603; i <= 8610; i++) - materials[i] = Material.Potatoes; - materials[8573] = Material.PottedAcaciaSapling; - materials[8581] = Material.PottedAllium; - materials[26561] = Material.PottedAzaleaBush; - materials[8582] = Material.PottedAzureBluet; - materials[12957] = Material.PottedBamboo; - materials[8571] = Material.PottedBirchSapling; - materials[8580] = Material.PottedBlueOrchid; - materials[8592] = Material.PottedBrownMushroom; - materials[8594] = Material.PottedCactus; - materials[8574] = Material.PottedCherrySapling; - materials[8588] = Material.PottedCornflower; - materials[19455] = Material.PottedCrimsonFungus; - materials[19457] = Material.PottedCrimsonRoots; - materials[8578] = Material.PottedDandelion; - materials[8575] = Material.PottedDarkOakSapling; - materials[8593] = Material.PottedDeadBush; - materials[8577] = Material.PottedFern; - materials[26562] = Material.PottedFloweringAzaleaBush; - materials[8572] = Material.PottedJungleSapling; - materials[8589] = Material.PottedLilyOfTheValley; - materials[8576] = Material.PottedMangrovePropagule; - materials[8569] = Material.PottedOakSapling; - materials[8584] = Material.PottedOrangeTulip; - materials[8587] = Material.PottedOxeyeDaisy; - materials[8586] = Material.PottedPinkTulip; - materials[8579] = Material.PottedPoppy; - materials[8591] = Material.PottedRedMushroom; - materials[8583] = Material.PottedRedTulip; - materials[8570] = Material.PottedSpruceSapling; - materials[8568] = Material.PottedTorchflower; - materials[19456] = Material.PottedWarpedFungus; - materials[19458] = Material.PottedWarpedRoots; - materials[8585] = Material.PottedWhiteTulip; - materials[8590] = Material.PottedWitherRose; - materials[22318] = Material.PowderSnow; - for (int i = 7403; i <= 7405; i++) - materials[i] = Material.PowderSnowCauldron; - for (int i = 1944; i <= 1967; i++) - materials[i] = Material.PoweredRail; - materials[10463] = Material.Prismarine; - for (int i = 10712; i <= 10717; i++) - materials[i] = Material.PrismarineBrickSlab; - for (int i = 10546; i <= 10625; i++) - materials[i] = Material.PrismarineBrickStairs; - materials[10464] = Material.PrismarineBricks; - for (int i = 10706; i <= 10711; i++) - materials[i] = Material.PrismarineSlab; - for (int i = 10466; i <= 10545; i++) - materials[i] = Material.PrismarineStairs; - for (int i = 14484; i <= 14807; i++) - materials[i] = Material.PrismarineWall; - materials[6811] = Material.Pumpkin; - for (int i = 6821; i <= 6828; i++) - materials[i] = Material.PumpkinStem; - for (int i = 10919; i <= 10934; i++) - materials[i] = Material.PurpleBanner; - for (int i = 1848; i <= 1863; i++) - materials[i] = Material.PurpleBed; - for (int i = 20901; i <= 20916; i++) - materials[i] = Material.PurpleCandle; - for (int i = 21019; i <= 21020; i++) - materials[i] = Material.PurpleCandleCake; - materials[10738] = Material.PurpleCarpet; - materials[12738] = Material.PurpleConcrete; - materials[12754] = Material.PurpleConcretePowder; - for (int i = 12704; i <= 12707; i++) - materials[i] = Material.PurpleGlazedTerracotta; - for (int i = 12628; i <= 12633; i++) - materials[i] = Material.PurpleShulkerBox; - materials[5955] = Material.PurpleStainedGlass; - for (int i = 9692; i <= 9723; i++) - materials[i] = Material.PurpleStainedGlassPane; - materials[9366] = Material.PurpleTerracotta; - for (int i = 11055; i <= 11058; i++) - materials[i] = Material.PurpleWallBanner; - materials[2057] = Material.PurpleWool; - materials[12410] = Material.PurpurBlock; - for (int i = 12411; i <= 12413; i++) - materials[i] = Material.PurpurPillar; - for (int i = 11300; i <= 11305; i++) - materials[i] = Material.PurpurSlab; - for (int i = 12414; i <= 12493; i++) - materials[i] = Material.PurpurStairs; - materials[9235] = Material.QuartzBlock; - materials[20724] = Material.QuartzBricks; - for (int i = 9237; i <= 9239; i++) - materials[i] = Material.QuartzPillar; - for (int i = 11282; i <= 11287; i++) - materials[i] = Material.QuartzSlab; - for (int i = 9240; i <= 9319; i++) - materials[i] = Material.QuartzStairs; - for (int i = 4662; i <= 4681; i++) - materials[i] = Material.Rail; - materials[26559] = Material.RawCopperBlock; - materials[26560] = Material.RawGoldBlock; - materials[26558] = Material.RawIronBlock; - for (int i = 10983; i <= 10998; i++) - materials[i] = Material.RedBanner; - for (int i = 1912; i <= 1927; i++) - materials[i] = Material.RedBed; - for (int i = 20965; i <= 20980; i++) - materials[i] = Material.RedCandle; - for (int i = 21027; i <= 21028; i++) - materials[i] = Material.RedCandleCake; - materials[10742] = Material.RedCarpet; - materials[12742] = Material.RedConcrete; - materials[12758] = Material.RedConcretePowder; - for (int i = 12720; i <= 12723; i++) - materials[i] = Material.RedGlazedTerracotta; - materials[2090] = Material.RedMushroom; - for (int i = 6613; i <= 6676; i++) - materials[i] = Material.RedMushroomBlock; - for (int i = 14142; i <= 14147; i++) - materials[i] = Material.RedNetherBrickSlab; - for (int i = 13842; i <= 13921; i++) - materials[i] = Material.RedNetherBrickStairs; - for (int i = 17076; i <= 17399; i++) - materials[i] = Material.RedNetherBrickWall; - materials[12545] = Material.RedNetherBricks; - materials[117] = Material.RedSand; - materials[11079] = Material.RedSandstone; - for (int i = 11288; i <= 11293; i++) - materials[i] = Material.RedSandstoneSlab; - for (int i = 11082; i <= 11161; i++) - materials[i] = Material.RedSandstoneStairs; - for (int i = 14808; i <= 15131; i++) - materials[i] = Material.RedSandstoneWall; - for (int i = 12652; i <= 12657; i++) - materials[i] = Material.RedShulkerBox; - materials[5959] = Material.RedStainedGlass; - for (int i = 9820; i <= 9851; i++) - materials[i] = Material.RedStainedGlassPane; - materials[9370] = Material.RedTerracotta; - materials[2081] = Material.RedTulip; - for (int i = 11071; i <= 11074; i++) - materials[i] = Material.RedWallBanner; - materials[2061] = Material.RedWool; - materials[9223] = Material.RedstoneBlock; - for (int i = 7417; i <= 7418; i++) - materials[i] = Material.RedstoneLamp; - for (int i = 5734; i <= 5735; i++) - materials[i] = Material.RedstoneOre; - for (int i = 5738; i <= 5739; i++) - materials[i] = Material.RedstoneTorch; - for (int i = 5740; i <= 5747; i++) - materials[i] = Material.RedstoneWallTorch; - for (int i = 2978; i <= 4273; i++) - materials[i] = Material.RedstoneWire; - materials[26573] = Material.ReinforcedDeepslate; - for (int i = 5881; i <= 5944; i++) - materials[i] = Material.Repeater; - for (int i = 12515; i <= 12526; i++) - materials[i] = Material.RepeatingCommandBlock; - for (int i = 19450; i <= 19454; i++) - materials[i] = Material.RespawnAnchor; - materials[24902] = Material.RootedDirt; - for (int i = 10751; i <= 10752; i++) - materials[i] = Material.RoseBush; - materials[112] = Material.Sand; - materials[535] = Material.Sandstone; - for (int i = 11234; i <= 11239; i++) - materials[i] = Material.SandstoneSlab; - for (int i = 7431; i <= 7510; i++) - materials[i] = Material.SandstoneStairs; - for (int i = 17400; i <= 17723; i++) - materials[i] = Material.SandstoneWall; - for (int i = 18372; i <= 18403; i++) - materials[i] = Material.Scaffolding; - materials[22799] = Material.Sculk; - for (int i = 22928; i <= 22929; i++) - materials[i] = Material.SculkCatalyst; - for (int i = 22319; i <= 22414; i++) - materials[i] = Material.SculkSensor; - for (int i = 22930; i <= 22937; i++) - materials[i] = Material.SculkShrieker; - for (int i = 22800; i <= 22927; i++) - materials[i] = Material.SculkVein; - materials[10724] = Material.SeaLantern; - for (int i = 12933; i <= 12940; i++) - materials[i] = Material.SeaPickle; - materials[2008] = Material.Seagrass; - materials[2005] = Material.ShortGrass; - materials[18610] = Material.Shroomlight; - for (int i = 12562; i <= 12567; i++) - materials[i] = Material.ShulkerBox; - for (int i = 8827; i <= 8858; i++) - materials[i] = Material.SkeletonSkull; - for (int i = 8859; i <= 8866; i++) - materials[i] = Material.SkeletonWallSkull; - materials[10364] = Material.SlimeBlock; - for (int i = 21069; i <= 21080; i++) - materials[i] = Material.SmallAmethystBud; - for (int i = 24884; i <= 24899; i++) - materials[i] = Material.SmallDripleaf; - materials[18466] = Material.SmithingTable; - for (int i = 18420; i <= 18427; i++) - materials[i] = Material.Smoker; - materials[26557] = Material.SmoothBasalt; - materials[11308] = Material.SmoothQuartz; - for (int i = 14124; i <= 14129; i++) - materials[i] = Material.SmoothQuartzSlab; - for (int i = 13602; i <= 13681; i++) - materials[i] = Material.SmoothQuartzStairs; - materials[11309] = Material.SmoothRedSandstone; - for (int i = 14088; i <= 14093; i++) - materials[i] = Material.SmoothRedSandstoneSlab; - for (int i = 13042; i <= 13121; i++) - materials[i] = Material.SmoothRedSandstoneStairs; - materials[11307] = Material.SmoothSandstone; - for (int i = 14118; i <= 14123; i++) - materials[i] = Material.SmoothSandstoneSlab; - for (int i = 13522; i <= 13601; i++) - materials[i] = Material.SmoothSandstoneStairs; - materials[11306] = Material.SmoothStone; - for (int i = 11228; i <= 11233; i++) - materials[i] = Material.SmoothStoneSlab; - for (int i = 12800; i <= 12802; i++) - materials[i] = Material.SnifferEgg; - for (int i = 5772; i <= 5779; i++) - materials[i] = Material.Snow; - materials[5781] = Material.SnowBlock; - for (int i = 18543; i <= 18574; i++) - materials[i] = Material.SoulCampfire; - materials[2872] = Material.SoulFire; - for (int i = 18507; i <= 18510; i++) - materials[i] = Material.SoulLantern; - materials[5850] = Material.SoulSand; - materials[5851] = Material.SoulSoil; - materials[5858] = Material.SoulTorch; - for (int i = 5859; i <= 5862; i++) - materials[i] = Material.SoulWallTorch; - materials[2873] = Material.Spawner; - materials[517] = Material.Sponge; - materials[24823] = Material.SporeBlossom; - for (int i = 8635; i <= 8658; i++) - materials[i] = Material.SpruceButton; - for (int i = 11822; i <= 11885; i++) - materials[i] = Material.SpruceDoor; - for (int i = 11566; i <= 11597; i++) - materials[i] = Material.SpruceFence; - for (int i = 11310; i <= 11341; i++) - materials[i] = Material.SpruceFenceGate; - for (int i = 4898; i <= 4961; i++) - materials[i] = Material.SpruceHangingSign; - for (int i = 265; i <= 292; i++) - materials[i] = Material.SpruceLeaves; - for (int i = 133; i <= 135; i++) - materials[i] = Material.SpruceLog; - materials[16] = Material.SprucePlanks; - for (int i = 5718; i <= 5719; i++) - materials[i] = Material.SprucePressurePlate; - for (int i = 27; i <= 28; i++) - materials[i] = Material.SpruceSapling; - for (int i = 4334; i <= 4365; i++) - materials[i] = Material.SpruceSign; - for (int i = 11168; i <= 11173; i++) - materials[i] = Material.SpruceSlab; - for (int i = 7666; i <= 7745; i++) - materials[i] = Material.SpruceStairs; - for (int i = 6025; i <= 6088; i++) - materials[i] = Material.SpruceTrapdoor; - for (int i = 5546; i <= 5553; i++) - materials[i] = Material.SpruceWallHangingSign; - for (int i = 4770; i <= 4777; i++) - materials[i] = Material.SpruceWallSign; - for (int i = 192; i <= 194; i++) - materials[i] = Material.SpruceWood; - for (int i = 1992; i <= 2003; i++) - materials[i] = Material.StickyPiston; - materials[1] = Material.Stone; - for (int i = 11264; i <= 11269; i++) - materials[i] = Material.StoneBrickSlab; - for (int i = 7109; i <= 7188; i++) - materials[i] = Material.StoneBrickStairs; - for (int i = 15780; i <= 16103; i++) - materials[i] = Material.StoneBrickWall; - materials[6537] = Material.StoneBricks; - for (int i = 5748; i <= 5771; i++) - materials[i] = Material.StoneButton; - for (int i = 5650; i <= 5651; i++) - materials[i] = Material.StonePressurePlate; - for (int i = 11222; i <= 11227; i++) - materials[i] = Material.StoneSlab; - for (int i = 13442; i <= 13521; i++) - materials[i] = Material.StoneStairs; - for (int i = 18467; i <= 18470; i++) - materials[i] = Material.Stonecutter; - for (int i = 171; i <= 173; i++) - materials[i] = Material.StrippedAcaciaLog; - for (int i = 225; i <= 227; i++) - materials[i] = Material.StrippedAcaciaWood; - for (int i = 186; i <= 188; i++) - materials[i] = Material.StrippedBambooBlock; - for (int i = 165; i <= 167; i++) - materials[i] = Material.StrippedBirchLog; - for (int i = 219; i <= 221; i++) - materials[i] = Material.StrippedBirchWood; - for (int i = 174; i <= 176; i++) - materials[i] = Material.StrippedCherryLog; - for (int i = 228; i <= 230; i++) - materials[i] = Material.StrippedCherryWood; - for (int i = 18605; i <= 18607; i++) - materials[i] = Material.StrippedCrimsonHyphae; - for (int i = 18599; i <= 18601; i++) - materials[i] = Material.StrippedCrimsonStem; - for (int i = 177; i <= 179; i++) - materials[i] = Material.StrippedDarkOakLog; - for (int i = 231; i <= 233; i++) - materials[i] = Material.StrippedDarkOakWood; - for (int i = 168; i <= 170; i++) - materials[i] = Material.StrippedJungleLog; - for (int i = 222; i <= 224; i++) - materials[i] = Material.StrippedJungleWood; - for (int i = 183; i <= 185; i++) - materials[i] = Material.StrippedMangroveLog; - for (int i = 234; i <= 236; i++) - materials[i] = Material.StrippedMangroveWood; - for (int i = 180; i <= 182; i++) - materials[i] = Material.StrippedOakLog; - for (int i = 213; i <= 215; i++) - materials[i] = Material.StrippedOakWood; - for (int i = 162; i <= 164; i++) - materials[i] = Material.StrippedSpruceLog; - for (int i = 216; i <= 218; i++) - materials[i] = Material.StrippedSpruceWood; - for (int i = 18588; i <= 18590; i++) - materials[i] = Material.StrippedWarpedHyphae; - for (int i = 18582; i <= 18584; i++) - materials[i] = Material.StrippedWarpedStem; - for (int i = 19356; i <= 19359; i++) - materials[i] = Material.StructureBlock; - materials[12549] = Material.StructureVoid; - for (int i = 5799; i <= 5814; i++) - materials[i] = Material.SugarCane; - for (int i = 10747; i <= 10748; i++) - materials[i] = Material.Sunflower; - for (int i = 119; i <= 122; i++) - materials[i] = Material.SuspiciousGravel; - for (int i = 113; i <= 116; i++) - materials[i] = Material.SuspiciousSand; - for (int i = 18575; i <= 18578; i++) - materials[i] = Material.SweetBerryBush; - for (int i = 10755; i <= 10756; i++) - materials[i] = Material.TallGrass; - for (int i = 2009; i <= 2010; i++) - materials[i] = Material.TallSeagrass; - for (int i = 19381; i <= 19396; i++) - materials[i] = Material.Target; - materials[10744] = Material.Terracotta; - materials[22317] = Material.TintedGlass; - for (int i = 2094; i <= 2095; i++) - materials[i] = Material.Tnt; - materials[2355] = Material.Torch; - materials[2076] = Material.Torchflower; - for (int i = 12495; i <= 12496; i++) - materials[i] = Material.TorchflowerCrop; - for (int i = 9119; i <= 9142; i++) - materials[i] = Material.TrappedChest; - for (int i = 26638; i <= 26643; i++) - materials[i] = Material.TrialSpawner; - for (int i = 7537; i <= 7664; i++) - materials[i] = Material.Tripwire; - for (int i = 7521; i <= 7536; i++) - materials[i] = Material.TripwireHook; - for (int i = 12823; i <= 12824; i++) - materials[i] = Material.TubeCoral; - materials[12808] = Material.TubeCoralBlock; - for (int i = 12843; i <= 12844; i++) - materials[i] = Material.TubeCoralFan; - for (int i = 12893; i <= 12900; i++) - materials[i] = Material.TubeCoralWallFan; - materials[21081] = Material.Tuff; - for (int i = 21905; i <= 21910; i++) - materials[i] = Material.TuffBrickSlab; - for (int i = 21911; i <= 21990; i++) - materials[i] = Material.TuffBrickStairs; - for (int i = 21991; i <= 22314; i++) - materials[i] = Material.TuffBrickWall; - materials[21904] = Material.TuffBricks; - for (int i = 21082; i <= 21087; i++) - materials[i] = Material.TuffSlab; - for (int i = 21088; i <= 21167; i++) - materials[i] = Material.TuffStairs; - for (int i = 21168; i <= 21491; i++) - materials[i] = Material.TuffWall; - for (int i = 12788; i <= 12799; i++) - materials[i] = Material.TurtleEgg; - for (int i = 18638; i <= 18663; i++) - materials[i] = Material.TwistingVines; - materials[18664] = Material.TwistingVinesPlant; - for (int i = 26566; i <= 26568; i++) - materials[i] = Material.VerdantFroglight; - for (int i = 6837; i <= 6868; i++) - materials[i] = Material.Vine; - materials[12958] = Material.VoidAir; - for (int i = 2356; i <= 2359; i++) - materials[i] = Material.WallTorch; - for (int i = 19124; i <= 19147; i++) - materials[i] = Material.WarpedButton; - for (int i = 19212; i <= 19275; i++) - materials[i] = Material.WarpedDoor; - for (int i = 18716; i <= 18747; i++) - materials[i] = Material.WarpedFence; - for (int i = 18908; i <= 18939; i++) - materials[i] = Material.WarpedFenceGate; - materials[18592] = Material.WarpedFungus; - for (int i = 5346; i <= 5409; i++) - materials[i] = Material.WarpedHangingSign; - for (int i = 18585; i <= 18587; i++) - materials[i] = Material.WarpedHyphae; - materials[18591] = Material.WarpedNylium; - materials[18667] = Material.WarpedPlanks; - for (int i = 18682; i <= 18683; i++) - materials[i] = Material.WarpedPressurePlate; - materials[18594] = Material.WarpedRoots; - for (int i = 19308; i <= 19339; i++) - materials[i] = Material.WarpedSign; - for (int i = 18674; i <= 18679; i++) - materials[i] = Material.WarpedSlab; - for (int i = 19020; i <= 19099; i++) - materials[i] = Material.WarpedStairs; - for (int i = 18579; i <= 18581; i++) - materials[i] = Material.WarpedStem; - for (int i = 18812; i <= 18875; i++) - materials[i] = Material.WarpedTrapdoor; - for (int i = 5610; i <= 5617; i++) - materials[i] = Material.WarpedWallHangingSign; - for (int i = 19348; i <= 19355; i++) - materials[i] = Material.WarpedWallSign; - materials[18593] = Material.WarpedWartBlock; - for (int i = 80; i <= 95; i++) - materials[i] = Material.Water; - for (int i = 7399; i <= 7401; i++) - materials[i] = Material.WaterCauldron; - materials[22955] = Material.WaxedChiseledCopper; - materials[23300] = Material.WaxedCopperBlock; - for (int i = 24708; i <= 24711; i++) - materials[i] = Material.WaxedCopperBulb; - for (int i = 23908; i <= 23971; i++) - materials[i] = Material.WaxedCopperDoor; - for (int i = 24684; i <= 24685; i++) - materials[i] = Material.WaxedCopperGrate; - for (int i = 24420; i <= 24483; i++) - materials[i] = Material.WaxedCopperTrapdoor; - materials[23307] = Material.WaxedCutCopper; - for (int i = 23646; i <= 23651; i++) - materials[i] = Material.WaxedCutCopperSlab; - for (int i = 23548; i <= 23627; i++) - materials[i] = Material.WaxedCutCopperStairs; - materials[22954] = Material.WaxedExposedChiseledCopper; - materials[23302] = Material.WaxedExposedCopper; - for (int i = 24712; i <= 24715; i++) - materials[i] = Material.WaxedExposedCopperBulb; - for (int i = 23972; i <= 24035; i++) - materials[i] = Material.WaxedExposedCopperDoor; - for (int i = 24686; i <= 24687; i++) - materials[i] = Material.WaxedExposedCopperGrate; - for (int i = 24484; i <= 24547; i++) - materials[i] = Material.WaxedExposedCopperTrapdoor; - materials[23306] = Material.WaxedExposedCutCopper; - for (int i = 23640; i <= 23645; i++) - materials[i] = Material.WaxedExposedCutCopperSlab; - for (int i = 23468; i <= 23547; i++) - materials[i] = Material.WaxedExposedCutCopperStairs; - materials[22952] = Material.WaxedOxidizedChiseledCopper; - materials[23303] = Material.WaxedOxidizedCopper; - for (int i = 24720; i <= 24723; i++) - materials[i] = Material.WaxedOxidizedCopperBulb; - for (int i = 24036; i <= 24099; i++) - materials[i] = Material.WaxedOxidizedCopperDoor; - for (int i = 24690; i <= 24691; i++) - materials[i] = Material.WaxedOxidizedCopperGrate; - for (int i = 24548; i <= 24611; i++) - materials[i] = Material.WaxedOxidizedCopperTrapdoor; - materials[23304] = Material.WaxedOxidizedCutCopper; - for (int i = 23628; i <= 23633; i++) - materials[i] = Material.WaxedOxidizedCutCopperSlab; - for (int i = 23308; i <= 23387; i++) - materials[i] = Material.WaxedOxidizedCutCopperStairs; - materials[22953] = Material.WaxedWeatheredChiseledCopper; - materials[23301] = Material.WaxedWeatheredCopper; - for (int i = 24716; i <= 24719; i++) - materials[i] = Material.WaxedWeatheredCopperBulb; - for (int i = 24100; i <= 24163; i++) - materials[i] = Material.WaxedWeatheredCopperDoor; - for (int i = 24688; i <= 24689; i++) - materials[i] = Material.WaxedWeatheredCopperGrate; - for (int i = 24612; i <= 24675; i++) - materials[i] = Material.WaxedWeatheredCopperTrapdoor; - materials[23305] = Material.WaxedWeatheredCutCopper; - for (int i = 23634; i <= 23639; i++) - materials[i] = Material.WaxedWeatheredCutCopperSlab; - for (int i = 23388; i <= 23467; i++) - materials[i] = Material.WaxedWeatheredCutCopperStairs; - materials[22949] = Material.WeatheredChiseledCopper; - materials[22940] = Material.WeatheredCopper; - for (int i = 24700; i <= 24703; i++) - materials[i] = Material.WeatheredCopperBulb; - for (int i = 23844; i <= 23907; i++) - materials[i] = Material.WeatheredCopperDoor; - for (int i = 24680; i <= 24681; i++) - materials[i] = Material.WeatheredCopperGrate; - for (int i = 24356; i <= 24419; i++) - materials[i] = Material.WeatheredCopperTrapdoor; - materials[22945] = Material.WeatheredCutCopper; - for (int i = 23282; i <= 23287; i++) - materials[i] = Material.WeatheredCutCopperSlab; - for (int i = 23036; i <= 23115; i++) - materials[i] = Material.WeatheredCutCopperStairs; - for (int i = 18611; i <= 18636; i++) - materials[i] = Material.WeepingVines; - materials[18637] = Material.WeepingVinesPlant; - materials[518] = Material.WetSponge; - for (int i = 4278; i <= 4285; i++) - materials[i] = Material.Wheat; - for (int i = 10759; i <= 10774; i++) - materials[i] = Material.WhiteBanner; - for (int i = 1688; i <= 1703; i++) - materials[i] = Material.WhiteBed; - for (int i = 20741; i <= 20756; i++) - materials[i] = Material.WhiteCandle; - for (int i = 20999; i <= 21000; i++) - materials[i] = Material.WhiteCandleCake; - materials[10728] = Material.WhiteCarpet; - materials[12728] = Material.WhiteConcrete; - materials[12744] = Material.WhiteConcretePowder; - for (int i = 12664; i <= 12667; i++) - materials[i] = Material.WhiteGlazedTerracotta; - for (int i = 12568; i <= 12573; i++) - materials[i] = Material.WhiteShulkerBox; - materials[5945] = Material.WhiteStainedGlass; - for (int i = 9372; i <= 9403; i++) - materials[i] = Material.WhiteStainedGlassPane; - materials[9356] = Material.WhiteTerracotta; - materials[2083] = Material.WhiteTulip; - for (int i = 11015; i <= 11018; i++) - materials[i] = Material.WhiteWallBanner; - materials[2047] = Material.WhiteWool; - materials[2087] = Material.WitherRose; - for (int i = 8867; i <= 8898; i++) - materials[i] = Material.WitherSkeletonSkull; - for (int i = 8899; i <= 8906; i++) - materials[i] = Material.WitherSkeletonWallSkull; - for (int i = 10823; i <= 10838; i++) - materials[i] = Material.YellowBanner; - for (int i = 1752; i <= 1767; i++) - materials[i] = Material.YellowBed; - for (int i = 20805; i <= 20820; i++) - materials[i] = Material.YellowCandle; - for (int i = 21007; i <= 21008; i++) - materials[i] = Material.YellowCandleCake; - materials[10732] = Material.YellowCarpet; - materials[12732] = Material.YellowConcrete; - materials[12748] = Material.YellowConcretePowder; - for (int i = 12680; i <= 12683; i++) - materials[i] = Material.YellowGlazedTerracotta; - for (int i = 12592; i <= 12597; i++) - materials[i] = Material.YellowShulkerBox; - materials[5949] = Material.YellowStainedGlass; - for (int i = 9500; i <= 9531; i++) - materials[i] = Material.YellowStainedGlassPane; - materials[9360] = Material.YellowTerracotta; - for (int i = 11031; i <= 11034; i++) - materials[i] = Material.YellowWallBanner; - materials[2051] = Material.YellowWool; - for (int i = 8907; i <= 8938; i++) - materials[i] = Material.ZombieHead; - for (int i = 8939; i <= 8946; i++) - materials[i] = Material.ZombieWallHead; - } - - // - private static readonly BlockStateDefinition[] stateDefinitions = - [ - new(8, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(12, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(25, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(27, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(29, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(31, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(33, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(35, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(37, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(39, 40, - [ - new("age", ["0", "1", "2", "3", "4"], 8), - new("hanging", ["true", "false"], 4), - new("stage", ["0", "1"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(80, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(96, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(113, 4, - [ - new("dusted", ["0", "1", "2", "3"], 1) - ]), - new(119, 4, - [ - new("dusted", ["0", "1", "2", "3"], 1) - ]), - new(130, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(133, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(136, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(139, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(142, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(145, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(148, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(151, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(154, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(156, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(159, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(162, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(165, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(168, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(171, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(174, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(177, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(180, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(183, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(186, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(189, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(192, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(195, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(198, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(201, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(204, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(207, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(210, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(213, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(216, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(219, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(222, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(225, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(228, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(231, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(234, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(237, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(265, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(293, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(321, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(349, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(377, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(405, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(433, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(461, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(489, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(523, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(538, 1150, - [ - new("instrument", ["harp", "basedrum", "snare", "hat", "bass", "flute", "bell", "guitar", "chime", "xylophone", "iron_xylophone", "cow_bell", "didgeridoo", "bit", "banjo", "pling", "zombie", "skeleton", "creeper", "dragon", "wither_skeleton", "piglin", "custom_head"], 50), - new("note", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"], 2), - new("powered", ["true", "false"], 1) - ]), - new(1688, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1704, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1720, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1736, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1752, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1768, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1784, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1800, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1816, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1832, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1848, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1864, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1880, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1896, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1912, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1928, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1944, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(1968, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(1992, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(2009, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(2011, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(2023, 24, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("short", ["true", "false"], 2) - ]), - new(2063, 12, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 2) - ]), - new(2094, 2, - [ - new("unstable", ["true", "false"], 1) - ]), - new(2097, 256, - [ - new("facing", ["north", "south", "west", "east"], 64), - new("slot_0_occupied", ["true", "false"], 32), - new("slot_1_occupied", ["true", "false"], 16), - new("slot_2_occupied", ["true", "false"], 8), - new("slot_3_occupied", ["true", "false"], 4), - new("slot_4_occupied", ["true", "false"], 2), - new("slot_5_occupied", ["true", "false"], 1) - ]), - new(2356, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(2360, 512, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(2874, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2954, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(2978, 1296, - [ - new("east", ["up", "side", "none"], 432), - new("north", ["up", "side", "none"], 144), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 9), - new("south", ["up", "side", "none"], 3), - new("west", ["up", "side", "none"], 1) - ]), - new(4278, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4286, 8, - [ - new("moisture", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4294, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(4302, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4334, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4366, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4398, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4430, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4462, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4494, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4526, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4558, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4590, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(4654, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4662, 20, - [ - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south", "south_east", "south_west", "north_west", "north_east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4682, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4762, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4770, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4778, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4786, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4794, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4802, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4810, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4818, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4826, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4834, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4898, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4962, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5026, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5090, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5154, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5218, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5282, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5346, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5410, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5474, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5538, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5546, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5554, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5562, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5570, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5578, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5586, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5594, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5602, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5610, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5618, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5626, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5650, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5652, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5716, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5718, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5720, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5722, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5724, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5726, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5728, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5730, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5732, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5734, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5736, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5738, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5740, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(5748, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5772, 8, - [ - new("layers", ["1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(5782, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5799, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5815, 2, - [ - new("has_record", ["true", "false"], 1) - ]), - new(5817, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5852, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(5855, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(5859, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5864, 2, - [ - new("axis", ["x", "z"], 1) - ]), - new(5866, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5870, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5874, 7, - [ - new("bites", ["0", "1", "2", "3", "4", "5", "6"], 1) - ]), - new(5881, 64, - [ - new("delay", ["1", "2", "3", "4"], 16), - new("facing", ["north", "south", "west", "east"], 4), - new("locked", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5961, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6025, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6089, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6153, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6217, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6281, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6345, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6409, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6473, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6549, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6613, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6677, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6741, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6773, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6779, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6813, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6817, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6821, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(6829, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(6837, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6869, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6997, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7029, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7109, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7189, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7269, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(7273, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7305, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7385, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(7390, 8, - [ - new("has_bottle_0", ["true", "false"], 4), - new("has_bottle_1", ["true", "false"], 2), - new("has_bottle_2", ["true", "false"], 1) - ]), - new(7399, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(7403, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(7407, 8, - [ - new("eye", ["true", "false"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7417, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(7419, 12, - [ - new("age", ["0", "1", "2"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7431, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7513, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7521, 16, - [ - new("attached", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7537, 128, - [ - new("attached", ["true", "false"], 64), - new("disarmed", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("powered", ["true", "false"], 4), - new("south", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7666, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7746, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7826, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7906, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(7919, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(8243, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(8595, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(8603, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(8611, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8635, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8659, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8683, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8707, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8731, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8755, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8779, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8803, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8827, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8859, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8867, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8899, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8907, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8939, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8947, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8979, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8987, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9019, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9027, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9059, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9067, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9099, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9107, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9111, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9115, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9119, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(9143, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9159, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9175, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("mode", ["compare", "subtract"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9191, 32, - [ - new("inverted", ["true", "false"], 16), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9225, 10, - [ - new("enabled", ["true", "false"], 5), - new("facing", ["down", "north", "south", "west", "east"], 1) - ]), - new(9237, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(9240, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9320, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9344, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(9372, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9404, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9436, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9468, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9500, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9532, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9564, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9596, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9628, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9660, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9692, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9724, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9756, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9788, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9820, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9852, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9884, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9964, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10044, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10124, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10204, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10284, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10365, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10367, 32, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10399, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10466, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10546, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10626, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10706, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10712, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10718, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10725, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(10747, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10749, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10751, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10753, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10755, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10757, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10759, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10775, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10791, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10807, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10823, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10839, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10855, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10871, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10887, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10903, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10919, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10935, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10951, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10967, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10983, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10999, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11015, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11019, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11023, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11027, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11031, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11035, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11039, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11043, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11047, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11051, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11055, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11059, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11063, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11067, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11071, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11075, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11082, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11162, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11168, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11174, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11180, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11186, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11192, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11198, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11204, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11210, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11216, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11222, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11228, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11234, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11240, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11246, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11252, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11258, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11264, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11270, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11276, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11282, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11288, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11294, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11300, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11310, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11342, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11374, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11406, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11438, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11470, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11502, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11534, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11566, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11598, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11630, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11662, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11694, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11726, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11758, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11790, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11822, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11886, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11950, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12014, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12078, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12142, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12206, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12270, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12334, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12340, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12404, 6, - [ - new("age", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(12411, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(12414, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12495, 2, - [ - new("age", ["0", "1"], 1) - ]), - new(12497, 10, - [ - new("age", ["0", "1", "2", "3", "4"], 2), - new("half", ["upper", "lower"], 1) - ]), - new(12507, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(12509, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(12515, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12527, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12539, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(12546, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(12550, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12562, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12568, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12574, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12580, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12586, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12592, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12598, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12604, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12610, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12616, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12622, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12628, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12634, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12640, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12646, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12652, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12658, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12664, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12668, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12672, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12676, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12680, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12684, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12688, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12692, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12696, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12700, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12704, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12708, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12712, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12716, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12720, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12724, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12760, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(12788, 12, - [ - new("eggs", ["1", "2", "3", "4"], 3), - new("hatch", ["0", "1", "2"], 1) - ]), - new(12800, 3, - [ - new("hatch", ["0", "1", "2"], 1) - ]), - new(12813, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12815, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12817, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12819, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12821, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12823, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12825, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12827, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12829, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12831, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12833, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12835, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12837, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12839, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12841, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12843, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12845, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12847, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12849, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12851, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12853, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12861, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12869, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12877, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12885, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12893, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12901, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12909, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12917, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12925, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12933, 8, - [ - new("pickles", ["1", "2", "3", "4"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12942, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12945, 12, - [ - new("age", ["0", "1"], 6), - new("leaves", ["none", "small", "large"], 2), - new("stage", ["0", "1"], 1) - ]), - new(12960, 2, - [ - new("drag", ["true", "false"], 1) - ]), - new(12962, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13042, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13122, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13202, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13282, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13362, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13442, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13522, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13602, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13682, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13762, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13842, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13922, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14002, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14082, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14088, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14094, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14100, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14106, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14112, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14118, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14124, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14130, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14136, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14142, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14148, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14154, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14160, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14484, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14808, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15132, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15456, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15780, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16104, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16428, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16752, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17076, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17400, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17724, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18048, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18372, 32, - [ - new("bottom", ["true", "false"], 16), - new("distance", ["0", "1", "2", "3", "4", "5", "6", "7"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18404, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(18408, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("open", ["true", "false"], 1) - ]), - new(18420, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(18428, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(18438, 12, - [ - new("face", ["floor", "wall", "ceiling"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(18450, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("has_book", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18467, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(18471, 32, - [ - new("attachment", ["floor", "ceiling", "single_wall", "double_wall"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18503, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18507, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18511, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18543, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18575, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(18579, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18582, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18585, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18588, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18596, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18599, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18602, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18605, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18611, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(18638, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(18668, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18674, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18680, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(18682, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(18684, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(18716, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(18748, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18812, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18876, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18908, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18940, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19020, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19100, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19124, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19148, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19212, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19276, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19308, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19340, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19348, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19356, 4, - [ - new("mode", ["save", "load", "corner", "data"], 1) - ]), - new(19360, 12, - [ - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 1) - ]), - new(19372, 9, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(19381, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(19397, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(19421, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(19450, 5, - [ - new("charges", ["0", "1", "2", "3", "4"], 1) - ]), - new(19461, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19541, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19865, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19875, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19881, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19961, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20286, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20366, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20372, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(20374, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20398, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20725, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20741, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20757, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20773, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20789, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20805, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20821, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20837, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20853, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20869, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20885, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20901, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20917, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20933, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20949, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20965, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20981, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20997, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20999, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21001, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21003, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21005, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21007, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21009, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21011, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21013, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21015, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21017, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21019, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21021, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21023, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21025, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21027, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21029, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21033, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21045, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21057, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21069, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21082, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21088, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21168, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(21493, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21499, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21579, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(21905, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21911, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21991, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(22319, 96, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22415, 384, - [ - new("facing", ["north", "south", "west", "east"], 96), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22800, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(22928, 2, - [ - new("bloom", ["true", "false"], 1) - ]), - new(22930, 8, - [ - new("can_summon", ["true", "false"], 4), - new("shrieking", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22956, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23036, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23116, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23196, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23276, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23282, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23288, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23294, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23308, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23388, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23468, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23548, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23628, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23634, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23640, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23646, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23652, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(23716, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(23780, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(23844, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(23908, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(23972, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24036, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24100, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24164, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24228, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24292, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24356, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24420, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24484, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24548, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24612, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24676, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(24678, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(24680, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(24682, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(24684, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(24686, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(24688, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(24690, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(24692, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24696, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24700, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24704, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24708, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24712, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24716, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24720, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24724, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24748, 20, - [ - new("thickness", ["tip_merge", "tip", "frustum", "middle", "base"], 4), - new("vertical_direction", ["up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24769, 52, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 2), - new("berries", ["true", "false"], 1) - ]), - new(24821, 2, - [ - new("berries", ["true", "false"], 1) - ]), - new(24827, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("flower_amount", ["1", "2", "3", "4"], 1) - ]), - new(24844, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("tilt", ["none", "unstable", "partial", "full"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24876, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24884, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("half", ["upper", "lower"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24900, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(24904, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(24908, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24988, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24994, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(25319, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25399, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25405, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(25730, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25810, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25816, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(26141, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26221, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26227, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(26554, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(26563, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(26566, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(26569, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(26574, 16, - [ - new("cracked", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26590, 48, - [ - new("crafting", ["true", "false"], 24), - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(26638, 6, - [ - new("trial_spawner_state", ["inactive", "waiting_for_players", "active", "waiting_for_reward_ejection", "ejecting_reward", "cooldown"], 1) - ]), - ]; - // - - protected override Dictionary GetDict() - { - return materials; - } - - protected override BlockStateDefinition[] GetStateDefinitions() - { - return stateDefinitions; - } - } -} diff --git a/MinecraftClient/Mapping/BlockPalettes/Palette1206.cs b/MinecraftClient/Mapping/BlockPalettes/Palette1206.cs deleted file mode 100644 index 01a9d60d4e..0000000000 --- a/MinecraftClient/Mapping/BlockPalettes/Palette1206.cs +++ /dev/null @@ -1,5553 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.BlockPalettes -{ - public class Palette1206 : BlockPalette - { - private static readonly Dictionary materials = new(); - - static Palette1206() - { - for (int i = 8707; i <= 8730; i++) - materials[i] = Material.AcaciaButton; - for (int i = 12014; i <= 12077; i++) - materials[i] = Material.AcaciaDoor; - for (int i = 11662; i <= 11693; i++) - materials[i] = Material.AcaciaFence; - for (int i = 11406; i <= 11437; i++) - materials[i] = Material.AcaciaFenceGate; - for (int i = 5026; i <= 5089; i++) - materials[i] = Material.AcaciaHangingSign; - for (int i = 349; i <= 376; i++) - materials[i] = Material.AcaciaLeaves; - for (int i = 142; i <= 144; i++) - materials[i] = Material.AcaciaLog; - materials[19] = Material.AcaciaPlanks; - for (int i = 5724; i <= 5725; i++) - materials[i] = Material.AcaciaPressurePlate; - for (int i = 33; i <= 34; i++) - materials[i] = Material.AcaciaSapling; - for (int i = 4398; i <= 4429; i++) - materials[i] = Material.AcaciaSign; - for (int i = 11186; i <= 11191; i++) - materials[i] = Material.AcaciaSlab; - for (int i = 9884; i <= 9963; i++) - materials[i] = Material.AcaciaStairs; - for (int i = 6217; i <= 6280; i++) - materials[i] = Material.AcaciaTrapdoor; - for (int i = 5562; i <= 5569; i++) - materials[i] = Material.AcaciaWallHangingSign; - for (int i = 4786; i <= 4793; i++) - materials[i] = Material.AcaciaWallSign; - for (int i = 201; i <= 203; i++) - materials[i] = Material.AcaciaWood; - for (int i = 9320; i <= 9343; i++) - materials[i] = Material.ActivatorRail; - materials[0] = Material.Air; - materials[2079] = Material.Allium; - materials[21031] = Material.AmethystBlock; - for (int i = 21033; i <= 21044; i++) - materials[i] = Material.AmethystCluster; - materials[19448] = Material.AncientDebris; - materials[6] = Material.Andesite; - for (int i = 14136; i <= 14141; i++) - materials[i] = Material.AndesiteSlab; - for (int i = 13762; i <= 13841; i++) - materials[i] = Material.AndesiteStairs; - for (int i = 16752; i <= 17075; i++) - materials[i] = Material.AndesiteWall; - for (int i = 9107; i <= 9110; i++) - materials[i] = Material.Anvil; - for (int i = 6817; i <= 6820; i++) - materials[i] = Material.AttachedMelonStem; - for (int i = 6813; i <= 6816; i++) - materials[i] = Material.AttachedPumpkinStem; - materials[24824] = Material.Azalea; - for (int i = 461; i <= 488; i++) - materials[i] = Material.AzaleaLeaves; - materials[2080] = Material.AzureBluet; - for (int i = 12945; i <= 12956; i++) - materials[i] = Material.Bamboo; - for (int i = 159; i <= 161; i++) - materials[i] = Material.BambooBlock; - for (int i = 8803; i <= 8826; i++) - materials[i] = Material.BambooButton; - for (int i = 12270; i <= 12333; i++) - materials[i] = Material.BambooDoor; - for (int i = 11790; i <= 11821; i++) - materials[i] = Material.BambooFence; - for (int i = 11534; i <= 11565; i++) - materials[i] = Material.BambooFenceGate; - for (int i = 5474; i <= 5537; i++) - materials[i] = Material.BambooHangingSign; - materials[24] = Material.BambooMosaic; - for (int i = 11216; i <= 11221; i++) - materials[i] = Material.BambooMosaicSlab; - for (int i = 10284; i <= 10363; i++) - materials[i] = Material.BambooMosaicStairs; - materials[23] = Material.BambooPlanks; - for (int i = 5732; i <= 5733; i++) - materials[i] = Material.BambooPressurePlate; - materials[12944] = Material.BambooSapling; - for (int i = 4558; i <= 4589; i++) - materials[i] = Material.BambooSign; - for (int i = 11210; i <= 11215; i++) - materials[i] = Material.BambooSlab; - for (int i = 10204; i <= 10283; i++) - materials[i] = Material.BambooStairs; - for (int i = 6473; i <= 6536; i++) - materials[i] = Material.BambooTrapdoor; - for (int i = 5618; i <= 5625; i++) - materials[i] = Material.BambooWallHangingSign; - for (int i = 4826; i <= 4833; i++) - materials[i] = Material.BambooWallSign; - for (int i = 18408; i <= 18419; i++) - materials[i] = Material.Barrel; - for (int i = 10365; i <= 10366; i++) - materials[i] = Material.Barrier; - for (int i = 5852; i <= 5854; i++) - materials[i] = Material.Basalt; - materials[7918] = Material.Beacon; - materials[79] = Material.Bedrock; - for (int i = 19397; i <= 19420; i++) - materials[i] = Material.BeeNest; - for (int i = 19421; i <= 19444; i++) - materials[i] = Material.Beehive; - for (int i = 12509; i <= 12512; i++) - materials[i] = Material.Beetroots; - for (int i = 18471; i <= 18502; i++) - materials[i] = Material.Bell; - for (int i = 24844; i <= 24875; i++) - materials[i] = Material.BigDripleaf; - for (int i = 24876; i <= 24883; i++) - materials[i] = Material.BigDripleafStem; - for (int i = 8659; i <= 8682; i++) - materials[i] = Material.BirchButton; - for (int i = 11886; i <= 11949; i++) - materials[i] = Material.BirchDoor; - for (int i = 11598; i <= 11629; i++) - materials[i] = Material.BirchFence; - for (int i = 11342; i <= 11373; i++) - materials[i] = Material.BirchFenceGate; - for (int i = 4962; i <= 5025; i++) - materials[i] = Material.BirchHangingSign; - for (int i = 293; i <= 320; i++) - materials[i] = Material.BirchLeaves; - for (int i = 136; i <= 138; i++) - materials[i] = Material.BirchLog; - materials[17] = Material.BirchPlanks; - for (int i = 5720; i <= 5721; i++) - materials[i] = Material.BirchPressurePlate; - for (int i = 29; i <= 30; i++) - materials[i] = Material.BirchSapling; - for (int i = 4366; i <= 4397; i++) - materials[i] = Material.BirchSign; - for (int i = 11174; i <= 11179; i++) - materials[i] = Material.BirchSlab; - for (int i = 7746; i <= 7825; i++) - materials[i] = Material.BirchStairs; - for (int i = 6089; i <= 6152; i++) - materials[i] = Material.BirchTrapdoor; - for (int i = 5554; i <= 5561; i++) - materials[i] = Material.BirchWallHangingSign; - for (int i = 4778; i <= 4785; i++) - materials[i] = Material.BirchWallSign; - for (int i = 195; i <= 197; i++) - materials[i] = Material.BirchWood; - for (int i = 10999; i <= 11014; i++) - materials[i] = Material.BlackBanner; - for (int i = 1928; i <= 1943; i++) - materials[i] = Material.BlackBed; - for (int i = 20981; i <= 20996; i++) - materials[i] = Material.BlackCandle; - for (int i = 21029; i <= 21030; i++) - materials[i] = Material.BlackCandleCake; - materials[10743] = Material.BlackCarpet; - materials[12743] = Material.BlackConcrete; - materials[12759] = Material.BlackConcretePowder; - for (int i = 12724; i <= 12727; i++) - materials[i] = Material.BlackGlazedTerracotta; - for (int i = 12658; i <= 12663; i++) - materials[i] = Material.BlackShulkerBox; - materials[5960] = Material.BlackStainedGlass; - for (int i = 9852; i <= 9883; i++) - materials[i] = Material.BlackStainedGlassPane; - materials[9371] = Material.BlackTerracotta; - for (int i = 11075; i <= 11078; i++) - materials[i] = Material.BlackWallBanner; - materials[2062] = Material.BlackWool; - materials[19460] = Material.Blackstone; - for (int i = 19865; i <= 19870; i++) - materials[i] = Material.BlackstoneSlab; - for (int i = 19461; i <= 19540; i++) - materials[i] = Material.BlackstoneStairs; - for (int i = 19541; i <= 19864; i++) - materials[i] = Material.BlackstoneWall; - for (int i = 18428; i <= 18435; i++) - materials[i] = Material.BlastFurnace; - for (int i = 10935; i <= 10950; i++) - materials[i] = Material.BlueBanner; - for (int i = 1864; i <= 1879; i++) - materials[i] = Material.BlueBed; - for (int i = 20917; i <= 20932; i++) - materials[i] = Material.BlueCandle; - for (int i = 21021; i <= 21022; i++) - materials[i] = Material.BlueCandleCake; - materials[10739] = Material.BlueCarpet; - materials[12739] = Material.BlueConcrete; - materials[12755] = Material.BlueConcretePowder; - for (int i = 12708; i <= 12711; i++) - materials[i] = Material.BlueGlazedTerracotta; - materials[12941] = Material.BlueIce; - materials[2078] = Material.BlueOrchid; - for (int i = 12634; i <= 12639; i++) - materials[i] = Material.BlueShulkerBox; - materials[5956] = Material.BlueStainedGlass; - for (int i = 9724; i <= 9755; i++) - materials[i] = Material.BlueStainedGlassPane; - materials[9367] = Material.BlueTerracotta; - for (int i = 11059; i <= 11062; i++) - materials[i] = Material.BlueWallBanner; - materials[2058] = Material.BlueWool; - for (int i = 12546; i <= 12548; i++) - materials[i] = Material.BoneBlock; - materials[2096] = Material.Bookshelf; - for (int i = 12825; i <= 12826; i++) - materials[i] = Material.BrainCoral; - materials[12809] = Material.BrainCoralBlock; - for (int i = 12845; i <= 12846; i++) - materials[i] = Material.BrainCoralFan; - for (int i = 12901; i <= 12908; i++) - materials[i] = Material.BrainCoralWallFan; - for (int i = 7390; i <= 7397; i++) - materials[i] = Material.BrewingStand; - for (int i = 11258; i <= 11263; i++) - materials[i] = Material.BrickSlab; - for (int i = 7029; i <= 7108; i++) - materials[i] = Material.BrickStairs; - for (int i = 14160; i <= 14483; i++) - materials[i] = Material.BrickWall; - materials[2093] = Material.Bricks; - for (int i = 10951; i <= 10966; i++) - materials[i] = Material.BrownBanner; - for (int i = 1880; i <= 1895; i++) - materials[i] = Material.BrownBed; - for (int i = 20933; i <= 20948; i++) - materials[i] = Material.BrownCandle; - for (int i = 21023; i <= 21024; i++) - materials[i] = Material.BrownCandleCake; - materials[10740] = Material.BrownCarpet; - materials[12740] = Material.BrownConcrete; - materials[12756] = Material.BrownConcretePowder; - for (int i = 12712; i <= 12715; i++) - materials[i] = Material.BrownGlazedTerracotta; - materials[2089] = Material.BrownMushroom; - for (int i = 6549; i <= 6612; i++) - materials[i] = Material.BrownMushroomBlock; - for (int i = 12640; i <= 12645; i++) - materials[i] = Material.BrownShulkerBox; - materials[5957] = Material.BrownStainedGlass; - for (int i = 9756; i <= 9787; i++) - materials[i] = Material.BrownStainedGlassPane; - materials[9368] = Material.BrownTerracotta; - for (int i = 11063; i <= 11066; i++) - materials[i] = Material.BrownWallBanner; - materials[2059] = Material.BrownWool; - for (int i = 12960; i <= 12961; i++) - materials[i] = Material.BubbleColumn; - for (int i = 12827; i <= 12828; i++) - materials[i] = Material.BubbleCoral; - materials[12810] = Material.BubbleCoralBlock; - for (int i = 12847; i <= 12848; i++) - materials[i] = Material.BubbleCoralFan; - for (int i = 12909; i <= 12916; i++) - materials[i] = Material.BubbleCoralWallFan; - materials[21032] = Material.BuddingAmethyst; - for (int i = 5782; i <= 5797; i++) - materials[i] = Material.Cactus; - for (int i = 5874; i <= 5880; i++) - materials[i] = Material.Cake; - materials[22316] = Material.Calcite; - for (int i = 22415; i <= 22798; i++) - materials[i] = Material.CalibratedSculkSensor; - for (int i = 18511; i <= 18542; i++) - materials[i] = Material.Campfire; - for (int i = 20725; i <= 20740; i++) - materials[i] = Material.Candle; - for (int i = 20997; i <= 20998; i++) - materials[i] = Material.CandleCake; - for (int i = 8595; i <= 8602; i++) - materials[i] = Material.Carrots; - materials[18436] = Material.CartographyTable; - for (int i = 5866; i <= 5869; i++) - materials[i] = Material.CarvedPumpkin; - materials[7398] = Material.Cauldron; - materials[12959] = Material.CaveAir; - for (int i = 24769; i <= 24820; i++) - materials[i] = Material.CaveVines; - for (int i = 24821; i <= 24822; i++) - materials[i] = Material.CaveVinesPlant; - for (int i = 6773; i <= 6778; i++) - materials[i] = Material.Chain; - for (int i = 12527; i <= 12538; i++) - materials[i] = Material.ChainCommandBlock; - for (int i = 8731; i <= 8754; i++) - materials[i] = Material.CherryButton; - for (int i = 12078; i <= 12141; i++) - materials[i] = Material.CherryDoor; - for (int i = 11694; i <= 11725; i++) - materials[i] = Material.CherryFence; - for (int i = 11438; i <= 11469; i++) - materials[i] = Material.CherryFenceGate; - for (int i = 5090; i <= 5153; i++) - materials[i] = Material.CherryHangingSign; - for (int i = 377; i <= 404; i++) - materials[i] = Material.CherryLeaves; - for (int i = 145; i <= 147; i++) - materials[i] = Material.CherryLog; - materials[20] = Material.CherryPlanks; - for (int i = 5726; i <= 5727; i++) - materials[i] = Material.CherryPressurePlate; - for (int i = 35; i <= 36; i++) - materials[i] = Material.CherrySapling; - for (int i = 4430; i <= 4461; i++) - materials[i] = Material.CherrySign; - for (int i = 11192; i <= 11197; i++) - materials[i] = Material.CherrySlab; - for (int i = 9964; i <= 10043; i++) - materials[i] = Material.CherryStairs; - for (int i = 6281; i <= 6344; i++) - materials[i] = Material.CherryTrapdoor; - for (int i = 5570; i <= 5577; i++) - materials[i] = Material.CherryWallHangingSign; - for (int i = 4794; i <= 4801; i++) - materials[i] = Material.CherryWallSign; - for (int i = 204; i <= 206; i++) - materials[i] = Material.CherryWood; - for (int i = 2954; i <= 2977; i++) - materials[i] = Material.Chest; - for (int i = 9111; i <= 9114; i++) - materials[i] = Material.ChippedAnvil; - for (int i = 2097; i <= 2352; i++) - materials[i] = Material.ChiseledBookshelf; - materials[22951] = Material.ChiseledCopper; - materials[26551] = Material.ChiseledDeepslate; - materials[20722] = Material.ChiseledNetherBricks; - materials[19874] = Material.ChiseledPolishedBlackstone; - materials[9236] = Material.ChiseledQuartzBlock; - materials[11080] = Material.ChiseledRedSandstone; - materials[536] = Material.ChiseledSandstone; - materials[6540] = Material.ChiseledStoneBricks; - materials[21903] = Material.ChiseledTuff; - materials[22315] = Material.ChiseledTuffBricks; - for (int i = 12404; i <= 12409; i++) - materials[i] = Material.ChorusFlower; - for (int i = 12340; i <= 12403; i++) - materials[i] = Material.ChorusPlant; - materials[5798] = Material.Clay; - materials[10745] = Material.CoalBlock; - materials[127] = Material.CoalOre; - materials[11] = Material.CoarseDirt; - materials[24907] = Material.CobbledDeepslate; - for (int i = 24988; i <= 24993; i++) - materials[i] = Material.CobbledDeepslateSlab; - for (int i = 24908; i <= 24987; i++) - materials[i] = Material.CobbledDeepslateStairs; - for (int i = 24994; i <= 25317; i++) - materials[i] = Material.CobbledDeepslateWall; - materials[14] = Material.Cobblestone; - for (int i = 11252; i <= 11257; i++) - materials[i] = Material.CobblestoneSlab; - for (int i = 4682; i <= 4761; i++) - materials[i] = Material.CobblestoneStairs; - for (int i = 7919; i <= 8242; i++) - materials[i] = Material.CobblestoneWall; - materials[2004] = Material.Cobweb; - for (int i = 7419; i <= 7430; i++) - materials[i] = Material.Cocoa; - for (int i = 7906; i <= 7917; i++) - materials[i] = Material.CommandBlock; - for (int i = 9175; i <= 9190; i++) - materials[i] = Material.Comparator; - for (int i = 19372; i <= 19380; i++) - materials[i] = Material.Composter; - for (int i = 12942; i <= 12943; i++) - materials[i] = Material.Conduit; - materials[22938] = Material.CopperBlock; - for (int i = 24692; i <= 24695; i++) - materials[i] = Material.CopperBulb; - for (int i = 23652; i <= 23715; i++) - materials[i] = Material.CopperDoor; - for (int i = 24676; i <= 24677; i++) - materials[i] = Material.CopperGrate; - materials[22942] = Material.CopperOre; - for (int i = 24164; i <= 24227; i++) - materials[i] = Material.CopperTrapdoor; - materials[2086] = Material.Cornflower; - materials[26552] = Material.CrackedDeepslateBricks; - materials[26553] = Material.CrackedDeepslateTiles; - materials[20723] = Material.CrackedNetherBricks; - materials[19873] = Material.CrackedPolishedBlackstoneBricks; - materials[6539] = Material.CrackedStoneBricks; - for (int i = 26590; i <= 26637; i++) - materials[i] = Material.Crafter; - materials[4277] = Material.CraftingTable; - for (int i = 8987; i <= 9018; i++) - materials[i] = Material.CreeperHead; - for (int i = 9019; i <= 9026; i++) - materials[i] = Material.CreeperWallHead; - for (int i = 19100; i <= 19123; i++) - materials[i] = Material.CrimsonButton; - for (int i = 19148; i <= 19211; i++) - materials[i] = Material.CrimsonDoor; - for (int i = 18684; i <= 18715; i++) - materials[i] = Material.CrimsonFence; - for (int i = 18876; i <= 18907; i++) - materials[i] = Material.CrimsonFenceGate; - materials[18609] = Material.CrimsonFungus; - for (int i = 5282; i <= 5345; i++) - materials[i] = Material.CrimsonHangingSign; - for (int i = 18602; i <= 18604; i++) - materials[i] = Material.CrimsonHyphae; - materials[18608] = Material.CrimsonNylium; - materials[18666] = Material.CrimsonPlanks; - for (int i = 18680; i <= 18681; i++) - materials[i] = Material.CrimsonPressurePlate; - materials[18665] = Material.CrimsonRoots; - for (int i = 19276; i <= 19307; i++) - materials[i] = Material.CrimsonSign; - for (int i = 18668; i <= 18673; i++) - materials[i] = Material.CrimsonSlab; - for (int i = 18940; i <= 19019; i++) - materials[i] = Material.CrimsonStairs; - for (int i = 18596; i <= 18598; i++) - materials[i] = Material.CrimsonStem; - for (int i = 18748; i <= 18811; i++) - materials[i] = Material.CrimsonTrapdoor; - for (int i = 5602; i <= 5609; i++) - materials[i] = Material.CrimsonWallHangingSign; - for (int i = 19340; i <= 19347; i++) - materials[i] = Material.CrimsonWallSign; - materials[19449] = Material.CryingObsidian; - materials[22947] = Material.CutCopper; - for (int i = 23294; i <= 23299; i++) - materials[i] = Material.CutCopperSlab; - for (int i = 23196; i <= 23275; i++) - materials[i] = Material.CutCopperStairs; - materials[11081] = Material.CutRedSandstone; - for (int i = 11294; i <= 11299; i++) - materials[i] = Material.CutRedSandstoneSlab; - materials[537] = Material.CutSandstone; - for (int i = 11240; i <= 11245; i++) - materials[i] = Material.CutSandstoneSlab; - for (int i = 10903; i <= 10918; i++) - materials[i] = Material.CyanBanner; - for (int i = 1832; i <= 1847; i++) - materials[i] = Material.CyanBed; - for (int i = 20885; i <= 20900; i++) - materials[i] = Material.CyanCandle; - for (int i = 21017; i <= 21018; i++) - materials[i] = Material.CyanCandleCake; - materials[10737] = Material.CyanCarpet; - materials[12737] = Material.CyanConcrete; - materials[12753] = Material.CyanConcretePowder; - for (int i = 12700; i <= 12703; i++) - materials[i] = Material.CyanGlazedTerracotta; - for (int i = 12622; i <= 12627; i++) - materials[i] = Material.CyanShulkerBox; - materials[5954] = Material.CyanStainedGlass; - for (int i = 9660; i <= 9691; i++) - materials[i] = Material.CyanStainedGlassPane; - materials[9365] = Material.CyanTerracotta; - for (int i = 11051; i <= 11054; i++) - materials[i] = Material.CyanWallBanner; - materials[2056] = Material.CyanWool; - for (int i = 9115; i <= 9118; i++) - materials[i] = Material.DamagedAnvil; - materials[2075] = Material.Dandelion; - for (int i = 8755; i <= 8778; i++) - materials[i] = Material.DarkOakButton; - for (int i = 12142; i <= 12205; i++) - materials[i] = Material.DarkOakDoor; - for (int i = 11726; i <= 11757; i++) - materials[i] = Material.DarkOakFence; - for (int i = 11470; i <= 11501; i++) - materials[i] = Material.DarkOakFenceGate; - for (int i = 5218; i <= 5281; i++) - materials[i] = Material.DarkOakHangingSign; - for (int i = 405; i <= 432; i++) - materials[i] = Material.DarkOakLeaves; - for (int i = 148; i <= 150; i++) - materials[i] = Material.DarkOakLog; - materials[21] = Material.DarkOakPlanks; - for (int i = 5728; i <= 5729; i++) - materials[i] = Material.DarkOakPressurePlate; - for (int i = 37; i <= 38; i++) - materials[i] = Material.DarkOakSapling; - for (int i = 4494; i <= 4525; i++) - materials[i] = Material.DarkOakSign; - for (int i = 11198; i <= 11203; i++) - materials[i] = Material.DarkOakSlab; - for (int i = 10044; i <= 10123; i++) - materials[i] = Material.DarkOakStairs; - for (int i = 6345; i <= 6408; i++) - materials[i] = Material.DarkOakTrapdoor; - for (int i = 5586; i <= 5593; i++) - materials[i] = Material.DarkOakWallHangingSign; - for (int i = 4810; i <= 4817; i++) - materials[i] = Material.DarkOakWallSign; - for (int i = 207; i <= 209; i++) - materials[i] = Material.DarkOakWood; - materials[10465] = Material.DarkPrismarine; - for (int i = 10718; i <= 10723; i++) - materials[i] = Material.DarkPrismarineSlab; - for (int i = 10626; i <= 10705; i++) - materials[i] = Material.DarkPrismarineStairs; - for (int i = 9191; i <= 9222; i++) - materials[i] = Material.DaylightDetector; - for (int i = 12815; i <= 12816; i++) - materials[i] = Material.DeadBrainCoral; - materials[12804] = Material.DeadBrainCoralBlock; - for (int i = 12835; i <= 12836; i++) - materials[i] = Material.DeadBrainCoralFan; - for (int i = 12861; i <= 12868; i++) - materials[i] = Material.DeadBrainCoralWallFan; - for (int i = 12817; i <= 12818; i++) - materials[i] = Material.DeadBubbleCoral; - materials[12805] = Material.DeadBubbleCoralBlock; - for (int i = 12837; i <= 12838; i++) - materials[i] = Material.DeadBubbleCoralFan; - for (int i = 12869; i <= 12876; i++) - materials[i] = Material.DeadBubbleCoralWallFan; - materials[2007] = Material.DeadBush; - for (int i = 12819; i <= 12820; i++) - materials[i] = Material.DeadFireCoral; - materials[12806] = Material.DeadFireCoralBlock; - for (int i = 12839; i <= 12840; i++) - materials[i] = Material.DeadFireCoralFan; - for (int i = 12877; i <= 12884; i++) - materials[i] = Material.DeadFireCoralWallFan; - for (int i = 12821; i <= 12822; i++) - materials[i] = Material.DeadHornCoral; - materials[12807] = Material.DeadHornCoralBlock; - for (int i = 12841; i <= 12842; i++) - materials[i] = Material.DeadHornCoralFan; - for (int i = 12885; i <= 12892; i++) - materials[i] = Material.DeadHornCoralWallFan; - for (int i = 12813; i <= 12814; i++) - materials[i] = Material.DeadTubeCoral; - materials[12803] = Material.DeadTubeCoralBlock; - for (int i = 12833; i <= 12834; i++) - materials[i] = Material.DeadTubeCoralFan; - for (int i = 12853; i <= 12860; i++) - materials[i] = Material.DeadTubeCoralWallFan; - for (int i = 26574; i <= 26589; i++) - materials[i] = Material.DecoratedPot; - for (int i = 24904; i <= 24906; i++) - materials[i] = Material.Deepslate; - for (int i = 26221; i <= 26226; i++) - materials[i] = Material.DeepslateBrickSlab; - for (int i = 26141; i <= 26220; i++) - materials[i] = Material.DeepslateBrickStairs; - for (int i = 26227; i <= 26550; i++) - materials[i] = Material.DeepslateBrickWall; - materials[26140] = Material.DeepslateBricks; - materials[128] = Material.DeepslateCoalOre; - materials[22943] = Material.DeepslateCopperOre; - materials[4275] = Material.DeepslateDiamondOre; - materials[7512] = Material.DeepslateEmeraldOre; - materials[124] = Material.DeepslateGoldOre; - materials[126] = Material.DeepslateIronOre; - materials[521] = Material.DeepslateLapisOre; - for (int i = 5736; i <= 5737; i++) - materials[i] = Material.DeepslateRedstoneOre; - for (int i = 25810; i <= 25815; i++) - materials[i] = Material.DeepslateTileSlab; - for (int i = 25730; i <= 25809; i++) - materials[i] = Material.DeepslateTileStairs; - for (int i = 25816; i <= 26139; i++) - materials[i] = Material.DeepslateTileWall; - materials[25729] = Material.DeepslateTiles; - for (int i = 1968; i <= 1991; i++) - materials[i] = Material.DetectorRail; - materials[4276] = Material.DiamondBlock; - materials[4274] = Material.DiamondOre; - materials[4] = Material.Diorite; - for (int i = 14154; i <= 14159; i++) - materials[i] = Material.DioriteSlab; - for (int i = 14002; i <= 14081; i++) - materials[i] = Material.DioriteStairs; - for (int i = 18048; i <= 18371; i++) - materials[i] = Material.DioriteWall; - materials[10] = Material.Dirt; - materials[12513] = Material.DirtPath; - for (int i = 523; i <= 534; i++) - materials[i] = Material.Dispenser; - materials[7416] = Material.DragonEgg; - for (int i = 9027; i <= 9058; i++) - materials[i] = Material.DragonHead; - for (int i = 9059; i <= 9066; i++) - materials[i] = Material.DragonWallHead; - materials[12787] = Material.DriedKelpBlock; - materials[24768] = Material.DripstoneBlock; - for (int i = 9344; i <= 9355; i++) - materials[i] = Material.Dropper; - materials[7665] = Material.EmeraldBlock; - materials[7511] = Material.EmeraldOre; - materials[7389] = Material.EnchantingTable; - materials[12514] = Material.EndGateway; - materials[7406] = Material.EndPortal; - for (int i = 7407; i <= 7414; i++) - materials[i] = Material.EndPortalFrame; - for (int i = 12334; i <= 12339; i++) - materials[i] = Material.EndRod; - materials[7415] = Material.EndStone; - for (int i = 14112; i <= 14117; i++) - materials[i] = Material.EndStoneBrickSlab; - for (int i = 13362; i <= 13441; i++) - materials[i] = Material.EndStoneBrickStairs; - for (int i = 17724; i <= 18047; i++) - materials[i] = Material.EndStoneBrickWall; - materials[12494] = Material.EndStoneBricks; - for (int i = 7513; i <= 7520; i++) - materials[i] = Material.EnderChest; - materials[22950] = Material.ExposedChiseledCopper; - materials[22939] = Material.ExposedCopper; - for (int i = 24696; i <= 24699; i++) - materials[i] = Material.ExposedCopperBulb; - for (int i = 23716; i <= 23779; i++) - materials[i] = Material.ExposedCopperDoor; - for (int i = 24678; i <= 24679; i++) - materials[i] = Material.ExposedCopperGrate; - for (int i = 24228; i <= 24291; i++) - materials[i] = Material.ExposedCopperTrapdoor; - materials[22946] = Material.ExposedCutCopper; - for (int i = 23288; i <= 23293; i++) - materials[i] = Material.ExposedCutCopperSlab; - for (int i = 23116; i <= 23195; i++) - materials[i] = Material.ExposedCutCopperStairs; - for (int i = 4286; i <= 4293; i++) - materials[i] = Material.Farmland; - materials[2006] = Material.Fern; - for (int i = 2360; i <= 2871; i++) - materials[i] = Material.Fire; - for (int i = 12829; i <= 12830; i++) - materials[i] = Material.FireCoral; - materials[12811] = Material.FireCoralBlock; - for (int i = 12849; i <= 12850; i++) - materials[i] = Material.FireCoralFan; - for (int i = 12917; i <= 12924; i++) - materials[i] = Material.FireCoralWallFan; - materials[18437] = Material.FletchingTable; - materials[8567] = Material.FlowerPot; - materials[24825] = Material.FloweringAzalea; - for (int i = 489; i <= 516; i++) - materials[i] = Material.FloweringAzaleaLeaves; - materials[26572] = Material.Frogspawn; - for (int i = 12539; i <= 12542; i++) - materials[i] = Material.FrostedIce; - for (int i = 4294; i <= 4301; i++) - materials[i] = Material.Furnace; - materials[20285] = Material.GildedBlackstone; - materials[519] = Material.Glass; - for (int i = 6779; i <= 6810; i++) - materials[i] = Material.GlassPane; - for (int i = 6869; i <= 6996; i++) - materials[i] = Material.GlowLichen; - materials[5863] = Material.Glowstone; - materials[2091] = Material.GoldBlock; - materials[123] = Material.GoldOre; - materials[2] = Material.Granite; - for (int i = 14130; i <= 14135; i++) - materials[i] = Material.GraniteSlab; - for (int i = 13682; i <= 13761; i++) - materials[i] = Material.GraniteStairs; - for (int i = 15456; i <= 15779; i++) - materials[i] = Material.GraniteWall; - for (int i = 8; i <= 9; i++) - materials[i] = Material.GrassBlock; - materials[118] = Material.Gravel; - for (int i = 10871; i <= 10886; i++) - materials[i] = Material.GrayBanner; - for (int i = 1800; i <= 1815; i++) - materials[i] = Material.GrayBed; - for (int i = 20853; i <= 20868; i++) - materials[i] = Material.GrayCandle; - for (int i = 21013; i <= 21014; i++) - materials[i] = Material.GrayCandleCake; - materials[10735] = Material.GrayCarpet; - materials[12735] = Material.GrayConcrete; - materials[12751] = Material.GrayConcretePowder; - for (int i = 12692; i <= 12695; i++) - materials[i] = Material.GrayGlazedTerracotta; - for (int i = 12610; i <= 12615; i++) - materials[i] = Material.GrayShulkerBox; - materials[5952] = Material.GrayStainedGlass; - for (int i = 9596; i <= 9627; i++) - materials[i] = Material.GrayStainedGlassPane; - materials[9363] = Material.GrayTerracotta; - for (int i = 11043; i <= 11046; i++) - materials[i] = Material.GrayWallBanner; - materials[2054] = Material.GrayWool; - for (int i = 10967; i <= 10982; i++) - materials[i] = Material.GreenBanner; - for (int i = 1896; i <= 1911; i++) - materials[i] = Material.GreenBed; - for (int i = 20949; i <= 20964; i++) - materials[i] = Material.GreenCandle; - for (int i = 21025; i <= 21026; i++) - materials[i] = Material.GreenCandleCake; - materials[10741] = Material.GreenCarpet; - materials[12741] = Material.GreenConcrete; - materials[12757] = Material.GreenConcretePowder; - for (int i = 12716; i <= 12719; i++) - materials[i] = Material.GreenGlazedTerracotta; - for (int i = 12646; i <= 12651; i++) - materials[i] = Material.GreenShulkerBox; - materials[5958] = Material.GreenStainedGlass; - for (int i = 9788; i <= 9819; i++) - materials[i] = Material.GreenStainedGlassPane; - materials[9369] = Material.GreenTerracotta; - for (int i = 11067; i <= 11070; i++) - materials[i] = Material.GreenWallBanner; - materials[2060] = Material.GreenWool; - for (int i = 18438; i <= 18449; i++) - materials[i] = Material.Grindstone; - for (int i = 24900; i <= 24901; i++) - materials[i] = Material.HangingRoots; - for (int i = 10725; i <= 10727; i++) - materials[i] = Material.HayBlock; - for (int i = 26682; i <= 26683; i++) - materials[i] = Material.HeavyCore; - for (int i = 9159; i <= 9174; i++) - materials[i] = Material.HeavyWeightedPressurePlate; - materials[19445] = Material.HoneyBlock; - materials[19446] = Material.HoneycombBlock; - for (int i = 9225; i <= 9234; i++) - materials[i] = Material.Hopper; - for (int i = 12831; i <= 12832; i++) - materials[i] = Material.HornCoral; - materials[12812] = Material.HornCoralBlock; - for (int i = 12851; i <= 12852; i++) - materials[i] = Material.HornCoralFan; - for (int i = 12925; i <= 12932; i++) - materials[i] = Material.HornCoralWallFan; - materials[5780] = Material.Ice; - materials[6548] = Material.InfestedChiseledStoneBricks; - materials[6544] = Material.InfestedCobblestone; - materials[6547] = Material.InfestedCrackedStoneBricks; - for (int i = 26554; i <= 26556; i++) - materials[i] = Material.InfestedDeepslate; - materials[6546] = Material.InfestedMossyStoneBricks; - materials[6543] = Material.InfestedStone; - materials[6545] = Material.InfestedStoneBricks; - for (int i = 6741; i <= 6772; i++) - materials[i] = Material.IronBars; - materials[2092] = Material.IronBlock; - for (int i = 5652; i <= 5715; i++) - materials[i] = Material.IronDoor; - materials[125] = Material.IronOre; - for (int i = 10399; i <= 10462; i++) - materials[i] = Material.IronTrapdoor; - for (int i = 5870; i <= 5873; i++) - materials[i] = Material.JackOLantern; - for (int i = 19360; i <= 19371; i++) - materials[i] = Material.Jigsaw; - for (int i = 5815; i <= 5816; i++) - materials[i] = Material.Jukebox; - for (int i = 8683; i <= 8706; i++) - materials[i] = Material.JungleButton; - for (int i = 11950; i <= 12013; i++) - materials[i] = Material.JungleDoor; - for (int i = 11630; i <= 11661; i++) - materials[i] = Material.JungleFence; - for (int i = 11374; i <= 11405; i++) - materials[i] = Material.JungleFenceGate; - for (int i = 5154; i <= 5217; i++) - materials[i] = Material.JungleHangingSign; - for (int i = 321; i <= 348; i++) - materials[i] = Material.JungleLeaves; - for (int i = 139; i <= 141; i++) - materials[i] = Material.JungleLog; - materials[18] = Material.JunglePlanks; - for (int i = 5722; i <= 5723; i++) - materials[i] = Material.JunglePressurePlate; - for (int i = 31; i <= 32; i++) - materials[i] = Material.JungleSapling; - for (int i = 4462; i <= 4493; i++) - materials[i] = Material.JungleSign; - for (int i = 11180; i <= 11185; i++) - materials[i] = Material.JungleSlab; - for (int i = 7826; i <= 7905; i++) - materials[i] = Material.JungleStairs; - for (int i = 6153; i <= 6216; i++) - materials[i] = Material.JungleTrapdoor; - for (int i = 5578; i <= 5585; i++) - materials[i] = Material.JungleWallHangingSign; - for (int i = 4802; i <= 4809; i++) - materials[i] = Material.JungleWallSign; - for (int i = 198; i <= 200; i++) - materials[i] = Material.JungleWood; - for (int i = 12760; i <= 12785; i++) - materials[i] = Material.Kelp; - materials[12786] = Material.KelpPlant; - for (int i = 4654; i <= 4661; i++) - materials[i] = Material.Ladder; - for (int i = 18503; i <= 18506; i++) - materials[i] = Material.Lantern; - materials[522] = Material.LapisBlock; - materials[520] = Material.LapisOre; - for (int i = 21045; i <= 21056; i++) - materials[i] = Material.LargeAmethystBud; - for (int i = 10757; i <= 10758; i++) - materials[i] = Material.LargeFern; - for (int i = 96; i <= 111; i++) - materials[i] = Material.Lava; - materials[7402] = Material.LavaCauldron; - for (int i = 18450; i <= 18465; i++) - materials[i] = Material.Lectern; - for (int i = 5626; i <= 5649; i++) - materials[i] = Material.Lever; - for (int i = 10367; i <= 10398; i++) - materials[i] = Material.Light; - for (int i = 10807; i <= 10822; i++) - materials[i] = Material.LightBlueBanner; - for (int i = 1736; i <= 1751; i++) - materials[i] = Material.LightBlueBed; - for (int i = 20789; i <= 20804; i++) - materials[i] = Material.LightBlueCandle; - for (int i = 21005; i <= 21006; i++) - materials[i] = Material.LightBlueCandleCake; - materials[10731] = Material.LightBlueCarpet; - materials[12731] = Material.LightBlueConcrete; - materials[12747] = Material.LightBlueConcretePowder; - for (int i = 12676; i <= 12679; i++) - materials[i] = Material.LightBlueGlazedTerracotta; - for (int i = 12586; i <= 12591; i++) - materials[i] = Material.LightBlueShulkerBox; - materials[5948] = Material.LightBlueStainedGlass; - for (int i = 9468; i <= 9499; i++) - materials[i] = Material.LightBlueStainedGlassPane; - materials[9359] = Material.LightBlueTerracotta; - for (int i = 11027; i <= 11030; i++) - materials[i] = Material.LightBlueWallBanner; - materials[2050] = Material.LightBlueWool; - for (int i = 10887; i <= 10902; i++) - materials[i] = Material.LightGrayBanner; - for (int i = 1816; i <= 1831; i++) - materials[i] = Material.LightGrayBed; - for (int i = 20869; i <= 20884; i++) - materials[i] = Material.LightGrayCandle; - for (int i = 21015; i <= 21016; i++) - materials[i] = Material.LightGrayCandleCake; - materials[10736] = Material.LightGrayCarpet; - materials[12736] = Material.LightGrayConcrete; - materials[12752] = Material.LightGrayConcretePowder; - for (int i = 12696; i <= 12699; i++) - materials[i] = Material.LightGrayGlazedTerracotta; - for (int i = 12616; i <= 12621; i++) - materials[i] = Material.LightGrayShulkerBox; - materials[5953] = Material.LightGrayStainedGlass; - for (int i = 9628; i <= 9659; i++) - materials[i] = Material.LightGrayStainedGlassPane; - materials[9364] = Material.LightGrayTerracotta; - for (int i = 11047; i <= 11050; i++) - materials[i] = Material.LightGrayWallBanner; - materials[2055] = Material.LightGrayWool; - for (int i = 9143; i <= 9158; i++) - materials[i] = Material.LightWeightedPressurePlate; - for (int i = 24724; i <= 24747; i++) - materials[i] = Material.LightningRod; - for (int i = 10749; i <= 10750; i++) - materials[i] = Material.Lilac; - materials[2088] = Material.LilyOfTheValley; - materials[7271] = Material.LilyPad; - for (int i = 10839; i <= 10854; i++) - materials[i] = Material.LimeBanner; - for (int i = 1768; i <= 1783; i++) - materials[i] = Material.LimeBed; - for (int i = 20821; i <= 20836; i++) - materials[i] = Material.LimeCandle; - for (int i = 21009; i <= 21010; i++) - materials[i] = Material.LimeCandleCake; - materials[10733] = Material.LimeCarpet; - materials[12733] = Material.LimeConcrete; - materials[12749] = Material.LimeConcretePowder; - for (int i = 12684; i <= 12687; i++) - materials[i] = Material.LimeGlazedTerracotta; - for (int i = 12598; i <= 12603; i++) - materials[i] = Material.LimeShulkerBox; - materials[5950] = Material.LimeStainedGlass; - for (int i = 9532; i <= 9563; i++) - materials[i] = Material.LimeStainedGlassPane; - materials[9361] = Material.LimeTerracotta; - for (int i = 11035; i <= 11038; i++) - materials[i] = Material.LimeWallBanner; - materials[2052] = Material.LimeWool; - materials[19459] = Material.Lodestone; - for (int i = 18404; i <= 18407; i++) - materials[i] = Material.Loom; - for (int i = 10791; i <= 10806; i++) - materials[i] = Material.MagentaBanner; - for (int i = 1720; i <= 1735; i++) - materials[i] = Material.MagentaBed; - for (int i = 20773; i <= 20788; i++) - materials[i] = Material.MagentaCandle; - for (int i = 21003; i <= 21004; i++) - materials[i] = Material.MagentaCandleCake; - materials[10730] = Material.MagentaCarpet; - materials[12730] = Material.MagentaConcrete; - materials[12746] = Material.MagentaConcretePowder; - for (int i = 12672; i <= 12675; i++) - materials[i] = Material.MagentaGlazedTerracotta; - for (int i = 12580; i <= 12585; i++) - materials[i] = Material.MagentaShulkerBox; - materials[5947] = Material.MagentaStainedGlass; - for (int i = 9436; i <= 9467; i++) - materials[i] = Material.MagentaStainedGlassPane; - materials[9358] = Material.MagentaTerracotta; - for (int i = 11023; i <= 11026; i++) - materials[i] = Material.MagentaWallBanner; - materials[2049] = Material.MagentaWool; - materials[12543] = Material.MagmaBlock; - for (int i = 8779; i <= 8802; i++) - materials[i] = Material.MangroveButton; - for (int i = 12206; i <= 12269; i++) - materials[i] = Material.MangroveDoor; - for (int i = 11758; i <= 11789; i++) - materials[i] = Material.MangroveFence; - for (int i = 11502; i <= 11533; i++) - materials[i] = Material.MangroveFenceGate; - for (int i = 5410; i <= 5473; i++) - materials[i] = Material.MangroveHangingSign; - for (int i = 433; i <= 460; i++) - materials[i] = Material.MangroveLeaves; - for (int i = 151; i <= 153; i++) - materials[i] = Material.MangroveLog; - materials[22] = Material.MangrovePlanks; - for (int i = 5730; i <= 5731; i++) - materials[i] = Material.MangrovePressurePlate; - for (int i = 39; i <= 78; i++) - materials[i] = Material.MangrovePropagule; - for (int i = 154; i <= 155; i++) - materials[i] = Material.MangroveRoots; - for (int i = 4526; i <= 4557; i++) - materials[i] = Material.MangroveSign; - for (int i = 11204; i <= 11209; i++) - materials[i] = Material.MangroveSlab; - for (int i = 10124; i <= 10203; i++) - materials[i] = Material.MangroveStairs; - for (int i = 6409; i <= 6472; i++) - materials[i] = Material.MangroveTrapdoor; - for (int i = 5594; i <= 5601; i++) - materials[i] = Material.MangroveWallHangingSign; - for (int i = 4818; i <= 4825; i++) - materials[i] = Material.MangroveWallSign; - for (int i = 210; i <= 212; i++) - materials[i] = Material.MangroveWood; - for (int i = 21057; i <= 21068; i++) - materials[i] = Material.MediumAmethystBud; - materials[6812] = Material.Melon; - for (int i = 6829; i <= 6836; i++) - materials[i] = Material.MelonStem; - materials[24843] = Material.MossBlock; - materials[24826] = Material.MossCarpet; - materials[2353] = Material.MossyCobblestone; - for (int i = 14106; i <= 14111; i++) - materials[i] = Material.MossyCobblestoneSlab; - for (int i = 13282; i <= 13361; i++) - materials[i] = Material.MossyCobblestoneStairs; - for (int i = 8243; i <= 8566; i++) - materials[i] = Material.MossyCobblestoneWall; - for (int i = 14094; i <= 14099; i++) - materials[i] = Material.MossyStoneBrickSlab; - for (int i = 13122; i <= 13201; i++) - materials[i] = Material.MossyStoneBrickStairs; - for (int i = 15132; i <= 15455; i++) - materials[i] = Material.MossyStoneBrickWall; - materials[6538] = Material.MossyStoneBricks; - for (int i = 2063; i <= 2074; i++) - materials[i] = Material.MovingPiston; - materials[24903] = Material.Mud; - for (int i = 11270; i <= 11275; i++) - materials[i] = Material.MudBrickSlab; - for (int i = 7189; i <= 7268; i++) - materials[i] = Material.MudBrickStairs; - for (int i = 16104; i <= 16427; i++) - materials[i] = Material.MudBrickWall; - materials[6542] = Material.MudBricks; - for (int i = 156; i <= 158; i++) - materials[i] = Material.MuddyMangroveRoots; - for (int i = 6677; i <= 6740; i++) - materials[i] = Material.MushroomStem; - for (int i = 7269; i <= 7270; i++) - materials[i] = Material.Mycelium; - for (int i = 7273; i <= 7304; i++) - materials[i] = Material.NetherBrickFence; - for (int i = 11276; i <= 11281; i++) - materials[i] = Material.NetherBrickSlab; - for (int i = 7305; i <= 7384; i++) - materials[i] = Material.NetherBrickStairs; - for (int i = 16428; i <= 16751; i++) - materials[i] = Material.NetherBrickWall; - materials[7272] = Material.NetherBricks; - materials[129] = Material.NetherGoldOre; - for (int i = 5864; i <= 5865; i++) - materials[i] = Material.NetherPortal; - materials[9224] = Material.NetherQuartzOre; - materials[18595] = Material.NetherSprouts; - for (int i = 7385; i <= 7388; i++) - materials[i] = Material.NetherWart; - materials[12544] = Material.NetherWartBlock; - materials[19447] = Material.NetheriteBlock; - materials[5849] = Material.Netherrack; - for (int i = 538; i <= 1687; i++) - materials[i] = Material.NoteBlock; - for (int i = 8611; i <= 8634; i++) - materials[i] = Material.OakButton; - for (int i = 4590; i <= 4653; i++) - materials[i] = Material.OakDoor; - for (int i = 5817; i <= 5848; i++) - materials[i] = Material.OakFence; - for (int i = 6997; i <= 7028; i++) - materials[i] = Material.OakFenceGate; - for (int i = 4834; i <= 4897; i++) - materials[i] = Material.OakHangingSign; - for (int i = 237; i <= 264; i++) - materials[i] = Material.OakLeaves; - for (int i = 130; i <= 132; i++) - materials[i] = Material.OakLog; - materials[15] = Material.OakPlanks; - for (int i = 5716; i <= 5717; i++) - materials[i] = Material.OakPressurePlate; - for (int i = 25; i <= 26; i++) - materials[i] = Material.OakSapling; - for (int i = 4302; i <= 4333; i++) - materials[i] = Material.OakSign; - for (int i = 11162; i <= 11167; i++) - materials[i] = Material.OakSlab; - for (int i = 2874; i <= 2953; i++) - materials[i] = Material.OakStairs; - for (int i = 5961; i <= 6024; i++) - materials[i] = Material.OakTrapdoor; - for (int i = 5538; i <= 5545; i++) - materials[i] = Material.OakWallHangingSign; - for (int i = 4762; i <= 4769; i++) - materials[i] = Material.OakWallSign; - for (int i = 189; i <= 191; i++) - materials[i] = Material.OakWood; - for (int i = 12550; i <= 12561; i++) - materials[i] = Material.Observer; - materials[2354] = Material.Obsidian; - for (int i = 26563; i <= 26565; i++) - materials[i] = Material.OchreFroglight; - for (int i = 10775; i <= 10790; i++) - materials[i] = Material.OrangeBanner; - for (int i = 1704; i <= 1719; i++) - materials[i] = Material.OrangeBed; - for (int i = 20757; i <= 20772; i++) - materials[i] = Material.OrangeCandle; - for (int i = 21001; i <= 21002; i++) - materials[i] = Material.OrangeCandleCake; - materials[10729] = Material.OrangeCarpet; - materials[12729] = Material.OrangeConcrete; - materials[12745] = Material.OrangeConcretePowder; - for (int i = 12668; i <= 12671; i++) - materials[i] = Material.OrangeGlazedTerracotta; - for (int i = 12574; i <= 12579; i++) - materials[i] = Material.OrangeShulkerBox; - materials[5946] = Material.OrangeStainedGlass; - for (int i = 9404; i <= 9435; i++) - materials[i] = Material.OrangeStainedGlassPane; - materials[9357] = Material.OrangeTerracotta; - materials[2082] = Material.OrangeTulip; - for (int i = 11019; i <= 11022; i++) - materials[i] = Material.OrangeWallBanner; - materials[2048] = Material.OrangeWool; - materials[2085] = Material.OxeyeDaisy; - materials[22948] = Material.OxidizedChiseledCopper; - materials[22941] = Material.OxidizedCopper; - for (int i = 24704; i <= 24707; i++) - materials[i] = Material.OxidizedCopperBulb; - for (int i = 23780; i <= 23843; i++) - materials[i] = Material.OxidizedCopperDoor; - for (int i = 24682; i <= 24683; i++) - materials[i] = Material.OxidizedCopperGrate; - for (int i = 24292; i <= 24355; i++) - materials[i] = Material.OxidizedCopperTrapdoor; - materials[22944] = Material.OxidizedCutCopper; - for (int i = 23276; i <= 23281; i++) - materials[i] = Material.OxidizedCutCopperSlab; - for (int i = 22956; i <= 23035; i++) - materials[i] = Material.OxidizedCutCopperStairs; - materials[10746] = Material.PackedIce; - materials[6541] = Material.PackedMud; - for (int i = 26569; i <= 26571; i++) - materials[i] = Material.PearlescentFroglight; - for (int i = 10753; i <= 10754; i++) - materials[i] = Material.Peony; - for (int i = 11246; i <= 11251; i++) - materials[i] = Material.PetrifiedOakSlab; - for (int i = 9067; i <= 9098; i++) - materials[i] = Material.PiglinHead; - for (int i = 9099; i <= 9106; i++) - materials[i] = Material.PiglinWallHead; - for (int i = 10855; i <= 10870; i++) - materials[i] = Material.PinkBanner; - for (int i = 1784; i <= 1799; i++) - materials[i] = Material.PinkBed; - for (int i = 20837; i <= 20852; i++) - materials[i] = Material.PinkCandle; - for (int i = 21011; i <= 21012; i++) - materials[i] = Material.PinkCandleCake; - materials[10734] = Material.PinkCarpet; - materials[12734] = Material.PinkConcrete; - materials[12750] = Material.PinkConcretePowder; - for (int i = 12688; i <= 12691; i++) - materials[i] = Material.PinkGlazedTerracotta; - for (int i = 24827; i <= 24842; i++) - materials[i] = Material.PinkPetals; - for (int i = 12604; i <= 12609; i++) - materials[i] = Material.PinkShulkerBox; - materials[5951] = Material.PinkStainedGlass; - for (int i = 9564; i <= 9595; i++) - materials[i] = Material.PinkStainedGlassPane; - materials[9362] = Material.PinkTerracotta; - materials[2084] = Material.PinkTulip; - for (int i = 11039; i <= 11042; i++) - materials[i] = Material.PinkWallBanner; - materials[2053] = Material.PinkWool; - for (int i = 2011; i <= 2022; i++) - materials[i] = Material.Piston; - for (int i = 2023; i <= 2046; i++) - materials[i] = Material.PistonHead; - for (int i = 12497; i <= 12506; i++) - materials[i] = Material.PitcherCrop; - for (int i = 12507; i <= 12508; i++) - materials[i] = Material.PitcherPlant; - for (int i = 8947; i <= 8978; i++) - materials[i] = Material.PlayerHead; - for (int i = 8979; i <= 8986; i++) - materials[i] = Material.PlayerWallHead; - for (int i = 12; i <= 13; i++) - materials[i] = Material.Podzol; - for (int i = 24748; i <= 24767; i++) - materials[i] = Material.PointedDripstone; - materials[7] = Material.PolishedAndesite; - for (int i = 14148; i <= 14153; i++) - materials[i] = Material.PolishedAndesiteSlab; - for (int i = 13922; i <= 14001; i++) - materials[i] = Material.PolishedAndesiteStairs; - for (int i = 5855; i <= 5857; i++) - materials[i] = Material.PolishedBasalt; - materials[19871] = Material.PolishedBlackstone; - for (int i = 19875; i <= 19880; i++) - materials[i] = Material.PolishedBlackstoneBrickSlab; - for (int i = 19881; i <= 19960; i++) - materials[i] = Material.PolishedBlackstoneBrickStairs; - for (int i = 19961; i <= 20284; i++) - materials[i] = Material.PolishedBlackstoneBrickWall; - materials[19872] = Material.PolishedBlackstoneBricks; - for (int i = 20374; i <= 20397; i++) - materials[i] = Material.PolishedBlackstoneButton; - for (int i = 20372; i <= 20373; i++) - materials[i] = Material.PolishedBlackstonePressurePlate; - for (int i = 20366; i <= 20371; i++) - materials[i] = Material.PolishedBlackstoneSlab; - for (int i = 20286; i <= 20365; i++) - materials[i] = Material.PolishedBlackstoneStairs; - for (int i = 20398; i <= 20721; i++) - materials[i] = Material.PolishedBlackstoneWall; - materials[25318] = Material.PolishedDeepslate; - for (int i = 25399; i <= 25404; i++) - materials[i] = Material.PolishedDeepslateSlab; - for (int i = 25319; i <= 25398; i++) - materials[i] = Material.PolishedDeepslateStairs; - for (int i = 25405; i <= 25728; i++) - materials[i] = Material.PolishedDeepslateWall; - materials[5] = Material.PolishedDiorite; - for (int i = 14100; i <= 14105; i++) - materials[i] = Material.PolishedDioriteSlab; - for (int i = 13202; i <= 13281; i++) - materials[i] = Material.PolishedDioriteStairs; - materials[3] = Material.PolishedGranite; - for (int i = 14082; i <= 14087; i++) - materials[i] = Material.PolishedGraniteSlab; - for (int i = 12962; i <= 13041; i++) - materials[i] = Material.PolishedGraniteStairs; - materials[21492] = Material.PolishedTuff; - for (int i = 21493; i <= 21498; i++) - materials[i] = Material.PolishedTuffSlab; - for (int i = 21499; i <= 21578; i++) - materials[i] = Material.PolishedTuffStairs; - for (int i = 21579; i <= 21902; i++) - materials[i] = Material.PolishedTuffWall; - materials[2077] = Material.Poppy; - for (int i = 8603; i <= 8610; i++) - materials[i] = Material.Potatoes; - materials[8573] = Material.PottedAcaciaSapling; - materials[8581] = Material.PottedAllium; - materials[26561] = Material.PottedAzaleaBush; - materials[8582] = Material.PottedAzureBluet; - materials[12957] = Material.PottedBamboo; - materials[8571] = Material.PottedBirchSapling; - materials[8580] = Material.PottedBlueOrchid; - materials[8592] = Material.PottedBrownMushroom; - materials[8594] = Material.PottedCactus; - materials[8574] = Material.PottedCherrySapling; - materials[8588] = Material.PottedCornflower; - materials[19455] = Material.PottedCrimsonFungus; - materials[19457] = Material.PottedCrimsonRoots; - materials[8578] = Material.PottedDandelion; - materials[8575] = Material.PottedDarkOakSapling; - materials[8593] = Material.PottedDeadBush; - materials[8577] = Material.PottedFern; - materials[26562] = Material.PottedFloweringAzaleaBush; - materials[8572] = Material.PottedJungleSapling; - materials[8589] = Material.PottedLilyOfTheValley; - materials[8576] = Material.PottedMangrovePropagule; - materials[8569] = Material.PottedOakSapling; - materials[8584] = Material.PottedOrangeTulip; - materials[8587] = Material.PottedOxeyeDaisy; - materials[8586] = Material.PottedPinkTulip; - materials[8579] = Material.PottedPoppy; - materials[8591] = Material.PottedRedMushroom; - materials[8583] = Material.PottedRedTulip; - materials[8570] = Material.PottedSpruceSapling; - materials[8568] = Material.PottedTorchflower; - materials[19456] = Material.PottedWarpedFungus; - materials[19458] = Material.PottedWarpedRoots; - materials[8585] = Material.PottedWhiteTulip; - materials[8590] = Material.PottedWitherRose; - materials[22318] = Material.PowderSnow; - for (int i = 7403; i <= 7405; i++) - materials[i] = Material.PowderSnowCauldron; - for (int i = 1944; i <= 1967; i++) - materials[i] = Material.PoweredRail; - materials[10463] = Material.Prismarine; - for (int i = 10712; i <= 10717; i++) - materials[i] = Material.PrismarineBrickSlab; - for (int i = 10546; i <= 10625; i++) - materials[i] = Material.PrismarineBrickStairs; - materials[10464] = Material.PrismarineBricks; - for (int i = 10706; i <= 10711; i++) - materials[i] = Material.PrismarineSlab; - for (int i = 10466; i <= 10545; i++) - materials[i] = Material.PrismarineStairs; - for (int i = 14484; i <= 14807; i++) - materials[i] = Material.PrismarineWall; - materials[6811] = Material.Pumpkin; - for (int i = 6821; i <= 6828; i++) - materials[i] = Material.PumpkinStem; - for (int i = 10919; i <= 10934; i++) - materials[i] = Material.PurpleBanner; - for (int i = 1848; i <= 1863; i++) - materials[i] = Material.PurpleBed; - for (int i = 20901; i <= 20916; i++) - materials[i] = Material.PurpleCandle; - for (int i = 21019; i <= 21020; i++) - materials[i] = Material.PurpleCandleCake; - materials[10738] = Material.PurpleCarpet; - materials[12738] = Material.PurpleConcrete; - materials[12754] = Material.PurpleConcretePowder; - for (int i = 12704; i <= 12707; i++) - materials[i] = Material.PurpleGlazedTerracotta; - for (int i = 12628; i <= 12633; i++) - materials[i] = Material.PurpleShulkerBox; - materials[5955] = Material.PurpleStainedGlass; - for (int i = 9692; i <= 9723; i++) - materials[i] = Material.PurpleStainedGlassPane; - materials[9366] = Material.PurpleTerracotta; - for (int i = 11055; i <= 11058; i++) - materials[i] = Material.PurpleWallBanner; - materials[2057] = Material.PurpleWool; - materials[12410] = Material.PurpurBlock; - for (int i = 12411; i <= 12413; i++) - materials[i] = Material.PurpurPillar; - for (int i = 11300; i <= 11305; i++) - materials[i] = Material.PurpurSlab; - for (int i = 12414; i <= 12493; i++) - materials[i] = Material.PurpurStairs; - materials[9235] = Material.QuartzBlock; - materials[20724] = Material.QuartzBricks; - for (int i = 9237; i <= 9239; i++) - materials[i] = Material.QuartzPillar; - for (int i = 11282; i <= 11287; i++) - materials[i] = Material.QuartzSlab; - for (int i = 9240; i <= 9319; i++) - materials[i] = Material.QuartzStairs; - for (int i = 4662; i <= 4681; i++) - materials[i] = Material.Rail; - materials[26559] = Material.RawCopperBlock; - materials[26560] = Material.RawGoldBlock; - materials[26558] = Material.RawIronBlock; - for (int i = 10983; i <= 10998; i++) - materials[i] = Material.RedBanner; - for (int i = 1912; i <= 1927; i++) - materials[i] = Material.RedBed; - for (int i = 20965; i <= 20980; i++) - materials[i] = Material.RedCandle; - for (int i = 21027; i <= 21028; i++) - materials[i] = Material.RedCandleCake; - materials[10742] = Material.RedCarpet; - materials[12742] = Material.RedConcrete; - materials[12758] = Material.RedConcretePowder; - for (int i = 12720; i <= 12723; i++) - materials[i] = Material.RedGlazedTerracotta; - materials[2090] = Material.RedMushroom; - for (int i = 6613; i <= 6676; i++) - materials[i] = Material.RedMushroomBlock; - for (int i = 14142; i <= 14147; i++) - materials[i] = Material.RedNetherBrickSlab; - for (int i = 13842; i <= 13921; i++) - materials[i] = Material.RedNetherBrickStairs; - for (int i = 17076; i <= 17399; i++) - materials[i] = Material.RedNetherBrickWall; - materials[12545] = Material.RedNetherBricks; - materials[117] = Material.RedSand; - materials[11079] = Material.RedSandstone; - for (int i = 11288; i <= 11293; i++) - materials[i] = Material.RedSandstoneSlab; - for (int i = 11082; i <= 11161; i++) - materials[i] = Material.RedSandstoneStairs; - for (int i = 14808; i <= 15131; i++) - materials[i] = Material.RedSandstoneWall; - for (int i = 12652; i <= 12657; i++) - materials[i] = Material.RedShulkerBox; - materials[5959] = Material.RedStainedGlass; - for (int i = 9820; i <= 9851; i++) - materials[i] = Material.RedStainedGlassPane; - materials[9370] = Material.RedTerracotta; - materials[2081] = Material.RedTulip; - for (int i = 11071; i <= 11074; i++) - materials[i] = Material.RedWallBanner; - materials[2061] = Material.RedWool; - materials[9223] = Material.RedstoneBlock; - for (int i = 7417; i <= 7418; i++) - materials[i] = Material.RedstoneLamp; - for (int i = 5734; i <= 5735; i++) - materials[i] = Material.RedstoneOre; - for (int i = 5738; i <= 5739; i++) - materials[i] = Material.RedstoneTorch; - for (int i = 5740; i <= 5747; i++) - materials[i] = Material.RedstoneWallTorch; - for (int i = 2978; i <= 4273; i++) - materials[i] = Material.RedstoneWire; - materials[26573] = Material.ReinforcedDeepslate; - for (int i = 5881; i <= 5944; i++) - materials[i] = Material.Repeater; - for (int i = 12515; i <= 12526; i++) - materials[i] = Material.RepeatingCommandBlock; - for (int i = 19450; i <= 19454; i++) - materials[i] = Material.RespawnAnchor; - materials[24902] = Material.RootedDirt; - for (int i = 10751; i <= 10752; i++) - materials[i] = Material.RoseBush; - materials[112] = Material.Sand; - materials[535] = Material.Sandstone; - for (int i = 11234; i <= 11239; i++) - materials[i] = Material.SandstoneSlab; - for (int i = 7431; i <= 7510; i++) - materials[i] = Material.SandstoneStairs; - for (int i = 17400; i <= 17723; i++) - materials[i] = Material.SandstoneWall; - for (int i = 18372; i <= 18403; i++) - materials[i] = Material.Scaffolding; - materials[22799] = Material.Sculk; - for (int i = 22928; i <= 22929; i++) - materials[i] = Material.SculkCatalyst; - for (int i = 22319; i <= 22414; i++) - materials[i] = Material.SculkSensor; - for (int i = 22930; i <= 22937; i++) - materials[i] = Material.SculkShrieker; - for (int i = 22800; i <= 22927; i++) - materials[i] = Material.SculkVein; - materials[10724] = Material.SeaLantern; - for (int i = 12933; i <= 12940; i++) - materials[i] = Material.SeaPickle; - materials[2008] = Material.Seagrass; - materials[2005] = Material.ShortGrass; - materials[18610] = Material.Shroomlight; - for (int i = 12562; i <= 12567; i++) - materials[i] = Material.ShulkerBox; - for (int i = 8827; i <= 8858; i++) - materials[i] = Material.SkeletonSkull; - for (int i = 8859; i <= 8866; i++) - materials[i] = Material.SkeletonWallSkull; - materials[10364] = Material.SlimeBlock; - for (int i = 21069; i <= 21080; i++) - materials[i] = Material.SmallAmethystBud; - for (int i = 24884; i <= 24899; i++) - materials[i] = Material.SmallDripleaf; - materials[18466] = Material.SmithingTable; - for (int i = 18420; i <= 18427; i++) - materials[i] = Material.Smoker; - materials[26557] = Material.SmoothBasalt; - materials[11308] = Material.SmoothQuartz; - for (int i = 14124; i <= 14129; i++) - materials[i] = Material.SmoothQuartzSlab; - for (int i = 13602; i <= 13681; i++) - materials[i] = Material.SmoothQuartzStairs; - materials[11309] = Material.SmoothRedSandstone; - for (int i = 14088; i <= 14093; i++) - materials[i] = Material.SmoothRedSandstoneSlab; - for (int i = 13042; i <= 13121; i++) - materials[i] = Material.SmoothRedSandstoneStairs; - materials[11307] = Material.SmoothSandstone; - for (int i = 14118; i <= 14123; i++) - materials[i] = Material.SmoothSandstoneSlab; - for (int i = 13522; i <= 13601; i++) - materials[i] = Material.SmoothSandstoneStairs; - materials[11306] = Material.SmoothStone; - for (int i = 11228; i <= 11233; i++) - materials[i] = Material.SmoothStoneSlab; - for (int i = 12800; i <= 12802; i++) - materials[i] = Material.SnifferEgg; - for (int i = 5772; i <= 5779; i++) - materials[i] = Material.Snow; - materials[5781] = Material.SnowBlock; - for (int i = 18543; i <= 18574; i++) - materials[i] = Material.SoulCampfire; - materials[2872] = Material.SoulFire; - for (int i = 18507; i <= 18510; i++) - materials[i] = Material.SoulLantern; - materials[5850] = Material.SoulSand; - materials[5851] = Material.SoulSoil; - materials[5858] = Material.SoulTorch; - for (int i = 5859; i <= 5862; i++) - materials[i] = Material.SoulWallTorch; - materials[2873] = Material.Spawner; - materials[517] = Material.Sponge; - materials[24823] = Material.SporeBlossom; - for (int i = 8635; i <= 8658; i++) - materials[i] = Material.SpruceButton; - for (int i = 11822; i <= 11885; i++) - materials[i] = Material.SpruceDoor; - for (int i = 11566; i <= 11597; i++) - materials[i] = Material.SpruceFence; - for (int i = 11310; i <= 11341; i++) - materials[i] = Material.SpruceFenceGate; - for (int i = 4898; i <= 4961; i++) - materials[i] = Material.SpruceHangingSign; - for (int i = 265; i <= 292; i++) - materials[i] = Material.SpruceLeaves; - for (int i = 133; i <= 135; i++) - materials[i] = Material.SpruceLog; - materials[16] = Material.SprucePlanks; - for (int i = 5718; i <= 5719; i++) - materials[i] = Material.SprucePressurePlate; - for (int i = 27; i <= 28; i++) - materials[i] = Material.SpruceSapling; - for (int i = 4334; i <= 4365; i++) - materials[i] = Material.SpruceSign; - for (int i = 11168; i <= 11173; i++) - materials[i] = Material.SpruceSlab; - for (int i = 7666; i <= 7745; i++) - materials[i] = Material.SpruceStairs; - for (int i = 6025; i <= 6088; i++) - materials[i] = Material.SpruceTrapdoor; - for (int i = 5546; i <= 5553; i++) - materials[i] = Material.SpruceWallHangingSign; - for (int i = 4770; i <= 4777; i++) - materials[i] = Material.SpruceWallSign; - for (int i = 192; i <= 194; i++) - materials[i] = Material.SpruceWood; - for (int i = 1992; i <= 2003; i++) - materials[i] = Material.StickyPiston; - materials[1] = Material.Stone; - for (int i = 11264; i <= 11269; i++) - materials[i] = Material.StoneBrickSlab; - for (int i = 7109; i <= 7188; i++) - materials[i] = Material.StoneBrickStairs; - for (int i = 15780; i <= 16103; i++) - materials[i] = Material.StoneBrickWall; - materials[6537] = Material.StoneBricks; - for (int i = 5748; i <= 5771; i++) - materials[i] = Material.StoneButton; - for (int i = 5650; i <= 5651; i++) - materials[i] = Material.StonePressurePlate; - for (int i = 11222; i <= 11227; i++) - materials[i] = Material.StoneSlab; - for (int i = 13442; i <= 13521; i++) - materials[i] = Material.StoneStairs; - for (int i = 18467; i <= 18470; i++) - materials[i] = Material.Stonecutter; - for (int i = 171; i <= 173; i++) - materials[i] = Material.StrippedAcaciaLog; - for (int i = 225; i <= 227; i++) - materials[i] = Material.StrippedAcaciaWood; - for (int i = 186; i <= 188; i++) - materials[i] = Material.StrippedBambooBlock; - for (int i = 165; i <= 167; i++) - materials[i] = Material.StrippedBirchLog; - for (int i = 219; i <= 221; i++) - materials[i] = Material.StrippedBirchWood; - for (int i = 174; i <= 176; i++) - materials[i] = Material.StrippedCherryLog; - for (int i = 228; i <= 230; i++) - materials[i] = Material.StrippedCherryWood; - for (int i = 18605; i <= 18607; i++) - materials[i] = Material.StrippedCrimsonHyphae; - for (int i = 18599; i <= 18601; i++) - materials[i] = Material.StrippedCrimsonStem; - for (int i = 177; i <= 179; i++) - materials[i] = Material.StrippedDarkOakLog; - for (int i = 231; i <= 233; i++) - materials[i] = Material.StrippedDarkOakWood; - for (int i = 168; i <= 170; i++) - materials[i] = Material.StrippedJungleLog; - for (int i = 222; i <= 224; i++) - materials[i] = Material.StrippedJungleWood; - for (int i = 183; i <= 185; i++) - materials[i] = Material.StrippedMangroveLog; - for (int i = 234; i <= 236; i++) - materials[i] = Material.StrippedMangroveWood; - for (int i = 180; i <= 182; i++) - materials[i] = Material.StrippedOakLog; - for (int i = 213; i <= 215; i++) - materials[i] = Material.StrippedOakWood; - for (int i = 162; i <= 164; i++) - materials[i] = Material.StrippedSpruceLog; - for (int i = 216; i <= 218; i++) - materials[i] = Material.StrippedSpruceWood; - for (int i = 18588; i <= 18590; i++) - materials[i] = Material.StrippedWarpedHyphae; - for (int i = 18582; i <= 18584; i++) - materials[i] = Material.StrippedWarpedStem; - for (int i = 19356; i <= 19359; i++) - materials[i] = Material.StructureBlock; - materials[12549] = Material.StructureVoid; - for (int i = 5799; i <= 5814; i++) - materials[i] = Material.SugarCane; - for (int i = 10747; i <= 10748; i++) - materials[i] = Material.Sunflower; - for (int i = 119; i <= 122; i++) - materials[i] = Material.SuspiciousGravel; - for (int i = 113; i <= 116; i++) - materials[i] = Material.SuspiciousSand; - for (int i = 18575; i <= 18578; i++) - materials[i] = Material.SweetBerryBush; - for (int i = 10755; i <= 10756; i++) - materials[i] = Material.TallGrass; - for (int i = 2009; i <= 2010; i++) - materials[i] = Material.TallSeagrass; - for (int i = 19381; i <= 19396; i++) - materials[i] = Material.Target; - materials[10744] = Material.Terracotta; - materials[22317] = Material.TintedGlass; - for (int i = 2094; i <= 2095; i++) - materials[i] = Material.Tnt; - materials[2355] = Material.Torch; - materials[2076] = Material.Torchflower; - for (int i = 12495; i <= 12496; i++) - materials[i] = Material.TorchflowerCrop; - for (int i = 9119; i <= 9142; i++) - materials[i] = Material.TrappedChest; - for (int i = 26638; i <= 26649; i++) - materials[i] = Material.TrialSpawner; - for (int i = 7537; i <= 7664; i++) - materials[i] = Material.Tripwire; - for (int i = 7521; i <= 7536; i++) - materials[i] = Material.TripwireHook; - for (int i = 12823; i <= 12824; i++) - materials[i] = Material.TubeCoral; - materials[12808] = Material.TubeCoralBlock; - for (int i = 12843; i <= 12844; i++) - materials[i] = Material.TubeCoralFan; - for (int i = 12893; i <= 12900; i++) - materials[i] = Material.TubeCoralWallFan; - materials[21081] = Material.Tuff; - for (int i = 21905; i <= 21910; i++) - materials[i] = Material.TuffBrickSlab; - for (int i = 21911; i <= 21990; i++) - materials[i] = Material.TuffBrickStairs; - for (int i = 21991; i <= 22314; i++) - materials[i] = Material.TuffBrickWall; - materials[21904] = Material.TuffBricks; - for (int i = 21082; i <= 21087; i++) - materials[i] = Material.TuffSlab; - for (int i = 21088; i <= 21167; i++) - materials[i] = Material.TuffStairs; - for (int i = 21168; i <= 21491; i++) - materials[i] = Material.TuffWall; - for (int i = 12788; i <= 12799; i++) - materials[i] = Material.TurtleEgg; - for (int i = 18638; i <= 18663; i++) - materials[i] = Material.TwistingVines; - materials[18664] = Material.TwistingVinesPlant; - for (int i = 26650; i <= 26681; i++) - materials[i] = Material.Vault; - for (int i = 26566; i <= 26568; i++) - materials[i] = Material.VerdantFroglight; - for (int i = 6837; i <= 6868; i++) - materials[i] = Material.Vine; - materials[12958] = Material.VoidAir; - for (int i = 2356; i <= 2359; i++) - materials[i] = Material.WallTorch; - for (int i = 19124; i <= 19147; i++) - materials[i] = Material.WarpedButton; - for (int i = 19212; i <= 19275; i++) - materials[i] = Material.WarpedDoor; - for (int i = 18716; i <= 18747; i++) - materials[i] = Material.WarpedFence; - for (int i = 18908; i <= 18939; i++) - materials[i] = Material.WarpedFenceGate; - materials[18592] = Material.WarpedFungus; - for (int i = 5346; i <= 5409; i++) - materials[i] = Material.WarpedHangingSign; - for (int i = 18585; i <= 18587; i++) - materials[i] = Material.WarpedHyphae; - materials[18591] = Material.WarpedNylium; - materials[18667] = Material.WarpedPlanks; - for (int i = 18682; i <= 18683; i++) - materials[i] = Material.WarpedPressurePlate; - materials[18594] = Material.WarpedRoots; - for (int i = 19308; i <= 19339; i++) - materials[i] = Material.WarpedSign; - for (int i = 18674; i <= 18679; i++) - materials[i] = Material.WarpedSlab; - for (int i = 19020; i <= 19099; i++) - materials[i] = Material.WarpedStairs; - for (int i = 18579; i <= 18581; i++) - materials[i] = Material.WarpedStem; - for (int i = 18812; i <= 18875; i++) - materials[i] = Material.WarpedTrapdoor; - for (int i = 5610; i <= 5617; i++) - materials[i] = Material.WarpedWallHangingSign; - for (int i = 19348; i <= 19355; i++) - materials[i] = Material.WarpedWallSign; - materials[18593] = Material.WarpedWartBlock; - for (int i = 80; i <= 95; i++) - materials[i] = Material.Water; - for (int i = 7399; i <= 7401; i++) - materials[i] = Material.WaterCauldron; - materials[22955] = Material.WaxedChiseledCopper; - materials[23300] = Material.WaxedCopperBlock; - for (int i = 24708; i <= 24711; i++) - materials[i] = Material.WaxedCopperBulb; - for (int i = 23908; i <= 23971; i++) - materials[i] = Material.WaxedCopperDoor; - for (int i = 24684; i <= 24685; i++) - materials[i] = Material.WaxedCopperGrate; - for (int i = 24420; i <= 24483; i++) - materials[i] = Material.WaxedCopperTrapdoor; - materials[23307] = Material.WaxedCutCopper; - for (int i = 23646; i <= 23651; i++) - materials[i] = Material.WaxedCutCopperSlab; - for (int i = 23548; i <= 23627; i++) - materials[i] = Material.WaxedCutCopperStairs; - materials[22954] = Material.WaxedExposedChiseledCopper; - materials[23302] = Material.WaxedExposedCopper; - for (int i = 24712; i <= 24715; i++) - materials[i] = Material.WaxedExposedCopperBulb; - for (int i = 23972; i <= 24035; i++) - materials[i] = Material.WaxedExposedCopperDoor; - for (int i = 24686; i <= 24687; i++) - materials[i] = Material.WaxedExposedCopperGrate; - for (int i = 24484; i <= 24547; i++) - materials[i] = Material.WaxedExposedCopperTrapdoor; - materials[23306] = Material.WaxedExposedCutCopper; - for (int i = 23640; i <= 23645; i++) - materials[i] = Material.WaxedExposedCutCopperSlab; - for (int i = 23468; i <= 23547; i++) - materials[i] = Material.WaxedExposedCutCopperStairs; - materials[22952] = Material.WaxedOxidizedChiseledCopper; - materials[23303] = Material.WaxedOxidizedCopper; - for (int i = 24720; i <= 24723; i++) - materials[i] = Material.WaxedOxidizedCopperBulb; - for (int i = 24036; i <= 24099; i++) - materials[i] = Material.WaxedOxidizedCopperDoor; - for (int i = 24690; i <= 24691; i++) - materials[i] = Material.WaxedOxidizedCopperGrate; - for (int i = 24548; i <= 24611; i++) - materials[i] = Material.WaxedOxidizedCopperTrapdoor; - materials[23304] = Material.WaxedOxidizedCutCopper; - for (int i = 23628; i <= 23633; i++) - materials[i] = Material.WaxedOxidizedCutCopperSlab; - for (int i = 23308; i <= 23387; i++) - materials[i] = Material.WaxedOxidizedCutCopperStairs; - materials[22953] = Material.WaxedWeatheredChiseledCopper; - materials[23301] = Material.WaxedWeatheredCopper; - for (int i = 24716; i <= 24719; i++) - materials[i] = Material.WaxedWeatheredCopperBulb; - for (int i = 24100; i <= 24163; i++) - materials[i] = Material.WaxedWeatheredCopperDoor; - for (int i = 24688; i <= 24689; i++) - materials[i] = Material.WaxedWeatheredCopperGrate; - for (int i = 24612; i <= 24675; i++) - materials[i] = Material.WaxedWeatheredCopperTrapdoor; - materials[23305] = Material.WaxedWeatheredCutCopper; - for (int i = 23634; i <= 23639; i++) - materials[i] = Material.WaxedWeatheredCutCopperSlab; - for (int i = 23388; i <= 23467; i++) - materials[i] = Material.WaxedWeatheredCutCopperStairs; - materials[22949] = Material.WeatheredChiseledCopper; - materials[22940] = Material.WeatheredCopper; - for (int i = 24700; i <= 24703; i++) - materials[i] = Material.WeatheredCopperBulb; - for (int i = 23844; i <= 23907; i++) - materials[i] = Material.WeatheredCopperDoor; - for (int i = 24680; i <= 24681; i++) - materials[i] = Material.WeatheredCopperGrate; - for (int i = 24356; i <= 24419; i++) - materials[i] = Material.WeatheredCopperTrapdoor; - materials[22945] = Material.WeatheredCutCopper; - for (int i = 23282; i <= 23287; i++) - materials[i] = Material.WeatheredCutCopperSlab; - for (int i = 23036; i <= 23115; i++) - materials[i] = Material.WeatheredCutCopperStairs; - for (int i = 18611; i <= 18636; i++) - materials[i] = Material.WeepingVines; - materials[18637] = Material.WeepingVinesPlant; - materials[518] = Material.WetSponge; - for (int i = 4278; i <= 4285; i++) - materials[i] = Material.Wheat; - for (int i = 10759; i <= 10774; i++) - materials[i] = Material.WhiteBanner; - for (int i = 1688; i <= 1703; i++) - materials[i] = Material.WhiteBed; - for (int i = 20741; i <= 20756; i++) - materials[i] = Material.WhiteCandle; - for (int i = 20999; i <= 21000; i++) - materials[i] = Material.WhiteCandleCake; - materials[10728] = Material.WhiteCarpet; - materials[12728] = Material.WhiteConcrete; - materials[12744] = Material.WhiteConcretePowder; - for (int i = 12664; i <= 12667; i++) - materials[i] = Material.WhiteGlazedTerracotta; - for (int i = 12568; i <= 12573; i++) - materials[i] = Material.WhiteShulkerBox; - materials[5945] = Material.WhiteStainedGlass; - for (int i = 9372; i <= 9403; i++) - materials[i] = Material.WhiteStainedGlassPane; - materials[9356] = Material.WhiteTerracotta; - materials[2083] = Material.WhiteTulip; - for (int i = 11015; i <= 11018; i++) - materials[i] = Material.WhiteWallBanner; - materials[2047] = Material.WhiteWool; - materials[2087] = Material.WitherRose; - for (int i = 8867; i <= 8898; i++) - materials[i] = Material.WitherSkeletonSkull; - for (int i = 8899; i <= 8906; i++) - materials[i] = Material.WitherSkeletonWallSkull; - for (int i = 10823; i <= 10838; i++) - materials[i] = Material.YellowBanner; - for (int i = 1752; i <= 1767; i++) - materials[i] = Material.YellowBed; - for (int i = 20805; i <= 20820; i++) - materials[i] = Material.YellowCandle; - for (int i = 21007; i <= 21008; i++) - materials[i] = Material.YellowCandleCake; - materials[10732] = Material.YellowCarpet; - materials[12732] = Material.YellowConcrete; - materials[12748] = Material.YellowConcretePowder; - for (int i = 12680; i <= 12683; i++) - materials[i] = Material.YellowGlazedTerracotta; - for (int i = 12592; i <= 12597; i++) - materials[i] = Material.YellowShulkerBox; - materials[5949] = Material.YellowStainedGlass; - for (int i = 9500; i <= 9531; i++) - materials[i] = Material.YellowStainedGlassPane; - materials[9360] = Material.YellowTerracotta; - for (int i = 11031; i <= 11034; i++) - materials[i] = Material.YellowWallBanner; - materials[2051] = Material.YellowWool; - for (int i = 8907; i <= 8938; i++) - materials[i] = Material.ZombieHead; - for (int i = 8939; i <= 8946; i++) - materials[i] = Material.ZombieWallHead; - } - - // - private static readonly BlockStateDefinition[] stateDefinitions = - [ - new(8, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(12, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(25, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(27, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(29, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(31, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(33, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(35, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(37, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(39, 40, - [ - new("age", ["0", "1", "2", "3", "4"], 8), - new("hanging", ["true", "false"], 4), - new("stage", ["0", "1"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(80, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(96, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(113, 4, - [ - new("dusted", ["0", "1", "2", "3"], 1) - ]), - new(119, 4, - [ - new("dusted", ["0", "1", "2", "3"], 1) - ]), - new(130, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(133, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(136, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(139, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(142, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(145, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(148, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(151, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(154, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(156, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(159, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(162, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(165, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(168, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(171, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(174, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(177, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(180, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(183, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(186, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(189, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(192, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(195, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(198, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(201, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(204, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(207, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(210, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(213, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(216, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(219, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(222, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(225, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(228, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(231, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(234, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(237, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(265, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(293, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(321, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(349, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(377, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(405, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(433, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(461, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(489, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(523, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(538, 1150, - [ - new("instrument", ["harp", "basedrum", "snare", "hat", "bass", "flute", "bell", "guitar", "chime", "xylophone", "iron_xylophone", "cow_bell", "didgeridoo", "bit", "banjo", "pling", "zombie", "skeleton", "creeper", "dragon", "wither_skeleton", "piglin", "custom_head"], 50), - new("note", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"], 2), - new("powered", ["true", "false"], 1) - ]), - new(1688, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1704, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1720, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1736, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1752, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1768, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1784, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1800, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1816, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1832, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1848, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1864, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1880, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1896, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1912, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1928, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1944, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(1968, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(1992, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(2009, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(2011, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(2023, 24, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("short", ["true", "false"], 2) - ]), - new(2063, 12, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 2) - ]), - new(2094, 2, - [ - new("unstable", ["true", "false"], 1) - ]), - new(2097, 256, - [ - new("facing", ["north", "south", "west", "east"], 64), - new("slot_0_occupied", ["true", "false"], 32), - new("slot_1_occupied", ["true", "false"], 16), - new("slot_2_occupied", ["true", "false"], 8), - new("slot_3_occupied", ["true", "false"], 4), - new("slot_4_occupied", ["true", "false"], 2), - new("slot_5_occupied", ["true", "false"], 1) - ]), - new(2356, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(2360, 512, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(2874, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2954, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(2978, 1296, - [ - new("east", ["up", "side", "none"], 432), - new("north", ["up", "side", "none"], 144), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 9), - new("south", ["up", "side", "none"], 3), - new("west", ["up", "side", "none"], 1) - ]), - new(4278, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4286, 8, - [ - new("moisture", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4294, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(4302, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4334, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4366, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4398, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4430, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4462, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4494, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4526, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4558, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4590, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(4654, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4662, 20, - [ - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south", "south_east", "south_west", "north_west", "north_east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4682, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4762, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4770, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4778, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4786, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4794, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4802, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4810, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4818, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4826, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4834, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4898, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4962, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5026, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5090, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5154, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5218, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5282, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5346, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5410, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5474, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5538, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5546, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5554, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5562, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5570, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5578, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5586, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5594, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5602, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5610, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5618, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5626, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5650, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5652, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5716, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5718, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5720, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5722, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5724, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5726, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5728, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5730, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5732, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5734, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5736, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5738, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5740, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(5748, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5772, 8, - [ - new("layers", ["1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(5782, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5799, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5815, 2, - [ - new("has_record", ["true", "false"], 1) - ]), - new(5817, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(5852, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(5855, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(5859, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5864, 2, - [ - new("axis", ["x", "z"], 1) - ]), - new(5866, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5870, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(5874, 7, - [ - new("bites", ["0", "1", "2", "3", "4", "5", "6"], 1) - ]), - new(5881, 64, - [ - new("delay", ["1", "2", "3", "4"], 16), - new("facing", ["north", "south", "west", "east"], 4), - new("locked", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5961, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6025, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6089, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6153, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6217, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6281, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6345, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6409, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6473, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6549, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6613, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6677, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6741, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6773, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6779, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6813, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6817, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6821, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(6829, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(6837, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6869, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6997, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7029, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7109, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7189, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7269, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(7273, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7305, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7385, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(7390, 8, - [ - new("has_bottle_0", ["true", "false"], 4), - new("has_bottle_1", ["true", "false"], 2), - new("has_bottle_2", ["true", "false"], 1) - ]), - new(7399, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(7403, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(7407, 8, - [ - new("eye", ["true", "false"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7417, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(7419, 12, - [ - new("age", ["0", "1", "2"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7431, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7513, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7521, 16, - [ - new("attached", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7537, 128, - [ - new("attached", ["true", "false"], 64), - new("disarmed", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("powered", ["true", "false"], 4), - new("south", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7666, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7746, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7826, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7906, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(7919, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(8243, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(8595, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(8603, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(8611, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8635, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8659, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8683, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8707, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8731, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8755, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8779, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8803, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8827, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8859, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8867, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8899, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8907, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8939, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8947, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(8979, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8987, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9019, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9027, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9059, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9067, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9099, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9107, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9111, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9115, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9119, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(9143, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9159, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9175, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("mode", ["compare", "subtract"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9191, 32, - [ - new("inverted", ["true", "false"], 16), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9225, 10, - [ - new("enabled", ["true", "false"], 5), - new("facing", ["down", "north", "south", "west", "east"], 1) - ]), - new(9237, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(9240, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9320, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9344, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(9372, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9404, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9436, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9468, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9500, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9532, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9564, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9596, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9628, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9660, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9692, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9724, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9756, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9788, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9820, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9852, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9884, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9964, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10044, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10124, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10204, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10284, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10365, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10367, 32, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10399, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10466, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10546, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10626, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10706, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10712, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10718, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10725, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(10747, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10749, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10751, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10753, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10755, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10757, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(10759, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10775, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10791, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10807, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10823, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10839, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10855, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10871, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10887, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10903, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10919, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10935, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10951, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10967, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10983, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10999, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11015, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11019, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11023, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11027, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11031, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11035, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11039, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11043, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11047, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11051, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11055, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11059, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11063, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11067, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11071, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11075, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11082, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11162, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11168, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11174, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11180, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11186, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11192, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11198, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11204, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11210, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11216, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11222, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11228, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11234, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11240, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11246, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11252, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11258, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11264, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11270, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11276, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11282, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11288, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11294, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11300, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11310, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11342, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11374, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11406, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11438, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11470, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11502, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11534, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11566, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11598, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11630, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11662, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11694, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11726, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11758, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11790, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11822, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11886, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11950, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12014, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12078, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12142, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12206, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12270, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12334, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12340, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12404, 6, - [ - new("age", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(12411, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(12414, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12495, 2, - [ - new("age", ["0", "1"], 1) - ]), - new(12497, 10, - [ - new("age", ["0", "1", "2", "3", "4"], 2), - new("half", ["upper", "lower"], 1) - ]), - new(12507, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(12509, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(12515, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12527, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12539, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(12546, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(12550, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12562, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12568, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12574, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12580, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12586, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12592, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12598, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12604, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12610, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12616, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12622, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12628, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12634, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12640, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12646, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12652, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12658, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12664, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12668, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12672, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12676, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12680, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12684, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12688, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12692, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12696, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12700, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12704, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12708, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12712, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12716, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12720, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12724, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12760, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(12788, 12, - [ - new("eggs", ["1", "2", "3", "4"], 3), - new("hatch", ["0", "1", "2"], 1) - ]), - new(12800, 3, - [ - new("hatch", ["0", "1", "2"], 1) - ]), - new(12813, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12815, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12817, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12819, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12821, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12823, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12825, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12827, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12829, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12831, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12833, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12835, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12837, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12839, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12841, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12843, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12845, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12847, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12849, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12851, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12853, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12861, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12869, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12877, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12885, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12893, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12901, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12909, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12917, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12925, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12933, 8, - [ - new("pickles", ["1", "2", "3", "4"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12942, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12945, 12, - [ - new("age", ["0", "1"], 6), - new("leaves", ["none", "small", "large"], 2), - new("stage", ["0", "1"], 1) - ]), - new(12960, 2, - [ - new("drag", ["true", "false"], 1) - ]), - new(12962, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13042, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13122, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13202, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13282, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13362, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13442, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13522, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13602, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13682, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13762, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13842, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13922, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14002, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14082, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14088, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14094, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14100, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14106, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14112, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14118, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14124, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14130, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14136, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14142, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14148, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14154, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14160, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14484, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14808, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15132, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15456, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15780, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16104, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16428, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16752, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17076, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17400, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17724, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18048, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18372, 32, - [ - new("bottom", ["true", "false"], 16), - new("distance", ["0", "1", "2", "3", "4", "5", "6", "7"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18404, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(18408, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("open", ["true", "false"], 1) - ]), - new(18420, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(18428, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(18438, 12, - [ - new("face", ["floor", "wall", "ceiling"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(18450, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("has_book", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18467, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(18471, 32, - [ - new("attachment", ["floor", "ceiling", "single_wall", "double_wall"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18503, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18507, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18511, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18543, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18575, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(18579, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18582, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18585, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18588, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18596, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18599, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18602, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18605, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(18611, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(18638, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(18668, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18674, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18680, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(18682, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(18684, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(18716, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(18748, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18812, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18876, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18908, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18940, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19020, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19100, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19124, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19148, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19212, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19276, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19308, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19340, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19348, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19356, 4, - [ - new("mode", ["save", "load", "corner", "data"], 1) - ]), - new(19360, 12, - [ - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 1) - ]), - new(19372, 9, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(19381, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(19397, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(19421, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(19450, 5, - [ - new("charges", ["0", "1", "2", "3", "4"], 1) - ]), - new(19461, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19541, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19865, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19875, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19881, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19961, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20286, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20366, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20372, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(20374, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20398, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20725, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20741, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20757, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20773, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20789, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20805, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20821, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20837, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20853, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20869, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20885, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20901, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20917, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20933, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20949, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20965, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20981, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20997, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(20999, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21001, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21003, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21005, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21007, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21009, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21011, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21013, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21015, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21017, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21019, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21021, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21023, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21025, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21027, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21029, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21033, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21045, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21057, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21069, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21082, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21088, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21168, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(21493, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21499, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21579, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(21905, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21911, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21991, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(22319, 96, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22415, 384, - [ - new("facing", ["north", "south", "west", "east"], 96), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22800, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(22928, 2, - [ - new("bloom", ["true", "false"], 1) - ]), - new(22930, 8, - [ - new("can_summon", ["true", "false"], 4), - new("shrieking", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22956, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23036, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23116, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23196, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23276, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23282, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23288, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23294, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23308, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23388, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23468, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23548, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23628, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23634, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23640, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23646, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23652, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(23716, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(23780, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(23844, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(23908, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(23972, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24036, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24100, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24164, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24228, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24292, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24356, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24420, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24484, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24548, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24612, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24676, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(24678, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(24680, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(24682, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(24684, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(24686, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(24688, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(24690, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(24692, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24696, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24700, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24704, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24708, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24712, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24716, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24720, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24724, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24748, 20, - [ - new("thickness", ["tip_merge", "tip", "frustum", "middle", "base"], 4), - new("vertical_direction", ["up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24769, 52, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 2), - new("berries", ["true", "false"], 1) - ]), - new(24821, 2, - [ - new("berries", ["true", "false"], 1) - ]), - new(24827, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("flower_amount", ["1", "2", "3", "4"], 1) - ]), - new(24844, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("tilt", ["none", "unstable", "partial", "full"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24876, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24884, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("half", ["upper", "lower"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24900, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(24904, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(24908, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24988, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24994, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(25319, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25399, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25405, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(25730, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25810, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25816, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(26141, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26221, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26227, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(26554, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(26563, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(26566, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(26569, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(26574, 16, - [ - new("cracked", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26590, 48, - [ - new("crafting", ["true", "false"], 24), - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(26638, 12, - [ - new("ominous", ["true", "false"], 6), - new("trial_spawner_state", ["inactive", "waiting_for_players", "active", "waiting_for_reward_ejection", "ejecting_reward", "cooldown"], 1) - ]), - new(26650, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("ominous", ["true", "false"], 4), - new("vault_state", ["inactive", "active", "unlocking", "ejecting"], 1) - ]), - new(26682, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - ]; - // - - protected override Dictionary GetDict() - { - return materials; - } - - protected override BlockStateDefinition[] GetStateDefinitions() - { - return stateDefinitions; - } - } -} diff --git a/MinecraftClient/Mapping/BlockPalettes/Palette1212.cs b/MinecraftClient/Mapping/BlockPalettes/Palette1212.cs deleted file mode 100644 index c00043da49..0000000000 --- a/MinecraftClient/Mapping/BlockPalettes/Palette1212.cs +++ /dev/null @@ -1,5715 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.BlockPalettes -{ - public class Palette1212 : BlockPalette - { - private static readonly Dictionary materials = new(); - - static Palette1212() - { - for (int i = 8938; i <= 8961; i++) - materials[i] = Material.AcaciaButton; - for (int i = 12419; i <= 12482; i++) - materials[i] = Material.AcaciaDoor; - for (int i = 12035; i <= 12066; i++) - materials[i] = Material.AcaciaFence; - for (int i = 11747; i <= 11778; i++) - materials[i] = Material.AcaciaFenceGate; - for (int i = 5118; i <= 5181; i++) - materials[i] = Material.AcaciaHangingSign; - for (int i = 364; i <= 391; i++) - materials[i] = Material.AcaciaLeaves; - for (int i = 148; i <= 150; i++) - materials[i] = Material.AcaciaLog; - materials[19] = Material.AcaciaPlanks; - for (int i = 5888; i <= 5889; i++) - materials[i] = Material.AcaciaPressurePlate; - for (int i = 37; i <= 38; i++) - materials[i] = Material.AcaciaSapling; - for (int i = 4450; i <= 4481; i++) - materials[i] = Material.AcaciaSign; - for (int i = 11521; i <= 11526; i++) - materials[i] = Material.AcaciaSlab; - for (int i = 10139; i <= 10218; i++) - materials[i] = Material.AcaciaStairs; - for (int i = 6383; i <= 6446; i++) - materials[i] = Material.AcaciaTrapdoor; - for (int i = 5718; i <= 5725; i++) - materials[i] = Material.AcaciaWallHangingSign; - for (int i = 4870; i <= 4877; i++) - materials[i] = Material.AcaciaWallSign; - for (int i = 213; i <= 215; i++) - materials[i] = Material.AcaciaWood; - for (int i = 9575; i <= 9598; i++) - materials[i] = Material.ActivatorRail; - materials[0] = Material.Air; - materials[2122] = Material.Allium; - materials[21500] = Material.AmethystBlock; - for (int i = 21502; i <= 21513; i++) - materials[i] = Material.AmethystCluster; - materials[19917] = Material.AncientDebris; - materials[6] = Material.Andesite; - for (int i = 14605; i <= 14610; i++) - materials[i] = Material.AndesiteSlab; - for (int i = 14231; i <= 14310; i++) - materials[i] = Material.AndesiteStairs; - for (int i = 17221; i <= 17544; i++) - materials[i] = Material.AndesiteWall; - for (int i = 9362; i <= 9365; i++) - materials[i] = Material.Anvil; - for (int i = 7047; i <= 7050; i++) - materials[i] = Material.AttachedMelonStem; - for (int i = 7043; i <= 7046; i++) - materials[i] = Material.AttachedPumpkinStem; - materials[25293] = Material.Azalea; - for (int i = 504; i <= 531; i++) - materials[i] = Material.AzaleaLeaves; - materials[2123] = Material.AzureBluet; - for (int i = 13414; i <= 13425; i++) - materials[i] = Material.Bamboo; - for (int i = 168; i <= 170; i++) - materials[i] = Material.BambooBlock; - for (int i = 9058; i <= 9081; i++) - materials[i] = Material.BambooButton; - for (int i = 12739; i <= 12802; i++) - materials[i] = Material.BambooDoor; - for (int i = 12195; i <= 12226; i++) - materials[i] = Material.BambooFence; - for (int i = 11907; i <= 11938; i++) - materials[i] = Material.BambooFenceGate; - for (int i = 5630; i <= 5693; i++) - materials[i] = Material.BambooHangingSign; - materials[28] = Material.BambooMosaic; - for (int i = 11557; i <= 11562; i++) - materials[i] = Material.BambooMosaicSlab; - for (int i = 10619; i <= 10698; i++) - materials[i] = Material.BambooMosaicStairs; - materials[27] = Material.BambooPlanks; - for (int i = 5898; i <= 5899; i++) - materials[i] = Material.BambooPressurePlate; - materials[13413] = Material.BambooSapling; - for (int i = 4642; i <= 4673; i++) - materials[i] = Material.BambooSign; - for (int i = 11551; i <= 11556; i++) - materials[i] = Material.BambooSlab; - for (int i = 10539; i <= 10618; i++) - materials[i] = Material.BambooStairs; - for (int i = 6703; i <= 6766; i++) - materials[i] = Material.BambooTrapdoor; - for (int i = 5782; i <= 5789; i++) - materials[i] = Material.BambooWallHangingSign; - for (int i = 4918; i <= 4925; i++) - materials[i] = Material.BambooWallSign; - for (int i = 18877; i <= 18888; i++) - materials[i] = Material.Barrel; - for (int i = 10700; i <= 10701; i++) - materials[i] = Material.Barrier; - for (int i = 6018; i <= 6020; i++) - materials[i] = Material.Basalt; - materials[8148] = Material.Beacon; - materials[85] = Material.Bedrock; - for (int i = 19866; i <= 19889; i++) - materials[i] = Material.BeeNest; - for (int i = 19890; i <= 19913; i++) - materials[i] = Material.Beehive; - for (int i = 12978; i <= 12981; i++) - materials[i] = Material.Beetroots; - for (int i = 18940; i <= 18971; i++) - materials[i] = Material.Bell; - for (int i = 25313; i <= 25344; i++) - materials[i] = Material.BigDripleaf; - for (int i = 25345; i <= 25352; i++) - materials[i] = Material.BigDripleafStem; - for (int i = 8890; i <= 8913; i++) - materials[i] = Material.BirchButton; - for (int i = 12291; i <= 12354; i++) - materials[i] = Material.BirchDoor; - for (int i = 11971; i <= 12002; i++) - materials[i] = Material.BirchFence; - for (int i = 11683; i <= 11714; i++) - materials[i] = Material.BirchFenceGate; - for (int i = 5054; i <= 5117; i++) - materials[i] = Material.BirchHangingSign; - for (int i = 308; i <= 335; i++) - materials[i] = Material.BirchLeaves; - for (int i = 142; i <= 144; i++) - materials[i] = Material.BirchLog; - materials[17] = Material.BirchPlanks; - for (int i = 5884; i <= 5885; i++) - materials[i] = Material.BirchPressurePlate; - for (int i = 33; i <= 34; i++) - materials[i] = Material.BirchSapling; - for (int i = 4418; i <= 4449; i++) - materials[i] = Material.BirchSign; - for (int i = 11509; i <= 11514; i++) - materials[i] = Material.BirchSlab; - for (int i = 7976; i <= 8055; i++) - materials[i] = Material.BirchStairs; - for (int i = 6255; i <= 6318; i++) - materials[i] = Material.BirchTrapdoor; - for (int i = 5710; i <= 5717; i++) - materials[i] = Material.BirchWallHangingSign; - for (int i = 4862; i <= 4869; i++) - materials[i] = Material.BirchWallSign; - for (int i = 207; i <= 209; i++) - materials[i] = Material.BirchWood; - for (int i = 11334; i <= 11349; i++) - materials[i] = Material.BlackBanner; - for (int i = 1971; i <= 1986; i++) - materials[i] = Material.BlackBed; - for (int i = 21450; i <= 21465; i++) - materials[i] = Material.BlackCandle; - for (int i = 21498; i <= 21499; i++) - materials[i] = Material.BlackCandleCake; - materials[11078] = Material.BlackCarpet; - materials[13212] = Material.BlackConcrete; - materials[13228] = Material.BlackConcretePowder; - for (int i = 13193; i <= 13196; i++) - materials[i] = Material.BlackGlazedTerracotta; - for (int i = 13127; i <= 13132; i++) - materials[i] = Material.BlackShulkerBox; - materials[6126] = Material.BlackStainedGlass; - for (int i = 10107; i <= 10138; i++) - materials[i] = Material.BlackStainedGlassPane; - materials[9626] = Material.BlackTerracotta; - for (int i = 11410; i <= 11413; i++) - materials[i] = Material.BlackWallBanner; - materials[2105] = Material.BlackWool; - materials[19929] = Material.Blackstone; - for (int i = 20334; i <= 20339; i++) - materials[i] = Material.BlackstoneSlab; - for (int i = 19930; i <= 20009; i++) - materials[i] = Material.BlackstoneStairs; - for (int i = 20010; i <= 20333; i++) - materials[i] = Material.BlackstoneWall; - for (int i = 18897; i <= 18904; i++) - materials[i] = Material.BlastFurnace; - for (int i = 11270; i <= 11285; i++) - materials[i] = Material.BlueBanner; - for (int i = 1907; i <= 1922; i++) - materials[i] = Material.BlueBed; - for (int i = 21386; i <= 21401; i++) - materials[i] = Material.BlueCandle; - for (int i = 21490; i <= 21491; i++) - materials[i] = Material.BlueCandleCake; - materials[11074] = Material.BlueCarpet; - materials[13208] = Material.BlueConcrete; - materials[13224] = Material.BlueConcretePowder; - for (int i = 13177; i <= 13180; i++) - materials[i] = Material.BlueGlazedTerracotta; - materials[13410] = Material.BlueIce; - materials[2121] = Material.BlueOrchid; - for (int i = 13103; i <= 13108; i++) - materials[i] = Material.BlueShulkerBox; - materials[6122] = Material.BlueStainedGlass; - for (int i = 9979; i <= 10010; i++) - materials[i] = Material.BlueStainedGlassPane; - materials[9622] = Material.BlueTerracotta; - for (int i = 11394; i <= 11397; i++) - materials[i] = Material.BlueWallBanner; - materials[2101] = Material.BlueWool; - for (int i = 13015; i <= 13017; i++) - materials[i] = Material.BoneBlock; - materials[2139] = Material.Bookshelf; - for (int i = 13294; i <= 13295; i++) - materials[i] = Material.BrainCoral; - materials[13278] = Material.BrainCoralBlock; - for (int i = 13314; i <= 13315; i++) - materials[i] = Material.BrainCoralFan; - for (int i = 13370; i <= 13377; i++) - materials[i] = Material.BrainCoralWallFan; - for (int i = 7620; i <= 7627; i++) - materials[i] = Material.BrewingStand; - for (int i = 11599; i <= 11604; i++) - materials[i] = Material.BrickSlab; - for (int i = 7259; i <= 7338; i++) - materials[i] = Material.BrickStairs; - for (int i = 14629; i <= 14952; i++) - materials[i] = Material.BrickWall; - materials[2136] = Material.Bricks; - for (int i = 11286; i <= 11301; i++) - materials[i] = Material.BrownBanner; - for (int i = 1923; i <= 1938; i++) - materials[i] = Material.BrownBed; - for (int i = 21402; i <= 21417; i++) - materials[i] = Material.BrownCandle; - for (int i = 21492; i <= 21493; i++) - materials[i] = Material.BrownCandleCake; - materials[11075] = Material.BrownCarpet; - materials[13209] = Material.BrownConcrete; - materials[13225] = Material.BrownConcretePowder; - for (int i = 13181; i <= 13184; i++) - materials[i] = Material.BrownGlazedTerracotta; - materials[2132] = Material.BrownMushroom; - for (int i = 6779; i <= 6842; i++) - materials[i] = Material.BrownMushroomBlock; - for (int i = 13109; i <= 13114; i++) - materials[i] = Material.BrownShulkerBox; - materials[6123] = Material.BrownStainedGlass; - for (int i = 10011; i <= 10042; i++) - materials[i] = Material.BrownStainedGlassPane; - materials[9623] = Material.BrownTerracotta; - for (int i = 11398; i <= 11401; i++) - materials[i] = Material.BrownWallBanner; - materials[2102] = Material.BrownWool; - for (int i = 13429; i <= 13430; i++) - materials[i] = Material.BubbleColumn; - for (int i = 13296; i <= 13297; i++) - materials[i] = Material.BubbleCoral; - materials[13279] = Material.BubbleCoralBlock; - for (int i = 13316; i <= 13317; i++) - materials[i] = Material.BubbleCoralFan; - for (int i = 13378; i <= 13385; i++) - materials[i] = Material.BubbleCoralWallFan; - materials[21501] = Material.BuddingAmethyst; - for (int i = 5948; i <= 5963; i++) - materials[i] = Material.Cactus; - for (int i = 6040; i <= 6046; i++) - materials[i] = Material.Cake; - materials[22785] = Material.Calcite; - for (int i = 22884; i <= 23267; i++) - materials[i] = Material.CalibratedSculkSensor; - for (int i = 18980; i <= 19011; i++) - materials[i] = Material.Campfire; - for (int i = 21194; i <= 21209; i++) - materials[i] = Material.Candle; - for (int i = 21466; i <= 21467; i++) - materials[i] = Material.CandleCake; - for (int i = 8826; i <= 8833; i++) - materials[i] = Material.Carrots; - materials[18905] = Material.CartographyTable; - for (int i = 6032; i <= 6035; i++) - materials[i] = Material.CarvedPumpkin; - materials[7628] = Material.Cauldron; - materials[13428] = Material.CaveAir; - for (int i = 25238; i <= 25289; i++) - materials[i] = Material.CaveVines; - for (int i = 25290; i <= 25291; i++) - materials[i] = Material.CaveVinesPlant; - for (int i = 7003; i <= 7008; i++) - materials[i] = Material.Chain; - for (int i = 12996; i <= 13007; i++) - materials[i] = Material.ChainCommandBlock; - for (int i = 8962; i <= 8985; i++) - materials[i] = Material.CherryButton; - for (int i = 12483; i <= 12546; i++) - materials[i] = Material.CherryDoor; - for (int i = 12067; i <= 12098; i++) - materials[i] = Material.CherryFence; - for (int i = 11779; i <= 11810; i++) - materials[i] = Material.CherryFenceGate; - for (int i = 5182; i <= 5245; i++) - materials[i] = Material.CherryHangingSign; - for (int i = 392; i <= 419; i++) - materials[i] = Material.CherryLeaves; - for (int i = 151; i <= 153; i++) - materials[i] = Material.CherryLog; - materials[20] = Material.CherryPlanks; - for (int i = 5890; i <= 5891; i++) - materials[i] = Material.CherryPressurePlate; - for (int i = 39; i <= 40; i++) - materials[i] = Material.CherrySapling; - for (int i = 4482; i <= 4513; i++) - materials[i] = Material.CherrySign; - for (int i = 11527; i <= 11532; i++) - materials[i] = Material.CherrySlab; - for (int i = 10219; i <= 10298; i++) - materials[i] = Material.CherryStairs; - for (int i = 6447; i <= 6510; i++) - materials[i] = Material.CherryTrapdoor; - for (int i = 5726; i <= 5733; i++) - materials[i] = Material.CherryWallHangingSign; - for (int i = 4878; i <= 4885; i++) - materials[i] = Material.CherryWallSign; - for (int i = 216; i <= 218; i++) - materials[i] = Material.CherryWood; - for (int i = 3006; i <= 3029; i++) - materials[i] = Material.Chest; - for (int i = 9366; i <= 9369; i++) - materials[i] = Material.ChippedAnvil; - for (int i = 2140; i <= 2395; i++) - materials[i] = Material.ChiseledBookshelf; - materials[23420] = Material.ChiseledCopper; - materials[27020] = Material.ChiseledDeepslate; - materials[21191] = Material.ChiseledNetherBricks; - materials[20343] = Material.ChiseledPolishedBlackstone; - materials[9491] = Material.ChiseledQuartzBlock; - materials[11415] = Material.ChiseledRedSandstone; - materials[579] = Material.ChiseledSandstone; - materials[6770] = Material.ChiseledStoneBricks; - materials[22372] = Material.ChiseledTuff; - materials[22784] = Material.ChiseledTuffBricks; - for (int i = 12873; i <= 12878; i++) - materials[i] = Material.ChorusFlower; - for (int i = 12809; i <= 12872; i++) - materials[i] = Material.ChorusPlant; - materials[5964] = Material.Clay; - materials[11080] = Material.CoalBlock; - materials[133] = Material.CoalOre; - materials[11] = Material.CoarseDirt; - materials[25376] = Material.CobbledDeepslate; - for (int i = 25457; i <= 25462; i++) - materials[i] = Material.CobbledDeepslateSlab; - for (int i = 25377; i <= 25456; i++) - materials[i] = Material.CobbledDeepslateStairs; - for (int i = 25463; i <= 25786; i++) - materials[i] = Material.CobbledDeepslateWall; - materials[14] = Material.Cobblestone; - for (int i = 11593; i <= 11598; i++) - materials[i] = Material.CobblestoneSlab; - for (int i = 4766; i <= 4845; i++) - materials[i] = Material.CobblestoneStairs; - for (int i = 8149; i <= 8472; i++) - materials[i] = Material.CobblestoneWall; - materials[2047] = Material.Cobweb; - for (int i = 7649; i <= 7660; i++) - materials[i] = Material.Cocoa; - for (int i = 8136; i <= 8147; i++) - materials[i] = Material.CommandBlock; - for (int i = 9430; i <= 9445; i++) - materials[i] = Material.Comparator; - for (int i = 19841; i <= 19849; i++) - materials[i] = Material.Composter; - for (int i = 13411; i <= 13412; i++) - materials[i] = Material.Conduit; - materials[23407] = Material.CopperBlock; - for (int i = 25161; i <= 25164; i++) - materials[i] = Material.CopperBulb; - for (int i = 24121; i <= 24184; i++) - materials[i] = Material.CopperDoor; - for (int i = 25145; i <= 25146; i++) - materials[i] = Material.CopperGrate; - materials[23411] = Material.CopperOre; - for (int i = 24633; i <= 24696; i++) - materials[i] = Material.CopperTrapdoor; - materials[2129] = Material.Cornflower; - materials[27021] = Material.CrackedDeepslateBricks; - materials[27022] = Material.CrackedDeepslateTiles; - materials[21192] = Material.CrackedNetherBricks; - materials[20342] = Material.CrackedPolishedBlackstoneBricks; - materials[6769] = Material.CrackedStoneBricks; - for (int i = 27059; i <= 27106; i++) - materials[i] = Material.Crafter; - materials[4329] = Material.CraftingTable; - for (int i = 2917; i <= 2925; i++) - materials[i] = Material.CreakingHeart; - for (int i = 9242; i <= 9273; i++) - materials[i] = Material.CreeperHead; - for (int i = 9274; i <= 9281; i++) - materials[i] = Material.CreeperWallHead; - for (int i = 19569; i <= 19592; i++) - materials[i] = Material.CrimsonButton; - for (int i = 19617; i <= 19680; i++) - materials[i] = Material.CrimsonDoor; - for (int i = 19153; i <= 19184; i++) - materials[i] = Material.CrimsonFence; - for (int i = 19345; i <= 19376; i++) - materials[i] = Material.CrimsonFenceGate; - materials[19078] = Material.CrimsonFungus; - for (int i = 5438; i <= 5501; i++) - materials[i] = Material.CrimsonHangingSign; - for (int i = 19071; i <= 19073; i++) - materials[i] = Material.CrimsonHyphae; - materials[19077] = Material.CrimsonNylium; - materials[19135] = Material.CrimsonPlanks; - for (int i = 19149; i <= 19150; i++) - materials[i] = Material.CrimsonPressurePlate; - materials[19134] = Material.CrimsonRoots; - for (int i = 19745; i <= 19776; i++) - materials[i] = Material.CrimsonSign; - for (int i = 19137; i <= 19142; i++) - materials[i] = Material.CrimsonSlab; - for (int i = 19409; i <= 19488; i++) - materials[i] = Material.CrimsonStairs; - for (int i = 19065; i <= 19067; i++) - materials[i] = Material.CrimsonStem; - for (int i = 19217; i <= 19280; i++) - materials[i] = Material.CrimsonTrapdoor; - for (int i = 5766; i <= 5773; i++) - materials[i] = Material.CrimsonWallHangingSign; - for (int i = 19809; i <= 19816; i++) - materials[i] = Material.CrimsonWallSign; - materials[19918] = Material.CryingObsidian; - materials[23416] = Material.CutCopper; - for (int i = 23763; i <= 23768; i++) - materials[i] = Material.CutCopperSlab; - for (int i = 23665; i <= 23744; i++) - materials[i] = Material.CutCopperStairs; - materials[11416] = Material.CutRedSandstone; - for (int i = 11635; i <= 11640; i++) - materials[i] = Material.CutRedSandstoneSlab; - materials[580] = Material.CutSandstone; - for (int i = 11581; i <= 11586; i++) - materials[i] = Material.CutSandstoneSlab; - for (int i = 11238; i <= 11253; i++) - materials[i] = Material.CyanBanner; - for (int i = 1875; i <= 1890; i++) - materials[i] = Material.CyanBed; - for (int i = 21354; i <= 21369; i++) - materials[i] = Material.CyanCandle; - for (int i = 21486; i <= 21487; i++) - materials[i] = Material.CyanCandleCake; - materials[11072] = Material.CyanCarpet; - materials[13206] = Material.CyanConcrete; - materials[13222] = Material.CyanConcretePowder; - for (int i = 13169; i <= 13172; i++) - materials[i] = Material.CyanGlazedTerracotta; - for (int i = 13091; i <= 13096; i++) - materials[i] = Material.CyanShulkerBox; - materials[6120] = Material.CyanStainedGlass; - for (int i = 9915; i <= 9946; i++) - materials[i] = Material.CyanStainedGlassPane; - materials[9620] = Material.CyanTerracotta; - for (int i = 11386; i <= 11389; i++) - materials[i] = Material.CyanWallBanner; - materials[2099] = Material.CyanWool; - for (int i = 9370; i <= 9373; i++) - materials[i] = Material.DamagedAnvil; - materials[2118] = Material.Dandelion; - for (int i = 8986; i <= 9009; i++) - materials[i] = Material.DarkOakButton; - for (int i = 12547; i <= 12610; i++) - materials[i] = Material.DarkOakDoor; - for (int i = 12099; i <= 12130; i++) - materials[i] = Material.DarkOakFence; - for (int i = 11811; i <= 11842; i++) - materials[i] = Material.DarkOakFenceGate; - for (int i = 5310; i <= 5373; i++) - materials[i] = Material.DarkOakHangingSign; - for (int i = 420; i <= 447; i++) - materials[i] = Material.DarkOakLeaves; - for (int i = 154; i <= 156; i++) - materials[i] = Material.DarkOakLog; - materials[21] = Material.DarkOakPlanks; - for (int i = 5892; i <= 5893; i++) - materials[i] = Material.DarkOakPressurePlate; - for (int i = 41; i <= 42; i++) - materials[i] = Material.DarkOakSapling; - for (int i = 4546; i <= 4577; i++) - materials[i] = Material.DarkOakSign; - for (int i = 11533; i <= 11538; i++) - materials[i] = Material.DarkOakSlab; - for (int i = 10299; i <= 10378; i++) - materials[i] = Material.DarkOakStairs; - for (int i = 6511; i <= 6574; i++) - materials[i] = Material.DarkOakTrapdoor; - for (int i = 5742; i <= 5749; i++) - materials[i] = Material.DarkOakWallHangingSign; - for (int i = 4894; i <= 4901; i++) - materials[i] = Material.DarkOakWallSign; - for (int i = 219; i <= 221; i++) - materials[i] = Material.DarkOakWood; - materials[10800] = Material.DarkPrismarine; - for (int i = 11053; i <= 11058; i++) - materials[i] = Material.DarkPrismarineSlab; - for (int i = 10961; i <= 11040; i++) - materials[i] = Material.DarkPrismarineStairs; - for (int i = 9446; i <= 9477; i++) - materials[i] = Material.DaylightDetector; - for (int i = 13284; i <= 13285; i++) - materials[i] = Material.DeadBrainCoral; - materials[13273] = Material.DeadBrainCoralBlock; - for (int i = 13304; i <= 13305; i++) - materials[i] = Material.DeadBrainCoralFan; - for (int i = 13330; i <= 13337; i++) - materials[i] = Material.DeadBrainCoralWallFan; - for (int i = 13286; i <= 13287; i++) - materials[i] = Material.DeadBubbleCoral; - materials[13274] = Material.DeadBubbleCoralBlock; - for (int i = 13306; i <= 13307; i++) - materials[i] = Material.DeadBubbleCoralFan; - for (int i = 13338; i <= 13345; i++) - materials[i] = Material.DeadBubbleCoralWallFan; - materials[2050] = Material.DeadBush; - for (int i = 13288; i <= 13289; i++) - materials[i] = Material.DeadFireCoral; - materials[13275] = Material.DeadFireCoralBlock; - for (int i = 13308; i <= 13309; i++) - materials[i] = Material.DeadFireCoralFan; - for (int i = 13346; i <= 13353; i++) - materials[i] = Material.DeadFireCoralWallFan; - for (int i = 13290; i <= 13291; i++) - materials[i] = Material.DeadHornCoral; - materials[13276] = Material.DeadHornCoralBlock; - for (int i = 13310; i <= 13311; i++) - materials[i] = Material.DeadHornCoralFan; - for (int i = 13354; i <= 13361; i++) - materials[i] = Material.DeadHornCoralWallFan; - for (int i = 13282; i <= 13283; i++) - materials[i] = Material.DeadTubeCoral; - materials[13272] = Material.DeadTubeCoralBlock; - for (int i = 13302; i <= 13303; i++) - materials[i] = Material.DeadTubeCoralFan; - for (int i = 13322; i <= 13329; i++) - materials[i] = Material.DeadTubeCoralWallFan; - for (int i = 27043; i <= 27058; i++) - materials[i] = Material.DecoratedPot; - for (int i = 25373; i <= 25375; i++) - materials[i] = Material.Deepslate; - for (int i = 26690; i <= 26695; i++) - materials[i] = Material.DeepslateBrickSlab; - for (int i = 26610; i <= 26689; i++) - materials[i] = Material.DeepslateBrickStairs; - for (int i = 26696; i <= 27019; i++) - materials[i] = Material.DeepslateBrickWall; - materials[26609] = Material.DeepslateBricks; - materials[134] = Material.DeepslateCoalOre; - materials[23412] = Material.DeepslateCopperOre; - materials[4327] = Material.DeepslateDiamondOre; - materials[7742] = Material.DeepslateEmeraldOre; - materials[130] = Material.DeepslateGoldOre; - materials[132] = Material.DeepslateIronOre; - materials[564] = Material.DeepslateLapisOre; - for (int i = 5902; i <= 5903; i++) - materials[i] = Material.DeepslateRedstoneOre; - for (int i = 26279; i <= 26284; i++) - materials[i] = Material.DeepslateTileSlab; - for (int i = 26199; i <= 26278; i++) - materials[i] = Material.DeepslateTileStairs; - for (int i = 26285; i <= 26608; i++) - materials[i] = Material.DeepslateTileWall; - materials[26198] = Material.DeepslateTiles; - for (int i = 2011; i <= 2034; i++) - materials[i] = Material.DetectorRail; - materials[4328] = Material.DiamondBlock; - materials[4326] = Material.DiamondOre; - materials[4] = Material.Diorite; - for (int i = 14623; i <= 14628; i++) - materials[i] = Material.DioriteSlab; - for (int i = 14471; i <= 14550; i++) - materials[i] = Material.DioriteStairs; - for (int i = 18517; i <= 18840; i++) - materials[i] = Material.DioriteWall; - materials[10] = Material.Dirt; - materials[12982] = Material.DirtPath; - for (int i = 566; i <= 577; i++) - materials[i] = Material.Dispenser; - materials[7646] = Material.DragonEgg; - for (int i = 9282; i <= 9313; i++) - materials[i] = Material.DragonHead; - for (int i = 9314; i <= 9321; i++) - materials[i] = Material.DragonWallHead; - materials[13256] = Material.DriedKelpBlock; - materials[25237] = Material.DripstoneBlock; - for (int i = 9599; i <= 9610; i++) - materials[i] = Material.Dropper; - materials[7895] = Material.EmeraldBlock; - materials[7741] = Material.EmeraldOre; - materials[7619] = Material.EnchantingTable; - materials[12983] = Material.EndGateway; - materials[7636] = Material.EndPortal; - for (int i = 7637; i <= 7644; i++) - materials[i] = Material.EndPortalFrame; - for (int i = 12803; i <= 12808; i++) - materials[i] = Material.EndRod; - materials[7645] = Material.EndStone; - for (int i = 14581; i <= 14586; i++) - materials[i] = Material.EndStoneBrickSlab; - for (int i = 13831; i <= 13910; i++) - materials[i] = Material.EndStoneBrickStairs; - for (int i = 18193; i <= 18516; i++) - materials[i] = Material.EndStoneBrickWall; - materials[12963] = Material.EndStoneBricks; - for (int i = 7743; i <= 7750; i++) - materials[i] = Material.EnderChest; - materials[23419] = Material.ExposedChiseledCopper; - materials[23408] = Material.ExposedCopper; - for (int i = 25165; i <= 25168; i++) - materials[i] = Material.ExposedCopperBulb; - for (int i = 24185; i <= 24248; i++) - materials[i] = Material.ExposedCopperDoor; - for (int i = 25147; i <= 25148; i++) - materials[i] = Material.ExposedCopperGrate; - for (int i = 24697; i <= 24760; i++) - materials[i] = Material.ExposedCopperTrapdoor; - materials[23415] = Material.ExposedCutCopper; - for (int i = 23757; i <= 23762; i++) - materials[i] = Material.ExposedCutCopperSlab; - for (int i = 23585; i <= 23664; i++) - materials[i] = Material.ExposedCutCopperStairs; - for (int i = 4338; i <= 4345; i++) - materials[i] = Material.Farmland; - materials[2049] = Material.Fern; - for (int i = 2403; i <= 2914; i++) - materials[i] = Material.Fire; - for (int i = 13298; i <= 13299; i++) - materials[i] = Material.FireCoral; - materials[13280] = Material.FireCoralBlock; - for (int i = 13318; i <= 13319; i++) - materials[i] = Material.FireCoralFan; - for (int i = 13386; i <= 13393; i++) - materials[i] = Material.FireCoralWallFan; - materials[18906] = Material.FletchingTable; - materials[8797] = Material.FlowerPot; - materials[25294] = Material.FloweringAzalea; - for (int i = 532; i <= 559; i++) - materials[i] = Material.FloweringAzaleaLeaves; - materials[27041] = Material.Frogspawn; - for (int i = 13008; i <= 13011; i++) - materials[i] = Material.FrostedIce; - for (int i = 4346; i <= 4353; i++) - materials[i] = Material.Furnace; - materials[20754] = Material.GildedBlackstone; - materials[562] = Material.Glass; - for (int i = 7009; i <= 7040; i++) - materials[i] = Material.GlassPane; - for (int i = 7099; i <= 7226; i++) - materials[i] = Material.GlowLichen; - materials[6029] = Material.Glowstone; - materials[2134] = Material.GoldBlock; - materials[129] = Material.GoldOre; - materials[2] = Material.Granite; - for (int i = 14599; i <= 14604; i++) - materials[i] = Material.GraniteSlab; - for (int i = 14151; i <= 14230; i++) - materials[i] = Material.GraniteStairs; - for (int i = 15925; i <= 16248; i++) - materials[i] = Material.GraniteWall; - for (int i = 8; i <= 9; i++) - materials[i] = Material.GrassBlock; - materials[124] = Material.Gravel; - for (int i = 11206; i <= 11221; i++) - materials[i] = Material.GrayBanner; - for (int i = 1843; i <= 1858; i++) - materials[i] = Material.GrayBed; - for (int i = 21322; i <= 21337; i++) - materials[i] = Material.GrayCandle; - for (int i = 21482; i <= 21483; i++) - materials[i] = Material.GrayCandleCake; - materials[11070] = Material.GrayCarpet; - materials[13204] = Material.GrayConcrete; - materials[13220] = Material.GrayConcretePowder; - for (int i = 13161; i <= 13164; i++) - materials[i] = Material.GrayGlazedTerracotta; - for (int i = 13079; i <= 13084; i++) - materials[i] = Material.GrayShulkerBox; - materials[6118] = Material.GrayStainedGlass; - for (int i = 9851; i <= 9882; i++) - materials[i] = Material.GrayStainedGlassPane; - materials[9618] = Material.GrayTerracotta; - for (int i = 11378; i <= 11381; i++) - materials[i] = Material.GrayWallBanner; - materials[2097] = Material.GrayWool; - for (int i = 11302; i <= 11317; i++) - materials[i] = Material.GreenBanner; - for (int i = 1939; i <= 1954; i++) - materials[i] = Material.GreenBed; - for (int i = 21418; i <= 21433; i++) - materials[i] = Material.GreenCandle; - for (int i = 21494; i <= 21495; i++) - materials[i] = Material.GreenCandleCake; - materials[11076] = Material.GreenCarpet; - materials[13210] = Material.GreenConcrete; - materials[13226] = Material.GreenConcretePowder; - for (int i = 13185; i <= 13188; i++) - materials[i] = Material.GreenGlazedTerracotta; - for (int i = 13115; i <= 13120; i++) - materials[i] = Material.GreenShulkerBox; - materials[6124] = Material.GreenStainedGlass; - for (int i = 10043; i <= 10074; i++) - materials[i] = Material.GreenStainedGlassPane; - materials[9624] = Material.GreenTerracotta; - for (int i = 11402; i <= 11405; i++) - materials[i] = Material.GreenWallBanner; - materials[2103] = Material.GreenWool; - for (int i = 18907; i <= 18918; i++) - materials[i] = Material.Grindstone; - for (int i = 25369; i <= 25370; i++) - materials[i] = Material.HangingRoots; - for (int i = 11060; i <= 11062; i++) - materials[i] = Material.HayBlock; - for (int i = 27151; i <= 27152; i++) - materials[i] = Material.HeavyCore; - for (int i = 9414; i <= 9429; i++) - materials[i] = Material.HeavyWeightedPressurePlate; - materials[19914] = Material.HoneyBlock; - materials[19915] = Material.HoneycombBlock; - for (int i = 9480; i <= 9489; i++) - materials[i] = Material.Hopper; - for (int i = 13300; i <= 13301; i++) - materials[i] = Material.HornCoral; - materials[13281] = Material.HornCoralBlock; - for (int i = 13320; i <= 13321; i++) - materials[i] = Material.HornCoralFan; - for (int i = 13394; i <= 13401; i++) - materials[i] = Material.HornCoralWallFan; - materials[5946] = Material.Ice; - materials[6778] = Material.InfestedChiseledStoneBricks; - materials[6774] = Material.InfestedCobblestone; - materials[6777] = Material.InfestedCrackedStoneBricks; - for (int i = 27023; i <= 27025; i++) - materials[i] = Material.InfestedDeepslate; - materials[6776] = Material.InfestedMossyStoneBricks; - materials[6773] = Material.InfestedStone; - materials[6775] = Material.InfestedStoneBricks; - for (int i = 6971; i <= 7002; i++) - materials[i] = Material.IronBars; - materials[2135] = Material.IronBlock; - for (int i = 5816; i <= 5879; i++) - materials[i] = Material.IronDoor; - materials[131] = Material.IronOre; - for (int i = 10734; i <= 10797; i++) - materials[i] = Material.IronTrapdoor; - for (int i = 6036; i <= 6039; i++) - materials[i] = Material.JackOLantern; - for (int i = 19829; i <= 19840; i++) - materials[i] = Material.Jigsaw; - for (int i = 5981; i <= 5982; i++) - materials[i] = Material.Jukebox; - for (int i = 8914; i <= 8937; i++) - materials[i] = Material.JungleButton; - for (int i = 12355; i <= 12418; i++) - materials[i] = Material.JungleDoor; - for (int i = 12003; i <= 12034; i++) - materials[i] = Material.JungleFence; - for (int i = 11715; i <= 11746; i++) - materials[i] = Material.JungleFenceGate; - for (int i = 5246; i <= 5309; i++) - materials[i] = Material.JungleHangingSign; - for (int i = 336; i <= 363; i++) - materials[i] = Material.JungleLeaves; - for (int i = 145; i <= 147; i++) - materials[i] = Material.JungleLog; - materials[18] = Material.JunglePlanks; - for (int i = 5886; i <= 5887; i++) - materials[i] = Material.JunglePressurePlate; - for (int i = 35; i <= 36; i++) - materials[i] = Material.JungleSapling; - for (int i = 4514; i <= 4545; i++) - materials[i] = Material.JungleSign; - for (int i = 11515; i <= 11520; i++) - materials[i] = Material.JungleSlab; - for (int i = 8056; i <= 8135; i++) - materials[i] = Material.JungleStairs; - for (int i = 6319; i <= 6382; i++) - materials[i] = Material.JungleTrapdoor; - for (int i = 5734; i <= 5741; i++) - materials[i] = Material.JungleWallHangingSign; - for (int i = 4886; i <= 4893; i++) - materials[i] = Material.JungleWallSign; - for (int i = 210; i <= 212; i++) - materials[i] = Material.JungleWood; - for (int i = 13229; i <= 13254; i++) - materials[i] = Material.Kelp; - materials[13255] = Material.KelpPlant; - for (int i = 4738; i <= 4745; i++) - materials[i] = Material.Ladder; - for (int i = 18972; i <= 18975; i++) - materials[i] = Material.Lantern; - materials[565] = Material.LapisBlock; - materials[563] = Material.LapisOre; - for (int i = 21514; i <= 21525; i++) - materials[i] = Material.LargeAmethystBud; - for (int i = 11092; i <= 11093; i++) - materials[i] = Material.LargeFern; - for (int i = 102; i <= 117; i++) - materials[i] = Material.Lava; - materials[7632] = Material.LavaCauldron; - for (int i = 18919; i <= 18934; i++) - materials[i] = Material.Lectern; - for (int i = 5790; i <= 5813; i++) - materials[i] = Material.Lever; - for (int i = 10702; i <= 10733; i++) - materials[i] = Material.Light; - for (int i = 11142; i <= 11157; i++) - materials[i] = Material.LightBlueBanner; - for (int i = 1779; i <= 1794; i++) - materials[i] = Material.LightBlueBed; - for (int i = 21258; i <= 21273; i++) - materials[i] = Material.LightBlueCandle; - for (int i = 21474; i <= 21475; i++) - materials[i] = Material.LightBlueCandleCake; - materials[11066] = Material.LightBlueCarpet; - materials[13200] = Material.LightBlueConcrete; - materials[13216] = Material.LightBlueConcretePowder; - for (int i = 13145; i <= 13148; i++) - materials[i] = Material.LightBlueGlazedTerracotta; - for (int i = 13055; i <= 13060; i++) - materials[i] = Material.LightBlueShulkerBox; - materials[6114] = Material.LightBlueStainedGlass; - for (int i = 9723; i <= 9754; i++) - materials[i] = Material.LightBlueStainedGlassPane; - materials[9614] = Material.LightBlueTerracotta; - for (int i = 11362; i <= 11365; i++) - materials[i] = Material.LightBlueWallBanner; - materials[2093] = Material.LightBlueWool; - for (int i = 11222; i <= 11237; i++) - materials[i] = Material.LightGrayBanner; - for (int i = 1859; i <= 1874; i++) - materials[i] = Material.LightGrayBed; - for (int i = 21338; i <= 21353; i++) - materials[i] = Material.LightGrayCandle; - for (int i = 21484; i <= 21485; i++) - materials[i] = Material.LightGrayCandleCake; - materials[11071] = Material.LightGrayCarpet; - materials[13205] = Material.LightGrayConcrete; - materials[13221] = Material.LightGrayConcretePowder; - for (int i = 13165; i <= 13168; i++) - materials[i] = Material.LightGrayGlazedTerracotta; - for (int i = 13085; i <= 13090; i++) - materials[i] = Material.LightGrayShulkerBox; - materials[6119] = Material.LightGrayStainedGlass; - for (int i = 9883; i <= 9914; i++) - materials[i] = Material.LightGrayStainedGlassPane; - materials[9619] = Material.LightGrayTerracotta; - for (int i = 11382; i <= 11385; i++) - materials[i] = Material.LightGrayWallBanner; - materials[2098] = Material.LightGrayWool; - for (int i = 9398; i <= 9413; i++) - materials[i] = Material.LightWeightedPressurePlate; - for (int i = 25193; i <= 25216; i++) - materials[i] = Material.LightningRod; - for (int i = 11084; i <= 11085; i++) - materials[i] = Material.Lilac; - materials[2131] = Material.LilyOfTheValley; - materials[7501] = Material.LilyPad; - for (int i = 11174; i <= 11189; i++) - materials[i] = Material.LimeBanner; - for (int i = 1811; i <= 1826; i++) - materials[i] = Material.LimeBed; - for (int i = 21290; i <= 21305; i++) - materials[i] = Material.LimeCandle; - for (int i = 21478; i <= 21479; i++) - materials[i] = Material.LimeCandleCake; - materials[11068] = Material.LimeCarpet; - materials[13202] = Material.LimeConcrete; - materials[13218] = Material.LimeConcretePowder; - for (int i = 13153; i <= 13156; i++) - materials[i] = Material.LimeGlazedTerracotta; - for (int i = 13067; i <= 13072; i++) - materials[i] = Material.LimeShulkerBox; - materials[6116] = Material.LimeStainedGlass; - for (int i = 9787; i <= 9818; i++) - materials[i] = Material.LimeStainedGlassPane; - materials[9616] = Material.LimeTerracotta; - for (int i = 11370; i <= 11373; i++) - materials[i] = Material.LimeWallBanner; - materials[2095] = Material.LimeWool; - materials[19928] = Material.Lodestone; - for (int i = 18873; i <= 18876; i++) - materials[i] = Material.Loom; - for (int i = 11126; i <= 11141; i++) - materials[i] = Material.MagentaBanner; - for (int i = 1763; i <= 1778; i++) - materials[i] = Material.MagentaBed; - for (int i = 21242; i <= 21257; i++) - materials[i] = Material.MagentaCandle; - for (int i = 21472; i <= 21473; i++) - materials[i] = Material.MagentaCandleCake; - materials[11065] = Material.MagentaCarpet; - materials[13199] = Material.MagentaConcrete; - materials[13215] = Material.MagentaConcretePowder; - for (int i = 13141; i <= 13144; i++) - materials[i] = Material.MagentaGlazedTerracotta; - for (int i = 13049; i <= 13054; i++) - materials[i] = Material.MagentaShulkerBox; - materials[6113] = Material.MagentaStainedGlass; - for (int i = 9691; i <= 9722; i++) - materials[i] = Material.MagentaStainedGlassPane; - materials[9613] = Material.MagentaTerracotta; - for (int i = 11358; i <= 11361; i++) - materials[i] = Material.MagentaWallBanner; - materials[2092] = Material.MagentaWool; - materials[13012] = Material.MagmaBlock; - for (int i = 9034; i <= 9057; i++) - materials[i] = Material.MangroveButton; - for (int i = 12675; i <= 12738; i++) - materials[i] = Material.MangroveDoor; - for (int i = 12163; i <= 12194; i++) - materials[i] = Material.MangroveFence; - for (int i = 11875; i <= 11906; i++) - materials[i] = Material.MangroveFenceGate; - for (int i = 5566; i <= 5629; i++) - materials[i] = Material.MangroveHangingSign; - for (int i = 476; i <= 503; i++) - materials[i] = Material.MangroveLeaves; - for (int i = 160; i <= 162; i++) - materials[i] = Material.MangroveLog; - materials[26] = Material.MangrovePlanks; - for (int i = 5896; i <= 5897; i++) - materials[i] = Material.MangrovePressurePlate; - for (int i = 45; i <= 84; i++) - materials[i] = Material.MangrovePropagule; - for (int i = 163; i <= 164; i++) - materials[i] = Material.MangroveRoots; - for (int i = 4610; i <= 4641; i++) - materials[i] = Material.MangroveSign; - for (int i = 11545; i <= 11550; i++) - materials[i] = Material.MangroveSlab; - for (int i = 10459; i <= 10538; i++) - materials[i] = Material.MangroveStairs; - for (int i = 6639; i <= 6702; i++) - materials[i] = Material.MangroveTrapdoor; - for (int i = 5758; i <= 5765; i++) - materials[i] = Material.MangroveWallHangingSign; - for (int i = 4910; i <= 4917; i++) - materials[i] = Material.MangroveWallSign; - for (int i = 222; i <= 224; i++) - materials[i] = Material.MangroveWood; - for (int i = 21526; i <= 21537; i++) - materials[i] = Material.MediumAmethystBud; - materials[7042] = Material.Melon; - for (int i = 7059; i <= 7066; i++) - materials[i] = Material.MelonStem; - materials[25312] = Material.MossBlock; - materials[25295] = Material.MossCarpet; - materials[2396] = Material.MossyCobblestone; - for (int i = 14575; i <= 14580; i++) - materials[i] = Material.MossyCobblestoneSlab; - for (int i = 13751; i <= 13830; i++) - materials[i] = Material.MossyCobblestoneStairs; - for (int i = 8473; i <= 8796; i++) - materials[i] = Material.MossyCobblestoneWall; - for (int i = 14563; i <= 14568; i++) - materials[i] = Material.MossyStoneBrickSlab; - for (int i = 13591; i <= 13670; i++) - materials[i] = Material.MossyStoneBrickStairs; - for (int i = 15601; i <= 15924; i++) - materials[i] = Material.MossyStoneBrickWall; - materials[6768] = Material.MossyStoneBricks; - for (int i = 2106; i <= 2117; i++) - materials[i] = Material.MovingPiston; - materials[25372] = Material.Mud; - for (int i = 11611; i <= 11616; i++) - materials[i] = Material.MudBrickSlab; - for (int i = 7419; i <= 7498; i++) - materials[i] = Material.MudBrickStairs; - for (int i = 16573; i <= 16896; i++) - materials[i] = Material.MudBrickWall; - materials[6772] = Material.MudBricks; - for (int i = 165; i <= 167; i++) - materials[i] = Material.MuddyMangroveRoots; - for (int i = 6907; i <= 6970; i++) - materials[i] = Material.MushroomStem; - for (int i = 7499; i <= 7500; i++) - materials[i] = Material.Mycelium; - for (int i = 7503; i <= 7534; i++) - materials[i] = Material.NetherBrickFence; - for (int i = 11617; i <= 11622; i++) - materials[i] = Material.NetherBrickSlab; - for (int i = 7535; i <= 7614; i++) - materials[i] = Material.NetherBrickStairs; - for (int i = 16897; i <= 17220; i++) - materials[i] = Material.NetherBrickWall; - materials[7502] = Material.NetherBricks; - materials[135] = Material.NetherGoldOre; - for (int i = 6030; i <= 6031; i++) - materials[i] = Material.NetherPortal; - materials[9479] = Material.NetherQuartzOre; - materials[19064] = Material.NetherSprouts; - for (int i = 7615; i <= 7618; i++) - materials[i] = Material.NetherWart; - materials[13013] = Material.NetherWartBlock; - materials[19916] = Material.NetheriteBlock; - materials[6015] = Material.Netherrack; - for (int i = 581; i <= 1730; i++) - materials[i] = Material.NoteBlock; - for (int i = 8842; i <= 8865; i++) - materials[i] = Material.OakButton; - for (int i = 4674; i <= 4737; i++) - materials[i] = Material.OakDoor; - for (int i = 5983; i <= 6014; i++) - materials[i] = Material.OakFence; - for (int i = 7227; i <= 7258; i++) - materials[i] = Material.OakFenceGate; - for (int i = 4926; i <= 4989; i++) - materials[i] = Material.OakHangingSign; - for (int i = 252; i <= 279; i++) - materials[i] = Material.OakLeaves; - for (int i = 136; i <= 138; i++) - materials[i] = Material.OakLog; - materials[15] = Material.OakPlanks; - for (int i = 5880; i <= 5881; i++) - materials[i] = Material.OakPressurePlate; - for (int i = 29; i <= 30; i++) - materials[i] = Material.OakSapling; - for (int i = 4354; i <= 4385; i++) - materials[i] = Material.OakSign; - for (int i = 11497; i <= 11502; i++) - materials[i] = Material.OakSlab; - for (int i = 2926; i <= 3005; i++) - materials[i] = Material.OakStairs; - for (int i = 6127; i <= 6190; i++) - materials[i] = Material.OakTrapdoor; - for (int i = 5694; i <= 5701; i++) - materials[i] = Material.OakWallHangingSign; - for (int i = 4846; i <= 4853; i++) - materials[i] = Material.OakWallSign; - for (int i = 201; i <= 203; i++) - materials[i] = Material.OakWood; - for (int i = 13019; i <= 13030; i++) - materials[i] = Material.Observer; - materials[2397] = Material.Obsidian; - for (int i = 27032; i <= 27034; i++) - materials[i] = Material.OchreFroglight; - for (int i = 11110; i <= 11125; i++) - materials[i] = Material.OrangeBanner; - for (int i = 1747; i <= 1762; i++) - materials[i] = Material.OrangeBed; - for (int i = 21226; i <= 21241; i++) - materials[i] = Material.OrangeCandle; - for (int i = 21470; i <= 21471; i++) - materials[i] = Material.OrangeCandleCake; - materials[11064] = Material.OrangeCarpet; - materials[13198] = Material.OrangeConcrete; - materials[13214] = Material.OrangeConcretePowder; - for (int i = 13137; i <= 13140; i++) - materials[i] = Material.OrangeGlazedTerracotta; - for (int i = 13043; i <= 13048; i++) - materials[i] = Material.OrangeShulkerBox; - materials[6112] = Material.OrangeStainedGlass; - for (int i = 9659; i <= 9690; i++) - materials[i] = Material.OrangeStainedGlassPane; - materials[9612] = Material.OrangeTerracotta; - materials[2125] = Material.OrangeTulip; - for (int i = 11354; i <= 11357; i++) - materials[i] = Material.OrangeWallBanner; - materials[2091] = Material.OrangeWool; - materials[2128] = Material.OxeyeDaisy; - materials[23417] = Material.OxidizedChiseledCopper; - materials[23410] = Material.OxidizedCopper; - for (int i = 25173; i <= 25176; i++) - materials[i] = Material.OxidizedCopperBulb; - for (int i = 24249; i <= 24312; i++) - materials[i] = Material.OxidizedCopperDoor; - for (int i = 25151; i <= 25152; i++) - materials[i] = Material.OxidizedCopperGrate; - for (int i = 24761; i <= 24824; i++) - materials[i] = Material.OxidizedCopperTrapdoor; - materials[23413] = Material.OxidizedCutCopper; - for (int i = 23745; i <= 23750; i++) - materials[i] = Material.OxidizedCutCopperSlab; - for (int i = 23425; i <= 23504; i++) - materials[i] = Material.OxidizedCutCopperStairs; - materials[11081] = Material.PackedIce; - materials[6771] = Material.PackedMud; - for (int i = 27316; i <= 27317; i++) - materials[i] = Material.PaleHangingMoss; - materials[27153] = Material.PaleMossBlock; - for (int i = 27154; i <= 27315; i++) - materials[i] = Material.PaleMossCarpet; - for (int i = 9010; i <= 9033; i++) - materials[i] = Material.PaleOakButton; - for (int i = 12611; i <= 12674; i++) - materials[i] = Material.PaleOakDoor; - for (int i = 12131; i <= 12162; i++) - materials[i] = Material.PaleOakFence; - for (int i = 11843; i <= 11874; i++) - materials[i] = Material.PaleOakFenceGate; - for (int i = 5374; i <= 5437; i++) - materials[i] = Material.PaleOakHangingSign; - for (int i = 448; i <= 475; i++) - materials[i] = Material.PaleOakLeaves; - for (int i = 157; i <= 159; i++) - materials[i] = Material.PaleOakLog; - materials[25] = Material.PaleOakPlanks; - for (int i = 5894; i <= 5895; i++) - materials[i] = Material.PaleOakPressurePlate; - for (int i = 43; i <= 44; i++) - materials[i] = Material.PaleOakSapling; - for (int i = 4578; i <= 4609; i++) - materials[i] = Material.PaleOakSign; - for (int i = 11539; i <= 11544; i++) - materials[i] = Material.PaleOakSlab; - for (int i = 10379; i <= 10458; i++) - materials[i] = Material.PaleOakStairs; - for (int i = 6575; i <= 6638; i++) - materials[i] = Material.PaleOakTrapdoor; - for (int i = 5750; i <= 5757; i++) - materials[i] = Material.PaleOakWallHangingSign; - for (int i = 4902; i <= 4909; i++) - materials[i] = Material.PaleOakWallSign; - for (int i = 22; i <= 24; i++) - materials[i] = Material.PaleOakWood; - for (int i = 27038; i <= 27040; i++) - materials[i] = Material.PearlescentFroglight; - for (int i = 11088; i <= 11089; i++) - materials[i] = Material.Peony; - for (int i = 11587; i <= 11592; i++) - materials[i] = Material.PetrifiedOakSlab; - for (int i = 9322; i <= 9353; i++) - materials[i] = Material.PiglinHead; - for (int i = 9354; i <= 9361; i++) - materials[i] = Material.PiglinWallHead; - for (int i = 11190; i <= 11205; i++) - materials[i] = Material.PinkBanner; - for (int i = 1827; i <= 1842; i++) - materials[i] = Material.PinkBed; - for (int i = 21306; i <= 21321; i++) - materials[i] = Material.PinkCandle; - for (int i = 21480; i <= 21481; i++) - materials[i] = Material.PinkCandleCake; - materials[11069] = Material.PinkCarpet; - materials[13203] = Material.PinkConcrete; - materials[13219] = Material.PinkConcretePowder; - for (int i = 13157; i <= 13160; i++) - materials[i] = Material.PinkGlazedTerracotta; - for (int i = 25296; i <= 25311; i++) - materials[i] = Material.PinkPetals; - for (int i = 13073; i <= 13078; i++) - materials[i] = Material.PinkShulkerBox; - materials[6117] = Material.PinkStainedGlass; - for (int i = 9819; i <= 9850; i++) - materials[i] = Material.PinkStainedGlassPane; - materials[9617] = Material.PinkTerracotta; - materials[2127] = Material.PinkTulip; - for (int i = 11374; i <= 11377; i++) - materials[i] = Material.PinkWallBanner; - materials[2096] = Material.PinkWool; - for (int i = 2054; i <= 2065; i++) - materials[i] = Material.Piston; - for (int i = 2066; i <= 2089; i++) - materials[i] = Material.PistonHead; - for (int i = 12966; i <= 12975; i++) - materials[i] = Material.PitcherCrop; - for (int i = 12976; i <= 12977; i++) - materials[i] = Material.PitcherPlant; - for (int i = 9202; i <= 9233; i++) - materials[i] = Material.PlayerHead; - for (int i = 9234; i <= 9241; i++) - materials[i] = Material.PlayerWallHead; - for (int i = 12; i <= 13; i++) - materials[i] = Material.Podzol; - for (int i = 25217; i <= 25236; i++) - materials[i] = Material.PointedDripstone; - materials[7] = Material.PolishedAndesite; - for (int i = 14617; i <= 14622; i++) - materials[i] = Material.PolishedAndesiteSlab; - for (int i = 14391; i <= 14470; i++) - materials[i] = Material.PolishedAndesiteStairs; - for (int i = 6021; i <= 6023; i++) - materials[i] = Material.PolishedBasalt; - materials[20340] = Material.PolishedBlackstone; - for (int i = 20344; i <= 20349; i++) - materials[i] = Material.PolishedBlackstoneBrickSlab; - for (int i = 20350; i <= 20429; i++) - materials[i] = Material.PolishedBlackstoneBrickStairs; - for (int i = 20430; i <= 20753; i++) - materials[i] = Material.PolishedBlackstoneBrickWall; - materials[20341] = Material.PolishedBlackstoneBricks; - for (int i = 20843; i <= 20866; i++) - materials[i] = Material.PolishedBlackstoneButton; - for (int i = 20841; i <= 20842; i++) - materials[i] = Material.PolishedBlackstonePressurePlate; - for (int i = 20835; i <= 20840; i++) - materials[i] = Material.PolishedBlackstoneSlab; - for (int i = 20755; i <= 20834; i++) - materials[i] = Material.PolishedBlackstoneStairs; - for (int i = 20867; i <= 21190; i++) - materials[i] = Material.PolishedBlackstoneWall; - materials[25787] = Material.PolishedDeepslate; - for (int i = 25868; i <= 25873; i++) - materials[i] = Material.PolishedDeepslateSlab; - for (int i = 25788; i <= 25867; i++) - materials[i] = Material.PolishedDeepslateStairs; - for (int i = 25874; i <= 26197; i++) - materials[i] = Material.PolishedDeepslateWall; - materials[5] = Material.PolishedDiorite; - for (int i = 14569; i <= 14574; i++) - materials[i] = Material.PolishedDioriteSlab; - for (int i = 13671; i <= 13750; i++) - materials[i] = Material.PolishedDioriteStairs; - materials[3] = Material.PolishedGranite; - for (int i = 14551; i <= 14556; i++) - materials[i] = Material.PolishedGraniteSlab; - for (int i = 13431; i <= 13510; i++) - materials[i] = Material.PolishedGraniteStairs; - materials[21961] = Material.PolishedTuff; - for (int i = 21962; i <= 21967; i++) - materials[i] = Material.PolishedTuffSlab; - for (int i = 21968; i <= 22047; i++) - materials[i] = Material.PolishedTuffStairs; - for (int i = 22048; i <= 22371; i++) - materials[i] = Material.PolishedTuffWall; - materials[2120] = Material.Poppy; - for (int i = 8834; i <= 8841; i++) - materials[i] = Material.Potatoes; - materials[8803] = Material.PottedAcaciaSapling; - materials[8812] = Material.PottedAllium; - materials[27030] = Material.PottedAzaleaBush; - materials[8813] = Material.PottedAzureBluet; - materials[13426] = Material.PottedBamboo; - materials[8801] = Material.PottedBirchSapling; - materials[8811] = Material.PottedBlueOrchid; - materials[8823] = Material.PottedBrownMushroom; - materials[8825] = Material.PottedCactus; - materials[8804] = Material.PottedCherrySapling; - materials[8819] = Material.PottedCornflower; - materials[19924] = Material.PottedCrimsonFungus; - materials[19926] = Material.PottedCrimsonRoots; - materials[8809] = Material.PottedDandelion; - materials[8805] = Material.PottedDarkOakSapling; - materials[8824] = Material.PottedDeadBush; - materials[8808] = Material.PottedFern; - materials[27031] = Material.PottedFloweringAzaleaBush; - materials[8802] = Material.PottedJungleSapling; - materials[8820] = Material.PottedLilyOfTheValley; - materials[8807] = Material.PottedMangrovePropagule; - materials[8799] = Material.PottedOakSapling; - materials[8815] = Material.PottedOrangeTulip; - materials[8818] = Material.PottedOxeyeDaisy; - materials[8806] = Material.PottedPaleOakSapling; - materials[8817] = Material.PottedPinkTulip; - materials[8810] = Material.PottedPoppy; - materials[8822] = Material.PottedRedMushroom; - materials[8814] = Material.PottedRedTulip; - materials[8800] = Material.PottedSpruceSapling; - materials[8798] = Material.PottedTorchflower; - materials[19925] = Material.PottedWarpedFungus; - materials[19927] = Material.PottedWarpedRoots; - materials[8816] = Material.PottedWhiteTulip; - materials[8821] = Material.PottedWitherRose; - materials[22787] = Material.PowderSnow; - for (int i = 7633; i <= 7635; i++) - materials[i] = Material.PowderSnowCauldron; - for (int i = 1987; i <= 2010; i++) - materials[i] = Material.PoweredRail; - materials[10798] = Material.Prismarine; - for (int i = 11047; i <= 11052; i++) - materials[i] = Material.PrismarineBrickSlab; - for (int i = 10881; i <= 10960; i++) - materials[i] = Material.PrismarineBrickStairs; - materials[10799] = Material.PrismarineBricks; - for (int i = 11041; i <= 11046; i++) - materials[i] = Material.PrismarineSlab; - for (int i = 10801; i <= 10880; i++) - materials[i] = Material.PrismarineStairs; - for (int i = 14953; i <= 15276; i++) - materials[i] = Material.PrismarineWall; - materials[7041] = Material.Pumpkin; - for (int i = 7051; i <= 7058; i++) - materials[i] = Material.PumpkinStem; - for (int i = 11254; i <= 11269; i++) - materials[i] = Material.PurpleBanner; - for (int i = 1891; i <= 1906; i++) - materials[i] = Material.PurpleBed; - for (int i = 21370; i <= 21385; i++) - materials[i] = Material.PurpleCandle; - for (int i = 21488; i <= 21489; i++) - materials[i] = Material.PurpleCandleCake; - materials[11073] = Material.PurpleCarpet; - materials[13207] = Material.PurpleConcrete; - materials[13223] = Material.PurpleConcretePowder; - for (int i = 13173; i <= 13176; i++) - materials[i] = Material.PurpleGlazedTerracotta; - for (int i = 13097; i <= 13102; i++) - materials[i] = Material.PurpleShulkerBox; - materials[6121] = Material.PurpleStainedGlass; - for (int i = 9947; i <= 9978; i++) - materials[i] = Material.PurpleStainedGlassPane; - materials[9621] = Material.PurpleTerracotta; - for (int i = 11390; i <= 11393; i++) - materials[i] = Material.PurpleWallBanner; - materials[2100] = Material.PurpleWool; - materials[12879] = Material.PurpurBlock; - for (int i = 12880; i <= 12882; i++) - materials[i] = Material.PurpurPillar; - for (int i = 11641; i <= 11646; i++) - materials[i] = Material.PurpurSlab; - for (int i = 12883; i <= 12962; i++) - materials[i] = Material.PurpurStairs; - materials[9490] = Material.QuartzBlock; - materials[21193] = Material.QuartzBricks; - for (int i = 9492; i <= 9494; i++) - materials[i] = Material.QuartzPillar; - for (int i = 11623; i <= 11628; i++) - materials[i] = Material.QuartzSlab; - for (int i = 9495; i <= 9574; i++) - materials[i] = Material.QuartzStairs; - for (int i = 4746; i <= 4765; i++) - materials[i] = Material.Rail; - materials[27028] = Material.RawCopperBlock; - materials[27029] = Material.RawGoldBlock; - materials[27027] = Material.RawIronBlock; - for (int i = 11318; i <= 11333; i++) - materials[i] = Material.RedBanner; - for (int i = 1955; i <= 1970; i++) - materials[i] = Material.RedBed; - for (int i = 21434; i <= 21449; i++) - materials[i] = Material.RedCandle; - for (int i = 21496; i <= 21497; i++) - materials[i] = Material.RedCandleCake; - materials[11077] = Material.RedCarpet; - materials[13211] = Material.RedConcrete; - materials[13227] = Material.RedConcretePowder; - for (int i = 13189; i <= 13192; i++) - materials[i] = Material.RedGlazedTerracotta; - materials[2133] = Material.RedMushroom; - for (int i = 6843; i <= 6906; i++) - materials[i] = Material.RedMushroomBlock; - for (int i = 14611; i <= 14616; i++) - materials[i] = Material.RedNetherBrickSlab; - for (int i = 14311; i <= 14390; i++) - materials[i] = Material.RedNetherBrickStairs; - for (int i = 17545; i <= 17868; i++) - materials[i] = Material.RedNetherBrickWall; - materials[13014] = Material.RedNetherBricks; - materials[123] = Material.RedSand; - materials[11414] = Material.RedSandstone; - for (int i = 11629; i <= 11634; i++) - materials[i] = Material.RedSandstoneSlab; - for (int i = 11417; i <= 11496; i++) - materials[i] = Material.RedSandstoneStairs; - for (int i = 15277; i <= 15600; i++) - materials[i] = Material.RedSandstoneWall; - for (int i = 13121; i <= 13126; i++) - materials[i] = Material.RedShulkerBox; - materials[6125] = Material.RedStainedGlass; - for (int i = 10075; i <= 10106; i++) - materials[i] = Material.RedStainedGlassPane; - materials[9625] = Material.RedTerracotta; - materials[2124] = Material.RedTulip; - for (int i = 11406; i <= 11409; i++) - materials[i] = Material.RedWallBanner; - materials[2104] = Material.RedWool; - materials[9478] = Material.RedstoneBlock; - for (int i = 7647; i <= 7648; i++) - materials[i] = Material.RedstoneLamp; - for (int i = 5900; i <= 5901; i++) - materials[i] = Material.RedstoneOre; - for (int i = 5904; i <= 5905; i++) - materials[i] = Material.RedstoneTorch; - for (int i = 5906; i <= 5913; i++) - materials[i] = Material.RedstoneWallTorch; - for (int i = 3030; i <= 4325; i++) - materials[i] = Material.RedstoneWire; - materials[27042] = Material.ReinforcedDeepslate; - for (int i = 6047; i <= 6110; i++) - materials[i] = Material.Repeater; - for (int i = 12984; i <= 12995; i++) - materials[i] = Material.RepeatingCommandBlock; - for (int i = 19919; i <= 19923; i++) - materials[i] = Material.RespawnAnchor; - materials[25371] = Material.RootedDirt; - for (int i = 11086; i <= 11087; i++) - materials[i] = Material.RoseBush; - materials[118] = Material.Sand; - materials[578] = Material.Sandstone; - for (int i = 11575; i <= 11580; i++) - materials[i] = Material.SandstoneSlab; - for (int i = 7661; i <= 7740; i++) - materials[i] = Material.SandstoneStairs; - for (int i = 17869; i <= 18192; i++) - materials[i] = Material.SandstoneWall; - for (int i = 18841; i <= 18872; i++) - materials[i] = Material.Scaffolding; - materials[23268] = Material.Sculk; - for (int i = 23397; i <= 23398; i++) - materials[i] = Material.SculkCatalyst; - for (int i = 22788; i <= 22883; i++) - materials[i] = Material.SculkSensor; - for (int i = 23399; i <= 23406; i++) - materials[i] = Material.SculkShrieker; - for (int i = 23269; i <= 23396; i++) - materials[i] = Material.SculkVein; - materials[11059] = Material.SeaLantern; - for (int i = 13402; i <= 13409; i++) - materials[i] = Material.SeaPickle; - materials[2051] = Material.Seagrass; - materials[2048] = Material.ShortGrass; - materials[19079] = Material.Shroomlight; - for (int i = 13031; i <= 13036; i++) - materials[i] = Material.ShulkerBox; - for (int i = 9082; i <= 9113; i++) - materials[i] = Material.SkeletonSkull; - for (int i = 9114; i <= 9121; i++) - materials[i] = Material.SkeletonWallSkull; - materials[10699] = Material.SlimeBlock; - for (int i = 21538; i <= 21549; i++) - materials[i] = Material.SmallAmethystBud; - for (int i = 25353; i <= 25368; i++) - materials[i] = Material.SmallDripleaf; - materials[18935] = Material.SmithingTable; - for (int i = 18889; i <= 18896; i++) - materials[i] = Material.Smoker; - materials[27026] = Material.SmoothBasalt; - materials[11649] = Material.SmoothQuartz; - for (int i = 14593; i <= 14598; i++) - materials[i] = Material.SmoothQuartzSlab; - for (int i = 14071; i <= 14150; i++) - materials[i] = Material.SmoothQuartzStairs; - materials[11650] = Material.SmoothRedSandstone; - for (int i = 14557; i <= 14562; i++) - materials[i] = Material.SmoothRedSandstoneSlab; - for (int i = 13511; i <= 13590; i++) - materials[i] = Material.SmoothRedSandstoneStairs; - materials[11648] = Material.SmoothSandstone; - for (int i = 14587; i <= 14592; i++) - materials[i] = Material.SmoothSandstoneSlab; - for (int i = 13991; i <= 14070; i++) - materials[i] = Material.SmoothSandstoneStairs; - materials[11647] = Material.SmoothStone; - for (int i = 11569; i <= 11574; i++) - materials[i] = Material.SmoothStoneSlab; - for (int i = 13269; i <= 13271; i++) - materials[i] = Material.SnifferEgg; - for (int i = 5938; i <= 5945; i++) - materials[i] = Material.Snow; - materials[5947] = Material.SnowBlock; - for (int i = 19012; i <= 19043; i++) - materials[i] = Material.SoulCampfire; - materials[2915] = Material.SoulFire; - for (int i = 18976; i <= 18979; i++) - materials[i] = Material.SoulLantern; - materials[6016] = Material.SoulSand; - materials[6017] = Material.SoulSoil; - materials[6024] = Material.SoulTorch; - for (int i = 6025; i <= 6028; i++) - materials[i] = Material.SoulWallTorch; - materials[2916] = Material.Spawner; - materials[560] = Material.Sponge; - materials[25292] = Material.SporeBlossom; - for (int i = 8866; i <= 8889; i++) - materials[i] = Material.SpruceButton; - for (int i = 12227; i <= 12290; i++) - materials[i] = Material.SpruceDoor; - for (int i = 11939; i <= 11970; i++) - materials[i] = Material.SpruceFence; - for (int i = 11651; i <= 11682; i++) - materials[i] = Material.SpruceFenceGate; - for (int i = 4990; i <= 5053; i++) - materials[i] = Material.SpruceHangingSign; - for (int i = 280; i <= 307; i++) - materials[i] = Material.SpruceLeaves; - for (int i = 139; i <= 141; i++) - materials[i] = Material.SpruceLog; - materials[16] = Material.SprucePlanks; - for (int i = 5882; i <= 5883; i++) - materials[i] = Material.SprucePressurePlate; - for (int i = 31; i <= 32; i++) - materials[i] = Material.SpruceSapling; - for (int i = 4386; i <= 4417; i++) - materials[i] = Material.SpruceSign; - for (int i = 11503; i <= 11508; i++) - materials[i] = Material.SpruceSlab; - for (int i = 7896; i <= 7975; i++) - materials[i] = Material.SpruceStairs; - for (int i = 6191; i <= 6254; i++) - materials[i] = Material.SpruceTrapdoor; - for (int i = 5702; i <= 5709; i++) - materials[i] = Material.SpruceWallHangingSign; - for (int i = 4854; i <= 4861; i++) - materials[i] = Material.SpruceWallSign; - for (int i = 204; i <= 206; i++) - materials[i] = Material.SpruceWood; - for (int i = 2035; i <= 2046; i++) - materials[i] = Material.StickyPiston; - materials[1] = Material.Stone; - for (int i = 11605; i <= 11610; i++) - materials[i] = Material.StoneBrickSlab; - for (int i = 7339; i <= 7418; i++) - materials[i] = Material.StoneBrickStairs; - for (int i = 16249; i <= 16572; i++) - materials[i] = Material.StoneBrickWall; - materials[6767] = Material.StoneBricks; - for (int i = 5914; i <= 5937; i++) - materials[i] = Material.StoneButton; - for (int i = 5814; i <= 5815; i++) - materials[i] = Material.StonePressurePlate; - for (int i = 11563; i <= 11568; i++) - materials[i] = Material.StoneSlab; - for (int i = 13911; i <= 13990; i++) - materials[i] = Material.StoneStairs; - for (int i = 18936; i <= 18939; i++) - materials[i] = Material.Stonecutter; - for (int i = 180; i <= 182; i++) - materials[i] = Material.StrippedAcaciaLog; - for (int i = 237; i <= 239; i++) - materials[i] = Material.StrippedAcaciaWood; - for (int i = 198; i <= 200; i++) - materials[i] = Material.StrippedBambooBlock; - for (int i = 174; i <= 176; i++) - materials[i] = Material.StrippedBirchLog; - for (int i = 231; i <= 233; i++) - materials[i] = Material.StrippedBirchWood; - for (int i = 183; i <= 185; i++) - materials[i] = Material.StrippedCherryLog; - for (int i = 240; i <= 242; i++) - materials[i] = Material.StrippedCherryWood; - for (int i = 19074; i <= 19076; i++) - materials[i] = Material.StrippedCrimsonHyphae; - for (int i = 19068; i <= 19070; i++) - materials[i] = Material.StrippedCrimsonStem; - for (int i = 186; i <= 188; i++) - materials[i] = Material.StrippedDarkOakLog; - for (int i = 243; i <= 245; i++) - materials[i] = Material.StrippedDarkOakWood; - for (int i = 177; i <= 179; i++) - materials[i] = Material.StrippedJungleLog; - for (int i = 234; i <= 236; i++) - materials[i] = Material.StrippedJungleWood; - for (int i = 195; i <= 197; i++) - materials[i] = Material.StrippedMangroveLog; - for (int i = 249; i <= 251; i++) - materials[i] = Material.StrippedMangroveWood; - for (int i = 192; i <= 194; i++) - materials[i] = Material.StrippedOakLog; - for (int i = 225; i <= 227; i++) - materials[i] = Material.StrippedOakWood; - for (int i = 189; i <= 191; i++) - materials[i] = Material.StrippedPaleOakLog; - for (int i = 246; i <= 248; i++) - materials[i] = Material.StrippedPaleOakWood; - for (int i = 171; i <= 173; i++) - materials[i] = Material.StrippedSpruceLog; - for (int i = 228; i <= 230; i++) - materials[i] = Material.StrippedSpruceWood; - for (int i = 19057; i <= 19059; i++) - materials[i] = Material.StrippedWarpedHyphae; - for (int i = 19051; i <= 19053; i++) - materials[i] = Material.StrippedWarpedStem; - for (int i = 19825; i <= 19828; i++) - materials[i] = Material.StructureBlock; - materials[13018] = Material.StructureVoid; - for (int i = 5965; i <= 5980; i++) - materials[i] = Material.SugarCane; - for (int i = 11082; i <= 11083; i++) - materials[i] = Material.Sunflower; - for (int i = 125; i <= 128; i++) - materials[i] = Material.SuspiciousGravel; - for (int i = 119; i <= 122; i++) - materials[i] = Material.SuspiciousSand; - for (int i = 19044; i <= 19047; i++) - materials[i] = Material.SweetBerryBush; - for (int i = 11090; i <= 11091; i++) - materials[i] = Material.TallGrass; - for (int i = 2052; i <= 2053; i++) - materials[i] = Material.TallSeagrass; - for (int i = 19850; i <= 19865; i++) - materials[i] = Material.Target; - materials[11079] = Material.Terracotta; - materials[22786] = Material.TintedGlass; - for (int i = 2137; i <= 2138; i++) - materials[i] = Material.Tnt; - materials[2398] = Material.Torch; - materials[2119] = Material.Torchflower; - for (int i = 12964; i <= 12965; i++) - materials[i] = Material.TorchflowerCrop; - for (int i = 9374; i <= 9397; i++) - materials[i] = Material.TrappedChest; - for (int i = 27107; i <= 27118; i++) - materials[i] = Material.TrialSpawner; - for (int i = 7767; i <= 7894; i++) - materials[i] = Material.Tripwire; - for (int i = 7751; i <= 7766; i++) - materials[i] = Material.TripwireHook; - for (int i = 13292; i <= 13293; i++) - materials[i] = Material.TubeCoral; - materials[13277] = Material.TubeCoralBlock; - for (int i = 13312; i <= 13313; i++) - materials[i] = Material.TubeCoralFan; - for (int i = 13362; i <= 13369; i++) - materials[i] = Material.TubeCoralWallFan; - materials[21550] = Material.Tuff; - for (int i = 22374; i <= 22379; i++) - materials[i] = Material.TuffBrickSlab; - for (int i = 22380; i <= 22459; i++) - materials[i] = Material.TuffBrickStairs; - for (int i = 22460; i <= 22783; i++) - materials[i] = Material.TuffBrickWall; - materials[22373] = Material.TuffBricks; - for (int i = 21551; i <= 21556; i++) - materials[i] = Material.TuffSlab; - for (int i = 21557; i <= 21636; i++) - materials[i] = Material.TuffStairs; - for (int i = 21637; i <= 21960; i++) - materials[i] = Material.TuffWall; - for (int i = 13257; i <= 13268; i++) - materials[i] = Material.TurtleEgg; - for (int i = 19107; i <= 19132; i++) - materials[i] = Material.TwistingVines; - materials[19133] = Material.TwistingVinesPlant; - for (int i = 27119; i <= 27150; i++) - materials[i] = Material.Vault; - for (int i = 27035; i <= 27037; i++) - materials[i] = Material.VerdantFroglight; - for (int i = 7067; i <= 7098; i++) - materials[i] = Material.Vine; - materials[13427] = Material.VoidAir; - for (int i = 2399; i <= 2402; i++) - materials[i] = Material.WallTorch; - for (int i = 19593; i <= 19616; i++) - materials[i] = Material.WarpedButton; - for (int i = 19681; i <= 19744; i++) - materials[i] = Material.WarpedDoor; - for (int i = 19185; i <= 19216; i++) - materials[i] = Material.WarpedFence; - for (int i = 19377; i <= 19408; i++) - materials[i] = Material.WarpedFenceGate; - materials[19061] = Material.WarpedFungus; - for (int i = 5502; i <= 5565; i++) - materials[i] = Material.WarpedHangingSign; - for (int i = 19054; i <= 19056; i++) - materials[i] = Material.WarpedHyphae; - materials[19060] = Material.WarpedNylium; - materials[19136] = Material.WarpedPlanks; - for (int i = 19151; i <= 19152; i++) - materials[i] = Material.WarpedPressurePlate; - materials[19063] = Material.WarpedRoots; - for (int i = 19777; i <= 19808; i++) - materials[i] = Material.WarpedSign; - for (int i = 19143; i <= 19148; i++) - materials[i] = Material.WarpedSlab; - for (int i = 19489; i <= 19568; i++) - materials[i] = Material.WarpedStairs; - for (int i = 19048; i <= 19050; i++) - materials[i] = Material.WarpedStem; - for (int i = 19281; i <= 19344; i++) - materials[i] = Material.WarpedTrapdoor; - for (int i = 5774; i <= 5781; i++) - materials[i] = Material.WarpedWallHangingSign; - for (int i = 19817; i <= 19824; i++) - materials[i] = Material.WarpedWallSign; - materials[19062] = Material.WarpedWartBlock; - for (int i = 86; i <= 101; i++) - materials[i] = Material.Water; - for (int i = 7629; i <= 7631; i++) - materials[i] = Material.WaterCauldron; - materials[23424] = Material.WaxedChiseledCopper; - materials[23769] = Material.WaxedCopperBlock; - for (int i = 25177; i <= 25180; i++) - materials[i] = Material.WaxedCopperBulb; - for (int i = 24377; i <= 24440; i++) - materials[i] = Material.WaxedCopperDoor; - for (int i = 25153; i <= 25154; i++) - materials[i] = Material.WaxedCopperGrate; - for (int i = 24889; i <= 24952; i++) - materials[i] = Material.WaxedCopperTrapdoor; - materials[23776] = Material.WaxedCutCopper; - for (int i = 24115; i <= 24120; i++) - materials[i] = Material.WaxedCutCopperSlab; - for (int i = 24017; i <= 24096; i++) - materials[i] = Material.WaxedCutCopperStairs; - materials[23423] = Material.WaxedExposedChiseledCopper; - materials[23771] = Material.WaxedExposedCopper; - for (int i = 25181; i <= 25184; i++) - materials[i] = Material.WaxedExposedCopperBulb; - for (int i = 24441; i <= 24504; i++) - materials[i] = Material.WaxedExposedCopperDoor; - for (int i = 25155; i <= 25156; i++) - materials[i] = Material.WaxedExposedCopperGrate; - for (int i = 24953; i <= 25016; i++) - materials[i] = Material.WaxedExposedCopperTrapdoor; - materials[23775] = Material.WaxedExposedCutCopper; - for (int i = 24109; i <= 24114; i++) - materials[i] = Material.WaxedExposedCutCopperSlab; - for (int i = 23937; i <= 24016; i++) - materials[i] = Material.WaxedExposedCutCopperStairs; - materials[23421] = Material.WaxedOxidizedChiseledCopper; - materials[23772] = Material.WaxedOxidizedCopper; - for (int i = 25189; i <= 25192; i++) - materials[i] = Material.WaxedOxidizedCopperBulb; - for (int i = 24505; i <= 24568; i++) - materials[i] = Material.WaxedOxidizedCopperDoor; - for (int i = 25159; i <= 25160; i++) - materials[i] = Material.WaxedOxidizedCopperGrate; - for (int i = 25017; i <= 25080; i++) - materials[i] = Material.WaxedOxidizedCopperTrapdoor; - materials[23773] = Material.WaxedOxidizedCutCopper; - for (int i = 24097; i <= 24102; i++) - materials[i] = Material.WaxedOxidizedCutCopperSlab; - for (int i = 23777; i <= 23856; i++) - materials[i] = Material.WaxedOxidizedCutCopperStairs; - materials[23422] = Material.WaxedWeatheredChiseledCopper; - materials[23770] = Material.WaxedWeatheredCopper; - for (int i = 25185; i <= 25188; i++) - materials[i] = Material.WaxedWeatheredCopperBulb; - for (int i = 24569; i <= 24632; i++) - materials[i] = Material.WaxedWeatheredCopperDoor; - for (int i = 25157; i <= 25158; i++) - materials[i] = Material.WaxedWeatheredCopperGrate; - for (int i = 25081; i <= 25144; i++) - materials[i] = Material.WaxedWeatheredCopperTrapdoor; - materials[23774] = Material.WaxedWeatheredCutCopper; - for (int i = 24103; i <= 24108; i++) - materials[i] = Material.WaxedWeatheredCutCopperSlab; - for (int i = 23857; i <= 23936; i++) - materials[i] = Material.WaxedWeatheredCutCopperStairs; - materials[23418] = Material.WeatheredChiseledCopper; - materials[23409] = Material.WeatheredCopper; - for (int i = 25169; i <= 25172; i++) - materials[i] = Material.WeatheredCopperBulb; - for (int i = 24313; i <= 24376; i++) - materials[i] = Material.WeatheredCopperDoor; - for (int i = 25149; i <= 25150; i++) - materials[i] = Material.WeatheredCopperGrate; - for (int i = 24825; i <= 24888; i++) - materials[i] = Material.WeatheredCopperTrapdoor; - materials[23414] = Material.WeatheredCutCopper; - for (int i = 23751; i <= 23756; i++) - materials[i] = Material.WeatheredCutCopperSlab; - for (int i = 23505; i <= 23584; i++) - materials[i] = Material.WeatheredCutCopperStairs; - for (int i = 19080; i <= 19105; i++) - materials[i] = Material.WeepingVines; - materials[19106] = Material.WeepingVinesPlant; - materials[561] = Material.WetSponge; - for (int i = 4330; i <= 4337; i++) - materials[i] = Material.Wheat; - for (int i = 11094; i <= 11109; i++) - materials[i] = Material.WhiteBanner; - for (int i = 1731; i <= 1746; i++) - materials[i] = Material.WhiteBed; - for (int i = 21210; i <= 21225; i++) - materials[i] = Material.WhiteCandle; - for (int i = 21468; i <= 21469; i++) - materials[i] = Material.WhiteCandleCake; - materials[11063] = Material.WhiteCarpet; - materials[13197] = Material.WhiteConcrete; - materials[13213] = Material.WhiteConcretePowder; - for (int i = 13133; i <= 13136; i++) - materials[i] = Material.WhiteGlazedTerracotta; - for (int i = 13037; i <= 13042; i++) - materials[i] = Material.WhiteShulkerBox; - materials[6111] = Material.WhiteStainedGlass; - for (int i = 9627; i <= 9658; i++) - materials[i] = Material.WhiteStainedGlassPane; - materials[9611] = Material.WhiteTerracotta; - materials[2126] = Material.WhiteTulip; - for (int i = 11350; i <= 11353; i++) - materials[i] = Material.WhiteWallBanner; - materials[2090] = Material.WhiteWool; - materials[2130] = Material.WitherRose; - for (int i = 9122; i <= 9153; i++) - materials[i] = Material.WitherSkeletonSkull; - for (int i = 9154; i <= 9161; i++) - materials[i] = Material.WitherSkeletonWallSkull; - for (int i = 11158; i <= 11173; i++) - materials[i] = Material.YellowBanner; - for (int i = 1795; i <= 1810; i++) - materials[i] = Material.YellowBed; - for (int i = 21274; i <= 21289; i++) - materials[i] = Material.YellowCandle; - for (int i = 21476; i <= 21477; i++) - materials[i] = Material.YellowCandleCake; - materials[11067] = Material.YellowCarpet; - materials[13201] = Material.YellowConcrete; - materials[13217] = Material.YellowConcretePowder; - for (int i = 13149; i <= 13152; i++) - materials[i] = Material.YellowGlazedTerracotta; - for (int i = 13061; i <= 13066; i++) - materials[i] = Material.YellowShulkerBox; - materials[6115] = Material.YellowStainedGlass; - for (int i = 9755; i <= 9786; i++) - materials[i] = Material.YellowStainedGlassPane; - materials[9615] = Material.YellowTerracotta; - for (int i = 11366; i <= 11369; i++) - materials[i] = Material.YellowWallBanner; - materials[2094] = Material.YellowWool; - for (int i = 9162; i <= 9193; i++) - materials[i] = Material.ZombieHead; - for (int i = 9194; i <= 9201; i++) - materials[i] = Material.ZombieWallHead; - } - - // - private static readonly BlockStateDefinition[] stateDefinitions = - [ - new(8, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(12, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(22, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(29, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(31, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(33, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(35, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(37, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(39, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(41, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(43, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(45, 40, - [ - new("age", ["0", "1", "2", "3", "4"], 8), - new("hanging", ["true", "false"], 4), - new("stage", ["0", "1"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(86, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(102, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(119, 4, - [ - new("dusted", ["0", "1", "2", "3"], 1) - ]), - new(125, 4, - [ - new("dusted", ["0", "1", "2", "3"], 1) - ]), - new(136, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(139, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(142, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(145, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(148, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(151, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(154, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(157, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(160, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(163, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(165, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(168, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(171, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(174, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(177, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(180, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(183, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(186, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(189, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(192, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(195, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(198, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(201, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(204, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(207, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(210, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(213, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(216, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(219, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(222, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(225, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(228, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(231, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(234, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(237, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(240, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(243, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(246, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(249, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(252, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(280, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(308, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(336, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(364, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(392, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(420, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(448, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(476, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(504, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(532, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(566, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(581, 1150, - [ - new("instrument", ["harp", "basedrum", "snare", "hat", "bass", "flute", "bell", "guitar", "chime", "xylophone", "iron_xylophone", "cow_bell", "didgeridoo", "bit", "banjo", "pling", "zombie", "skeleton", "creeper", "dragon", "wither_skeleton", "piglin", "custom_head"], 50), - new("note", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"], 2), - new("powered", ["true", "false"], 1) - ]), - new(1731, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1747, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1763, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1779, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1795, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1811, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1827, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1843, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1859, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1875, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1891, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1907, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1923, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1939, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1955, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1971, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1987, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2011, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2035, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(2052, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(2054, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(2066, 24, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("short", ["true", "false"], 2) - ]), - new(2106, 12, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 2) - ]), - new(2137, 2, - [ - new("unstable", ["true", "false"], 1) - ]), - new(2140, 256, - [ - new("facing", ["north", "south", "west", "east"], 64), - new("slot_0_occupied", ["true", "false"], 32), - new("slot_1_occupied", ["true", "false"], 16), - new("slot_2_occupied", ["true", "false"], 8), - new("slot_3_occupied", ["true", "false"], 4), - new("slot_4_occupied", ["true", "false"], 2), - new("slot_5_occupied", ["true", "false"], 1) - ]), - new(2399, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(2403, 512, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(2917, 9, - [ - new("axis", ["x", "y", "z"], 3), - new("creaking", ["disabled", "dormant", "active"], 1) - ]), - new(2926, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3006, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(3030, 1296, - [ - new("east", ["up", "side", "none"], 432), - new("north", ["up", "side", "none"], 144), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 9), - new("south", ["up", "side", "none"], 3), - new("west", ["up", "side", "none"], 1) - ]), - new(4330, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4338, 8, - [ - new("moisture", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4346, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(4354, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4386, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4418, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4450, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4482, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4514, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4546, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4578, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4610, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4642, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4674, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(4738, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4746, 20, - [ - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south", "south_east", "south_west", "north_west", "north_east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4766, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4846, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4854, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4862, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4870, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4878, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4886, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4894, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4902, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4910, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4918, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4926, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4990, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5054, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5118, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5182, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5246, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5310, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5374, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5438, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5502, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5566, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5630, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5694, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5702, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5710, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5718, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5726, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5734, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5742, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5750, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5758, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5766, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5774, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5782, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5790, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5814, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5816, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5880, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5882, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5884, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5886, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5888, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5890, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5892, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5894, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5896, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5898, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5900, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5902, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5904, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5906, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(5914, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5938, 8, - [ - new("layers", ["1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(5948, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5965, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5981, 2, - [ - new("has_record", ["true", "false"], 1) - ]), - new(5983, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6018, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(6021, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(6025, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6030, 2, - [ - new("axis", ["x", "z"], 1) - ]), - new(6032, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6036, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6040, 7, - [ - new("bites", ["0", "1", "2", "3", "4", "5", "6"], 1) - ]), - new(6047, 64, - [ - new("delay", ["1", "2", "3", "4"], 16), - new("facing", ["north", "south", "west", "east"], 4), - new("locked", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6127, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6191, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6255, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6319, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6383, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6447, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6511, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6575, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6639, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6703, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6779, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6843, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6907, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6971, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7003, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7009, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7043, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7047, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7051, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(7059, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(7067, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7099, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7227, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7259, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7339, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7419, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7499, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(7503, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7535, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7615, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(7620, 8, - [ - new("has_bottle_0", ["true", "false"], 4), - new("has_bottle_1", ["true", "false"], 2), - new("has_bottle_2", ["true", "false"], 1) - ]), - new(7629, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(7633, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(7637, 8, - [ - new("eye", ["true", "false"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7647, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(7649, 12, - [ - new("age", ["0", "1", "2"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7661, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7743, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7751, 16, - [ - new("attached", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7767, 128, - [ - new("attached", ["true", "false"], 64), - new("disarmed", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("powered", ["true", "false"], 4), - new("south", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7896, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7976, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8056, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8136, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8149, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(8473, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(8826, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(8834, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(8842, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8866, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8890, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8914, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8938, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8962, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8986, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9010, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9034, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9058, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9082, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9114, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9122, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9154, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9162, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9194, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9202, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9234, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9242, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9274, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9282, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9314, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9322, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9354, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9362, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9366, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9370, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9374, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(9398, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9414, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9430, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("mode", ["compare", "subtract"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9446, 32, - [ - new("inverted", ["true", "false"], 16), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9480, 10, - [ - new("enabled", ["true", "false"], 5), - new("facing", ["down", "north", "south", "west", "east"], 1) - ]), - new(9492, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(9495, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9575, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9599, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(9627, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9659, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9691, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9723, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9755, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9787, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9819, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9851, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9883, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9915, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9947, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9979, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10011, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10043, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10075, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10107, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10139, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10219, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10299, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10379, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10459, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10539, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10619, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10700, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(10702, 32, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10734, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10801, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10881, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10961, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11041, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11047, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11053, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11060, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(11082, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11084, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11086, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11088, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11090, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11092, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11094, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11110, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11126, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11142, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11158, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11174, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11190, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11206, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11222, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11238, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11254, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11270, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11286, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11302, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11318, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11334, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11350, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11354, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11358, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11362, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11366, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11370, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11374, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11378, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11382, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11386, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11390, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11394, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11398, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11402, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11406, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11410, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11417, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11497, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11503, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11509, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11515, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11521, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11527, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11533, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11539, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11545, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11551, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11557, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11563, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11569, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11575, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11581, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11587, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11593, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11599, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11605, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11611, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11617, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11623, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11629, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11635, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11641, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11651, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11683, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11715, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11747, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11779, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11811, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11843, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11875, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11907, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11939, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11971, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12003, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12035, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12067, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12099, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12131, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12163, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12195, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12227, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12291, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12355, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12419, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12483, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12547, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12611, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12675, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12739, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12803, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12809, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12873, 6, - [ - new("age", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(12880, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(12883, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12964, 2, - [ - new("age", ["0", "1"], 1) - ]), - new(12966, 10, - [ - new("age", ["0", "1", "2", "3", "4"], 2), - new("half", ["upper", "lower"], 1) - ]), - new(12976, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(12978, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(12984, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(12996, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13008, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(13015, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(13019, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13031, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13037, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13043, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13049, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13055, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13061, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13067, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13073, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13079, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13085, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13091, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13097, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13103, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13109, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13115, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13121, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13127, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13133, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13137, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13141, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13145, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13149, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13153, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13157, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13161, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13165, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13169, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13173, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13177, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13181, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13185, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13189, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13193, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13229, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(13257, 12, - [ - new("eggs", ["1", "2", "3", "4"], 3), - new("hatch", ["0", "1", "2"], 1) - ]), - new(13269, 3, - [ - new("hatch", ["0", "1", "2"], 1) - ]), - new(13282, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13284, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13286, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13288, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13290, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13292, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13294, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13296, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13298, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13300, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13302, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13304, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13306, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13308, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13310, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13312, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13314, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13316, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13318, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13320, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13322, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13330, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13338, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13346, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13354, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13362, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13370, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13378, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13386, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13394, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13402, 8, - [ - new("pickles", ["1", "2", "3", "4"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13411, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13414, 12, - [ - new("age", ["0", "1"], 6), - new("leaves", ["none", "small", "large"], 2), - new("stage", ["0", "1"], 1) - ]), - new(13429, 2, - [ - new("drag", ["true", "false"], 1) - ]), - new(13431, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13511, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13591, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13671, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13751, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13831, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13911, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13991, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14071, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14151, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14231, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14311, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14391, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14471, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14551, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14557, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14563, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14569, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14575, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14581, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14587, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14593, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14599, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14605, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14611, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14617, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14623, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14629, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(14953, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15277, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15601, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15925, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16249, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16573, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16897, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17221, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17545, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17869, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18193, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18517, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18841, 32, - [ - new("bottom", ["true", "false"], 16), - new("distance", ["0", "1", "2", "3", "4", "5", "6", "7"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18873, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(18877, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("open", ["true", "false"], 1) - ]), - new(18889, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(18897, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(18907, 12, - [ - new("face", ["floor", "wall", "ceiling"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(18919, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("has_book", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18936, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(18940, 32, - [ - new("attachment", ["floor", "ceiling", "single_wall", "double_wall"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(18972, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18976, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(18980, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19012, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19044, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(19048, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19051, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19054, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19057, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19065, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19068, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19071, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19074, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19080, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(19107, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(19137, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19143, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19149, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(19151, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(19153, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(19185, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(19217, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19281, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19345, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19377, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19409, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19489, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19569, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19593, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19617, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19681, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19745, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19777, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19809, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19817, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19825, 4, - [ - new("mode", ["save", "load", "corner", "data"], 1) - ]), - new(19829, 12, - [ - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 1) - ]), - new(19841, 9, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(19850, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(19866, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(19890, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(19919, 5, - [ - new("charges", ["0", "1", "2", "3", "4"], 1) - ]), - new(19930, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20010, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20334, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20344, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20350, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20430, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20755, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20835, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20841, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(20843, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20867, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(21194, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21210, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21226, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21242, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21258, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21274, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21290, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21306, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21322, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21338, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21354, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21370, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21386, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21402, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21418, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21434, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21450, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21466, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21468, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21470, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21472, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21474, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21476, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21478, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21480, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21482, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21484, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21486, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21488, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21490, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21492, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21494, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21496, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21498, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(21502, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21514, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21526, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21538, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21551, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21557, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21637, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(21962, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21968, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22048, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(22374, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22380, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22460, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(22788, 96, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22884, 384, - [ - new("facing", ["north", "south", "west", "east"], 96), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23269, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(23397, 2, - [ - new("bloom", ["true", "false"], 1) - ]), - new(23399, 8, - [ - new("can_summon", ["true", "false"], 4), - new("shrieking", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23425, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23505, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23585, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23665, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23745, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23751, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23757, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23763, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23777, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23857, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23937, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24017, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24097, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24103, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24109, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24115, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24121, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24185, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24249, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24313, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24377, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24441, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24505, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24569, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24633, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24697, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24761, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24825, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24889, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24953, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25017, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25081, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25145, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25147, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25149, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25151, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25153, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25155, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25157, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25159, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25161, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25165, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25169, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25173, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25177, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25181, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25185, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25189, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25193, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25217, 20, - [ - new("thickness", ["tip_merge", "tip", "frustum", "middle", "base"], 4), - new("vertical_direction", ["up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25238, 52, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 2), - new("berries", ["true", "false"], 1) - ]), - new(25290, 2, - [ - new("berries", ["true", "false"], 1) - ]), - new(25296, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("flower_amount", ["1", "2", "3", "4"], 1) - ]), - new(25313, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("tilt", ["none", "unstable", "partial", "full"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25345, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25353, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("half", ["upper", "lower"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25369, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25373, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(25377, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25457, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25463, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(25788, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25868, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25874, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(26199, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26279, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26285, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(26610, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26690, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26696, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(27023, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(27032, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(27035, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(27038, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(27043, 16, - [ - new("cracked", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27059, 48, - [ - new("crafting", ["true", "false"], 24), - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(27107, 12, - [ - new("ominous", ["true", "false"], 6), - new("trial_spawner_state", ["inactive", "waiting_for_players", "active", "waiting_for_reward_ejection", "ejecting_reward", "cooldown"], 1) - ]), - new(27119, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("ominous", ["true", "false"], 4), - new("vault_state", ["inactive", "active", "unlocking", "ejecting"], 1) - ]), - new(27151, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(27154, 162, - [ - new("bottom", ["true", "false"], 81), - new("east", ["none", "low", "tall"], 27), - new("north", ["none", "low", "tall"], 9), - new("south", ["none", "low", "tall"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(27316, 2, - [ - new("tip", ["true", "false"], 1) - ]), - ]; - // - - protected override Dictionary GetDict() - { - return materials; - } - - protected override BlockStateDefinition[] GetStateDefinitions() - { - return stateDefinitions; - } - } -} diff --git a/MinecraftClient/Mapping/BlockPalettes/Palette1214.cs b/MinecraftClient/Mapping/BlockPalettes/Palette1214.cs deleted file mode 100644 index 5d862fb6f2..0000000000 --- a/MinecraftClient/Mapping/BlockPalettes/Palette1214.cs +++ /dev/null @@ -1,5762 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.BlockPalettes -{ - public class Palette1214 : BlockPalette - { - private static readonly Dictionary materials = new(); - - static Palette1214() - { - for (int i = 9482; i <= 9505; i++) - materials[i] = Material.AcaciaButton; - for (int i = 12963; i <= 13026; i++) - materials[i] = Material.AcaciaDoor; - for (int i = 12579; i <= 12610; i++) - materials[i] = Material.AcaciaFence; - for (int i = 12291; i <= 12322; i++) - materials[i] = Material.AcaciaFenceGate; - for (int i = 5121; i <= 5184; i++) - materials[i] = Material.AcaciaHangingSign; - for (int i = 364; i <= 391; i++) - materials[i] = Material.AcaciaLeaves; - for (int i = 148; i <= 150; i++) - materials[i] = Material.AcaciaLog; - materials[19] = Material.AcaciaPlanks; - for (int i = 5891; i <= 5892; i++) - materials[i] = Material.AcaciaPressurePlate; - for (int i = 37; i <= 38; i++) - materials[i] = Material.AcaciaSapling; - for (int i = 4453; i <= 4484; i++) - materials[i] = Material.AcaciaSign; - for (int i = 12065; i <= 12070; i++) - materials[i] = Material.AcaciaSlab; - for (int i = 10683; i <= 10762; i++) - materials[i] = Material.AcaciaStairs; - for (int i = 6386; i <= 6449; i++) - materials[i] = Material.AcaciaTrapdoor; - for (int i = 5721; i <= 5728; i++) - materials[i] = Material.AcaciaWallHangingSign; - for (int i = 4873; i <= 4880; i++) - materials[i] = Material.AcaciaWallSign; - for (int i = 213; i <= 215; i++) - materials[i] = Material.AcaciaWood; - for (int i = 10119; i <= 10142; i++) - materials[i] = Material.ActivatorRail; - materials[0] = Material.Air; - materials[2122] = Material.Allium; - materials[22044] = Material.AmethystBlock; - for (int i = 22046; i <= 22057; i++) - materials[i] = Material.AmethystCluster; - materials[20461] = Material.AncientDebris; - materials[6] = Material.Andesite; - for (int i = 15149; i <= 15154; i++) - materials[i] = Material.AndesiteSlab; - for (int i = 14775; i <= 14854; i++) - materials[i] = Material.AndesiteStairs; - for (int i = 17765; i <= 18088; i++) - materials[i] = Material.AndesiteWall; - for (int i = 9906; i <= 9909; i++) - materials[i] = Material.Anvil; - for (int i = 7050; i <= 7053; i++) - materials[i] = Material.AttachedMelonStem; - for (int i = 7046; i <= 7049; i++) - materials[i] = Material.AttachedPumpkinStem; - materials[25837] = Material.Azalea; - for (int i = 504; i <= 531; i++) - materials[i] = Material.AzaleaLeaves; - materials[2123] = Material.AzureBluet; - for (int i = 13958; i <= 13969; i++) - materials[i] = Material.Bamboo; - for (int i = 168; i <= 170; i++) - materials[i] = Material.BambooBlock; - for (int i = 9602; i <= 9625; i++) - materials[i] = Material.BambooButton; - for (int i = 13283; i <= 13346; i++) - materials[i] = Material.BambooDoor; - for (int i = 12739; i <= 12770; i++) - materials[i] = Material.BambooFence; - for (int i = 12451; i <= 12482; i++) - materials[i] = Material.BambooFenceGate; - for (int i = 5633; i <= 5696; i++) - materials[i] = Material.BambooHangingSign; - materials[28] = Material.BambooMosaic; - for (int i = 12101; i <= 12106; i++) - materials[i] = Material.BambooMosaicSlab; - for (int i = 11163; i <= 11242; i++) - materials[i] = Material.BambooMosaicStairs; - materials[27] = Material.BambooPlanks; - for (int i = 5901; i <= 5902; i++) - materials[i] = Material.BambooPressurePlate; - materials[13957] = Material.BambooSapling; - for (int i = 4645; i <= 4676; i++) - materials[i] = Material.BambooSign; - for (int i = 12095; i <= 12100; i++) - materials[i] = Material.BambooSlab; - for (int i = 11083; i <= 11162; i++) - materials[i] = Material.BambooStairs; - for (int i = 6706; i <= 6769; i++) - materials[i] = Material.BambooTrapdoor; - for (int i = 5785; i <= 5792; i++) - materials[i] = Material.BambooWallHangingSign; - for (int i = 4921; i <= 4928; i++) - materials[i] = Material.BambooWallSign; - for (int i = 19421; i <= 19432; i++) - materials[i] = Material.Barrel; - for (int i = 11244; i <= 11245; i++) - materials[i] = Material.Barrier; - for (int i = 6021; i <= 6023; i++) - materials[i] = Material.Basalt; - materials[8692] = Material.Beacon; - materials[85] = Material.Bedrock; - for (int i = 20410; i <= 20433; i++) - materials[i] = Material.BeeNest; - for (int i = 20434; i <= 20457; i++) - materials[i] = Material.Beehive; - for (int i = 13522; i <= 13525; i++) - materials[i] = Material.Beetroots; - for (int i = 19484; i <= 19515; i++) - materials[i] = Material.Bell; - for (int i = 25857; i <= 25888; i++) - materials[i] = Material.BigDripleaf; - for (int i = 25889; i <= 25896; i++) - materials[i] = Material.BigDripleafStem; - for (int i = 9434; i <= 9457; i++) - materials[i] = Material.BirchButton; - for (int i = 12835; i <= 12898; i++) - materials[i] = Material.BirchDoor; - for (int i = 12515; i <= 12546; i++) - materials[i] = Material.BirchFence; - for (int i = 12227; i <= 12258; i++) - materials[i] = Material.BirchFenceGate; - for (int i = 5057; i <= 5120; i++) - materials[i] = Material.BirchHangingSign; - for (int i = 308; i <= 335; i++) - materials[i] = Material.BirchLeaves; - for (int i = 142; i <= 144; i++) - materials[i] = Material.BirchLog; - materials[17] = Material.BirchPlanks; - for (int i = 5887; i <= 5888; i++) - materials[i] = Material.BirchPressurePlate; - for (int i = 33; i <= 34; i++) - materials[i] = Material.BirchSapling; - for (int i = 4421; i <= 4452; i++) - materials[i] = Material.BirchSign; - for (int i = 12053; i <= 12058; i++) - materials[i] = Material.BirchSlab; - for (int i = 8520; i <= 8599; i++) - materials[i] = Material.BirchStairs; - for (int i = 6258; i <= 6321; i++) - materials[i] = Material.BirchTrapdoor; - for (int i = 5713; i <= 5720; i++) - materials[i] = Material.BirchWallHangingSign; - for (int i = 4865; i <= 4872; i++) - materials[i] = Material.BirchWallSign; - for (int i = 207; i <= 209; i++) - materials[i] = Material.BirchWood; - for (int i = 11878; i <= 11893; i++) - materials[i] = Material.BlackBanner; - for (int i = 1971; i <= 1986; i++) - materials[i] = Material.BlackBed; - for (int i = 21994; i <= 22009; i++) - materials[i] = Material.BlackCandle; - for (int i = 22042; i <= 22043; i++) - materials[i] = Material.BlackCandleCake; - materials[11622] = Material.BlackCarpet; - materials[13756] = Material.BlackConcrete; - materials[13772] = Material.BlackConcretePowder; - for (int i = 13737; i <= 13740; i++) - materials[i] = Material.BlackGlazedTerracotta; - for (int i = 13671; i <= 13676; i++) - materials[i] = Material.BlackShulkerBox; - materials[6129] = Material.BlackStainedGlass; - for (int i = 10651; i <= 10682; i++) - materials[i] = Material.BlackStainedGlassPane; - materials[10170] = Material.BlackTerracotta; - for (int i = 11954; i <= 11957; i++) - materials[i] = Material.BlackWallBanner; - materials[2105] = Material.BlackWool; - materials[20473] = Material.Blackstone; - for (int i = 20878; i <= 20883; i++) - materials[i] = Material.BlackstoneSlab; - for (int i = 20474; i <= 20553; i++) - materials[i] = Material.BlackstoneStairs; - for (int i = 20554; i <= 20877; i++) - materials[i] = Material.BlackstoneWall; - for (int i = 19441; i <= 19448; i++) - materials[i] = Material.BlastFurnace; - for (int i = 11814; i <= 11829; i++) - materials[i] = Material.BlueBanner; - for (int i = 1907; i <= 1922; i++) - materials[i] = Material.BlueBed; - for (int i = 21930; i <= 21945; i++) - materials[i] = Material.BlueCandle; - for (int i = 22034; i <= 22035; i++) - materials[i] = Material.BlueCandleCake; - materials[11618] = Material.BlueCarpet; - materials[13752] = Material.BlueConcrete; - materials[13768] = Material.BlueConcretePowder; - for (int i = 13721; i <= 13724; i++) - materials[i] = Material.BlueGlazedTerracotta; - materials[13954] = Material.BlueIce; - materials[2121] = Material.BlueOrchid; - for (int i = 13647; i <= 13652; i++) - materials[i] = Material.BlueShulkerBox; - materials[6125] = Material.BlueStainedGlass; - for (int i = 10523; i <= 10554; i++) - materials[i] = Material.BlueStainedGlassPane; - materials[10166] = Material.BlueTerracotta; - for (int i = 11938; i <= 11941; i++) - materials[i] = Material.BlueWallBanner; - materials[2101] = Material.BlueWool; - for (int i = 13559; i <= 13561; i++) - materials[i] = Material.BoneBlock; - materials[2139] = Material.Bookshelf; - for (int i = 13838; i <= 13839; i++) - materials[i] = Material.BrainCoral; - materials[13822] = Material.BrainCoralBlock; - for (int i = 13858; i <= 13859; i++) - materials[i] = Material.BrainCoralFan; - for (int i = 13914; i <= 13921; i++) - materials[i] = Material.BrainCoralWallFan; - for (int i = 8164; i <= 8171; i++) - materials[i] = Material.BrewingStand; - for (int i = 12143; i <= 12148; i++) - materials[i] = Material.BrickSlab; - for (int i = 7390; i <= 7469; i++) - materials[i] = Material.BrickStairs; - for (int i = 15173; i <= 15496; i++) - materials[i] = Material.BrickWall; - materials[2136] = Material.Bricks; - for (int i = 11830; i <= 11845; i++) - materials[i] = Material.BrownBanner; - for (int i = 1923; i <= 1938; i++) - materials[i] = Material.BrownBed; - for (int i = 21946; i <= 21961; i++) - materials[i] = Material.BrownCandle; - for (int i = 22036; i <= 22037; i++) - materials[i] = Material.BrownCandleCake; - materials[11619] = Material.BrownCarpet; - materials[13753] = Material.BrownConcrete; - materials[13769] = Material.BrownConcretePowder; - for (int i = 13725; i <= 13728; i++) - materials[i] = Material.BrownGlazedTerracotta; - materials[2132] = Material.BrownMushroom; - for (int i = 6782; i <= 6845; i++) - materials[i] = Material.BrownMushroomBlock; - for (int i = 13653; i <= 13658; i++) - materials[i] = Material.BrownShulkerBox; - materials[6126] = Material.BrownStainedGlass; - for (int i = 10555; i <= 10586; i++) - materials[i] = Material.BrownStainedGlassPane; - materials[10167] = Material.BrownTerracotta; - for (int i = 11942; i <= 11945; i++) - materials[i] = Material.BrownWallBanner; - materials[2102] = Material.BrownWool; - for (int i = 13973; i <= 13974; i++) - materials[i] = Material.BubbleColumn; - for (int i = 13840; i <= 13841; i++) - materials[i] = Material.BubbleCoral; - materials[13823] = Material.BubbleCoralBlock; - for (int i = 13860; i <= 13861; i++) - materials[i] = Material.BubbleCoralFan; - for (int i = 13922; i <= 13929; i++) - materials[i] = Material.BubbleCoralWallFan; - materials[22045] = Material.BuddingAmethyst; - for (int i = 5951; i <= 5966; i++) - materials[i] = Material.Cactus; - for (int i = 6043; i <= 6049; i++) - materials[i] = Material.Cake; - materials[23329] = Material.Calcite; - for (int i = 23428; i <= 23811; i++) - materials[i] = Material.CalibratedSculkSensor; - for (int i = 19524; i <= 19555; i++) - materials[i] = Material.Campfire; - for (int i = 21738; i <= 21753; i++) - materials[i] = Material.Candle; - for (int i = 22010; i <= 22011; i++) - materials[i] = Material.CandleCake; - for (int i = 9370; i <= 9377; i++) - materials[i] = Material.Carrots; - materials[19449] = Material.CartographyTable; - for (int i = 6035; i <= 6038; i++) - materials[i] = Material.CarvedPumpkin; - materials[8172] = Material.Cauldron; - materials[13972] = Material.CaveAir; - for (int i = 25782; i <= 25833; i++) - materials[i] = Material.CaveVines; - for (int i = 25834; i <= 25835; i++) - materials[i] = Material.CaveVinesPlant; - for (int i = 7006; i <= 7011; i++) - materials[i] = Material.Chain; - for (int i = 13540; i <= 13551; i++) - materials[i] = Material.ChainCommandBlock; - for (int i = 9506; i <= 9529; i++) - materials[i] = Material.CherryButton; - for (int i = 13027; i <= 13090; i++) - materials[i] = Material.CherryDoor; - for (int i = 12611; i <= 12642; i++) - materials[i] = Material.CherryFence; - for (int i = 12323; i <= 12354; i++) - materials[i] = Material.CherryFenceGate; - for (int i = 5185; i <= 5248; i++) - materials[i] = Material.CherryHangingSign; - for (int i = 392; i <= 419; i++) - materials[i] = Material.CherryLeaves; - for (int i = 151; i <= 153; i++) - materials[i] = Material.CherryLog; - materials[20] = Material.CherryPlanks; - for (int i = 5893; i <= 5894; i++) - materials[i] = Material.CherryPressurePlate; - for (int i = 39; i <= 40; i++) - materials[i] = Material.CherrySapling; - for (int i = 4485; i <= 4516; i++) - materials[i] = Material.CherrySign; - for (int i = 12071; i <= 12076; i++) - materials[i] = Material.CherrySlab; - for (int i = 10763; i <= 10842; i++) - materials[i] = Material.CherryStairs; - for (int i = 6450; i <= 6513; i++) - materials[i] = Material.CherryTrapdoor; - for (int i = 5729; i <= 5736; i++) - materials[i] = Material.CherryWallHangingSign; - for (int i = 4881; i <= 4888; i++) - materials[i] = Material.CherryWallSign; - for (int i = 216; i <= 218; i++) - materials[i] = Material.CherryWood; - for (int i = 3009; i <= 3032; i++) - materials[i] = Material.Chest; - for (int i = 9910; i <= 9913; i++) - materials[i] = Material.ChippedAnvil; - for (int i = 2140; i <= 2395; i++) - materials[i] = Material.ChiseledBookshelf; - materials[23964] = Material.ChiseledCopper; - materials[27564] = Material.ChiseledDeepslate; - materials[21735] = Material.ChiseledNetherBricks; - materials[20887] = Material.ChiseledPolishedBlackstone; - materials[10035] = Material.ChiseledQuartzBlock; - materials[11959] = Material.ChiseledRedSandstone; - materials[8045] = Material.ChiseledResinBricks; - materials[579] = Material.ChiseledSandstone; - materials[6773] = Material.ChiseledStoneBricks; - materials[22916] = Material.ChiseledTuff; - materials[23328] = Material.ChiseledTuffBricks; - for (int i = 13417; i <= 13422; i++) - materials[i] = Material.ChorusFlower; - for (int i = 13353; i <= 13416; i++) - materials[i] = Material.ChorusPlant; - materials[5967] = Material.Clay; - materials[27863] = Material.ClosedEyeblossom; - materials[11624] = Material.CoalBlock; - materials[133] = Material.CoalOre; - materials[11] = Material.CoarseDirt; - materials[25920] = Material.CobbledDeepslate; - for (int i = 26001; i <= 26006; i++) - materials[i] = Material.CobbledDeepslateSlab; - for (int i = 25921; i <= 26000; i++) - materials[i] = Material.CobbledDeepslateStairs; - for (int i = 26007; i <= 26330; i++) - materials[i] = Material.CobbledDeepslateWall; - materials[14] = Material.Cobblestone; - for (int i = 12137; i <= 12142; i++) - materials[i] = Material.CobblestoneSlab; - for (int i = 4769; i <= 4848; i++) - materials[i] = Material.CobblestoneStairs; - for (int i = 8693; i <= 9016; i++) - materials[i] = Material.CobblestoneWall; - materials[2047] = Material.Cobweb; - for (int i = 8193; i <= 8204; i++) - materials[i] = Material.Cocoa; - for (int i = 8680; i <= 8691; i++) - materials[i] = Material.CommandBlock; - for (int i = 9974; i <= 9989; i++) - materials[i] = Material.Comparator; - for (int i = 20385; i <= 20393; i++) - materials[i] = Material.Composter; - for (int i = 13955; i <= 13956; i++) - materials[i] = Material.Conduit; - materials[23951] = Material.CopperBlock; - for (int i = 25705; i <= 25708; i++) - materials[i] = Material.CopperBulb; - for (int i = 24665; i <= 24728; i++) - materials[i] = Material.CopperDoor; - for (int i = 25689; i <= 25690; i++) - materials[i] = Material.CopperGrate; - materials[23955] = Material.CopperOre; - for (int i = 25177; i <= 25240; i++) - materials[i] = Material.CopperTrapdoor; - materials[2129] = Material.Cornflower; - materials[27565] = Material.CrackedDeepslateBricks; - materials[27566] = Material.CrackedDeepslateTiles; - materials[21736] = Material.CrackedNetherBricks; - materials[20886] = Material.CrackedPolishedBlackstoneBricks; - materials[6772] = Material.CrackedStoneBricks; - for (int i = 27603; i <= 27650; i++) - materials[i] = Material.Crafter; - materials[4332] = Material.CraftingTable; - for (int i = 2917; i <= 2928; i++) - materials[i] = Material.CreakingHeart; - for (int i = 9786; i <= 9817; i++) - materials[i] = Material.CreeperHead; - for (int i = 9818; i <= 9825; i++) - materials[i] = Material.CreeperWallHead; - for (int i = 20113; i <= 20136; i++) - materials[i] = Material.CrimsonButton; - for (int i = 20161; i <= 20224; i++) - materials[i] = Material.CrimsonDoor; - for (int i = 19697; i <= 19728; i++) - materials[i] = Material.CrimsonFence; - for (int i = 19889; i <= 19920; i++) - materials[i] = Material.CrimsonFenceGate; - materials[19622] = Material.CrimsonFungus; - for (int i = 5441; i <= 5504; i++) - materials[i] = Material.CrimsonHangingSign; - for (int i = 19615; i <= 19617; i++) - materials[i] = Material.CrimsonHyphae; - materials[19621] = Material.CrimsonNylium; - materials[19679] = Material.CrimsonPlanks; - for (int i = 19693; i <= 19694; i++) - materials[i] = Material.CrimsonPressurePlate; - materials[19678] = Material.CrimsonRoots; - for (int i = 20289; i <= 20320; i++) - materials[i] = Material.CrimsonSign; - for (int i = 19681; i <= 19686; i++) - materials[i] = Material.CrimsonSlab; - for (int i = 19953; i <= 20032; i++) - materials[i] = Material.CrimsonStairs; - for (int i = 19609; i <= 19611; i++) - materials[i] = Material.CrimsonStem; - for (int i = 19761; i <= 19824; i++) - materials[i] = Material.CrimsonTrapdoor; - for (int i = 5769; i <= 5776; i++) - materials[i] = Material.CrimsonWallHangingSign; - for (int i = 20353; i <= 20360; i++) - materials[i] = Material.CrimsonWallSign; - materials[20462] = Material.CryingObsidian; - materials[23960] = Material.CutCopper; - for (int i = 24307; i <= 24312; i++) - materials[i] = Material.CutCopperSlab; - for (int i = 24209; i <= 24288; i++) - materials[i] = Material.CutCopperStairs; - materials[11960] = Material.CutRedSandstone; - for (int i = 12179; i <= 12184; i++) - materials[i] = Material.CutRedSandstoneSlab; - materials[580] = Material.CutSandstone; - for (int i = 12125; i <= 12130; i++) - materials[i] = Material.CutSandstoneSlab; - for (int i = 11782; i <= 11797; i++) - materials[i] = Material.CyanBanner; - for (int i = 1875; i <= 1890; i++) - materials[i] = Material.CyanBed; - for (int i = 21898; i <= 21913; i++) - materials[i] = Material.CyanCandle; - for (int i = 22030; i <= 22031; i++) - materials[i] = Material.CyanCandleCake; - materials[11616] = Material.CyanCarpet; - materials[13750] = Material.CyanConcrete; - materials[13766] = Material.CyanConcretePowder; - for (int i = 13713; i <= 13716; i++) - materials[i] = Material.CyanGlazedTerracotta; - for (int i = 13635; i <= 13640; i++) - materials[i] = Material.CyanShulkerBox; - materials[6123] = Material.CyanStainedGlass; - for (int i = 10459; i <= 10490; i++) - materials[i] = Material.CyanStainedGlassPane; - materials[10164] = Material.CyanTerracotta; - for (int i = 11930; i <= 11933; i++) - materials[i] = Material.CyanWallBanner; - materials[2099] = Material.CyanWool; - for (int i = 9914; i <= 9917; i++) - materials[i] = Material.DamagedAnvil; - materials[2118] = Material.Dandelion; - for (int i = 9530; i <= 9553; i++) - materials[i] = Material.DarkOakButton; - for (int i = 13091; i <= 13154; i++) - materials[i] = Material.DarkOakDoor; - for (int i = 12643; i <= 12674; i++) - materials[i] = Material.DarkOakFence; - for (int i = 12355; i <= 12386; i++) - materials[i] = Material.DarkOakFenceGate; - for (int i = 5313; i <= 5376; i++) - materials[i] = Material.DarkOakHangingSign; - for (int i = 420; i <= 447; i++) - materials[i] = Material.DarkOakLeaves; - for (int i = 154; i <= 156; i++) - materials[i] = Material.DarkOakLog; - materials[21] = Material.DarkOakPlanks; - for (int i = 5895; i <= 5896; i++) - materials[i] = Material.DarkOakPressurePlate; - for (int i = 41; i <= 42; i++) - materials[i] = Material.DarkOakSapling; - for (int i = 4549; i <= 4580; i++) - materials[i] = Material.DarkOakSign; - for (int i = 12077; i <= 12082; i++) - materials[i] = Material.DarkOakSlab; - for (int i = 10843; i <= 10922; i++) - materials[i] = Material.DarkOakStairs; - for (int i = 6514; i <= 6577; i++) - materials[i] = Material.DarkOakTrapdoor; - for (int i = 5745; i <= 5752; i++) - materials[i] = Material.DarkOakWallHangingSign; - for (int i = 4897; i <= 4904; i++) - materials[i] = Material.DarkOakWallSign; - for (int i = 219; i <= 221; i++) - materials[i] = Material.DarkOakWood; - materials[11344] = Material.DarkPrismarine; - for (int i = 11597; i <= 11602; i++) - materials[i] = Material.DarkPrismarineSlab; - for (int i = 11505; i <= 11584; i++) - materials[i] = Material.DarkPrismarineStairs; - for (int i = 9990; i <= 10021; i++) - materials[i] = Material.DaylightDetector; - for (int i = 13828; i <= 13829; i++) - materials[i] = Material.DeadBrainCoral; - materials[13817] = Material.DeadBrainCoralBlock; - for (int i = 13848; i <= 13849; i++) - materials[i] = Material.DeadBrainCoralFan; - for (int i = 13874; i <= 13881; i++) - materials[i] = Material.DeadBrainCoralWallFan; - for (int i = 13830; i <= 13831; i++) - materials[i] = Material.DeadBubbleCoral; - materials[13818] = Material.DeadBubbleCoralBlock; - for (int i = 13850; i <= 13851; i++) - materials[i] = Material.DeadBubbleCoralFan; - for (int i = 13882; i <= 13889; i++) - materials[i] = Material.DeadBubbleCoralWallFan; - materials[2050] = Material.DeadBush; - for (int i = 13832; i <= 13833; i++) - materials[i] = Material.DeadFireCoral; - materials[13819] = Material.DeadFireCoralBlock; - for (int i = 13852; i <= 13853; i++) - materials[i] = Material.DeadFireCoralFan; - for (int i = 13890; i <= 13897; i++) - materials[i] = Material.DeadFireCoralWallFan; - for (int i = 13834; i <= 13835; i++) - materials[i] = Material.DeadHornCoral; - materials[13820] = Material.DeadHornCoralBlock; - for (int i = 13854; i <= 13855; i++) - materials[i] = Material.DeadHornCoralFan; - for (int i = 13898; i <= 13905; i++) - materials[i] = Material.DeadHornCoralWallFan; - for (int i = 13826; i <= 13827; i++) - materials[i] = Material.DeadTubeCoral; - materials[13816] = Material.DeadTubeCoralBlock; - for (int i = 13846; i <= 13847; i++) - materials[i] = Material.DeadTubeCoralFan; - for (int i = 13866; i <= 13873; i++) - materials[i] = Material.DeadTubeCoralWallFan; - for (int i = 27587; i <= 27602; i++) - materials[i] = Material.DecoratedPot; - for (int i = 25917; i <= 25919; i++) - materials[i] = Material.Deepslate; - for (int i = 27234; i <= 27239; i++) - materials[i] = Material.DeepslateBrickSlab; - for (int i = 27154; i <= 27233; i++) - materials[i] = Material.DeepslateBrickStairs; - for (int i = 27240; i <= 27563; i++) - materials[i] = Material.DeepslateBrickWall; - materials[27153] = Material.DeepslateBricks; - materials[134] = Material.DeepslateCoalOre; - materials[23956] = Material.DeepslateCopperOre; - materials[4330] = Material.DeepslateDiamondOre; - materials[8286] = Material.DeepslateEmeraldOre; - materials[130] = Material.DeepslateGoldOre; - materials[132] = Material.DeepslateIronOre; - materials[564] = Material.DeepslateLapisOre; - for (int i = 5905; i <= 5906; i++) - materials[i] = Material.DeepslateRedstoneOre; - for (int i = 26823; i <= 26828; i++) - materials[i] = Material.DeepslateTileSlab; - for (int i = 26743; i <= 26822; i++) - materials[i] = Material.DeepslateTileStairs; - for (int i = 26829; i <= 27152; i++) - materials[i] = Material.DeepslateTileWall; - materials[26742] = Material.DeepslateTiles; - for (int i = 2011; i <= 2034; i++) - materials[i] = Material.DetectorRail; - materials[4331] = Material.DiamondBlock; - materials[4329] = Material.DiamondOre; - materials[4] = Material.Diorite; - for (int i = 15167; i <= 15172; i++) - materials[i] = Material.DioriteSlab; - for (int i = 15015; i <= 15094; i++) - materials[i] = Material.DioriteStairs; - for (int i = 19061; i <= 19384; i++) - materials[i] = Material.DioriteWall; - materials[10] = Material.Dirt; - materials[13526] = Material.DirtPath; - for (int i = 566; i <= 577; i++) - materials[i] = Material.Dispenser; - materials[8190] = Material.DragonEgg; - for (int i = 9826; i <= 9857; i++) - materials[i] = Material.DragonHead; - for (int i = 9858; i <= 9865; i++) - materials[i] = Material.DragonWallHead; - materials[13800] = Material.DriedKelpBlock; - materials[25781] = Material.DripstoneBlock; - for (int i = 10143; i <= 10154; i++) - materials[i] = Material.Dropper; - materials[8439] = Material.EmeraldBlock; - materials[8285] = Material.EmeraldOre; - materials[8163] = Material.EnchantingTable; - materials[13527] = Material.EndGateway; - materials[8180] = Material.EndPortal; - for (int i = 8181; i <= 8188; i++) - materials[i] = Material.EndPortalFrame; - for (int i = 13347; i <= 13352; i++) - materials[i] = Material.EndRod; - materials[8189] = Material.EndStone; - for (int i = 15125; i <= 15130; i++) - materials[i] = Material.EndStoneBrickSlab; - for (int i = 14375; i <= 14454; i++) - materials[i] = Material.EndStoneBrickStairs; - for (int i = 18737; i <= 19060; i++) - materials[i] = Material.EndStoneBrickWall; - materials[13507] = Material.EndStoneBricks; - for (int i = 8287; i <= 8294; i++) - materials[i] = Material.EnderChest; - materials[23963] = Material.ExposedChiseledCopper; - materials[23952] = Material.ExposedCopper; - for (int i = 25709; i <= 25712; i++) - materials[i] = Material.ExposedCopperBulb; - for (int i = 24729; i <= 24792; i++) - materials[i] = Material.ExposedCopperDoor; - for (int i = 25691; i <= 25692; i++) - materials[i] = Material.ExposedCopperGrate; - for (int i = 25241; i <= 25304; i++) - materials[i] = Material.ExposedCopperTrapdoor; - materials[23959] = Material.ExposedCutCopper; - for (int i = 24301; i <= 24306; i++) - materials[i] = Material.ExposedCutCopperSlab; - for (int i = 24129; i <= 24208; i++) - materials[i] = Material.ExposedCutCopperStairs; - for (int i = 4341; i <= 4348; i++) - materials[i] = Material.Farmland; - materials[2049] = Material.Fern; - for (int i = 2403; i <= 2914; i++) - materials[i] = Material.Fire; - for (int i = 13842; i <= 13843; i++) - materials[i] = Material.FireCoral; - materials[13824] = Material.FireCoralBlock; - for (int i = 13862; i <= 13863; i++) - materials[i] = Material.FireCoralFan; - for (int i = 13930; i <= 13937; i++) - materials[i] = Material.FireCoralWallFan; - materials[19450] = Material.FletchingTable; - materials[9341] = Material.FlowerPot; - materials[25838] = Material.FloweringAzalea; - for (int i = 532; i <= 559; i++) - materials[i] = Material.FloweringAzaleaLeaves; - materials[27585] = Material.Frogspawn; - for (int i = 13552; i <= 13555; i++) - materials[i] = Material.FrostedIce; - for (int i = 4349; i <= 4356; i++) - materials[i] = Material.Furnace; - materials[21298] = Material.GildedBlackstone; - materials[562] = Material.Glass; - for (int i = 7012; i <= 7043; i++) - materials[i] = Material.GlassPane; - for (int i = 7102; i <= 7229; i++) - materials[i] = Material.GlowLichen; - materials[6032] = Material.Glowstone; - materials[2134] = Material.GoldBlock; - materials[129] = Material.GoldOre; - materials[2] = Material.Granite; - for (int i = 15143; i <= 15148; i++) - materials[i] = Material.GraniteSlab; - for (int i = 14695; i <= 14774; i++) - materials[i] = Material.GraniteStairs; - for (int i = 16469; i <= 16792; i++) - materials[i] = Material.GraniteWall; - for (int i = 8; i <= 9; i++) - materials[i] = Material.GrassBlock; - materials[124] = Material.Gravel; - for (int i = 11750; i <= 11765; i++) - materials[i] = Material.GrayBanner; - for (int i = 1843; i <= 1858; i++) - materials[i] = Material.GrayBed; - for (int i = 21866; i <= 21881; i++) - materials[i] = Material.GrayCandle; - for (int i = 22026; i <= 22027; i++) - materials[i] = Material.GrayCandleCake; - materials[11614] = Material.GrayCarpet; - materials[13748] = Material.GrayConcrete; - materials[13764] = Material.GrayConcretePowder; - for (int i = 13705; i <= 13708; i++) - materials[i] = Material.GrayGlazedTerracotta; - for (int i = 13623; i <= 13628; i++) - materials[i] = Material.GrayShulkerBox; - materials[6121] = Material.GrayStainedGlass; - for (int i = 10395; i <= 10426; i++) - materials[i] = Material.GrayStainedGlassPane; - materials[10162] = Material.GrayTerracotta; - for (int i = 11922; i <= 11925; i++) - materials[i] = Material.GrayWallBanner; - materials[2097] = Material.GrayWool; - for (int i = 11846; i <= 11861; i++) - materials[i] = Material.GreenBanner; - for (int i = 1939; i <= 1954; i++) - materials[i] = Material.GreenBed; - for (int i = 21962; i <= 21977; i++) - materials[i] = Material.GreenCandle; - for (int i = 22038; i <= 22039; i++) - materials[i] = Material.GreenCandleCake; - materials[11620] = Material.GreenCarpet; - materials[13754] = Material.GreenConcrete; - materials[13770] = Material.GreenConcretePowder; - for (int i = 13729; i <= 13732; i++) - materials[i] = Material.GreenGlazedTerracotta; - for (int i = 13659; i <= 13664; i++) - materials[i] = Material.GreenShulkerBox; - materials[6127] = Material.GreenStainedGlass; - for (int i = 10587; i <= 10618; i++) - materials[i] = Material.GreenStainedGlassPane; - materials[10168] = Material.GreenTerracotta; - for (int i = 11946; i <= 11949; i++) - materials[i] = Material.GreenWallBanner; - materials[2103] = Material.GreenWool; - for (int i = 19451; i <= 19462; i++) - materials[i] = Material.Grindstone; - for (int i = 25913; i <= 25914; i++) - materials[i] = Material.HangingRoots; - for (int i = 11604; i <= 11606; i++) - materials[i] = Material.HayBlock; - for (int i = 27695; i <= 27696; i++) - materials[i] = Material.HeavyCore; - for (int i = 9958; i <= 9973; i++) - materials[i] = Material.HeavyWeightedPressurePlate; - materials[20458] = Material.HoneyBlock; - materials[20459] = Material.HoneycombBlock; - for (int i = 10024; i <= 10033; i++) - materials[i] = Material.Hopper; - for (int i = 13844; i <= 13845; i++) - materials[i] = Material.HornCoral; - materials[13825] = Material.HornCoralBlock; - for (int i = 13864; i <= 13865; i++) - materials[i] = Material.HornCoralFan; - for (int i = 13938; i <= 13945; i++) - materials[i] = Material.HornCoralWallFan; - materials[5949] = Material.Ice; - materials[6781] = Material.InfestedChiseledStoneBricks; - materials[6777] = Material.InfestedCobblestone; - materials[6780] = Material.InfestedCrackedStoneBricks; - for (int i = 27567; i <= 27569; i++) - materials[i] = Material.InfestedDeepslate; - materials[6779] = Material.InfestedMossyStoneBricks; - materials[6776] = Material.InfestedStone; - materials[6778] = Material.InfestedStoneBricks; - for (int i = 6974; i <= 7005; i++) - materials[i] = Material.IronBars; - materials[2135] = Material.IronBlock; - for (int i = 5819; i <= 5882; i++) - materials[i] = Material.IronDoor; - materials[131] = Material.IronOre; - for (int i = 11278; i <= 11341; i++) - materials[i] = Material.IronTrapdoor; - for (int i = 6039; i <= 6042; i++) - materials[i] = Material.JackOLantern; - for (int i = 20373; i <= 20384; i++) - materials[i] = Material.Jigsaw; - for (int i = 5984; i <= 5985; i++) - materials[i] = Material.Jukebox; - for (int i = 9458; i <= 9481; i++) - materials[i] = Material.JungleButton; - for (int i = 12899; i <= 12962; i++) - materials[i] = Material.JungleDoor; - for (int i = 12547; i <= 12578; i++) - materials[i] = Material.JungleFence; - for (int i = 12259; i <= 12290; i++) - materials[i] = Material.JungleFenceGate; - for (int i = 5249; i <= 5312; i++) - materials[i] = Material.JungleHangingSign; - for (int i = 336; i <= 363; i++) - materials[i] = Material.JungleLeaves; - for (int i = 145; i <= 147; i++) - materials[i] = Material.JungleLog; - materials[18] = Material.JunglePlanks; - for (int i = 5889; i <= 5890; i++) - materials[i] = Material.JunglePressurePlate; - for (int i = 35; i <= 36; i++) - materials[i] = Material.JungleSapling; - for (int i = 4517; i <= 4548; i++) - materials[i] = Material.JungleSign; - for (int i = 12059; i <= 12064; i++) - materials[i] = Material.JungleSlab; - for (int i = 8600; i <= 8679; i++) - materials[i] = Material.JungleStairs; - for (int i = 6322; i <= 6385; i++) - materials[i] = Material.JungleTrapdoor; - for (int i = 5737; i <= 5744; i++) - materials[i] = Material.JungleWallHangingSign; - for (int i = 4889; i <= 4896; i++) - materials[i] = Material.JungleWallSign; - for (int i = 210; i <= 212; i++) - materials[i] = Material.JungleWood; - for (int i = 13773; i <= 13798; i++) - materials[i] = Material.Kelp; - materials[13799] = Material.KelpPlant; - for (int i = 4741; i <= 4748; i++) - materials[i] = Material.Ladder; - for (int i = 19516; i <= 19519; i++) - materials[i] = Material.Lantern; - materials[565] = Material.LapisBlock; - materials[563] = Material.LapisOre; - for (int i = 22058; i <= 22069; i++) - materials[i] = Material.LargeAmethystBud; - for (int i = 11636; i <= 11637; i++) - materials[i] = Material.LargeFern; - for (int i = 102; i <= 117; i++) - materials[i] = Material.Lava; - materials[8176] = Material.LavaCauldron; - for (int i = 19463; i <= 19478; i++) - materials[i] = Material.Lectern; - for (int i = 5793; i <= 5816; i++) - materials[i] = Material.Lever; - for (int i = 11246; i <= 11277; i++) - materials[i] = Material.Light; - for (int i = 11686; i <= 11701; i++) - materials[i] = Material.LightBlueBanner; - for (int i = 1779; i <= 1794; i++) - materials[i] = Material.LightBlueBed; - for (int i = 21802; i <= 21817; i++) - materials[i] = Material.LightBlueCandle; - for (int i = 22018; i <= 22019; i++) - materials[i] = Material.LightBlueCandleCake; - materials[11610] = Material.LightBlueCarpet; - materials[13744] = Material.LightBlueConcrete; - materials[13760] = Material.LightBlueConcretePowder; - for (int i = 13689; i <= 13692; i++) - materials[i] = Material.LightBlueGlazedTerracotta; - for (int i = 13599; i <= 13604; i++) - materials[i] = Material.LightBlueShulkerBox; - materials[6117] = Material.LightBlueStainedGlass; - for (int i = 10267; i <= 10298; i++) - materials[i] = Material.LightBlueStainedGlassPane; - materials[10158] = Material.LightBlueTerracotta; - for (int i = 11906; i <= 11909; i++) - materials[i] = Material.LightBlueWallBanner; - materials[2093] = Material.LightBlueWool; - for (int i = 11766; i <= 11781; i++) - materials[i] = Material.LightGrayBanner; - for (int i = 1859; i <= 1874; i++) - materials[i] = Material.LightGrayBed; - for (int i = 21882; i <= 21897; i++) - materials[i] = Material.LightGrayCandle; - for (int i = 22028; i <= 22029; i++) - materials[i] = Material.LightGrayCandleCake; - materials[11615] = Material.LightGrayCarpet; - materials[13749] = Material.LightGrayConcrete; - materials[13765] = Material.LightGrayConcretePowder; - for (int i = 13709; i <= 13712; i++) - materials[i] = Material.LightGrayGlazedTerracotta; - for (int i = 13629; i <= 13634; i++) - materials[i] = Material.LightGrayShulkerBox; - materials[6122] = Material.LightGrayStainedGlass; - for (int i = 10427; i <= 10458; i++) - materials[i] = Material.LightGrayStainedGlassPane; - materials[10163] = Material.LightGrayTerracotta; - for (int i = 11926; i <= 11929; i++) - materials[i] = Material.LightGrayWallBanner; - materials[2098] = Material.LightGrayWool; - for (int i = 9942; i <= 9957; i++) - materials[i] = Material.LightWeightedPressurePlate; - for (int i = 25737; i <= 25760; i++) - materials[i] = Material.LightningRod; - for (int i = 11628; i <= 11629; i++) - materials[i] = Material.Lilac; - materials[2131] = Material.LilyOfTheValley; - materials[7632] = Material.LilyPad; - for (int i = 11718; i <= 11733; i++) - materials[i] = Material.LimeBanner; - for (int i = 1811; i <= 1826; i++) - materials[i] = Material.LimeBed; - for (int i = 21834; i <= 21849; i++) - materials[i] = Material.LimeCandle; - for (int i = 22022; i <= 22023; i++) - materials[i] = Material.LimeCandleCake; - materials[11612] = Material.LimeCarpet; - materials[13746] = Material.LimeConcrete; - materials[13762] = Material.LimeConcretePowder; - for (int i = 13697; i <= 13700; i++) - materials[i] = Material.LimeGlazedTerracotta; - for (int i = 13611; i <= 13616; i++) - materials[i] = Material.LimeShulkerBox; - materials[6119] = Material.LimeStainedGlass; - for (int i = 10331; i <= 10362; i++) - materials[i] = Material.LimeStainedGlassPane; - materials[10160] = Material.LimeTerracotta; - for (int i = 11914; i <= 11917; i++) - materials[i] = Material.LimeWallBanner; - materials[2095] = Material.LimeWool; - materials[20472] = Material.Lodestone; - for (int i = 19417; i <= 19420; i++) - materials[i] = Material.Loom; - for (int i = 11670; i <= 11685; i++) - materials[i] = Material.MagentaBanner; - for (int i = 1763; i <= 1778; i++) - materials[i] = Material.MagentaBed; - for (int i = 21786; i <= 21801; i++) - materials[i] = Material.MagentaCandle; - for (int i = 22016; i <= 22017; i++) - materials[i] = Material.MagentaCandleCake; - materials[11609] = Material.MagentaCarpet; - materials[13743] = Material.MagentaConcrete; - materials[13759] = Material.MagentaConcretePowder; - for (int i = 13685; i <= 13688; i++) - materials[i] = Material.MagentaGlazedTerracotta; - for (int i = 13593; i <= 13598; i++) - materials[i] = Material.MagentaShulkerBox; - materials[6116] = Material.MagentaStainedGlass; - for (int i = 10235; i <= 10266; i++) - materials[i] = Material.MagentaStainedGlassPane; - materials[10157] = Material.MagentaTerracotta; - for (int i = 11902; i <= 11905; i++) - materials[i] = Material.MagentaWallBanner; - materials[2092] = Material.MagentaWool; - materials[13556] = Material.MagmaBlock; - for (int i = 9578; i <= 9601; i++) - materials[i] = Material.MangroveButton; - for (int i = 13219; i <= 13282; i++) - materials[i] = Material.MangroveDoor; - for (int i = 12707; i <= 12738; i++) - materials[i] = Material.MangroveFence; - for (int i = 12419; i <= 12450; i++) - materials[i] = Material.MangroveFenceGate; - for (int i = 5569; i <= 5632; i++) - materials[i] = Material.MangroveHangingSign; - for (int i = 476; i <= 503; i++) - materials[i] = Material.MangroveLeaves; - for (int i = 160; i <= 162; i++) - materials[i] = Material.MangroveLog; - materials[26] = Material.MangrovePlanks; - for (int i = 5899; i <= 5900; i++) - materials[i] = Material.MangrovePressurePlate; - for (int i = 45; i <= 84; i++) - materials[i] = Material.MangrovePropagule; - for (int i = 163; i <= 164; i++) - materials[i] = Material.MangroveRoots; - for (int i = 4613; i <= 4644; i++) - materials[i] = Material.MangroveSign; - for (int i = 12089; i <= 12094; i++) - materials[i] = Material.MangroveSlab; - for (int i = 11003; i <= 11082; i++) - materials[i] = Material.MangroveStairs; - for (int i = 6642; i <= 6705; i++) - materials[i] = Material.MangroveTrapdoor; - for (int i = 5761; i <= 5768; i++) - materials[i] = Material.MangroveWallHangingSign; - for (int i = 4913; i <= 4920; i++) - materials[i] = Material.MangroveWallSign; - for (int i = 222; i <= 224; i++) - materials[i] = Material.MangroveWood; - for (int i = 22070; i <= 22081; i++) - materials[i] = Material.MediumAmethystBud; - materials[7045] = Material.Melon; - for (int i = 7062; i <= 7069; i++) - materials[i] = Material.MelonStem; - materials[25856] = Material.MossBlock; - materials[25839] = Material.MossCarpet; - materials[2396] = Material.MossyCobblestone; - for (int i = 15119; i <= 15124; i++) - materials[i] = Material.MossyCobblestoneSlab; - for (int i = 14295; i <= 14374; i++) - materials[i] = Material.MossyCobblestoneStairs; - for (int i = 9017; i <= 9340; i++) - materials[i] = Material.MossyCobblestoneWall; - for (int i = 15107; i <= 15112; i++) - materials[i] = Material.MossyStoneBrickSlab; - for (int i = 14135; i <= 14214; i++) - materials[i] = Material.MossyStoneBrickStairs; - for (int i = 16145; i <= 16468; i++) - materials[i] = Material.MossyStoneBrickWall; - materials[6771] = Material.MossyStoneBricks; - for (int i = 2106; i <= 2117; i++) - materials[i] = Material.MovingPiston; - materials[25916] = Material.Mud; - for (int i = 12155; i <= 12160; i++) - materials[i] = Material.MudBrickSlab; - for (int i = 7550; i <= 7629; i++) - materials[i] = Material.MudBrickStairs; - for (int i = 17117; i <= 17440; i++) - materials[i] = Material.MudBrickWall; - materials[6775] = Material.MudBricks; - for (int i = 165; i <= 167; i++) - materials[i] = Material.MuddyMangroveRoots; - for (int i = 6910; i <= 6973; i++) - materials[i] = Material.MushroomStem; - for (int i = 7630; i <= 7631; i++) - materials[i] = Material.Mycelium; - for (int i = 8047; i <= 8078; i++) - materials[i] = Material.NetherBrickFence; - for (int i = 12161; i <= 12166; i++) - materials[i] = Material.NetherBrickSlab; - for (int i = 8079; i <= 8158; i++) - materials[i] = Material.NetherBrickStairs; - for (int i = 17441; i <= 17764; i++) - materials[i] = Material.NetherBrickWall; - materials[8046] = Material.NetherBricks; - materials[135] = Material.NetherGoldOre; - for (int i = 6033; i <= 6034; i++) - materials[i] = Material.NetherPortal; - materials[10023] = Material.NetherQuartzOre; - materials[19608] = Material.NetherSprouts; - for (int i = 8159; i <= 8162; i++) - materials[i] = Material.NetherWart; - materials[13557] = Material.NetherWartBlock; - materials[20460] = Material.NetheriteBlock; - materials[6018] = Material.Netherrack; - for (int i = 581; i <= 1730; i++) - materials[i] = Material.NoteBlock; - for (int i = 9386; i <= 9409; i++) - materials[i] = Material.OakButton; - for (int i = 4677; i <= 4740; i++) - materials[i] = Material.OakDoor; - for (int i = 5986; i <= 6017; i++) - materials[i] = Material.OakFence; - for (int i = 7358; i <= 7389; i++) - materials[i] = Material.OakFenceGate; - for (int i = 4929; i <= 4992; i++) - materials[i] = Material.OakHangingSign; - for (int i = 252; i <= 279; i++) - materials[i] = Material.OakLeaves; - for (int i = 136; i <= 138; i++) - materials[i] = Material.OakLog; - materials[15] = Material.OakPlanks; - for (int i = 5883; i <= 5884; i++) - materials[i] = Material.OakPressurePlate; - for (int i = 29; i <= 30; i++) - materials[i] = Material.OakSapling; - for (int i = 4357; i <= 4388; i++) - materials[i] = Material.OakSign; - for (int i = 12041; i <= 12046; i++) - materials[i] = Material.OakSlab; - for (int i = 2929; i <= 3008; i++) - materials[i] = Material.OakStairs; - for (int i = 6130; i <= 6193; i++) - materials[i] = Material.OakTrapdoor; - for (int i = 5697; i <= 5704; i++) - materials[i] = Material.OakWallHangingSign; - for (int i = 4849; i <= 4856; i++) - materials[i] = Material.OakWallSign; - for (int i = 201; i <= 203; i++) - materials[i] = Material.OakWood; - for (int i = 13563; i <= 13574; i++) - materials[i] = Material.Observer; - materials[2397] = Material.Obsidian; - for (int i = 27576; i <= 27578; i++) - materials[i] = Material.OchreFroglight; - materials[27862] = Material.OpenEyeblossom; - for (int i = 11654; i <= 11669; i++) - materials[i] = Material.OrangeBanner; - for (int i = 1747; i <= 1762; i++) - materials[i] = Material.OrangeBed; - for (int i = 21770; i <= 21785; i++) - materials[i] = Material.OrangeCandle; - for (int i = 22014; i <= 22015; i++) - materials[i] = Material.OrangeCandleCake; - materials[11608] = Material.OrangeCarpet; - materials[13742] = Material.OrangeConcrete; - materials[13758] = Material.OrangeConcretePowder; - for (int i = 13681; i <= 13684; i++) - materials[i] = Material.OrangeGlazedTerracotta; - for (int i = 13587; i <= 13592; i++) - materials[i] = Material.OrangeShulkerBox; - materials[6115] = Material.OrangeStainedGlass; - for (int i = 10203; i <= 10234; i++) - materials[i] = Material.OrangeStainedGlassPane; - materials[10156] = Material.OrangeTerracotta; - materials[2125] = Material.OrangeTulip; - for (int i = 11898; i <= 11901; i++) - materials[i] = Material.OrangeWallBanner; - materials[2091] = Material.OrangeWool; - materials[2128] = Material.OxeyeDaisy; - materials[23961] = Material.OxidizedChiseledCopper; - materials[23954] = Material.OxidizedCopper; - for (int i = 25717; i <= 25720; i++) - materials[i] = Material.OxidizedCopperBulb; - for (int i = 24793; i <= 24856; i++) - materials[i] = Material.OxidizedCopperDoor; - for (int i = 25695; i <= 25696; i++) - materials[i] = Material.OxidizedCopperGrate; - for (int i = 25305; i <= 25368; i++) - materials[i] = Material.OxidizedCopperTrapdoor; - materials[23957] = Material.OxidizedCutCopper; - for (int i = 24289; i <= 24294; i++) - materials[i] = Material.OxidizedCutCopperSlab; - for (int i = 23969; i <= 24048; i++) - materials[i] = Material.OxidizedCutCopperStairs; - materials[11625] = Material.PackedIce; - materials[6774] = Material.PackedMud; - for (int i = 27860; i <= 27861; i++) - materials[i] = Material.PaleHangingMoss; - materials[27697] = Material.PaleMossBlock; - for (int i = 27698; i <= 27859; i++) - materials[i] = Material.PaleMossCarpet; - for (int i = 9554; i <= 9577; i++) - materials[i] = Material.PaleOakButton; - for (int i = 13155; i <= 13218; i++) - materials[i] = Material.PaleOakDoor; - for (int i = 12675; i <= 12706; i++) - materials[i] = Material.PaleOakFence; - for (int i = 12387; i <= 12418; i++) - materials[i] = Material.PaleOakFenceGate; - for (int i = 5377; i <= 5440; i++) - materials[i] = Material.PaleOakHangingSign; - for (int i = 448; i <= 475; i++) - materials[i] = Material.PaleOakLeaves; - for (int i = 157; i <= 159; i++) - materials[i] = Material.PaleOakLog; - materials[25] = Material.PaleOakPlanks; - for (int i = 5897; i <= 5898; i++) - materials[i] = Material.PaleOakPressurePlate; - for (int i = 43; i <= 44; i++) - materials[i] = Material.PaleOakSapling; - for (int i = 4581; i <= 4612; i++) - materials[i] = Material.PaleOakSign; - for (int i = 12083; i <= 12088; i++) - materials[i] = Material.PaleOakSlab; - for (int i = 10923; i <= 11002; i++) - materials[i] = Material.PaleOakStairs; - for (int i = 6578; i <= 6641; i++) - materials[i] = Material.PaleOakTrapdoor; - for (int i = 5753; i <= 5760; i++) - materials[i] = Material.PaleOakWallHangingSign; - for (int i = 4905; i <= 4912; i++) - materials[i] = Material.PaleOakWallSign; - for (int i = 22; i <= 24; i++) - materials[i] = Material.PaleOakWood; - for (int i = 27582; i <= 27584; i++) - materials[i] = Material.PearlescentFroglight; - for (int i = 11632; i <= 11633; i++) - materials[i] = Material.Peony; - for (int i = 12131; i <= 12136; i++) - materials[i] = Material.PetrifiedOakSlab; - for (int i = 9866; i <= 9897; i++) - materials[i] = Material.PiglinHead; - for (int i = 9898; i <= 9905; i++) - materials[i] = Material.PiglinWallHead; - for (int i = 11734; i <= 11749; i++) - materials[i] = Material.PinkBanner; - for (int i = 1827; i <= 1842; i++) - materials[i] = Material.PinkBed; - for (int i = 21850; i <= 21865; i++) - materials[i] = Material.PinkCandle; - for (int i = 22024; i <= 22025; i++) - materials[i] = Material.PinkCandleCake; - materials[11613] = Material.PinkCarpet; - materials[13747] = Material.PinkConcrete; - materials[13763] = Material.PinkConcretePowder; - for (int i = 13701; i <= 13704; i++) - materials[i] = Material.PinkGlazedTerracotta; - for (int i = 25840; i <= 25855; i++) - materials[i] = Material.PinkPetals; - for (int i = 13617; i <= 13622; i++) - materials[i] = Material.PinkShulkerBox; - materials[6120] = Material.PinkStainedGlass; - for (int i = 10363; i <= 10394; i++) - materials[i] = Material.PinkStainedGlassPane; - materials[10161] = Material.PinkTerracotta; - materials[2127] = Material.PinkTulip; - for (int i = 11918; i <= 11921; i++) - materials[i] = Material.PinkWallBanner; - materials[2096] = Material.PinkWool; - for (int i = 2054; i <= 2065; i++) - materials[i] = Material.Piston; - for (int i = 2066; i <= 2089; i++) - materials[i] = Material.PistonHead; - for (int i = 13510; i <= 13519; i++) - materials[i] = Material.PitcherCrop; - for (int i = 13520; i <= 13521; i++) - materials[i] = Material.PitcherPlant; - for (int i = 9746; i <= 9777; i++) - materials[i] = Material.PlayerHead; - for (int i = 9778; i <= 9785; i++) - materials[i] = Material.PlayerWallHead; - for (int i = 12; i <= 13; i++) - materials[i] = Material.Podzol; - for (int i = 25761; i <= 25780; i++) - materials[i] = Material.PointedDripstone; - materials[7] = Material.PolishedAndesite; - for (int i = 15161; i <= 15166; i++) - materials[i] = Material.PolishedAndesiteSlab; - for (int i = 14935; i <= 15014; i++) - materials[i] = Material.PolishedAndesiteStairs; - for (int i = 6024; i <= 6026; i++) - materials[i] = Material.PolishedBasalt; - materials[20884] = Material.PolishedBlackstone; - for (int i = 20888; i <= 20893; i++) - materials[i] = Material.PolishedBlackstoneBrickSlab; - for (int i = 20894; i <= 20973; i++) - materials[i] = Material.PolishedBlackstoneBrickStairs; - for (int i = 20974; i <= 21297; i++) - materials[i] = Material.PolishedBlackstoneBrickWall; - materials[20885] = Material.PolishedBlackstoneBricks; - for (int i = 21387; i <= 21410; i++) - materials[i] = Material.PolishedBlackstoneButton; - for (int i = 21385; i <= 21386; i++) - materials[i] = Material.PolishedBlackstonePressurePlate; - for (int i = 21379; i <= 21384; i++) - materials[i] = Material.PolishedBlackstoneSlab; - for (int i = 21299; i <= 21378; i++) - materials[i] = Material.PolishedBlackstoneStairs; - for (int i = 21411; i <= 21734; i++) - materials[i] = Material.PolishedBlackstoneWall; - materials[26331] = Material.PolishedDeepslate; - for (int i = 26412; i <= 26417; i++) - materials[i] = Material.PolishedDeepslateSlab; - for (int i = 26332; i <= 26411; i++) - materials[i] = Material.PolishedDeepslateStairs; - for (int i = 26418; i <= 26741; i++) - materials[i] = Material.PolishedDeepslateWall; - materials[5] = Material.PolishedDiorite; - for (int i = 15113; i <= 15118; i++) - materials[i] = Material.PolishedDioriteSlab; - for (int i = 14215; i <= 14294; i++) - materials[i] = Material.PolishedDioriteStairs; - materials[3] = Material.PolishedGranite; - for (int i = 15095; i <= 15100; i++) - materials[i] = Material.PolishedGraniteSlab; - for (int i = 13975; i <= 14054; i++) - materials[i] = Material.PolishedGraniteStairs; - materials[22505] = Material.PolishedTuff; - for (int i = 22506; i <= 22511; i++) - materials[i] = Material.PolishedTuffSlab; - for (int i = 22512; i <= 22591; i++) - materials[i] = Material.PolishedTuffStairs; - for (int i = 22592; i <= 22915; i++) - materials[i] = Material.PolishedTuffWall; - materials[2120] = Material.Poppy; - for (int i = 9378; i <= 9385; i++) - materials[i] = Material.Potatoes; - materials[9347] = Material.PottedAcaciaSapling; - materials[9356] = Material.PottedAllium; - materials[27574] = Material.PottedAzaleaBush; - materials[9357] = Material.PottedAzureBluet; - materials[13970] = Material.PottedBamboo; - materials[9345] = Material.PottedBirchSapling; - materials[9355] = Material.PottedBlueOrchid; - materials[9367] = Material.PottedBrownMushroom; - materials[9369] = Material.PottedCactus; - materials[9348] = Material.PottedCherrySapling; - materials[27865] = Material.PottedClosedEyeblossom; - materials[9363] = Material.PottedCornflower; - materials[20468] = Material.PottedCrimsonFungus; - materials[20470] = Material.PottedCrimsonRoots; - materials[9353] = Material.PottedDandelion; - materials[9349] = Material.PottedDarkOakSapling; - materials[9368] = Material.PottedDeadBush; - materials[9352] = Material.PottedFern; - materials[27575] = Material.PottedFloweringAzaleaBush; - materials[9346] = Material.PottedJungleSapling; - materials[9364] = Material.PottedLilyOfTheValley; - materials[9351] = Material.PottedMangrovePropagule; - materials[9343] = Material.PottedOakSapling; - materials[27864] = Material.PottedOpenEyeblossom; - materials[9359] = Material.PottedOrangeTulip; - materials[9362] = Material.PottedOxeyeDaisy; - materials[9350] = Material.PottedPaleOakSapling; - materials[9361] = Material.PottedPinkTulip; - materials[9354] = Material.PottedPoppy; - materials[9366] = Material.PottedRedMushroom; - materials[9358] = Material.PottedRedTulip; - materials[9344] = Material.PottedSpruceSapling; - materials[9342] = Material.PottedTorchflower; - materials[20469] = Material.PottedWarpedFungus; - materials[20471] = Material.PottedWarpedRoots; - materials[9360] = Material.PottedWhiteTulip; - materials[9365] = Material.PottedWitherRose; - materials[23331] = Material.PowderSnow; - for (int i = 8177; i <= 8179; i++) - materials[i] = Material.PowderSnowCauldron; - for (int i = 1987; i <= 2010; i++) - materials[i] = Material.PoweredRail; - materials[11342] = Material.Prismarine; - for (int i = 11591; i <= 11596; i++) - materials[i] = Material.PrismarineBrickSlab; - for (int i = 11425; i <= 11504; i++) - materials[i] = Material.PrismarineBrickStairs; - materials[11343] = Material.PrismarineBricks; - for (int i = 11585; i <= 11590; i++) - materials[i] = Material.PrismarineSlab; - for (int i = 11345; i <= 11424; i++) - materials[i] = Material.PrismarineStairs; - for (int i = 15497; i <= 15820; i++) - materials[i] = Material.PrismarineWall; - materials[7044] = Material.Pumpkin; - for (int i = 7054; i <= 7061; i++) - materials[i] = Material.PumpkinStem; - for (int i = 11798; i <= 11813; i++) - materials[i] = Material.PurpleBanner; - for (int i = 1891; i <= 1906; i++) - materials[i] = Material.PurpleBed; - for (int i = 21914; i <= 21929; i++) - materials[i] = Material.PurpleCandle; - for (int i = 22032; i <= 22033; i++) - materials[i] = Material.PurpleCandleCake; - materials[11617] = Material.PurpleCarpet; - materials[13751] = Material.PurpleConcrete; - materials[13767] = Material.PurpleConcretePowder; - for (int i = 13717; i <= 13720; i++) - materials[i] = Material.PurpleGlazedTerracotta; - for (int i = 13641; i <= 13646; i++) - materials[i] = Material.PurpleShulkerBox; - materials[6124] = Material.PurpleStainedGlass; - for (int i = 10491; i <= 10522; i++) - materials[i] = Material.PurpleStainedGlassPane; - materials[10165] = Material.PurpleTerracotta; - for (int i = 11934; i <= 11937; i++) - materials[i] = Material.PurpleWallBanner; - materials[2100] = Material.PurpleWool; - materials[13423] = Material.PurpurBlock; - for (int i = 13424; i <= 13426; i++) - materials[i] = Material.PurpurPillar; - for (int i = 12185; i <= 12190; i++) - materials[i] = Material.PurpurSlab; - for (int i = 13427; i <= 13506; i++) - materials[i] = Material.PurpurStairs; - materials[10034] = Material.QuartzBlock; - materials[21737] = Material.QuartzBricks; - for (int i = 10036; i <= 10038; i++) - materials[i] = Material.QuartzPillar; - for (int i = 12167; i <= 12172; i++) - materials[i] = Material.QuartzSlab; - for (int i = 10039; i <= 10118; i++) - materials[i] = Material.QuartzStairs; - for (int i = 4749; i <= 4768; i++) - materials[i] = Material.Rail; - materials[27572] = Material.RawCopperBlock; - materials[27573] = Material.RawGoldBlock; - materials[27571] = Material.RawIronBlock; - for (int i = 11862; i <= 11877; i++) - materials[i] = Material.RedBanner; - for (int i = 1955; i <= 1970; i++) - materials[i] = Material.RedBed; - for (int i = 21978; i <= 21993; i++) - materials[i] = Material.RedCandle; - for (int i = 22040; i <= 22041; i++) - materials[i] = Material.RedCandleCake; - materials[11621] = Material.RedCarpet; - materials[13755] = Material.RedConcrete; - materials[13771] = Material.RedConcretePowder; - for (int i = 13733; i <= 13736; i++) - materials[i] = Material.RedGlazedTerracotta; - materials[2133] = Material.RedMushroom; - for (int i = 6846; i <= 6909; i++) - materials[i] = Material.RedMushroomBlock; - for (int i = 15155; i <= 15160; i++) - materials[i] = Material.RedNetherBrickSlab; - for (int i = 14855; i <= 14934; i++) - materials[i] = Material.RedNetherBrickStairs; - for (int i = 18089; i <= 18412; i++) - materials[i] = Material.RedNetherBrickWall; - materials[13558] = Material.RedNetherBricks; - materials[123] = Material.RedSand; - materials[11958] = Material.RedSandstone; - for (int i = 12173; i <= 12178; i++) - materials[i] = Material.RedSandstoneSlab; - for (int i = 11961; i <= 12040; i++) - materials[i] = Material.RedSandstoneStairs; - for (int i = 15821; i <= 16144; i++) - materials[i] = Material.RedSandstoneWall; - for (int i = 13665; i <= 13670; i++) - materials[i] = Material.RedShulkerBox; - materials[6128] = Material.RedStainedGlass; - for (int i = 10619; i <= 10650; i++) - materials[i] = Material.RedStainedGlassPane; - materials[10169] = Material.RedTerracotta; - materials[2124] = Material.RedTulip; - for (int i = 11950; i <= 11953; i++) - materials[i] = Material.RedWallBanner; - materials[2104] = Material.RedWool; - materials[10022] = Material.RedstoneBlock; - for (int i = 8191; i <= 8192; i++) - materials[i] = Material.RedstoneLamp; - for (int i = 5903; i <= 5904; i++) - materials[i] = Material.RedstoneOre; - for (int i = 5907; i <= 5908; i++) - materials[i] = Material.RedstoneTorch; - for (int i = 5909; i <= 5916; i++) - materials[i] = Material.RedstoneWallTorch; - for (int i = 3033; i <= 4328; i++) - materials[i] = Material.RedstoneWire; - materials[27586] = Material.ReinforcedDeepslate; - for (int i = 6050; i <= 6113; i++) - materials[i] = Material.Repeater; - for (int i = 13528; i <= 13539; i++) - materials[i] = Material.RepeatingCommandBlock; - materials[7633] = Material.ResinBlock; - for (int i = 7715; i <= 7720; i++) - materials[i] = Material.ResinBrickSlab; - for (int i = 7635; i <= 7714; i++) - materials[i] = Material.ResinBrickStairs; - for (int i = 7721; i <= 8044; i++) - materials[i] = Material.ResinBrickWall; - materials[7634] = Material.ResinBricks; - for (int i = 7230; i <= 7357; i++) - materials[i] = Material.ResinClump; - for (int i = 20463; i <= 20467; i++) - materials[i] = Material.RespawnAnchor; - materials[25915] = Material.RootedDirt; - for (int i = 11630; i <= 11631; i++) - materials[i] = Material.RoseBush; - materials[118] = Material.Sand; - materials[578] = Material.Sandstone; - for (int i = 12119; i <= 12124; i++) - materials[i] = Material.SandstoneSlab; - for (int i = 8205; i <= 8284; i++) - materials[i] = Material.SandstoneStairs; - for (int i = 18413; i <= 18736; i++) - materials[i] = Material.SandstoneWall; - for (int i = 19385; i <= 19416; i++) - materials[i] = Material.Scaffolding; - materials[23812] = Material.Sculk; - for (int i = 23941; i <= 23942; i++) - materials[i] = Material.SculkCatalyst; - for (int i = 23332; i <= 23427; i++) - materials[i] = Material.SculkSensor; - for (int i = 23943; i <= 23950; i++) - materials[i] = Material.SculkShrieker; - for (int i = 23813; i <= 23940; i++) - materials[i] = Material.SculkVein; - materials[11603] = Material.SeaLantern; - for (int i = 13946; i <= 13953; i++) - materials[i] = Material.SeaPickle; - materials[2051] = Material.Seagrass; - materials[2048] = Material.ShortGrass; - materials[19623] = Material.Shroomlight; - for (int i = 13575; i <= 13580; i++) - materials[i] = Material.ShulkerBox; - for (int i = 9626; i <= 9657; i++) - materials[i] = Material.SkeletonSkull; - for (int i = 9658; i <= 9665; i++) - materials[i] = Material.SkeletonWallSkull; - materials[11243] = Material.SlimeBlock; - for (int i = 22082; i <= 22093; i++) - materials[i] = Material.SmallAmethystBud; - for (int i = 25897; i <= 25912; i++) - materials[i] = Material.SmallDripleaf; - materials[19479] = Material.SmithingTable; - for (int i = 19433; i <= 19440; i++) - materials[i] = Material.Smoker; - materials[27570] = Material.SmoothBasalt; - materials[12193] = Material.SmoothQuartz; - for (int i = 15137; i <= 15142; i++) - materials[i] = Material.SmoothQuartzSlab; - for (int i = 14615; i <= 14694; i++) - materials[i] = Material.SmoothQuartzStairs; - materials[12194] = Material.SmoothRedSandstone; - for (int i = 15101; i <= 15106; i++) - materials[i] = Material.SmoothRedSandstoneSlab; - for (int i = 14055; i <= 14134; i++) - materials[i] = Material.SmoothRedSandstoneStairs; - materials[12192] = Material.SmoothSandstone; - for (int i = 15131; i <= 15136; i++) - materials[i] = Material.SmoothSandstoneSlab; - for (int i = 14535; i <= 14614; i++) - materials[i] = Material.SmoothSandstoneStairs; - materials[12191] = Material.SmoothStone; - for (int i = 12113; i <= 12118; i++) - materials[i] = Material.SmoothStoneSlab; - for (int i = 13813; i <= 13815; i++) - materials[i] = Material.SnifferEgg; - for (int i = 5941; i <= 5948; i++) - materials[i] = Material.Snow; - materials[5950] = Material.SnowBlock; - for (int i = 19556; i <= 19587; i++) - materials[i] = Material.SoulCampfire; - materials[2915] = Material.SoulFire; - for (int i = 19520; i <= 19523; i++) - materials[i] = Material.SoulLantern; - materials[6019] = Material.SoulSand; - materials[6020] = Material.SoulSoil; - materials[6027] = Material.SoulTorch; - for (int i = 6028; i <= 6031; i++) - materials[i] = Material.SoulWallTorch; - materials[2916] = Material.Spawner; - materials[560] = Material.Sponge; - materials[25836] = Material.SporeBlossom; - for (int i = 9410; i <= 9433; i++) - materials[i] = Material.SpruceButton; - for (int i = 12771; i <= 12834; i++) - materials[i] = Material.SpruceDoor; - for (int i = 12483; i <= 12514; i++) - materials[i] = Material.SpruceFence; - for (int i = 12195; i <= 12226; i++) - materials[i] = Material.SpruceFenceGate; - for (int i = 4993; i <= 5056; i++) - materials[i] = Material.SpruceHangingSign; - for (int i = 280; i <= 307; i++) - materials[i] = Material.SpruceLeaves; - for (int i = 139; i <= 141; i++) - materials[i] = Material.SpruceLog; - materials[16] = Material.SprucePlanks; - for (int i = 5885; i <= 5886; i++) - materials[i] = Material.SprucePressurePlate; - for (int i = 31; i <= 32; i++) - materials[i] = Material.SpruceSapling; - for (int i = 4389; i <= 4420; i++) - materials[i] = Material.SpruceSign; - for (int i = 12047; i <= 12052; i++) - materials[i] = Material.SpruceSlab; - for (int i = 8440; i <= 8519; i++) - materials[i] = Material.SpruceStairs; - for (int i = 6194; i <= 6257; i++) - materials[i] = Material.SpruceTrapdoor; - for (int i = 5705; i <= 5712; i++) - materials[i] = Material.SpruceWallHangingSign; - for (int i = 4857; i <= 4864; i++) - materials[i] = Material.SpruceWallSign; - for (int i = 204; i <= 206; i++) - materials[i] = Material.SpruceWood; - for (int i = 2035; i <= 2046; i++) - materials[i] = Material.StickyPiston; - materials[1] = Material.Stone; - for (int i = 12149; i <= 12154; i++) - materials[i] = Material.StoneBrickSlab; - for (int i = 7470; i <= 7549; i++) - materials[i] = Material.StoneBrickStairs; - for (int i = 16793; i <= 17116; i++) - materials[i] = Material.StoneBrickWall; - materials[6770] = Material.StoneBricks; - for (int i = 5917; i <= 5940; i++) - materials[i] = Material.StoneButton; - for (int i = 5817; i <= 5818; i++) - materials[i] = Material.StonePressurePlate; - for (int i = 12107; i <= 12112; i++) - materials[i] = Material.StoneSlab; - for (int i = 14455; i <= 14534; i++) - materials[i] = Material.StoneStairs; - for (int i = 19480; i <= 19483; i++) - materials[i] = Material.Stonecutter; - for (int i = 180; i <= 182; i++) - materials[i] = Material.StrippedAcaciaLog; - for (int i = 237; i <= 239; i++) - materials[i] = Material.StrippedAcaciaWood; - for (int i = 198; i <= 200; i++) - materials[i] = Material.StrippedBambooBlock; - for (int i = 174; i <= 176; i++) - materials[i] = Material.StrippedBirchLog; - for (int i = 231; i <= 233; i++) - materials[i] = Material.StrippedBirchWood; - for (int i = 183; i <= 185; i++) - materials[i] = Material.StrippedCherryLog; - for (int i = 240; i <= 242; i++) - materials[i] = Material.StrippedCherryWood; - for (int i = 19618; i <= 19620; i++) - materials[i] = Material.StrippedCrimsonHyphae; - for (int i = 19612; i <= 19614; i++) - materials[i] = Material.StrippedCrimsonStem; - for (int i = 186; i <= 188; i++) - materials[i] = Material.StrippedDarkOakLog; - for (int i = 243; i <= 245; i++) - materials[i] = Material.StrippedDarkOakWood; - for (int i = 177; i <= 179; i++) - materials[i] = Material.StrippedJungleLog; - for (int i = 234; i <= 236; i++) - materials[i] = Material.StrippedJungleWood; - for (int i = 195; i <= 197; i++) - materials[i] = Material.StrippedMangroveLog; - for (int i = 249; i <= 251; i++) - materials[i] = Material.StrippedMangroveWood; - for (int i = 192; i <= 194; i++) - materials[i] = Material.StrippedOakLog; - for (int i = 225; i <= 227; i++) - materials[i] = Material.StrippedOakWood; - for (int i = 189; i <= 191; i++) - materials[i] = Material.StrippedPaleOakLog; - for (int i = 246; i <= 248; i++) - materials[i] = Material.StrippedPaleOakWood; - for (int i = 171; i <= 173; i++) - materials[i] = Material.StrippedSpruceLog; - for (int i = 228; i <= 230; i++) - materials[i] = Material.StrippedSpruceWood; - for (int i = 19601; i <= 19603; i++) - materials[i] = Material.StrippedWarpedHyphae; - for (int i = 19595; i <= 19597; i++) - materials[i] = Material.StrippedWarpedStem; - for (int i = 20369; i <= 20372; i++) - materials[i] = Material.StructureBlock; - materials[13562] = Material.StructureVoid; - for (int i = 5968; i <= 5983; i++) - materials[i] = Material.SugarCane; - for (int i = 11626; i <= 11627; i++) - materials[i] = Material.Sunflower; - for (int i = 125; i <= 128; i++) - materials[i] = Material.SuspiciousGravel; - for (int i = 119; i <= 122; i++) - materials[i] = Material.SuspiciousSand; - for (int i = 19588; i <= 19591; i++) - materials[i] = Material.SweetBerryBush; - for (int i = 11634; i <= 11635; i++) - materials[i] = Material.TallGrass; - for (int i = 2052; i <= 2053; i++) - materials[i] = Material.TallSeagrass; - for (int i = 20394; i <= 20409; i++) - materials[i] = Material.Target; - materials[11623] = Material.Terracotta; - materials[23330] = Material.TintedGlass; - for (int i = 2137; i <= 2138; i++) - materials[i] = Material.Tnt; - materials[2398] = Material.Torch; - materials[2119] = Material.Torchflower; - for (int i = 13508; i <= 13509; i++) - materials[i] = Material.TorchflowerCrop; - for (int i = 9918; i <= 9941; i++) - materials[i] = Material.TrappedChest; - for (int i = 27651; i <= 27662; i++) - materials[i] = Material.TrialSpawner; - for (int i = 8311; i <= 8438; i++) - materials[i] = Material.Tripwire; - for (int i = 8295; i <= 8310; i++) - materials[i] = Material.TripwireHook; - for (int i = 13836; i <= 13837; i++) - materials[i] = Material.TubeCoral; - materials[13821] = Material.TubeCoralBlock; - for (int i = 13856; i <= 13857; i++) - materials[i] = Material.TubeCoralFan; - for (int i = 13906; i <= 13913; i++) - materials[i] = Material.TubeCoralWallFan; - materials[22094] = Material.Tuff; - for (int i = 22918; i <= 22923; i++) - materials[i] = Material.TuffBrickSlab; - for (int i = 22924; i <= 23003; i++) - materials[i] = Material.TuffBrickStairs; - for (int i = 23004; i <= 23327; i++) - materials[i] = Material.TuffBrickWall; - materials[22917] = Material.TuffBricks; - for (int i = 22095; i <= 22100; i++) - materials[i] = Material.TuffSlab; - for (int i = 22101; i <= 22180; i++) - materials[i] = Material.TuffStairs; - for (int i = 22181; i <= 22504; i++) - materials[i] = Material.TuffWall; - for (int i = 13801; i <= 13812; i++) - materials[i] = Material.TurtleEgg; - for (int i = 19651; i <= 19676; i++) - materials[i] = Material.TwistingVines; - materials[19677] = Material.TwistingVinesPlant; - for (int i = 27663; i <= 27694; i++) - materials[i] = Material.Vault; - for (int i = 27579; i <= 27581; i++) - materials[i] = Material.VerdantFroglight; - for (int i = 7070; i <= 7101; i++) - materials[i] = Material.Vine; - materials[13971] = Material.VoidAir; - for (int i = 2399; i <= 2402; i++) - materials[i] = Material.WallTorch; - for (int i = 20137; i <= 20160; i++) - materials[i] = Material.WarpedButton; - for (int i = 20225; i <= 20288; i++) - materials[i] = Material.WarpedDoor; - for (int i = 19729; i <= 19760; i++) - materials[i] = Material.WarpedFence; - for (int i = 19921; i <= 19952; i++) - materials[i] = Material.WarpedFenceGate; - materials[19605] = Material.WarpedFungus; - for (int i = 5505; i <= 5568; i++) - materials[i] = Material.WarpedHangingSign; - for (int i = 19598; i <= 19600; i++) - materials[i] = Material.WarpedHyphae; - materials[19604] = Material.WarpedNylium; - materials[19680] = Material.WarpedPlanks; - for (int i = 19695; i <= 19696; i++) - materials[i] = Material.WarpedPressurePlate; - materials[19607] = Material.WarpedRoots; - for (int i = 20321; i <= 20352; i++) - materials[i] = Material.WarpedSign; - for (int i = 19687; i <= 19692; i++) - materials[i] = Material.WarpedSlab; - for (int i = 20033; i <= 20112; i++) - materials[i] = Material.WarpedStairs; - for (int i = 19592; i <= 19594; i++) - materials[i] = Material.WarpedStem; - for (int i = 19825; i <= 19888; i++) - materials[i] = Material.WarpedTrapdoor; - for (int i = 5777; i <= 5784; i++) - materials[i] = Material.WarpedWallHangingSign; - for (int i = 20361; i <= 20368; i++) - materials[i] = Material.WarpedWallSign; - materials[19606] = Material.WarpedWartBlock; - for (int i = 86; i <= 101; i++) - materials[i] = Material.Water; - for (int i = 8173; i <= 8175; i++) - materials[i] = Material.WaterCauldron; - materials[23968] = Material.WaxedChiseledCopper; - materials[24313] = Material.WaxedCopperBlock; - for (int i = 25721; i <= 25724; i++) - materials[i] = Material.WaxedCopperBulb; - for (int i = 24921; i <= 24984; i++) - materials[i] = Material.WaxedCopperDoor; - for (int i = 25697; i <= 25698; i++) - materials[i] = Material.WaxedCopperGrate; - for (int i = 25433; i <= 25496; i++) - materials[i] = Material.WaxedCopperTrapdoor; - materials[24320] = Material.WaxedCutCopper; - for (int i = 24659; i <= 24664; i++) - materials[i] = Material.WaxedCutCopperSlab; - for (int i = 24561; i <= 24640; i++) - materials[i] = Material.WaxedCutCopperStairs; - materials[23967] = Material.WaxedExposedChiseledCopper; - materials[24315] = Material.WaxedExposedCopper; - for (int i = 25725; i <= 25728; i++) - materials[i] = Material.WaxedExposedCopperBulb; - for (int i = 24985; i <= 25048; i++) - materials[i] = Material.WaxedExposedCopperDoor; - for (int i = 25699; i <= 25700; i++) - materials[i] = Material.WaxedExposedCopperGrate; - for (int i = 25497; i <= 25560; i++) - materials[i] = Material.WaxedExposedCopperTrapdoor; - materials[24319] = Material.WaxedExposedCutCopper; - for (int i = 24653; i <= 24658; i++) - materials[i] = Material.WaxedExposedCutCopperSlab; - for (int i = 24481; i <= 24560; i++) - materials[i] = Material.WaxedExposedCutCopperStairs; - materials[23965] = Material.WaxedOxidizedChiseledCopper; - materials[24316] = Material.WaxedOxidizedCopper; - for (int i = 25733; i <= 25736; i++) - materials[i] = Material.WaxedOxidizedCopperBulb; - for (int i = 25049; i <= 25112; i++) - materials[i] = Material.WaxedOxidizedCopperDoor; - for (int i = 25703; i <= 25704; i++) - materials[i] = Material.WaxedOxidizedCopperGrate; - for (int i = 25561; i <= 25624; i++) - materials[i] = Material.WaxedOxidizedCopperTrapdoor; - materials[24317] = Material.WaxedOxidizedCutCopper; - for (int i = 24641; i <= 24646; i++) - materials[i] = Material.WaxedOxidizedCutCopperSlab; - for (int i = 24321; i <= 24400; i++) - materials[i] = Material.WaxedOxidizedCutCopperStairs; - materials[23966] = Material.WaxedWeatheredChiseledCopper; - materials[24314] = Material.WaxedWeatheredCopper; - for (int i = 25729; i <= 25732; i++) - materials[i] = Material.WaxedWeatheredCopperBulb; - for (int i = 25113; i <= 25176; i++) - materials[i] = Material.WaxedWeatheredCopperDoor; - for (int i = 25701; i <= 25702; i++) - materials[i] = Material.WaxedWeatheredCopperGrate; - for (int i = 25625; i <= 25688; i++) - materials[i] = Material.WaxedWeatheredCopperTrapdoor; - materials[24318] = Material.WaxedWeatheredCutCopper; - for (int i = 24647; i <= 24652; i++) - materials[i] = Material.WaxedWeatheredCutCopperSlab; - for (int i = 24401; i <= 24480; i++) - materials[i] = Material.WaxedWeatheredCutCopperStairs; - materials[23962] = Material.WeatheredChiseledCopper; - materials[23953] = Material.WeatheredCopper; - for (int i = 25713; i <= 25716; i++) - materials[i] = Material.WeatheredCopperBulb; - for (int i = 24857; i <= 24920; i++) - materials[i] = Material.WeatheredCopperDoor; - for (int i = 25693; i <= 25694; i++) - materials[i] = Material.WeatheredCopperGrate; - for (int i = 25369; i <= 25432; i++) - materials[i] = Material.WeatheredCopperTrapdoor; - materials[23958] = Material.WeatheredCutCopper; - for (int i = 24295; i <= 24300; i++) - materials[i] = Material.WeatheredCutCopperSlab; - for (int i = 24049; i <= 24128; i++) - materials[i] = Material.WeatheredCutCopperStairs; - for (int i = 19624; i <= 19649; i++) - materials[i] = Material.WeepingVines; - materials[19650] = Material.WeepingVinesPlant; - materials[561] = Material.WetSponge; - for (int i = 4333; i <= 4340; i++) - materials[i] = Material.Wheat; - for (int i = 11638; i <= 11653; i++) - materials[i] = Material.WhiteBanner; - for (int i = 1731; i <= 1746; i++) - materials[i] = Material.WhiteBed; - for (int i = 21754; i <= 21769; i++) - materials[i] = Material.WhiteCandle; - for (int i = 22012; i <= 22013; i++) - materials[i] = Material.WhiteCandleCake; - materials[11607] = Material.WhiteCarpet; - materials[13741] = Material.WhiteConcrete; - materials[13757] = Material.WhiteConcretePowder; - for (int i = 13677; i <= 13680; i++) - materials[i] = Material.WhiteGlazedTerracotta; - for (int i = 13581; i <= 13586; i++) - materials[i] = Material.WhiteShulkerBox; - materials[6114] = Material.WhiteStainedGlass; - for (int i = 10171; i <= 10202; i++) - materials[i] = Material.WhiteStainedGlassPane; - materials[10155] = Material.WhiteTerracotta; - materials[2126] = Material.WhiteTulip; - for (int i = 11894; i <= 11897; i++) - materials[i] = Material.WhiteWallBanner; - materials[2090] = Material.WhiteWool; - materials[2130] = Material.WitherRose; - for (int i = 9666; i <= 9697; i++) - materials[i] = Material.WitherSkeletonSkull; - for (int i = 9698; i <= 9705; i++) - materials[i] = Material.WitherSkeletonWallSkull; - for (int i = 11702; i <= 11717; i++) - materials[i] = Material.YellowBanner; - for (int i = 1795; i <= 1810; i++) - materials[i] = Material.YellowBed; - for (int i = 21818; i <= 21833; i++) - materials[i] = Material.YellowCandle; - for (int i = 22020; i <= 22021; i++) - materials[i] = Material.YellowCandleCake; - materials[11611] = Material.YellowCarpet; - materials[13745] = Material.YellowConcrete; - materials[13761] = Material.YellowConcretePowder; - for (int i = 13693; i <= 13696; i++) - materials[i] = Material.YellowGlazedTerracotta; - for (int i = 13605; i <= 13610; i++) - materials[i] = Material.YellowShulkerBox; - materials[6118] = Material.YellowStainedGlass; - for (int i = 10299; i <= 10330; i++) - materials[i] = Material.YellowStainedGlassPane; - materials[10159] = Material.YellowTerracotta; - for (int i = 11910; i <= 11913; i++) - materials[i] = Material.YellowWallBanner; - materials[2094] = Material.YellowWool; - for (int i = 9706; i <= 9737; i++) - materials[i] = Material.ZombieHead; - for (int i = 9738; i <= 9745; i++) - materials[i] = Material.ZombieWallHead; - } - - // - private static readonly BlockStateDefinition[] stateDefinitions = - [ - new(8, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(12, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(22, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(29, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(31, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(33, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(35, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(37, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(39, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(41, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(43, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(45, 40, - [ - new("age", ["0", "1", "2", "3", "4"], 8), - new("hanging", ["true", "false"], 4), - new("stage", ["0", "1"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(86, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(102, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(119, 4, - [ - new("dusted", ["0", "1", "2", "3"], 1) - ]), - new(125, 4, - [ - new("dusted", ["0", "1", "2", "3"], 1) - ]), - new(136, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(139, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(142, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(145, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(148, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(151, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(154, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(157, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(160, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(163, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(165, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(168, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(171, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(174, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(177, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(180, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(183, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(186, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(189, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(192, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(195, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(198, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(201, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(204, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(207, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(210, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(213, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(216, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(219, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(222, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(225, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(228, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(231, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(234, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(237, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(240, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(243, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(246, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(249, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(252, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(280, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(308, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(336, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(364, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(392, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(420, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(448, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(476, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(504, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(532, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(566, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(581, 1150, - [ - new("instrument", ["harp", "basedrum", "snare", "hat", "bass", "flute", "bell", "guitar", "chime", "xylophone", "iron_xylophone", "cow_bell", "didgeridoo", "bit", "banjo", "pling", "zombie", "skeleton", "creeper", "dragon", "wither_skeleton", "piglin", "custom_head"], 50), - new("note", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"], 2), - new("powered", ["true", "false"], 1) - ]), - new(1731, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1747, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1763, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1779, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1795, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1811, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1827, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1843, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1859, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1875, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1891, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1907, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1923, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1939, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1955, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1971, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1987, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2011, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2035, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(2052, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(2054, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(2066, 24, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("short", ["true", "false"], 2) - ]), - new(2106, 12, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 2) - ]), - new(2137, 2, - [ - new("unstable", ["true", "false"], 1) - ]), - new(2140, 256, - [ - new("facing", ["north", "south", "west", "east"], 64), - new("slot_0_occupied", ["true", "false"], 32), - new("slot_1_occupied", ["true", "false"], 16), - new("slot_2_occupied", ["true", "false"], 8), - new("slot_3_occupied", ["true", "false"], 4), - new("slot_4_occupied", ["true", "false"], 2), - new("slot_5_occupied", ["true", "false"], 1) - ]), - new(2399, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(2403, 512, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(2917, 12, - [ - new("active", ["true", "false"], 6), - new("axis", ["x", "y", "z"], 2), - new("natural", ["true", "false"], 1) - ]), - new(2929, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3009, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(3033, 1296, - [ - new("east", ["up", "side", "none"], 432), - new("north", ["up", "side", "none"], 144), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 9), - new("south", ["up", "side", "none"], 3), - new("west", ["up", "side", "none"], 1) - ]), - new(4333, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4341, 8, - [ - new("moisture", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4349, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(4357, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4389, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4421, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4453, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4485, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4517, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4549, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4581, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4613, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4645, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4677, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(4741, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4749, 20, - [ - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south", "south_east", "south_west", "north_west", "north_east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4769, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4849, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4857, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4865, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4873, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4881, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4889, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4897, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4905, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4913, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4921, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4929, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4993, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5057, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5121, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5185, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5249, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5313, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5377, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5441, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5505, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5569, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5633, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5697, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5705, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5713, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5721, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5729, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5737, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5745, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5753, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5761, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5769, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5777, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5785, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5793, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5817, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5819, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5883, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5885, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5887, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5889, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5891, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5893, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5895, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5897, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5899, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5901, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5903, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5905, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5907, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5909, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(5917, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5941, 8, - [ - new("layers", ["1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(5951, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5968, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5984, 2, - [ - new("has_record", ["true", "false"], 1) - ]), - new(5986, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6021, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(6024, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(6028, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6033, 2, - [ - new("axis", ["x", "z"], 1) - ]), - new(6035, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6039, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6043, 7, - [ - new("bites", ["0", "1", "2", "3", "4", "5", "6"], 1) - ]), - new(6050, 64, - [ - new("delay", ["1", "2", "3", "4"], 16), - new("facing", ["north", "south", "west", "east"], 4), - new("locked", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6130, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6194, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6258, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6322, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6386, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6450, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6514, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6578, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6642, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6706, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6782, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6846, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6910, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6974, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7006, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7012, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7046, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7050, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7054, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(7062, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(7070, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7102, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7230, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7358, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7390, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7470, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7550, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7630, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(7635, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7715, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7721, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(8047, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8079, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8159, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(8164, 8, - [ - new("has_bottle_0", ["true", "false"], 4), - new("has_bottle_1", ["true", "false"], 2), - new("has_bottle_2", ["true", "false"], 1) - ]), - new(8173, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(8177, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(8181, 8, - [ - new("eye", ["true", "false"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8191, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(8193, 12, - [ - new("age", ["0", "1", "2"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8205, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8287, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8295, 16, - [ - new("attached", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8311, 128, - [ - new("attached", ["true", "false"], 64), - new("disarmed", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("powered", ["true", "false"], 4), - new("south", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8440, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8520, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8600, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8680, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8693, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(9017, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(9370, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(9378, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(9386, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9410, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9434, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9458, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9482, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9506, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9530, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9554, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9578, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9602, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9626, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9658, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9666, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9698, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9706, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9738, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9746, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9778, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9786, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9818, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9826, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9858, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9866, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9898, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9906, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9910, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9914, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9918, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(9942, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9958, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9974, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("mode", ["compare", "subtract"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9990, 32, - [ - new("inverted", ["true", "false"], 16), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10024, 10, - [ - new("enabled", ["true", "false"], 5), - new("facing", ["down", "north", "south", "west", "east"], 1) - ]), - new(10036, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(10039, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10119, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10143, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(10171, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10203, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10235, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10267, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10299, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10331, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10363, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10395, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10427, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10459, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10491, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10523, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10555, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10587, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10619, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10651, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10683, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10763, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10843, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10923, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11003, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11083, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11163, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11244, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(11246, 32, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11278, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11345, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11425, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11505, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11585, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11591, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11597, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11604, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(11626, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11628, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11630, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11632, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11634, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11636, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11638, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11654, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11670, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11686, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11702, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11718, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11734, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11750, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11766, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11782, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11798, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11814, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11830, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11846, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11862, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11878, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11894, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11898, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11902, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11906, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11910, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11914, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11918, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11922, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11926, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11930, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11934, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11938, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11942, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11946, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11950, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11954, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11961, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12041, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12047, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12053, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12059, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12065, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12071, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12077, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12083, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12089, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12095, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12101, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12107, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12113, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12119, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12125, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12131, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12137, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12143, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12149, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12155, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12161, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12167, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12173, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12179, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12185, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12195, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12227, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12259, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12291, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12323, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12355, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12387, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12419, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12451, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12483, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12515, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12547, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12579, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12611, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12643, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12675, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12707, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12739, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12771, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12835, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12899, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12963, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13027, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13091, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13155, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13219, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13283, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13347, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13353, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13417, 6, - [ - new("age", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(13424, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(13427, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13508, 2, - [ - new("age", ["0", "1"], 1) - ]), - new(13510, 10, - [ - new("age", ["0", "1", "2", "3", "4"], 2), - new("half", ["upper", "lower"], 1) - ]), - new(13520, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(13522, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(13528, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13540, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13552, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(13559, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(13563, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13575, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13581, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13587, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13593, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13599, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13605, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13611, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13617, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13623, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13629, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13635, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13641, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13647, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13653, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13659, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13665, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13671, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13677, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13681, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13685, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13689, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13693, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13697, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13701, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13705, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13709, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13713, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13717, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13721, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13725, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13729, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13733, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13737, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13773, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(13801, 12, - [ - new("eggs", ["1", "2", "3", "4"], 3), - new("hatch", ["0", "1", "2"], 1) - ]), - new(13813, 3, - [ - new("hatch", ["0", "1", "2"], 1) - ]), - new(13826, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13828, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13830, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13832, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13834, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13836, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13838, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13840, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13842, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13844, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13846, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13848, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13850, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13852, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13854, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13856, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13858, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13860, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13862, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13864, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13866, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13874, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13882, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13890, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13898, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13906, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13914, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13922, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13930, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13938, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13946, 8, - [ - new("pickles", ["1", "2", "3", "4"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13955, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13958, 12, - [ - new("age", ["0", "1"], 6), - new("leaves", ["none", "small", "large"], 2), - new("stage", ["0", "1"], 1) - ]), - new(13973, 2, - [ - new("drag", ["true", "false"], 1) - ]), - new(13975, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14055, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14135, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14215, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14295, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14375, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14455, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14535, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14615, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14695, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14775, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14855, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14935, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15015, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15095, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15101, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15107, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15113, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15119, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15125, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15131, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15137, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15143, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15149, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15155, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15161, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15167, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15173, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15497, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15821, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16145, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16469, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16793, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17117, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17441, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17765, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18089, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18413, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18737, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19061, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19385, 32, - [ - new("bottom", ["true", "false"], 16), - new("distance", ["0", "1", "2", "3", "4", "5", "6", "7"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19417, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(19421, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("open", ["true", "false"], 1) - ]), - new(19433, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(19441, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(19451, 12, - [ - new("face", ["floor", "wall", "ceiling"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(19463, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("has_book", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19480, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(19484, 32, - [ - new("attachment", ["floor", "ceiling", "single_wall", "double_wall"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19516, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19520, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19524, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19556, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19588, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(19592, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19595, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19598, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19601, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19609, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19612, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19615, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19618, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19624, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(19651, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(19681, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19687, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19693, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(19695, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(19697, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(19729, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(19761, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19825, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19889, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19921, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19953, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20033, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20113, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20137, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20161, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20225, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20289, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20321, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20353, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20361, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20369, 4, - [ - new("mode", ["save", "load", "corner", "data"], 1) - ]), - new(20373, 12, - [ - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 1) - ]), - new(20385, 9, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(20394, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(20410, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(20434, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(20463, 5, - [ - new("charges", ["0", "1", "2", "3", "4"], 1) - ]), - new(20474, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20554, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20878, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20888, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20894, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20974, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(21299, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21379, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21385, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(21387, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(21411, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(21738, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21754, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21770, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21786, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21802, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21818, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21834, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21850, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21866, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21882, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21898, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21914, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21930, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21946, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21962, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21978, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21994, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22010, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22012, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22014, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22016, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22018, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22020, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22022, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22024, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22026, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22028, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22030, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22032, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22034, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22036, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22038, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22040, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22042, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22046, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22058, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22070, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22082, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22095, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22101, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22181, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(22506, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22512, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22592, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(22918, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22924, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23004, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(23332, 96, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23428, 384, - [ - new("facing", ["north", "south", "west", "east"], 96), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23813, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(23941, 2, - [ - new("bloom", ["true", "false"], 1) - ]), - new(23943, 8, - [ - new("can_summon", ["true", "false"], 4), - new("shrieking", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23969, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24049, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24129, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24209, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24289, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24295, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24301, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24307, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24321, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24401, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24481, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24561, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24641, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24647, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24653, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24659, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24665, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24729, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24793, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24857, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24921, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24985, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25049, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25113, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25177, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25241, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25305, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25369, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25433, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25497, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25561, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25625, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25689, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25691, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25693, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25695, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25697, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25699, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25701, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25703, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25705, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25709, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25713, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25717, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25721, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25725, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25729, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25733, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25737, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25761, 20, - [ - new("thickness", ["tip_merge", "tip", "frustum", "middle", "base"], 4), - new("vertical_direction", ["up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25782, 52, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 2), - new("berries", ["true", "false"], 1) - ]), - new(25834, 2, - [ - new("berries", ["true", "false"], 1) - ]), - new(25840, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("flower_amount", ["1", "2", "3", "4"], 1) - ]), - new(25857, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("tilt", ["none", "unstable", "partial", "full"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25889, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25897, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("half", ["upper", "lower"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25913, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25917, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(25921, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26001, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26007, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(26332, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26412, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26418, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(26743, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26823, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26829, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(27154, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27234, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27240, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(27567, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(27576, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(27579, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(27582, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(27587, 16, - [ - new("cracked", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27603, 48, - [ - new("crafting", ["true", "false"], 24), - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(27651, 12, - [ - new("ominous", ["true", "false"], 6), - new("trial_spawner_state", ["inactive", "waiting_for_players", "active", "waiting_for_reward_ejection", "ejecting_reward", "cooldown"], 1) - ]), - new(27663, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("ominous", ["true", "false"], 4), - new("vault_state", ["inactive", "active", "unlocking", "ejecting"], 1) - ]), - new(27695, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(27698, 162, - [ - new("bottom", ["true", "false"], 81), - new("east", ["none", "low", "tall"], 27), - new("north", ["none", "low", "tall"], 9), - new("south", ["none", "low", "tall"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(27860, 2, - [ - new("tip", ["true", "false"], 1) - ]), - ]; - // - - protected override Dictionary GetDict() - { - return materials; - } - - protected override BlockStateDefinition[] GetStateDefinitions() - { - return stateDefinitions; - } - } -} diff --git a/MinecraftClient/Mapping/BlockPalettes/Palette1215.cs b/MinecraftClient/Mapping/BlockPalettes/Palette1215.cs deleted file mode 100644 index 85a52201ae..0000000000 --- a/MinecraftClient/Mapping/BlockPalettes/Palette1215.cs +++ /dev/null @@ -1,5788 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.BlockPalettes -{ - public class Palette1215 : BlockPalette - { - private static readonly Dictionary materials = new(); - - static Palette1215() - { - for (int i = 9492; i <= 9515; i++) - materials[i] = Material.AcaciaButton; - for (int i = 12973; i <= 13036; i++) - materials[i] = Material.AcaciaDoor; - for (int i = 12589; i <= 12620; i++) - materials[i] = Material.AcaciaFence; - for (int i = 12301; i <= 12332; i++) - materials[i] = Material.AcaciaFenceGate; - for (int i = 5130; i <= 5193; i++) - materials[i] = Material.AcaciaHangingSign; - for (int i = 364; i <= 391; i++) - materials[i] = Material.AcaciaLeaves; - for (int i = 148; i <= 150; i++) - materials[i] = Material.AcaciaLog; - materials[19] = Material.AcaciaPlanks; - for (int i = 5900; i <= 5901; i++) - materials[i] = Material.AcaciaPressurePlate; - for (int i = 37; i <= 38; i++) - materials[i] = Material.AcaciaSapling; - for (int i = 4462; i <= 4493; i++) - materials[i] = Material.AcaciaSign; - for (int i = 12075; i <= 12080; i++) - materials[i] = Material.AcaciaSlab; - for (int i = 10693; i <= 10772; i++) - materials[i] = Material.AcaciaStairs; - for (int i = 6396; i <= 6459; i++) - materials[i] = Material.AcaciaTrapdoor; - for (int i = 5730; i <= 5737; i++) - materials[i] = Material.AcaciaWallHangingSign; - for (int i = 4882; i <= 4889; i++) - materials[i] = Material.AcaciaWallSign; - for (int i = 213; i <= 215; i++) - materials[i] = Material.AcaciaWood; - for (int i = 10129; i <= 10152; i++) - materials[i] = Material.ActivatorRail; - materials[0] = Material.Air; - materials[2125] = Material.Allium; - materials[22059] = Material.AmethystBlock; - for (int i = 22061; i <= 22072; i++) - materials[i] = Material.AmethystCluster; - materials[20476] = Material.AncientDebris; - materials[6] = Material.Andesite; - for (int i = 15159; i <= 15164; i++) - materials[i] = Material.AndesiteSlab; - for (int i = 14785; i <= 14864; i++) - materials[i] = Material.AndesiteStairs; - for (int i = 17775; i <= 18098; i++) - materials[i] = Material.AndesiteWall; - for (int i = 9916; i <= 9919; i++) - materials[i] = Material.Anvil; - for (int i = 7060; i <= 7063; i++) - materials[i] = Material.AttachedMelonStem; - for (int i = 7056; i <= 7059; i++) - materials[i] = Material.AttachedPumpkinStem; - materials[25852] = Material.Azalea; - for (int i = 504; i <= 531; i++) - materials[i] = Material.AzaleaLeaves; - materials[2126] = Material.AzureBluet; - for (int i = 13968; i <= 13979; i++) - materials[i] = Material.Bamboo; - for (int i = 168; i <= 170; i++) - materials[i] = Material.BambooBlock; - for (int i = 9612; i <= 9635; i++) - materials[i] = Material.BambooButton; - for (int i = 13293; i <= 13356; i++) - materials[i] = Material.BambooDoor; - for (int i = 12749; i <= 12780; i++) - materials[i] = Material.BambooFence; - for (int i = 12461; i <= 12492; i++) - materials[i] = Material.BambooFenceGate; - for (int i = 5642; i <= 5705; i++) - materials[i] = Material.BambooHangingSign; - materials[28] = Material.BambooMosaic; - for (int i = 12111; i <= 12116; i++) - materials[i] = Material.BambooMosaicSlab; - for (int i = 11173; i <= 11252; i++) - materials[i] = Material.BambooMosaicStairs; - materials[27] = Material.BambooPlanks; - for (int i = 5910; i <= 5911; i++) - materials[i] = Material.BambooPressurePlate; - materials[13967] = Material.BambooSapling; - for (int i = 4654; i <= 4685; i++) - materials[i] = Material.BambooSign; - for (int i = 12105; i <= 12110; i++) - materials[i] = Material.BambooSlab; - for (int i = 11093; i <= 11172; i++) - materials[i] = Material.BambooStairs; - for (int i = 6716; i <= 6779; i++) - materials[i] = Material.BambooTrapdoor; - for (int i = 5794; i <= 5801; i++) - materials[i] = Material.BambooWallHangingSign; - for (int i = 4930; i <= 4937; i++) - materials[i] = Material.BambooWallSign; - for (int i = 19431; i <= 19442; i++) - materials[i] = Material.Barrel; - for (int i = 11254; i <= 11255; i++) - materials[i] = Material.Barrier; - for (int i = 6031; i <= 6033; i++) - materials[i] = Material.Basalt; - materials[8702] = Material.Beacon; - materials[85] = Material.Bedrock; - for (int i = 20425; i <= 20448; i++) - materials[i] = Material.BeeNest; - for (int i = 20449; i <= 20472; i++) - materials[i] = Material.Beehive; - for (int i = 13532; i <= 13535; i++) - materials[i] = Material.Beetroots; - for (int i = 19494; i <= 19525; i++) - materials[i] = Material.Bell; - for (int i = 25904; i <= 25935; i++) - materials[i] = Material.BigDripleaf; - for (int i = 25936; i <= 25943; i++) - materials[i] = Material.BigDripleafStem; - for (int i = 9444; i <= 9467; i++) - materials[i] = Material.BirchButton; - for (int i = 12845; i <= 12908; i++) - materials[i] = Material.BirchDoor; - for (int i = 12525; i <= 12556; i++) - materials[i] = Material.BirchFence; - for (int i = 12237; i <= 12268; i++) - materials[i] = Material.BirchFenceGate; - for (int i = 5066; i <= 5129; i++) - materials[i] = Material.BirchHangingSign; - for (int i = 308; i <= 335; i++) - materials[i] = Material.BirchLeaves; - for (int i = 142; i <= 144; i++) - materials[i] = Material.BirchLog; - materials[17] = Material.BirchPlanks; - for (int i = 5896; i <= 5897; i++) - materials[i] = Material.BirchPressurePlate; - for (int i = 33; i <= 34; i++) - materials[i] = Material.BirchSapling; - for (int i = 4430; i <= 4461; i++) - materials[i] = Material.BirchSign; - for (int i = 12063; i <= 12068; i++) - materials[i] = Material.BirchSlab; - for (int i = 8530; i <= 8609; i++) - materials[i] = Material.BirchStairs; - for (int i = 6268; i <= 6331; i++) - materials[i] = Material.BirchTrapdoor; - for (int i = 5722; i <= 5729; i++) - materials[i] = Material.BirchWallHangingSign; - for (int i = 4874; i <= 4881; i++) - materials[i] = Material.BirchWallSign; - for (int i = 207; i <= 209; i++) - materials[i] = Material.BirchWood; - for (int i = 11888; i <= 11903; i++) - materials[i] = Material.BlackBanner; - for (int i = 1971; i <= 1986; i++) - materials[i] = Material.BlackBed; - for (int i = 22009; i <= 22024; i++) - materials[i] = Material.BlackCandle; - for (int i = 22057; i <= 22058; i++) - materials[i] = Material.BlackCandleCake; - materials[11632] = Material.BlackCarpet; - materials[13766] = Material.BlackConcrete; - materials[13782] = Material.BlackConcretePowder; - for (int i = 13747; i <= 13750; i++) - materials[i] = Material.BlackGlazedTerracotta; - for (int i = 13681; i <= 13686; i++) - materials[i] = Material.BlackShulkerBox; - materials[6139] = Material.BlackStainedGlass; - for (int i = 10661; i <= 10692; i++) - materials[i] = Material.BlackStainedGlassPane; - materials[10180] = Material.BlackTerracotta; - for (int i = 11964; i <= 11967; i++) - materials[i] = Material.BlackWallBanner; - materials[2108] = Material.BlackWool; - materials[20488] = Material.Blackstone; - for (int i = 20893; i <= 20898; i++) - materials[i] = Material.BlackstoneSlab; - for (int i = 20489; i <= 20568; i++) - materials[i] = Material.BlackstoneStairs; - for (int i = 20569; i <= 20892; i++) - materials[i] = Material.BlackstoneWall; - for (int i = 19451; i <= 19458; i++) - materials[i] = Material.BlastFurnace; - for (int i = 11824; i <= 11839; i++) - materials[i] = Material.BlueBanner; - for (int i = 1907; i <= 1922; i++) - materials[i] = Material.BlueBed; - for (int i = 21945; i <= 21960; i++) - materials[i] = Material.BlueCandle; - for (int i = 22049; i <= 22050; i++) - materials[i] = Material.BlueCandleCake; - materials[11628] = Material.BlueCarpet; - materials[13762] = Material.BlueConcrete; - materials[13778] = Material.BlueConcretePowder; - for (int i = 13731; i <= 13734; i++) - materials[i] = Material.BlueGlazedTerracotta; - materials[13964] = Material.BlueIce; - materials[2124] = Material.BlueOrchid; - for (int i = 13657; i <= 13662; i++) - materials[i] = Material.BlueShulkerBox; - materials[6135] = Material.BlueStainedGlass; - for (int i = 10533; i <= 10564; i++) - materials[i] = Material.BlueStainedGlassPane; - materials[10176] = Material.BlueTerracotta; - for (int i = 11948; i <= 11951; i++) - materials[i] = Material.BlueWallBanner; - materials[2104] = Material.BlueWool; - for (int i = 13569; i <= 13571; i++) - materials[i] = Material.BoneBlock; - materials[2142] = Material.Bookshelf; - for (int i = 13848; i <= 13849; i++) - materials[i] = Material.BrainCoral; - materials[13832] = Material.BrainCoralBlock; - for (int i = 13868; i <= 13869; i++) - materials[i] = Material.BrainCoralFan; - for (int i = 13924; i <= 13931; i++) - materials[i] = Material.BrainCoralWallFan; - for (int i = 8174; i <= 8181; i++) - materials[i] = Material.BrewingStand; - for (int i = 12153; i <= 12158; i++) - materials[i] = Material.BrickSlab; - for (int i = 7400; i <= 7479; i++) - materials[i] = Material.BrickStairs; - for (int i = 15183; i <= 15506; i++) - materials[i] = Material.BrickWall; - materials[2139] = Material.Bricks; - for (int i = 11840; i <= 11855; i++) - materials[i] = Material.BrownBanner; - for (int i = 1923; i <= 1938; i++) - materials[i] = Material.BrownBed; - for (int i = 21961; i <= 21976; i++) - materials[i] = Material.BrownCandle; - for (int i = 22051; i <= 22052; i++) - materials[i] = Material.BrownCandleCake; - materials[11629] = Material.BrownCarpet; - materials[13763] = Material.BrownConcrete; - materials[13779] = Material.BrownConcretePowder; - for (int i = 13735; i <= 13738; i++) - materials[i] = Material.BrownGlazedTerracotta; - materials[2135] = Material.BrownMushroom; - for (int i = 6792; i <= 6855; i++) - materials[i] = Material.BrownMushroomBlock; - for (int i = 13663; i <= 13668; i++) - materials[i] = Material.BrownShulkerBox; - materials[6136] = Material.BrownStainedGlass; - for (int i = 10565; i <= 10596; i++) - materials[i] = Material.BrownStainedGlassPane; - materials[10177] = Material.BrownTerracotta; - for (int i = 11952; i <= 11955; i++) - materials[i] = Material.BrownWallBanner; - materials[2105] = Material.BrownWool; - for (int i = 13983; i <= 13984; i++) - materials[i] = Material.BubbleColumn; - for (int i = 13850; i <= 13851; i++) - materials[i] = Material.BubbleCoral; - materials[13833] = Material.BubbleCoralBlock; - for (int i = 13870; i <= 13871; i++) - materials[i] = Material.BubbleCoralFan; - for (int i = 13932; i <= 13939; i++) - materials[i] = Material.BubbleCoralWallFan; - materials[22060] = Material.BuddingAmethyst; - materials[2051] = Material.Bush; - for (int i = 5960; i <= 5975; i++) - materials[i] = Material.Cactus; - materials[5976] = Material.CactusFlower; - for (int i = 6053; i <= 6059; i++) - materials[i] = Material.Cake; - materials[23344] = Material.Calcite; - for (int i = 23443; i <= 23826; i++) - materials[i] = Material.CalibratedSculkSensor; - for (int i = 19534; i <= 19565; i++) - materials[i] = Material.Campfire; - for (int i = 21753; i <= 21768; i++) - materials[i] = Material.Candle; - for (int i = 22025; i <= 22026; i++) - materials[i] = Material.CandleCake; - for (int i = 9380; i <= 9387; i++) - materials[i] = Material.Carrots; - materials[19459] = Material.CartographyTable; - for (int i = 6045; i <= 6048; i++) - materials[i] = Material.CarvedPumpkin; - materials[8182] = Material.Cauldron; - materials[13982] = Material.CaveAir; - for (int i = 25797; i <= 25848; i++) - materials[i] = Material.CaveVines; - for (int i = 25849; i <= 25850; i++) - materials[i] = Material.CaveVinesPlant; - for (int i = 7016; i <= 7021; i++) - materials[i] = Material.Chain; - for (int i = 13550; i <= 13561; i++) - materials[i] = Material.ChainCommandBlock; - for (int i = 9516; i <= 9539; i++) - materials[i] = Material.CherryButton; - for (int i = 13037; i <= 13100; i++) - materials[i] = Material.CherryDoor; - for (int i = 12621; i <= 12652; i++) - materials[i] = Material.CherryFence; - for (int i = 12333; i <= 12364; i++) - materials[i] = Material.CherryFenceGate; - for (int i = 5194; i <= 5257; i++) - materials[i] = Material.CherryHangingSign; - for (int i = 392; i <= 419; i++) - materials[i] = Material.CherryLeaves; - for (int i = 151; i <= 153; i++) - materials[i] = Material.CherryLog; - materials[20] = Material.CherryPlanks; - for (int i = 5902; i <= 5903; i++) - materials[i] = Material.CherryPressurePlate; - for (int i = 39; i <= 40; i++) - materials[i] = Material.CherrySapling; - for (int i = 4494; i <= 4525; i++) - materials[i] = Material.CherrySign; - for (int i = 12081; i <= 12086; i++) - materials[i] = Material.CherrySlab; - for (int i = 10773; i <= 10852; i++) - materials[i] = Material.CherryStairs; - for (int i = 6460; i <= 6523; i++) - materials[i] = Material.CherryTrapdoor; - for (int i = 5738; i <= 5745; i++) - materials[i] = Material.CherryWallHangingSign; - for (int i = 4890; i <= 4897; i++) - materials[i] = Material.CherryWallSign; - for (int i = 216; i <= 218; i++) - materials[i] = Material.CherryWood; - for (int i = 3018; i <= 3041; i++) - materials[i] = Material.Chest; - for (int i = 9920; i <= 9923; i++) - materials[i] = Material.ChippedAnvil; - for (int i = 2143; i <= 2398; i++) - materials[i] = Material.ChiseledBookshelf; - materials[23979] = Material.ChiseledCopper; - materials[27611] = Material.ChiseledDeepslate; - materials[21750] = Material.ChiseledNetherBricks; - materials[20902] = Material.ChiseledPolishedBlackstone; - materials[10045] = Material.ChiseledQuartzBlock; - materials[11969] = Material.ChiseledRedSandstone; - materials[8055] = Material.ChiseledResinBricks; - materials[579] = Material.ChiseledSandstone; - materials[6783] = Material.ChiseledStoneBricks; - materials[22931] = Material.ChiseledTuff; - materials[23343] = Material.ChiseledTuffBricks; - for (int i = 13427; i <= 13432; i++) - materials[i] = Material.ChorusFlower; - for (int i = 13363; i <= 13426; i++) - materials[i] = Material.ChorusPlant; - materials[5977] = Material.Clay; - materials[27910] = Material.ClosedEyeblossom; - materials[11634] = Material.CoalBlock; - materials[133] = Material.CoalOre; - materials[11] = Material.CoarseDirt; - materials[25967] = Material.CobbledDeepslate; - for (int i = 26048; i <= 26053; i++) - materials[i] = Material.CobbledDeepslateSlab; - for (int i = 25968; i <= 26047; i++) - materials[i] = Material.CobbledDeepslateStairs; - for (int i = 26054; i <= 26377; i++) - materials[i] = Material.CobbledDeepslateWall; - materials[14] = Material.Cobblestone; - for (int i = 12147; i <= 12152; i++) - materials[i] = Material.CobblestoneSlab; - for (int i = 4778; i <= 4857; i++) - materials[i] = Material.CobblestoneStairs; - for (int i = 8703; i <= 9026; i++) - materials[i] = Material.CobblestoneWall; - materials[2047] = Material.Cobweb; - for (int i = 8203; i <= 8214; i++) - materials[i] = Material.Cocoa; - for (int i = 8690; i <= 8701; i++) - materials[i] = Material.CommandBlock; - for (int i = 9984; i <= 9999; i++) - materials[i] = Material.Comparator; - for (int i = 20400; i <= 20408; i++) - materials[i] = Material.Composter; - for (int i = 13965; i <= 13966; i++) - materials[i] = Material.Conduit; - materials[23966] = Material.CopperBlock; - for (int i = 25720; i <= 25723; i++) - materials[i] = Material.CopperBulb; - for (int i = 24680; i <= 24743; i++) - materials[i] = Material.CopperDoor; - for (int i = 25704; i <= 25705; i++) - materials[i] = Material.CopperGrate; - materials[23970] = Material.CopperOre; - for (int i = 25192; i <= 25255; i++) - materials[i] = Material.CopperTrapdoor; - materials[2132] = Material.Cornflower; - materials[27612] = Material.CrackedDeepslateBricks; - materials[27613] = Material.CrackedDeepslateTiles; - materials[21751] = Material.CrackedNetherBricks; - materials[20901] = Material.CrackedPolishedBlackstoneBricks; - materials[6782] = Material.CrackedStoneBricks; - for (int i = 27650; i <= 27697; i++) - materials[i] = Material.Crafter; - materials[4341] = Material.CraftingTable; - for (int i = 2920; i <= 2937; i++) - materials[i] = Material.CreakingHeart; - for (int i = 9796; i <= 9827; i++) - materials[i] = Material.CreeperHead; - for (int i = 9828; i <= 9835; i++) - materials[i] = Material.CreeperWallHead; - for (int i = 20123; i <= 20146; i++) - materials[i] = Material.CrimsonButton; - for (int i = 20171; i <= 20234; i++) - materials[i] = Material.CrimsonDoor; - for (int i = 19707; i <= 19738; i++) - materials[i] = Material.CrimsonFence; - for (int i = 19899; i <= 19930; i++) - materials[i] = Material.CrimsonFenceGate; - materials[19632] = Material.CrimsonFungus; - for (int i = 5450; i <= 5513; i++) - materials[i] = Material.CrimsonHangingSign; - for (int i = 19625; i <= 19627; i++) - materials[i] = Material.CrimsonHyphae; - materials[19631] = Material.CrimsonNylium; - materials[19689] = Material.CrimsonPlanks; - for (int i = 19703; i <= 19704; i++) - materials[i] = Material.CrimsonPressurePlate; - materials[19688] = Material.CrimsonRoots; - for (int i = 20299; i <= 20330; i++) - materials[i] = Material.CrimsonSign; - for (int i = 19691; i <= 19696; i++) - materials[i] = Material.CrimsonSlab; - for (int i = 19963; i <= 20042; i++) - materials[i] = Material.CrimsonStairs; - for (int i = 19619; i <= 19621; i++) - materials[i] = Material.CrimsonStem; - for (int i = 19771; i <= 19834; i++) - materials[i] = Material.CrimsonTrapdoor; - for (int i = 5778; i <= 5785; i++) - materials[i] = Material.CrimsonWallHangingSign; - for (int i = 20363; i <= 20370; i++) - materials[i] = Material.CrimsonWallSign; - materials[20477] = Material.CryingObsidian; - materials[23975] = Material.CutCopper; - for (int i = 24322; i <= 24327; i++) - materials[i] = Material.CutCopperSlab; - for (int i = 24224; i <= 24303; i++) - materials[i] = Material.CutCopperStairs; - materials[11970] = Material.CutRedSandstone; - for (int i = 12189; i <= 12194; i++) - materials[i] = Material.CutRedSandstoneSlab; - materials[580] = Material.CutSandstone; - for (int i = 12135; i <= 12140; i++) - materials[i] = Material.CutSandstoneSlab; - for (int i = 11792; i <= 11807; i++) - materials[i] = Material.CyanBanner; - for (int i = 1875; i <= 1890; i++) - materials[i] = Material.CyanBed; - for (int i = 21913; i <= 21928; i++) - materials[i] = Material.CyanCandle; - for (int i = 22045; i <= 22046; i++) - materials[i] = Material.CyanCandleCake; - materials[11626] = Material.CyanCarpet; - materials[13760] = Material.CyanConcrete; - materials[13776] = Material.CyanConcretePowder; - for (int i = 13723; i <= 13726; i++) - materials[i] = Material.CyanGlazedTerracotta; - for (int i = 13645; i <= 13650; i++) - materials[i] = Material.CyanShulkerBox; - materials[6133] = Material.CyanStainedGlass; - for (int i = 10469; i <= 10500; i++) - materials[i] = Material.CyanStainedGlassPane; - materials[10174] = Material.CyanTerracotta; - for (int i = 11940; i <= 11943; i++) - materials[i] = Material.CyanWallBanner; - materials[2102] = Material.CyanWool; - for (int i = 9924; i <= 9927; i++) - materials[i] = Material.DamagedAnvil; - materials[2121] = Material.Dandelion; - for (int i = 9540; i <= 9563; i++) - materials[i] = Material.DarkOakButton; - for (int i = 13101; i <= 13164; i++) - materials[i] = Material.DarkOakDoor; - for (int i = 12653; i <= 12684; i++) - materials[i] = Material.DarkOakFence; - for (int i = 12365; i <= 12396; i++) - materials[i] = Material.DarkOakFenceGate; - for (int i = 5322; i <= 5385; i++) - materials[i] = Material.DarkOakHangingSign; - for (int i = 420; i <= 447; i++) - materials[i] = Material.DarkOakLeaves; - for (int i = 154; i <= 156; i++) - materials[i] = Material.DarkOakLog; - materials[21] = Material.DarkOakPlanks; - for (int i = 5904; i <= 5905; i++) - materials[i] = Material.DarkOakPressurePlate; - for (int i = 41; i <= 42; i++) - materials[i] = Material.DarkOakSapling; - for (int i = 4558; i <= 4589; i++) - materials[i] = Material.DarkOakSign; - for (int i = 12087; i <= 12092; i++) - materials[i] = Material.DarkOakSlab; - for (int i = 10853; i <= 10932; i++) - materials[i] = Material.DarkOakStairs; - for (int i = 6524; i <= 6587; i++) - materials[i] = Material.DarkOakTrapdoor; - for (int i = 5754; i <= 5761; i++) - materials[i] = Material.DarkOakWallHangingSign; - for (int i = 4906; i <= 4913; i++) - materials[i] = Material.DarkOakWallSign; - for (int i = 219; i <= 221; i++) - materials[i] = Material.DarkOakWood; - materials[11354] = Material.DarkPrismarine; - for (int i = 11607; i <= 11612; i++) - materials[i] = Material.DarkPrismarineSlab; - for (int i = 11515; i <= 11594; i++) - materials[i] = Material.DarkPrismarineStairs; - for (int i = 10000; i <= 10031; i++) - materials[i] = Material.DaylightDetector; - for (int i = 13838; i <= 13839; i++) - materials[i] = Material.DeadBrainCoral; - materials[13827] = Material.DeadBrainCoralBlock; - for (int i = 13858; i <= 13859; i++) - materials[i] = Material.DeadBrainCoralFan; - for (int i = 13884; i <= 13891; i++) - materials[i] = Material.DeadBrainCoralWallFan; - for (int i = 13840; i <= 13841; i++) - materials[i] = Material.DeadBubbleCoral; - materials[13828] = Material.DeadBubbleCoralBlock; - for (int i = 13860; i <= 13861; i++) - materials[i] = Material.DeadBubbleCoralFan; - for (int i = 13892; i <= 13899; i++) - materials[i] = Material.DeadBubbleCoralWallFan; - materials[2050] = Material.DeadBush; - for (int i = 13842; i <= 13843; i++) - materials[i] = Material.DeadFireCoral; - materials[13829] = Material.DeadFireCoralBlock; - for (int i = 13862; i <= 13863; i++) - materials[i] = Material.DeadFireCoralFan; - for (int i = 13900; i <= 13907; i++) - materials[i] = Material.DeadFireCoralWallFan; - for (int i = 13844; i <= 13845; i++) - materials[i] = Material.DeadHornCoral; - materials[13830] = Material.DeadHornCoralBlock; - for (int i = 13864; i <= 13865; i++) - materials[i] = Material.DeadHornCoralFan; - for (int i = 13908; i <= 13915; i++) - materials[i] = Material.DeadHornCoralWallFan; - for (int i = 13836; i <= 13837; i++) - materials[i] = Material.DeadTubeCoral; - materials[13826] = Material.DeadTubeCoralBlock; - for (int i = 13856; i <= 13857; i++) - materials[i] = Material.DeadTubeCoralFan; - for (int i = 13876; i <= 13883; i++) - materials[i] = Material.DeadTubeCoralWallFan; - for (int i = 27634; i <= 27649; i++) - materials[i] = Material.DecoratedPot; - for (int i = 25964; i <= 25966; i++) - materials[i] = Material.Deepslate; - for (int i = 27281; i <= 27286; i++) - materials[i] = Material.DeepslateBrickSlab; - for (int i = 27201; i <= 27280; i++) - materials[i] = Material.DeepslateBrickStairs; - for (int i = 27287; i <= 27610; i++) - materials[i] = Material.DeepslateBrickWall; - materials[27200] = Material.DeepslateBricks; - materials[134] = Material.DeepslateCoalOre; - materials[23971] = Material.DeepslateCopperOre; - materials[4339] = Material.DeepslateDiamondOre; - materials[8296] = Material.DeepslateEmeraldOre; - materials[130] = Material.DeepslateGoldOre; - materials[132] = Material.DeepslateIronOre; - materials[564] = Material.DeepslateLapisOre; - for (int i = 5914; i <= 5915; i++) - materials[i] = Material.DeepslateRedstoneOre; - for (int i = 26870; i <= 26875; i++) - materials[i] = Material.DeepslateTileSlab; - for (int i = 26790; i <= 26869; i++) - materials[i] = Material.DeepslateTileStairs; - for (int i = 26876; i <= 27199; i++) - materials[i] = Material.DeepslateTileWall; - materials[26789] = Material.DeepslateTiles; - for (int i = 2011; i <= 2034; i++) - materials[i] = Material.DetectorRail; - materials[4340] = Material.DiamondBlock; - materials[4338] = Material.DiamondOre; - materials[4] = Material.Diorite; - for (int i = 15177; i <= 15182; i++) - materials[i] = Material.DioriteSlab; - for (int i = 15025; i <= 15104; i++) - materials[i] = Material.DioriteStairs; - for (int i = 19071; i <= 19394; i++) - materials[i] = Material.DioriteWall; - materials[10] = Material.Dirt; - materials[13536] = Material.DirtPath; - for (int i = 566; i <= 577; i++) - materials[i] = Material.Dispenser; - materials[8200] = Material.DragonEgg; - for (int i = 9836; i <= 9867; i++) - materials[i] = Material.DragonHead; - for (int i = 9868; i <= 9875; i++) - materials[i] = Material.DragonWallHead; - materials[13810] = Material.DriedKelpBlock; - materials[25796] = Material.DripstoneBlock; - for (int i = 10153; i <= 10164; i++) - materials[i] = Material.Dropper; - materials[8449] = Material.EmeraldBlock; - materials[8295] = Material.EmeraldOre; - materials[8173] = Material.EnchantingTable; - materials[13537] = Material.EndGateway; - materials[8190] = Material.EndPortal; - for (int i = 8191; i <= 8198; i++) - materials[i] = Material.EndPortalFrame; - for (int i = 13357; i <= 13362; i++) - materials[i] = Material.EndRod; - materials[8199] = Material.EndStone; - for (int i = 15135; i <= 15140; i++) - materials[i] = Material.EndStoneBrickSlab; - for (int i = 14385; i <= 14464; i++) - materials[i] = Material.EndStoneBrickStairs; - for (int i = 18747; i <= 19070; i++) - materials[i] = Material.EndStoneBrickWall; - materials[13517] = Material.EndStoneBricks; - for (int i = 8297; i <= 8304; i++) - materials[i] = Material.EnderChest; - materials[23978] = Material.ExposedChiseledCopper; - materials[23967] = Material.ExposedCopper; - for (int i = 25724; i <= 25727; i++) - materials[i] = Material.ExposedCopperBulb; - for (int i = 24744; i <= 24807; i++) - materials[i] = Material.ExposedCopperDoor; - for (int i = 25706; i <= 25707; i++) - materials[i] = Material.ExposedCopperGrate; - for (int i = 25256; i <= 25319; i++) - materials[i] = Material.ExposedCopperTrapdoor; - materials[23974] = Material.ExposedCutCopper; - for (int i = 24316; i <= 24321; i++) - materials[i] = Material.ExposedCutCopperSlab; - for (int i = 24144; i <= 24223; i++) - materials[i] = Material.ExposedCutCopperStairs; - for (int i = 4350; i <= 4357; i++) - materials[i] = Material.Farmland; - materials[2049] = Material.Fern; - for (int i = 2406; i <= 2917; i++) - materials[i] = Material.Fire; - for (int i = 13852; i <= 13853; i++) - materials[i] = Material.FireCoral; - materials[13834] = Material.FireCoralBlock; - for (int i = 13872; i <= 13873; i++) - materials[i] = Material.FireCoralFan; - for (int i = 13940; i <= 13947; i++) - materials[i] = Material.FireCoralWallFan; - materials[27913] = Material.FireflyBush; - materials[19460] = Material.FletchingTable; - materials[9351] = Material.FlowerPot; - materials[25853] = Material.FloweringAzalea; - for (int i = 532; i <= 559; i++) - materials[i] = Material.FloweringAzaleaLeaves; - materials[27632] = Material.Frogspawn; - for (int i = 13562; i <= 13565; i++) - materials[i] = Material.FrostedIce; - for (int i = 4358; i <= 4365; i++) - materials[i] = Material.Furnace; - materials[21313] = Material.GildedBlackstone; - materials[562] = Material.Glass; - for (int i = 7022; i <= 7053; i++) - materials[i] = Material.GlassPane; - for (int i = 7112; i <= 7239; i++) - materials[i] = Material.GlowLichen; - materials[6042] = Material.Glowstone; - materials[2137] = Material.GoldBlock; - materials[129] = Material.GoldOre; - materials[2] = Material.Granite; - for (int i = 15153; i <= 15158; i++) - materials[i] = Material.GraniteSlab; - for (int i = 14705; i <= 14784; i++) - materials[i] = Material.GraniteStairs; - for (int i = 16479; i <= 16802; i++) - materials[i] = Material.GraniteWall; - for (int i = 8; i <= 9; i++) - materials[i] = Material.GrassBlock; - materials[124] = Material.Gravel; - for (int i = 11760; i <= 11775; i++) - materials[i] = Material.GrayBanner; - for (int i = 1843; i <= 1858; i++) - materials[i] = Material.GrayBed; - for (int i = 21881; i <= 21896; i++) - materials[i] = Material.GrayCandle; - for (int i = 22041; i <= 22042; i++) - materials[i] = Material.GrayCandleCake; - materials[11624] = Material.GrayCarpet; - materials[13758] = Material.GrayConcrete; - materials[13774] = Material.GrayConcretePowder; - for (int i = 13715; i <= 13718; i++) - materials[i] = Material.GrayGlazedTerracotta; - for (int i = 13633; i <= 13638; i++) - materials[i] = Material.GrayShulkerBox; - materials[6131] = Material.GrayStainedGlass; - for (int i = 10405; i <= 10436; i++) - materials[i] = Material.GrayStainedGlassPane; - materials[10172] = Material.GrayTerracotta; - for (int i = 11932; i <= 11935; i++) - materials[i] = Material.GrayWallBanner; - materials[2100] = Material.GrayWool; - for (int i = 11856; i <= 11871; i++) - materials[i] = Material.GreenBanner; - for (int i = 1939; i <= 1954; i++) - materials[i] = Material.GreenBed; - for (int i = 21977; i <= 21992; i++) - materials[i] = Material.GreenCandle; - for (int i = 22053; i <= 22054; i++) - materials[i] = Material.GreenCandleCake; - materials[11630] = Material.GreenCarpet; - materials[13764] = Material.GreenConcrete; - materials[13780] = Material.GreenConcretePowder; - for (int i = 13739; i <= 13742; i++) - materials[i] = Material.GreenGlazedTerracotta; - for (int i = 13669; i <= 13674; i++) - materials[i] = Material.GreenShulkerBox; - materials[6137] = Material.GreenStainedGlass; - for (int i = 10597; i <= 10628; i++) - materials[i] = Material.GreenStainedGlassPane; - materials[10178] = Material.GreenTerracotta; - for (int i = 11956; i <= 11959; i++) - materials[i] = Material.GreenWallBanner; - materials[2106] = Material.GreenWool; - for (int i = 19461; i <= 19472; i++) - materials[i] = Material.Grindstone; - for (int i = 25960; i <= 25961; i++) - materials[i] = Material.HangingRoots; - for (int i = 11614; i <= 11616; i++) - materials[i] = Material.HayBlock; - for (int i = 27742; i <= 27743; i++) - materials[i] = Material.HeavyCore; - for (int i = 9968; i <= 9983; i++) - materials[i] = Material.HeavyWeightedPressurePlate; - materials[20473] = Material.HoneyBlock; - materials[20474] = Material.HoneycombBlock; - for (int i = 10034; i <= 10043; i++) - materials[i] = Material.Hopper; - for (int i = 13854; i <= 13855; i++) - materials[i] = Material.HornCoral; - materials[13835] = Material.HornCoralBlock; - for (int i = 13874; i <= 13875; i++) - materials[i] = Material.HornCoralFan; - for (int i = 13948; i <= 13955; i++) - materials[i] = Material.HornCoralWallFan; - materials[5958] = Material.Ice; - materials[6791] = Material.InfestedChiseledStoneBricks; - materials[6787] = Material.InfestedCobblestone; - materials[6790] = Material.InfestedCrackedStoneBricks; - for (int i = 27614; i <= 27616; i++) - materials[i] = Material.InfestedDeepslate; - materials[6789] = Material.InfestedMossyStoneBricks; - materials[6786] = Material.InfestedStone; - materials[6788] = Material.InfestedStoneBricks; - for (int i = 6984; i <= 7015; i++) - materials[i] = Material.IronBars; - materials[2138] = Material.IronBlock; - for (int i = 5828; i <= 5891; i++) - materials[i] = Material.IronDoor; - materials[131] = Material.IronOre; - for (int i = 11288; i <= 11351; i++) - materials[i] = Material.IronTrapdoor; - for (int i = 6049; i <= 6052; i++) - materials[i] = Material.JackOLantern; - for (int i = 20383; i <= 20394; i++) - materials[i] = Material.Jigsaw; - for (int i = 5994; i <= 5995; i++) - materials[i] = Material.Jukebox; - for (int i = 9468; i <= 9491; i++) - materials[i] = Material.JungleButton; - for (int i = 12909; i <= 12972; i++) - materials[i] = Material.JungleDoor; - for (int i = 12557; i <= 12588; i++) - materials[i] = Material.JungleFence; - for (int i = 12269; i <= 12300; i++) - materials[i] = Material.JungleFenceGate; - for (int i = 5258; i <= 5321; i++) - materials[i] = Material.JungleHangingSign; - for (int i = 336; i <= 363; i++) - materials[i] = Material.JungleLeaves; - for (int i = 145; i <= 147; i++) - materials[i] = Material.JungleLog; - materials[18] = Material.JunglePlanks; - for (int i = 5898; i <= 5899; i++) - materials[i] = Material.JunglePressurePlate; - for (int i = 35; i <= 36; i++) - materials[i] = Material.JungleSapling; - for (int i = 4526; i <= 4557; i++) - materials[i] = Material.JungleSign; - for (int i = 12069; i <= 12074; i++) - materials[i] = Material.JungleSlab; - for (int i = 8610; i <= 8689; i++) - materials[i] = Material.JungleStairs; - for (int i = 6332; i <= 6395; i++) - materials[i] = Material.JungleTrapdoor; - for (int i = 5746; i <= 5753; i++) - materials[i] = Material.JungleWallHangingSign; - for (int i = 4898; i <= 4905; i++) - materials[i] = Material.JungleWallSign; - for (int i = 210; i <= 212; i++) - materials[i] = Material.JungleWood; - for (int i = 13783; i <= 13808; i++) - materials[i] = Material.Kelp; - materials[13809] = Material.KelpPlant; - for (int i = 4750; i <= 4757; i++) - materials[i] = Material.Ladder; - for (int i = 19526; i <= 19529; i++) - materials[i] = Material.Lantern; - materials[565] = Material.LapisBlock; - materials[563] = Material.LapisOre; - for (int i = 22073; i <= 22084; i++) - materials[i] = Material.LargeAmethystBud; - for (int i = 11646; i <= 11647; i++) - materials[i] = Material.LargeFern; - for (int i = 102; i <= 117; i++) - materials[i] = Material.Lava; - materials[8186] = Material.LavaCauldron; - for (int i = 25887; i <= 25902; i++) - materials[i] = Material.LeafLitter; - for (int i = 19473; i <= 19488; i++) - materials[i] = Material.Lectern; - for (int i = 5802; i <= 5825; i++) - materials[i] = Material.Lever; - for (int i = 11256; i <= 11287; i++) - materials[i] = Material.Light; - for (int i = 11696; i <= 11711; i++) - materials[i] = Material.LightBlueBanner; - for (int i = 1779; i <= 1794; i++) - materials[i] = Material.LightBlueBed; - for (int i = 21817; i <= 21832; i++) - materials[i] = Material.LightBlueCandle; - for (int i = 22033; i <= 22034; i++) - materials[i] = Material.LightBlueCandleCake; - materials[11620] = Material.LightBlueCarpet; - materials[13754] = Material.LightBlueConcrete; - materials[13770] = Material.LightBlueConcretePowder; - for (int i = 13699; i <= 13702; i++) - materials[i] = Material.LightBlueGlazedTerracotta; - for (int i = 13609; i <= 13614; i++) - materials[i] = Material.LightBlueShulkerBox; - materials[6127] = Material.LightBlueStainedGlass; - for (int i = 10277; i <= 10308; i++) - materials[i] = Material.LightBlueStainedGlassPane; - materials[10168] = Material.LightBlueTerracotta; - for (int i = 11916; i <= 11919; i++) - materials[i] = Material.LightBlueWallBanner; - materials[2096] = Material.LightBlueWool; - for (int i = 11776; i <= 11791; i++) - materials[i] = Material.LightGrayBanner; - for (int i = 1859; i <= 1874; i++) - materials[i] = Material.LightGrayBed; - for (int i = 21897; i <= 21912; i++) - materials[i] = Material.LightGrayCandle; - for (int i = 22043; i <= 22044; i++) - materials[i] = Material.LightGrayCandleCake; - materials[11625] = Material.LightGrayCarpet; - materials[13759] = Material.LightGrayConcrete; - materials[13775] = Material.LightGrayConcretePowder; - for (int i = 13719; i <= 13722; i++) - materials[i] = Material.LightGrayGlazedTerracotta; - for (int i = 13639; i <= 13644; i++) - materials[i] = Material.LightGrayShulkerBox; - materials[6132] = Material.LightGrayStainedGlass; - for (int i = 10437; i <= 10468; i++) - materials[i] = Material.LightGrayStainedGlassPane; - materials[10173] = Material.LightGrayTerracotta; - for (int i = 11936; i <= 11939; i++) - materials[i] = Material.LightGrayWallBanner; - materials[2101] = Material.LightGrayWool; - for (int i = 9952; i <= 9967; i++) - materials[i] = Material.LightWeightedPressurePlate; - for (int i = 25752; i <= 25775; i++) - materials[i] = Material.LightningRod; - for (int i = 11638; i <= 11639; i++) - materials[i] = Material.Lilac; - materials[2134] = Material.LilyOfTheValley; - materials[7642] = Material.LilyPad; - for (int i = 11728; i <= 11743; i++) - materials[i] = Material.LimeBanner; - for (int i = 1811; i <= 1826; i++) - materials[i] = Material.LimeBed; - for (int i = 21849; i <= 21864; i++) - materials[i] = Material.LimeCandle; - for (int i = 22037; i <= 22038; i++) - materials[i] = Material.LimeCandleCake; - materials[11622] = Material.LimeCarpet; - materials[13756] = Material.LimeConcrete; - materials[13772] = Material.LimeConcretePowder; - for (int i = 13707; i <= 13710; i++) - materials[i] = Material.LimeGlazedTerracotta; - for (int i = 13621; i <= 13626; i++) - materials[i] = Material.LimeShulkerBox; - materials[6129] = Material.LimeStainedGlass; - for (int i = 10341; i <= 10372; i++) - materials[i] = Material.LimeStainedGlassPane; - materials[10170] = Material.LimeTerracotta; - for (int i = 11924; i <= 11927; i++) - materials[i] = Material.LimeWallBanner; - materials[2098] = Material.LimeWool; - materials[20487] = Material.Lodestone; - for (int i = 19427; i <= 19430; i++) - materials[i] = Material.Loom; - for (int i = 11680; i <= 11695; i++) - materials[i] = Material.MagentaBanner; - for (int i = 1763; i <= 1778; i++) - materials[i] = Material.MagentaBed; - for (int i = 21801; i <= 21816; i++) - materials[i] = Material.MagentaCandle; - for (int i = 22031; i <= 22032; i++) - materials[i] = Material.MagentaCandleCake; - materials[11619] = Material.MagentaCarpet; - materials[13753] = Material.MagentaConcrete; - materials[13769] = Material.MagentaConcretePowder; - for (int i = 13695; i <= 13698; i++) - materials[i] = Material.MagentaGlazedTerracotta; - for (int i = 13603; i <= 13608; i++) - materials[i] = Material.MagentaShulkerBox; - materials[6126] = Material.MagentaStainedGlass; - for (int i = 10245; i <= 10276; i++) - materials[i] = Material.MagentaStainedGlassPane; - materials[10167] = Material.MagentaTerracotta; - for (int i = 11912; i <= 11915; i++) - materials[i] = Material.MagentaWallBanner; - materials[2095] = Material.MagentaWool; - materials[13566] = Material.MagmaBlock; - for (int i = 9588; i <= 9611; i++) - materials[i] = Material.MangroveButton; - for (int i = 13229; i <= 13292; i++) - materials[i] = Material.MangroveDoor; - for (int i = 12717; i <= 12748; i++) - materials[i] = Material.MangroveFence; - for (int i = 12429; i <= 12460; i++) - materials[i] = Material.MangroveFenceGate; - for (int i = 5578; i <= 5641; i++) - materials[i] = Material.MangroveHangingSign; - for (int i = 476; i <= 503; i++) - materials[i] = Material.MangroveLeaves; - for (int i = 160; i <= 162; i++) - materials[i] = Material.MangroveLog; - materials[26] = Material.MangrovePlanks; - for (int i = 5908; i <= 5909; i++) - materials[i] = Material.MangrovePressurePlate; - for (int i = 45; i <= 84; i++) - materials[i] = Material.MangrovePropagule; - for (int i = 163; i <= 164; i++) - materials[i] = Material.MangroveRoots; - for (int i = 4622; i <= 4653; i++) - materials[i] = Material.MangroveSign; - for (int i = 12099; i <= 12104; i++) - materials[i] = Material.MangroveSlab; - for (int i = 11013; i <= 11092; i++) - materials[i] = Material.MangroveStairs; - for (int i = 6652; i <= 6715; i++) - materials[i] = Material.MangroveTrapdoor; - for (int i = 5770; i <= 5777; i++) - materials[i] = Material.MangroveWallHangingSign; - for (int i = 4922; i <= 4929; i++) - materials[i] = Material.MangroveWallSign; - for (int i = 222; i <= 224; i++) - materials[i] = Material.MangroveWood; - for (int i = 22085; i <= 22096; i++) - materials[i] = Material.MediumAmethystBud; - materials[7055] = Material.Melon; - for (int i = 7072; i <= 7079; i++) - materials[i] = Material.MelonStem; - materials[25903] = Material.MossBlock; - materials[25854] = Material.MossCarpet; - materials[2399] = Material.MossyCobblestone; - for (int i = 15129; i <= 15134; i++) - materials[i] = Material.MossyCobblestoneSlab; - for (int i = 14305; i <= 14384; i++) - materials[i] = Material.MossyCobblestoneStairs; - for (int i = 9027; i <= 9350; i++) - materials[i] = Material.MossyCobblestoneWall; - for (int i = 15117; i <= 15122; i++) - materials[i] = Material.MossyStoneBrickSlab; - for (int i = 14145; i <= 14224; i++) - materials[i] = Material.MossyStoneBrickStairs; - for (int i = 16155; i <= 16478; i++) - materials[i] = Material.MossyStoneBrickWall; - materials[6781] = Material.MossyStoneBricks; - for (int i = 2109; i <= 2120; i++) - materials[i] = Material.MovingPiston; - materials[25963] = Material.Mud; - for (int i = 12165; i <= 12170; i++) - materials[i] = Material.MudBrickSlab; - for (int i = 7560; i <= 7639; i++) - materials[i] = Material.MudBrickStairs; - for (int i = 17127; i <= 17450; i++) - materials[i] = Material.MudBrickWall; - materials[6785] = Material.MudBricks; - for (int i = 165; i <= 167; i++) - materials[i] = Material.MuddyMangroveRoots; - for (int i = 6920; i <= 6983; i++) - materials[i] = Material.MushroomStem; - for (int i = 7640; i <= 7641; i++) - materials[i] = Material.Mycelium; - for (int i = 8057; i <= 8088; i++) - materials[i] = Material.NetherBrickFence; - for (int i = 12171; i <= 12176; i++) - materials[i] = Material.NetherBrickSlab; - for (int i = 8089; i <= 8168; i++) - materials[i] = Material.NetherBrickStairs; - for (int i = 17451; i <= 17774; i++) - materials[i] = Material.NetherBrickWall; - materials[8056] = Material.NetherBricks; - materials[135] = Material.NetherGoldOre; - for (int i = 6043; i <= 6044; i++) - materials[i] = Material.NetherPortal; - materials[10033] = Material.NetherQuartzOre; - materials[19618] = Material.NetherSprouts; - for (int i = 8169; i <= 8172; i++) - materials[i] = Material.NetherWart; - materials[13567] = Material.NetherWartBlock; - materials[20475] = Material.NetheriteBlock; - materials[6028] = Material.Netherrack; - for (int i = 581; i <= 1730; i++) - materials[i] = Material.NoteBlock; - for (int i = 9396; i <= 9419; i++) - materials[i] = Material.OakButton; - for (int i = 4686; i <= 4749; i++) - materials[i] = Material.OakDoor; - for (int i = 5996; i <= 6027; i++) - materials[i] = Material.OakFence; - for (int i = 7368; i <= 7399; i++) - materials[i] = Material.OakFenceGate; - for (int i = 4938; i <= 5001; i++) - materials[i] = Material.OakHangingSign; - for (int i = 252; i <= 279; i++) - materials[i] = Material.OakLeaves; - for (int i = 136; i <= 138; i++) - materials[i] = Material.OakLog; - materials[15] = Material.OakPlanks; - for (int i = 5892; i <= 5893; i++) - materials[i] = Material.OakPressurePlate; - for (int i = 29; i <= 30; i++) - materials[i] = Material.OakSapling; - for (int i = 4366; i <= 4397; i++) - materials[i] = Material.OakSign; - for (int i = 12051; i <= 12056; i++) - materials[i] = Material.OakSlab; - for (int i = 2938; i <= 3017; i++) - materials[i] = Material.OakStairs; - for (int i = 6140; i <= 6203; i++) - materials[i] = Material.OakTrapdoor; - for (int i = 5706; i <= 5713; i++) - materials[i] = Material.OakWallHangingSign; - for (int i = 4858; i <= 4865; i++) - materials[i] = Material.OakWallSign; - for (int i = 201; i <= 203; i++) - materials[i] = Material.OakWood; - for (int i = 13573; i <= 13584; i++) - materials[i] = Material.Observer; - materials[2400] = Material.Obsidian; - for (int i = 27623; i <= 27625; i++) - materials[i] = Material.OchreFroglight; - materials[27909] = Material.OpenEyeblossom; - for (int i = 11664; i <= 11679; i++) - materials[i] = Material.OrangeBanner; - for (int i = 1747; i <= 1762; i++) - materials[i] = Material.OrangeBed; - for (int i = 21785; i <= 21800; i++) - materials[i] = Material.OrangeCandle; - for (int i = 22029; i <= 22030; i++) - materials[i] = Material.OrangeCandleCake; - materials[11618] = Material.OrangeCarpet; - materials[13752] = Material.OrangeConcrete; - materials[13768] = Material.OrangeConcretePowder; - for (int i = 13691; i <= 13694; i++) - materials[i] = Material.OrangeGlazedTerracotta; - for (int i = 13597; i <= 13602; i++) - materials[i] = Material.OrangeShulkerBox; - materials[6125] = Material.OrangeStainedGlass; - for (int i = 10213; i <= 10244; i++) - materials[i] = Material.OrangeStainedGlassPane; - materials[10166] = Material.OrangeTerracotta; - materials[2128] = Material.OrangeTulip; - for (int i = 11908; i <= 11911; i++) - materials[i] = Material.OrangeWallBanner; - materials[2094] = Material.OrangeWool; - materials[2131] = Material.OxeyeDaisy; - materials[23976] = Material.OxidizedChiseledCopper; - materials[23969] = Material.OxidizedCopper; - for (int i = 25732; i <= 25735; i++) - materials[i] = Material.OxidizedCopperBulb; - for (int i = 24808; i <= 24871; i++) - materials[i] = Material.OxidizedCopperDoor; - for (int i = 25710; i <= 25711; i++) - materials[i] = Material.OxidizedCopperGrate; - for (int i = 25320; i <= 25383; i++) - materials[i] = Material.OxidizedCopperTrapdoor; - materials[23972] = Material.OxidizedCutCopper; - for (int i = 24304; i <= 24309; i++) - materials[i] = Material.OxidizedCutCopperSlab; - for (int i = 23984; i <= 24063; i++) - materials[i] = Material.OxidizedCutCopperStairs; - materials[11635] = Material.PackedIce; - materials[6784] = Material.PackedMud; - for (int i = 27907; i <= 27908; i++) - materials[i] = Material.PaleHangingMoss; - materials[27744] = Material.PaleMossBlock; - for (int i = 27745; i <= 27906; i++) - materials[i] = Material.PaleMossCarpet; - for (int i = 9564; i <= 9587; i++) - materials[i] = Material.PaleOakButton; - for (int i = 13165; i <= 13228; i++) - materials[i] = Material.PaleOakDoor; - for (int i = 12685; i <= 12716; i++) - materials[i] = Material.PaleOakFence; - for (int i = 12397; i <= 12428; i++) - materials[i] = Material.PaleOakFenceGate; - for (int i = 5386; i <= 5449; i++) - materials[i] = Material.PaleOakHangingSign; - for (int i = 448; i <= 475; i++) - materials[i] = Material.PaleOakLeaves; - for (int i = 157; i <= 159; i++) - materials[i] = Material.PaleOakLog; - materials[25] = Material.PaleOakPlanks; - for (int i = 5906; i <= 5907; i++) - materials[i] = Material.PaleOakPressurePlate; - for (int i = 43; i <= 44; i++) - materials[i] = Material.PaleOakSapling; - for (int i = 4590; i <= 4621; i++) - materials[i] = Material.PaleOakSign; - for (int i = 12093; i <= 12098; i++) - materials[i] = Material.PaleOakSlab; - for (int i = 10933; i <= 11012; i++) - materials[i] = Material.PaleOakStairs; - for (int i = 6588; i <= 6651; i++) - materials[i] = Material.PaleOakTrapdoor; - for (int i = 5762; i <= 5769; i++) - materials[i] = Material.PaleOakWallHangingSign; - for (int i = 4914; i <= 4921; i++) - materials[i] = Material.PaleOakWallSign; - for (int i = 22; i <= 24; i++) - materials[i] = Material.PaleOakWood; - for (int i = 27629; i <= 27631; i++) - materials[i] = Material.PearlescentFroglight; - for (int i = 11642; i <= 11643; i++) - materials[i] = Material.Peony; - for (int i = 12141; i <= 12146; i++) - materials[i] = Material.PetrifiedOakSlab; - for (int i = 9876; i <= 9907; i++) - materials[i] = Material.PiglinHead; - for (int i = 9908; i <= 9915; i++) - materials[i] = Material.PiglinWallHead; - for (int i = 11744; i <= 11759; i++) - materials[i] = Material.PinkBanner; - for (int i = 1827; i <= 1842; i++) - materials[i] = Material.PinkBed; - for (int i = 21865; i <= 21880; i++) - materials[i] = Material.PinkCandle; - for (int i = 22039; i <= 22040; i++) - materials[i] = Material.PinkCandleCake; - materials[11623] = Material.PinkCarpet; - materials[13757] = Material.PinkConcrete; - materials[13773] = Material.PinkConcretePowder; - for (int i = 13711; i <= 13714; i++) - materials[i] = Material.PinkGlazedTerracotta; - for (int i = 25855; i <= 25870; i++) - materials[i] = Material.PinkPetals; - for (int i = 13627; i <= 13632; i++) - materials[i] = Material.PinkShulkerBox; - materials[6130] = Material.PinkStainedGlass; - for (int i = 10373; i <= 10404; i++) - materials[i] = Material.PinkStainedGlassPane; - materials[10171] = Material.PinkTerracotta; - materials[2130] = Material.PinkTulip; - for (int i = 11928; i <= 11931; i++) - materials[i] = Material.PinkWallBanner; - materials[2099] = Material.PinkWool; - for (int i = 2057; i <= 2068; i++) - materials[i] = Material.Piston; - for (int i = 2069; i <= 2092; i++) - materials[i] = Material.PistonHead; - for (int i = 13520; i <= 13529; i++) - materials[i] = Material.PitcherCrop; - for (int i = 13530; i <= 13531; i++) - materials[i] = Material.PitcherPlant; - for (int i = 9756; i <= 9787; i++) - materials[i] = Material.PlayerHead; - for (int i = 9788; i <= 9795; i++) - materials[i] = Material.PlayerWallHead; - for (int i = 12; i <= 13; i++) - materials[i] = Material.Podzol; - for (int i = 25776; i <= 25795; i++) - materials[i] = Material.PointedDripstone; - materials[7] = Material.PolishedAndesite; - for (int i = 15171; i <= 15176; i++) - materials[i] = Material.PolishedAndesiteSlab; - for (int i = 14945; i <= 15024; i++) - materials[i] = Material.PolishedAndesiteStairs; - for (int i = 6034; i <= 6036; i++) - materials[i] = Material.PolishedBasalt; - materials[20899] = Material.PolishedBlackstone; - for (int i = 20903; i <= 20908; i++) - materials[i] = Material.PolishedBlackstoneBrickSlab; - for (int i = 20909; i <= 20988; i++) - materials[i] = Material.PolishedBlackstoneBrickStairs; - for (int i = 20989; i <= 21312; i++) - materials[i] = Material.PolishedBlackstoneBrickWall; - materials[20900] = Material.PolishedBlackstoneBricks; - for (int i = 21402; i <= 21425; i++) - materials[i] = Material.PolishedBlackstoneButton; - for (int i = 21400; i <= 21401; i++) - materials[i] = Material.PolishedBlackstonePressurePlate; - for (int i = 21394; i <= 21399; i++) - materials[i] = Material.PolishedBlackstoneSlab; - for (int i = 21314; i <= 21393; i++) - materials[i] = Material.PolishedBlackstoneStairs; - for (int i = 21426; i <= 21749; i++) - materials[i] = Material.PolishedBlackstoneWall; - materials[26378] = Material.PolishedDeepslate; - for (int i = 26459; i <= 26464; i++) - materials[i] = Material.PolishedDeepslateSlab; - for (int i = 26379; i <= 26458; i++) - materials[i] = Material.PolishedDeepslateStairs; - for (int i = 26465; i <= 26788; i++) - materials[i] = Material.PolishedDeepslateWall; - materials[5] = Material.PolishedDiorite; - for (int i = 15123; i <= 15128; i++) - materials[i] = Material.PolishedDioriteSlab; - for (int i = 14225; i <= 14304; i++) - materials[i] = Material.PolishedDioriteStairs; - materials[3] = Material.PolishedGranite; - for (int i = 15105; i <= 15110; i++) - materials[i] = Material.PolishedGraniteSlab; - for (int i = 13985; i <= 14064; i++) - materials[i] = Material.PolishedGraniteStairs; - materials[22520] = Material.PolishedTuff; - for (int i = 22521; i <= 22526; i++) - materials[i] = Material.PolishedTuffSlab; - for (int i = 22527; i <= 22606; i++) - materials[i] = Material.PolishedTuffStairs; - for (int i = 22607; i <= 22930; i++) - materials[i] = Material.PolishedTuffWall; - materials[2123] = Material.Poppy; - for (int i = 9388; i <= 9395; i++) - materials[i] = Material.Potatoes; - materials[9357] = Material.PottedAcaciaSapling; - materials[9366] = Material.PottedAllium; - materials[27621] = Material.PottedAzaleaBush; - materials[9367] = Material.PottedAzureBluet; - materials[13980] = Material.PottedBamboo; - materials[9355] = Material.PottedBirchSapling; - materials[9365] = Material.PottedBlueOrchid; - materials[9377] = Material.PottedBrownMushroom; - materials[9379] = Material.PottedCactus; - materials[9358] = Material.PottedCherrySapling; - materials[27912] = Material.PottedClosedEyeblossom; - materials[9373] = Material.PottedCornflower; - materials[20483] = Material.PottedCrimsonFungus; - materials[20485] = Material.PottedCrimsonRoots; - materials[9363] = Material.PottedDandelion; - materials[9359] = Material.PottedDarkOakSapling; - materials[9378] = Material.PottedDeadBush; - materials[9362] = Material.PottedFern; - materials[27622] = Material.PottedFloweringAzaleaBush; - materials[9356] = Material.PottedJungleSapling; - materials[9374] = Material.PottedLilyOfTheValley; - materials[9361] = Material.PottedMangrovePropagule; - materials[9353] = Material.PottedOakSapling; - materials[27911] = Material.PottedOpenEyeblossom; - materials[9369] = Material.PottedOrangeTulip; - materials[9372] = Material.PottedOxeyeDaisy; - materials[9360] = Material.PottedPaleOakSapling; - materials[9371] = Material.PottedPinkTulip; - materials[9364] = Material.PottedPoppy; - materials[9376] = Material.PottedRedMushroom; - materials[9368] = Material.PottedRedTulip; - materials[9354] = Material.PottedSpruceSapling; - materials[9352] = Material.PottedTorchflower; - materials[20484] = Material.PottedWarpedFungus; - materials[20486] = Material.PottedWarpedRoots; - materials[9370] = Material.PottedWhiteTulip; - materials[9375] = Material.PottedWitherRose; - materials[23346] = Material.PowderSnow; - for (int i = 8187; i <= 8189; i++) - materials[i] = Material.PowderSnowCauldron; - for (int i = 1987; i <= 2010; i++) - materials[i] = Material.PoweredRail; - materials[11352] = Material.Prismarine; - for (int i = 11601; i <= 11606; i++) - materials[i] = Material.PrismarineBrickSlab; - for (int i = 11435; i <= 11514; i++) - materials[i] = Material.PrismarineBrickStairs; - materials[11353] = Material.PrismarineBricks; - for (int i = 11595; i <= 11600; i++) - materials[i] = Material.PrismarineSlab; - for (int i = 11355; i <= 11434; i++) - materials[i] = Material.PrismarineStairs; - for (int i = 15507; i <= 15830; i++) - materials[i] = Material.PrismarineWall; - materials[7054] = Material.Pumpkin; - for (int i = 7064; i <= 7071; i++) - materials[i] = Material.PumpkinStem; - for (int i = 11808; i <= 11823; i++) - materials[i] = Material.PurpleBanner; - for (int i = 1891; i <= 1906; i++) - materials[i] = Material.PurpleBed; - for (int i = 21929; i <= 21944; i++) - materials[i] = Material.PurpleCandle; - for (int i = 22047; i <= 22048; i++) - materials[i] = Material.PurpleCandleCake; - materials[11627] = Material.PurpleCarpet; - materials[13761] = Material.PurpleConcrete; - materials[13777] = Material.PurpleConcretePowder; - for (int i = 13727; i <= 13730; i++) - materials[i] = Material.PurpleGlazedTerracotta; - for (int i = 13651; i <= 13656; i++) - materials[i] = Material.PurpleShulkerBox; - materials[6134] = Material.PurpleStainedGlass; - for (int i = 10501; i <= 10532; i++) - materials[i] = Material.PurpleStainedGlassPane; - materials[10175] = Material.PurpleTerracotta; - for (int i = 11944; i <= 11947; i++) - materials[i] = Material.PurpleWallBanner; - materials[2103] = Material.PurpleWool; - materials[13433] = Material.PurpurBlock; - for (int i = 13434; i <= 13436; i++) - materials[i] = Material.PurpurPillar; - for (int i = 12195; i <= 12200; i++) - materials[i] = Material.PurpurSlab; - for (int i = 13437; i <= 13516; i++) - materials[i] = Material.PurpurStairs; - materials[10044] = Material.QuartzBlock; - materials[21752] = Material.QuartzBricks; - for (int i = 10046; i <= 10048; i++) - materials[i] = Material.QuartzPillar; - for (int i = 12177; i <= 12182; i++) - materials[i] = Material.QuartzSlab; - for (int i = 10049; i <= 10128; i++) - materials[i] = Material.QuartzStairs; - for (int i = 4758; i <= 4777; i++) - materials[i] = Material.Rail; - materials[27619] = Material.RawCopperBlock; - materials[27620] = Material.RawGoldBlock; - materials[27618] = Material.RawIronBlock; - for (int i = 11872; i <= 11887; i++) - materials[i] = Material.RedBanner; - for (int i = 1955; i <= 1970; i++) - materials[i] = Material.RedBed; - for (int i = 21993; i <= 22008; i++) - materials[i] = Material.RedCandle; - for (int i = 22055; i <= 22056; i++) - materials[i] = Material.RedCandleCake; - materials[11631] = Material.RedCarpet; - materials[13765] = Material.RedConcrete; - materials[13781] = Material.RedConcretePowder; - for (int i = 13743; i <= 13746; i++) - materials[i] = Material.RedGlazedTerracotta; - materials[2136] = Material.RedMushroom; - for (int i = 6856; i <= 6919; i++) - materials[i] = Material.RedMushroomBlock; - for (int i = 15165; i <= 15170; i++) - materials[i] = Material.RedNetherBrickSlab; - for (int i = 14865; i <= 14944; i++) - materials[i] = Material.RedNetherBrickStairs; - for (int i = 18099; i <= 18422; i++) - materials[i] = Material.RedNetherBrickWall; - materials[13568] = Material.RedNetherBricks; - materials[123] = Material.RedSand; - materials[11968] = Material.RedSandstone; - for (int i = 12183; i <= 12188; i++) - materials[i] = Material.RedSandstoneSlab; - for (int i = 11971; i <= 12050; i++) - materials[i] = Material.RedSandstoneStairs; - for (int i = 15831; i <= 16154; i++) - materials[i] = Material.RedSandstoneWall; - for (int i = 13675; i <= 13680; i++) - materials[i] = Material.RedShulkerBox; - materials[6138] = Material.RedStainedGlass; - for (int i = 10629; i <= 10660; i++) - materials[i] = Material.RedStainedGlassPane; - materials[10179] = Material.RedTerracotta; - materials[2127] = Material.RedTulip; - for (int i = 11960; i <= 11963; i++) - materials[i] = Material.RedWallBanner; - materials[2107] = Material.RedWool; - materials[10032] = Material.RedstoneBlock; - for (int i = 8201; i <= 8202; i++) - materials[i] = Material.RedstoneLamp; - for (int i = 5912; i <= 5913; i++) - materials[i] = Material.RedstoneOre; - for (int i = 5916; i <= 5917; i++) - materials[i] = Material.RedstoneTorch; - for (int i = 5918; i <= 5925; i++) - materials[i] = Material.RedstoneWallTorch; - for (int i = 3042; i <= 4337; i++) - materials[i] = Material.RedstoneWire; - materials[27633] = Material.ReinforcedDeepslate; - for (int i = 6060; i <= 6123; i++) - materials[i] = Material.Repeater; - for (int i = 13538; i <= 13549; i++) - materials[i] = Material.RepeatingCommandBlock; - materials[7643] = Material.ResinBlock; - for (int i = 7725; i <= 7730; i++) - materials[i] = Material.ResinBrickSlab; - for (int i = 7645; i <= 7724; i++) - materials[i] = Material.ResinBrickStairs; - for (int i = 7731; i <= 8054; i++) - materials[i] = Material.ResinBrickWall; - materials[7644] = Material.ResinBricks; - for (int i = 7240; i <= 7367; i++) - materials[i] = Material.ResinClump; - for (int i = 20478; i <= 20482; i++) - materials[i] = Material.RespawnAnchor; - materials[25962] = Material.RootedDirt; - for (int i = 11640; i <= 11641; i++) - materials[i] = Material.RoseBush; - materials[118] = Material.Sand; - materials[578] = Material.Sandstone; - for (int i = 12129; i <= 12134; i++) - materials[i] = Material.SandstoneSlab; - for (int i = 8215; i <= 8294; i++) - materials[i] = Material.SandstoneStairs; - for (int i = 18423; i <= 18746; i++) - materials[i] = Material.SandstoneWall; - for (int i = 19395; i <= 19426; i++) - materials[i] = Material.Scaffolding; - materials[23827] = Material.Sculk; - for (int i = 23956; i <= 23957; i++) - materials[i] = Material.SculkCatalyst; - for (int i = 23347; i <= 23442; i++) - materials[i] = Material.SculkSensor; - for (int i = 23958; i <= 23965; i++) - materials[i] = Material.SculkShrieker; - for (int i = 23828; i <= 23955; i++) - materials[i] = Material.SculkVein; - materials[11613] = Material.SeaLantern; - for (int i = 13956; i <= 13963; i++) - materials[i] = Material.SeaPickle; - materials[2054] = Material.Seagrass; - materials[2052] = Material.ShortDryGrass; - materials[2048] = Material.ShortGrass; - materials[19633] = Material.Shroomlight; - for (int i = 13585; i <= 13590; i++) - materials[i] = Material.ShulkerBox; - for (int i = 9636; i <= 9667; i++) - materials[i] = Material.SkeletonSkull; - for (int i = 9668; i <= 9675; i++) - materials[i] = Material.SkeletonWallSkull; - materials[11253] = Material.SlimeBlock; - for (int i = 22097; i <= 22108; i++) - materials[i] = Material.SmallAmethystBud; - for (int i = 25944; i <= 25959; i++) - materials[i] = Material.SmallDripleaf; - materials[19489] = Material.SmithingTable; - for (int i = 19443; i <= 19450; i++) - materials[i] = Material.Smoker; - materials[27617] = Material.SmoothBasalt; - materials[12203] = Material.SmoothQuartz; - for (int i = 15147; i <= 15152; i++) - materials[i] = Material.SmoothQuartzSlab; - for (int i = 14625; i <= 14704; i++) - materials[i] = Material.SmoothQuartzStairs; - materials[12204] = Material.SmoothRedSandstone; - for (int i = 15111; i <= 15116; i++) - materials[i] = Material.SmoothRedSandstoneSlab; - for (int i = 14065; i <= 14144; i++) - materials[i] = Material.SmoothRedSandstoneStairs; - materials[12202] = Material.SmoothSandstone; - for (int i = 15141; i <= 15146; i++) - materials[i] = Material.SmoothSandstoneSlab; - for (int i = 14545; i <= 14624; i++) - materials[i] = Material.SmoothSandstoneStairs; - materials[12201] = Material.SmoothStone; - for (int i = 12123; i <= 12128; i++) - materials[i] = Material.SmoothStoneSlab; - for (int i = 13823; i <= 13825; i++) - materials[i] = Material.SnifferEgg; - for (int i = 5950; i <= 5957; i++) - materials[i] = Material.Snow; - materials[5959] = Material.SnowBlock; - for (int i = 19566; i <= 19597; i++) - materials[i] = Material.SoulCampfire; - materials[2918] = Material.SoulFire; - for (int i = 19530; i <= 19533; i++) - materials[i] = Material.SoulLantern; - materials[6029] = Material.SoulSand; - materials[6030] = Material.SoulSoil; - materials[6037] = Material.SoulTorch; - for (int i = 6038; i <= 6041; i++) - materials[i] = Material.SoulWallTorch; - materials[2919] = Material.Spawner; - materials[560] = Material.Sponge; - materials[25851] = Material.SporeBlossom; - for (int i = 9420; i <= 9443; i++) - materials[i] = Material.SpruceButton; - for (int i = 12781; i <= 12844; i++) - materials[i] = Material.SpruceDoor; - for (int i = 12493; i <= 12524; i++) - materials[i] = Material.SpruceFence; - for (int i = 12205; i <= 12236; i++) - materials[i] = Material.SpruceFenceGate; - for (int i = 5002; i <= 5065; i++) - materials[i] = Material.SpruceHangingSign; - for (int i = 280; i <= 307; i++) - materials[i] = Material.SpruceLeaves; - for (int i = 139; i <= 141; i++) - materials[i] = Material.SpruceLog; - materials[16] = Material.SprucePlanks; - for (int i = 5894; i <= 5895; i++) - materials[i] = Material.SprucePressurePlate; - for (int i = 31; i <= 32; i++) - materials[i] = Material.SpruceSapling; - for (int i = 4398; i <= 4429; i++) - materials[i] = Material.SpruceSign; - for (int i = 12057; i <= 12062; i++) - materials[i] = Material.SpruceSlab; - for (int i = 8450; i <= 8529; i++) - materials[i] = Material.SpruceStairs; - for (int i = 6204; i <= 6267; i++) - materials[i] = Material.SpruceTrapdoor; - for (int i = 5714; i <= 5721; i++) - materials[i] = Material.SpruceWallHangingSign; - for (int i = 4866; i <= 4873; i++) - materials[i] = Material.SpruceWallSign; - for (int i = 204; i <= 206; i++) - materials[i] = Material.SpruceWood; - for (int i = 2035; i <= 2046; i++) - materials[i] = Material.StickyPiston; - materials[1] = Material.Stone; - for (int i = 12159; i <= 12164; i++) - materials[i] = Material.StoneBrickSlab; - for (int i = 7480; i <= 7559; i++) - materials[i] = Material.StoneBrickStairs; - for (int i = 16803; i <= 17126; i++) - materials[i] = Material.StoneBrickWall; - materials[6780] = Material.StoneBricks; - for (int i = 5926; i <= 5949; i++) - materials[i] = Material.StoneButton; - for (int i = 5826; i <= 5827; i++) - materials[i] = Material.StonePressurePlate; - for (int i = 12117; i <= 12122; i++) - materials[i] = Material.StoneSlab; - for (int i = 14465; i <= 14544; i++) - materials[i] = Material.StoneStairs; - for (int i = 19490; i <= 19493; i++) - materials[i] = Material.Stonecutter; - for (int i = 180; i <= 182; i++) - materials[i] = Material.StrippedAcaciaLog; - for (int i = 237; i <= 239; i++) - materials[i] = Material.StrippedAcaciaWood; - for (int i = 198; i <= 200; i++) - materials[i] = Material.StrippedBambooBlock; - for (int i = 174; i <= 176; i++) - materials[i] = Material.StrippedBirchLog; - for (int i = 231; i <= 233; i++) - materials[i] = Material.StrippedBirchWood; - for (int i = 183; i <= 185; i++) - materials[i] = Material.StrippedCherryLog; - for (int i = 240; i <= 242; i++) - materials[i] = Material.StrippedCherryWood; - for (int i = 19628; i <= 19630; i++) - materials[i] = Material.StrippedCrimsonHyphae; - for (int i = 19622; i <= 19624; i++) - materials[i] = Material.StrippedCrimsonStem; - for (int i = 186; i <= 188; i++) - materials[i] = Material.StrippedDarkOakLog; - for (int i = 243; i <= 245; i++) - materials[i] = Material.StrippedDarkOakWood; - for (int i = 177; i <= 179; i++) - materials[i] = Material.StrippedJungleLog; - for (int i = 234; i <= 236; i++) - materials[i] = Material.StrippedJungleWood; - for (int i = 195; i <= 197; i++) - materials[i] = Material.StrippedMangroveLog; - for (int i = 249; i <= 251; i++) - materials[i] = Material.StrippedMangroveWood; - for (int i = 192; i <= 194; i++) - materials[i] = Material.StrippedOakLog; - for (int i = 225; i <= 227; i++) - materials[i] = Material.StrippedOakWood; - for (int i = 189; i <= 191; i++) - materials[i] = Material.StrippedPaleOakLog; - for (int i = 246; i <= 248; i++) - materials[i] = Material.StrippedPaleOakWood; - for (int i = 171; i <= 173; i++) - materials[i] = Material.StrippedSpruceLog; - for (int i = 228; i <= 230; i++) - materials[i] = Material.StrippedSpruceWood; - for (int i = 19611; i <= 19613; i++) - materials[i] = Material.StrippedWarpedHyphae; - for (int i = 19605; i <= 19607; i++) - materials[i] = Material.StrippedWarpedStem; - for (int i = 20379; i <= 20382; i++) - materials[i] = Material.StructureBlock; - materials[13572] = Material.StructureVoid; - for (int i = 5978; i <= 5993; i++) - materials[i] = Material.SugarCane; - for (int i = 11636; i <= 11637; i++) - materials[i] = Material.Sunflower; - for (int i = 125; i <= 128; i++) - materials[i] = Material.SuspiciousGravel; - for (int i = 119; i <= 122; i++) - materials[i] = Material.SuspiciousSand; - for (int i = 19598; i <= 19601; i++) - materials[i] = Material.SweetBerryBush; - materials[2053] = Material.TallDryGrass; - for (int i = 11644; i <= 11645; i++) - materials[i] = Material.TallGrass; - for (int i = 2055; i <= 2056; i++) - materials[i] = Material.TallSeagrass; - for (int i = 20409; i <= 20424; i++) - materials[i] = Material.Target; - materials[11633] = Material.Terracotta; - for (int i = 20395; i <= 20398; i++) - materials[i] = Material.TestBlock; - materials[20399] = Material.TestInstanceBlock; - materials[23345] = Material.TintedGlass; - for (int i = 2140; i <= 2141; i++) - materials[i] = Material.Tnt; - materials[2401] = Material.Torch; - materials[2122] = Material.Torchflower; - for (int i = 13518; i <= 13519; i++) - materials[i] = Material.TorchflowerCrop; - for (int i = 9928; i <= 9951; i++) - materials[i] = Material.TrappedChest; - for (int i = 27698; i <= 27709; i++) - materials[i] = Material.TrialSpawner; - for (int i = 8321; i <= 8448; i++) - materials[i] = Material.Tripwire; - for (int i = 8305; i <= 8320; i++) - materials[i] = Material.TripwireHook; - for (int i = 13846; i <= 13847; i++) - materials[i] = Material.TubeCoral; - materials[13831] = Material.TubeCoralBlock; - for (int i = 13866; i <= 13867; i++) - materials[i] = Material.TubeCoralFan; - for (int i = 13916; i <= 13923; i++) - materials[i] = Material.TubeCoralWallFan; - materials[22109] = Material.Tuff; - for (int i = 22933; i <= 22938; i++) - materials[i] = Material.TuffBrickSlab; - for (int i = 22939; i <= 23018; i++) - materials[i] = Material.TuffBrickStairs; - for (int i = 23019; i <= 23342; i++) - materials[i] = Material.TuffBrickWall; - materials[22932] = Material.TuffBricks; - for (int i = 22110; i <= 22115; i++) - materials[i] = Material.TuffSlab; - for (int i = 22116; i <= 22195; i++) - materials[i] = Material.TuffStairs; - for (int i = 22196; i <= 22519; i++) - materials[i] = Material.TuffWall; - for (int i = 13811; i <= 13822; i++) - materials[i] = Material.TurtleEgg; - for (int i = 19661; i <= 19686; i++) - materials[i] = Material.TwistingVines; - materials[19687] = Material.TwistingVinesPlant; - for (int i = 27710; i <= 27741; i++) - materials[i] = Material.Vault; - for (int i = 27626; i <= 27628; i++) - materials[i] = Material.VerdantFroglight; - for (int i = 7080; i <= 7111; i++) - materials[i] = Material.Vine; - materials[13981] = Material.VoidAir; - for (int i = 2402; i <= 2405; i++) - materials[i] = Material.WallTorch; - for (int i = 20147; i <= 20170; i++) - materials[i] = Material.WarpedButton; - for (int i = 20235; i <= 20298; i++) - materials[i] = Material.WarpedDoor; - for (int i = 19739; i <= 19770; i++) - materials[i] = Material.WarpedFence; - for (int i = 19931; i <= 19962; i++) - materials[i] = Material.WarpedFenceGate; - materials[19615] = Material.WarpedFungus; - for (int i = 5514; i <= 5577; i++) - materials[i] = Material.WarpedHangingSign; - for (int i = 19608; i <= 19610; i++) - materials[i] = Material.WarpedHyphae; - materials[19614] = Material.WarpedNylium; - materials[19690] = Material.WarpedPlanks; - for (int i = 19705; i <= 19706; i++) - materials[i] = Material.WarpedPressurePlate; - materials[19617] = Material.WarpedRoots; - for (int i = 20331; i <= 20362; i++) - materials[i] = Material.WarpedSign; - for (int i = 19697; i <= 19702; i++) - materials[i] = Material.WarpedSlab; - for (int i = 20043; i <= 20122; i++) - materials[i] = Material.WarpedStairs; - for (int i = 19602; i <= 19604; i++) - materials[i] = Material.WarpedStem; - for (int i = 19835; i <= 19898; i++) - materials[i] = Material.WarpedTrapdoor; - for (int i = 5786; i <= 5793; i++) - materials[i] = Material.WarpedWallHangingSign; - for (int i = 20371; i <= 20378; i++) - materials[i] = Material.WarpedWallSign; - materials[19616] = Material.WarpedWartBlock; - for (int i = 86; i <= 101; i++) - materials[i] = Material.Water; - for (int i = 8183; i <= 8185; i++) - materials[i] = Material.WaterCauldron; - materials[23983] = Material.WaxedChiseledCopper; - materials[24328] = Material.WaxedCopperBlock; - for (int i = 25736; i <= 25739; i++) - materials[i] = Material.WaxedCopperBulb; - for (int i = 24936; i <= 24999; i++) - materials[i] = Material.WaxedCopperDoor; - for (int i = 25712; i <= 25713; i++) - materials[i] = Material.WaxedCopperGrate; - for (int i = 25448; i <= 25511; i++) - materials[i] = Material.WaxedCopperTrapdoor; - materials[24335] = Material.WaxedCutCopper; - for (int i = 24674; i <= 24679; i++) - materials[i] = Material.WaxedCutCopperSlab; - for (int i = 24576; i <= 24655; i++) - materials[i] = Material.WaxedCutCopperStairs; - materials[23982] = Material.WaxedExposedChiseledCopper; - materials[24330] = Material.WaxedExposedCopper; - for (int i = 25740; i <= 25743; i++) - materials[i] = Material.WaxedExposedCopperBulb; - for (int i = 25000; i <= 25063; i++) - materials[i] = Material.WaxedExposedCopperDoor; - for (int i = 25714; i <= 25715; i++) - materials[i] = Material.WaxedExposedCopperGrate; - for (int i = 25512; i <= 25575; i++) - materials[i] = Material.WaxedExposedCopperTrapdoor; - materials[24334] = Material.WaxedExposedCutCopper; - for (int i = 24668; i <= 24673; i++) - materials[i] = Material.WaxedExposedCutCopperSlab; - for (int i = 24496; i <= 24575; i++) - materials[i] = Material.WaxedExposedCutCopperStairs; - materials[23980] = Material.WaxedOxidizedChiseledCopper; - materials[24331] = Material.WaxedOxidizedCopper; - for (int i = 25748; i <= 25751; i++) - materials[i] = Material.WaxedOxidizedCopperBulb; - for (int i = 25064; i <= 25127; i++) - materials[i] = Material.WaxedOxidizedCopperDoor; - for (int i = 25718; i <= 25719; i++) - materials[i] = Material.WaxedOxidizedCopperGrate; - for (int i = 25576; i <= 25639; i++) - materials[i] = Material.WaxedOxidizedCopperTrapdoor; - materials[24332] = Material.WaxedOxidizedCutCopper; - for (int i = 24656; i <= 24661; i++) - materials[i] = Material.WaxedOxidizedCutCopperSlab; - for (int i = 24336; i <= 24415; i++) - materials[i] = Material.WaxedOxidizedCutCopperStairs; - materials[23981] = Material.WaxedWeatheredChiseledCopper; - materials[24329] = Material.WaxedWeatheredCopper; - for (int i = 25744; i <= 25747; i++) - materials[i] = Material.WaxedWeatheredCopperBulb; - for (int i = 25128; i <= 25191; i++) - materials[i] = Material.WaxedWeatheredCopperDoor; - for (int i = 25716; i <= 25717; i++) - materials[i] = Material.WaxedWeatheredCopperGrate; - for (int i = 25640; i <= 25703; i++) - materials[i] = Material.WaxedWeatheredCopperTrapdoor; - materials[24333] = Material.WaxedWeatheredCutCopper; - for (int i = 24662; i <= 24667; i++) - materials[i] = Material.WaxedWeatheredCutCopperSlab; - for (int i = 24416; i <= 24495; i++) - materials[i] = Material.WaxedWeatheredCutCopperStairs; - materials[23977] = Material.WeatheredChiseledCopper; - materials[23968] = Material.WeatheredCopper; - for (int i = 25728; i <= 25731; i++) - materials[i] = Material.WeatheredCopperBulb; - for (int i = 24872; i <= 24935; i++) - materials[i] = Material.WeatheredCopperDoor; - for (int i = 25708; i <= 25709; i++) - materials[i] = Material.WeatheredCopperGrate; - for (int i = 25384; i <= 25447; i++) - materials[i] = Material.WeatheredCopperTrapdoor; - materials[23973] = Material.WeatheredCutCopper; - for (int i = 24310; i <= 24315; i++) - materials[i] = Material.WeatheredCutCopperSlab; - for (int i = 24064; i <= 24143; i++) - materials[i] = Material.WeatheredCutCopperStairs; - for (int i = 19634; i <= 19659; i++) - materials[i] = Material.WeepingVines; - materials[19660] = Material.WeepingVinesPlant; - materials[561] = Material.WetSponge; - for (int i = 4342; i <= 4349; i++) - materials[i] = Material.Wheat; - for (int i = 11648; i <= 11663; i++) - materials[i] = Material.WhiteBanner; - for (int i = 1731; i <= 1746; i++) - materials[i] = Material.WhiteBed; - for (int i = 21769; i <= 21784; i++) - materials[i] = Material.WhiteCandle; - for (int i = 22027; i <= 22028; i++) - materials[i] = Material.WhiteCandleCake; - materials[11617] = Material.WhiteCarpet; - materials[13751] = Material.WhiteConcrete; - materials[13767] = Material.WhiteConcretePowder; - for (int i = 13687; i <= 13690; i++) - materials[i] = Material.WhiteGlazedTerracotta; - for (int i = 13591; i <= 13596; i++) - materials[i] = Material.WhiteShulkerBox; - materials[6124] = Material.WhiteStainedGlass; - for (int i = 10181; i <= 10212; i++) - materials[i] = Material.WhiteStainedGlassPane; - materials[10165] = Material.WhiteTerracotta; - materials[2129] = Material.WhiteTulip; - for (int i = 11904; i <= 11907; i++) - materials[i] = Material.WhiteWallBanner; - materials[2093] = Material.WhiteWool; - for (int i = 25871; i <= 25886; i++) - materials[i] = Material.Wildflowers; - materials[2133] = Material.WitherRose; - for (int i = 9676; i <= 9707; i++) - materials[i] = Material.WitherSkeletonSkull; - for (int i = 9708; i <= 9715; i++) - materials[i] = Material.WitherSkeletonWallSkull; - for (int i = 11712; i <= 11727; i++) - materials[i] = Material.YellowBanner; - for (int i = 1795; i <= 1810; i++) - materials[i] = Material.YellowBed; - for (int i = 21833; i <= 21848; i++) - materials[i] = Material.YellowCandle; - for (int i = 22035; i <= 22036; i++) - materials[i] = Material.YellowCandleCake; - materials[11621] = Material.YellowCarpet; - materials[13755] = Material.YellowConcrete; - materials[13771] = Material.YellowConcretePowder; - for (int i = 13703; i <= 13706; i++) - materials[i] = Material.YellowGlazedTerracotta; - for (int i = 13615; i <= 13620; i++) - materials[i] = Material.YellowShulkerBox; - materials[6128] = Material.YellowStainedGlass; - for (int i = 10309; i <= 10340; i++) - materials[i] = Material.YellowStainedGlassPane; - materials[10169] = Material.YellowTerracotta; - for (int i = 11920; i <= 11923; i++) - materials[i] = Material.YellowWallBanner; - materials[2097] = Material.YellowWool; - for (int i = 9716; i <= 9747; i++) - materials[i] = Material.ZombieHead; - for (int i = 9748; i <= 9755; i++) - materials[i] = Material.ZombieWallHead; - } - - // - private static readonly BlockStateDefinition[] stateDefinitions = - [ - new(8, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(12, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(22, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(29, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(31, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(33, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(35, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(37, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(39, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(41, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(43, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(45, 40, - [ - new("age", ["0", "1", "2", "3", "4"], 8), - new("hanging", ["true", "false"], 4), - new("stage", ["0", "1"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(86, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(102, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(119, 4, - [ - new("dusted", ["0", "1", "2", "3"], 1) - ]), - new(125, 4, - [ - new("dusted", ["0", "1", "2", "3"], 1) - ]), - new(136, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(139, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(142, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(145, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(148, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(151, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(154, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(157, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(160, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(163, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(165, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(168, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(171, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(174, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(177, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(180, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(183, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(186, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(189, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(192, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(195, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(198, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(201, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(204, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(207, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(210, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(213, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(216, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(219, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(222, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(225, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(228, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(231, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(234, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(237, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(240, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(243, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(246, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(249, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(252, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(280, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(308, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(336, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(364, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(392, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(420, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(448, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(476, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(504, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(532, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(566, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(581, 1150, - [ - new("instrument", ["harp", "basedrum", "snare", "hat", "bass", "flute", "bell", "guitar", "chime", "xylophone", "iron_xylophone", "cow_bell", "didgeridoo", "bit", "banjo", "pling", "zombie", "skeleton", "creeper", "dragon", "wither_skeleton", "piglin", "custom_head"], 50), - new("note", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"], 2), - new("powered", ["true", "false"], 1) - ]), - new(1731, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1747, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1763, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1779, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1795, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1811, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1827, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1843, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1859, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1875, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1891, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1907, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1923, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1939, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1955, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1971, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1987, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2011, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2035, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(2055, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(2057, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(2069, 24, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("short", ["true", "false"], 2) - ]), - new(2109, 12, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 2) - ]), - new(2140, 2, - [ - new("unstable", ["true", "false"], 1) - ]), - new(2143, 256, - [ - new("facing", ["north", "south", "west", "east"], 64), - new("slot_0_occupied", ["true", "false"], 32), - new("slot_1_occupied", ["true", "false"], 16), - new("slot_2_occupied", ["true", "false"], 8), - new("slot_3_occupied", ["true", "false"], 4), - new("slot_4_occupied", ["true", "false"], 2), - new("slot_5_occupied", ["true", "false"], 1) - ]), - new(2402, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(2406, 512, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(2920, 18, - [ - new("axis", ["x", "y", "z"], 6), - new("creaking_heart_state", ["uprooted", "dormant", "awake"], 2), - new("natural", ["true", "false"], 1) - ]), - new(2938, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3018, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(3042, 1296, - [ - new("east", ["up", "side", "none"], 432), - new("north", ["up", "side", "none"], 144), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 9), - new("south", ["up", "side", "none"], 3), - new("west", ["up", "side", "none"], 1) - ]), - new(4342, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4350, 8, - [ - new("moisture", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4358, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(4366, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4398, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4430, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4462, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4494, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4526, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4558, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4590, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4622, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4654, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4686, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(4750, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4758, 20, - [ - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south", "south_east", "south_west", "north_west", "north_east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4778, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4858, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4866, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4874, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4882, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4890, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4898, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4906, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4914, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4922, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4930, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4938, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5002, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5066, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5130, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5194, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5258, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5322, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5386, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5450, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5514, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5578, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5642, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5706, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5714, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5722, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5730, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5738, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5746, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5754, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5762, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5770, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5778, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5786, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5794, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5802, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5826, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5828, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5892, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5894, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5896, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5898, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5900, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5902, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5904, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5906, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5908, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5910, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5912, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5914, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5916, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5918, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(5926, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5950, 8, - [ - new("layers", ["1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(5960, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5978, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5994, 2, - [ - new("has_record", ["true", "false"], 1) - ]), - new(5996, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6031, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(6034, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(6038, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6043, 2, - [ - new("axis", ["x", "z"], 1) - ]), - new(6045, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6049, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6053, 7, - [ - new("bites", ["0", "1", "2", "3", "4", "5", "6"], 1) - ]), - new(6060, 64, - [ - new("delay", ["1", "2", "3", "4"], 16), - new("facing", ["north", "south", "west", "east"], 4), - new("locked", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6140, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6204, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6268, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6332, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6396, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6460, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6524, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6588, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6652, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6716, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6792, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6856, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6920, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6984, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7016, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7022, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7056, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7060, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7064, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(7072, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(7080, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7112, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7240, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7368, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7400, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7480, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7560, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7640, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(7645, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7725, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7731, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(8057, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8089, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8169, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(8174, 8, - [ - new("has_bottle_0", ["true", "false"], 4), - new("has_bottle_1", ["true", "false"], 2), - new("has_bottle_2", ["true", "false"], 1) - ]), - new(8183, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(8187, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(8191, 8, - [ - new("eye", ["true", "false"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8201, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(8203, 12, - [ - new("age", ["0", "1", "2"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8215, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8297, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8305, 16, - [ - new("attached", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8321, 128, - [ - new("attached", ["true", "false"], 64), - new("disarmed", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("powered", ["true", "false"], 4), - new("south", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8450, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8530, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8610, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8690, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8703, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(9027, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(9380, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(9388, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(9396, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9420, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9444, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9468, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9492, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9516, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9540, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9564, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9588, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9612, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9636, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9668, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9676, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9708, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9716, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9748, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9756, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9788, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9796, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9828, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9836, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9868, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9876, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9908, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9916, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9920, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9924, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9928, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(9952, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9968, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9984, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("mode", ["compare", "subtract"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10000, 32, - [ - new("inverted", ["true", "false"], 16), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10034, 10, - [ - new("enabled", ["true", "false"], 5), - new("facing", ["down", "north", "south", "west", "east"], 1) - ]), - new(10046, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(10049, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10129, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10153, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(10181, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10213, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10245, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10277, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10309, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10341, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10373, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10405, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10437, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10469, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10501, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10533, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10565, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10597, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10629, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10661, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10693, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10773, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10853, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10933, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11013, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11093, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11173, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11254, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(11256, 32, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11288, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11355, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11435, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11515, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11595, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11601, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11607, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11614, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(11636, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11638, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11640, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11642, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11644, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11646, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11648, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11664, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11680, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11696, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11712, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11728, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11744, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11760, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11776, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11792, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11808, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11824, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11840, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11856, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11872, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11888, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11904, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11908, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11912, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11916, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11920, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11924, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11928, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11932, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11936, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11940, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11944, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11948, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11952, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11956, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11960, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11964, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11971, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12051, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12057, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12063, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12069, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12075, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12081, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12087, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12093, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12099, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12105, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12111, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12117, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12123, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12129, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12135, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12141, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12147, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12153, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12159, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12165, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12171, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12177, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12183, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12189, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12195, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12205, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12237, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12269, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12301, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12333, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12365, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12397, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12429, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12461, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12493, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12525, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12557, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12589, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12621, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12653, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12685, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12717, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12749, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12781, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12845, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12909, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12973, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13037, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13101, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13165, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13229, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13293, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13357, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13363, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13427, 6, - [ - new("age", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(13434, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(13437, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13518, 2, - [ - new("age", ["0", "1"], 1) - ]), - new(13520, 10, - [ - new("age", ["0", "1", "2", "3", "4"], 2), - new("half", ["upper", "lower"], 1) - ]), - new(13530, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(13532, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(13538, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13550, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13562, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(13569, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(13573, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13585, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13591, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13597, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13603, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13609, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13615, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13621, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13627, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13633, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13639, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13645, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13651, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13657, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13663, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13669, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13675, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13681, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13687, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13691, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13695, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13699, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13703, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13707, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13711, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13715, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13719, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13723, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13727, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13731, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13735, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13739, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13743, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13747, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13783, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(13811, 12, - [ - new("eggs", ["1", "2", "3", "4"], 3), - new("hatch", ["0", "1", "2"], 1) - ]), - new(13823, 3, - [ - new("hatch", ["0", "1", "2"], 1) - ]), - new(13836, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13838, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13840, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13842, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13844, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13846, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13848, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13850, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13852, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13854, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13856, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13858, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13860, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13862, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13864, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13866, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13868, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13870, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13872, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13874, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13876, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13884, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13892, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13900, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13908, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13916, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13924, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13932, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13940, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13948, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13956, 8, - [ - new("pickles", ["1", "2", "3", "4"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13965, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13968, 12, - [ - new("age", ["0", "1"], 6), - new("leaves", ["none", "small", "large"], 2), - new("stage", ["0", "1"], 1) - ]), - new(13983, 2, - [ - new("drag", ["true", "false"], 1) - ]), - new(13985, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14065, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14145, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14225, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14305, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14385, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14465, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14545, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14625, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14705, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14785, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14865, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14945, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15025, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15105, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15111, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15117, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15123, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15129, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15135, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15141, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15147, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15153, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15159, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15165, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15171, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15177, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15183, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15507, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15831, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16155, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16479, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16803, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17127, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17451, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17775, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18099, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18423, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18747, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19071, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19395, 32, - [ - new("bottom", ["true", "false"], 16), - new("distance", ["0", "1", "2", "3", "4", "5", "6", "7"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19427, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(19431, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("open", ["true", "false"], 1) - ]), - new(19443, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(19451, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(19461, 12, - [ - new("face", ["floor", "wall", "ceiling"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(19473, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("has_book", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19490, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(19494, 32, - [ - new("attachment", ["floor", "ceiling", "single_wall", "double_wall"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19526, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19530, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19534, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19566, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19598, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(19602, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19605, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19608, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19611, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19619, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19622, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19625, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19628, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19634, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(19661, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(19691, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19697, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19703, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(19705, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(19707, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(19739, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(19771, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19835, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19899, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19931, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19963, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20043, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20123, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20147, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20171, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20235, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20299, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20331, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20363, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20371, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20379, 4, - [ - new("mode", ["save", "load", "corner", "data"], 1) - ]), - new(20383, 12, - [ - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 1) - ]), - new(20395, 4, - [ - new("mode", ["start", "log", "fail", "accept"], 1) - ]), - new(20400, 9, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(20409, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(20425, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(20449, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(20478, 5, - [ - new("charges", ["0", "1", "2", "3", "4"], 1) - ]), - new(20489, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20569, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20893, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20903, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20909, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20989, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(21314, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21394, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21400, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(21402, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(21426, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(21753, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21769, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21785, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21801, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21817, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21833, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21849, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21865, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21881, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21897, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21913, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21929, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21945, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21961, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21977, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21993, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22009, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22025, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22027, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22029, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22031, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22033, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22035, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22037, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22039, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22041, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22043, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22045, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22047, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22049, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22051, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22053, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22055, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22057, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22061, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22073, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22085, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22097, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22110, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22116, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22196, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(22521, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22527, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22607, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(22933, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22939, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23019, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(23347, 96, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23443, 384, - [ - new("facing", ["north", "south", "west", "east"], 96), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23828, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(23956, 2, - [ - new("bloom", ["true", "false"], 1) - ]), - new(23958, 8, - [ - new("can_summon", ["true", "false"], 4), - new("shrieking", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23984, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24064, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24144, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24224, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24304, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24310, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24316, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24322, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24336, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24416, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24496, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24576, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24656, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24662, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24668, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24674, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24680, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24744, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24808, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24872, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24936, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25000, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25064, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25128, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25192, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25256, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25320, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25384, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25448, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25512, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25576, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25640, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25704, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25706, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25708, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25710, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25712, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25714, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25716, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25718, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25720, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25724, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25728, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25732, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25736, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25740, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25744, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25748, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25752, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25776, 20, - [ - new("thickness", ["tip_merge", "tip", "frustum", "middle", "base"], 4), - new("vertical_direction", ["up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25797, 52, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 2), - new("berries", ["true", "false"], 1) - ]), - new(25849, 2, - [ - new("berries", ["true", "false"], 1) - ]), - new(25855, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("flower_amount", ["1", "2", "3", "4"], 1) - ]), - new(25871, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("flower_amount", ["1", "2", "3", "4"], 1) - ]), - new(25887, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("segment_amount", ["1", "2", "3", "4"], 1) - ]), - new(25904, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("tilt", ["none", "unstable", "partial", "full"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25936, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25944, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("half", ["upper", "lower"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25960, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25964, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(25968, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26048, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26054, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(26379, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26459, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26465, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(26790, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26870, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26876, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(27201, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27281, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27287, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(27614, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(27623, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(27626, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(27629, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(27634, 16, - [ - new("cracked", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27650, 48, - [ - new("crafting", ["true", "false"], 24), - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(27698, 12, - [ - new("ominous", ["true", "false"], 6), - new("trial_spawner_state", ["inactive", "waiting_for_players", "active", "waiting_for_reward_ejection", "ejecting_reward", "cooldown"], 1) - ]), - new(27710, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("ominous", ["true", "false"], 4), - new("vault_state", ["inactive", "active", "unlocking", "ejecting"], 1) - ]), - new(27742, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(27745, 162, - [ - new("bottom", ["true", "false"], 81), - new("east", ["none", "low", "tall"], 27), - new("north", ["none", "low", "tall"], 9), - new("south", ["none", "low", "tall"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(27907, 2, - [ - new("tip", ["true", "false"], 1) - ]), - ]; - // - - protected override Dictionary GetDict() - { - return materials; - } - - protected override BlockStateDefinition[] GetStateDefinitions() - { - return stateDefinitions; - } - } -} diff --git a/MinecraftClient/Mapping/BlockPalettes/Palette1216.cs b/MinecraftClient/Mapping/BlockPalettes/Palette1216.cs deleted file mode 100644 index 9b3005772e..0000000000 --- a/MinecraftClient/Mapping/BlockPalettes/Palette1216.cs +++ /dev/null @@ -1,5796 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.BlockPalettes -{ - public class Palette1216 : BlockPalette - { - private static readonly Dictionary materials = new(); - - static Palette1216() - { - for (int i = 9492; i <= 9515; i++) - materials[i] = Material.AcaciaButton; - for (int i = 12973; i <= 13036; i++) - materials[i] = Material.AcaciaDoor; - for (int i = 12589; i <= 12620; i++) - materials[i] = Material.AcaciaFence; - for (int i = 12301; i <= 12332; i++) - materials[i] = Material.AcaciaFenceGate; - for (int i = 5130; i <= 5193; i++) - materials[i] = Material.AcaciaHangingSign; - for (int i = 364; i <= 391; i++) - materials[i] = Material.AcaciaLeaves; - for (int i = 148; i <= 150; i++) - materials[i] = Material.AcaciaLog; - materials[19] = Material.AcaciaPlanks; - for (int i = 5900; i <= 5901; i++) - materials[i] = Material.AcaciaPressurePlate; - for (int i = 37; i <= 38; i++) - materials[i] = Material.AcaciaSapling; - for (int i = 4462; i <= 4493; i++) - materials[i] = Material.AcaciaSign; - for (int i = 12075; i <= 12080; i++) - materials[i] = Material.AcaciaSlab; - for (int i = 10693; i <= 10772; i++) - materials[i] = Material.AcaciaStairs; - for (int i = 6396; i <= 6459; i++) - materials[i] = Material.AcaciaTrapdoor; - for (int i = 5730; i <= 5737; i++) - materials[i] = Material.AcaciaWallHangingSign; - for (int i = 4882; i <= 4889; i++) - materials[i] = Material.AcaciaWallSign; - for (int i = 213; i <= 215; i++) - materials[i] = Material.AcaciaWood; - for (int i = 10129; i <= 10152; i++) - materials[i] = Material.ActivatorRail; - materials[0] = Material.Air; - materials[2125] = Material.Allium; - materials[22091] = Material.AmethystBlock; - for (int i = 22093; i <= 22104; i++) - materials[i] = Material.AmethystCluster; - materials[20508] = Material.AncientDebris; - materials[6] = Material.Andesite; - for (int i = 15191; i <= 15196; i++) - materials[i] = Material.AndesiteSlab; - for (int i = 14817; i <= 14896; i++) - materials[i] = Material.AndesiteStairs; - for (int i = 17807; i <= 18130; i++) - materials[i] = Material.AndesiteWall; - for (int i = 9916; i <= 9919; i++) - materials[i] = Material.Anvil; - for (int i = 7060; i <= 7063; i++) - materials[i] = Material.AttachedMelonStem; - for (int i = 7056; i <= 7059; i++) - materials[i] = Material.AttachedPumpkinStem; - materials[25884] = Material.Azalea; - for (int i = 504; i <= 531; i++) - materials[i] = Material.AzaleaLeaves; - materials[2126] = Material.AzureBluet; - for (int i = 14000; i <= 14011; i++) - materials[i] = Material.Bamboo; - for (int i = 168; i <= 170; i++) - materials[i] = Material.BambooBlock; - for (int i = 9612; i <= 9635; i++) - materials[i] = Material.BambooButton; - for (int i = 13293; i <= 13356; i++) - materials[i] = Material.BambooDoor; - for (int i = 12749; i <= 12780; i++) - materials[i] = Material.BambooFence; - for (int i = 12461; i <= 12492; i++) - materials[i] = Material.BambooFenceGate; - for (int i = 5642; i <= 5705; i++) - materials[i] = Material.BambooHangingSign; - materials[28] = Material.BambooMosaic; - for (int i = 12111; i <= 12116; i++) - materials[i] = Material.BambooMosaicSlab; - for (int i = 11173; i <= 11252; i++) - materials[i] = Material.BambooMosaicStairs; - materials[27] = Material.BambooPlanks; - for (int i = 5910; i <= 5911; i++) - materials[i] = Material.BambooPressurePlate; - materials[13999] = Material.BambooSapling; - for (int i = 4654; i <= 4685; i++) - materials[i] = Material.BambooSign; - for (int i = 12105; i <= 12110; i++) - materials[i] = Material.BambooSlab; - for (int i = 11093; i <= 11172; i++) - materials[i] = Material.BambooStairs; - for (int i = 6716; i <= 6779; i++) - materials[i] = Material.BambooTrapdoor; - for (int i = 5794; i <= 5801; i++) - materials[i] = Material.BambooWallHangingSign; - for (int i = 4930; i <= 4937; i++) - materials[i] = Material.BambooWallSign; - for (int i = 19463; i <= 19474; i++) - materials[i] = Material.Barrel; - for (int i = 11254; i <= 11255; i++) - materials[i] = Material.Barrier; - for (int i = 6031; i <= 6033; i++) - materials[i] = Material.Basalt; - materials[8702] = Material.Beacon; - materials[85] = Material.Bedrock; - for (int i = 20457; i <= 20480; i++) - materials[i] = Material.BeeNest; - for (int i = 20481; i <= 20504; i++) - materials[i] = Material.Beehive; - for (int i = 13532; i <= 13535; i++) - materials[i] = Material.Beetroots; - for (int i = 19526; i <= 19557; i++) - materials[i] = Material.Bell; - for (int i = 25936; i <= 25967; i++) - materials[i] = Material.BigDripleaf; - for (int i = 25968; i <= 25975; i++) - materials[i] = Material.BigDripleafStem; - for (int i = 9444; i <= 9467; i++) - materials[i] = Material.BirchButton; - for (int i = 12845; i <= 12908; i++) - materials[i] = Material.BirchDoor; - for (int i = 12525; i <= 12556; i++) - materials[i] = Material.BirchFence; - for (int i = 12237; i <= 12268; i++) - materials[i] = Material.BirchFenceGate; - for (int i = 5066; i <= 5129; i++) - materials[i] = Material.BirchHangingSign; - for (int i = 308; i <= 335; i++) - materials[i] = Material.BirchLeaves; - for (int i = 142; i <= 144; i++) - materials[i] = Material.BirchLog; - materials[17] = Material.BirchPlanks; - for (int i = 5896; i <= 5897; i++) - materials[i] = Material.BirchPressurePlate; - for (int i = 33; i <= 34; i++) - materials[i] = Material.BirchSapling; - for (int i = 4430; i <= 4461; i++) - materials[i] = Material.BirchSign; - for (int i = 12063; i <= 12068; i++) - materials[i] = Material.BirchSlab; - for (int i = 8530; i <= 8609; i++) - materials[i] = Material.BirchStairs; - for (int i = 6268; i <= 6331; i++) - materials[i] = Material.BirchTrapdoor; - for (int i = 5722; i <= 5729; i++) - materials[i] = Material.BirchWallHangingSign; - for (int i = 4874; i <= 4881; i++) - materials[i] = Material.BirchWallSign; - for (int i = 207; i <= 209; i++) - materials[i] = Material.BirchWood; - for (int i = 11888; i <= 11903; i++) - materials[i] = Material.BlackBanner; - for (int i = 1971; i <= 1986; i++) - materials[i] = Material.BlackBed; - for (int i = 22041; i <= 22056; i++) - materials[i] = Material.BlackCandle; - for (int i = 22089; i <= 22090; i++) - materials[i] = Material.BlackCandleCake; - materials[11632] = Material.BlackCarpet; - materials[13766] = Material.BlackConcrete; - materials[13782] = Material.BlackConcretePowder; - for (int i = 13747; i <= 13750; i++) - materials[i] = Material.BlackGlazedTerracotta; - for (int i = 13681; i <= 13686; i++) - materials[i] = Material.BlackShulkerBox; - materials[6139] = Material.BlackStainedGlass; - for (int i = 10661; i <= 10692; i++) - materials[i] = Material.BlackStainedGlassPane; - materials[10180] = Material.BlackTerracotta; - for (int i = 11964; i <= 11967; i++) - materials[i] = Material.BlackWallBanner; - materials[2108] = Material.BlackWool; - materials[20520] = Material.Blackstone; - for (int i = 20925; i <= 20930; i++) - materials[i] = Material.BlackstoneSlab; - for (int i = 20521; i <= 20600; i++) - materials[i] = Material.BlackstoneStairs; - for (int i = 20601; i <= 20924; i++) - materials[i] = Material.BlackstoneWall; - for (int i = 19483; i <= 19490; i++) - materials[i] = Material.BlastFurnace; - for (int i = 11824; i <= 11839; i++) - materials[i] = Material.BlueBanner; - for (int i = 1907; i <= 1922; i++) - materials[i] = Material.BlueBed; - for (int i = 21977; i <= 21992; i++) - materials[i] = Material.BlueCandle; - for (int i = 22081; i <= 22082; i++) - materials[i] = Material.BlueCandleCake; - materials[11628] = Material.BlueCarpet; - materials[13762] = Material.BlueConcrete; - materials[13778] = Material.BlueConcretePowder; - for (int i = 13731; i <= 13734; i++) - materials[i] = Material.BlueGlazedTerracotta; - materials[13996] = Material.BlueIce; - materials[2124] = Material.BlueOrchid; - for (int i = 13657; i <= 13662; i++) - materials[i] = Material.BlueShulkerBox; - materials[6135] = Material.BlueStainedGlass; - for (int i = 10533; i <= 10564; i++) - materials[i] = Material.BlueStainedGlassPane; - materials[10176] = Material.BlueTerracotta; - for (int i = 11948; i <= 11951; i++) - materials[i] = Material.BlueWallBanner; - materials[2104] = Material.BlueWool; - for (int i = 13569; i <= 13571; i++) - materials[i] = Material.BoneBlock; - materials[2142] = Material.Bookshelf; - for (int i = 13880; i <= 13881; i++) - materials[i] = Material.BrainCoral; - materials[13864] = Material.BrainCoralBlock; - for (int i = 13900; i <= 13901; i++) - materials[i] = Material.BrainCoralFan; - for (int i = 13956; i <= 13963; i++) - materials[i] = Material.BrainCoralWallFan; - for (int i = 8174; i <= 8181; i++) - materials[i] = Material.BrewingStand; - for (int i = 12153; i <= 12158; i++) - materials[i] = Material.BrickSlab; - for (int i = 7400; i <= 7479; i++) - materials[i] = Material.BrickStairs; - for (int i = 15215; i <= 15538; i++) - materials[i] = Material.BrickWall; - materials[2139] = Material.Bricks; - for (int i = 11840; i <= 11855; i++) - materials[i] = Material.BrownBanner; - for (int i = 1923; i <= 1938; i++) - materials[i] = Material.BrownBed; - for (int i = 21993; i <= 22008; i++) - materials[i] = Material.BrownCandle; - for (int i = 22083; i <= 22084; i++) - materials[i] = Material.BrownCandleCake; - materials[11629] = Material.BrownCarpet; - materials[13763] = Material.BrownConcrete; - materials[13779] = Material.BrownConcretePowder; - for (int i = 13735; i <= 13738; i++) - materials[i] = Material.BrownGlazedTerracotta; - materials[2135] = Material.BrownMushroom; - for (int i = 6792; i <= 6855; i++) - materials[i] = Material.BrownMushroomBlock; - for (int i = 13663; i <= 13668; i++) - materials[i] = Material.BrownShulkerBox; - materials[6136] = Material.BrownStainedGlass; - for (int i = 10565; i <= 10596; i++) - materials[i] = Material.BrownStainedGlassPane; - materials[10177] = Material.BrownTerracotta; - for (int i = 11952; i <= 11955; i++) - materials[i] = Material.BrownWallBanner; - materials[2105] = Material.BrownWool; - for (int i = 14015; i <= 14016; i++) - materials[i] = Material.BubbleColumn; - for (int i = 13882; i <= 13883; i++) - materials[i] = Material.BubbleCoral; - materials[13865] = Material.BubbleCoralBlock; - for (int i = 13902; i <= 13903; i++) - materials[i] = Material.BubbleCoralFan; - for (int i = 13964; i <= 13971; i++) - materials[i] = Material.BubbleCoralWallFan; - materials[22092] = Material.BuddingAmethyst; - materials[2051] = Material.Bush; - for (int i = 5960; i <= 5975; i++) - materials[i] = Material.Cactus; - materials[5976] = Material.CactusFlower; - for (int i = 6053; i <= 6059; i++) - materials[i] = Material.Cake; - materials[23376] = Material.Calcite; - for (int i = 23475; i <= 23858; i++) - materials[i] = Material.CalibratedSculkSensor; - for (int i = 19566; i <= 19597; i++) - materials[i] = Material.Campfire; - for (int i = 21785; i <= 21800; i++) - materials[i] = Material.Candle; - for (int i = 22057; i <= 22058; i++) - materials[i] = Material.CandleCake; - for (int i = 9380; i <= 9387; i++) - materials[i] = Material.Carrots; - materials[19491] = Material.CartographyTable; - for (int i = 6045; i <= 6048; i++) - materials[i] = Material.CarvedPumpkin; - materials[8182] = Material.Cauldron; - materials[14014] = Material.CaveAir; - for (int i = 25829; i <= 25880; i++) - materials[i] = Material.CaveVines; - for (int i = 25881; i <= 25882; i++) - materials[i] = Material.CaveVinesPlant; - for (int i = 7016; i <= 7021; i++) - materials[i] = Material.Chain; - for (int i = 13550; i <= 13561; i++) - materials[i] = Material.ChainCommandBlock; - for (int i = 9516; i <= 9539; i++) - materials[i] = Material.CherryButton; - for (int i = 13037; i <= 13100; i++) - materials[i] = Material.CherryDoor; - for (int i = 12621; i <= 12652; i++) - materials[i] = Material.CherryFence; - for (int i = 12333; i <= 12364; i++) - materials[i] = Material.CherryFenceGate; - for (int i = 5194; i <= 5257; i++) - materials[i] = Material.CherryHangingSign; - for (int i = 392; i <= 419; i++) - materials[i] = Material.CherryLeaves; - for (int i = 151; i <= 153; i++) - materials[i] = Material.CherryLog; - materials[20] = Material.CherryPlanks; - for (int i = 5902; i <= 5903; i++) - materials[i] = Material.CherryPressurePlate; - for (int i = 39; i <= 40; i++) - materials[i] = Material.CherrySapling; - for (int i = 4494; i <= 4525; i++) - materials[i] = Material.CherrySign; - for (int i = 12081; i <= 12086; i++) - materials[i] = Material.CherrySlab; - for (int i = 10773; i <= 10852; i++) - materials[i] = Material.CherryStairs; - for (int i = 6460; i <= 6523; i++) - materials[i] = Material.CherryTrapdoor; - for (int i = 5738; i <= 5745; i++) - materials[i] = Material.CherryWallHangingSign; - for (int i = 4890; i <= 4897; i++) - materials[i] = Material.CherryWallSign; - for (int i = 216; i <= 218; i++) - materials[i] = Material.CherryWood; - for (int i = 3018; i <= 3041; i++) - materials[i] = Material.Chest; - for (int i = 9920; i <= 9923; i++) - materials[i] = Material.ChippedAnvil; - for (int i = 2143; i <= 2398; i++) - materials[i] = Material.ChiseledBookshelf; - materials[24011] = Material.ChiseledCopper; - materials[27643] = Material.ChiseledDeepslate; - materials[21782] = Material.ChiseledNetherBricks; - materials[20934] = Material.ChiseledPolishedBlackstone; - materials[10045] = Material.ChiseledQuartzBlock; - materials[11969] = Material.ChiseledRedSandstone; - materials[8055] = Material.ChiseledResinBricks; - materials[579] = Material.ChiseledSandstone; - materials[6783] = Material.ChiseledStoneBricks; - materials[22963] = Material.ChiseledTuff; - materials[23375] = Material.ChiseledTuffBricks; - for (int i = 13427; i <= 13432; i++) - materials[i] = Material.ChorusFlower; - for (int i = 13363; i <= 13426; i++) - materials[i] = Material.ChorusPlant; - materials[5977] = Material.Clay; - materials[27942] = Material.ClosedEyeblossom; - materials[11634] = Material.CoalBlock; - materials[133] = Material.CoalOre; - materials[11] = Material.CoarseDirt; - materials[25999] = Material.CobbledDeepslate; - for (int i = 26080; i <= 26085; i++) - materials[i] = Material.CobbledDeepslateSlab; - for (int i = 26000; i <= 26079; i++) - materials[i] = Material.CobbledDeepslateStairs; - for (int i = 26086; i <= 26409; i++) - materials[i] = Material.CobbledDeepslateWall; - materials[14] = Material.Cobblestone; - for (int i = 12147; i <= 12152; i++) - materials[i] = Material.CobblestoneSlab; - for (int i = 4778; i <= 4857; i++) - materials[i] = Material.CobblestoneStairs; - for (int i = 8703; i <= 9026; i++) - materials[i] = Material.CobblestoneWall; - materials[2047] = Material.Cobweb; - for (int i = 8203; i <= 8214; i++) - materials[i] = Material.Cocoa; - for (int i = 8690; i <= 8701; i++) - materials[i] = Material.CommandBlock; - for (int i = 9984; i <= 9999; i++) - materials[i] = Material.Comparator; - for (int i = 20432; i <= 20440; i++) - materials[i] = Material.Composter; - for (int i = 13997; i <= 13998; i++) - materials[i] = Material.Conduit; - materials[23998] = Material.CopperBlock; - for (int i = 25752; i <= 25755; i++) - materials[i] = Material.CopperBulb; - for (int i = 24712; i <= 24775; i++) - materials[i] = Material.CopperDoor; - for (int i = 25736; i <= 25737; i++) - materials[i] = Material.CopperGrate; - materials[24002] = Material.CopperOre; - for (int i = 25224; i <= 25287; i++) - materials[i] = Material.CopperTrapdoor; - materials[2132] = Material.Cornflower; - materials[27644] = Material.CrackedDeepslateBricks; - materials[27645] = Material.CrackedDeepslateTiles; - materials[21783] = Material.CrackedNetherBricks; - materials[20933] = Material.CrackedPolishedBlackstoneBricks; - materials[6782] = Material.CrackedStoneBricks; - for (int i = 27682; i <= 27729; i++) - materials[i] = Material.Crafter; - materials[4341] = Material.CraftingTable; - for (int i = 2920; i <= 2937; i++) - materials[i] = Material.CreakingHeart; - for (int i = 9796; i <= 9827; i++) - materials[i] = Material.CreeperHead; - for (int i = 9828; i <= 9835; i++) - materials[i] = Material.CreeperWallHead; - for (int i = 20155; i <= 20178; i++) - materials[i] = Material.CrimsonButton; - for (int i = 20203; i <= 20266; i++) - materials[i] = Material.CrimsonDoor; - for (int i = 19739; i <= 19770; i++) - materials[i] = Material.CrimsonFence; - for (int i = 19931; i <= 19962; i++) - materials[i] = Material.CrimsonFenceGate; - materials[19664] = Material.CrimsonFungus; - for (int i = 5450; i <= 5513; i++) - materials[i] = Material.CrimsonHangingSign; - for (int i = 19657; i <= 19659; i++) - materials[i] = Material.CrimsonHyphae; - materials[19663] = Material.CrimsonNylium; - materials[19721] = Material.CrimsonPlanks; - for (int i = 19735; i <= 19736; i++) - materials[i] = Material.CrimsonPressurePlate; - materials[19720] = Material.CrimsonRoots; - for (int i = 20331; i <= 20362; i++) - materials[i] = Material.CrimsonSign; - for (int i = 19723; i <= 19728; i++) - materials[i] = Material.CrimsonSlab; - for (int i = 19995; i <= 20074; i++) - materials[i] = Material.CrimsonStairs; - for (int i = 19651; i <= 19653; i++) - materials[i] = Material.CrimsonStem; - for (int i = 19803; i <= 19866; i++) - materials[i] = Material.CrimsonTrapdoor; - for (int i = 5778; i <= 5785; i++) - materials[i] = Material.CrimsonWallHangingSign; - for (int i = 20395; i <= 20402; i++) - materials[i] = Material.CrimsonWallSign; - materials[20509] = Material.CryingObsidian; - materials[24007] = Material.CutCopper; - for (int i = 24354; i <= 24359; i++) - materials[i] = Material.CutCopperSlab; - for (int i = 24256; i <= 24335; i++) - materials[i] = Material.CutCopperStairs; - materials[11970] = Material.CutRedSandstone; - for (int i = 12189; i <= 12194; i++) - materials[i] = Material.CutRedSandstoneSlab; - materials[580] = Material.CutSandstone; - for (int i = 12135; i <= 12140; i++) - materials[i] = Material.CutSandstoneSlab; - for (int i = 11792; i <= 11807; i++) - materials[i] = Material.CyanBanner; - for (int i = 1875; i <= 1890; i++) - materials[i] = Material.CyanBed; - for (int i = 21945; i <= 21960; i++) - materials[i] = Material.CyanCandle; - for (int i = 22077; i <= 22078; i++) - materials[i] = Material.CyanCandleCake; - materials[11626] = Material.CyanCarpet; - materials[13760] = Material.CyanConcrete; - materials[13776] = Material.CyanConcretePowder; - for (int i = 13723; i <= 13726; i++) - materials[i] = Material.CyanGlazedTerracotta; - for (int i = 13645; i <= 13650; i++) - materials[i] = Material.CyanShulkerBox; - materials[6133] = Material.CyanStainedGlass; - for (int i = 10469; i <= 10500; i++) - materials[i] = Material.CyanStainedGlassPane; - materials[10174] = Material.CyanTerracotta; - for (int i = 11940; i <= 11943; i++) - materials[i] = Material.CyanWallBanner; - materials[2102] = Material.CyanWool; - for (int i = 9924; i <= 9927; i++) - materials[i] = Material.DamagedAnvil; - materials[2121] = Material.Dandelion; - for (int i = 9540; i <= 9563; i++) - materials[i] = Material.DarkOakButton; - for (int i = 13101; i <= 13164; i++) - materials[i] = Material.DarkOakDoor; - for (int i = 12653; i <= 12684; i++) - materials[i] = Material.DarkOakFence; - for (int i = 12365; i <= 12396; i++) - materials[i] = Material.DarkOakFenceGate; - for (int i = 5322; i <= 5385; i++) - materials[i] = Material.DarkOakHangingSign; - for (int i = 420; i <= 447; i++) - materials[i] = Material.DarkOakLeaves; - for (int i = 154; i <= 156; i++) - materials[i] = Material.DarkOakLog; - materials[21] = Material.DarkOakPlanks; - for (int i = 5904; i <= 5905; i++) - materials[i] = Material.DarkOakPressurePlate; - for (int i = 41; i <= 42; i++) - materials[i] = Material.DarkOakSapling; - for (int i = 4558; i <= 4589; i++) - materials[i] = Material.DarkOakSign; - for (int i = 12087; i <= 12092; i++) - materials[i] = Material.DarkOakSlab; - for (int i = 10853; i <= 10932; i++) - materials[i] = Material.DarkOakStairs; - for (int i = 6524; i <= 6587; i++) - materials[i] = Material.DarkOakTrapdoor; - for (int i = 5754; i <= 5761; i++) - materials[i] = Material.DarkOakWallHangingSign; - for (int i = 4906; i <= 4913; i++) - materials[i] = Material.DarkOakWallSign; - for (int i = 219; i <= 221; i++) - materials[i] = Material.DarkOakWood; - materials[11354] = Material.DarkPrismarine; - for (int i = 11607; i <= 11612; i++) - materials[i] = Material.DarkPrismarineSlab; - for (int i = 11515; i <= 11594; i++) - materials[i] = Material.DarkPrismarineStairs; - for (int i = 10000; i <= 10031; i++) - materials[i] = Material.DaylightDetector; - for (int i = 13870; i <= 13871; i++) - materials[i] = Material.DeadBrainCoral; - materials[13859] = Material.DeadBrainCoralBlock; - for (int i = 13890; i <= 13891; i++) - materials[i] = Material.DeadBrainCoralFan; - for (int i = 13916; i <= 13923; i++) - materials[i] = Material.DeadBrainCoralWallFan; - for (int i = 13872; i <= 13873; i++) - materials[i] = Material.DeadBubbleCoral; - materials[13860] = Material.DeadBubbleCoralBlock; - for (int i = 13892; i <= 13893; i++) - materials[i] = Material.DeadBubbleCoralFan; - for (int i = 13924; i <= 13931; i++) - materials[i] = Material.DeadBubbleCoralWallFan; - materials[2050] = Material.DeadBush; - for (int i = 13874; i <= 13875; i++) - materials[i] = Material.DeadFireCoral; - materials[13861] = Material.DeadFireCoralBlock; - for (int i = 13894; i <= 13895; i++) - materials[i] = Material.DeadFireCoralFan; - for (int i = 13932; i <= 13939; i++) - materials[i] = Material.DeadFireCoralWallFan; - for (int i = 13876; i <= 13877; i++) - materials[i] = Material.DeadHornCoral; - materials[13862] = Material.DeadHornCoralBlock; - for (int i = 13896; i <= 13897; i++) - materials[i] = Material.DeadHornCoralFan; - for (int i = 13940; i <= 13947; i++) - materials[i] = Material.DeadHornCoralWallFan; - for (int i = 13868; i <= 13869; i++) - materials[i] = Material.DeadTubeCoral; - materials[13858] = Material.DeadTubeCoralBlock; - for (int i = 13888; i <= 13889; i++) - materials[i] = Material.DeadTubeCoralFan; - for (int i = 13908; i <= 13915; i++) - materials[i] = Material.DeadTubeCoralWallFan; - for (int i = 27666; i <= 27681; i++) - materials[i] = Material.DecoratedPot; - for (int i = 25996; i <= 25998; i++) - materials[i] = Material.Deepslate; - for (int i = 27313; i <= 27318; i++) - materials[i] = Material.DeepslateBrickSlab; - for (int i = 27233; i <= 27312; i++) - materials[i] = Material.DeepslateBrickStairs; - for (int i = 27319; i <= 27642; i++) - materials[i] = Material.DeepslateBrickWall; - materials[27232] = Material.DeepslateBricks; - materials[134] = Material.DeepslateCoalOre; - materials[24003] = Material.DeepslateCopperOre; - materials[4339] = Material.DeepslateDiamondOre; - materials[8296] = Material.DeepslateEmeraldOre; - materials[130] = Material.DeepslateGoldOre; - materials[132] = Material.DeepslateIronOre; - materials[564] = Material.DeepslateLapisOre; - for (int i = 5914; i <= 5915; i++) - materials[i] = Material.DeepslateRedstoneOre; - for (int i = 26902; i <= 26907; i++) - materials[i] = Material.DeepslateTileSlab; - for (int i = 26822; i <= 26901; i++) - materials[i] = Material.DeepslateTileStairs; - for (int i = 26908; i <= 27231; i++) - materials[i] = Material.DeepslateTileWall; - materials[26821] = Material.DeepslateTiles; - for (int i = 2011; i <= 2034; i++) - materials[i] = Material.DetectorRail; - materials[4340] = Material.DiamondBlock; - materials[4338] = Material.DiamondOre; - materials[4] = Material.Diorite; - for (int i = 15209; i <= 15214; i++) - materials[i] = Material.DioriteSlab; - for (int i = 15057; i <= 15136; i++) - materials[i] = Material.DioriteStairs; - for (int i = 19103; i <= 19426; i++) - materials[i] = Material.DioriteWall; - materials[10] = Material.Dirt; - materials[13536] = Material.DirtPath; - for (int i = 566; i <= 577; i++) - materials[i] = Material.Dispenser; - materials[8200] = Material.DragonEgg; - for (int i = 9836; i <= 9867; i++) - materials[i] = Material.DragonHead; - for (int i = 9868; i <= 9875; i++) - materials[i] = Material.DragonWallHead; - for (int i = 13826; i <= 13857; i++) - materials[i] = Material.DriedGhast; - materials[13810] = Material.DriedKelpBlock; - materials[25828] = Material.DripstoneBlock; - for (int i = 10153; i <= 10164; i++) - materials[i] = Material.Dropper; - materials[8449] = Material.EmeraldBlock; - materials[8295] = Material.EmeraldOre; - materials[8173] = Material.EnchantingTable; - materials[13537] = Material.EndGateway; - materials[8190] = Material.EndPortal; - for (int i = 8191; i <= 8198; i++) - materials[i] = Material.EndPortalFrame; - for (int i = 13357; i <= 13362; i++) - materials[i] = Material.EndRod; - materials[8199] = Material.EndStone; - for (int i = 15167; i <= 15172; i++) - materials[i] = Material.EndStoneBrickSlab; - for (int i = 14417; i <= 14496; i++) - materials[i] = Material.EndStoneBrickStairs; - for (int i = 18779; i <= 19102; i++) - materials[i] = Material.EndStoneBrickWall; - materials[13517] = Material.EndStoneBricks; - for (int i = 8297; i <= 8304; i++) - materials[i] = Material.EnderChest; - materials[24010] = Material.ExposedChiseledCopper; - materials[23999] = Material.ExposedCopper; - for (int i = 25756; i <= 25759; i++) - materials[i] = Material.ExposedCopperBulb; - for (int i = 24776; i <= 24839; i++) - materials[i] = Material.ExposedCopperDoor; - for (int i = 25738; i <= 25739; i++) - materials[i] = Material.ExposedCopperGrate; - for (int i = 25288; i <= 25351; i++) - materials[i] = Material.ExposedCopperTrapdoor; - materials[24006] = Material.ExposedCutCopper; - for (int i = 24348; i <= 24353; i++) - materials[i] = Material.ExposedCutCopperSlab; - for (int i = 24176; i <= 24255; i++) - materials[i] = Material.ExposedCutCopperStairs; - for (int i = 4350; i <= 4357; i++) - materials[i] = Material.Farmland; - materials[2049] = Material.Fern; - for (int i = 2406; i <= 2917; i++) - materials[i] = Material.Fire; - for (int i = 13884; i <= 13885; i++) - materials[i] = Material.FireCoral; - materials[13866] = Material.FireCoralBlock; - for (int i = 13904; i <= 13905; i++) - materials[i] = Material.FireCoralFan; - for (int i = 13972; i <= 13979; i++) - materials[i] = Material.FireCoralWallFan; - materials[27945] = Material.FireflyBush; - materials[19492] = Material.FletchingTable; - materials[9351] = Material.FlowerPot; - materials[25885] = Material.FloweringAzalea; - for (int i = 532; i <= 559; i++) - materials[i] = Material.FloweringAzaleaLeaves; - materials[27664] = Material.Frogspawn; - for (int i = 13562; i <= 13565; i++) - materials[i] = Material.FrostedIce; - for (int i = 4358; i <= 4365; i++) - materials[i] = Material.Furnace; - materials[21345] = Material.GildedBlackstone; - materials[562] = Material.Glass; - for (int i = 7022; i <= 7053; i++) - materials[i] = Material.GlassPane; - for (int i = 7112; i <= 7239; i++) - materials[i] = Material.GlowLichen; - materials[6042] = Material.Glowstone; - materials[2137] = Material.GoldBlock; - materials[129] = Material.GoldOre; - materials[2] = Material.Granite; - for (int i = 15185; i <= 15190; i++) - materials[i] = Material.GraniteSlab; - for (int i = 14737; i <= 14816; i++) - materials[i] = Material.GraniteStairs; - for (int i = 16511; i <= 16834; i++) - materials[i] = Material.GraniteWall; - for (int i = 8; i <= 9; i++) - materials[i] = Material.GrassBlock; - materials[124] = Material.Gravel; - for (int i = 11760; i <= 11775; i++) - materials[i] = Material.GrayBanner; - for (int i = 1843; i <= 1858; i++) - materials[i] = Material.GrayBed; - for (int i = 21913; i <= 21928; i++) - materials[i] = Material.GrayCandle; - for (int i = 22073; i <= 22074; i++) - materials[i] = Material.GrayCandleCake; - materials[11624] = Material.GrayCarpet; - materials[13758] = Material.GrayConcrete; - materials[13774] = Material.GrayConcretePowder; - for (int i = 13715; i <= 13718; i++) - materials[i] = Material.GrayGlazedTerracotta; - for (int i = 13633; i <= 13638; i++) - materials[i] = Material.GrayShulkerBox; - materials[6131] = Material.GrayStainedGlass; - for (int i = 10405; i <= 10436; i++) - materials[i] = Material.GrayStainedGlassPane; - materials[10172] = Material.GrayTerracotta; - for (int i = 11932; i <= 11935; i++) - materials[i] = Material.GrayWallBanner; - materials[2100] = Material.GrayWool; - for (int i = 11856; i <= 11871; i++) - materials[i] = Material.GreenBanner; - for (int i = 1939; i <= 1954; i++) - materials[i] = Material.GreenBed; - for (int i = 22009; i <= 22024; i++) - materials[i] = Material.GreenCandle; - for (int i = 22085; i <= 22086; i++) - materials[i] = Material.GreenCandleCake; - materials[11630] = Material.GreenCarpet; - materials[13764] = Material.GreenConcrete; - materials[13780] = Material.GreenConcretePowder; - for (int i = 13739; i <= 13742; i++) - materials[i] = Material.GreenGlazedTerracotta; - for (int i = 13669; i <= 13674; i++) - materials[i] = Material.GreenShulkerBox; - materials[6137] = Material.GreenStainedGlass; - for (int i = 10597; i <= 10628; i++) - materials[i] = Material.GreenStainedGlassPane; - materials[10178] = Material.GreenTerracotta; - for (int i = 11956; i <= 11959; i++) - materials[i] = Material.GreenWallBanner; - materials[2106] = Material.GreenWool; - for (int i = 19493; i <= 19504; i++) - materials[i] = Material.Grindstone; - for (int i = 25992; i <= 25993; i++) - materials[i] = Material.HangingRoots; - for (int i = 11614; i <= 11616; i++) - materials[i] = Material.HayBlock; - for (int i = 27774; i <= 27775; i++) - materials[i] = Material.HeavyCore; - for (int i = 9968; i <= 9983; i++) - materials[i] = Material.HeavyWeightedPressurePlate; - materials[20505] = Material.HoneyBlock; - materials[20506] = Material.HoneycombBlock; - for (int i = 10034; i <= 10043; i++) - materials[i] = Material.Hopper; - for (int i = 13886; i <= 13887; i++) - materials[i] = Material.HornCoral; - materials[13867] = Material.HornCoralBlock; - for (int i = 13906; i <= 13907; i++) - materials[i] = Material.HornCoralFan; - for (int i = 13980; i <= 13987; i++) - materials[i] = Material.HornCoralWallFan; - materials[5958] = Material.Ice; - materials[6791] = Material.InfestedChiseledStoneBricks; - materials[6787] = Material.InfestedCobblestone; - materials[6790] = Material.InfestedCrackedStoneBricks; - for (int i = 27646; i <= 27648; i++) - materials[i] = Material.InfestedDeepslate; - materials[6789] = Material.InfestedMossyStoneBricks; - materials[6786] = Material.InfestedStone; - materials[6788] = Material.InfestedStoneBricks; - for (int i = 6984; i <= 7015; i++) - materials[i] = Material.IronBars; - materials[2138] = Material.IronBlock; - for (int i = 5828; i <= 5891; i++) - materials[i] = Material.IronDoor; - materials[131] = Material.IronOre; - for (int i = 11288; i <= 11351; i++) - materials[i] = Material.IronTrapdoor; - for (int i = 6049; i <= 6052; i++) - materials[i] = Material.JackOLantern; - for (int i = 20415; i <= 20426; i++) - materials[i] = Material.Jigsaw; - for (int i = 5994; i <= 5995; i++) - materials[i] = Material.Jukebox; - for (int i = 9468; i <= 9491; i++) - materials[i] = Material.JungleButton; - for (int i = 12909; i <= 12972; i++) - materials[i] = Material.JungleDoor; - for (int i = 12557; i <= 12588; i++) - materials[i] = Material.JungleFence; - for (int i = 12269; i <= 12300; i++) - materials[i] = Material.JungleFenceGate; - for (int i = 5258; i <= 5321; i++) - materials[i] = Material.JungleHangingSign; - for (int i = 336; i <= 363; i++) - materials[i] = Material.JungleLeaves; - for (int i = 145; i <= 147; i++) - materials[i] = Material.JungleLog; - materials[18] = Material.JunglePlanks; - for (int i = 5898; i <= 5899; i++) - materials[i] = Material.JunglePressurePlate; - for (int i = 35; i <= 36; i++) - materials[i] = Material.JungleSapling; - for (int i = 4526; i <= 4557; i++) - materials[i] = Material.JungleSign; - for (int i = 12069; i <= 12074; i++) - materials[i] = Material.JungleSlab; - for (int i = 8610; i <= 8689; i++) - materials[i] = Material.JungleStairs; - for (int i = 6332; i <= 6395; i++) - materials[i] = Material.JungleTrapdoor; - for (int i = 5746; i <= 5753; i++) - materials[i] = Material.JungleWallHangingSign; - for (int i = 4898; i <= 4905; i++) - materials[i] = Material.JungleWallSign; - for (int i = 210; i <= 212; i++) - materials[i] = Material.JungleWood; - for (int i = 13783; i <= 13808; i++) - materials[i] = Material.Kelp; - materials[13809] = Material.KelpPlant; - for (int i = 4750; i <= 4757; i++) - materials[i] = Material.Ladder; - for (int i = 19558; i <= 19561; i++) - materials[i] = Material.Lantern; - materials[565] = Material.LapisBlock; - materials[563] = Material.LapisOre; - for (int i = 22105; i <= 22116; i++) - materials[i] = Material.LargeAmethystBud; - for (int i = 11646; i <= 11647; i++) - materials[i] = Material.LargeFern; - for (int i = 102; i <= 117; i++) - materials[i] = Material.Lava; - materials[8186] = Material.LavaCauldron; - for (int i = 25919; i <= 25934; i++) - materials[i] = Material.LeafLitter; - for (int i = 19505; i <= 19520; i++) - materials[i] = Material.Lectern; - for (int i = 5802; i <= 5825; i++) - materials[i] = Material.Lever; - for (int i = 11256; i <= 11287; i++) - materials[i] = Material.Light; - for (int i = 11696; i <= 11711; i++) - materials[i] = Material.LightBlueBanner; - for (int i = 1779; i <= 1794; i++) - materials[i] = Material.LightBlueBed; - for (int i = 21849; i <= 21864; i++) - materials[i] = Material.LightBlueCandle; - for (int i = 22065; i <= 22066; i++) - materials[i] = Material.LightBlueCandleCake; - materials[11620] = Material.LightBlueCarpet; - materials[13754] = Material.LightBlueConcrete; - materials[13770] = Material.LightBlueConcretePowder; - for (int i = 13699; i <= 13702; i++) - materials[i] = Material.LightBlueGlazedTerracotta; - for (int i = 13609; i <= 13614; i++) - materials[i] = Material.LightBlueShulkerBox; - materials[6127] = Material.LightBlueStainedGlass; - for (int i = 10277; i <= 10308; i++) - materials[i] = Material.LightBlueStainedGlassPane; - materials[10168] = Material.LightBlueTerracotta; - for (int i = 11916; i <= 11919; i++) - materials[i] = Material.LightBlueWallBanner; - materials[2096] = Material.LightBlueWool; - for (int i = 11776; i <= 11791; i++) - materials[i] = Material.LightGrayBanner; - for (int i = 1859; i <= 1874; i++) - materials[i] = Material.LightGrayBed; - for (int i = 21929; i <= 21944; i++) - materials[i] = Material.LightGrayCandle; - for (int i = 22075; i <= 22076; i++) - materials[i] = Material.LightGrayCandleCake; - materials[11625] = Material.LightGrayCarpet; - materials[13759] = Material.LightGrayConcrete; - materials[13775] = Material.LightGrayConcretePowder; - for (int i = 13719; i <= 13722; i++) - materials[i] = Material.LightGrayGlazedTerracotta; - for (int i = 13639; i <= 13644; i++) - materials[i] = Material.LightGrayShulkerBox; - materials[6132] = Material.LightGrayStainedGlass; - for (int i = 10437; i <= 10468; i++) - materials[i] = Material.LightGrayStainedGlassPane; - materials[10173] = Material.LightGrayTerracotta; - for (int i = 11936; i <= 11939; i++) - materials[i] = Material.LightGrayWallBanner; - materials[2101] = Material.LightGrayWool; - for (int i = 9952; i <= 9967; i++) - materials[i] = Material.LightWeightedPressurePlate; - for (int i = 25784; i <= 25807; i++) - materials[i] = Material.LightningRod; - for (int i = 11638; i <= 11639; i++) - materials[i] = Material.Lilac; - materials[2134] = Material.LilyOfTheValley; - materials[7642] = Material.LilyPad; - for (int i = 11728; i <= 11743; i++) - materials[i] = Material.LimeBanner; - for (int i = 1811; i <= 1826; i++) - materials[i] = Material.LimeBed; - for (int i = 21881; i <= 21896; i++) - materials[i] = Material.LimeCandle; - for (int i = 22069; i <= 22070; i++) - materials[i] = Material.LimeCandleCake; - materials[11622] = Material.LimeCarpet; - materials[13756] = Material.LimeConcrete; - materials[13772] = Material.LimeConcretePowder; - for (int i = 13707; i <= 13710; i++) - materials[i] = Material.LimeGlazedTerracotta; - for (int i = 13621; i <= 13626; i++) - materials[i] = Material.LimeShulkerBox; - materials[6129] = Material.LimeStainedGlass; - for (int i = 10341; i <= 10372; i++) - materials[i] = Material.LimeStainedGlassPane; - materials[10170] = Material.LimeTerracotta; - for (int i = 11924; i <= 11927; i++) - materials[i] = Material.LimeWallBanner; - materials[2098] = Material.LimeWool; - materials[20519] = Material.Lodestone; - for (int i = 19459; i <= 19462; i++) - materials[i] = Material.Loom; - for (int i = 11680; i <= 11695; i++) - materials[i] = Material.MagentaBanner; - for (int i = 1763; i <= 1778; i++) - materials[i] = Material.MagentaBed; - for (int i = 21833; i <= 21848; i++) - materials[i] = Material.MagentaCandle; - for (int i = 22063; i <= 22064; i++) - materials[i] = Material.MagentaCandleCake; - materials[11619] = Material.MagentaCarpet; - materials[13753] = Material.MagentaConcrete; - materials[13769] = Material.MagentaConcretePowder; - for (int i = 13695; i <= 13698; i++) - materials[i] = Material.MagentaGlazedTerracotta; - for (int i = 13603; i <= 13608; i++) - materials[i] = Material.MagentaShulkerBox; - materials[6126] = Material.MagentaStainedGlass; - for (int i = 10245; i <= 10276; i++) - materials[i] = Material.MagentaStainedGlassPane; - materials[10167] = Material.MagentaTerracotta; - for (int i = 11912; i <= 11915; i++) - materials[i] = Material.MagentaWallBanner; - materials[2095] = Material.MagentaWool; - materials[13566] = Material.MagmaBlock; - for (int i = 9588; i <= 9611; i++) - materials[i] = Material.MangroveButton; - for (int i = 13229; i <= 13292; i++) - materials[i] = Material.MangroveDoor; - for (int i = 12717; i <= 12748; i++) - materials[i] = Material.MangroveFence; - for (int i = 12429; i <= 12460; i++) - materials[i] = Material.MangroveFenceGate; - for (int i = 5578; i <= 5641; i++) - materials[i] = Material.MangroveHangingSign; - for (int i = 476; i <= 503; i++) - materials[i] = Material.MangroveLeaves; - for (int i = 160; i <= 162; i++) - materials[i] = Material.MangroveLog; - materials[26] = Material.MangrovePlanks; - for (int i = 5908; i <= 5909; i++) - materials[i] = Material.MangrovePressurePlate; - for (int i = 45; i <= 84; i++) - materials[i] = Material.MangrovePropagule; - for (int i = 163; i <= 164; i++) - materials[i] = Material.MangroveRoots; - for (int i = 4622; i <= 4653; i++) - materials[i] = Material.MangroveSign; - for (int i = 12099; i <= 12104; i++) - materials[i] = Material.MangroveSlab; - for (int i = 11013; i <= 11092; i++) - materials[i] = Material.MangroveStairs; - for (int i = 6652; i <= 6715; i++) - materials[i] = Material.MangroveTrapdoor; - for (int i = 5770; i <= 5777; i++) - materials[i] = Material.MangroveWallHangingSign; - for (int i = 4922; i <= 4929; i++) - materials[i] = Material.MangroveWallSign; - for (int i = 222; i <= 224; i++) - materials[i] = Material.MangroveWood; - for (int i = 22117; i <= 22128; i++) - materials[i] = Material.MediumAmethystBud; - materials[7055] = Material.Melon; - for (int i = 7072; i <= 7079; i++) - materials[i] = Material.MelonStem; - materials[25935] = Material.MossBlock; - materials[25886] = Material.MossCarpet; - materials[2399] = Material.MossyCobblestone; - for (int i = 15161; i <= 15166; i++) - materials[i] = Material.MossyCobblestoneSlab; - for (int i = 14337; i <= 14416; i++) - materials[i] = Material.MossyCobblestoneStairs; - for (int i = 9027; i <= 9350; i++) - materials[i] = Material.MossyCobblestoneWall; - for (int i = 15149; i <= 15154; i++) - materials[i] = Material.MossyStoneBrickSlab; - for (int i = 14177; i <= 14256; i++) - materials[i] = Material.MossyStoneBrickStairs; - for (int i = 16187; i <= 16510; i++) - materials[i] = Material.MossyStoneBrickWall; - materials[6781] = Material.MossyStoneBricks; - for (int i = 2109; i <= 2120; i++) - materials[i] = Material.MovingPiston; - materials[25995] = Material.Mud; - for (int i = 12165; i <= 12170; i++) - materials[i] = Material.MudBrickSlab; - for (int i = 7560; i <= 7639; i++) - materials[i] = Material.MudBrickStairs; - for (int i = 17159; i <= 17482; i++) - materials[i] = Material.MudBrickWall; - materials[6785] = Material.MudBricks; - for (int i = 165; i <= 167; i++) - materials[i] = Material.MuddyMangroveRoots; - for (int i = 6920; i <= 6983; i++) - materials[i] = Material.MushroomStem; - for (int i = 7640; i <= 7641; i++) - materials[i] = Material.Mycelium; - for (int i = 8057; i <= 8088; i++) - materials[i] = Material.NetherBrickFence; - for (int i = 12171; i <= 12176; i++) - materials[i] = Material.NetherBrickSlab; - for (int i = 8089; i <= 8168; i++) - materials[i] = Material.NetherBrickStairs; - for (int i = 17483; i <= 17806; i++) - materials[i] = Material.NetherBrickWall; - materials[8056] = Material.NetherBricks; - materials[135] = Material.NetherGoldOre; - for (int i = 6043; i <= 6044; i++) - materials[i] = Material.NetherPortal; - materials[10033] = Material.NetherQuartzOre; - materials[19650] = Material.NetherSprouts; - for (int i = 8169; i <= 8172; i++) - materials[i] = Material.NetherWart; - materials[13567] = Material.NetherWartBlock; - materials[20507] = Material.NetheriteBlock; - materials[6028] = Material.Netherrack; - for (int i = 581; i <= 1730; i++) - materials[i] = Material.NoteBlock; - for (int i = 9396; i <= 9419; i++) - materials[i] = Material.OakButton; - for (int i = 4686; i <= 4749; i++) - materials[i] = Material.OakDoor; - for (int i = 5996; i <= 6027; i++) - materials[i] = Material.OakFence; - for (int i = 7368; i <= 7399; i++) - materials[i] = Material.OakFenceGate; - for (int i = 4938; i <= 5001; i++) - materials[i] = Material.OakHangingSign; - for (int i = 252; i <= 279; i++) - materials[i] = Material.OakLeaves; - for (int i = 136; i <= 138; i++) - materials[i] = Material.OakLog; - materials[15] = Material.OakPlanks; - for (int i = 5892; i <= 5893; i++) - materials[i] = Material.OakPressurePlate; - for (int i = 29; i <= 30; i++) - materials[i] = Material.OakSapling; - for (int i = 4366; i <= 4397; i++) - materials[i] = Material.OakSign; - for (int i = 12051; i <= 12056; i++) - materials[i] = Material.OakSlab; - for (int i = 2938; i <= 3017; i++) - materials[i] = Material.OakStairs; - for (int i = 6140; i <= 6203; i++) - materials[i] = Material.OakTrapdoor; - for (int i = 5706; i <= 5713; i++) - materials[i] = Material.OakWallHangingSign; - for (int i = 4858; i <= 4865; i++) - materials[i] = Material.OakWallSign; - for (int i = 201; i <= 203; i++) - materials[i] = Material.OakWood; - for (int i = 13573; i <= 13584; i++) - materials[i] = Material.Observer; - materials[2400] = Material.Obsidian; - for (int i = 27655; i <= 27657; i++) - materials[i] = Material.OchreFroglight; - materials[27941] = Material.OpenEyeblossom; - for (int i = 11664; i <= 11679; i++) - materials[i] = Material.OrangeBanner; - for (int i = 1747; i <= 1762; i++) - materials[i] = Material.OrangeBed; - for (int i = 21817; i <= 21832; i++) - materials[i] = Material.OrangeCandle; - for (int i = 22061; i <= 22062; i++) - materials[i] = Material.OrangeCandleCake; - materials[11618] = Material.OrangeCarpet; - materials[13752] = Material.OrangeConcrete; - materials[13768] = Material.OrangeConcretePowder; - for (int i = 13691; i <= 13694; i++) - materials[i] = Material.OrangeGlazedTerracotta; - for (int i = 13597; i <= 13602; i++) - materials[i] = Material.OrangeShulkerBox; - materials[6125] = Material.OrangeStainedGlass; - for (int i = 10213; i <= 10244; i++) - materials[i] = Material.OrangeStainedGlassPane; - materials[10166] = Material.OrangeTerracotta; - materials[2128] = Material.OrangeTulip; - for (int i = 11908; i <= 11911; i++) - materials[i] = Material.OrangeWallBanner; - materials[2094] = Material.OrangeWool; - materials[2131] = Material.OxeyeDaisy; - materials[24008] = Material.OxidizedChiseledCopper; - materials[24001] = Material.OxidizedCopper; - for (int i = 25764; i <= 25767; i++) - materials[i] = Material.OxidizedCopperBulb; - for (int i = 24840; i <= 24903; i++) - materials[i] = Material.OxidizedCopperDoor; - for (int i = 25742; i <= 25743; i++) - materials[i] = Material.OxidizedCopperGrate; - for (int i = 25352; i <= 25415; i++) - materials[i] = Material.OxidizedCopperTrapdoor; - materials[24004] = Material.OxidizedCutCopper; - for (int i = 24336; i <= 24341; i++) - materials[i] = Material.OxidizedCutCopperSlab; - for (int i = 24016; i <= 24095; i++) - materials[i] = Material.OxidizedCutCopperStairs; - materials[11635] = Material.PackedIce; - materials[6784] = Material.PackedMud; - for (int i = 27939; i <= 27940; i++) - materials[i] = Material.PaleHangingMoss; - materials[27776] = Material.PaleMossBlock; - for (int i = 27777; i <= 27938; i++) - materials[i] = Material.PaleMossCarpet; - for (int i = 9564; i <= 9587; i++) - materials[i] = Material.PaleOakButton; - for (int i = 13165; i <= 13228; i++) - materials[i] = Material.PaleOakDoor; - for (int i = 12685; i <= 12716; i++) - materials[i] = Material.PaleOakFence; - for (int i = 12397; i <= 12428; i++) - materials[i] = Material.PaleOakFenceGate; - for (int i = 5386; i <= 5449; i++) - materials[i] = Material.PaleOakHangingSign; - for (int i = 448; i <= 475; i++) - materials[i] = Material.PaleOakLeaves; - for (int i = 157; i <= 159; i++) - materials[i] = Material.PaleOakLog; - materials[25] = Material.PaleOakPlanks; - for (int i = 5906; i <= 5907; i++) - materials[i] = Material.PaleOakPressurePlate; - for (int i = 43; i <= 44; i++) - materials[i] = Material.PaleOakSapling; - for (int i = 4590; i <= 4621; i++) - materials[i] = Material.PaleOakSign; - for (int i = 12093; i <= 12098; i++) - materials[i] = Material.PaleOakSlab; - for (int i = 10933; i <= 11012; i++) - materials[i] = Material.PaleOakStairs; - for (int i = 6588; i <= 6651; i++) - materials[i] = Material.PaleOakTrapdoor; - for (int i = 5762; i <= 5769; i++) - materials[i] = Material.PaleOakWallHangingSign; - for (int i = 4914; i <= 4921; i++) - materials[i] = Material.PaleOakWallSign; - for (int i = 22; i <= 24; i++) - materials[i] = Material.PaleOakWood; - for (int i = 27661; i <= 27663; i++) - materials[i] = Material.PearlescentFroglight; - for (int i = 11642; i <= 11643; i++) - materials[i] = Material.Peony; - for (int i = 12141; i <= 12146; i++) - materials[i] = Material.PetrifiedOakSlab; - for (int i = 9876; i <= 9907; i++) - materials[i] = Material.PiglinHead; - for (int i = 9908; i <= 9915; i++) - materials[i] = Material.PiglinWallHead; - for (int i = 11744; i <= 11759; i++) - materials[i] = Material.PinkBanner; - for (int i = 1827; i <= 1842; i++) - materials[i] = Material.PinkBed; - for (int i = 21897; i <= 21912; i++) - materials[i] = Material.PinkCandle; - for (int i = 22071; i <= 22072; i++) - materials[i] = Material.PinkCandleCake; - materials[11623] = Material.PinkCarpet; - materials[13757] = Material.PinkConcrete; - materials[13773] = Material.PinkConcretePowder; - for (int i = 13711; i <= 13714; i++) - materials[i] = Material.PinkGlazedTerracotta; - for (int i = 25887; i <= 25902; i++) - materials[i] = Material.PinkPetals; - for (int i = 13627; i <= 13632; i++) - materials[i] = Material.PinkShulkerBox; - materials[6130] = Material.PinkStainedGlass; - for (int i = 10373; i <= 10404; i++) - materials[i] = Material.PinkStainedGlassPane; - materials[10171] = Material.PinkTerracotta; - materials[2130] = Material.PinkTulip; - for (int i = 11928; i <= 11931; i++) - materials[i] = Material.PinkWallBanner; - materials[2099] = Material.PinkWool; - for (int i = 2057; i <= 2068; i++) - materials[i] = Material.Piston; - for (int i = 2069; i <= 2092; i++) - materials[i] = Material.PistonHead; - for (int i = 13520; i <= 13529; i++) - materials[i] = Material.PitcherCrop; - for (int i = 13530; i <= 13531; i++) - materials[i] = Material.PitcherPlant; - for (int i = 9756; i <= 9787; i++) - materials[i] = Material.PlayerHead; - for (int i = 9788; i <= 9795; i++) - materials[i] = Material.PlayerWallHead; - for (int i = 12; i <= 13; i++) - materials[i] = Material.Podzol; - for (int i = 25808; i <= 25827; i++) - materials[i] = Material.PointedDripstone; - materials[7] = Material.PolishedAndesite; - for (int i = 15203; i <= 15208; i++) - materials[i] = Material.PolishedAndesiteSlab; - for (int i = 14977; i <= 15056; i++) - materials[i] = Material.PolishedAndesiteStairs; - for (int i = 6034; i <= 6036; i++) - materials[i] = Material.PolishedBasalt; - materials[20931] = Material.PolishedBlackstone; - for (int i = 20935; i <= 20940; i++) - materials[i] = Material.PolishedBlackstoneBrickSlab; - for (int i = 20941; i <= 21020; i++) - materials[i] = Material.PolishedBlackstoneBrickStairs; - for (int i = 21021; i <= 21344; i++) - materials[i] = Material.PolishedBlackstoneBrickWall; - materials[20932] = Material.PolishedBlackstoneBricks; - for (int i = 21434; i <= 21457; i++) - materials[i] = Material.PolishedBlackstoneButton; - for (int i = 21432; i <= 21433; i++) - materials[i] = Material.PolishedBlackstonePressurePlate; - for (int i = 21426; i <= 21431; i++) - materials[i] = Material.PolishedBlackstoneSlab; - for (int i = 21346; i <= 21425; i++) - materials[i] = Material.PolishedBlackstoneStairs; - for (int i = 21458; i <= 21781; i++) - materials[i] = Material.PolishedBlackstoneWall; - materials[26410] = Material.PolishedDeepslate; - for (int i = 26491; i <= 26496; i++) - materials[i] = Material.PolishedDeepslateSlab; - for (int i = 26411; i <= 26490; i++) - materials[i] = Material.PolishedDeepslateStairs; - for (int i = 26497; i <= 26820; i++) - materials[i] = Material.PolishedDeepslateWall; - materials[5] = Material.PolishedDiorite; - for (int i = 15155; i <= 15160; i++) - materials[i] = Material.PolishedDioriteSlab; - for (int i = 14257; i <= 14336; i++) - materials[i] = Material.PolishedDioriteStairs; - materials[3] = Material.PolishedGranite; - for (int i = 15137; i <= 15142; i++) - materials[i] = Material.PolishedGraniteSlab; - for (int i = 14017; i <= 14096; i++) - materials[i] = Material.PolishedGraniteStairs; - materials[22552] = Material.PolishedTuff; - for (int i = 22553; i <= 22558; i++) - materials[i] = Material.PolishedTuffSlab; - for (int i = 22559; i <= 22638; i++) - materials[i] = Material.PolishedTuffStairs; - for (int i = 22639; i <= 22962; i++) - materials[i] = Material.PolishedTuffWall; - materials[2123] = Material.Poppy; - for (int i = 9388; i <= 9395; i++) - materials[i] = Material.Potatoes; - materials[9357] = Material.PottedAcaciaSapling; - materials[9366] = Material.PottedAllium; - materials[27653] = Material.PottedAzaleaBush; - materials[9367] = Material.PottedAzureBluet; - materials[14012] = Material.PottedBamboo; - materials[9355] = Material.PottedBirchSapling; - materials[9365] = Material.PottedBlueOrchid; - materials[9377] = Material.PottedBrownMushroom; - materials[9379] = Material.PottedCactus; - materials[9358] = Material.PottedCherrySapling; - materials[27944] = Material.PottedClosedEyeblossom; - materials[9373] = Material.PottedCornflower; - materials[20515] = Material.PottedCrimsonFungus; - materials[20517] = Material.PottedCrimsonRoots; - materials[9363] = Material.PottedDandelion; - materials[9359] = Material.PottedDarkOakSapling; - materials[9378] = Material.PottedDeadBush; - materials[9362] = Material.PottedFern; - materials[27654] = Material.PottedFloweringAzaleaBush; - materials[9356] = Material.PottedJungleSapling; - materials[9374] = Material.PottedLilyOfTheValley; - materials[9361] = Material.PottedMangrovePropagule; - materials[9353] = Material.PottedOakSapling; - materials[27943] = Material.PottedOpenEyeblossom; - materials[9369] = Material.PottedOrangeTulip; - materials[9372] = Material.PottedOxeyeDaisy; - materials[9360] = Material.PottedPaleOakSapling; - materials[9371] = Material.PottedPinkTulip; - materials[9364] = Material.PottedPoppy; - materials[9376] = Material.PottedRedMushroom; - materials[9368] = Material.PottedRedTulip; - materials[9354] = Material.PottedSpruceSapling; - materials[9352] = Material.PottedTorchflower; - materials[20516] = Material.PottedWarpedFungus; - materials[20518] = Material.PottedWarpedRoots; - materials[9370] = Material.PottedWhiteTulip; - materials[9375] = Material.PottedWitherRose; - materials[23378] = Material.PowderSnow; - for (int i = 8187; i <= 8189; i++) - materials[i] = Material.PowderSnowCauldron; - for (int i = 1987; i <= 2010; i++) - materials[i] = Material.PoweredRail; - materials[11352] = Material.Prismarine; - for (int i = 11601; i <= 11606; i++) - materials[i] = Material.PrismarineBrickSlab; - for (int i = 11435; i <= 11514; i++) - materials[i] = Material.PrismarineBrickStairs; - materials[11353] = Material.PrismarineBricks; - for (int i = 11595; i <= 11600; i++) - materials[i] = Material.PrismarineSlab; - for (int i = 11355; i <= 11434; i++) - materials[i] = Material.PrismarineStairs; - for (int i = 15539; i <= 15862; i++) - materials[i] = Material.PrismarineWall; - materials[7054] = Material.Pumpkin; - for (int i = 7064; i <= 7071; i++) - materials[i] = Material.PumpkinStem; - for (int i = 11808; i <= 11823; i++) - materials[i] = Material.PurpleBanner; - for (int i = 1891; i <= 1906; i++) - materials[i] = Material.PurpleBed; - for (int i = 21961; i <= 21976; i++) - materials[i] = Material.PurpleCandle; - for (int i = 22079; i <= 22080; i++) - materials[i] = Material.PurpleCandleCake; - materials[11627] = Material.PurpleCarpet; - materials[13761] = Material.PurpleConcrete; - materials[13777] = Material.PurpleConcretePowder; - for (int i = 13727; i <= 13730; i++) - materials[i] = Material.PurpleGlazedTerracotta; - for (int i = 13651; i <= 13656; i++) - materials[i] = Material.PurpleShulkerBox; - materials[6134] = Material.PurpleStainedGlass; - for (int i = 10501; i <= 10532; i++) - materials[i] = Material.PurpleStainedGlassPane; - materials[10175] = Material.PurpleTerracotta; - for (int i = 11944; i <= 11947; i++) - materials[i] = Material.PurpleWallBanner; - materials[2103] = Material.PurpleWool; - materials[13433] = Material.PurpurBlock; - for (int i = 13434; i <= 13436; i++) - materials[i] = Material.PurpurPillar; - for (int i = 12195; i <= 12200; i++) - materials[i] = Material.PurpurSlab; - for (int i = 13437; i <= 13516; i++) - materials[i] = Material.PurpurStairs; - materials[10044] = Material.QuartzBlock; - materials[21784] = Material.QuartzBricks; - for (int i = 10046; i <= 10048; i++) - materials[i] = Material.QuartzPillar; - for (int i = 12177; i <= 12182; i++) - materials[i] = Material.QuartzSlab; - for (int i = 10049; i <= 10128; i++) - materials[i] = Material.QuartzStairs; - for (int i = 4758; i <= 4777; i++) - materials[i] = Material.Rail; - materials[27651] = Material.RawCopperBlock; - materials[27652] = Material.RawGoldBlock; - materials[27650] = Material.RawIronBlock; - for (int i = 11872; i <= 11887; i++) - materials[i] = Material.RedBanner; - for (int i = 1955; i <= 1970; i++) - materials[i] = Material.RedBed; - for (int i = 22025; i <= 22040; i++) - materials[i] = Material.RedCandle; - for (int i = 22087; i <= 22088; i++) - materials[i] = Material.RedCandleCake; - materials[11631] = Material.RedCarpet; - materials[13765] = Material.RedConcrete; - materials[13781] = Material.RedConcretePowder; - for (int i = 13743; i <= 13746; i++) - materials[i] = Material.RedGlazedTerracotta; - materials[2136] = Material.RedMushroom; - for (int i = 6856; i <= 6919; i++) - materials[i] = Material.RedMushroomBlock; - for (int i = 15197; i <= 15202; i++) - materials[i] = Material.RedNetherBrickSlab; - for (int i = 14897; i <= 14976; i++) - materials[i] = Material.RedNetherBrickStairs; - for (int i = 18131; i <= 18454; i++) - materials[i] = Material.RedNetherBrickWall; - materials[13568] = Material.RedNetherBricks; - materials[123] = Material.RedSand; - materials[11968] = Material.RedSandstone; - for (int i = 12183; i <= 12188; i++) - materials[i] = Material.RedSandstoneSlab; - for (int i = 11971; i <= 12050; i++) - materials[i] = Material.RedSandstoneStairs; - for (int i = 15863; i <= 16186; i++) - materials[i] = Material.RedSandstoneWall; - for (int i = 13675; i <= 13680; i++) - materials[i] = Material.RedShulkerBox; - materials[6138] = Material.RedStainedGlass; - for (int i = 10629; i <= 10660; i++) - materials[i] = Material.RedStainedGlassPane; - materials[10179] = Material.RedTerracotta; - materials[2127] = Material.RedTulip; - for (int i = 11960; i <= 11963; i++) - materials[i] = Material.RedWallBanner; - materials[2107] = Material.RedWool; - materials[10032] = Material.RedstoneBlock; - for (int i = 8201; i <= 8202; i++) - materials[i] = Material.RedstoneLamp; - for (int i = 5912; i <= 5913; i++) - materials[i] = Material.RedstoneOre; - for (int i = 5916; i <= 5917; i++) - materials[i] = Material.RedstoneTorch; - for (int i = 5918; i <= 5925; i++) - materials[i] = Material.RedstoneWallTorch; - for (int i = 3042; i <= 4337; i++) - materials[i] = Material.RedstoneWire; - materials[27665] = Material.ReinforcedDeepslate; - for (int i = 6060; i <= 6123; i++) - materials[i] = Material.Repeater; - for (int i = 13538; i <= 13549; i++) - materials[i] = Material.RepeatingCommandBlock; - materials[7643] = Material.ResinBlock; - for (int i = 7725; i <= 7730; i++) - materials[i] = Material.ResinBrickSlab; - for (int i = 7645; i <= 7724; i++) - materials[i] = Material.ResinBrickStairs; - for (int i = 7731; i <= 8054; i++) - materials[i] = Material.ResinBrickWall; - materials[7644] = Material.ResinBricks; - for (int i = 7240; i <= 7367; i++) - materials[i] = Material.ResinClump; - for (int i = 20510; i <= 20514; i++) - materials[i] = Material.RespawnAnchor; - materials[25994] = Material.RootedDirt; - for (int i = 11640; i <= 11641; i++) - materials[i] = Material.RoseBush; - materials[118] = Material.Sand; - materials[578] = Material.Sandstone; - for (int i = 12129; i <= 12134; i++) - materials[i] = Material.SandstoneSlab; - for (int i = 8215; i <= 8294; i++) - materials[i] = Material.SandstoneStairs; - for (int i = 18455; i <= 18778; i++) - materials[i] = Material.SandstoneWall; - for (int i = 19427; i <= 19458; i++) - materials[i] = Material.Scaffolding; - materials[23859] = Material.Sculk; - for (int i = 23988; i <= 23989; i++) - materials[i] = Material.SculkCatalyst; - for (int i = 23379; i <= 23474; i++) - materials[i] = Material.SculkSensor; - for (int i = 23990; i <= 23997; i++) - materials[i] = Material.SculkShrieker; - for (int i = 23860; i <= 23987; i++) - materials[i] = Material.SculkVein; - materials[11613] = Material.SeaLantern; - for (int i = 13988; i <= 13995; i++) - materials[i] = Material.SeaPickle; - materials[2054] = Material.Seagrass; - materials[2052] = Material.ShortDryGrass; - materials[2048] = Material.ShortGrass; - materials[19665] = Material.Shroomlight; - for (int i = 13585; i <= 13590; i++) - materials[i] = Material.ShulkerBox; - for (int i = 9636; i <= 9667; i++) - materials[i] = Material.SkeletonSkull; - for (int i = 9668; i <= 9675; i++) - materials[i] = Material.SkeletonWallSkull; - materials[11253] = Material.SlimeBlock; - for (int i = 22129; i <= 22140; i++) - materials[i] = Material.SmallAmethystBud; - for (int i = 25976; i <= 25991; i++) - materials[i] = Material.SmallDripleaf; - materials[19521] = Material.SmithingTable; - for (int i = 19475; i <= 19482; i++) - materials[i] = Material.Smoker; - materials[27649] = Material.SmoothBasalt; - materials[12203] = Material.SmoothQuartz; - for (int i = 15179; i <= 15184; i++) - materials[i] = Material.SmoothQuartzSlab; - for (int i = 14657; i <= 14736; i++) - materials[i] = Material.SmoothQuartzStairs; - materials[12204] = Material.SmoothRedSandstone; - for (int i = 15143; i <= 15148; i++) - materials[i] = Material.SmoothRedSandstoneSlab; - for (int i = 14097; i <= 14176; i++) - materials[i] = Material.SmoothRedSandstoneStairs; - materials[12202] = Material.SmoothSandstone; - for (int i = 15173; i <= 15178; i++) - materials[i] = Material.SmoothSandstoneSlab; - for (int i = 14577; i <= 14656; i++) - materials[i] = Material.SmoothSandstoneStairs; - materials[12201] = Material.SmoothStone; - for (int i = 12123; i <= 12128; i++) - materials[i] = Material.SmoothStoneSlab; - for (int i = 13823; i <= 13825; i++) - materials[i] = Material.SnifferEgg; - for (int i = 5950; i <= 5957; i++) - materials[i] = Material.Snow; - materials[5959] = Material.SnowBlock; - for (int i = 19598; i <= 19629; i++) - materials[i] = Material.SoulCampfire; - materials[2918] = Material.SoulFire; - for (int i = 19562; i <= 19565; i++) - materials[i] = Material.SoulLantern; - materials[6029] = Material.SoulSand; - materials[6030] = Material.SoulSoil; - materials[6037] = Material.SoulTorch; - for (int i = 6038; i <= 6041; i++) - materials[i] = Material.SoulWallTorch; - materials[2919] = Material.Spawner; - materials[560] = Material.Sponge; - materials[25883] = Material.SporeBlossom; - for (int i = 9420; i <= 9443; i++) - materials[i] = Material.SpruceButton; - for (int i = 12781; i <= 12844; i++) - materials[i] = Material.SpruceDoor; - for (int i = 12493; i <= 12524; i++) - materials[i] = Material.SpruceFence; - for (int i = 12205; i <= 12236; i++) - materials[i] = Material.SpruceFenceGate; - for (int i = 5002; i <= 5065; i++) - materials[i] = Material.SpruceHangingSign; - for (int i = 280; i <= 307; i++) - materials[i] = Material.SpruceLeaves; - for (int i = 139; i <= 141; i++) - materials[i] = Material.SpruceLog; - materials[16] = Material.SprucePlanks; - for (int i = 5894; i <= 5895; i++) - materials[i] = Material.SprucePressurePlate; - for (int i = 31; i <= 32; i++) - materials[i] = Material.SpruceSapling; - for (int i = 4398; i <= 4429; i++) - materials[i] = Material.SpruceSign; - for (int i = 12057; i <= 12062; i++) - materials[i] = Material.SpruceSlab; - for (int i = 8450; i <= 8529; i++) - materials[i] = Material.SpruceStairs; - for (int i = 6204; i <= 6267; i++) - materials[i] = Material.SpruceTrapdoor; - for (int i = 5714; i <= 5721; i++) - materials[i] = Material.SpruceWallHangingSign; - for (int i = 4866; i <= 4873; i++) - materials[i] = Material.SpruceWallSign; - for (int i = 204; i <= 206; i++) - materials[i] = Material.SpruceWood; - for (int i = 2035; i <= 2046; i++) - materials[i] = Material.StickyPiston; - materials[1] = Material.Stone; - for (int i = 12159; i <= 12164; i++) - materials[i] = Material.StoneBrickSlab; - for (int i = 7480; i <= 7559; i++) - materials[i] = Material.StoneBrickStairs; - for (int i = 16835; i <= 17158; i++) - materials[i] = Material.StoneBrickWall; - materials[6780] = Material.StoneBricks; - for (int i = 5926; i <= 5949; i++) - materials[i] = Material.StoneButton; - for (int i = 5826; i <= 5827; i++) - materials[i] = Material.StonePressurePlate; - for (int i = 12117; i <= 12122; i++) - materials[i] = Material.StoneSlab; - for (int i = 14497; i <= 14576; i++) - materials[i] = Material.StoneStairs; - for (int i = 19522; i <= 19525; i++) - materials[i] = Material.Stonecutter; - for (int i = 180; i <= 182; i++) - materials[i] = Material.StrippedAcaciaLog; - for (int i = 237; i <= 239; i++) - materials[i] = Material.StrippedAcaciaWood; - for (int i = 198; i <= 200; i++) - materials[i] = Material.StrippedBambooBlock; - for (int i = 174; i <= 176; i++) - materials[i] = Material.StrippedBirchLog; - for (int i = 231; i <= 233; i++) - materials[i] = Material.StrippedBirchWood; - for (int i = 183; i <= 185; i++) - materials[i] = Material.StrippedCherryLog; - for (int i = 240; i <= 242; i++) - materials[i] = Material.StrippedCherryWood; - for (int i = 19660; i <= 19662; i++) - materials[i] = Material.StrippedCrimsonHyphae; - for (int i = 19654; i <= 19656; i++) - materials[i] = Material.StrippedCrimsonStem; - for (int i = 186; i <= 188; i++) - materials[i] = Material.StrippedDarkOakLog; - for (int i = 243; i <= 245; i++) - materials[i] = Material.StrippedDarkOakWood; - for (int i = 177; i <= 179; i++) - materials[i] = Material.StrippedJungleLog; - for (int i = 234; i <= 236; i++) - materials[i] = Material.StrippedJungleWood; - for (int i = 195; i <= 197; i++) - materials[i] = Material.StrippedMangroveLog; - for (int i = 249; i <= 251; i++) - materials[i] = Material.StrippedMangroveWood; - for (int i = 192; i <= 194; i++) - materials[i] = Material.StrippedOakLog; - for (int i = 225; i <= 227; i++) - materials[i] = Material.StrippedOakWood; - for (int i = 189; i <= 191; i++) - materials[i] = Material.StrippedPaleOakLog; - for (int i = 246; i <= 248; i++) - materials[i] = Material.StrippedPaleOakWood; - for (int i = 171; i <= 173; i++) - materials[i] = Material.StrippedSpruceLog; - for (int i = 228; i <= 230; i++) - materials[i] = Material.StrippedSpruceWood; - for (int i = 19643; i <= 19645; i++) - materials[i] = Material.StrippedWarpedHyphae; - for (int i = 19637; i <= 19639; i++) - materials[i] = Material.StrippedWarpedStem; - for (int i = 20411; i <= 20414; i++) - materials[i] = Material.StructureBlock; - materials[13572] = Material.StructureVoid; - for (int i = 5978; i <= 5993; i++) - materials[i] = Material.SugarCane; - for (int i = 11636; i <= 11637; i++) - materials[i] = Material.Sunflower; - for (int i = 125; i <= 128; i++) - materials[i] = Material.SuspiciousGravel; - for (int i = 119; i <= 122; i++) - materials[i] = Material.SuspiciousSand; - for (int i = 19630; i <= 19633; i++) - materials[i] = Material.SweetBerryBush; - materials[2053] = Material.TallDryGrass; - for (int i = 11644; i <= 11645; i++) - materials[i] = Material.TallGrass; - for (int i = 2055; i <= 2056; i++) - materials[i] = Material.TallSeagrass; - for (int i = 20441; i <= 20456; i++) - materials[i] = Material.Target; - materials[11633] = Material.Terracotta; - for (int i = 20427; i <= 20430; i++) - materials[i] = Material.TestBlock; - materials[20431] = Material.TestInstanceBlock; - materials[23377] = Material.TintedGlass; - for (int i = 2140; i <= 2141; i++) - materials[i] = Material.Tnt; - materials[2401] = Material.Torch; - materials[2122] = Material.Torchflower; - for (int i = 13518; i <= 13519; i++) - materials[i] = Material.TorchflowerCrop; - for (int i = 9928; i <= 9951; i++) - materials[i] = Material.TrappedChest; - for (int i = 27730; i <= 27741; i++) - materials[i] = Material.TrialSpawner; - for (int i = 8321; i <= 8448; i++) - materials[i] = Material.Tripwire; - for (int i = 8305; i <= 8320; i++) - materials[i] = Material.TripwireHook; - for (int i = 13878; i <= 13879; i++) - materials[i] = Material.TubeCoral; - materials[13863] = Material.TubeCoralBlock; - for (int i = 13898; i <= 13899; i++) - materials[i] = Material.TubeCoralFan; - for (int i = 13948; i <= 13955; i++) - materials[i] = Material.TubeCoralWallFan; - materials[22141] = Material.Tuff; - for (int i = 22965; i <= 22970; i++) - materials[i] = Material.TuffBrickSlab; - for (int i = 22971; i <= 23050; i++) - materials[i] = Material.TuffBrickStairs; - for (int i = 23051; i <= 23374; i++) - materials[i] = Material.TuffBrickWall; - materials[22964] = Material.TuffBricks; - for (int i = 22142; i <= 22147; i++) - materials[i] = Material.TuffSlab; - for (int i = 22148; i <= 22227; i++) - materials[i] = Material.TuffStairs; - for (int i = 22228; i <= 22551; i++) - materials[i] = Material.TuffWall; - for (int i = 13811; i <= 13822; i++) - materials[i] = Material.TurtleEgg; - for (int i = 19693; i <= 19718; i++) - materials[i] = Material.TwistingVines; - materials[19719] = Material.TwistingVinesPlant; - for (int i = 27742; i <= 27773; i++) - materials[i] = Material.Vault; - for (int i = 27658; i <= 27660; i++) - materials[i] = Material.VerdantFroglight; - for (int i = 7080; i <= 7111; i++) - materials[i] = Material.Vine; - materials[14013] = Material.VoidAir; - for (int i = 2402; i <= 2405; i++) - materials[i] = Material.WallTorch; - for (int i = 20179; i <= 20202; i++) - materials[i] = Material.WarpedButton; - for (int i = 20267; i <= 20330; i++) - materials[i] = Material.WarpedDoor; - for (int i = 19771; i <= 19802; i++) - materials[i] = Material.WarpedFence; - for (int i = 19963; i <= 19994; i++) - materials[i] = Material.WarpedFenceGate; - materials[19647] = Material.WarpedFungus; - for (int i = 5514; i <= 5577; i++) - materials[i] = Material.WarpedHangingSign; - for (int i = 19640; i <= 19642; i++) - materials[i] = Material.WarpedHyphae; - materials[19646] = Material.WarpedNylium; - materials[19722] = Material.WarpedPlanks; - for (int i = 19737; i <= 19738; i++) - materials[i] = Material.WarpedPressurePlate; - materials[19649] = Material.WarpedRoots; - for (int i = 20363; i <= 20394; i++) - materials[i] = Material.WarpedSign; - for (int i = 19729; i <= 19734; i++) - materials[i] = Material.WarpedSlab; - for (int i = 20075; i <= 20154; i++) - materials[i] = Material.WarpedStairs; - for (int i = 19634; i <= 19636; i++) - materials[i] = Material.WarpedStem; - for (int i = 19867; i <= 19930; i++) - materials[i] = Material.WarpedTrapdoor; - for (int i = 5786; i <= 5793; i++) - materials[i] = Material.WarpedWallHangingSign; - for (int i = 20403; i <= 20410; i++) - materials[i] = Material.WarpedWallSign; - materials[19648] = Material.WarpedWartBlock; - for (int i = 86; i <= 101; i++) - materials[i] = Material.Water; - for (int i = 8183; i <= 8185; i++) - materials[i] = Material.WaterCauldron; - materials[24015] = Material.WaxedChiseledCopper; - materials[24360] = Material.WaxedCopperBlock; - for (int i = 25768; i <= 25771; i++) - materials[i] = Material.WaxedCopperBulb; - for (int i = 24968; i <= 25031; i++) - materials[i] = Material.WaxedCopperDoor; - for (int i = 25744; i <= 25745; i++) - materials[i] = Material.WaxedCopperGrate; - for (int i = 25480; i <= 25543; i++) - materials[i] = Material.WaxedCopperTrapdoor; - materials[24367] = Material.WaxedCutCopper; - for (int i = 24706; i <= 24711; i++) - materials[i] = Material.WaxedCutCopperSlab; - for (int i = 24608; i <= 24687; i++) - materials[i] = Material.WaxedCutCopperStairs; - materials[24014] = Material.WaxedExposedChiseledCopper; - materials[24362] = Material.WaxedExposedCopper; - for (int i = 25772; i <= 25775; i++) - materials[i] = Material.WaxedExposedCopperBulb; - for (int i = 25032; i <= 25095; i++) - materials[i] = Material.WaxedExposedCopperDoor; - for (int i = 25746; i <= 25747; i++) - materials[i] = Material.WaxedExposedCopperGrate; - for (int i = 25544; i <= 25607; i++) - materials[i] = Material.WaxedExposedCopperTrapdoor; - materials[24366] = Material.WaxedExposedCutCopper; - for (int i = 24700; i <= 24705; i++) - materials[i] = Material.WaxedExposedCutCopperSlab; - for (int i = 24528; i <= 24607; i++) - materials[i] = Material.WaxedExposedCutCopperStairs; - materials[24012] = Material.WaxedOxidizedChiseledCopper; - materials[24363] = Material.WaxedOxidizedCopper; - for (int i = 25780; i <= 25783; i++) - materials[i] = Material.WaxedOxidizedCopperBulb; - for (int i = 25096; i <= 25159; i++) - materials[i] = Material.WaxedOxidizedCopperDoor; - for (int i = 25750; i <= 25751; i++) - materials[i] = Material.WaxedOxidizedCopperGrate; - for (int i = 25608; i <= 25671; i++) - materials[i] = Material.WaxedOxidizedCopperTrapdoor; - materials[24364] = Material.WaxedOxidizedCutCopper; - for (int i = 24688; i <= 24693; i++) - materials[i] = Material.WaxedOxidizedCutCopperSlab; - for (int i = 24368; i <= 24447; i++) - materials[i] = Material.WaxedOxidizedCutCopperStairs; - materials[24013] = Material.WaxedWeatheredChiseledCopper; - materials[24361] = Material.WaxedWeatheredCopper; - for (int i = 25776; i <= 25779; i++) - materials[i] = Material.WaxedWeatheredCopperBulb; - for (int i = 25160; i <= 25223; i++) - materials[i] = Material.WaxedWeatheredCopperDoor; - for (int i = 25748; i <= 25749; i++) - materials[i] = Material.WaxedWeatheredCopperGrate; - for (int i = 25672; i <= 25735; i++) - materials[i] = Material.WaxedWeatheredCopperTrapdoor; - materials[24365] = Material.WaxedWeatheredCutCopper; - for (int i = 24694; i <= 24699; i++) - materials[i] = Material.WaxedWeatheredCutCopperSlab; - for (int i = 24448; i <= 24527; i++) - materials[i] = Material.WaxedWeatheredCutCopperStairs; - materials[24009] = Material.WeatheredChiseledCopper; - materials[24000] = Material.WeatheredCopper; - for (int i = 25760; i <= 25763; i++) - materials[i] = Material.WeatheredCopperBulb; - for (int i = 24904; i <= 24967; i++) - materials[i] = Material.WeatheredCopperDoor; - for (int i = 25740; i <= 25741; i++) - materials[i] = Material.WeatheredCopperGrate; - for (int i = 25416; i <= 25479; i++) - materials[i] = Material.WeatheredCopperTrapdoor; - materials[24005] = Material.WeatheredCutCopper; - for (int i = 24342; i <= 24347; i++) - materials[i] = Material.WeatheredCutCopperSlab; - for (int i = 24096; i <= 24175; i++) - materials[i] = Material.WeatheredCutCopperStairs; - for (int i = 19666; i <= 19691; i++) - materials[i] = Material.WeepingVines; - materials[19692] = Material.WeepingVinesPlant; - materials[561] = Material.WetSponge; - for (int i = 4342; i <= 4349; i++) - materials[i] = Material.Wheat; - for (int i = 11648; i <= 11663; i++) - materials[i] = Material.WhiteBanner; - for (int i = 1731; i <= 1746; i++) - materials[i] = Material.WhiteBed; - for (int i = 21801; i <= 21816; i++) - materials[i] = Material.WhiteCandle; - for (int i = 22059; i <= 22060; i++) - materials[i] = Material.WhiteCandleCake; - materials[11617] = Material.WhiteCarpet; - materials[13751] = Material.WhiteConcrete; - materials[13767] = Material.WhiteConcretePowder; - for (int i = 13687; i <= 13690; i++) - materials[i] = Material.WhiteGlazedTerracotta; - for (int i = 13591; i <= 13596; i++) - materials[i] = Material.WhiteShulkerBox; - materials[6124] = Material.WhiteStainedGlass; - for (int i = 10181; i <= 10212; i++) - materials[i] = Material.WhiteStainedGlassPane; - materials[10165] = Material.WhiteTerracotta; - materials[2129] = Material.WhiteTulip; - for (int i = 11904; i <= 11907; i++) - materials[i] = Material.WhiteWallBanner; - materials[2093] = Material.WhiteWool; - for (int i = 25903; i <= 25918; i++) - materials[i] = Material.Wildflowers; - materials[2133] = Material.WitherRose; - for (int i = 9676; i <= 9707; i++) - materials[i] = Material.WitherSkeletonSkull; - for (int i = 9708; i <= 9715; i++) - materials[i] = Material.WitherSkeletonWallSkull; - for (int i = 11712; i <= 11727; i++) - materials[i] = Material.YellowBanner; - for (int i = 1795; i <= 1810; i++) - materials[i] = Material.YellowBed; - for (int i = 21865; i <= 21880; i++) - materials[i] = Material.YellowCandle; - for (int i = 22067; i <= 22068; i++) - materials[i] = Material.YellowCandleCake; - materials[11621] = Material.YellowCarpet; - materials[13755] = Material.YellowConcrete; - materials[13771] = Material.YellowConcretePowder; - for (int i = 13703; i <= 13706; i++) - materials[i] = Material.YellowGlazedTerracotta; - for (int i = 13615; i <= 13620; i++) - materials[i] = Material.YellowShulkerBox; - materials[6128] = Material.YellowStainedGlass; - for (int i = 10309; i <= 10340; i++) - materials[i] = Material.YellowStainedGlassPane; - materials[10169] = Material.YellowTerracotta; - for (int i = 11920; i <= 11923; i++) - materials[i] = Material.YellowWallBanner; - materials[2097] = Material.YellowWool; - for (int i = 9716; i <= 9747; i++) - materials[i] = Material.ZombieHead; - for (int i = 9748; i <= 9755; i++) - materials[i] = Material.ZombieWallHead; - } - - // - private static readonly BlockStateDefinition[] stateDefinitions = - [ - new(8, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(12, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(22, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(29, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(31, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(33, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(35, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(37, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(39, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(41, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(43, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(45, 40, - [ - new("age", ["0", "1", "2", "3", "4"], 8), - new("hanging", ["true", "false"], 4), - new("stage", ["0", "1"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(86, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(102, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(119, 4, - [ - new("dusted", ["0", "1", "2", "3"], 1) - ]), - new(125, 4, - [ - new("dusted", ["0", "1", "2", "3"], 1) - ]), - new(136, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(139, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(142, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(145, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(148, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(151, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(154, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(157, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(160, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(163, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(165, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(168, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(171, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(174, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(177, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(180, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(183, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(186, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(189, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(192, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(195, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(198, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(201, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(204, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(207, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(210, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(213, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(216, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(219, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(222, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(225, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(228, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(231, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(234, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(237, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(240, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(243, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(246, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(249, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(252, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(280, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(308, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(336, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(364, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(392, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(420, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(448, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(476, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(504, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(532, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(566, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(581, 1150, - [ - new("instrument", ["harp", "basedrum", "snare", "hat", "bass", "flute", "bell", "guitar", "chime", "xylophone", "iron_xylophone", "cow_bell", "didgeridoo", "bit", "banjo", "pling", "zombie", "skeleton", "creeper", "dragon", "wither_skeleton", "piglin", "custom_head"], 50), - new("note", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"], 2), - new("powered", ["true", "false"], 1) - ]), - new(1731, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1747, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1763, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1779, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1795, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1811, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1827, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1843, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1859, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1875, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1891, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1907, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1923, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1939, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1955, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1971, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1987, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2011, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2035, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(2055, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(2057, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(2069, 24, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("short", ["true", "false"], 2) - ]), - new(2109, 12, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 2) - ]), - new(2140, 2, - [ - new("unstable", ["true", "false"], 1) - ]), - new(2143, 256, - [ - new("facing", ["north", "south", "west", "east"], 64), - new("slot_0_occupied", ["true", "false"], 32), - new("slot_1_occupied", ["true", "false"], 16), - new("slot_2_occupied", ["true", "false"], 8), - new("slot_3_occupied", ["true", "false"], 4), - new("slot_4_occupied", ["true", "false"], 2), - new("slot_5_occupied", ["true", "false"], 1) - ]), - new(2402, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(2406, 512, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(2920, 18, - [ - new("axis", ["x", "y", "z"], 6), - new("creaking_heart_state", ["uprooted", "dormant", "awake"], 2), - new("natural", ["true", "false"], 1) - ]), - new(2938, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3018, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(3042, 1296, - [ - new("east", ["up", "side", "none"], 432), - new("north", ["up", "side", "none"], 144), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 9), - new("south", ["up", "side", "none"], 3), - new("west", ["up", "side", "none"], 1) - ]), - new(4342, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4350, 8, - [ - new("moisture", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(4358, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(4366, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4398, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4430, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4462, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4494, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4526, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4558, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4590, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4622, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4654, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4686, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(4750, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4758, 20, - [ - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south", "south_east", "south_west", "north_west", "north_east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4778, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4858, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4866, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4874, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4882, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4890, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4898, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4906, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4914, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4922, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4930, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(4938, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5002, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5066, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5130, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5194, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5258, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5322, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5386, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5450, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5514, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5578, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5642, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5706, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5714, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5722, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5730, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5738, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5746, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5754, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5762, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5770, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5778, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5786, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5794, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5802, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5826, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5828, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5892, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5894, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5896, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5898, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5900, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5902, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5904, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5906, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5908, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5910, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(5912, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5914, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5916, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(5918, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(5926, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5950, 8, - [ - new("layers", ["1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(5960, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5978, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(5994, 2, - [ - new("has_record", ["true", "false"], 1) - ]), - new(5996, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6031, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(6034, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(6038, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6043, 2, - [ - new("axis", ["x", "z"], 1) - ]), - new(6045, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6049, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6053, 7, - [ - new("bites", ["0", "1", "2", "3", "4", "5", "6"], 1) - ]), - new(6060, 64, - [ - new("delay", ["1", "2", "3", "4"], 16), - new("facing", ["north", "south", "west", "east"], 4), - new("locked", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6140, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6204, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6268, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6332, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6396, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6460, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6524, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6588, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6652, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6716, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6792, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6856, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6920, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6984, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7016, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7022, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7056, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7060, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7064, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(7072, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(7080, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7112, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7240, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7368, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7400, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7480, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7560, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7640, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(7645, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7725, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7731, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(8057, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8089, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8169, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(8174, 8, - [ - new("has_bottle_0", ["true", "false"], 4), - new("has_bottle_1", ["true", "false"], 2), - new("has_bottle_2", ["true", "false"], 1) - ]), - new(8183, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(8187, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(8191, 8, - [ - new("eye", ["true", "false"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8201, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(8203, 12, - [ - new("age", ["0", "1", "2"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8215, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8297, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8305, 16, - [ - new("attached", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8321, 128, - [ - new("attached", ["true", "false"], 64), - new("disarmed", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("powered", ["true", "false"], 4), - new("south", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8450, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8530, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8610, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8690, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(8703, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(9027, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(9380, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(9388, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(9396, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9420, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9444, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9468, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9492, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9516, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9540, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9564, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9588, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9612, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9636, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9668, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9676, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9708, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9716, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9748, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9756, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9788, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9796, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9828, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9836, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9868, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9876, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9908, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9916, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9920, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9924, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9928, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(9952, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9968, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(9984, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("mode", ["compare", "subtract"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10000, 32, - [ - new("inverted", ["true", "false"], 16), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10034, 10, - [ - new("enabled", ["true", "false"], 5), - new("facing", ["down", "north", "south", "west", "east"], 1) - ]), - new(10046, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(10049, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10129, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10153, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(10181, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10213, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10245, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10277, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10309, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10341, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10373, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10405, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10437, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10469, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10501, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10533, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10565, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10597, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10629, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10661, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(10693, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10773, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10853, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(10933, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11013, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11093, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11173, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11254, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(11256, 32, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11288, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11355, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11435, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11515, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11595, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11601, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11607, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11614, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(11636, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11638, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11640, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11642, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11644, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11646, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(11648, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11664, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11680, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11696, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11712, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11728, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11744, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11760, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11776, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11792, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11808, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11824, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11840, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11856, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11872, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11888, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11904, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11908, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11912, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11916, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11920, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11924, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11928, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11932, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11936, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11940, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11944, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11948, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11952, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11956, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11960, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11964, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11971, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12051, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12057, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12063, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12069, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12075, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12081, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12087, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12093, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12099, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12105, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12111, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12117, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12123, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12129, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12135, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12141, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12147, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12153, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12159, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12165, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12171, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12177, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12183, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12189, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12195, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12205, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12237, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12269, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12301, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12333, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12365, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12397, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12429, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12461, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12493, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12525, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12557, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12589, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12621, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12653, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12685, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12717, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12749, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(12781, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12845, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12909, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(12973, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13037, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13101, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13165, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13229, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13293, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13357, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13363, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13427, 6, - [ - new("age", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(13434, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(13437, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13518, 2, - [ - new("age", ["0", "1"], 1) - ]), - new(13520, 10, - [ - new("age", ["0", "1", "2", "3", "4"], 2), - new("half", ["upper", "lower"], 1) - ]), - new(13530, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(13532, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(13538, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13550, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13562, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(13569, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(13573, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13585, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13591, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13597, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13603, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13609, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13615, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13621, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13627, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13633, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13639, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13645, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13651, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13657, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13663, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13669, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13675, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13681, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(13687, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13691, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13695, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13699, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13703, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13707, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13711, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13715, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13719, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13723, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13727, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13731, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13735, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13739, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13743, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13747, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13783, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(13811, 12, - [ - new("eggs", ["1", "2", "3", "4"], 3), - new("hatch", ["0", "1", "2"], 1) - ]), - new(13823, 3, - [ - new("hatch", ["0", "1", "2"], 1) - ]), - new(13826, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("hydration", ["0", "1", "2", "3"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13868, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13870, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13872, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13874, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13876, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13878, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13880, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13882, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13884, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13886, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13888, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13890, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13892, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13894, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13896, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13898, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13900, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13902, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13904, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13906, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(13908, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13916, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13924, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13932, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13940, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13948, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13956, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13964, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13972, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13980, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13988, 8, - [ - new("pickles", ["1", "2", "3", "4"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13997, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(14000, 12, - [ - new("age", ["0", "1"], 6), - new("leaves", ["none", "small", "large"], 2), - new("stage", ["0", "1"], 1) - ]), - new(14015, 2, - [ - new("drag", ["true", "false"], 1) - ]), - new(14017, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14097, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14177, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14257, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14337, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14417, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14497, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14577, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14657, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14737, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14817, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14897, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14977, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15057, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15137, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15143, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15149, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15155, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15161, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15167, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15173, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15179, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15185, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15191, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15197, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15203, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15209, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15215, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15539, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(15863, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16187, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16511, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16835, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17159, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17483, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17807, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18131, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18455, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18779, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19103, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19427, 32, - [ - new("bottom", ["true", "false"], 16), - new("distance", ["0", "1", "2", "3", "4", "5", "6", "7"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19459, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(19463, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("open", ["true", "false"], 1) - ]), - new(19475, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(19483, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(19493, 12, - [ - new("face", ["floor", "wall", "ceiling"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(19505, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("has_book", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19522, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(19526, 32, - [ - new("attachment", ["floor", "ceiling", "single_wall", "double_wall"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19558, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19562, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19566, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19598, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19630, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(19634, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19637, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19640, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19643, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19651, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19654, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19657, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19660, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(19666, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(19693, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(19723, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19729, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19735, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(19737, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(19739, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(19771, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(19803, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19867, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(19931, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19963, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(19995, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20075, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20155, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20179, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20203, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20267, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20331, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20363, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20395, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20403, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20411, 4, - [ - new("mode", ["save", "load", "corner", "data"], 1) - ]), - new(20415, 12, - [ - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 1) - ]), - new(20427, 4, - [ - new("mode", ["start", "log", "fail", "accept"], 1) - ]), - new(20432, 9, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(20441, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(20457, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(20481, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(20510, 5, - [ - new("charges", ["0", "1", "2", "3", "4"], 1) - ]), - new(20521, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20601, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20925, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20935, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20941, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21021, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(21346, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21426, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21432, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(21434, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(21458, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(21785, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21801, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21817, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21833, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21849, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21865, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21881, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21897, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21913, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21929, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21945, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21961, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21977, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21993, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22009, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22025, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22041, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22057, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22059, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22061, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22063, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22065, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22067, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22069, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22071, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22073, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22075, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22077, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22079, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22081, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22083, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22085, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22087, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22089, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(22093, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22105, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22117, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22129, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22142, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22148, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22228, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(22553, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22559, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22639, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(22965, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22971, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23051, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(23379, 96, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23475, 384, - [ - new("facing", ["north", "south", "west", "east"], 96), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23860, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(23988, 2, - [ - new("bloom", ["true", "false"], 1) - ]), - new(23990, 8, - [ - new("can_summon", ["true", "false"], 4), - new("shrieking", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24016, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24096, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24176, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24256, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24336, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24342, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24348, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24354, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24368, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24448, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24528, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24608, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24688, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24694, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24700, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24706, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24712, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24776, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24840, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24904, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(24968, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25032, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25096, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25160, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25224, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25288, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25352, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25416, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25480, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25544, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25608, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25672, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25736, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25738, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25740, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25742, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25744, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25746, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25748, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25750, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25752, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25756, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25760, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25764, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25768, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25772, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25776, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25780, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25784, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25808, 20, - [ - new("thickness", ["tip_merge", "tip", "frustum", "middle", "base"], 4), - new("vertical_direction", ["up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25829, 52, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 2), - new("berries", ["true", "false"], 1) - ]), - new(25881, 2, - [ - new("berries", ["true", "false"], 1) - ]), - new(25887, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("flower_amount", ["1", "2", "3", "4"], 1) - ]), - new(25903, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("flower_amount", ["1", "2", "3", "4"], 1) - ]), - new(25919, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("segment_amount", ["1", "2", "3", "4"], 1) - ]), - new(25936, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("tilt", ["none", "unstable", "partial", "full"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25968, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25976, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("half", ["upper", "lower"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25992, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(25996, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(26000, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26080, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26086, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(26411, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26491, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26497, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(26822, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26902, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26908, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(27233, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27313, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27319, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(27646, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(27655, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(27658, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(27661, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(27666, 16, - [ - new("cracked", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27682, 48, - [ - new("crafting", ["true", "false"], 24), - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(27730, 12, - [ - new("ominous", ["true", "false"], 6), - new("trial_spawner_state", ["inactive", "waiting_for_players", "active", "waiting_for_reward_ejection", "ejecting_reward", "cooldown"], 1) - ]), - new(27742, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("ominous", ["true", "false"], 4), - new("vault_state", ["inactive", "active", "unlocking", "ejecting"], 1) - ]), - new(27774, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(27777, 162, - [ - new("bottom", ["true", "false"], 81), - new("east", ["none", "low", "tall"], 27), - new("north", ["none", "low", "tall"], 9), - new("south", ["none", "low", "tall"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(27939, 2, - [ - new("tip", ["true", "false"], 1) - ]), - ]; - // - - protected override Dictionary GetDict() - { - return materials; - } - - protected override BlockStateDefinition[] GetStateDefinitions() - { - return stateDefinitions; - } - } -} diff --git a/MinecraftClient/Mapping/BlockPalettes/Palette1219.cs b/MinecraftClient/Mapping/BlockPalettes/Palette1219.cs deleted file mode 100644 index 7ac2ce5809..0000000000 --- a/MinecraftClient/Mapping/BlockPalettes/Palette1219.cs +++ /dev/null @@ -1,6676 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.BlockPalettes -{ - public class Palette1219 : BlockPalette - { - private static readonly Dictionary materials = new(); - - static Palette1219() - { - for (int i = 0; i <= 0; i++) - materials[i] = Material.Air; - for (int i = 1; i <= 1; i++) - materials[i] = Material.Stone; - for (int i = 2; i <= 2; i++) - materials[i] = Material.Granite; - for (int i = 3; i <= 3; i++) - materials[i] = Material.PolishedGranite; - for (int i = 4; i <= 4; i++) - materials[i] = Material.Diorite; - for (int i = 5; i <= 5; i++) - materials[i] = Material.PolishedDiorite; - for (int i = 6; i <= 6; i++) - materials[i] = Material.Andesite; - for (int i = 7; i <= 7; i++) - materials[i] = Material.PolishedAndesite; - for (int i = 8; i <= 9; i++) - materials[i] = Material.GrassBlock; - for (int i = 10; i <= 10; i++) - materials[i] = Material.Dirt; - for (int i = 11; i <= 11; i++) - materials[i] = Material.CoarseDirt; - for (int i = 12; i <= 13; i++) - materials[i] = Material.Podzol; - for (int i = 14; i <= 14; i++) - materials[i] = Material.Cobblestone; - for (int i = 15; i <= 15; i++) - materials[i] = Material.OakPlanks; - for (int i = 16; i <= 16; i++) - materials[i] = Material.SprucePlanks; - for (int i = 17; i <= 17; i++) - materials[i] = Material.BirchPlanks; - for (int i = 18; i <= 18; i++) - materials[i] = Material.JunglePlanks; - for (int i = 19; i <= 19; i++) - materials[i] = Material.AcaciaPlanks; - for (int i = 20; i <= 20; i++) - materials[i] = Material.CherryPlanks; - for (int i = 21; i <= 21; i++) - materials[i] = Material.DarkOakPlanks; - for (int i = 22; i <= 24; i++) - materials[i] = Material.PaleOakWood; - for (int i = 25; i <= 25; i++) - materials[i] = Material.PaleOakPlanks; - for (int i = 26; i <= 26; i++) - materials[i] = Material.MangrovePlanks; - for (int i = 27; i <= 27; i++) - materials[i] = Material.BambooPlanks; - for (int i = 28; i <= 28; i++) - materials[i] = Material.BambooMosaic; - for (int i = 29; i <= 30; i++) - materials[i] = Material.OakSapling; - for (int i = 31; i <= 32; i++) - materials[i] = Material.SpruceSapling; - for (int i = 33; i <= 34; i++) - materials[i] = Material.BirchSapling; - for (int i = 35; i <= 36; i++) - materials[i] = Material.JungleSapling; - for (int i = 37; i <= 38; i++) - materials[i] = Material.AcaciaSapling; - for (int i = 39; i <= 40; i++) - materials[i] = Material.CherrySapling; - for (int i = 41; i <= 42; i++) - materials[i] = Material.DarkOakSapling; - for (int i = 43; i <= 44; i++) - materials[i] = Material.PaleOakSapling; - for (int i = 45; i <= 84; i++) - materials[i] = Material.MangrovePropagule; - for (int i = 85; i <= 85; i++) - materials[i] = Material.Bedrock; - for (int i = 86; i <= 101; i++) - materials[i] = Material.Water; - for (int i = 102; i <= 117; i++) - materials[i] = Material.Lava; - for (int i = 118; i <= 118; i++) - materials[i] = Material.Sand; - for (int i = 119; i <= 122; i++) - materials[i] = Material.SuspiciousSand; - for (int i = 123; i <= 123; i++) - materials[i] = Material.RedSand; - for (int i = 124; i <= 124; i++) - materials[i] = Material.Gravel; - for (int i = 125; i <= 128; i++) - materials[i] = Material.SuspiciousGravel; - for (int i = 129; i <= 129; i++) - materials[i] = Material.GoldOre; - for (int i = 130; i <= 130; i++) - materials[i] = Material.DeepslateGoldOre; - for (int i = 131; i <= 131; i++) - materials[i] = Material.IronOre; - for (int i = 132; i <= 132; i++) - materials[i] = Material.DeepslateIronOre; - for (int i = 133; i <= 133; i++) - materials[i] = Material.CoalOre; - for (int i = 134; i <= 134; i++) - materials[i] = Material.DeepslateCoalOre; - for (int i = 135; i <= 135; i++) - materials[i] = Material.NetherGoldOre; - for (int i = 136; i <= 138; i++) - materials[i] = Material.OakLog; - for (int i = 139; i <= 141; i++) - materials[i] = Material.SpruceLog; - for (int i = 142; i <= 144; i++) - materials[i] = Material.BirchLog; - for (int i = 145; i <= 147; i++) - materials[i] = Material.JungleLog; - for (int i = 148; i <= 150; i++) - materials[i] = Material.AcaciaLog; - for (int i = 151; i <= 153; i++) - materials[i] = Material.CherryLog; - for (int i = 154; i <= 156; i++) - materials[i] = Material.DarkOakLog; - for (int i = 157; i <= 159; i++) - materials[i] = Material.PaleOakLog; - for (int i = 160; i <= 162; i++) - materials[i] = Material.MangroveLog; - for (int i = 163; i <= 164; i++) - materials[i] = Material.MangroveRoots; - for (int i = 165; i <= 167; i++) - materials[i] = Material.MuddyMangroveRoots; - for (int i = 168; i <= 170; i++) - materials[i] = Material.BambooBlock; - for (int i = 171; i <= 173; i++) - materials[i] = Material.StrippedSpruceLog; - for (int i = 174; i <= 176; i++) - materials[i] = Material.StrippedBirchLog; - for (int i = 177; i <= 179; i++) - materials[i] = Material.StrippedJungleLog; - for (int i = 180; i <= 182; i++) - materials[i] = Material.StrippedAcaciaLog; - for (int i = 183; i <= 185; i++) - materials[i] = Material.StrippedCherryLog; - for (int i = 186; i <= 188; i++) - materials[i] = Material.StrippedDarkOakLog; - for (int i = 189; i <= 191; i++) - materials[i] = Material.StrippedPaleOakLog; - for (int i = 192; i <= 194; i++) - materials[i] = Material.StrippedOakLog; - for (int i = 195; i <= 197; i++) - materials[i] = Material.StrippedMangroveLog; - for (int i = 198; i <= 200; i++) - materials[i] = Material.StrippedBambooBlock; - for (int i = 201; i <= 203; i++) - materials[i] = Material.OakWood; - for (int i = 204; i <= 206; i++) - materials[i] = Material.SpruceWood; - for (int i = 207; i <= 209; i++) - materials[i] = Material.BirchWood; - for (int i = 210; i <= 212; i++) - materials[i] = Material.JungleWood; - for (int i = 213; i <= 215; i++) - materials[i] = Material.AcaciaWood; - for (int i = 216; i <= 218; i++) - materials[i] = Material.CherryWood; - for (int i = 219; i <= 221; i++) - materials[i] = Material.DarkOakWood; - for (int i = 222; i <= 224; i++) - materials[i] = Material.MangroveWood; - for (int i = 225; i <= 227; i++) - materials[i] = Material.StrippedOakWood; - for (int i = 228; i <= 230; i++) - materials[i] = Material.StrippedSpruceWood; - for (int i = 231; i <= 233; i++) - materials[i] = Material.StrippedBirchWood; - for (int i = 234; i <= 236; i++) - materials[i] = Material.StrippedJungleWood; - for (int i = 237; i <= 239; i++) - materials[i] = Material.StrippedAcaciaWood; - for (int i = 240; i <= 242; i++) - materials[i] = Material.StrippedCherryWood; - for (int i = 243; i <= 245; i++) - materials[i] = Material.StrippedDarkOakWood; - for (int i = 246; i <= 248; i++) - materials[i] = Material.StrippedPaleOakWood; - for (int i = 249; i <= 251; i++) - materials[i] = Material.StrippedMangroveWood; - for (int i = 252; i <= 279; i++) - materials[i] = Material.OakLeaves; - for (int i = 280; i <= 307; i++) - materials[i] = Material.SpruceLeaves; - for (int i = 308; i <= 335; i++) - materials[i] = Material.BirchLeaves; - for (int i = 336; i <= 363; i++) - materials[i] = Material.JungleLeaves; - for (int i = 364; i <= 391; i++) - materials[i] = Material.AcaciaLeaves; - for (int i = 392; i <= 419; i++) - materials[i] = Material.CherryLeaves; - for (int i = 420; i <= 447; i++) - materials[i] = Material.DarkOakLeaves; - for (int i = 448; i <= 475; i++) - materials[i] = Material.PaleOakLeaves; - for (int i = 476; i <= 503; i++) - materials[i] = Material.MangroveLeaves; - for (int i = 504; i <= 531; i++) - materials[i] = Material.AzaleaLeaves; - for (int i = 532; i <= 559; i++) - materials[i] = Material.FloweringAzaleaLeaves; - for (int i = 560; i <= 560; i++) - materials[i] = Material.Sponge; - for (int i = 561; i <= 561; i++) - materials[i] = Material.WetSponge; - for (int i = 562; i <= 562; i++) - materials[i] = Material.Glass; - for (int i = 563; i <= 563; i++) - materials[i] = Material.LapisOre; - for (int i = 564; i <= 564; i++) - materials[i] = Material.DeepslateLapisOre; - for (int i = 565; i <= 565; i++) - materials[i] = Material.LapisBlock; - for (int i = 566; i <= 577; i++) - materials[i] = Material.Dispenser; - for (int i = 578; i <= 578; i++) - materials[i] = Material.Sandstone; - for (int i = 579; i <= 579; i++) - materials[i] = Material.ChiseledSandstone; - for (int i = 580; i <= 580; i++) - materials[i] = Material.CutSandstone; - for (int i = 581; i <= 1730; i++) - materials[i] = Material.NoteBlock; - for (int i = 1731; i <= 1746; i++) - materials[i] = Material.WhiteBed; - for (int i = 1747; i <= 1762; i++) - materials[i] = Material.OrangeBed; - for (int i = 1763; i <= 1778; i++) - materials[i] = Material.MagentaBed; - for (int i = 1779; i <= 1794; i++) - materials[i] = Material.LightBlueBed; - for (int i = 1795; i <= 1810; i++) - materials[i] = Material.YellowBed; - for (int i = 1811; i <= 1826; i++) - materials[i] = Material.LimeBed; - for (int i = 1827; i <= 1842; i++) - materials[i] = Material.PinkBed; - for (int i = 1843; i <= 1858; i++) - materials[i] = Material.GrayBed; - for (int i = 1859; i <= 1874; i++) - materials[i] = Material.LightGrayBed; - for (int i = 1875; i <= 1890; i++) - materials[i] = Material.CyanBed; - for (int i = 1891; i <= 1906; i++) - materials[i] = Material.PurpleBed; - for (int i = 1907; i <= 1922; i++) - materials[i] = Material.BlueBed; - for (int i = 1923; i <= 1938; i++) - materials[i] = Material.BrownBed; - for (int i = 1939; i <= 1954; i++) - materials[i] = Material.GreenBed; - for (int i = 1955; i <= 1970; i++) - materials[i] = Material.RedBed; - for (int i = 1971; i <= 1986; i++) - materials[i] = Material.BlackBed; - for (int i = 1987; i <= 2010; i++) - materials[i] = Material.PoweredRail; - for (int i = 2011; i <= 2034; i++) - materials[i] = Material.DetectorRail; - for (int i = 2035; i <= 2046; i++) - materials[i] = Material.StickyPiston; - for (int i = 2047; i <= 2047; i++) - materials[i] = Material.Cobweb; - for (int i = 2048; i <= 2048; i++) - materials[i] = Material.ShortGrass; - for (int i = 2049; i <= 2049; i++) - materials[i] = Material.Fern; - for (int i = 2050; i <= 2050; i++) - materials[i] = Material.DeadBush; - for (int i = 2051; i <= 2051; i++) - materials[i] = Material.Bush; - for (int i = 2052; i <= 2052; i++) - materials[i] = Material.ShortDryGrass; - for (int i = 2053; i <= 2053; i++) - materials[i] = Material.TallDryGrass; - for (int i = 2054; i <= 2054; i++) - materials[i] = Material.Seagrass; - for (int i = 2055; i <= 2056; i++) - materials[i] = Material.TallSeagrass; - for (int i = 2057; i <= 2068; i++) - materials[i] = Material.Piston; - for (int i = 2069; i <= 2092; i++) - materials[i] = Material.PistonHead; - for (int i = 2093; i <= 2093; i++) - materials[i] = Material.WhiteWool; - for (int i = 2094; i <= 2094; i++) - materials[i] = Material.OrangeWool; - for (int i = 2095; i <= 2095; i++) - materials[i] = Material.MagentaWool; - for (int i = 2096; i <= 2096; i++) - materials[i] = Material.LightBlueWool; - for (int i = 2097; i <= 2097; i++) - materials[i] = Material.YellowWool; - for (int i = 2098; i <= 2098; i++) - materials[i] = Material.LimeWool; - for (int i = 2099; i <= 2099; i++) - materials[i] = Material.PinkWool; - for (int i = 2100; i <= 2100; i++) - materials[i] = Material.GrayWool; - for (int i = 2101; i <= 2101; i++) - materials[i] = Material.LightGrayWool; - for (int i = 2102; i <= 2102; i++) - materials[i] = Material.CyanWool; - for (int i = 2103; i <= 2103; i++) - materials[i] = Material.PurpleWool; - for (int i = 2104; i <= 2104; i++) - materials[i] = Material.BlueWool; - for (int i = 2105; i <= 2105; i++) - materials[i] = Material.BrownWool; - for (int i = 2106; i <= 2106; i++) - materials[i] = Material.GreenWool; - for (int i = 2107; i <= 2107; i++) - materials[i] = Material.RedWool; - for (int i = 2108; i <= 2108; i++) - materials[i] = Material.BlackWool; - for (int i = 2109; i <= 2120; i++) - materials[i] = Material.MovingPiston; - for (int i = 2121; i <= 2121; i++) - materials[i] = Material.Dandelion; - for (int i = 2122; i <= 2122; i++) - materials[i] = Material.Torchflower; - for (int i = 2123; i <= 2123; i++) - materials[i] = Material.Poppy; - for (int i = 2124; i <= 2124; i++) - materials[i] = Material.BlueOrchid; - for (int i = 2125; i <= 2125; i++) - materials[i] = Material.Allium; - for (int i = 2126; i <= 2126; i++) - materials[i] = Material.AzureBluet; - for (int i = 2127; i <= 2127; i++) - materials[i] = Material.RedTulip; - for (int i = 2128; i <= 2128; i++) - materials[i] = Material.OrangeTulip; - for (int i = 2129; i <= 2129; i++) - materials[i] = Material.WhiteTulip; - for (int i = 2130; i <= 2130; i++) - materials[i] = Material.PinkTulip; - for (int i = 2131; i <= 2131; i++) - materials[i] = Material.OxeyeDaisy; - for (int i = 2132; i <= 2132; i++) - materials[i] = Material.Cornflower; - for (int i = 2133; i <= 2133; i++) - materials[i] = Material.WitherRose; - for (int i = 2134; i <= 2134; i++) - materials[i] = Material.LilyOfTheValley; - for (int i = 2135; i <= 2135; i++) - materials[i] = Material.BrownMushroom; - for (int i = 2136; i <= 2136; i++) - materials[i] = Material.RedMushroom; - for (int i = 2137; i <= 2137; i++) - materials[i] = Material.GoldBlock; - for (int i = 2138; i <= 2138; i++) - materials[i] = Material.IronBlock; - for (int i = 2139; i <= 2139; i++) - materials[i] = Material.Bricks; - for (int i = 2140; i <= 2141; i++) - materials[i] = Material.Tnt; - for (int i = 2142; i <= 2142; i++) - materials[i] = Material.Bookshelf; - for (int i = 2143; i <= 2398; i++) - materials[i] = Material.ChiseledBookshelf; - for (int i = 2399; i <= 2462; i++) - materials[i] = Material.AcaciaShelf; - for (int i = 2463; i <= 2526; i++) - materials[i] = Material.BambooShelf; - for (int i = 2527; i <= 2590; i++) - materials[i] = Material.BirchShelf; - for (int i = 2591; i <= 2654; i++) - materials[i] = Material.CherryShelf; - for (int i = 2655; i <= 2718; i++) - materials[i] = Material.CrimsonShelf; - for (int i = 2719; i <= 2782; i++) - materials[i] = Material.DarkOakShelf; - for (int i = 2783; i <= 2846; i++) - materials[i] = Material.JungleShelf; - for (int i = 2847; i <= 2910; i++) - materials[i] = Material.MangroveShelf; - for (int i = 2911; i <= 2974; i++) - materials[i] = Material.OakShelf; - for (int i = 2975; i <= 3038; i++) - materials[i] = Material.PaleOakShelf; - for (int i = 3039; i <= 3102; i++) - materials[i] = Material.SpruceShelf; - for (int i = 3103; i <= 3166; i++) - materials[i] = Material.WarpedShelf; - for (int i = 3167; i <= 3167; i++) - materials[i] = Material.MossyCobblestone; - for (int i = 3168; i <= 3168; i++) - materials[i] = Material.Obsidian; - for (int i = 3169; i <= 3169; i++) - materials[i] = Material.Torch; - for (int i = 3170; i <= 3173; i++) - materials[i] = Material.WallTorch; - for (int i = 3174; i <= 3685; i++) - materials[i] = Material.Fire; - for (int i = 3686; i <= 3686; i++) - materials[i] = Material.SoulFire; - for (int i = 3687; i <= 3687; i++) - materials[i] = Material.Spawner; - for (int i = 3688; i <= 3705; i++) - materials[i] = Material.CreakingHeart; - for (int i = 3706; i <= 3785; i++) - materials[i] = Material.OakStairs; - for (int i = 3786; i <= 3809; i++) - materials[i] = Material.Chest; - for (int i = 3810; i <= 5105; i++) - materials[i] = Material.RedstoneWire; - for (int i = 5106; i <= 5106; i++) - materials[i] = Material.DiamondOre; - for (int i = 5107; i <= 5107; i++) - materials[i] = Material.DeepslateDiamondOre; - for (int i = 5108; i <= 5108; i++) - materials[i] = Material.DiamondBlock; - for (int i = 5109; i <= 5109; i++) - materials[i] = Material.CraftingTable; - for (int i = 5110; i <= 5117; i++) - materials[i] = Material.Wheat; - for (int i = 5118; i <= 5125; i++) - materials[i] = Material.Farmland; - for (int i = 5126; i <= 5133; i++) - materials[i] = Material.Furnace; - for (int i = 5134; i <= 5165; i++) - materials[i] = Material.OakSign; - for (int i = 5166; i <= 5197; i++) - materials[i] = Material.SpruceSign; - for (int i = 5198; i <= 5229; i++) - materials[i] = Material.BirchSign; - for (int i = 5230; i <= 5261; i++) - materials[i] = Material.AcaciaSign; - for (int i = 5262; i <= 5293; i++) - materials[i] = Material.CherrySign; - for (int i = 5294; i <= 5325; i++) - materials[i] = Material.JungleSign; - for (int i = 5326; i <= 5357; i++) - materials[i] = Material.DarkOakSign; - for (int i = 5358; i <= 5389; i++) - materials[i] = Material.PaleOakSign; - for (int i = 5390; i <= 5421; i++) - materials[i] = Material.MangroveSign; - for (int i = 5422; i <= 5453; i++) - materials[i] = Material.BambooSign; - for (int i = 5454; i <= 5517; i++) - materials[i] = Material.OakDoor; - for (int i = 5518; i <= 5525; i++) - materials[i] = Material.Ladder; - for (int i = 5526; i <= 5545; i++) - materials[i] = Material.Rail; - for (int i = 5546; i <= 5625; i++) - materials[i] = Material.CobblestoneStairs; - for (int i = 5626; i <= 5633; i++) - materials[i] = Material.OakWallSign; - for (int i = 5634; i <= 5641; i++) - materials[i] = Material.SpruceWallSign; - for (int i = 5642; i <= 5649; i++) - materials[i] = Material.BirchWallSign; - for (int i = 5650; i <= 5657; i++) - materials[i] = Material.AcaciaWallSign; - for (int i = 5658; i <= 5665; i++) - materials[i] = Material.CherryWallSign; - for (int i = 5666; i <= 5673; i++) - materials[i] = Material.JungleWallSign; - for (int i = 5674; i <= 5681; i++) - materials[i] = Material.DarkOakWallSign; - for (int i = 5682; i <= 5689; i++) - materials[i] = Material.PaleOakWallSign; - for (int i = 5690; i <= 5697; i++) - materials[i] = Material.MangroveWallSign; - for (int i = 5698; i <= 5705; i++) - materials[i] = Material.BambooWallSign; - for (int i = 5706; i <= 5769; i++) - materials[i] = Material.OakHangingSign; - for (int i = 5770; i <= 5833; i++) - materials[i] = Material.SpruceHangingSign; - for (int i = 5834; i <= 5897; i++) - materials[i] = Material.BirchHangingSign; - for (int i = 5898; i <= 5961; i++) - materials[i] = Material.AcaciaHangingSign; - for (int i = 5962; i <= 6025; i++) - materials[i] = Material.CherryHangingSign; - for (int i = 6026; i <= 6089; i++) - materials[i] = Material.JungleHangingSign; - for (int i = 6090; i <= 6153; i++) - materials[i] = Material.DarkOakHangingSign; - for (int i = 6154; i <= 6217; i++) - materials[i] = Material.PaleOakHangingSign; - for (int i = 6218; i <= 6281; i++) - materials[i] = Material.CrimsonHangingSign; - for (int i = 6282; i <= 6345; i++) - materials[i] = Material.WarpedHangingSign; - for (int i = 6346; i <= 6409; i++) - materials[i] = Material.MangroveHangingSign; - for (int i = 6410; i <= 6473; i++) - materials[i] = Material.BambooHangingSign; - for (int i = 6474; i <= 6481; i++) - materials[i] = Material.OakWallHangingSign; - for (int i = 6482; i <= 6489; i++) - materials[i] = Material.SpruceWallHangingSign; - for (int i = 6490; i <= 6497; i++) - materials[i] = Material.BirchWallHangingSign; - for (int i = 6498; i <= 6505; i++) - materials[i] = Material.AcaciaWallHangingSign; - for (int i = 6506; i <= 6513; i++) - materials[i] = Material.CherryWallHangingSign; - for (int i = 6514; i <= 6521; i++) - materials[i] = Material.JungleWallHangingSign; - for (int i = 6522; i <= 6529; i++) - materials[i] = Material.DarkOakWallHangingSign; - for (int i = 6530; i <= 6537; i++) - materials[i] = Material.PaleOakWallHangingSign; - for (int i = 6538; i <= 6545; i++) - materials[i] = Material.MangroveWallHangingSign; - for (int i = 6546; i <= 6553; i++) - materials[i] = Material.CrimsonWallHangingSign; - for (int i = 6554; i <= 6561; i++) - materials[i] = Material.WarpedWallHangingSign; - for (int i = 6562; i <= 6569; i++) - materials[i] = Material.BambooWallHangingSign; - for (int i = 6570; i <= 6593; i++) - materials[i] = Material.Lever; - for (int i = 6594; i <= 6595; i++) - materials[i] = Material.StonePressurePlate; - for (int i = 6596; i <= 6659; i++) - materials[i] = Material.IronDoor; - for (int i = 6660; i <= 6661; i++) - materials[i] = Material.OakPressurePlate; - for (int i = 6662; i <= 6663; i++) - materials[i] = Material.SprucePressurePlate; - for (int i = 6664; i <= 6665; i++) - materials[i] = Material.BirchPressurePlate; - for (int i = 6666; i <= 6667; i++) - materials[i] = Material.JunglePressurePlate; - for (int i = 6668; i <= 6669; i++) - materials[i] = Material.AcaciaPressurePlate; - for (int i = 6670; i <= 6671; i++) - materials[i] = Material.CherryPressurePlate; - for (int i = 6672; i <= 6673; i++) - materials[i] = Material.DarkOakPressurePlate; - for (int i = 6674; i <= 6675; i++) - materials[i] = Material.PaleOakPressurePlate; - for (int i = 6676; i <= 6677; i++) - materials[i] = Material.MangrovePressurePlate; - for (int i = 6678; i <= 6679; i++) - materials[i] = Material.BambooPressurePlate; - for (int i = 6680; i <= 6681; i++) - materials[i] = Material.RedstoneOre; - for (int i = 6682; i <= 6683; i++) - materials[i] = Material.DeepslateRedstoneOre; - for (int i = 6684; i <= 6685; i++) - materials[i] = Material.RedstoneTorch; - for (int i = 6686; i <= 6693; i++) - materials[i] = Material.RedstoneWallTorch; - for (int i = 6694; i <= 6717; i++) - materials[i] = Material.StoneButton; - for (int i = 6718; i <= 6725; i++) - materials[i] = Material.Snow; - for (int i = 6726; i <= 6726; i++) - materials[i] = Material.Ice; - for (int i = 6727; i <= 6727; i++) - materials[i] = Material.SnowBlock; - for (int i = 6728; i <= 6743; i++) - materials[i] = Material.Cactus; - for (int i = 6744; i <= 6744; i++) - materials[i] = Material.CactusFlower; - for (int i = 6745; i <= 6745; i++) - materials[i] = Material.Clay; - for (int i = 6746; i <= 6761; i++) - materials[i] = Material.SugarCane; - for (int i = 6762; i <= 6763; i++) - materials[i] = Material.Jukebox; - for (int i = 6764; i <= 6795; i++) - materials[i] = Material.OakFence; - for (int i = 6796; i <= 6796; i++) - materials[i] = Material.Netherrack; - for (int i = 6797; i <= 6797; i++) - materials[i] = Material.SoulSand; - for (int i = 6798; i <= 6798; i++) - materials[i] = Material.SoulSoil; - for (int i = 6799; i <= 6801; i++) - materials[i] = Material.Basalt; - for (int i = 6802; i <= 6804; i++) - materials[i] = Material.PolishedBasalt; - for (int i = 6805; i <= 6805; i++) - materials[i] = Material.SoulTorch; - for (int i = 6806; i <= 6809; i++) - materials[i] = Material.SoulWallTorch; - for (int i = 6810; i <= 6810; i++) - materials[i] = Material.CopperTorch; - for (int i = 6811; i <= 6814; i++) - materials[i] = Material.CopperWallTorch; - for (int i = 6815; i <= 6815; i++) - materials[i] = Material.Glowstone; - for (int i = 6816; i <= 6817; i++) - materials[i] = Material.NetherPortal; - for (int i = 6818; i <= 6821; i++) - materials[i] = Material.CarvedPumpkin; - for (int i = 6822; i <= 6825; i++) - materials[i] = Material.JackOLantern; - for (int i = 6826; i <= 6832; i++) - materials[i] = Material.Cake; - for (int i = 6833; i <= 6896; i++) - materials[i] = Material.Repeater; - for (int i = 6897; i <= 6897; i++) - materials[i] = Material.WhiteStainedGlass; - for (int i = 6898; i <= 6898; i++) - materials[i] = Material.OrangeStainedGlass; - for (int i = 6899; i <= 6899; i++) - materials[i] = Material.MagentaStainedGlass; - for (int i = 6900; i <= 6900; i++) - materials[i] = Material.LightBlueStainedGlass; - for (int i = 6901; i <= 6901; i++) - materials[i] = Material.YellowStainedGlass; - for (int i = 6902; i <= 6902; i++) - materials[i] = Material.LimeStainedGlass; - for (int i = 6903; i <= 6903; i++) - materials[i] = Material.PinkStainedGlass; - for (int i = 6904; i <= 6904; i++) - materials[i] = Material.GrayStainedGlass; - for (int i = 6905; i <= 6905; i++) - materials[i] = Material.LightGrayStainedGlass; - for (int i = 6906; i <= 6906; i++) - materials[i] = Material.CyanStainedGlass; - for (int i = 6907; i <= 6907; i++) - materials[i] = Material.PurpleStainedGlass; - for (int i = 6908; i <= 6908; i++) - materials[i] = Material.BlueStainedGlass; - for (int i = 6909; i <= 6909; i++) - materials[i] = Material.BrownStainedGlass; - for (int i = 6910; i <= 6910; i++) - materials[i] = Material.GreenStainedGlass; - for (int i = 6911; i <= 6911; i++) - materials[i] = Material.RedStainedGlass; - for (int i = 6912; i <= 6912; i++) - materials[i] = Material.BlackStainedGlass; - for (int i = 6913; i <= 6976; i++) - materials[i] = Material.OakTrapdoor; - for (int i = 6977; i <= 7040; i++) - materials[i] = Material.SpruceTrapdoor; - for (int i = 7041; i <= 7104; i++) - materials[i] = Material.BirchTrapdoor; - for (int i = 7105; i <= 7168; i++) - materials[i] = Material.JungleTrapdoor; - for (int i = 7169; i <= 7232; i++) - materials[i] = Material.AcaciaTrapdoor; - for (int i = 7233; i <= 7296; i++) - materials[i] = Material.CherryTrapdoor; - for (int i = 7297; i <= 7360; i++) - materials[i] = Material.DarkOakTrapdoor; - for (int i = 7361; i <= 7424; i++) - materials[i] = Material.PaleOakTrapdoor; - for (int i = 7425; i <= 7488; i++) - materials[i] = Material.MangroveTrapdoor; - for (int i = 7489; i <= 7552; i++) - materials[i] = Material.BambooTrapdoor; - for (int i = 7553; i <= 7553; i++) - materials[i] = Material.StoneBricks; - for (int i = 7554; i <= 7554; i++) - materials[i] = Material.MossyStoneBricks; - for (int i = 7555; i <= 7555; i++) - materials[i] = Material.CrackedStoneBricks; - for (int i = 7556; i <= 7556; i++) - materials[i] = Material.ChiseledStoneBricks; - for (int i = 7557; i <= 7557; i++) - materials[i] = Material.PackedMud; - for (int i = 7558; i <= 7558; i++) - materials[i] = Material.MudBricks; - for (int i = 7559; i <= 7559; i++) - materials[i] = Material.InfestedStone; - for (int i = 7560; i <= 7560; i++) - materials[i] = Material.InfestedCobblestone; - for (int i = 7561; i <= 7561; i++) - materials[i] = Material.InfestedStoneBricks; - for (int i = 7562; i <= 7562; i++) - materials[i] = Material.InfestedMossyStoneBricks; - for (int i = 7563; i <= 7563; i++) - materials[i] = Material.InfestedCrackedStoneBricks; - for (int i = 7564; i <= 7564; i++) - materials[i] = Material.InfestedChiseledStoneBricks; - for (int i = 7565; i <= 7628; i++) - materials[i] = Material.BrownMushroomBlock; - for (int i = 7629; i <= 7692; i++) - materials[i] = Material.RedMushroomBlock; - for (int i = 7693; i <= 7756; i++) - materials[i] = Material.MushroomStem; - for (int i = 7757; i <= 7788; i++) - materials[i] = Material.IronBars; - for (int i = 7789; i <= 7820; i++) - materials[i] = Material.CopperBars; - for (int i = 7821; i <= 7852; i++) - materials[i] = Material.ExposedCopperBars; - for (int i = 7853; i <= 7884; i++) - materials[i] = Material.WeatheredCopperBars; - for (int i = 7885; i <= 7916; i++) - materials[i] = Material.OxidizedCopperBars; - for (int i = 7917; i <= 7948; i++) - materials[i] = Material.WaxedCopperBars; - for (int i = 7949; i <= 7980; i++) - materials[i] = Material.WaxedExposedCopperBars; - for (int i = 7981; i <= 8012; i++) - materials[i] = Material.WaxedWeatheredCopperBars; - for (int i = 8013; i <= 8044; i++) - materials[i] = Material.WaxedOxidizedCopperBars; - for (int i = 8045; i <= 8050; i++) - materials[i] = Material.IronChain; - for (int i = 8051; i <= 8056; i++) - materials[i] = Material.CopperChain; - for (int i = 8057; i <= 8062; i++) - materials[i] = Material.ExposedCopperChain; - for (int i = 8063; i <= 8068; i++) - materials[i] = Material.WeatheredCopperChain; - for (int i = 8069; i <= 8074; i++) - materials[i] = Material.OxidizedCopperChain; - for (int i = 8075; i <= 8080; i++) - materials[i] = Material.WaxedCopperChain; - for (int i = 8081; i <= 8086; i++) - materials[i] = Material.WaxedExposedCopperChain; - for (int i = 8087; i <= 8092; i++) - materials[i] = Material.WaxedWeatheredCopperChain; - for (int i = 8093; i <= 8098; i++) - materials[i] = Material.WaxedOxidizedCopperChain; - for (int i = 8099; i <= 8130; i++) - materials[i] = Material.GlassPane; - for (int i = 8131; i <= 8131; i++) - materials[i] = Material.Pumpkin; - for (int i = 8132; i <= 8132; i++) - materials[i] = Material.Melon; - for (int i = 8133; i <= 8136; i++) - materials[i] = Material.AttachedPumpkinStem; - for (int i = 8137; i <= 8140; i++) - materials[i] = Material.AttachedMelonStem; - for (int i = 8141; i <= 8148; i++) - materials[i] = Material.PumpkinStem; - for (int i = 8149; i <= 8156; i++) - materials[i] = Material.MelonStem; - for (int i = 8157; i <= 8188; i++) - materials[i] = Material.Vine; - for (int i = 8189; i <= 8316; i++) - materials[i] = Material.GlowLichen; - for (int i = 8317; i <= 8444; i++) - materials[i] = Material.ResinClump; - for (int i = 8445; i <= 8476; i++) - materials[i] = Material.OakFenceGate; - for (int i = 8477; i <= 8556; i++) - materials[i] = Material.BrickStairs; - for (int i = 8557; i <= 8636; i++) - materials[i] = Material.StoneBrickStairs; - for (int i = 8637; i <= 8716; i++) - materials[i] = Material.MudBrickStairs; - for (int i = 8717; i <= 8718; i++) - materials[i] = Material.Mycelium; - for (int i = 8719; i <= 8719; i++) - materials[i] = Material.LilyPad; - for (int i = 8720; i <= 8720; i++) - materials[i] = Material.ResinBlock; - for (int i = 8721; i <= 8721; i++) - materials[i] = Material.ResinBricks; - for (int i = 8722; i <= 8801; i++) - materials[i] = Material.ResinBrickStairs; - for (int i = 8802; i <= 8807; i++) - materials[i] = Material.ResinBrickSlab; - for (int i = 8808; i <= 9131; i++) - materials[i] = Material.ResinBrickWall; - for (int i = 9132; i <= 9132; i++) - materials[i] = Material.ChiseledResinBricks; - for (int i = 9133; i <= 9133; i++) - materials[i] = Material.NetherBricks; - for (int i = 9134; i <= 9165; i++) - materials[i] = Material.NetherBrickFence; - for (int i = 9166; i <= 9245; i++) - materials[i] = Material.NetherBrickStairs; - for (int i = 9246; i <= 9249; i++) - materials[i] = Material.NetherWart; - for (int i = 9250; i <= 9250; i++) - materials[i] = Material.EnchantingTable; - for (int i = 9251; i <= 9258; i++) - materials[i] = Material.BrewingStand; - for (int i = 9259; i <= 9259; i++) - materials[i] = Material.Cauldron; - for (int i = 9260; i <= 9262; i++) - materials[i] = Material.WaterCauldron; - for (int i = 9263; i <= 9263; i++) - materials[i] = Material.LavaCauldron; - for (int i = 9264; i <= 9266; i++) - materials[i] = Material.PowderSnowCauldron; - for (int i = 9267; i <= 9267; i++) - materials[i] = Material.EndPortal; - for (int i = 9268; i <= 9275; i++) - materials[i] = Material.EndPortalFrame; - for (int i = 9276; i <= 9276; i++) - materials[i] = Material.EndStone; - for (int i = 9277; i <= 9277; i++) - materials[i] = Material.DragonEgg; - for (int i = 9278; i <= 9279; i++) - materials[i] = Material.RedstoneLamp; - for (int i = 9280; i <= 9291; i++) - materials[i] = Material.Cocoa; - for (int i = 9292; i <= 9371; i++) - materials[i] = Material.SandstoneStairs; - for (int i = 9372; i <= 9372; i++) - materials[i] = Material.EmeraldOre; - for (int i = 9373; i <= 9373; i++) - materials[i] = Material.DeepslateEmeraldOre; - for (int i = 9374; i <= 9381; i++) - materials[i] = Material.EnderChest; - for (int i = 9382; i <= 9397; i++) - materials[i] = Material.TripwireHook; - for (int i = 9398; i <= 9525; i++) - materials[i] = Material.Tripwire; - for (int i = 9526; i <= 9526; i++) - materials[i] = Material.EmeraldBlock; - for (int i = 9527; i <= 9606; i++) - materials[i] = Material.SpruceStairs; - for (int i = 9607; i <= 9686; i++) - materials[i] = Material.BirchStairs; - for (int i = 9687; i <= 9766; i++) - materials[i] = Material.JungleStairs; - for (int i = 9767; i <= 9778; i++) - materials[i] = Material.CommandBlock; - for (int i = 9779; i <= 9779; i++) - materials[i] = Material.Beacon; - for (int i = 9780; i <= 10103; i++) - materials[i] = Material.CobblestoneWall; - for (int i = 10104; i <= 10427; i++) - materials[i] = Material.MossyCobblestoneWall; - for (int i = 10428; i <= 10428; i++) - materials[i] = Material.FlowerPot; - for (int i = 10429; i <= 10429; i++) - materials[i] = Material.PottedTorchflower; - for (int i = 10430; i <= 10430; i++) - materials[i] = Material.PottedOakSapling; - for (int i = 10431; i <= 10431; i++) - materials[i] = Material.PottedSpruceSapling; - for (int i = 10432; i <= 10432; i++) - materials[i] = Material.PottedBirchSapling; - for (int i = 10433; i <= 10433; i++) - materials[i] = Material.PottedJungleSapling; - for (int i = 10434; i <= 10434; i++) - materials[i] = Material.PottedAcaciaSapling; - for (int i = 10435; i <= 10435; i++) - materials[i] = Material.PottedCherrySapling; - for (int i = 10436; i <= 10436; i++) - materials[i] = Material.PottedDarkOakSapling; - for (int i = 10437; i <= 10437; i++) - materials[i] = Material.PottedPaleOakSapling; - for (int i = 10438; i <= 10438; i++) - materials[i] = Material.PottedMangrovePropagule; - for (int i = 10439; i <= 10439; i++) - materials[i] = Material.PottedFern; - for (int i = 10440; i <= 10440; i++) - materials[i] = Material.PottedDandelion; - for (int i = 10441; i <= 10441; i++) - materials[i] = Material.PottedPoppy; - for (int i = 10442; i <= 10442; i++) - materials[i] = Material.PottedBlueOrchid; - for (int i = 10443; i <= 10443; i++) - materials[i] = Material.PottedAllium; - for (int i = 10444; i <= 10444; i++) - materials[i] = Material.PottedAzureBluet; - for (int i = 10445; i <= 10445; i++) - materials[i] = Material.PottedRedTulip; - for (int i = 10446; i <= 10446; i++) - materials[i] = Material.PottedOrangeTulip; - for (int i = 10447; i <= 10447; i++) - materials[i] = Material.PottedWhiteTulip; - for (int i = 10448; i <= 10448; i++) - materials[i] = Material.PottedPinkTulip; - for (int i = 10449; i <= 10449; i++) - materials[i] = Material.PottedOxeyeDaisy; - for (int i = 10450; i <= 10450; i++) - materials[i] = Material.PottedCornflower; - for (int i = 10451; i <= 10451; i++) - materials[i] = Material.PottedLilyOfTheValley; - for (int i = 10452; i <= 10452; i++) - materials[i] = Material.PottedWitherRose; - for (int i = 10453; i <= 10453; i++) - materials[i] = Material.PottedRedMushroom; - for (int i = 10454; i <= 10454; i++) - materials[i] = Material.PottedBrownMushroom; - for (int i = 10455; i <= 10455; i++) - materials[i] = Material.PottedDeadBush; - for (int i = 10456; i <= 10456; i++) - materials[i] = Material.PottedCactus; - for (int i = 10457; i <= 10464; i++) - materials[i] = Material.Carrots; - for (int i = 10465; i <= 10472; i++) - materials[i] = Material.Potatoes; - for (int i = 10473; i <= 10496; i++) - materials[i] = Material.OakButton; - for (int i = 10497; i <= 10520; i++) - materials[i] = Material.SpruceButton; - for (int i = 10521; i <= 10544; i++) - materials[i] = Material.BirchButton; - for (int i = 10545; i <= 10568; i++) - materials[i] = Material.JungleButton; - for (int i = 10569; i <= 10592; i++) - materials[i] = Material.AcaciaButton; - for (int i = 10593; i <= 10616; i++) - materials[i] = Material.CherryButton; - for (int i = 10617; i <= 10640; i++) - materials[i] = Material.DarkOakButton; - for (int i = 10641; i <= 10664; i++) - materials[i] = Material.PaleOakButton; - for (int i = 10665; i <= 10688; i++) - materials[i] = Material.MangroveButton; - for (int i = 10689; i <= 10712; i++) - materials[i] = Material.BambooButton; - for (int i = 10713; i <= 10744; i++) - materials[i] = Material.SkeletonSkull; - for (int i = 10745; i <= 10752; i++) - materials[i] = Material.SkeletonWallSkull; - for (int i = 10753; i <= 10784; i++) - materials[i] = Material.WitherSkeletonSkull; - for (int i = 10785; i <= 10792; i++) - materials[i] = Material.WitherSkeletonWallSkull; - for (int i = 10793; i <= 10824; i++) - materials[i] = Material.ZombieHead; - for (int i = 10825; i <= 10832; i++) - materials[i] = Material.ZombieWallHead; - for (int i = 10833; i <= 10864; i++) - materials[i] = Material.PlayerHead; - for (int i = 10865; i <= 10872; i++) - materials[i] = Material.PlayerWallHead; - for (int i = 10873; i <= 10904; i++) - materials[i] = Material.CreeperHead; - for (int i = 10905; i <= 10912; i++) - materials[i] = Material.CreeperWallHead; - for (int i = 10913; i <= 10944; i++) - materials[i] = Material.DragonHead; - for (int i = 10945; i <= 10952; i++) - materials[i] = Material.DragonWallHead; - for (int i = 10953; i <= 10984; i++) - materials[i] = Material.PiglinHead; - for (int i = 10985; i <= 10992; i++) - materials[i] = Material.PiglinWallHead; - for (int i = 10993; i <= 10996; i++) - materials[i] = Material.Anvil; - for (int i = 10997; i <= 11000; i++) - materials[i] = Material.ChippedAnvil; - for (int i = 11001; i <= 11004; i++) - materials[i] = Material.DamagedAnvil; - for (int i = 11005; i <= 11028; i++) - materials[i] = Material.TrappedChest; - for (int i = 11029; i <= 11044; i++) - materials[i] = Material.LightWeightedPressurePlate; - for (int i = 11045; i <= 11060; i++) - materials[i] = Material.HeavyWeightedPressurePlate; - for (int i = 11061; i <= 11076; i++) - materials[i] = Material.Comparator; - for (int i = 11077; i <= 11108; i++) - materials[i] = Material.DaylightDetector; - for (int i = 11109; i <= 11109; i++) - materials[i] = Material.RedstoneBlock; - for (int i = 11110; i <= 11110; i++) - materials[i] = Material.NetherQuartzOre; - for (int i = 11111; i <= 11120; i++) - materials[i] = Material.Hopper; - for (int i = 11121; i <= 11121; i++) - materials[i] = Material.QuartzBlock; - for (int i = 11122; i <= 11122; i++) - materials[i] = Material.ChiseledQuartzBlock; - for (int i = 11123; i <= 11125; i++) - materials[i] = Material.QuartzPillar; - for (int i = 11126; i <= 11205; i++) - materials[i] = Material.QuartzStairs; - for (int i = 11206; i <= 11229; i++) - materials[i] = Material.ActivatorRail; - for (int i = 11230; i <= 11241; i++) - materials[i] = Material.Dropper; - for (int i = 11242; i <= 11242; i++) - materials[i] = Material.WhiteTerracotta; - for (int i = 11243; i <= 11243; i++) - materials[i] = Material.OrangeTerracotta; - for (int i = 11244; i <= 11244; i++) - materials[i] = Material.MagentaTerracotta; - for (int i = 11245; i <= 11245; i++) - materials[i] = Material.LightBlueTerracotta; - for (int i = 11246; i <= 11246; i++) - materials[i] = Material.YellowTerracotta; - for (int i = 11247; i <= 11247; i++) - materials[i] = Material.LimeTerracotta; - for (int i = 11248; i <= 11248; i++) - materials[i] = Material.PinkTerracotta; - for (int i = 11249; i <= 11249; i++) - materials[i] = Material.GrayTerracotta; - for (int i = 11250; i <= 11250; i++) - materials[i] = Material.LightGrayTerracotta; - for (int i = 11251; i <= 11251; i++) - materials[i] = Material.CyanTerracotta; - for (int i = 11252; i <= 11252; i++) - materials[i] = Material.PurpleTerracotta; - for (int i = 11253; i <= 11253; i++) - materials[i] = Material.BlueTerracotta; - for (int i = 11254; i <= 11254; i++) - materials[i] = Material.BrownTerracotta; - for (int i = 11255; i <= 11255; i++) - materials[i] = Material.GreenTerracotta; - for (int i = 11256; i <= 11256; i++) - materials[i] = Material.RedTerracotta; - for (int i = 11257; i <= 11257; i++) - materials[i] = Material.BlackTerracotta; - for (int i = 11258; i <= 11289; i++) - materials[i] = Material.WhiteStainedGlassPane; - for (int i = 11290; i <= 11321; i++) - materials[i] = Material.OrangeStainedGlassPane; - for (int i = 11322; i <= 11353; i++) - materials[i] = Material.MagentaStainedGlassPane; - for (int i = 11354; i <= 11385; i++) - materials[i] = Material.LightBlueStainedGlassPane; - for (int i = 11386; i <= 11417; i++) - materials[i] = Material.YellowStainedGlassPane; - for (int i = 11418; i <= 11449; i++) - materials[i] = Material.LimeStainedGlassPane; - for (int i = 11450; i <= 11481; i++) - materials[i] = Material.PinkStainedGlassPane; - for (int i = 11482; i <= 11513; i++) - materials[i] = Material.GrayStainedGlassPane; - for (int i = 11514; i <= 11545; i++) - materials[i] = Material.LightGrayStainedGlassPane; - for (int i = 11546; i <= 11577; i++) - materials[i] = Material.CyanStainedGlassPane; - for (int i = 11578; i <= 11609; i++) - materials[i] = Material.PurpleStainedGlassPane; - for (int i = 11610; i <= 11641; i++) - materials[i] = Material.BlueStainedGlassPane; - for (int i = 11642; i <= 11673; i++) - materials[i] = Material.BrownStainedGlassPane; - for (int i = 11674; i <= 11705; i++) - materials[i] = Material.GreenStainedGlassPane; - for (int i = 11706; i <= 11737; i++) - materials[i] = Material.RedStainedGlassPane; - for (int i = 11738; i <= 11769; i++) - materials[i] = Material.BlackStainedGlassPane; - for (int i = 11770; i <= 11849; i++) - materials[i] = Material.AcaciaStairs; - for (int i = 11850; i <= 11929; i++) - materials[i] = Material.CherryStairs; - for (int i = 11930; i <= 12009; i++) - materials[i] = Material.DarkOakStairs; - for (int i = 12010; i <= 12089; i++) - materials[i] = Material.PaleOakStairs; - for (int i = 12090; i <= 12169; i++) - materials[i] = Material.MangroveStairs; - for (int i = 12170; i <= 12249; i++) - materials[i] = Material.BambooStairs; - for (int i = 12250; i <= 12329; i++) - materials[i] = Material.BambooMosaicStairs; - for (int i = 12330; i <= 12330; i++) - materials[i] = Material.SlimeBlock; - for (int i = 12331; i <= 12332; i++) - materials[i] = Material.Barrier; - for (int i = 12333; i <= 12364; i++) - materials[i] = Material.Light; - for (int i = 12365; i <= 12428; i++) - materials[i] = Material.IronTrapdoor; - for (int i = 12429; i <= 12429; i++) - materials[i] = Material.Prismarine; - for (int i = 12430; i <= 12430; i++) - materials[i] = Material.PrismarineBricks; - for (int i = 12431; i <= 12431; i++) - materials[i] = Material.DarkPrismarine; - for (int i = 12432; i <= 12511; i++) - materials[i] = Material.PrismarineStairs; - for (int i = 12512; i <= 12591; i++) - materials[i] = Material.PrismarineBrickStairs; - for (int i = 12592; i <= 12671; i++) - materials[i] = Material.DarkPrismarineStairs; - for (int i = 12672; i <= 12677; i++) - materials[i] = Material.PrismarineSlab; - for (int i = 12678; i <= 12683; i++) - materials[i] = Material.PrismarineBrickSlab; - for (int i = 12684; i <= 12689; i++) - materials[i] = Material.DarkPrismarineSlab; - for (int i = 12690; i <= 12690; i++) - materials[i] = Material.SeaLantern; - for (int i = 12691; i <= 12693; i++) - materials[i] = Material.HayBlock; - for (int i = 12694; i <= 12694; i++) - materials[i] = Material.WhiteCarpet; - for (int i = 12695; i <= 12695; i++) - materials[i] = Material.OrangeCarpet; - for (int i = 12696; i <= 12696; i++) - materials[i] = Material.MagentaCarpet; - for (int i = 12697; i <= 12697; i++) - materials[i] = Material.LightBlueCarpet; - for (int i = 12698; i <= 12698; i++) - materials[i] = Material.YellowCarpet; - for (int i = 12699; i <= 12699; i++) - materials[i] = Material.LimeCarpet; - for (int i = 12700; i <= 12700; i++) - materials[i] = Material.PinkCarpet; - for (int i = 12701; i <= 12701; i++) - materials[i] = Material.GrayCarpet; - for (int i = 12702; i <= 12702; i++) - materials[i] = Material.LightGrayCarpet; - for (int i = 12703; i <= 12703; i++) - materials[i] = Material.CyanCarpet; - for (int i = 12704; i <= 12704; i++) - materials[i] = Material.PurpleCarpet; - for (int i = 12705; i <= 12705; i++) - materials[i] = Material.BlueCarpet; - for (int i = 12706; i <= 12706; i++) - materials[i] = Material.BrownCarpet; - for (int i = 12707; i <= 12707; i++) - materials[i] = Material.GreenCarpet; - for (int i = 12708; i <= 12708; i++) - materials[i] = Material.RedCarpet; - for (int i = 12709; i <= 12709; i++) - materials[i] = Material.BlackCarpet; - for (int i = 12710; i <= 12710; i++) - materials[i] = Material.Terracotta; - for (int i = 12711; i <= 12711; i++) - materials[i] = Material.CoalBlock; - for (int i = 12712; i <= 12712; i++) - materials[i] = Material.PackedIce; - for (int i = 12713; i <= 12714; i++) - materials[i] = Material.Sunflower; - for (int i = 12715; i <= 12716; i++) - materials[i] = Material.Lilac; - for (int i = 12717; i <= 12718; i++) - materials[i] = Material.RoseBush; - for (int i = 12719; i <= 12720; i++) - materials[i] = Material.Peony; - for (int i = 12721; i <= 12722; i++) - materials[i] = Material.TallGrass; - for (int i = 12723; i <= 12724; i++) - materials[i] = Material.LargeFern; - for (int i = 12725; i <= 12740; i++) - materials[i] = Material.WhiteBanner; - for (int i = 12741; i <= 12756; i++) - materials[i] = Material.OrangeBanner; - for (int i = 12757; i <= 12772; i++) - materials[i] = Material.MagentaBanner; - for (int i = 12773; i <= 12788; i++) - materials[i] = Material.LightBlueBanner; - for (int i = 12789; i <= 12804; i++) - materials[i] = Material.YellowBanner; - for (int i = 12805; i <= 12820; i++) - materials[i] = Material.LimeBanner; - for (int i = 12821; i <= 12836; i++) - materials[i] = Material.PinkBanner; - for (int i = 12837; i <= 12852; i++) - materials[i] = Material.GrayBanner; - for (int i = 12853; i <= 12868; i++) - materials[i] = Material.LightGrayBanner; - for (int i = 12869; i <= 12884; i++) - materials[i] = Material.CyanBanner; - for (int i = 12885; i <= 12900; i++) - materials[i] = Material.PurpleBanner; - for (int i = 12901; i <= 12916; i++) - materials[i] = Material.BlueBanner; - for (int i = 12917; i <= 12932; i++) - materials[i] = Material.BrownBanner; - for (int i = 12933; i <= 12948; i++) - materials[i] = Material.GreenBanner; - for (int i = 12949; i <= 12964; i++) - materials[i] = Material.RedBanner; - for (int i = 12965; i <= 12980; i++) - materials[i] = Material.BlackBanner; - for (int i = 12981; i <= 12984; i++) - materials[i] = Material.WhiteWallBanner; - for (int i = 12985; i <= 12988; i++) - materials[i] = Material.OrangeWallBanner; - for (int i = 12989; i <= 12992; i++) - materials[i] = Material.MagentaWallBanner; - for (int i = 12993; i <= 12996; i++) - materials[i] = Material.LightBlueWallBanner; - for (int i = 12997; i <= 13000; i++) - materials[i] = Material.YellowWallBanner; - for (int i = 13001; i <= 13004; i++) - materials[i] = Material.LimeWallBanner; - for (int i = 13005; i <= 13008; i++) - materials[i] = Material.PinkWallBanner; - for (int i = 13009; i <= 13012; i++) - materials[i] = Material.GrayWallBanner; - for (int i = 13013; i <= 13016; i++) - materials[i] = Material.LightGrayWallBanner; - for (int i = 13017; i <= 13020; i++) - materials[i] = Material.CyanWallBanner; - for (int i = 13021; i <= 13024; i++) - materials[i] = Material.PurpleWallBanner; - for (int i = 13025; i <= 13028; i++) - materials[i] = Material.BlueWallBanner; - for (int i = 13029; i <= 13032; i++) - materials[i] = Material.BrownWallBanner; - for (int i = 13033; i <= 13036; i++) - materials[i] = Material.GreenWallBanner; - for (int i = 13037; i <= 13040; i++) - materials[i] = Material.RedWallBanner; - for (int i = 13041; i <= 13044; i++) - materials[i] = Material.BlackWallBanner; - for (int i = 13045; i <= 13045; i++) - materials[i] = Material.RedSandstone; - for (int i = 13046; i <= 13046; i++) - materials[i] = Material.ChiseledRedSandstone; - for (int i = 13047; i <= 13047; i++) - materials[i] = Material.CutRedSandstone; - for (int i = 13048; i <= 13127; i++) - materials[i] = Material.RedSandstoneStairs; - for (int i = 13128; i <= 13133; i++) - materials[i] = Material.OakSlab; - for (int i = 13134; i <= 13139; i++) - materials[i] = Material.SpruceSlab; - for (int i = 13140; i <= 13145; i++) - materials[i] = Material.BirchSlab; - for (int i = 13146; i <= 13151; i++) - materials[i] = Material.JungleSlab; - for (int i = 13152; i <= 13157; i++) - materials[i] = Material.AcaciaSlab; - for (int i = 13158; i <= 13163; i++) - materials[i] = Material.CherrySlab; - for (int i = 13164; i <= 13169; i++) - materials[i] = Material.DarkOakSlab; - for (int i = 13170; i <= 13175; i++) - materials[i] = Material.PaleOakSlab; - for (int i = 13176; i <= 13181; i++) - materials[i] = Material.MangroveSlab; - for (int i = 13182; i <= 13187; i++) - materials[i] = Material.BambooSlab; - for (int i = 13188; i <= 13193; i++) - materials[i] = Material.BambooMosaicSlab; - for (int i = 13194; i <= 13199; i++) - materials[i] = Material.StoneSlab; - for (int i = 13200; i <= 13205; i++) - materials[i] = Material.SmoothStoneSlab; - for (int i = 13206; i <= 13211; i++) - materials[i] = Material.SandstoneSlab; - for (int i = 13212; i <= 13217; i++) - materials[i] = Material.CutSandstoneSlab; - for (int i = 13218; i <= 13223; i++) - materials[i] = Material.PetrifiedOakSlab; - for (int i = 13224; i <= 13229; i++) - materials[i] = Material.CobblestoneSlab; - for (int i = 13230; i <= 13235; i++) - materials[i] = Material.BrickSlab; - for (int i = 13236; i <= 13241; i++) - materials[i] = Material.StoneBrickSlab; - for (int i = 13242; i <= 13247; i++) - materials[i] = Material.MudBrickSlab; - for (int i = 13248; i <= 13253; i++) - materials[i] = Material.NetherBrickSlab; - for (int i = 13254; i <= 13259; i++) - materials[i] = Material.QuartzSlab; - for (int i = 13260; i <= 13265; i++) - materials[i] = Material.RedSandstoneSlab; - for (int i = 13266; i <= 13271; i++) - materials[i] = Material.CutRedSandstoneSlab; - for (int i = 13272; i <= 13277; i++) - materials[i] = Material.PurpurSlab; - for (int i = 13278; i <= 13278; i++) - materials[i] = Material.SmoothStone; - for (int i = 13279; i <= 13279; i++) - materials[i] = Material.SmoothSandstone; - for (int i = 13280; i <= 13280; i++) - materials[i] = Material.SmoothQuartz; - for (int i = 13281; i <= 13281; i++) - materials[i] = Material.SmoothRedSandstone; - for (int i = 13282; i <= 13313; i++) - materials[i] = Material.SpruceFenceGate; - for (int i = 13314; i <= 13345; i++) - materials[i] = Material.BirchFenceGate; - for (int i = 13346; i <= 13377; i++) - materials[i] = Material.JungleFenceGate; - for (int i = 13378; i <= 13409; i++) - materials[i] = Material.AcaciaFenceGate; - for (int i = 13410; i <= 13441; i++) - materials[i] = Material.CherryFenceGate; - for (int i = 13442; i <= 13473; i++) - materials[i] = Material.DarkOakFenceGate; - for (int i = 13474; i <= 13505; i++) - materials[i] = Material.PaleOakFenceGate; - for (int i = 13506; i <= 13537; i++) - materials[i] = Material.MangroveFenceGate; - for (int i = 13538; i <= 13569; i++) - materials[i] = Material.BambooFenceGate; - for (int i = 13570; i <= 13601; i++) - materials[i] = Material.SpruceFence; - for (int i = 13602; i <= 13633; i++) - materials[i] = Material.BirchFence; - for (int i = 13634; i <= 13665; i++) - materials[i] = Material.JungleFence; - for (int i = 13666; i <= 13697; i++) - materials[i] = Material.AcaciaFence; - for (int i = 13698; i <= 13729; i++) - materials[i] = Material.CherryFence; - for (int i = 13730; i <= 13761; i++) - materials[i] = Material.DarkOakFence; - for (int i = 13762; i <= 13793; i++) - materials[i] = Material.PaleOakFence; - for (int i = 13794; i <= 13825; i++) - materials[i] = Material.MangroveFence; - for (int i = 13826; i <= 13857; i++) - materials[i] = Material.BambooFence; - for (int i = 13858; i <= 13921; i++) - materials[i] = Material.SpruceDoor; - for (int i = 13922; i <= 13985; i++) - materials[i] = Material.BirchDoor; - for (int i = 13986; i <= 14049; i++) - materials[i] = Material.JungleDoor; - for (int i = 14050; i <= 14113; i++) - materials[i] = Material.AcaciaDoor; - for (int i = 14114; i <= 14177; i++) - materials[i] = Material.CherryDoor; - for (int i = 14178; i <= 14241; i++) - materials[i] = Material.DarkOakDoor; - for (int i = 14242; i <= 14305; i++) - materials[i] = Material.PaleOakDoor; - for (int i = 14306; i <= 14369; i++) - materials[i] = Material.MangroveDoor; - for (int i = 14370; i <= 14433; i++) - materials[i] = Material.BambooDoor; - for (int i = 14434; i <= 14439; i++) - materials[i] = Material.EndRod; - for (int i = 14440; i <= 14503; i++) - materials[i] = Material.ChorusPlant; - for (int i = 14504; i <= 14509; i++) - materials[i] = Material.ChorusFlower; - for (int i = 14510; i <= 14510; i++) - materials[i] = Material.PurpurBlock; - for (int i = 14511; i <= 14513; i++) - materials[i] = Material.PurpurPillar; - for (int i = 14514; i <= 14593; i++) - materials[i] = Material.PurpurStairs; - for (int i = 14594; i <= 14594; i++) - materials[i] = Material.EndStoneBricks; - for (int i = 14595; i <= 14596; i++) - materials[i] = Material.TorchflowerCrop; - for (int i = 14597; i <= 14606; i++) - materials[i] = Material.PitcherCrop; - for (int i = 14607; i <= 14608; i++) - materials[i] = Material.PitcherPlant; - for (int i = 14609; i <= 14612; i++) - materials[i] = Material.Beetroots; - for (int i = 14613; i <= 14613; i++) - materials[i] = Material.DirtPath; - for (int i = 14614; i <= 14614; i++) - materials[i] = Material.EndGateway; - for (int i = 14615; i <= 14626; i++) - materials[i] = Material.RepeatingCommandBlock; - for (int i = 14627; i <= 14638; i++) - materials[i] = Material.ChainCommandBlock; - for (int i = 14639; i <= 14642; i++) - materials[i] = Material.FrostedIce; - for (int i = 14643; i <= 14643; i++) - materials[i] = Material.MagmaBlock; - for (int i = 14644; i <= 14644; i++) - materials[i] = Material.NetherWartBlock; - for (int i = 14645; i <= 14645; i++) - materials[i] = Material.RedNetherBricks; - for (int i = 14646; i <= 14648; i++) - materials[i] = Material.BoneBlock; - for (int i = 14649; i <= 14649; i++) - materials[i] = Material.StructureVoid; - for (int i = 14650; i <= 14661; i++) - materials[i] = Material.Observer; - for (int i = 14662; i <= 14667; i++) - materials[i] = Material.ShulkerBox; - for (int i = 14668; i <= 14673; i++) - materials[i] = Material.WhiteShulkerBox; - for (int i = 14674; i <= 14679; i++) - materials[i] = Material.OrangeShulkerBox; - for (int i = 14680; i <= 14685; i++) - materials[i] = Material.MagentaShulkerBox; - for (int i = 14686; i <= 14691; i++) - materials[i] = Material.LightBlueShulkerBox; - for (int i = 14692; i <= 14697; i++) - materials[i] = Material.YellowShulkerBox; - for (int i = 14698; i <= 14703; i++) - materials[i] = Material.LimeShulkerBox; - for (int i = 14704; i <= 14709; i++) - materials[i] = Material.PinkShulkerBox; - for (int i = 14710; i <= 14715; i++) - materials[i] = Material.GrayShulkerBox; - for (int i = 14716; i <= 14721; i++) - materials[i] = Material.LightGrayShulkerBox; - for (int i = 14722; i <= 14727; i++) - materials[i] = Material.CyanShulkerBox; - for (int i = 14728; i <= 14733; i++) - materials[i] = Material.PurpleShulkerBox; - for (int i = 14734; i <= 14739; i++) - materials[i] = Material.BlueShulkerBox; - for (int i = 14740; i <= 14745; i++) - materials[i] = Material.BrownShulkerBox; - for (int i = 14746; i <= 14751; i++) - materials[i] = Material.GreenShulkerBox; - for (int i = 14752; i <= 14757; i++) - materials[i] = Material.RedShulkerBox; - for (int i = 14758; i <= 14763; i++) - materials[i] = Material.BlackShulkerBox; - for (int i = 14764; i <= 14767; i++) - materials[i] = Material.WhiteGlazedTerracotta; - for (int i = 14768; i <= 14771; i++) - materials[i] = Material.OrangeGlazedTerracotta; - for (int i = 14772; i <= 14775; i++) - materials[i] = Material.MagentaGlazedTerracotta; - for (int i = 14776; i <= 14779; i++) - materials[i] = Material.LightBlueGlazedTerracotta; - for (int i = 14780; i <= 14783; i++) - materials[i] = Material.YellowGlazedTerracotta; - for (int i = 14784; i <= 14787; i++) - materials[i] = Material.LimeGlazedTerracotta; - for (int i = 14788; i <= 14791; i++) - materials[i] = Material.PinkGlazedTerracotta; - for (int i = 14792; i <= 14795; i++) - materials[i] = Material.GrayGlazedTerracotta; - for (int i = 14796; i <= 14799; i++) - materials[i] = Material.LightGrayGlazedTerracotta; - for (int i = 14800; i <= 14803; i++) - materials[i] = Material.CyanGlazedTerracotta; - for (int i = 14804; i <= 14807; i++) - materials[i] = Material.PurpleGlazedTerracotta; - for (int i = 14808; i <= 14811; i++) - materials[i] = Material.BlueGlazedTerracotta; - for (int i = 14812; i <= 14815; i++) - materials[i] = Material.BrownGlazedTerracotta; - for (int i = 14816; i <= 14819; i++) - materials[i] = Material.GreenGlazedTerracotta; - for (int i = 14820; i <= 14823; i++) - materials[i] = Material.RedGlazedTerracotta; - for (int i = 14824; i <= 14827; i++) - materials[i] = Material.BlackGlazedTerracotta; - for (int i = 14828; i <= 14828; i++) - materials[i] = Material.WhiteConcrete; - for (int i = 14829; i <= 14829; i++) - materials[i] = Material.OrangeConcrete; - for (int i = 14830; i <= 14830; i++) - materials[i] = Material.MagentaConcrete; - for (int i = 14831; i <= 14831; i++) - materials[i] = Material.LightBlueConcrete; - for (int i = 14832; i <= 14832; i++) - materials[i] = Material.YellowConcrete; - for (int i = 14833; i <= 14833; i++) - materials[i] = Material.LimeConcrete; - for (int i = 14834; i <= 14834; i++) - materials[i] = Material.PinkConcrete; - for (int i = 14835; i <= 14835; i++) - materials[i] = Material.GrayConcrete; - for (int i = 14836; i <= 14836; i++) - materials[i] = Material.LightGrayConcrete; - for (int i = 14837; i <= 14837; i++) - materials[i] = Material.CyanConcrete; - for (int i = 14838; i <= 14838; i++) - materials[i] = Material.PurpleConcrete; - for (int i = 14839; i <= 14839; i++) - materials[i] = Material.BlueConcrete; - for (int i = 14840; i <= 14840; i++) - materials[i] = Material.BrownConcrete; - for (int i = 14841; i <= 14841; i++) - materials[i] = Material.GreenConcrete; - for (int i = 14842; i <= 14842; i++) - materials[i] = Material.RedConcrete; - for (int i = 14843; i <= 14843; i++) - materials[i] = Material.BlackConcrete; - for (int i = 14844; i <= 14844; i++) - materials[i] = Material.WhiteConcretePowder; - for (int i = 14845; i <= 14845; i++) - materials[i] = Material.OrangeConcretePowder; - for (int i = 14846; i <= 14846; i++) - materials[i] = Material.MagentaConcretePowder; - for (int i = 14847; i <= 14847; i++) - materials[i] = Material.LightBlueConcretePowder; - for (int i = 14848; i <= 14848; i++) - materials[i] = Material.YellowConcretePowder; - for (int i = 14849; i <= 14849; i++) - materials[i] = Material.LimeConcretePowder; - for (int i = 14850; i <= 14850; i++) - materials[i] = Material.PinkConcretePowder; - for (int i = 14851; i <= 14851; i++) - materials[i] = Material.GrayConcretePowder; - for (int i = 14852; i <= 14852; i++) - materials[i] = Material.LightGrayConcretePowder; - for (int i = 14853; i <= 14853; i++) - materials[i] = Material.CyanConcretePowder; - for (int i = 14854; i <= 14854; i++) - materials[i] = Material.PurpleConcretePowder; - for (int i = 14855; i <= 14855; i++) - materials[i] = Material.BlueConcretePowder; - for (int i = 14856; i <= 14856; i++) - materials[i] = Material.BrownConcretePowder; - for (int i = 14857; i <= 14857; i++) - materials[i] = Material.GreenConcretePowder; - for (int i = 14858; i <= 14858; i++) - materials[i] = Material.RedConcretePowder; - for (int i = 14859; i <= 14859; i++) - materials[i] = Material.BlackConcretePowder; - for (int i = 14860; i <= 14885; i++) - materials[i] = Material.Kelp; - for (int i = 14886; i <= 14886; i++) - materials[i] = Material.KelpPlant; - for (int i = 14887; i <= 14887; i++) - materials[i] = Material.DriedKelpBlock; - for (int i = 14888; i <= 14899; i++) - materials[i] = Material.TurtleEgg; - for (int i = 14900; i <= 14902; i++) - materials[i] = Material.SnifferEgg; - for (int i = 14903; i <= 14934; i++) - materials[i] = Material.DriedGhast; - for (int i = 14935; i <= 14935; i++) - materials[i] = Material.DeadTubeCoralBlock; - for (int i = 14936; i <= 14936; i++) - materials[i] = Material.DeadBrainCoralBlock; - for (int i = 14937; i <= 14937; i++) - materials[i] = Material.DeadBubbleCoralBlock; - for (int i = 14938; i <= 14938; i++) - materials[i] = Material.DeadFireCoralBlock; - for (int i = 14939; i <= 14939; i++) - materials[i] = Material.DeadHornCoralBlock; - for (int i = 14940; i <= 14940; i++) - materials[i] = Material.TubeCoralBlock; - for (int i = 14941; i <= 14941; i++) - materials[i] = Material.BrainCoralBlock; - for (int i = 14942; i <= 14942; i++) - materials[i] = Material.BubbleCoralBlock; - for (int i = 14943; i <= 14943; i++) - materials[i] = Material.FireCoralBlock; - for (int i = 14944; i <= 14944; i++) - materials[i] = Material.HornCoralBlock; - for (int i = 14945; i <= 14946; i++) - materials[i] = Material.DeadTubeCoral; - for (int i = 14947; i <= 14948; i++) - materials[i] = Material.DeadBrainCoral; - for (int i = 14949; i <= 14950; i++) - materials[i] = Material.DeadBubbleCoral; - for (int i = 14951; i <= 14952; i++) - materials[i] = Material.DeadFireCoral; - for (int i = 14953; i <= 14954; i++) - materials[i] = Material.DeadHornCoral; - for (int i = 14955; i <= 14956; i++) - materials[i] = Material.TubeCoral; - for (int i = 14957; i <= 14958; i++) - materials[i] = Material.BrainCoral; - for (int i = 14959; i <= 14960; i++) - materials[i] = Material.BubbleCoral; - for (int i = 14961; i <= 14962; i++) - materials[i] = Material.FireCoral; - for (int i = 14963; i <= 14964; i++) - materials[i] = Material.HornCoral; - for (int i = 14965; i <= 14966; i++) - materials[i] = Material.DeadTubeCoralFan; - for (int i = 14967; i <= 14968; i++) - materials[i] = Material.DeadBrainCoralFan; - for (int i = 14969; i <= 14970; i++) - materials[i] = Material.DeadBubbleCoralFan; - for (int i = 14971; i <= 14972; i++) - materials[i] = Material.DeadFireCoralFan; - for (int i = 14973; i <= 14974; i++) - materials[i] = Material.DeadHornCoralFan; - for (int i = 14975; i <= 14976; i++) - materials[i] = Material.TubeCoralFan; - for (int i = 14977; i <= 14978; i++) - materials[i] = Material.BrainCoralFan; - for (int i = 14979; i <= 14980; i++) - materials[i] = Material.BubbleCoralFan; - for (int i = 14981; i <= 14982; i++) - materials[i] = Material.FireCoralFan; - for (int i = 14983; i <= 14984; i++) - materials[i] = Material.HornCoralFan; - for (int i = 14985; i <= 14992; i++) - materials[i] = Material.DeadTubeCoralWallFan; - for (int i = 14993; i <= 15000; i++) - materials[i] = Material.DeadBrainCoralWallFan; - for (int i = 15001; i <= 15008; i++) - materials[i] = Material.DeadBubbleCoralWallFan; - for (int i = 15009; i <= 15016; i++) - materials[i] = Material.DeadFireCoralWallFan; - for (int i = 15017; i <= 15024; i++) - materials[i] = Material.DeadHornCoralWallFan; - for (int i = 15025; i <= 15032; i++) - materials[i] = Material.TubeCoralWallFan; - for (int i = 15033; i <= 15040; i++) - materials[i] = Material.BrainCoralWallFan; - for (int i = 15041; i <= 15048; i++) - materials[i] = Material.BubbleCoralWallFan; - for (int i = 15049; i <= 15056; i++) - materials[i] = Material.FireCoralWallFan; - for (int i = 15057; i <= 15064; i++) - materials[i] = Material.HornCoralWallFan; - for (int i = 15065; i <= 15072; i++) - materials[i] = Material.SeaPickle; - for (int i = 15073; i <= 15073; i++) - materials[i] = Material.BlueIce; - for (int i = 15074; i <= 15075; i++) - materials[i] = Material.Conduit; - for (int i = 15076; i <= 15076; i++) - materials[i] = Material.BambooSapling; - for (int i = 15077; i <= 15088; i++) - materials[i] = Material.Bamboo; - for (int i = 15089; i <= 15089; i++) - materials[i] = Material.PottedBamboo; - for (int i = 15090; i <= 15090; i++) - materials[i] = Material.VoidAir; - for (int i = 15091; i <= 15091; i++) - materials[i] = Material.CaveAir; - for (int i = 15092; i <= 15093; i++) - materials[i] = Material.BubbleColumn; - for (int i = 15094; i <= 15173; i++) - materials[i] = Material.PolishedGraniteStairs; - for (int i = 15174; i <= 15253; i++) - materials[i] = Material.SmoothRedSandstoneStairs; - for (int i = 15254; i <= 15333; i++) - materials[i] = Material.MossyStoneBrickStairs; - for (int i = 15334; i <= 15413; i++) - materials[i] = Material.PolishedDioriteStairs; - for (int i = 15414; i <= 15493; i++) - materials[i] = Material.MossyCobblestoneStairs; - for (int i = 15494; i <= 15573; i++) - materials[i] = Material.EndStoneBrickStairs; - for (int i = 15574; i <= 15653; i++) - materials[i] = Material.StoneStairs; - for (int i = 15654; i <= 15733; i++) - materials[i] = Material.SmoothSandstoneStairs; - for (int i = 15734; i <= 15813; i++) - materials[i] = Material.SmoothQuartzStairs; - for (int i = 15814; i <= 15893; i++) - materials[i] = Material.GraniteStairs; - for (int i = 15894; i <= 15973; i++) - materials[i] = Material.AndesiteStairs; - for (int i = 15974; i <= 16053; i++) - materials[i] = Material.RedNetherBrickStairs; - for (int i = 16054; i <= 16133; i++) - materials[i] = Material.PolishedAndesiteStairs; - for (int i = 16134; i <= 16213; i++) - materials[i] = Material.DioriteStairs; - for (int i = 16214; i <= 16219; i++) - materials[i] = Material.PolishedGraniteSlab; - for (int i = 16220; i <= 16225; i++) - materials[i] = Material.SmoothRedSandstoneSlab; - for (int i = 16226; i <= 16231; i++) - materials[i] = Material.MossyStoneBrickSlab; - for (int i = 16232; i <= 16237; i++) - materials[i] = Material.PolishedDioriteSlab; - for (int i = 16238; i <= 16243; i++) - materials[i] = Material.MossyCobblestoneSlab; - for (int i = 16244; i <= 16249; i++) - materials[i] = Material.EndStoneBrickSlab; - for (int i = 16250; i <= 16255; i++) - materials[i] = Material.SmoothSandstoneSlab; - for (int i = 16256; i <= 16261; i++) - materials[i] = Material.SmoothQuartzSlab; - for (int i = 16262; i <= 16267; i++) - materials[i] = Material.GraniteSlab; - for (int i = 16268; i <= 16273; i++) - materials[i] = Material.AndesiteSlab; - for (int i = 16274; i <= 16279; i++) - materials[i] = Material.RedNetherBrickSlab; - for (int i = 16280; i <= 16285; i++) - materials[i] = Material.PolishedAndesiteSlab; - for (int i = 16286; i <= 16291; i++) - materials[i] = Material.DioriteSlab; - for (int i = 16292; i <= 16615; i++) - materials[i] = Material.BrickWall; - for (int i = 16616; i <= 16939; i++) - materials[i] = Material.PrismarineWall; - for (int i = 16940; i <= 17263; i++) - materials[i] = Material.RedSandstoneWall; - for (int i = 17264; i <= 17587; i++) - materials[i] = Material.MossyStoneBrickWall; - for (int i = 17588; i <= 17911; i++) - materials[i] = Material.GraniteWall; - for (int i = 17912; i <= 18235; i++) - materials[i] = Material.StoneBrickWall; - for (int i = 18236; i <= 18559; i++) - materials[i] = Material.MudBrickWall; - for (int i = 18560; i <= 18883; i++) - materials[i] = Material.NetherBrickWall; - for (int i = 18884; i <= 19207; i++) - materials[i] = Material.AndesiteWall; - for (int i = 19208; i <= 19531; i++) - materials[i] = Material.RedNetherBrickWall; - for (int i = 19532; i <= 19855; i++) - materials[i] = Material.SandstoneWall; - for (int i = 19856; i <= 20179; i++) - materials[i] = Material.EndStoneBrickWall; - for (int i = 20180; i <= 20503; i++) - materials[i] = Material.DioriteWall; - for (int i = 20504; i <= 20535; i++) - materials[i] = Material.Scaffolding; - for (int i = 20536; i <= 20539; i++) - materials[i] = Material.Loom; - for (int i = 20540; i <= 20551; i++) - materials[i] = Material.Barrel; - for (int i = 20552; i <= 20559; i++) - materials[i] = Material.Smoker; - for (int i = 20560; i <= 20567; i++) - materials[i] = Material.BlastFurnace; - for (int i = 20568; i <= 20568; i++) - materials[i] = Material.CartographyTable; - for (int i = 20569; i <= 20569; i++) - materials[i] = Material.FletchingTable; - for (int i = 20570; i <= 20581; i++) - materials[i] = Material.Grindstone; - for (int i = 20582; i <= 20597; i++) - materials[i] = Material.Lectern; - for (int i = 20598; i <= 20598; i++) - materials[i] = Material.SmithingTable; - for (int i = 20599; i <= 20602; i++) - materials[i] = Material.Stonecutter; - for (int i = 20603; i <= 20634; i++) - materials[i] = Material.Bell; - for (int i = 20635; i <= 20638; i++) - materials[i] = Material.Lantern; - for (int i = 20639; i <= 20642; i++) - materials[i] = Material.SoulLantern; - for (int i = 20643; i <= 20646; i++) - materials[i] = Material.CopperLantern; - for (int i = 20647; i <= 20650; i++) - materials[i] = Material.ExposedCopperLantern; - for (int i = 20651; i <= 20654; i++) - materials[i] = Material.WeatheredCopperLantern; - for (int i = 20655; i <= 20658; i++) - materials[i] = Material.OxidizedCopperLantern; - for (int i = 20659; i <= 20662; i++) - materials[i] = Material.WaxedCopperLantern; - for (int i = 20663; i <= 20666; i++) - materials[i] = Material.WaxedExposedCopperLantern; - for (int i = 20667; i <= 20670; i++) - materials[i] = Material.WaxedWeatheredCopperLantern; - for (int i = 20671; i <= 20674; i++) - materials[i] = Material.WaxedOxidizedCopperLantern; - for (int i = 20675; i <= 20706; i++) - materials[i] = Material.Campfire; - for (int i = 20707; i <= 20738; i++) - materials[i] = Material.SoulCampfire; - for (int i = 20739; i <= 20742; i++) - materials[i] = Material.SweetBerryBush; - for (int i = 20743; i <= 20745; i++) - materials[i] = Material.WarpedStem; - for (int i = 20746; i <= 20748; i++) - materials[i] = Material.StrippedWarpedStem; - for (int i = 20749; i <= 20751; i++) - materials[i] = Material.WarpedHyphae; - for (int i = 20752; i <= 20754; i++) - materials[i] = Material.StrippedWarpedHyphae; - for (int i = 20755; i <= 20755; i++) - materials[i] = Material.WarpedNylium; - for (int i = 20756; i <= 20756; i++) - materials[i] = Material.WarpedFungus; - for (int i = 20757; i <= 20757; i++) - materials[i] = Material.WarpedWartBlock; - for (int i = 20758; i <= 20758; i++) - materials[i] = Material.WarpedRoots; - for (int i = 20759; i <= 20759; i++) - materials[i] = Material.NetherSprouts; - for (int i = 20760; i <= 20762; i++) - materials[i] = Material.CrimsonStem; - for (int i = 20763; i <= 20765; i++) - materials[i] = Material.StrippedCrimsonStem; - for (int i = 20766; i <= 20768; i++) - materials[i] = Material.CrimsonHyphae; - for (int i = 20769; i <= 20771; i++) - materials[i] = Material.StrippedCrimsonHyphae; - for (int i = 20772; i <= 20772; i++) - materials[i] = Material.CrimsonNylium; - for (int i = 20773; i <= 20773; i++) - materials[i] = Material.CrimsonFungus; - for (int i = 20774; i <= 20774; i++) - materials[i] = Material.Shroomlight; - for (int i = 20775; i <= 20800; i++) - materials[i] = Material.WeepingVines; - for (int i = 20801; i <= 20801; i++) - materials[i] = Material.WeepingVinesPlant; - for (int i = 20802; i <= 20827; i++) - materials[i] = Material.TwistingVines; - for (int i = 20828; i <= 20828; i++) - materials[i] = Material.TwistingVinesPlant; - for (int i = 20829; i <= 20829; i++) - materials[i] = Material.CrimsonRoots; - for (int i = 20830; i <= 20830; i++) - materials[i] = Material.CrimsonPlanks; - for (int i = 20831; i <= 20831; i++) - materials[i] = Material.WarpedPlanks; - for (int i = 20832; i <= 20837; i++) - materials[i] = Material.CrimsonSlab; - for (int i = 20838; i <= 20843; i++) - materials[i] = Material.WarpedSlab; - for (int i = 20844; i <= 20845; i++) - materials[i] = Material.CrimsonPressurePlate; - for (int i = 20846; i <= 20847; i++) - materials[i] = Material.WarpedPressurePlate; - for (int i = 20848; i <= 20879; i++) - materials[i] = Material.CrimsonFence; - for (int i = 20880; i <= 20911; i++) - materials[i] = Material.WarpedFence; - for (int i = 20912; i <= 20975; i++) - materials[i] = Material.CrimsonTrapdoor; - for (int i = 20976; i <= 21039; i++) - materials[i] = Material.WarpedTrapdoor; - for (int i = 21040; i <= 21071; i++) - materials[i] = Material.CrimsonFenceGate; - for (int i = 21072; i <= 21103; i++) - materials[i] = Material.WarpedFenceGate; - for (int i = 21104; i <= 21183; i++) - materials[i] = Material.CrimsonStairs; - for (int i = 21184; i <= 21263; i++) - materials[i] = Material.WarpedStairs; - for (int i = 21264; i <= 21287; i++) - materials[i] = Material.CrimsonButton; - for (int i = 21288; i <= 21311; i++) - materials[i] = Material.WarpedButton; - for (int i = 21312; i <= 21375; i++) - materials[i] = Material.CrimsonDoor; - for (int i = 21376; i <= 21439; i++) - materials[i] = Material.WarpedDoor; - for (int i = 21440; i <= 21471; i++) - materials[i] = Material.CrimsonSign; - for (int i = 21472; i <= 21503; i++) - materials[i] = Material.WarpedSign; - for (int i = 21504; i <= 21511; i++) - materials[i] = Material.CrimsonWallSign; - for (int i = 21512; i <= 21519; i++) - materials[i] = Material.WarpedWallSign; - for (int i = 21520; i <= 21523; i++) - materials[i] = Material.StructureBlock; - for (int i = 21524; i <= 21535; i++) - materials[i] = Material.Jigsaw; - for (int i = 21536; i <= 21539; i++) - materials[i] = Material.TestBlock; - for (int i = 21540; i <= 21540; i++) - materials[i] = Material.TestInstanceBlock; - for (int i = 21541; i <= 21549; i++) - materials[i] = Material.Composter; - for (int i = 21550; i <= 21565; i++) - materials[i] = Material.Target; - for (int i = 21566; i <= 21589; i++) - materials[i] = Material.BeeNest; - for (int i = 21590; i <= 21613; i++) - materials[i] = Material.Beehive; - for (int i = 21614; i <= 21614; i++) - materials[i] = Material.HoneyBlock; - for (int i = 21615; i <= 21615; i++) - materials[i] = Material.HoneycombBlock; - for (int i = 21616; i <= 21616; i++) - materials[i] = Material.NetheriteBlock; - for (int i = 21617; i <= 21617; i++) - materials[i] = Material.AncientDebris; - for (int i = 21618; i <= 21618; i++) - materials[i] = Material.CryingObsidian; - for (int i = 21619; i <= 21623; i++) - materials[i] = Material.RespawnAnchor; - for (int i = 21624; i <= 21624; i++) - materials[i] = Material.PottedCrimsonFungus; - for (int i = 21625; i <= 21625; i++) - materials[i] = Material.PottedWarpedFungus; - for (int i = 21626; i <= 21626; i++) - materials[i] = Material.PottedCrimsonRoots; - for (int i = 21627; i <= 21627; i++) - materials[i] = Material.PottedWarpedRoots; - for (int i = 21628; i <= 21628; i++) - materials[i] = Material.Lodestone; - for (int i = 21629; i <= 21629; i++) - materials[i] = Material.Blackstone; - for (int i = 21630; i <= 21709; i++) - materials[i] = Material.BlackstoneStairs; - for (int i = 21710; i <= 22033; i++) - materials[i] = Material.BlackstoneWall; - for (int i = 22034; i <= 22039; i++) - materials[i] = Material.BlackstoneSlab; - for (int i = 22040; i <= 22040; i++) - materials[i] = Material.PolishedBlackstone; - for (int i = 22041; i <= 22041; i++) - materials[i] = Material.PolishedBlackstoneBricks; - for (int i = 22042; i <= 22042; i++) - materials[i] = Material.CrackedPolishedBlackstoneBricks; - for (int i = 22043; i <= 22043; i++) - materials[i] = Material.ChiseledPolishedBlackstone; - for (int i = 22044; i <= 22049; i++) - materials[i] = Material.PolishedBlackstoneBrickSlab; - for (int i = 22050; i <= 22129; i++) - materials[i] = Material.PolishedBlackstoneBrickStairs; - for (int i = 22130; i <= 22453; i++) - materials[i] = Material.PolishedBlackstoneBrickWall; - for (int i = 22454; i <= 22454; i++) - materials[i] = Material.GildedBlackstone; - for (int i = 22455; i <= 22534; i++) - materials[i] = Material.PolishedBlackstoneStairs; - for (int i = 22535; i <= 22540; i++) - materials[i] = Material.PolishedBlackstoneSlab; - for (int i = 22541; i <= 22542; i++) - materials[i] = Material.PolishedBlackstonePressurePlate; - for (int i = 22543; i <= 22566; i++) - materials[i] = Material.PolishedBlackstoneButton; - for (int i = 22567; i <= 22890; i++) - materials[i] = Material.PolishedBlackstoneWall; - for (int i = 22891; i <= 22891; i++) - materials[i] = Material.ChiseledNetherBricks; - for (int i = 22892; i <= 22892; i++) - materials[i] = Material.CrackedNetherBricks; - for (int i = 22893; i <= 22893; i++) - materials[i] = Material.QuartzBricks; - for (int i = 22894; i <= 22909; i++) - materials[i] = Material.Candle; - for (int i = 22910; i <= 22925; i++) - materials[i] = Material.WhiteCandle; - for (int i = 22926; i <= 22941; i++) - materials[i] = Material.OrangeCandle; - for (int i = 22942; i <= 22957; i++) - materials[i] = Material.MagentaCandle; - for (int i = 22958; i <= 22973; i++) - materials[i] = Material.LightBlueCandle; - for (int i = 22974; i <= 22989; i++) - materials[i] = Material.YellowCandle; - for (int i = 22990; i <= 23005; i++) - materials[i] = Material.LimeCandle; - for (int i = 23006; i <= 23021; i++) - materials[i] = Material.PinkCandle; - for (int i = 23022; i <= 23037; i++) - materials[i] = Material.GrayCandle; - for (int i = 23038; i <= 23053; i++) - materials[i] = Material.LightGrayCandle; - for (int i = 23054; i <= 23069; i++) - materials[i] = Material.CyanCandle; - for (int i = 23070; i <= 23085; i++) - materials[i] = Material.PurpleCandle; - for (int i = 23086; i <= 23101; i++) - materials[i] = Material.BlueCandle; - for (int i = 23102; i <= 23117; i++) - materials[i] = Material.BrownCandle; - for (int i = 23118; i <= 23133; i++) - materials[i] = Material.GreenCandle; - for (int i = 23134; i <= 23149; i++) - materials[i] = Material.RedCandle; - for (int i = 23150; i <= 23165; i++) - materials[i] = Material.BlackCandle; - for (int i = 23166; i <= 23167; i++) - materials[i] = Material.CandleCake; - for (int i = 23168; i <= 23169; i++) - materials[i] = Material.WhiteCandleCake; - for (int i = 23170; i <= 23171; i++) - materials[i] = Material.OrangeCandleCake; - for (int i = 23172; i <= 23173; i++) - materials[i] = Material.MagentaCandleCake; - for (int i = 23174; i <= 23175; i++) - materials[i] = Material.LightBlueCandleCake; - for (int i = 23176; i <= 23177; i++) - materials[i] = Material.YellowCandleCake; - for (int i = 23178; i <= 23179; i++) - materials[i] = Material.LimeCandleCake; - for (int i = 23180; i <= 23181; i++) - materials[i] = Material.PinkCandleCake; - for (int i = 23182; i <= 23183; i++) - materials[i] = Material.GrayCandleCake; - for (int i = 23184; i <= 23185; i++) - materials[i] = Material.LightGrayCandleCake; - for (int i = 23186; i <= 23187; i++) - materials[i] = Material.CyanCandleCake; - for (int i = 23188; i <= 23189; i++) - materials[i] = Material.PurpleCandleCake; - for (int i = 23190; i <= 23191; i++) - materials[i] = Material.BlueCandleCake; - for (int i = 23192; i <= 23193; i++) - materials[i] = Material.BrownCandleCake; - for (int i = 23194; i <= 23195; i++) - materials[i] = Material.GreenCandleCake; - for (int i = 23196; i <= 23197; i++) - materials[i] = Material.RedCandleCake; - for (int i = 23198; i <= 23199; i++) - materials[i] = Material.BlackCandleCake; - for (int i = 23200; i <= 23200; i++) - materials[i] = Material.AmethystBlock; - for (int i = 23201; i <= 23201; i++) - materials[i] = Material.BuddingAmethyst; - for (int i = 23202; i <= 23213; i++) - materials[i] = Material.AmethystCluster; - for (int i = 23214; i <= 23225; i++) - materials[i] = Material.LargeAmethystBud; - for (int i = 23226; i <= 23237; i++) - materials[i] = Material.MediumAmethystBud; - for (int i = 23238; i <= 23249; i++) - materials[i] = Material.SmallAmethystBud; - for (int i = 23250; i <= 23250; i++) - materials[i] = Material.Tuff; - for (int i = 23251; i <= 23256; i++) - materials[i] = Material.TuffSlab; - for (int i = 23257; i <= 23336; i++) - materials[i] = Material.TuffStairs; - for (int i = 23337; i <= 23660; i++) - materials[i] = Material.TuffWall; - for (int i = 23661; i <= 23661; i++) - materials[i] = Material.PolishedTuff; - for (int i = 23662; i <= 23667; i++) - materials[i] = Material.PolishedTuffSlab; - for (int i = 23668; i <= 23747; i++) - materials[i] = Material.PolishedTuffStairs; - for (int i = 23748; i <= 24071; i++) - materials[i] = Material.PolishedTuffWall; - for (int i = 24072; i <= 24072; i++) - materials[i] = Material.ChiseledTuff; - for (int i = 24073; i <= 24073; i++) - materials[i] = Material.TuffBricks; - for (int i = 24074; i <= 24079; i++) - materials[i] = Material.TuffBrickSlab; - for (int i = 24080; i <= 24159; i++) - materials[i] = Material.TuffBrickStairs; - for (int i = 24160; i <= 24483; i++) - materials[i] = Material.TuffBrickWall; - for (int i = 24484; i <= 24484; i++) - materials[i] = Material.ChiseledTuffBricks; - for (int i = 24485; i <= 24485; i++) - materials[i] = Material.Calcite; - for (int i = 24486; i <= 24486; i++) - materials[i] = Material.TintedGlass; - for (int i = 24487; i <= 24487; i++) - materials[i] = Material.PowderSnow; - for (int i = 24488; i <= 24583; i++) - materials[i] = Material.SculkSensor; - for (int i = 24584; i <= 24967; i++) - materials[i] = Material.CalibratedSculkSensor; - for (int i = 24968; i <= 24968; i++) - materials[i] = Material.Sculk; - for (int i = 24969; i <= 25096; i++) - materials[i] = Material.SculkVein; - for (int i = 25097; i <= 25098; i++) - materials[i] = Material.SculkCatalyst; - for (int i = 25099; i <= 25106; i++) - materials[i] = Material.SculkShrieker; - for (int i = 25107; i <= 25107; i++) - materials[i] = Material.CopperBlock; - for (int i = 25108; i <= 25108; i++) - materials[i] = Material.ExposedCopper; - for (int i = 25109; i <= 25109; i++) - materials[i] = Material.WeatheredCopper; - for (int i = 25110; i <= 25110; i++) - materials[i] = Material.OxidizedCopper; - for (int i = 25111; i <= 25111; i++) - materials[i] = Material.CopperOre; - for (int i = 25112; i <= 25112; i++) - materials[i] = Material.DeepslateCopperOre; - for (int i = 25113; i <= 25113; i++) - materials[i] = Material.OxidizedCutCopper; - for (int i = 25114; i <= 25114; i++) - materials[i] = Material.WeatheredCutCopper; - for (int i = 25115; i <= 25115; i++) - materials[i] = Material.ExposedCutCopper; - for (int i = 25116; i <= 25116; i++) - materials[i] = Material.CutCopper; - for (int i = 25117; i <= 25117; i++) - materials[i] = Material.OxidizedChiseledCopper; - for (int i = 25118; i <= 25118; i++) - materials[i] = Material.WeatheredChiseledCopper; - for (int i = 25119; i <= 25119; i++) - materials[i] = Material.ExposedChiseledCopper; - for (int i = 25120; i <= 25120; i++) - materials[i] = Material.ChiseledCopper; - for (int i = 25121; i <= 25121; i++) - materials[i] = Material.WaxedOxidizedChiseledCopper; - for (int i = 25122; i <= 25122; i++) - materials[i] = Material.WaxedWeatheredChiseledCopper; - for (int i = 25123; i <= 25123; i++) - materials[i] = Material.WaxedExposedChiseledCopper; - for (int i = 25124; i <= 25124; i++) - materials[i] = Material.WaxedChiseledCopper; - for (int i = 25125; i <= 25204; i++) - materials[i] = Material.OxidizedCutCopperStairs; - for (int i = 25205; i <= 25284; i++) - materials[i] = Material.WeatheredCutCopperStairs; - for (int i = 25285; i <= 25364; i++) - materials[i] = Material.ExposedCutCopperStairs; - for (int i = 25365; i <= 25444; i++) - materials[i] = Material.CutCopperStairs; - for (int i = 25445; i <= 25450; i++) - materials[i] = Material.OxidizedCutCopperSlab; - for (int i = 25451; i <= 25456; i++) - materials[i] = Material.WeatheredCutCopperSlab; - for (int i = 25457; i <= 25462; i++) - materials[i] = Material.ExposedCutCopperSlab; - for (int i = 25463; i <= 25468; i++) - materials[i] = Material.CutCopperSlab; - for (int i = 25469; i <= 25469; i++) - materials[i] = Material.WaxedCopperBlock; - for (int i = 25470; i <= 25470; i++) - materials[i] = Material.WaxedWeatheredCopper; - for (int i = 25471; i <= 25471; i++) - materials[i] = Material.WaxedExposedCopper; - for (int i = 25472; i <= 25472; i++) - materials[i] = Material.WaxedOxidizedCopper; - for (int i = 25473; i <= 25473; i++) - materials[i] = Material.WaxedOxidizedCutCopper; - for (int i = 25474; i <= 25474; i++) - materials[i] = Material.WaxedWeatheredCutCopper; - for (int i = 25475; i <= 25475; i++) - materials[i] = Material.WaxedExposedCutCopper; - for (int i = 25476; i <= 25476; i++) - materials[i] = Material.WaxedCutCopper; - for (int i = 25477; i <= 25556; i++) - materials[i] = Material.WaxedOxidizedCutCopperStairs; - for (int i = 25557; i <= 25636; i++) - materials[i] = Material.WaxedWeatheredCutCopperStairs; - for (int i = 25637; i <= 25716; i++) - materials[i] = Material.WaxedExposedCutCopperStairs; - for (int i = 25717; i <= 25796; i++) - materials[i] = Material.WaxedCutCopperStairs; - for (int i = 25797; i <= 25802; i++) - materials[i] = Material.WaxedOxidizedCutCopperSlab; - for (int i = 25803; i <= 25808; i++) - materials[i] = Material.WaxedWeatheredCutCopperSlab; - for (int i = 25809; i <= 25814; i++) - materials[i] = Material.WaxedExposedCutCopperSlab; - for (int i = 25815; i <= 25820; i++) - materials[i] = Material.WaxedCutCopperSlab; - for (int i = 25821; i <= 25884; i++) - materials[i] = Material.CopperDoor; - for (int i = 25885; i <= 25948; i++) - materials[i] = Material.ExposedCopperDoor; - for (int i = 25949; i <= 26012; i++) - materials[i] = Material.OxidizedCopperDoor; - for (int i = 26013; i <= 26076; i++) - materials[i] = Material.WeatheredCopperDoor; - for (int i = 26077; i <= 26140; i++) - materials[i] = Material.WaxedCopperDoor; - for (int i = 26141; i <= 26204; i++) - materials[i] = Material.WaxedExposedCopperDoor; - for (int i = 26205; i <= 26268; i++) - materials[i] = Material.WaxedOxidizedCopperDoor; - for (int i = 26269; i <= 26332; i++) - materials[i] = Material.WaxedWeatheredCopperDoor; - for (int i = 26333; i <= 26396; i++) - materials[i] = Material.CopperTrapdoor; - for (int i = 26397; i <= 26460; i++) - materials[i] = Material.ExposedCopperTrapdoor; - for (int i = 26461; i <= 26524; i++) - materials[i] = Material.OxidizedCopperTrapdoor; - for (int i = 26525; i <= 26588; i++) - materials[i] = Material.WeatheredCopperTrapdoor; - for (int i = 26589; i <= 26652; i++) - materials[i] = Material.WaxedCopperTrapdoor; - for (int i = 26653; i <= 26716; i++) - materials[i] = Material.WaxedExposedCopperTrapdoor; - for (int i = 26717; i <= 26780; i++) - materials[i] = Material.WaxedOxidizedCopperTrapdoor; - for (int i = 26781; i <= 26844; i++) - materials[i] = Material.WaxedWeatheredCopperTrapdoor; - for (int i = 26845; i <= 26846; i++) - materials[i] = Material.CopperGrate; - for (int i = 26847; i <= 26848; i++) - materials[i] = Material.ExposedCopperGrate; - for (int i = 26849; i <= 26850; i++) - materials[i] = Material.WeatheredCopperGrate; - for (int i = 26851; i <= 26852; i++) - materials[i] = Material.OxidizedCopperGrate; - for (int i = 26853; i <= 26854; i++) - materials[i] = Material.WaxedCopperGrate; - for (int i = 26855; i <= 26856; i++) - materials[i] = Material.WaxedExposedCopperGrate; - for (int i = 26857; i <= 26858; i++) - materials[i] = Material.WaxedWeatheredCopperGrate; - for (int i = 26859; i <= 26860; i++) - materials[i] = Material.WaxedOxidizedCopperGrate; - for (int i = 26861; i <= 26864; i++) - materials[i] = Material.CopperBulb; - for (int i = 26865; i <= 26868; i++) - materials[i] = Material.ExposedCopperBulb; - for (int i = 26869; i <= 26872; i++) - materials[i] = Material.WeatheredCopperBulb; - for (int i = 26873; i <= 26876; i++) - materials[i] = Material.OxidizedCopperBulb; - for (int i = 26877; i <= 26880; i++) - materials[i] = Material.WaxedCopperBulb; - for (int i = 26881; i <= 26884; i++) - materials[i] = Material.WaxedExposedCopperBulb; - for (int i = 26885; i <= 26888; i++) - materials[i] = Material.WaxedWeatheredCopperBulb; - for (int i = 26889; i <= 26892; i++) - materials[i] = Material.WaxedOxidizedCopperBulb; - for (int i = 26893; i <= 26916; i++) - materials[i] = Material.CopperChest; - for (int i = 26917; i <= 26940; i++) - materials[i] = Material.ExposedCopperChest; - for (int i = 26941; i <= 26964; i++) - materials[i] = Material.WeatheredCopperChest; - for (int i = 26965; i <= 26988; i++) - materials[i] = Material.OxidizedCopperChest; - for (int i = 26989; i <= 27012; i++) - materials[i] = Material.WaxedCopperChest; - for (int i = 27013; i <= 27036; i++) - materials[i] = Material.WaxedExposedCopperChest; - for (int i = 27037; i <= 27060; i++) - materials[i] = Material.WaxedWeatheredCopperChest; - for (int i = 27061; i <= 27084; i++) - materials[i] = Material.WaxedOxidizedCopperChest; - for (int i = 27085; i <= 27116; i++) - materials[i] = Material.CopperGolemStatue; - for (int i = 27117; i <= 27148; i++) - materials[i] = Material.ExposedCopperGolemStatue; - for (int i = 27149; i <= 27180; i++) - materials[i] = Material.WeatheredCopperGolemStatue; - for (int i = 27181; i <= 27212; i++) - materials[i] = Material.OxidizedCopperGolemStatue; - for (int i = 27213; i <= 27244; i++) - materials[i] = Material.WaxedCopperGolemStatue; - for (int i = 27245; i <= 27276; i++) - materials[i] = Material.WaxedExposedCopperGolemStatue; - for (int i = 27277; i <= 27308; i++) - materials[i] = Material.WaxedWeatheredCopperGolemStatue; - for (int i = 27309; i <= 27340; i++) - materials[i] = Material.WaxedOxidizedCopperGolemStatue; - for (int i = 27341; i <= 27364; i++) - materials[i] = Material.LightningRod; - for (int i = 27365; i <= 27388; i++) - materials[i] = Material.ExposedLightningRod; - for (int i = 27389; i <= 27412; i++) - materials[i] = Material.WeatheredLightningRod; - for (int i = 27413; i <= 27436; i++) - materials[i] = Material.OxidizedLightningRod; - for (int i = 27437; i <= 27460; i++) - materials[i] = Material.WaxedLightningRod; - for (int i = 27461; i <= 27484; i++) - materials[i] = Material.WaxedExposedLightningRod; - for (int i = 27485; i <= 27508; i++) - materials[i] = Material.WaxedWeatheredLightningRod; - for (int i = 27509; i <= 27532; i++) - materials[i] = Material.WaxedOxidizedLightningRod; - for (int i = 27533; i <= 27552; i++) - materials[i] = Material.PointedDripstone; - for (int i = 27553; i <= 27553; i++) - materials[i] = Material.DripstoneBlock; - for (int i = 27554; i <= 27605; i++) - materials[i] = Material.CaveVines; - for (int i = 27606; i <= 27607; i++) - materials[i] = Material.CaveVinesPlant; - for (int i = 27608; i <= 27608; i++) - materials[i] = Material.SporeBlossom; - for (int i = 27609; i <= 27609; i++) - materials[i] = Material.Azalea; - for (int i = 27610; i <= 27610; i++) - materials[i] = Material.FloweringAzalea; - for (int i = 27611; i <= 27611; i++) - materials[i] = Material.MossCarpet; - for (int i = 27612; i <= 27627; i++) - materials[i] = Material.PinkPetals; - for (int i = 27628; i <= 27643; i++) - materials[i] = Material.Wildflowers; - for (int i = 27644; i <= 27659; i++) - materials[i] = Material.LeafLitter; - for (int i = 27660; i <= 27660; i++) - materials[i] = Material.MossBlock; - for (int i = 27661; i <= 27692; i++) - materials[i] = Material.BigDripleaf; - for (int i = 27693; i <= 27700; i++) - materials[i] = Material.BigDripleafStem; - for (int i = 27701; i <= 27716; i++) - materials[i] = Material.SmallDripleaf; - for (int i = 27717; i <= 27718; i++) - materials[i] = Material.HangingRoots; - for (int i = 27719; i <= 27719; i++) - materials[i] = Material.RootedDirt; - for (int i = 27720; i <= 27720; i++) - materials[i] = Material.Mud; - for (int i = 27721; i <= 27723; i++) - materials[i] = Material.Deepslate; - for (int i = 27724; i <= 27724; i++) - materials[i] = Material.CobbledDeepslate; - for (int i = 27725; i <= 27804; i++) - materials[i] = Material.CobbledDeepslateStairs; - for (int i = 27805; i <= 27810; i++) - materials[i] = Material.CobbledDeepslateSlab; - for (int i = 27811; i <= 28134; i++) - materials[i] = Material.CobbledDeepslateWall; - for (int i = 28135; i <= 28135; i++) - materials[i] = Material.PolishedDeepslate; - for (int i = 28136; i <= 28215; i++) - materials[i] = Material.PolishedDeepslateStairs; - for (int i = 28216; i <= 28221; i++) - materials[i] = Material.PolishedDeepslateSlab; - for (int i = 28222; i <= 28545; i++) - materials[i] = Material.PolishedDeepslateWall; - for (int i = 28546; i <= 28546; i++) - materials[i] = Material.DeepslateTiles; - for (int i = 28547; i <= 28626; i++) - materials[i] = Material.DeepslateTileStairs; - for (int i = 28627; i <= 28632; i++) - materials[i] = Material.DeepslateTileSlab; - for (int i = 28633; i <= 28956; i++) - materials[i] = Material.DeepslateTileWall; - for (int i = 28957; i <= 28957; i++) - materials[i] = Material.DeepslateBricks; - for (int i = 28958; i <= 29037; i++) - materials[i] = Material.DeepslateBrickStairs; - for (int i = 29038; i <= 29043; i++) - materials[i] = Material.DeepslateBrickSlab; - for (int i = 29044; i <= 29367; i++) - materials[i] = Material.DeepslateBrickWall; - for (int i = 29368; i <= 29368; i++) - materials[i] = Material.ChiseledDeepslate; - for (int i = 29369; i <= 29369; i++) - materials[i] = Material.CrackedDeepslateBricks; - for (int i = 29370; i <= 29370; i++) - materials[i] = Material.CrackedDeepslateTiles; - for (int i = 29371; i <= 29373; i++) - materials[i] = Material.InfestedDeepslate; - for (int i = 29374; i <= 29374; i++) - materials[i] = Material.SmoothBasalt; - for (int i = 29375; i <= 29375; i++) - materials[i] = Material.RawIronBlock; - for (int i = 29376; i <= 29376; i++) - materials[i] = Material.RawCopperBlock; - for (int i = 29377; i <= 29377; i++) - materials[i] = Material.RawGoldBlock; - for (int i = 29378; i <= 29378; i++) - materials[i] = Material.PottedAzaleaBush; - for (int i = 29379; i <= 29379; i++) - materials[i] = Material.PottedFloweringAzaleaBush; - for (int i = 29380; i <= 29382; i++) - materials[i] = Material.OchreFroglight; - for (int i = 29383; i <= 29385; i++) - materials[i] = Material.VerdantFroglight; - for (int i = 29386; i <= 29388; i++) - materials[i] = Material.PearlescentFroglight; - for (int i = 29389; i <= 29389; i++) - materials[i] = Material.Frogspawn; - for (int i = 29390; i <= 29390; i++) - materials[i] = Material.ReinforcedDeepslate; - for (int i = 29391; i <= 29406; i++) - materials[i] = Material.DecoratedPot; - for (int i = 29407; i <= 29454; i++) - materials[i] = Material.Crafter; - for (int i = 29455; i <= 29466; i++) - materials[i] = Material.TrialSpawner; - for (int i = 29467; i <= 29498; i++) - materials[i] = Material.Vault; - for (int i = 29499; i <= 29500; i++) - materials[i] = Material.HeavyCore; - for (int i = 29501; i <= 29501; i++) - materials[i] = Material.PaleMossBlock; - for (int i = 29502; i <= 29663; i++) - materials[i] = Material.PaleMossCarpet; - for (int i = 29664; i <= 29665; i++) - materials[i] = Material.PaleHangingMoss; - for (int i = 29666; i <= 29666; i++) - materials[i] = Material.OpenEyeblossom; - for (int i = 29667; i <= 29667; i++) - materials[i] = Material.ClosedEyeblossom; - for (int i = 29668; i <= 29668; i++) - materials[i] = Material.PottedOpenEyeblossom; - for (int i = 29669; i <= 29669; i++) - materials[i] = Material.PottedClosedEyeblossom; - for (int i = 29670; i <= 29670; i++) - materials[i] = Material.FireflyBush; - } - - // - private static readonly BlockStateDefinition[] stateDefinitions = - [ - new(8, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(12, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(22, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(29, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(31, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(33, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(35, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(37, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(39, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(41, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(43, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(45, 40, - [ - new("age", ["0", "1", "2", "3", "4"], 8), - new("hanging", ["true", "false"], 4), - new("stage", ["0", "1"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(86, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(102, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(119, 4, - [ - new("dusted", ["0", "1", "2", "3"], 1) - ]), - new(125, 4, - [ - new("dusted", ["0", "1", "2", "3"], 1) - ]), - new(136, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(139, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(142, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(145, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(148, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(151, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(154, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(157, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(160, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(163, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(165, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(168, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(171, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(174, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(177, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(180, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(183, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(186, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(189, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(192, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(195, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(198, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(201, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(204, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(207, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(210, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(213, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(216, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(219, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(222, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(225, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(228, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(231, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(234, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(237, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(240, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(243, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(246, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(249, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(252, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(280, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(308, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(336, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(364, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(392, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(420, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(448, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(476, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(504, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(532, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(566, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(581, 1150, - [ - new("instrument", ["harp", "basedrum", "snare", "hat", "bass", "flute", "bell", "guitar", "chime", "xylophone", "iron_xylophone", "cow_bell", "didgeridoo", "bit", "banjo", "pling", "zombie", "skeleton", "creeper", "dragon", "wither_skeleton", "piglin", "custom_head"], 50), - new("note", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"], 2), - new("powered", ["true", "false"], 1) - ]), - new(1731, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1747, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1763, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1779, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1795, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1811, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1827, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1843, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1859, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1875, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1891, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1907, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1923, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1939, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1955, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1971, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1987, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2011, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2035, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(2055, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(2057, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(2069, 24, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("short", ["true", "false"], 2) - ]), - new(2109, 12, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 2) - ]), - new(2140, 2, - [ - new("unstable", ["true", "false"], 1) - ]), - new(2143, 256, - [ - new("facing", ["north", "south", "west", "east"], 64), - new("slot_0_occupied", ["true", "false"], 32), - new("slot_1_occupied", ["true", "false"], 16), - new("slot_2_occupied", ["true", "false"], 8), - new("slot_3_occupied", ["true", "false"], 4), - new("slot_4_occupied", ["true", "false"], 2), - new("slot_5_occupied", ["true", "false"], 1) - ]), - new(2399, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2463, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2527, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2591, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2655, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2719, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2783, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2847, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2911, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2975, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3039, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3103, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3170, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(3174, 512, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(3688, 18, - [ - new("axis", ["x", "y", "z"], 6), - new("creaking_heart_state", ["uprooted", "dormant", "awake"], 2), - new("natural", ["true", "false"], 1) - ]), - new(3706, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3786, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(3810, 1296, - [ - new("east", ["up", "side", "none"], 432), - new("north", ["up", "side", "none"], 144), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 9), - new("south", ["up", "side", "none"], 3), - new("west", ["up", "side", "none"], 1) - ]), - new(5110, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(5118, 8, - [ - new("moisture", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(5126, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(5134, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5166, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5198, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5230, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5262, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5294, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5326, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5358, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5390, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5422, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5454, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5518, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5526, 20, - [ - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south", "south_east", "south_west", "north_west", "north_east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5546, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5626, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5634, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5642, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5650, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5658, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5666, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5674, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5682, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5690, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5698, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5706, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5770, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5834, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5898, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5962, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6026, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6090, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6154, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6218, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6282, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6346, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6410, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6474, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6482, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6490, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6498, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6506, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6514, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6522, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6530, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6538, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6546, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6554, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6562, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6570, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6594, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6596, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6660, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6662, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6664, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6666, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6668, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6670, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6672, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6674, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6676, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6678, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6680, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(6682, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(6684, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(6686, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(6694, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6718, 8, - [ - new("layers", ["1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(6728, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6746, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6762, 2, - [ - new("has_record", ["true", "false"], 1) - ]), - new(6764, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(6799, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(6802, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(6806, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6811, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6816, 2, - [ - new("axis", ["x", "z"], 1) - ]), - new(6818, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6822, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(6826, 7, - [ - new("bites", ["0", "1", "2", "3", "4", "5", "6"], 1) - ]), - new(6833, 64, - [ - new("delay", ["1", "2", "3", "4"], 16), - new("facing", ["north", "south", "west", "east"], 4), - new("locked", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6913, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6977, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7041, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7105, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7169, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7233, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7297, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7361, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7425, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7489, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7565, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7629, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7693, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7757, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7789, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7821, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7853, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7885, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7917, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7949, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7981, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8013, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8045, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8051, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8057, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8063, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8069, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8075, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8081, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8087, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8093, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8099, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8133, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8137, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8141, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(8149, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(8157, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8189, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8317, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8445, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8477, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8557, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8637, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8717, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(8722, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8802, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8808, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(9134, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9166, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9246, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(9251, 8, - [ - new("has_bottle_0", ["true", "false"], 4), - new("has_bottle_1", ["true", "false"], 2), - new("has_bottle_2", ["true", "false"], 1) - ]), - new(9260, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(9264, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(9268, 8, - [ - new("eye", ["true", "false"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9278, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(9280, 12, - [ - new("age", ["0", "1", "2"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9292, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9374, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9382, 16, - [ - new("attached", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9398, 128, - [ - new("attached", ["true", "false"], 64), - new("disarmed", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("powered", ["true", "false"], 4), - new("south", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9527, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9607, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9687, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9767, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9780, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(10104, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(10457, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(10465, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(10473, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10497, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10521, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10545, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10569, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10593, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10617, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10641, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10665, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10689, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10713, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10745, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10753, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10785, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10793, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10825, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10833, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10865, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10873, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10905, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10913, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10945, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10953, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10985, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10993, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(10997, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11001, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11005, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(11029, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11045, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11061, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("mode", ["compare", "subtract"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11077, 32, - [ - new("inverted", ["true", "false"], 16), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11111, 10, - [ - new("enabled", ["true", "false"], 5), - new("facing", ["down", "north", "south", "west", "east"], 1) - ]), - new(11123, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(11126, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11206, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11230, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(11258, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11290, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11322, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11354, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11386, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11418, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11450, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11482, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11514, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11546, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11578, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11610, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11642, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11674, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11706, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11738, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11770, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11850, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11930, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12010, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12090, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12170, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12250, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12331, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12333, 32, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12365, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12432, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12512, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12592, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12672, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12678, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12684, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12691, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(12713, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(12715, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(12717, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(12719, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(12721, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(12723, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(12725, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12741, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12757, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12773, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12789, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12805, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12821, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12837, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12853, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12869, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12885, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12901, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12917, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12933, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12949, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12965, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12981, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12985, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12989, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12993, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(12997, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13001, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13005, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13009, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13013, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13017, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13021, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13025, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13029, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13033, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13037, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13041, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13048, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13128, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13134, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13140, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13146, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13152, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13158, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13164, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13170, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13176, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13182, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13188, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13194, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13200, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13206, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13212, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13218, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13224, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13230, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13236, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13242, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13248, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13254, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13260, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13266, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13272, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13282, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13314, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13346, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13378, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13410, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13442, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13474, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13506, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13538, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13570, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13602, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13634, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13666, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13698, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13730, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13762, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13794, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13826, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13858, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13922, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13986, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14050, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14114, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14178, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14242, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14306, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14370, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14434, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14440, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(14504, 6, - [ - new("age", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(14511, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(14514, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14595, 2, - [ - new("age", ["0", "1"], 1) - ]), - new(14597, 10, - [ - new("age", ["0", "1", "2", "3", "4"], 2), - new("half", ["upper", "lower"], 1) - ]), - new(14607, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(14609, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(14615, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14627, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14639, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(14646, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(14650, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14662, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14668, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14674, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14680, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14686, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14692, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14698, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14704, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14710, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14716, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14722, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14728, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14734, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14740, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14746, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14752, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14758, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14764, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14768, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14772, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14776, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14780, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14784, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14788, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14792, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14796, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14800, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14804, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14808, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14812, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14816, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14820, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14824, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14860, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(14888, 12, - [ - new("eggs", ["1", "2", "3", "4"], 3), - new("hatch", ["0", "1", "2"], 1) - ]), - new(14900, 3, - [ - new("hatch", ["0", "1", "2"], 1) - ]), - new(14903, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("hydration", ["0", "1", "2", "3"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14945, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(14947, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(14949, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(14951, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(14953, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(14955, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(14957, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(14959, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(14961, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(14963, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(14965, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(14967, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(14969, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(14971, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(14973, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(14975, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(14977, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(14979, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(14981, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(14983, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(14985, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14993, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15001, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15009, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15017, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15025, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15033, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15041, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15049, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15057, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15065, 8, - [ - new("pickles", ["1", "2", "3", "4"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15074, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15077, 12, - [ - new("age", ["0", "1"], 6), - new("leaves", ["none", "small", "large"], 2), - new("stage", ["0", "1"], 1) - ]), - new(15092, 2, - [ - new("drag", ["true", "false"], 1) - ]), - new(15094, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15174, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15254, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15334, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15414, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15494, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15574, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15654, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15734, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15814, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15894, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15974, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16054, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16134, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16214, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16220, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16226, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16232, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16238, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16244, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16250, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16256, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16262, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16268, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16274, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16280, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16286, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16292, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16616, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16940, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17264, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17588, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17912, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18236, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18560, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18884, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19208, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19532, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19856, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20180, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20504, 32, - [ - new("bottom", ["true", "false"], 16), - new("distance", ["0", "1", "2", "3", "4", "5", "6", "7"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20536, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(20540, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("open", ["true", "false"], 1) - ]), - new(20552, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(20560, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(20570, 12, - [ - new("face", ["floor", "wall", "ceiling"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(20582, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("has_book", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20599, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(20603, 32, - [ - new("attachment", ["floor", "ceiling", "single_wall", "double_wall"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20635, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20639, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20643, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20647, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20651, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20655, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20659, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20663, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20667, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20671, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20675, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20707, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20739, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(20743, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20746, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20749, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20752, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20760, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20763, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20766, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20769, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20775, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(20802, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(20832, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20838, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20844, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(20846, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(20848, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(20880, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(20912, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20976, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21040, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(21072, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(21104, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21184, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21264, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(21288, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(21312, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(21376, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(21440, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21472, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21504, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21512, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21520, 4, - [ - new("mode", ["save", "load", "corner", "data"], 1) - ]), - new(21524, 12, - [ - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 1) - ]), - new(21536, 4, - [ - new("mode", ["start", "log", "fail", "accept"], 1) - ]), - new(21541, 9, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(21550, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(21566, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(21590, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(21619, 5, - [ - new("charges", ["0", "1", "2", "3", "4"], 1) - ]), - new(21630, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21710, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(22034, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22044, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22050, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22130, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(22455, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22535, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22541, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(22543, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(22567, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(22894, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22910, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22926, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22942, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22958, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22974, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22990, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23006, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23022, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23038, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23054, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23070, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23086, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23102, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23118, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23134, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23150, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23166, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23168, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23170, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23172, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23174, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23176, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23178, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23180, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23182, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23184, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23186, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23188, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23190, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23192, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23194, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23196, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23198, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23202, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23214, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23226, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23238, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23251, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23257, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23337, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(23662, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23668, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23748, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(24074, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24080, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24160, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(24488, 96, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24584, 384, - [ - new("facing", ["north", "south", "west", "east"], 96), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24969, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(25097, 2, - [ - new("bloom", ["true", "false"], 1) - ]), - new(25099, 8, - [ - new("can_summon", ["true", "false"], 4), - new("shrieking", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25125, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25205, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25285, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25365, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25445, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25451, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25457, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25463, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25477, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25557, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25637, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25717, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25797, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25803, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25809, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25815, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25821, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25885, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(25949, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(26013, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(26077, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(26141, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(26205, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(26269, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(26333, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26397, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26461, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26525, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26589, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26653, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26717, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26781, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26845, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(26847, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(26849, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(26851, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(26853, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(26855, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(26857, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(26859, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(26861, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(26865, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(26869, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(26873, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(26877, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(26881, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(26885, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(26889, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(26893, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(26917, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(26941, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(26965, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(26989, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(27013, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(27037, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(27061, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(27085, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27117, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27149, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27181, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27213, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27245, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27277, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27309, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27341, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27365, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27389, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27413, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27437, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27461, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27485, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27509, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27533, 20, - [ - new("thickness", ["tip_merge", "tip", "frustum", "middle", "base"], 4), - new("vertical_direction", ["up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27554, 52, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 2), - new("berries", ["true", "false"], 1) - ]), - new(27606, 2, - [ - new("berries", ["true", "false"], 1) - ]), - new(27612, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("flower_amount", ["1", "2", "3", "4"], 1) - ]), - new(27628, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("flower_amount", ["1", "2", "3", "4"], 1) - ]), - new(27644, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("segment_amount", ["1", "2", "3", "4"], 1) - ]), - new(27661, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("tilt", ["none", "unstable", "partial", "full"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27693, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27701, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("half", ["upper", "lower"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27717, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(27721, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(27725, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27805, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27811, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(28136, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28216, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28222, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(28547, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28627, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28633, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(28958, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(29038, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(29044, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(29371, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(29380, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(29383, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(29386, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(29391, 16, - [ - new("cracked", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(29407, 48, - [ - new("crafting", ["true", "false"], 24), - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(29455, 12, - [ - new("ominous", ["true", "false"], 6), - new("trial_spawner_state", ["inactive", "waiting_for_players", "active", "waiting_for_reward_ejection", "ejecting_reward", "cooldown"], 1) - ]), - new(29467, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("ominous", ["true", "false"], 4), - new("vault_state", ["inactive", "active", "unlocking", "ejecting"], 1) - ]), - new(29499, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(29502, 162, - [ - new("bottom", ["true", "false"], 81), - new("east", ["none", "low", "tall"], 27), - new("north", ["none", "low", "tall"], 9), - new("south", ["none", "low", "tall"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(29664, 2, - [ - new("tip", ["true", "false"], 1) - ]), - ]; - // - - protected override Dictionary GetDict() - { - return materials; - } - - protected override BlockStateDefinition[] GetStateDefinitions() - { - return stateDefinitions; - } - } -} diff --git a/MinecraftClient/Mapping/BlockPalettes/Palette261.cs b/MinecraftClient/Mapping/BlockPalettes/Palette261.cs deleted file mode 100644 index d92594556f..0000000000 --- a/MinecraftClient/Mapping/BlockPalettes/Palette261.cs +++ /dev/null @@ -1,6680 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.BlockPalettes -{ - public class Palette261 : BlockPalette - { - private static readonly Dictionary materials = new(); - - static Palette261() - { - for (int i = 0; i <= 0; i++) - materials[i] = Material.Air; - for (int i = 1; i <= 1; i++) - materials[i] = Material.Stone; - for (int i = 2; i <= 2; i++) - materials[i] = Material.Granite; - for (int i = 3; i <= 3; i++) - materials[i] = Material.PolishedGranite; - for (int i = 4; i <= 4; i++) - materials[i] = Material.Diorite; - for (int i = 5; i <= 5; i++) - materials[i] = Material.PolishedDiorite; - for (int i = 6; i <= 6; i++) - materials[i] = Material.Andesite; - for (int i = 7; i <= 7; i++) - materials[i] = Material.PolishedAndesite; - for (int i = 8; i <= 9; i++) - materials[i] = Material.GrassBlock; - for (int i = 10; i <= 10; i++) - materials[i] = Material.Dirt; - for (int i = 11; i <= 11; i++) - materials[i] = Material.CoarseDirt; - for (int i = 12; i <= 13; i++) - materials[i] = Material.Podzol; - for (int i = 14; i <= 14; i++) - materials[i] = Material.Cobblestone; - for (int i = 15; i <= 15; i++) - materials[i] = Material.OakPlanks; - for (int i = 16; i <= 16; i++) - materials[i] = Material.SprucePlanks; - for (int i = 17; i <= 17; i++) - materials[i] = Material.BirchPlanks; - for (int i = 18; i <= 18; i++) - materials[i] = Material.JunglePlanks; - for (int i = 19; i <= 19; i++) - materials[i] = Material.AcaciaPlanks; - for (int i = 20; i <= 20; i++) - materials[i] = Material.CherryPlanks; - for (int i = 21; i <= 21; i++) - materials[i] = Material.DarkOakPlanks; - for (int i = 22; i <= 24; i++) - materials[i] = Material.PaleOakWood; - for (int i = 25; i <= 25; i++) - materials[i] = Material.PaleOakPlanks; - for (int i = 26; i <= 26; i++) - materials[i] = Material.MangrovePlanks; - for (int i = 27; i <= 27; i++) - materials[i] = Material.BambooPlanks; - for (int i = 28; i <= 28; i++) - materials[i] = Material.BambooMosaic; - for (int i = 29; i <= 30; i++) - materials[i] = Material.OakSapling; - for (int i = 31; i <= 32; i++) - materials[i] = Material.SpruceSapling; - for (int i = 33; i <= 34; i++) - materials[i] = Material.BirchSapling; - for (int i = 35; i <= 36; i++) - materials[i] = Material.JungleSapling; - for (int i = 37; i <= 38; i++) - materials[i] = Material.AcaciaSapling; - for (int i = 39; i <= 40; i++) - materials[i] = Material.CherrySapling; - for (int i = 41; i <= 42; i++) - materials[i] = Material.DarkOakSapling; - for (int i = 43; i <= 44; i++) - materials[i] = Material.PaleOakSapling; - for (int i = 45; i <= 84; i++) - materials[i] = Material.MangrovePropagule; - for (int i = 85; i <= 85; i++) - materials[i] = Material.Bedrock; - for (int i = 86; i <= 101; i++) - materials[i] = Material.Water; - for (int i = 102; i <= 117; i++) - materials[i] = Material.Lava; - for (int i = 118; i <= 118; i++) - materials[i] = Material.Sand; - for (int i = 119; i <= 122; i++) - materials[i] = Material.SuspiciousSand; - for (int i = 123; i <= 123; i++) - materials[i] = Material.RedSand; - for (int i = 124; i <= 124; i++) - materials[i] = Material.Gravel; - for (int i = 125; i <= 128; i++) - materials[i] = Material.SuspiciousGravel; - for (int i = 129; i <= 129; i++) - materials[i] = Material.GoldOre; - for (int i = 130; i <= 130; i++) - materials[i] = Material.DeepslateGoldOre; - for (int i = 131; i <= 131; i++) - materials[i] = Material.IronOre; - for (int i = 132; i <= 132; i++) - materials[i] = Material.DeepslateIronOre; - for (int i = 133; i <= 133; i++) - materials[i] = Material.CoalOre; - for (int i = 134; i <= 134; i++) - materials[i] = Material.DeepslateCoalOre; - for (int i = 135; i <= 135; i++) - materials[i] = Material.NetherGoldOre; - for (int i = 136; i <= 138; i++) - materials[i] = Material.OakLog; - for (int i = 139; i <= 141; i++) - materials[i] = Material.SpruceLog; - for (int i = 142; i <= 144; i++) - materials[i] = Material.BirchLog; - for (int i = 145; i <= 147; i++) - materials[i] = Material.JungleLog; - for (int i = 148; i <= 150; i++) - materials[i] = Material.AcaciaLog; - for (int i = 151; i <= 153; i++) - materials[i] = Material.CherryLog; - for (int i = 154; i <= 156; i++) - materials[i] = Material.DarkOakLog; - for (int i = 157; i <= 159; i++) - materials[i] = Material.PaleOakLog; - for (int i = 160; i <= 162; i++) - materials[i] = Material.MangroveLog; - for (int i = 163; i <= 164; i++) - materials[i] = Material.MangroveRoots; - for (int i = 165; i <= 167; i++) - materials[i] = Material.MuddyMangroveRoots; - for (int i = 168; i <= 170; i++) - materials[i] = Material.BambooBlock; - for (int i = 171; i <= 173; i++) - materials[i] = Material.StrippedSpruceLog; - for (int i = 174; i <= 176; i++) - materials[i] = Material.StrippedBirchLog; - for (int i = 177; i <= 179; i++) - materials[i] = Material.StrippedJungleLog; - for (int i = 180; i <= 182; i++) - materials[i] = Material.StrippedAcaciaLog; - for (int i = 183; i <= 185; i++) - materials[i] = Material.StrippedCherryLog; - for (int i = 186; i <= 188; i++) - materials[i] = Material.StrippedDarkOakLog; - for (int i = 189; i <= 191; i++) - materials[i] = Material.StrippedPaleOakLog; - for (int i = 192; i <= 194; i++) - materials[i] = Material.StrippedOakLog; - for (int i = 195; i <= 197; i++) - materials[i] = Material.StrippedMangroveLog; - for (int i = 198; i <= 200; i++) - materials[i] = Material.StrippedBambooBlock; - for (int i = 201; i <= 203; i++) - materials[i] = Material.OakWood; - for (int i = 204; i <= 206; i++) - materials[i] = Material.SpruceWood; - for (int i = 207; i <= 209; i++) - materials[i] = Material.BirchWood; - for (int i = 210; i <= 212; i++) - materials[i] = Material.JungleWood; - for (int i = 213; i <= 215; i++) - materials[i] = Material.AcaciaWood; - for (int i = 216; i <= 218; i++) - materials[i] = Material.CherryWood; - for (int i = 219; i <= 221; i++) - materials[i] = Material.DarkOakWood; - for (int i = 222; i <= 224; i++) - materials[i] = Material.MangroveWood; - for (int i = 225; i <= 227; i++) - materials[i] = Material.StrippedOakWood; - for (int i = 228; i <= 230; i++) - materials[i] = Material.StrippedSpruceWood; - for (int i = 231; i <= 233; i++) - materials[i] = Material.StrippedBirchWood; - for (int i = 234; i <= 236; i++) - materials[i] = Material.StrippedJungleWood; - for (int i = 237; i <= 239; i++) - materials[i] = Material.StrippedAcaciaWood; - for (int i = 240; i <= 242; i++) - materials[i] = Material.StrippedCherryWood; - for (int i = 243; i <= 245; i++) - materials[i] = Material.StrippedDarkOakWood; - for (int i = 246; i <= 248; i++) - materials[i] = Material.StrippedPaleOakWood; - for (int i = 249; i <= 251; i++) - materials[i] = Material.StrippedMangroveWood; - for (int i = 252; i <= 279; i++) - materials[i] = Material.OakLeaves; - for (int i = 280; i <= 307; i++) - materials[i] = Material.SpruceLeaves; - for (int i = 308; i <= 335; i++) - materials[i] = Material.BirchLeaves; - for (int i = 336; i <= 363; i++) - materials[i] = Material.JungleLeaves; - for (int i = 364; i <= 391; i++) - materials[i] = Material.AcaciaLeaves; - for (int i = 392; i <= 419; i++) - materials[i] = Material.CherryLeaves; - for (int i = 420; i <= 447; i++) - materials[i] = Material.DarkOakLeaves; - for (int i = 448; i <= 475; i++) - materials[i] = Material.PaleOakLeaves; - for (int i = 476; i <= 503; i++) - materials[i] = Material.MangroveLeaves; - for (int i = 504; i <= 531; i++) - materials[i] = Material.AzaleaLeaves; - for (int i = 532; i <= 559; i++) - materials[i] = Material.FloweringAzaleaLeaves; - for (int i = 560; i <= 560; i++) - materials[i] = Material.Sponge; - for (int i = 561; i <= 561; i++) - materials[i] = Material.WetSponge; - for (int i = 562; i <= 562; i++) - materials[i] = Material.Glass; - for (int i = 563; i <= 563; i++) - materials[i] = Material.LapisOre; - for (int i = 564; i <= 564; i++) - materials[i] = Material.DeepslateLapisOre; - for (int i = 565; i <= 565; i++) - materials[i] = Material.LapisBlock; - for (int i = 566; i <= 577; i++) - materials[i] = Material.Dispenser; - for (int i = 578; i <= 578; i++) - materials[i] = Material.Sandstone; - for (int i = 579; i <= 579; i++) - materials[i] = Material.ChiseledSandstone; - for (int i = 580; i <= 580; i++) - materials[i] = Material.CutSandstone; - for (int i = 581; i <= 1930; i++) - materials[i] = Material.NoteBlock; - for (int i = 1931; i <= 1946; i++) - materials[i] = Material.WhiteBed; - for (int i = 1947; i <= 1962; i++) - materials[i] = Material.OrangeBed; - for (int i = 1963; i <= 1978; i++) - materials[i] = Material.MagentaBed; - for (int i = 1979; i <= 1994; i++) - materials[i] = Material.LightBlueBed; - for (int i = 1995; i <= 2010; i++) - materials[i] = Material.YellowBed; - for (int i = 2011; i <= 2026; i++) - materials[i] = Material.LimeBed; - for (int i = 2027; i <= 2042; i++) - materials[i] = Material.PinkBed; - for (int i = 2043; i <= 2058; i++) - materials[i] = Material.GrayBed; - for (int i = 2059; i <= 2074; i++) - materials[i] = Material.LightGrayBed; - for (int i = 2075; i <= 2090; i++) - materials[i] = Material.CyanBed; - for (int i = 2091; i <= 2106; i++) - materials[i] = Material.PurpleBed; - for (int i = 2107; i <= 2122; i++) - materials[i] = Material.BlueBed; - for (int i = 2123; i <= 2138; i++) - materials[i] = Material.BrownBed; - for (int i = 2139; i <= 2154; i++) - materials[i] = Material.GreenBed; - for (int i = 2155; i <= 2170; i++) - materials[i] = Material.RedBed; - for (int i = 2171; i <= 2186; i++) - materials[i] = Material.BlackBed; - for (int i = 2187; i <= 2210; i++) - materials[i] = Material.PoweredRail; - for (int i = 2211; i <= 2234; i++) - materials[i] = Material.DetectorRail; - for (int i = 2235; i <= 2246; i++) - materials[i] = Material.StickyPiston; - for (int i = 2247; i <= 2247; i++) - materials[i] = Material.Cobweb; - for (int i = 2248; i <= 2248; i++) - materials[i] = Material.ShortGrass; - for (int i = 2249; i <= 2249; i++) - materials[i] = Material.Fern; - for (int i = 2250; i <= 2250; i++) - materials[i] = Material.DeadBush; - for (int i = 2251; i <= 2251; i++) - materials[i] = Material.Bush; - for (int i = 2252; i <= 2252; i++) - materials[i] = Material.ShortDryGrass; - for (int i = 2253; i <= 2253; i++) - materials[i] = Material.TallDryGrass; - for (int i = 2254; i <= 2254; i++) - materials[i] = Material.Seagrass; - for (int i = 2255; i <= 2256; i++) - materials[i] = Material.TallSeagrass; - for (int i = 2257; i <= 2268; i++) - materials[i] = Material.Piston; - for (int i = 2269; i <= 2292; i++) - materials[i] = Material.PistonHead; - for (int i = 2293; i <= 2293; i++) - materials[i] = Material.WhiteWool; - for (int i = 2294; i <= 2294; i++) - materials[i] = Material.OrangeWool; - for (int i = 2295; i <= 2295; i++) - materials[i] = Material.MagentaWool; - for (int i = 2296; i <= 2296; i++) - materials[i] = Material.LightBlueWool; - for (int i = 2297; i <= 2297; i++) - materials[i] = Material.YellowWool; - for (int i = 2298; i <= 2298; i++) - materials[i] = Material.LimeWool; - for (int i = 2299; i <= 2299; i++) - materials[i] = Material.PinkWool; - for (int i = 2300; i <= 2300; i++) - materials[i] = Material.GrayWool; - for (int i = 2301; i <= 2301; i++) - materials[i] = Material.LightGrayWool; - for (int i = 2302; i <= 2302; i++) - materials[i] = Material.CyanWool; - for (int i = 2303; i <= 2303; i++) - materials[i] = Material.PurpleWool; - for (int i = 2304; i <= 2304; i++) - materials[i] = Material.BlueWool; - for (int i = 2305; i <= 2305; i++) - materials[i] = Material.BrownWool; - for (int i = 2306; i <= 2306; i++) - materials[i] = Material.GreenWool; - for (int i = 2307; i <= 2307; i++) - materials[i] = Material.RedWool; - for (int i = 2308; i <= 2308; i++) - materials[i] = Material.BlackWool; - for (int i = 2309; i <= 2320; i++) - materials[i] = Material.MovingPiston; - for (int i = 2321; i <= 2321; i++) - materials[i] = Material.Dandelion; - for (int i = 2322; i <= 2322; i++) - materials[i] = Material.GoldenDandelion; - for (int i = 2323; i <= 2323; i++) - materials[i] = Material.Torchflower; - for (int i = 2324; i <= 2324; i++) - materials[i] = Material.Poppy; - for (int i = 2325; i <= 2325; i++) - materials[i] = Material.BlueOrchid; - for (int i = 2326; i <= 2326; i++) - materials[i] = Material.Allium; - for (int i = 2327; i <= 2327; i++) - materials[i] = Material.AzureBluet; - for (int i = 2328; i <= 2328; i++) - materials[i] = Material.RedTulip; - for (int i = 2329; i <= 2329; i++) - materials[i] = Material.OrangeTulip; - for (int i = 2330; i <= 2330; i++) - materials[i] = Material.WhiteTulip; - for (int i = 2331; i <= 2331; i++) - materials[i] = Material.PinkTulip; - for (int i = 2332; i <= 2332; i++) - materials[i] = Material.OxeyeDaisy; - for (int i = 2333; i <= 2333; i++) - materials[i] = Material.Cornflower; - for (int i = 2334; i <= 2334; i++) - materials[i] = Material.WitherRose; - for (int i = 2335; i <= 2335; i++) - materials[i] = Material.LilyOfTheValley; - for (int i = 2336; i <= 2336; i++) - materials[i] = Material.BrownMushroom; - for (int i = 2337; i <= 2337; i++) - materials[i] = Material.RedMushroom; - for (int i = 2338; i <= 2338; i++) - materials[i] = Material.GoldBlock; - for (int i = 2339; i <= 2339; i++) - materials[i] = Material.IronBlock; - for (int i = 2340; i <= 2340; i++) - materials[i] = Material.Bricks; - for (int i = 2341; i <= 2342; i++) - materials[i] = Material.Tnt; - for (int i = 2343; i <= 2343; i++) - materials[i] = Material.Bookshelf; - for (int i = 2344; i <= 2599; i++) - materials[i] = Material.ChiseledBookshelf; - for (int i = 2600; i <= 2663; i++) - materials[i] = Material.AcaciaShelf; - for (int i = 2664; i <= 2727; i++) - materials[i] = Material.BambooShelf; - for (int i = 2728; i <= 2791; i++) - materials[i] = Material.BirchShelf; - for (int i = 2792; i <= 2855; i++) - materials[i] = Material.CherryShelf; - for (int i = 2856; i <= 2919; i++) - materials[i] = Material.CrimsonShelf; - for (int i = 2920; i <= 2983; i++) - materials[i] = Material.DarkOakShelf; - for (int i = 2984; i <= 3047; i++) - materials[i] = Material.JungleShelf; - for (int i = 3048; i <= 3111; i++) - materials[i] = Material.MangroveShelf; - for (int i = 3112; i <= 3175; i++) - materials[i] = Material.OakShelf; - for (int i = 3176; i <= 3239; i++) - materials[i] = Material.PaleOakShelf; - for (int i = 3240; i <= 3303; i++) - materials[i] = Material.SpruceShelf; - for (int i = 3304; i <= 3367; i++) - materials[i] = Material.WarpedShelf; - for (int i = 3368; i <= 3368; i++) - materials[i] = Material.MossyCobblestone; - for (int i = 3369; i <= 3369; i++) - materials[i] = Material.Obsidian; - for (int i = 3370; i <= 3370; i++) - materials[i] = Material.Torch; - for (int i = 3371; i <= 3374; i++) - materials[i] = Material.WallTorch; - for (int i = 3375; i <= 3886; i++) - materials[i] = Material.Fire; - for (int i = 3887; i <= 3887; i++) - materials[i] = Material.SoulFire; - for (int i = 3888; i <= 3888; i++) - materials[i] = Material.Spawner; - for (int i = 3889; i <= 3906; i++) - materials[i] = Material.CreakingHeart; - for (int i = 3907; i <= 3986; i++) - materials[i] = Material.OakStairs; - for (int i = 3987; i <= 4010; i++) - materials[i] = Material.Chest; - for (int i = 4011; i <= 5306; i++) - materials[i] = Material.RedstoneWire; - for (int i = 5307; i <= 5307; i++) - materials[i] = Material.DiamondOre; - for (int i = 5308; i <= 5308; i++) - materials[i] = Material.DeepslateDiamondOre; - for (int i = 5309; i <= 5309; i++) - materials[i] = Material.DiamondBlock; - for (int i = 5310; i <= 5310; i++) - materials[i] = Material.CraftingTable; - for (int i = 5311; i <= 5318; i++) - materials[i] = Material.Wheat; - for (int i = 5319; i <= 5326; i++) - materials[i] = Material.Farmland; - for (int i = 5327; i <= 5334; i++) - materials[i] = Material.Furnace; - for (int i = 5335; i <= 5366; i++) - materials[i] = Material.OakSign; - for (int i = 5367; i <= 5398; i++) - materials[i] = Material.SpruceSign; - for (int i = 5399; i <= 5430; i++) - materials[i] = Material.BirchSign; - for (int i = 5431; i <= 5462; i++) - materials[i] = Material.AcaciaSign; - for (int i = 5463; i <= 5494; i++) - materials[i] = Material.CherrySign; - for (int i = 5495; i <= 5526; i++) - materials[i] = Material.JungleSign; - for (int i = 5527; i <= 5558; i++) - materials[i] = Material.DarkOakSign; - for (int i = 5559; i <= 5590; i++) - materials[i] = Material.PaleOakSign; - for (int i = 5591; i <= 5622; i++) - materials[i] = Material.MangroveSign; - for (int i = 5623; i <= 5654; i++) - materials[i] = Material.BambooSign; - for (int i = 5655; i <= 5718; i++) - materials[i] = Material.OakDoor; - for (int i = 5719; i <= 5726; i++) - materials[i] = Material.Ladder; - for (int i = 5727; i <= 5746; i++) - materials[i] = Material.Rail; - for (int i = 5747; i <= 5826; i++) - materials[i] = Material.CobblestoneStairs; - for (int i = 5827; i <= 5834; i++) - materials[i] = Material.OakWallSign; - for (int i = 5835; i <= 5842; i++) - materials[i] = Material.SpruceWallSign; - for (int i = 5843; i <= 5850; i++) - materials[i] = Material.BirchWallSign; - for (int i = 5851; i <= 5858; i++) - materials[i] = Material.AcaciaWallSign; - for (int i = 5859; i <= 5866; i++) - materials[i] = Material.CherryWallSign; - for (int i = 5867; i <= 5874; i++) - materials[i] = Material.JungleWallSign; - for (int i = 5875; i <= 5882; i++) - materials[i] = Material.DarkOakWallSign; - for (int i = 5883; i <= 5890; i++) - materials[i] = Material.PaleOakWallSign; - for (int i = 5891; i <= 5898; i++) - materials[i] = Material.MangroveWallSign; - for (int i = 5899; i <= 5906; i++) - materials[i] = Material.BambooWallSign; - for (int i = 5907; i <= 5970; i++) - materials[i] = Material.OakHangingSign; - for (int i = 5971; i <= 6034; i++) - materials[i] = Material.SpruceHangingSign; - for (int i = 6035; i <= 6098; i++) - materials[i] = Material.BirchHangingSign; - for (int i = 6099; i <= 6162; i++) - materials[i] = Material.AcaciaHangingSign; - for (int i = 6163; i <= 6226; i++) - materials[i] = Material.CherryHangingSign; - for (int i = 6227; i <= 6290; i++) - materials[i] = Material.JungleHangingSign; - for (int i = 6291; i <= 6354; i++) - materials[i] = Material.DarkOakHangingSign; - for (int i = 6355; i <= 6418; i++) - materials[i] = Material.PaleOakHangingSign; - for (int i = 6419; i <= 6482; i++) - materials[i] = Material.CrimsonHangingSign; - for (int i = 6483; i <= 6546; i++) - materials[i] = Material.WarpedHangingSign; - for (int i = 6547; i <= 6610; i++) - materials[i] = Material.MangroveHangingSign; - for (int i = 6611; i <= 6674; i++) - materials[i] = Material.BambooHangingSign; - for (int i = 6675; i <= 6682; i++) - materials[i] = Material.OakWallHangingSign; - for (int i = 6683; i <= 6690; i++) - materials[i] = Material.SpruceWallHangingSign; - for (int i = 6691; i <= 6698; i++) - materials[i] = Material.BirchWallHangingSign; - for (int i = 6699; i <= 6706; i++) - materials[i] = Material.AcaciaWallHangingSign; - for (int i = 6707; i <= 6714; i++) - materials[i] = Material.CherryWallHangingSign; - for (int i = 6715; i <= 6722; i++) - materials[i] = Material.JungleWallHangingSign; - for (int i = 6723; i <= 6730; i++) - materials[i] = Material.DarkOakWallHangingSign; - for (int i = 6731; i <= 6738; i++) - materials[i] = Material.PaleOakWallHangingSign; - for (int i = 6739; i <= 6746; i++) - materials[i] = Material.MangroveWallHangingSign; - for (int i = 6747; i <= 6754; i++) - materials[i] = Material.CrimsonWallHangingSign; - for (int i = 6755; i <= 6762; i++) - materials[i] = Material.WarpedWallHangingSign; - for (int i = 6763; i <= 6770; i++) - materials[i] = Material.BambooWallHangingSign; - for (int i = 6771; i <= 6794; i++) - materials[i] = Material.Lever; - for (int i = 6795; i <= 6796; i++) - materials[i] = Material.StonePressurePlate; - for (int i = 6797; i <= 6860; i++) - materials[i] = Material.IronDoor; - for (int i = 6861; i <= 6862; i++) - materials[i] = Material.OakPressurePlate; - for (int i = 6863; i <= 6864; i++) - materials[i] = Material.SprucePressurePlate; - for (int i = 6865; i <= 6866; i++) - materials[i] = Material.BirchPressurePlate; - for (int i = 6867; i <= 6868; i++) - materials[i] = Material.JunglePressurePlate; - for (int i = 6869; i <= 6870; i++) - materials[i] = Material.AcaciaPressurePlate; - for (int i = 6871; i <= 6872; i++) - materials[i] = Material.CherryPressurePlate; - for (int i = 6873; i <= 6874; i++) - materials[i] = Material.DarkOakPressurePlate; - for (int i = 6875; i <= 6876; i++) - materials[i] = Material.PaleOakPressurePlate; - for (int i = 6877; i <= 6878; i++) - materials[i] = Material.MangrovePressurePlate; - for (int i = 6879; i <= 6880; i++) - materials[i] = Material.BambooPressurePlate; - for (int i = 6881; i <= 6882; i++) - materials[i] = Material.RedstoneOre; - for (int i = 6883; i <= 6884; i++) - materials[i] = Material.DeepslateRedstoneOre; - for (int i = 6885; i <= 6886; i++) - materials[i] = Material.RedstoneTorch; - for (int i = 6887; i <= 6894; i++) - materials[i] = Material.RedstoneWallTorch; - for (int i = 6895; i <= 6918; i++) - materials[i] = Material.StoneButton; - for (int i = 6919; i <= 6926; i++) - materials[i] = Material.Snow; - for (int i = 6927; i <= 6927; i++) - materials[i] = Material.Ice; - for (int i = 6928; i <= 6928; i++) - materials[i] = Material.SnowBlock; - for (int i = 6929; i <= 6944; i++) - materials[i] = Material.Cactus; - for (int i = 6945; i <= 6945; i++) - materials[i] = Material.CactusFlower; - for (int i = 6946; i <= 6946; i++) - materials[i] = Material.Clay; - for (int i = 6947; i <= 6962; i++) - materials[i] = Material.SugarCane; - for (int i = 6963; i <= 6964; i++) - materials[i] = Material.Jukebox; - for (int i = 6965; i <= 6996; i++) - materials[i] = Material.OakFence; - for (int i = 6997; i <= 6997; i++) - materials[i] = Material.Netherrack; - for (int i = 6998; i <= 6998; i++) - materials[i] = Material.SoulSand; - for (int i = 6999; i <= 6999; i++) - materials[i] = Material.SoulSoil; - for (int i = 7000; i <= 7002; i++) - materials[i] = Material.Basalt; - for (int i = 7003; i <= 7005; i++) - materials[i] = Material.PolishedBasalt; - for (int i = 7006; i <= 7006; i++) - materials[i] = Material.SoulTorch; - for (int i = 7007; i <= 7010; i++) - materials[i] = Material.SoulWallTorch; - for (int i = 7011; i <= 7011; i++) - materials[i] = Material.CopperTorch; - for (int i = 7012; i <= 7015; i++) - materials[i] = Material.CopperWallTorch; - for (int i = 7016; i <= 7016; i++) - materials[i] = Material.Glowstone; - for (int i = 7017; i <= 7018; i++) - materials[i] = Material.NetherPortal; - for (int i = 7019; i <= 7022; i++) - materials[i] = Material.CarvedPumpkin; - for (int i = 7023; i <= 7026; i++) - materials[i] = Material.JackOLantern; - for (int i = 7027; i <= 7033; i++) - materials[i] = Material.Cake; - for (int i = 7034; i <= 7097; i++) - materials[i] = Material.Repeater; - for (int i = 7098; i <= 7098; i++) - materials[i] = Material.WhiteStainedGlass; - for (int i = 7099; i <= 7099; i++) - materials[i] = Material.OrangeStainedGlass; - for (int i = 7100; i <= 7100; i++) - materials[i] = Material.MagentaStainedGlass; - for (int i = 7101; i <= 7101; i++) - materials[i] = Material.LightBlueStainedGlass; - for (int i = 7102; i <= 7102; i++) - materials[i] = Material.YellowStainedGlass; - for (int i = 7103; i <= 7103; i++) - materials[i] = Material.LimeStainedGlass; - for (int i = 7104; i <= 7104; i++) - materials[i] = Material.PinkStainedGlass; - for (int i = 7105; i <= 7105; i++) - materials[i] = Material.GrayStainedGlass; - for (int i = 7106; i <= 7106; i++) - materials[i] = Material.LightGrayStainedGlass; - for (int i = 7107; i <= 7107; i++) - materials[i] = Material.CyanStainedGlass; - for (int i = 7108; i <= 7108; i++) - materials[i] = Material.PurpleStainedGlass; - for (int i = 7109; i <= 7109; i++) - materials[i] = Material.BlueStainedGlass; - for (int i = 7110; i <= 7110; i++) - materials[i] = Material.BrownStainedGlass; - for (int i = 7111; i <= 7111; i++) - materials[i] = Material.GreenStainedGlass; - for (int i = 7112; i <= 7112; i++) - materials[i] = Material.RedStainedGlass; - for (int i = 7113; i <= 7113; i++) - materials[i] = Material.BlackStainedGlass; - for (int i = 7114; i <= 7177; i++) - materials[i] = Material.OakTrapdoor; - for (int i = 7178; i <= 7241; i++) - materials[i] = Material.SpruceTrapdoor; - for (int i = 7242; i <= 7305; i++) - materials[i] = Material.BirchTrapdoor; - for (int i = 7306; i <= 7369; i++) - materials[i] = Material.JungleTrapdoor; - for (int i = 7370; i <= 7433; i++) - materials[i] = Material.AcaciaTrapdoor; - for (int i = 7434; i <= 7497; i++) - materials[i] = Material.CherryTrapdoor; - for (int i = 7498; i <= 7561; i++) - materials[i] = Material.DarkOakTrapdoor; - for (int i = 7562; i <= 7625; i++) - materials[i] = Material.PaleOakTrapdoor; - for (int i = 7626; i <= 7689; i++) - materials[i] = Material.MangroveTrapdoor; - for (int i = 7690; i <= 7753; i++) - materials[i] = Material.BambooTrapdoor; - for (int i = 7754; i <= 7754; i++) - materials[i] = Material.StoneBricks; - for (int i = 7755; i <= 7755; i++) - materials[i] = Material.MossyStoneBricks; - for (int i = 7756; i <= 7756; i++) - materials[i] = Material.CrackedStoneBricks; - for (int i = 7757; i <= 7757; i++) - materials[i] = Material.ChiseledStoneBricks; - for (int i = 7758; i <= 7758; i++) - materials[i] = Material.PackedMud; - for (int i = 7759; i <= 7759; i++) - materials[i] = Material.MudBricks; - for (int i = 7760; i <= 7760; i++) - materials[i] = Material.InfestedStone; - for (int i = 7761; i <= 7761; i++) - materials[i] = Material.InfestedCobblestone; - for (int i = 7762; i <= 7762; i++) - materials[i] = Material.InfestedStoneBricks; - for (int i = 7763; i <= 7763; i++) - materials[i] = Material.InfestedMossyStoneBricks; - for (int i = 7764; i <= 7764; i++) - materials[i] = Material.InfestedCrackedStoneBricks; - for (int i = 7765; i <= 7765; i++) - materials[i] = Material.InfestedChiseledStoneBricks; - for (int i = 7766; i <= 7829; i++) - materials[i] = Material.BrownMushroomBlock; - for (int i = 7830; i <= 7893; i++) - materials[i] = Material.RedMushroomBlock; - for (int i = 7894; i <= 7957; i++) - materials[i] = Material.MushroomStem; - for (int i = 7958; i <= 7989; i++) - materials[i] = Material.IronBars; - for (int i = 7990; i <= 8021; i++) - materials[i] = Material.CopperBars; - for (int i = 8022; i <= 8053; i++) - materials[i] = Material.ExposedCopperBars; - for (int i = 8054; i <= 8085; i++) - materials[i] = Material.WeatheredCopperBars; - for (int i = 8086; i <= 8117; i++) - materials[i] = Material.OxidizedCopperBars; - for (int i = 8118; i <= 8149; i++) - materials[i] = Material.WaxedCopperBars; - for (int i = 8150; i <= 8181; i++) - materials[i] = Material.WaxedExposedCopperBars; - for (int i = 8182; i <= 8213; i++) - materials[i] = Material.WaxedWeatheredCopperBars; - for (int i = 8214; i <= 8245; i++) - materials[i] = Material.WaxedOxidizedCopperBars; - for (int i = 8246; i <= 8251; i++) - materials[i] = Material.IronChain; - for (int i = 8252; i <= 8257; i++) - materials[i] = Material.CopperChain; - for (int i = 8258; i <= 8263; i++) - materials[i] = Material.ExposedCopperChain; - for (int i = 8264; i <= 8269; i++) - materials[i] = Material.WeatheredCopperChain; - for (int i = 8270; i <= 8275; i++) - materials[i] = Material.OxidizedCopperChain; - for (int i = 8276; i <= 8281; i++) - materials[i] = Material.WaxedCopperChain; - for (int i = 8282; i <= 8287; i++) - materials[i] = Material.WaxedExposedCopperChain; - for (int i = 8288; i <= 8293; i++) - materials[i] = Material.WaxedWeatheredCopperChain; - for (int i = 8294; i <= 8299; i++) - materials[i] = Material.WaxedOxidizedCopperChain; - for (int i = 8300; i <= 8331; i++) - materials[i] = Material.GlassPane; - for (int i = 8332; i <= 8332; i++) - materials[i] = Material.Pumpkin; - for (int i = 8333; i <= 8333; i++) - materials[i] = Material.Melon; - for (int i = 8334; i <= 8337; i++) - materials[i] = Material.AttachedPumpkinStem; - for (int i = 8338; i <= 8341; i++) - materials[i] = Material.AttachedMelonStem; - for (int i = 8342; i <= 8349; i++) - materials[i] = Material.PumpkinStem; - for (int i = 8350; i <= 8357; i++) - materials[i] = Material.MelonStem; - for (int i = 8358; i <= 8389; i++) - materials[i] = Material.Vine; - for (int i = 8390; i <= 8517; i++) - materials[i] = Material.GlowLichen; - for (int i = 8518; i <= 8645; i++) - materials[i] = Material.ResinClump; - for (int i = 8646; i <= 8677; i++) - materials[i] = Material.OakFenceGate; - for (int i = 8678; i <= 8757; i++) - materials[i] = Material.BrickStairs; - for (int i = 8758; i <= 8837; i++) - materials[i] = Material.StoneBrickStairs; - for (int i = 8838; i <= 8917; i++) - materials[i] = Material.MudBrickStairs; - for (int i = 8918; i <= 8919; i++) - materials[i] = Material.Mycelium; - for (int i = 8920; i <= 8920; i++) - materials[i] = Material.LilyPad; - for (int i = 8921; i <= 8921; i++) - materials[i] = Material.ResinBlock; - for (int i = 8922; i <= 8922; i++) - materials[i] = Material.ResinBricks; - for (int i = 8923; i <= 9002; i++) - materials[i] = Material.ResinBrickStairs; - for (int i = 9003; i <= 9008; i++) - materials[i] = Material.ResinBrickSlab; - for (int i = 9009; i <= 9332; i++) - materials[i] = Material.ResinBrickWall; - for (int i = 9333; i <= 9333; i++) - materials[i] = Material.ChiseledResinBricks; - for (int i = 9334; i <= 9334; i++) - materials[i] = Material.NetherBricks; - for (int i = 9335; i <= 9366; i++) - materials[i] = Material.NetherBrickFence; - for (int i = 9367; i <= 9446; i++) - materials[i] = Material.NetherBrickStairs; - for (int i = 9447; i <= 9450; i++) - materials[i] = Material.NetherWart; - for (int i = 9451; i <= 9451; i++) - materials[i] = Material.EnchantingTable; - for (int i = 9452; i <= 9459; i++) - materials[i] = Material.BrewingStand; - for (int i = 9460; i <= 9460; i++) - materials[i] = Material.Cauldron; - for (int i = 9461; i <= 9463; i++) - materials[i] = Material.WaterCauldron; - for (int i = 9464; i <= 9464; i++) - materials[i] = Material.LavaCauldron; - for (int i = 9465; i <= 9467; i++) - materials[i] = Material.PowderSnowCauldron; - for (int i = 9468; i <= 9468; i++) - materials[i] = Material.EndPortal; - for (int i = 9469; i <= 9476; i++) - materials[i] = Material.EndPortalFrame; - for (int i = 9477; i <= 9477; i++) - materials[i] = Material.EndStone; - for (int i = 9478; i <= 9478; i++) - materials[i] = Material.DragonEgg; - for (int i = 9479; i <= 9480; i++) - materials[i] = Material.RedstoneLamp; - for (int i = 9481; i <= 9492; i++) - materials[i] = Material.Cocoa; - for (int i = 9493; i <= 9572; i++) - materials[i] = Material.SandstoneStairs; - for (int i = 9573; i <= 9573; i++) - materials[i] = Material.EmeraldOre; - for (int i = 9574; i <= 9574; i++) - materials[i] = Material.DeepslateEmeraldOre; - for (int i = 9575; i <= 9582; i++) - materials[i] = Material.EnderChest; - for (int i = 9583; i <= 9598; i++) - materials[i] = Material.TripwireHook; - for (int i = 9599; i <= 9726; i++) - materials[i] = Material.Tripwire; - for (int i = 9727; i <= 9727; i++) - materials[i] = Material.EmeraldBlock; - for (int i = 9728; i <= 9807; i++) - materials[i] = Material.SpruceStairs; - for (int i = 9808; i <= 9887; i++) - materials[i] = Material.BirchStairs; - for (int i = 9888; i <= 9967; i++) - materials[i] = Material.JungleStairs; - for (int i = 9968; i <= 9979; i++) - materials[i] = Material.CommandBlock; - for (int i = 9980; i <= 9980; i++) - materials[i] = Material.Beacon; - for (int i = 9981; i <= 10304; i++) - materials[i] = Material.CobblestoneWall; - for (int i = 10305; i <= 10628; i++) - materials[i] = Material.MossyCobblestoneWall; - for (int i = 10629; i <= 10629; i++) - materials[i] = Material.FlowerPot; - for (int i = 10630; i <= 10630; i++) - materials[i] = Material.PottedTorchflower; - for (int i = 10631; i <= 10631; i++) - materials[i] = Material.PottedOakSapling; - for (int i = 10632; i <= 10632; i++) - materials[i] = Material.PottedSpruceSapling; - for (int i = 10633; i <= 10633; i++) - materials[i] = Material.PottedBirchSapling; - for (int i = 10634; i <= 10634; i++) - materials[i] = Material.PottedJungleSapling; - for (int i = 10635; i <= 10635; i++) - materials[i] = Material.PottedAcaciaSapling; - for (int i = 10636; i <= 10636; i++) - materials[i] = Material.PottedCherrySapling; - for (int i = 10637; i <= 10637; i++) - materials[i] = Material.PottedDarkOakSapling; - for (int i = 10638; i <= 10638; i++) - materials[i] = Material.PottedPaleOakSapling; - for (int i = 10639; i <= 10639; i++) - materials[i] = Material.PottedMangrovePropagule; - for (int i = 10640; i <= 10640; i++) - materials[i] = Material.PottedFern; - for (int i = 10641; i <= 10641; i++) - materials[i] = Material.PottedDandelion; - for (int i = 10642; i <= 10642; i++) - materials[i] = Material.PottedGoldenDandelion; - for (int i = 10643; i <= 10643; i++) - materials[i] = Material.PottedPoppy; - for (int i = 10644; i <= 10644; i++) - materials[i] = Material.PottedBlueOrchid; - for (int i = 10645; i <= 10645; i++) - materials[i] = Material.PottedAllium; - for (int i = 10646; i <= 10646; i++) - materials[i] = Material.PottedAzureBluet; - for (int i = 10647; i <= 10647; i++) - materials[i] = Material.PottedRedTulip; - for (int i = 10648; i <= 10648; i++) - materials[i] = Material.PottedOrangeTulip; - for (int i = 10649; i <= 10649; i++) - materials[i] = Material.PottedWhiteTulip; - for (int i = 10650; i <= 10650; i++) - materials[i] = Material.PottedPinkTulip; - for (int i = 10651; i <= 10651; i++) - materials[i] = Material.PottedOxeyeDaisy; - for (int i = 10652; i <= 10652; i++) - materials[i] = Material.PottedCornflower; - for (int i = 10653; i <= 10653; i++) - materials[i] = Material.PottedLilyOfTheValley; - for (int i = 10654; i <= 10654; i++) - materials[i] = Material.PottedWitherRose; - for (int i = 10655; i <= 10655; i++) - materials[i] = Material.PottedRedMushroom; - for (int i = 10656; i <= 10656; i++) - materials[i] = Material.PottedBrownMushroom; - for (int i = 10657; i <= 10657; i++) - materials[i] = Material.PottedDeadBush; - for (int i = 10658; i <= 10658; i++) - materials[i] = Material.PottedCactus; - for (int i = 10659; i <= 10666; i++) - materials[i] = Material.Carrots; - for (int i = 10667; i <= 10674; i++) - materials[i] = Material.Potatoes; - for (int i = 10675; i <= 10698; i++) - materials[i] = Material.OakButton; - for (int i = 10699; i <= 10722; i++) - materials[i] = Material.SpruceButton; - for (int i = 10723; i <= 10746; i++) - materials[i] = Material.BirchButton; - for (int i = 10747; i <= 10770; i++) - materials[i] = Material.JungleButton; - for (int i = 10771; i <= 10794; i++) - materials[i] = Material.AcaciaButton; - for (int i = 10795; i <= 10818; i++) - materials[i] = Material.CherryButton; - for (int i = 10819; i <= 10842; i++) - materials[i] = Material.DarkOakButton; - for (int i = 10843; i <= 10866; i++) - materials[i] = Material.PaleOakButton; - for (int i = 10867; i <= 10890; i++) - materials[i] = Material.MangroveButton; - for (int i = 10891; i <= 10914; i++) - materials[i] = Material.BambooButton; - for (int i = 10915; i <= 10946; i++) - materials[i] = Material.SkeletonSkull; - for (int i = 10947; i <= 10954; i++) - materials[i] = Material.SkeletonWallSkull; - for (int i = 10955; i <= 10986; i++) - materials[i] = Material.WitherSkeletonSkull; - for (int i = 10987; i <= 10994; i++) - materials[i] = Material.WitherSkeletonWallSkull; - for (int i = 10995; i <= 11026; i++) - materials[i] = Material.ZombieHead; - for (int i = 11027; i <= 11034; i++) - materials[i] = Material.ZombieWallHead; - for (int i = 11035; i <= 11066; i++) - materials[i] = Material.PlayerHead; - for (int i = 11067; i <= 11074; i++) - materials[i] = Material.PlayerWallHead; - for (int i = 11075; i <= 11106; i++) - materials[i] = Material.CreeperHead; - for (int i = 11107; i <= 11114; i++) - materials[i] = Material.CreeperWallHead; - for (int i = 11115; i <= 11146; i++) - materials[i] = Material.DragonHead; - for (int i = 11147; i <= 11154; i++) - materials[i] = Material.DragonWallHead; - for (int i = 11155; i <= 11186; i++) - materials[i] = Material.PiglinHead; - for (int i = 11187; i <= 11194; i++) - materials[i] = Material.PiglinWallHead; - for (int i = 11195; i <= 11198; i++) - materials[i] = Material.Anvil; - for (int i = 11199; i <= 11202; i++) - materials[i] = Material.ChippedAnvil; - for (int i = 11203; i <= 11206; i++) - materials[i] = Material.DamagedAnvil; - for (int i = 11207; i <= 11230; i++) - materials[i] = Material.TrappedChest; - for (int i = 11231; i <= 11246; i++) - materials[i] = Material.LightWeightedPressurePlate; - for (int i = 11247; i <= 11262; i++) - materials[i] = Material.HeavyWeightedPressurePlate; - for (int i = 11263; i <= 11278; i++) - materials[i] = Material.Comparator; - for (int i = 11279; i <= 11310; i++) - materials[i] = Material.DaylightDetector; - for (int i = 11311; i <= 11311; i++) - materials[i] = Material.RedstoneBlock; - for (int i = 11312; i <= 11312; i++) - materials[i] = Material.NetherQuartzOre; - for (int i = 11313; i <= 11322; i++) - materials[i] = Material.Hopper; - for (int i = 11323; i <= 11323; i++) - materials[i] = Material.QuartzBlock; - for (int i = 11324; i <= 11324; i++) - materials[i] = Material.ChiseledQuartzBlock; - for (int i = 11325; i <= 11327; i++) - materials[i] = Material.QuartzPillar; - for (int i = 11328; i <= 11407; i++) - materials[i] = Material.QuartzStairs; - for (int i = 11408; i <= 11431; i++) - materials[i] = Material.ActivatorRail; - for (int i = 11432; i <= 11443; i++) - materials[i] = Material.Dropper; - for (int i = 11444; i <= 11444; i++) - materials[i] = Material.WhiteTerracotta; - for (int i = 11445; i <= 11445; i++) - materials[i] = Material.OrangeTerracotta; - for (int i = 11446; i <= 11446; i++) - materials[i] = Material.MagentaTerracotta; - for (int i = 11447; i <= 11447; i++) - materials[i] = Material.LightBlueTerracotta; - for (int i = 11448; i <= 11448; i++) - materials[i] = Material.YellowTerracotta; - for (int i = 11449; i <= 11449; i++) - materials[i] = Material.LimeTerracotta; - for (int i = 11450; i <= 11450; i++) - materials[i] = Material.PinkTerracotta; - for (int i = 11451; i <= 11451; i++) - materials[i] = Material.GrayTerracotta; - for (int i = 11452; i <= 11452; i++) - materials[i] = Material.LightGrayTerracotta; - for (int i = 11453; i <= 11453; i++) - materials[i] = Material.CyanTerracotta; - for (int i = 11454; i <= 11454; i++) - materials[i] = Material.PurpleTerracotta; - for (int i = 11455; i <= 11455; i++) - materials[i] = Material.BlueTerracotta; - for (int i = 11456; i <= 11456; i++) - materials[i] = Material.BrownTerracotta; - for (int i = 11457; i <= 11457; i++) - materials[i] = Material.GreenTerracotta; - for (int i = 11458; i <= 11458; i++) - materials[i] = Material.RedTerracotta; - for (int i = 11459; i <= 11459; i++) - materials[i] = Material.BlackTerracotta; - for (int i = 11460; i <= 11491; i++) - materials[i] = Material.WhiteStainedGlassPane; - for (int i = 11492; i <= 11523; i++) - materials[i] = Material.OrangeStainedGlassPane; - for (int i = 11524; i <= 11555; i++) - materials[i] = Material.MagentaStainedGlassPane; - for (int i = 11556; i <= 11587; i++) - materials[i] = Material.LightBlueStainedGlassPane; - for (int i = 11588; i <= 11619; i++) - materials[i] = Material.YellowStainedGlassPane; - for (int i = 11620; i <= 11651; i++) - materials[i] = Material.LimeStainedGlassPane; - for (int i = 11652; i <= 11683; i++) - materials[i] = Material.PinkStainedGlassPane; - for (int i = 11684; i <= 11715; i++) - materials[i] = Material.GrayStainedGlassPane; - for (int i = 11716; i <= 11747; i++) - materials[i] = Material.LightGrayStainedGlassPane; - for (int i = 11748; i <= 11779; i++) - materials[i] = Material.CyanStainedGlassPane; - for (int i = 11780; i <= 11811; i++) - materials[i] = Material.PurpleStainedGlassPane; - for (int i = 11812; i <= 11843; i++) - materials[i] = Material.BlueStainedGlassPane; - for (int i = 11844; i <= 11875; i++) - materials[i] = Material.BrownStainedGlassPane; - for (int i = 11876; i <= 11907; i++) - materials[i] = Material.GreenStainedGlassPane; - for (int i = 11908; i <= 11939; i++) - materials[i] = Material.RedStainedGlassPane; - for (int i = 11940; i <= 11971; i++) - materials[i] = Material.BlackStainedGlassPane; - for (int i = 11972; i <= 12051; i++) - materials[i] = Material.AcaciaStairs; - for (int i = 12052; i <= 12131; i++) - materials[i] = Material.CherryStairs; - for (int i = 12132; i <= 12211; i++) - materials[i] = Material.DarkOakStairs; - for (int i = 12212; i <= 12291; i++) - materials[i] = Material.PaleOakStairs; - for (int i = 12292; i <= 12371; i++) - materials[i] = Material.MangroveStairs; - for (int i = 12372; i <= 12451; i++) - materials[i] = Material.BambooStairs; - for (int i = 12452; i <= 12531; i++) - materials[i] = Material.BambooMosaicStairs; - for (int i = 12532; i <= 12532; i++) - materials[i] = Material.SlimeBlock; - for (int i = 12533; i <= 12534; i++) - materials[i] = Material.Barrier; - for (int i = 12535; i <= 12566; i++) - materials[i] = Material.Light; - for (int i = 12567; i <= 12630; i++) - materials[i] = Material.IronTrapdoor; - for (int i = 12631; i <= 12631; i++) - materials[i] = Material.Prismarine; - for (int i = 12632; i <= 12632; i++) - materials[i] = Material.PrismarineBricks; - for (int i = 12633; i <= 12633; i++) - materials[i] = Material.DarkPrismarine; - for (int i = 12634; i <= 12713; i++) - materials[i] = Material.PrismarineStairs; - for (int i = 12714; i <= 12793; i++) - materials[i] = Material.PrismarineBrickStairs; - for (int i = 12794; i <= 12873; i++) - materials[i] = Material.DarkPrismarineStairs; - for (int i = 12874; i <= 12879; i++) - materials[i] = Material.PrismarineSlab; - for (int i = 12880; i <= 12885; i++) - materials[i] = Material.PrismarineBrickSlab; - for (int i = 12886; i <= 12891; i++) - materials[i] = Material.DarkPrismarineSlab; - for (int i = 12892; i <= 12892; i++) - materials[i] = Material.SeaLantern; - for (int i = 12893; i <= 12895; i++) - materials[i] = Material.HayBlock; - for (int i = 12896; i <= 12896; i++) - materials[i] = Material.WhiteCarpet; - for (int i = 12897; i <= 12897; i++) - materials[i] = Material.OrangeCarpet; - for (int i = 12898; i <= 12898; i++) - materials[i] = Material.MagentaCarpet; - for (int i = 12899; i <= 12899; i++) - materials[i] = Material.LightBlueCarpet; - for (int i = 12900; i <= 12900; i++) - materials[i] = Material.YellowCarpet; - for (int i = 12901; i <= 12901; i++) - materials[i] = Material.LimeCarpet; - for (int i = 12902; i <= 12902; i++) - materials[i] = Material.PinkCarpet; - for (int i = 12903; i <= 12903; i++) - materials[i] = Material.GrayCarpet; - for (int i = 12904; i <= 12904; i++) - materials[i] = Material.LightGrayCarpet; - for (int i = 12905; i <= 12905; i++) - materials[i] = Material.CyanCarpet; - for (int i = 12906; i <= 12906; i++) - materials[i] = Material.PurpleCarpet; - for (int i = 12907; i <= 12907; i++) - materials[i] = Material.BlueCarpet; - for (int i = 12908; i <= 12908; i++) - materials[i] = Material.BrownCarpet; - for (int i = 12909; i <= 12909; i++) - materials[i] = Material.GreenCarpet; - for (int i = 12910; i <= 12910; i++) - materials[i] = Material.RedCarpet; - for (int i = 12911; i <= 12911; i++) - materials[i] = Material.BlackCarpet; - for (int i = 12912; i <= 12912; i++) - materials[i] = Material.Terracotta; - for (int i = 12913; i <= 12913; i++) - materials[i] = Material.CoalBlock; - for (int i = 12914; i <= 12914; i++) - materials[i] = Material.PackedIce; - for (int i = 12915; i <= 12916; i++) - materials[i] = Material.Sunflower; - for (int i = 12917; i <= 12918; i++) - materials[i] = Material.Lilac; - for (int i = 12919; i <= 12920; i++) - materials[i] = Material.RoseBush; - for (int i = 12921; i <= 12922; i++) - materials[i] = Material.Peony; - for (int i = 12923; i <= 12924; i++) - materials[i] = Material.TallGrass; - for (int i = 12925; i <= 12926; i++) - materials[i] = Material.LargeFern; - for (int i = 12927; i <= 12942; i++) - materials[i] = Material.WhiteBanner; - for (int i = 12943; i <= 12958; i++) - materials[i] = Material.OrangeBanner; - for (int i = 12959; i <= 12974; i++) - materials[i] = Material.MagentaBanner; - for (int i = 12975; i <= 12990; i++) - materials[i] = Material.LightBlueBanner; - for (int i = 12991; i <= 13006; i++) - materials[i] = Material.YellowBanner; - for (int i = 13007; i <= 13022; i++) - materials[i] = Material.LimeBanner; - for (int i = 13023; i <= 13038; i++) - materials[i] = Material.PinkBanner; - for (int i = 13039; i <= 13054; i++) - materials[i] = Material.GrayBanner; - for (int i = 13055; i <= 13070; i++) - materials[i] = Material.LightGrayBanner; - for (int i = 13071; i <= 13086; i++) - materials[i] = Material.CyanBanner; - for (int i = 13087; i <= 13102; i++) - materials[i] = Material.PurpleBanner; - for (int i = 13103; i <= 13118; i++) - materials[i] = Material.BlueBanner; - for (int i = 13119; i <= 13134; i++) - materials[i] = Material.BrownBanner; - for (int i = 13135; i <= 13150; i++) - materials[i] = Material.GreenBanner; - for (int i = 13151; i <= 13166; i++) - materials[i] = Material.RedBanner; - for (int i = 13167; i <= 13182; i++) - materials[i] = Material.BlackBanner; - for (int i = 13183; i <= 13186; i++) - materials[i] = Material.WhiteWallBanner; - for (int i = 13187; i <= 13190; i++) - materials[i] = Material.OrangeWallBanner; - for (int i = 13191; i <= 13194; i++) - materials[i] = Material.MagentaWallBanner; - for (int i = 13195; i <= 13198; i++) - materials[i] = Material.LightBlueWallBanner; - for (int i = 13199; i <= 13202; i++) - materials[i] = Material.YellowWallBanner; - for (int i = 13203; i <= 13206; i++) - materials[i] = Material.LimeWallBanner; - for (int i = 13207; i <= 13210; i++) - materials[i] = Material.PinkWallBanner; - for (int i = 13211; i <= 13214; i++) - materials[i] = Material.GrayWallBanner; - for (int i = 13215; i <= 13218; i++) - materials[i] = Material.LightGrayWallBanner; - for (int i = 13219; i <= 13222; i++) - materials[i] = Material.CyanWallBanner; - for (int i = 13223; i <= 13226; i++) - materials[i] = Material.PurpleWallBanner; - for (int i = 13227; i <= 13230; i++) - materials[i] = Material.BlueWallBanner; - for (int i = 13231; i <= 13234; i++) - materials[i] = Material.BrownWallBanner; - for (int i = 13235; i <= 13238; i++) - materials[i] = Material.GreenWallBanner; - for (int i = 13239; i <= 13242; i++) - materials[i] = Material.RedWallBanner; - for (int i = 13243; i <= 13246; i++) - materials[i] = Material.BlackWallBanner; - for (int i = 13247; i <= 13247; i++) - materials[i] = Material.RedSandstone; - for (int i = 13248; i <= 13248; i++) - materials[i] = Material.ChiseledRedSandstone; - for (int i = 13249; i <= 13249; i++) - materials[i] = Material.CutRedSandstone; - for (int i = 13250; i <= 13329; i++) - materials[i] = Material.RedSandstoneStairs; - for (int i = 13330; i <= 13335; i++) - materials[i] = Material.OakSlab; - for (int i = 13336; i <= 13341; i++) - materials[i] = Material.SpruceSlab; - for (int i = 13342; i <= 13347; i++) - materials[i] = Material.BirchSlab; - for (int i = 13348; i <= 13353; i++) - materials[i] = Material.JungleSlab; - for (int i = 13354; i <= 13359; i++) - materials[i] = Material.AcaciaSlab; - for (int i = 13360; i <= 13365; i++) - materials[i] = Material.CherrySlab; - for (int i = 13366; i <= 13371; i++) - materials[i] = Material.DarkOakSlab; - for (int i = 13372; i <= 13377; i++) - materials[i] = Material.PaleOakSlab; - for (int i = 13378; i <= 13383; i++) - materials[i] = Material.MangroveSlab; - for (int i = 13384; i <= 13389; i++) - materials[i] = Material.BambooSlab; - for (int i = 13390; i <= 13395; i++) - materials[i] = Material.BambooMosaicSlab; - for (int i = 13396; i <= 13401; i++) - materials[i] = Material.StoneSlab; - for (int i = 13402; i <= 13407; i++) - materials[i] = Material.SmoothStoneSlab; - for (int i = 13408; i <= 13413; i++) - materials[i] = Material.SandstoneSlab; - for (int i = 13414; i <= 13419; i++) - materials[i] = Material.CutSandstoneSlab; - for (int i = 13420; i <= 13425; i++) - materials[i] = Material.PetrifiedOakSlab; - for (int i = 13426; i <= 13431; i++) - materials[i] = Material.CobblestoneSlab; - for (int i = 13432; i <= 13437; i++) - materials[i] = Material.BrickSlab; - for (int i = 13438; i <= 13443; i++) - materials[i] = Material.StoneBrickSlab; - for (int i = 13444; i <= 13449; i++) - materials[i] = Material.MudBrickSlab; - for (int i = 13450; i <= 13455; i++) - materials[i] = Material.NetherBrickSlab; - for (int i = 13456; i <= 13461; i++) - materials[i] = Material.QuartzSlab; - for (int i = 13462; i <= 13467; i++) - materials[i] = Material.RedSandstoneSlab; - for (int i = 13468; i <= 13473; i++) - materials[i] = Material.CutRedSandstoneSlab; - for (int i = 13474; i <= 13479; i++) - materials[i] = Material.PurpurSlab; - for (int i = 13480; i <= 13480; i++) - materials[i] = Material.SmoothStone; - for (int i = 13481; i <= 13481; i++) - materials[i] = Material.SmoothSandstone; - for (int i = 13482; i <= 13482; i++) - materials[i] = Material.SmoothQuartz; - for (int i = 13483; i <= 13483; i++) - materials[i] = Material.SmoothRedSandstone; - for (int i = 13484; i <= 13515; i++) - materials[i] = Material.SpruceFenceGate; - for (int i = 13516; i <= 13547; i++) - materials[i] = Material.BirchFenceGate; - for (int i = 13548; i <= 13579; i++) - materials[i] = Material.JungleFenceGate; - for (int i = 13580; i <= 13611; i++) - materials[i] = Material.AcaciaFenceGate; - for (int i = 13612; i <= 13643; i++) - materials[i] = Material.CherryFenceGate; - for (int i = 13644; i <= 13675; i++) - materials[i] = Material.DarkOakFenceGate; - for (int i = 13676; i <= 13707; i++) - materials[i] = Material.PaleOakFenceGate; - for (int i = 13708; i <= 13739; i++) - materials[i] = Material.MangroveFenceGate; - for (int i = 13740; i <= 13771; i++) - materials[i] = Material.BambooFenceGate; - for (int i = 13772; i <= 13803; i++) - materials[i] = Material.SpruceFence; - for (int i = 13804; i <= 13835; i++) - materials[i] = Material.BirchFence; - for (int i = 13836; i <= 13867; i++) - materials[i] = Material.JungleFence; - for (int i = 13868; i <= 13899; i++) - materials[i] = Material.AcaciaFence; - for (int i = 13900; i <= 13931; i++) - materials[i] = Material.CherryFence; - for (int i = 13932; i <= 13963; i++) - materials[i] = Material.DarkOakFence; - for (int i = 13964; i <= 13995; i++) - materials[i] = Material.PaleOakFence; - for (int i = 13996; i <= 14027; i++) - materials[i] = Material.MangroveFence; - for (int i = 14028; i <= 14059; i++) - materials[i] = Material.BambooFence; - for (int i = 14060; i <= 14123; i++) - materials[i] = Material.SpruceDoor; - for (int i = 14124; i <= 14187; i++) - materials[i] = Material.BirchDoor; - for (int i = 14188; i <= 14251; i++) - materials[i] = Material.JungleDoor; - for (int i = 14252; i <= 14315; i++) - materials[i] = Material.AcaciaDoor; - for (int i = 14316; i <= 14379; i++) - materials[i] = Material.CherryDoor; - for (int i = 14380; i <= 14443; i++) - materials[i] = Material.DarkOakDoor; - for (int i = 14444; i <= 14507; i++) - materials[i] = Material.PaleOakDoor; - for (int i = 14508; i <= 14571; i++) - materials[i] = Material.MangroveDoor; - for (int i = 14572; i <= 14635; i++) - materials[i] = Material.BambooDoor; - for (int i = 14636; i <= 14641; i++) - materials[i] = Material.EndRod; - for (int i = 14642; i <= 14705; i++) - materials[i] = Material.ChorusPlant; - for (int i = 14706; i <= 14711; i++) - materials[i] = Material.ChorusFlower; - for (int i = 14712; i <= 14712; i++) - materials[i] = Material.PurpurBlock; - for (int i = 14713; i <= 14715; i++) - materials[i] = Material.PurpurPillar; - for (int i = 14716; i <= 14795; i++) - materials[i] = Material.PurpurStairs; - for (int i = 14796; i <= 14796; i++) - materials[i] = Material.EndStoneBricks; - for (int i = 14797; i <= 14798; i++) - materials[i] = Material.TorchflowerCrop; - for (int i = 14799; i <= 14808; i++) - materials[i] = Material.PitcherCrop; - for (int i = 14809; i <= 14810; i++) - materials[i] = Material.PitcherPlant; - for (int i = 14811; i <= 14814; i++) - materials[i] = Material.Beetroots; - for (int i = 14815; i <= 14815; i++) - materials[i] = Material.DirtPath; - for (int i = 14816; i <= 14816; i++) - materials[i] = Material.EndGateway; - for (int i = 14817; i <= 14828; i++) - materials[i] = Material.RepeatingCommandBlock; - for (int i = 14829; i <= 14840; i++) - materials[i] = Material.ChainCommandBlock; - for (int i = 14841; i <= 14844; i++) - materials[i] = Material.FrostedIce; - for (int i = 14845; i <= 14845; i++) - materials[i] = Material.MagmaBlock; - for (int i = 14846; i <= 14846; i++) - materials[i] = Material.NetherWartBlock; - for (int i = 14847; i <= 14847; i++) - materials[i] = Material.RedNetherBricks; - for (int i = 14848; i <= 14850; i++) - materials[i] = Material.BoneBlock; - for (int i = 14851; i <= 14851; i++) - materials[i] = Material.StructureVoid; - for (int i = 14852; i <= 14863; i++) - materials[i] = Material.Observer; - for (int i = 14864; i <= 14869; i++) - materials[i] = Material.ShulkerBox; - for (int i = 14870; i <= 14875; i++) - materials[i] = Material.WhiteShulkerBox; - for (int i = 14876; i <= 14881; i++) - materials[i] = Material.OrangeShulkerBox; - for (int i = 14882; i <= 14887; i++) - materials[i] = Material.MagentaShulkerBox; - for (int i = 14888; i <= 14893; i++) - materials[i] = Material.LightBlueShulkerBox; - for (int i = 14894; i <= 14899; i++) - materials[i] = Material.YellowShulkerBox; - for (int i = 14900; i <= 14905; i++) - materials[i] = Material.LimeShulkerBox; - for (int i = 14906; i <= 14911; i++) - materials[i] = Material.PinkShulkerBox; - for (int i = 14912; i <= 14917; i++) - materials[i] = Material.GrayShulkerBox; - for (int i = 14918; i <= 14923; i++) - materials[i] = Material.LightGrayShulkerBox; - for (int i = 14924; i <= 14929; i++) - materials[i] = Material.CyanShulkerBox; - for (int i = 14930; i <= 14935; i++) - materials[i] = Material.PurpleShulkerBox; - for (int i = 14936; i <= 14941; i++) - materials[i] = Material.BlueShulkerBox; - for (int i = 14942; i <= 14947; i++) - materials[i] = Material.BrownShulkerBox; - for (int i = 14948; i <= 14953; i++) - materials[i] = Material.GreenShulkerBox; - for (int i = 14954; i <= 14959; i++) - materials[i] = Material.RedShulkerBox; - for (int i = 14960; i <= 14965; i++) - materials[i] = Material.BlackShulkerBox; - for (int i = 14966; i <= 14969; i++) - materials[i] = Material.WhiteGlazedTerracotta; - for (int i = 14970; i <= 14973; i++) - materials[i] = Material.OrangeGlazedTerracotta; - for (int i = 14974; i <= 14977; i++) - materials[i] = Material.MagentaGlazedTerracotta; - for (int i = 14978; i <= 14981; i++) - materials[i] = Material.LightBlueGlazedTerracotta; - for (int i = 14982; i <= 14985; i++) - materials[i] = Material.YellowGlazedTerracotta; - for (int i = 14986; i <= 14989; i++) - materials[i] = Material.LimeGlazedTerracotta; - for (int i = 14990; i <= 14993; i++) - materials[i] = Material.PinkGlazedTerracotta; - for (int i = 14994; i <= 14997; i++) - materials[i] = Material.GrayGlazedTerracotta; - for (int i = 14998; i <= 15001; i++) - materials[i] = Material.LightGrayGlazedTerracotta; - for (int i = 15002; i <= 15005; i++) - materials[i] = Material.CyanGlazedTerracotta; - for (int i = 15006; i <= 15009; i++) - materials[i] = Material.PurpleGlazedTerracotta; - for (int i = 15010; i <= 15013; i++) - materials[i] = Material.BlueGlazedTerracotta; - for (int i = 15014; i <= 15017; i++) - materials[i] = Material.BrownGlazedTerracotta; - for (int i = 15018; i <= 15021; i++) - materials[i] = Material.GreenGlazedTerracotta; - for (int i = 15022; i <= 15025; i++) - materials[i] = Material.RedGlazedTerracotta; - for (int i = 15026; i <= 15029; i++) - materials[i] = Material.BlackGlazedTerracotta; - for (int i = 15030; i <= 15030; i++) - materials[i] = Material.WhiteConcrete; - for (int i = 15031; i <= 15031; i++) - materials[i] = Material.OrangeConcrete; - for (int i = 15032; i <= 15032; i++) - materials[i] = Material.MagentaConcrete; - for (int i = 15033; i <= 15033; i++) - materials[i] = Material.LightBlueConcrete; - for (int i = 15034; i <= 15034; i++) - materials[i] = Material.YellowConcrete; - for (int i = 15035; i <= 15035; i++) - materials[i] = Material.LimeConcrete; - for (int i = 15036; i <= 15036; i++) - materials[i] = Material.PinkConcrete; - for (int i = 15037; i <= 15037; i++) - materials[i] = Material.GrayConcrete; - for (int i = 15038; i <= 15038; i++) - materials[i] = Material.LightGrayConcrete; - for (int i = 15039; i <= 15039; i++) - materials[i] = Material.CyanConcrete; - for (int i = 15040; i <= 15040; i++) - materials[i] = Material.PurpleConcrete; - for (int i = 15041; i <= 15041; i++) - materials[i] = Material.BlueConcrete; - for (int i = 15042; i <= 15042; i++) - materials[i] = Material.BrownConcrete; - for (int i = 15043; i <= 15043; i++) - materials[i] = Material.GreenConcrete; - for (int i = 15044; i <= 15044; i++) - materials[i] = Material.RedConcrete; - for (int i = 15045; i <= 15045; i++) - materials[i] = Material.BlackConcrete; - for (int i = 15046; i <= 15046; i++) - materials[i] = Material.WhiteConcretePowder; - for (int i = 15047; i <= 15047; i++) - materials[i] = Material.OrangeConcretePowder; - for (int i = 15048; i <= 15048; i++) - materials[i] = Material.MagentaConcretePowder; - for (int i = 15049; i <= 15049; i++) - materials[i] = Material.LightBlueConcretePowder; - for (int i = 15050; i <= 15050; i++) - materials[i] = Material.YellowConcretePowder; - for (int i = 15051; i <= 15051; i++) - materials[i] = Material.LimeConcretePowder; - for (int i = 15052; i <= 15052; i++) - materials[i] = Material.PinkConcretePowder; - for (int i = 15053; i <= 15053; i++) - materials[i] = Material.GrayConcretePowder; - for (int i = 15054; i <= 15054; i++) - materials[i] = Material.LightGrayConcretePowder; - for (int i = 15055; i <= 15055; i++) - materials[i] = Material.CyanConcretePowder; - for (int i = 15056; i <= 15056; i++) - materials[i] = Material.PurpleConcretePowder; - for (int i = 15057; i <= 15057; i++) - materials[i] = Material.BlueConcretePowder; - for (int i = 15058; i <= 15058; i++) - materials[i] = Material.BrownConcretePowder; - for (int i = 15059; i <= 15059; i++) - materials[i] = Material.GreenConcretePowder; - for (int i = 15060; i <= 15060; i++) - materials[i] = Material.RedConcretePowder; - for (int i = 15061; i <= 15061; i++) - materials[i] = Material.BlackConcretePowder; - for (int i = 15062; i <= 15087; i++) - materials[i] = Material.Kelp; - for (int i = 15088; i <= 15088; i++) - materials[i] = Material.KelpPlant; - for (int i = 15089; i <= 15089; i++) - materials[i] = Material.DriedKelpBlock; - for (int i = 15090; i <= 15101; i++) - materials[i] = Material.TurtleEgg; - for (int i = 15102; i <= 15104; i++) - materials[i] = Material.SnifferEgg; - for (int i = 15105; i <= 15136; i++) - materials[i] = Material.DriedGhast; - for (int i = 15137; i <= 15137; i++) - materials[i] = Material.DeadTubeCoralBlock; - for (int i = 15138; i <= 15138; i++) - materials[i] = Material.DeadBrainCoralBlock; - for (int i = 15139; i <= 15139; i++) - materials[i] = Material.DeadBubbleCoralBlock; - for (int i = 15140; i <= 15140; i++) - materials[i] = Material.DeadFireCoralBlock; - for (int i = 15141; i <= 15141; i++) - materials[i] = Material.DeadHornCoralBlock; - for (int i = 15142; i <= 15142; i++) - materials[i] = Material.TubeCoralBlock; - for (int i = 15143; i <= 15143; i++) - materials[i] = Material.BrainCoralBlock; - for (int i = 15144; i <= 15144; i++) - materials[i] = Material.BubbleCoralBlock; - for (int i = 15145; i <= 15145; i++) - materials[i] = Material.FireCoralBlock; - for (int i = 15146; i <= 15146; i++) - materials[i] = Material.HornCoralBlock; - for (int i = 15147; i <= 15148; i++) - materials[i] = Material.DeadTubeCoral; - for (int i = 15149; i <= 15150; i++) - materials[i] = Material.DeadBrainCoral; - for (int i = 15151; i <= 15152; i++) - materials[i] = Material.DeadBubbleCoral; - for (int i = 15153; i <= 15154; i++) - materials[i] = Material.DeadFireCoral; - for (int i = 15155; i <= 15156; i++) - materials[i] = Material.DeadHornCoral; - for (int i = 15157; i <= 15158; i++) - materials[i] = Material.TubeCoral; - for (int i = 15159; i <= 15160; i++) - materials[i] = Material.BrainCoral; - for (int i = 15161; i <= 15162; i++) - materials[i] = Material.BubbleCoral; - for (int i = 15163; i <= 15164; i++) - materials[i] = Material.FireCoral; - for (int i = 15165; i <= 15166; i++) - materials[i] = Material.HornCoral; - for (int i = 15167; i <= 15168; i++) - materials[i] = Material.DeadTubeCoralFan; - for (int i = 15169; i <= 15170; i++) - materials[i] = Material.DeadBrainCoralFan; - for (int i = 15171; i <= 15172; i++) - materials[i] = Material.DeadBubbleCoralFan; - for (int i = 15173; i <= 15174; i++) - materials[i] = Material.DeadFireCoralFan; - for (int i = 15175; i <= 15176; i++) - materials[i] = Material.DeadHornCoralFan; - for (int i = 15177; i <= 15178; i++) - materials[i] = Material.TubeCoralFan; - for (int i = 15179; i <= 15180; i++) - materials[i] = Material.BrainCoralFan; - for (int i = 15181; i <= 15182; i++) - materials[i] = Material.BubbleCoralFan; - for (int i = 15183; i <= 15184; i++) - materials[i] = Material.FireCoralFan; - for (int i = 15185; i <= 15186; i++) - materials[i] = Material.HornCoralFan; - for (int i = 15187; i <= 15194; i++) - materials[i] = Material.DeadTubeCoralWallFan; - for (int i = 15195; i <= 15202; i++) - materials[i] = Material.DeadBrainCoralWallFan; - for (int i = 15203; i <= 15210; i++) - materials[i] = Material.DeadBubbleCoralWallFan; - for (int i = 15211; i <= 15218; i++) - materials[i] = Material.DeadFireCoralWallFan; - for (int i = 15219; i <= 15226; i++) - materials[i] = Material.DeadHornCoralWallFan; - for (int i = 15227; i <= 15234; i++) - materials[i] = Material.TubeCoralWallFan; - for (int i = 15235; i <= 15242; i++) - materials[i] = Material.BrainCoralWallFan; - for (int i = 15243; i <= 15250; i++) - materials[i] = Material.BubbleCoralWallFan; - for (int i = 15251; i <= 15258; i++) - materials[i] = Material.FireCoralWallFan; - for (int i = 15259; i <= 15266; i++) - materials[i] = Material.HornCoralWallFan; - for (int i = 15267; i <= 15274; i++) - materials[i] = Material.SeaPickle; - for (int i = 15275; i <= 15275; i++) - materials[i] = Material.BlueIce; - for (int i = 15276; i <= 15277; i++) - materials[i] = Material.Conduit; - for (int i = 15278; i <= 15278; i++) - materials[i] = Material.BambooSapling; - for (int i = 15279; i <= 15290; i++) - materials[i] = Material.Bamboo; - for (int i = 15291; i <= 15291; i++) - materials[i] = Material.PottedBamboo; - for (int i = 15292; i <= 15292; i++) - materials[i] = Material.VoidAir; - for (int i = 15293; i <= 15293; i++) - materials[i] = Material.CaveAir; - for (int i = 15294; i <= 15295; i++) - materials[i] = Material.BubbleColumn; - for (int i = 15296; i <= 15375; i++) - materials[i] = Material.PolishedGraniteStairs; - for (int i = 15376; i <= 15455; i++) - materials[i] = Material.SmoothRedSandstoneStairs; - for (int i = 15456; i <= 15535; i++) - materials[i] = Material.MossyStoneBrickStairs; - for (int i = 15536; i <= 15615; i++) - materials[i] = Material.PolishedDioriteStairs; - for (int i = 15616; i <= 15695; i++) - materials[i] = Material.MossyCobblestoneStairs; - for (int i = 15696; i <= 15775; i++) - materials[i] = Material.EndStoneBrickStairs; - for (int i = 15776; i <= 15855; i++) - materials[i] = Material.StoneStairs; - for (int i = 15856; i <= 15935; i++) - materials[i] = Material.SmoothSandstoneStairs; - for (int i = 15936; i <= 16015; i++) - materials[i] = Material.SmoothQuartzStairs; - for (int i = 16016; i <= 16095; i++) - materials[i] = Material.GraniteStairs; - for (int i = 16096; i <= 16175; i++) - materials[i] = Material.AndesiteStairs; - for (int i = 16176; i <= 16255; i++) - materials[i] = Material.RedNetherBrickStairs; - for (int i = 16256; i <= 16335; i++) - materials[i] = Material.PolishedAndesiteStairs; - for (int i = 16336; i <= 16415; i++) - materials[i] = Material.DioriteStairs; - for (int i = 16416; i <= 16421; i++) - materials[i] = Material.PolishedGraniteSlab; - for (int i = 16422; i <= 16427; i++) - materials[i] = Material.SmoothRedSandstoneSlab; - for (int i = 16428; i <= 16433; i++) - materials[i] = Material.MossyStoneBrickSlab; - for (int i = 16434; i <= 16439; i++) - materials[i] = Material.PolishedDioriteSlab; - for (int i = 16440; i <= 16445; i++) - materials[i] = Material.MossyCobblestoneSlab; - for (int i = 16446; i <= 16451; i++) - materials[i] = Material.EndStoneBrickSlab; - for (int i = 16452; i <= 16457; i++) - materials[i] = Material.SmoothSandstoneSlab; - for (int i = 16458; i <= 16463; i++) - materials[i] = Material.SmoothQuartzSlab; - for (int i = 16464; i <= 16469; i++) - materials[i] = Material.GraniteSlab; - for (int i = 16470; i <= 16475; i++) - materials[i] = Material.AndesiteSlab; - for (int i = 16476; i <= 16481; i++) - materials[i] = Material.RedNetherBrickSlab; - for (int i = 16482; i <= 16487; i++) - materials[i] = Material.PolishedAndesiteSlab; - for (int i = 16488; i <= 16493; i++) - materials[i] = Material.DioriteSlab; - for (int i = 16494; i <= 16817; i++) - materials[i] = Material.BrickWall; - for (int i = 16818; i <= 17141; i++) - materials[i] = Material.PrismarineWall; - for (int i = 17142; i <= 17465; i++) - materials[i] = Material.RedSandstoneWall; - for (int i = 17466; i <= 17789; i++) - materials[i] = Material.MossyStoneBrickWall; - for (int i = 17790; i <= 18113; i++) - materials[i] = Material.GraniteWall; - for (int i = 18114; i <= 18437; i++) - materials[i] = Material.StoneBrickWall; - for (int i = 18438; i <= 18761; i++) - materials[i] = Material.MudBrickWall; - for (int i = 18762; i <= 19085; i++) - materials[i] = Material.NetherBrickWall; - for (int i = 19086; i <= 19409; i++) - materials[i] = Material.AndesiteWall; - for (int i = 19410; i <= 19733; i++) - materials[i] = Material.RedNetherBrickWall; - for (int i = 19734; i <= 20057; i++) - materials[i] = Material.SandstoneWall; - for (int i = 20058; i <= 20381; i++) - materials[i] = Material.EndStoneBrickWall; - for (int i = 20382; i <= 20705; i++) - materials[i] = Material.DioriteWall; - for (int i = 20706; i <= 20737; i++) - materials[i] = Material.Scaffolding; - for (int i = 20738; i <= 20741; i++) - materials[i] = Material.Loom; - for (int i = 20742; i <= 20753; i++) - materials[i] = Material.Barrel; - for (int i = 20754; i <= 20761; i++) - materials[i] = Material.Smoker; - for (int i = 20762; i <= 20769; i++) - materials[i] = Material.BlastFurnace; - for (int i = 20770; i <= 20770; i++) - materials[i] = Material.CartographyTable; - for (int i = 20771; i <= 20771; i++) - materials[i] = Material.FletchingTable; - for (int i = 20772; i <= 20783; i++) - materials[i] = Material.Grindstone; - for (int i = 20784; i <= 20799; i++) - materials[i] = Material.Lectern; - for (int i = 20800; i <= 20800; i++) - materials[i] = Material.SmithingTable; - for (int i = 20801; i <= 20804; i++) - materials[i] = Material.Stonecutter; - for (int i = 20805; i <= 20836; i++) - materials[i] = Material.Bell; - for (int i = 20837; i <= 20840; i++) - materials[i] = Material.Lantern; - for (int i = 20841; i <= 20844; i++) - materials[i] = Material.SoulLantern; - for (int i = 20845; i <= 20848; i++) - materials[i] = Material.CopperLantern; - for (int i = 20849; i <= 20852; i++) - materials[i] = Material.ExposedCopperLantern; - for (int i = 20853; i <= 20856; i++) - materials[i] = Material.WeatheredCopperLantern; - for (int i = 20857; i <= 20860; i++) - materials[i] = Material.OxidizedCopperLantern; - for (int i = 20861; i <= 20864; i++) - materials[i] = Material.WaxedCopperLantern; - for (int i = 20865; i <= 20868; i++) - materials[i] = Material.WaxedExposedCopperLantern; - for (int i = 20869; i <= 20872; i++) - materials[i] = Material.WaxedWeatheredCopperLantern; - for (int i = 20873; i <= 20876; i++) - materials[i] = Material.WaxedOxidizedCopperLantern; - for (int i = 20877; i <= 20908; i++) - materials[i] = Material.Campfire; - for (int i = 20909; i <= 20940; i++) - materials[i] = Material.SoulCampfire; - for (int i = 20941; i <= 20944; i++) - materials[i] = Material.SweetBerryBush; - for (int i = 20945; i <= 20947; i++) - materials[i] = Material.WarpedStem; - for (int i = 20948; i <= 20950; i++) - materials[i] = Material.StrippedWarpedStem; - for (int i = 20951; i <= 20953; i++) - materials[i] = Material.WarpedHyphae; - for (int i = 20954; i <= 20956; i++) - materials[i] = Material.StrippedWarpedHyphae; - for (int i = 20957; i <= 20957; i++) - materials[i] = Material.WarpedNylium; - for (int i = 20958; i <= 20958; i++) - materials[i] = Material.WarpedFungus; - for (int i = 20959; i <= 20959; i++) - materials[i] = Material.WarpedWartBlock; - for (int i = 20960; i <= 20960; i++) - materials[i] = Material.WarpedRoots; - for (int i = 20961; i <= 20961; i++) - materials[i] = Material.NetherSprouts; - for (int i = 20962; i <= 20964; i++) - materials[i] = Material.CrimsonStem; - for (int i = 20965; i <= 20967; i++) - materials[i] = Material.StrippedCrimsonStem; - for (int i = 20968; i <= 20970; i++) - materials[i] = Material.CrimsonHyphae; - for (int i = 20971; i <= 20973; i++) - materials[i] = Material.StrippedCrimsonHyphae; - for (int i = 20974; i <= 20974; i++) - materials[i] = Material.CrimsonNylium; - for (int i = 20975; i <= 20975; i++) - materials[i] = Material.CrimsonFungus; - for (int i = 20976; i <= 20976; i++) - materials[i] = Material.Shroomlight; - for (int i = 20977; i <= 21002; i++) - materials[i] = Material.WeepingVines; - for (int i = 21003; i <= 21003; i++) - materials[i] = Material.WeepingVinesPlant; - for (int i = 21004; i <= 21029; i++) - materials[i] = Material.TwistingVines; - for (int i = 21030; i <= 21030; i++) - materials[i] = Material.TwistingVinesPlant; - for (int i = 21031; i <= 21031; i++) - materials[i] = Material.CrimsonRoots; - for (int i = 21032; i <= 21032; i++) - materials[i] = Material.CrimsonPlanks; - for (int i = 21033; i <= 21033; i++) - materials[i] = Material.WarpedPlanks; - for (int i = 21034; i <= 21039; i++) - materials[i] = Material.CrimsonSlab; - for (int i = 21040; i <= 21045; i++) - materials[i] = Material.WarpedSlab; - for (int i = 21046; i <= 21047; i++) - materials[i] = Material.CrimsonPressurePlate; - for (int i = 21048; i <= 21049; i++) - materials[i] = Material.WarpedPressurePlate; - for (int i = 21050; i <= 21081; i++) - materials[i] = Material.CrimsonFence; - for (int i = 21082; i <= 21113; i++) - materials[i] = Material.WarpedFence; - for (int i = 21114; i <= 21177; i++) - materials[i] = Material.CrimsonTrapdoor; - for (int i = 21178; i <= 21241; i++) - materials[i] = Material.WarpedTrapdoor; - for (int i = 21242; i <= 21273; i++) - materials[i] = Material.CrimsonFenceGate; - for (int i = 21274; i <= 21305; i++) - materials[i] = Material.WarpedFenceGate; - for (int i = 21306; i <= 21385; i++) - materials[i] = Material.CrimsonStairs; - for (int i = 21386; i <= 21465; i++) - materials[i] = Material.WarpedStairs; - for (int i = 21466; i <= 21489; i++) - materials[i] = Material.CrimsonButton; - for (int i = 21490; i <= 21513; i++) - materials[i] = Material.WarpedButton; - for (int i = 21514; i <= 21577; i++) - materials[i] = Material.CrimsonDoor; - for (int i = 21578; i <= 21641; i++) - materials[i] = Material.WarpedDoor; - for (int i = 21642; i <= 21673; i++) - materials[i] = Material.CrimsonSign; - for (int i = 21674; i <= 21705; i++) - materials[i] = Material.WarpedSign; - for (int i = 21706; i <= 21713; i++) - materials[i] = Material.CrimsonWallSign; - for (int i = 21714; i <= 21721; i++) - materials[i] = Material.WarpedWallSign; - for (int i = 21722; i <= 21725; i++) - materials[i] = Material.StructureBlock; - for (int i = 21726; i <= 21737; i++) - materials[i] = Material.Jigsaw; - for (int i = 21738; i <= 21741; i++) - materials[i] = Material.TestBlock; - for (int i = 21742; i <= 21742; i++) - materials[i] = Material.TestInstanceBlock; - for (int i = 21743; i <= 21751; i++) - materials[i] = Material.Composter; - for (int i = 21752; i <= 21767; i++) - materials[i] = Material.Target; - for (int i = 21768; i <= 21791; i++) - materials[i] = Material.BeeNest; - for (int i = 21792; i <= 21815; i++) - materials[i] = Material.Beehive; - for (int i = 21816; i <= 21816; i++) - materials[i] = Material.HoneyBlock; - for (int i = 21817; i <= 21817; i++) - materials[i] = Material.HoneycombBlock; - for (int i = 21818; i <= 21818; i++) - materials[i] = Material.NetheriteBlock; - for (int i = 21819; i <= 21819; i++) - materials[i] = Material.AncientDebris; - for (int i = 21820; i <= 21820; i++) - materials[i] = Material.CryingObsidian; - for (int i = 21821; i <= 21825; i++) - materials[i] = Material.RespawnAnchor; - for (int i = 21826; i <= 21826; i++) - materials[i] = Material.PottedCrimsonFungus; - for (int i = 21827; i <= 21827; i++) - materials[i] = Material.PottedWarpedFungus; - for (int i = 21828; i <= 21828; i++) - materials[i] = Material.PottedCrimsonRoots; - for (int i = 21829; i <= 21829; i++) - materials[i] = Material.PottedWarpedRoots; - for (int i = 21830; i <= 21830; i++) - materials[i] = Material.Lodestone; - for (int i = 21831; i <= 21831; i++) - materials[i] = Material.Blackstone; - for (int i = 21832; i <= 21911; i++) - materials[i] = Material.BlackstoneStairs; - for (int i = 21912; i <= 22235; i++) - materials[i] = Material.BlackstoneWall; - for (int i = 22236; i <= 22241; i++) - materials[i] = Material.BlackstoneSlab; - for (int i = 22242; i <= 22242; i++) - materials[i] = Material.PolishedBlackstone; - for (int i = 22243; i <= 22243; i++) - materials[i] = Material.PolishedBlackstoneBricks; - for (int i = 22244; i <= 22244; i++) - materials[i] = Material.CrackedPolishedBlackstoneBricks; - for (int i = 22245; i <= 22245; i++) - materials[i] = Material.ChiseledPolishedBlackstone; - for (int i = 22246; i <= 22251; i++) - materials[i] = Material.PolishedBlackstoneBrickSlab; - for (int i = 22252; i <= 22331; i++) - materials[i] = Material.PolishedBlackstoneBrickStairs; - for (int i = 22332; i <= 22655; i++) - materials[i] = Material.PolishedBlackstoneBrickWall; - for (int i = 22656; i <= 22656; i++) - materials[i] = Material.GildedBlackstone; - for (int i = 22657; i <= 22736; i++) - materials[i] = Material.PolishedBlackstoneStairs; - for (int i = 22737; i <= 22742; i++) - materials[i] = Material.PolishedBlackstoneSlab; - for (int i = 22743; i <= 22744; i++) - materials[i] = Material.PolishedBlackstonePressurePlate; - for (int i = 22745; i <= 22768; i++) - materials[i] = Material.PolishedBlackstoneButton; - for (int i = 22769; i <= 23092; i++) - materials[i] = Material.PolishedBlackstoneWall; - for (int i = 23093; i <= 23093; i++) - materials[i] = Material.ChiseledNetherBricks; - for (int i = 23094; i <= 23094; i++) - materials[i] = Material.CrackedNetherBricks; - for (int i = 23095; i <= 23095; i++) - materials[i] = Material.QuartzBricks; - for (int i = 23096; i <= 23111; i++) - materials[i] = Material.Candle; - for (int i = 23112; i <= 23127; i++) - materials[i] = Material.WhiteCandle; - for (int i = 23128; i <= 23143; i++) - materials[i] = Material.OrangeCandle; - for (int i = 23144; i <= 23159; i++) - materials[i] = Material.MagentaCandle; - for (int i = 23160; i <= 23175; i++) - materials[i] = Material.LightBlueCandle; - for (int i = 23176; i <= 23191; i++) - materials[i] = Material.YellowCandle; - for (int i = 23192; i <= 23207; i++) - materials[i] = Material.LimeCandle; - for (int i = 23208; i <= 23223; i++) - materials[i] = Material.PinkCandle; - for (int i = 23224; i <= 23239; i++) - materials[i] = Material.GrayCandle; - for (int i = 23240; i <= 23255; i++) - materials[i] = Material.LightGrayCandle; - for (int i = 23256; i <= 23271; i++) - materials[i] = Material.CyanCandle; - for (int i = 23272; i <= 23287; i++) - materials[i] = Material.PurpleCandle; - for (int i = 23288; i <= 23303; i++) - materials[i] = Material.BlueCandle; - for (int i = 23304; i <= 23319; i++) - materials[i] = Material.BrownCandle; - for (int i = 23320; i <= 23335; i++) - materials[i] = Material.GreenCandle; - for (int i = 23336; i <= 23351; i++) - materials[i] = Material.RedCandle; - for (int i = 23352; i <= 23367; i++) - materials[i] = Material.BlackCandle; - for (int i = 23368; i <= 23369; i++) - materials[i] = Material.CandleCake; - for (int i = 23370; i <= 23371; i++) - materials[i] = Material.WhiteCandleCake; - for (int i = 23372; i <= 23373; i++) - materials[i] = Material.OrangeCandleCake; - for (int i = 23374; i <= 23375; i++) - materials[i] = Material.MagentaCandleCake; - for (int i = 23376; i <= 23377; i++) - materials[i] = Material.LightBlueCandleCake; - for (int i = 23378; i <= 23379; i++) - materials[i] = Material.YellowCandleCake; - for (int i = 23380; i <= 23381; i++) - materials[i] = Material.LimeCandleCake; - for (int i = 23382; i <= 23383; i++) - materials[i] = Material.PinkCandleCake; - for (int i = 23384; i <= 23385; i++) - materials[i] = Material.GrayCandleCake; - for (int i = 23386; i <= 23387; i++) - materials[i] = Material.LightGrayCandleCake; - for (int i = 23388; i <= 23389; i++) - materials[i] = Material.CyanCandleCake; - for (int i = 23390; i <= 23391; i++) - materials[i] = Material.PurpleCandleCake; - for (int i = 23392; i <= 23393; i++) - materials[i] = Material.BlueCandleCake; - for (int i = 23394; i <= 23395; i++) - materials[i] = Material.BrownCandleCake; - for (int i = 23396; i <= 23397; i++) - materials[i] = Material.GreenCandleCake; - for (int i = 23398; i <= 23399; i++) - materials[i] = Material.RedCandleCake; - for (int i = 23400; i <= 23401; i++) - materials[i] = Material.BlackCandleCake; - for (int i = 23402; i <= 23402; i++) - materials[i] = Material.AmethystBlock; - for (int i = 23403; i <= 23403; i++) - materials[i] = Material.BuddingAmethyst; - for (int i = 23404; i <= 23415; i++) - materials[i] = Material.AmethystCluster; - for (int i = 23416; i <= 23427; i++) - materials[i] = Material.LargeAmethystBud; - for (int i = 23428; i <= 23439; i++) - materials[i] = Material.MediumAmethystBud; - for (int i = 23440; i <= 23451; i++) - materials[i] = Material.SmallAmethystBud; - for (int i = 23452; i <= 23452; i++) - materials[i] = Material.Tuff; - for (int i = 23453; i <= 23458; i++) - materials[i] = Material.TuffSlab; - for (int i = 23459; i <= 23538; i++) - materials[i] = Material.TuffStairs; - for (int i = 23539; i <= 23862; i++) - materials[i] = Material.TuffWall; - for (int i = 23863; i <= 23863; i++) - materials[i] = Material.PolishedTuff; - for (int i = 23864; i <= 23869; i++) - materials[i] = Material.PolishedTuffSlab; - for (int i = 23870; i <= 23949; i++) - materials[i] = Material.PolishedTuffStairs; - for (int i = 23950; i <= 24273; i++) - materials[i] = Material.PolishedTuffWall; - for (int i = 24274; i <= 24274; i++) - materials[i] = Material.ChiseledTuff; - for (int i = 24275; i <= 24275; i++) - materials[i] = Material.TuffBricks; - for (int i = 24276; i <= 24281; i++) - materials[i] = Material.TuffBrickSlab; - for (int i = 24282; i <= 24361; i++) - materials[i] = Material.TuffBrickStairs; - for (int i = 24362; i <= 24685; i++) - materials[i] = Material.TuffBrickWall; - for (int i = 24686; i <= 24686; i++) - materials[i] = Material.ChiseledTuffBricks; - for (int i = 24687; i <= 24687; i++) - materials[i] = Material.Calcite; - for (int i = 24688; i <= 24688; i++) - materials[i] = Material.TintedGlass; - for (int i = 24689; i <= 24689; i++) - materials[i] = Material.PowderSnow; - for (int i = 24690; i <= 24785; i++) - materials[i] = Material.SculkSensor; - for (int i = 24786; i <= 25169; i++) - materials[i] = Material.CalibratedSculkSensor; - for (int i = 25170; i <= 25170; i++) - materials[i] = Material.Sculk; - for (int i = 25171; i <= 25298; i++) - materials[i] = Material.SculkVein; - for (int i = 25299; i <= 25300; i++) - materials[i] = Material.SculkCatalyst; - for (int i = 25301; i <= 25308; i++) - materials[i] = Material.SculkShrieker; - for (int i = 25309; i <= 25309; i++) - materials[i] = Material.CopperBlock; - for (int i = 25310; i <= 25310; i++) - materials[i] = Material.ExposedCopper; - for (int i = 25311; i <= 25311; i++) - materials[i] = Material.WeatheredCopper; - for (int i = 25312; i <= 25312; i++) - materials[i] = Material.OxidizedCopper; - for (int i = 25313; i <= 25313; i++) - materials[i] = Material.CopperOre; - for (int i = 25314; i <= 25314; i++) - materials[i] = Material.DeepslateCopperOre; - for (int i = 25315; i <= 25315; i++) - materials[i] = Material.OxidizedCutCopper; - for (int i = 25316; i <= 25316; i++) - materials[i] = Material.WeatheredCutCopper; - for (int i = 25317; i <= 25317; i++) - materials[i] = Material.ExposedCutCopper; - for (int i = 25318; i <= 25318; i++) - materials[i] = Material.CutCopper; - for (int i = 25319; i <= 25319; i++) - materials[i] = Material.OxidizedChiseledCopper; - for (int i = 25320; i <= 25320; i++) - materials[i] = Material.WeatheredChiseledCopper; - for (int i = 25321; i <= 25321; i++) - materials[i] = Material.ExposedChiseledCopper; - for (int i = 25322; i <= 25322; i++) - materials[i] = Material.ChiseledCopper; - for (int i = 25323; i <= 25323; i++) - materials[i] = Material.WaxedOxidizedChiseledCopper; - for (int i = 25324; i <= 25324; i++) - materials[i] = Material.WaxedWeatheredChiseledCopper; - for (int i = 25325; i <= 25325; i++) - materials[i] = Material.WaxedExposedChiseledCopper; - for (int i = 25326; i <= 25326; i++) - materials[i] = Material.WaxedChiseledCopper; - for (int i = 25327; i <= 25406; i++) - materials[i] = Material.OxidizedCutCopperStairs; - for (int i = 25407; i <= 25486; i++) - materials[i] = Material.WeatheredCutCopperStairs; - for (int i = 25487; i <= 25566; i++) - materials[i] = Material.ExposedCutCopperStairs; - for (int i = 25567; i <= 25646; i++) - materials[i] = Material.CutCopperStairs; - for (int i = 25647; i <= 25652; i++) - materials[i] = Material.OxidizedCutCopperSlab; - for (int i = 25653; i <= 25658; i++) - materials[i] = Material.WeatheredCutCopperSlab; - for (int i = 25659; i <= 25664; i++) - materials[i] = Material.ExposedCutCopperSlab; - for (int i = 25665; i <= 25670; i++) - materials[i] = Material.CutCopperSlab; - for (int i = 25671; i <= 25671; i++) - materials[i] = Material.WaxedCopperBlock; - for (int i = 25672; i <= 25672; i++) - materials[i] = Material.WaxedWeatheredCopper; - for (int i = 25673; i <= 25673; i++) - materials[i] = Material.WaxedExposedCopper; - for (int i = 25674; i <= 25674; i++) - materials[i] = Material.WaxedOxidizedCopper; - for (int i = 25675; i <= 25675; i++) - materials[i] = Material.WaxedOxidizedCutCopper; - for (int i = 25676; i <= 25676; i++) - materials[i] = Material.WaxedWeatheredCutCopper; - for (int i = 25677; i <= 25677; i++) - materials[i] = Material.WaxedExposedCutCopper; - for (int i = 25678; i <= 25678; i++) - materials[i] = Material.WaxedCutCopper; - for (int i = 25679; i <= 25758; i++) - materials[i] = Material.WaxedOxidizedCutCopperStairs; - for (int i = 25759; i <= 25838; i++) - materials[i] = Material.WaxedWeatheredCutCopperStairs; - for (int i = 25839; i <= 25918; i++) - materials[i] = Material.WaxedExposedCutCopperStairs; - for (int i = 25919; i <= 25998; i++) - materials[i] = Material.WaxedCutCopperStairs; - for (int i = 25999; i <= 26004; i++) - materials[i] = Material.WaxedOxidizedCutCopperSlab; - for (int i = 26005; i <= 26010; i++) - materials[i] = Material.WaxedWeatheredCutCopperSlab; - for (int i = 26011; i <= 26016; i++) - materials[i] = Material.WaxedExposedCutCopperSlab; - for (int i = 26017; i <= 26022; i++) - materials[i] = Material.WaxedCutCopperSlab; - for (int i = 26023; i <= 26086; i++) - materials[i] = Material.CopperDoor; - for (int i = 26087; i <= 26150; i++) - materials[i] = Material.ExposedCopperDoor; - for (int i = 26151; i <= 26214; i++) - materials[i] = Material.OxidizedCopperDoor; - for (int i = 26215; i <= 26278; i++) - materials[i] = Material.WeatheredCopperDoor; - for (int i = 26279; i <= 26342; i++) - materials[i] = Material.WaxedCopperDoor; - for (int i = 26343; i <= 26406; i++) - materials[i] = Material.WaxedExposedCopperDoor; - for (int i = 26407; i <= 26470; i++) - materials[i] = Material.WaxedOxidizedCopperDoor; - for (int i = 26471; i <= 26534; i++) - materials[i] = Material.WaxedWeatheredCopperDoor; - for (int i = 26535; i <= 26598; i++) - materials[i] = Material.CopperTrapdoor; - for (int i = 26599; i <= 26662; i++) - materials[i] = Material.ExposedCopperTrapdoor; - for (int i = 26663; i <= 26726; i++) - materials[i] = Material.OxidizedCopperTrapdoor; - for (int i = 26727; i <= 26790; i++) - materials[i] = Material.WeatheredCopperTrapdoor; - for (int i = 26791; i <= 26854; i++) - materials[i] = Material.WaxedCopperTrapdoor; - for (int i = 26855; i <= 26918; i++) - materials[i] = Material.WaxedExposedCopperTrapdoor; - for (int i = 26919; i <= 26982; i++) - materials[i] = Material.WaxedOxidizedCopperTrapdoor; - for (int i = 26983; i <= 27046; i++) - materials[i] = Material.WaxedWeatheredCopperTrapdoor; - for (int i = 27047; i <= 27048; i++) - materials[i] = Material.CopperGrate; - for (int i = 27049; i <= 27050; i++) - materials[i] = Material.ExposedCopperGrate; - for (int i = 27051; i <= 27052; i++) - materials[i] = Material.WeatheredCopperGrate; - for (int i = 27053; i <= 27054; i++) - materials[i] = Material.OxidizedCopperGrate; - for (int i = 27055; i <= 27056; i++) - materials[i] = Material.WaxedCopperGrate; - for (int i = 27057; i <= 27058; i++) - materials[i] = Material.WaxedExposedCopperGrate; - for (int i = 27059; i <= 27060; i++) - materials[i] = Material.WaxedWeatheredCopperGrate; - for (int i = 27061; i <= 27062; i++) - materials[i] = Material.WaxedOxidizedCopperGrate; - for (int i = 27063; i <= 27066; i++) - materials[i] = Material.CopperBulb; - for (int i = 27067; i <= 27070; i++) - materials[i] = Material.ExposedCopperBulb; - for (int i = 27071; i <= 27074; i++) - materials[i] = Material.WeatheredCopperBulb; - for (int i = 27075; i <= 27078; i++) - materials[i] = Material.OxidizedCopperBulb; - for (int i = 27079; i <= 27082; i++) - materials[i] = Material.WaxedCopperBulb; - for (int i = 27083; i <= 27086; i++) - materials[i] = Material.WaxedExposedCopperBulb; - for (int i = 27087; i <= 27090; i++) - materials[i] = Material.WaxedWeatheredCopperBulb; - for (int i = 27091; i <= 27094; i++) - materials[i] = Material.WaxedOxidizedCopperBulb; - for (int i = 27095; i <= 27118; i++) - materials[i] = Material.CopperChest; - for (int i = 27119; i <= 27142; i++) - materials[i] = Material.ExposedCopperChest; - for (int i = 27143; i <= 27166; i++) - materials[i] = Material.WeatheredCopperChest; - for (int i = 27167; i <= 27190; i++) - materials[i] = Material.OxidizedCopperChest; - for (int i = 27191; i <= 27214; i++) - materials[i] = Material.WaxedCopperChest; - for (int i = 27215; i <= 27238; i++) - materials[i] = Material.WaxedExposedCopperChest; - for (int i = 27239; i <= 27262; i++) - materials[i] = Material.WaxedWeatheredCopperChest; - for (int i = 27263; i <= 27286; i++) - materials[i] = Material.WaxedOxidizedCopperChest; - for (int i = 27287; i <= 27318; i++) - materials[i] = Material.CopperGolemStatue; - for (int i = 27319; i <= 27350; i++) - materials[i] = Material.ExposedCopperGolemStatue; - for (int i = 27351; i <= 27382; i++) - materials[i] = Material.WeatheredCopperGolemStatue; - for (int i = 27383; i <= 27414; i++) - materials[i] = Material.OxidizedCopperGolemStatue; - for (int i = 27415; i <= 27446; i++) - materials[i] = Material.WaxedCopperGolemStatue; - for (int i = 27447; i <= 27478; i++) - materials[i] = Material.WaxedExposedCopperGolemStatue; - for (int i = 27479; i <= 27510; i++) - materials[i] = Material.WaxedWeatheredCopperGolemStatue; - for (int i = 27511; i <= 27542; i++) - materials[i] = Material.WaxedOxidizedCopperGolemStatue; - for (int i = 27543; i <= 27566; i++) - materials[i] = Material.LightningRod; - for (int i = 27567; i <= 27590; i++) - materials[i] = Material.ExposedLightningRod; - for (int i = 27591; i <= 27614; i++) - materials[i] = Material.WeatheredLightningRod; - for (int i = 27615; i <= 27638; i++) - materials[i] = Material.OxidizedLightningRod; - for (int i = 27639; i <= 27662; i++) - materials[i] = Material.WaxedLightningRod; - for (int i = 27663; i <= 27686; i++) - materials[i] = Material.WaxedExposedLightningRod; - for (int i = 27687; i <= 27710; i++) - materials[i] = Material.WaxedWeatheredLightningRod; - for (int i = 27711; i <= 27734; i++) - materials[i] = Material.WaxedOxidizedLightningRod; - for (int i = 27735; i <= 27754; i++) - materials[i] = Material.PointedDripstone; - for (int i = 27755; i <= 27755; i++) - materials[i] = Material.DripstoneBlock; - for (int i = 27756; i <= 27807; i++) - materials[i] = Material.CaveVines; - for (int i = 27808; i <= 27809; i++) - materials[i] = Material.CaveVinesPlant; - for (int i = 27810; i <= 27810; i++) - materials[i] = Material.SporeBlossom; - for (int i = 27811; i <= 27811; i++) - materials[i] = Material.Azalea; - for (int i = 27812; i <= 27812; i++) - materials[i] = Material.FloweringAzalea; - for (int i = 27813; i <= 27813; i++) - materials[i] = Material.MossCarpet; - for (int i = 27814; i <= 27829; i++) - materials[i] = Material.PinkPetals; - for (int i = 27830; i <= 27845; i++) - materials[i] = Material.Wildflowers; - for (int i = 27846; i <= 27861; i++) - materials[i] = Material.LeafLitter; - for (int i = 27862; i <= 27862; i++) - materials[i] = Material.MossBlock; - for (int i = 27863; i <= 27894; i++) - materials[i] = Material.BigDripleaf; - for (int i = 27895; i <= 27902; i++) - materials[i] = Material.BigDripleafStem; - for (int i = 27903; i <= 27918; i++) - materials[i] = Material.SmallDripleaf; - for (int i = 27919; i <= 27920; i++) - materials[i] = Material.HangingRoots; - for (int i = 27921; i <= 27921; i++) - materials[i] = Material.RootedDirt; - for (int i = 27922; i <= 27922; i++) - materials[i] = Material.Mud; - for (int i = 27923; i <= 27925; i++) - materials[i] = Material.Deepslate; - for (int i = 27926; i <= 27926; i++) - materials[i] = Material.CobbledDeepslate; - for (int i = 27927; i <= 28006; i++) - materials[i] = Material.CobbledDeepslateStairs; - for (int i = 28007; i <= 28012; i++) - materials[i] = Material.CobbledDeepslateSlab; - for (int i = 28013; i <= 28336; i++) - materials[i] = Material.CobbledDeepslateWall; - for (int i = 28337; i <= 28337; i++) - materials[i] = Material.PolishedDeepslate; - for (int i = 28338; i <= 28417; i++) - materials[i] = Material.PolishedDeepslateStairs; - for (int i = 28418; i <= 28423; i++) - materials[i] = Material.PolishedDeepslateSlab; - for (int i = 28424; i <= 28747; i++) - materials[i] = Material.PolishedDeepslateWall; - for (int i = 28748; i <= 28748; i++) - materials[i] = Material.DeepslateTiles; - for (int i = 28749; i <= 28828; i++) - materials[i] = Material.DeepslateTileStairs; - for (int i = 28829; i <= 28834; i++) - materials[i] = Material.DeepslateTileSlab; - for (int i = 28835; i <= 29158; i++) - materials[i] = Material.DeepslateTileWall; - for (int i = 29159; i <= 29159; i++) - materials[i] = Material.DeepslateBricks; - for (int i = 29160; i <= 29239; i++) - materials[i] = Material.DeepslateBrickStairs; - for (int i = 29240; i <= 29245; i++) - materials[i] = Material.DeepslateBrickSlab; - for (int i = 29246; i <= 29569; i++) - materials[i] = Material.DeepslateBrickWall; - for (int i = 29570; i <= 29570; i++) - materials[i] = Material.ChiseledDeepslate; - for (int i = 29571; i <= 29571; i++) - materials[i] = Material.CrackedDeepslateBricks; - for (int i = 29572; i <= 29572; i++) - materials[i] = Material.CrackedDeepslateTiles; - for (int i = 29573; i <= 29575; i++) - materials[i] = Material.InfestedDeepslate; - for (int i = 29576; i <= 29576; i++) - materials[i] = Material.SmoothBasalt; - for (int i = 29577; i <= 29577; i++) - materials[i] = Material.RawIronBlock; - for (int i = 29578; i <= 29578; i++) - materials[i] = Material.RawCopperBlock; - for (int i = 29579; i <= 29579; i++) - materials[i] = Material.RawGoldBlock; - for (int i = 29580; i <= 29580; i++) - materials[i] = Material.PottedAzaleaBush; - for (int i = 29581; i <= 29581; i++) - materials[i] = Material.PottedFloweringAzaleaBush; - for (int i = 29582; i <= 29584; i++) - materials[i] = Material.OchreFroglight; - for (int i = 29585; i <= 29587; i++) - materials[i] = Material.VerdantFroglight; - for (int i = 29588; i <= 29590; i++) - materials[i] = Material.PearlescentFroglight; - for (int i = 29591; i <= 29591; i++) - materials[i] = Material.Frogspawn; - for (int i = 29592; i <= 29592; i++) - materials[i] = Material.ReinforcedDeepslate; - for (int i = 29593; i <= 29608; i++) - materials[i] = Material.DecoratedPot; - for (int i = 29609; i <= 29656; i++) - materials[i] = Material.Crafter; - for (int i = 29657; i <= 29668; i++) - materials[i] = Material.TrialSpawner; - for (int i = 29669; i <= 29700; i++) - materials[i] = Material.Vault; - for (int i = 29701; i <= 29702; i++) - materials[i] = Material.HeavyCore; - for (int i = 29703; i <= 29703; i++) - materials[i] = Material.PaleMossBlock; - for (int i = 29704; i <= 29865; i++) - materials[i] = Material.PaleMossCarpet; - for (int i = 29866; i <= 29867; i++) - materials[i] = Material.PaleHangingMoss; - for (int i = 29868; i <= 29868; i++) - materials[i] = Material.OpenEyeblossom; - for (int i = 29869; i <= 29869; i++) - materials[i] = Material.ClosedEyeblossom; - for (int i = 29870; i <= 29870; i++) - materials[i] = Material.PottedOpenEyeblossom; - for (int i = 29871; i <= 29871; i++) - materials[i] = Material.PottedClosedEyeblossom; - for (int i = 29872; i <= 29872; i++) - materials[i] = Material.FireflyBush; - } - - // - private static readonly BlockStateDefinition[] stateDefinitions = - [ - new(8, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(12, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(22, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(29, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(31, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(33, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(35, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(37, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(39, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(41, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(43, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(45, 40, - [ - new("age", ["0", "1", "2", "3", "4"], 8), - new("hanging", ["true", "false"], 4), - new("stage", ["0", "1"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(86, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(102, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(119, 4, - [ - new("dusted", ["0", "1", "2", "3"], 1) - ]), - new(125, 4, - [ - new("dusted", ["0", "1", "2", "3"], 1) - ]), - new(136, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(139, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(142, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(145, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(148, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(151, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(154, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(157, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(160, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(163, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(165, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(168, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(171, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(174, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(177, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(180, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(183, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(186, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(189, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(192, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(195, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(198, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(201, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(204, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(207, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(210, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(213, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(216, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(219, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(222, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(225, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(228, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(231, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(234, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(237, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(240, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(243, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(246, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(249, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(252, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(280, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(308, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(336, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(364, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(392, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(420, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(448, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(476, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(504, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(532, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(566, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(581, 1350, - [ - new("instrument", ["harp", "basedrum", "snare", "hat", "bass", "flute", "bell", "guitar", "chime", "xylophone", "iron_xylophone", "cow_bell", "didgeridoo", "bit", "banjo", "pling", "trumpet", "trumpet_exposed", "trumpet_oxidized", "trumpet_weathered", "zombie", "skeleton", "creeper", "dragon", "wither_skeleton", "piglin", "custom_head"], 50), - new("note", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"], 2), - new("powered", ["true", "false"], 1) - ]), - new(1931, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1947, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1963, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1979, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1995, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2011, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2027, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2043, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2059, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2075, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2091, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2107, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2123, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2139, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2155, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2171, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2187, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2211, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2235, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(2255, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(2257, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(2269, 24, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("short", ["true", "false"], 2) - ]), - new(2309, 12, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 2) - ]), - new(2341, 2, - [ - new("unstable", ["true", "false"], 1) - ]), - new(2344, 256, - [ - new("facing", ["north", "south", "west", "east"], 64), - new("slot_0_occupied", ["true", "false"], 32), - new("slot_1_occupied", ["true", "false"], 16), - new("slot_2_occupied", ["true", "false"], 8), - new("slot_3_occupied", ["true", "false"], 4), - new("slot_4_occupied", ["true", "false"], 2), - new("slot_5_occupied", ["true", "false"], 1) - ]), - new(2600, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2664, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2728, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2792, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2856, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2920, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2984, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3048, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3112, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3176, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3240, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3304, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3371, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(3375, 512, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(3889, 18, - [ - new("axis", ["x", "y", "z"], 6), - new("creaking_heart_state", ["uprooted", "dormant", "awake"], 2), - new("natural", ["true", "false"], 1) - ]), - new(3907, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3987, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(4011, 1296, - [ - new("east", ["up", "side", "none"], 432), - new("north", ["up", "side", "none"], 144), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 9), - new("south", ["up", "side", "none"], 3), - new("west", ["up", "side", "none"], 1) - ]), - new(5311, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(5319, 8, - [ - new("moisture", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(5327, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(5335, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5367, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5399, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5431, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5463, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5495, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5527, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5559, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5591, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5623, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5655, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5719, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5727, 20, - [ - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south", "south_east", "south_west", "north_west", "north_east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5747, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5827, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5835, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5843, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5851, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5859, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5867, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5875, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5883, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5891, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5899, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5907, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5971, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6035, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6099, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6163, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6227, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6291, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6355, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6419, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6483, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6547, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6611, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6675, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6683, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6691, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6699, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6707, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6715, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6723, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6731, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6739, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6747, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6755, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6763, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6771, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6795, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6797, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6861, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6863, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6865, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6867, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6869, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6871, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6873, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6875, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6877, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6879, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6881, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(6883, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(6885, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(6887, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(6895, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6919, 8, - [ - new("layers", ["1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(6929, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6947, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6963, 2, - [ - new("has_record", ["true", "false"], 1) - ]), - new(6965, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7000, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(7003, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(7007, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7012, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7017, 2, - [ - new("axis", ["x", "z"], 1) - ]), - new(7019, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7023, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7027, 7, - [ - new("bites", ["0", "1", "2", "3", "4", "5", "6"], 1) - ]), - new(7034, 64, - [ - new("delay", ["1", "2", "3", "4"], 16), - new("facing", ["north", "south", "west", "east"], 4), - new("locked", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7114, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7178, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7242, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7306, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7370, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7434, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7498, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7562, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7626, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7690, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7766, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7830, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7894, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7958, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7990, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8022, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8054, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8086, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8118, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8150, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8182, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8214, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8246, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8252, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8258, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8264, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8270, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8276, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8282, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8288, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8294, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8300, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8334, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8338, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8342, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(8350, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(8358, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8390, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8518, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8646, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8678, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8758, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8838, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8918, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(8923, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9003, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9009, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(9335, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9367, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9447, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(9452, 8, - [ - new("has_bottle_0", ["true", "false"], 4), - new("has_bottle_1", ["true", "false"], 2), - new("has_bottle_2", ["true", "false"], 1) - ]), - new(9461, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(9465, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(9469, 8, - [ - new("eye", ["true", "false"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9479, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(9481, 12, - [ - new("age", ["0", "1", "2"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9493, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9575, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9583, 16, - [ - new("attached", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9599, 128, - [ - new("attached", ["true", "false"], 64), - new("disarmed", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("powered", ["true", "false"], 4), - new("south", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9728, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9808, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9888, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9968, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9981, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(10305, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(10659, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(10667, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(10675, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10699, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10723, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10747, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10771, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10795, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10819, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10843, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10867, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10891, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10915, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10947, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10955, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10987, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10995, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11027, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11035, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11067, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11075, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11107, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11115, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11147, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11155, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11187, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11195, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11199, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11203, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11207, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(11231, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11247, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11263, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("mode", ["compare", "subtract"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11279, 32, - [ - new("inverted", ["true", "false"], 16), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11313, 10, - [ - new("enabled", ["true", "false"], 5), - new("facing", ["down", "north", "south", "west", "east"], 1) - ]), - new(11325, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(11328, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11408, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11432, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(11460, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11492, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11524, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11556, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11588, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11620, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11652, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11684, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11716, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11748, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11780, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11812, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11844, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11876, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11908, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11940, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11972, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12052, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12132, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12212, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12292, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12372, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12452, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12533, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12535, 32, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12567, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12634, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12714, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12794, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12874, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12880, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12886, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12893, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(12915, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(12917, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(12919, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(12921, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(12923, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(12925, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(12927, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12943, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12959, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12975, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12991, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13007, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13023, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13039, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13055, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13071, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13087, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13103, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13119, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13135, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13151, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13167, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13183, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13187, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13191, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13195, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13199, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13203, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13207, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13211, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13215, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13219, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13223, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13227, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13231, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13235, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13239, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13243, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13250, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13330, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13336, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13342, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13348, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13354, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13360, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13366, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13372, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13378, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13384, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13390, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13396, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13402, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13408, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13414, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13420, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13426, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13432, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13438, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13444, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13450, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13456, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13462, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13468, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13474, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13484, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13516, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13548, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13580, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13612, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13644, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13676, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13708, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13740, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13772, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13804, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13836, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13868, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13900, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13932, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13964, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13996, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(14028, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(14060, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14124, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14188, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14252, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14316, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14380, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14444, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14508, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14572, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14636, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14642, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(14706, 6, - [ - new("age", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(14713, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(14716, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14797, 2, - [ - new("age", ["0", "1"], 1) - ]), - new(14799, 10, - [ - new("age", ["0", "1", "2", "3", "4"], 2), - new("half", ["upper", "lower"], 1) - ]), - new(14809, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(14811, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(14817, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14829, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14841, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(14848, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(14852, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14864, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14870, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14876, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14882, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14888, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14894, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14900, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14906, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14912, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14918, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14924, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14930, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14936, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14942, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14948, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14954, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14960, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14966, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14970, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14974, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14978, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14982, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14986, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14990, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14994, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14998, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(15002, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(15006, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(15010, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(15014, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(15018, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(15022, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(15026, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(15062, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(15090, 12, - [ - new("eggs", ["1", "2", "3", "4"], 3), - new("hatch", ["0", "1", "2"], 1) - ]), - new(15102, 3, - [ - new("hatch", ["0", "1", "2"], 1) - ]), - new(15105, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("hydration", ["0", "1", "2", "3"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15147, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15149, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15151, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15153, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15155, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15157, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15159, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15161, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15163, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15165, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15167, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15169, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15171, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15173, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15175, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15177, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15179, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15181, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15183, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15185, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15187, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15195, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15203, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15211, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15219, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15227, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15235, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15243, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15251, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15259, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15267, 8, - [ - new("pickles", ["1", "2", "3", "4"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15276, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15279, 12, - [ - new("age", ["0", "1"], 6), - new("leaves", ["none", "small", "large"], 2), - new("stage", ["0", "1"], 1) - ]), - new(15294, 2, - [ - new("drag", ["true", "false"], 1) - ]), - new(15296, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15376, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15456, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15536, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15616, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15696, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15776, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15856, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15936, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16016, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16096, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16176, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16256, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16336, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16416, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16422, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16428, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16434, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16440, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16446, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16452, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16458, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16464, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16470, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16476, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16482, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16488, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16494, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16818, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17142, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17466, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17790, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18114, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18438, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18762, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19086, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19410, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19734, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20058, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20382, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20706, 32, - [ - new("bottom", ["true", "false"], 16), - new("distance", ["0", "1", "2", "3", "4", "5", "6", "7"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20738, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(20742, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("open", ["true", "false"], 1) - ]), - new(20754, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(20762, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(20772, 12, - [ - new("face", ["floor", "wall", "ceiling"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(20784, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("has_book", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20801, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(20805, 32, - [ - new("attachment", ["floor", "ceiling", "single_wall", "double_wall"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20837, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20841, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20845, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20849, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20853, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20857, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20861, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20865, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20869, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20873, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20877, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20909, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20941, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(20945, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20948, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20951, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20954, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20962, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20965, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20968, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20971, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20977, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(21004, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(21034, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21040, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21046, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(21048, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(21050, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(21082, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(21114, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21178, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21242, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(21274, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(21306, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21386, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21466, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(21490, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(21514, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(21578, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(21642, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21674, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21706, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21714, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21722, 4, - [ - new("mode", ["save", "load", "corner", "data"], 1) - ]), - new(21726, 12, - [ - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 1) - ]), - new(21738, 4, - [ - new("mode", ["start", "log", "fail", "accept"], 1) - ]), - new(21743, 9, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(21752, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(21768, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(21792, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(21821, 5, - [ - new("charges", ["0", "1", "2", "3", "4"], 1) - ]), - new(21832, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21912, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(22236, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22246, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22252, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22332, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(22657, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22737, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22743, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(22745, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(22769, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(23096, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23112, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23128, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23144, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23160, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23176, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23192, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23208, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23224, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23240, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23256, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23272, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23288, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23304, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23320, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23336, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23352, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23368, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23370, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23372, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23374, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23376, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23378, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23380, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23382, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23384, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23386, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23388, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23390, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23392, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23394, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23396, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23398, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23400, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23404, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23416, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23428, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23440, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23453, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23459, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23539, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(23864, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23870, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23950, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(24276, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24282, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24362, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(24690, 96, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24786, 384, - [ - new("facing", ["north", "south", "west", "east"], 96), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25171, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(25299, 2, - [ - new("bloom", ["true", "false"], 1) - ]), - new(25301, 8, - [ - new("can_summon", ["true", "false"], 4), - new("shrieking", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25327, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25407, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25487, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25567, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25647, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25653, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25659, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25665, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25679, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25759, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25839, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25919, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25999, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26005, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26011, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26017, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26023, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(26087, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(26151, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(26215, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(26279, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(26343, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(26407, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(26471, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(26535, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26599, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26663, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26727, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26791, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26855, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26919, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26983, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27047, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(27049, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(27051, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(27053, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(27055, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(27057, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(27059, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(27061, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(27063, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(27067, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(27071, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(27075, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(27079, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(27083, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(27087, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(27091, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(27095, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(27119, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(27143, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(27167, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(27191, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(27215, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(27239, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(27263, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(27287, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27319, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27351, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27383, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27415, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27447, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27479, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27511, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27543, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27567, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27591, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27615, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27639, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27663, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27687, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27711, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27735, 20, - [ - new("thickness", ["tip_merge", "tip", "frustum", "middle", "base"], 4), - new("vertical_direction", ["up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27756, 52, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 2), - new("berries", ["true", "false"], 1) - ]), - new(27808, 2, - [ - new("berries", ["true", "false"], 1) - ]), - new(27814, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("flower_amount", ["1", "2", "3", "4"], 1) - ]), - new(27830, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("flower_amount", ["1", "2", "3", "4"], 1) - ]), - new(27846, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("segment_amount", ["1", "2", "3", "4"], 1) - ]), - new(27863, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("tilt", ["none", "unstable", "partial", "full"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27895, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27903, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("half", ["upper", "lower"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27919, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(27923, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(27927, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28007, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28013, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(28338, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28418, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28424, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(28749, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28829, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28835, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(29160, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(29240, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(29246, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(29573, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(29582, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(29585, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(29588, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(29593, 16, - [ - new("cracked", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(29609, 48, - [ - new("crafting", ["true", "false"], 24), - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(29657, 12, - [ - new("ominous", ["true", "false"], 6), - new("trial_spawner_state", ["inactive", "waiting_for_players", "active", "waiting_for_reward_ejection", "ejecting_reward", "cooldown"], 1) - ]), - new(29669, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("ominous", ["true", "false"], 4), - new("vault_state", ["inactive", "active", "unlocking", "ejecting"], 1) - ]), - new(29701, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(29704, 162, - [ - new("bottom", ["true", "false"], 81), - new("east", ["none", "low", "tall"], 27), - new("north", ["none", "low", "tall"], 9), - new("south", ["none", "low", "tall"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(29866, 2, - [ - new("tip", ["true", "false"], 1) - ]), - ]; - // - - protected override Dictionary GetDict() - { - return materials; - } - - protected override BlockStateDefinition[] GetStateDefinitions() - { - return stateDefinitions; - } - } -} diff --git a/MinecraftClient/Mapping/BlockPalettes/Palette262.cs b/MinecraftClient/Mapping/BlockPalettes/Palette262.cs deleted file mode 100644 index 7b79dc1937..0000000000 --- a/MinecraftClient/Mapping/BlockPalettes/Palette262.cs +++ /dev/null @@ -1,6872 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.BlockPalettes -{ - public class Palette262 : BlockPalette - { - private static readonly Dictionary materials = new(); - - static Palette262() - { - for (int i = 0; i <= 0; i++) - materials[i] = Material.Air; - for (int i = 1; i <= 1; i++) - materials[i] = Material.Stone; - for (int i = 2; i <= 2; i++) - materials[i] = Material.Granite; - for (int i = 3; i <= 3; i++) - materials[i] = Material.PolishedGranite; - for (int i = 4; i <= 4; i++) - materials[i] = Material.Diorite; - for (int i = 5; i <= 5; i++) - materials[i] = Material.PolishedDiorite; - for (int i = 6; i <= 6; i++) - materials[i] = Material.Andesite; - for (int i = 7; i <= 7; i++) - materials[i] = Material.PolishedAndesite; - for (int i = 8; i <= 9; i++) - materials[i] = Material.GrassBlock; - for (int i = 10; i <= 10; i++) - materials[i] = Material.Dirt; - for (int i = 11; i <= 11; i++) - materials[i] = Material.CoarseDirt; - for (int i = 12; i <= 13; i++) - materials[i] = Material.Podzol; - for (int i = 14; i <= 14; i++) - materials[i] = Material.Cobblestone; - for (int i = 15; i <= 15; i++) - materials[i] = Material.OakPlanks; - for (int i = 16; i <= 16; i++) - materials[i] = Material.SprucePlanks; - for (int i = 17; i <= 17; i++) - materials[i] = Material.BirchPlanks; - for (int i = 18; i <= 18; i++) - materials[i] = Material.JunglePlanks; - for (int i = 19; i <= 19; i++) - materials[i] = Material.AcaciaPlanks; - for (int i = 20; i <= 20; i++) - materials[i] = Material.CherryPlanks; - for (int i = 21; i <= 21; i++) - materials[i] = Material.DarkOakPlanks; - for (int i = 22; i <= 24; i++) - materials[i] = Material.PaleOakWood; - for (int i = 25; i <= 25; i++) - materials[i] = Material.PaleOakPlanks; - for (int i = 26; i <= 26; i++) - materials[i] = Material.MangrovePlanks; - for (int i = 27; i <= 27; i++) - materials[i] = Material.BambooPlanks; - for (int i = 28; i <= 28; i++) - materials[i] = Material.BambooMosaic; - for (int i = 29; i <= 30; i++) - materials[i] = Material.OakSapling; - for (int i = 31; i <= 32; i++) - materials[i] = Material.SpruceSapling; - for (int i = 33; i <= 34; i++) - materials[i] = Material.BirchSapling; - for (int i = 35; i <= 36; i++) - materials[i] = Material.JungleSapling; - for (int i = 37; i <= 38; i++) - materials[i] = Material.AcaciaSapling; - for (int i = 39; i <= 40; i++) - materials[i] = Material.CherrySapling; - for (int i = 41; i <= 42; i++) - materials[i] = Material.DarkOakSapling; - for (int i = 43; i <= 44; i++) - materials[i] = Material.PaleOakSapling; - for (int i = 45; i <= 84; i++) - materials[i] = Material.MangrovePropagule; - for (int i = 85; i <= 85; i++) - materials[i] = Material.Bedrock; - for (int i = 86; i <= 101; i++) - materials[i] = Material.Water; - for (int i = 102; i <= 117; i++) - materials[i] = Material.Lava; - for (int i = 118; i <= 118; i++) - materials[i] = Material.Sand; - for (int i = 119; i <= 122; i++) - materials[i] = Material.SuspiciousSand; - for (int i = 123; i <= 123; i++) - materials[i] = Material.RedSand; - for (int i = 124; i <= 124; i++) - materials[i] = Material.Gravel; - for (int i = 125; i <= 128; i++) - materials[i] = Material.SuspiciousGravel; - for (int i = 129; i <= 129; i++) - materials[i] = Material.GoldOre; - for (int i = 130; i <= 130; i++) - materials[i] = Material.DeepslateGoldOre; - for (int i = 131; i <= 131; i++) - materials[i] = Material.IronOre; - for (int i = 132; i <= 132; i++) - materials[i] = Material.DeepslateIronOre; - for (int i = 133; i <= 133; i++) - materials[i] = Material.CoalOre; - for (int i = 134; i <= 134; i++) - materials[i] = Material.DeepslateCoalOre; - for (int i = 135; i <= 135; i++) - materials[i] = Material.NetherGoldOre; - for (int i = 136; i <= 138; i++) - materials[i] = Material.OakLog; - for (int i = 139; i <= 141; i++) - materials[i] = Material.SpruceLog; - for (int i = 142; i <= 144; i++) - materials[i] = Material.BirchLog; - for (int i = 145; i <= 147; i++) - materials[i] = Material.JungleLog; - for (int i = 148; i <= 150; i++) - materials[i] = Material.AcaciaLog; - for (int i = 151; i <= 153; i++) - materials[i] = Material.CherryLog; - for (int i = 154; i <= 156; i++) - materials[i] = Material.DarkOakLog; - for (int i = 157; i <= 159; i++) - materials[i] = Material.PaleOakLog; - for (int i = 160; i <= 162; i++) - materials[i] = Material.MangroveLog; - for (int i = 163; i <= 164; i++) - materials[i] = Material.MangroveRoots; - for (int i = 165; i <= 167; i++) - materials[i] = Material.MuddyMangroveRoots; - for (int i = 168; i <= 170; i++) - materials[i] = Material.BambooBlock; - for (int i = 171; i <= 173; i++) - materials[i] = Material.StrippedSpruceLog; - for (int i = 174; i <= 176; i++) - materials[i] = Material.StrippedBirchLog; - for (int i = 177; i <= 179; i++) - materials[i] = Material.StrippedJungleLog; - for (int i = 180; i <= 182; i++) - materials[i] = Material.StrippedAcaciaLog; - for (int i = 183; i <= 185; i++) - materials[i] = Material.StrippedCherryLog; - for (int i = 186; i <= 188; i++) - materials[i] = Material.StrippedDarkOakLog; - for (int i = 189; i <= 191; i++) - materials[i] = Material.StrippedPaleOakLog; - for (int i = 192; i <= 194; i++) - materials[i] = Material.StrippedOakLog; - for (int i = 195; i <= 197; i++) - materials[i] = Material.StrippedMangroveLog; - for (int i = 198; i <= 200; i++) - materials[i] = Material.StrippedBambooBlock; - for (int i = 201; i <= 203; i++) - materials[i] = Material.OakWood; - for (int i = 204; i <= 206; i++) - materials[i] = Material.SpruceWood; - for (int i = 207; i <= 209; i++) - materials[i] = Material.BirchWood; - for (int i = 210; i <= 212; i++) - materials[i] = Material.JungleWood; - for (int i = 213; i <= 215; i++) - materials[i] = Material.AcaciaWood; - for (int i = 216; i <= 218; i++) - materials[i] = Material.CherryWood; - for (int i = 219; i <= 221; i++) - materials[i] = Material.DarkOakWood; - for (int i = 222; i <= 224; i++) - materials[i] = Material.MangroveWood; - for (int i = 225; i <= 227; i++) - materials[i] = Material.StrippedOakWood; - for (int i = 228; i <= 230; i++) - materials[i] = Material.StrippedSpruceWood; - for (int i = 231; i <= 233; i++) - materials[i] = Material.StrippedBirchWood; - for (int i = 234; i <= 236; i++) - materials[i] = Material.StrippedJungleWood; - for (int i = 237; i <= 239; i++) - materials[i] = Material.StrippedAcaciaWood; - for (int i = 240; i <= 242; i++) - materials[i] = Material.StrippedCherryWood; - for (int i = 243; i <= 245; i++) - materials[i] = Material.StrippedDarkOakWood; - for (int i = 246; i <= 248; i++) - materials[i] = Material.StrippedPaleOakWood; - for (int i = 249; i <= 251; i++) - materials[i] = Material.StrippedMangroveWood; - for (int i = 252; i <= 279; i++) - materials[i] = Material.OakLeaves; - for (int i = 280; i <= 307; i++) - materials[i] = Material.SpruceLeaves; - for (int i = 308; i <= 335; i++) - materials[i] = Material.BirchLeaves; - for (int i = 336; i <= 363; i++) - materials[i] = Material.JungleLeaves; - for (int i = 364; i <= 391; i++) - materials[i] = Material.AcaciaLeaves; - for (int i = 392; i <= 419; i++) - materials[i] = Material.CherryLeaves; - for (int i = 420; i <= 447; i++) - materials[i] = Material.DarkOakLeaves; - for (int i = 448; i <= 475; i++) - materials[i] = Material.PaleOakLeaves; - for (int i = 476; i <= 503; i++) - materials[i] = Material.MangroveLeaves; - for (int i = 504; i <= 531; i++) - materials[i] = Material.AzaleaLeaves; - for (int i = 532; i <= 559; i++) - materials[i] = Material.FloweringAzaleaLeaves; - for (int i = 560; i <= 560; i++) - materials[i] = Material.Sponge; - for (int i = 561; i <= 561; i++) - materials[i] = Material.WetSponge; - for (int i = 562; i <= 562; i++) - materials[i] = Material.Glass; - for (int i = 563; i <= 563; i++) - materials[i] = Material.LapisOre; - for (int i = 564; i <= 564; i++) - materials[i] = Material.DeepslateLapisOre; - for (int i = 565; i <= 565; i++) - materials[i] = Material.LapisBlock; - for (int i = 566; i <= 577; i++) - materials[i] = Material.Dispenser; - for (int i = 578; i <= 578; i++) - materials[i] = Material.Sandstone; - for (int i = 579; i <= 579; i++) - materials[i] = Material.ChiseledSandstone; - for (int i = 580; i <= 580; i++) - materials[i] = Material.CutSandstone; - for (int i = 581; i <= 1930; i++) - materials[i] = Material.NoteBlock; - for (int i = 1931; i <= 1946; i++) - materials[i] = Material.WhiteBed; - for (int i = 1947; i <= 1962; i++) - materials[i] = Material.OrangeBed; - for (int i = 1963; i <= 1978; i++) - materials[i] = Material.MagentaBed; - for (int i = 1979; i <= 1994; i++) - materials[i] = Material.LightBlueBed; - for (int i = 1995; i <= 2010; i++) - materials[i] = Material.YellowBed; - for (int i = 2011; i <= 2026; i++) - materials[i] = Material.LimeBed; - for (int i = 2027; i <= 2042; i++) - materials[i] = Material.PinkBed; - for (int i = 2043; i <= 2058; i++) - materials[i] = Material.GrayBed; - for (int i = 2059; i <= 2074; i++) - materials[i] = Material.LightGrayBed; - for (int i = 2075; i <= 2090; i++) - materials[i] = Material.CyanBed; - for (int i = 2091; i <= 2106; i++) - materials[i] = Material.PurpleBed; - for (int i = 2107; i <= 2122; i++) - materials[i] = Material.BlueBed; - for (int i = 2123; i <= 2138; i++) - materials[i] = Material.BrownBed; - for (int i = 2139; i <= 2154; i++) - materials[i] = Material.GreenBed; - for (int i = 2155; i <= 2170; i++) - materials[i] = Material.RedBed; - for (int i = 2171; i <= 2186; i++) - materials[i] = Material.BlackBed; - for (int i = 2187; i <= 2210; i++) - materials[i] = Material.PoweredRail; - for (int i = 2211; i <= 2234; i++) - materials[i] = Material.DetectorRail; - for (int i = 2235; i <= 2246; i++) - materials[i] = Material.StickyPiston; - for (int i = 2247; i <= 2247; i++) - materials[i] = Material.Cobweb; - for (int i = 2248; i <= 2248; i++) - materials[i] = Material.ShortGrass; - for (int i = 2249; i <= 2249; i++) - materials[i] = Material.Fern; - for (int i = 2250; i <= 2250; i++) - materials[i] = Material.DeadBush; - for (int i = 2251; i <= 2251; i++) - materials[i] = Material.Bush; - for (int i = 2252; i <= 2252; i++) - materials[i] = Material.ShortDryGrass; - for (int i = 2253; i <= 2253; i++) - materials[i] = Material.TallDryGrass; - for (int i = 2254; i <= 2254; i++) - materials[i] = Material.Seagrass; - for (int i = 2255; i <= 2256; i++) - materials[i] = Material.TallSeagrass; - for (int i = 2257; i <= 2268; i++) - materials[i] = Material.Piston; - for (int i = 2269; i <= 2292; i++) - materials[i] = Material.PistonHead; - for (int i = 2293; i <= 2293; i++) - materials[i] = Material.WhiteWool; - for (int i = 2294; i <= 2294; i++) - materials[i] = Material.OrangeWool; - for (int i = 2295; i <= 2295; i++) - materials[i] = Material.MagentaWool; - for (int i = 2296; i <= 2296; i++) - materials[i] = Material.LightBlueWool; - for (int i = 2297; i <= 2297; i++) - materials[i] = Material.YellowWool; - for (int i = 2298; i <= 2298; i++) - materials[i] = Material.LimeWool; - for (int i = 2299; i <= 2299; i++) - materials[i] = Material.PinkWool; - for (int i = 2300; i <= 2300; i++) - materials[i] = Material.GrayWool; - for (int i = 2301; i <= 2301; i++) - materials[i] = Material.LightGrayWool; - for (int i = 2302; i <= 2302; i++) - materials[i] = Material.CyanWool; - for (int i = 2303; i <= 2303; i++) - materials[i] = Material.PurpleWool; - for (int i = 2304; i <= 2304; i++) - materials[i] = Material.BlueWool; - for (int i = 2305; i <= 2305; i++) - materials[i] = Material.BrownWool; - for (int i = 2306; i <= 2306; i++) - materials[i] = Material.GreenWool; - for (int i = 2307; i <= 2307; i++) - materials[i] = Material.RedWool; - for (int i = 2308; i <= 2308; i++) - materials[i] = Material.BlackWool; - for (int i = 2309; i <= 2320; i++) - materials[i] = Material.MovingPiston; - for (int i = 2321; i <= 2321; i++) - materials[i] = Material.Dandelion; - for (int i = 2322; i <= 2322; i++) - materials[i] = Material.GoldenDandelion; - for (int i = 2323; i <= 2323; i++) - materials[i] = Material.Torchflower; - for (int i = 2324; i <= 2324; i++) - materials[i] = Material.Poppy; - for (int i = 2325; i <= 2325; i++) - materials[i] = Material.BlueOrchid; - for (int i = 2326; i <= 2326; i++) - materials[i] = Material.Allium; - for (int i = 2327; i <= 2327; i++) - materials[i] = Material.AzureBluet; - for (int i = 2328; i <= 2328; i++) - materials[i] = Material.RedTulip; - for (int i = 2329; i <= 2329; i++) - materials[i] = Material.OrangeTulip; - for (int i = 2330; i <= 2330; i++) - materials[i] = Material.WhiteTulip; - for (int i = 2331; i <= 2331; i++) - materials[i] = Material.PinkTulip; - for (int i = 2332; i <= 2332; i++) - materials[i] = Material.OxeyeDaisy; - for (int i = 2333; i <= 2333; i++) - materials[i] = Material.Cornflower; - for (int i = 2334; i <= 2334; i++) - materials[i] = Material.WitherRose; - for (int i = 2335; i <= 2335; i++) - materials[i] = Material.LilyOfTheValley; - for (int i = 2336; i <= 2336; i++) - materials[i] = Material.BrownMushroom; - for (int i = 2337; i <= 2337; i++) - materials[i] = Material.RedMushroom; - for (int i = 2338; i <= 2338; i++) - materials[i] = Material.GoldBlock; - for (int i = 2339; i <= 2339; i++) - materials[i] = Material.IronBlock; - for (int i = 2340; i <= 2340; i++) - materials[i] = Material.Bricks; - for (int i = 2341; i <= 2342; i++) - materials[i] = Material.Tnt; - for (int i = 2343; i <= 2343; i++) - materials[i] = Material.Bookshelf; - for (int i = 2344; i <= 2599; i++) - materials[i] = Material.ChiseledBookshelf; - for (int i = 2600; i <= 2663; i++) - materials[i] = Material.AcaciaShelf; - for (int i = 2664; i <= 2727; i++) - materials[i] = Material.BambooShelf; - for (int i = 2728; i <= 2791; i++) - materials[i] = Material.BirchShelf; - for (int i = 2792; i <= 2855; i++) - materials[i] = Material.CherryShelf; - for (int i = 2856; i <= 2919; i++) - materials[i] = Material.CrimsonShelf; - for (int i = 2920; i <= 2983; i++) - materials[i] = Material.DarkOakShelf; - for (int i = 2984; i <= 3047; i++) - materials[i] = Material.JungleShelf; - for (int i = 3048; i <= 3111; i++) - materials[i] = Material.MangroveShelf; - for (int i = 3112; i <= 3175; i++) - materials[i] = Material.OakShelf; - for (int i = 3176; i <= 3239; i++) - materials[i] = Material.PaleOakShelf; - for (int i = 3240; i <= 3303; i++) - materials[i] = Material.SpruceShelf; - for (int i = 3304; i <= 3367; i++) - materials[i] = Material.WarpedShelf; - for (int i = 3368; i <= 3368; i++) - materials[i] = Material.MossyCobblestone; - for (int i = 3369; i <= 3369; i++) - materials[i] = Material.Obsidian; - for (int i = 3370; i <= 3370; i++) - materials[i] = Material.Torch; - for (int i = 3371; i <= 3374; i++) - materials[i] = Material.WallTorch; - for (int i = 3375; i <= 3886; i++) - materials[i] = Material.Fire; - for (int i = 3887; i <= 3887; i++) - materials[i] = Material.SoulFire; - for (int i = 3888; i <= 3888; i++) - materials[i] = Material.Spawner; - for (int i = 3889; i <= 3906; i++) - materials[i] = Material.CreakingHeart; - for (int i = 3907; i <= 3986; i++) - materials[i] = Material.OakStairs; - for (int i = 3987; i <= 4010; i++) - materials[i] = Material.Chest; - for (int i = 4011; i <= 5306; i++) - materials[i] = Material.RedstoneWire; - for (int i = 5307; i <= 5307; i++) - materials[i] = Material.DiamondOre; - for (int i = 5308; i <= 5308; i++) - materials[i] = Material.DeepslateDiamondOre; - for (int i = 5309; i <= 5309; i++) - materials[i] = Material.DiamondBlock; - for (int i = 5310; i <= 5310; i++) - materials[i] = Material.CraftingTable; - for (int i = 5311; i <= 5318; i++) - materials[i] = Material.Wheat; - for (int i = 5319; i <= 5326; i++) - materials[i] = Material.Farmland; - for (int i = 5327; i <= 5334; i++) - materials[i] = Material.Furnace; - for (int i = 5335; i <= 5366; i++) - materials[i] = Material.OakSign; - for (int i = 5367; i <= 5398; i++) - materials[i] = Material.SpruceSign; - for (int i = 5399; i <= 5430; i++) - materials[i] = Material.BirchSign; - for (int i = 5431; i <= 5462; i++) - materials[i] = Material.AcaciaSign; - for (int i = 5463; i <= 5494; i++) - materials[i] = Material.CherrySign; - for (int i = 5495; i <= 5526; i++) - materials[i] = Material.JungleSign; - for (int i = 5527; i <= 5558; i++) - materials[i] = Material.DarkOakSign; - for (int i = 5559; i <= 5590; i++) - materials[i] = Material.PaleOakSign; - for (int i = 5591; i <= 5622; i++) - materials[i] = Material.MangroveSign; - for (int i = 5623; i <= 5654; i++) - materials[i] = Material.BambooSign; - for (int i = 5655; i <= 5718; i++) - materials[i] = Material.OakDoor; - for (int i = 5719; i <= 5726; i++) - materials[i] = Material.Ladder; - for (int i = 5727; i <= 5746; i++) - materials[i] = Material.Rail; - for (int i = 5747; i <= 5826; i++) - materials[i] = Material.CobblestoneStairs; - for (int i = 5827; i <= 5834; i++) - materials[i] = Material.OakWallSign; - for (int i = 5835; i <= 5842; i++) - materials[i] = Material.SpruceWallSign; - for (int i = 5843; i <= 5850; i++) - materials[i] = Material.BirchWallSign; - for (int i = 5851; i <= 5858; i++) - materials[i] = Material.AcaciaWallSign; - for (int i = 5859; i <= 5866; i++) - materials[i] = Material.CherryWallSign; - for (int i = 5867; i <= 5874; i++) - materials[i] = Material.JungleWallSign; - for (int i = 5875; i <= 5882; i++) - materials[i] = Material.DarkOakWallSign; - for (int i = 5883; i <= 5890; i++) - materials[i] = Material.PaleOakWallSign; - for (int i = 5891; i <= 5898; i++) - materials[i] = Material.MangroveWallSign; - for (int i = 5899; i <= 5906; i++) - materials[i] = Material.BambooWallSign; - for (int i = 5907; i <= 5970; i++) - materials[i] = Material.OakHangingSign; - for (int i = 5971; i <= 6034; i++) - materials[i] = Material.SpruceHangingSign; - for (int i = 6035; i <= 6098; i++) - materials[i] = Material.BirchHangingSign; - for (int i = 6099; i <= 6162; i++) - materials[i] = Material.AcaciaHangingSign; - for (int i = 6163; i <= 6226; i++) - materials[i] = Material.CherryHangingSign; - for (int i = 6227; i <= 6290; i++) - materials[i] = Material.JungleHangingSign; - for (int i = 6291; i <= 6354; i++) - materials[i] = Material.DarkOakHangingSign; - for (int i = 6355; i <= 6418; i++) - materials[i] = Material.PaleOakHangingSign; - for (int i = 6419; i <= 6482; i++) - materials[i] = Material.CrimsonHangingSign; - for (int i = 6483; i <= 6546; i++) - materials[i] = Material.WarpedHangingSign; - for (int i = 6547; i <= 6610; i++) - materials[i] = Material.MangroveHangingSign; - for (int i = 6611; i <= 6674; i++) - materials[i] = Material.BambooHangingSign; - for (int i = 6675; i <= 6682; i++) - materials[i] = Material.OakWallHangingSign; - for (int i = 6683; i <= 6690; i++) - materials[i] = Material.SpruceWallHangingSign; - for (int i = 6691; i <= 6698; i++) - materials[i] = Material.BirchWallHangingSign; - for (int i = 6699; i <= 6706; i++) - materials[i] = Material.AcaciaWallHangingSign; - for (int i = 6707; i <= 6714; i++) - materials[i] = Material.CherryWallHangingSign; - for (int i = 6715; i <= 6722; i++) - materials[i] = Material.JungleWallHangingSign; - for (int i = 6723; i <= 6730; i++) - materials[i] = Material.DarkOakWallHangingSign; - for (int i = 6731; i <= 6738; i++) - materials[i] = Material.PaleOakWallHangingSign; - for (int i = 6739; i <= 6746; i++) - materials[i] = Material.MangroveWallHangingSign; - for (int i = 6747; i <= 6754; i++) - materials[i] = Material.CrimsonWallHangingSign; - for (int i = 6755; i <= 6762; i++) - materials[i] = Material.WarpedWallHangingSign; - for (int i = 6763; i <= 6770; i++) - materials[i] = Material.BambooWallHangingSign; - for (int i = 6771; i <= 6794; i++) - materials[i] = Material.Lever; - for (int i = 6795; i <= 6796; i++) - materials[i] = Material.StonePressurePlate; - for (int i = 6797; i <= 6860; i++) - materials[i] = Material.IronDoor; - for (int i = 6861; i <= 6862; i++) - materials[i] = Material.OakPressurePlate; - for (int i = 6863; i <= 6864; i++) - materials[i] = Material.SprucePressurePlate; - for (int i = 6865; i <= 6866; i++) - materials[i] = Material.BirchPressurePlate; - for (int i = 6867; i <= 6868; i++) - materials[i] = Material.JunglePressurePlate; - for (int i = 6869; i <= 6870; i++) - materials[i] = Material.AcaciaPressurePlate; - for (int i = 6871; i <= 6872; i++) - materials[i] = Material.CherryPressurePlate; - for (int i = 6873; i <= 6874; i++) - materials[i] = Material.DarkOakPressurePlate; - for (int i = 6875; i <= 6876; i++) - materials[i] = Material.PaleOakPressurePlate; - for (int i = 6877; i <= 6878; i++) - materials[i] = Material.MangrovePressurePlate; - for (int i = 6879; i <= 6880; i++) - materials[i] = Material.BambooPressurePlate; - for (int i = 6881; i <= 6882; i++) - materials[i] = Material.RedstoneOre; - for (int i = 6883; i <= 6884; i++) - materials[i] = Material.DeepslateRedstoneOre; - for (int i = 6885; i <= 6886; i++) - materials[i] = Material.RedstoneTorch; - for (int i = 6887; i <= 6894; i++) - materials[i] = Material.RedstoneWallTorch; - for (int i = 6895; i <= 6918; i++) - materials[i] = Material.StoneButton; - for (int i = 6919; i <= 6926; i++) - materials[i] = Material.Snow; - for (int i = 6927; i <= 6927; i++) - materials[i] = Material.Ice; - for (int i = 6928; i <= 6928; i++) - materials[i] = Material.SnowBlock; - for (int i = 6929; i <= 6944; i++) - materials[i] = Material.Cactus; - for (int i = 6945; i <= 6945; i++) - materials[i] = Material.CactusFlower; - for (int i = 6946; i <= 6946; i++) - materials[i] = Material.Clay; - for (int i = 6947; i <= 6962; i++) - materials[i] = Material.SugarCane; - for (int i = 6963; i <= 6964; i++) - materials[i] = Material.Jukebox; - for (int i = 6965; i <= 6996; i++) - materials[i] = Material.OakFence; - for (int i = 6997; i <= 6997; i++) - materials[i] = Material.Netherrack; - for (int i = 6998; i <= 6998; i++) - materials[i] = Material.SoulSand; - for (int i = 6999; i <= 6999; i++) - materials[i] = Material.SoulSoil; - for (int i = 7000; i <= 7002; i++) - materials[i] = Material.Basalt; - for (int i = 7003; i <= 7005; i++) - materials[i] = Material.PolishedBasalt; - for (int i = 7006; i <= 7006; i++) - materials[i] = Material.SoulTorch; - for (int i = 7007; i <= 7010; i++) - materials[i] = Material.SoulWallTorch; - for (int i = 7011; i <= 7011; i++) - materials[i] = Material.CopperTorch; - for (int i = 7012; i <= 7015; i++) - materials[i] = Material.CopperWallTorch; - for (int i = 7016; i <= 7016; i++) - materials[i] = Material.Glowstone; - for (int i = 7017; i <= 7018; i++) - materials[i] = Material.NetherPortal; - for (int i = 7019; i <= 7022; i++) - materials[i] = Material.CarvedPumpkin; - for (int i = 7023; i <= 7026; i++) - materials[i] = Material.JackOLantern; - for (int i = 7027; i <= 7033; i++) - materials[i] = Material.Cake; - for (int i = 7034; i <= 7097; i++) - materials[i] = Material.Repeater; - for (int i = 7098; i <= 7098; i++) - materials[i] = Material.WhiteStainedGlass; - for (int i = 7099; i <= 7099; i++) - materials[i] = Material.OrangeStainedGlass; - for (int i = 7100; i <= 7100; i++) - materials[i] = Material.MagentaStainedGlass; - for (int i = 7101; i <= 7101; i++) - materials[i] = Material.LightBlueStainedGlass; - for (int i = 7102; i <= 7102; i++) - materials[i] = Material.YellowStainedGlass; - for (int i = 7103; i <= 7103; i++) - materials[i] = Material.LimeStainedGlass; - for (int i = 7104; i <= 7104; i++) - materials[i] = Material.PinkStainedGlass; - for (int i = 7105; i <= 7105; i++) - materials[i] = Material.GrayStainedGlass; - for (int i = 7106; i <= 7106; i++) - materials[i] = Material.LightGrayStainedGlass; - for (int i = 7107; i <= 7107; i++) - materials[i] = Material.CyanStainedGlass; - for (int i = 7108; i <= 7108; i++) - materials[i] = Material.PurpleStainedGlass; - for (int i = 7109; i <= 7109; i++) - materials[i] = Material.BlueStainedGlass; - for (int i = 7110; i <= 7110; i++) - materials[i] = Material.BrownStainedGlass; - for (int i = 7111; i <= 7111; i++) - materials[i] = Material.GreenStainedGlass; - for (int i = 7112; i <= 7112; i++) - materials[i] = Material.RedStainedGlass; - for (int i = 7113; i <= 7113; i++) - materials[i] = Material.BlackStainedGlass; - for (int i = 7114; i <= 7177; i++) - materials[i] = Material.OakTrapdoor; - for (int i = 7178; i <= 7241; i++) - materials[i] = Material.SpruceTrapdoor; - for (int i = 7242; i <= 7305; i++) - materials[i] = Material.BirchTrapdoor; - for (int i = 7306; i <= 7369; i++) - materials[i] = Material.JungleTrapdoor; - for (int i = 7370; i <= 7433; i++) - materials[i] = Material.AcaciaTrapdoor; - for (int i = 7434; i <= 7497; i++) - materials[i] = Material.CherryTrapdoor; - for (int i = 7498; i <= 7561; i++) - materials[i] = Material.DarkOakTrapdoor; - for (int i = 7562; i <= 7625; i++) - materials[i] = Material.PaleOakTrapdoor; - for (int i = 7626; i <= 7689; i++) - materials[i] = Material.MangroveTrapdoor; - for (int i = 7690; i <= 7753; i++) - materials[i] = Material.BambooTrapdoor; - for (int i = 7754; i <= 7754; i++) - materials[i] = Material.StoneBricks; - for (int i = 7755; i <= 7755; i++) - materials[i] = Material.MossyStoneBricks; - for (int i = 7756; i <= 7756; i++) - materials[i] = Material.CrackedStoneBricks; - for (int i = 7757; i <= 7757; i++) - materials[i] = Material.ChiseledStoneBricks; - for (int i = 7758; i <= 7758; i++) - materials[i] = Material.PackedMud; - for (int i = 7759; i <= 7759; i++) - materials[i] = Material.MudBricks; - for (int i = 7760; i <= 7760; i++) - materials[i] = Material.InfestedStone; - for (int i = 7761; i <= 7761; i++) - materials[i] = Material.InfestedCobblestone; - for (int i = 7762; i <= 7762; i++) - materials[i] = Material.InfestedStoneBricks; - for (int i = 7763; i <= 7763; i++) - materials[i] = Material.InfestedMossyStoneBricks; - for (int i = 7764; i <= 7764; i++) - materials[i] = Material.InfestedCrackedStoneBricks; - for (int i = 7765; i <= 7765; i++) - materials[i] = Material.InfestedChiseledStoneBricks; - for (int i = 7766; i <= 7829; i++) - materials[i] = Material.BrownMushroomBlock; - for (int i = 7830; i <= 7893; i++) - materials[i] = Material.RedMushroomBlock; - for (int i = 7894; i <= 7957; i++) - materials[i] = Material.MushroomStem; - for (int i = 7958; i <= 7989; i++) - materials[i] = Material.IronBars; - for (int i = 7990; i <= 8021; i++) - materials[i] = Material.CopperBars; - for (int i = 8022; i <= 8053; i++) - materials[i] = Material.ExposedCopperBars; - for (int i = 8054; i <= 8085; i++) - materials[i] = Material.WeatheredCopperBars; - for (int i = 8086; i <= 8117; i++) - materials[i] = Material.OxidizedCopperBars; - for (int i = 8118; i <= 8149; i++) - materials[i] = Material.WaxedCopperBars; - for (int i = 8150; i <= 8181; i++) - materials[i] = Material.WaxedExposedCopperBars; - for (int i = 8182; i <= 8213; i++) - materials[i] = Material.WaxedWeatheredCopperBars; - for (int i = 8214; i <= 8245; i++) - materials[i] = Material.WaxedOxidizedCopperBars; - for (int i = 8246; i <= 8251; i++) - materials[i] = Material.IronChain; - for (int i = 8252; i <= 8257; i++) - materials[i] = Material.CopperChain; - for (int i = 8258; i <= 8263; i++) - materials[i] = Material.ExposedCopperChain; - for (int i = 8264; i <= 8269; i++) - materials[i] = Material.WeatheredCopperChain; - for (int i = 8270; i <= 8275; i++) - materials[i] = Material.OxidizedCopperChain; - for (int i = 8276; i <= 8281; i++) - materials[i] = Material.WaxedCopperChain; - for (int i = 8282; i <= 8287; i++) - materials[i] = Material.WaxedExposedCopperChain; - for (int i = 8288; i <= 8293; i++) - materials[i] = Material.WaxedWeatheredCopperChain; - for (int i = 8294; i <= 8299; i++) - materials[i] = Material.WaxedOxidizedCopperChain; - for (int i = 8300; i <= 8331; i++) - materials[i] = Material.GlassPane; - for (int i = 8332; i <= 8332; i++) - materials[i] = Material.Pumpkin; - for (int i = 8333; i <= 8333; i++) - materials[i] = Material.Melon; - for (int i = 8334; i <= 8337; i++) - materials[i] = Material.AttachedPumpkinStem; - for (int i = 8338; i <= 8341; i++) - materials[i] = Material.AttachedMelonStem; - for (int i = 8342; i <= 8349; i++) - materials[i] = Material.PumpkinStem; - for (int i = 8350; i <= 8357; i++) - materials[i] = Material.MelonStem; - for (int i = 8358; i <= 8389; i++) - materials[i] = Material.Vine; - for (int i = 8390; i <= 8517; i++) - materials[i] = Material.GlowLichen; - for (int i = 8518; i <= 8645; i++) - materials[i] = Material.ResinClump; - for (int i = 8646; i <= 8677; i++) - materials[i] = Material.OakFenceGate; - for (int i = 8678; i <= 8757; i++) - materials[i] = Material.BrickStairs; - for (int i = 8758; i <= 8837; i++) - materials[i] = Material.StoneBrickStairs; - for (int i = 8838; i <= 8917; i++) - materials[i] = Material.MudBrickStairs; - for (int i = 8918; i <= 8919; i++) - materials[i] = Material.Mycelium; - for (int i = 8920; i <= 8920; i++) - materials[i] = Material.LilyPad; - for (int i = 8921; i <= 8921; i++) - materials[i] = Material.ResinBlock; - for (int i = 8922; i <= 8922; i++) - materials[i] = Material.ResinBricks; - for (int i = 8923; i <= 9002; i++) - materials[i] = Material.ResinBrickStairs; - for (int i = 9003; i <= 9008; i++) - materials[i] = Material.ResinBrickSlab; - for (int i = 9009; i <= 9332; i++) - materials[i] = Material.ResinBrickWall; - for (int i = 9333; i <= 9333; i++) - materials[i] = Material.ChiseledResinBricks; - for (int i = 9334; i <= 9334; i++) - materials[i] = Material.NetherBricks; - for (int i = 9335; i <= 9366; i++) - materials[i] = Material.NetherBrickFence; - for (int i = 9367; i <= 9446; i++) - materials[i] = Material.NetherBrickStairs; - for (int i = 9447; i <= 9450; i++) - materials[i] = Material.NetherWart; - for (int i = 9451; i <= 9451; i++) - materials[i] = Material.EnchantingTable; - for (int i = 9452; i <= 9459; i++) - materials[i] = Material.BrewingStand; - for (int i = 9460; i <= 9460; i++) - materials[i] = Material.Cauldron; - for (int i = 9461; i <= 9463; i++) - materials[i] = Material.WaterCauldron; - for (int i = 9464; i <= 9464; i++) - materials[i] = Material.LavaCauldron; - for (int i = 9465; i <= 9467; i++) - materials[i] = Material.PowderSnowCauldron; - for (int i = 9468; i <= 9468; i++) - materials[i] = Material.EndPortal; - for (int i = 9469; i <= 9476; i++) - materials[i] = Material.EndPortalFrame; - for (int i = 9477; i <= 9477; i++) - materials[i] = Material.EndStone; - for (int i = 9478; i <= 9478; i++) - materials[i] = Material.DragonEgg; - for (int i = 9479; i <= 9480; i++) - materials[i] = Material.RedstoneLamp; - for (int i = 9481; i <= 9492; i++) - materials[i] = Material.Cocoa; - for (int i = 9493; i <= 9572; i++) - materials[i] = Material.SandstoneStairs; - for (int i = 9573; i <= 9573; i++) - materials[i] = Material.EmeraldOre; - for (int i = 9574; i <= 9574; i++) - materials[i] = Material.DeepslateEmeraldOre; - for (int i = 9575; i <= 9582; i++) - materials[i] = Material.EnderChest; - for (int i = 9583; i <= 9598; i++) - materials[i] = Material.TripwireHook; - for (int i = 9599; i <= 9726; i++) - materials[i] = Material.Tripwire; - for (int i = 9727; i <= 9727; i++) - materials[i] = Material.EmeraldBlock; - for (int i = 9728; i <= 9807; i++) - materials[i] = Material.SpruceStairs; - for (int i = 9808; i <= 9887; i++) - materials[i] = Material.BirchStairs; - for (int i = 9888; i <= 9967; i++) - materials[i] = Material.JungleStairs; - for (int i = 9968; i <= 9979; i++) - materials[i] = Material.CommandBlock; - for (int i = 9980; i <= 9980; i++) - materials[i] = Material.Beacon; - for (int i = 9981; i <= 10304; i++) - materials[i] = Material.CobblestoneWall; - for (int i = 10305; i <= 10628; i++) - materials[i] = Material.MossyCobblestoneWall; - for (int i = 10629; i <= 10629; i++) - materials[i] = Material.FlowerPot; - for (int i = 10630; i <= 10630; i++) - materials[i] = Material.PottedTorchflower; - for (int i = 10631; i <= 10631; i++) - materials[i] = Material.PottedOakSapling; - for (int i = 10632; i <= 10632; i++) - materials[i] = Material.PottedSpruceSapling; - for (int i = 10633; i <= 10633; i++) - materials[i] = Material.PottedBirchSapling; - for (int i = 10634; i <= 10634; i++) - materials[i] = Material.PottedJungleSapling; - for (int i = 10635; i <= 10635; i++) - materials[i] = Material.PottedAcaciaSapling; - for (int i = 10636; i <= 10636; i++) - materials[i] = Material.PottedCherrySapling; - for (int i = 10637; i <= 10637; i++) - materials[i] = Material.PottedDarkOakSapling; - for (int i = 10638; i <= 10638; i++) - materials[i] = Material.PottedPaleOakSapling; - for (int i = 10639; i <= 10639; i++) - materials[i] = Material.PottedMangrovePropagule; - for (int i = 10640; i <= 10640; i++) - materials[i] = Material.PottedFern; - for (int i = 10641; i <= 10641; i++) - materials[i] = Material.PottedDandelion; - for (int i = 10642; i <= 10642; i++) - materials[i] = Material.PottedGoldenDandelion; - for (int i = 10643; i <= 10643; i++) - materials[i] = Material.PottedPoppy; - for (int i = 10644; i <= 10644; i++) - materials[i] = Material.PottedBlueOrchid; - for (int i = 10645; i <= 10645; i++) - materials[i] = Material.PottedAllium; - for (int i = 10646; i <= 10646; i++) - materials[i] = Material.PottedAzureBluet; - for (int i = 10647; i <= 10647; i++) - materials[i] = Material.PottedRedTulip; - for (int i = 10648; i <= 10648; i++) - materials[i] = Material.PottedOrangeTulip; - for (int i = 10649; i <= 10649; i++) - materials[i] = Material.PottedWhiteTulip; - for (int i = 10650; i <= 10650; i++) - materials[i] = Material.PottedPinkTulip; - for (int i = 10651; i <= 10651; i++) - materials[i] = Material.PottedOxeyeDaisy; - for (int i = 10652; i <= 10652; i++) - materials[i] = Material.PottedCornflower; - for (int i = 10653; i <= 10653; i++) - materials[i] = Material.PottedLilyOfTheValley; - for (int i = 10654; i <= 10654; i++) - materials[i] = Material.PottedWitherRose; - for (int i = 10655; i <= 10655; i++) - materials[i] = Material.PottedRedMushroom; - for (int i = 10656; i <= 10656; i++) - materials[i] = Material.PottedBrownMushroom; - for (int i = 10657; i <= 10657; i++) - materials[i] = Material.PottedDeadBush; - for (int i = 10658; i <= 10658; i++) - materials[i] = Material.PottedCactus; - for (int i = 10659; i <= 10666; i++) - materials[i] = Material.Carrots; - for (int i = 10667; i <= 10674; i++) - materials[i] = Material.Potatoes; - for (int i = 10675; i <= 10698; i++) - materials[i] = Material.OakButton; - for (int i = 10699; i <= 10722; i++) - materials[i] = Material.SpruceButton; - for (int i = 10723; i <= 10746; i++) - materials[i] = Material.BirchButton; - for (int i = 10747; i <= 10770; i++) - materials[i] = Material.JungleButton; - for (int i = 10771; i <= 10794; i++) - materials[i] = Material.AcaciaButton; - for (int i = 10795; i <= 10818; i++) - materials[i] = Material.CherryButton; - for (int i = 10819; i <= 10842; i++) - materials[i] = Material.DarkOakButton; - for (int i = 10843; i <= 10866; i++) - materials[i] = Material.PaleOakButton; - for (int i = 10867; i <= 10890; i++) - materials[i] = Material.MangroveButton; - for (int i = 10891; i <= 10914; i++) - materials[i] = Material.BambooButton; - for (int i = 10915; i <= 10946; i++) - materials[i] = Material.SkeletonSkull; - for (int i = 10947; i <= 10954; i++) - materials[i] = Material.SkeletonWallSkull; - for (int i = 10955; i <= 10986; i++) - materials[i] = Material.WitherSkeletonSkull; - for (int i = 10987; i <= 10994; i++) - materials[i] = Material.WitherSkeletonWallSkull; - for (int i = 10995; i <= 11026; i++) - materials[i] = Material.ZombieHead; - for (int i = 11027; i <= 11034; i++) - materials[i] = Material.ZombieWallHead; - for (int i = 11035; i <= 11066; i++) - materials[i] = Material.PlayerHead; - for (int i = 11067; i <= 11074; i++) - materials[i] = Material.PlayerWallHead; - for (int i = 11075; i <= 11106; i++) - materials[i] = Material.CreeperHead; - for (int i = 11107; i <= 11114; i++) - materials[i] = Material.CreeperWallHead; - for (int i = 11115; i <= 11146; i++) - materials[i] = Material.DragonHead; - for (int i = 11147; i <= 11154; i++) - materials[i] = Material.DragonWallHead; - for (int i = 11155; i <= 11186; i++) - materials[i] = Material.PiglinHead; - for (int i = 11187; i <= 11194; i++) - materials[i] = Material.PiglinWallHead; - for (int i = 11195; i <= 11198; i++) - materials[i] = Material.Anvil; - for (int i = 11199; i <= 11202; i++) - materials[i] = Material.ChippedAnvil; - for (int i = 11203; i <= 11206; i++) - materials[i] = Material.DamagedAnvil; - for (int i = 11207; i <= 11230; i++) - materials[i] = Material.TrappedChest; - for (int i = 11231; i <= 11246; i++) - materials[i] = Material.LightWeightedPressurePlate; - for (int i = 11247; i <= 11262; i++) - materials[i] = Material.HeavyWeightedPressurePlate; - for (int i = 11263; i <= 11278; i++) - materials[i] = Material.Comparator; - for (int i = 11279; i <= 11310; i++) - materials[i] = Material.DaylightDetector; - for (int i = 11311; i <= 11311; i++) - materials[i] = Material.RedstoneBlock; - for (int i = 11312; i <= 11312; i++) - materials[i] = Material.NetherQuartzOre; - for (int i = 11313; i <= 11322; i++) - materials[i] = Material.Hopper; - for (int i = 11323; i <= 11323; i++) - materials[i] = Material.QuartzBlock; - for (int i = 11324; i <= 11324; i++) - materials[i] = Material.ChiseledQuartzBlock; - for (int i = 11325; i <= 11327; i++) - materials[i] = Material.QuartzPillar; - for (int i = 11328; i <= 11407; i++) - materials[i] = Material.QuartzStairs; - for (int i = 11408; i <= 11431; i++) - materials[i] = Material.ActivatorRail; - for (int i = 11432; i <= 11443; i++) - materials[i] = Material.Dropper; - for (int i = 11444; i <= 11444; i++) - materials[i] = Material.WhiteTerracotta; - for (int i = 11445; i <= 11445; i++) - materials[i] = Material.OrangeTerracotta; - for (int i = 11446; i <= 11446; i++) - materials[i] = Material.MagentaTerracotta; - for (int i = 11447; i <= 11447; i++) - materials[i] = Material.LightBlueTerracotta; - for (int i = 11448; i <= 11448; i++) - materials[i] = Material.YellowTerracotta; - for (int i = 11449; i <= 11449; i++) - materials[i] = Material.LimeTerracotta; - for (int i = 11450; i <= 11450; i++) - materials[i] = Material.PinkTerracotta; - for (int i = 11451; i <= 11451; i++) - materials[i] = Material.GrayTerracotta; - for (int i = 11452; i <= 11452; i++) - materials[i] = Material.LightGrayTerracotta; - for (int i = 11453; i <= 11453; i++) - materials[i] = Material.CyanTerracotta; - for (int i = 11454; i <= 11454; i++) - materials[i] = Material.PurpleTerracotta; - for (int i = 11455; i <= 11455; i++) - materials[i] = Material.BlueTerracotta; - for (int i = 11456; i <= 11456; i++) - materials[i] = Material.BrownTerracotta; - for (int i = 11457; i <= 11457; i++) - materials[i] = Material.GreenTerracotta; - for (int i = 11458; i <= 11458; i++) - materials[i] = Material.RedTerracotta; - for (int i = 11459; i <= 11459; i++) - materials[i] = Material.BlackTerracotta; - for (int i = 11460; i <= 11491; i++) - materials[i] = Material.WhiteStainedGlassPane; - for (int i = 11492; i <= 11523; i++) - materials[i] = Material.OrangeStainedGlassPane; - for (int i = 11524; i <= 11555; i++) - materials[i] = Material.MagentaStainedGlassPane; - for (int i = 11556; i <= 11587; i++) - materials[i] = Material.LightBlueStainedGlassPane; - for (int i = 11588; i <= 11619; i++) - materials[i] = Material.YellowStainedGlassPane; - for (int i = 11620; i <= 11651; i++) - materials[i] = Material.LimeStainedGlassPane; - for (int i = 11652; i <= 11683; i++) - materials[i] = Material.PinkStainedGlassPane; - for (int i = 11684; i <= 11715; i++) - materials[i] = Material.GrayStainedGlassPane; - for (int i = 11716; i <= 11747; i++) - materials[i] = Material.LightGrayStainedGlassPane; - for (int i = 11748; i <= 11779; i++) - materials[i] = Material.CyanStainedGlassPane; - for (int i = 11780; i <= 11811; i++) - materials[i] = Material.PurpleStainedGlassPane; - for (int i = 11812; i <= 11843; i++) - materials[i] = Material.BlueStainedGlassPane; - for (int i = 11844; i <= 11875; i++) - materials[i] = Material.BrownStainedGlassPane; - for (int i = 11876; i <= 11907; i++) - materials[i] = Material.GreenStainedGlassPane; - for (int i = 11908; i <= 11939; i++) - materials[i] = Material.RedStainedGlassPane; - for (int i = 11940; i <= 11971; i++) - materials[i] = Material.BlackStainedGlassPane; - for (int i = 11972; i <= 12051; i++) - materials[i] = Material.AcaciaStairs; - for (int i = 12052; i <= 12131; i++) - materials[i] = Material.CherryStairs; - for (int i = 12132; i <= 12211; i++) - materials[i] = Material.DarkOakStairs; - for (int i = 12212; i <= 12291; i++) - materials[i] = Material.PaleOakStairs; - for (int i = 12292; i <= 12371; i++) - materials[i] = Material.MangroveStairs; - for (int i = 12372; i <= 12451; i++) - materials[i] = Material.BambooStairs; - for (int i = 12452; i <= 12531; i++) - materials[i] = Material.BambooMosaicStairs; - for (int i = 12532; i <= 12532; i++) - materials[i] = Material.SlimeBlock; - for (int i = 12533; i <= 12534; i++) - materials[i] = Material.Barrier; - for (int i = 12535; i <= 12566; i++) - materials[i] = Material.Light; - for (int i = 12567; i <= 12630; i++) - materials[i] = Material.IronTrapdoor; - for (int i = 12631; i <= 12631; i++) - materials[i] = Material.Prismarine; - for (int i = 12632; i <= 12632; i++) - materials[i] = Material.PrismarineBricks; - for (int i = 12633; i <= 12633; i++) - materials[i] = Material.DarkPrismarine; - for (int i = 12634; i <= 12713; i++) - materials[i] = Material.PrismarineStairs; - for (int i = 12714; i <= 12793; i++) - materials[i] = Material.PrismarineBrickStairs; - for (int i = 12794; i <= 12873; i++) - materials[i] = Material.DarkPrismarineStairs; - for (int i = 12874; i <= 12879; i++) - materials[i] = Material.PrismarineSlab; - for (int i = 12880; i <= 12885; i++) - materials[i] = Material.PrismarineBrickSlab; - for (int i = 12886; i <= 12891; i++) - materials[i] = Material.DarkPrismarineSlab; - for (int i = 12892; i <= 12892; i++) - materials[i] = Material.SeaLantern; - for (int i = 12893; i <= 12895; i++) - materials[i] = Material.HayBlock; - for (int i = 12896; i <= 12896; i++) - materials[i] = Material.WhiteCarpet; - for (int i = 12897; i <= 12897; i++) - materials[i] = Material.OrangeCarpet; - for (int i = 12898; i <= 12898; i++) - materials[i] = Material.MagentaCarpet; - for (int i = 12899; i <= 12899; i++) - materials[i] = Material.LightBlueCarpet; - for (int i = 12900; i <= 12900; i++) - materials[i] = Material.YellowCarpet; - for (int i = 12901; i <= 12901; i++) - materials[i] = Material.LimeCarpet; - for (int i = 12902; i <= 12902; i++) - materials[i] = Material.PinkCarpet; - for (int i = 12903; i <= 12903; i++) - materials[i] = Material.GrayCarpet; - for (int i = 12904; i <= 12904; i++) - materials[i] = Material.LightGrayCarpet; - for (int i = 12905; i <= 12905; i++) - materials[i] = Material.CyanCarpet; - for (int i = 12906; i <= 12906; i++) - materials[i] = Material.PurpleCarpet; - for (int i = 12907; i <= 12907; i++) - materials[i] = Material.BlueCarpet; - for (int i = 12908; i <= 12908; i++) - materials[i] = Material.BrownCarpet; - for (int i = 12909; i <= 12909; i++) - materials[i] = Material.GreenCarpet; - for (int i = 12910; i <= 12910; i++) - materials[i] = Material.RedCarpet; - for (int i = 12911; i <= 12911; i++) - materials[i] = Material.BlackCarpet; - for (int i = 12912; i <= 12912; i++) - materials[i] = Material.Terracotta; - for (int i = 12913; i <= 12913; i++) - materials[i] = Material.CoalBlock; - for (int i = 12914; i <= 12914; i++) - materials[i] = Material.PackedIce; - for (int i = 12915; i <= 12916; i++) - materials[i] = Material.Sunflower; - for (int i = 12917; i <= 12918; i++) - materials[i] = Material.Lilac; - for (int i = 12919; i <= 12920; i++) - materials[i] = Material.RoseBush; - for (int i = 12921; i <= 12922; i++) - materials[i] = Material.Peony; - for (int i = 12923; i <= 12924; i++) - materials[i] = Material.TallGrass; - for (int i = 12925; i <= 12926; i++) - materials[i] = Material.LargeFern; - for (int i = 12927; i <= 12942; i++) - materials[i] = Material.WhiteBanner; - for (int i = 12943; i <= 12958; i++) - materials[i] = Material.OrangeBanner; - for (int i = 12959; i <= 12974; i++) - materials[i] = Material.MagentaBanner; - for (int i = 12975; i <= 12990; i++) - materials[i] = Material.LightBlueBanner; - for (int i = 12991; i <= 13006; i++) - materials[i] = Material.YellowBanner; - for (int i = 13007; i <= 13022; i++) - materials[i] = Material.LimeBanner; - for (int i = 13023; i <= 13038; i++) - materials[i] = Material.PinkBanner; - for (int i = 13039; i <= 13054; i++) - materials[i] = Material.GrayBanner; - for (int i = 13055; i <= 13070; i++) - materials[i] = Material.LightGrayBanner; - for (int i = 13071; i <= 13086; i++) - materials[i] = Material.CyanBanner; - for (int i = 13087; i <= 13102; i++) - materials[i] = Material.PurpleBanner; - for (int i = 13103; i <= 13118; i++) - materials[i] = Material.BlueBanner; - for (int i = 13119; i <= 13134; i++) - materials[i] = Material.BrownBanner; - for (int i = 13135; i <= 13150; i++) - materials[i] = Material.GreenBanner; - for (int i = 13151; i <= 13166; i++) - materials[i] = Material.RedBanner; - for (int i = 13167; i <= 13182; i++) - materials[i] = Material.BlackBanner; - for (int i = 13183; i <= 13186; i++) - materials[i] = Material.WhiteWallBanner; - for (int i = 13187; i <= 13190; i++) - materials[i] = Material.OrangeWallBanner; - for (int i = 13191; i <= 13194; i++) - materials[i] = Material.MagentaWallBanner; - for (int i = 13195; i <= 13198; i++) - materials[i] = Material.LightBlueWallBanner; - for (int i = 13199; i <= 13202; i++) - materials[i] = Material.YellowWallBanner; - for (int i = 13203; i <= 13206; i++) - materials[i] = Material.LimeWallBanner; - for (int i = 13207; i <= 13210; i++) - materials[i] = Material.PinkWallBanner; - for (int i = 13211; i <= 13214; i++) - materials[i] = Material.GrayWallBanner; - for (int i = 13215; i <= 13218; i++) - materials[i] = Material.LightGrayWallBanner; - for (int i = 13219; i <= 13222; i++) - materials[i] = Material.CyanWallBanner; - for (int i = 13223; i <= 13226; i++) - materials[i] = Material.PurpleWallBanner; - for (int i = 13227; i <= 13230; i++) - materials[i] = Material.BlueWallBanner; - for (int i = 13231; i <= 13234; i++) - materials[i] = Material.BrownWallBanner; - for (int i = 13235; i <= 13238; i++) - materials[i] = Material.GreenWallBanner; - for (int i = 13239; i <= 13242; i++) - materials[i] = Material.RedWallBanner; - for (int i = 13243; i <= 13246; i++) - materials[i] = Material.BlackWallBanner; - for (int i = 13247; i <= 13247; i++) - materials[i] = Material.RedSandstone; - for (int i = 13248; i <= 13248; i++) - materials[i] = Material.ChiseledRedSandstone; - for (int i = 13249; i <= 13249; i++) - materials[i] = Material.CutRedSandstone; - for (int i = 13250; i <= 13329; i++) - materials[i] = Material.RedSandstoneStairs; - for (int i = 13330; i <= 13335; i++) - materials[i] = Material.OakSlab; - for (int i = 13336; i <= 13341; i++) - materials[i] = Material.SpruceSlab; - for (int i = 13342; i <= 13347; i++) - materials[i] = Material.BirchSlab; - for (int i = 13348; i <= 13353; i++) - materials[i] = Material.JungleSlab; - for (int i = 13354; i <= 13359; i++) - materials[i] = Material.AcaciaSlab; - for (int i = 13360; i <= 13365; i++) - materials[i] = Material.CherrySlab; - for (int i = 13366; i <= 13371; i++) - materials[i] = Material.DarkOakSlab; - for (int i = 13372; i <= 13377; i++) - materials[i] = Material.PaleOakSlab; - for (int i = 13378; i <= 13383; i++) - materials[i] = Material.MangroveSlab; - for (int i = 13384; i <= 13389; i++) - materials[i] = Material.BambooSlab; - for (int i = 13390; i <= 13395; i++) - materials[i] = Material.BambooMosaicSlab; - for (int i = 13396; i <= 13401; i++) - materials[i] = Material.StoneSlab; - for (int i = 13402; i <= 13407; i++) - materials[i] = Material.SmoothStoneSlab; - for (int i = 13408; i <= 13413; i++) - materials[i] = Material.SandstoneSlab; - for (int i = 13414; i <= 13419; i++) - materials[i] = Material.CutSandstoneSlab; - for (int i = 13420; i <= 13425; i++) - materials[i] = Material.PetrifiedOakSlab; - for (int i = 13426; i <= 13431; i++) - materials[i] = Material.CobblestoneSlab; - for (int i = 13432; i <= 13437; i++) - materials[i] = Material.BrickSlab; - for (int i = 13438; i <= 13443; i++) - materials[i] = Material.StoneBrickSlab; - for (int i = 13444; i <= 13449; i++) - materials[i] = Material.MudBrickSlab; - for (int i = 13450; i <= 13455; i++) - materials[i] = Material.NetherBrickSlab; - for (int i = 13456; i <= 13461; i++) - materials[i] = Material.QuartzSlab; - for (int i = 13462; i <= 13467; i++) - materials[i] = Material.RedSandstoneSlab; - for (int i = 13468; i <= 13473; i++) - materials[i] = Material.CutRedSandstoneSlab; - for (int i = 13474; i <= 13479; i++) - materials[i] = Material.PurpurSlab; - for (int i = 13480; i <= 13480; i++) - materials[i] = Material.SmoothStone; - for (int i = 13481; i <= 13481; i++) - materials[i] = Material.SmoothSandstone; - for (int i = 13482; i <= 13482; i++) - materials[i] = Material.SmoothQuartz; - for (int i = 13483; i <= 13483; i++) - materials[i] = Material.SmoothRedSandstone; - for (int i = 13484; i <= 13515; i++) - materials[i] = Material.SpruceFenceGate; - for (int i = 13516; i <= 13547; i++) - materials[i] = Material.BirchFenceGate; - for (int i = 13548; i <= 13579; i++) - materials[i] = Material.JungleFenceGate; - for (int i = 13580; i <= 13611; i++) - materials[i] = Material.AcaciaFenceGate; - for (int i = 13612; i <= 13643; i++) - materials[i] = Material.CherryFenceGate; - for (int i = 13644; i <= 13675; i++) - materials[i] = Material.DarkOakFenceGate; - for (int i = 13676; i <= 13707; i++) - materials[i] = Material.PaleOakFenceGate; - for (int i = 13708; i <= 13739; i++) - materials[i] = Material.MangroveFenceGate; - for (int i = 13740; i <= 13771; i++) - materials[i] = Material.BambooFenceGate; - for (int i = 13772; i <= 13803; i++) - materials[i] = Material.SpruceFence; - for (int i = 13804; i <= 13835; i++) - materials[i] = Material.BirchFence; - for (int i = 13836; i <= 13867; i++) - materials[i] = Material.JungleFence; - for (int i = 13868; i <= 13899; i++) - materials[i] = Material.AcaciaFence; - for (int i = 13900; i <= 13931; i++) - materials[i] = Material.CherryFence; - for (int i = 13932; i <= 13963; i++) - materials[i] = Material.DarkOakFence; - for (int i = 13964; i <= 13995; i++) - materials[i] = Material.PaleOakFence; - for (int i = 13996; i <= 14027; i++) - materials[i] = Material.MangroveFence; - for (int i = 14028; i <= 14059; i++) - materials[i] = Material.BambooFence; - for (int i = 14060; i <= 14123; i++) - materials[i] = Material.SpruceDoor; - for (int i = 14124; i <= 14187; i++) - materials[i] = Material.BirchDoor; - for (int i = 14188; i <= 14251; i++) - materials[i] = Material.JungleDoor; - for (int i = 14252; i <= 14315; i++) - materials[i] = Material.AcaciaDoor; - for (int i = 14316; i <= 14379; i++) - materials[i] = Material.CherryDoor; - for (int i = 14380; i <= 14443; i++) - materials[i] = Material.DarkOakDoor; - for (int i = 14444; i <= 14507; i++) - materials[i] = Material.PaleOakDoor; - for (int i = 14508; i <= 14571; i++) - materials[i] = Material.MangroveDoor; - for (int i = 14572; i <= 14635; i++) - materials[i] = Material.BambooDoor; - for (int i = 14636; i <= 14641; i++) - materials[i] = Material.EndRod; - for (int i = 14642; i <= 14705; i++) - materials[i] = Material.ChorusPlant; - for (int i = 14706; i <= 14711; i++) - materials[i] = Material.ChorusFlower; - for (int i = 14712; i <= 14712; i++) - materials[i] = Material.PurpurBlock; - for (int i = 14713; i <= 14715; i++) - materials[i] = Material.PurpurPillar; - for (int i = 14716; i <= 14795; i++) - materials[i] = Material.PurpurStairs; - for (int i = 14796; i <= 14796; i++) - materials[i] = Material.EndStoneBricks; - for (int i = 14797; i <= 14798; i++) - materials[i] = Material.TorchflowerCrop; - for (int i = 14799; i <= 14808; i++) - materials[i] = Material.PitcherCrop; - for (int i = 14809; i <= 14810; i++) - materials[i] = Material.PitcherPlant; - for (int i = 14811; i <= 14814; i++) - materials[i] = Material.Beetroots; - for (int i = 14815; i <= 14815; i++) - materials[i] = Material.DirtPath; - for (int i = 14816; i <= 14816; i++) - materials[i] = Material.EndGateway; - for (int i = 14817; i <= 14828; i++) - materials[i] = Material.RepeatingCommandBlock; - for (int i = 14829; i <= 14840; i++) - materials[i] = Material.ChainCommandBlock; - for (int i = 14841; i <= 14844; i++) - materials[i] = Material.FrostedIce; - for (int i = 14845; i <= 14845; i++) - materials[i] = Material.MagmaBlock; - for (int i = 14846; i <= 14846; i++) - materials[i] = Material.NetherWartBlock; - for (int i = 14847; i <= 14847; i++) - materials[i] = Material.RedNetherBricks; - for (int i = 14848; i <= 14850; i++) - materials[i] = Material.BoneBlock; - for (int i = 14851; i <= 14851; i++) - materials[i] = Material.StructureVoid; - for (int i = 14852; i <= 14863; i++) - materials[i] = Material.Observer; - for (int i = 14864; i <= 14869; i++) - materials[i] = Material.ShulkerBox; - for (int i = 14870; i <= 14875; i++) - materials[i] = Material.WhiteShulkerBox; - for (int i = 14876; i <= 14881; i++) - materials[i] = Material.OrangeShulkerBox; - for (int i = 14882; i <= 14887; i++) - materials[i] = Material.MagentaShulkerBox; - for (int i = 14888; i <= 14893; i++) - materials[i] = Material.LightBlueShulkerBox; - for (int i = 14894; i <= 14899; i++) - materials[i] = Material.YellowShulkerBox; - for (int i = 14900; i <= 14905; i++) - materials[i] = Material.LimeShulkerBox; - for (int i = 14906; i <= 14911; i++) - materials[i] = Material.PinkShulkerBox; - for (int i = 14912; i <= 14917; i++) - materials[i] = Material.GrayShulkerBox; - for (int i = 14918; i <= 14923; i++) - materials[i] = Material.LightGrayShulkerBox; - for (int i = 14924; i <= 14929; i++) - materials[i] = Material.CyanShulkerBox; - for (int i = 14930; i <= 14935; i++) - materials[i] = Material.PurpleShulkerBox; - for (int i = 14936; i <= 14941; i++) - materials[i] = Material.BlueShulkerBox; - for (int i = 14942; i <= 14947; i++) - materials[i] = Material.BrownShulkerBox; - for (int i = 14948; i <= 14953; i++) - materials[i] = Material.GreenShulkerBox; - for (int i = 14954; i <= 14959; i++) - materials[i] = Material.RedShulkerBox; - for (int i = 14960; i <= 14965; i++) - materials[i] = Material.BlackShulkerBox; - for (int i = 14966; i <= 14969; i++) - materials[i] = Material.WhiteGlazedTerracotta; - for (int i = 14970; i <= 14973; i++) - materials[i] = Material.OrangeGlazedTerracotta; - for (int i = 14974; i <= 14977; i++) - materials[i] = Material.MagentaGlazedTerracotta; - for (int i = 14978; i <= 14981; i++) - materials[i] = Material.LightBlueGlazedTerracotta; - for (int i = 14982; i <= 14985; i++) - materials[i] = Material.YellowGlazedTerracotta; - for (int i = 14986; i <= 14989; i++) - materials[i] = Material.LimeGlazedTerracotta; - for (int i = 14990; i <= 14993; i++) - materials[i] = Material.PinkGlazedTerracotta; - for (int i = 14994; i <= 14997; i++) - materials[i] = Material.GrayGlazedTerracotta; - for (int i = 14998; i <= 15001; i++) - materials[i] = Material.LightGrayGlazedTerracotta; - for (int i = 15002; i <= 15005; i++) - materials[i] = Material.CyanGlazedTerracotta; - for (int i = 15006; i <= 15009; i++) - materials[i] = Material.PurpleGlazedTerracotta; - for (int i = 15010; i <= 15013; i++) - materials[i] = Material.BlueGlazedTerracotta; - for (int i = 15014; i <= 15017; i++) - materials[i] = Material.BrownGlazedTerracotta; - for (int i = 15018; i <= 15021; i++) - materials[i] = Material.GreenGlazedTerracotta; - for (int i = 15022; i <= 15025; i++) - materials[i] = Material.RedGlazedTerracotta; - for (int i = 15026; i <= 15029; i++) - materials[i] = Material.BlackGlazedTerracotta; - for (int i = 15030; i <= 15030; i++) - materials[i] = Material.WhiteConcrete; - for (int i = 15031; i <= 15031; i++) - materials[i] = Material.OrangeConcrete; - for (int i = 15032; i <= 15032; i++) - materials[i] = Material.MagentaConcrete; - for (int i = 15033; i <= 15033; i++) - materials[i] = Material.LightBlueConcrete; - for (int i = 15034; i <= 15034; i++) - materials[i] = Material.YellowConcrete; - for (int i = 15035; i <= 15035; i++) - materials[i] = Material.LimeConcrete; - for (int i = 15036; i <= 15036; i++) - materials[i] = Material.PinkConcrete; - for (int i = 15037; i <= 15037; i++) - materials[i] = Material.GrayConcrete; - for (int i = 15038; i <= 15038; i++) - materials[i] = Material.LightGrayConcrete; - for (int i = 15039; i <= 15039; i++) - materials[i] = Material.CyanConcrete; - for (int i = 15040; i <= 15040; i++) - materials[i] = Material.PurpleConcrete; - for (int i = 15041; i <= 15041; i++) - materials[i] = Material.BlueConcrete; - for (int i = 15042; i <= 15042; i++) - materials[i] = Material.BrownConcrete; - for (int i = 15043; i <= 15043; i++) - materials[i] = Material.GreenConcrete; - for (int i = 15044; i <= 15044; i++) - materials[i] = Material.RedConcrete; - for (int i = 15045; i <= 15045; i++) - materials[i] = Material.BlackConcrete; - for (int i = 15046; i <= 15046; i++) - materials[i] = Material.WhiteConcretePowder; - for (int i = 15047; i <= 15047; i++) - materials[i] = Material.OrangeConcretePowder; - for (int i = 15048; i <= 15048; i++) - materials[i] = Material.MagentaConcretePowder; - for (int i = 15049; i <= 15049; i++) - materials[i] = Material.LightBlueConcretePowder; - for (int i = 15050; i <= 15050; i++) - materials[i] = Material.YellowConcretePowder; - for (int i = 15051; i <= 15051; i++) - materials[i] = Material.LimeConcretePowder; - for (int i = 15052; i <= 15052; i++) - materials[i] = Material.PinkConcretePowder; - for (int i = 15053; i <= 15053; i++) - materials[i] = Material.GrayConcretePowder; - for (int i = 15054; i <= 15054; i++) - materials[i] = Material.LightGrayConcretePowder; - for (int i = 15055; i <= 15055; i++) - materials[i] = Material.CyanConcretePowder; - for (int i = 15056; i <= 15056; i++) - materials[i] = Material.PurpleConcretePowder; - for (int i = 15057; i <= 15057; i++) - materials[i] = Material.BlueConcretePowder; - for (int i = 15058; i <= 15058; i++) - materials[i] = Material.BrownConcretePowder; - for (int i = 15059; i <= 15059; i++) - materials[i] = Material.GreenConcretePowder; - for (int i = 15060; i <= 15060; i++) - materials[i] = Material.RedConcretePowder; - for (int i = 15061; i <= 15061; i++) - materials[i] = Material.BlackConcretePowder; - for (int i = 15062; i <= 15087; i++) - materials[i] = Material.Kelp; - for (int i = 15088; i <= 15088; i++) - materials[i] = Material.KelpPlant; - for (int i = 15089; i <= 15089; i++) - materials[i] = Material.DriedKelpBlock; - for (int i = 15090; i <= 15101; i++) - materials[i] = Material.TurtleEgg; - for (int i = 15102; i <= 15104; i++) - materials[i] = Material.SnifferEgg; - for (int i = 15105; i <= 15136; i++) - materials[i] = Material.DriedGhast; - for (int i = 15137; i <= 15137; i++) - materials[i] = Material.DeadTubeCoralBlock; - for (int i = 15138; i <= 15138; i++) - materials[i] = Material.DeadBrainCoralBlock; - for (int i = 15139; i <= 15139; i++) - materials[i] = Material.DeadBubbleCoralBlock; - for (int i = 15140; i <= 15140; i++) - materials[i] = Material.DeadFireCoralBlock; - for (int i = 15141; i <= 15141; i++) - materials[i] = Material.DeadHornCoralBlock; - for (int i = 15142; i <= 15142; i++) - materials[i] = Material.TubeCoralBlock; - for (int i = 15143; i <= 15143; i++) - materials[i] = Material.BrainCoralBlock; - for (int i = 15144; i <= 15144; i++) - materials[i] = Material.BubbleCoralBlock; - for (int i = 15145; i <= 15145; i++) - materials[i] = Material.FireCoralBlock; - for (int i = 15146; i <= 15146; i++) - materials[i] = Material.HornCoralBlock; - for (int i = 15147; i <= 15148; i++) - materials[i] = Material.DeadTubeCoral; - for (int i = 15149; i <= 15150; i++) - materials[i] = Material.DeadBrainCoral; - for (int i = 15151; i <= 15152; i++) - materials[i] = Material.DeadBubbleCoral; - for (int i = 15153; i <= 15154; i++) - materials[i] = Material.DeadFireCoral; - for (int i = 15155; i <= 15156; i++) - materials[i] = Material.DeadHornCoral; - for (int i = 15157; i <= 15158; i++) - materials[i] = Material.TubeCoral; - for (int i = 15159; i <= 15160; i++) - materials[i] = Material.BrainCoral; - for (int i = 15161; i <= 15162; i++) - materials[i] = Material.BubbleCoral; - for (int i = 15163; i <= 15164; i++) - materials[i] = Material.FireCoral; - for (int i = 15165; i <= 15166; i++) - materials[i] = Material.HornCoral; - for (int i = 15167; i <= 15168; i++) - materials[i] = Material.DeadTubeCoralFan; - for (int i = 15169; i <= 15170; i++) - materials[i] = Material.DeadBrainCoralFan; - for (int i = 15171; i <= 15172; i++) - materials[i] = Material.DeadBubbleCoralFan; - for (int i = 15173; i <= 15174; i++) - materials[i] = Material.DeadFireCoralFan; - for (int i = 15175; i <= 15176; i++) - materials[i] = Material.DeadHornCoralFan; - for (int i = 15177; i <= 15178; i++) - materials[i] = Material.TubeCoralFan; - for (int i = 15179; i <= 15180; i++) - materials[i] = Material.BrainCoralFan; - for (int i = 15181; i <= 15182; i++) - materials[i] = Material.BubbleCoralFan; - for (int i = 15183; i <= 15184; i++) - materials[i] = Material.FireCoralFan; - for (int i = 15185; i <= 15186; i++) - materials[i] = Material.HornCoralFan; - for (int i = 15187; i <= 15194; i++) - materials[i] = Material.DeadTubeCoralWallFan; - for (int i = 15195; i <= 15202; i++) - materials[i] = Material.DeadBrainCoralWallFan; - for (int i = 15203; i <= 15210; i++) - materials[i] = Material.DeadBubbleCoralWallFan; - for (int i = 15211; i <= 15218; i++) - materials[i] = Material.DeadFireCoralWallFan; - for (int i = 15219; i <= 15226; i++) - materials[i] = Material.DeadHornCoralWallFan; - for (int i = 15227; i <= 15234; i++) - materials[i] = Material.TubeCoralWallFan; - for (int i = 15235; i <= 15242; i++) - materials[i] = Material.BrainCoralWallFan; - for (int i = 15243; i <= 15250; i++) - materials[i] = Material.BubbleCoralWallFan; - for (int i = 15251; i <= 15258; i++) - materials[i] = Material.FireCoralWallFan; - for (int i = 15259; i <= 15266; i++) - materials[i] = Material.HornCoralWallFan; - for (int i = 15267; i <= 15274; i++) - materials[i] = Material.SeaPickle; - for (int i = 15275; i <= 15275; i++) - materials[i] = Material.BlueIce; - for (int i = 15276; i <= 15277; i++) - materials[i] = Material.Conduit; - for (int i = 15278; i <= 15278; i++) - materials[i] = Material.BambooSapling; - for (int i = 15279; i <= 15290; i++) - materials[i] = Material.Bamboo; - for (int i = 15291; i <= 15291; i++) - materials[i] = Material.PottedBamboo; - for (int i = 15292; i <= 15292; i++) - materials[i] = Material.VoidAir; - for (int i = 15293; i <= 15293; i++) - materials[i] = Material.CaveAir; - for (int i = 15294; i <= 15295; i++) - materials[i] = Material.BubbleColumn; - for (int i = 15296; i <= 15375; i++) - materials[i] = Material.PolishedGraniteStairs; - for (int i = 15376; i <= 15455; i++) - materials[i] = Material.SmoothRedSandstoneStairs; - for (int i = 15456; i <= 15535; i++) - materials[i] = Material.MossyStoneBrickStairs; - for (int i = 15536; i <= 15615; i++) - materials[i] = Material.PolishedDioriteStairs; - for (int i = 15616; i <= 15695; i++) - materials[i] = Material.MossyCobblestoneStairs; - for (int i = 15696; i <= 15775; i++) - materials[i] = Material.EndStoneBrickStairs; - for (int i = 15776; i <= 15855; i++) - materials[i] = Material.StoneStairs; - for (int i = 15856; i <= 15935; i++) - materials[i] = Material.SmoothSandstoneStairs; - for (int i = 15936; i <= 16015; i++) - materials[i] = Material.SmoothQuartzStairs; - for (int i = 16016; i <= 16095; i++) - materials[i] = Material.GraniteStairs; - for (int i = 16096; i <= 16175; i++) - materials[i] = Material.AndesiteStairs; - for (int i = 16176; i <= 16255; i++) - materials[i] = Material.RedNetherBrickStairs; - for (int i = 16256; i <= 16335; i++) - materials[i] = Material.PolishedAndesiteStairs; - for (int i = 16336; i <= 16415; i++) - materials[i] = Material.DioriteStairs; - for (int i = 16416; i <= 16421; i++) - materials[i] = Material.PolishedGraniteSlab; - for (int i = 16422; i <= 16427; i++) - materials[i] = Material.SmoothRedSandstoneSlab; - for (int i = 16428; i <= 16433; i++) - materials[i] = Material.MossyStoneBrickSlab; - for (int i = 16434; i <= 16439; i++) - materials[i] = Material.PolishedDioriteSlab; - for (int i = 16440; i <= 16445; i++) - materials[i] = Material.MossyCobblestoneSlab; - for (int i = 16446; i <= 16451; i++) - materials[i] = Material.EndStoneBrickSlab; - for (int i = 16452; i <= 16457; i++) - materials[i] = Material.SmoothSandstoneSlab; - for (int i = 16458; i <= 16463; i++) - materials[i] = Material.SmoothQuartzSlab; - for (int i = 16464; i <= 16469; i++) - materials[i] = Material.GraniteSlab; - for (int i = 16470; i <= 16475; i++) - materials[i] = Material.AndesiteSlab; - for (int i = 16476; i <= 16481; i++) - materials[i] = Material.RedNetherBrickSlab; - for (int i = 16482; i <= 16487; i++) - materials[i] = Material.PolishedAndesiteSlab; - for (int i = 16488; i <= 16493; i++) - materials[i] = Material.DioriteSlab; - for (int i = 16494; i <= 16817; i++) - materials[i] = Material.BrickWall; - for (int i = 16818; i <= 17141; i++) - materials[i] = Material.PrismarineWall; - for (int i = 17142; i <= 17465; i++) - materials[i] = Material.RedSandstoneWall; - for (int i = 17466; i <= 17789; i++) - materials[i] = Material.MossyStoneBrickWall; - for (int i = 17790; i <= 18113; i++) - materials[i] = Material.GraniteWall; - for (int i = 18114; i <= 18437; i++) - materials[i] = Material.StoneBrickWall; - for (int i = 18438; i <= 18761; i++) - materials[i] = Material.MudBrickWall; - for (int i = 18762; i <= 19085; i++) - materials[i] = Material.NetherBrickWall; - for (int i = 19086; i <= 19409; i++) - materials[i] = Material.AndesiteWall; - for (int i = 19410; i <= 19733; i++) - materials[i] = Material.RedNetherBrickWall; - for (int i = 19734; i <= 20057; i++) - materials[i] = Material.SandstoneWall; - for (int i = 20058; i <= 20381; i++) - materials[i] = Material.EndStoneBrickWall; - for (int i = 20382; i <= 20705; i++) - materials[i] = Material.DioriteWall; - for (int i = 20706; i <= 20737; i++) - materials[i] = Material.Scaffolding; - for (int i = 20738; i <= 20741; i++) - materials[i] = Material.Loom; - for (int i = 20742; i <= 20753; i++) - materials[i] = Material.Barrel; - for (int i = 20754; i <= 20761; i++) - materials[i] = Material.Smoker; - for (int i = 20762; i <= 20769; i++) - materials[i] = Material.BlastFurnace; - for (int i = 20770; i <= 20770; i++) - materials[i] = Material.CartographyTable; - for (int i = 20771; i <= 20771; i++) - materials[i] = Material.FletchingTable; - for (int i = 20772; i <= 20783; i++) - materials[i] = Material.Grindstone; - for (int i = 20784; i <= 20799; i++) - materials[i] = Material.Lectern; - for (int i = 20800; i <= 20800; i++) - materials[i] = Material.SmithingTable; - for (int i = 20801; i <= 20804; i++) - materials[i] = Material.Stonecutter; - for (int i = 20805; i <= 20836; i++) - materials[i] = Material.Bell; - for (int i = 20837; i <= 20840; i++) - materials[i] = Material.Lantern; - for (int i = 20841; i <= 20844; i++) - materials[i] = Material.SoulLantern; - for (int i = 20845; i <= 20848; i++) - materials[i] = Material.CopperLantern; - for (int i = 20849; i <= 20852; i++) - materials[i] = Material.ExposedCopperLantern; - for (int i = 20853; i <= 20856; i++) - materials[i] = Material.WeatheredCopperLantern; - for (int i = 20857; i <= 20860; i++) - materials[i] = Material.OxidizedCopperLantern; - for (int i = 20861; i <= 20864; i++) - materials[i] = Material.WaxedCopperLantern; - for (int i = 20865; i <= 20868; i++) - materials[i] = Material.WaxedExposedCopperLantern; - for (int i = 20869; i <= 20872; i++) - materials[i] = Material.WaxedWeatheredCopperLantern; - for (int i = 20873; i <= 20876; i++) - materials[i] = Material.WaxedOxidizedCopperLantern; - for (int i = 20877; i <= 20908; i++) - materials[i] = Material.Campfire; - for (int i = 20909; i <= 20940; i++) - materials[i] = Material.SoulCampfire; - for (int i = 20941; i <= 20944; i++) - materials[i] = Material.SweetBerryBush; - for (int i = 20945; i <= 20947; i++) - materials[i] = Material.WarpedStem; - for (int i = 20948; i <= 20950; i++) - materials[i] = Material.StrippedWarpedStem; - for (int i = 20951; i <= 20953; i++) - materials[i] = Material.WarpedHyphae; - for (int i = 20954; i <= 20956; i++) - materials[i] = Material.StrippedWarpedHyphae; - for (int i = 20957; i <= 20957; i++) - materials[i] = Material.WarpedNylium; - for (int i = 20958; i <= 20958; i++) - materials[i] = Material.WarpedFungus; - for (int i = 20959; i <= 20959; i++) - materials[i] = Material.WarpedWartBlock; - for (int i = 20960; i <= 20960; i++) - materials[i] = Material.WarpedRoots; - for (int i = 20961; i <= 20961; i++) - materials[i] = Material.NetherSprouts; - for (int i = 20962; i <= 20964; i++) - materials[i] = Material.CrimsonStem; - for (int i = 20965; i <= 20967; i++) - materials[i] = Material.StrippedCrimsonStem; - for (int i = 20968; i <= 20970; i++) - materials[i] = Material.CrimsonHyphae; - for (int i = 20971; i <= 20973; i++) - materials[i] = Material.StrippedCrimsonHyphae; - for (int i = 20974; i <= 20974; i++) - materials[i] = Material.CrimsonNylium; - for (int i = 20975; i <= 20975; i++) - materials[i] = Material.CrimsonFungus; - for (int i = 20976; i <= 20976; i++) - materials[i] = Material.Shroomlight; - for (int i = 20977; i <= 21002; i++) - materials[i] = Material.WeepingVines; - for (int i = 21003; i <= 21003; i++) - materials[i] = Material.WeepingVinesPlant; - for (int i = 21004; i <= 21029; i++) - materials[i] = Material.TwistingVines; - for (int i = 21030; i <= 21030; i++) - materials[i] = Material.TwistingVinesPlant; - for (int i = 21031; i <= 21031; i++) - materials[i] = Material.CrimsonRoots; - for (int i = 21032; i <= 21032; i++) - materials[i] = Material.CrimsonPlanks; - for (int i = 21033; i <= 21033; i++) - materials[i] = Material.WarpedPlanks; - for (int i = 21034; i <= 21039; i++) - materials[i] = Material.CrimsonSlab; - for (int i = 21040; i <= 21045; i++) - materials[i] = Material.WarpedSlab; - for (int i = 21046; i <= 21047; i++) - materials[i] = Material.CrimsonPressurePlate; - for (int i = 21048; i <= 21049; i++) - materials[i] = Material.WarpedPressurePlate; - for (int i = 21050; i <= 21081; i++) - materials[i] = Material.CrimsonFence; - for (int i = 21082; i <= 21113; i++) - materials[i] = Material.WarpedFence; - for (int i = 21114; i <= 21177; i++) - materials[i] = Material.CrimsonTrapdoor; - for (int i = 21178; i <= 21241; i++) - materials[i] = Material.WarpedTrapdoor; - for (int i = 21242; i <= 21273; i++) - materials[i] = Material.CrimsonFenceGate; - for (int i = 21274; i <= 21305; i++) - materials[i] = Material.WarpedFenceGate; - for (int i = 21306; i <= 21385; i++) - materials[i] = Material.CrimsonStairs; - for (int i = 21386; i <= 21465; i++) - materials[i] = Material.WarpedStairs; - for (int i = 21466; i <= 21489; i++) - materials[i] = Material.CrimsonButton; - for (int i = 21490; i <= 21513; i++) - materials[i] = Material.WarpedButton; - for (int i = 21514; i <= 21577; i++) - materials[i] = Material.CrimsonDoor; - for (int i = 21578; i <= 21641; i++) - materials[i] = Material.WarpedDoor; - for (int i = 21642; i <= 21673; i++) - materials[i] = Material.CrimsonSign; - for (int i = 21674; i <= 21705; i++) - materials[i] = Material.WarpedSign; - for (int i = 21706; i <= 21713; i++) - materials[i] = Material.CrimsonWallSign; - for (int i = 21714; i <= 21721; i++) - materials[i] = Material.WarpedWallSign; - for (int i = 21722; i <= 21725; i++) - materials[i] = Material.StructureBlock; - for (int i = 21726; i <= 21737; i++) - materials[i] = Material.Jigsaw; - for (int i = 21738; i <= 21741; i++) - materials[i] = Material.TestBlock; - for (int i = 21742; i <= 21742; i++) - materials[i] = Material.TestInstanceBlock; - for (int i = 21743; i <= 21751; i++) - materials[i] = Material.Composter; - for (int i = 21752; i <= 21767; i++) - materials[i] = Material.Target; - for (int i = 21768; i <= 21791; i++) - materials[i] = Material.BeeNest; - for (int i = 21792; i <= 21815; i++) - materials[i] = Material.Beehive; - for (int i = 21816; i <= 21816; i++) - materials[i] = Material.HoneyBlock; - for (int i = 21817; i <= 21817; i++) - materials[i] = Material.HoneycombBlock; - for (int i = 21818; i <= 21818; i++) - materials[i] = Material.NetheriteBlock; - for (int i = 21819; i <= 21819; i++) - materials[i] = Material.AncientDebris; - for (int i = 21820; i <= 21820; i++) - materials[i] = Material.CryingObsidian; - for (int i = 21821; i <= 21825; i++) - materials[i] = Material.RespawnAnchor; - for (int i = 21826; i <= 21826; i++) - materials[i] = Material.PottedCrimsonFungus; - for (int i = 21827; i <= 21827; i++) - materials[i] = Material.PottedWarpedFungus; - for (int i = 21828; i <= 21828; i++) - materials[i] = Material.PottedCrimsonRoots; - for (int i = 21829; i <= 21829; i++) - materials[i] = Material.PottedWarpedRoots; - for (int i = 21830; i <= 21830; i++) - materials[i] = Material.Lodestone; - for (int i = 21831; i <= 21831; i++) - materials[i] = Material.Blackstone; - for (int i = 21832; i <= 21911; i++) - materials[i] = Material.BlackstoneStairs; - for (int i = 21912; i <= 22235; i++) - materials[i] = Material.BlackstoneWall; - for (int i = 22236; i <= 22241; i++) - materials[i] = Material.BlackstoneSlab; - for (int i = 22242; i <= 22242; i++) - materials[i] = Material.PolishedBlackstone; - for (int i = 22243; i <= 22243; i++) - materials[i] = Material.PolishedBlackstoneBricks; - for (int i = 22244; i <= 22244; i++) - materials[i] = Material.CrackedPolishedBlackstoneBricks; - for (int i = 22245; i <= 22245; i++) - materials[i] = Material.ChiseledPolishedBlackstone; - for (int i = 22246; i <= 22251; i++) - materials[i] = Material.PolishedBlackstoneBrickSlab; - for (int i = 22252; i <= 22331; i++) - materials[i] = Material.PolishedBlackstoneBrickStairs; - for (int i = 22332; i <= 22655; i++) - materials[i] = Material.PolishedBlackstoneBrickWall; - for (int i = 22656; i <= 22656; i++) - materials[i] = Material.GildedBlackstone; - for (int i = 22657; i <= 22736; i++) - materials[i] = Material.PolishedBlackstoneStairs; - for (int i = 22737; i <= 22742; i++) - materials[i] = Material.PolishedBlackstoneSlab; - for (int i = 22743; i <= 22744; i++) - materials[i] = Material.PolishedBlackstonePressurePlate; - for (int i = 22745; i <= 22768; i++) - materials[i] = Material.PolishedBlackstoneButton; - for (int i = 22769; i <= 23092; i++) - materials[i] = Material.PolishedBlackstoneWall; - for (int i = 23093; i <= 23093; i++) - materials[i] = Material.ChiseledNetherBricks; - for (int i = 23094; i <= 23094; i++) - materials[i] = Material.CrackedNetherBricks; - for (int i = 23095; i <= 23095; i++) - materials[i] = Material.QuartzBricks; - for (int i = 23096; i <= 23111; i++) - materials[i] = Material.Candle; - for (int i = 23112; i <= 23127; i++) - materials[i] = Material.WhiteCandle; - for (int i = 23128; i <= 23143; i++) - materials[i] = Material.OrangeCandle; - for (int i = 23144; i <= 23159; i++) - materials[i] = Material.MagentaCandle; - for (int i = 23160; i <= 23175; i++) - materials[i] = Material.LightBlueCandle; - for (int i = 23176; i <= 23191; i++) - materials[i] = Material.YellowCandle; - for (int i = 23192; i <= 23207; i++) - materials[i] = Material.LimeCandle; - for (int i = 23208; i <= 23223; i++) - materials[i] = Material.PinkCandle; - for (int i = 23224; i <= 23239; i++) - materials[i] = Material.GrayCandle; - for (int i = 23240; i <= 23255; i++) - materials[i] = Material.LightGrayCandle; - for (int i = 23256; i <= 23271; i++) - materials[i] = Material.CyanCandle; - for (int i = 23272; i <= 23287; i++) - materials[i] = Material.PurpleCandle; - for (int i = 23288; i <= 23303; i++) - materials[i] = Material.BlueCandle; - for (int i = 23304; i <= 23319; i++) - materials[i] = Material.BrownCandle; - for (int i = 23320; i <= 23335; i++) - materials[i] = Material.GreenCandle; - for (int i = 23336; i <= 23351; i++) - materials[i] = Material.RedCandle; - for (int i = 23352; i <= 23367; i++) - materials[i] = Material.BlackCandle; - for (int i = 23368; i <= 23369; i++) - materials[i] = Material.CandleCake; - for (int i = 23370; i <= 23371; i++) - materials[i] = Material.WhiteCandleCake; - for (int i = 23372; i <= 23373; i++) - materials[i] = Material.OrangeCandleCake; - for (int i = 23374; i <= 23375; i++) - materials[i] = Material.MagentaCandleCake; - for (int i = 23376; i <= 23377; i++) - materials[i] = Material.LightBlueCandleCake; - for (int i = 23378; i <= 23379; i++) - materials[i] = Material.YellowCandleCake; - for (int i = 23380; i <= 23381; i++) - materials[i] = Material.LimeCandleCake; - for (int i = 23382; i <= 23383; i++) - materials[i] = Material.PinkCandleCake; - for (int i = 23384; i <= 23385; i++) - materials[i] = Material.GrayCandleCake; - for (int i = 23386; i <= 23387; i++) - materials[i] = Material.LightGrayCandleCake; - for (int i = 23388; i <= 23389; i++) - materials[i] = Material.CyanCandleCake; - for (int i = 23390; i <= 23391; i++) - materials[i] = Material.PurpleCandleCake; - for (int i = 23392; i <= 23393; i++) - materials[i] = Material.BlueCandleCake; - for (int i = 23394; i <= 23395; i++) - materials[i] = Material.BrownCandleCake; - for (int i = 23396; i <= 23397; i++) - materials[i] = Material.GreenCandleCake; - for (int i = 23398; i <= 23399; i++) - materials[i] = Material.RedCandleCake; - for (int i = 23400; i <= 23401; i++) - materials[i] = Material.BlackCandleCake; - for (int i = 23402; i <= 23402; i++) - materials[i] = Material.AmethystBlock; - for (int i = 23403; i <= 23403; i++) - materials[i] = Material.BuddingAmethyst; - for (int i = 23404; i <= 23415; i++) - materials[i] = Material.AmethystCluster; - for (int i = 23416; i <= 23427; i++) - materials[i] = Material.LargeAmethystBud; - for (int i = 23428; i <= 23439; i++) - materials[i] = Material.MediumAmethystBud; - for (int i = 23440; i <= 23451; i++) - materials[i] = Material.SmallAmethystBud; - for (int i = 23452; i <= 23452; i++) - materials[i] = Material.Tuff; - for (int i = 23453; i <= 23458; i++) - materials[i] = Material.TuffSlab; - for (int i = 23459; i <= 23538; i++) - materials[i] = Material.TuffStairs; - for (int i = 23539; i <= 23862; i++) - materials[i] = Material.TuffWall; - for (int i = 23863; i <= 23863; i++) - materials[i] = Material.PolishedTuff; - for (int i = 23864; i <= 23869; i++) - materials[i] = Material.PolishedTuffSlab; - for (int i = 23870; i <= 23949; i++) - materials[i] = Material.PolishedTuffStairs; - for (int i = 23950; i <= 24273; i++) - materials[i] = Material.PolishedTuffWall; - for (int i = 24274; i <= 24274; i++) - materials[i] = Material.ChiseledTuff; - for (int i = 24275; i <= 24275; i++) - materials[i] = Material.TuffBricks; - for (int i = 24276; i <= 24281; i++) - materials[i] = Material.TuffBrickSlab; - for (int i = 24282; i <= 24361; i++) - materials[i] = Material.TuffBrickStairs; - for (int i = 24362; i <= 24685; i++) - materials[i] = Material.TuffBrickWall; - for (int i = 24686; i <= 24686; i++) - materials[i] = Material.ChiseledTuffBricks; - for (int i = 24687; i <= 24687; i++) - materials[i] = Material.Sulfur; - for (int i = 24688; i <= 24692; i++) - materials[i] = Material.PotentSulfur; - for (int i = 24693; i <= 24698; i++) - materials[i] = Material.SulfurSlab; - for (int i = 24699; i <= 24778; i++) - materials[i] = Material.SulfurStairs; - for (int i = 24779; i <= 25102; i++) - materials[i] = Material.SulfurWall; - for (int i = 25103; i <= 25103; i++) - materials[i] = Material.PolishedSulfur; - for (int i = 25104; i <= 25109; i++) - materials[i] = Material.PolishedSulfurSlab; - for (int i = 25110; i <= 25189; i++) - materials[i] = Material.PolishedSulfurStairs; - for (int i = 25190; i <= 25513; i++) - materials[i] = Material.PolishedSulfurWall; - for (int i = 25514; i <= 25514; i++) - materials[i] = Material.SulfurBricks; - for (int i = 25515; i <= 25520; i++) - materials[i] = Material.SulfurBrickSlab; - for (int i = 25521; i <= 25600; i++) - materials[i] = Material.SulfurBrickStairs; - for (int i = 25601; i <= 25924; i++) - materials[i] = Material.SulfurBrickWall; - for (int i = 25925; i <= 25925; i++) - materials[i] = Material.ChiseledSulfur; - for (int i = 25926; i <= 25926; i++) - materials[i] = Material.Cinnabar; - for (int i = 25927; i <= 25932; i++) - materials[i] = Material.CinnabarSlab; - for (int i = 25933; i <= 26012; i++) - materials[i] = Material.CinnabarStairs; - for (int i = 26013; i <= 26336; i++) - materials[i] = Material.CinnabarWall; - for (int i = 26337; i <= 26337; i++) - materials[i] = Material.PolishedCinnabar; - for (int i = 26338; i <= 26343; i++) - materials[i] = Material.PolishedCinnabarSlab; - for (int i = 26344; i <= 26423; i++) - materials[i] = Material.PolishedCinnabarStairs; - for (int i = 26424; i <= 26747; i++) - materials[i] = Material.PolishedCinnabarWall; - for (int i = 26748; i <= 26748; i++) - materials[i] = Material.CinnabarBricks; - for (int i = 26749; i <= 26754; i++) - materials[i] = Material.CinnabarBrickSlab; - for (int i = 26755; i <= 26834; i++) - materials[i] = Material.CinnabarBrickStairs; - for (int i = 26835; i <= 27158; i++) - materials[i] = Material.CinnabarBrickWall; - for (int i = 27159; i <= 27159; i++) - materials[i] = Material.ChiseledCinnabar; - for (int i = 27160; i <= 27160; i++) - materials[i] = Material.Calcite; - for (int i = 27161; i <= 27161; i++) - materials[i] = Material.TintedGlass; - for (int i = 27162; i <= 27162; i++) - materials[i] = Material.PowderSnow; - for (int i = 27163; i <= 27258; i++) - materials[i] = Material.SculkSensor; - for (int i = 27259; i <= 27642; i++) - materials[i] = Material.CalibratedSculkSensor; - for (int i = 27643; i <= 27643; i++) - materials[i] = Material.Sculk; - for (int i = 27644; i <= 27771; i++) - materials[i] = Material.SculkVein; - for (int i = 27772; i <= 27773; i++) - materials[i] = Material.SculkCatalyst; - for (int i = 27774; i <= 27781; i++) - materials[i] = Material.SculkShrieker; - for (int i = 27782; i <= 27782; i++) - materials[i] = Material.CopperBlock; - for (int i = 27783; i <= 27783; i++) - materials[i] = Material.ExposedCopper; - for (int i = 27784; i <= 27784; i++) - materials[i] = Material.WeatheredCopper; - for (int i = 27785; i <= 27785; i++) - materials[i] = Material.OxidizedCopper; - for (int i = 27786; i <= 27786; i++) - materials[i] = Material.WaxedCopperBlock; - for (int i = 27787; i <= 27787; i++) - materials[i] = Material.WaxedExposedCopper; - for (int i = 27788; i <= 27788; i++) - materials[i] = Material.WaxedWeatheredCopper; - for (int i = 27789; i <= 27789; i++) - materials[i] = Material.WaxedOxidizedCopper; - for (int i = 27790; i <= 27790; i++) - materials[i] = Material.CopperOre; - for (int i = 27791; i <= 27791; i++) - materials[i] = Material.DeepslateCopperOre; - for (int i = 27792; i <= 27792; i++) - materials[i] = Material.CutCopper; - for (int i = 27793; i <= 27793; i++) - materials[i] = Material.ExposedCutCopper; - for (int i = 27794; i <= 27794; i++) - materials[i] = Material.WeatheredCutCopper; - for (int i = 27795; i <= 27795; i++) - materials[i] = Material.OxidizedCutCopper; - for (int i = 27796; i <= 27796; i++) - materials[i] = Material.WaxedCutCopper; - for (int i = 27797; i <= 27797; i++) - materials[i] = Material.WaxedExposedCutCopper; - for (int i = 27798; i <= 27798; i++) - materials[i] = Material.WaxedWeatheredCutCopper; - for (int i = 27799; i <= 27799; i++) - materials[i] = Material.WaxedOxidizedCutCopper; - for (int i = 27800; i <= 27800; i++) - materials[i] = Material.ChiseledCopper; - for (int i = 27801; i <= 27801; i++) - materials[i] = Material.ExposedChiseledCopper; - for (int i = 27802; i <= 27802; i++) - materials[i] = Material.WeatheredChiseledCopper; - for (int i = 27803; i <= 27803; i++) - materials[i] = Material.OxidizedChiseledCopper; - for (int i = 27804; i <= 27804; i++) - materials[i] = Material.WaxedChiseledCopper; - for (int i = 27805; i <= 27805; i++) - materials[i] = Material.WaxedExposedChiseledCopper; - for (int i = 27806; i <= 27806; i++) - materials[i] = Material.WaxedWeatheredChiseledCopper; - for (int i = 27807; i <= 27807; i++) - materials[i] = Material.WaxedOxidizedChiseledCopper; - for (int i = 27808; i <= 27887; i++) - materials[i] = Material.CutCopperStairs; - for (int i = 27888; i <= 27967; i++) - materials[i] = Material.ExposedCutCopperStairs; - for (int i = 27968; i <= 28047; i++) - materials[i] = Material.WeatheredCutCopperStairs; - for (int i = 28048; i <= 28127; i++) - materials[i] = Material.OxidizedCutCopperStairs; - for (int i = 28128; i <= 28207; i++) - materials[i] = Material.WaxedCutCopperStairs; - for (int i = 28208; i <= 28287; i++) - materials[i] = Material.WaxedExposedCutCopperStairs; - for (int i = 28288; i <= 28367; i++) - materials[i] = Material.WaxedWeatheredCutCopperStairs; - for (int i = 28368; i <= 28447; i++) - materials[i] = Material.WaxedOxidizedCutCopperStairs; - for (int i = 28448; i <= 28453; i++) - materials[i] = Material.CutCopperSlab; - for (int i = 28454; i <= 28459; i++) - materials[i] = Material.ExposedCutCopperSlab; - for (int i = 28460; i <= 28465; i++) - materials[i] = Material.WeatheredCutCopperSlab; - for (int i = 28466; i <= 28471; i++) - materials[i] = Material.OxidizedCutCopperSlab; - for (int i = 28472; i <= 28477; i++) - materials[i] = Material.WaxedCutCopperSlab; - for (int i = 28478; i <= 28483; i++) - materials[i] = Material.WaxedExposedCutCopperSlab; - for (int i = 28484; i <= 28489; i++) - materials[i] = Material.WaxedWeatheredCutCopperSlab; - for (int i = 28490; i <= 28495; i++) - materials[i] = Material.WaxedOxidizedCutCopperSlab; - for (int i = 28496; i <= 28559; i++) - materials[i] = Material.CopperDoor; - for (int i = 28560; i <= 28623; i++) - materials[i] = Material.ExposedCopperDoor; - for (int i = 28624; i <= 28687; i++) - materials[i] = Material.WeatheredCopperDoor; - for (int i = 28688; i <= 28751; i++) - materials[i] = Material.OxidizedCopperDoor; - for (int i = 28752; i <= 28815; i++) - materials[i] = Material.WaxedCopperDoor; - for (int i = 28816; i <= 28879; i++) - materials[i] = Material.WaxedExposedCopperDoor; - for (int i = 28880; i <= 28943; i++) - materials[i] = Material.WaxedWeatheredCopperDoor; - for (int i = 28944; i <= 29007; i++) - materials[i] = Material.WaxedOxidizedCopperDoor; - for (int i = 29008; i <= 29071; i++) - materials[i] = Material.CopperTrapdoor; - for (int i = 29072; i <= 29135; i++) - materials[i] = Material.ExposedCopperTrapdoor; - for (int i = 29136; i <= 29199; i++) - materials[i] = Material.WeatheredCopperTrapdoor; - for (int i = 29200; i <= 29263; i++) - materials[i] = Material.OxidizedCopperTrapdoor; - for (int i = 29264; i <= 29327; i++) - materials[i] = Material.WaxedCopperTrapdoor; - for (int i = 29328; i <= 29391; i++) - materials[i] = Material.WaxedExposedCopperTrapdoor; - for (int i = 29392; i <= 29455; i++) - materials[i] = Material.WaxedWeatheredCopperTrapdoor; - for (int i = 29456; i <= 29519; i++) - materials[i] = Material.WaxedOxidizedCopperTrapdoor; - for (int i = 29520; i <= 29521; i++) - materials[i] = Material.CopperGrate; - for (int i = 29522; i <= 29523; i++) - materials[i] = Material.ExposedCopperGrate; - for (int i = 29524; i <= 29525; i++) - materials[i] = Material.WeatheredCopperGrate; - for (int i = 29526; i <= 29527; i++) - materials[i] = Material.OxidizedCopperGrate; - for (int i = 29528; i <= 29529; i++) - materials[i] = Material.WaxedCopperGrate; - for (int i = 29530; i <= 29531; i++) - materials[i] = Material.WaxedExposedCopperGrate; - for (int i = 29532; i <= 29533; i++) - materials[i] = Material.WaxedWeatheredCopperGrate; - for (int i = 29534; i <= 29535; i++) - materials[i] = Material.WaxedOxidizedCopperGrate; - for (int i = 29536; i <= 29539; i++) - materials[i] = Material.CopperBulb; - for (int i = 29540; i <= 29543; i++) - materials[i] = Material.ExposedCopperBulb; - for (int i = 29544; i <= 29547; i++) - materials[i] = Material.WeatheredCopperBulb; - for (int i = 29548; i <= 29551; i++) - materials[i] = Material.OxidizedCopperBulb; - for (int i = 29552; i <= 29555; i++) - materials[i] = Material.WaxedCopperBulb; - for (int i = 29556; i <= 29559; i++) - materials[i] = Material.WaxedExposedCopperBulb; - for (int i = 29560; i <= 29563; i++) - materials[i] = Material.WaxedWeatheredCopperBulb; - for (int i = 29564; i <= 29567; i++) - materials[i] = Material.WaxedOxidizedCopperBulb; - for (int i = 29568; i <= 29591; i++) - materials[i] = Material.CopperChest; - for (int i = 29592; i <= 29615; i++) - materials[i] = Material.ExposedCopperChest; - for (int i = 29616; i <= 29639; i++) - materials[i] = Material.WeatheredCopperChest; - for (int i = 29640; i <= 29663; i++) - materials[i] = Material.OxidizedCopperChest; - for (int i = 29664; i <= 29687; i++) - materials[i] = Material.WaxedCopperChest; - for (int i = 29688; i <= 29711; i++) - materials[i] = Material.WaxedExposedCopperChest; - for (int i = 29712; i <= 29735; i++) - materials[i] = Material.WaxedWeatheredCopperChest; - for (int i = 29736; i <= 29759; i++) - materials[i] = Material.WaxedOxidizedCopperChest; - for (int i = 29760; i <= 29791; i++) - materials[i] = Material.CopperGolemStatue; - for (int i = 29792; i <= 29823; i++) - materials[i] = Material.ExposedCopperGolemStatue; - for (int i = 29824; i <= 29855; i++) - materials[i] = Material.WeatheredCopperGolemStatue; - for (int i = 29856; i <= 29887; i++) - materials[i] = Material.OxidizedCopperGolemStatue; - for (int i = 29888; i <= 29919; i++) - materials[i] = Material.WaxedCopperGolemStatue; - for (int i = 29920; i <= 29951; i++) - materials[i] = Material.WaxedExposedCopperGolemStatue; - for (int i = 29952; i <= 29983; i++) - materials[i] = Material.WaxedWeatheredCopperGolemStatue; - for (int i = 29984; i <= 30015; i++) - materials[i] = Material.WaxedOxidizedCopperGolemStatue; - for (int i = 30016; i <= 30039; i++) - materials[i] = Material.LightningRod; - for (int i = 30040; i <= 30063; i++) - materials[i] = Material.ExposedLightningRod; - for (int i = 30064; i <= 30087; i++) - materials[i] = Material.WeatheredLightningRod; - for (int i = 30088; i <= 30111; i++) - materials[i] = Material.OxidizedLightningRod; - for (int i = 30112; i <= 30135; i++) - materials[i] = Material.WaxedLightningRod; - for (int i = 30136; i <= 30159; i++) - materials[i] = Material.WaxedExposedLightningRod; - for (int i = 30160; i <= 30183; i++) - materials[i] = Material.WaxedWeatheredLightningRod; - for (int i = 30184; i <= 30207; i++) - materials[i] = Material.WaxedOxidizedLightningRod; - for (int i = 30208; i <= 30208; i++) - materials[i] = Material.DripstoneBlock; - for (int i = 30209; i <= 30228; i++) - materials[i] = Material.PointedDripstone; - for (int i = 30229; i <= 30248; i++) - materials[i] = Material.SulfurSpike; - for (int i = 30249; i <= 30300; i++) - materials[i] = Material.CaveVines; - for (int i = 30301; i <= 30302; i++) - materials[i] = Material.CaveVinesPlant; - for (int i = 30303; i <= 30303; i++) - materials[i] = Material.SporeBlossom; - for (int i = 30304; i <= 30304; i++) - materials[i] = Material.Azalea; - for (int i = 30305; i <= 30305; i++) - materials[i] = Material.FloweringAzalea; - for (int i = 30306; i <= 30306; i++) - materials[i] = Material.MossCarpet; - for (int i = 30307; i <= 30322; i++) - materials[i] = Material.PinkPetals; - for (int i = 30323; i <= 30338; i++) - materials[i] = Material.Wildflowers; - for (int i = 30339; i <= 30354; i++) - materials[i] = Material.LeafLitter; - for (int i = 30355; i <= 30355; i++) - materials[i] = Material.MossBlock; - for (int i = 30356; i <= 30387; i++) - materials[i] = Material.BigDripleaf; - for (int i = 30388; i <= 30395; i++) - materials[i] = Material.BigDripleafStem; - for (int i = 30396; i <= 30411; i++) - materials[i] = Material.SmallDripleaf; - for (int i = 30412; i <= 30413; i++) - materials[i] = Material.HangingRoots; - for (int i = 30414; i <= 30414; i++) - materials[i] = Material.RootedDirt; - for (int i = 30415; i <= 30415; i++) - materials[i] = Material.Mud; - for (int i = 30416; i <= 30418; i++) - materials[i] = Material.Deepslate; - for (int i = 30419; i <= 30419; i++) - materials[i] = Material.CobbledDeepslate; - for (int i = 30420; i <= 30499; i++) - materials[i] = Material.CobbledDeepslateStairs; - for (int i = 30500; i <= 30505; i++) - materials[i] = Material.CobbledDeepslateSlab; - for (int i = 30506; i <= 30829; i++) - materials[i] = Material.CobbledDeepslateWall; - for (int i = 30830; i <= 30830; i++) - materials[i] = Material.PolishedDeepslate; - for (int i = 30831; i <= 30910; i++) - materials[i] = Material.PolishedDeepslateStairs; - for (int i = 30911; i <= 30916; i++) - materials[i] = Material.PolishedDeepslateSlab; - for (int i = 30917; i <= 31240; i++) - materials[i] = Material.PolishedDeepslateWall; - for (int i = 31241; i <= 31241; i++) - materials[i] = Material.DeepslateTiles; - for (int i = 31242; i <= 31321; i++) - materials[i] = Material.DeepslateTileStairs; - for (int i = 31322; i <= 31327; i++) - materials[i] = Material.DeepslateTileSlab; - for (int i = 31328; i <= 31651; i++) - materials[i] = Material.DeepslateTileWall; - for (int i = 31652; i <= 31652; i++) - materials[i] = Material.DeepslateBricks; - for (int i = 31653; i <= 31732; i++) - materials[i] = Material.DeepslateBrickStairs; - for (int i = 31733; i <= 31738; i++) - materials[i] = Material.DeepslateBrickSlab; - for (int i = 31739; i <= 32062; i++) - materials[i] = Material.DeepslateBrickWall; - for (int i = 32063; i <= 32063; i++) - materials[i] = Material.ChiseledDeepslate; - for (int i = 32064; i <= 32064; i++) - materials[i] = Material.CrackedDeepslateBricks; - for (int i = 32065; i <= 32065; i++) - materials[i] = Material.CrackedDeepslateTiles; - for (int i = 32066; i <= 32068; i++) - materials[i] = Material.InfestedDeepslate; - for (int i = 32069; i <= 32069; i++) - materials[i] = Material.SmoothBasalt; - for (int i = 32070; i <= 32070; i++) - materials[i] = Material.RawIronBlock; - for (int i = 32071; i <= 32071; i++) - materials[i] = Material.RawCopperBlock; - for (int i = 32072; i <= 32072; i++) - materials[i] = Material.RawGoldBlock; - for (int i = 32073; i <= 32073; i++) - materials[i] = Material.PottedAzaleaBush; - for (int i = 32074; i <= 32074; i++) - materials[i] = Material.PottedFloweringAzaleaBush; - for (int i = 32075; i <= 32077; i++) - materials[i] = Material.OchreFroglight; - for (int i = 32078; i <= 32080; i++) - materials[i] = Material.VerdantFroglight; - for (int i = 32081; i <= 32083; i++) - materials[i] = Material.PearlescentFroglight; - for (int i = 32084; i <= 32084; i++) - materials[i] = Material.Frogspawn; - for (int i = 32085; i <= 32085; i++) - materials[i] = Material.ReinforcedDeepslate; - for (int i = 32086; i <= 32101; i++) - materials[i] = Material.DecoratedPot; - for (int i = 32102; i <= 32149; i++) - materials[i] = Material.Crafter; - for (int i = 32150; i <= 32161; i++) - materials[i] = Material.TrialSpawner; - for (int i = 32162; i <= 32193; i++) - materials[i] = Material.Vault; - for (int i = 32194; i <= 32195; i++) - materials[i] = Material.HeavyCore; - for (int i = 32196; i <= 32196; i++) - materials[i] = Material.PaleMossBlock; - for (int i = 32197; i <= 32358; i++) - materials[i] = Material.PaleMossCarpet; - for (int i = 32359; i <= 32360; i++) - materials[i] = Material.PaleHangingMoss; - for (int i = 32361; i <= 32361; i++) - materials[i] = Material.OpenEyeblossom; - for (int i = 32362; i <= 32362; i++) - materials[i] = Material.ClosedEyeblossom; - for (int i = 32363; i <= 32363; i++) - materials[i] = Material.PottedOpenEyeblossom; - for (int i = 32364; i <= 32364; i++) - materials[i] = Material.PottedClosedEyeblossom; - for (int i = 32365; i <= 32365; i++) - materials[i] = Material.FireflyBush; - } - - // - private static readonly BlockStateDefinition[] stateDefinitions = - [ - new(8, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(12, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(22, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(29, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(31, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(33, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(35, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(37, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(39, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(41, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(43, 2, - [ - new("stage", ["0", "1"], 1) - ]), - new(45, 40, - [ - new("age", ["0", "1", "2", "3", "4"], 8), - new("hanging", ["true", "false"], 4), - new("stage", ["0", "1"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(86, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(102, 16, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(119, 4, - [ - new("dusted", ["0", "1", "2", "3"], 1) - ]), - new(125, 4, - [ - new("dusted", ["0", "1", "2", "3"], 1) - ]), - new(136, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(139, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(142, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(145, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(148, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(151, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(154, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(157, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(160, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(163, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(165, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(168, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(171, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(174, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(177, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(180, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(183, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(186, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(189, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(192, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(195, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(198, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(201, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(204, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(207, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(210, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(213, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(216, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(219, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(222, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(225, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(228, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(231, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(234, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(237, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(240, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(243, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(246, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(249, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(252, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(280, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(308, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(336, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(364, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(392, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(420, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(448, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(476, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(504, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(532, 28, - [ - new("distance", ["1", "2", "3", "4", "5", "6", "7"], 4), - new("persistent", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(566, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(581, 1350, - [ - new("instrument", ["harp", "basedrum", "snare", "hat", "bass", "flute", "bell", "guitar", "chime", "xylophone", "iron_xylophone", "cow_bell", "didgeridoo", "bit", "banjo", "pling", "trumpet", "trumpet_exposed", "trumpet_oxidized", "trumpet_weathered", "zombie", "skeleton", "creeper", "dragon", "wither_skeleton", "piglin", "custom_head"], 50), - new("note", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"], 2), - new("powered", ["true", "false"], 1) - ]), - new(1931, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1947, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1963, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1979, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(1995, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2011, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2027, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2043, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2059, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2075, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2091, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2107, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2123, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2139, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2155, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2171, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("occupied", ["true", "false"], 2), - new("part", ["head", "foot"], 1) - ]), - new(2187, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2211, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2235, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(2255, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(2257, 12, - [ - new("extended", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(2269, 24, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("short", ["true", "false"], 2) - ]), - new(2309, 12, - [ - new("type", ["normal", "sticky"], 1), - new("facing", ["north", "east", "south", "west", "up", "down"], 2) - ]), - new(2341, 2, - [ - new("unstable", ["true", "false"], 1) - ]), - new(2344, 256, - [ - new("facing", ["north", "south", "west", "east"], 64), - new("slot_0_occupied", ["true", "false"], 32), - new("slot_1_occupied", ["true", "false"], 16), - new("slot_2_occupied", ["true", "false"], 8), - new("slot_3_occupied", ["true", "false"], 4), - new("slot_4_occupied", ["true", "false"], 2), - new("slot_5_occupied", ["true", "false"], 1) - ]), - new(2600, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2664, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2728, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2792, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2856, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2920, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(2984, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3048, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3112, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3176, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3240, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3304, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("powered", ["true", "false"], 8), - new("side_chain", ["unconnected", "right", "center", "left"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3371, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(3375, 512, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(3889, 18, - [ - new("axis", ["x", "y", "z"], 6), - new("creaking_heart_state", ["uprooted", "dormant", "awake"], 2), - new("natural", ["true", "false"], 1) - ]), - new(3907, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(3987, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(4011, 1296, - [ - new("east", ["up", "side", "none"], 432), - new("north", ["up", "side", "none"], 144), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 9), - new("south", ["up", "side", "none"], 3), - new("west", ["up", "side", "none"], 1) - ]), - new(5311, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(5319, 8, - [ - new("moisture", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(5327, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(5335, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5367, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5399, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5431, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5463, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5495, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5527, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5559, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5591, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5623, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5655, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(5719, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5727, 20, - [ - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south", "south_east", "south_west", "north_west", "north_east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5747, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5827, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5835, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5843, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5851, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5859, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5867, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5875, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5883, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5891, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5899, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5907, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(5971, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6035, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6099, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6163, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6227, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6291, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6355, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6419, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6483, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6547, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6611, 64, - [ - new("attached", ["true", "false"], 32), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6675, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6683, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6691, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6699, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6707, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6715, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6723, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6731, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6739, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6747, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6755, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6763, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(6771, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6795, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6797, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6861, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6863, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6865, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6867, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6869, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6871, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6873, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6875, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6877, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6879, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(6881, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(6883, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(6885, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(6887, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(6895, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(6919, 8, - [ - new("layers", ["1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(6929, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6947, 16, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(6963, 2, - [ - new("has_record", ["true", "false"], 1) - ]), - new(6965, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7000, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(7003, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(7007, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7012, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7017, 2, - [ - new("axis", ["x", "z"], 1) - ]), - new(7019, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7023, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(7027, 7, - [ - new("bites", ["0", "1", "2", "3", "4", "5", "6"], 1) - ]), - new(7034, 64, - [ - new("delay", ["1", "2", "3", "4"], 16), - new("facing", ["north", "south", "west", "east"], 4), - new("locked", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(7114, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7178, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7242, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7306, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7370, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7434, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7498, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7562, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7626, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7690, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(7766, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7830, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7894, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7958, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(7990, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8022, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8054, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8086, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8118, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8150, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8182, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8214, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8246, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8252, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8258, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8264, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8270, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8276, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8282, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8288, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8294, 6, - [ - new("axis", ["x", "y", "z"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8300, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8334, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8338, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(8342, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(8350, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(8358, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8390, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8518, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(8646, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(8678, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8758, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8838, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(8918, 2, - [ - new("snowy", ["true", "false"], 1) - ]), - new(8923, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9003, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9009, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(9335, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9367, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9447, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(9452, 8, - [ - new("has_bottle_0", ["true", "false"], 4), - new("has_bottle_1", ["true", "false"], 2), - new("has_bottle_2", ["true", "false"], 1) - ]), - new(9461, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(9465, 3, - [ - new("level", ["1", "2", "3"], 1) - ]), - new(9469, 8, - [ - new("eye", ["true", "false"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9479, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(9481, 12, - [ - new("age", ["0", "1", "2"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(9493, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9575, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9583, 16, - [ - new("attached", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(9599, 128, - [ - new("attached", ["true", "false"], 64), - new("disarmed", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("powered", ["true", "false"], 4), - new("south", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(9728, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9808, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9888, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(9968, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(9981, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(10305, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(10659, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(10667, 8, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7"], 1) - ]), - new(10675, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10699, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10723, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10747, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10771, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10795, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10819, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10843, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10867, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10891, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10915, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10947, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10955, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(10987, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(10995, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11027, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11035, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11067, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11075, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11107, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11115, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11147, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11155, 32, - [ - new("powered", ["true", "false"], 16), - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11187, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11195, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11199, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11203, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(11207, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(11231, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11247, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11263, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("mode", ["compare", "subtract"], 2), - new("powered", ["true", "false"], 1) - ]), - new(11279, 32, - [ - new("inverted", ["true", "false"], 16), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(11313, 10, - [ - new("enabled", ["true", "false"], 5), - new("facing", ["down", "north", "south", "west", "east"], 1) - ]), - new(11325, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(11328, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11408, 24, - [ - new("powered", ["true", "false"], 12), - new("shape", ["north_south", "east_west", "ascending_east", "ascending_west", "ascending_north", "ascending_south"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(11432, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(11460, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11492, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11524, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11556, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11588, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11620, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11652, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11684, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11716, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11748, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11780, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11812, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11844, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11876, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11908, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11940, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(11972, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12052, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12132, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12212, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12292, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12372, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12452, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12533, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(12535, 32, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12567, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12634, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12714, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12794, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12874, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12880, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12886, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(12893, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(12915, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(12917, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(12919, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(12921, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(12923, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(12925, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(12927, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12943, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12959, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12975, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(12991, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13007, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13023, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13039, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13055, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13071, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13087, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13103, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13119, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13135, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13151, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13167, 16, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(13183, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13187, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13191, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13195, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13199, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13203, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13207, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13211, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13215, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13219, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13223, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13227, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13231, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13235, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13239, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13243, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(13250, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13330, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13336, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13342, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13348, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13354, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13360, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13366, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13372, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13378, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13384, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13390, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13396, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13402, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13408, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13414, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13420, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13426, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13432, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13438, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13444, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13450, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13456, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13462, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13468, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13474, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(13484, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13516, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13548, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13580, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13612, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13644, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13676, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13708, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13740, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(13772, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13804, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13836, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13868, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13900, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13932, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13964, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(13996, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(14028, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(14060, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14124, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14188, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14252, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14316, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14380, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14444, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14508, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14572, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14636, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14642, 64, - [ - new("down", ["true", "false"], 32), - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("up", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(14706, 6, - [ - new("age", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(14713, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(14716, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(14797, 2, - [ - new("age", ["0", "1"], 1) - ]), - new(14799, 10, - [ - new("age", ["0", "1", "2", "3", "4"], 2), - new("half", ["upper", "lower"], 1) - ]), - new(14809, 2, - [ - new("half", ["upper", "lower"], 1) - ]), - new(14811, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(14817, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14829, 12, - [ - new("conditional", ["true", "false"], 6), - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14841, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(14848, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(14852, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("powered", ["true", "false"], 1) - ]), - new(14864, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14870, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14876, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14882, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14888, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14894, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14900, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14906, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14912, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14918, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14924, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14930, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14936, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14942, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14948, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14954, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14960, 6, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 1) - ]), - new(14966, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14970, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14974, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14978, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14982, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14986, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14990, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14994, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(14998, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(15002, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(15006, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(15010, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(15014, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(15018, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(15022, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(15026, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(15062, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(15090, 12, - [ - new("eggs", ["1", "2", "3", "4"], 3), - new("hatch", ["0", "1", "2"], 1) - ]), - new(15102, 3, - [ - new("hatch", ["0", "1", "2"], 1) - ]), - new(15105, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("hydration", ["0", "1", "2", "3"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15147, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15149, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15151, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15153, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15155, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15157, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15159, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15161, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15163, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15165, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15167, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15169, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15171, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15173, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15175, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15177, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15179, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15181, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15183, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15185, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15187, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15195, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15203, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15211, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15219, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15227, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15235, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15243, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15251, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15259, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15267, 8, - [ - new("pickles", ["1", "2", "3", "4"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15276, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(15279, 12, - [ - new("age", ["0", "1"], 6), - new("leaves", ["none", "small", "large"], 2), - new("stage", ["0", "1"], 1) - ]), - new(15294, 2, - [ - new("drag", ["true", "false"], 1) - ]), - new(15296, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15376, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15456, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15536, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15616, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15696, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15776, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15856, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(15936, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16016, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16096, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16176, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16256, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16336, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16416, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16422, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16428, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16434, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16440, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16446, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16452, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16458, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16464, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16470, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16476, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16482, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16488, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(16494, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(16818, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17142, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17466, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(17790, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18114, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18438, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(18762, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19086, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19410, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(19734, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20058, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20382, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(20706, 32, - [ - new("bottom", ["true", "false"], 16), - new("distance", ["0", "1", "2", "3", "4", "5", "6", "7"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20738, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(20742, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("open", ["true", "false"], 1) - ]), - new(20754, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(20762, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("lit", ["true", "false"], 1) - ]), - new(20772, 12, - [ - new("face", ["floor", "wall", "ceiling"], 4), - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(20784, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("has_book", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20801, 4, - [ - new("facing", ["north", "south", "west", "east"], 1) - ]), - new(20805, 32, - [ - new("attachment", ["floor", "ceiling", "single_wall", "double_wall"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(20837, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20841, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20845, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20849, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20853, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20857, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20861, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20865, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20869, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20873, 4, - [ - new("hanging", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20877, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20909, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("lit", ["true", "false"], 4), - new("signal_fire", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(20941, 4, - [ - new("age", ["0", "1", "2", "3"], 1) - ]), - new(20945, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20948, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20951, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20954, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20962, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20965, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20968, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20971, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(20977, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(21004, 26, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 1) - ]), - new(21034, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21040, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21046, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(21048, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(21050, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(21082, 32, - [ - new("east", ["true", "false"], 16), - new("north", ["true", "false"], 8), - new("south", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(21114, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21178, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21242, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(21274, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("in_wall", ["true", "false"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(21306, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21386, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21466, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(21490, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(21514, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(21578, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(21642, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21674, 32, - [ - new("rotation", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21706, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21714, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21722, 4, - [ - new("mode", ["save", "load", "corner", "data"], 1) - ]), - new(21726, 12, - [ - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 1) - ]), - new(21738, 4, - [ - new("mode", ["start", "log", "fail", "accept"], 1) - ]), - new(21743, 9, - [ - new("level", ["0", "1", "2", "3", "4", "5", "6", "7", "8"], 1) - ]), - new(21752, 16, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 1) - ]), - new(21768, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(21792, 24, - [ - new("facing", ["north", "south", "west", "east"], 6), - new("honey_level", ["0", "1", "2", "3", "4", "5"], 1) - ]), - new(21821, 5, - [ - new("charges", ["0", "1", "2", "3", "4"], 1) - ]), - new(21832, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(21912, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(22236, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22246, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22252, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22332, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(22657, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22737, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(22743, 2, - [ - new("powered", ["true", "false"], 1) - ]), - new(22745, 24, - [ - new("face", ["floor", "wall", "ceiling"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("powered", ["true", "false"], 1) - ]), - new(22769, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(23096, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23112, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23128, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23144, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23160, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23176, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23192, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23208, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23224, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23240, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23256, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23272, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23288, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23304, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23320, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23336, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23352, 16, - [ - new("candles", ["1", "2", "3", "4"], 4), - new("lit", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23368, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23370, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23372, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23374, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23376, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23378, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23380, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23382, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23384, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23386, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23388, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23390, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23392, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23394, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23396, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23398, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23400, 2, - [ - new("lit", ["true", "false"], 1) - ]), - new(23404, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23416, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23428, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23440, 12, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23453, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23459, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23539, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(23864, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23870, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(23950, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(24276, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24282, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24362, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(24688, 5, - [ - new("potent_sulfur_state", ["dry", "wet", "dormant", "erupting", "continuous"], 1) - ]), - new(24693, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24699, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(24779, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(25104, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25110, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25190, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(25515, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25521, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25601, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(25927, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(25933, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26013, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(26338, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26344, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26424, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(26749, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26755, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(26835, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(27163, 96, - [ - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27259, 384, - [ - new("facing", ["north", "south", "west", "east"], 96), - new("power", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], 6), - new("sculk_sensor_phase", ["inactive", "active", "cooldown"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27644, 128, - [ - new("down", ["true", "false"], 64), - new("east", ["true", "false"], 32), - new("north", ["true", "false"], 16), - new("south", ["true", "false"], 8), - new("up", ["true", "false"], 4), - new("waterlogged", ["true", "false"], 2), - new("west", ["true", "false"], 1) - ]), - new(27772, 2, - [ - new("bloom", ["true", "false"], 1) - ]), - new(27774, 8, - [ - new("can_summon", ["true", "false"], 4), - new("shrieking", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27808, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27888, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(27968, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28048, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28128, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28208, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28288, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28368, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28448, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28454, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28460, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28466, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28472, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28478, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28484, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28490, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(28496, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(28560, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(28624, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(28688, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(28752, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(28816, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(28880, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(28944, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["upper", "lower"], 8), - new("hinge", ["left", "right"], 4), - new("open", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(29008, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(29072, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(29136, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(29200, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(29264, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(29328, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(29392, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(29456, 64, - [ - new("facing", ["north", "south", "west", "east"], 16), - new("half", ["top", "bottom"], 8), - new("open", ["true", "false"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(29520, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(29522, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(29524, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(29526, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(29528, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(29530, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(29532, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(29534, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(29536, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(29540, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(29544, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(29548, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(29552, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(29556, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(29560, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(29564, 4, - [ - new("lit", ["true", "false"], 2), - new("powered", ["true", "false"], 1) - ]), - new(29568, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(29592, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(29616, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(29640, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(29664, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(29688, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(29712, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(29736, 24, - [ - new("type", ["single", "left", "right"], 2), - new("facing", ["north", "south", "west", "east"], 6), - new("waterlogged", ["true", "false"], 1) - ]), - new(29760, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(29792, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(29824, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(29856, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(29888, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(29920, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(29952, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(29984, 32, - [ - new("copper_golem_pose", ["standing", "sitting", "running", "star"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(30016, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(30040, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(30064, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(30088, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(30112, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(30136, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(30160, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(30184, 24, - [ - new("facing", ["north", "east", "south", "west", "up", "down"], 4), - new("powered", ["true", "false"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(30209, 20, - [ - new("thickness", ["tip_merge", "tip", "frustum", "middle", "base"], 4), - new("vertical_direction", ["up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(30229, 20, - [ - new("thickness", ["tip_merge", "tip", "frustum", "middle", "base"], 4), - new("vertical_direction", ["up", "down"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(30249, 52, - [ - new("age", ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"], 2), - new("berries", ["true", "false"], 1) - ]), - new(30301, 2, - [ - new("berries", ["true", "false"], 1) - ]), - new(30307, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("flower_amount", ["1", "2", "3", "4"], 1) - ]), - new(30323, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("flower_amount", ["1", "2", "3", "4"], 1) - ]), - new(30339, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("segment_amount", ["1", "2", "3", "4"], 1) - ]), - new(30356, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("tilt", ["none", "unstable", "partial", "full"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(30388, 8, - [ - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(30396, 16, - [ - new("facing", ["north", "south", "west", "east"], 4), - new("half", ["upper", "lower"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(30412, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(30416, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(30420, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(30500, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(30506, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(30831, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(30911, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(30917, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(31242, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(31322, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(31328, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(31653, 80, - [ - new("facing", ["north", "south", "west", "east"], 20), - new("half", ["top", "bottom"], 10), - new("shape", ["straight", "inner_left", "inner_right", "outer_left", "outer_right"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(31733, 6, - [ - new("type", ["top", "bottom", "double"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(31739, 324, - [ - new("east", ["none", "low", "tall"], 108), - new("north", ["none", "low", "tall"], 36), - new("south", ["none", "low", "tall"], 12), - new("up", ["true", "false"], 6), - new("waterlogged", ["true", "false"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(32066, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(32075, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(32078, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(32081, 3, - [ - new("axis", ["x", "y", "z"], 1) - ]), - new(32086, 16, - [ - new("cracked", ["true", "false"], 8), - new("facing", ["north", "south", "west", "east"], 2), - new("waterlogged", ["true", "false"], 1) - ]), - new(32102, 48, - [ - new("crafting", ["true", "false"], 24), - new("orientation", ["down_east", "down_north", "down_south", "down_west", "up_east", "up_north", "up_south", "up_west", "west_up", "east_up", "north_up", "south_up"], 2), - new("triggered", ["true", "false"], 1) - ]), - new(32150, 12, - [ - new("ominous", ["true", "false"], 6), - new("trial_spawner_state", ["inactive", "waiting_for_players", "active", "waiting_for_reward_ejection", "ejecting_reward", "cooldown"], 1) - ]), - new(32162, 32, - [ - new("facing", ["north", "south", "west", "east"], 8), - new("ominous", ["true", "false"], 4), - new("vault_state", ["inactive", "active", "unlocking", "ejecting"], 1) - ]), - new(32194, 2, - [ - new("waterlogged", ["true", "false"], 1) - ]), - new(32197, 162, - [ - new("bottom", ["true", "false"], 81), - new("east", ["none", "low", "tall"], 27), - new("north", ["none", "low", "tall"], 9), - new("south", ["none", "low", "tall"], 3), - new("west", ["none", "low", "tall"], 1) - ]), - new(32359, 2, - [ - new("tip", ["true", "false"], 1) - ]), - ]; - // - - protected override Dictionary GetDict() - { - return materials; - } - - protected override BlockStateDefinition[] GetStateDefinitions() - { - return stateDefinitions; - } - } -} diff --git a/MinecraftClient/Mapping/Chunk.cs b/MinecraftClient/Mapping/Chunk.cs deleted file mode 100644 index 4041343b23..0000000000 --- a/MinecraftClient/Mapping/Chunk.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Runtime.CompilerServices; - -namespace MinecraftClient.Mapping -{ - /// - /// Represent a chunk of terrain in a Minecraft world - /// - public class Chunk - { - public const int SizeX = 16; - public const int SizeY = 16; - public const int SizeZ = 16; - - /// - /// Blocks contained into the chunk - /// - private readonly Block[] blocks = new Block[SizeY * SizeZ * SizeX]; - - - /// - /// Read, or set the specified block - /// - /// Block X - /// Block Y - /// Block Z - /// chunk at the given location - public Block this[int blockX, int blockY, int blockZ] - { - get - { - if (blockX < 0 || blockX >= SizeX) - throw new ArgumentOutOfRangeException(nameof(blockX), "Must be between 0 and " + (SizeX - 1) + " (inclusive)"); - if (blockY < 0 || blockY >= SizeY) - throw new ArgumentOutOfRangeException(nameof(blockY), "Must be between 0 and " + (SizeY - 1) + " (inclusive)"); - if (blockZ < 0 || blockZ >= SizeZ) - throw new ArgumentOutOfRangeException(nameof(blockZ), "Must be between 0 and " + (SizeZ - 1) + " (inclusive)"); - - return blocks[(blockY << 8) | (blockZ << 4) | blockX]; - } - set - { - if (blockX < 0 || blockX >= SizeX) - throw new ArgumentOutOfRangeException(nameof(blockX), "Must be between 0 and " + (SizeX - 1) + " (inclusive)"); - if (blockY < 0 || blockY >= SizeY) - throw new ArgumentOutOfRangeException(nameof(blockY), "Must be between 0 and " + (SizeY - 1) + " (inclusive)"); - if (blockZ < 0 || blockZ >= SizeZ) - throw new ArgumentOutOfRangeException(nameof(blockZ), "Must be between 0 and " + (SizeZ - 1) + " (inclusive)"); - - blocks[(blockY << 8) | (blockZ << 4) | blockX] = value; - } - } - - /// - /// Used when parsing chunks - /// - /// Block X - /// Block Y - /// Block Z - /// Block - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public void SetWithoutCheck(int blockX, int blockY, int blockZ, Block block) - { - blocks[(blockY << 8) | (blockZ << 4) | blockX] = block; - } - - /// - /// Get block at the specified location - /// - /// Location, a modulo will be applied - /// The block - public Block GetBlock(Location location) - { - return this[location.ChunkBlockX, location.ChunkBlockY, location.ChunkBlockZ]; - } - } -} diff --git a/MinecraftClient/Mapping/ChunkColumn.cs b/MinecraftClient/Mapping/ChunkColumn.cs deleted file mode 100644 index 38f37c632d..0000000000 --- a/MinecraftClient/Mapping/ChunkColumn.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; - -namespace MinecraftClient.Mapping -{ - /// - /// Represent a column of chunks of terrain in a Minecraft world - /// - public class ChunkColumn - { - public int ColumnSize; - - public bool FullyLoaded = false; - - /// - /// Blocks contained into the chunk - /// - private readonly Chunk?[] chunks; - - /// - /// Create a new ChunkColumn - /// - public ChunkColumn(int size = 16) - { - ColumnSize = size; - chunks = new Chunk?[size]; - } - - /// - /// Get or set the specified chunk column - /// - /// ChunkColumn X - /// ChunkColumn Y - /// chunk at the given location - public Chunk? this[int chunkY] - { - get - { - return chunks[chunkY]; - } - set - { - chunks[chunkY] = value; - } - } - - /// - /// Get chunk at the specified location - /// - /// Location, a modulo will be applied - /// The chunk, or null if not loaded - public Chunk? GetChunk(Location location) - { - try - { - return this[location.ChunkY]; - } - catch (IndexOutOfRangeException) - { - return null; - } - } - } -} diff --git a/MinecraftClient/Mapping/CombatEventType.cs b/MinecraftClient/Mapping/CombatEventType.cs deleted file mode 100644 index cdafa893fa..0000000000 --- a/MinecraftClient/Mapping/CombatEventType.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace MinecraftClient.Mapping -{ - public enum CombatEventType - { - EnterCombat = 0, - EndCombat, - EntityDead - } -} diff --git a/MinecraftClient/Mapping/CommandBlockFlags.cs b/MinecraftClient/Mapping/CommandBlockFlags.cs deleted file mode 100644 index 74d920119a..0000000000 --- a/MinecraftClient/Mapping/CommandBlockFlags.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace MinecraftClient.Mapping -{ - /// - /// Represents a unit movement in the world - /// - /// - public enum CommandBlockFlags - { - TrackOutput = 0x01, - IsConditional = 0x02, - Automatic = 0x04, - } -} diff --git a/MinecraftClient/Mapping/CommandBlockMode.cs b/MinecraftClient/Mapping/CommandBlockMode.cs deleted file mode 100644 index f2f07507f3..0000000000 --- a/MinecraftClient/Mapping/CommandBlockMode.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace MinecraftClient.Mapping -{ - /// - /// Represents a unit movement in the world - /// - /// - public enum CommandBlockMode - { - Sequence = 0, - Auto = 1, - Redstone = 2, - } -} diff --git a/MinecraftClient/Mapping/Dimension.cs b/MinecraftClient/Mapping/Dimension.cs deleted file mode 100644 index f9e8380f40..0000000000 --- a/MinecraftClient/Mapping/Dimension.cs +++ /dev/null @@ -1,192 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace MinecraftClient.Mapping -{ - - /// - /// The dimension type, available after 1.16.2 - /// - public class Dimension - { - /// - /// The name of the dimension type (for example, "minecraft:overworld"). - /// - public readonly string Name; - - /// - /// Whether piglins shake and transform to zombified piglins. - /// - public readonly bool piglinSafe = false; - - /// - /// Possibly the light level(s) at which monsters can spawn. - /// - public readonly int monsterSpawnMinLightLevel = 0; - public readonly int monsterSpawnMaxLightLevel = 7; - public readonly int monsterSpawnBlockLightLimit = 0; - - /// - /// When false, compasses spin randomly. When true, nether portals can spawn zombified piglins. - /// - public readonly bool natural = true; - - /// - /// How much light the dimension has. - /// - public readonly float ambientLight = 0.0f; - - - /// - /// If set, the time of the day is the specified value. - /// Value: -1: not set - /// Value: [0, 24000]: time of the day - /// - public readonly long fixedTime = -1; - - /// - /// A resource location defining what block tag to use for infiniburn. - /// Value above 1.18.2: "#" or minecraft resource "#minecraft:...". - /// Value below 1.18.1: "" or minecraft resource "minecraft:...". - /// - public readonly string infiniburn = "#minecraft:infiniburn_overworld"; - - /// - /// Whether players can charge and use respawn anchors. - /// - public readonly bool respawnAnchorWorks = false; - - /// - /// Whether the dimension has skylight access or not. - /// - public readonly bool hasSkylight = true; - - /// - /// Whether players can use a bed to sleep. - /// - public readonly bool bedWorks = true; - - /// - /// unknown - /// Values: "minecraft:overworld", "minecraft:the_nether", "minecraft:the_end" or something else. - /// - public readonly string effects = "minecraft:overworld"; - - /// - /// Whether players with the Bad Omen effect can cause a raid. - /// - public readonly bool hasRaids = true; - - /// - /// The minimum Y level. - /// - public readonly int minY = 0; - - /// - /// The maximum Y level. - /// - public readonly int maxY = 256; - - /// - /// The maximum height. - /// - public readonly int height = 256; - - /// - /// The maximum height to which chorus fruits and nether portals can bring players within this dimension. - /// - public readonly int logicalHeight = 256; - - /// - /// The multiplier applied to coordinates when traveling to the dimension. - /// - public readonly double coordinateScale = 1.0; - - /// - /// Whether the dimensions behaves like the nether (water evaporates and sponges dry) or not. Also causes lava to spread thinner. - /// - public readonly bool ultrawarm = false; - - /// - /// Whether the dimension has a bedrock ceiling or not. When true, causes lava to spread faster. - /// - public readonly bool hasCeiling = false; - - /// - /// Default value used in version below 1.17 - /// - public Dimension() - { - Name = "minecraft:overworld"; - } - - /// - /// Create from the "Dimension Codec" NBT Tag Compound - /// - /// Dimension name - /// The dimension type (NBT Tag Compound) - public Dimension(string name, Dictionary nbt) - { - Name = name ?? throw new ArgumentNullException(nameof(name)); - - if (nbt is null) - throw new ArgumentNullException(nameof(nbt)); - - if (nbt.ContainsKey("piglin_safe")) - piglinSafe = Convert.ToBoolean(nbt["piglin_safe"]); - if (nbt.ContainsKey("monster_spawn_light_level")) - { - try - { - var monsterSpawnLightLevelObj = nbt["monster_spawn_light_level"]; - try - { - monsterSpawnMinLightLevel = monsterSpawnMaxLightLevel = Convert.ToInt32(monsterSpawnLightLevelObj); - } - catch (Exception) - { - var inclusive = (Dictionary)(((Dictionary)monsterSpawnLightLevelObj)["value"]); - monsterSpawnMinLightLevel = Convert.ToInt32(inclusive["min_inclusive"]); - monsterSpawnMaxLightLevel = Convert.ToInt32(inclusive["max_inclusive"]); - } - - } - catch (KeyNotFoundException) { } - } - if (nbt.ContainsKey("monster_spawn_block_light_limit")) - monsterSpawnBlockLightLimit = Convert.ToInt32(nbt["monster_spawn_block_light_limit"]); - if (nbt.ContainsKey("natural")) - natural = Convert.ToBoolean(nbt["natural"]); - if (nbt.ContainsKey("ambient_light")) - ambientLight = (float)Convert.ToDouble(nbt["ambient_light"]); - if (nbt.ContainsKey("fixed_time")) - fixedTime = Convert.ToInt64(nbt["fixed_time"]); - if (nbt.ContainsKey("infiniburn")) - infiniburn = Convert.ToString(nbt["infiniburn"]) ?? string.Empty; - if (nbt.ContainsKey("respawn_anchor_works")) - respawnAnchorWorks = Convert.ToBoolean(nbt["respawn_anchor_works"]); - if (nbt.ContainsKey("has_skylight")) - hasSkylight = Convert.ToBoolean(nbt["has_skylight"]); - if (nbt.ContainsKey("bed_works")) - bedWorks = Convert.ToBoolean(nbt["bed_works"]); - if (nbt.ContainsKey("effects")) - effects = Convert.ToString(nbt["effects"]) ?? string.Empty; - if (nbt.ContainsKey("has_raids")) - hasRaids = Convert.ToBoolean(nbt["has_raids"]); - if (nbt.ContainsKey("min_y")) - minY = Convert.ToInt32(nbt["min_y"]); - if (nbt.ContainsKey("height")) - height = Convert.ToInt32(nbt["height"]); - if (nbt.ContainsKey("min_y") && nbt.ContainsKey("height")) - maxY = minY + height; - if (nbt.ContainsKey("logical_height") && nbt["logical_height"].GetType() != typeof(byte)) - logicalHeight = Convert.ToInt32(nbt["logical_height"]); - if (nbt.ContainsKey("coordinate_scale")) - coordinateScale = Convert.ToDouble(nbt["coordinate_scale"]); - if (nbt.ContainsKey("ultrawarm")) - ultrawarm = Convert.ToBoolean(nbt["ultrawarm"]); - if (nbt.ContainsKey("has_ceiling")) - hasCeiling = Convert.ToBoolean(nbt["has_ceiling"]); - } - } -} diff --git a/MinecraftClient/Mapping/Direction.cs b/MinecraftClient/Mapping/Direction.cs deleted file mode 100644 index 97a2e1203d..0000000000 --- a/MinecraftClient/Mapping/Direction.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace MinecraftClient.Mapping -{ - /// - /// Represents a unit movement in the world - /// - /// - public enum Direction - { - South = 0, - West = 1, - North = 2, - East = 3, - - Up = 4, - Down = 5, - - NorthEast = 6, - SouthEast = 7, - SouthWest = 8, - NorthWest = 9, - } -} diff --git a/MinecraftClient/Mapping/DirectionExtensions.cs b/MinecraftClient/Mapping/DirectionExtensions.cs deleted file mode 100644 index 4f965cde9c..0000000000 --- a/MinecraftClient/Mapping/DirectionExtensions.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; - -namespace MinecraftClient.Mapping; - -public static class DirectionExtensions -{ - public static Direction GetOpposite(this Direction direction) => direction switch - { - Direction.SouthEast => Direction.NorthEast, - Direction.SouthWest => Direction.NorthWest, - Direction.NorthEast => Direction.SouthEast, - Direction.NorthWest => Direction.SouthWest, - Direction.West => Direction.East, - Direction.East => Direction.West, - Direction.North => Direction.South, - Direction.South => Direction.North, - Direction.Down => Direction.Up, - Direction.Up => Direction.Down, - _ => Direction.Up, - }; - - public static Direction[] HORIZONTAL = - [ - Direction.South, - Direction.West, - Direction.North, - Direction.East, - ]; - - public static Direction FromRotation(double rotation) - { - double floor = Math.Floor((rotation / 90.0) + 0.5); - int value = (int)floor & 3; - - return FromHorizontal(value); - } - - public static Direction FromHorizontal(int value) - { - return HORIZONTAL[Math.Abs(value % HORIZONTAL.Length)]; - } -} diff --git a/MinecraftClient/Mapping/Entity.cs b/MinecraftClient/Mapping/Entity.cs deleted file mode 100644 index 33b250f095..0000000000 --- a/MinecraftClient/Mapping/Entity.cs +++ /dev/null @@ -1,179 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory; -using MinecraftClient.Protocol.Message; - -namespace MinecraftClient.Mapping -{ - /// - /// Represents an entity evolving into a Minecraft world - /// - public class Entity - { - /// - /// ID of the entity on the Minecraft server - /// - public int ID; - - /// - /// UUID of the entity if it is a player. - /// - public Guid UUID; - - /// - /// Nickname of the entity if it is a player. - /// - public string? Name; - - /// - /// CustomName of the entity. - /// - public string? CustomNameJson; - - /// - /// IsCustomNameVisible of the entity. - /// - public bool IsCustomNameVisible; - - /// - /// CustomName of the entity. - /// - public string? CustomName; - - /// - /// Latency of the entity if it is a player. - /// - public int Latency; - - /// - /// Entity type - /// - public EntityType Type; - - /// - /// Entity location in the Minecraft world - /// - public Location Location; - - /// - /// Entity head yaw - /// - /// Untested - public float Yaw = 0; - - /// - /// Entity head pitch - /// - /// Untested - public float Pitch = 0; - - /// - /// Used in Item Frame, Falling Block and Fishing Float. - /// See https://wiki.vg/Object_Data for details. - /// - /// Untested - public int ObjectData = -1; - - /// - /// Health of the entity - /// - public float Health; - - /// - /// Item of the entity if ItemFrame or Item - /// - public Item Item; - - /// - /// Entity pose in the Minecraft world - /// - public EntityPose Pose; - - /// - /// Entity metadata - /// - public Dictionary? Metadata; - - /// - /// Entity equipment - /// - public Dictionary Equipment; - - /// - /// Active status effects on this entity - /// - public Dictionary ActiveEffects { get; private set; } - - /// - /// Create a new entity based on Entity ID, Entity Type and location - /// - /// Entity ID - /// Entity Type Enum - /// Entity location - public Entity(int ID, EntityType type, Location location) - { - this.ID = ID; - Type = type; - Location = location; - Health = 1.0f; - Equipment = new Dictionary(); - ActiveEffects = new Dictionary(); - Item = new Item(ItemType.Air, 0, null); - } - - /// - /// Create a new entity based on Entity ID, Entity Type and location - /// - /// Entity ID - /// Entity Type Enum - /// Entity location - public Entity(int ID, EntityType type, Location location, byte yaw, byte pitch, int objectData) - { - this.ID = ID; - Type = type; - Location = location; - Health = 1.0f; - Equipment = new Dictionary(); - ActiveEffects = new Dictionary(); - Item = new Item(ItemType.Air, 0, null); - Yaw = yaw * (1F / 256) * 360; // to angle in 360 degree - Pitch = pitch * (1F / 256) * 360; - ObjectData = objectData; - } - - /// - /// Create a new entity based on Entity ID, Entity Type, location, name and UUID - /// - /// Entity ID - /// Entity Type Enum - /// Entity location - /// Player uuid - /// Player name - public Entity(int ID, EntityType type, Location location, Guid uuid, string? name, byte yaw, byte pitch) - { - this.ID = ID; - Type = type; - Location = location; - UUID = uuid; - Name = name; - Health = 1.0f; - Equipment = new Dictionary(); - ActiveEffects = new Dictionary(); - Item = new Item(ItemType.Air, 0, null); - Yaw = yaw * (1F / 256) * 360; // to angle in 360 degree - Pitch = pitch * (1F / 256) * 360; - } - - public static string GetTypeString(EntityType type) - { - string typeStr = type.ToString(); - string? trans = ChatParser.TranslateString("entity.minecraft." + typeStr.ToUnderscoreCase()); - return string.IsNullOrEmpty(trans) ? typeStr : trans; - } - - public string GetTypeString() - { - return GetTypeString(Type); - } - } -} diff --git a/MinecraftClient/Mapping/EntityMetaDataType.cs b/MinecraftClient/Mapping/EntityMetaDataType.cs deleted file mode 100644 index 5d89f185c6..0000000000 --- a/MinecraftClient/Mapping/EntityMetaDataType.cs +++ /dev/null @@ -1,144 +0,0 @@ -namespace MinecraftClient.Mapping; - -public enum EntityMetaDataType -{ - Byte, - Short, // 1.8 only - Int, // 1.8 only - Vector3Int, // 1.8 only (not used by the game) - VarInt, - VarLong, - Float, - String, - Chat, - OptionalChat, - Slot, - Boolean, - /// - /// Float x3 - /// - Rotation, - Position, - OptionalPosition, - /// - /// VarInt - /// - Direction, - OptionalUuid, - /// - /// Boolean + UUID (1.21.5+, replaces OptionalUuid) - /// - OptionalLivingEntityReference, - /// - /// VarInt - /// - BlockId, - /// - /// VarInt (0 for absent) - /// - OptionalBlockId, - Nbt, - Particle, - /// - /// List of Particle (1.20.6+) - /// - Particles, - /// - /// VarInt x3 - /// - VillagerData, - OptionalVarInt, - /// - /// VarInt - /// - Pose, - /// - /// VarInt - /// - CatVariant, - /// - /// VarInt (1.21.5+) - /// - CatSoundVariant, - /// - /// VarInt (1.20.6+) - /// - CowVariant, - /// - /// VarInt (1.21.5+) - /// - CowSoundVariant, - /// - /// VarInt (1.20.6+) - /// - WolfVariant, - /// - /// VarInt (1.21.5+) - /// - WolfSoundVariant, - FrogVariant, - /// - /// VarInt (1.21.5+) - /// - PigVariant, - /// - /// VarInt (1.21.5+) - /// - PigSoundVariant, - /// - /// VarInt (1.21.5+) - /// - ChickenVariant, - /// - /// VarInt (1.21.5+) - /// - ChickenSoundVariant, - /// - /// String + Position - /// - GlobalPosition, - /// - /// Boolean + String + Position - /// - OptionalGlobalPosition, - /// - /// VarInt - /// - PaintingVariant, - /// - /// VarInt - /// - SnifferState, - /// - /// VarInt (1.20.6+) - /// - ArmadilloState, - /// - /// VarInt (1.21.9+) - /// - CopperGolemState, - /// - /// VarInt (1.21.9+) - /// - WeatheringCopperState, - /// - /// Float x3 - /// - Vector3, - /// - /// Float x4 - /// - Quaternion, - /// - /// Either<GameProfile, Partial> + PlayerSkin.Patch (1.21.9+) - /// - ResolvableProfile, - /// - /// VarInt (1.21.11+, holder registry ID) - /// - ZombieNautilusVariant, - /// - /// VarInt (1.21.11+, 0=LEFT, 1=RIGHT) - /// - HumanoidArm -} \ No newline at end of file diff --git a/MinecraftClient/Mapping/EntityMetadataPalette.cs b/MinecraftClient/Mapping/EntityMetadataPalette.cs deleted file mode 100644 index 85f6c1b4ba..0000000000 --- a/MinecraftClient/Mapping/EntityMetadataPalette.cs +++ /dev/null @@ -1,34 +0,0 @@ -using MinecraftClient.Mapping.EntityMetadataPalettes; -using MinecraftClient.Protocol.Handlers; -using System; -using System.Collections.Generic; - -namespace MinecraftClient.Mapping; - -public abstract class EntityMetadataPalette -{ - public abstract Dictionary GetEntityMetadataMappingsList(); - - public EntityMetaDataType GetDataType(int typeId) - { - return GetEntityMetadataMappingsList()[typeId]; - } - - public static EntityMetadataPalette GetPalette(int protocolVersion) - { - return protocolVersion switch - { - <= Protocol18Handler.MC_1_8_Version => new EntityMetadataPalette18(), // 1.8 - <= Protocol18Handler.MC_1_12_2_Version => new EntityMetadataPalette1122(), // 1.9 - 1.12.2 - <= Protocol18Handler.MC_1_19_2_Version => new EntityMetadataPalette1191(), // 1.13 - 1.19.2 - <= Protocol18Handler.MC_1_19_3_Version => new EntityMetadataPalette1193(), // 1.19.3 - < Protocol18Handler.MC_1_20_6_Version => new EntityMetadataPalette1194(), // 1.19.4 - 1.20.4 - <= Protocol18Handler.MC_1_21_4_Version => new EntityMetadataPalette1206(), // 1.20.6 - 1.21.4 - <= Protocol18Handler.MC_1_21_7_Version => new EntityMetadataPalette1215(), // 1.21.5 - 1.21.8 - <= Protocol18Handler.MC_1_21_9_Version => new EntityMetadataPalette1219(), // 1.21.9 - 1.21.10 - <= Protocol18Handler.MC_1_21_11_Version => new EntityMetadataPalette12111(), // 1.21.11 - <= Protocol18Handler.MC_26_2_Version => new EntityMetadataPalette261(), // 26.1 - 26.2 (serializers unchanged in 26.2) - _ => throw new NotImplementedException() - }; - } -} \ No newline at end of file diff --git a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1122.cs b/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1122.cs deleted file mode 100644 index 1f9e08cf2c..0000000000 --- a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1122.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityMetadataPalettes; - -public class EntityMetadataPalette1122 : EntityMetadataPalette -{ - // 1.9 - 1.12.2 - private readonly Dictionary entityMetadataMappings = new() - { - { 0, EntityMetaDataType.Byte }, - { 1, EntityMetaDataType.VarInt }, - { 2, EntityMetaDataType.Float }, - { 3, EntityMetaDataType.String }, - { 4, EntityMetaDataType.Chat }, - { 5, EntityMetaDataType.Slot }, - { 6, EntityMetaDataType.Boolean }, - { 7, EntityMetaDataType.Rotation }, - { 8, EntityMetaDataType.Position }, - { 9, EntityMetaDataType.OptionalPosition }, - { 10, EntityMetaDataType.Direction }, - { 11, EntityMetaDataType.OptionalUuid }, - { 12, EntityMetaDataType.OptionalBlockId }, - { 13, EntityMetaDataType.Nbt }, - }; - - public override Dictionary GetEntityMetadataMappingsList() - { - return entityMetadataMappings; - } -} \ No newline at end of file diff --git a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1191.cs b/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1191.cs deleted file mode 100644 index ef7f411781..0000000000 --- a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1191.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityMetadataPalettes; - -/// -/// 1.13 - 1.19.2 -/// -public class EntityMetadataPalette1191 : EntityMetadataPalette -{ - private readonly Dictionary entityMetadataMappings = new() - { - { 0, EntityMetaDataType.Byte }, - { 1, EntityMetaDataType.VarInt }, - { 2, EntityMetaDataType.Float }, - { 3, EntityMetaDataType.String }, - { 4, EntityMetaDataType.Chat }, - { 5, EntityMetaDataType.OptionalChat }, - { 6, EntityMetaDataType.Slot }, - { 7, EntityMetaDataType.Boolean }, - { 8, EntityMetaDataType.Rotation }, - { 9, EntityMetaDataType.Position }, - { 10, EntityMetaDataType.OptionalPosition }, - { 11, EntityMetaDataType.Direction }, - { 12, EntityMetaDataType.OptionalUuid }, - { 13, EntityMetaDataType.OptionalBlockId }, - { 14, EntityMetaDataType.Nbt }, - { 15, EntityMetaDataType.Particle }, - { 16, EntityMetaDataType.VillagerData }, - { 17, EntityMetaDataType.OptionalVarInt }, - { 18, EntityMetaDataType.Pose }, - { 19, EntityMetaDataType.CatVariant }, - { 20, EntityMetaDataType.FrogVariant }, - { 21, EntityMetaDataType.OptionalGlobalPosition }, - { 22, EntityMetaDataType.PaintingVariant } - }; - - public override Dictionary GetEntityMetadataMappingsList() - { - return entityMetadataMappings; - } -} \ No newline at end of file diff --git a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1193.cs b/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1193.cs deleted file mode 100644 index 664b2cfaaf..0000000000 --- a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1193.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityMetadataPalettes; - -/// -/// For 1.19.3 -/// -public class EntityMetadataPalette1193 : EntityMetadataPalette -{ - private readonly Dictionary entityMetadataMappings = new() - { - { 0, EntityMetaDataType.Byte }, - { 1, EntityMetaDataType.VarInt }, - { 2, EntityMetaDataType.VarLong }, - { 3, EntityMetaDataType.Float }, - { 4, EntityMetaDataType.String }, - { 5, EntityMetaDataType.Chat }, - { 6, EntityMetaDataType.OptionalChat }, - { 7, EntityMetaDataType.Slot }, - { 8, EntityMetaDataType.Boolean }, - { 9, EntityMetaDataType.Rotation }, - { 10, EntityMetaDataType.Position }, - { 11, EntityMetaDataType.OptionalPosition }, - { 12, EntityMetaDataType.Direction }, - { 13, EntityMetaDataType.OptionalUuid }, - { 14, EntityMetaDataType.OptionalBlockId }, - { 15, EntityMetaDataType.Nbt }, - { 16, EntityMetaDataType.Particle }, - { 17, EntityMetaDataType.VillagerData }, - { 18, EntityMetaDataType.OptionalVarInt }, - { 19, EntityMetaDataType.Pose }, - { 20, EntityMetaDataType.CatVariant }, - { 21, EntityMetaDataType.FrogVariant }, - { 22, EntityMetaDataType.OptionalGlobalPosition }, - { 23, EntityMetaDataType.PaintingVariant } - }; - - public override Dictionary GetEntityMetadataMappingsList() - { - return entityMetadataMappings; - } -} \ No newline at end of file diff --git a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1194.cs b/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1194.cs deleted file mode 100644 index 2b180afcc8..0000000000 --- a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1194.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityMetadataPalettes; - -/// -/// For 1.19.4 -/// -public class EntityMetadataPalette1194 : EntityMetadataPalette -{ - private readonly Dictionary entityMetadataMappings = new() - { - { 0, EntityMetaDataType.Byte }, - { 1, EntityMetaDataType.VarInt }, - { 2, EntityMetaDataType.VarLong }, - { 3, EntityMetaDataType.Float }, - { 4, EntityMetaDataType.String }, - { 5, EntityMetaDataType.Chat }, - { 6, EntityMetaDataType.OptionalChat }, - { 7, EntityMetaDataType.Slot }, - { 8, EntityMetaDataType.Boolean }, - { 9, EntityMetaDataType.Rotation }, - { 10, EntityMetaDataType.Position }, - { 11, EntityMetaDataType.OptionalPosition }, - { 12, EntityMetaDataType.Direction }, - { 13, EntityMetaDataType.OptionalUuid }, - { 14, EntityMetaDataType.BlockId }, - { 15, EntityMetaDataType.OptionalBlockId }, - { 16, EntityMetaDataType.Nbt }, - { 17, EntityMetaDataType.Particle }, - { 18, EntityMetaDataType.VillagerData }, - { 19, EntityMetaDataType.OptionalVarInt }, - { 20, EntityMetaDataType.Pose }, - { 21, EntityMetaDataType.CatVariant }, - { 22, EntityMetaDataType.FrogVariant }, - { 23, EntityMetaDataType.OptionalGlobalPosition }, - { 24, EntityMetaDataType.PaintingVariant }, - { 25, EntityMetaDataType.SnifferState }, - { 26, EntityMetaDataType.Vector3 }, - { 27, EntityMetaDataType.Quaternion }, - }; - - public override Dictionary GetEntityMetadataMappingsList() - { - return entityMetadataMappings; - } -} \ No newline at end of file diff --git a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1206.cs b/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1206.cs deleted file mode 100644 index 67b61cc3cc..0000000000 --- a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1206.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityMetadataPalettes; - -/// -/// For 1.20.6+ -/// Added PARTICLES (id 18), WOLF_VARIANT (id 23), ARMADILLO_STATE (id 28) -/// compared to 1.19.4 palette. -/// -public class EntityMetadataPalette1206 : EntityMetadataPalette -{ - private readonly Dictionary entityMetadataMappings = new() - { - { 0, EntityMetaDataType.Byte }, - { 1, EntityMetaDataType.VarInt }, - { 2, EntityMetaDataType.VarLong }, - { 3, EntityMetaDataType.Float }, - { 4, EntityMetaDataType.String }, - { 5, EntityMetaDataType.Chat }, - { 6, EntityMetaDataType.OptionalChat }, - { 7, EntityMetaDataType.Slot }, - { 8, EntityMetaDataType.Boolean }, - { 9, EntityMetaDataType.Rotation }, - { 10, EntityMetaDataType.Position }, - { 11, EntityMetaDataType.OptionalPosition }, - { 12, EntityMetaDataType.Direction }, - { 13, EntityMetaDataType.OptionalUuid }, - { 14, EntityMetaDataType.BlockId }, - { 15, EntityMetaDataType.OptionalBlockId }, - { 16, EntityMetaDataType.Nbt }, - { 17, EntityMetaDataType.Particle }, - { 18, EntityMetaDataType.Particles }, - { 19, EntityMetaDataType.VillagerData }, - { 20, EntityMetaDataType.OptionalVarInt }, - { 21, EntityMetaDataType.Pose }, - { 22, EntityMetaDataType.CatVariant }, - { 23, EntityMetaDataType.WolfVariant }, - { 24, EntityMetaDataType.FrogVariant }, - { 25, EntityMetaDataType.OptionalGlobalPosition }, - { 26, EntityMetaDataType.PaintingVariant }, - { 27, EntityMetaDataType.SnifferState }, - { 28, EntityMetaDataType.ArmadilloState }, - { 29, EntityMetaDataType.Vector3 }, - { 30, EntityMetaDataType.Quaternion }, - }; - - public override Dictionary GetEntityMetadataMappingsList() - { - return entityMetadataMappings; - } -} diff --git a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette12111.cs b/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette12111.cs deleted file mode 100644 index cff64189f6..0000000000 --- a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette12111.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityMetadataPalettes; - -public class EntityMetadataPalette12111 : EntityMetadataPalette -{ - private readonly Dictionary entityMetadataMappings = new() - { - { 0, EntityMetaDataType.Byte }, - { 1, EntityMetaDataType.VarInt }, - { 2, EntityMetaDataType.VarLong }, - { 3, EntityMetaDataType.Float }, - { 4, EntityMetaDataType.String }, - { 5, EntityMetaDataType.Chat }, - { 6, EntityMetaDataType.OptionalChat }, - { 7, EntityMetaDataType.Slot }, - { 8, EntityMetaDataType.Boolean }, - { 9, EntityMetaDataType.Rotation }, - { 10, EntityMetaDataType.Position }, - { 11, EntityMetaDataType.OptionalPosition }, - { 12, EntityMetaDataType.Direction }, - { 13, EntityMetaDataType.OptionalLivingEntityReference }, - { 14, EntityMetaDataType.BlockId }, - { 15, EntityMetaDataType.OptionalBlockId }, - { 16, EntityMetaDataType.Particle }, - { 17, EntityMetaDataType.Particles }, - { 18, EntityMetaDataType.VillagerData }, - { 19, EntityMetaDataType.OptionalVarInt }, - { 20, EntityMetaDataType.Pose }, - { 21, EntityMetaDataType.CatVariant }, - { 22, EntityMetaDataType.CowVariant }, - { 23, EntityMetaDataType.WolfVariant }, - { 24, EntityMetaDataType.WolfSoundVariant }, - { 25, EntityMetaDataType.FrogVariant }, - { 26, EntityMetaDataType.PigVariant }, - { 27, EntityMetaDataType.ChickenVariant }, - { 28, EntityMetaDataType.ZombieNautilusVariant }, - { 29, EntityMetaDataType.OptionalGlobalPosition }, - { 30, EntityMetaDataType.PaintingVariant }, - { 31, EntityMetaDataType.SnifferState }, - { 32, EntityMetaDataType.ArmadilloState }, - { 33, EntityMetaDataType.CopperGolemState }, - { 34, EntityMetaDataType.WeatheringCopperState }, - { 35, EntityMetaDataType.Vector3 }, - { 36, EntityMetaDataType.Quaternion }, - { 37, EntityMetaDataType.ResolvableProfile }, - { 38, EntityMetaDataType.HumanoidArm }, - }; - - public override Dictionary GetEntityMetadataMappingsList() - { - return entityMetadataMappings; - } -} diff --git a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1215.cs b/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1215.cs deleted file mode 100644 index 71653f035c..0000000000 --- a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1215.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityMetadataPalettes; - -public class EntityMetadataPalette1215 : EntityMetadataPalette -{ - private readonly Dictionary entityMetadataMappings = new() - { - { 0, EntityMetaDataType.Byte }, - { 1, EntityMetaDataType.VarInt }, - { 2, EntityMetaDataType.VarLong }, - { 3, EntityMetaDataType.Float }, - { 4, EntityMetaDataType.String }, - { 5, EntityMetaDataType.Chat }, - { 6, EntityMetaDataType.OptionalChat }, - { 7, EntityMetaDataType.Slot }, - { 8, EntityMetaDataType.Boolean }, - { 9, EntityMetaDataType.Rotation }, - { 10, EntityMetaDataType.Position }, - { 11, EntityMetaDataType.OptionalPosition }, - { 12, EntityMetaDataType.Direction }, - { 13, EntityMetaDataType.OptionalLivingEntityReference }, - { 14, EntityMetaDataType.BlockId }, - { 15, EntityMetaDataType.OptionalBlockId }, - { 16, EntityMetaDataType.Nbt }, - { 17, EntityMetaDataType.Particle }, - { 18, EntityMetaDataType.Particles }, - { 19, EntityMetaDataType.VillagerData }, - { 20, EntityMetaDataType.OptionalVarInt }, - { 21, EntityMetaDataType.Pose }, - { 22, EntityMetaDataType.CatVariant }, - { 23, EntityMetaDataType.CowVariant }, - { 24, EntityMetaDataType.WolfVariant }, - { 25, EntityMetaDataType.WolfSoundVariant }, - { 26, EntityMetaDataType.FrogVariant }, - { 27, EntityMetaDataType.PigVariant }, - { 28, EntityMetaDataType.ChickenVariant }, - { 29, EntityMetaDataType.OptionalGlobalPosition }, - { 30, EntityMetaDataType.PaintingVariant }, - { 31, EntityMetaDataType.SnifferState }, - { 32, EntityMetaDataType.ArmadilloState }, - { 33, EntityMetaDataType.Vector3 }, - { 34, EntityMetaDataType.Quaternion }, - }; - - public override Dictionary GetEntityMetadataMappingsList() - { - return entityMetadataMappings; - } -} diff --git a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1219.cs b/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1219.cs deleted file mode 100644 index 2fa5d35e10..0000000000 --- a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette1219.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityMetadataPalettes; - -public class EntityMetadataPalette1219 : EntityMetadataPalette -{ - private readonly Dictionary entityMetadataMappings = new() - { - { 0, EntityMetaDataType.Byte }, - { 1, EntityMetaDataType.VarInt }, - { 2, EntityMetaDataType.VarLong }, - { 3, EntityMetaDataType.Float }, - { 4, EntityMetaDataType.String }, - { 5, EntityMetaDataType.Chat }, - { 6, EntityMetaDataType.OptionalChat }, - { 7, EntityMetaDataType.Slot }, - { 8, EntityMetaDataType.Boolean }, - { 9, EntityMetaDataType.Rotation }, - { 10, EntityMetaDataType.Position }, - { 11, EntityMetaDataType.OptionalPosition }, - { 12, EntityMetaDataType.Direction }, - { 13, EntityMetaDataType.OptionalLivingEntityReference }, - { 14, EntityMetaDataType.BlockId }, - { 15, EntityMetaDataType.OptionalBlockId }, - { 16, EntityMetaDataType.Particle }, - { 17, EntityMetaDataType.Particles }, - { 18, EntityMetaDataType.VillagerData }, - { 19, EntityMetaDataType.OptionalVarInt }, - { 20, EntityMetaDataType.Pose }, - { 21, EntityMetaDataType.CatVariant }, - { 22, EntityMetaDataType.CowVariant }, - { 23, EntityMetaDataType.WolfVariant }, - { 24, EntityMetaDataType.WolfSoundVariant }, - { 25, EntityMetaDataType.FrogVariant }, - { 26, EntityMetaDataType.PigVariant }, - { 27, EntityMetaDataType.ChickenVariant }, - { 28, EntityMetaDataType.OptionalGlobalPosition }, - { 29, EntityMetaDataType.PaintingVariant }, - { 30, EntityMetaDataType.SnifferState }, - { 31, EntityMetaDataType.ArmadilloState }, - { 32, EntityMetaDataType.CopperGolemState }, - { 33, EntityMetaDataType.WeatheringCopperState }, - { 34, EntityMetaDataType.Vector3 }, - { 35, EntityMetaDataType.Quaternion }, - { 36, EntityMetaDataType.ResolvableProfile }, - }; - - public override Dictionary GetEntityMetadataMappingsList() - { - return entityMetadataMappings; - } -} diff --git a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette18.cs b/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette18.cs deleted file mode 100644 index 41da3b2fa6..0000000000 --- a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette18.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityMetadataPalettes; - -public class EntityMetadataPalette18 : EntityMetadataPalette -{ - // 1.8 : https://wiki.vg/index.php?title=Entity_metadata&oldid=6220 - private readonly Dictionary entityMetadataMappings = new() - { - { 0, EntityMetaDataType.Byte }, - { 1, EntityMetaDataType.Short }, - { 2, EntityMetaDataType.Int }, - { 3, EntityMetaDataType.Float }, - { 4, EntityMetaDataType.String }, - { 5, EntityMetaDataType.Slot }, - { 6, EntityMetaDataType.Vector3Int }, - { 7, EntityMetaDataType.Rotation } - }; - - public override Dictionary GetEntityMetadataMappingsList() - { - return entityMetadataMappings; - } -} \ No newline at end of file diff --git a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette261.cs b/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette261.cs deleted file mode 100644 index d604b4644e..0000000000 --- a/MinecraftClient/Mapping/EntityMetadataPalettes/EntityMetadataPalette261.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityMetadataPalettes; - -public class EntityMetadataPalette261 : EntityMetadataPalette -{ - private readonly Dictionary entityMetadataMappings = new() - { - { 0, EntityMetaDataType.Byte }, - { 1, EntityMetaDataType.VarInt }, - { 2, EntityMetaDataType.VarLong }, - { 3, EntityMetaDataType.Float }, - { 4, EntityMetaDataType.String }, - { 5, EntityMetaDataType.Chat }, - { 6, EntityMetaDataType.OptionalChat }, - { 7, EntityMetaDataType.Slot }, - { 8, EntityMetaDataType.Boolean }, - { 9, EntityMetaDataType.Rotation }, - { 10, EntityMetaDataType.Position }, - { 11, EntityMetaDataType.OptionalPosition }, - { 12, EntityMetaDataType.Direction }, - { 13, EntityMetaDataType.OptionalLivingEntityReference }, - { 14, EntityMetaDataType.BlockId }, - { 15, EntityMetaDataType.OptionalBlockId }, - { 16, EntityMetaDataType.Particle }, - { 17, EntityMetaDataType.Particles }, - { 18, EntityMetaDataType.VillagerData }, - { 19, EntityMetaDataType.OptionalVarInt }, - { 20, EntityMetaDataType.Pose }, - { 21, EntityMetaDataType.CatVariant }, - { 22, EntityMetaDataType.CatSoundVariant }, - { 23, EntityMetaDataType.CowVariant }, - { 24, EntityMetaDataType.CowSoundVariant }, - { 25, EntityMetaDataType.WolfVariant }, - { 26, EntityMetaDataType.WolfSoundVariant }, - { 27, EntityMetaDataType.FrogVariant }, - { 28, EntityMetaDataType.PigVariant }, - { 29, EntityMetaDataType.PigSoundVariant }, - { 30, EntityMetaDataType.ChickenVariant }, - { 31, EntityMetaDataType.ChickenSoundVariant }, - { 32, EntityMetaDataType.ZombieNautilusVariant }, - { 33, EntityMetaDataType.OptionalGlobalPosition }, - { 34, EntityMetaDataType.PaintingVariant }, - { 35, EntityMetaDataType.SnifferState }, - { 36, EntityMetaDataType.ArmadilloState }, - { 37, EntityMetaDataType.CopperGolemState }, - { 38, EntityMetaDataType.WeatheringCopperState }, - { 39, EntityMetaDataType.Vector3 }, - { 40, EntityMetaDataType.Quaternion }, - { 41, EntityMetaDataType.ResolvableProfile }, - { 42, EntityMetaDataType.HumanoidArm }, - }; - - public override Dictionary GetEntityMetadataMappingsList() - { - return entityMetadataMappings; - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette.cs deleted file mode 100644 index 0873d5d448..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - public abstract class EntityPalette - { - /// - /// Get mapping dictionary. Must be overriden with proper implementation. - /// - /// Palette dictionary - protected abstract Dictionary GetDict(); - - /// - /// Get mapping dictionary for pre-1.14 non-living entities. - /// - /// Palette dictionary for non-living entities (pre-1.14) - protected virtual Dictionary? GetDictNonLiving() - { - return null; - } - - /// - /// Get entity type from type ID - /// - /// Entity type ID - /// EntityType corresponding to the specified ID - public EntityType FromId(int id, bool living) - { - Dictionary entityTypes = GetDict(); - Dictionary? entityTypesNonLiving = GetDictNonLiving(); - - if (entityTypesNonLiving is not null && !living) - { - //Pre-1.14 non-living entities have a different set of IDs (entityTypesNonLiving is not null) - if (entityTypesNonLiving.ContainsKey(id)) - return entityTypesNonLiving[id]; - } - else - { - //1.14+ entities have the same set of IDs regardless of living status - if (entityTypes.ContainsKey(id)) - return entityTypes[id]; - } - - throw new System.IO.InvalidDataException("Unknown Entity ID " + id + ". Is Entity Palette up to date for this Minecraft version?"); - } - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette11194.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette11194.cs deleted file mode 100644 index c715e07a7b..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette11194.cs +++ /dev/null @@ -1,142 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - public class EntityPalette1194 : EntityPalette - { - private static readonly Dictionary mappings = new(); - - static EntityPalette1194() - { - mappings[0] = EntityType.Allay; - mappings[1] = EntityType.AreaEffectCloud; - mappings[2] = EntityType.ArmorStand; - mappings[3] = EntityType.Arrow; - mappings[4] = EntityType.Axolotl; - mappings[5] = EntityType.Bat; - mappings[6] = EntityType.Bee; - mappings[7] = EntityType.Blaze; - mappings[8] = EntityType.BlockDisplay; - mappings[9] = EntityType.Boat; - mappings[10] = EntityType.Camel; - mappings[11] = EntityType.Cat; - mappings[12] = EntityType.CaveSpider; - mappings[13] = EntityType.ChestBoat; - mappings[14] = EntityType.ChestMinecart; - mappings[15] = EntityType.Chicken; - mappings[16] = EntityType.Cod; - mappings[17] = EntityType.CommandBlockMinecart; - mappings[18] = EntityType.Cow; - mappings[19] = EntityType.Creeper; - mappings[20] = EntityType.Dolphin; - mappings[21] = EntityType.Donkey; - mappings[22] = EntityType.DragonFireball; - mappings[23] = EntityType.Drowned; - mappings[24] = EntityType.Egg; - mappings[25] = EntityType.ElderGuardian; - mappings[26] = EntityType.EndCrystal; - mappings[27] = EntityType.EnderDragon; - mappings[28] = EntityType.EnderPearl; - mappings[29] = EntityType.Enderman; - mappings[30] = EntityType.Endermite; - mappings[31] = EntityType.Evoker; - mappings[32] = EntityType.EvokerFangs; - mappings[33] = EntityType.ExperienceBottle; - mappings[34] = EntityType.ExperienceOrb; - mappings[35] = EntityType.EyeOfEnder; - mappings[36] = EntityType.FallingBlock; - mappings[57] = EntityType.Fireball; - mappings[37] = EntityType.FireworkRocket; - mappings[123] = EntityType.FishingBobber; - mappings[38] = EntityType.Fox; - mappings[39] = EntityType.Frog; - mappings[40] = EntityType.FurnaceMinecart; - mappings[41] = EntityType.Ghast; - mappings[42] = EntityType.Giant; - mappings[43] = EntityType.GlowItemFrame; - mappings[44] = EntityType.GlowSquid; - mappings[45] = EntityType.Goat; - mappings[46] = EntityType.Guardian; - mappings[47] = EntityType.Hoglin; - mappings[48] = EntityType.HopperMinecart; - mappings[49] = EntityType.Horse; - mappings[50] = EntityType.Husk; - mappings[51] = EntityType.Illusioner; - mappings[52] = EntityType.Interaction; - mappings[53] = EntityType.IronGolem; - mappings[54] = EntityType.Item; - mappings[55] = EntityType.ItemDisplay; - mappings[56] = EntityType.ItemFrame; - mappings[58] = EntityType.LeashKnot; - mappings[59] = EntityType.LightningBolt; - mappings[60] = EntityType.Llama; - mappings[61] = EntityType.LlamaSpit; - mappings[62] = EntityType.MagmaCube; - mappings[63] = EntityType.Marker; - mappings[64] = EntityType.Minecart; - mappings[65] = EntityType.Mooshroom; - mappings[66] = EntityType.Mule; - mappings[67] = EntityType.Ocelot; - mappings[68] = EntityType.Painting; - mappings[69] = EntityType.Panda; - mappings[70] = EntityType.Parrot; - mappings[71] = EntityType.Phantom; - mappings[72] = EntityType.Pig; - mappings[73] = EntityType.Piglin; - mappings[74] = EntityType.PiglinBrute; - mappings[75] = EntityType.Pillager; - mappings[122] = EntityType.Player; - mappings[76] = EntityType.PolarBear; - mappings[77] = EntityType.Potion; - mappings[78] = EntityType.Pufferfish; - mappings[79] = EntityType.Rabbit; - mappings[80] = EntityType.Ravager; - mappings[81] = EntityType.Salmon; - mappings[82] = EntityType.Sheep; - mappings[83] = EntityType.Shulker; - mappings[84] = EntityType.ShulkerBullet; - mappings[85] = EntityType.Silverfish; - mappings[86] = EntityType.Skeleton; - mappings[87] = EntityType.SkeletonHorse; - mappings[88] = EntityType.Slime; - mappings[89] = EntityType.SmallFireball; - mappings[90] = EntityType.Sniffer; - mappings[91] = EntityType.SnowGolem; - mappings[92] = EntityType.Snowball; - mappings[93] = EntityType.SpawnerMinecart; - mappings[94] = EntityType.SpectralArrow; - mappings[95] = EntityType.Spider; - mappings[96] = EntityType.Squid; - mappings[97] = EntityType.Stray; - mappings[98] = EntityType.Strider; - mappings[99] = EntityType.Tadpole; - mappings[100] = EntityType.TextDisplay; - mappings[101] = EntityType.Tnt; - mappings[102] = EntityType.TntMinecart; - mappings[103] = EntityType.TraderLlama; - mappings[104] = EntityType.Trident; - mappings[105] = EntityType.TropicalFish; - mappings[106] = EntityType.Turtle; - mappings[107] = EntityType.Vex; - mappings[108] = EntityType.Villager; - mappings[109] = EntityType.Vindicator; - mappings[110] = EntityType.WanderingTrader; - mappings[111] = EntityType.Warden; - mappings[112] = EntityType.Witch; - mappings[113] = EntityType.Wither; - mappings[114] = EntityType.WitherSkeleton; - mappings[115] = EntityType.WitherSkull; - mappings[116] = EntityType.Wolf; - mappings[117] = EntityType.Zoglin; - mappings[118] = EntityType.Zombie; - mappings[119] = EntityType.ZombieHorse; - mappings[120] = EntityType.ZombieVillager; - mappings[121] = EntityType.ZombifiedPiglin; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette112.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette112.cs deleted file mode 100644 index b52595086e..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette112.cs +++ /dev/null @@ -1,141 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - /// - /// Defines mappings of entitiy IDs for 1.12.2 and below - /// Generated by ReinforceZwei using custom script - /// Data source: https://github.com/PrismarineJS/minecraft-data - /// - public class EntityPalette112 : EntityPalette - { - private static Dictionary mappingsObjects = new() - { - // https://wiki.vg/Entity_metadata#Objects - { 1, EntityType.Boat }, - { 2, EntityType.Item }, - { 3, EntityType.AreaEffectCloud }, - { 10, EntityType.Minecart }, - { 50, EntityType.Tnt }, - { 51, EntityType.EndCrystal }, - { 60, EntityType.Arrow }, - { 61, EntityType.Snowball }, - { 62, EntityType.Egg }, - { 63, EntityType.Fireball }, - { 64, EntityType.SmallFireball }, - { 65, EntityType.EnderPearl }, - { 66, EntityType.WitherSkull }, - { 67, EntityType.ShulkerBullet }, - { 68, EntityType.LlamaSpit }, - { 70, EntityType.FallingBlock }, - { 71, EntityType.ItemFrame }, - { 72, EntityType.EyeOfEnder }, - { 73, EntityType.Egg }, - { 75, EntityType.Snowball }, - { 76, EntityType.FireworkRocket }, - { 77, EntityType.LeashKnot }, - { 78, EntityType.ArmorStand }, - { 79, EntityType.EvokerFangs }, - { 90, EntityType.FishingBobber }, - { 91, EntityType.SpectralArrow }, - { 93, EntityType.DragonFireball }, - }; - - private static Dictionary mappingsMobs = new() - { - { 1, EntityType.Item }, - { 2, EntityType.ExperienceOrb }, - { 3, EntityType.AreaEffectCloud }, - { 4, EntityType.ElderGuardian }, - { 5, EntityType.WitherSkeleton }, - { 6, EntityType.Stray }, - { 7, EntityType.Egg }, - { 8, EntityType.LeashKnot }, - { 9, EntityType.Painting }, - { 10, EntityType.Arrow }, - { 11, EntityType.Snowball }, - { 12, EntityType.Fireball }, - { 13, EntityType.SmallFireball }, - { 14, EntityType.EnderPearl }, - { 15, EntityType.EyeOfEnder }, - { 16, EntityType.Potion }, - { 17, EntityType.ExperienceBottle }, - { 18, EntityType.ItemFrame }, - { 19, EntityType.WitherSkull }, - { 20, EntityType.Tnt }, - { 21, EntityType.FallingBlock }, - { 22, EntityType.FireworkRocket }, - { 23, EntityType.Husk }, - { 24, EntityType.SpectralArrow }, - { 25, EntityType.ShulkerBullet }, - { 26, EntityType.DragonFireball }, - { 27, EntityType.ZombieVillager }, - { 28, EntityType.SkeletonHorse }, - { 29, EntityType.ZombieHorse }, - { 30, EntityType.ArmorStand }, - { 31, EntityType.Donkey }, - { 32, EntityType.Mule }, - { 33, EntityType.EvokerFangs }, - { 34, EntityType.Evoker }, - { 35, EntityType.Vex }, - { 36, EntityType.Vindicator }, - { 37, EntityType.Illusioner }, - { 40, EntityType.CommandBlockMinecart }, - { 41, EntityType.Boat }, - { 42, EntityType.Minecart }, - { 43, EntityType.ChestMinecart }, - { 44, EntityType.FurnaceMinecart }, - { 45, EntityType.TntMinecart }, - { 46, EntityType.HopperMinecart }, - { 47, EntityType.SpawnerMinecart }, - { 50, EntityType.Creeper }, - { 51, EntityType.Skeleton }, - { 52, EntityType.Spider }, - { 53, EntityType.Giant }, - { 54, EntityType.Zombie }, - { 55, EntityType.Slime }, - { 56, EntityType.Ghast }, - { 57, EntityType.ZombifiedPiglin }, - { 58, EntityType.Enderman }, - { 59, EntityType.CaveSpider }, - { 60, EntityType.Silverfish }, - { 61, EntityType.Blaze }, - { 62, EntityType.MagmaCube }, - { 63, EntityType.EnderDragon }, - { 64, EntityType.Wither }, - { 65, EntityType.Bat }, - { 66, EntityType.Witch }, - { 67, EntityType.Endermite }, - { 68, EntityType.Guardian }, - { 69, EntityType.Shulker }, - { 90, EntityType.Pig }, - { 91, EntityType.Sheep }, - { 92, EntityType.Cow }, - { 93, EntityType.Chicken }, - { 94, EntityType.Squid }, - { 95, EntityType.Wolf }, - { 96, EntityType.Mooshroom }, - { 97, EntityType.SnowGolem }, - { 98, EntityType.Ocelot }, - { 99, EntityType.IronGolem }, - { 100, EntityType.Horse }, - { 101, EntityType.Rabbit }, - { 102, EntityType.PolarBear }, - { 103, EntityType.Llama }, - { 104, EntityType.LlamaSpit }, - { 105, EntityType.Parrot }, - { 120, EntityType.Villager }, - { 200, EntityType.EndCrystal }, - }; - - protected override Dictionary GetDict() - { - return mappingsMobs; - } - - protected override Dictionary GetDictNonLiving() - { - return mappingsObjects; - } - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette113.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette113.cs deleted file mode 100644 index ab19e391af..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette113.cs +++ /dev/null @@ -1,155 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - /// - /// Defines mappings for Minecraft 1.13. - /// 1.13 and lower has 2 set of ids: One for non-living objects and one for living mobs - /// 1.14+ has only one set of ids for all types of entities - /// - public class EntityPalette113 : EntityPalette - { - private static Dictionary mappingsObjects = new() - { - // https://wiki.vg/Entity_metadata#Objects - { 1, EntityType.Boat }, - { 2, EntityType.Item }, - { 3, EntityType.AreaEffectCloud }, - { 10, EntityType.Minecart }, - { 50, EntityType.Tnt }, - { 51, EntityType.EndCrystal }, - { 60, EntityType.Arrow }, - { 61, EntityType.Snowball }, - { 62, EntityType.Egg }, - { 63, EntityType.Fireball }, - { 64, EntityType.SmallFireball }, - { 65, EntityType.EnderPearl }, - { 66, EntityType.WitherSkull }, - { 67, EntityType.ShulkerBullet }, - { 68, EntityType.LlamaSpit }, - { 70, EntityType.FallingBlock }, - { 71, EntityType.ItemFrame }, - { 72, EntityType.EyeOfEnder }, - { 73, EntityType.Potion }, - { 75, EntityType.ExperienceBottle }, - { 76, EntityType.FireworkRocket }, - { 77, EntityType.LeashKnot }, - { 78, EntityType.ArmorStand }, - { 79, EntityType.EvokerFangs }, - { 90, EntityType.FishingBobber }, - { 91, EntityType.SpectralArrow }, - { 93, EntityType.DragonFireball }, - { 94, EntityType.Trident }, - }; - - private static Dictionary mappingsMobs = new() - { - // https://wiki.vg/Entity_metadata#Mobs - { 0, EntityType.AreaEffectCloud }, - { 1, EntityType.ArmorStand }, - { 2, EntityType.Arrow }, - { 3, EntityType.Bat }, - { 4, EntityType.Blaze }, - { 5, EntityType.Boat }, - { 6, EntityType.CaveSpider }, - { 7, EntityType.Chicken }, - { 8, EntityType.Cod }, - { 9, EntityType.Cow }, - { 10, EntityType.Creeper }, - { 11, EntityType.Donkey }, - { 12, EntityType.Dolphin }, - { 13, EntityType.DragonFireball }, - { 14, EntityType.Drowned }, - { 15, EntityType.ElderGuardian }, - { 16, EntityType.EndCrystal }, - { 17, EntityType.EnderDragon }, - { 18, EntityType.Enderman }, - { 19, EntityType.Endermite }, - { 20, EntityType.EvokerFangs }, - { 21, EntityType.Evoker }, - { 22, EntityType.ExperienceBottle }, - { 23, EntityType.EyeOfEnder }, - { 24, EntityType.FallingBlock }, - { 25, EntityType.FireworkRocket }, - { 26, EntityType.Ghast }, - { 27, EntityType.Giant }, - { 28, EntityType.Guardian }, - { 29, EntityType.Horse }, - { 30, EntityType.Husk }, - { 31, EntityType.Illusioner }, - { 32, EntityType.Item }, - { 33, EntityType.ItemFrame }, - { 34, EntityType.Fireball }, - { 35, EntityType.LeashKnot }, - { 36, EntityType.Llama }, - { 37, EntityType.LlamaSpit }, - { 38, EntityType.MagmaCube }, - { 39, EntityType.Minecart }, - { 40, EntityType.ChestMinecart }, - { 41, EntityType.CommandBlockMinecart }, - { 42, EntityType.FurnaceMinecart }, - { 43, EntityType.HopperMinecart }, - { 44, EntityType.SpawnerMinecart }, - { 45, EntityType.TntMinecart }, - { 46, EntityType.Mule }, - { 47, EntityType.Mooshroom }, - { 48, EntityType.Ocelot }, - { 49, EntityType.Painting }, - { 50, EntityType.Parrot }, - { 51, EntityType.Pig }, - { 52, EntityType.Pufferfish }, - { 53, EntityType.ZombifiedPiglin }, - { 54, EntityType.PolarBear }, - { 55, EntityType.Tnt }, - { 56, EntityType.Rabbit }, - { 57, EntityType.Salmon }, - { 58, EntityType.Sheep }, - { 59, EntityType.Shulker }, - { 60, EntityType.ShulkerBullet }, - { 61, EntityType.Silverfish }, - { 62, EntityType.Skeleton }, - { 63, EntityType.SkeletonHorse }, - { 64, EntityType.Slime }, - { 65, EntityType.SmallFireball }, - { 66, EntityType.SnowGolem }, - { 67, EntityType.Snowball }, - { 68, EntityType.SpectralArrow }, - { 69, EntityType.Spider }, - { 70, EntityType.Squid }, - { 71, EntityType.Stray }, - { 72, EntityType.TropicalFish }, - { 73, EntityType.Turtle }, - { 74, EntityType.Egg }, - { 75, EntityType.EnderPearl }, - { 76, EntityType.ExperienceBottle }, - { 77, EntityType.Potion }, - { 78, EntityType.Vex }, - { 79, EntityType.Villager }, - { 80, EntityType.IronGolem }, - { 81, EntityType.Vindicator }, - { 82, EntityType.Witch }, - { 83, EntityType.Wither }, - { 84, EntityType.WitherSkeleton }, - { 85, EntityType.WitherSkull }, - { 86, EntityType.Wolf }, - { 87, EntityType.Zombie }, - { 88, EntityType.ZombieHorse }, - { 89, EntityType.ZombieVillager }, - { 90, EntityType.Phantom }, - { 91, EntityType.LightningBolt }, - { 92, EntityType.Player }, - { 93, EntityType.FishingBobber }, - { 94, EntityType.Trident }, - }; - - protected override Dictionary GetDict() - { - return mappingsMobs; - } - - protected override Dictionary GetDictNonLiving() - { - return mappingsObjects; - } - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette114.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette114.cs deleted file mode 100644 index 403fcc0080..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette114.cs +++ /dev/null @@ -1,124 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - /// - /// Defines mappings for Minecraft 1.14. - /// Automatically generated using EntityPaletteGenerator.cs - /// - public class EntityPalette114 : EntityPalette - { - private static readonly Dictionary mappings = new(); - - static EntityPalette114() - { - mappings[0] = EntityType.AreaEffectCloud; - mappings[1] = EntityType.ArmorStand; - mappings[2] = EntityType.Arrow; - mappings[3] = EntityType.Bat; - mappings[4] = EntityType.Blaze; - mappings[5] = EntityType.Boat; - mappings[6] = EntityType.Cat; - mappings[7] = EntityType.CaveSpider; - mappings[8] = EntityType.Chicken; - mappings[9] = EntityType.Cod; - mappings[10] = EntityType.Cow; - mappings[11] = EntityType.Creeper; - mappings[12] = EntityType.Donkey; - mappings[13] = EntityType.Dolphin; - mappings[14] = EntityType.DragonFireball; - mappings[15] = EntityType.Drowned; - mappings[16] = EntityType.ElderGuardian; - mappings[17] = EntityType.EndCrystal; - mappings[18] = EntityType.EnderDragon; - mappings[19] = EntityType.Enderman; - mappings[20] = EntityType.Endermite; - mappings[21] = EntityType.EvokerFangs; - mappings[22] = EntityType.Evoker; - mappings[23] = EntityType.ExperienceOrb; - mappings[24] = EntityType.EyeOfEnder; - mappings[25] = EntityType.FallingBlock; - mappings[26] = EntityType.FireworkRocket; - mappings[27] = EntityType.Fox; - mappings[28] = EntityType.Ghast; - mappings[29] = EntityType.Giant; - mappings[30] = EntityType.Guardian; - mappings[31] = EntityType.Horse; - mappings[32] = EntityType.Husk; - mappings[33] = EntityType.Illusioner; - mappings[34] = EntityType.Item; - mappings[35] = EntityType.ItemFrame; - mappings[36] = EntityType.Fireball; - mappings[37] = EntityType.LeashKnot; - mappings[38] = EntityType.Llama; - mappings[39] = EntityType.LlamaSpit; - mappings[40] = EntityType.MagmaCube; - mappings[41] = EntityType.Minecart; - mappings[42] = EntityType.ChestMinecart; - mappings[43] = EntityType.CommandBlockMinecart; - mappings[44] = EntityType.FurnaceMinecart; - mappings[45] = EntityType.HopperMinecart; - mappings[46] = EntityType.SpawnerMinecart; - mappings[47] = EntityType.TntMinecart; - mappings[48] = EntityType.Mule; - mappings[49] = EntityType.Mooshroom; - mappings[50] = EntityType.Ocelot; - mappings[51] = EntityType.Painting; - mappings[52] = EntityType.Panda; - mappings[53] = EntityType.Parrot; - mappings[54] = EntityType.Pig; - mappings[55] = EntityType.Pufferfish; - mappings[56] = EntityType.ZombifiedPiglin; - mappings[57] = EntityType.PolarBear; - mappings[58] = EntityType.Tnt; - mappings[59] = EntityType.Rabbit; - mappings[60] = EntityType.Salmon; - mappings[61] = EntityType.Sheep; - mappings[62] = EntityType.Shulker; - mappings[63] = EntityType.ShulkerBullet; - mappings[64] = EntityType.Silverfish; - mappings[65] = EntityType.Skeleton; - mappings[66] = EntityType.SkeletonHorse; - mappings[67] = EntityType.Slime; - mappings[68] = EntityType.SmallFireball; - mappings[69] = EntityType.SnowGolem; - mappings[70] = EntityType.Snowball; - mappings[71] = EntityType.SpectralArrow; - mappings[72] = EntityType.Spider; - mappings[73] = EntityType.Squid; - mappings[74] = EntityType.Stray; - mappings[75] = EntityType.TraderLlama; - mappings[76] = EntityType.TropicalFish; - mappings[77] = EntityType.Turtle; - mappings[78] = EntityType.Egg; - mappings[79] = EntityType.EnderPearl; - mappings[80] = EntityType.ExperienceBottle; - mappings[81] = EntityType.Potion; - mappings[82] = EntityType.Trident; - mappings[83] = EntityType.Vex; - mappings[84] = EntityType.Villager; - mappings[85] = EntityType.IronGolem; - mappings[86] = EntityType.Vindicator; - mappings[87] = EntityType.Pillager; - mappings[88] = EntityType.WanderingTrader; - mappings[89] = EntityType.Witch; - mappings[90] = EntityType.Wither; - mappings[91] = EntityType.WitherSkeleton; - mappings[92] = EntityType.WitherSkull; - mappings[93] = EntityType.Wolf; - mappings[94] = EntityType.Zombie; - mappings[95] = EntityType.ZombieHorse; - mappings[96] = EntityType.ZombieVillager; - mappings[97] = EntityType.Phantom; - mappings[98] = EntityType.Ravager; - mappings[99] = EntityType.LightningBolt; - mappings[100] = EntityType.Player; - mappings[101] = EntityType.FishingBobber; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette115.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette115.cs deleted file mode 100644 index bd4887bef4..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette115.cs +++ /dev/null @@ -1,125 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - /// - /// Defines mappings for Minecraft 1.15. - /// Automatically generated using EntityPaletteGenerator.cs - /// - public class EntityPalette115 : EntityPalette - { - private static readonly Dictionary mappings = new(); - - static EntityPalette115() - { - mappings[0] = EntityType.AreaEffectCloud; - mappings[1] = EntityType.ArmorStand; - mappings[2] = EntityType.Arrow; - mappings[3] = EntityType.Bat; - mappings[4] = EntityType.Bee; - mappings[5] = EntityType.Blaze; - mappings[6] = EntityType.Boat; - mappings[7] = EntityType.Cat; - mappings[8] = EntityType.CaveSpider; - mappings[9] = EntityType.Chicken; - mappings[10] = EntityType.Cod; - mappings[11] = EntityType.Cow; - mappings[12] = EntityType.Creeper; - mappings[13] = EntityType.Donkey; - mappings[14] = EntityType.Dolphin; - mappings[15] = EntityType.DragonFireball; - mappings[16] = EntityType.Drowned; - mappings[17] = EntityType.ElderGuardian; - mappings[18] = EntityType.EndCrystal; - mappings[19] = EntityType.EnderDragon; - mappings[20] = EntityType.Enderman; - mappings[21] = EntityType.Endermite; - mappings[22] = EntityType.EvokerFangs; - mappings[23] = EntityType.Evoker; - mappings[24] = EntityType.ExperienceOrb; - mappings[25] = EntityType.EyeOfEnder; - mappings[26] = EntityType.FallingBlock; - mappings[27] = EntityType.FireworkRocket; - mappings[28] = EntityType.Fox; - mappings[29] = EntityType.Ghast; - mappings[30] = EntityType.Giant; - mappings[31] = EntityType.Guardian; - mappings[32] = EntityType.Horse; - mappings[33] = EntityType.Husk; - mappings[34] = EntityType.Illusioner; - mappings[35] = EntityType.Item; - mappings[36] = EntityType.ItemFrame; - mappings[37] = EntityType.Fireball; - mappings[38] = EntityType.LeashKnot; - mappings[39] = EntityType.Llama; - mappings[40] = EntityType.LlamaSpit; - mappings[41] = EntityType.MagmaCube; - mappings[42] = EntityType.Minecart; - mappings[43] = EntityType.ChestMinecart; - mappings[44] = EntityType.CommandBlockMinecart; - mappings[45] = EntityType.FurnaceMinecart; - mappings[46] = EntityType.HopperMinecart; - mappings[47] = EntityType.SpawnerMinecart; - mappings[48] = EntityType.TntMinecart; - mappings[49] = EntityType.Mule; - mappings[50] = EntityType.Mooshroom; - mappings[51] = EntityType.Ocelot; - mappings[52] = EntityType.Painting; - mappings[53] = EntityType.Panda; - mappings[54] = EntityType.Parrot; - mappings[55] = EntityType.Pig; - mappings[56] = EntityType.Pufferfish; - mappings[57] = EntityType.ZombifiedPiglin; - mappings[58] = EntityType.PolarBear; - mappings[59] = EntityType.Tnt; - mappings[60] = EntityType.Rabbit; - mappings[61] = EntityType.Salmon; - mappings[62] = EntityType.Sheep; - mappings[63] = EntityType.Shulker; - mappings[64] = EntityType.ShulkerBullet; - mappings[65] = EntityType.Silverfish; - mappings[66] = EntityType.Skeleton; - mappings[67] = EntityType.SkeletonHorse; - mappings[68] = EntityType.Slime; - mappings[69] = EntityType.SmallFireball; - mappings[70] = EntityType.SnowGolem; - mappings[71] = EntityType.Snowball; - mappings[72] = EntityType.SpectralArrow; - mappings[73] = EntityType.Spider; - mappings[74] = EntityType.Squid; - mappings[75] = EntityType.Stray; - mappings[76] = EntityType.TraderLlama; - mappings[77] = EntityType.TropicalFish; - mappings[78] = EntityType.Turtle; - mappings[79] = EntityType.Egg; - mappings[80] = EntityType.EnderPearl; - mappings[81] = EntityType.ExperienceBottle; - mappings[82] = EntityType.Potion; - mappings[83] = EntityType.Trident; - mappings[84] = EntityType.Vex; - mappings[85] = EntityType.Villager; - mappings[86] = EntityType.IronGolem; - mappings[87] = EntityType.Vindicator; - mappings[88] = EntityType.Pillager; - mappings[89] = EntityType.WanderingTrader; - mappings[90] = EntityType.Witch; - mappings[91] = EntityType.Wither; - mappings[92] = EntityType.WitherSkeleton; - mappings[93] = EntityType.WitherSkull; - mappings[94] = EntityType.Wolf; - mappings[95] = EntityType.Zombie; - mappings[96] = EntityType.ZombieHorse; - mappings[97] = EntityType.ZombieVillager; - mappings[98] = EntityType.Phantom; - mappings[99] = EntityType.Ravager; - mappings[100] = EntityType.LightningBolt; - mappings[101] = EntityType.Player; - mappings[102] = EntityType.FishingBobber; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette1161.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette1161.cs deleted file mode 100644 index 4de8bdca56..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette1161.cs +++ /dev/null @@ -1,125 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - public class EntityPalette1161 : EntityPalette - { - private static readonly Dictionary mappings = new(); - - static EntityPalette1161() - { - mappings[0] = EntityType.AreaEffectCloud; - mappings[1] = EntityType.ArmorStand; - mappings[2] = EntityType.Arrow; - mappings[3] = EntityType.Bat; - mappings[4] = EntityType.Bee; - mappings[5] = EntityType.Blaze; - mappings[6] = EntityType.Boat; - mappings[7] = EntityType.Cat; - mappings[8] = EntityType.CaveSpider; - mappings[9] = EntityType.Chicken; - mappings[10] = EntityType.Cod; - mappings[11] = EntityType.Cow; - mappings[12] = EntityType.Creeper; - mappings[13] = EntityType.Dolphin; - mappings[14] = EntityType.Donkey; - mappings[15] = EntityType.DragonFireball; - mappings[16] = EntityType.Drowned; - mappings[17] = EntityType.ElderGuardian; - mappings[18] = EntityType.EndCrystal; - mappings[19] = EntityType.EnderDragon; - mappings[20] = EntityType.Enderman; - mappings[21] = EntityType.Endermite; - mappings[22] = EntityType.Evoker; - mappings[23] = EntityType.EvokerFangs; - mappings[24] = EntityType.ExperienceOrb; - mappings[25] = EntityType.EyeOfEnder; - mappings[26] = EntityType.FallingBlock; - mappings[27] = EntityType.FireworkRocket; - mappings[28] = EntityType.Fox; - mappings[29] = EntityType.Ghast; - mappings[30] = EntityType.Giant; - mappings[31] = EntityType.Guardian; - mappings[32] = EntityType.Hoglin; - mappings[33] = EntityType.Horse; - mappings[34] = EntityType.Husk; - mappings[35] = EntityType.Illusioner; - mappings[36] = EntityType.IronGolem; - mappings[37] = EntityType.Item; - mappings[38] = EntityType.ItemFrame; - mappings[39] = EntityType.Fireball; - mappings[40] = EntityType.LeashKnot; - mappings[41] = EntityType.LightningBolt; - mappings[42] = EntityType.Llama; - mappings[43] = EntityType.LlamaSpit; - mappings[44] = EntityType.MagmaCube; - mappings[45] = EntityType.Minecart; - mappings[46] = EntityType.ChestMinecart; - mappings[47] = EntityType.CommandBlockMinecart; - mappings[48] = EntityType.FurnaceMinecart; - mappings[49] = EntityType.HopperMinecart; - mappings[50] = EntityType.SpawnerMinecart; - mappings[51] = EntityType.TntMinecart; - mappings[52] = EntityType.Mule; - mappings[53] = EntityType.Mooshroom; - mappings[54] = EntityType.Ocelot; - mappings[55] = EntityType.Painting; - mappings[56] = EntityType.Panda; - mappings[57] = EntityType.Parrot; - mappings[58] = EntityType.Phantom; - mappings[59] = EntityType.Pig; - mappings[60] = EntityType.Piglin; - mappings[61] = EntityType.Pillager; - mappings[62] = EntityType.PolarBear; - mappings[63] = EntityType.Tnt; - mappings[64] = EntityType.Pufferfish; - mappings[65] = EntityType.Rabbit; - mappings[66] = EntityType.Ravager; - mappings[67] = EntityType.Salmon; - mappings[68] = EntityType.Sheep; - mappings[69] = EntityType.Shulker; - mappings[70] = EntityType.ShulkerBullet; - mappings[71] = EntityType.Silverfish; - mappings[72] = EntityType.Skeleton; - mappings[73] = EntityType.SkeletonHorse; - mappings[74] = EntityType.Slime; - mappings[75] = EntityType.SmallFireball; - mappings[76] = EntityType.SnowGolem; - mappings[77] = EntityType.Snowball; - mappings[78] = EntityType.SpectralArrow; - mappings[79] = EntityType.Spider; - mappings[80] = EntityType.Squid; - mappings[81] = EntityType.Stray; - mappings[82] = EntityType.Strider; - mappings[83] = EntityType.Egg; - mappings[84] = EntityType.EnderPearl; - mappings[85] = EntityType.ExperienceBottle; - mappings[86] = EntityType.Potion; - mappings[87] = EntityType.Trident; - mappings[88] = EntityType.TraderLlama; - mappings[89] = EntityType.TropicalFish; - mappings[90] = EntityType.Turtle; - mappings[91] = EntityType.Vex; - mappings[92] = EntityType.Villager; - mappings[93] = EntityType.Vindicator; - mappings[94] = EntityType.WanderingTrader; - mappings[95] = EntityType.Witch; - mappings[96] = EntityType.Wither; - mappings[97] = EntityType.WitherSkeleton; - mappings[98] = EntityType.WitherSkull; - mappings[99] = EntityType.Wolf; - mappings[100] = EntityType.Zoglin; - mappings[101] = EntityType.Zombie; - mappings[102] = EntityType.ZombieHorse; - mappings[103] = EntityType.ZombieVillager; - mappings[104] = EntityType.ZombifiedPiglin; - mappings[105] = EntityType.Player; - mappings[106] = EntityType.FishingBobber; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette1162.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette1162.cs deleted file mode 100644 index 606e2d9410..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette1162.cs +++ /dev/null @@ -1,126 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - public class EntityPalette1162 : EntityPalette - { - private static readonly Dictionary mappings = new(); - - static EntityPalette1162() - { - mappings[0] = EntityType.AreaEffectCloud; - mappings[1] = EntityType.ArmorStand; - mappings[2] = EntityType.Arrow; - mappings[3] = EntityType.Bat; - mappings[4] = EntityType.Bee; - mappings[5] = EntityType.Blaze; - mappings[6] = EntityType.Boat; - mappings[7] = EntityType.Cat; - mappings[8] = EntityType.CaveSpider; - mappings[9] = EntityType.Chicken; - mappings[10] = EntityType.Cod; - mappings[11] = EntityType.Cow; - mappings[12] = EntityType.Creeper; - mappings[13] = EntityType.Dolphin; - mappings[14] = EntityType.Donkey; - mappings[15] = EntityType.DragonFireball; - mappings[16] = EntityType.Drowned; - mappings[17] = EntityType.ElderGuardian; - mappings[18] = EntityType.EndCrystal; - mappings[19] = EntityType.EnderDragon; - mappings[20] = EntityType.Enderman; - mappings[21] = EntityType.Endermite; - mappings[22] = EntityType.Evoker; - mappings[23] = EntityType.EvokerFangs; - mappings[24] = EntityType.ExperienceOrb; - mappings[25] = EntityType.EyeOfEnder; - mappings[26] = EntityType.FallingBlock; - mappings[27] = EntityType.FireworkRocket; - mappings[28] = EntityType.Fox; - mappings[29] = EntityType.Ghast; - mappings[30] = EntityType.Giant; - mappings[31] = EntityType.Guardian; - mappings[32] = EntityType.Hoglin; - mappings[33] = EntityType.Horse; - mappings[34] = EntityType.Husk; - mappings[35] = EntityType.Illusioner; - mappings[36] = EntityType.IronGolem; - mappings[37] = EntityType.Item; - mappings[38] = EntityType.ItemFrame; - mappings[39] = EntityType.Fireball; - mappings[40] = EntityType.LeashKnot; - mappings[41] = EntityType.LightningBolt; - mappings[42] = EntityType.Llama; - mappings[43] = EntityType.LlamaSpit; - mappings[44] = EntityType.MagmaCube; - mappings[45] = EntityType.Minecart; - mappings[46] = EntityType.ChestMinecart; - mappings[47] = EntityType.CommandBlockMinecart; - mappings[48] = EntityType.FurnaceMinecart; - mappings[49] = EntityType.HopperMinecart; - mappings[50] = EntityType.SpawnerMinecart; - mappings[51] = EntityType.TntMinecart; - mappings[52] = EntityType.Mule; - mappings[53] = EntityType.Mooshroom; - mappings[54] = EntityType.Ocelot; - mappings[55] = EntityType.Painting; - mappings[56] = EntityType.Panda; - mappings[57] = EntityType.Parrot; - mappings[58] = EntityType.Phantom; - mappings[59] = EntityType.Pig; - mappings[60] = EntityType.Piglin; - mappings[61] = EntityType.PiglinBrute; - mappings[62] = EntityType.Pillager; - mappings[63] = EntityType.PolarBear; - mappings[64] = EntityType.Tnt; - mappings[65] = EntityType.Pufferfish; - mappings[66] = EntityType.Rabbit; - mappings[67] = EntityType.Ravager; - mappings[68] = EntityType.Salmon; - mappings[69] = EntityType.Sheep; - mappings[70] = EntityType.Shulker; - mappings[71] = EntityType.ShulkerBullet; - mappings[72] = EntityType.Silverfish; - mappings[73] = EntityType.Skeleton; - mappings[74] = EntityType.SkeletonHorse; - mappings[75] = EntityType.Slime; - mappings[76] = EntityType.SmallFireball; - mappings[77] = EntityType.SnowGolem; - mappings[78] = EntityType.Snowball; - mappings[79] = EntityType.SpectralArrow; - mappings[80] = EntityType.Spider; - mappings[81] = EntityType.Squid; - mappings[82] = EntityType.Stray; - mappings[83] = EntityType.Strider; - mappings[84] = EntityType.Egg; - mappings[85] = EntityType.EnderPearl; - mappings[86] = EntityType.ExperienceBottle; - mappings[87] = EntityType.Potion; - mappings[88] = EntityType.Trident; - mappings[89] = EntityType.TraderLlama; - mappings[90] = EntityType.TropicalFish; - mappings[91] = EntityType.Turtle; - mappings[92] = EntityType.Vex; - mappings[93] = EntityType.Villager; - mappings[94] = EntityType.Vindicator; - mappings[95] = EntityType.WanderingTrader; - mappings[96] = EntityType.Witch; - mappings[97] = EntityType.Wither; - mappings[98] = EntityType.WitherSkeleton; - mappings[99] = EntityType.WitherSkull; - mappings[100] = EntityType.Wolf; - mappings[101] = EntityType.Zoglin; - mappings[102] = EntityType.Zombie; - mappings[103] = EntityType.ZombieHorse; - mappings[104] = EntityType.ZombieVillager; - mappings[105] = EntityType.ZombifiedPiglin; - mappings[106] = EntityType.Player; - mappings[107] = EntityType.FishingBobber; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette117.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette117.cs deleted file mode 100644 index 1658aa33ba..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette117.cs +++ /dev/null @@ -1,131 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - public class EntityPalette117 : EntityPalette - { - private static readonly Dictionary mappings = new(); - - static EntityPalette117() - { - mappings[0] = EntityType.AreaEffectCloud; - mappings[1] = EntityType.ArmorStand; - mappings[2] = EntityType.Arrow; - mappings[3] = EntityType.Axolotl; - mappings[4] = EntityType.Bat; - mappings[5] = EntityType.Bee; - mappings[6] = EntityType.Blaze; - mappings[7] = EntityType.Boat; - mappings[8] = EntityType.Cat; - mappings[9] = EntityType.CaveSpider; - mappings[10] = EntityType.Chicken; - mappings[11] = EntityType.Cod; - mappings[12] = EntityType.Cow; - mappings[13] = EntityType.Creeper; - mappings[14] = EntityType.Dolphin; - mappings[15] = EntityType.Donkey; - mappings[16] = EntityType.DragonFireball; - mappings[17] = EntityType.Drowned; - mappings[18] = EntityType.ElderGuardian; - mappings[19] = EntityType.EndCrystal; - mappings[20] = EntityType.EnderDragon; - mappings[21] = EntityType.Enderman; - mappings[22] = EntityType.Endermite; - mappings[23] = EntityType.Evoker; - mappings[24] = EntityType.EvokerFangs; - mappings[25] = EntityType.ExperienceOrb; - mappings[26] = EntityType.EyeOfEnder; - mappings[27] = EntityType.FallingBlock; - mappings[28] = EntityType.FireworkRocket; - mappings[29] = EntityType.Fox; - mappings[30] = EntityType.Ghast; - mappings[31] = EntityType.Giant; - mappings[32] = EntityType.GlowItemFrame; - mappings[33] = EntityType.GlowSquid; - mappings[34] = EntityType.Goat; - mappings[35] = EntityType.Guardian; - mappings[36] = EntityType.Hoglin; - mappings[37] = EntityType.Horse; - mappings[38] = EntityType.Husk; - mappings[39] = EntityType.Illusioner; - mappings[40] = EntityType.IronGolem; - mappings[41] = EntityType.Item; - mappings[42] = EntityType.ItemFrame; - mappings[43] = EntityType.Fireball; - mappings[44] = EntityType.LeashKnot; - mappings[45] = EntityType.LightningBolt; - mappings[46] = EntityType.Llama; - mappings[47] = EntityType.LlamaSpit; - mappings[48] = EntityType.MagmaCube; - mappings[49] = EntityType.Marker; - mappings[50] = EntityType.Minecart; - mappings[51] = EntityType.ChestMinecart; - mappings[52] = EntityType.CommandBlockMinecart; - mappings[53] = EntityType.FurnaceMinecart; - mappings[54] = EntityType.HopperMinecart; - mappings[55] = EntityType.SpawnerMinecart; - mappings[56] = EntityType.TntMinecart; - mappings[57] = EntityType.Mule; - mappings[58] = EntityType.Mooshroom; - mappings[59] = EntityType.Ocelot; - mappings[60] = EntityType.Painting; - mappings[61] = EntityType.Panda; - mappings[62] = EntityType.Parrot; - mappings[63] = EntityType.Phantom; - mappings[64] = EntityType.Pig; - mappings[65] = EntityType.Piglin; - mappings[66] = EntityType.PiglinBrute; - mappings[67] = EntityType.Pillager; - mappings[68] = EntityType.PolarBear; - mappings[69] = EntityType.Tnt; - mappings[70] = EntityType.Pufferfish; - mappings[71] = EntityType.Rabbit; - mappings[72] = EntityType.Ravager; - mappings[73] = EntityType.Salmon; - mappings[74] = EntityType.Sheep; - mappings[75] = EntityType.Shulker; - mappings[76] = EntityType.ShulkerBullet; - mappings[77] = EntityType.Silverfish; - mappings[78] = EntityType.Skeleton; - mappings[79] = EntityType.SkeletonHorse; - mappings[80] = EntityType.Slime; - mappings[81] = EntityType.SmallFireball; - mappings[82] = EntityType.SnowGolem; - mappings[83] = EntityType.Snowball; - mappings[84] = EntityType.SpectralArrow; - mappings[85] = EntityType.Spider; - mappings[86] = EntityType.Squid; - mappings[87] = EntityType.Stray; - mappings[88] = EntityType.Strider; - mappings[89] = EntityType.Egg; - mappings[90] = EntityType.EnderPearl; - mappings[91] = EntityType.ExperienceBottle; - mappings[92] = EntityType.Potion; - mappings[93] = EntityType.Trident; - mappings[94] = EntityType.TraderLlama; - mappings[95] = EntityType.TropicalFish; - mappings[96] = EntityType.Turtle; - mappings[97] = EntityType.Vex; - mappings[98] = EntityType.Villager; - mappings[99] = EntityType.Vindicator; - mappings[100] = EntityType.WanderingTrader; - mappings[101] = EntityType.Witch; - mappings[102] = EntityType.Wither; - mappings[103] = EntityType.WitherSkeleton; - mappings[104] = EntityType.WitherSkull; - mappings[105] = EntityType.Wolf; - mappings[106] = EntityType.Zoglin; - mappings[107] = EntityType.Zombie; - mappings[108] = EntityType.ZombieHorse; - mappings[109] = EntityType.ZombieVillager; - mappings[110] = EntityType.ZombifiedPiglin; - mappings[111] = EntityType.Player; - mappings[112] = EntityType.FishingBobber; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette119.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette119.cs deleted file mode 100644 index f4e352d5f6..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette119.cs +++ /dev/null @@ -1,136 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - public class EntityPalette119 : EntityPalette - { - private static readonly Dictionary mappings = new(); - - static EntityPalette119() - { - mappings[0] = EntityType.Allay; - mappings[1] = EntityType.AreaEffectCloud; - mappings[2] = EntityType.ArmorStand; - mappings[3] = EntityType.Arrow; - mappings[4] = EntityType.Axolotl; - mappings[5] = EntityType.Bat; - mappings[6] = EntityType.Bee; - mappings[7] = EntityType.Blaze; - mappings[8] = EntityType.Boat; - mappings[10] = EntityType.Cat; - mappings[11] = EntityType.CaveSpider; - mappings[9] = EntityType.ChestBoat; - mappings[54] = EntityType.ChestMinecart; - mappings[12] = EntityType.Chicken; - mappings[13] = EntityType.Cod; - mappings[55] = EntityType.CommandBlockMinecart; - mappings[14] = EntityType.Cow; - mappings[15] = EntityType.Creeper; - mappings[16] = EntityType.Dolphin; - mappings[17] = EntityType.Donkey; - mappings[18] = EntityType.DragonFireball; - mappings[19] = EntityType.Drowned; - mappings[93] = EntityType.Egg; - mappings[20] = EntityType.ElderGuardian; - mappings[21] = EntityType.EndCrystal; - mappings[22] = EntityType.EnderDragon; - mappings[94] = EntityType.EnderPearl; - mappings[23] = EntityType.Enderman; - mappings[24] = EntityType.Endermite; - mappings[25] = EntityType.Evoker; - mappings[26] = EntityType.EvokerFangs; - mappings[95] = EntityType.ExperienceBottle; - mappings[27] = EntityType.ExperienceOrb; - mappings[28] = EntityType.EyeOfEnder; - mappings[29] = EntityType.FallingBlock; - mappings[46] = EntityType.Fireball; - mappings[30] = EntityType.FireworkRocket; - mappings[117] = EntityType.FishingBobber; - mappings[31] = EntityType.Fox; - mappings[32] = EntityType.Frog; - mappings[56] = EntityType.FurnaceMinecart; - mappings[33] = EntityType.Ghast; - mappings[34] = EntityType.Giant; - mappings[35] = EntityType.GlowItemFrame; - mappings[36] = EntityType.GlowSquid; - mappings[37] = EntityType.Goat; - mappings[38] = EntityType.Guardian; - mappings[39] = EntityType.Hoglin; - mappings[57] = EntityType.HopperMinecart; - mappings[40] = EntityType.Horse; - mappings[41] = EntityType.Husk; - mappings[42] = EntityType.Illusioner; - mappings[43] = EntityType.IronGolem; - mappings[44] = EntityType.Item; - mappings[45] = EntityType.ItemFrame; - mappings[47] = EntityType.LeashKnot; - mappings[48] = EntityType.LightningBolt; - mappings[49] = EntityType.Llama; - mappings[50] = EntityType.LlamaSpit; - mappings[51] = EntityType.MagmaCube; - mappings[52] = EntityType.Marker; - mappings[53] = EntityType.Minecart; - mappings[61] = EntityType.Mooshroom; - mappings[60] = EntityType.Mule; - mappings[62] = EntityType.Ocelot; - mappings[63] = EntityType.Painting; - mappings[64] = EntityType.Panda; - mappings[65] = EntityType.Parrot; - mappings[66] = EntityType.Phantom; - mappings[67] = EntityType.Pig; - mappings[68] = EntityType.Piglin; - mappings[69] = EntityType.PiglinBrute; - mappings[70] = EntityType.Pillager; - mappings[116] = EntityType.Player; - mappings[71] = EntityType.PolarBear; - mappings[96] = EntityType.Potion; - mappings[73] = EntityType.Pufferfish; - mappings[74] = EntityType.Rabbit; - mappings[75] = EntityType.Ravager; - mappings[76] = EntityType.Salmon; - mappings[77] = EntityType.Sheep; - mappings[78] = EntityType.Shulker; - mappings[79] = EntityType.ShulkerBullet; - mappings[80] = EntityType.Silverfish; - mappings[81] = EntityType.Skeleton; - mappings[82] = EntityType.SkeletonHorse; - mappings[83] = EntityType.Slime; - mappings[84] = EntityType.SmallFireball; - mappings[85] = EntityType.SnowGolem; - mappings[86] = EntityType.Snowball; - mappings[58] = EntityType.SpawnerMinecart; - mappings[87] = EntityType.SpectralArrow; - mappings[88] = EntityType.Spider; - mappings[89] = EntityType.Squid; - mappings[90] = EntityType.Stray; - mappings[91] = EntityType.Strider; - mappings[92] = EntityType.Tadpole; - mappings[72] = EntityType.Tnt; - mappings[59] = EntityType.TntMinecart; - mappings[98] = EntityType.TraderLlama; - mappings[97] = EntityType.Trident; - mappings[99] = EntityType.TropicalFish; - mappings[100] = EntityType.Turtle; - mappings[101] = EntityType.Vex; - mappings[102] = EntityType.Villager; - mappings[103] = EntityType.Vindicator; - mappings[104] = EntityType.WanderingTrader; - mappings[105] = EntityType.Warden; - mappings[106] = EntityType.Witch; - mappings[107] = EntityType.Wither; - mappings[108] = EntityType.WitherSkeleton; - mappings[109] = EntityType.WitherSkull; - mappings[110] = EntityType.Wolf; - mappings[111] = EntityType.Zoglin; - mappings[112] = EntityType.Zombie; - mappings[113] = EntityType.ZombieHorse; - mappings[114] = EntityType.ZombieVillager; - mappings[115] = EntityType.ZombifiedPiglin; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette1193.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette1193.cs deleted file mode 100644 index d02e09a7a5..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette1193.cs +++ /dev/null @@ -1,137 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - public class EntityPalette1193 : EntityPalette - { - private static readonly Dictionary mappings = new(); - - static EntityPalette1193() - { - mappings[0] = EntityType.Allay; - mappings[1] = EntityType.AreaEffectCloud; - mappings[2] = EntityType.ArmorStand; - mappings[3] = EntityType.Arrow; - mappings[4] = EntityType.Axolotl; - mappings[5] = EntityType.Bat; - mappings[6] = EntityType.Bee; - mappings[7] = EntityType.Blaze; - mappings[8] = EntityType.Boat; - mappings[11] = EntityType.Camel; - mappings[10] = EntityType.Cat; - mappings[12] = EntityType.CaveSpider; - mappings[9] = EntityType.ChestBoat; - mappings[55] = EntityType.ChestMinecart; - mappings[13] = EntityType.Chicken; - mappings[14] = EntityType.Cod; - mappings[56] = EntityType.CommandBlockMinecart; - mappings[15] = EntityType.Cow; - mappings[16] = EntityType.Creeper; - mappings[17] = EntityType.Dolphin; - mappings[18] = EntityType.Donkey; - mappings[19] = EntityType.DragonFireball; - mappings[20] = EntityType.Drowned; - mappings[94] = EntityType.Egg; - mappings[21] = EntityType.ElderGuardian; - mappings[22] = EntityType.EndCrystal; - mappings[23] = EntityType.EnderDragon; - mappings[95] = EntityType.EnderPearl; - mappings[24] = EntityType.Enderman; - mappings[25] = EntityType.Endermite; - mappings[26] = EntityType.Evoker; - mappings[27] = EntityType.EvokerFangs; - mappings[96] = EntityType.ExperienceBottle; - mappings[28] = EntityType.ExperienceOrb; - mappings[29] = EntityType.EyeOfEnder; - mappings[30] = EntityType.FallingBlock; - mappings[47] = EntityType.Fireball; - mappings[31] = EntityType.FireworkRocket; - mappings[118] = EntityType.FishingBobber; - mappings[32] = EntityType.Fox; - mappings[33] = EntityType.Frog; - mappings[57] = EntityType.FurnaceMinecart; - mappings[34] = EntityType.Ghast; - mappings[35] = EntityType.Giant; - mappings[36] = EntityType.GlowItemFrame; - mappings[37] = EntityType.GlowSquid; - mappings[38] = EntityType.Goat; - mappings[39] = EntityType.Guardian; - mappings[40] = EntityType.Hoglin; - mappings[58] = EntityType.HopperMinecart; - mappings[41] = EntityType.Horse; - mappings[42] = EntityType.Husk; - mappings[43] = EntityType.Illusioner; - mappings[44] = EntityType.IronGolem; - mappings[45] = EntityType.Item; - mappings[46] = EntityType.ItemFrame; - mappings[48] = EntityType.LeashKnot; - mappings[49] = EntityType.LightningBolt; - mappings[50] = EntityType.Llama; - mappings[51] = EntityType.LlamaSpit; - mappings[52] = EntityType.MagmaCube; - mappings[53] = EntityType.Marker; - mappings[54] = EntityType.Minecart; - mappings[62] = EntityType.Mooshroom; - mappings[61] = EntityType.Mule; - mappings[63] = EntityType.Ocelot; - mappings[64] = EntityType.Painting; - mappings[65] = EntityType.Panda; - mappings[66] = EntityType.Parrot; - mappings[67] = EntityType.Phantom; - mappings[68] = EntityType.Pig; - mappings[69] = EntityType.Piglin; - mappings[70] = EntityType.PiglinBrute; - mappings[71] = EntityType.Pillager; - mappings[117] = EntityType.Player; - mappings[72] = EntityType.PolarBear; - mappings[97] = EntityType.Potion; - mappings[74] = EntityType.Pufferfish; - mappings[75] = EntityType.Rabbit; - mappings[76] = EntityType.Ravager; - mappings[77] = EntityType.Salmon; - mappings[78] = EntityType.Sheep; - mappings[79] = EntityType.Shulker; - mappings[80] = EntityType.ShulkerBullet; - mappings[81] = EntityType.Silverfish; - mappings[82] = EntityType.Skeleton; - mappings[83] = EntityType.SkeletonHorse; - mappings[84] = EntityType.Slime; - mappings[85] = EntityType.SmallFireball; - mappings[86] = EntityType.SnowGolem; - mappings[87] = EntityType.Snowball; - mappings[59] = EntityType.SpawnerMinecart; - mappings[88] = EntityType.SpectralArrow; - mappings[89] = EntityType.Spider; - mappings[90] = EntityType.Squid; - mappings[91] = EntityType.Stray; - mappings[92] = EntityType.Strider; - mappings[93] = EntityType.Tadpole; - mappings[73] = EntityType.Tnt; - mappings[60] = EntityType.TntMinecart; - mappings[99] = EntityType.TraderLlama; - mappings[98] = EntityType.Trident; - mappings[100] = EntityType.TropicalFish; - mappings[101] = EntityType.Turtle; - mappings[102] = EntityType.Vex; - mappings[103] = EntityType.Villager; - mappings[104] = EntityType.Vindicator; - mappings[105] = EntityType.WanderingTrader; - mappings[106] = EntityType.Warden; - mappings[107] = EntityType.Witch; - mappings[108] = EntityType.Wither; - mappings[109] = EntityType.WitherSkeleton; - mappings[110] = EntityType.WitherSkull; - mappings[111] = EntityType.Wolf; - mappings[112] = EntityType.Zoglin; - mappings[113] = EntityType.Zombie; - mappings[114] = EntityType.ZombieHorse; - mappings[115] = EntityType.ZombieVillager; - mappings[116] = EntityType.ZombifiedPiglin; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette120.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette120.cs deleted file mode 100644 index 254a9a3ba6..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette120.cs +++ /dev/null @@ -1,142 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - public class EntityPalette120 : EntityPalette - { - private static readonly Dictionary mappings = new(); - - static EntityPalette120() - { - mappings[0] = EntityType.Allay; - mappings[1] = EntityType.AreaEffectCloud; - mappings[2] = EntityType.ArmorStand; - mappings[3] = EntityType.Arrow; - mappings[4] = EntityType.Axolotl; - mappings[5] = EntityType.Bat; - mappings[6] = EntityType.Bee; - mappings[7] = EntityType.Blaze; - mappings[8] = EntityType.BlockDisplay; - mappings[9] = EntityType.Boat; - mappings[10] = EntityType.Camel; - mappings[11] = EntityType.Cat; - mappings[12] = EntityType.CaveSpider; - mappings[13] = EntityType.ChestBoat; - mappings[14] = EntityType.ChestMinecart; - mappings[15] = EntityType.Chicken; - mappings[16] = EntityType.Cod; - mappings[17] = EntityType.CommandBlockMinecart; - mappings[18] = EntityType.Cow; - mappings[19] = EntityType.Creeper; - mappings[20] = EntityType.Dolphin; - mappings[21] = EntityType.Donkey; - mappings[22] = EntityType.DragonFireball; - mappings[23] = EntityType.Drowned; - mappings[24] = EntityType.Egg; - mappings[25] = EntityType.ElderGuardian; - mappings[26] = EntityType.EndCrystal; - mappings[27] = EntityType.EnderDragon; - mappings[28] = EntityType.EnderPearl; - mappings[29] = EntityType.Enderman; - mappings[30] = EntityType.Endermite; - mappings[31] = EntityType.Evoker; - mappings[32] = EntityType.EvokerFangs; - mappings[33] = EntityType.ExperienceBottle; - mappings[34] = EntityType.ExperienceOrb; - mappings[35] = EntityType.EyeOfEnder; - mappings[36] = EntityType.FallingBlock; - mappings[57] = EntityType.Fireball; - mappings[37] = EntityType.FireworkRocket; - mappings[123] = EntityType.FishingBobber; - mappings[38] = EntityType.Fox; - mappings[39] = EntityType.Frog; - mappings[40] = EntityType.FurnaceMinecart; - mappings[41] = EntityType.Ghast; - mappings[42] = EntityType.Giant; - mappings[43] = EntityType.GlowItemFrame; - mappings[44] = EntityType.GlowSquid; - mappings[45] = EntityType.Goat; - mappings[46] = EntityType.Guardian; - mappings[47] = EntityType.Hoglin; - mappings[48] = EntityType.HopperMinecart; - mappings[49] = EntityType.Horse; - mappings[50] = EntityType.Husk; - mappings[51] = EntityType.Illusioner; - mappings[52] = EntityType.Interaction; - mappings[53] = EntityType.IronGolem; - mappings[54] = EntityType.Item; - mappings[55] = EntityType.ItemDisplay; - mappings[56] = EntityType.ItemFrame; - mappings[58] = EntityType.LeashKnot; - mappings[59] = EntityType.LightningBolt; - mappings[60] = EntityType.Llama; - mappings[61] = EntityType.LlamaSpit; - mappings[62] = EntityType.MagmaCube; - mappings[63] = EntityType.Marker; - mappings[64] = EntityType.Minecart; - mappings[65] = EntityType.Mooshroom; - mappings[66] = EntityType.Mule; - mappings[67] = EntityType.Ocelot; - mappings[68] = EntityType.Painting; - mappings[69] = EntityType.Panda; - mappings[70] = EntityType.Parrot; - mappings[71] = EntityType.Phantom; - mappings[72] = EntityType.Pig; - mappings[73] = EntityType.Piglin; - mappings[74] = EntityType.PiglinBrute; - mappings[75] = EntityType.Pillager; - mappings[122] = EntityType.Player; - mappings[76] = EntityType.PolarBear; - mappings[77] = EntityType.Potion; - mappings[78] = EntityType.Pufferfish; - mappings[79] = EntityType.Rabbit; - mappings[80] = EntityType.Ravager; - mappings[81] = EntityType.Salmon; - mappings[82] = EntityType.Sheep; - mappings[83] = EntityType.Shulker; - mappings[84] = EntityType.ShulkerBullet; - mappings[85] = EntityType.Silverfish; - mappings[86] = EntityType.Skeleton; - mappings[87] = EntityType.SkeletonHorse; - mappings[88] = EntityType.Slime; - mappings[89] = EntityType.SmallFireball; - mappings[90] = EntityType.Sniffer; - mappings[91] = EntityType.SnowGolem; - mappings[92] = EntityType.Snowball; - mappings[93] = EntityType.SpawnerMinecart; - mappings[94] = EntityType.SpectralArrow; - mappings[95] = EntityType.Spider; - mappings[96] = EntityType.Squid; - mappings[97] = EntityType.Stray; - mappings[98] = EntityType.Strider; - mappings[99] = EntityType.Tadpole; - mappings[100] = EntityType.TextDisplay; - mappings[101] = EntityType.Tnt; - mappings[102] = EntityType.TntMinecart; - mappings[103] = EntityType.TraderLlama; - mappings[104] = EntityType.Trident; - mappings[105] = EntityType.TropicalFish; - mappings[106] = EntityType.Turtle; - mappings[107] = EntityType.Vex; - mappings[108] = EntityType.Villager; - mappings[109] = EntityType.Vindicator; - mappings[110] = EntityType.WanderingTrader; - mappings[111] = EntityType.Warden; - mappings[112] = EntityType.Witch; - mappings[113] = EntityType.Wither; - mappings[114] = EntityType.WitherSkeleton; - mappings[115] = EntityType.WitherSkull; - mappings[116] = EntityType.Wolf; - mappings[117] = EntityType.Zoglin; - mappings[118] = EntityType.Zombie; - mappings[119] = EntityType.ZombieHorse; - mappings[120] = EntityType.ZombieVillager; - mappings[121] = EntityType.ZombifiedPiglin; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} \ No newline at end of file diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette1204.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette1204.cs deleted file mode 100644 index 5cb31df3fb..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette1204.cs +++ /dev/null @@ -1,144 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - public class EntityPalette1204 : EntityPalette - { - private static readonly Dictionary mappings = new(); - - static EntityPalette1204() - { - mappings[0] = EntityType.Allay; - mappings[1] = EntityType.AreaEffectCloud; - mappings[2] = EntityType.ArmorStand; - mappings[3] = EntityType.Arrow; - mappings[4] = EntityType.Axolotl; - mappings[5] = EntityType.Bat; - mappings[6] = EntityType.Bee; - mappings[7] = EntityType.Blaze; - mappings[8] = EntityType.BlockDisplay; - mappings[9] = EntityType.Boat; - mappings[10] = EntityType.Breeze; - mappings[11] = EntityType.Camel; - mappings[12] = EntityType.Cat; - mappings[13] = EntityType.CaveSpider; - mappings[14] = EntityType.ChestBoat; - mappings[15] = EntityType.ChestMinecart; - mappings[16] = EntityType.Chicken; - mappings[17] = EntityType.Cod; - mappings[18] = EntityType.CommandBlockMinecart; - mappings[19] = EntityType.Cow; - mappings[20] = EntityType.Creeper; - mappings[21] = EntityType.Dolphin; - mappings[22] = EntityType.Donkey; - mappings[23] = EntityType.DragonFireball; - mappings[24] = EntityType.Drowned; - mappings[25] = EntityType.Egg; - mappings[26] = EntityType.ElderGuardian; - mappings[27] = EntityType.EndCrystal; - mappings[28] = EntityType.EnderDragon; - mappings[29] = EntityType.EnderPearl; - mappings[30] = EntityType.Enderman; - mappings[31] = EntityType.Endermite; - mappings[32] = EntityType.Evoker; - mappings[33] = EntityType.EvokerFangs; - mappings[34] = EntityType.ExperienceBottle; - mappings[35] = EntityType.ExperienceOrb; - mappings[36] = EntityType.EyeOfEnder; - mappings[37] = EntityType.FallingBlock; - mappings[58] = EntityType.Fireball; - mappings[38] = EntityType.FireworkRocket; - mappings[125] = EntityType.FishingBobber; - mappings[39] = EntityType.Fox; - mappings[40] = EntityType.Frog; - mappings[41] = EntityType.FurnaceMinecart; - mappings[42] = EntityType.Ghast; - mappings[43] = EntityType.Giant; - mappings[44] = EntityType.GlowItemFrame; - mappings[45] = EntityType.GlowSquid; - mappings[46] = EntityType.Goat; - mappings[47] = EntityType.Guardian; - mappings[48] = EntityType.Hoglin; - mappings[49] = EntityType.HopperMinecart; - mappings[50] = EntityType.Horse; - mappings[51] = EntityType.Husk; - mappings[52] = EntityType.Illusioner; - mappings[53] = EntityType.Interaction; - mappings[54] = EntityType.IronGolem; - mappings[55] = EntityType.Item; - mappings[56] = EntityType.ItemDisplay; - mappings[57] = EntityType.ItemFrame; - mappings[59] = EntityType.LeashKnot; - mappings[60] = EntityType.LightningBolt; - mappings[61] = EntityType.Llama; - mappings[62] = EntityType.LlamaSpit; - mappings[63] = EntityType.MagmaCube; - mappings[64] = EntityType.Marker; - mappings[65] = EntityType.Minecart; - mappings[66] = EntityType.Mooshroom; - mappings[67] = EntityType.Mule; - mappings[68] = EntityType.Ocelot; - mappings[69] = EntityType.Painting; - mappings[70] = EntityType.Panda; - mappings[71] = EntityType.Parrot; - mappings[72] = EntityType.Phantom; - mappings[73] = EntityType.Pig; - mappings[74] = EntityType.Piglin; - mappings[75] = EntityType.PiglinBrute; - mappings[76] = EntityType.Pillager; - mappings[124] = EntityType.Player; - mappings[77] = EntityType.PolarBear; - mappings[78] = EntityType.Potion; - mappings[79] = EntityType.Pufferfish; - mappings[80] = EntityType.Rabbit; - mappings[81] = EntityType.Ravager; - mappings[82] = EntityType.Salmon; - mappings[83] = EntityType.Sheep; - mappings[84] = EntityType.Shulker; - mappings[85] = EntityType.ShulkerBullet; - mappings[86] = EntityType.Silverfish; - mappings[87] = EntityType.Skeleton; - mappings[88] = EntityType.SkeletonHorse; - mappings[89] = EntityType.Slime; - mappings[90] = EntityType.SmallFireball; - mappings[91] = EntityType.Sniffer; - mappings[92] = EntityType.SnowGolem; - mappings[93] = EntityType.Snowball; - mappings[94] = EntityType.SpawnerMinecart; - mappings[95] = EntityType.SpectralArrow; - mappings[96] = EntityType.Spider; - mappings[97] = EntityType.Squid; - mappings[98] = EntityType.Stray; - mappings[99] = EntityType.Strider; - mappings[100] = EntityType.Tadpole; - mappings[101] = EntityType.TextDisplay; - mappings[102] = EntityType.Tnt; - mappings[103] = EntityType.TntMinecart; - mappings[104] = EntityType.TraderLlama; - mappings[105] = EntityType.Trident; - mappings[106] = EntityType.TropicalFish; - mappings[107] = EntityType.Turtle; - mappings[108] = EntityType.Vex; - mappings[109] = EntityType.Villager; - mappings[110] = EntityType.Vindicator; - mappings[111] = EntityType.WanderingTrader; - mappings[112] = EntityType.Warden; - mappings[113] = EntityType.WindCharge; - mappings[114] = EntityType.Witch; - mappings[115] = EntityType.Wither; - mappings[116] = EntityType.WitherSkeleton; - mappings[117] = EntityType.WitherSkull; - mappings[118] = EntityType.Wolf; - mappings[119] = EntityType.Zoglin; - mappings[120] = EntityType.Zombie; - mappings[121] = EntityType.ZombieHorse; - mappings[122] = EntityType.ZombieVillager; - mappings[123] = EntityType.ZombifiedPiglin; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette1206.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette1206.cs deleted file mode 100644 index 734a431d4c..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette1206.cs +++ /dev/null @@ -1,148 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - public class EntityPalette1206 : EntityPalette - { - private static readonly Dictionary mappings = new(); - - static EntityPalette1206() - { - mappings[0] = EntityType.Allay; - mappings[1] = EntityType.AreaEffectCloud; - mappings[2] = EntityType.Armadillo; - mappings[3] = EntityType.ArmorStand; - mappings[4] = EntityType.Arrow; - mappings[5] = EntityType.Axolotl; - mappings[6] = EntityType.Bat; - mappings[7] = EntityType.Bee; - mappings[8] = EntityType.Blaze; - mappings[9] = EntityType.BlockDisplay; - mappings[10] = EntityType.Boat; - mappings[11] = EntityType.Bogged; - mappings[12] = EntityType.Breeze; - mappings[13] = EntityType.BreezeWindCharge; - mappings[14] = EntityType.Camel; - mappings[15] = EntityType.Cat; - mappings[16] = EntityType.CaveSpider; - mappings[17] = EntityType.ChestBoat; - mappings[18] = EntityType.ChestMinecart; - mappings[19] = EntityType.Chicken; - mappings[20] = EntityType.Cod; - mappings[21] = EntityType.CommandBlockMinecart; - mappings[22] = EntityType.Cow; - mappings[23] = EntityType.Creeper; - mappings[24] = EntityType.Dolphin; - mappings[25] = EntityType.Donkey; - mappings[26] = EntityType.DragonFireball; - mappings[27] = EntityType.Drowned; - mappings[28] = EntityType.Egg; - mappings[29] = EntityType.ElderGuardian; - mappings[30] = EntityType.EndCrystal; - mappings[31] = EntityType.EnderDragon; - mappings[32] = EntityType.EnderPearl; - mappings[33] = EntityType.Enderman; - mappings[34] = EntityType.Endermite; - mappings[35] = EntityType.Evoker; - mappings[36] = EntityType.EvokerFangs; - mappings[37] = EntityType.ExperienceBottle; - mappings[38] = EntityType.ExperienceOrb; - mappings[39] = EntityType.EyeOfEnder; - mappings[40] = EntityType.FallingBlock; - mappings[62] = EntityType.Fireball; - mappings[41] = EntityType.FireworkRocket; - mappings[129] = EntityType.FishingBobber; - mappings[42] = EntityType.Fox; - mappings[43] = EntityType.Frog; - mappings[44] = EntityType.FurnaceMinecart; - mappings[45] = EntityType.Ghast; - mappings[46] = EntityType.Giant; - mappings[47] = EntityType.GlowItemFrame; - mappings[48] = EntityType.GlowSquid; - mappings[49] = EntityType.Goat; - mappings[50] = EntityType.Guardian; - mappings[51] = EntityType.Hoglin; - mappings[52] = EntityType.HopperMinecart; - mappings[53] = EntityType.Horse; - mappings[54] = EntityType.Husk; - mappings[55] = EntityType.Illusioner; - mappings[56] = EntityType.Interaction; - mappings[57] = EntityType.IronGolem; - mappings[58] = EntityType.Item; - mappings[59] = EntityType.ItemDisplay; - mappings[60] = EntityType.ItemFrame; - mappings[63] = EntityType.LeashKnot; - mappings[64] = EntityType.LightningBolt; - mappings[65] = EntityType.Llama; - mappings[66] = EntityType.LlamaSpit; - mappings[67] = EntityType.MagmaCube; - mappings[68] = EntityType.Marker; - mappings[69] = EntityType.Minecart; - mappings[70] = EntityType.Mooshroom; - mappings[71] = EntityType.Mule; - mappings[72] = EntityType.Ocelot; - mappings[61] = EntityType.OminousItemSpawner; - mappings[73] = EntityType.Painting; - mappings[74] = EntityType.Panda; - mappings[75] = EntityType.Parrot; - mappings[76] = EntityType.Phantom; - mappings[77] = EntityType.Pig; - mappings[78] = EntityType.Piglin; - mappings[79] = EntityType.PiglinBrute; - mappings[80] = EntityType.Pillager; - mappings[128] = EntityType.Player; - mappings[81] = EntityType.PolarBear; - mappings[82] = EntityType.Potion; - mappings[83] = EntityType.Pufferfish; - mappings[84] = EntityType.Rabbit; - mappings[85] = EntityType.Ravager; - mappings[86] = EntityType.Salmon; - mappings[87] = EntityType.Sheep; - mappings[88] = EntityType.Shulker; - mappings[89] = EntityType.ShulkerBullet; - mappings[90] = EntityType.Silverfish; - mappings[91] = EntityType.Skeleton; - mappings[92] = EntityType.SkeletonHorse; - mappings[93] = EntityType.Slime; - mappings[94] = EntityType.SmallFireball; - mappings[95] = EntityType.Sniffer; - mappings[96] = EntityType.SnowGolem; - mappings[97] = EntityType.Snowball; - mappings[98] = EntityType.SpawnerMinecart; - mappings[99] = EntityType.SpectralArrow; - mappings[100] = EntityType.Spider; - mappings[101] = EntityType.Squid; - mappings[102] = EntityType.Stray; - mappings[103] = EntityType.Strider; - mappings[104] = EntityType.Tadpole; - mappings[105] = EntityType.TextDisplay; - mappings[106] = EntityType.Tnt; - mappings[107] = EntityType.TntMinecart; - mappings[108] = EntityType.TraderLlama; - mappings[109] = EntityType.Trident; - mappings[110] = EntityType.TropicalFish; - mappings[111] = EntityType.Turtle; - mappings[112] = EntityType.Vex; - mappings[113] = EntityType.Villager; - mappings[114] = EntityType.Vindicator; - mappings[115] = EntityType.WanderingTrader; - mappings[116] = EntityType.Warden; - mappings[117] = EntityType.WindCharge; - mappings[118] = EntityType.Witch; - mappings[119] = EntityType.Wither; - mappings[120] = EntityType.WitherSkeleton; - mappings[121] = EntityType.WitherSkull; - mappings[122] = EntityType.Wolf; - mappings[123] = EntityType.Zoglin; - mappings[124] = EntityType.Zombie; - mappings[125] = EntityType.ZombieHorse; - mappings[126] = EntityType.ZombieVillager; - mappings[127] = EntityType.ZombifiedPiglin; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette12111.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette12111.cs deleted file mode 100644 index 5c3cb5cab4..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette12111.cs +++ /dev/null @@ -1,175 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - public class EntityPalette12111 : EntityPalette - { - private static readonly Dictionary mappings = new(); - - static EntityPalette12111() - { - mappings[0] = EntityType.AcaciaBoat; - mappings[1] = EntityType.AcaciaChestBoat; - mappings[2] = EntityType.Allay; - mappings[3] = EntityType.AreaEffectCloud; - mappings[4] = EntityType.Armadillo; - mappings[5] = EntityType.ArmorStand; - mappings[6] = EntityType.Arrow; - mappings[7] = EntityType.Axolotl; - mappings[8] = EntityType.BambooChestRaft; - mappings[9] = EntityType.BambooRaft; - mappings[10] = EntityType.Bat; - mappings[11] = EntityType.Bee; - mappings[12] = EntityType.BirchBoat; - mappings[13] = EntityType.BirchChestBoat; - mappings[14] = EntityType.Blaze; - mappings[15] = EntityType.BlockDisplay; - mappings[16] = EntityType.Bogged; - mappings[17] = EntityType.Breeze; - mappings[18] = EntityType.BreezeWindCharge; - mappings[19] = EntityType.Camel; - mappings[20] = EntityType.CamelHusk; - mappings[21] = EntityType.Cat; - mappings[22] = EntityType.CaveSpider; - mappings[23] = EntityType.CherryBoat; - mappings[24] = EntityType.CherryChestBoat; - mappings[25] = EntityType.ChestMinecart; - mappings[26] = EntityType.Chicken; - mappings[27] = EntityType.Cod; - mappings[28] = EntityType.CopperGolem; - mappings[29] = EntityType.CommandBlockMinecart; - mappings[30] = EntityType.Cow; - mappings[31] = EntityType.Creaking; - mappings[32] = EntityType.Creeper; - mappings[33] = EntityType.DarkOakBoat; - mappings[34] = EntityType.DarkOakChestBoat; - mappings[35] = EntityType.Dolphin; - mappings[36] = EntityType.Donkey; - mappings[37] = EntityType.DragonFireball; - mappings[38] = EntityType.Drowned; - mappings[39] = EntityType.Egg; - mappings[40] = EntityType.ElderGuardian; - mappings[41] = EntityType.Enderman; - mappings[42] = EntityType.Endermite; - mappings[43] = EntityType.EnderDragon; - mappings[44] = EntityType.EnderPearl; - mappings[45] = EntityType.EndCrystal; - mappings[46] = EntityType.Evoker; - mappings[47] = EntityType.EvokerFangs; - mappings[48] = EntityType.ExperienceBottle; - mappings[49] = EntityType.ExperienceOrb; - mappings[50] = EntityType.EyeOfEnder; - mappings[51] = EntityType.FallingBlock; - mappings[52] = EntityType.Fireball; - mappings[53] = EntityType.FireworkRocket; - mappings[54] = EntityType.Fox; - mappings[55] = EntityType.Frog; - mappings[56] = EntityType.FurnaceMinecart; - mappings[57] = EntityType.Ghast; - mappings[58] = EntityType.HappyGhast; - mappings[59] = EntityType.Giant; - mappings[60] = EntityType.GlowItemFrame; - mappings[61] = EntityType.GlowSquid; - mappings[62] = EntityType.Goat; - mappings[63] = EntityType.Guardian; - mappings[64] = EntityType.Hoglin; - mappings[65] = EntityType.HopperMinecart; - mappings[66] = EntityType.Horse; - mappings[67] = EntityType.Husk; - mappings[68] = EntityType.Illusioner; - mappings[69] = EntityType.Interaction; - mappings[70] = EntityType.IronGolem; - mappings[71] = EntityType.Item; - mappings[72] = EntityType.ItemDisplay; - mappings[73] = EntityType.ItemFrame; - mappings[74] = EntityType.JungleBoat; - mappings[75] = EntityType.JungleChestBoat; - mappings[76] = EntityType.LeashKnot; - mappings[77] = EntityType.LightningBolt; - mappings[78] = EntityType.Llama; - mappings[79] = EntityType.LlamaSpit; - mappings[80] = EntityType.MagmaCube; - mappings[81] = EntityType.MangroveBoat; - mappings[82] = EntityType.MangroveChestBoat; - mappings[83] = EntityType.Mannequin; - mappings[84] = EntityType.Marker; - mappings[85] = EntityType.Minecart; - mappings[86] = EntityType.Mooshroom; - mappings[87] = EntityType.Mule; - mappings[88] = EntityType.Nautilus; - mappings[89] = EntityType.OakBoat; - mappings[90] = EntityType.OakChestBoat; - mappings[91] = EntityType.Ocelot; - mappings[92] = EntityType.OminousItemSpawner; - mappings[93] = EntityType.Painting; - mappings[94] = EntityType.PaleOakBoat; - mappings[95] = EntityType.PaleOakChestBoat; - mappings[96] = EntityType.Panda; - mappings[97] = EntityType.Parched; - mappings[98] = EntityType.Parrot; - mappings[99] = EntityType.Phantom; - mappings[100] = EntityType.Pig; - mappings[101] = EntityType.Piglin; - mappings[102] = EntityType.PiglinBrute; - mappings[103] = EntityType.Pillager; - mappings[104] = EntityType.PolarBear; - mappings[105] = EntityType.SplashPotion; - mappings[106] = EntityType.LingeringPotion; - mappings[107] = EntityType.Pufferfish; - mappings[108] = EntityType.Rabbit; - mappings[109] = EntityType.Ravager; - mappings[110] = EntityType.Salmon; - mappings[111] = EntityType.Sheep; - mappings[112] = EntityType.Shulker; - mappings[113] = EntityType.ShulkerBullet; - mappings[114] = EntityType.Silverfish; - mappings[115] = EntityType.Skeleton; - mappings[116] = EntityType.SkeletonHorse; - mappings[117] = EntityType.Slime; - mappings[118] = EntityType.SmallFireball; - mappings[119] = EntityType.Sniffer; - mappings[120] = EntityType.Snowball; - mappings[121] = EntityType.SnowGolem; - mappings[122] = EntityType.SpawnerMinecart; - mappings[123] = EntityType.SpectralArrow; - mappings[124] = EntityType.Spider; - mappings[125] = EntityType.SpruceBoat; - mappings[126] = EntityType.SpruceChestBoat; - mappings[127] = EntityType.Squid; - mappings[128] = EntityType.Stray; - mappings[129] = EntityType.Strider; - mappings[130] = EntityType.Tadpole; - mappings[131] = EntityType.TextDisplay; - mappings[132] = EntityType.Tnt; - mappings[133] = EntityType.TntMinecart; - mappings[134] = EntityType.TraderLlama; - mappings[135] = EntityType.Trident; - mappings[136] = EntityType.TropicalFish; - mappings[137] = EntityType.Turtle; - mappings[138] = EntityType.Vex; - mappings[139] = EntityType.Villager; - mappings[140] = EntityType.Vindicator; - mappings[141] = EntityType.WanderingTrader; - mappings[142] = EntityType.Warden; - mappings[143] = EntityType.WindCharge; - mappings[144] = EntityType.Witch; - mappings[145] = EntityType.Wither; - mappings[146] = EntityType.WitherSkeleton; - mappings[147] = EntityType.WitherSkull; - mappings[148] = EntityType.Wolf; - mappings[149] = EntityType.Zoglin; - mappings[150] = EntityType.Zombie; - mappings[151] = EntityType.ZombieHorse; - mappings[152] = EntityType.ZombieNautilus; - mappings[153] = EntityType.ZombieVillager; - mappings[154] = EntityType.ZombifiedPiglin; - mappings[155] = EntityType.Player; - mappings[156] = EntityType.FishingBobber; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette1212.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette1212.cs deleted file mode 100644 index 894738d2a1..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette1212.cs +++ /dev/null @@ -1,168 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - public class EntityPalette1212 : EntityPalette - { - private static readonly Dictionary mappings = new(); - - static EntityPalette1212() - { - mappings[0] = EntityType.AcaciaBoat; - mappings[1] = EntityType.AcaciaChestBoat; - mappings[2] = EntityType.Allay; - mappings[3] = EntityType.AreaEffectCloud; - mappings[4] = EntityType.Armadillo; - mappings[5] = EntityType.ArmorStand; - mappings[6] = EntityType.Arrow; - mappings[7] = EntityType.Axolotl; - mappings[8] = EntityType.BambooChestRaft; - mappings[9] = EntityType.BambooRaft; - mappings[10] = EntityType.Bat; - mappings[11] = EntityType.Bee; - mappings[12] = EntityType.BirchBoat; - mappings[13] = EntityType.BirchChestBoat; - mappings[14] = EntityType.Blaze; - mappings[15] = EntityType.BlockDisplay; - mappings[16] = EntityType.Bogged; - mappings[17] = EntityType.Breeze; - mappings[18] = EntityType.BreezeWindCharge; - mappings[19] = EntityType.Camel; - mappings[20] = EntityType.Cat; - mappings[21] = EntityType.CaveSpider; - mappings[22] = EntityType.CherryBoat; - mappings[23] = EntityType.CherryChestBoat; - mappings[24] = EntityType.ChestMinecart; - mappings[25] = EntityType.Chicken; - mappings[26] = EntityType.Cod; - mappings[27] = EntityType.CommandBlockMinecart; - mappings[28] = EntityType.Cow; - mappings[29] = EntityType.Creaking; - mappings[30] = EntityType.CreakingTransient; - mappings[31] = EntityType.Creeper; - mappings[32] = EntityType.DarkOakBoat; - mappings[33] = EntityType.DarkOakChestBoat; - mappings[34] = EntityType.Dolphin; - mappings[35] = EntityType.Donkey; - mappings[36] = EntityType.DragonFireball; - mappings[37] = EntityType.Drowned; - mappings[38] = EntityType.Egg; - mappings[39] = EntityType.ElderGuardian; - mappings[40] = EntityType.Enderman; - mappings[41] = EntityType.Endermite; - mappings[42] = EntityType.EnderDragon; - mappings[43] = EntityType.EnderPearl; - mappings[44] = EntityType.EndCrystal; - mappings[45] = EntityType.Evoker; - mappings[46] = EntityType.EvokerFangs; - mappings[47] = EntityType.ExperienceBottle; - mappings[48] = EntityType.ExperienceOrb; - mappings[49] = EntityType.EyeOfEnder; - mappings[50] = EntityType.FallingBlock; - mappings[51] = EntityType.Fireball; - mappings[52] = EntityType.FireworkRocket; - mappings[53] = EntityType.Fox; - mappings[54] = EntityType.Frog; - mappings[55] = EntityType.FurnaceMinecart; - mappings[56] = EntityType.Ghast; - mappings[57] = EntityType.Giant; - mappings[58] = EntityType.GlowItemFrame; - mappings[59] = EntityType.GlowSquid; - mappings[60] = EntityType.Goat; - mappings[61] = EntityType.Guardian; - mappings[62] = EntityType.Hoglin; - mappings[63] = EntityType.HopperMinecart; - mappings[64] = EntityType.Horse; - mappings[65] = EntityType.Husk; - mappings[66] = EntityType.Illusioner; - mappings[67] = EntityType.Interaction; - mappings[68] = EntityType.IronGolem; - mappings[69] = EntityType.Item; - mappings[70] = EntityType.ItemDisplay; - mappings[71] = EntityType.ItemFrame; - mappings[72] = EntityType.JungleBoat; - mappings[73] = EntityType.JungleChestBoat; - mappings[74] = EntityType.LeashKnot; - mappings[75] = EntityType.LightningBolt; - mappings[76] = EntityType.Llama; - mappings[77] = EntityType.LlamaSpit; - mappings[78] = EntityType.MagmaCube; - mappings[79] = EntityType.MangroveBoat; - mappings[80] = EntityType.MangroveChestBoat; - mappings[81] = EntityType.Marker; - mappings[82] = EntityType.Minecart; - mappings[83] = EntityType.Mooshroom; - mappings[84] = EntityType.Mule; - mappings[85] = EntityType.OakBoat; - mappings[86] = EntityType.OakChestBoat; - mappings[87] = EntityType.Ocelot; - mappings[88] = EntityType.OminousItemSpawner; - mappings[89] = EntityType.Painting; - mappings[90] = EntityType.PaleOakBoat; - mappings[91] = EntityType.PaleOakChestBoat; - mappings[92] = EntityType.Panda; - mappings[93] = EntityType.Parrot; - mappings[94] = EntityType.Phantom; - mappings[95] = EntityType.Pig; - mappings[96] = EntityType.Piglin; - mappings[97] = EntityType.PiglinBrute; - mappings[98] = EntityType.Pillager; - mappings[99] = EntityType.PolarBear; - mappings[100] = EntityType.Potion; - mappings[101] = EntityType.Pufferfish; - mappings[102] = EntityType.Rabbit; - mappings[103] = EntityType.Ravager; - mappings[104] = EntityType.Salmon; - mappings[105] = EntityType.Sheep; - mappings[106] = EntityType.Shulker; - mappings[107] = EntityType.ShulkerBullet; - mappings[108] = EntityType.Silverfish; - mappings[109] = EntityType.Skeleton; - mappings[110] = EntityType.SkeletonHorse; - mappings[111] = EntityType.Slime; - mappings[112] = EntityType.SmallFireball; - mappings[113] = EntityType.Sniffer; - mappings[114] = EntityType.Snowball; - mappings[115] = EntityType.SnowGolem; - mappings[116] = EntityType.SpawnerMinecart; - mappings[117] = EntityType.SpectralArrow; - mappings[118] = EntityType.Spider; - mappings[119] = EntityType.SpruceBoat; - mappings[120] = EntityType.SpruceChestBoat; - mappings[121] = EntityType.Squid; - mappings[122] = EntityType.Stray; - mappings[123] = EntityType.Strider; - mappings[124] = EntityType.Tadpole; - mappings[125] = EntityType.TextDisplay; - mappings[126] = EntityType.Tnt; - mappings[127] = EntityType.TntMinecart; - mappings[128] = EntityType.TraderLlama; - mappings[129] = EntityType.Trident; - mappings[130] = EntityType.TropicalFish; - mappings[131] = EntityType.Turtle; - mappings[132] = EntityType.Vex; - mappings[133] = EntityType.Villager; - mappings[134] = EntityType.Vindicator; - mappings[135] = EntityType.WanderingTrader; - mappings[136] = EntityType.Warden; - mappings[137] = EntityType.WindCharge; - mappings[138] = EntityType.Witch; - mappings[139] = EntityType.Wither; - mappings[140] = EntityType.WitherSkeleton; - mappings[141] = EntityType.WitherSkull; - mappings[142] = EntityType.Wolf; - mappings[143] = EntityType.Zoglin; - mappings[144] = EntityType.Zombie; - mappings[145] = EntityType.ZombieHorse; - mappings[146] = EntityType.ZombieVillager; - mappings[147] = EntityType.ZombifiedPiglin; - mappings[148] = EntityType.Player; - mappings[149] = EntityType.FishingBobber; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette1214.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette1214.cs deleted file mode 100644 index dd047d1dba..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette1214.cs +++ /dev/null @@ -1,168 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - public class EntityPalette1214 : EntityPalette - { - private static readonly Dictionary mappings = new(); - - static EntityPalette1214() - { - mappings[0] = EntityType.AcaciaBoat; - mappings[1] = EntityType.AcaciaChestBoat; - mappings[2] = EntityType.Allay; - mappings[3] = EntityType.AreaEffectCloud; - mappings[4] = EntityType.Armadillo; - mappings[5] = EntityType.ArmorStand; - mappings[6] = EntityType.Arrow; - mappings[7] = EntityType.Axolotl; - mappings[8] = EntityType.BambooChestRaft; - mappings[9] = EntityType.BambooRaft; - mappings[10] = EntityType.Bat; - mappings[11] = EntityType.Bee; - mappings[12] = EntityType.BirchBoat; - mappings[13] = EntityType.BirchChestBoat; - mappings[14] = EntityType.Blaze; - mappings[15] = EntityType.BlockDisplay; - mappings[16] = EntityType.Bogged; - mappings[17] = EntityType.Breeze; - mappings[18] = EntityType.BreezeWindCharge; - mappings[19] = EntityType.Camel; - mappings[20] = EntityType.Cat; - mappings[21] = EntityType.CaveSpider; - mappings[22] = EntityType.CherryBoat; - mappings[23] = EntityType.CherryChestBoat; - mappings[24] = EntityType.ChestMinecart; - mappings[25] = EntityType.Chicken; - mappings[26] = EntityType.Cod; - mappings[27] = EntityType.CommandBlockMinecart; - mappings[28] = EntityType.Cow; - mappings[29] = EntityType.Creaking; - // CreakingTransient removed in 1.21.4 - mappings[30] = EntityType.Creeper; - mappings[31] = EntityType.DarkOakBoat; - mappings[32] = EntityType.DarkOakChestBoat; - mappings[33] = EntityType.Dolphin; - mappings[34] = EntityType.Donkey; - mappings[35] = EntityType.DragonFireball; - mappings[36] = EntityType.Drowned; - mappings[37] = EntityType.Egg; - mappings[38] = EntityType.ElderGuardian; - mappings[39] = EntityType.Enderman; - mappings[40] = EntityType.Endermite; - mappings[41] = EntityType.EnderDragon; - mappings[42] = EntityType.EnderPearl; - mappings[43] = EntityType.EndCrystal; - mappings[44] = EntityType.Evoker; - mappings[45] = EntityType.EvokerFangs; - mappings[46] = EntityType.ExperienceBottle; - mappings[47] = EntityType.ExperienceOrb; - mappings[48] = EntityType.EyeOfEnder; - mappings[49] = EntityType.FallingBlock; - mappings[50] = EntityType.Fireball; - mappings[51] = EntityType.FireworkRocket; - mappings[52] = EntityType.Fox; - mappings[53] = EntityType.Frog; - mappings[54] = EntityType.FurnaceMinecart; - mappings[55] = EntityType.Ghast; - mappings[56] = EntityType.Giant; - mappings[57] = EntityType.GlowItemFrame; - mappings[58] = EntityType.GlowSquid; - mappings[59] = EntityType.Goat; - mappings[60] = EntityType.Guardian; - mappings[61] = EntityType.Hoglin; - mappings[62] = EntityType.HopperMinecart; - mappings[63] = EntityType.Horse; - mappings[64] = EntityType.Husk; - mappings[65] = EntityType.Illusioner; - mappings[66] = EntityType.Interaction; - mappings[67] = EntityType.IronGolem; - mappings[68] = EntityType.Item; - mappings[69] = EntityType.ItemDisplay; - mappings[70] = EntityType.ItemFrame; - mappings[71] = EntityType.JungleBoat; - mappings[72] = EntityType.JungleChestBoat; - mappings[73] = EntityType.LeashKnot; - mappings[74] = EntityType.LightningBolt; - mappings[75] = EntityType.Llama; - mappings[76] = EntityType.LlamaSpit; - mappings[77] = EntityType.MagmaCube; - mappings[78] = EntityType.MangroveBoat; - mappings[79] = EntityType.MangroveChestBoat; - mappings[80] = EntityType.Marker; - mappings[81] = EntityType.Minecart; - mappings[82] = EntityType.Mooshroom; - mappings[83] = EntityType.Mule; - mappings[84] = EntityType.OakBoat; - mappings[85] = EntityType.OakChestBoat; - mappings[86] = EntityType.Ocelot; - mappings[87] = EntityType.OminousItemSpawner; - mappings[88] = EntityType.Painting; - mappings[89] = EntityType.PaleOakBoat; - mappings[90] = EntityType.PaleOakChestBoat; - mappings[91] = EntityType.Panda; - mappings[92] = EntityType.Parrot; - mappings[93] = EntityType.Phantom; - mappings[94] = EntityType.Pig; - mappings[95] = EntityType.Piglin; - mappings[96] = EntityType.PiglinBrute; - mappings[97] = EntityType.Pillager; - mappings[98] = EntityType.PolarBear; - mappings[99] = EntityType.Potion; - mappings[100] = EntityType.Pufferfish; - mappings[101] = EntityType.Rabbit; - mappings[102] = EntityType.Ravager; - mappings[103] = EntityType.Salmon; - mappings[104] = EntityType.Sheep; - mappings[105] = EntityType.Shulker; - mappings[106] = EntityType.ShulkerBullet; - mappings[107] = EntityType.Silverfish; - mappings[108] = EntityType.Skeleton; - mappings[109] = EntityType.SkeletonHorse; - mappings[110] = EntityType.Slime; - mappings[111] = EntityType.SmallFireball; - mappings[112] = EntityType.Sniffer; - mappings[113] = EntityType.Snowball; - mappings[114] = EntityType.SnowGolem; - mappings[115] = EntityType.SpawnerMinecart; - mappings[116] = EntityType.SpectralArrow; - mappings[117] = EntityType.Spider; - mappings[118] = EntityType.SpruceBoat; - mappings[119] = EntityType.SpruceChestBoat; - mappings[120] = EntityType.Squid; - mappings[121] = EntityType.Stray; - mappings[122] = EntityType.Strider; - mappings[123] = EntityType.Tadpole; - mappings[124] = EntityType.TextDisplay; - mappings[125] = EntityType.Tnt; - mappings[126] = EntityType.TntMinecart; - mappings[127] = EntityType.TraderLlama; - mappings[128] = EntityType.Trident; - mappings[129] = EntityType.TropicalFish; - mappings[130] = EntityType.Turtle; - mappings[131] = EntityType.Vex; - mappings[132] = EntityType.Villager; - mappings[133] = EntityType.Vindicator; - mappings[134] = EntityType.WanderingTrader; - mappings[135] = EntityType.Warden; - mappings[136] = EntityType.WindCharge; - mappings[137] = EntityType.Witch; - mappings[138] = EntityType.Wither; - mappings[139] = EntityType.WitherSkeleton; - mappings[140] = EntityType.WitherSkull; - mappings[141] = EntityType.Wolf; - mappings[142] = EntityType.Zoglin; - mappings[143] = EntityType.Zombie; - mappings[144] = EntityType.ZombieHorse; - mappings[145] = EntityType.ZombieVillager; - mappings[146] = EntityType.ZombifiedPiglin; - mappings[147] = EntityType.Player; - mappings[148] = EntityType.FishingBobber; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette1215.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette1215.cs deleted file mode 100644 index ebfe6ab381..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette1215.cs +++ /dev/null @@ -1,168 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - public class EntityPalette1215 : EntityPalette - { - private static readonly Dictionary mappings = new(); - - static EntityPalette1215() - { - mappings[0] = EntityType.AcaciaBoat; - mappings[1] = EntityType.AcaciaChestBoat; - mappings[2] = EntityType.Allay; - mappings[3] = EntityType.AreaEffectCloud; - mappings[4] = EntityType.Armadillo; - mappings[5] = EntityType.ArmorStand; - mappings[6] = EntityType.Arrow; - mappings[7] = EntityType.Axolotl; - mappings[8] = EntityType.BambooChestRaft; - mappings[9] = EntityType.BambooRaft; - mappings[10] = EntityType.Bat; - mappings[11] = EntityType.Bee; - mappings[12] = EntityType.BirchBoat; - mappings[13] = EntityType.BirchChestBoat; - mappings[14] = EntityType.Blaze; - mappings[15] = EntityType.BlockDisplay; - mappings[16] = EntityType.Bogged; - mappings[17] = EntityType.Breeze; - mappings[18] = EntityType.BreezeWindCharge; - mappings[19] = EntityType.Camel; - mappings[20] = EntityType.Cat; - mappings[21] = EntityType.CaveSpider; - mappings[22] = EntityType.CherryBoat; - mappings[23] = EntityType.CherryChestBoat; - mappings[24] = EntityType.ChestMinecart; - mappings[25] = EntityType.Chicken; - mappings[26] = EntityType.Cod; - mappings[27] = EntityType.CommandBlockMinecart; - mappings[28] = EntityType.Cow; - mappings[29] = EntityType.Creaking; - mappings[30] = EntityType.Creeper; - mappings[31] = EntityType.DarkOakBoat; - mappings[32] = EntityType.DarkOakChestBoat; - mappings[33] = EntityType.Dolphin; - mappings[34] = EntityType.Donkey; - mappings[35] = EntityType.DragonFireball; - mappings[36] = EntityType.Drowned; - mappings[37] = EntityType.Egg; - mappings[38] = EntityType.ElderGuardian; - mappings[39] = EntityType.Enderman; - mappings[40] = EntityType.Endermite; - mappings[41] = EntityType.EnderDragon; - mappings[42] = EntityType.EnderPearl; - mappings[43] = EntityType.EndCrystal; - mappings[44] = EntityType.Evoker; - mappings[45] = EntityType.EvokerFangs; - mappings[46] = EntityType.ExperienceBottle; - mappings[47] = EntityType.ExperienceOrb; - mappings[48] = EntityType.EyeOfEnder; - mappings[49] = EntityType.FallingBlock; - mappings[50] = EntityType.Fireball; - mappings[51] = EntityType.FireworkRocket; - mappings[52] = EntityType.Fox; - mappings[53] = EntityType.Frog; - mappings[54] = EntityType.FurnaceMinecart; - mappings[55] = EntityType.Ghast; - mappings[56] = EntityType.Giant; - mappings[57] = EntityType.GlowItemFrame; - mappings[58] = EntityType.GlowSquid; - mappings[59] = EntityType.Goat; - mappings[60] = EntityType.Guardian; - mappings[61] = EntityType.Hoglin; - mappings[62] = EntityType.HopperMinecart; - mappings[63] = EntityType.Horse; - mappings[64] = EntityType.Husk; - mappings[65] = EntityType.Illusioner; - mappings[66] = EntityType.Interaction; - mappings[67] = EntityType.IronGolem; - mappings[68] = EntityType.Item; - mappings[69] = EntityType.ItemDisplay; - mappings[70] = EntityType.ItemFrame; - mappings[71] = EntityType.JungleBoat; - mappings[72] = EntityType.JungleChestBoat; - mappings[73] = EntityType.LeashKnot; - mappings[74] = EntityType.LightningBolt; - mappings[75] = EntityType.Llama; - mappings[76] = EntityType.LlamaSpit; - mappings[77] = EntityType.MagmaCube; - mappings[78] = EntityType.MangroveBoat; - mappings[79] = EntityType.MangroveChestBoat; - mappings[80] = EntityType.Marker; - mappings[81] = EntityType.Minecart; - mappings[82] = EntityType.Mooshroom; - mappings[83] = EntityType.Mule; - mappings[84] = EntityType.OakBoat; - mappings[85] = EntityType.OakChestBoat; - mappings[86] = EntityType.Ocelot; - mappings[87] = EntityType.OminousItemSpawner; - mappings[88] = EntityType.Painting; - mappings[89] = EntityType.PaleOakBoat; - mappings[90] = EntityType.PaleOakChestBoat; - mappings[91] = EntityType.Panda; - mappings[92] = EntityType.Parrot; - mappings[93] = EntityType.Phantom; - mappings[94] = EntityType.Pig; - mappings[95] = EntityType.Piglin; - mappings[96] = EntityType.PiglinBrute; - mappings[97] = EntityType.Pillager; - mappings[98] = EntityType.PolarBear; - mappings[99] = EntityType.SplashPotion; - mappings[100] = EntityType.LingeringPotion; - mappings[101] = EntityType.Pufferfish; - mappings[102] = EntityType.Rabbit; - mappings[103] = EntityType.Ravager; - mappings[104] = EntityType.Salmon; - mappings[105] = EntityType.Sheep; - mappings[106] = EntityType.Shulker; - mappings[107] = EntityType.ShulkerBullet; - mappings[108] = EntityType.Silverfish; - mappings[109] = EntityType.Skeleton; - mappings[110] = EntityType.SkeletonHorse; - mappings[111] = EntityType.Slime; - mappings[112] = EntityType.SmallFireball; - mappings[113] = EntityType.Sniffer; - mappings[114] = EntityType.Snowball; - mappings[115] = EntityType.SnowGolem; - mappings[116] = EntityType.SpawnerMinecart; - mappings[117] = EntityType.SpectralArrow; - mappings[118] = EntityType.Spider; - mappings[119] = EntityType.SpruceBoat; - mappings[120] = EntityType.SpruceChestBoat; - mappings[121] = EntityType.Squid; - mappings[122] = EntityType.Stray; - mappings[123] = EntityType.Strider; - mappings[124] = EntityType.Tadpole; - mappings[125] = EntityType.TextDisplay; - mappings[126] = EntityType.Tnt; - mappings[127] = EntityType.TntMinecart; - mappings[128] = EntityType.TraderLlama; - mappings[129] = EntityType.Trident; - mappings[130] = EntityType.TropicalFish; - mappings[131] = EntityType.Turtle; - mappings[132] = EntityType.Vex; - mappings[133] = EntityType.Villager; - mappings[134] = EntityType.Vindicator; - mappings[135] = EntityType.WanderingTrader; - mappings[136] = EntityType.Warden; - mappings[137] = EntityType.WindCharge; - mappings[138] = EntityType.Witch; - mappings[139] = EntityType.Wither; - mappings[140] = EntityType.WitherSkeleton; - mappings[141] = EntityType.WitherSkull; - mappings[142] = EntityType.Wolf; - mappings[143] = EntityType.Zoglin; - mappings[144] = EntityType.Zombie; - mappings[145] = EntityType.ZombieHorse; - mappings[146] = EntityType.ZombieVillager; - mappings[147] = EntityType.ZombifiedPiglin; - mappings[148] = EntityType.Player; - mappings[149] = EntityType.FishingBobber; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette1216.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette1216.cs deleted file mode 100644 index c0cb6b7697..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette1216.cs +++ /dev/null @@ -1,169 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - public class EntityPalette1216 : EntityPalette - { - private static readonly Dictionary mappings = new(); - - static EntityPalette1216() - { - mappings[0] = EntityType.AcaciaBoat; - mappings[1] = EntityType.AcaciaChestBoat; - mappings[2] = EntityType.Allay; - mappings[3] = EntityType.AreaEffectCloud; - mappings[4] = EntityType.Armadillo; - mappings[5] = EntityType.ArmorStand; - mappings[6] = EntityType.Arrow; - mappings[7] = EntityType.Axolotl; - mappings[8] = EntityType.BambooChestRaft; - mappings[9] = EntityType.BambooRaft; - mappings[10] = EntityType.Bat; - mappings[11] = EntityType.Bee; - mappings[12] = EntityType.BirchBoat; - mappings[13] = EntityType.BirchChestBoat; - mappings[14] = EntityType.Blaze; - mappings[15] = EntityType.BlockDisplay; - mappings[16] = EntityType.Bogged; - mappings[17] = EntityType.Breeze; - mappings[18] = EntityType.BreezeWindCharge; - mappings[19] = EntityType.Camel; - mappings[20] = EntityType.Cat; - mappings[21] = EntityType.CaveSpider; - mappings[22] = EntityType.CherryBoat; - mappings[23] = EntityType.CherryChestBoat; - mappings[24] = EntityType.ChestMinecart; - mappings[25] = EntityType.Chicken; - mappings[26] = EntityType.Cod; - mappings[27] = EntityType.CommandBlockMinecart; - mappings[28] = EntityType.Cow; - mappings[29] = EntityType.Creaking; - mappings[30] = EntityType.Creeper; - mappings[31] = EntityType.DarkOakBoat; - mappings[32] = EntityType.DarkOakChestBoat; - mappings[33] = EntityType.Dolphin; - mappings[34] = EntityType.Donkey; - mappings[35] = EntityType.DragonFireball; - mappings[36] = EntityType.Drowned; - mappings[37] = EntityType.Egg; - mappings[38] = EntityType.ElderGuardian; - mappings[39] = EntityType.Enderman; - mappings[40] = EntityType.Endermite; - mappings[41] = EntityType.EnderDragon; - mappings[42] = EntityType.EnderPearl; - mappings[43] = EntityType.EndCrystal; - mappings[44] = EntityType.Evoker; - mappings[45] = EntityType.EvokerFangs; - mappings[46] = EntityType.ExperienceBottle; - mappings[47] = EntityType.ExperienceOrb; - mappings[48] = EntityType.EyeOfEnder; - mappings[49] = EntityType.FallingBlock; - mappings[50] = EntityType.Fireball; - mappings[51] = EntityType.FireworkRocket; - mappings[52] = EntityType.Fox; - mappings[53] = EntityType.Frog; - mappings[54] = EntityType.FurnaceMinecart; - mappings[55] = EntityType.Ghast; - mappings[56] = EntityType.HappyGhast; - mappings[57] = EntityType.Giant; - mappings[58] = EntityType.GlowItemFrame; - mappings[59] = EntityType.GlowSquid; - mappings[60] = EntityType.Goat; - mappings[61] = EntityType.Guardian; - mappings[62] = EntityType.Hoglin; - mappings[63] = EntityType.HopperMinecart; - mappings[64] = EntityType.Horse; - mappings[65] = EntityType.Husk; - mappings[66] = EntityType.Illusioner; - mappings[67] = EntityType.Interaction; - mappings[68] = EntityType.IronGolem; - mappings[69] = EntityType.Item; - mappings[70] = EntityType.ItemDisplay; - mappings[71] = EntityType.ItemFrame; - mappings[72] = EntityType.JungleBoat; - mappings[73] = EntityType.JungleChestBoat; - mappings[74] = EntityType.LeashKnot; - mappings[75] = EntityType.LightningBolt; - mappings[76] = EntityType.Llama; - mappings[77] = EntityType.LlamaSpit; - mappings[78] = EntityType.MagmaCube; - mappings[79] = EntityType.MangroveBoat; - mappings[80] = EntityType.MangroveChestBoat; - mappings[81] = EntityType.Marker; - mappings[82] = EntityType.Minecart; - mappings[83] = EntityType.Mooshroom; - mappings[84] = EntityType.Mule; - mappings[85] = EntityType.OakBoat; - mappings[86] = EntityType.OakChestBoat; - mappings[87] = EntityType.Ocelot; - mappings[88] = EntityType.OminousItemSpawner; - mappings[89] = EntityType.Painting; - mappings[90] = EntityType.PaleOakBoat; - mappings[91] = EntityType.PaleOakChestBoat; - mappings[92] = EntityType.Panda; - mappings[93] = EntityType.Parrot; - mappings[94] = EntityType.Phantom; - mappings[95] = EntityType.Pig; - mappings[96] = EntityType.Piglin; - mappings[97] = EntityType.PiglinBrute; - mappings[98] = EntityType.Pillager; - mappings[99] = EntityType.PolarBear; - mappings[100] = EntityType.SplashPotion; - mappings[101] = EntityType.LingeringPotion; - mappings[102] = EntityType.Pufferfish; - mappings[103] = EntityType.Rabbit; - mappings[104] = EntityType.Ravager; - mappings[105] = EntityType.Salmon; - mappings[106] = EntityType.Sheep; - mappings[107] = EntityType.Shulker; - mappings[108] = EntityType.ShulkerBullet; - mappings[109] = EntityType.Silverfish; - mappings[110] = EntityType.Skeleton; - mappings[111] = EntityType.SkeletonHorse; - mappings[112] = EntityType.Slime; - mappings[113] = EntityType.SmallFireball; - mappings[114] = EntityType.Sniffer; - mappings[115] = EntityType.Snowball; - mappings[116] = EntityType.SnowGolem; - mappings[117] = EntityType.SpawnerMinecart; - mappings[118] = EntityType.SpectralArrow; - mappings[119] = EntityType.Spider; - mappings[120] = EntityType.SpruceBoat; - mappings[121] = EntityType.SpruceChestBoat; - mappings[122] = EntityType.Squid; - mappings[123] = EntityType.Stray; - mappings[124] = EntityType.Strider; - mappings[125] = EntityType.Tadpole; - mappings[126] = EntityType.TextDisplay; - mappings[127] = EntityType.Tnt; - mappings[128] = EntityType.TntMinecart; - mappings[129] = EntityType.TraderLlama; - mappings[130] = EntityType.Trident; - mappings[131] = EntityType.TropicalFish; - mappings[132] = EntityType.Turtle; - mappings[133] = EntityType.Vex; - mappings[134] = EntityType.Villager; - mappings[135] = EntityType.Vindicator; - mappings[136] = EntityType.WanderingTrader; - mappings[137] = EntityType.Warden; - mappings[138] = EntityType.WindCharge; - mappings[139] = EntityType.Witch; - mappings[140] = EntityType.Wither; - mappings[141] = EntityType.WitherSkeleton; - mappings[142] = EntityType.WitherSkull; - mappings[143] = EntityType.Wolf; - mappings[144] = EntityType.Zoglin; - mappings[145] = EntityType.Zombie; - mappings[146] = EntityType.ZombieHorse; - mappings[147] = EntityType.ZombieVillager; - mappings[148] = EntityType.ZombifiedPiglin; - mappings[149] = EntityType.Player; - mappings[150] = EntityType.FishingBobber; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette1219.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette1219.cs deleted file mode 100644 index 448bdbcc14..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette1219.cs +++ /dev/null @@ -1,171 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - public class EntityPalette1219 : EntityPalette - { - private static readonly Dictionary mappings = new(); - - static EntityPalette1219() - { - mappings[0] = EntityType.AcaciaBoat; - mappings[1] = EntityType.AcaciaChestBoat; - mappings[2] = EntityType.Allay; - mappings[3] = EntityType.AreaEffectCloud; - mappings[4] = EntityType.Armadillo; - mappings[5] = EntityType.ArmorStand; - mappings[6] = EntityType.Arrow; - mappings[7] = EntityType.Axolotl; - mappings[8] = EntityType.BambooChestRaft; - mappings[9] = EntityType.BambooRaft; - mappings[10] = EntityType.Bat; - mappings[11] = EntityType.Bee; - mappings[12] = EntityType.BirchBoat; - mappings[13] = EntityType.BirchChestBoat; - mappings[14] = EntityType.Blaze; - mappings[15] = EntityType.BlockDisplay; - mappings[16] = EntityType.Bogged; - mappings[17] = EntityType.Breeze; - mappings[18] = EntityType.BreezeWindCharge; - mappings[19] = EntityType.Camel; - mappings[20] = EntityType.Cat; - mappings[21] = EntityType.CaveSpider; - mappings[22] = EntityType.CherryBoat; - mappings[23] = EntityType.CherryChestBoat; - mappings[24] = EntityType.ChestMinecart; - mappings[25] = EntityType.Chicken; - mappings[26] = EntityType.Cod; - mappings[27] = EntityType.CopperGolem; - mappings[28] = EntityType.CommandBlockMinecart; - mappings[29] = EntityType.Cow; - mappings[30] = EntityType.Creaking; - mappings[31] = EntityType.Creeper; - mappings[32] = EntityType.DarkOakBoat; - mappings[33] = EntityType.DarkOakChestBoat; - mappings[34] = EntityType.Dolphin; - mappings[35] = EntityType.Donkey; - mappings[36] = EntityType.DragonFireball; - mappings[37] = EntityType.Drowned; - mappings[38] = EntityType.Egg; - mappings[39] = EntityType.ElderGuardian; - mappings[40] = EntityType.Enderman; - mappings[41] = EntityType.Endermite; - mappings[42] = EntityType.EnderDragon; - mappings[43] = EntityType.EnderPearl; - mappings[44] = EntityType.EndCrystal; - mappings[45] = EntityType.Evoker; - mappings[46] = EntityType.EvokerFangs; - mappings[47] = EntityType.ExperienceBottle; - mappings[48] = EntityType.ExperienceOrb; - mappings[49] = EntityType.EyeOfEnder; - mappings[50] = EntityType.FallingBlock; - mappings[51] = EntityType.Fireball; - mappings[52] = EntityType.FireworkRocket; - mappings[53] = EntityType.Fox; - mappings[54] = EntityType.Frog; - mappings[55] = EntityType.FurnaceMinecart; - mappings[56] = EntityType.Ghast; - mappings[57] = EntityType.HappyGhast; - mappings[58] = EntityType.Giant; - mappings[59] = EntityType.GlowItemFrame; - mappings[60] = EntityType.GlowSquid; - mappings[61] = EntityType.Goat; - mappings[62] = EntityType.Guardian; - mappings[63] = EntityType.Hoglin; - mappings[64] = EntityType.HopperMinecart; - mappings[65] = EntityType.Horse; - mappings[66] = EntityType.Husk; - mappings[67] = EntityType.Illusioner; - mappings[68] = EntityType.Interaction; - mappings[69] = EntityType.IronGolem; - mappings[70] = EntityType.Item; - mappings[71] = EntityType.ItemDisplay; - mappings[72] = EntityType.ItemFrame; - mappings[73] = EntityType.JungleBoat; - mappings[74] = EntityType.JungleChestBoat; - mappings[75] = EntityType.LeashKnot; - mappings[76] = EntityType.LightningBolt; - mappings[77] = EntityType.Llama; - mappings[78] = EntityType.LlamaSpit; - mappings[79] = EntityType.MagmaCube; - mappings[80] = EntityType.MangroveBoat; - mappings[81] = EntityType.MangroveChestBoat; - mappings[82] = EntityType.Mannequin; - mappings[83] = EntityType.Marker; - mappings[84] = EntityType.Minecart; - mappings[85] = EntityType.Mooshroom; - mappings[86] = EntityType.Mule; - mappings[87] = EntityType.OakBoat; - mappings[88] = EntityType.OakChestBoat; - mappings[89] = EntityType.Ocelot; - mappings[90] = EntityType.OminousItemSpawner; - mappings[91] = EntityType.Painting; - mappings[92] = EntityType.PaleOakBoat; - mappings[93] = EntityType.PaleOakChestBoat; - mappings[94] = EntityType.Panda; - mappings[95] = EntityType.Parrot; - mappings[96] = EntityType.Phantom; - mappings[97] = EntityType.Pig; - mappings[98] = EntityType.Piglin; - mappings[99] = EntityType.PiglinBrute; - mappings[100] = EntityType.Pillager; - mappings[101] = EntityType.PolarBear; - mappings[102] = EntityType.SplashPotion; - mappings[103] = EntityType.LingeringPotion; - mappings[104] = EntityType.Pufferfish; - mappings[105] = EntityType.Rabbit; - mappings[106] = EntityType.Ravager; - mappings[107] = EntityType.Salmon; - mappings[108] = EntityType.Sheep; - mappings[109] = EntityType.Shulker; - mappings[110] = EntityType.ShulkerBullet; - mappings[111] = EntityType.Silverfish; - mappings[112] = EntityType.Skeleton; - mappings[113] = EntityType.SkeletonHorse; - mappings[114] = EntityType.Slime; - mappings[115] = EntityType.SmallFireball; - mappings[116] = EntityType.Sniffer; - mappings[117] = EntityType.Snowball; - mappings[118] = EntityType.SnowGolem; - mappings[119] = EntityType.SpawnerMinecart; - mappings[120] = EntityType.SpectralArrow; - mappings[121] = EntityType.Spider; - mappings[122] = EntityType.SpruceBoat; - mappings[123] = EntityType.SpruceChestBoat; - mappings[124] = EntityType.Squid; - mappings[125] = EntityType.Stray; - mappings[126] = EntityType.Strider; - mappings[127] = EntityType.Tadpole; - mappings[128] = EntityType.TextDisplay; - mappings[129] = EntityType.Tnt; - mappings[130] = EntityType.TntMinecart; - mappings[131] = EntityType.TraderLlama; - mappings[132] = EntityType.Trident; - mappings[133] = EntityType.TropicalFish; - mappings[134] = EntityType.Turtle; - mappings[135] = EntityType.Vex; - mappings[136] = EntityType.Villager; - mappings[137] = EntityType.Vindicator; - mappings[138] = EntityType.WanderingTrader; - mappings[139] = EntityType.Warden; - mappings[140] = EntityType.WindCharge; - mappings[141] = EntityType.Witch; - mappings[142] = EntityType.Wither; - mappings[143] = EntityType.WitherSkeleton; - mappings[144] = EntityType.WitherSkull; - mappings[145] = EntityType.Wolf; - mappings[146] = EntityType.Zoglin; - mappings[147] = EntityType.Zombie; - mappings[148] = EntityType.ZombieHorse; - mappings[149] = EntityType.ZombieVillager; - mappings[150] = EntityType.ZombifiedPiglin; - mappings[151] = EntityType.Player; - mappings[152] = EntityType.FishingBobber; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette18.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette18.cs deleted file mode 100644 index d85ed48a31..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette18.cs +++ /dev/null @@ -1,114 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - /// - /// Defines mappings of entitiy IDs for 1.8 - /// Manually typed out by Milutinke :( - /// Data source: https://pokechu22.github.io/Burger/1.8.json and https://wiki.vg/index.php?title=Entity_metadata&oldid=7415 - /// - public class EntityPalette18 : EntityPalette - { - private static Dictionary mappingsObjects = new() - { - // https://wiki.vg/Entity_metadata#Objects - { 1, EntityType.Boat }, - { 2, EntityType.Item }, - { 3, EntityType.AreaEffectCloud }, - { 10, EntityType.Minecart }, - { 50, EntityType.Tnt }, - { 51, EntityType.EndCrystal }, - { 60, EntityType.Arrow }, - { 61, EntityType.Snowball }, - { 62, EntityType.Egg }, - { 63, EntityType.Fireball }, - { 64, EntityType.SmallFireball }, - { 65, EntityType.EnderPearl }, - { 66, EntityType.WitherSkull }, - { 70, EntityType.FallingBlock }, - { 71, EntityType.ItemFrame }, - { 72, EntityType.EyeOfEnder }, - { 73, EntityType.Egg }, - { 75, EntityType.ExperienceBottle }, - { 76, EntityType.FireworkRocket }, - { 77, EntityType.LeashKnot }, - { 78, EntityType.ArmorStand }, - { 90, EntityType.FishingBobber }, - { 91, EntityType.SpectralArrow }, - { 93, EntityType.DragonFireball }, - }; - - private static Dictionary mappingsMobs = new() { - { 1, EntityType.Item }, - { 2, EntityType.ExperienceOrb }, - { 8, EntityType.LeashKnot }, - { 9, EntityType.Painting }, - { 10, EntityType.Arrow }, - { 11, EntityType.Snowball }, - { 12, EntityType.Fireball }, - { 13, EntityType.SmallFireball }, - { 14, EntityType.EnderPearl }, - { 15, EntityType.EyeOfEnder }, - { 16, EntityType.Potion }, - { 17, EntityType.ExperienceBottle }, - { 18, EntityType.ItemFrame }, - { 19, EntityType.WitherSkull }, - { 20, EntityType.Tnt }, - { 21, EntityType.FallingBlock }, - { 22, EntityType.FireworkRocket }, - { 30, EntityType.ArmorStand }, - { 40, EntityType.CommandBlockMinecart }, - { 41, EntityType.Boat }, - { 42, EntityType.Minecart }, - { 43, EntityType.ChestMinecart }, - { 44, EntityType.FurnaceMinecart }, - { 45, EntityType.TntMinecart }, - { 46, EntityType.HopperMinecart }, - { 47, EntityType.SpawnerMinecart }, - { 50, EntityType.Creeper }, - { 51, EntityType.Skeleton }, - { 52, EntityType.Spider }, - { 53, EntityType.Giant }, - { 54, EntityType.Zombie }, - { 55, EntityType.Slime }, - { 56, EntityType.Ghast }, - { 57, EntityType.ZombifiedPiglin }, - { 58, EntityType.Enderman }, - { 59, EntityType.CaveSpider }, - { 60, EntityType.Silverfish }, - { 61, EntityType.Blaze }, - { 62, EntityType.MagmaCube }, - { 63, EntityType.EnderDragon }, - { 64, EntityType.Wither }, - { 65, EntityType.Bat }, - { 66, EntityType.Witch }, - { 67, EntityType.Endermite }, - { 68, EntityType.Guardian }, - { 90, EntityType.Pig }, - { 91, EntityType.Sheep }, - { 92, EntityType.Cow }, - { 93, EntityType.Chicken }, - { 94, EntityType.Squid }, - { 95, EntityType.Wolf }, - { 96, EntityType.Mooshroom }, - { 97, EntityType.SnowGolem }, - { 98, EntityType.Cat }, - { 99, EntityType.IronGolem }, - { 100, EntityType.Horse }, - { 101, EntityType.Rabbit }, - { 120, EntityType.Villager }, - { 200, EntityType.EndCrystal } - }; - - protected override Dictionary GetDict() - { - return mappingsMobs; - } - - protected override Dictionary GetDictNonLiving() - { - return mappingsObjects; - } - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette261.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette261.cs deleted file mode 100644 index a33d0b3b46..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette261.cs +++ /dev/null @@ -1,175 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - public class EntityPalette261 : EntityPalette - { - private static readonly Dictionary mappings = new(); - - static EntityPalette261() - { - mappings[0] = EntityType.AcaciaBoat; - mappings[1] = EntityType.AcaciaChestBoat; - mappings[2] = EntityType.Allay; - mappings[3] = EntityType.AreaEffectCloud; - mappings[4] = EntityType.Armadillo; - mappings[5] = EntityType.ArmorStand; - mappings[6] = EntityType.Arrow; - mappings[7] = EntityType.Axolotl; - mappings[8] = EntityType.BambooChestRaft; - mappings[9] = EntityType.BambooRaft; - mappings[10] = EntityType.Bat; - mappings[11] = EntityType.Bee; - mappings[12] = EntityType.BirchBoat; - mappings[13] = EntityType.BirchChestBoat; - mappings[14] = EntityType.Blaze; - mappings[15] = EntityType.BlockDisplay; - mappings[16] = EntityType.Bogged; - mappings[17] = EntityType.Breeze; - mappings[18] = EntityType.BreezeWindCharge; - mappings[19] = EntityType.Camel; - mappings[20] = EntityType.CamelHusk; - mappings[21] = EntityType.Cat; - mappings[22] = EntityType.CaveSpider; - mappings[23] = EntityType.CherryBoat; - mappings[24] = EntityType.CherryChestBoat; - mappings[25] = EntityType.ChestMinecart; - mappings[26] = EntityType.Chicken; - mappings[27] = EntityType.Cod; - mappings[28] = EntityType.CopperGolem; - mappings[29] = EntityType.CommandBlockMinecart; - mappings[30] = EntityType.Cow; - mappings[31] = EntityType.Creaking; - mappings[32] = EntityType.Creeper; - mappings[33] = EntityType.DarkOakBoat; - mappings[34] = EntityType.DarkOakChestBoat; - mappings[35] = EntityType.Dolphin; - mappings[36] = EntityType.Donkey; - mappings[37] = EntityType.DragonFireball; - mappings[38] = EntityType.Drowned; - mappings[39] = EntityType.Egg; - mappings[40] = EntityType.ElderGuardian; - mappings[41] = EntityType.Enderman; - mappings[42] = EntityType.Endermite; - mappings[43] = EntityType.EnderDragon; - mappings[44] = EntityType.EnderPearl; - mappings[45] = EntityType.EndCrystal; - mappings[46] = EntityType.Evoker; - mappings[47] = EntityType.EvokerFangs; - mappings[48] = EntityType.ExperienceBottle; - mappings[49] = EntityType.ExperienceOrb; - mappings[50] = EntityType.EyeOfEnder; - mappings[51] = EntityType.FallingBlock; - mappings[52] = EntityType.Fireball; - mappings[53] = EntityType.FireworkRocket; - mappings[54] = EntityType.Fox; - mappings[55] = EntityType.Frog; - mappings[56] = EntityType.FurnaceMinecart; - mappings[57] = EntityType.Ghast; - mappings[58] = EntityType.HappyGhast; - mappings[59] = EntityType.Giant; - mappings[60] = EntityType.GlowItemFrame; - mappings[61] = EntityType.GlowSquid; - mappings[62] = EntityType.Goat; - mappings[63] = EntityType.Guardian; - mappings[64] = EntityType.Hoglin; - mappings[65] = EntityType.HopperMinecart; - mappings[66] = EntityType.Horse; - mappings[67] = EntityType.Husk; - mappings[68] = EntityType.Illusioner; - mappings[69] = EntityType.Interaction; - mappings[70] = EntityType.IronGolem; - mappings[71] = EntityType.Item; - mappings[72] = EntityType.ItemDisplay; - mappings[73] = EntityType.ItemFrame; - mappings[74] = EntityType.JungleBoat; - mappings[75] = EntityType.JungleChestBoat; - mappings[76] = EntityType.LeashKnot; - mappings[77] = EntityType.LightningBolt; - mappings[78] = EntityType.Llama; - mappings[79] = EntityType.LlamaSpit; - mappings[80] = EntityType.MagmaCube; - mappings[81] = EntityType.MangroveBoat; - mappings[82] = EntityType.MangroveChestBoat; - mappings[83] = EntityType.Mannequin; - mappings[84] = EntityType.Marker; - mappings[85] = EntityType.Minecart; - mappings[86] = EntityType.Mooshroom; - mappings[87] = EntityType.Mule; - mappings[88] = EntityType.Nautilus; - mappings[89] = EntityType.OakBoat; - mappings[90] = EntityType.OakChestBoat; - mappings[91] = EntityType.Ocelot; - mappings[92] = EntityType.OminousItemSpawner; - mappings[93] = EntityType.Painting; - mappings[94] = EntityType.PaleOakBoat; - mappings[95] = EntityType.PaleOakChestBoat; - mappings[96] = EntityType.Panda; - mappings[97] = EntityType.Parched; - mappings[98] = EntityType.Parrot; - mappings[99] = EntityType.Phantom; - mappings[100] = EntityType.Pig; - mappings[101] = EntityType.Piglin; - mappings[102] = EntityType.PiglinBrute; - mappings[103] = EntityType.Pillager; - mappings[104] = EntityType.PolarBear; - mappings[105] = EntityType.SplashPotion; - mappings[106] = EntityType.LingeringPotion; - mappings[107] = EntityType.Pufferfish; - mappings[108] = EntityType.Rabbit; - mappings[109] = EntityType.Ravager; - mappings[110] = EntityType.Salmon; - mappings[111] = EntityType.Sheep; - mappings[112] = EntityType.Shulker; - mappings[113] = EntityType.ShulkerBullet; - mappings[114] = EntityType.Silverfish; - mappings[115] = EntityType.Skeleton; - mappings[116] = EntityType.SkeletonHorse; - mappings[117] = EntityType.Slime; - mappings[118] = EntityType.SmallFireball; - mappings[119] = EntityType.Sniffer; - mappings[120] = EntityType.Snowball; - mappings[121] = EntityType.SnowGolem; - mappings[122] = EntityType.SpawnerMinecart; - mappings[123] = EntityType.SpectralArrow; - mappings[124] = EntityType.Spider; - mappings[125] = EntityType.SpruceBoat; - mappings[126] = EntityType.SpruceChestBoat; - mappings[127] = EntityType.Squid; - mappings[128] = EntityType.Stray; - mappings[129] = EntityType.Strider; - mappings[130] = EntityType.Tadpole; - mappings[131] = EntityType.TextDisplay; - mappings[132] = EntityType.Tnt; - mappings[133] = EntityType.TntMinecart; - mappings[134] = EntityType.TraderLlama; - mappings[135] = EntityType.Trident; - mappings[136] = EntityType.TropicalFish; - mappings[137] = EntityType.Turtle; - mappings[138] = EntityType.Vex; - mappings[139] = EntityType.Villager; - mappings[140] = EntityType.Vindicator; - mappings[141] = EntityType.WanderingTrader; - mappings[142] = EntityType.Warden; - mappings[143] = EntityType.WindCharge; - mappings[144] = EntityType.Witch; - mappings[145] = EntityType.Wither; - mappings[146] = EntityType.WitherSkeleton; - mappings[147] = EntityType.WitherSkull; - mappings[148] = EntityType.Wolf; - mappings[149] = EntityType.Zoglin; - mappings[150] = EntityType.Zombie; - mappings[151] = EntityType.ZombieHorse; - mappings[152] = EntityType.ZombieNautilus; - mappings[153] = EntityType.ZombieVillager; - mappings[154] = EntityType.ZombifiedPiglin; - mappings[155] = EntityType.Player; - mappings[156] = EntityType.FishingBobber; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPalette262.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPalette262.cs deleted file mode 100644 index 326ec108d4..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPalette262.cs +++ /dev/null @@ -1,176 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - public class EntityPalette262 : EntityPalette - { - private static readonly Dictionary mappings = new(); - - static EntityPalette262() - { - mappings[0] = EntityType.AcaciaBoat; - mappings[1] = EntityType.AcaciaChestBoat; - mappings[2] = EntityType.Allay; - mappings[3] = EntityType.AreaEffectCloud; - mappings[4] = EntityType.Armadillo; - mappings[5] = EntityType.ArmorStand; - mappings[6] = EntityType.Arrow; - mappings[7] = EntityType.Axolotl; - mappings[8] = EntityType.BambooChestRaft; - mappings[9] = EntityType.BambooRaft; - mappings[10] = EntityType.Bat; - mappings[11] = EntityType.Bee; - mappings[12] = EntityType.BirchBoat; - mappings[13] = EntityType.BirchChestBoat; - mappings[14] = EntityType.Blaze; - mappings[15] = EntityType.BlockDisplay; - mappings[16] = EntityType.Bogged; - mappings[17] = EntityType.Breeze; - mappings[18] = EntityType.BreezeWindCharge; - mappings[19] = EntityType.Camel; - mappings[20] = EntityType.CamelHusk; - mappings[21] = EntityType.Cat; - mappings[22] = EntityType.CaveSpider; - mappings[23] = EntityType.CherryBoat; - mappings[24] = EntityType.CherryChestBoat; - mappings[25] = EntityType.ChestMinecart; - mappings[26] = EntityType.Chicken; - mappings[27] = EntityType.Cod; - mappings[28] = EntityType.CopperGolem; - mappings[29] = EntityType.CommandBlockMinecart; - mappings[30] = EntityType.Cow; - mappings[31] = EntityType.Creaking; - mappings[32] = EntityType.Creeper; - mappings[33] = EntityType.DarkOakBoat; - mappings[34] = EntityType.DarkOakChestBoat; - mappings[35] = EntityType.Dolphin; - mappings[36] = EntityType.Donkey; - mappings[37] = EntityType.DragonFireball; - mappings[38] = EntityType.Drowned; - mappings[39] = EntityType.Egg; - mappings[40] = EntityType.ElderGuardian; - mappings[41] = EntityType.Enderman; - mappings[42] = EntityType.Endermite; - mappings[43] = EntityType.EnderDragon; - mappings[44] = EntityType.EnderPearl; - mappings[45] = EntityType.EndCrystal; - mappings[46] = EntityType.Evoker; - mappings[47] = EntityType.EvokerFangs; - mappings[48] = EntityType.ExperienceBottle; - mappings[49] = EntityType.ExperienceOrb; - mappings[50] = EntityType.EyeOfEnder; - mappings[51] = EntityType.FallingBlock; - mappings[52] = EntityType.Fireball; - mappings[53] = EntityType.FireworkRocket; - mappings[54] = EntityType.Fox; - mappings[55] = EntityType.Frog; - mappings[56] = EntityType.FurnaceMinecart; - mappings[57] = EntityType.Ghast; - mappings[58] = EntityType.HappyGhast; - mappings[59] = EntityType.Giant; - mappings[60] = EntityType.GlowItemFrame; - mappings[61] = EntityType.GlowSquid; - mappings[62] = EntityType.Goat; - mappings[63] = EntityType.Guardian; - mappings[64] = EntityType.Hoglin; - mappings[65] = EntityType.HopperMinecart; - mappings[66] = EntityType.Horse; - mappings[67] = EntityType.Husk; - mappings[68] = EntityType.Illusioner; - mappings[69] = EntityType.Interaction; - mappings[70] = EntityType.IronGolem; - mappings[71] = EntityType.Item; - mappings[72] = EntityType.ItemDisplay; - mappings[73] = EntityType.ItemFrame; - mappings[74] = EntityType.JungleBoat; - mappings[75] = EntityType.JungleChestBoat; - mappings[76] = EntityType.LeashKnot; - mappings[77] = EntityType.LightningBolt; - mappings[78] = EntityType.Llama; - mappings[79] = EntityType.LlamaSpit; - mappings[80] = EntityType.MagmaCube; - mappings[81] = EntityType.MangroveBoat; - mappings[82] = EntityType.MangroveChestBoat; - mappings[83] = EntityType.Mannequin; - mappings[84] = EntityType.Marker; - mappings[85] = EntityType.Minecart; - mappings[86] = EntityType.Mooshroom; - mappings[87] = EntityType.Mule; - mappings[88] = EntityType.Nautilus; - mappings[89] = EntityType.OakBoat; - mappings[90] = EntityType.OakChestBoat; - mappings[91] = EntityType.Ocelot; - mappings[92] = EntityType.OminousItemSpawner; - mappings[93] = EntityType.Painting; - mappings[94] = EntityType.PaleOakBoat; - mappings[95] = EntityType.PaleOakChestBoat; - mappings[96] = EntityType.Panda; - mappings[97] = EntityType.Parched; - mappings[98] = EntityType.Parrot; - mappings[99] = EntityType.Phantom; - mappings[100] = EntityType.Pig; - mappings[101] = EntityType.Piglin; - mappings[102] = EntityType.PiglinBrute; - mappings[103] = EntityType.Pillager; - mappings[104] = EntityType.PolarBear; - mappings[105] = EntityType.SplashPotion; - mappings[106] = EntityType.LingeringPotion; - mappings[107] = EntityType.Pufferfish; - mappings[108] = EntityType.Rabbit; - mappings[109] = EntityType.Ravager; - mappings[110] = EntityType.Salmon; - mappings[111] = EntityType.Sheep; - mappings[112] = EntityType.Shulker; - mappings[113] = EntityType.ShulkerBullet; - mappings[114] = EntityType.Silverfish; - mappings[115] = EntityType.Skeleton; - mappings[116] = EntityType.SkeletonHorse; - mappings[117] = EntityType.Slime; - mappings[118] = EntityType.SmallFireball; - mappings[119] = EntityType.Sniffer; - mappings[120] = EntityType.Snowball; - mappings[121] = EntityType.SnowGolem; - mappings[122] = EntityType.SpawnerMinecart; - mappings[123] = EntityType.SpectralArrow; - mappings[124] = EntityType.Spider; - mappings[125] = EntityType.SpruceBoat; - mappings[126] = EntityType.SpruceChestBoat; - mappings[127] = EntityType.Squid; - mappings[128] = EntityType.Stray; - mappings[129] = EntityType.Strider; - mappings[130] = EntityType.SulfurCube; - mappings[131] = EntityType.Tadpole; - mappings[132] = EntityType.TextDisplay; - mappings[133] = EntityType.Tnt; - mappings[134] = EntityType.TntMinecart; - mappings[135] = EntityType.TraderLlama; - mappings[136] = EntityType.Trident; - mappings[137] = EntityType.TropicalFish; - mappings[138] = EntityType.Turtle; - mappings[139] = EntityType.Vex; - mappings[140] = EntityType.Villager; - mappings[141] = EntityType.Vindicator; - mappings[142] = EntityType.WanderingTrader; - mappings[143] = EntityType.Warden; - mappings[144] = EntityType.WindCharge; - mappings[145] = EntityType.Witch; - mappings[146] = EntityType.Wither; - mappings[147] = EntityType.WitherSkeleton; - mappings[148] = EntityType.WitherSkull; - mappings[149] = EntityType.Wolf; - mappings[150] = EntityType.Zoglin; - mappings[151] = EntityType.Zombie; - mappings[152] = EntityType.ZombieHorse; - mappings[153] = EntityType.ZombieNautilus; - mappings[154] = EntityType.ZombieVillager; - mappings[155] = EntityType.ZombifiedPiglin; - mappings[156] = EntityType.Player; - mappings[157] = EntityType.FishingBobber; - } - - protected override Dictionary GetDict() - { - return mappings; - } - } -} diff --git a/MinecraftClient/Mapping/EntityPalettes/EntityPaletteGenerator.cs b/MinecraftClient/Mapping/EntityPalettes/EntityPaletteGenerator.cs deleted file mode 100644 index 2ac06fcb23..0000000000 --- a/MinecraftClient/Mapping/EntityPalettes/EntityPaletteGenerator.cs +++ /dev/null @@ -1,23 +0,0 @@ -using MinecraftClient.Protocol; - -namespace MinecraftClient.Mapping.EntityPalettes -{ - /// - /// Generator for MCC ItemType enumeration - /// - public static class EntityPaletteGenerator - { - /// - /// Generate EntityType.cs from Minecraft registries.json - /// - /// path to registries.json - /// - /// java -cp minecraft_server.jar net.minecraft.data.Main --reports - /// For 1.18+: java -DbundlerMainClass=net.minecraft.data.Main -jar minecraft_server.jar --reports - /// - public static void GenerateEntityTypes(string registriesJsonFile) - { - DataTypeGenerator.GenerateEnumWithPalette(registriesJsonFile, "minecraft:entity_type", "EntityType", "MinecraftClient.Mapping", "EntityPalette", "MinecraftClient.Mapping.EntityPalettes"); - } - } -} diff --git a/MinecraftClient/Mapping/EntityPose.cs b/MinecraftClient/Mapping/EntityPose.cs deleted file mode 100644 index 1690b089fe..0000000000 --- a/MinecraftClient/Mapping/EntityPose.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace MinecraftClient.Mapping -{ - public enum EntityPose - { - Standing = 0, - FallFlying = 1, - Sleeping = 2, - Swimming = 3, - SpinAttack = 4, - Sneaking = 5, - Dying = 6, - } -} diff --git a/MinecraftClient/Mapping/EntityType.cs b/MinecraftClient/Mapping/EntityType.cs deleted file mode 100644 index 60db886907..0000000000 --- a/MinecraftClient/Mapping/EntityType.cs +++ /dev/null @@ -1,180 +0,0 @@ -namespace MinecraftClient.Mapping -{ - /// - /// Represents Minecraft Entity Types - /// - /// - /// Generated from registries.json using the --generator flag on the client - /// Typical steps to handle new entity IDs for newer Minecraft versions: - /// 1. Generate registries.json using data reporting on Vanilla Minecraft (https://wiki.vg/Data_Generators) or download it from: https://github.com/PixiGeko/Minecraft-generated-data - /// 2. Generate temporary EntityTypeXXX.cs and EntityPaletteXXX.cs using the --generator flag on the client - /// 3. Perform a diff with existing versions, add missing entries in EntityType.cs and EntityTypeExtensions.cs - /// 4. If existing entity IDs were not randomized by Mojang, simply add missing entries to the latest existing EntityPaletteXXX.cs - /// 5. If existing entity IDs were randomized, add a new palette as EntityPaletteXXX.cs into the codebase (worst case) - /// - public enum EntityType - { - AcaciaBoat, - AcaciaChestBoat, - Allay, - AreaEffectCloud, - Armadillo, - ArmorStand, - Arrow, - Axolotl, - BambooChestRaft, - BambooRaft, - Bat, - Bee, - BirchBoat, - BirchChestBoat, - Blaze, - BlockDisplay, - Boat, - Bogged, - Breeze, - BreezeWindCharge, - Camel, - CamelHusk, - Cat, - CaveSpider, - CherryBoat, - CherryChestBoat, - ChestBoat, - ChestMinecart, - Chicken, - Cod, - CommandBlockMinecart, - CopperGolem, - Cow, - Creaking, - CreakingTransient, - Creeper, - DarkOakBoat, - DarkOakChestBoat, - Dolphin, - Donkey, - DragonFireball, - Drowned, - Egg, - ElderGuardian, - EndCrystal, - EnderDragon, - EnderPearl, - Enderman, - Endermite, - Evoker, - EvokerFangs, - ExperienceBottle, - ExperienceOrb, - EyeOfEnder, - FallingBlock, - Fireball, - FireworkRocket, - FishingBobber, - Fox, - Frog, - FurnaceMinecart, - Ghast, - Giant, - GlowItemFrame, - GlowSquid, - Goat, - Guardian, - HappyGhast, - Hoglin, - HopperMinecart, - Horse, - Husk, - Illusioner, - Interaction, - IronGolem, - Item, - ItemDisplay, - ItemFrame, - JungleBoat, - JungleChestBoat, - LeashKnot, - LightningBolt, - Llama, - LlamaSpit, - MagmaCube, - MangroveBoat, - MangroveChestBoat, - Mannequin, - Marker, - Minecart, - Mooshroom, - Mule, - Nautilus, - OakBoat, - OakChestBoat, - Ocelot, - OminousItemSpawner, - Painting, - PaleOakBoat, - PaleOakChestBoat, - Panda, - Parched, - Parrot, - Phantom, - Pig, - Piglin, - PiglinBrute, - Pillager, - Player, - PolarBear, - SplashPotion, - LingeringPotion, - Potion, - Pufferfish, - Rabbit, - Ravager, - Salmon, - Sheep, - Shulker, - ShulkerBullet, - Silverfish, - Skeleton, - SkeletonHorse, - Slime, - SmallFireball, - Sniffer, - SnowGolem, - Snowball, - SpawnerMinecart, - SpectralArrow, - Spider, - SpruceBoat, - SpruceChestBoat, - Squid, - Stray, - Strider, - SulfurCube, - Tadpole, - TextDisplay, - Tnt, - TntMinecart, - TraderLlama, - Trident, - TropicalFish, - Turtle, - Vex, - Villager, - Vindicator, - WanderingTrader, - Warden, - WindCharge, - Witch, - Wither, - WitherSkeleton, - WitherSkull, - Wolf, - Zoglin, - Zombie, - ZombieHorse, - ZombieNautilus, - ZombieVillager, - ZombifiedPiglin, - } -} diff --git a/MinecraftClient/Mapping/EntityTypeExtensions.cs b/MinecraftClient/Mapping/EntityTypeExtensions.cs deleted file mode 100644 index 0e7a85fb4d..0000000000 --- a/MinecraftClient/Mapping/EntityTypeExtensions.cs +++ /dev/null @@ -1,124 +0,0 @@ -namespace MinecraftClient.Mapping -{ - public static class EntityTypeExtensions - { - /// - /// Return TRUE if the Entity is an hostile mob - /// - /// New mobs added in newer Minecraft versions might be absent from the list - /// TRUE if hostile - public static bool IsHostile(this EntityType e) - { - switch (e) - { - case EntityType.Blaze: - case EntityType.CaveSpider: - case EntityType.Creeper: - case EntityType.Drowned: - case EntityType.Enderman: - case EntityType.Endermite: - case EntityType.Evoker: - case EntityType.Ghast: - case EntityType.Guardian: - case EntityType.Hoglin: - case EntityType.Husk: - case EntityType.Illusioner: - case EntityType.MagmaCube: - case EntityType.Phantom: - case EntityType.Piglin: - case EntityType.PiglinBrute: - case EntityType.Pillager: - case EntityType.Ravager: - case EntityType.Shulker: - case EntityType.Silverfish: - case EntityType.Skeleton: - case EntityType.Slime: - case EntityType.Spider: - case EntityType.Stray: - case EntityType.Vex: - case EntityType.Vindicator: - case EntityType.Witch: - case EntityType.WitherSkeleton: - case EntityType.Zoglin: - case EntityType.Zombie: - case EntityType.ZombieVillager: - case EntityType.ZombifiedPiglin: - return true; - default: - return false; - } - } - - /// - /// Return TRUE if the Entity is a passive mob - /// - /// New mobs added in newer Minecraft versions might be absent from the list - /// TRUE if a passive mob - public static bool IsPassive(this EntityType e) - { - switch (e) - { - case EntityType.Bat: - case EntityType.Cat: - case EntityType.Chicken: - case EntityType.Cod: - case EntityType.Cow: - case EntityType.Dolphin: - case EntityType.Donkey: - case EntityType.Fox: - case EntityType.Frog: - case EntityType.GlowSquid: - case EntityType.Goat: - case EntityType.Horse: - case EntityType.IronGolem: - case EntityType.Llama: - case EntityType.Mooshroom: - case EntityType.Mule: - case EntityType.Ocelot: - case EntityType.Panda: - case EntityType.Parrot: - case EntityType.Pig: - case EntityType.Salmon: - case EntityType.Sheep: - case EntityType.Silverfish: - case EntityType.SnowGolem: - case EntityType.Squid: - case EntityType.Turtle: - case EntityType.Villager: - case EntityType.WanderingTrader: - case EntityType.Wolf: - case EntityType.ZombieHorse: - case EntityType.SkeletonHorse: - return true; - default: - return false; - } - } - - /// - /// Indicates whether the entity type contains an inner item - /// - /// TRUE if item holder (Item Entity, ItemFrame...) - public static bool ContainsItem(this EntityType e) - { - switch (e) - { - case EntityType.GlowItemFrame: - case EntityType.Item: - case EntityType.ItemFrame: - case EntityType.EyeOfEnder: - case EntityType.Egg: - case EntityType.EnderPearl: - case EntityType.Potion: - case EntityType.SplashPotion: - case EntityType.LingeringPotion: - case EntityType.Fireball: - case EntityType.FireworkRocket: - return true; - default: - return false; - } - ; - } - } -} diff --git a/MinecraftClient/Mapping/InteractType.cs b/MinecraftClient/Mapping/InteractType.cs deleted file mode 100644 index f54a1014e5..0000000000 --- a/MinecraftClient/Mapping/InteractType.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace MinecraftClient.Mapping -{ - public enum InteractType - { - Interact = 0, - Attack = 1, - InteractAt = 2, - } -} diff --git a/MinecraftClient/Mapping/Location.cs b/MinecraftClient/Mapping/Location.cs deleted file mode 100644 index abfda749d8..0000000000 --- a/MinecraftClient/Mapping/Location.cs +++ /dev/null @@ -1,440 +0,0 @@ -using System; -using System.Globalization; -using System.Runtime.CompilerServices; - -namespace MinecraftClient.Mapping -{ - /// - /// Represents a location into a Minecraft world - /// - public struct Location - { - public static readonly Location Zero = new(0, 0, 0); - - /// - /// The X Coordinate - /// - public double X; - - /// - /// The Y Coordinate (vertical) - /// - public double Y; - - /// - /// The Z coordinate - /// - public double Z; - - /// - /// Identifies whether the coordinates are absolute or relative. - /// true for relative coordinates, false for absolute coordinates. - /// X-axis: ((Status & (1 << 0)) > 0) - /// Y-axis: ((Status & (1 << 1)) > 0) - /// Z-axis: ((Status & (1 << 2)) > 0) - /// - public byte Status; - - /// - /// Create a new location - /// - public Location(double x, double y, double z) - { - X = x; - Y = y; - Z = z; - Status = 0; - } - - /// - /// Create a new location - /// - public Location(double x, double y, double z, byte status) - { - X = x; - Y = y; - Z = z; - Status = status; - } - - /// - /// Create a new location - /// - public Location(Location loc) - { - X = loc.X; - Y = loc.Y; - Z = loc.Z; - Status = loc.Status; - } - - /// - /// Create a new location - /// - /// Location of the chunk into the world - /// Location of the chunk into the world - /// Location of the block into the chunk - /// Location of the block into the world - /// Location of the block into the chunk - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Location(int chunkX, int chunkZ, int blockX, int blockY, int blockZ) - { - X = chunkX * Chunk.SizeX + blockX; - Y = blockY; - Z = chunkZ * Chunk.SizeZ + blockZ; - Status = 0; - } - - public Location ToAbsolute(Location based) - { - if ((Status & (1 << 0)) > 0) - X += based.X; - if ((Status & (1 << 1)) > 0) - Y += based.Y; - if ((Status & (1 << 2)) > 0) - Z += based.Z; - Status = 0; - return this; - } - - /// - /// Parse location from the string. - /// throw FormatException if the parsing fails. - /// - /// The string representation of the X-axis coordinate. - /// The string representation of the Y-axis coordinate. - /// The string representation of the Z-axis coordinate. - /// The location represented by the string. - public static Location Parse(string x, string y, string z) - { - Location.TryParse(x, y, z, out Location? res); - if (res is null) - throw new FormatException(); - else - return (Location)res; - } - - public static bool TryParse(string x, string y, string z, out Location? location) - { - string[] coord_str = [x.Trim(), y.Trim(), z.Trim()]; - double[] coord_res = new double[3]; - - for (int i = 0; i < 3; ++i) - { - if (!double.TryParse(coord_str[i], NumberStyles.Any, CultureInfo.CurrentCulture, out coord_res[i])) - { - location = null; - return false; - } - } - - location = new Location(coord_res[0], coord_res[1], coord_res[2]); - return true; - } - - /// - /// Parse location from the string (relative coordinate representation is supported). - /// throw FormatException if the parsing fails. - /// - /// Relative position base point. - /// The string representation of the X-axis coordinate. - /// The string representation of the Y-axis coordinate. - /// The string representation of the Z-axis coordinate. - /// The location represented by the string. - public static Location Parse(Location current, string x, string y, string z) - { - Location.TryParse(current, x, y, z, out Location? res); - if (res is null) - throw new FormatException(); - else - return (Location)res; - } - - public static bool TryParse(Location current, string x, string y, string z, out Location? location) - { - string[] coord_str = [x.Trim(), y.Trim(), z.Trim()]; - double[] coord_res = new double[3]; - double[] coord_cur = [current.X, current.Y, current.Z]; - - for (int i = 0; i < 3; ++i) - { - if (coord_str[i].StartsWith('~')) - { - if (coord_str[i].Length > 1) - { - if (!double.TryParse(coord_str[i][1..], NumberStyles.Any, CultureInfo.CurrentCulture, out coord_res[i])) - { - location = null; - return false; - } - coord_res[i] += coord_cur[i]; - } - else - coord_res[i] = coord_cur[i]; - } - else - { - if (!double.TryParse(coord_str[i], NumberStyles.Any, CultureInfo.CurrentCulture, out coord_res[i])) - { - location = null; - return false; - } - } - } - - location = new Location(coord_res[0], coord_res[1], coord_res[2]); - return true; - } - - /// - /// Round coordinates - /// - /// New location - public Location ToFloor() - { - return new Location(Math.Floor(X), Math.Floor(Y), Math.Floor(Z)); - } - - /// - /// Get the center coordinates - /// - /// New location - public Location ToCenter() - { - return new Location(Math.Floor(X) + 0.5, Y, Math.Floor(Z) + 0.5); - } - - /// - /// The X index of the corresponding chunk in the world - /// - public int ChunkX - { - get - { - return (int)Math.Floor(X / Chunk.SizeX); - } - } - - /// - /// The Y index of the corresponding chunk in the world - /// - public int ChunkY - { - get - { - return (int)Math.Floor((Y - World.GetDimension().minY) / Chunk.SizeY); - } - } - - /// - /// The Z index of the corresponding chunk in the world - /// - public int ChunkZ - { - get - { - return (int)Math.Floor(Z / Chunk.SizeZ); - } - } - - /// - /// The X index of the corresponding block in the corresponding chunk of the world - /// - public int ChunkBlockX - { - get - { - return ((int)Math.Floor(X) % Chunk.SizeX + Chunk.SizeX) % Chunk.SizeX; - } - } - - /// - /// The Y index of the corresponding block in the corresponding chunk of the world - /// - public int ChunkBlockY - { - get - { - return ((int)Math.Floor(Y) % Chunk.SizeY + Chunk.SizeY) % Chunk.SizeY; - } - } - - /// - /// The Z index of the corresponding block in the corresponding chunk of the world - /// - public int ChunkBlockZ - { - get - { - return ((int)Math.Floor(Z) % Chunk.SizeZ + Chunk.SizeZ) % Chunk.SizeZ; - } - } - - /// - /// Get a squared distance to the specified location - /// - /// Other location for computing distance - /// Distance to the specified location, without using a square root - public double DistanceSquared(Location location) - { - return ((X - location.X) * (X - location.X)) - + ((Y - location.Y) * (Y - location.Y)) - + ((Z - location.Z) * (Z - location.Z)); - } - - /// - /// Get exact distance to the specified location - /// - /// Other location for computing distance - /// Distance to the specified location, with square root so lower performances - public double Distance(Location location) - { - return Math.Sqrt(DistanceSquared(location)); - } - - /// - /// Considering the current location as Feet location, calculate Eyes location - /// - /// Player Eyes location - public Location EyesLocation() - { - return this + new Location(0, 1.62, 0); - } - - /// - /// Compare two locations. Locations are equals if the integer part of their coordinates are equals. - /// - /// Object to compare to - /// TRUE if the locations are equals - public override bool Equals(object? obj) - { - if (obj is null) - return false; - if (obj is Location location) - { - return ((int)X) == ((int)location.X) - && ((int)Y) == ((int)location.Y) - && ((int)Z) == ((int)location.Z); - } - return false; - } - - /// - /// Compare two locations. Locations are equals if the integer part of their coordinates are equals. - /// - /// First location to compare - /// Second location to compare - /// TRUE if the locations are equals - public static bool operator ==(Location loc1, Location loc2) - { - return loc1.Equals(loc2); - } - - /// - /// Compare two locations. Locations are not equals if the integer part of their coordinates are not equals. - /// - /// First location to compare - /// Second location to compare - /// TRUE if the locations are equals - public static bool operator !=(Location loc1, Location loc2) - { - return !loc1.Equals(loc2); - } - - /// - /// Sums two locations and returns the result. - /// - /// - /// Thrown if one of the provided location is null - /// - /// First location to sum - /// Second location to sum - /// Sum of the two locations - public static Location operator +(Location loc1, Location loc2) - { - return new Location - ( - loc1.X + loc2.X, - loc1.Y + loc2.Y, - loc1.Z + loc2.Z - ); - } - - /// - /// Substract a location to another - /// - /// - /// Thrown if one of the provided location is null - /// - /// First location - /// Location to substract to the first one - /// Sum of the two locations - public static Location operator -(Location loc1, Location loc2) - { - return new Location - ( - loc1.X - loc2.X, - loc1.Y - loc2.Y, - loc1.Z - loc2.Z - ); - } - - /// - /// Multiply a location by a scalar value - /// - /// Location to multiply - /// Scalar value - /// Product of the location and the scalar value - public static Location operator *(Location loc, double val) - { - return new Location - ( - loc.X * val, - loc.Y * val, - loc.Z * val - ); - } - - /// - /// Divide a location by a scalar value - /// - /// Location to divide - /// Scalar value - /// Result of the division - public static Location operator /(Location loc, double val) - { - return new Location - ( - loc.X / val, - loc.Y / val, - loc.Z / val - ); - } - - /// - /// DO NOT USE. Defined to comply with C# requirements requiring a GetHashCode() when overriding Equals() or == - /// - /// - /// A modulo will be applied if the location is outside the following ranges: - /// X: -4096 to +4095 - /// Y: -32 to +31 - /// Z: -4096 to +4095 - /// - /// A simplified version of the location - public override int GetHashCode() - { - return (((int)X) & ~((~0) << 13)) << 19 - | (((int)Y) & ~((~0) << 13)) << 13 - | (((int)Z) & ~((~0) << 06)) << 00; - } - - /// - /// Convert the location into a string representation - /// - /// String representation of the location - public override string ToString() - { - return String.Format("X:{0:0.00} Y:{1:0.00} Z:{2:0.00}", X, Y, Z); - } - } -} diff --git a/MinecraftClient/Mapping/MapIcon.cs b/MinecraftClient/Mapping/MapIcon.cs deleted file mode 100644 index e525f1a985..0000000000 --- a/MinecraftClient/Mapping/MapIcon.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace MinecraftClient.Mapping -{ - public record MapIcon - { - public MapIconType Type { get; set; } - public byte X { get; set; } - public byte Z { get; set; } - public byte Direction { get; set; } - public string? DisplayName { get; set; } = null; - } -} diff --git a/MinecraftClient/Mapping/MapIconType.cs b/MinecraftClient/Mapping/MapIconType.cs deleted file mode 100644 index 125527e549..0000000000 --- a/MinecraftClient/Mapping/MapIconType.cs +++ /dev/null @@ -1,33 +0,0 @@ -namespace MinecraftClient.Mapping -{ - public enum MapIconType - { - White_Arrow = 0, - Green_Arrow, - Red_Arrow, - Blue_Arrow, - White_Cross, - Red_Pointer, - White_Circle, - Small_White_Circle, - Mansion, - Temple, - White_Banner, - Orange_Banner, - Magenta_Banner, - Light_Blue_Banner, - Yellow_Banner, - Lime_Banner, - Pink_Banner, - Gray_Banner, - Light_Gray_Banner, - Cyan_Banner, - Purple_Banner, - Blue_Banner, - Brown_Banner, - Green_Banner, - Red_Banner, - Black_Banner, - Treasure_Marker - } -} diff --git a/MinecraftClient/Mapping/Material.cs b/MinecraftClient/Mapping/Material.cs deleted file mode 100644 index 6404fdb184..0000000000 --- a/MinecraftClient/Mapping/Material.cs +++ /dev/null @@ -1,1215 +0,0 @@ -namespace MinecraftClient.Mapping -{ - /// - /// Represents Minecraft Materials - /// - /// - /// Generated from blocks.json using the --generator flag on the client - /// Typical steps to handle new blocks for newer Minecraft versions: - /// 1. Generate blocks.json using data reporting on Vanilla Minecraft (https://wiki.vg/Data_Generators) or download it from: https://github.com/PixiGeko/Minecraft-generated-data - /// 2. Generate temporary MaterialXXX.cs and PaletteXXX.cs using the --generator flag on the client - /// 3. Perform a diff with existing versions, add missing entries in Material.cs and MaterialExtensions.cs - /// 4. If existing state IDs were not randomized by Mojang, simply add missing state entries to Palette113.cs - /// 5. If existing state IDs were randomized, add a new palette as PaletteXXX.cs into the codebase (worst case) - /// - public enum Material - { - AcaciaButton, - AcaciaDoor, - AcaciaFence, - AcaciaFenceGate, - AcaciaHangingSign, - AcaciaLeaves, - AcaciaLog, - AcaciaPlanks, - AcaciaPressurePlate, - AcaciaSapling, - AcaciaShelf, - AcaciaSign, - AcaciaSlab, - AcaciaStairs, - AcaciaTrapdoor, - AcaciaWallHangingSign, - AcaciaWallSign, - AcaciaWood, - ActivatorRail, - Air, - Allium, - AmethystBlock, - AmethystCluster, - AncientDebris, - Andesite, - AndesiteSlab, - AndesiteStairs, - AndesiteWall, - Anvil, - AttachedMelonStem, - AttachedPumpkinStem, - Azalea, - AzaleaLeaves, - AzureBluet, - Bamboo, - BambooBlock, - BambooButton, - BambooDoor, - BambooFence, - BambooFenceGate, - BambooHangingSign, - BambooMosaic, - BambooMosaicSlab, - BambooMosaicStairs, - BambooPlanks, - BambooPressurePlate, - BambooSapling, - BambooShelf, - BambooSign, - BambooSlab, - BambooStairs, - BambooTrapdoor, - BambooWallHangingSign, - BambooWallSign, - Barrel, - Barrier, - Basalt, - Beacon, - Bedrock, - BeeNest, - Beehive, - Beetroots, - Bell, - BigDripleaf, - BigDripleafStem, - BirchButton, - BirchDoor, - BirchFence, - BirchFenceGate, - BirchHangingSign, - BirchLeaves, - BirchLog, - BirchPlanks, - BirchPressurePlate, - BirchSapling, - BirchShelf, - BirchSign, - BirchSlab, - BirchStairs, - BirchTrapdoor, - BirchWallHangingSign, - BirchWallSign, - BirchWood, - BlackBanner, - BlackBed, - BlackCandle, - BlackCandleCake, - BlackCarpet, - BlackConcrete, - BlackConcretePowder, - BlackGlazedTerracotta, - BlackShulkerBox, - BlackStainedGlass, - BlackStainedGlassPane, - BlackTerracotta, - BlackWallBanner, - BlackWool, - Blackstone, - BlackstoneSlab, - BlackstoneStairs, - BlackstoneWall, - BlastFurnace, - BlueBanner, - BlueBed, - BlueCandle, - BlueCandleCake, - BlueCarpet, - BlueConcrete, - BlueConcretePowder, - BlueGlazedTerracotta, - BlueIce, - BlueOrchid, - BlueShulkerBox, - BlueStainedGlass, - BlueStainedGlassPane, - BlueTerracotta, - BlueWallBanner, - BlueWool, - BoneBlock, - Bookshelf, - BrainCoral, - BrainCoralBlock, - BrainCoralFan, - BrainCoralWallFan, - BrewingStand, - BrickSlab, - BrickStairs, - BrickWall, - Bricks, - BrownBanner, - BrownBed, - BrownCandle, - BrownCandleCake, - BrownCarpet, - BrownConcrete, - BrownConcretePowder, - BrownGlazedTerracotta, - BrownMushroom, - BrownMushroomBlock, - BrownShulkerBox, - BrownStainedGlass, - BrownStainedGlassPane, - BrownTerracotta, - BrownWallBanner, - BrownWool, - BubbleColumn, - BubbleCoral, - BubbleCoralBlock, - BubbleCoralFan, - BubbleCoralWallFan, - BuddingAmethyst, - Bush, - Cactus, - CactusFlower, - Cake, - Calcite, - CalibratedSculkSensor, - Campfire, - Candle, - CandleCake, - Carrots, - CartographyTable, - CarvedPumpkin, - Cauldron, - CaveAir, - CaveVines, - CaveVinesPlant, - Chain, - ChainCommandBlock, - CherryButton, - CherryDoor, - CherryFence, - CherryFenceGate, - CherryHangingSign, - CherryLeaves, - CherryLog, - CherryPlanks, - CherryPressurePlate, - CherrySapling, - CherryShelf, - CherrySign, - CherrySlab, - CherryStairs, - CherryTrapdoor, - CherryWallHangingSign, - CherryWallSign, - CherryWood, - Chest, - ChippedAnvil, - ChiseledBookshelf, - ChiseledCinnabar, - ChiseledCopper, - ChiseledDeepslate, - ChiseledNetherBricks, - ChiseledPolishedBlackstone, - ChiseledQuartzBlock, - ChiseledRedSandstone, - ChiseledResinBricks, - ChiseledSandstone, - ChiseledStoneBricks, - ChiseledSulfur, - ChiseledTuff, - ChiseledTuffBricks, - ChorusFlower, - ChorusPlant, - Cinnabar, - CinnabarBrickSlab, - CinnabarBrickStairs, - CinnabarBrickWall, - CinnabarBricks, - CinnabarSlab, - CinnabarStairs, - CinnabarWall, - Clay, - ClosedEyeblossom, - CoalBlock, - CoalOre, - CoarseDirt, - CobbledDeepslate, - CobbledDeepslateSlab, - CobbledDeepslateStairs, - CobbledDeepslateWall, - Cobblestone, - CobblestoneSlab, - CobblestoneStairs, - CobblestoneWall, - Cobweb, - Cocoa, - CommandBlock, - Comparator, - Composter, - Conduit, - CopperBars, - CopperBlock, - CopperBulb, - CopperChain, - CopperChest, - CopperDoor, - CopperGolemStatue, - CopperGrate, - CopperLantern, - CopperOre, - CopperTorch, - CopperTrapdoor, - CopperWallTorch, - Cornflower, - CrackedDeepslateBricks, - CrackedDeepslateTiles, - CrackedNetherBricks, - CrackedPolishedBlackstoneBricks, - CrackedStoneBricks, - Crafter, - CraftingTable, - CreakingHeart, - CreeperHead, - CreeperWallHead, - CrimsonButton, - CrimsonDoor, - CrimsonFence, - CrimsonFenceGate, - CrimsonFungus, - CrimsonHangingSign, - CrimsonHyphae, - CrimsonNylium, - CrimsonPlanks, - CrimsonPressurePlate, - CrimsonRoots, - CrimsonShelf, - CrimsonSign, - CrimsonSlab, - CrimsonStairs, - CrimsonStem, - CrimsonTrapdoor, - CrimsonWallHangingSign, - CrimsonWallSign, - CryingObsidian, - CutCopper, - CutCopperSlab, - CutCopperStairs, - CutRedSandstone, - CutRedSandstoneSlab, - CutSandstone, - CutSandstoneSlab, - CyanBanner, - CyanBed, - CyanCandle, - CyanCandleCake, - CyanCarpet, - CyanConcrete, - CyanConcretePowder, - CyanGlazedTerracotta, - CyanShulkerBox, - CyanStainedGlass, - CyanStainedGlassPane, - CyanTerracotta, - CyanWallBanner, - CyanWool, - DamagedAnvil, - Dandelion, - DarkOakButton, - DarkOakDoor, - DarkOakFence, - DarkOakFenceGate, - DarkOakHangingSign, - DarkOakLeaves, - DarkOakLog, - DarkOakPlanks, - DarkOakPressurePlate, - DarkOakSapling, - DarkOakShelf, - DarkOakSign, - DarkOakSlab, - DarkOakStairs, - DarkOakTrapdoor, - DarkOakWallHangingSign, - DarkOakWallSign, - DarkOakWood, - DarkPrismarine, - DarkPrismarineSlab, - DarkPrismarineStairs, - DaylightDetector, - DeadBrainCoral, - DeadBrainCoralBlock, - DeadBrainCoralFan, - DeadBrainCoralWallFan, - DeadBubbleCoral, - DeadBubbleCoralBlock, - DeadBubbleCoralFan, - DeadBubbleCoralWallFan, - DeadBush, - DeadFireCoral, - DeadFireCoralBlock, - DeadFireCoralFan, - DeadFireCoralWallFan, - DeadHornCoral, - DeadHornCoralBlock, - DeadHornCoralFan, - DeadHornCoralWallFan, - DeadTubeCoral, - DeadTubeCoralBlock, - DeadTubeCoralFan, - DeadTubeCoralWallFan, - DecoratedPot, - Deepslate, - DeepslateBrickSlab, - DeepslateBrickStairs, - DeepslateBrickWall, - DeepslateBricks, - DeepslateCoalOre, - DeepslateCopperOre, - DeepslateDiamondOre, - DeepslateEmeraldOre, - DeepslateGoldOre, - DeepslateIronOre, - DeepslateLapisOre, - DeepslateRedstoneOre, - DeepslateTileSlab, - DeepslateTileStairs, - DeepslateTileWall, - DeepslateTiles, - DetectorRail, - DiamondBlock, - DiamondOre, - Diorite, - DioriteSlab, - DioriteStairs, - DioriteWall, - Dirt, - DirtPath, - Dispenser, - DragonEgg, - DragonHead, - DragonWallHead, - DriedGhast, - DriedKelpBlock, - DripstoneBlock, - Dropper, - EmeraldBlock, - EmeraldOre, - EnchantingTable, - EndGateway, - EndPortal, - EndPortalFrame, - EndRod, - EndStone, - EndStoneBrickSlab, - EndStoneBrickStairs, - EndStoneBrickWall, - EndStoneBricks, - EnderChest, - ExposedChiseledCopper, - ExposedCopper, - ExposedCopperBars, - ExposedCopperBulb, - ExposedCopperChain, - ExposedCopperChest, - ExposedCopperDoor, - ExposedCopperGolemStatue, - ExposedCopperGrate, - ExposedCopperLantern, - ExposedCopperTrapdoor, - ExposedCutCopper, - ExposedCutCopperSlab, - ExposedCutCopperStairs, - ExposedLightningRod, - Farmland, - Fern, - Fire, - FireCoral, - FireCoralBlock, - FireCoralFan, - FireCoralWallFan, - FireflyBush, - FletchingTable, - FlowerPot, - FloweringAzalea, - FloweringAzaleaLeaves, - Frogspawn, - FrostedIce, - Furnace, - GildedBlackstone, - Glass, - GlassPane, - GlowLichen, - Glowstone, - GoldBlock, - GoldOre, - GoldenDandelion, - Granite, - GraniteSlab, - GraniteStairs, - GraniteWall, - GrassBlock, - Gravel, - GrayBanner, - GrayBed, - GrayCandle, - GrayCandleCake, - GrayCarpet, - GrayConcrete, - GrayConcretePowder, - GrayGlazedTerracotta, - GrayShulkerBox, - GrayStainedGlass, - GrayStainedGlassPane, - GrayTerracotta, - GrayWallBanner, - GrayWool, - GreenBanner, - GreenBed, - GreenCandle, - GreenCandleCake, - GreenCarpet, - GreenConcrete, - GreenConcretePowder, - GreenGlazedTerracotta, - GreenShulkerBox, - GreenStainedGlass, - GreenStainedGlassPane, - GreenTerracotta, - GreenWallBanner, - GreenWool, - Grindstone, - HangingRoots, - HayBlock, - HeavyCore, - HeavyWeightedPressurePlate, - HoneyBlock, - HoneycombBlock, - Hopper, - HornCoral, - HornCoralBlock, - HornCoralFan, - HornCoralWallFan, - Ice, - InfestedChiseledStoneBricks, - InfestedCobblestone, - InfestedCrackedStoneBricks, - InfestedDeepslate, - InfestedMossyStoneBricks, - InfestedStone, - InfestedStoneBricks, - IronBars, - IronBlock, - IronChain, - IronDoor, - IronOre, - IronTrapdoor, - JackOLantern, - Jigsaw, - Jukebox, - JungleButton, - JungleDoor, - JungleFence, - JungleFenceGate, - JungleHangingSign, - JungleLeaves, - JungleLog, - JunglePlanks, - JunglePressurePlate, - JungleSapling, - JungleShelf, - JungleSign, - JungleSlab, - JungleStairs, - JungleTrapdoor, - JungleWallHangingSign, - JungleWallSign, - JungleWood, - Kelp, - KelpPlant, - Ladder, - Lantern, - LapisBlock, - LapisOre, - LargeAmethystBud, - LargeFern, - Lava, - LavaCauldron, - LeafLitter, - Lectern, - Lever, - Light, - LightBlueBanner, - LightBlueBed, - LightBlueCandle, - LightBlueCandleCake, - LightBlueCarpet, - LightBlueConcrete, - LightBlueConcretePowder, - LightBlueGlazedTerracotta, - LightBlueShulkerBox, - LightBlueStainedGlass, - LightBlueStainedGlassPane, - LightBlueTerracotta, - LightBlueWallBanner, - LightBlueWool, - LightGrayBanner, - LightGrayBed, - LightGrayCandle, - LightGrayCandleCake, - LightGrayCarpet, - LightGrayConcrete, - LightGrayConcretePowder, - LightGrayGlazedTerracotta, - LightGrayShulkerBox, - LightGrayStainedGlass, - LightGrayStainedGlassPane, - LightGrayTerracotta, - LightGrayWallBanner, - LightGrayWool, - LightWeightedPressurePlate, - LightningRod, - Lilac, - LilyOfTheValley, - LilyPad, - LimeBanner, - LimeBed, - LimeCandle, - LimeCandleCake, - LimeCarpet, - LimeConcrete, - LimeConcretePowder, - LimeGlazedTerracotta, - LimeShulkerBox, - LimeStainedGlass, - LimeStainedGlassPane, - LimeTerracotta, - LimeWallBanner, - LimeWool, - Lodestone, - Loom, - MagentaBanner, - MagentaBed, - MagentaCandle, - MagentaCandleCake, - MagentaCarpet, - MagentaConcrete, - MagentaConcretePowder, - MagentaGlazedTerracotta, - MagentaShulkerBox, - MagentaStainedGlass, - MagentaStainedGlassPane, - MagentaTerracotta, - MagentaWallBanner, - MagentaWool, - MagmaBlock, - MangroveButton, - MangroveDoor, - MangroveFence, - MangroveFenceGate, - MangroveHangingSign, - MangroveLeaves, - MangroveLog, - MangrovePlanks, - MangrovePressurePlate, - MangrovePropagule, - MangroveRoots, - MangroveShelf, - MangroveSign, - MangroveSlab, - MangroveStairs, - MangroveTrapdoor, - MangroveWallHangingSign, - MangroveWallSign, - MangroveWood, - MediumAmethystBud, - Melon, - MelonStem, - MossBlock, - MossCarpet, - MossyCobblestone, - MossyCobblestoneSlab, - MossyCobblestoneStairs, - MossyCobblestoneWall, - MossyStoneBrickSlab, - MossyStoneBrickStairs, - MossyStoneBrickWall, - MossyStoneBricks, - MovingPiston, - Mud, - MudBrickSlab, - MudBrickStairs, - MudBrickWall, - MudBricks, - MuddyMangroveRoots, - MushroomStem, - Mycelium, - NetherBrickFence, - NetherBrickSlab, - NetherBrickStairs, - NetherBrickWall, - NetherBricks, - NetherGoldOre, - NetherPortal, - NetherQuartzOre, - NetherSprouts, - NetherWart, - NetherWartBlock, - NetheriteBlock, - Netherrack, - NoteBlock, - OakButton, - OakDoor, - OakFence, - OakFenceGate, - OakHangingSign, - OakLeaves, - OakLog, - OakPlanks, - OakPressurePlate, - OakSapling, - OakShelf, - OakSign, - OakSlab, - OakStairs, - OakTrapdoor, - OakWallHangingSign, - OakWallSign, - OakWood, - Observer, - Obsidian, - OchreFroglight, - OpenEyeblossom, - OrangeBanner, - OrangeBed, - OrangeCandle, - OrangeCandleCake, - OrangeCarpet, - OrangeConcrete, - OrangeConcretePowder, - OrangeGlazedTerracotta, - OrangeShulkerBox, - OrangeStainedGlass, - OrangeStainedGlassPane, - OrangeTerracotta, - OrangeTulip, - OrangeWallBanner, - OrangeWool, - OxeyeDaisy, - OxidizedChiseledCopper, - OxidizedCopper, - OxidizedCopperBars, - OxidizedCopperBulb, - OxidizedCopperChain, - OxidizedCopperChest, - OxidizedCopperDoor, - OxidizedCopperGolemStatue, - OxidizedCopperGrate, - OxidizedCopperLantern, - OxidizedCopperTrapdoor, - OxidizedCutCopper, - OxidizedCutCopperSlab, - OxidizedCutCopperStairs, - OxidizedLightningRod, - PackedIce, - PackedMud, - PaleHangingMoss, - PaleMossBlock, - PaleMossCarpet, - PaleOakButton, - PaleOakDoor, - PaleOakFence, - PaleOakFenceGate, - PaleOakHangingSign, - PaleOakLeaves, - PaleOakLog, - PaleOakPlanks, - PaleOakPressurePlate, - PaleOakSapling, - PaleOakShelf, - PaleOakSign, - PaleOakSlab, - PaleOakStairs, - PaleOakTrapdoor, - PaleOakWallHangingSign, - PaleOakWallSign, - PaleOakWood, - PearlescentFroglight, - Peony, - PetrifiedOakSlab, - PiglinHead, - PiglinWallHead, - PinkBanner, - PinkBed, - PinkCandle, - PinkCandleCake, - PinkCarpet, - PinkConcrete, - PinkConcretePowder, - PinkGlazedTerracotta, - PinkPetals, - PinkShulkerBox, - PinkStainedGlass, - PinkStainedGlassPane, - PinkTerracotta, - PinkTulip, - PinkWallBanner, - PinkWool, - Piston, - PistonHead, - PitcherCrop, - PitcherPlant, - PlayerHead, - PlayerWallHead, - Podzol, - PointedDripstone, - PolishedAndesite, - PolishedAndesiteSlab, - PolishedAndesiteStairs, - PolishedBasalt, - PolishedBlackstone, - PolishedBlackstoneBrickSlab, - PolishedBlackstoneBrickStairs, - PolishedBlackstoneBrickWall, - PolishedBlackstoneBricks, - PolishedBlackstoneButton, - PolishedBlackstonePressurePlate, - PolishedBlackstoneSlab, - PolishedBlackstoneStairs, - PolishedBlackstoneWall, - PolishedCinnabar, - PolishedCinnabarSlab, - PolishedCinnabarStairs, - PolishedCinnabarWall, - PolishedDeepslate, - PolishedDeepslateSlab, - PolishedDeepslateStairs, - PolishedDeepslateWall, - PolishedDiorite, - PolishedDioriteSlab, - PolishedDioriteStairs, - PolishedGranite, - PolishedGraniteSlab, - PolishedGraniteStairs, - PolishedSulfur, - PolishedSulfurSlab, - PolishedSulfurStairs, - PolishedSulfurWall, - PolishedTuff, - PolishedTuffSlab, - PolishedTuffStairs, - PolishedTuffWall, - Poppy, - Potatoes, - PotentSulfur, - PottedAcaciaSapling, - PottedAllium, - PottedAzaleaBush, - PottedAzureBluet, - PottedBamboo, - PottedBirchSapling, - PottedBlueOrchid, - PottedBrownMushroom, - PottedCactus, - PottedCherrySapling, - PottedClosedEyeblossom, - PottedCornflower, - PottedCrimsonFungus, - PottedCrimsonRoots, - PottedDandelion, - PottedDarkOakSapling, - PottedDeadBush, - PottedFern, - PottedFloweringAzaleaBush, - PottedGoldenDandelion, - PottedJungleSapling, - PottedLilyOfTheValley, - PottedMangrovePropagule, - PottedOakSapling, - PottedOpenEyeblossom, - PottedOrangeTulip, - PottedOxeyeDaisy, - PottedPaleOakSapling, - PottedPinkTulip, - PottedPoppy, - PottedRedMushroom, - PottedRedTulip, - PottedSpruceSapling, - PottedTorchflower, - PottedWarpedFungus, - PottedWarpedRoots, - PottedWhiteTulip, - PottedWitherRose, - PowderSnow, - PowderSnowCauldron, - PoweredRail, - Prismarine, - PrismarineBrickSlab, - PrismarineBrickStairs, - PrismarineBricks, - PrismarineSlab, - PrismarineStairs, - PrismarineWall, - Pumpkin, - PumpkinStem, - PurpleBanner, - PurpleBed, - PurpleCandle, - PurpleCandleCake, - PurpleCarpet, - PurpleConcrete, - PurpleConcretePowder, - PurpleGlazedTerracotta, - PurpleShulkerBox, - PurpleStainedGlass, - PurpleStainedGlassPane, - PurpleTerracotta, - PurpleWallBanner, - PurpleWool, - PurpurBlock, - PurpurPillar, - PurpurSlab, - PurpurStairs, - QuartzBlock, - QuartzBricks, - QuartzPillar, - QuartzSlab, - QuartzStairs, - Rail, - RawCopperBlock, - RawGoldBlock, - RawIronBlock, - RedBanner, - RedBed, - RedCandle, - RedCandleCake, - RedCarpet, - RedConcrete, - RedConcretePowder, - RedGlazedTerracotta, - RedMushroom, - RedMushroomBlock, - RedNetherBrickSlab, - RedNetherBrickStairs, - RedNetherBrickWall, - RedNetherBricks, - RedSand, - RedSandstone, - RedSandstoneSlab, - RedSandstoneStairs, - RedSandstoneWall, - RedShulkerBox, - RedStainedGlass, - RedStainedGlassPane, - RedTerracotta, - RedTulip, - RedWallBanner, - RedWool, - RedstoneBlock, - RedstoneLamp, - RedstoneOre, - RedstoneTorch, - RedstoneWallTorch, - RedstoneWire, - ReinforcedDeepslate, - Repeater, - RepeatingCommandBlock, - ResinBlock, - ResinBrickSlab, - ResinBrickStairs, - ResinBrickWall, - ResinBricks, - ResinClump, - RespawnAnchor, - RootedDirt, - RoseBush, - Sand, - Sandstone, - SandstoneSlab, - SandstoneStairs, - SandstoneWall, - Scaffolding, - Sculk, - SculkCatalyst, - SculkSensor, - SculkShrieker, - SculkVein, - SeaLantern, - SeaPickle, - Seagrass, - ShortDryGrass, - ShortGrass, - Shroomlight, - ShulkerBox, - SkeletonSkull, - SkeletonWallSkull, - SlimeBlock, - SmallAmethystBud, - SmallDripleaf, - SmithingTable, - Smoker, - SmoothBasalt, - SmoothQuartz, - SmoothQuartzSlab, - SmoothQuartzStairs, - SmoothRedSandstone, - SmoothRedSandstoneSlab, - SmoothRedSandstoneStairs, - SmoothSandstone, - SmoothSandstoneSlab, - SmoothSandstoneStairs, - SmoothStone, - SmoothStoneSlab, - SnifferEgg, - Snow, - SnowBlock, - SoulCampfire, - SoulFire, - SoulLantern, - SoulSand, - SoulSoil, - SoulTorch, - SoulWallTorch, - Spawner, - Sponge, - SporeBlossom, - SpruceButton, - SpruceDoor, - SpruceFence, - SpruceFenceGate, - SpruceHangingSign, - SpruceLeaves, - SpruceLog, - SprucePlanks, - SprucePressurePlate, - SpruceSapling, - SpruceShelf, - SpruceSign, - SpruceSlab, - SpruceStairs, - SpruceTrapdoor, - SpruceWallHangingSign, - SpruceWallSign, - SpruceWood, - StickyPiston, - Stone, - StoneBrickSlab, - StoneBrickStairs, - StoneBrickWall, - StoneBricks, - StoneButton, - StonePressurePlate, - StoneSlab, - StoneStairs, - Stonecutter, - StrippedAcaciaLog, - StrippedAcaciaWood, - StrippedBambooBlock, - StrippedBirchLog, - StrippedBirchWood, - StrippedCherryLog, - StrippedCherryWood, - StrippedCrimsonHyphae, - StrippedCrimsonStem, - StrippedDarkOakLog, - StrippedDarkOakWood, - StrippedJungleLog, - StrippedJungleWood, - StrippedMangroveLog, - StrippedMangroveWood, - StrippedOakLog, - StrippedOakWood, - StrippedPaleOakLog, - StrippedPaleOakWood, - StrippedSpruceLog, - StrippedSpruceWood, - StrippedWarpedHyphae, - StrippedWarpedStem, - StructureBlock, - StructureVoid, - SugarCane, - Sulfur, - SulfurBrickSlab, - SulfurBrickStairs, - SulfurBrickWall, - SulfurBricks, - SulfurSlab, - SulfurSpike, - SulfurStairs, - SulfurWall, - Sunflower, - SuspiciousGravel, - SuspiciousSand, - SweetBerryBush, - TallDryGrass, - TallGrass, - TallSeagrass, - Target, - Terracotta, - TestBlock, - TestInstanceBlock, - TintedGlass, - Tnt, - Torch, - Torchflower, - TorchflowerCrop, - TrappedChest, - TrialSpawner, - Tripwire, - TripwireHook, - TubeCoral, - TubeCoralBlock, - TubeCoralFan, - TubeCoralWallFan, - Tuff, - TuffBrickSlab, - TuffBrickStairs, - TuffBrickWall, - TuffBricks, - TuffSlab, - TuffStairs, - TuffWall, - TurtleEgg, - TwistingVines, - TwistingVinesPlant, - Vault, - VerdantFroglight, - Vine, - VoidAir, - WallTorch, - WarpedButton, - WarpedDoor, - WarpedFence, - WarpedFenceGate, - WarpedFungus, - WarpedHangingSign, - WarpedHyphae, - WarpedNylium, - WarpedPlanks, - WarpedPressurePlate, - WarpedRoots, - WarpedShelf, - WarpedSign, - WarpedSlab, - WarpedStairs, - WarpedStem, - WarpedTrapdoor, - WarpedWallHangingSign, - WarpedWallSign, - WarpedWartBlock, - Water, - WaterCauldron, - WaxedChiseledCopper, - WaxedCopperBars, - WaxedCopperBlock, - WaxedCopperBulb, - WaxedCopperChain, - WaxedCopperChest, - WaxedCopperDoor, - WaxedCopperGolemStatue, - WaxedCopperGrate, - WaxedCopperLantern, - WaxedCopperTrapdoor, - WaxedCutCopper, - WaxedCutCopperSlab, - WaxedCutCopperStairs, - WaxedExposedChiseledCopper, - WaxedExposedCopper, - WaxedExposedCopperBars, - WaxedExposedCopperBulb, - WaxedExposedCopperChain, - WaxedExposedCopperChest, - WaxedExposedCopperDoor, - WaxedExposedCopperGolemStatue, - WaxedExposedCopperGrate, - WaxedExposedCopperLantern, - WaxedExposedCopperTrapdoor, - WaxedExposedCutCopper, - WaxedExposedCutCopperSlab, - WaxedExposedCutCopperStairs, - WaxedExposedLightningRod, - WaxedLightningRod, - WaxedOxidizedChiseledCopper, - WaxedOxidizedCopper, - WaxedOxidizedCopperBars, - WaxedOxidizedCopperBulb, - WaxedOxidizedCopperChain, - WaxedOxidizedCopperChest, - WaxedOxidizedCopperDoor, - WaxedOxidizedCopperGolemStatue, - WaxedOxidizedCopperGrate, - WaxedOxidizedCopperLantern, - WaxedOxidizedCopperTrapdoor, - WaxedOxidizedCutCopper, - WaxedOxidizedCutCopperSlab, - WaxedOxidizedCutCopperStairs, - WaxedOxidizedLightningRod, - WaxedWeatheredChiseledCopper, - WaxedWeatheredCopper, - WaxedWeatheredCopperBars, - WaxedWeatheredCopperBulb, - WaxedWeatheredCopperChain, - WaxedWeatheredCopperChest, - WaxedWeatheredCopperDoor, - WaxedWeatheredCopperGolemStatue, - WaxedWeatheredCopperGrate, - WaxedWeatheredCopperLantern, - WaxedWeatheredCopperTrapdoor, - WaxedWeatheredCutCopper, - WaxedWeatheredCutCopperSlab, - WaxedWeatheredCutCopperStairs, - WaxedWeatheredLightningRod, - WeatheredChiseledCopper, - WeatheredCopper, - WeatheredCopperBars, - WeatheredCopperBulb, - WeatheredCopperChain, - WeatheredCopperChest, - WeatheredCopperDoor, - WeatheredCopperGolemStatue, - WeatheredCopperGrate, - WeatheredCopperLantern, - WeatheredCopperTrapdoor, - WeatheredCutCopper, - WeatheredCutCopperSlab, - WeatheredCutCopperStairs, - WeatheredLightningRod, - WeepingVines, - WeepingVinesPlant, - WetSponge, - Wheat, - WhiteBanner, - WhiteBed, - WhiteCandle, - WhiteCandleCake, - WhiteCarpet, - WhiteConcrete, - WhiteConcretePowder, - WhiteGlazedTerracotta, - WhiteShulkerBox, - WhiteStainedGlass, - WhiteStainedGlassPane, - WhiteTerracotta, - WhiteTulip, - WhiteWallBanner, - WhiteWool, - Wildflowers, - WitherRose, - WitherSkeletonSkull, - WitherSkeletonWallSkull, - YellowBanner, - YellowBed, - YellowCandle, - YellowCandleCake, - YellowCarpet, - YellowConcrete, - YellowConcretePowder, - YellowGlazedTerracotta, - YellowShulkerBox, - YellowStainedGlass, - YellowStainedGlassPane, - YellowTerracotta, - YellowWallBanner, - YellowWool, - ZombieHead, - ZombieWallHead, - } -} \ No newline at end of file diff --git a/MinecraftClient/Mapping/Material2Tool.cs b/MinecraftClient/Mapping/Material2Tool.cs deleted file mode 100644 index 659924807e..0000000000 --- a/MinecraftClient/Mapping/Material2Tool.cs +++ /dev/null @@ -1,782 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory; - -namespace MinecraftClient.Mapping -{ - public static class Material2Tool - { - // Made with the following ressources: https://minecraft.wiki/w/Breaking - // Sorted in alphabetical order. - // Minable by Any Pickaxe. - private static readonly List pickaxeTier0 = new() - { - Material.ActivatorRail, - Material.Andesite, - Material.AndesiteSlab, - Material.AndesiteStairs, - Material.AndesiteWall, - Material.Anvil, - Material.Basalt, - Material.Bell, - Material.BlackConcrete, - Material.BlackGlazedTerracotta, - Material.BlackShulkerBox, - Material.BlackTerracotta, - Material.Blackstone, - Material.BlackstoneSlab, - Material.BlackstoneStairs, - Material.BlackstoneWall, - Material.BlastFurnace, - Material.BlueConcrete, - Material.BlueGlazedTerracotta, - Material.BlueIce, - Material.BlueShulkerBox, - Material.BlueTerracotta, - Material.BoneBlock, - Material.BrewingStand, - Material.BrickSlab, - Material.BrickStairs, - Material.BrickWall, - Material.Bricks, - Material.BrownConcrete, - Material.BrownGlazedTerracotta, - Material.BrownShulkerBox, - Material.BrownTerracotta, - Material.Calcite, - Material.Cauldron, - Material.Chain, - Material.ChippedAnvil, - Material.ChiseledDeepslate, - Material.ChiseledNetherBricks, - Material.ChiseledPolishedBlackstone, - Material.ChiseledQuartzBlock, - Material.ChiseledRedSandstone, - Material.ChiseledSandstone, - Material.ChiseledStoneBricks, - Material.CoalBlock, - Material.CoalOre, - Material.CobbledDeepslate, - Material.CobbledDeepslateSlab, - Material.CobbledDeepslateStairs, - Material.CobbledDeepslateWall, - Material.Cobblestone, - Material.CobblestoneSlab, - Material.CobblestoneStairs, - Material.CobblestoneWall, - Material.Conduit, - Material.CrackedDeepslateBricks, - Material.CrackedDeepslateTiles, - Material.CrackedNetherBricks, - Material.CrackedPolishedBlackstoneBricks, - Material.CrackedStoneBricks, - Material.CrimsonNylium, - Material.CutRedSandstone, - Material.CutRedSandstoneSlab, - Material.CutSandstone, - Material.CutSandstoneSlab, - Material.CyanConcrete, - Material.CyanGlazedTerracotta, - Material.CyanShulkerBox, - Material.CyanTerracotta, - Material.DamagedAnvil, - Material.DarkPrismarine, - Material.DarkPrismarineSlab, - Material.DarkPrismarineStairs, - Material.Deepslate, - Material.DeepslateBrickSlab, - Material.DeepslateBrickStairs, - Material.DeepslateBrickWall, - Material.DeepslateBricks, - Material.DeepslateCoalOre, - Material.DeepslateTileSlab, - Material.DeepslateTileStairs, - Material.DeepslateTileWall, - Material.DeepslateTiles, - Material.DetectorRail, - Material.Diorite, - Material.DioriteSlab, - Material.DioriteStairs, - Material.DioriteWall, - Material.Dispenser, - Material.DripstoneBlock, - Material.Dropper, - Material.EnchantingTable, - Material.EndRod, - Material.EndStone, - Material.EndStoneBrickSlab, - Material.EndStoneBrickStairs, - Material.EndStoneBrickWall, - Material.EndStoneBricks, - Material.EnderChest, - Material.FrostedIce, - Material.Furnace, - Material.GildedBlackstone, - Material.Glowstone, - Material.Granite, - Material.GraniteSlab, - Material.GraniteStairs, - Material.GraniteWall, - Material.GrayConcrete, - Material.GrayGlazedTerracotta, - Material.GrayShulkerBox, - Material.GrayTerracotta, - Material.GreenConcrete, - Material.GreenGlazedTerracotta, - Material.GreenShulkerBox, - Material.GreenTerracotta, - Material.Grindstone, - Material.HeavyWeightedPressurePlate, - Material.Hopper, - Material.Ice, - Material.IronBars, - Material.IronDoor, - Material.IronTrapdoor, - Material.Lantern, - Material.LavaCauldron, - Material.LightBlueConcrete, - Material.LightBlueGlazedTerracotta, - Material.LightBlueShulkerBox, - Material.LightBlueTerracotta, - Material.LightGrayConcrete, - Material.LightGrayGlazedTerracotta, - Material.LightGrayShulkerBox, - Material.LightGrayTerracotta, - Material.LightWeightedPressurePlate, - Material.LimeConcrete, - Material.LimeGlazedTerracotta, - Material.LimeShulkerBox, - Material.LimeTerracotta, - Material.Lodestone, - Material.MagentaConcrete, - Material.MagentaGlazedTerracotta, - Material.MagentaShulkerBox, - Material.MagentaTerracotta, - Material.MagmaBlock, - Material.MossyCobblestone, - Material.MossyCobblestoneSlab, - Material.MossyCobblestoneStairs, - Material.MossyCobblestoneWall, - Material.MossyStoneBrickSlab, - Material.MossyStoneBrickStairs, - Material.MossyStoneBrickWall, - Material.MossyStoneBricks, - Material.NetherBrickFence, - Material.NetherBrickSlab, - Material.NetherBrickStairs, - Material.NetherBrickWall, - Material.NetherBricks, - Material.NetherGoldOre, - Material.NetherQuartzOre, - Material.Netherrack, - Material.Observer, - Material.OrangeConcrete, - Material.OrangeGlazedTerracotta, - Material.OrangeShulkerBox, - Material.OrangeTerracotta, - Material.PackedIce, - Material.PetrifiedOakSlab, - Material.PinkConcrete, - Material.PinkGlazedTerracotta, - Material.PinkShulkerBox, - Material.PinkTerracotta, - Material.Piston, - Material.PointedDripstone, - Material.PolishedAndesite, - Material.PolishedAndesiteSlab, - Material.PolishedAndesiteStairs, - Material.PolishedBasalt, - Material.PolishedBlackstone, - Material.PolishedBlackstoneBrickSlab, - Material.PolishedBlackstoneBrickStairs, - Material.PolishedBlackstoneBrickWall, - Material.PolishedBlackstoneBricks, - Material.PolishedBlackstoneButton, - Material.PolishedBlackstonePressurePlate, - Material.PolishedBlackstoneSlab, - Material.PolishedBlackstoneStairs, - Material.PolishedBlackstoneWall, - Material.PolishedDiorite, - Material.PolishedDioriteSlab, - Material.PolishedDioriteStairs, - Material.PolishedGranite, - Material.PolishedGraniteSlab, - Material.PolishedGraniteStairs, - Material.PowderSnowCauldron, - Material.PoweredRail, - Material.Prismarine, - Material.PrismarineBrickSlab, - Material.PrismarineBrickStairs, - Material.PrismarineBricks, - Material.PrismarineSlab, - Material.PrismarineStairs, - Material.PrismarineWall, - Material.PurpleConcrete, - Material.PurpleGlazedTerracotta, - Material.PurpleShulkerBox, - Material.PurpleTerracotta, - Material.PurpurBlock, - Material.PurpurPillar, - Material.PurpurSlab, - Material.PurpurStairs, - Material.QuartzBlock, - Material.QuartzBricks, - Material.QuartzPillar, - Material.QuartzSlab, - Material.QuartzStairs, - Material.Rail, - Material.RedConcrete, - Material.RedGlazedTerracotta, - Material.RedNetherBrickSlab, - Material.RedNetherBrickStairs, - Material.RedNetherBrickWall, - Material.RedNetherBricks, - Material.RedSandstone, - Material.RedSandstoneSlab, - Material.RedSandstoneStairs, - Material.RedSandstoneWall, - Material.RedShulkerBox, - Material.RedTerracotta, - Material.RedstoneBlock, - Material.Sandstone, - Material.SandstoneSlab, - Material.SandstoneStairs, - Material.SandstoneWall, - Material.ShulkerBox, - Material.Smoker, - Material.SmoothBasalt, - Material.SmoothQuartz, - Material.SmoothQuartzSlab, - Material.SmoothQuartzStairs, - Material.SmoothRedSandstone, - Material.SmoothRedSandstoneSlab, - Material.SmoothRedSandstoneStairs, - Material.SmoothSandstone, - Material.SmoothSandstoneSlab, - Material.SmoothSandstoneStairs, - Material.SmoothStone, - Material.SmoothStoneSlab, - Material.Spawner, - Material.StickyPiston, - Material.Stone, - Material.StoneBrickSlab, - Material.StoneBrickStairs, - Material.StoneBrickWall, - Material.StoneBricks, - Material.StoneButton, - Material.StonePressurePlate, - Material.StoneSlab, - Material.StoneStairs, - Material.Stonecutter, - Material.Terracotta, - Material.Tuff, - Material.WarpedNylium, - Material.WaterCauldron, - Material.WhiteConcrete, - Material.WhiteGlazedTerracotta, - Material.WhiteShulkerBox, - Material.WhiteTerracotta, - Material.YellowConcrete, - Material.YellowGlazedTerracotta, - Material.YellowShulkerBox, - Material.YellowTerracotta, - }; - // Minable by Stone, iron, diamond, netherite. - private static readonly List pickaxeTier1 = new() - { - Material.CopperOre, - Material.CopperBlock, - Material.CutCopperSlab, - Material.CutCopperStairs, - Material.CutCopper, - Material.DeepslateCopperOre, - Material.DeepslateIronOre, - Material.DeepslateLapisOre, - Material.ExposedCopper, - Material.ExposedCutCopperSlab, - Material.ExposedCutCopperStairs, - Material.ExposedCutCopper, - Material.IronBlock, - Material.IronOre, - Material.LapisBlock, - Material.LapisOre, - Material.LightningRod, - Material.OxidizedCopper, - Material.OxidizedCutCopperSlab, - Material.OxidizedCutCopperStairs, - Material.OxidizedCutCopper, - Material.RawCopperBlock, - Material.RawIronBlock, - Material.Terracotta, - Material.WaxedCopperBlock, - Material.WaxedCutCopperSlab, - Material.WaxedCutCopperStairs, - Material.WaxedCutCopper, - Material.WaxedExposedCopper, - Material.WaxedExposedCutCopperSlab, - Material.WaxedExposedCutCopperStairs, - Material.WaxedExposedCutCopper, - Material.WaxedOxidizedCopper, - Material.WaxedOxidizedCutCopperSlab, - Material.WaxedOxidizedCutCopperStairs, - Material.WaxedOxidizedCutCopper, - Material.WaxedWeatheredCopper, - Material.WaxedWeatheredCutCopperSlab, - Material.WaxedWeatheredCutCopperStairs, - Material.WaxedWeatheredCutCopper, - Material.WeatheredCopper, - Material.WeatheredCutCopperSlab, - Material.WeatheredCutCopperStairs, - Material.WeatheredCutCopper, - }; - // Minable by Iron, diamond, netherite. - private static readonly List pickaxeTier2 = new() - { - Material.DeepslateDiamondOre, - Material.DeepslateEmeraldOre, - Material.DeepslateGoldOre, - Material.DeepslateRedstoneOre, - Material.DiamondBlock, - Material.DiamondOre, - Material.EmeraldBlock, - Material.EmeraldOre, - Material.GoldBlock, - Material.GoldOre, - Material.RawGoldBlock, - Material.RedstoneOre, - }; - // Minable by Diamond, Netherite. - private static readonly List pickaxeTier3 = new() - { - Material.AncientDebris, - Material.CryingObsidian, - Material.NetheriteBlock, - Material.Obsidian, - Material.RespawnAnchor - }; - - // Every shovel can mine every block (speed difference). - private static readonly List shovel = new() - { - Material.BlackConcretePowder, - Material.BlueConcretePowder, - Material.BrownConcretePowder, - Material.Clay, - Material.CoarseDirt, - Material.CyanConcretePowder, - Material.Dirt, - Material.Farmland, - Material.ShortGrass, - Material.GrassBlock, - Material.DirtPath, - Material.Gravel, - Material.GrayConcretePowder, - Material.GreenConcretePowder, - Material.LightBlueConcretePowder, - Material.LightGrayConcretePowder, - Material.LimeConcretePowder, - Material.TallGrass, - Material.MagentaConcretePowder, - Material.Mycelium, - Material.OrangeConcretePowder, - Material.PinkConcretePowder, - Material.Podzol, - Material.PrismarineSlab, - Material.PurpleConcretePowder, - Material.RedConcretePowder, - Material.RedSand, - Material.RootedDirt, - Material.Sand, - Material.Snow, - Material.SnowBlock, - Material.SoulSand, - Material.SoulSoil, - Material.WhiteConcretePowder, - Material.YellowConcretePowder, - }; - // Every axe can mine every block (speed difference). - private static readonly List axe = new() - { - Material.AcaciaButton, - Material.AcaciaDoor, - Material.AcaciaFence, - Material.AcaciaFenceGate, - Material.AcaciaLog, - Material.AcaciaPlanks, - Material.AcaciaPressurePlate, - Material.AcaciaSign, - Material.AcaciaSlab, - Material.AcaciaStairs, - Material.AcaciaTrapdoor, - Material.AcaciaWallSign, - Material.AcaciaWood, - Material.Barrel, - Material.BeeNest, - Material.Beehive, - Material.BigDripleaf, - Material.BirchButton, - Material.BirchDoor, - Material.BirchFence, - Material.BirchFenceGate, - Material.BirchLog, - Material.BirchPlanks, - Material.BirchPressurePlate, - Material.BirchSign, - Material.BirchSlab, - Material.BirchStairs, - Material.BirchTrapdoor, - Material.BirchWallSign, - Material.BirchWood, - Material.BlackBanner, - Material.BlackWallBanner, - Material.BlueBanner, - Material.BlueWallBanner, - Material.Bookshelf, - Material.BrownBanner, - Material.BrownMushroomBlock, - Material.BrownWallBanner, - Material.Campfire, - Material.CartographyTable, - Material.Chest, - Material.Cocoa, - Material.Composter, - Material.CraftingTable, - Material.CrimsonButton, - Material.CrimsonDoor, - Material.CrimsonFence, - Material.CrimsonFenceGate, - Material.CrimsonHyphae, - Material.CrimsonPlanks, - Material.CrimsonPressurePlate, - Material.CrimsonSign, - Material.CrimsonSlab, - Material.CrimsonStairs, - Material.CrimsonStem, - Material.CrimsonTrapdoor, - Material.CrimsonWallSign, - Material.CyanBanner, - Material.CyanWallBanner, - Material.DarkOakButton, - Material.DarkOakDoor, - Material.DarkOakFence, - Material.DarkOakFenceGate, - Material.DarkOakLog, - Material.DarkOakPlanks, - Material.DarkOakPressurePlate, - Material.DarkOakSign, - Material.DarkOakSlab, - Material.DarkOakStairs, - Material.DarkOakTrapdoor, - Material.DarkOakWallSign, - Material.DarkOakWood, - Material.DaylightDetector, - Material.FletchingTable, - Material.GrayBanner, - Material.GrayWallBanner, - Material.GreenBanner, - Material.GreenWallBanner, - Material.JackOLantern, - Material.Jukebox, - Material.JungleButton, - Material.JungleDoor, - Material.JungleFence, - Material.JungleFenceGate, - Material.JungleLog, - Material.JunglePlanks, - Material.JunglePressurePlate, - Material.JungleSign, - Material.JungleSlab, - Material.JungleStairs, - Material.JungleTrapdoor, - Material.JungleWallSign, - Material.JungleWood, - Material.Ladder, - Material.Lectern, - Material.LightBlueBanner, - Material.LightBlueWallBanner, - Material.LightGrayBanner, - Material.LightGrayWallBanner, - Material.LimeBanner, - Material.LimeWallBanner, - Material.Loom, - Material.MagentaBanner, - Material.MagentaWallBanner, - Material.Melon, - Material.MushroomStem, - Material.NoteBlock, - Material.OakButton, - Material.OakDoor, - Material.OakFence, - Material.OakFenceGate, - Material.OakLog, - Material.OakPlanks, - Material.OakPressurePlate, - Material.OakSign, - Material.OakSlab, - Material.OakStairs, - Material.OakTrapdoor, - Material.OakWallSign, - Material.OakWood, - Material.OrangeBanner, - Material.OrangeWallBanner, - Material.PinkBanner, - Material.PinkWallBanner, - Material.Pumpkin, - Material.PurpleBanner, - Material.PurpleWallBanner, - Material.RedBanner, - Material.RedMushroomBlock, - Material.RedWallBanner, - Material.SmithingTable, - Material.SoulCampfire, - Material.SpruceButton, - Material.SpruceDoor, - Material.SpruceFence, - Material.SpruceFenceGate, - Material.SpruceLog, - Material.SprucePlanks, - Material.SprucePressurePlate, - Material.SpruceSign, - Material.SpruceSlab, - Material.SpruceStairs, - Material.SpruceTrapdoor, - Material.SpruceWallSign, - Material.SpruceWood, - Material.StrippedAcaciaLog, - Material.StrippedAcaciaWood, - Material.StrippedBirchLog, - Material.StrippedBirchWood, - Material.StrippedCrimsonHyphae, - Material.StrippedCrimsonStem, - Material.StrippedDarkOakLog, - Material.StrippedDarkOakWood, - Material.StrippedDarkOakWood, - Material.StrippedJungleLog, - Material.StrippedJungleWood, - Material.StrippedOakLog, - Material.StrippedOakWood, - Material.StrippedSpruceLog, - Material.StrippedSpruceWood, - Material.StrippedWarpedHyphae, - Material.StrippedWarpedStem, - Material.TrappedChest, - Material.Vine, - Material.WarpedButton, - Material.WarpedDoor, - Material.WarpedFence, - Material.WarpedFenceGate, - Material.WarpedHyphae, - Material.WarpedPlanks, - Material.WarpedPressurePlate, - Material.WarpedSign, - Material.WarpedSlab, - Material.WarpedStairs, - Material.WarpedStem, - Material.WarpedTrapdoor, - Material.WarpedWallSign, - Material.WhiteBanner, - Material.WhiteWallBanner, - Material.YellowBanner, - Material.YellowWallBanner, - }; - // Every block a shear can mine. - private static readonly List shears = new() - { - Material.AcaciaLeaves, - Material.AzaleaLeaves, - Material.BirchLeaves, - Material.BlackWool, - Material.BlueWool, - Material.BrownWool, - Material.Cobweb, - Material.CyanWool, - Material.DarkOakLeaves, - Material.FloweringAzaleaLeaves, - Material.GrayWool, - Material.GreenWool, - Material.JungleLeaves, - Material.LightBlueWool, - Material.LightGrayWool, - Material.LimeWool, - Material.MagentaWool, - Material.OakLeaves, - Material.OrangeWool, - Material.PinkWool, - Material.PurpleWool, - Material.RedWool, - Material.SpruceLeaves, - Material.WhiteWool, - Material.YellowWool, - }; - // Every block that is mined with a sword. - private static readonly List sword = new() - { - Material.Bamboo, - Material.Cobweb, - Material.InfestedChiseledStoneBricks, - Material.InfestedDeepslate, - Material.InfestedCobblestone, - Material.InfestedCrackedStoneBricks, - Material.InfestedMossyStoneBricks, - Material.InfestedStone, - Material.InfestedStoneBricks, - }; - // Every block that can be mined with a hoe. - private static readonly List hoe = new() - { - Material.AcaciaLeaves, - Material.BirchLeaves, - Material.DarkOakLeaves, - Material.HayBlock, - Material.JungleLeaves, - Material.MossBlock, - Material.NetherWartBlock, - Material.OakLeaves, - Material.SculkSensor, - Material.Shroomlight, - Material.Sponge, - Material.SpruceLeaves, - Material.Target, - Material.WarpedWartBlock, - Material.WetSponge, - }; - // Liquids - private static readonly List bucket = new() - { - Material.Lava, - Material.Water - }; - - // Unbreakable Blocks - private static readonly List unbreakable = new() - { - Material.Air, - Material.Barrier, - Material.Bedrock, - Material.BubbleColumn, - Material.ChainCommandBlock, - Material.CommandBlock, - Material.EndGateway, - Material.EndPortal, - Material.EndPortalFrame, - Material.Jigsaw, - Material.NetherPortal, - Material.RepeatingCommandBlock, - Material.StructureBlock, - Material.StructureVoid - }; - - /// - /// Evaluates the right tool for the job - /// - /// Enter the Material of a block - /// Returns a list of tools that can be used, best to worst - public static ItemType[] GetCorrectToolForBlock(Material block) - { - if (pickaxeTier0.Contains(block)) - { - return new ItemType[] - { - ItemType.NetheritePickaxe, - ItemType.DiamondPickaxe, - ItemType.IronPickaxe, - ItemType.GoldenPickaxe, - ItemType.StonePickaxe, - ItemType.WoodenPickaxe, - }; - } - else if (pickaxeTier1.Contains(block)) - { - return new ItemType[] - { - ItemType.NetheritePickaxe, - ItemType.DiamondPickaxe, - ItemType.IronPickaxe, - ItemType.GoldenPickaxe, - ItemType.StonePickaxe, - }; - } - else if (pickaxeTier2.Contains(block)) - { - return new ItemType[] - { - ItemType.NetheritePickaxe, - ItemType.DiamondPickaxe, - ItemType.IronPickaxe, - }; - } - else if (pickaxeTier3.Contains(block)) - { - return new ItemType[] - { - ItemType.NetheritePickaxe, - ItemType.DiamondPickaxe, - }; - } - else if (shovel.Contains(block)) - { - return new ItemType[] - { - ItemType.NetheriteShovel, - ItemType.DiamondShovel, - ItemType.IronShovel, - ItemType.GoldenShovel, - ItemType.StoneShovel, - ItemType.WoodenShovel, - }; - } - else if (axe.Contains(block)) - { - return new ItemType[] - { - ItemType.NetheriteAxe, - ItemType.DiamondAxe, - ItemType.IronAxe, - ItemType.GoldenAxe, - ItemType.StoneAxe, - ItemType.WoodenAxe, - }; - } - else if (shears.Contains(block)) - { - return new ItemType[] - { - ItemType.Shears, - }; - } - else if (sword.Contains(block)) - { - return new ItemType[] - { - ItemType.NetheriteSword, - ItemType.DiamondSword, - ItemType.IronSword, - ItemType.GoldenSword, - ItemType.StoneSword, - ItemType.WoodenSword, - }; - } - else if (hoe.Contains(block)) - { - return new ItemType[] - { - ItemType.NetheriteHoe, - ItemType.DiamondHoe, - ItemType.IronHoe, - ItemType.GoldenHoe, - ItemType.StoneHoe, - ItemType.WoodenHoe, - }; - } - else if (bucket.Contains(block)) - { - return new ItemType[] - { - ItemType.Bucket, - }; - } - else { return System.Array.Empty(); } - } - - public static bool IsUnbreakable(Material block) { return unbreakable.Contains(block); } - } -} diff --git a/MinecraftClient/Mapping/MaterialExtensions.cs b/MinecraftClient/Mapping/MaterialExtensions.cs deleted file mode 100644 index 5d2fe06d92..0000000000 --- a/MinecraftClient/Mapping/MaterialExtensions.cs +++ /dev/null @@ -1,900 +0,0 @@ -namespace MinecraftClient.Mapping -{ - /// - /// Defines extension methods for the Material enumeration - /// - public static class MaterialExtensions - { - /// - /// Check if the player cannot pass through the specified material - /// - /// Material to test - /// True if the material is harmful - public static bool IsSolid(this Material m) - { - switch (m) - { - case Material.AcaciaDoor: - case Material.AcaciaFence: - case Material.AcaciaFenceGate: - case Material.AcaciaLeaves: - case Material.AcaciaLog: - case Material.AcaciaPlanks: - case Material.AcaciaSlab: - case Material.AcaciaStairs: - case Material.AcaciaTrapdoor: - case Material.AcaciaWood: - case Material.AmethystBlock: - case Material.AmethystCluster: - case Material.AncientDebris: - case Material.Andesite: - case Material.AndesiteSlab: - case Material.AndesiteStairs: - case Material.AndesiteWall: - case Material.Anvil: - case Material.Azalea: - case Material.AzaleaLeaves: - case Material.Bamboo: - case Material.Barrel: - case Material.Barrier: - case Material.Basalt: - case Material.Beacon: - case Material.Bedrock: - case Material.Beehive: - case Material.BeeNest: - case Material.Bell: - case Material.BirchDoor: - case Material.BirchFence: - case Material.BirchFenceGate: - case Material.BirchLeaves: - case Material.BirchLog: - case Material.BirchPlanks: - case Material.BirchSlab: - case Material.BirchStairs: - case Material.BirchTrapdoor: - case Material.BirchWood: - case Material.BlackBed: - case Material.BlackCandle: - case Material.BlackCandleCake: - case Material.BlackConcrete: - case Material.BlackConcretePowder: - case Material.BlackGlazedTerracotta: - case Material.BlackShulkerBox: - case Material.BlackStainedGlass: - case Material.BlackStainedGlassPane: - case Material.Blackstone: - case Material.BlackstoneSlab: - case Material.BlackstoneStairs: - case Material.BlackstoneWall: - case Material.BlackTerracotta: - case Material.BlackWool: - case Material.BlastFurnace: - case Material.BlueBed: - case Material.BlueCandle: - case Material.BlueCandleCake: - case Material.BlueConcrete: - case Material.BlueConcretePowder: - case Material.BlueGlazedTerracotta: - case Material.BlueIce: - case Material.BlueShulkerBox: - case Material.BlueStainedGlass: - case Material.BlueStainedGlassPane: - case Material.BlueTerracotta: - case Material.BlueWool: - case Material.BoneBlock: - case Material.Bookshelf: - case Material.BrainCoralBlock: - case Material.BrewingStand: - case Material.Bricks: - case Material.BrickSlab: - case Material.BrickStairs: - case Material.BrickWall: - case Material.BrownBed: - case Material.BrownCandle: - case Material.BrownCandleCake: - case Material.BrownConcrete: - case Material.BrownConcretePowder: - case Material.BrownGlazedTerracotta: - case Material.BrownMushroomBlock: - case Material.BrownShulkerBox: - case Material.BrownStainedGlass: - case Material.BrownStainedGlassPane: - case Material.BrownTerracotta: - case Material.BrownWool: - case Material.BubbleColumn: - case Material.BubbleCoralBlock: - case Material.BuddingAmethyst: - case Material.Cactus: - case Material.Cake: - case Material.Calcite: - case Material.Campfire: - case Material.Candle: - case Material.CandleCake: - case Material.CartographyTable: - case Material.CarvedPumpkin: - case Material.Cauldron: - case Material.Chain: - case Material.ChainCommandBlock: - case Material.Chest: - case Material.ChippedAnvil: - case Material.ChiseledDeepslate: - case Material.ChiseledNetherBricks: - case Material.ChiseledPolishedBlackstone: - case Material.ChiseledQuartzBlock: - case Material.ChiseledRedSandstone: - case Material.ChiseledResinBricks: - case Material.ChiseledSandstone: - case Material.ChiseledStoneBricks: - case Material.ChorusFlower: - case Material.ChorusPlant: - case Material.Clay: - case Material.CoalBlock: - case Material.CoalOre: - case Material.CoarseDirt: - case Material.CobbledDeepslate: - case Material.CobbledDeepslateSlab: - case Material.CobbledDeepslateStairs: - case Material.CobbledDeepslateWall: - case Material.Cobblestone: - case Material.CobblestoneSlab: - case Material.CobblestoneStairs: - case Material.CobblestoneWall: - case Material.CommandBlock: - case Material.Composter: - case Material.Conduit: - case Material.CopperBlock: - case Material.CopperOre: - case Material.CrackedDeepslateBricks: - case Material.CrackedDeepslateTiles: - case Material.CrackedNetherBricks: - case Material.CrackedPolishedBlackstoneBricks: - case Material.CrackedStoneBricks: - case Material.CraftingTable: - case Material.CreeperHead: - case Material.CreeperWallHead: - case Material.CrimsonDoor: - case Material.CrimsonFence: - case Material.CrimsonFenceGate: - case Material.CrimsonHyphae: - case Material.CrimsonNylium: - case Material.CrimsonPlanks: - case Material.CrimsonSlab: - case Material.CrimsonStairs: - case Material.CrimsonStem: - case Material.CrimsonTrapdoor: - case Material.CryingObsidian: - case Material.CutCopper: - case Material.CutCopperSlab: - case Material.CutCopperStairs: - case Material.CutRedSandstone: - case Material.CutRedSandstoneSlab: - case Material.CutSandstone: - case Material.CutSandstoneSlab: - case Material.CyanBed: - case Material.CyanCandle: - case Material.CyanCandleCake: - case Material.CyanConcrete: - case Material.CyanConcretePowder: - case Material.CyanGlazedTerracotta: - case Material.CyanShulkerBox: - case Material.CyanStainedGlass: - case Material.CyanStainedGlassPane: - case Material.CyanTerracotta: - case Material.CyanWool: - case Material.DamagedAnvil: - case Material.DarkOakDoor: - case Material.DarkOakFence: - case Material.DarkOakFenceGate: - case Material.DarkOakLeaves: - case Material.DarkOakLog: - case Material.DarkOakPlanks: - case Material.DarkOakSlab: - case Material.DarkOakStairs: - case Material.DarkOakTrapdoor: - case Material.DarkOakWood: - case Material.DarkPrismarine: - case Material.DarkPrismarineSlab: - case Material.DarkPrismarineStairs: - case Material.DaylightDetector: - case Material.DeadBrainCoralBlock: - case Material.DeadBubbleCoralBlock: - case Material.DeadFireCoralBlock: - case Material.DeadHornCoralBlock: - case Material.DeadTubeCoralBlock: - case Material.Deepslate: - case Material.DeepslateBricks: - case Material.DeepslateBrickSlab: - case Material.DeepslateBrickStairs: - case Material.DeepslateBrickWall: - case Material.DeepslateCoalOre: - case Material.DeepslateCopperOre: - case Material.DeepslateDiamondOre: - case Material.DeepslateEmeraldOre: - case Material.DeepslateGoldOre: - case Material.DeepslateIronOre: - case Material.DeepslateLapisOre: - case Material.DeepslateRedstoneOre: - case Material.DeepslateTiles: - case Material.DeepslateTileSlab: - case Material.DeepslateTileStairs: - case Material.DeepslateTileWall: - case Material.DiamondBlock: - case Material.DiamondOre: - case Material.Diorite: - case Material.DioriteSlab: - case Material.DioriteStairs: - case Material.DioriteWall: - case Material.Dirt: - case Material.DirtPath: - case Material.Dispenser: - case Material.DragonEgg: - case Material.DragonHead: - case Material.DragonWallHead: - case Material.DriedKelpBlock: - case Material.DripstoneBlock: - case Material.Dropper: - case Material.EmeraldBlock: - case Material.EmeraldOre: - case Material.EnchantingTable: - case Material.EnderChest: - case Material.EndPortalFrame: - case Material.EndRod: - case Material.EndStone: - case Material.EndStoneBricks: - case Material.EndStoneBrickSlab: - case Material.EndStoneBrickStairs: - case Material.EndStoneBrickWall: - case Material.ExposedCopper: - case Material.ExposedCutCopper: - case Material.ExposedCutCopperSlab: - case Material.ExposedCutCopperStairs: - case Material.Farmland: - case Material.FireCoralBlock: - case Material.FletchingTable: - case Material.FloweringAzalea: - case Material.FloweringAzaleaLeaves: - case Material.FlowerPot: - case Material.FrostedIce: - case Material.Furnace: - case Material.GildedBlackstone: - case Material.Glass: - case Material.GlassPane: - case Material.Glowstone: - case Material.GoldBlock: - case Material.GoldOre: - case Material.Granite: - case Material.GraniteSlab: - case Material.GraniteStairs: - case Material.GraniteWall: - case Material.GrassBlock: - case Material.Gravel: - case Material.GrayBed: - case Material.GrayCandle: - case Material.GrayCandleCake: - case Material.GrayConcrete: - case Material.GrayConcretePowder: - case Material.GrayGlazedTerracotta: - case Material.GrayShulkerBox: - case Material.GrayStainedGlass: - case Material.GrayStainedGlassPane: - case Material.GrayTerracotta: - case Material.GrayWool: - case Material.GreenBed: - case Material.GreenCandle: - case Material.GreenCandleCake: - case Material.GreenConcrete: - case Material.GreenConcretePowder: - case Material.GreenGlazedTerracotta: - case Material.GreenShulkerBox: - case Material.GreenStainedGlass: - case Material.GreenStainedGlassPane: - case Material.GreenTerracotta: - case Material.GreenWool: - case Material.Grindstone: - case Material.HayBlock: - case Material.HoneyBlock: - case Material.HoneycombBlock: - case Material.Hopper: - case Material.HornCoralBlock: - case Material.Ice: - case Material.InfestedChiseledStoneBricks: - case Material.InfestedCobblestone: - case Material.InfestedCrackedStoneBricks: - case Material.InfestedDeepslate: - case Material.InfestedMossyStoneBricks: - case Material.InfestedStone: - case Material.InfestedStoneBricks: - case Material.IronBars: - case Material.IronBlock: - case Material.IronDoor: - case Material.IronOre: - case Material.IronTrapdoor: - case Material.JackOLantern: - case Material.Jigsaw: - case Material.Jukebox: - case Material.JungleDoor: - case Material.JungleFence: - case Material.JungleFenceGate: - case Material.JungleLeaves: - case Material.JungleLog: - case Material.JunglePlanks: - case Material.JungleSlab: - case Material.JungleStairs: - case Material.JungleTrapdoor: - case Material.JungleWood: - case Material.Ladder: - case Material.Lantern: - case Material.LapisBlock: - case Material.LapisOre: - case Material.LargeAmethystBud: - case Material.LavaCauldron: - case Material.Lectern: - case Material.LightBlueBed: - case Material.LightBlueCandle: - case Material.LightBlueCandleCake: - case Material.LightBlueConcrete: - case Material.LightBlueConcretePowder: - case Material.LightBlueGlazedTerracotta: - case Material.LightBlueShulkerBox: - case Material.LightBlueStainedGlass: - case Material.LightBlueStainedGlassPane: - case Material.LightBlueTerracotta: - case Material.LightBlueWool: - case Material.LightGrayBed: - case Material.LightGrayCandle: - case Material.LightGrayCandleCake: - case Material.LightGrayConcrete: - case Material.LightGrayConcretePowder: - case Material.LightGrayGlazedTerracotta: - case Material.LightGrayShulkerBox: - case Material.LightGrayStainedGlass: - case Material.LightGrayStainedGlassPane: - case Material.LightGrayTerracotta: - case Material.LightGrayWool: - case Material.LightningRod: - case Material.LilyPad: - case Material.LimeBed: - case Material.LimeCandle: - case Material.LimeCandleCake: - case Material.LimeConcrete: - case Material.LimeConcretePowder: - case Material.LimeGlazedTerracotta: - case Material.LimeShulkerBox: - case Material.LimeStainedGlass: - case Material.LimeStainedGlassPane: - case Material.LimeTerracotta: - case Material.LimeWool: - case Material.Lodestone: - case Material.Loom: - case Material.MagentaBed: - case Material.MagentaCandle: - case Material.MagentaCandleCake: - case Material.MagentaConcrete: - case Material.MagentaConcretePowder: - case Material.MagentaGlazedTerracotta: - case Material.MagentaShulkerBox: - case Material.MagentaStainedGlass: - case Material.MagentaStainedGlassPane: - case Material.MagentaTerracotta: - case Material.MagentaWool: - case Material.MagmaBlock: - case Material.MangroveDoor: - case Material.MangroveFence: - case Material.MangroveFenceGate: - case Material.MangroveLeaves: - case Material.MangroveLog: - case Material.MangrovePlanks: - case Material.MangroveRoots: - case Material.MangroveSlab: - case Material.MangroveStairs: - case Material.MangroveTrapdoor: - case Material.MangroveWood: - case Material.MediumAmethystBud: - case Material.Melon: - case Material.MossBlock: - case Material.MossCarpet: - case Material.MossyCobblestone: - case Material.MossyCobblestoneSlab: - case Material.MossyCobblestoneStairs: - case Material.MossyCobblestoneWall: - case Material.MossyStoneBricks: - case Material.MossyStoneBrickSlab: - case Material.MossyStoneBrickStairs: - case Material.MossyStoneBrickWall: - case Material.MovingPiston: - case Material.Mud: - case Material.MudBricks: - case Material.MudBrickSlab: - case Material.MudBrickStairs: - case Material.MudBrickWall: - case Material.MuddyMangroveRoots: - case Material.MushroomStem: - case Material.Mycelium: - case Material.NetherBrickFence: - case Material.NetherBricks: - case Material.NetherBrickSlab: - case Material.NetherBrickStairs: - case Material.NetherBrickWall: - case Material.NetherGoldOre: - case Material.NetheriteBlock: - case Material.NetherQuartzOre: - case Material.Netherrack: - case Material.NetherWartBlock: - case Material.NoteBlock: - case Material.OakDoor: - case Material.OakFence: - case Material.OakFenceGate: - case Material.OakLeaves: - case Material.OakLog: - case Material.OakPlanks: - case Material.OakSlab: - case Material.OakStairs: - case Material.OakTrapdoor: - case Material.OakWood: - case Material.Observer: - case Material.Obsidian: - case Material.OchreFroglight: - case Material.OrangeBed: - case Material.OrangeCandle: - case Material.OrangeCandleCake: - case Material.OrangeConcrete: - case Material.OrangeConcretePowder: - case Material.OrangeGlazedTerracotta: - case Material.OrangeShulkerBox: - case Material.OrangeStainedGlass: - case Material.OrangeStainedGlassPane: - case Material.OrangeTerracotta: - case Material.OrangeWool: - case Material.OxidizedCopper: - case Material.OxidizedCutCopper: - case Material.OxidizedCutCopperSlab: - case Material.OxidizedCutCopperStairs: - case Material.PackedIce: - case Material.PackedMud: - case Material.PearlescentFroglight: - case Material.PetrifiedOakSlab: - case Material.PinkBed: - case Material.PinkCandle: - case Material.PinkCandleCake: - case Material.PinkConcrete: - case Material.PinkConcretePowder: - case Material.PinkGlazedTerracotta: - case Material.PinkShulkerBox: - case Material.PinkStainedGlass: - case Material.PinkStainedGlassPane: - case Material.PinkTerracotta: - case Material.PinkWool: - case Material.Piston: - case Material.PistonHead: - case Material.PlayerHead: - case Material.PlayerWallHead: - case Material.Podzol: - case Material.PointedDripstone: - case Material.PolishedAndesite: - case Material.PolishedAndesiteSlab: - case Material.PolishedAndesiteStairs: - case Material.PolishedBasalt: - case Material.PolishedBlackstone: - case Material.PolishedBlackstoneBricks: - case Material.PolishedBlackstoneBrickSlab: - case Material.PolishedBlackstoneBrickStairs: - case Material.PolishedBlackstoneBrickWall: - case Material.PolishedBlackstoneSlab: - case Material.PolishedBlackstoneStairs: - case Material.PolishedBlackstoneWall: - case Material.PolishedDeepslate: - case Material.PolishedDeepslateSlab: - case Material.PolishedDeepslateStairs: - case Material.PolishedDeepslateWall: - case Material.PolishedDiorite: - case Material.PolishedDioriteSlab: - case Material.PolishedDioriteStairs: - case Material.PolishedGranite: - case Material.PolishedGraniteSlab: - case Material.PolishedGraniteStairs: - case Material.PottedAcaciaSapling: - case Material.PottedAllium: - case Material.PottedAzaleaBush: - case Material.PottedAzureBluet: - case Material.PottedBamboo: - case Material.PottedBirchSapling: - case Material.PottedBlueOrchid: - case Material.PottedBrownMushroom: - case Material.PottedCactus: - case Material.PottedCherrySapling: - case Material.PottedClosedEyeblossom: - case Material.PottedCornflower: - case Material.PottedDandelion: - case Material.PottedDarkOakSapling: - case Material.PottedDeadBush: - case Material.PottedFern: - case Material.PottedFloweringAzaleaBush: - case Material.PottedJungleSapling: - case Material.PottedLilyOfTheValley: - case Material.PottedOakSapling: - case Material.PottedOpenEyeblossom: - case Material.PottedOrangeTulip: - case Material.PottedOxeyeDaisy: - case Material.PottedPinkTulip: - case Material.PottedPoppy: - case Material.PottedRedMushroom: - case Material.PottedRedTulip: - case Material.PottedSpruceSapling: - case Material.PottedWhiteTulip: - case Material.PottedWitherRose: - case Material.PowderSnowCauldron: - case Material.Prismarine: - case Material.PrismarineBricks: - case Material.PrismarineBrickSlab: - case Material.PrismarineBrickStairs: - case Material.PrismarineSlab: - case Material.PrismarineStairs: - case Material.PrismarineWall: - case Material.Pumpkin: - case Material.PurpleBed: - case Material.PurpleCandle: - case Material.PurpleCandleCake: - case Material.PurpleConcrete: - case Material.PurpleConcretePowder: - case Material.PurpleGlazedTerracotta: - case Material.PurpleShulkerBox: - case Material.PurpleStainedGlass: - case Material.PurpleStainedGlassPane: - case Material.PurpleTerracotta: - case Material.PurpleWool: - case Material.PurpurBlock: - case Material.PurpurPillar: - case Material.PurpurSlab: - case Material.PurpurStairs: - case Material.QuartzBlock: - case Material.QuartzBricks: - case Material.QuartzPillar: - case Material.QuartzSlab: - case Material.QuartzStairs: - case Material.RawCopperBlock: - case Material.RawGoldBlock: - case Material.RawIronBlock: - case Material.RedBed: - case Material.RedCandle: - case Material.RedCandleCake: - case Material.RedConcrete: - case Material.RedConcretePowder: - case Material.RedGlazedTerracotta: - case Material.RedMushroomBlock: - case Material.RedNetherBricks: - case Material.RedNetherBrickSlab: - case Material.RedNetherBrickStairs: - case Material.RedNetherBrickWall: - case Material.RedSand: - case Material.RedSandstone: - case Material.RedSandstoneSlab: - case Material.RedSandstoneStairs: - case Material.RedSandstoneWall: - case Material.RedShulkerBox: - case Material.RedStainedGlass: - case Material.RedStainedGlassPane: - case Material.RedstoneBlock: - case Material.RedstoneLamp: - case Material.RedstoneOre: - case Material.RedTerracotta: - case Material.RedWool: - case Material.ReinforcedDeepslate: - case Material.RepeatingCommandBlock: - case Material.ResinBlock: - case Material.ResinBrickStairs: - case Material.ResinBrickWall: - case Material.ResinBricks: - case Material.RespawnAnchor: - case Material.RootedDirt: - case Material.Sand: - case Material.Sandstone: - case Material.SandstoneSlab: - case Material.SandstoneStairs: - case Material.SandstoneWall: - case Material.Sculk: - case Material.SculkCatalyst: - case Material.SculkSensor: - case Material.SculkShrieker: - case Material.SculkVein: - case Material.SeaLantern: - case Material.SeaPickle: - case Material.Shroomlight: - case Material.ShulkerBox: - case Material.SkeletonSkull: - case Material.SkeletonWallSkull: - case Material.SlimeBlock: - case Material.SmallAmethystBud: - case Material.SmithingTable: - case Material.Smoker: - case Material.SmoothBasalt: - case Material.SmoothQuartz: - case Material.SmoothQuartzSlab: - case Material.SmoothQuartzStairs: - case Material.SmoothRedSandstone: - case Material.SmoothRedSandstoneSlab: - case Material.SmoothRedSandstoneStairs: - case Material.SmoothSandstone: - case Material.SmoothSandstoneSlab: - case Material.SmoothSandstoneStairs: - case Material.SmoothStone: - case Material.SmoothStoneSlab: - case Material.SnowBlock: - case Material.SoulCampfire: - case Material.SoulLantern: - case Material.SoulSand: - case Material.SoulSoil: - case Material.Spawner: - case Material.Sponge: - case Material.SpruceDoor: - case Material.SpruceFence: - case Material.SpruceFenceGate: - case Material.SpruceLeaves: - case Material.SpruceLog: - case Material.SprucePlanks: - case Material.SpruceSlab: - case Material.SpruceStairs: - case Material.SpruceTrapdoor: - case Material.SpruceWood: - case Material.StickyPiston: - case Material.Stone: - case Material.StoneBricks: - case Material.StoneBrickSlab: - case Material.StoneBrickStairs: - case Material.StoneBrickWall: - case Material.Stonecutter: - case Material.StoneSlab: - case Material.StoneStairs: - case Material.StrippedAcaciaLog: - case Material.StrippedAcaciaWood: - case Material.StrippedBirchLog: - case Material.StrippedBirchWood: - case Material.StrippedCrimsonHyphae: - case Material.StrippedCrimsonStem: - case Material.StrippedDarkOakLog: - case Material.StrippedDarkOakWood: - case Material.StrippedJungleLog: - case Material.StrippedJungleWood: - case Material.StrippedMangroveLog: - case Material.StrippedMangroveWood: - case Material.StrippedOakLog: - case Material.StrippedOakWood: - case Material.StrippedSpruceLog: - case Material.StrippedSpruceWood: - case Material.StrippedWarpedHyphae: - case Material.StrippedWarpedStem: - case Material.StructureBlock: - case Material.Target: - case Material.Terracotta: - case Material.TintedGlass: - case Material.Tnt: - case Material.TrappedChest: - case Material.TubeCoralBlock: - case Material.Tuff: - case Material.TurtleEgg: - case Material.VerdantFroglight: - case Material.WarpedDoor: - case Material.WarpedFence: - case Material.WarpedFenceGate: - case Material.WarpedHyphae: - case Material.WarpedNylium: - case Material.WarpedPlanks: - case Material.WarpedSlab: - case Material.WarpedStairs: - case Material.WarpedStem: - case Material.WarpedTrapdoor: - case Material.WarpedWartBlock: - case Material.WaterCauldron: - case Material.WaxedCopperBlock: - case Material.WaxedCutCopper: - case Material.WaxedCutCopperSlab: - case Material.WaxedCutCopperStairs: - case Material.WaxedExposedCopper: - case Material.WaxedExposedCutCopper: - case Material.WaxedExposedCutCopperSlab: - case Material.WaxedExposedCutCopperStairs: - case Material.WaxedOxidizedCopper: - case Material.WaxedOxidizedCutCopper: - case Material.WaxedOxidizedCutCopperSlab: - case Material.WaxedOxidizedCutCopperStairs: - case Material.WaxedWeatheredCopper: - case Material.WaxedWeatheredCutCopper: - case Material.WaxedWeatheredCutCopperSlab: - case Material.WaxedWeatheredCutCopperStairs: - case Material.WeatheredCopper: - case Material.WeatheredCutCopper: - case Material.WeatheredCutCopperSlab: - case Material.WeatheredCutCopperStairs: - case Material.WetSponge: - case Material.WhiteBed: - case Material.WhiteCandle: - case Material.WhiteCandleCake: - case Material.WhiteConcrete: - case Material.WhiteConcretePowder: - case Material.WhiteGlazedTerracotta: - case Material.WhiteShulkerBox: - case Material.WhiteStainedGlass: - case Material.WhiteStainedGlassPane: - case Material.WhiteTerracotta: - case Material.WhiteWool: - case Material.WitherSkeletonSkull: - case Material.WitherSkeletonWallSkull: - case Material.YellowBed: - case Material.YellowCandle: - case Material.YellowCandleCake: - case Material.YellowConcrete: - case Material.YellowConcretePowder: - case Material.YellowGlazedTerracotta: - case Material.YellowShulkerBox: - case Material.YellowStainedGlass: - case Material.YellowStainedGlassPane: - case Material.YellowTerracotta: - case Material.YellowWool: - case Material.ZombieHead: - case Material.ZombieWallHead: - return true; - default: - return false; - } - } - - /// - /// Check if contact with the provided material can harm players - /// - /// Material to test - /// True if the material is harmful - public static bool CanHarmPlayers(this Material m) - { - switch (m) - { - case Material.Fire: - case Material.Cactus: - case Material.Lava: - case Material.MagmaBlock: - case Material.Campfire: - case Material.PowderSnow: - return true; - default: - return false; - } - } - - /// - /// Check if the provided material is a liquid a player can swim into - /// - /// Material to test - /// True if the material is a liquid - public static bool IsLiquid(this Material m) - { - switch (m) - { - case Material.Water: - case Material.Lava: - return true; - default: - return false; - } - } - - /// - /// Check if the player can climb up this block - /// - /// Material to test - /// True if the material can be climbed on - public static bool CanBeClimbedOn(this Material m) - { - switch (m) - { - case Material.Ladder: - case Material.Vine: - case Material.TwistingVines: - case Material.TwistingVinesPlant: - case Material.WeepingVines: - case Material.WeepingVinesPlant: - return true; - default: - return false; - } - } - - /// - /// Check if the provided material is a bed - /// - /// Material to test - /// True if the material is a bed - public static bool IsBed(this Material m) - { - switch (m) - { - case Material.BlackBed: - case Material.BlueBed: - case Material.BrownBed: - case Material.CyanBed: - case Material.GrayBed: - case Material.GreenBed: - case Material.LightBlueBed: - case Material.LightGrayBed: - case Material.LimeBed: - case Material.MagentaBed: - case Material.OrangeBed: - case Material.PinkBed: - case Material.PurpleBed: - case Material.RedBed: - case Material.WhiteBed: - case Material.YellowBed: - return true; - default: - return false; - } - } - - /// - /// Check if the provided material is a slab - /// - /// Material to test - /// True if the material is a slab - public static bool IsSlab(this Material m) - { - switch (m) - { - case Material.AcaciaSlab: - case Material.AndesiteSlab: - case Material.BirchSlab: - case Material.BlackstoneSlab: - case Material.BrickSlab: - case Material.CobbledDeepslateSlab: - case Material.CobblestoneSlab: - case Material.CrimsonSlab: - case Material.CutCopperSlab: - case Material.CutRedSandstoneSlab: - case Material.CutSandstoneSlab: - case Material.DarkOakSlab: - case Material.DarkPrismarineSlab: - case Material.DeepslateBrickSlab: - case Material.DeepslateTileSlab: - case Material.DioriteSlab: - case Material.EndStoneBrickSlab: - case Material.ExposedCutCopperSlab: - case Material.GraniteSlab: - case Material.JungleSlab: - case Material.MangroveSlab: - case Material.MossyCobblestoneSlab: - case Material.MossyStoneBrickSlab: - case Material.MudBrickSlab: - case Material.NetherBrickSlab: - case Material.OakSlab: - case Material.OxidizedCutCopperSlab: - case Material.PetrifiedOakSlab: - case Material.PolishedAndesiteSlab: - case Material.PolishedBlackstoneBrickSlab: - case Material.PolishedBlackstoneSlab: - case Material.PolishedDeepslateSlab: - case Material.PolishedDioriteSlab: - case Material.PolishedGraniteSlab: - case Material.PrismarineBrickSlab: - case Material.PrismarineSlab: - case Material.PurpurSlab: - case Material.QuartzSlab: - case Material.RedNetherBrickSlab: - case Material.RedSandstoneSlab: - case Material.ResinBrickSlab: - case Material.SandstoneSlab: - case Material.SmoothQuartzSlab: - case Material.SmoothRedSandstoneSlab: - case Material.SmoothSandstoneSlab: - case Material.SmoothStoneSlab: - case Material.SpruceSlab: - case Material.StoneBrickSlab: - case Material.StoneSlab: - case Material.WarpedSlab: - case Material.WaxedCutCopperSlab: - case Material.WaxedExposedCutCopperSlab: - case Material.WaxedOxidizedCutCopperSlab: - case Material.WaxedWeatheredCutCopperSlab: - case Material.WeatheredCutCopperSlab: - return true; - default: - return false; - } - } - } -} \ No newline at end of file diff --git a/MinecraftClient/Mapping/MessageFilterType.cs b/MinecraftClient/Mapping/MessageFilterType.cs deleted file mode 100644 index 9c3cfe1ddf..0000000000 --- a/MinecraftClient/Mapping/MessageFilterType.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace MinecraftClient.Mapping -{ - public enum MessageFilterType - { - PassThrough = 0, - FullyFiltered, - PartiallyFiltered - } -} diff --git a/MinecraftClient/Mapping/MiningCalculator.cs b/MinecraftClient/Mapping/MiningCalculator.cs deleted file mode 100644 index 458057f24b..0000000000 --- a/MinecraftClient/Mapping/MiningCalculator.cs +++ /dev/null @@ -1,587 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using MinecraftClient.Inventory; -using MinecraftClient.Protocol.Handlers; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6; - -namespace MinecraftClient.Mapping -{ - /// - /// Computes dig duration in ticks for survival-style block breaking. - /// Version-aware across 1.8-1.21.11+, using tool speed, enchantments, effects, and attributes. - /// - public static class MiningCalculator - { - public sealed class MiningOptions - { - public static readonly MiningOptions Vanilla = new(); - - public bool ApplyEfficiencyEnchantments { get; init; } = true; - - public bool ApplyHasteEffects { get; init; } = true; - } - - /// - /// Compute the number of ticks required to break a block in survival mode. - /// Returns 0 for instant-break blocks, -1 for unbreakable blocks. - /// - /// The block material to break - /// The item in the player's main hand (null for empty hand) - /// The item in the player's helmet slot (null if empty, used for Aqua Affinity) - /// Currently active player effects - /// Cached player attribute values (from OnEntityProperties) - /// Whether the player's eyes are submerged in water - /// Whether the player is on the ground - /// The Minecraft protocol version - /// Ticks to break the block, 0 for instant, -1 for unbreakable - public static int ComputeDigTicks( - Material blockMaterial, - Item? heldItem, - Item? helmetItem, - Dictionary effects, - Dictionary playerAttributes, - bool isUnderwater, - bool isOnGround, - int protocolVersion, - MiningOptions? options = null) - { - options ??= MiningOptions.Vanilla; - float hardness = BlockHardness.GetHardness(blockMaterial); - - if (hardness < 0) - return -1; // Unbreakable - - if (hardness == 0) - return 0; // Instant break - - float destroySpeed = GetDestroySpeed( - blockMaterial, heldItem, helmetItem, effects, playerAttributes, - isUnderwater, isOnGround, protocolVersion, options); - - bool correctTool = HasCorrectToolForDrops(blockMaterial, heldItem, protocolVersion); - int divisor = correctTool ? 30 : 100; - - float destroyProgress = destroySpeed / hardness / divisor; - - if (destroyProgress >= 1.0f) - return 0; // Instant break - - return (int)MathF.Ceiling(1.0f / destroyProgress); - } - - /// - /// Compute the player's destroy speed for a given block, following vanilla formulas. - /// - private static float GetDestroySpeed( - Material blockMaterial, - Item? heldItem, - Item? helmetItem, - Dictionary effects, - Dictionary playerAttributes, - bool isUnderwater, - bool isOnGround, - int protocolVersion, - MiningOptions options) - { - float speed = GetToolSpeed(blockMaterial, heldItem, protocolVersion); - - if (speed > 1.0f && options.ApplyEfficiencyEnchantments) - { - speed += GetEfficiencyBonus(heldItem, playerAttributes, protocolVersion); - } - - if (options.ApplyHasteEffects) - { - int digSpeedAmplifier = GetDigSpeedAmplifier(effects); - if (digSpeedAmplifier >= 0) - speed *= 1.0f + (digSpeedAmplifier + 1) * 0.2f; - } - - // Mining Fatigue - if (effects.TryGetValue(Effects.MiningFatigue, out var fatigueData)) - { - float multiplier = fatigueData.Amplifier switch - { - 0 => 0.3f, - 1 => 0.09f, - 2 => 0.0027f, - _ => 8.1E-4f - }; - speed *= multiplier; - } - - // Attribute multipliers for modern versions - if (protocolVersion >= Protocol18Handler.MC_1_20_6_Version) - { - // BLOCK_BREAK_SPEED attribute (default 1.0) - if (playerAttributes.TryGetValue("player.block_break_speed", out double bbs)) - speed *= (float)bbs; - } - - // Underwater penalty - if (isUnderwater) - { - if (protocolVersion >= Protocol18Handler.MC_1_21_11_Version) - { - // 1.21.11+: Uses SUBMERGED_MINING_SPEED attribute (default 0.2) - double submergedSpeed = 0.2; - if (playerAttributes.TryGetValue("player.submerged_mining_speed", out double sms)) - submergedSpeed = sms; - speed *= (float)submergedSpeed; - } - else - { - // Pre-1.21.11: /5 unless Aqua Affinity - bool hasAquaAffinity = GetEnchantmentLevel(helmetItem, Enchantments.AquaAffinity, protocolVersion) > 0; - if (!hasAquaAffinity) - speed /= 5.0f; - } - } - - // Airborne penalty - if (!isOnGround) - speed /= 5.0f; - - return speed; - } - - /// - /// Get the base tool mining speed for a block. - /// For 1.20.6+ with ToolComponent, uses structured component data. - /// For older versions, uses hardcoded tool speed tables. - /// - private static float GetToolSpeed(Material blockMaterial, Item? heldItem, int protocolVersion) - { - if (heldItem is null) - return 1.0f; - - // Modern path: use ToolComponent from structured components - if (protocolVersion >= Protocol18Handler.MC_1_20_6_Version - && TryGetToolRules(heldItem, out List? rules, out float defaultMiningSpeed)) - { - foreach (var rule in rules) - { - if (rule.HasSpeed && MatchesBlockSet(rule.Blocks, blockMaterial)) - return rule.Speed; - } - - // Structured tool data covers modern mining rules, but keep the legacy fallback for - // explicit block holder-sets that MCC cannot resolve yet (for example cobweb). - if (defaultMiningSpeed > 1.0f) - return defaultMiningSpeed; - } - - // Legacy path: hardcoded tool speed tables - return GetLegacyToolSpeed(heldItem.Type, blockMaterial); - } - - /// - /// Check whether the tool provides correct drops for a block. - /// - private static bool HasCorrectToolForDrops(Material blockMaterial, Item? heldItem, int protocolVersion) - { - if (!BlockHardness.RequiresCorrectTool(blockMaterial)) - return true; - - if (heldItem is null) - return false; - - // Modern path: check ToolComponent rules - if (protocolVersion >= Protocol18Handler.MC_1_20_6_Version - && TryGetToolRules(heldItem, out List? rules, out _)) - { - foreach (var rule in rules) - { - if (rule.HasCorrectDropForBlocks && MatchesBlockSet(rule.Blocks, blockMaterial)) - return rule.CorrectDropForBlocks; - } - } - - // Legacy path, plus a modern fallback for direct block holder-sets MCC cannot resolve yet. - return IsCorrectToolLegacy(heldItem.Type, blockMaterial); - } - - private static bool TryGetToolRules( - Item heldItem, - [NotNullWhen(true)] out List? rules, - out float defaultMiningSpeed) - { - rules = null; - defaultMiningSpeed = 1.0f; - - if (heldItem.Components is null) - return false; - - if (heldItem.Components.OfType().FirstOrDefault() is ToolComponent toolComponent) - { - rules = toolComponent.Rules; - defaultMiningSpeed = toolComponent.DefaultMiningSpeed; - return true; - } - - if (heldItem.Components.OfType().FirstOrDefault() is ToolComponent1215 toolComponent1215) - { - rules = toolComponent1215.Rules; - defaultMiningSpeed = toolComponent1215.DefaultMiningSpeed; - return true; - } - - return false; - } - - /// - /// Match a block material against a ToolComponent BlockSetSubcomponent. - /// - private static bool MatchesBlockSet( - Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6.BlockSetSubcomponent blockSet, - Material blockMaterial) - { - if (blockSet.BlockIds is not null) - { - // Check against explicit block state IDs - foreach (int blockId in blockSet.BlockIds) - { - if (Block.Palette.FromId(blockId) == blockMaterial) - return true; - } - } - - if (blockSet.TagName is not null) - { - // Match against tag name (e.g., "minecraft:mineable/pickaxe") - return MatchesBlockTag(blockSet.TagName, blockMaterial); - } - - return false; - } - - /// - /// Approximate block tag matching using Material2Tool categories. - /// Tags like "minecraft:mineable/pickaxe" map to the appropriate tool categories. - /// - private static bool MatchesBlockTag(string tagName, Material blockMaterial) - { - // Normalize tag name - string tag = tagName.Replace("minecraft:", ""); - - ItemType[] tools = Material2Tool.GetCorrectToolForBlock(blockMaterial); - return tag switch - { - "mineable/pickaxe" => tools.Length > 0 && IsPickaxe(tools[0]), - "mineable/axe" => tools.Length > 0 && IsAxe(tools[0]), - "mineable/shovel" => tools.Length > 0 && IsShovel(tools[0]), - "mineable/hoe" => tools.Length > 0 && IsHoe(tools[0]), - "leaves" => IsLeaf(blockMaterial), - "wool" => IsWool(blockMaterial), - "incorrect_for_wooden_tool" => RequiresHigherTier(blockMaterial, 0), - "incorrect_for_gold_tool" => RequiresHigherTier(blockMaterial, 0), - "incorrect_for_stone_tool" => RequiresHigherTier(blockMaterial, 1), - "incorrect_for_copper_tool" => RequiresHigherTier(blockMaterial, 1), - "incorrect_for_iron_tool" => RequiresHigherTier(blockMaterial, 2), - "incorrect_for_diamond_tool" => RequiresHigherTier(blockMaterial, 3), - "incorrect_for_netherite_tool" => RequiresHigherTier(blockMaterial, 4), - _ => false - }; - } - - private static bool RequiresHigherTier(Material blockMaterial, int tier) - { - ItemType[] recommended = Material2Tool.GetCorrectToolForBlock(blockMaterial); - if (recommended.Length == 0) - return false; - - return GetRequiredTier(blockMaterial, recommended) > tier; - } - - /// - /// Get the enchantment level from an item, supporting both legacy NBT and modern structured components. - /// - public static int GetEnchantmentLevel(Item? item, Enchantments enchantment, int protocolVersion) - { - if (item is null) - return 0; - - // Modern path: structured components (1.20.6+) - var enchList = item.EnchantmentList; - if (enchList is not null) - { - var ench = enchList.FirstOrDefault(e => e.Type == enchantment); - if (ench is not null) - return ench.Level; - } - - // Legacy path: NBT data - if (item.NBT is not null && - item.NBT.TryGetValue("Enchantments", out object? enchantments)) - { - try - { - string enchNameLower = GetEnchantmentResourceName(enchantment); - foreach (Dictionary enchEntry in (object[])enchantments) - { - string id = ((string)enchEntry["id"]).ToLowerInvariant(); - if (id == enchNameLower || id == "minecraft:" + enchNameLower) - return (short)enchEntry["lvl"]; - } - } - catch - { - // NBT parsing failure - return 0 - } - } - - return 0; - } - - /// - /// Map Enchantments enum to Minecraft resource name (e.g., "efficiency"). - /// - private static string GetEnchantmentResourceName(Enchantments enchantment) - { - return enchantment switch - { - Enchantments.AquaAffinity => "aqua_affinity", - Enchantments.BaneOfArthropods => "bane_of_arthropods", - Enchantments.BlastProtection => "blast_protection", - Enchantments.Efficiency => "efficiency", - Enchantments.FeatherFalling => "feather_falling", - Enchantments.FireAspect => "fire_aspect", - Enchantments.FireProtection => "fire_protection", - Enchantments.FrostWalker => "frost_walker", - Enchantments.LuckOfTheSea => "luck_of_the_sea", - Enchantments.ProjectileProtection => "projectile_protection", - Enchantments.QuickCharge => "quick_charge", - Enchantments.SilkTouch => "silk_touch", - Enchantments.SoulSpeed => "soul_speed", - Enchantments.SwiftSneak => "swift_sneak", - Enchantments.VanishingCurse => "vanishing_curse", - Enchantments.BindingCurse => "binding_curse", - Enchantments.WindBurst => "wind_burst", - _ => enchantment.ToString().ToUnderscoreCase() - }; - } - - #region Legacy Tool Speed Tables - - /// - /// Legacy tool speed for pre-1.20.6 versions using hardcoded values. - /// - private static float GetLegacyToolSpeed(ItemType toolType, Material blockMaterial) - { - float specialToolSpeed = toolType switch - { - ItemType.Shears => GetShearsSpeed(blockMaterial), - _ when IsSword(toolType) && blockMaterial == Material.Cobweb => 15.0f, - _ => 1.0f - }; - - if (specialToolSpeed > 1.0f) - return specialToolSpeed; - - ItemType[] recommended = Material2Tool.GetCorrectToolForBlock(blockMaterial); - if (recommended.Length == 0) - return 1.0f; - - // Check if the held tool matches the recommended tool category - ToolCategory heldCategory = GetToolCategory(toolType); - ToolCategory neededCategory = GetToolCategory(recommended[0]); - - if (heldCategory == ToolCategory.None || heldCategory != neededCategory) - return 1.0f; - - return GetBaseToolSpeed(toolType); - } - - private static float GetBaseToolSpeed(ItemType toolType) - { - return toolType switch - { - // Wooden tools - ItemType.WoodenPickaxe or ItemType.WoodenAxe or ItemType.WoodenShovel or - ItemType.WoodenSword or ItemType.WoodenHoe => 2.0f, - - // Stone tools - ItemType.StonePickaxe or ItemType.StoneAxe or ItemType.StoneShovel or - ItemType.StoneSword or ItemType.StoneHoe => 4.0f, - - // Iron tools - ItemType.IronPickaxe or ItemType.IronAxe or ItemType.IronShovel or - ItemType.IronSword or ItemType.IronHoe => 6.0f, - - // Diamond tools - ItemType.DiamondPickaxe or ItemType.DiamondAxe or ItemType.DiamondShovel or - ItemType.DiamondSword or ItemType.DiamondHoe => 8.0f, - - // Netherite tools - ItemType.NetheritePickaxe or ItemType.NetheriteAxe or ItemType.NetheriteShovel or - ItemType.NetheriteSword or ItemType.NetheriteHoe => 9.0f, - - // Golden tools - ItemType.GoldenPickaxe or ItemType.GoldenAxe or ItemType.GoldenShovel or - ItemType.GoldenSword or ItemType.GoldenHoe => 12.0f, - - // Shears - ItemType.Shears => 2.0f, - - _ => 1.0f - }; - } - - /// - /// Check if the held tool is the correct tool for drops in legacy versions. - /// Uses Material2Tool's recommendations to determine correctness. - /// - private static bool IsCorrectToolLegacy(ItemType toolType, Material blockMaterial) - { - ItemType[] recommended = Material2Tool.GetCorrectToolForBlock(blockMaterial); - if (recommended.Length == 0) - return false; - - ToolCategory heldCategory = GetToolCategory(toolType); - ToolCategory neededCategory = GetToolCategory(recommended[0]); - - if (heldCategory == ToolCategory.None || heldCategory != neededCategory) - { - if (toolType == ItemType.Shears && blockMaterial == Material.Cobweb) - return true; - if (IsSword(toolType) && blockMaterial == Material.Cobweb) - return true; - return false; - } - - // Check tool tier requirement - int heldTier = GetToolTier(toolType); - int requiredTier = GetRequiredTier(blockMaterial, recommended); - - return heldTier >= requiredTier; - } - - /// - /// Get the minimum tool tier required for a block based on Material2Tool's recommendation ordering. - /// - private static int GetRequiredTier(Material blockMaterial, ItemType[] recommended) - { - if (recommended.Length == 0) - return 0; - - // Material2Tool lists tools from highest to lowest tier. - // The last tool in the array is the minimum required tier. - return GetToolTier(recommended[^1]); - } - - private enum ToolCategory - { - None, - Pickaxe, - Axe, - Shovel, - Hoe, - Sword, - Shears - } - - private static ToolCategory GetToolCategory(ItemType item) - { - if (IsPickaxe(item)) return ToolCategory.Pickaxe; - if (IsAxe(item)) return ToolCategory.Axe; - if (IsShovel(item)) return ToolCategory.Shovel; - if (IsHoe(item)) return ToolCategory.Hoe; - if (IsSword(item)) return ToolCategory.Sword; - if (item == ItemType.Shears) return ToolCategory.Shears; - return ToolCategory.None; - } - - private static int GetToolTier(ItemType item) - { - string name = item.ToString(); - if (name.StartsWith("Wooden")) return 0; - if (name.StartsWith("Golden")) return 0; - if (name.StartsWith("Stone")) return 1; - if (name.StartsWith("Iron")) return 2; - if (name.StartsWith("Diamond")) return 3; - if (name.StartsWith("Netherite")) return 4; - return 0; - } - - private static bool IsPickaxe(ItemType item) => - item is ItemType.WoodenPickaxe or ItemType.StonePickaxe or ItemType.IronPickaxe - or ItemType.GoldenPickaxe or ItemType.DiamondPickaxe or ItemType.NetheritePickaxe; - - private static bool IsAxe(ItemType item) => - item is ItemType.WoodenAxe or ItemType.StoneAxe or ItemType.IronAxe - or ItemType.GoldenAxe or ItemType.DiamondAxe or ItemType.NetheriteAxe; - - private static bool IsShovel(ItemType item) => - item is ItemType.WoodenShovel or ItemType.StoneShovel or ItemType.IronShovel - or ItemType.GoldenShovel or ItemType.DiamondShovel or ItemType.NetheriteShovel; - - private static bool IsHoe(ItemType item) => - item is ItemType.WoodenHoe or ItemType.StoneHoe or ItemType.IronHoe - or ItemType.GoldenHoe or ItemType.DiamondHoe or ItemType.NetheriteHoe; - - private static bool IsSword(ItemType item) => - item is ItemType.WoodenSword or ItemType.StoneSword or ItemType.IronSword - or ItemType.GoldenSword or ItemType.DiamondSword or ItemType.NetheriteSword; - - private static float GetShearsSpeed(Material block) - { - return block switch - { - Material.Cobweb => 15.0f, - Material.Vine or Material.GlowLichen => 2.0f, - _ when IsLeaf(block) => 15.0f, - _ when IsWool(block) => 5.0f, - _ => 1.0f - }; - } - - private static bool IsShearable(Material block) => - block == Material.Cobweb || IsLeaf(block) || IsWool(block) || block is Material.Vine or Material.GlowLichen; - - private static bool IsLeaf(Material block) => - block is Material.OakLeaves or Material.SpruceLeaves or Material.BirchLeaves - or Material.JungleLeaves or Material.AcaciaLeaves or Material.DarkOakLeaves - or Material.CherryLeaves or Material.MangroveLeaves or Material.AzaleaLeaves - or Material.FloweringAzaleaLeaves or Material.PaleOakLeaves; - - private static bool IsWool(Material block) => - block is Material.WhiteWool or Material.OrangeWool or Material.MagentaWool - or Material.LightBlueWool or Material.YellowWool or Material.LimeWool - or Material.PinkWool or Material.GrayWool or Material.LightGrayWool - or Material.CyanWool or Material.PurpleWool or Material.BlueWool - or Material.BrownWool or Material.GreenWool or Material.RedWool - or Material.BlackWool; - - private static float GetEfficiencyBonus(Item? heldItem, Dictionary playerAttributes, int protocolVersion) - { - if (protocolVersion >= Protocol18Handler.MC_1_21_11_Version - && playerAttributes.TryGetValue("player.mining_efficiency", out double miningEfficiency) - && miningEfficiency > 0.0) - { - return (float)miningEfficiency; - } - - int efficiencyLevel = GetEnchantmentLevel(heldItem, Enchantments.Efficiency, protocolVersion); - return efficiencyLevel > 0 ? efficiencyLevel * efficiencyLevel + 1 : 0.0f; - } - - private static int GetDigSpeedAmplifier(Dictionary effects) - { - int amplifier = -1; - - if (effects.TryGetValue(Effects.Haste, out var hasteData)) - amplifier = Math.Max(amplifier, hasteData.Amplifier); - - if (effects.TryGetValue(Effects.ConduitPower, out var conduitData)) - amplifier = Math.Max(amplifier, conduitData.Amplifier); - - return amplifier; - } - - #endregion - } -} diff --git a/MinecraftClient/Mapping/Movement.cs b/MinecraftClient/Mapping/Movement.cs deleted file mode 100644 index 0e972e09fd..0000000000 --- a/MinecraftClient/Mapping/Movement.cs +++ /dev/null @@ -1,716 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace MinecraftClient.Mapping -{ - /// - /// Allows moving through a Minecraft world - /// - public static class Movement - { - /* ========= PATHFINDING METHODS ========= */ - - /// - /// Handle movements due to gravity - /// - /// World the player is currently located in - /// Location the player is currently at - /// Current vertical motion speed - /// Updated location after applying gravity - public static Location HandleGravity(World world, Location location, ref double motionY) - { - if (Settings.InternalConfig.GravityEnabled) - { - Location onFoots = new(location.X, Math.Floor(location.Y), location.Z); - Location belowFoots = Move(location, Direction.Down); - if (location.Y > Math.Truncate(location.Y) + 0.0001) - { - belowFoots = location; - belowFoots.Y = Math.Truncate(location.Y); - } - - if (!IsOnGround(world, location) && !IsSwimming(world, location)) - { - while (!IsOnGround(world, belowFoots) && belowFoots.Y >= 1 + World.GetDimension().minY) - belowFoots = Move(belowFoots, Direction.Down); - location = Move2Steps(location, belowFoots, ref motionY, true).Dequeue(); - } - else if (!world.GetBlock(onFoots).Type.IsSolid()) - location = Move2Steps(location, onFoots, ref motionY, true).Dequeue(); - } - - return location; - } - - /// - /// Return a list of possible moves for the player - /// - /// World the player is currently located in - /// Location the player is currently at - /// Allow possible but unsafe locations - /// A list of new locations the player can move to - public static IEnumerable GetAvailableMoves(World world, Location originLocation, - bool allowUnsafe = false) - { - Location location = originLocation.ToCenter(); - List availableMoves = new(); - if (IsOnGround(world, location) || IsSwimming(world, location)) - { - foreach (Direction dir in Enum.GetValues(typeof(Direction))) - { - Location dest = Move(location, dir); - if (CanMove(world, location, dir) && (allowUnsafe || IsSafe(world, dest))) - availableMoves.Add(dest); - } - } - else - { - foreach (Direction dir in new[] { Direction.East, Direction.West, Direction.North, Direction.South }) - if (CanMove(world, location, dir) && IsOnGround(world, Move(location, dir)) && - (allowUnsafe || IsSafe(world, Move(location, dir)))) - availableMoves.Add(Move(location, dir)); - availableMoves.Add(Move(location, Direction.Down)); - } - - return availableMoves; - } - - /// - /// Decompose a single move from a block to another into several steps - /// - /// - /// Allows moving by little steps instead or directly moving between blocks, - /// which would be rejected by anti-cheat plugins anyway. - /// - /// Start location - /// Destination location - /// Current vertical motion speed - /// Specify if performing falling steps - /// Amount of steps by block - /// A list of locations corresponding to the requested steps - public static Queue Move2Steps(Location start, Location goal, ref double motionY, - bool falling = false, int stepsByBlock = 8) - { - if (stepsByBlock <= 0) - stepsByBlock = 1; - - if (falling) - { - //Use MC-Like falling algorithm - double y = start.Y; - Queue fallSteps = new(); - fallSteps.Enqueue(start); - motionY -= 0.08D; - motionY *= 0.9800000190734863D; - y += motionY; - - if (y < goal.Y) - return new Queue(new[] { goal }); - - return new Queue(new[] { new Location(start.X, y, start.Z) }); - } - else - { - //Regular MCC moving algorithm - motionY = 0; //Reset motion speed - double totalStepsDouble = start.Distance(goal) * stepsByBlock; - int totalSteps = (int)Math.Ceiling(totalStepsDouble); - Location step = (goal - start) / totalSteps; - - if (totalStepsDouble >= 1) - { - Queue movementSteps = new(); - for (int i = 1; i <= totalSteps; i++) - movementSteps.Enqueue(start + step * i); - return movementSteps; - } - else - return new Queue(new[] { goal }); - } - } - - /// - /// Calculate a path from the start location to the destination location - /// - /// - /// Based on the A* pathfinding algorithm described on Wikipedia - /// - /// - /// World - /// Start location - /// Destination location - /// Allow possible but unsafe locations - /// If no valid path can be found, also allow locations within specified distance of destination - /// Do not get closer of destination than specified distance - /// How long to wait before stopping computation - /// When location is unreachable, computation will reach timeout, then optionally fallback to a close location within maxOffset - /// A list of locations, or null if calculation failed - public static Queue? CalculatePath(World world, Location start, Location goal, bool allowUnsafe, - int maxOffset, int minOffset, TimeSpan timeout) - { - CancellationTokenSource cts = new(); - Task?> pathfindingTask = Task.Factory.StartNew(() => - CalculatePath(world, start, goal, allowUnsafe, maxOffset, minOffset, cts.Token)); - pathfindingTask.Wait(timeout); - if (!pathfindingTask.IsCompleted) - { - cts.Cancel(); - pathfindingTask.Wait(); - } - - return pathfindingTask.Result; - } - - /// - /// Calculate a path from the start location to the destination location - /// - /// - /// Based on the A* pathfinding algorithm described on Wikipedia - /// - /// - /// World - /// Start location - /// Destination location - /// Allow possible but unsafe locations - /// If no valid path can be found, also allow locations within specified distance of destination - /// Do not get closer of destination than specified distance - /// Token for stopping computation after a certain time - /// A list of locations, or null if calculation failed - public static Queue? CalculatePath(World world, Location start, Location goal, bool allowUnsafe, - int maxOffset, int minOffset, CancellationToken ct) - { - // This is a bad configuration - if (minOffset > maxOffset) - throw new ArgumentException("minOffset must be lower or equal to maxOffset", nameof(minOffset)); - - // Round start coordinates for easier calculation - Location startLower = start.ToFloor(); - Location goalLower = goal.ToFloor(); - - // We always use distance squared so our limits must also be squared. - minOffset *= minOffset; - maxOffset *= maxOffset; - - // Prepare variables and datastructures for A* - - // Dictionary that contains the relation between all coordinates and resolves the final path - Dictionary cameFrom = new(); - // Create a Binary Heap for all open positions => Allows fast access to Nodes with lowest scores - BinaryHeap openSet = new(); - // Dictionary to keep track of the G-Score of every location - Dictionary gScoreDict = new(); - - // Set start values for variables - openSet.Insert(0, (int)startLower.DistanceSquared(goalLower), startLower); - gScoreDict[startLower] = 0; - BinaryHeap.Node? current = null; - - // Start of A* - - // Execute while we have nodes to process and we are not cancelled - while (openSet.Count() > 0 && !ct.IsCancellationRequested) - { - // Get the root node of the Binary Heap - // Node with the lowest F-Score or lowest H-Score on tie - current = openSet.GetRootLocation(); - - // Return if goal found and no maxOffset was given OR current node is between minOffset and maxOffset - if ((current.Location == goalLower && maxOffset <= 0) || - (maxOffset > 0 && current.HScore >= minOffset && current.HScore <= maxOffset)) - return ReconstructPath(cameFrom, current.Location, start, goal); - - // Discover neighbored blocks - foreach (Location neighbor in GetAvailableMoves(world, current.Location, allowUnsafe)) - { - // If we are cancelled: break - if (ct.IsCancellationRequested) - break; - - // tentative_GScore is the distance from start to the neighbor through current - int tentativeGScore = current.GScore + (int)current.Location.DistanceSquared(neighbor); - - // If the neighbor is not in the GScoreDict OR its current tentativeGScore is lower than the previously saved one: - if (!gScoreDict.TryGetValue(neighbor, out int existingGScore) || - tentativeGScore < existingGScore) - { - // Save the new relation between the neighbored block and the current one - cameFrom[neighbor] = current.Location; - gScoreDict[neighbor] = tentativeGScore; - - // If this location is not already included in the Binary Heap: save it - if (!openSet.ContainsLocation(neighbor)) - openSet.Insert(tentativeGScore, (int)neighbor.DistanceSquared(goalLower), neighbor); - } - } - } - - // Goal could not be reached. Set the path to the closest location if close enough - if (current is not null && openSet.MinHScoreNode is not null && - (maxOffset == int.MaxValue || openSet.MinHScoreNode.HScore <= maxOffset)) - return ReconstructPath(cameFrom, openSet.MinHScoreNode.Location, start, goal); - - return null; - } - - /// - /// Helper function for CalculatePath(). Backtrack from goal to start to reconstruct a step-by-step path. - /// - /// The collection of Locations that leads back to the start - /// Endpoint of our later walk - /// Start location - /// End location - /// the path that leads to current from the start position - private static Queue ReconstructPath(Dictionary cameFrom, Location current, - Location start, Location end) - { - int midPathCnt = 0; - List totalPath = new(); - - // Move from the center of the block to the final position - if (current != end && current == end.ToFloor()) - totalPath.Add(end); - - // Generate intermediate paths - totalPath.Add(current.ToCenter()); - while (cameFrom.ContainsKey(current)) - { - ++midPathCnt; - current = cameFrom[current]; - totalPath.Add(current.ToCenter()); - } - - if (midPathCnt <= 2 && start.DistanceSquared(end) < 2.0) - return new Queue(new[] { end }); - else - { - // Move to the center of the block first - if (current != start && current == start.ToFloor()) - totalPath.Add(start.ToCenter()); - - totalPath.Reverse(); - return new Queue(totalPath); - } - } - - /// - /// A datastructure to store Locations as Nodes and provide them in sorted and queued order. - /// !!! - /// CAN BE REPLACED WITH PriorityQueue IN .NET-6 - /// https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.priorityqueue-2?view=net-6.0 - /// !!! - /// - public class BinaryHeap - { - /// - /// Represents a location and its attributes - /// - public record Node(int GScore, int HScore, Location Location) - { - public int FScore => HScore + GScore; - } - - // List which contains all nodes in form of a Binary Heap - private readonly List heapList; - - // Hashset for quick checks of locations included in the heap - private readonly HashSet locationList; - public Node? MinHScoreNode; - - public BinaryHeap() - { - heapList = new(); - locationList = new(); - MinHScoreNode = null; - } - - /// - /// Insert a new location in the heap - /// - /// G-Score of the location - /// H-Score of the location - /// The location - public void Insert(int newGScore, int newHScore, Location loc) - { - // Begin at the end of the list - int i = heapList.Count; - - // Temporarily save the node created with the parameters to allow comparisons - Node newNode = new(newGScore, newHScore, loc); - - // Add new note to the end of the list - heapList.Add(newNode); - locationList.Add(loc); - - // Save node with the smallest H-Score => Distance to goal - if (MinHScoreNode is null || newNode.HScore < MinHScoreNode.HScore) - MinHScoreNode = newNode; - - if (i == 0) - return; - - // There is no need of sorting for one node. - // Go up the heap from child to parent and move parent down... - // while we are not looking at the root node AND the new node has better attributes than the parent node ((i - 1) / 2) - while (i > 0 && FirstNodeBetter(newNode /* Current Child */, - heapList[(i - 1) / 2] /* Corresponding Parent */)) - { - // Move parent down and replace current child -> New free space is created - heapList[i] = heapList[(i - 1) / 2]; - // Select the next parent to check - i = (i - 1) / 2; - } - - // Nodes were moved down at position I there is now a free space at the correct position for our new node: - // Insert new node in position - heapList[i] = newNode; - } - - /// - /// Obtain the root which represents the node the the best attributes currently - /// - /// node with the best attributes currently - /// - public Node GetRootLocation() - { - // The heap is empty. There is nothing to return. - if (heapList.Count == 0) - throw new InvalidOperationException("The heap is empty."); - - // Save the root node - var rootNode = heapList[0]; - locationList.Remove(rootNode.Location); - - // Temporarirly store the last item's value. - var lastNode = heapList[^1]; - - // Remove the last value. - heapList.RemoveAt(heapList.Count - 1); - - if (heapList.Count > 0) - { - // Start at the first index. - var currentParentPos = 0; - - // Go through the heap from root to bottom... - // Continue until the halfway point of the heap. - while (currentParentPos < heapList.Count / 2) - { - // Select the left child of the current parent - var currentChildPos = (2 * currentParentPos) + 1; - - // If the currently selected child is not the last entry of the list AND right child has better attributes - if ((currentChildPos < heapList.Count - 1) && FirstNodeBetter(heapList[currentChildPos + 1], - heapList[currentChildPos])) - { - // Select the right child - currentChildPos++; - } - - // If the last item is smaller than both siblings at the - // current height, break. - if (FirstNodeBetter(lastNode, heapList[currentChildPos])) - break; - - // Move the item at index j up one level. - heapList[currentParentPos] = heapList[currentChildPos]; - // Move index i to the appropriate branch. - currentParentPos = currentChildPos; - } - - // Insert the last node into the currently free position - heapList[currentParentPos] = lastNode; - } - - return rootNode; - } - - /// - /// Compares two nodes and evaluates their position to the goal. - /// - /// First node to compare - /// Second node to compare - /// True if the first node has a more promising position to the goal than the second - private static bool FirstNodeBetter(Node firstNode, Node secondNode) - { - // Is the FScore smaller? - return (firstNode.FScore < secondNode.FScore) || - // If FScore is equal, evaluate the h-score - (firstNode.FScore == secondNode.FScore && firstNode.HScore < secondNode.HScore); - } - - /// - /// Get the size of the heap - /// - /// size of the heap - public int Count() - { - return heapList.Count; - } - - /// - /// Check if the heap contains a node with a certain location - /// - /// Location to check - /// true if a node with the given location is in the heap - public bool ContainsLocation(Location loc) - { - return locationList.Contains(loc); - } - } - - /* ========= LOCATION PROPERTIES ========= */ - - // TODO: Find a way to remove this Hack for Vines here. - - /// - /// Check if the specified location is on the ground - /// - /// World for performing check - /// Location to check - /// True if the specified location is on the ground - public static bool IsOnGround(World world, Location location) - { - ChunkColumn? chunkColumn = world.GetChunkColumn(location); - if (chunkColumn is null || chunkColumn.FullyLoaded == false) - return true; // avoid moving downward in a not loaded chunk - - Location down = Move(location, Direction.Down); - Material currentMaterial = world.GetBlock(down).Type; - - var result = currentMaterial.IsSolid() - || currentMaterial == Material.TwistingVines || currentMaterial == Material.TwistingVinesPlant - || currentMaterial == Material.WeepingVines || currentMaterial == Material.WeepingVinesPlant - || currentMaterial == Material.Vine; - - var northCheck = 1 + Math.Floor(down.Z) - down.Z > 0.7; - var eastCheck = down.X - Math.Floor(down.X) > 0.7; - var southCheck = down.Z - Math.Floor(down.Z) > 0.7; - var westCheck = 1 + Math.Floor(down.X) - down.X > 0.7; - - if (!result && northCheck) - result |= IsSolidOrVine(world, Move(down, Direction.North)); - - if (!result && northCheck && eastCheck) - result |= IsSolidOrVine(world, Move(down, Direction.NorthEast)); - - if (!result && eastCheck) - result |= IsSolidOrVine(world, Move(down, Direction.East)); - - if (!result && eastCheck && southCheck) - result |= IsSolidOrVine(world, Move(down, Direction.SouthEast)); - - if (!result && southCheck) - result |= IsSolidOrVine(world, Move(down, Direction.South)); - - if (!result && southCheck && westCheck) - result |= IsSolidOrVine(world, Move(down, Direction.SouthWest)); - - if (!result && westCheck) - result |= IsSolidOrVine(world, Move(down, Direction.West)); - - if (!result && westCheck && northCheck) - result |= IsSolidOrVine(world, Move(down, Direction.NorthWest)); - - return result && (location.Y <= Math.Truncate(location.Y) + 0.0001); - } - - private static bool IsSolidOrVine(World world, Location location) - { - var block = world.GetBlock(location); - return block.Type.IsSolid() - || block.Type == Material.TwistingVines - || block.Type == Material.TwistingVinesPlant - || block.Type == Material.WeepingVines - || block.Type == Material.WeepingVinesPlant - || block.Type == Material.Vine; - } - - /// - /// Check if the specified location implies swimming - /// - /// World for performing check - /// Location to check - /// True if the specified location implies swimming - private static bool IsSwimming(World world, Location location) - { - return world.GetBlock(location).Type.IsLiquid(); - } - - /// - /// Check if the specified location can be climbed on - /// - /// World for performing check - /// Location to check - /// True if the specified location can be climbed on - private static bool IsClimbing(World world, Location location) - { - return world.GetBlock(location).Type.CanBeClimbedOn(); - } - - /// - /// Check if the specified location is safe - /// - /// World for performing check - /// Location to check - /// True if the destination location won't directly harm the player - private static bool IsSafe(World world, Location location) - { - return - //No block that can harm the player - !world.GetBlock(location).Type.CanHarmPlayers() - && !world.GetBlock(Move(location, Direction.Up)).Type.CanHarmPlayers() - && !world.GetBlock(Move(location, Direction.Down)).Type.CanHarmPlayers() - - //No fall from a too high place - && (world.GetBlock(Move(location, Direction.Down)).Type.IsSolid() || - IsClimbing(world, Move(location, Direction.Down)) - || world.GetBlock(Move(location, Direction.Down, 2)).Type.IsSolid() || - IsClimbing(world, Move(location, Direction.Down, 2)) - || world.GetBlock(Move(location, Direction.Down, 3)).Type.IsSolid() || - IsClimbing(world, Move(location, Direction.Down, 3))) - - //Not an underwater location - && !(world.GetBlock(Move(location, Direction.Up)).Type.IsLiquid()); - } - - /* ========= SIMPLE MOVEMENTS ========= */ - - /// - /// Check if the player can move in the specified direction - /// - /// World the player is currently located in - /// Location the player is currently at - /// Direction the player is moving to - /// True if the player can move in the specified direction - public static bool CanMove(World world, Location location, Direction direction) - { - switch (direction) - { - // Move vertical - case Direction.Down: - return IsClimbing(world, Move(location, Direction.Down)) || !IsOnGround(world, location); - case Direction.Up: - bool nextTwoBlocks = - !world.GetBlock(Move(Move(location, Direction.Up), Direction.Up)).Type.IsSolid(); - - // Check if the current block can be climbed on - if (IsClimbing(world, location)) - // Check if next block after the next one can be climbed upon - return IsClimbing(world, Move(location, Direction.Up)) || nextTwoBlocks; - - return (IsOnGround(world, location) || IsSwimming(world, location)) && nextTwoBlocks; - - // Move horizontal - case Direction.East: - case Direction.West: - case Direction.South: - case Direction.North: - return PlayerFitsHere(world, Move(location, direction)); - - // Move diagonal - case Direction.NorthEast: - return PlayerFitsHere(world, Move(location, Direction.North)) && - PlayerFitsHere(world, Move(location, Direction.East)) && - PlayerFitsHere(world, Move(location, direction)); - case Direction.SouthEast: - return PlayerFitsHere(world, Move(location, Direction.South)) && - PlayerFitsHere(world, Move(location, Direction.East)) && - PlayerFitsHere(world, Move(location, direction)); - case Direction.SouthWest: - return PlayerFitsHere(world, Move(location, Direction.South)) && - PlayerFitsHere(world, Move(location, Direction.West)) && - PlayerFitsHere(world, Move(location, direction)); - case Direction.NorthWest: - return PlayerFitsHere(world, Move(location, Direction.North)) && - PlayerFitsHere(world, Move(location, Direction.West)) && - PlayerFitsHere(world, Move(location, direction)); - - default: - throw new ArgumentException("Unknown direction", nameof(direction)); - } - } - - /// - /// Evaluates if a player fits in this location - /// - /// Current world - /// Location to check - /// True if a player is able to stand in this location - public static bool PlayerFitsHere(World world, Location location) - { - var canClimb = IsClimbing(world, location) && IsClimbing(world, Move(location, Direction.Up)); - var isNotSolid = !world.GetBlock(location).Type.IsSolid() && - !world.GetBlock(Move(location, Direction.Up)).Type.IsSolid(); - - // Handle slabs - if (!isNotSolid && world.GetBlock(Move(location, Direction.Up)) - .IsTopSlab(McClient.Instance!.GetProtocolVersion())) - isNotSolid = true; - - return canClimb || isNotSolid; - } - - /// - /// Get an updated location for moving in the specified direction - /// - /// Current location - /// Direction to move to - /// Distance, in blocks - /// Updated location - public static Location Move(Location location, Direction direction, int length = 1) - { - return location + Move(direction) * length; - } - - /// - /// Get a location delta for moving in the specified direction - /// - /// Direction to move to - /// A location delta for moving in that direction - private static Location Move(Direction direction) - { - return direction switch - { - // Move vertical - Direction.Down => new Location(0, -1, 0), - Direction.Up => new Location(0, 1, 0), - - // Move horizontal straight - Direction.East => new Location(1, 0, 0), - Direction.West => new Location(-1, 0, 0), - Direction.South => new Location(0, 0, 1), - Direction.North => new Location(0, 0, -1), - - // Move horizontal diagonal - Direction.NorthEast => Move(Direction.North) + Move(Direction.East), - Direction.SouthEast => Move(Direction.South) + Move(Direction.East), - Direction.SouthWest => Move(Direction.South) + Move(Direction.West), - Direction.NorthWest => Move(Direction.North) + Move(Direction.West), - - _ => throw new ArgumentException("Unknown direction", nameof(direction)) - }; - } - - /// - /// Check that the chunks at both the start and destination locations have been loaded - /// - /// Current world - /// Start location - /// Destination location - /// Is loading complete - public static bool CheckChunkLoading(World world, Location start, Location dest) - { - var chunkColumn = world.GetChunkColumn(dest); - if (chunkColumn is null || chunkColumn.FullyLoaded == false) - return false; - - chunkColumn = world.GetChunkColumn(start); - if (chunkColumn is null || chunkColumn.FullyLoaded == false) - return false; - - return true; - } - } -} \ No newline at end of file diff --git a/MinecraftClient/Mapping/PlayerTeam.cs b/MinecraftClient/Mapping/PlayerTeam.cs deleted file mode 100644 index 4ad7ca6453..0000000000 --- a/MinecraftClient/Mapping/PlayerTeam.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Mapping -{ - /// - /// Represents a Minecraft scoreboard team and its current state. - /// - public class PlayerTeam - { - /// Team internal name (up to 16 chars) - public string Name { get; set; } = string.Empty; - - /// Display name component (formatted text) - public string DisplayName { get; set; } = string.Empty; - - /// Friendly fire is allowed between team members - public bool AllowFriendlyFire { get; set; } - - /// Team members can see invisible teammates - public bool SeeFriendlyInvisibles { get; set; } - - /// - /// Nametag visibility rule. - /// Values: "always", "hideForOtherTeams", "hideForOwnTeam", "never" - /// - public string NameTagVisibility { get; set; } = string.Empty; - - /// - /// Collision rule. - /// Values: "always", "pushOtherTeams", "pushOwnTeam", "never" - /// - public string CollisionRule { get; set; } = string.Empty; - - /// - /// Team color as ChatFormatting enum ordinal (-1 = RESET/none, - /// 0–15 = BLACK … WHITE). - /// - public int Color { get; set; } = -1; - - /// Prefix displayed before member names (formatted text) - public string Prefix { get; set; } = string.Empty; - - /// Suffix displayed after member names (formatted text) - public string Suffix { get; set; } = string.Empty; - - /// Current set of player / entity names on this team - public HashSet Members { get; } = new(System.StringComparer.OrdinalIgnoreCase); - } -} diff --git a/MinecraftClient/Mapping/RaycastHelper.cs b/MinecraftClient/Mapping/RaycastHelper.cs deleted file mode 100644 index 483b0b86b0..0000000000 --- a/MinecraftClient/Mapping/RaycastHelper.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System; - -namespace MinecraftClient.Mapping -{ - public static class RaycastHelper - { - public static Tuple RaycastBlock(McClient handler, double maxDistance, bool includeFluids) - { - return RaycastBlock(handler.GetWorld(), handler.GetCurrentLocation(), handler.GetYaw(), handler.GetPitch(), maxDistance, includeFluids); - } - - public static Tuple RaycastBlock(World world, Location playerLocation, float yaw, float pitch, double maxDistance, bool includeFluids) - { - Location camera = playerLocation.EyesLocation(); - Location rotation = MathHelper.GetRotationVector(yaw, pitch); - Location end = camera + (rotation * maxDistance); - return Raycast(world, camera, end, includeFluids); - } - - public static Tuple RaycastEntity(McClient handler, double maxDistance) - { - throw new NotImplementedException(); - } - - private static Block CheckRaycastResult(World world, Location location, bool includeFluids) - { - Block block = world.GetBlock(location); - - if (!includeFluids && MaterialExtensions.IsLiquid(block.Type)) - return Block.Air; - else - return block; - } - - public static Tuple Raycast(World world, Location start, Location end, bool includeFluids) - { - if (start == end) - return new(false, Location.Zero, Block.Air); - - double start_x = MathHelper.Lerp(-1.0E-7, start.X, end.X); - double start_y = MathHelper.Lerp(-1.0E-7, start.Y, end.Y); - double start_z = MathHelper.Lerp(-1.0E-7, start.Z, end.Z); - double end_x = MathHelper.Lerp(-1.0E-7, end.X, start.X); - double end_y = MathHelper.Lerp(-1.0E-7, end.Y, start.Y); - double end_z = MathHelper.Lerp(-1.0E-7, end.Z, start.Z); - - Location res_location = new(Math.Floor(start_x), Math.Floor(start_y), Math.Floor(start_z)); - Block block = CheckRaycastResult(world, res_location, includeFluids); - if (block.Type != Material.Air) - return new(true, res_location, block); - - double dx = end_x - start_x; - double dy = end_y - start_y; - double dz = end_z - start_z; - int dx_sign = Math.Sign(dx); - int dy_sign = Math.Sign(dy); - int dz_sign = Math.Sign(dz); - double x_step = dx_sign == 0 ? double.MaxValue : (double)dx_sign / dx; - double y_step = dy_sign == 0 ? double.MaxValue : (double)dy_sign / dy; - double z_step = dz_sign == 0 ? double.MaxValue : (double)dz_sign / dz; - double x_frac = x_step * (dx_sign > 0 ? 1.0 - MathHelper.FractionalPart(start_x) : MathHelper.FractionalPart(start_x)); - double y_frac = y_step * (dy_sign > 0 ? 1.0 - MathHelper.FractionalPart(start_y) : MathHelper.FractionalPart(start_y)); - double z_frac = z_step * (dz_sign > 0 ? 1.0 - MathHelper.FractionalPart(start_z) : MathHelper.FractionalPart(start_z)); - - while (x_frac <= 1.0 || y_frac <= 1.0 || z_frac <= 1.0) - { - if (x_frac < y_frac) - { - if (x_frac < z_frac) - { - res_location.X += dx_sign; - x_frac += x_step; - } - else - { - res_location.Z += dz_sign; - z_frac += z_step; - } - } - else if (y_frac < z_frac) - { - res_location.Y += dy_sign; - y_frac += y_step; - } - else - { - res_location.Z += dz_sign; - z_frac += z_step; - } - - block = CheckRaycastResult(world, res_location, includeFluids); - if (block.Type != Material.Air) - return new(true, res_location, block); - } - - return new(false, Location.Zero, Block.Air); - } - } - - public static class MathHelper - { - public static Location GetRotationVector(float yaw, float pitch) - { - float yaw_rad = -yaw * (MathF.PI / 180); - (float yaw_sin, float yaw_cos) = MathF.SinCos(yaw_rad); - - float pitch_rad = pitch * (MathF.PI / 180); - (float pitch_sin, float pitch_cos) = MathF.SinCos(pitch_rad); - - return new(yaw_sin * pitch_cos, -pitch_sin, yaw_cos * pitch_cos); - } - - public static double Lerp(double delta, double start, double end) - { - return start + delta * (end - start); - } - - public static long Lfloor(double value) - { - long l = (long)value; - return value < (double)l ? l - 1L : l; - } - - public static double FractionalPart(double value) - { - return value - Lfloor(value); - } - } -} diff --git a/MinecraftClient/Mapping/VillagerInfo.cs b/MinecraftClient/Mapping/VillagerInfo.cs deleted file mode 100644 index 7cd38373b0..0000000000 --- a/MinecraftClient/Mapping/VillagerInfo.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace MinecraftClient -{ - /// - /// Information of a villager - /// - public class VillagerInfo - { - public int Level { get; set; } - public int Experience { get; set; } - public bool IsRegularVillager { get; set; } - public bool CanRestock { get; set; } - } -} diff --git a/MinecraftClient/Mapping/World.cs b/MinecraftClient/Mapping/World.cs deleted file mode 100644 index 832bf5d01d..0000000000 --- a/MinecraftClient/Mapping/World.cs +++ /dev/null @@ -1,511 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; - -namespace MinecraftClient.Mapping -{ - /// - /// Represents a Minecraft World - /// - public class World - { - /// - /// The chunks contained into the Minecraft world - /// (int ChunkX, int ChunkZ): chunkX, chunkZ - /// - private ConcurrentDictionary<(int ChunkX, int ChunkZ), ChunkColumn> chunks = new(); - - /// - /// The dimension info of the world - /// - private static Dimension curDimension = new(); - - private static readonly Dictionary dimensionList = new(); - - /// - /// VarInt ID → dimension name mapping, populated from RegistryData in 1.20.6+ - /// - private static Dictionary dimensionIdMap = new(); - - /// - /// VarInt ID → attribute name mapping, populated from RegistryData (minecraft:attribute) in 1.20.6+ - /// - private static Dictionary attributeIdMap = new(); - - /// - /// Chunk data parsing progress - /// - public int chunkCnt = 0; - public int chunkLoadNotCompleted = 0; - - /// - /// Read, set or unload the specified chunk column - /// - /// ChunkColumn X - /// ChunkColumn Z - /// chunk at the given location - public ChunkColumn? this[int chunkX, int chunkZ] - { - get - { - chunks.TryGetValue((chunkX, chunkZ), out ChunkColumn? chunkColumn); - return chunkColumn; - } - set - { - var chunkCoord = (chunkX, chunkZ); - if (value is null) - chunks.TryRemove(chunkCoord, out _); - else - chunks.AddOrUpdate(chunkCoord, value, (_, _) => value); - } - } - - - /// - /// Storage of all dimensional data - 1.19.1 and above - /// - /// Registry Codec nbt data - public static void StoreDimensionList(Dictionary registryCodec) - { - const string namespacedDimensionTypeKey = "minecraft:dimension_type"; - const string legacyDimensionTypeKey = "dimension_type"; - - if (!registryCodec.TryGetValue(namespacedDimensionTypeKey, out var dimensionTypeRegistry) - && !registryCodec.TryGetValue(legacyDimensionTypeKey, out dimensionTypeRegistry)) - { - return; - } - - var dimensionListNbt = (object[])(((Dictionary)dimensionTypeRegistry)["value"]); - foreach (var (dimensionName, dimensionType) in from Dictionary dimensionNbt in dimensionListNbt - let dimensionName = (string)dimensionNbt["name"] - let dimensionType = (Dictionary)dimensionNbt["element"] - select (dimensionName, dimensionType)) - { - StoreOneDimension(dimensionName, dimensionType); - } - } - - public static void LoadDefaultDimensions1206Plus() - { - // TODO: Move this to a JSON file. - - var defaultRegistryCodec = new Dictionary - { - { "minecraft:dimension_type", new Dictionary - { - { "value", new object[] - { - new Dictionary - { - { "name", "minecraft:overworld" }, - { "id", 0 }, - { "element", new Dictionary - { - { "piglin_safe", (byte)0 }, - { "natural", 1 }, - { "ambient_light", 0.0 }, - { "monster_spawn_block_light_limit", 0 }, - { "infiniburn", "#minecraft:infiniburn_overworld" }, - { "respawn_anchor_works", 0 }, - { "has_skylight", 1 }, - { "bed_works", 1 }, - { "effects", "minecraft:overworld" }, - { "has_raids", 1 }, - { "logical_height", 384 }, - { "coordinate_scale", 1.0 }, - { "monster_spawn_light_level", new Dictionary - { - { "min_inclusive", 0 }, - { "max_inclusive", 7 }, - { "type", "minecraft:uniform" } - } - }, - { "min_y", -64 }, - { "ultrawarm", 0 }, - { "has_ceiling", 0 }, - { "height", 384 } - } - } - }, - new Dictionary - { - { "name", "minecraft:overworld_caves" }, - { "id", 1 }, - { "element", new Dictionary - { - { "piglin_safe", (byte)0 }, - { "natural", 1 }, - { "ambient_light", 0.0 }, - { "monster_spawn_block_light_limit", 0 }, - { "infiniburn", "#minecraft:infiniburn_overworld" }, - { "respawn_anchor_works", 0 }, - { "has_skylight", 1 }, - { "bed_works", 1 }, - { "effects", "minecraft:overworld" }, - { "has_raids", 1 }, - { "logical_height", 384 }, - { "coordinate_scale", 1.0 }, - { "monster_spawn_light_level", new Dictionary - { - { "min_inclusive", 0 }, - { "max_inclusive", 7 }, - { "type", "minecraft:uniform" } - } - }, - { "min_y", -64 }, - { "ultrawarm", 0 }, - { "has_ceiling", 1 }, - { "height", 384 } - } - } - }, - new Dictionary - { - { "name", "minecraft:the_end" }, - { "id", 2 }, - { "element", new Dictionary - { - { "piglin_safe", (byte)0 }, - { "natural", 0 }, - { "ambient_light", 0.0 }, - { "monster_spawn_block_light_limit", 0 }, - { "infiniburn", "#minecraft:infiniburn_end" }, - { "respawn_anchor_works", 0 }, - { "has_skylight", 0 }, - { "bed_works", 0 }, - { "effects", "minecraft:the_end" }, - { "fixed_time", 6000 }, - { "has_raids", 1 }, - { "logical_height", 256 }, - { "coordinate_scale", 1.0 }, - { "monster_spawn_light_level", new Dictionary - { - { "min_inclusive", 0 }, - { "max_inclusive", 7 }, - { "type", "minecraft:uniform" } - } - }, - { "min_y", 0 }, - { "ultrawarm", 0 }, - { "has_ceiling", 0 }, - { "height", 256 } - } - } - }, - new Dictionary - { - { "name", "minecraft:the_nether" }, - { "id", 3 }, - { "element", new Dictionary - { - { "piglin_safe", (byte)1 }, - { "natural", 0 }, - { "ambient_light", 0.1 }, - { "monster_spawn_block_light_limit", 15 }, - { "infiniburn", "#minecraft:infiniburn_nether" }, - { "respawn_anchor_works", 1 }, - { "has_skylight", 0 }, - { "bed_works", 0 }, - { "effects", "minecraft:the_nether" }, - { "fixed_time", 18000 }, - { "has_raids", 0 }, - { "logical_height", 128 }, - { "coordinate_scale", 8.0 }, - { "monster_spawn_light_level", 7 }, - { "min_y", 0 }, - { "ultrawarm", 1 }, - { "has_ceiling", 1 }, - { "height", 256 } - } - } - } - } - } - } - } - }; - - StoreDimensionList(defaultRegistryCodec); - } - - public static void SetDimensionIdMap(Dictionary idMap) - { - dimensionIdMap = idMap; - } - - public static string GetDimensionNameById(int id) - { - return dimensionIdMap.TryGetValue(id, out var name) ? name : "minecraft:overworld"; - } - - public static bool HasAnyDimension() - { - return dimensionList.Count > 0; - } - - public static void SetAttributeIdMap(Dictionary idMap) - { - attributeIdMap = idMap; - } - - /// - /// Get attribute name by its registry VarInt ID. Returns null if the ID is unknown. - /// When KnownDataPacks negotiation tells the server we already have vanilla data, - /// the server skips sending the attribute registry. In that case we fall back to - /// the built-in vanilla 1.20.6 attribute order (22 entries). - /// - public static string? GetAttributeNameById(int id) - { - if (attributeIdMap.Count == 0) - LoadDefaultAttributes(); - return attributeIdMap.TryGetValue(id, out var name) ? name : null; - } - - private static void LoadDefaultAttributes() - { - // Fallback for when the server doesn't send attribute registry via RegistryData. - // Matches 1.21.1 Attributes.java registration order. - // For 1.20.6+ servers, SetAttributeIdMap() overrides this with the actual registry. - attributeIdMap = new Dictionary - { - { 0, "generic.armor" }, - { 1, "generic.armor_toughness" }, - { 2, "generic.attack_damage" }, - { 3, "generic.attack_knockback" }, - { 4, "generic.attack_speed" }, - { 5, "player.block_break_speed" }, - { 6, "player.block_interaction_range" }, - { 7, "generic.burning_time" }, - { 8, "generic.explosion_knockback_resistance" }, - { 9, "player.entity_interaction_range" }, - { 10, "generic.fall_damage_multiplier" }, - { 11, "generic.flying_speed" }, - { 12, "generic.follow_range" }, - { 13, "generic.gravity" }, - { 14, "generic.jump_strength" }, - { 15, "generic.knockback_resistance" }, - { 16, "generic.luck" }, - { 17, "generic.max_absorption" }, - { 18, "generic.max_health" }, - { 19, "player.mining_efficiency" }, - { 20, "generic.movement_efficiency" }, - { 21, "generic.movement_speed" }, - { 22, "generic.oxygen_bonus" }, - { 23, "generic.safe_fall_distance" }, - { 24, "generic.scale" }, - { 25, "player.sneaking_speed" }, - { 26, "zombie.spawn_reinforcements" }, - { 27, "generic.step_height" }, - { 28, "player.submerged_mining_speed" }, - { 29, "player.sweeping_damage_ratio" }, - { 30, "generic.water_movement_efficiency" } - }; - } - - /// - /// Store one dimension - Directly used in 1.16.2 to 1.18.2 - /// - /// Dimension name - /// Dimension Type nbt data - public static void StoreOneDimension(string dimensionName, Dictionary dimensionType) - { - if (dimensionList.ContainsKey(dimensionName)) - dimensionList.Remove(dimensionName); - dimensionList.Add(dimensionName, new Dimension(dimensionName, dimensionType)); - } - - - /// - /// Set current dimension - 1.16 and above - /// - /// The name of the dimension type - /// The dimension type (NBT Tag Compound) - public static void SetDimension(string name) - { - // Try to get the dimension using the name as is - if (dimensionList.TryGetValue(name, out Dimension? dimension)) - { - curDimension = dimension; - return; // Dimension found - } - - // If not found, check if name lacks 'minecraft:' prefix and try again - if (!name.StartsWith("minecraft:")) - { - string prefixedName = "minecraft:" + name; - if (dimensionList.TryGetValue(prefixedName, out dimension)) - { - curDimension = dimension; - return; // Dimension found with prefixed name - } - } - else - { - string unprefixedName = name["minecraft:".Length..]; - if (dimensionList.TryGetValue(unprefixedName, out dimension)) - { - curDimension = dimension; - return; - } - } - - if (TryStoreDefaultVanillaDimension(name) - && dimensionList.TryGetValue(name, out dimension)) - { - curDimension = dimension; - return; - } - - // If still not found, dimension does not exist - throw new KeyNotFoundException($"Dimension '{name}' not found in dimensions dictionary."); - } - - private static bool TryStoreDefaultVanillaDimension(string name) - { - var normalizedName = name.StartsWith("minecraft:") - ? name - : "minecraft:" + name; - - if (normalizedName is not ("minecraft:overworld" or "minecraft:the_nether" or "minecraft:the_end")) - return false; - - StoreOneDimension(name, new Dictionary()); - return true; - } - - - - - /// - /// Get current dimension - /// - /// Current dimension - public static Dimension GetDimension() - { - return curDimension; - } - - /// - /// Set chunk column at the specified location - /// - /// ChunkColumn X - /// ChunkColumn Y - /// ChunkColumn Z - /// ChunkColumn size - /// Chunk data - /// Whether the ChunkColumn has been fully loaded - public void StoreChunk(int chunkX, int chunkY, int chunkZ, int chunkColumnSize, Chunk? chunk, bool loadCompleted) - { - ChunkColumn chunkColumn = chunks.GetOrAdd((chunkX, chunkZ), (_) => new(chunkColumnSize)); - chunkColumn[chunkY] = chunk; - if (loadCompleted) - chunkColumn.FullyLoaded = true; - } - - /// - /// Get chunk column at the specified location - /// - /// Location to retrieve chunk column - /// The chunk column - public ChunkColumn? GetChunkColumn(Location location) - { - return this[location.ChunkX, location.ChunkZ]; - } - - /// - /// Get block at the specified location - /// - /// Location to retrieve block from - /// Block at specified location or Air if the location is not loaded - public Block GetBlock(Location location) - { - ChunkColumn? column = GetChunkColumn(location); - if (column is not null) - { - Chunk? chunk = column.GetChunk(location); - if (chunk is not null) - return chunk.GetBlock(location); - } - return Block.Air; - } - - /// - /// Look for a block around the specified location - /// - /// Start location - /// Block type - /// Search radius - larger is slower: O^3 complexity - /// Block matching the specified block type - public List FindBlock(Location from, Material block, double radius) - { - return FindBlock(from, block, radius, radius, radius); - } - - /// - /// Look for a block around the specified location - /// - /// Start location - /// Block type - /// Search radius on the X axis - /// Search radius on the Y axis - /// Search radius on the Z axis - /// Block matching the specified block type - public List FindBlock(Location from, Material block, double radiusx, double radiusy, double radiusz) - { - Location minPoint = new Location(from.X - radiusx, from.Y - radiusy, from.Z - radiusz); - Location maxPoint = new Location(from.X + radiusx, from.Y + radiusy, from.Z + radiusz); - - List xRange = Enumerable.Range(Convert.ToInt32(Math.Floor(minPoint.X)), Convert.ToInt32(Math.Floor(maxPoint.X - minPoint.X)) + 1).ToList(); - List yRange = Enumerable.Range(Convert.ToInt32(Math.Floor(minPoint.Y)), Convert.ToInt32(Math.Floor(maxPoint.Y - minPoint.Y)) + 1).ToList(); - List zRange = Enumerable.Range(Convert.ToInt32(Math.Floor(minPoint.Z)), Convert.ToInt32(Math.Floor(maxPoint.Z - minPoint.Z)) + 1).ToList(); - - List listOfBlocks = xRange.SelectMany(x => yRange.SelectMany(y => zRange.Select(z => new Location(x, y, z)))).ToList(); - - return listOfBlocks.Where(loc => GetBlock(loc).Type == block).ToList(); - } - - /// - /// Set block at the specified location - /// - /// Location to set block to - /// Block to set - public void SetBlock(Location location, Block block) - { - ChunkColumn? column = this[location.ChunkX, location.ChunkZ]; - if (column is not null && location.ChunkY >= 0 && location.ChunkY < column.ColumnSize) - { - Chunk? chunk = column.GetChunk(location); - if (chunk is null) - column[location.ChunkY] = chunk = new Chunk(); - chunk[location.ChunkBlockX, location.ChunkBlockY, location.ChunkBlockZ] = block; - } - } - - /// - /// Clear all terrain data from the world - /// - public void Clear() - { - chunks = new(); - chunkCnt = 0; - chunkLoadNotCompleted = 0; - } - - public static string GetChunkLoadingStatus(World world) - { - double chunkLoadedRatio; - if (world.chunkCnt == 0) - chunkLoadedRatio = 0; - else - chunkLoadedRatio = (world.chunkCnt - world.chunkLoadNotCompleted) / (double)world.chunkCnt; - - string status = string.Format(Translations.cmd_move_chunk_loading_status, - chunkLoadedRatio, world.chunkCnt - world.chunkLoadNotCompleted, world.chunkCnt); - - return status; - } - } -} diff --git a/MinecraftClient/McClient.cs b/MinecraftClient/McClient.cs deleted file mode 100644 index 971449f2a7..0000000000 --- a/MinecraftClient/McClient.cs +++ /dev/null @@ -1,5280 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net; -using System.Net.Sockets; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Brigadier.NET; -using Brigadier.NET.Exceptions; -using MinecraftClient.ChatBots; -using MinecraftClient.CommandHandler; -using MinecraftClient.CommandHandler.Patch; -using MinecraftClient.Commands; -using MinecraftClient.Dialogs; -using MinecraftClient.Inventory; -using MinecraftClient.Logger; -using MinecraftClient.Mapping; -using MinecraftClient.Physics; -using MinecraftClient.Protocol; -using MinecraftClient.Protocol.Handlers; -using MinecraftClient.Protocol.Handlers.Forge; -using MinecraftClient.Protocol.Message; -using MinecraftClient.Protocol.ProfileKey; -using MinecraftClient.Protocol.Session; -using MinecraftClient.Proxy; -using MinecraftClient.Scripting; -using Sentry; -using static MinecraftClient.Settings; - -namespace MinecraftClient -{ - /// - /// The main client class, used to connect to a Minecraft server. - /// - public class McClient : IMinecraftComHandler - { - public static int ReconnectionAttemptsLeft = 0; - - public static CommandDispatcher dispatcher = new(); - private readonly Dictionary onlinePlayers = new(); - - private static bool commandsLoaded = false; - private readonly Lock tabListHeaderFooterLock = new(); - private string tabListHeader = string.Empty; - private string tabListFooter = string.Empty; - - private readonly Queue chatQueue = new(); - private static DateTime nextMessageSendTime = DateTime.MinValue; - - private readonly Queue threadTasks = new(); - private readonly Lock threadTasksLock = new(); - private readonly Lock recipeBookLock = new(); - private readonly Lock achievementsLock = new(); - - private readonly List bots = new(); - private static readonly List botsOnHold = new(); - private static readonly Dictionary inventories = new(); - private static readonly HashSet inventoriesWithFullContents = new(); - private readonly Dictionary unlockedRecipes = new(StringComparer.Ordinal); - private readonly Dictionary achievements = new(StringComparer.Ordinal); - private string? activeAdvancementTab; - - private readonly Dictionary> registeredBotPluginChannels = new(); - private readonly List registeredServerPluginChannels = new(); - - private bool terrainAndMovementsEnabled; - private bool terrainAndMovementsRequested = false; - private bool inventoryHandlingEnabled; - private bool inventoryHandlingRequested = false; - private bool entityHandlingEnabled; - - private readonly Lock locationLock = new(); - private bool locationReceived = false; - private readonly World world = new(); - private Queue? path; - private Location location; - private float? _yaw; // Used for calculation ONLY!!! Doesn't reflect the client yaw - private float? _pitch; // Used for calculation ONLY!!! Doesn't reflect the client pitch - private float playerYaw; - private float playerPitch; - private readonly PlayerPhysics playerPhysics = new(); - private readonly MovementInput physicsInput = new(); - private bool physicsInitialized = false; - private Location? pathTarget; // Current waypoint for physics-driven pathfinding - public enum MovementType { Sneak, Walk, Sprint } - private int sequenceId; // User for player block synchronization (Aka. digging, placing blocks, etc..) - private bool CanSendMessage = false; - - private string host; - private int port; - private readonly int protocolversion; - private readonly string username; - private Guid uuid; - private string uuidStr; - private readonly string sessionid; - private readonly PlayerKeyPair? playerKeyPair; - private DateTime lastKeepAlive; - private readonly Lock lastKeepAliveLock = new(); - private int respawnTicks = 0; - private int gamemode = 0; - private bool isSupportPreviewsChat; - private EnchantmentData? lastEnchantment = null; - - private int playerEntityID; - - private readonly Lock DigLock = new(); - private Tuple? LastDigPosition; - private int RemainingDiggingTime = 0; - - // player health and hunger - private float playerHealth; - private int playerFoodSaturation; - private int playerLevel; - private int playerTotalExperience; - private byte CurrentSlot = 0; - - // player effects - private readonly Dictionary playerEffects = new(); - - // player attributes (e.g., block_break_speed, mining_efficiency, submerged_mining_speed) - private readonly Dictionary playerAttributes = new(); - - // scoreboard teams (key = team name) - private readonly Dictionary teams = new(StringComparer.Ordinal); - - // Sneaking - public bool IsSneaking { get; set; } = false; - private bool isUnderSlab = false; - private DateTime nextSneakingUpdate = DateTime.Now; - - // Entity handling - private readonly Dictionary entities = new(); - private readonly Lock signDataLock = new(); - private readonly Dictionary<(int x, int y, int z), (string material, string typeLabel, string[] frontText, string[] backText, bool isWaxed)> knownSigns = new(); - - // server TPS - private long lastAge = 0; - private DateTime lastTime; - private double serverTPS = 0; - private double averageTPS = 20; - private const int maxSamples = 5; - private readonly List tpsSamples = new(maxSamples); - private double sampleSum = 0; - - // ChatBot OnNetworkPacket event - private bool networkPacketCaptureEnabled = false; - - // Cookies - private Dictionary Cookies { get; set; } = new(); - - public int GetServerPort() { return port; } - public string GetServerHost() { return host; } - public string GetUsername() { return username; } - public Guid GetUserUuid() { return uuid; } - public string GetUserUuidStr() { return uuidStr; } - public string GetSessionID() { return sessionid; } - public Location GetCurrentLocation() { return location; } - public float GetYaw() { return playerYaw; } - public int GetSequenceId() { return sequenceId; } - public float GetPitch() { return playerPitch; } - public World GetWorld() { return world; } - public double GetServerTPS() { return averageTPS; } - public bool GetIsSupportPreviewsChat() { return isSupportPreviewsChat; } - public float GetHealth() { return playerHealth; } - public int GetSaturation() { return playerFoodSaturation; } - - /// - /// Get the player's active effects - /// - /// Dictionary of active effects - public Dictionary GetPlayerEffects() - { - return new Dictionary(playerEffects); - } - - /// - /// Get a snapshot of all known scoreboard teams. - /// - /// Dictionary mapping team name to - public Dictionary GetTeams() - { - lock (teams) - return new Dictionary(teams, StringComparer.Ordinal); - } - - /// - /// Get the team that contains the given player/entity name, or null if not found. - /// - public PlayerTeam? GetPlayerTeam(string playerName) - { - lock (teams) - { - foreach (var team in teams.Values) - if (team.Members.Contains(playerName)) - return team; - return null; - } - } - - public int GetLevel() { return playerLevel; } - public int GetTotalExperience() { return playerTotalExperience; } - public byte GetCurrentSlot() { return CurrentSlot; } - public int GetGamemode() { return gamemode; } - public bool GetNetworkPacketCaptureEnabled() { return networkPacketCaptureEnabled; } - public int GetProtocolVersion() { return protocolversion; } - public ILogger GetLogger() { return Log; } - public int GetPlayerEntityID() { return playerEntityID; } - public List GetLoadedChatBots() { return new List(bots); } - public void GetCookie(string key, out byte[]? data) => Cookies.TryGetValue(key, out data); - public void SetCookie(string key, byte[] data) => Cookies[key] = data; - public void DeleteCookie(string key) => Cookies.Remove(key, out var data); - public void DeleteAllCookies() => Cookies?.Clear(); - public (Location location, string material, string typeLabel, string[] frontText, string[] backText, bool isWaxed)[] GetKnownSigns() - { - lock (signDataLock) - { - return knownSigns - .Select(pair => ( - location: new Location(pair.Key.x, pair.Key.y, pair.Key.z), - material: pair.Value.material, - typeLabel: pair.Value.typeLabel, - frontText: (string[])pair.Value.frontText.Clone(), - backText: (string[])pair.Value.backText.Clone(), - isWaxed: pair.Value.isWaxed)) - .ToArray(); - } - } - - TcpClient client = null!; - IMinecraftCom handler = null!; - SessionToken _sessionToken; - Tuple? timeoutdetector = null; - private int transferInProgress = 0; - private readonly ConnectionAttemptLifecycle connectionLifecycle = new(); - private int disconnectOwnerThreadId; - private readonly TaskCompletionSource disconnectCompletion = new(TaskCreationOptions.RunContinuationsAsynchronously); - - public ILogger Log; - public DialogManager Dialogs { get; } - internal long ConnectionAttempt { get; } - internal Task DisconnectCompletion => disconnectCompletion.Task; - - private static IMinecraftComHandler? instance; - public static IMinecraftComHandler? Instance => instance; - - /// - /// Starts the main chat client, wich will login to the server using the MinecraftCom class. - /// - /// A valid session obtained with MinecraftCom.GetLogin() - /// Key for message signing - /// The server IP - /// The server port to use - /// Minecraft protocol version to use - /// ForgeInfo item stating that Forge is enabled - public McClient(SessionToken session, PlayerKeyPair? playerKeyPair, string server_ip, ushort port, int protocolversion, ForgeInfo? forgeInfo) - : this(session, playerKeyPair, server_ip, port, protocolversion, forgeInfo, Program.CurrentConnectionAttempt) - { - } - - internal McClient( - SessionToken session, - PlayerKeyPair? playerKeyPair, - string server_ip, - ushort port, - int protocolversion, - ForgeInfo? forgeInfo, - long connectionAttempt) - { - CmdResult.currentHandler = this; - instance = this; - ConnectionAttempt = connectionAttempt; - - terrainAndMovementsEnabled = Config.Main.Advanced.TerrainAndMovements; - inventoryHandlingEnabled = Config.Main.Advanced.InventoryHandling; - entityHandlingEnabled = Config.Main.Advanced.EntityHandling; - - sessionid = session.ID; - if (!Guid.TryParse(session.PlayerID, out uuid)) - uuid = Guid.Empty; - uuidStr = session.PlayerID; - username = session.PlayerName; - host = server_ip; - this.port = port; - this.protocolversion = protocolversion; - this.playerKeyPair = playerKeyPair; - _sessionToken = session; - - Log = Settings.Config.Logging.LogToFile - ? new FileLogLogger(Config.AppVar.ExpandVars(Settings.Config.Logging.LogFile), Settings.Config.Logging.PrependTimestamp) - : new FilteredLogger(); - Log.DebugEnabled = Config.Logging.DebugMessages; - Log.InfoEnabled = Config.Logging.InfoMessages; - Log.ChatEnabled = Config.Logging.ChatMessages; - Log.WarnEnabled = Config.Logging.WarningMessages; - Log.ErrorEnabled = Config.Logging.ErrorMessages; - Dialogs = new DialogManager(this); - - // SENTRY: Send our client version and server version to Sentry - SentrySdk.ConfigureScope(scope => - { - scope.SetTag("Protocol Version", protocolversion.ToString()); - scope.SetTag("Minecraft Version", ProtocolHandler.ProtocolVersion2MCVer(protocolversion)); - scope.SetTag("MCC Build", Program.BuildInfo is null ? "Debug" : Program.BuildInfo); - - if (forgeInfo is not null) - scope.SetTag("Forge Version", forgeInfo.Version.ToString()); - - scope.Contexts["Server Information"] = new - { - ProtocolVersion = protocolversion, - MinecraftVersion = ProtocolHandler.ProtocolVersion2MCVer(protocolversion), - ForgeInfo = forgeInfo?.Version - }; - - scope.Contexts["Client Configuration"] = new - { - TerrainAndMovementsEnabled = terrainAndMovementsEnabled, - InventoryHandlingEnabled = inventoryHandlingEnabled, - EntityHandlingEnabled = entityHandlingEnabled - }; - }); - - SentrySdk.StartSession(); - - /* Load commands from Commands namespace */ - LoadCommands(); - - if (botsOnHold.Count == 0) - { - RegisterBots(); - } - else - { - ConnectionAttemptLifecycle.RestoreHeldBots(botsOnHold, bot => BotLoad(bot, false)); - } - - try - { - client = ProxyHandler.NewTcpClient(host, port); - client.ReceiveBufferSize = 1024 * 1024; - client.ReceiveTimeout = Config.Main.Advanced.TcpTimeout * 1000; // Default: 30 seconds - handler = Protocol.ProtocolHandler.GetProtocolHandler(client, protocolversion, forgeInfo, this); - if (forgeInfo is not null && forgeInfo.Version == FMLVersion.FML) - ChatParser.LoadForgeModTranslations(forgeInfo.Mods.Select(static mod => mod.ModID)); - Log.Info(Translations.mcc_version_supported); - - timeoutdetector = new(new Thread(new ParameterizedThreadStart(TimeoutDetector)), new CancellationTokenSource()); - timeoutdetector.Item1.Name = "MCC Connection timeout detector"; - timeoutdetector.Item1.Start(timeoutdetector.Item2.Token); - - try - { - if (handler.Login(this.playerKeyPair, session)) - { - Log.Info(string.Format(Translations.mcc_joined, Config.Main.Advanced.InternalCmdChar.ToLogString())); - - StartConsoleSession(); - } - else - { - Log.Error(Translations.error_login_failed); - goto Retry; - } - } - catch (Exception e) - { - Log.Error(e.GetType().Name + ": " + e.Message); - Log.Error(Translations.error_join); - goto Retry; - } - } - catch (SocketException e) - { - Log.Error(e.Message); - Log.Error(Translations.error_connect); - goto Retry; - } - - return; - - Retry: - if (timeoutdetector is not null) - { - timeoutdetector.Item2.Cancel(); - timeoutdetector = null; - } - - if (connectionLifecycle.IsFailureClaimed) - return; - - if (!InternalConfig.InteractiveMode) - { - StopConsoleSession(); - Program.HandleFailure(null, false, ChatBot.DisconnectReason.ConnectionLost); - return; - } - - if (!Config.ChatBot.AutoRelog.Enabled) - { - if (ReconnectionAttemptsLeft > 0) - { - Log.Info(string.Format(Translations.mcc_reconnect, ReconnectionAttemptsLeft)); - Thread.Sleep(5000); - ReconnectionAttemptsLeft--; - Program.Restart(); - return; - } - - StopConsoleSession(); - Program.HandleFailure(); - return; - } - - OnConnectionLost(ChatBot.DisconnectReason.ConnectionLost, Translations.mcc_disconnect_lost); - return; - } - - public void Transfer(string newHost, int newPort) - { - // Do not block here: a new handler can start processing packets before the - // previous transfer call fully unwinds, and waiting can deadlock main-thread work. - if (Interlocked.CompareExchange(ref transferInProgress, 1, 0) != 0) - { - Log.Warn($"Ignoring overlapping transfer to {newHost}:{newPort} because another transfer is still in progress."); - return; - } - - IMinecraftCom oldHandler = handler; - TcpClient oldClient = client; - string resolvedHost = newHost; - int resolvedPort = newPort; - - try - { - ResolveTransferAddress(ref resolvedHost, ref resolvedPort); - Log.Info($"Initiating a transfer to: {resolvedHost}:{resolvedPort}"); - - // Backup current bots before unloading, so they can be restored after successful transfer. - if (botsOnHold.Count == 0 && bots.Count > 0) - { - botsOnHold.AddRange(bots.Where(bot => bot.ScriptOwnerKey is null)); - } - - // Unload bots - UnloadAllBots(); - bots.Clear(); - - ResetStateForTransfer(); - - // Snapshot cookies before Dispose clears them - Dictionary savedCookies = new Dictionary(Cookies); - - // Retire the old handler so its updater exits without reporting a stale disconnect. - oldHandler.Dispose(); - oldClient.Close(); - - host = resolvedHost; - port = resolvedPort; - UpdateKeepAlive(); - - // Establish new connection - client = ProxyHandler.NewTcpClient(resolvedHost, resolvedPort); - client.ReceiveBufferSize = 1024 * 1024; - client.ReceiveTimeout = Config.Main.Advanced.TcpTimeout * 1000; - - // Reinitialize the protocol handler - handler = Protocol.ProtocolHandler.GetProtocolHandler(client, protocolversion, null, this); - Cookies = savedCookies; // Restore cookies for the new connection before login - Log.Info($"Connected to {resolvedHost}:{resolvedPort}"); - - // Retry login process - if (handler.Login(playerKeyPair, _sessionToken, isTransfer: true)) - { - foreach (var bot in botsOnHold) - BotLoad(bot, false); - botsOnHold.Clear(); - - UpdateKeepAlive(); - Log.Info($"Successfully transferred connection and logged in to {resolvedHost}:{resolvedPort}."); - - StartConsoleSession(); - } - else - { - Log.Error("Failed to login to the new host."); - throw new Exception("Login failed after transfer."); - } - } - catch (Exception ex) - { - Log.Error($"Transfer to {resolvedHost}:{resolvedPort} failed: {ex.Message}"); - - try - { - handler.Dispose(); - } - catch - { - } - - try - { - client.Close(); - } - catch - { - } - - // Handle reconnection attempts - if (timeoutdetector is not null) - { - timeoutdetector.Item2.Cancel(); - timeoutdetector = null; - } - - if (!InternalConfig.InteractiveMode) - { - StopConsoleSession(); - Program.HandleFailure(null, false, ChatBot.DisconnectReason.ConnectionLost); - return; - } - - if (ReconnectionAttemptsLeft > 0) - { - Log.Info($"Reconnecting... Attempts left: {ReconnectionAttemptsLeft}"); - Thread.Sleep(5000); - ReconnectionAttemptsLeft--; - Program.Restart(); - return; - } - - StopConsoleSession(); - Program.HandleFailure(); - } - finally - { - Interlocked.Exchange(ref transferInProgress, 0); - } - } - - private static void ResolveTransferAddress(ref string host, ref int port) - { - if (Config.Main.Advanced.ResolveSrvRecords == MainConfigHelper.MainConfig.AdvancedConfig.ResolveSrvRecordType.no - || port != 25565 - || IPAddress.TryParse(host, out _)) - { - return; - } - - ushort resolvedPort = (ushort)port; - ProtocolHandler.MinecraftServiceLookup(ref host, ref resolvedPort); - port = resolvedPort; - } - - private void StartConsoleSession() - { - Program.EndOfflinePrompt(ConnectionAttempt); - ConsoleInputRouter.RouteToClient(this); - } - - private void StopConsoleSession() - { - ConsoleInputRouter.ClearClient(this); - } - - private void ResetStateForTransfer() - { - ClearTasks(); - ConsoleIO.CancelAutocomplete(); - SetCanSendMessage(false); - - locationReceived = false; - physicsInitialized = false; - isUnderSlab = false; - path = null; - pathTarget = null; - _yaw = null; - _pitch = null; - LastDigPosition = null; - RemainingDiggingTime = 0; - nextSneakingUpdate = DateTime.Now; - - physicsInput.Reset(); - world.Clear(); - entities.Clear(); - ClearKnownSigns(); - ClearInventories(); - } - - /// - /// Register bots - /// - private void RegisterBots(bool reload = false) - { - if (Config.ChatBot.Alerts.Enabled) { BotLoad(new Alerts()); } - if (Config.ChatBot.AntiAFK.Enabled) { BotLoad(new AntiAFK()); } - if (Config.ChatBot.AutoAttack.Enabled) { BotLoad(new AutoAttack()); } - if (Config.ChatBot.AutoCraft.Enabled) { BotLoad(new AutoCraft()); } - if (Config.ChatBot.AutoDig.Enabled) { BotLoad(new AutoDig()); } - if (Config.ChatBot.AutoDrop.Enabled) { BotLoad(new AutoDrop()); } - if (Config.ChatBot.AutoEat.Enabled) { BotLoad(new AutoEat()); } - if (Config.ChatBot.AutoFishing.Enabled) { BotLoad(new AutoFishing()); } - if (Config.ChatBot.AutoRelog.Enabled) { BotLoad(new AutoRelog()); } - if (Config.ChatBot.AutoRespond.Enabled) { BotLoad(new AutoRespond()); } - if (Config.ChatBot.ChatLog.Enabled) { BotLoad(new ChatLog()); } - if (Config.ChatBot.DiscordBridge.Enabled) { BotLoad(new DiscordBridge()); } - if (Config.ChatBot.Farmer.Enabled) { BotLoad(new Farmer()); } - if (Config.ChatBot.FollowPlayer.Enabled) { BotLoad(new FollowPlayer()); } - if (Config.ChatBot.HangmanGame.Enabled) { BotLoad(new HangmanGame()); } - if (Config.ChatBot.Mailer.Enabled) { BotLoad(new Mailer()); } - if (Config.ChatBot.Map.Enabled) { BotLoad(new Map()); } - if (Config.ChatBot.PlayerListLogger.Enabled) { BotLoad(new PlayerListLogger()); } - if (Config.ChatBot.RemoteControl.Enabled) { BotLoad(new RemoteControl()); } - if (Config.ChatBot.ReplayCapture.Enabled) { BotLoad(new ReplayCapture()); } - if (Config.ChatBot.ScriptScheduler.Enabled) { BotLoad(new ScriptScheduler()); } - if (Config.ChatBot.TelegramBridge.Enabled) { BotLoad(new TelegramBridge()); } - if (Config.ChatBot.ItemsCollector.Enabled) { BotLoad(new ItemsCollector()); } - if (Config.ChatBot.DiscordRpc.Enabled) { BotLoad(new DiscordRpc()); } - if (Config.ChatBot.McpServer.Enabled) { BotLoad(new McpServer()); } - if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("MCC_FILE_INPUT"))) - BotLoad(new FileInputBot()); - } - - /// - /// Retrieve messages from the queue and send. - /// Note: requires external locking. - /// - private void TrySendMessageToServer() - { - if (!CanSendMessage) - return; - - while (chatQueue.Count > 0 && nextMessageSendTime < DateTime.Now) - { - string text = chatQueue.Dequeue(); - handler.SendChatMessage(text, playerKeyPair); - nextMessageSendTime = DateTime.Now + TimeSpan.FromSeconds(Config.Main.Advanced.MessageCooldown); - } - } - - /// - /// Called 20 times per second by the protocol handler - /// - public void OnUpdate() - { - foreach (ChatBot bot in bots.ToArray()) - { - try - { - bot.Update(); - bot.UpdateInternal(); - } - catch (Exception e) - { - if (e is not ThreadAbortException) - Log.Warn("Update: Got error from " + bot.ToString() + ": " + e.ToString()); - else - throw; //ThreadAbortException should not be caught - } - } - - if (nextSneakingUpdate < DateTime.Now) - { - if (world.GetBlock(new Location(location.X, location.Y + 1, location.Z)).IsTopSlab(protocolversion) && !IsSneaking) - { - isUnderSlab = true; - SendEntityAction(EntityActionType.StartSneaking); - } - else - { - if (isUnderSlab && !IsSneaking) - { - isUnderSlab = false; - SendEntityAction(EntityActionType.StopSneaking); - } - } - - nextSneakingUpdate = DateTime.Now.AddMilliseconds(300); - } - - lock (chatQueue) - { - TrySendMessageToServer(); - } - - if (terrainAndMovementsEnabled && locationReceived) - { - lock (locationLock) - { - if (!physicsInitialized) - { - BlockShapes.Initialize(); - playerPhysics.SetPosition(location.X, location.Y, location.Z); - playerPhysics.Yaw = playerYaw; - playerPhysics.Pitch = playerPitch; - physicsInitialized = true; - } - - // Navigate pathfinding: set input based on current path - UpdatePathfindingInput(); - - // Sync yaw/pitch if explicitly set (by commands/bots) - if (_yaw is not null) playerPhysics.Yaw = _yaw.Value; - if (_pitch is not null) playerPhysics.Pitch = _pitch.Value; - - // Update environment flags (water, lava, climbable) - playerPhysics.UpdateEnvironment(world); - - // Apply movement input - playerPhysics.ApplyInput(physicsInput); - - // Run one physics tick - playerPhysics.Tick(world); - - // Sync back to MCC location - location = new Location( - playerPhysics.Position.X, - playerPhysics.Position.Y, - playerPhysics.Position.Z); - - playerYaw = _yaw ?? playerYaw; - playerPitch = _pitch ?? playerPitch; - - // Send position packet - handler.SendLocationUpdate(location, playerPhysics.OnGround, playerPhysics.HorizontalCollision, _yaw, _pitch); - - _yaw = null; - _pitch = null; - } - } - - if (Config.Main.Advanced.AutoRespawn && respawnTicks > 0) - { - respawnTicks--; - if (respawnTicks == 0) - SendRespawnPacket(); - } - - // Check for expired effects - if (playerEffects.Count > 0) - { - var expiredEffects = playerEffects - .Where(e => e.Value.IsExpired) - .Select(e => e.Key) - .ToList(); - - foreach (var effect in expiredEffects) - { - if (!playerEffects.Remove(effect, out var effectData)) - continue; - - AnnouncePlayerEffectExpired(effectData); - - if (entities.TryGetValue(playerEntityID, out var playerEntity)) - playerEntity.ActiveEffects.Remove(effect); - } - } - - lock (threadTasksLock) - { - while (threadTasks.Count > 0) - { - Action taskToRun = threadTasks.Dequeue(); - taskToRun(); - } - } - - lock (DigLock) - { - if (RemainingDiggingTime > 0) - { - if (--RemainingDiggingTime == 0 && LastDigPosition is not null) - { - handler.SendPlayerDigging(2, LastDigPosition.Item1, LastDigPosition.Item2, sequenceId++); - Log.Info(string.Format(Translations.cmd_dig_end, LastDigPosition.Item1)); - } - else - { - DoAnimation((int)Hand.MainHand); - } - } - } - } - - #region Connection Lost and Disconnect from Server - - /// - /// Periodically checks for server keepalives and consider that connection has been lost if the last received keepalive is too old. - /// - private void TimeoutDetector(object? o) - { - UpdateKeepAlive(); - do - { - Thread.Sleep(TimeSpan.FromSeconds(15)); - - if (((CancellationToken)o!).IsCancellationRequested) - return; - - lock (lastKeepAliveLock) - { - if (lastKeepAlive.AddSeconds(Config.Main.Advanced.TcpTimeout) < DateTime.Now) - { - if (((CancellationToken)o!).IsCancellationRequested) - return; - - OnConnectionLost(ChatBot.DisconnectReason.ConnectionLost, Translations.error_timeout); - return; - } - } - } - while (!((CancellationToken)o!).IsCancellationRequested); - } - - /// - /// Update last keep alive to current time - /// - private void UpdateKeepAlive() - { - lock (lastKeepAliveLock) - { - lastKeepAlive = DateTime.Now; - } - } - - /// - /// Disconnect the client from the server (initiated from MCC) - /// - public void Disconnect() - { - if (!TryBeginDisconnect()) - { - if (Volatile.Read(ref disconnectOwnerThreadId) != Environment.CurrentManagedThreadId) - disconnectCompletion.Task.GetAwaiter().GetResult(); - return; - } - - try - { - DispatchBotEvent(bot => bot.OnDisconnect(ChatBot.DisconnectReason.UserLogout, string.Empty)); - } - finally - { - CompleteDisconnect(sendDisconnectPacket: true); - } - } - - /// - /// When connection has been lost, login was denied or played was kicked from the server - /// - public void OnConnectionLost(ChatBot.DisconnectReason reason, string message) - { - if (reason == ChatBot.DisconnectReason.UserLogout) - throw new InvalidOperationException(Translations.exception_user_logout); - - if (!TryBeginDisconnect()) - return; - - bool restartScheduled = false; - try - { - ConsoleIO.CancelAutocomplete(); - - world.Clear(); - ClearKnownSigns(); - - bool exitOnFailure = Program.PrepareExitOnFailure(); - - switch (reason) - { - case ChatBot.DisconnectReason.ConnectionLost: - message = Translations.mcc_disconnect_lost; - Log.Info(message); - break; - - case ChatBot.DisconnectReason.InGameKick: - Log.Info(Translations.mcc_disconnect_server); - Log.Info(message); - break; - - case ChatBot.DisconnectReason.LoginRejected: - Log.Info(Translations.mcc_disconnect_login); - Log.Info(message); - break; - } - - // Process AutoRelog last so every other bot can complete cleanup first. - List onDisconnectBotList = bots.Where(bot => bot is not AutoRelog).ToList(); - onDisconnectBotList.AddRange(bots.Where(bot => bot is AutoRelog)); - - foreach (ChatBot bot in onDisconnectBotList) - { - try - { - _ = bot.OnDisconnect(reason, message); - } - catch (Exception exception) when (exception is not ThreadAbortException) - { - Log.Warn("OnDisconnect: Got error from " + bot + ": " + exception); - } - } - - restartScheduled = !exitOnFailure && Program.HasRestartPending(ConnectionAttempt); - } - finally - { - CompleteDisconnect(sendDisconnectPacket: false); - } - - if (!restartScheduled) - Program.HandleFailure(null, false, reason); - } - - private bool TryBeginDisconnect() - { - if (!connectionLifecycle.TryBeginDisconnect()) - return false; - - Volatile.Write(ref disconnectOwnerThreadId, Environment.CurrentManagedThreadId); - instance = null; - StopConsoleSession(); - return true; - } - - private void CompleteDisconnect(bool sendDisconnectPacket) - { - try - { - foreach (ChatBot bot in bots.Where(bot => bot.ScriptOwnerKey is not null).ToList()) - { - try - { - BotUnLoad(bot); - } - catch (Exception exception) when (exception is not ThreadAbortException) - { - Log.Warn(exception.ToString()); - } - } - - botsOnHold.Clear(); - botsOnHold.AddRange(bots.Where(bot => bot.ScriptOwnerKey is null)); - - if (timeoutdetector is not null) - { - CancellationTokenSource timeoutCancellation = timeoutdetector.Item2; - timeoutdetector = null; - RunDisconnectCleanup(timeoutCancellation.Cancel); - } - - if (handler is not null) - { - if (sendDisconnectPacket) - RunDisconnectCleanup(handler.Disconnect); - RunDisconnectCleanup(handler.Dispose); - } - - if (client is not null) - RunDisconnectCleanup(client.Close); - ClearTasks(); - RunDisconnectCleanup(() => SentrySdk.EndSession()); - } - finally - { - connectionLifecycle.CompleteDisconnect(); - Volatile.Write(ref disconnectOwnerThreadId, 0); - disconnectCompletion.TrySetResult(true); - } - } - - private void RunDisconnectCleanup(Action cleanup) - { - try - { - cleanup(); - } - catch (Exception exception) when (exception is not ThreadAbortException) - { - Log.Warn(exception.ToString()); - } - } - - #endregion - - #region Command prompt and internal MCC commands - - private void ConsoleReaderOnMessageReceived(object? sender, string e) - { - if (client.Client is null) - return; - - if (client.Client.Connected) - InvokeOnMainThreadAsync(() => HandleCommandPromptText(e)); - } - - internal void RouteConsoleInput(string input) - { - ConsoleReaderOnMessageReceived(this, input); - } - - /// - /// Get the console message handler delegate for re-attaching after TUI mode. - /// - public EventHandler GetConsoleMessageHandler() - { - return ConsoleReaderOnMessageReceived; - } - - /// - /// Allows the user to send chat messages, commands, and leave the server. - /// Process text from the MCC command prompt on the main thread. - /// - private void HandleCommandPromptText(string text) - { - if (ConsoleIO.BasicIO && text.Length > 0 && text[0] == (char)0x00) - { - //Process a request from the GUI - string[] command = text[1..].Split((char)0x00); - switch (command[0].ToLower()) - { - case "autocomplete": - int id = handler.AutoComplete(command[1]); - while (!ConsoleIO.AutoCompleteDone) { Thread.Sleep(100); } - if (command.Length > 1) { ConsoleIO.WriteLine((char)0x00 + "autocomplete" + (char)0x00 + ConsoleIO.AutoCompleteResult); } - else ConsoleIO.WriteLine((char)0x00 + "autocomplete" + (char)0x00); - break; - } - } - else - { - text = text.Trim(); - - if (text.Length > 1 - && Config.Main.Advanced.InternalCmdChar == MainConfigHelper.MainConfig.AdvancedConfig.InternalCmdCharType.none - && text[0] == '/') - { - SendText(text); - } - else if (text.Length > 2 - && Config.Main.Advanced.InternalCmdChar != MainConfigHelper.MainConfig.AdvancedConfig.InternalCmdCharType.none - && text[0] == Config.Main.Advanced.InternalCmdChar.ToChar() - && text[1] == '/') - { - SendText(text[1..]); - } - else if (text.Length > 0) - { - if (Config.Main.Advanced.InternalCmdChar == MainConfigHelper.MainConfig.AdvancedConfig.InternalCmdCharType.none - || text[0] == Config.Main.Advanced.InternalCmdChar.ToChar()) - { - CmdResult result = new(); - string command = Config.Main.Advanced.InternalCmdChar.ToChar() == ' ' ? text : text[1..]; - if (!PerformInternalCommand(Config.AppVar.ExpandVars(command), ref result, Settings.Config.AppVar.GetVariables()) && Config.Main.Advanced.InternalCmdChar.ToChar() == '/') - { - SendText(text); - } - else if (result.status != CmdResult.Status.NotRun && (result.status != CmdResult.Status.Done || !string.IsNullOrWhiteSpace(result.result))) - { - Log.Info(result); - } - } - else - { - SendText(text); - } - } - } - } - - /// - /// Perform an internal MCC command (not a server command, use SendText() instead for that!) - /// - /// The command - /// May contain a confirmation or error message after processing the command, or "" otherwise. - /// Local variables passed along with the command - /// TRUE if the command was indeed an internal MCC command - public bool PerformInternalCommand(string command, ref CmdResult result, Dictionary? localVars = null) - { - /* Process the provided command */ - ParseResults parse; - try - { - parse = dispatcher.Parse(command, result); - } - catch (Exception e) - { - Log.Debug("Parse fail: " + e.GetFullMessage()); - return false; - } - - try - { - dispatcher.Execute(parse); - - foreach (ChatBot bot in bots.ToArray()) - { - try - { - bot.OnInternalCommand(command, string.Join(" ", Command.GetArgs(command)), result); - } - catch (Exception e) - { - if (e is not ThreadAbortException) - { - Log.Warn(string.Format(Translations.icmd_error, bot.ToString() ?? string.Empty, e.ToString())); - } - else throw; //ThreadAbortException should not be caught - } - } - - return true; - } - catch (CommandSyntaxException e) - { - if (parse.Context.Nodes.Count == 0) - { - return false; - } - else - { - Log.Info("§e" + e.Message ?? e.StackTrace ?? "Incorrect argument."); - Log.Info(dispatcher.GetAllUsageString(parse.Context.Nodes[0].Node.Name, false)); - return true; - } - } - } - - public void LoadCommands() - { - /* Load commands from the 'Commands' namespace */ - - if (!commandsLoaded) - { - Type[] cmds_classes = Program.GetTypesInNamespace("MinecraftClient.Commands"); - foreach (Type type in cmds_classes) - { - if (type.IsSubclassOf(typeof(Command))) - { - try - { - Command cmd = (Command)Activator.CreateInstance(type)!; - cmd.RegisterCommand(dispatcher); - } - catch (Exception e) - { - Log.Warn(e.Message); - } - } - } - commandsLoaded = true; - } - } - - /// - /// Reload settings and bots - /// - /// Marks if bots need to be hard reloaded - public void ReloadSettings() - { - Program.ReloadSettings(true); - ReloadBots(); - } - - /// - /// Reload loaded bots (Only builtin bots) - /// - public void ReloadBots() - { - UnloadAllBots(); - RegisterBots(true); - - if (client.Client.Connected) - bots.ForEach(bot => bot.AfterGameJoined()); - } - - /// - /// Unload All Bots - /// - public void UnloadAllBots() - { - foreach (ChatBot bot in GetLoadedChatBots()) - BotUnLoad(bot); - } - - #endregion - - #region Thread-Invoke: Cross-thread method calls - - /// - /// Invoke a task on the main thread, wait for completion and retrieve return value. - /// - /// Task to run with any type or return value - /// Any result returned from task, result type is inferred from the task - /// bool result = InvokeOnMainThread(methodThatReturnsAbool); - /// bool result = InvokeOnMainThread(() => methodThatReturnsAbool(argument)); - /// int result = InvokeOnMainThread(() => { yourCode(); return 42; }); - /// Type of the return value - public T InvokeOnMainThread(Func task) - { - if (!InvokeRequired) - { - return task(); - } - else - { - TaskWithResult taskWithResult = new(task); - lock (threadTasksLock) - { - threadTasks.Enqueue(taskWithResult.ExecuteSynchronously); - } - return taskWithResult.WaitGetResult(); - } - } - - /// - /// Invoke a task on the main thread and wait for completion - /// - /// Task to run without return value - /// InvokeOnMainThread(methodThatReturnsNothing); - /// InvokeOnMainThread(() => methodThatReturnsNothing(argument)); - /// InvokeOnMainThread(() => { yourCode(); }); - public void InvokeOnMainThread(Action task) - { - InvokeOnMainThread(() => { task(); return true; }); - } - - /// - /// Queue work for the network main thread without blocking the calling thread. - /// - internal void InvokeOnMainThreadAsync(Action task) - { - ArgumentNullException.ThrowIfNull(task); - - if (!InvokeRequired) - { - task(); - return; - } - - lock (threadTasksLock) - threadTasks.Enqueue(task); - } - - /// - /// Clear all tasks - /// - public void ClearTasks() - { - lock (threadTasksLock) - { - threadTasks.Clear(); - } - } - - /// - /// Check if running on a different thread and InvokeOnMainThread is required - /// - /// True if calling thread is not the main thread - public bool InvokeRequired - { - get - { - int callingThreadId = Environment.CurrentManagedThreadId; - if (handler is not null) - { - return handler.GetNetMainThreadId() != callingThreadId; - } - else - { - // net read thread (main thread) not yet ready - return false; - } - } - } - - #endregion - - #region Management: Load/Unload ChatBots and Enable/Disable settings - - /// - /// Load a new bot - /// - public void BotLoad(ChatBot b, bool init = true) - { - if (InvokeRequired) - { - InvokeOnMainThread(() => BotLoad(b, init)); - return; - } - - b.SetHandler(this); - bots.Add(b); - if (init) - DispatchBotEvent(bot => bot.Initialize(), [b]); - if (CanSendMessage) - DispatchBotEvent(bot => bot.AfterGameJoined(), [b]); - } - - /// - /// Unload a bot - /// - public void BotUnLoad(ChatBot b) - { - if (InvokeRequired) - { - InvokeOnMainThread(() => BotUnLoad(b)); - return; - } - - b.OnUnload(); - b.UnregisterChatBotCommands(); - - bots.RemoveAll(item => ReferenceEquals(item, b)); - - // ToList is needed to avoid an InvalidOperationException from modfiying the list while it's being iterated upon. - var botRegistrations = registeredBotPluginChannels.Where(entry => entry.Value.Contains(b)).ToList(); - foreach (var entry in botRegistrations) - { - UnregisterPluginChannel(entry.Key, b); - } - } - - internal void UnloadBotsByScriptOwnerKey(string scriptOwnerKey) - { - if (InvokeRequired) - { - InvokeOnMainThread(() => UnloadBotsByScriptOwnerKey(scriptOwnerKey)); - return; - } - - foreach (ChatBot bot in GetLoadedChatBots()) - { - if (bot.ScriptOwnerKey == scriptOwnerKey) - BotUnLoad(bot); - } - } - - /// - /// Clear bots - /// - public void BotClear() - { - InvokeOnMainThread(bots.Clear); - } - - /// - /// Get Terrain and Movements status. - /// - public bool GetTerrainEnabled() - { - return terrainAndMovementsEnabled; - } - - /// - /// Get Inventory Handling Mode - /// - public bool GetInventoryEnabled() - { - return inventoryHandlingEnabled; - } - - /// - /// Get entity handling status - /// - /// - /// Entity Handling cannot be enabled in runtime (or after joining server) - public bool GetEntityHandlingEnabled() - { - return entityHandlingEnabled; - } - - /// - /// Enable or disable Terrain and Movements. - /// Please note that Enabling will be deferred until next relog, respawn or world change. - /// - /// Enabled - /// TRUE if the setting was applied immediately, FALSE if delayed. - public bool SetTerrainEnabled(bool enabled) - { - if (InvokeRequired) - return InvokeOnMainThread(() => SetTerrainEnabled(enabled)); - - if (enabled) - { - if (!terrainAndMovementsEnabled) - { - terrainAndMovementsRequested = true; - return false; - } - } - else - { - terrainAndMovementsEnabled = false; - terrainAndMovementsRequested = false; - locationReceived = false; - world.Clear(); - } - return true; - } - - /// - /// Enable or disable Inventories. - /// Please note that Enabling will be deferred until next relog. - /// - /// Enabled - /// TRUE if the setting was applied immediately, FALSE if delayed. - public bool SetInventoryEnabled(bool enabled) - { - if (InvokeRequired) - return InvokeOnMainThread(() => SetInventoryEnabled(enabled)); - - if (enabled) - { - if (!inventoryHandlingEnabled) - { - inventoryHandlingRequested = true; - return false; - } - } - else - { - inventoryHandlingEnabled = false; - inventoryHandlingRequested = false; - inventories.Clear(); - ClearUnlockedRecipes(); - } - return true; - } - - /// - /// Enable or disable Entity handling. - /// Please note that Enabling will be deferred until next relog. - /// - /// Enabled - /// TRUE if the setting was applied immediately, FALSE if delayed. - public bool SetEntityHandlingEnabled(bool enabled) - { - if (InvokeRequired) - return InvokeOnMainThread(() => SetEntityHandlingEnabled(enabled)); - - if (!enabled) - { - if (entityHandlingEnabled) - { - entityHandlingEnabled = false; - return true; - } - else - { - return false; - } - } - else - { - // Entity Handling cannot be enabled in runtime (or after joining server) - return false; - } - } - - /// - /// Enable or disable network packet event calling. - /// - /// - /// Enable this may increase memory usage. - /// - /// - public void SetNetworkPacketCaptureEnabled(bool enabled) - { - if (InvokeRequired) - { - InvokeOnMainThread(() => SetNetworkPacketCaptureEnabled(enabled)); - return; - } - - networkPacketCaptureEnabled = enabled; - } - - #endregion - - #region Getters: Retrieve data for use in other methods or ChatBots - - /// - /// Gets the horizontal direction of the takeoff. - /// - /// Return direction of view - public Direction GetHorizontalFacing() - { - return DirectionExtensions.FromRotation(GetYaw()); - } - - /// - /// Get max length for chat messages - /// - /// Max length, in characters - public int GetMaxChatMessageLength() - { - return handler.GetMaxChatMessageLength(); - } - - /// - /// Get a list of disallowed characters in chat - /// - /// - public static char[] GetDisallowedChatCharacters() - { - return [(char)167, (char)127]; // Minecraft color code and ASCII code DEL - } - - /// - /// Get all inventories. ID 0 is the player inventory. - /// - /// All inventories - public Dictionary GetInventories() - { - return inventories; - } - - /// - /// Get all Entities - /// - /// Ladt Enchantments - public EnchantmentData? GetLastEnchantments() - { - return lastEnchantment; - } - - /// - /// Get all unlocked recipe book recipe identifiers. - /// - /// Unlocked recipe identifiers sorted alphabetically - public RecipeBookRecipeEntry[] GetUnlockedRecipes() - { - lock (recipeBookLock) - { - return unlockedRecipes.Values.OrderBy(static recipe => recipe.CommandId, StringComparer.Ordinal).ToArray(); - } - } - - /// - /// Get all achievements/advancements known to the client. - /// - /// Snapshot of all achievements - public Achievement[] GetAchievements() - { - lock (achievementsLock) - { - return [.. achievements.Values]; - } - } - - /// - /// Get only completed achievements/advancements. - /// - /// Snapshot of completed achievements - public Achievement[] GetUnlockedAchievements() - { - lock (achievementsLock) - { - return achievements.Values.Where(static a => a.IsCompleted).ToArray(); - } - } - - /// - /// Get only incomplete achievements/advancements. - /// - /// Snapshot of locked achievements - public Achievement[] GetLockedAchievements() - { - lock (achievementsLock) - { - return achievements.Values.Where(static a => !a.IsCompleted).ToArray(); - } - } - - /// - /// Get all Entities - /// - /// All Entities - public Dictionary GetEntities() - { - return entities; - } - - /// - /// Get all players latency - /// - /// All players latency - public Dictionary GetPlayersLatency() - { - Dictionary playersLatency = new(); - foreach (var player in onlinePlayers) - playersLatency.Add(player.Value.Name, player.Value.Ping); - return playersLatency; - } - - /// - /// Get client player's inventory items - /// - /// Window ID of the requested inventory - /// Item Dictionary indexed by Slot ID (Check wiki.vg for slot ID) - public Container? GetInventory(int inventoryID) - { - if (InvokeRequired) - return InvokeOnMainThread(() => GetInventory(inventoryID)); - - if (inventories.TryGetValue(inventoryID, out Container? inv)) - return inv; - else - return null; - } - - /// - /// Get client player's inventory items - /// - /// Item Dictionary indexed by Slot ID (Check wiki.vg for slot ID) - public Container GetPlayerInventory() - { - return GetInventory(0)!; - } - - /// - /// Get the currently active inventory if it supports recipe book crafting. - /// - /// Active recipe book inventory, or null if the active inventory does not support recipe book crafting - public Container? GetActiveRecipeBookInventory() - { - if (InvokeRequired) - return InvokeOnMainThread(() => GetActiveRecipeBookInventory()); - - if (inventories.Count == 0) - return null; - - Container activeInventory = inventories.MaxBy(static pair => pair.Key).Value; - return SupportsRecipeBook(activeInventory.Type) ? activeInventory : null; - } - - /// - /// Get a set of online player names - /// - /// Online player names - public string[] GetOnlinePlayers() - { - lock (onlinePlayers) - { - string[] playerNames = new string[onlinePlayers.Count]; - int idx = 0; - foreach (var player in onlinePlayers) - playerNames[idx++] = player.Value.Name; - return playerNames; - } - } - - /// - /// Get a dictionary of online player names and their corresponding UUID - /// - /// Dictionay of online players, key is UUID, value is Player name - public Dictionary GetOnlinePlayersWithUUID() - { - Dictionary uuid2Player = new(); - lock (onlinePlayers) - { - foreach (Guid key in onlinePlayers.Keys) - { - uuid2Player.Add(key.ToString(), onlinePlayers[key].Name); - } - } - return uuid2Player; - } - - /// - /// Get player info from uuid - /// - /// Player's UUID - /// Player info - public PlayerInfo? GetPlayerInfo(Guid uuid) - { - if (onlinePlayers.TryGetValue(uuid, out PlayerInfo? player)) - return player; - else - return null; - } - - internal TabListSnapshot GetTabListSnapshot() - { - List<(Guid Uuid, string Name, string DisplayName, int Gamemode, int Ping, int TabListOrder, bool Listed)> players; - lock (onlinePlayers) - { - players = onlinePlayers - .Select(static pair => ( - pair.Key, - pair.Value.Name, - pair.Value.DisplayName ?? string.Empty, - pair.Value.Gamemode, - pair.Value.Ping, - pair.Value.TabListOrder, - pair.Value.Listed)) - .ToList(); - } - - Dictionary teamSnapshot; - lock (teams) - { - teamSnapshot = teams.ToDictionary( - static pair => pair.Key, - static pair => - { - var sourceTeam = pair.Value; - var copy = new PlayerTeam - { - Name = sourceTeam.Name, - DisplayName = sourceTeam.DisplayName, - AllowFriendlyFire = sourceTeam.AllowFriendlyFire, - SeeFriendlyInvisibles = sourceTeam.SeeFriendlyInvisibles, - NameTagVisibility = sourceTeam.NameTagVisibility, - CollisionRule = sourceTeam.CollisionRule, - Color = sourceTeam.Color, - Prefix = sourceTeam.Prefix, - Suffix = sourceTeam.Suffix - }; - - foreach (string member in sourceTeam.Members) - copy.Members.Add(member); - - return copy; - }, - StringComparer.OrdinalIgnoreCase); - } - - string header; - string footer; - lock (tabListHeaderFooterLock) - { - header = tabListHeader; - footer = tabListFooter; - } - - var entries = players - .Select(player => - { - PlayerTeam? team = teamSnapshot.Values.FirstOrDefault( - team => team.Members.Contains(player.Name)); - - string displayName = !string.IsNullOrWhiteSpace(player.DisplayName) - ? player.DisplayName - : TabListFormatter.FormatTeamMemberName(player.Name, team); - - return new TabListEntry( - player.Uuid, - player.Name, - displayName, - team?.Name ?? string.Empty, - !string.IsNullOrWhiteSpace(team?.DisplayName) ? team.DisplayName : team?.Name ?? string.Empty, - player.Gamemode, - player.Ping, - player.TabListOrder, - player.Listed); - }) - .ToList(); - - return new TabListSnapshot(header, footer, entries); - } - - public PlayerKeyPair? GetPlayerKeyPair() - { - return playerKeyPair; - } - - #endregion - - #region Action methods: Perform an action on the Server - - /// - /// Move to the specified location - /// - /// Location to reach - /// Allow possible but unsafe locations thay may hurt the player: lava, cactus... - /// Allow non-vanilla direct teleport instead of computing path, but may cause invalid moves and/or trigger anti-cheat plugins - /// If no valid path can be found, also allow locations within specified distance of destination - /// Do not get closer of destination than specified distance - /// How long to wait until the path is evaluated (default: 5 seconds) - /// When location is unreachable, computation will reach timeout, then optionally fallback to a close location within maxOffset - /// True if a path has been found - public bool MoveTo(Location goal, bool allowUnsafe = false, bool allowDirectTeleport = false, int maxOffset = 0, int minOffset = 0, TimeSpan? timeout = null) - { - lock (locationLock) - { - if (allowDirectTeleport) - { - // 1-step path to the desired location without checking anything - UpdateLocation(goal, goal); // Update yaw and pitch to look at next step - handler.SendLocationUpdate(goal, Movement.IsOnGround(world, goal), false, _yaw, _pitch); - return true; - } - else - { - pathTarget = null; - path = Movement.CalculatePath(world, location, goal, allowUnsafe, maxOffset, minOffset, timeout ?? TimeSpan.FromSeconds(5)); - return path is not null; - } - } - } - - /// - /// Send a chat message or command to the server - /// - /// Text to send to the server - public void SendText(string text) - { - if (String.IsNullOrEmpty(text)) - return; - - if (!CanSendMessage) - { - Log.Warn(Translations.mcc_send_text_not_connected); - return; - } - - int maxLength = handler.GetMaxChatMessageLength(); - - lock (chatQueue) - { - if (text.Length > maxLength) //Message is too long? - { - if (text[0] == '/') - { - //Send the first 100/256 chars of the command - text = text[..maxLength]; - chatQueue.Enqueue(text); - } - else - { - //Split the message into several messages - while (text.Length > maxLength) - { - chatQueue.Enqueue(text[..maxLength]); - text = text[maxLength..]; - } - chatQueue.Enqueue(text); - } - } - else - chatQueue.Enqueue(text); - - TrySendMessageToServer(); - } - } - - public bool SendCustomClickAction(string id, Dictionary? payload) - { - if (InvokeRequired) - return InvokeOnMainThread(() => SendCustomClickAction(id, payload)); - - return handler.SendCustomClickAction(id, payload); - } - - /// - /// Allow to respawn after death - /// - /// True if packet successfully sent - public bool SendRespawnPacket() - { - if (InvokeRequired) - return InvokeOnMainThread(SendRespawnPacket); - - return handler.SendRespawnPacket(); - } - - /// - /// Registers the given plugin channel for the given bot. - /// - /// The channel to register. - /// The bot to register the channel for. - public void RegisterPluginChannel(string channel, ChatBot bot) - { - if (InvokeRequired) - { - InvokeOnMainThread(() => RegisterPluginChannel(channel, bot)); - return; - } - - if (registeredBotPluginChannels.ContainsKey(channel)) - { - registeredBotPluginChannels[channel].Add(bot); - } - else - { - List bots = new() - { - bot - }; - registeredBotPluginChannels[channel] = bots; - SendPluginChannelMessage("REGISTER", Encoding.UTF8.GetBytes(channel), true); - } - } - - /// - /// Unregisters the given plugin channel for the given bot. - /// - /// The channel to unregister. - /// The bot to unregister the channel for. - public void UnregisterPluginChannel(string channel, ChatBot bot) - { - if (InvokeRequired) - { - InvokeOnMainThread(() => UnregisterPluginChannel(channel, bot)); - return; - } - - if (registeredBotPluginChannels.ContainsKey(channel)) - { - List registeredBots = registeredBotPluginChannels[channel]; - registeredBots.RemoveAll(item => object.ReferenceEquals(item, bot)); - if (registeredBots.Count == 0) - { - registeredBotPluginChannels.Remove(channel); - SendPluginChannelMessage("UNREGISTER", Encoding.UTF8.GetBytes(channel), true); - } - } - } - - /// - /// Sends a plugin channel packet to the server. See http://wiki.vg/Plugin_channel for more information - /// about plugin channels. - /// - /// The channel to send the packet on. - /// The payload for the packet. - /// Whether the packet should be sent even if the server or the client hasn't registered it yet. - /// Whether the packet was sent: true if it was sent, false if there was a connection error or it wasn't registered. - public bool SendPluginChannelMessage(string channel, byte[] data, bool sendEvenIfNotRegistered = false) - { - if (InvokeRequired) - return InvokeOnMainThread(() => SendPluginChannelMessage(channel, data, sendEvenIfNotRegistered)); - - if (!sendEvenIfNotRegistered) - { - if (!registeredBotPluginChannels.ContainsKey(channel)) - { - return false; - } - if (!registeredServerPluginChannels.Contains(channel)) - { - return false; - } - } - return handler.SendPluginChannelPacket(channel, data); - } - - public Item? GetHeldBook(BookHand hand = BookHand.Main) - { - if (InvokeRequired) - return InvokeOnMainThread(() => GetHeldBook(hand)); - - if (!inventoryHandlingEnabled || !inventories.TryGetValue(0, out Container? inventory)) - return null; - - int slot = hand == BookHand.Off ? 45 : 36 + CurrentSlot; - return inventory.Items.TryGetValue(slot, out Item? item) ? item : null; - } - - public bool TryGetHeldBookContent(out BookContent content, BookHand hand = BookHand.Main) - { - if (InvokeRequired) - { - (bool ok, BookContent value) = InvokeOnMainThread(() => - { - bool ok = TryGetHeldBookContent(out BookContent value, hand); - return (ok, value); - }); - content = value; - return ok; - } - - return BookContentHelper.TryRead(GetHeldBook(hand), out content); - } - - public bool SendBookEdit(IReadOnlyList pages, string? title = null) - { - if (InvokeRequired) - return InvokeOnMainThread(() => SendBookEdit(pages, title)); - - Item? currentBook = GetHeldBook(BookHand.Main); - if (!BookContentHelper.IsWritableBook(currentBook)) - return false; - - IReadOnlyList normalizedPages = BookContentHelper.NormalizePages(pages); - bool sent = handler.SendEditBook(currentBook!, normalizedPages, title, username, CurrentSlot); - if (sent && GetProtocolVersion() < Protocol18Handler.MC_1_17_Version) - SetHeldBook(BookHand.Main, CreateLocalBookResult(currentBook!, normalizedPages, title)); - - return sent; - } - - private Item CreateLocalBookResult(Item currentBook, IReadOnlyList pages, string? title) - { - return title is null - ? BookContentHelper.CreateWritablePayload(currentBook, pages) - : BookContentHelper.CreateWrittenPayload( - currentBook, - pages, - title, - username, - encodePagesAsJson: GetProtocolVersion() < Protocol18Handler.MC_1_9_Version); - } - - private void SetHeldBook(BookHand hand, Item item) - { - if (!inventoryHandlingEnabled || !inventories.TryGetValue(0, out Container? inventory)) - return; - - int slot = hand == BookHand.Off ? 45 : 36 + CurrentSlot; - inventory.Items[slot] = item; - } - - /// - /// Send the Entity Action packet with the Specified ID - /// - /// TRUE if the item was successfully used - public bool SendEntityAction(EntityActionType entityAction) - { - return InvokeOnMainThread(() => handler.SendEntityAction(playerEntityID, (int)entityAction)); - } - - /// - /// Use the item currently in the player's hand - /// - /// TRUE if the item was successfully used - public bool UseItemOnHand() - { - return InvokeOnMainThread(() => handler.SendUseItem(0, sequenceId++)); - } - - /// - /// Use the item currently in the player's left hand - /// - /// TRUE if the item was successfully used - public bool UseItemOnLeftHand() - { - return InvokeOnMainThread(() => handler.SendUseItem(1, sequenceId++)); - } - - /// - /// Try to merge a slot - /// - /// The container where the item is located - /// Items to be processed - /// The ID of the slot of the item to be processed - /// The slot that was put down - /// The ID of the slot being put down - /// Record changes - /// Whether to fully merge - private static bool TryMergeSlot(Container inventory, Item item, int slotId, Item curItem, int curId, List> changedSlots) - { - int spaceLeft = curItem.Type.StackCount() - curItem.Count; - if (curItem.Type == item!.Type && spaceLeft > 0) - { - // Put item on that stack - if (item.Count <= spaceLeft) - { - // Can fit into the stack - curItem.Count += item.Count; - item.Count = 0; - - changedSlots.Add(new Tuple((short)curId, curItem)); - changedSlots.Add(new Tuple((short)slotId, null)); - - inventory.Items.Remove(slotId); - return true; - } - else - { - item.Count -= spaceLeft; - curItem.Count += spaceLeft; - - changedSlots.Add(new Tuple((short)curId, curItem)); - } - } - return false; - } - - /// - /// Store items in a new slot - /// - /// The container where the item is located - /// Items to be processed - /// The ID of the slot of the item to be processed - /// ID of the new slot - /// Record changes - private static void StoreInNewSlot(Container inventory, Item item, int slotId, int newSlotId, List> changedSlots) - { - Item newItem = item.CloneWithCount(item.Count); - inventory.Items[newSlotId] = newItem; - inventory.Items.Remove(slotId); - - changedSlots.Add(new Tuple((short)newSlotId, newItem)); - changedSlots.Add(new Tuple((short)slotId, null)); - } - - private static bool IsServerManagedOutputSlot(Container inventory, int slotId) - { - return (inventory.Type, slotId) switch - { - (ContainerType.PlayerInventory, 0) => true, - (ContainerType.Crafting, 0) => true, - (ContainerType.Anvil, 2) => true, - (ContainerType.BlastFurnace, 2) => true, - (ContainerType.Furnace, 2) => true, - (ContainerType.Smoker, 2) => true, - (ContainerType.Grindstone, 2) => true, - (ContainerType.Cartography, 2) => true, - (ContainerType.Merchant, 2) => true, - (ContainerType.Stonecutter, 1) => true, - (ContainerType.Loom, 3) => true, - (ContainerType.SmightingTable, 3) => true, - _ => false - }; - } - - private static bool TryGetMirroredPlayerInventoryRange(Container inventory, out int firstWindowSlot, out int lastWindowSlot) - { - firstWindowSlot = -1; - lastWindowSlot = -1; - - if (inventory.Type is ContainerType.PlayerInventory or ContainerType.Unknown) - return false; - - const int mirroredPlayerInventorySlotCount = 36; - int slotCount = inventory.Type.SlotCount(); - if (slotCount <= mirroredPlayerInventorySlotCount) - return false; - - firstWindowSlot = slotCount - mirroredPlayerInventorySlotCount; - lastWindowSlot = slotCount - 1; - return true; - } - - private static bool AreSameInventorySlot(Item? left, Item? right) - { - if (left is null || left.IsEmpty) - return right is null || right.IsEmpty; - if (right is null || right.IsEmpty) - return false; - - return left.Type == right.Type - && left.Count == right.Count - && left.Data == right.Data - && ReferenceEquals(left.NBT, right.NBT) - && ReferenceEquals(left.Components, right.Components); - } - - private bool SetPlayerInventorySlot(int playerInventorySlot, Item? item) - { - if (!inventories.TryGetValue(0, out Container? playerInventory)) - return false; - - if (item is null || item.IsEmpty) - return playerInventory.Items.Remove(playerInventorySlot); - - Item itemClone = item.CloneWithCount(item.Count); - - playerInventory.Items.TryGetValue(playerInventorySlot, out Item? previousItem); - if (AreSameInventorySlot(previousItem, itemClone)) - return false; - - playerInventory.Items[playerInventorySlot] = itemClone; - - return true; - } - - private bool SyncPlayerInventorySlotsFromWindow(Container? inventory) - { - if (inventory is null) - return false; - - if (!inventoriesWithFullContents.Contains(inventory.ID)) - return false; - - if (!TryGetMirroredPlayerInventoryRange(inventory, out int firstWindowSlot, out int lastWindowSlot)) - return false; - - if (!inventories.TryGetValue(0, out Container? playerInventory)) - return false; - - const int firstPlayerInventorySlot = 9; - const int lastPlayerInventorySlot = firstPlayerInventorySlot + 36 - 1; - Dictionary mirroredItems = new(); - - for (int windowSlot = firstWindowSlot; windowSlot <= lastWindowSlot; windowSlot++) - { - if (!inventory.Items.TryGetValue(windowSlot, out Item? item) || item.IsEmpty) - continue; - - int playerInventorySlot = windowSlot - firstWindowSlot + firstPlayerInventorySlot; - mirroredItems[playerInventorySlot] = item.CloneWithCount(item.Count); - } - - bool changed = false; - for (int playerInventorySlot = firstPlayerInventorySlot; playerInventorySlot <= lastPlayerInventorySlot; playerInventorySlot++) - { - playerInventory.Items.TryGetValue(playerInventorySlot, out Item? previousItem); - mirroredItems.TryGetValue(playerInventorySlot, out Item? mirroredItem); - if (AreSameInventorySlot(previousItem, mirroredItem)) - continue; - - changed = true; - break; - } - - if (!changed) - return false; - - for (int playerInventorySlot = firstPlayerInventorySlot; playerInventorySlot <= lastPlayerInventorySlot; playerInventorySlot++) - playerInventory.Items.Remove(playerInventorySlot); - - foreach ((int playerInventorySlot, Item item) in mirroredItems) - playerInventory.Items[playerInventorySlot] = item; - - return changed; - } - - /// - /// Click a slot in the specified window - /// - /// TRUE if the slot was successfully clicked - public bool DoWindowAction(int windowId, int slotId, WindowActionType action) - { - if (InvokeRequired) - return InvokeOnMainThread(() => DoWindowAction(windowId, slotId, action)); - - Item? item = null; - if (inventories.ContainsKey(windowId) && inventories[windowId].Items.ContainsKey(slotId)) - item = inventories[windowId].Items[slotId]; - - List> changedSlots = new(); // List - - // Update our inventory base on action type - Container inventory = GetInventory(windowId)!; - Container playerInventory = GetInventory(0)!; - if (inventory is not null) - { - switch (action) - { - case WindowActionType.LeftClick: - // Check if cursor have item (slot -1) - if (playerInventory.Items.ContainsKey(-1)) - { - // Result slots are server-managed and cannot accept cursor items directly. - if (IsServerManagedOutputSlot(inventory, slotId)) - break; - - // Check target slot also have item? - if (inventory.Items.ContainsKey(slotId)) - { - // Check if both item are the same? - if (inventory.Items[slotId].Type == playerInventory.Items[-1].Type) - { - int maxCount = inventory.Items[slotId].Type.StackCount(); - // Check item stacking - if ((inventory.Items[slotId].Count + playerInventory.Items[-1].Count) <= maxCount) - { - // Put cursor item to target - inventory.Items[slotId].Count += playerInventory.Items[-1].Count; - playerInventory.Items.Remove(-1); - } - else - { - // Leave some item on cursor - playerInventory.Items[-1].Count -= (maxCount - inventory.Items[slotId].Count); - inventory.Items[slotId].Count = maxCount; - } - } - else - { - // Swap two items - (inventory.Items[slotId], playerInventory.Items[-1]) = (playerInventory.Items[-1], inventory.Items[slotId]); - } - } - else - { - // Put cursor item to target - inventory.Items[slotId] = playerInventory.Items[-1]; - playerInventory.Items.Remove(-1); - } - - // Clean up cursor item if count reached zero - if (playerInventory.Items.TryGetValue(-1, out Item? cursorAfterLeft) && cursorAfterLeft.IsEmpty) - playerInventory.Items.Remove(-1); - - if (inventory.Items.ContainsKey(slotId)) - changedSlots.Add(new Tuple((short)slotId, inventory.Items[slotId])); - else - changedSlots.Add(new Tuple((short)slotId, null)); - } - else - { - // Check target slot have item? - if (inventory.Items.ContainsKey(slotId)) - { - if (IsServerManagedOutputSlot(inventory, slotId)) - break; - - // Put target slot item to cursor - playerInventory.Items[-1] = inventory.Items[slotId]; - inventory.Items.Remove(slotId); - - changedSlots.Add(new Tuple((short)slotId, null)); - } - } - break; - case WindowActionType.RightClick: - // Check if cursor have item (slot -1) - if (playerInventory.Items.ContainsKey(-1)) - { - if (IsServerManagedOutputSlot(inventory, slotId)) - break; - - // Check target slot have item? - if (inventory.Items.ContainsKey(slotId)) - { - // Check if both item are the same? - if (inventory.Items[slotId].Type == playerInventory.Items[-1].Type) - { - // Check item stacking - if (inventory.Items[slotId].Count < inventory.Items[slotId].Type.StackCount()) - { - // Drop 1 item count from cursor - playerInventory.Items[-1].Count--; - inventory.Items[slotId].Count++; - } - } - else - { - // Swap two items - (inventory.Items[slotId], playerInventory.Items[-1]) = (playerInventory.Items[-1], inventory.Items[slotId]); - } - } - else - { - // Drop 1 item count from cursor - Item itemTmp = playerInventory.Items[-1]; - Item itemClone = itemTmp.CloneWithCount(1); - inventory.Items[slotId] = itemClone; - playerInventory.Items[-1].Count--; - } - - // Clean up cursor item if count reached zero - if (playerInventory.Items.TryGetValue(-1, out Item? cursorItem) && cursorItem.IsEmpty) - playerInventory.Items.Remove(-1); - } - else - { - // Check target slot have item? - if (inventory.Items.ContainsKey(slotId)) - { - if (IsServerManagedOutputSlot(inventory, slotId)) - { - break; - } - if (inventory.Items[slotId].Count == 1) - { - // Only 1 item count. Put it to cursor - playerInventory.Items[-1] = inventory.Items[slotId]; - inventory.Items.Remove(slotId); - } - else - { - // Take half of the item stack to cursor - if (inventory.Items[slotId].Count % 2 == 0) - { - // Can be evenly divided - Item itemTmp = inventory.Items[slotId]; - playerInventory.Items[-1] = itemTmp.CloneWithCount(itemTmp.Count / 2); - inventory.Items[slotId].Count = itemTmp.Count / 2; - } - else - { - // Cannot be evenly divided. item count on cursor is always larger than item on inventory - Item itemTmp = inventory.Items[slotId]; - playerInventory.Items[-1] = itemTmp.CloneWithCount((itemTmp.Count + 1) / 2); - inventory.Items[slotId].Count = (itemTmp.Count - 1) / 2; - } - } - } - } - if (inventory.Items.ContainsKey(slotId)) - changedSlots.Add(new Tuple((short)slotId, inventory.Items[slotId])); - else - changedSlots.Add(new Tuple((short)slotId, null)); - break; - case WindowActionType.ShiftClick: - case WindowActionType.ShiftRightClick: - if (IsServerManagedOutputSlot(inventory, slotId)) - break; - if (item is not null) - { - /* Target slot have item */ - - bool lower2upper = false, upper2backpack = false, backpack2hotbar = false; // mutual exclusion - bool hotbarFirst = true; // Used when upper2backpack = true - int upperStartSlot = 9; - int upperEndSlot = 35; - int lowerStartSlot = 36; - - switch (inventory.Type) - { - case ContainerType.PlayerInventory: - if (slotId >= 0 && slotId <= 8 || slotId == 45) - { - if (slotId != 0) - hotbarFirst = false; - upper2backpack = true; - lowerStartSlot = 9; - } - else if (item is not null && false /* Check if wearable */) - { - lower2upper = true; - // upperStartSlot = ?; - // upperEndSlot = ?; - // Todo: Distinguish the type of equipment - } - else - { - if (slotId >= 9 && slotId <= 35) - { - backpack2hotbar = true; - lowerStartSlot = 36; - } - else - { - lower2upper = true; - upperStartSlot = 9; - upperEndSlot = 35; - } - } - break; - case ContainerType.Generic_9x1: - if (slotId >= 0 && slotId <= 8) - { - upper2backpack = true; - lowerStartSlot = 9; - } - else - { - lower2upper = true; - upperStartSlot = 0; - upperEndSlot = 8; - } - break; - case ContainerType.Generic_9x2: - if (slotId >= 0 && slotId <= 17) - { - upper2backpack = true; - lowerStartSlot = 18; - } - else - { - lower2upper = true; - upperStartSlot = 0; - upperEndSlot = 17; - } - break; - case ContainerType.Generic_9x3: - case ContainerType.ShulkerBox: - if (slotId >= 0 && slotId <= 26) - { - upper2backpack = true; - lowerStartSlot = 27; - } - else - { - lower2upper = true; - upperStartSlot = 0; - upperEndSlot = 26; - } - break; - case ContainerType.Generic_9x4: - if (slotId >= 0 && slotId <= 35) - { - upper2backpack = true; - lowerStartSlot = 36; - } - else - { - lower2upper = true; - upperStartSlot = 0; - upperEndSlot = 35; - } - break; - case ContainerType.Generic_9x5: - if (slotId >= 0 && slotId <= 44) - { - upper2backpack = true; - lowerStartSlot = 45; - } - else - { - lower2upper = true; - upperStartSlot = 0; - upperEndSlot = 44; - } - break; - case ContainerType.Generic_9x6: - if (slotId >= 0 && slotId <= 53) - { - upper2backpack = true; - lowerStartSlot = 54; - } - else - { - lower2upper = true; - upperStartSlot = 0; - upperEndSlot = 53; - } - break; - case ContainerType.Generic_3x3: - if (slotId >= 0 && slotId <= 8) - { - upper2backpack = true; - lowerStartSlot = 9; - } - else - { - lower2upper = true; - upperStartSlot = 0; - upperEndSlot = 8; - } - break; - case ContainerType.Anvil: - if (slotId >= 0 && slotId <= 2) - { - if (slotId >= 0 && slotId <= 1) - hotbarFirst = false; - upper2backpack = true; - lowerStartSlot = 3; - } - else - { - lower2upper = true; - upperStartSlot = 0; - upperEndSlot = 1; - } - break; - case ContainerType.Beacon: - if (slotId == 0) - { - hotbarFirst = false; - upper2backpack = true; - lowerStartSlot = 1; - } - else if (item is not null && item.Count == 1 && (item.Type == ItemType.NetheriteIngot || - item.Type == ItemType.Emerald || item.Type == ItemType.Diamond || item.Type == ItemType.GoldIngot || - item.Type == ItemType.IronIngot) && !inventory.Items.ContainsKey(0)) - { - lower2upper = true; - upperStartSlot = 0; - upperEndSlot = 0; - } - else - { - if (slotId >= 1 && slotId <= 27) - { - backpack2hotbar = true; - lowerStartSlot = 28; - } - else - { - lower2upper = true; - upperStartSlot = 1; - upperEndSlot = 27; - } - } - break; - case ContainerType.BlastFurnace: - case ContainerType.Furnace: - case ContainerType.Smoker: - if (slotId >= 0 && slotId <= 2) - { - if (slotId >= 0 && slotId <= 1) - hotbarFirst = false; - upper2backpack = true; - lowerStartSlot = 3; - } - else if (item is not null && false /* Check if it can be burned */) - { - lower2upper = true; - upperStartSlot = 0; - upperEndSlot = 0; - } - else - { - if (slotId >= 3 && slotId <= 29) - { - backpack2hotbar = true; - lowerStartSlot = 30; - } - else - { - lower2upper = true; - upperStartSlot = 3; - upperEndSlot = 29; - } - } - break; - case ContainerType.BrewingStand: - if (slotId >= 0 && slotId <= 3) - { - upper2backpack = true; - lowerStartSlot = 5; - } - else if (item is not null && item.Type == ItemType.BlazePowder) - { - lower2upper = true; - if (!inventory.Items.ContainsKey(4) || inventory.Items[4].Count < 64) - upperStartSlot = upperEndSlot = 4; - else - upperStartSlot = upperEndSlot = 3; - } - else if (item is not null && false /* Check if it can be used for alchemy */) - { - lower2upper = true; - upperStartSlot = upperEndSlot = 3; - } - else if (item is not null && (item.Type == ItemType.Potion || item.Type == ItemType.GlassBottle)) - { - lower2upper = true; - upperStartSlot = 0; - upperEndSlot = 2; - } - else - { - if (slotId >= 5 && slotId <= 31) - { - backpack2hotbar = true; - lowerStartSlot = 32; - } - else - { - lower2upper = true; - upperStartSlot = 5; - upperEndSlot = 31; - } - } - break; - case ContainerType.Crafting: - if (slotId >= 0 && slotId <= 9) - { - if (slotId >= 1 && slotId <= 9) - hotbarFirst = false; - upper2backpack = true; - lowerStartSlot = 10; - } - else - { - lower2upper = true; - upperStartSlot = 1; - upperEndSlot = 9; - } - break; - case ContainerType.Enchantment: - if (slotId >= 0 && slotId <= 1) - { - upper2backpack = true; - lowerStartSlot = 5; - } - else if (item is not null && item.Type == ItemType.LapisLazuli) - { - lower2upper = true; - upperStartSlot = upperEndSlot = 1; - } - else - { - lower2upper = true; - upperStartSlot = 0; - upperEndSlot = 0; - } - break; - case ContainerType.Grindstone: - if (slotId >= 0 && slotId <= 2) - { - if (slotId >= 0 && slotId <= 1) - hotbarFirst = false; - upper2backpack = true; - lowerStartSlot = 3; - } - else if (item is not null && false /* Check */) - { - lower2upper = true; - upperStartSlot = 0; - upperEndSlot = 1; - } - else - { - lower2upper = true; - upperStartSlot = 0; - upperEndSlot = 1; - } - break; - case ContainerType.Hopper: - if (slotId >= 0 && slotId <= 4) - { - upper2backpack = true; - lowerStartSlot = 5; - } - else - { - lower2upper = true; - upperStartSlot = 0; - upperEndSlot = 4; - } - break; - case ContainerType.Lectern: - return false; - // break; - case ContainerType.Loom: - if (slotId >= 0 && slotId <= 3) - { - if (slotId >= 0 && slotId <= 5) - hotbarFirst = false; - upper2backpack = true; - lowerStartSlot = 4; - } - else if (item is not null && false /* Check for availability for staining */) - { - lower2upper = true; - // upperStartSlot = ?; - // upperEndSlot = ?; - } - else - { - if (slotId >= 4 && slotId <= 30) - { - backpack2hotbar = true; - lowerStartSlot = 31; - } - else - { - lower2upper = true; - upperStartSlot = 4; - upperEndSlot = 30; - } - } - break; - case ContainerType.Merchant: - if (slotId >= 0 && slotId <= 2) - { - if (slotId >= 0 && slotId <= 1) - hotbarFirst = false; - upper2backpack = true; - lowerStartSlot = 3; - } - else if (item is not null && false /* Check if it is available for trading */) - { - lower2upper = true; - upperStartSlot = 0; - upperEndSlot = 1; - } - else - { - if (slotId >= 3 && slotId <= 29) - { - backpack2hotbar = true; - lowerStartSlot = 30; - } - else - { - lower2upper = true; - upperStartSlot = 3; - upperEndSlot = 29; - } - } - break; - case ContainerType.Cartography: - if (slotId >= 0 && slotId <= 2) - { - if (slotId >= 0 && slotId <= 1) - hotbarFirst = false; - upper2backpack = true; - lowerStartSlot = 3; - } - else if (item is not null && item.Type == ItemType.FilledMap) - { - lower2upper = true; - upperStartSlot = upperEndSlot = 0; - } - else if (item is not null && item.Type == ItemType.Map) - { - lower2upper = true; - upperStartSlot = upperEndSlot = 1; - } - else - { - if (slotId >= 3 && slotId <= 29) - { - backpack2hotbar = true; - lowerStartSlot = 30; - } - else - { - lower2upper = true; - upperStartSlot = 3; - upperEndSlot = 29; - } - } - break; - case ContainerType.Stonecutter: - if (slotId >= 0 && slotId <= 1) - { - if (slotId == 0) - hotbarFirst = false; - upper2backpack = true; - lowerStartSlot = 2; - } - else if (item is not null && false /* Check if it is available for stone cutteing */) - { - lower2upper = true; - upperStartSlot = 0; - upperEndSlot = 0; - } - else - { - if (slotId >= 2 && slotId <= 28) - { - backpack2hotbar = true; - lowerStartSlot = 29; - } - else - { - lower2upper = true; - upperStartSlot = 2; - upperEndSlot = 28; - } - } - break; - // TODO: Define more container type here - default: - return false; - } - - // Cursor have item or not doesn't matter - // If hotbar already have same item, will put on it first until every stack are full - // If no more same item , will put on the first empty slot (smaller slot id) - // If inventory full, item will not move - int itemCount = inventory.Items[slotId].Count; - if (lower2upper) - { - int firstEmptySlot = -1; - for (int i = upperStartSlot; i <= upperEndSlot; ++i) - { - if (inventory.Items.TryGetValue(i, out Item? curItem)) - { - if (TryMergeSlot(inventory, item!, slotId, curItem, i, changedSlots)) - break; - } - else if (firstEmptySlot == -1) - firstEmptySlot = i; - } - if (item!.Count > 0) - { - if (firstEmptySlot != -1) - StoreInNewSlot(inventory, item, slotId, firstEmptySlot, changedSlots); - else if (item.Count != itemCount) - changedSlots.Add(new Tuple((short)slotId, inventory.Items[slotId])); - } - } - else if (upper2backpack) - { - int hotbarEnd = lowerStartSlot + 4 * 9 - 1; - if (hotbarFirst) - { - int lastEmptySlot = -1; - for (int i = hotbarEnd; i >= lowerStartSlot; --i) - { - if (inventory.Items.TryGetValue(i, out Item? curItem)) - { - if (TryMergeSlot(inventory, item!, slotId, curItem, i, changedSlots)) - break; - } - else if (lastEmptySlot == -1) - lastEmptySlot = i; - } - if (item!.Count > 0) - { - if (lastEmptySlot != -1) - StoreInNewSlot(inventory, item, slotId, lastEmptySlot, changedSlots); - else if (item.Count != itemCount) - changedSlots.Add(new Tuple((short)slotId, inventory.Items[slotId])); - } - } - else - { - int firstEmptySlot = -1; - for (int i = lowerStartSlot; i <= hotbarEnd; ++i) - { - if (inventory.Items.TryGetValue(i, out Item? curItem)) - { - if (TryMergeSlot(inventory, item!, slotId, curItem, i, changedSlots)) - break; - } - else if (firstEmptySlot == -1) - firstEmptySlot = i; - } - if (item!.Count > 0) - { - if (firstEmptySlot != -1) - StoreInNewSlot(inventory, item, slotId, firstEmptySlot, changedSlots); - else if (item.Count != itemCount) - changedSlots.Add(new Tuple((short)slotId, inventory.Items[slotId])); - } - } - } - else if (backpack2hotbar) - { - int hotbarEnd = lowerStartSlot + 1 * 9 - 1; - - int firstEmptySlot = -1; - for (int i = lowerStartSlot; i <= hotbarEnd; ++i) - { - if (inventory.Items.TryGetValue(i, out Item? curItem)) - { - if (TryMergeSlot(inventory, item!, slotId, curItem, i, changedSlots)) - break; - } - else if (firstEmptySlot == -1) - firstEmptySlot = i; - } - if (item!.Count > 0) - { - if (firstEmptySlot != -1) - StoreInNewSlot(inventory, item, slotId, firstEmptySlot, changedSlots); - else if (item.Count != itemCount) - changedSlots.Add(new Tuple((short)slotId, inventory.Items[slotId])); - } - } - if (item!.Count <= 0 && inventory.Items.ContainsKey(slotId)) - { - inventory.Items.Remove(slotId); - changedSlots.Add(new Tuple((short)slotId, null)); - } - } - break; - case WindowActionType.DropItem: - if (inventory.Items.ContainsKey(slotId)) - { - inventory.Items[slotId].Count--; - changedSlots.Add(new Tuple((short)slotId, inventory.Items[slotId])); - } - - if (inventory.Items[slotId].Count <= 0) - { - inventory.Items.Remove(slotId); - changedSlots.Add(new Tuple((short)slotId, null)); - } - - break; - case WindowActionType.DropItemStack: - inventory.Items.Remove(slotId); - changedSlots.Add(new Tuple((short)slotId, null)); - break; - } - } - - SyncPlayerInventorySlotsFromWindow(inventory); - - return handler.SendWindowAction(windowId, slotId, action, item, changedSlots, inventories[windowId].StateID); - } - - /// - /// Give Creative Mode items into regular/survival Player Inventory - /// - /// (obviously) requires to be in creative mode - /// Destination inventory slot - /// Item type - /// Item count - /// Item NBT - /// TRUE if item given successfully - public bool DoCreativeGive(int slot, ItemType itemType, int count, Dictionary? nbt = null) - { - return InvokeOnMainThread(() => - { - if (!handler.SendCreativeInventoryAction(slot, itemType, count, nbt)) - return false; - - if (slot is >= 1 and <= 45) - SetPlayerInventorySlot(slot, new Item(itemType, count, nbt)); - - return true; - }); - } - - /// - /// Plays animation (Player arm swing) - /// - /// 0 for left arm, 1 for right arm - /// TRUE if animation successfully done - public bool DoAnimation(int animation) - { - return InvokeOnMainThread(() => handler.SendAnimation(animation, playerEntityID)); - } - - /// - /// Close the specified inventory window - /// - /// Window ID - /// TRUE if the window was successfully closed - /// Sending close window for inventory 0 can cause server to update our inventory if there are any item in the crafting area - public bool CloseInventory(int windowId) - { - if (InvokeRequired) - return InvokeOnMainThread(() => CloseInventory(windowId)); - - if (inventories.ContainsKey(windowId)) - { - if (windowId != 0) - { - inventories.Remove(windowId); - inventoriesWithFullContents.Remove(windowId); - } - bool result = handler.SendCloseWindow(windowId); - DispatchBotEvent(bot => bot.OnInventoryClose(windowId)); - return result; - } - return false; - } - - /// - /// Clean all inventory - /// - /// TRUE if the uccessfully clear - public bool ClearInventories() - { - if (!inventoryHandlingEnabled) - return false; - - if (InvokeRequired) - return InvokeOnMainThread(ClearInventories); - - inventories.Clear(); - inventoriesWithFullContents.Clear(); - inventories[0] = new Container(0, ContainerType.PlayerInventory, "Player Inventory"); - ClearUnlockedRecipes(); - return true; - } - - /// - /// Interact with an entity - /// - /// - /// Type of interaction (interact, attack...) - /// Hand.MainHand or Hand.OffHand - /// TRUE if interaction succeeded - public bool InteractEntity(int entityID, InteractType type, Hand hand = Hand.MainHand) - { - if (InvokeRequired) - return InvokeOnMainThread(() => InteractEntity(entityID, type, hand)); - - if (entities.ContainsKey(entityID)) - { - return type switch - { - InteractType.Interact => handler.SendInteractEntity(entityID, (int)type, (int)hand), - InteractType.InteractAt => handler.SendInteractEntity( - EntityID: entityID, - type: (int)type, - X: (float)entities[entityID].Location.X, - Y: (float)entities[entityID].Location.Y, - Z: (float)entities[entityID].Location.Z, - hand: (int)hand), - _ => handler.SendInteractEntity(entityID, (int)type), - }; - } - - return false; - } - - /// - /// Place the block at hand in the Minecraft world - /// - /// Location to place block to - /// Block face (e.g. Direction.Down when clicking on the block below to place this block) - /// Also look at the block before interacting - /// TRUE if successfully placed - public bool PlaceBlock(Location location, Direction blockFace, Hand hand = Hand.MainHand, bool lookAtBlock = false) - { - return InvokeOnMainThread(() => - { - if (lookAtBlock) - { - UpdateLocation(GetCurrentLocation(), location.ToCenter()); - handler.SendLocationUpdate(GetCurrentLocation(), Movement.IsOnGround(world, GetCurrentLocation()), false, _yaw, _pitch); - } - return handler.SendPlayerBlockPlacement((int)hand, location, blockFace, sequenceId++); - }); - } - - - /// - /// Attempt to dig a block at the specified location - /// - /// Location of block to dig - /// Also perform the "arm swing" animation - /// Also look at the block before digging - public bool DigBlock(Location location, Direction blockFace, bool swingArms = true, bool lookAtBlock = true, - double duration = 0, MiningCalculator.MiningOptions? miningOptions = null) - { - // TODO select best face from current player location - - if (!GetTerrainEnabled()) - return false; - - if (InvokeRequired) - return InvokeOnMainThread(() => DigBlock(location, blockFace, swingArms, lookAtBlock, duration, - miningOptions)); - - lock (DigLock) - { - if (RemainingDiggingTime > 0 && LastDigPosition is not null) - { - handler.SendPlayerDigging(1, LastDigPosition.Item1, LastDigPosition.Item2, sequenceId++); - Log.Info(string.Format(Translations.cmd_dig_cancel, LastDigPosition.Item1)); - } - - // Look at block before attempting to break it - if (lookAtBlock) - UpdateLocation(GetCurrentLocation(), location); - - // Auto-compute dig duration for survival/adventure mode when not explicitly supplied - bool autoComputedDuration = false; - if (duration <= 0 && protocolversion >= Protocol18Handler.MC_1_8_Version - && gamemode is 0 or 2) // Survival or Adventure - { - autoComputedDuration = true; - duration = ComputeAutoDigDuration(location, miningOptions); - } - - // Send dig start and dig end, will need to wait for server response to know dig result - // See https://wiki.vg/How_to_Write_a_Client#Digging for more details - bool result = handler.SendPlayerDigging(0, location, blockFace, sequenceId++) - && (!swingArms || DoAnimation((int)Hand.MainHand)); - - if (autoComputedDuration && duration <= 0) - return result; - - if (duration <= 0) - result &= handler.SendPlayerDigging(2, location, blockFace, sequenceId++); - else - { - LastDigPosition = new(location, blockFace); - RemainingDiggingTime = Settings.DoubleToTick(duration); - } - - return result; - } - } - - /// - /// Compute the automatic dig duration in seconds for a block, based on held tool, - /// enchantments, effects, attributes, and player state. - /// Returns 0 for instant-break blocks. - /// - private double ComputeAutoDigDuration(Location location, MiningCalculator.MiningOptions? miningOptions = null) - { - try - { - Block block = world.GetBlock(location); - Material blockMaterial = block.Type; - - if (blockMaterial == Material.Air) - return 0; - - // Get held item from player inventory - Item? heldItem = null; - Item? helmetItem = null; - if (inventories.TryGetValue(0, out var playerInv)) - { - int hotbarSlot = 36 + CurrentSlot; // Hotbar slots are 36-44 - playerInv.Items.TryGetValue(hotbarSlot, out heldItem); - playerInv.Items.TryGetValue(5, out helmetItem); // Slot 5 = helmet - } - - int ticks = MiningCalculator.ComputeDigTicks( - blockMaterial, - heldItem, - helmetItem, - playerEffects, - playerAttributes, - playerPhysics.InWater, - playerPhysics.OnGround, - protocolversion, - miningOptions); - - if (ticks < 0) - return -1; - - if (ticks == 0) - return 0; - - return (double)ticks / Settings.ClientTicksPerSecond; - } - catch - { - return ComputeConservativeAutoDigDuration(location); - } - } - - private double ComputeConservativeAutoDigDuration(Location location) - { - try - { - Block block = world.GetBlock(location); - if (block.Type == Material.Air) - return 0; - - int ticks = MiningCalculator.ComputeDigTicks( - blockMaterial: block.Type, - heldItem: null, - helmetItem: null, - effects: new(), - playerAttributes: new(), - isUnderwater: playerPhysics.InWater, - isOnGround: playerPhysics.OnGround, - protocolVersion: protocolversion); - - if (ticks < 0) - return -1; - - return ticks == 0 ? 1.0 : (double)ticks / Settings.ClientTicksPerSecond; - } - catch - { - return 1.0; - } - } - - /// - /// Change active slot in the player inventory - /// - /// Slot to activate (0 to 8) - /// TRUE if the slot was changed - public bool ChangeSlot(short slot) - { - if (slot < 0 || slot > 8) - return false; - - if (InvokeRequired) - return InvokeOnMainThread(() => ChangeSlot(slot)); - - CurrentSlot = Convert.ToByte(slot); - return handler.SendHeldItemChange(slot); - } - - /// - /// Drop the currently selected hotbar item like a real player pressing Q or Ctrl+Q. - /// - /// TRUE to drop the whole stack, FALSE to drop one item - /// TRUE if the packet was sent - public bool DropSelectedItem(bool dropEntireStack) - { - if (InvokeRequired) - return InvokeOnMainThread(() => DropSelectedItem(dropEntireStack)); - - Location actionLocation = GetCurrentLocation().ToFloor(); - int status = dropEntireStack ? 3 : 4; - bool sent = handler.SendPlayerDigging(status, actionLocation, Direction.Down, sequenceId++); - if (sent) - ApplySelectedItemDropPrediction(dropEntireStack); - - return sent; - } - - private void ApplySelectedItemDropPrediction(bool dropEntireStack) - { - if (!inventories.TryGetValue(0, out Container? playerInventory)) - return; - - int selectedSlotId = CurrentSlot + 36; - if (!playerInventory.Items.TryGetValue(selectedSlotId, out Item? heldItem) || heldItem.IsEmpty) - return; - - if (dropEntireStack || heldItem.Count <= 1) - playerInventory.Items.Remove(selectedSlotId); - else heldItem.Count--; - - DispatchBotEvent(bot => bot.OnInventoryUpdate(0)); - } - - /// - /// Update sign text - /// - /// sign location - /// text one - /// text two - /// text three - /// text1 four - public bool UpdateSign(Location location, string line1, string line2, string line3, string line4) - { - // TODO Open sign editor first https://wiki.vg/Protocol#Open_Sign_Editor - return InvokeOnMainThread(() => handler.SendUpdateSign(location, line1, line2, line3, line4)); - } - - /// - /// Select villager trade - /// - /// The slot of the trade, starts at 0. - public bool SelectTrade(int selectedSlot) - { - return InvokeOnMainThread(() => handler.SelectTrade(selectedSlot)); - } - - /// - /// Update command block - /// - /// command block location - /// command - /// command block mode - /// command block flags - public bool UpdateCommandBlock(Location location, string command, CommandBlockMode mode, CommandBlockFlags flags) - { - return InvokeOnMainThread(() => handler.UpdateCommandBlock(location, command, mode, flags)); - } - - /// - /// Teleport to player in spectator mode - /// - /// Player to teleport to - /// Teleporting to other entityies is NOT implemented yet - public bool Spectate(Entity entity) - { - if (entity.Type == EntityType.Player) - { - return SpectateByUUID(entity.UUID); - } - else - { - return false; - } - } - - /// - /// Teleport to player/entity in spectator mode - /// - /// UUID of player/entity to teleport to - public bool SpectateByUUID(Guid UUID) - { - if (GetGamemode() == 3) - { - if (InvokeRequired) - return InvokeOnMainThread(() => SpectateByUUID(UUID)); - return handler.SendSpectate(UUID); - } - else - { - return false; - } - } - - /// - /// Send the server a command to type in the item name in the Anvil inventory when it's open. - /// - /// The new item name - public bool SendRenameItem(string itemName) - { - if (inventories.Count == 0) - return false; - - if (inventories.Values.ToList().Last().Type != ContainerType.Anvil) - return false; - - return handler.SendRenameItem(itemName); - } - - /// - /// Send a recipe book craft request for the currently active crafting inventory. - /// - /// Recipe identifier to craft - /// True to craft as many items as possible - /// True if the packet was sent - public bool SendPlaceRecipe(string recipeId, bool makeAll) - { - if (InvokeRequired) - return InvokeOnMainThread(() => SendPlaceRecipe(recipeId, makeAll)); - - if (protocolversion < Protocol18Handler.MC_1_13_Version) - return false; - - Container? activeInventory = GetActiveRecipeBookInventory(); - if (activeInventory is null) - return false; - - string normalizedRecipeId = NormalizeRecipeArgument(recipeId, protocolversion); - if (normalizedRecipeId.Length == 0) - return false; - - return handler.SendPlaceRecipe(activeInventory.ID, normalizedRecipeId, makeAll); - } - #endregion - - #region Event handlers: An event occurs on the Server - - /// - /// Dispatch a ChatBot event with automatic exception handling - /// - /// - /// Example for calling SomeEvent() on all bots at once: - /// DispatchBotEvent(bot => bot.SomeEvent()); - /// - /// Action to execute on each bot - /// Only fire the event for the specified bot list (default: all bots) - private void DispatchBotEvent(Action action, IEnumerable? botList = null) - { - ChatBot[] selectedBots; - - if (botList is not null) - { - selectedBots = botList.ToArray(); - } - else - { - selectedBots = bots.ToArray(); - } - - foreach (ChatBot bot in selectedBots) - { - try - { - action(bot); - } - catch (Exception e) - { - if (e is not ThreadAbortException) - { - //Retrieve parent method name to determine which event caused the exception - System.Diagnostics.StackFrame frame = new(1); - System.Reflection.MethodBase method = frame.GetMethod()!; - string parentMethodName = method.Name; - - //Display a meaningful error message to help debugging the ChatBot - Log.Error(parentMethodName + ": Got error from " + bot.ToString() + ": " + e.ToString()); - } - else throw; //ThreadAbortException should not be caught here as in can happen when disconnecting from server - } - } - } - - /// - /// Called when a network packet received or sent - /// - /// - /// Only called if is set to True - /// - /// Packet ID - /// A copy of Packet Data - /// The packet is login phase or playing phase - /// The packet is received from server or sent by client - public void OnNetworkPacket(int packetID, List packetData, bool isLogin, bool isInbound) - { - DispatchBotEvent(bot => bot.OnNetworkPacket(packetID, packetData, isLogin, isInbound)); - } - - public void OnDialogRegistryData(int protocolId, string resourceId, DialogDefinition dialog) - { - Dialogs.StoreRegistryDialog(protocolId, resourceId, dialog); - } - - public void OnDialogShown(DialogDefinition dialog, DialogPhase phase) - { - var instance = Dialogs.Show(dialog, phase); - if (!Tui.DialogTuiHost.TryOpen(this, instance, force: phase == DialogPhase.Configuration)) - ConsoleIO.WriteLineFormatted(DialogFormatter.Render(instance), acceptnewlines: true); - } - - public void OnDialogRegistryReferenceShown(int protocolId, DialogPhase phase) - { - var instance = Dialogs.ShowRegistryReference(protocolId, phase); - if (!Tui.DialogTuiHost.TryOpen(this, instance, force: phase == DialogPhase.Configuration)) - ConsoleIO.WriteLineFormatted(DialogFormatter.Render(instance), acceptnewlines: true); - } - - public void OnDialogCleared() - { - Dialogs.Clear(); - Tui.DialogTuiHost.CloseCurrent(); - } - - public void OnServerLinksUpdated(IReadOnlyList links) - { - Dialogs.SetServerLinks(links); - } - - /// - /// Called when a server was successfully joined - /// - public void OnGameJoined(bool isOnlineMode) - { - if (protocolversion < Protocol18Handler.MC_1_19_3_Version || playerKeyPair is null || !isOnlineMode) - SetCanSendMessage(true); - else - SetCanSendMessage(false); - - string? bandString = Config.Main.Advanced.BrandInfo.ToBrandString(); - if (!String.IsNullOrWhiteSpace(bandString)) - handler.SendBrandInfo(bandString.Trim()); - - // 1.20.2+ expects ClientInformation during configuration; older servers still want it here. - if (Config.MCSettings.Enabled && protocolversion < Protocol18Handler.MC_1_20_2_Version) - handler.SendClientSettings( - Config.MCSettings.Locale, - Config.MCSettings.RenderDistance, - (byte)Config.MCSettings.Difficulty, - (byte)Config.MCSettings.ChatMode, - Config.MCSettings.ChatColors, - Config.MCSettings.Skin.GetByte(), - (byte)Config.MCSettings.MainHand); - - if (protocolversion >= Protocol18Handler.MC_1_19_3_Version - && playerKeyPair is not null && isOnlineMode) - handler.SendPlayerSession(playerKeyPair); - - if (inventoryHandlingRequested) - { - inventoryHandlingRequested = false; - inventoryHandlingEnabled = true; - Log.Info(Translations.extra_inventory_enabled); - } - - ClearInventories(); - - DispatchBotEvent(bot => bot.AfterGameJoined()); - - ConsoleIO.InitCommandList(dispatcher); - } - - /// - /// Called when the player respawns, which happens on login, respawn and world change. - /// - public void OnRespawn() - { - ClearTasks(); - - if (terrainAndMovementsRequested) - { - terrainAndMovementsEnabled = true; - terrainAndMovementsRequested = false; - Log.Info(Translations.extra_terrainandmovement_enabled); - } - - if (terrainAndMovementsEnabled) - { - world.Clear(); - } - - entities.Clear(); - ClearKnownSigns(); - ClearInventories(); - DispatchBotEvent(bot => bot.OnRespawn()); - } - - /// - /// Drive the physics engine input based on the current A* path. - /// Converts discrete waypoint pathfinding into continuous movement input. - /// - private void UpdatePathfindingInput() - { - physicsInput.Reset(); - - // Still heading toward a target (even if path queue is empty) - if (pathTarget is not null && ReachedWaypoint(pathTarget.Value)) - { - // Arrived at current waypoint — advance to next, or finish - if (path is not null && path.Count > 0) - { - pathTarget = path.Dequeue(); - if (Config.Main.Advanced.MoveHeadWhileWalking) - UpdateLocation(location, pathTarget.Value + new Location(0, 1, 0)); - } - else - { - pathTarget = null; - path = null; - } - } - - // Need a first target from a fresh path - if (pathTarget is null && path is not null && path.Count > 0) - { - pathTarget = path.Dequeue(); - if (Config.Main.Advanced.MoveHeadWhileWalking) - UpdateLocation(location, pathTarget.Value + new Location(0, 1, 0)); - } - - if (pathTarget is not null) - { - SetInputToward(pathTarget.Value); - } - } - - /// - /// Check if the player has approximately reached a waypoint. - /// - private bool ReachedWaypoint(Location target) - { - double dx = target.X - location.X; - double dz = target.Z - location.Z; - return dx * dx + dz * dz < 0.25; // within ~0.5 blocks horizontally - } - - /// - /// Set movement input to walk toward a target location. - /// Calculates the yaw needed and sets Forward + Sprint. - /// - private void SetInputToward(Location target) - { - double dx = target.X - location.X; - double dz = target.Z - location.Z; - double dy = target.Y - location.Y; - double distSqr = dx * dx + dz * dz; - - if (distSqr < 0.01) return; // Close enough horizontally - - // Calculate yaw to face target - float targetYaw = (float)(-Math.Atan2(dx, dz) / Math.PI * 180.0); - if (targetYaw < 0) targetYaw += 360; - playerPhysics.Yaw = targetYaw; - playerYaw = targetYaw; - - physicsInput.Forward = true; - - // Jump if target is above and we're on ground - if (dy > 0.5 && playerPhysics.OnGround) - physicsInput.Jump = true; - - // Map MovementSpeed setting: 1=sneak, 2-4=walk, 5=sprint - if (Config.Main.Advanced.MovementSpeed >= 5) - physicsInput.Sprint = true; - else if (Config.Main.Advanced.MovementSpeed <= 1) - physicsInput.Sneak = true; - } - - /// - /// Check if the client is currently processing a Movement. - /// - /// true if a movement is currently handled - public bool ClientIsMoving() - { - return terrainAndMovementsEnabled && locationReceived && path is not null && path.Count > 0; - } - - /// - /// Get the current goal - /// - /// Current goal of movement. Location.Zero if not set. - public Location GetCurrentMovementGoal() - { - return (ClientIsMoving() || path is null) ? Location.Zero : path.Last(); - } - - /// - /// Cancels the current movement - /// - /// True if there was an active path - public bool CancelMovement() - { - bool success = ClientIsMoving(); - path = null; - return success; - } - - /// - /// Change the amount of sent movement packets per time - /// - /// Set a new walking type - public void SetMovementSpeed(MovementType newSpeed) - { - switch (newSpeed) - { - case MovementType.Sneak: - // https://minecraft.wiki/w/Sneaking#Effects - Sneaking 1.31m/s - Config.Main.Advanced.MovementSpeed = 2; - break; - case MovementType.Walk: - // https://minecraft.wiki/w/Walking#Usage - Walking 4.317 m/s - Config.Main.Advanced.MovementSpeed = 4; - break; - case MovementType.Sprint: - // https://minecraft.wiki/w/Sprinting#Usage - Sprinting 5.612 m/s - Config.Main.Advanced.MovementSpeed = 5; - break; - } - } - - /// - /// Called when the server sends a new player location, - /// or if a ChatBot whishes to update the player's location. - /// - /// The new location - /// If true, the location is relative to the current location - public void UpdateLocation(Location location, bool relative) - { - lock (locationLock) - { - if (relative) - { - this.location += location; - } - else this.location = location; - locationReceived = true; - - // Sync physics engine position - if (physicsInitialized) - { - playerPhysics.Teleport(this.location.X, this.location.Y, this.location.Z); - } - } - } - - /// - /// Called when the server sends a new player location, - /// or if a ChatBot whishes to update the player's location. - /// - /// The new location - /// Yaw to look at - /// Pitch to look at - public void UpdateLocation(Location location, float yaw, float pitch) - { - _yaw = yaw; - _pitch = pitch; - UpdateLocation(location, false); - } - - /// - /// Send the current player position and look angles to the server. - /// - /// TRUE if the update packet was sent - public bool SendLocationUpdate() - { - if (InvokeRequired) - return InvokeOnMainThread(SendLocationUpdate); - - Location current = GetCurrentLocation(); - bool onGround = physicsInitialized ? playerPhysics.OnGround : Movement.IsOnGround(world, current); - bool horizontalCollision = physicsInitialized && playerPhysics.HorizontalCollision; - return handler.SendLocationUpdate(current, onGround, horizontalCollision, _yaw, _pitch); - } - - /// - /// Called when the server sends a new player location, - /// or if a ChatBot whishes to update the player's location. - /// - /// The new location - /// Block coordinates to look at - public void UpdateLocation(Location location, Location lookAtLocation) - { - double dx = lookAtLocation.X - (location.X - 0.5); - double dy = lookAtLocation.Y - (location.Y + 1); - double dz = lookAtLocation.Z - (location.Z - 0.5); - - double r = Math.Sqrt(dx * dx + dy * dy + dz * dz); - - float yaw = Convert.ToSingle(-Math.Atan2(dx, dz) / Math.PI * 180); - float pitch = Convert.ToSingle(-Math.Asin(dy / r) / Math.PI * 180); - if (yaw < 0) yaw += 360; - - UpdateLocation(location, yaw, pitch); - } - - /// - /// Called when the server sends a new player location, - /// or if a ChatBot whishes to update the player's location. - /// - /// The new location - /// Direction to look at - public void UpdateLocation(Location location, Direction direction) - { - float yaw = 0; - float pitch = 0; - - switch (direction) - { - case Direction.Up: - pitch = -90; - break; - case Direction.Down: - pitch = 90; - break; - case Direction.East: - yaw = 270; - break; - case Direction.West: - yaw = 90; - break; - case Direction.North: - yaw = 180; - break; - case Direction.South: - break; - default: - throw new ArgumentException(Translations.exception_unknown_direction, nameof(direction)); - } - - UpdateLocation(location, yaw, pitch); - } - - /// - /// Received chat/system message from the server - /// - /// Message received - public void OnTextReceived(ChatMessage message) - { - UpdateKeepAlive(); - - Log.Debug(string.Format(Translations.protocol_chat_raw_message, message.content)); - - List links = new(); - string messageText; - - // Used for 1.19+ to mark: system message, legal / illegal signature - string color = string.Empty; - - if (message.isSignedChat) - { - if (!Config.Signature.ShowIllegalSignedChat && !message.isSystemChat && !(bool)message.isSignatureLegal!) - return; - messageText = ChatParser.ParseSignedChat(message, links); - - if (message.isSystemChat) - { - if (Config.Signature.MarkSystemMessage) - color = "§7▌§r"; // Background Gray - } - else - { - if ((bool)message.isSignatureLegal!) - { - if (Config.Signature.ShowModifiedChat && message.unsignedContent is not null) - { - if (Config.Signature.MarkModifiedMsg) - color = "§6▌§r"; // Background Yellow - } - else - { - if (Config.Signature.MarkLegallySignedMsg) - color = "§2▌§r"; // Background Green - } - } - else - { - if (Config.Signature.MarkIllegallySignedMsg) - color = "§4▌§r"; // Background Red - } - } - } - else - { - if (message.isJson) - messageText = ChatParser.ParseText(message.content, links); - else - messageText = message.content; - } - - Log.Chat(color + messageText); - - if (Config.Main.Advanced.ShowChatLinks) - foreach (string link in links) - Log.Chat(string.Format(Translations.mcc_link, link)); - - DispatchBotEvent(bot => bot.GetText(messageText)); - DispatchBotEvent(bot => bot.GetText(messageText, message.content)); - } - - /// - /// Received a connection keep-alive from the server - /// - public void OnServerKeepAlive() - { - UpdateKeepAlive(); - } - - /// - /// When an inventory is opened - /// - /// The inventory - /// Inventory ID - public void OnInventoryOpen(int inventoryID, Container inventory) - { - inventoriesWithFullContents.Remove(inventoryID); - inventories[inventoryID] = inventory; - - if (inventoryID != 0) - { - Log.Info(string.Format(Translations.extra_inventory_open, inventoryID, inventory.Title)); - Log.Info(Translations.extra_inventory_interact); - DispatchBotEvent(bot => bot.OnInventoryOpen(inventoryID)); - - if (ConsoleIO.Backend is Tui.TuiConsoleBackend - && Tui.ContainerViewBase.HasTuiSupport(inventory.Type) - && Tui.InventoryTuiHost.CanLaunch) - { - Tui.InventoryTuiHost.Launch(this, inventoryID); - } - } - } - - /// - /// When an inventory is close - /// - /// Inventory ID - public void OnInventoryClose(int inventoryID) - { - if (inventories.ContainsKey(inventoryID)) - { - if (inventoryID == 0) - { - inventories[0].Items.Clear(); // Don't delete player inventory - inventoriesWithFullContents.Clear(); - } - else - { - inventories.Remove(inventoryID); - inventoriesWithFullContents.Remove(inventoryID); - } - } - - if (inventoryID != 0) - { - Log.Info(string.Format(Translations.extra_inventory_close, inventoryID)); - DispatchBotEvent(bot => bot.OnInventoryClose(inventoryID)); - } - - Tui.InventoryTuiHost.NotifyInventoryClosed(inventoryID); - } - - /// - /// When received window properties from server. - /// Used for Frunaces, Enchanting Table, Beacon, Brewing stand, Stone cutter, Loom and Lectern - /// More info about: https://wiki.vg/Protocol#Set_Container_Property - /// - /// Inventory ID - /// Property ID - /// Property Value - public void OnWindowProperties(byte inventoryID, short propertyId, short propertyValue) - { - if (!inventories.ContainsKey(inventoryID)) - return; - - Container inventory = inventories[inventoryID]; - - if (inventory.Properties.ContainsKey(propertyId)) - inventory.Properties.Remove(propertyId); - - inventory.Properties.Add(propertyId, propertyValue); - - DispatchBotEvent(bot => bot.OnInventoryProperties(inventoryID, propertyId, propertyValue)); - - if (inventory.Type == ContainerType.Enchantment) - { - // We got the last property for enchantment - if (propertyId == 9 && propertyValue != -1) - { - var topEnchantmentLevelRequirement = inventory.Properties[0]; - var middleEnchantmentLevelRequirement = inventory.Properties[1]; - var bottomEnchantmentLevelRequirement = inventory.Properties[2]; - - var topEnchantment = EnchantmentMapping.GetEnchantmentById( - GetProtocolVersion(), - inventory.Properties[4]); - - var middleEnchantment = EnchantmentMapping.GetEnchantmentById( - GetProtocolVersion(), - inventory.Properties[5]); - - var bottomEnchantment = EnchantmentMapping.GetEnchantmentById( - GetProtocolVersion(), - inventory.Properties[6]); - - var topEnchantmentLevel = inventory.Properties[7]; - var middleEnchantmentLevel = inventory.Properties[8]; - var bottomEnchantmentLevel = inventory.Properties[9]; - - var sb = new StringBuilder(); - - sb.AppendLine(Translations.Enchantment_enchantments_available + ":"); - - sb.AppendLine(Translations.Enchantment_tops_slot + ":\t" - + EnchantmentMapping.GetEnchantmentName(topEnchantment) + " " - + EnchantmentMapping.ConvertLevelToRomanNumbers(topEnchantmentLevel) + " (" - + topEnchantmentLevelRequirement + " " + Translations.Enchantment_levels + ")"); - - sb.AppendLine(Translations.Enchantment_middle_slot + ":\t" - + EnchantmentMapping.GetEnchantmentName(middleEnchantment) + " " - + EnchantmentMapping.ConvertLevelToRomanNumbers(middleEnchantmentLevel) + " (" - + middleEnchantmentLevelRequirement + " " + Translations.Enchantment_levels + ")"); - - sb.AppendLine(Translations.Enchantment_bottom_slot + ":\t" - + EnchantmentMapping.GetEnchantmentName(bottomEnchantment) + " " - + EnchantmentMapping.ConvertLevelToRomanNumbers(bottomEnchantmentLevel) + " (" - + bottomEnchantmentLevelRequirement + " " + Translations.Enchantment_levels + ")"); - - Log.Info(sb.ToString()); - - lastEnchantment = new(); - lastEnchantment.TopEnchantment = topEnchantment; - lastEnchantment.MiddleEnchantment = middleEnchantment; - lastEnchantment.BottomEnchantment = bottomEnchantment; - - lastEnchantment.Seed = inventory.Properties[3]; - - lastEnchantment.TopEnchantmentLevel = topEnchantmentLevel; - lastEnchantment.MiddleEnchantmentLevel = middleEnchantmentLevel; - lastEnchantment.BottomEnchantmentLevel = bottomEnchantmentLevel; - - lastEnchantment.TopEnchantmentLevelRequirement = topEnchantmentLevelRequirement; - lastEnchantment.MiddleEnchantmentLevelRequirement = middleEnchantmentLevelRequirement; - lastEnchantment.BottomEnchantmentLevelRequirement = bottomEnchantmentLevelRequirement; - - - DispatchBotEvent(bot => bot.OnEnchantments( - // Enchantments - topEnchantment, - middleEnchantment, - bottomEnchantment, - - // Enchantment levels - topEnchantmentLevel, - middleEnchantmentLevel, - bottomEnchantmentLevel, - - // Required levels for enchanting - topEnchantmentLevelRequirement, - middleEnchantmentLevelRequirement, - bottomEnchantmentLevelRequirement)); - - DispatchBotEvent(bot => bot.OnEnchantments(lastEnchantment)); - } - } - } - - /// - /// When received window items from server. - /// - /// Inventory ID - /// Item list, key = slot ID, value = Item information - public void OnWindowItems(byte inventoryID, Dictionary itemList, int stateId) - { - if (inventories.ContainsKey(inventoryID)) - { - // Filter out empty items (Count=0 or Air) that some servers may send - foreach (int key in itemList.Where(slot => slot.Value.IsEmpty).Select(slot => slot.Key).ToList()) - itemList.Remove(key); - - inventories[inventoryID].Items = itemList; - inventories[inventoryID].StateID = stateId; - inventoriesWithFullContents.Add(inventoryID); - bool playerInventoryChanged = SyncPlayerInventorySlotsFromWindow(inventories[inventoryID]); - if (playerInventoryChanged) - DispatchBotEvent(bot => bot.OnInventoryUpdate(0)); - DispatchBotEvent(bot => bot.OnInventoryUpdate(inventoryID)); - } - } - - /// - /// When a slot is set inside window items - /// - /// Window ID - /// Slot ID - /// Item (may be null for empty slot) - public void OnSetSlot(byte inventoryID, short slotID, Item? item, int stateId) - { - if (inventories.ContainsKey(inventoryID)) - inventories[inventoryID].StateID = stateId; - - // Handle inventoryID -2 - Add item to player inventory without animation - if (inventoryID == 254) - inventoryID = 0; - // Handle cursor item - if (inventoryID == 255 && slotID == -1) - { - inventoryID = 0; // Prevent key not found for some bots relied to this event - if (inventories.ContainsKey(0)) - { - if (item is not null && !item.IsEmpty) - inventories[0].Items[-1] = item; - else - inventories[0].Items.Remove(-1); - } - } - else - { - if (inventories.ContainsKey(inventoryID)) - { - if (item is null || item.IsEmpty) - { - if (inventories[inventoryID].Items.ContainsKey(slotID)) - inventories[inventoryID].Items.Remove(slotID); - } - else inventories[inventoryID].Items[slotID] = item; - - if (SyncPlayerInventorySlotsFromWindow(inventories[inventoryID])) - DispatchBotEvent(bot => bot.OnInventoryUpdate(0)); - } - } - DispatchBotEvent(bot => bot.OnInventoryUpdate(inventoryID)); - } - - /// - /// Set client player's ID for later receiving player's own properties - /// - /// Player Entity ID - public void OnReceivePlayerEntityID(int EntityID) - { - playerEntityID = EntityID; - } - - /// - /// Triggered when a new player joins the game - /// - /// player info - public void OnPlayerJoin(PlayerInfo player) - { - //Ignore placeholders eg 0000tab# from TabListPlus - if (Config.Main.Advanced.IgnoreInvalidPlayerName && !ChatBot.IsValidName(player.Name)) - return; - - if (player.Name == username) - { - // 1.19+ offline server is possible to return different uuid - uuid = player.Uuid; - uuidStr = player.Uuid.ToString().Replace("-", string.Empty); - } - - lock (onlinePlayers) - { - onlinePlayers[player.Uuid] = player; - } - - DispatchBotEvent(bot => bot.OnPlayerJoin(player.Uuid, player.Name)); - } - - /// - /// Triggered when a player has left the game - /// - /// UUID of the player - public void OnPlayerLeave(Guid uuid) - { - string? username = null; - - lock (onlinePlayers) - { - if (onlinePlayers.ContainsKey(uuid)) - { - username = onlinePlayers[uuid].Name; - onlinePlayers.Remove(uuid); - } - } - - DispatchBotEvent(bot => bot.OnPlayerLeave(uuid, username)); - } - - // - /// This method is called when a player has been killed by another entity - /// - /// Victim's entity - /// Killer's entity - public void OnPlayerKilled(int killerEntityId, string chatMessage) - { - if (!entities.ContainsKey(killerEntityId)) - return; - - DispatchBotEvent(bot => bot.OnKilled(entities[killerEntityId], chatMessage)); - } - - /// - /// Called when a plugin channel message was sent from the server. - /// - /// The channel the message was sent on - /// The data from the channel - public void OnPluginChannelMessage(string channel, byte[] data) - { - if (channel == "REGISTER") - { - string[] channels = Encoding.UTF8.GetString(data).Split('\0'); - foreach (string chan in channels) - { - if (!registeredServerPluginChannels.Contains(chan)) - { - registeredServerPluginChannels.Add(chan); - } - } - } - if (channel == "UNREGISTER") - { - string[] channels = Encoding.UTF8.GetString(data).Split('\0'); - foreach (string chan in channels) - { - registeredServerPluginChannels.Remove(chan); - } - } - - if (registeredBotPluginChannels.ContainsKey(channel)) - { - DispatchBotEvent(bot => bot.OnPluginMessage(channel, data), registeredBotPluginChannels[channel]); - } - } - - public void OnBookOpen(int hand) - { - if (InvokeRequired) - { - InvokeOnMainThread(() => OnBookOpen(hand)); - return; - } - - Tui.BookTuiHost.OpenFromServer(this, hand == (int)BookHand.Off ? BookHand.Off : BookHand.Main); - } - - /// - /// Called when an entity spawned - /// - public void OnSpawnEntity(Entity entity) - { - // The entity should not already exist, but if it does, let's consider the previous one is being destroyed - if (entities.ContainsKey(entity.ID)) - OnDestroyEntities(new[] { entity.ID }); - - entities.Add(entity.ID, entity); - DispatchBotEvent(bot => bot.OnEntitySpawn(entity)); - } - - private static bool ShouldAnnouncePlayerEffectGain(EffectData effectData, EffectData? previousPlayerEffect) - { - if (!Config.Main.Advanced.ShowEffectMessages) - return false; - - return previousPlayerEffect is null - || previousPlayerEffect.IsExpired - || previousPlayerEffect.Amplifier != effectData.Amplifier; - } - - private static void AnnouncePlayerEffectGain(EffectData effectData) - { - if (!Config.Main.Advanced.ShowEffectMessages) - return; - - ConsoleIO.WriteLine(string.Format(Translations.bot_effect_gained, - effectData.GetDisplayNameWithArticle(), effectData.GetInitialDurationText())); - } - - private static void AnnouncePlayerEffectExpired(EffectData effectData) - { - if (!Config.Main.Advanced.ShowEffectMessages) - return; - - ConsoleIO.WriteLine(string.Format(Translations.bot_effect_expired, effectData.GetDisplayName())); - } - - /// - /// Called when an entity effects - /// - public void OnEntityEffect(int entityid, Effects effect, int amplifier, int duration, byte flags, bool hasFactorData, Dictionary? factorCodec) - { - Entity? entity = null; - if (entities.TryGetValue(entityid, out var trackedEntity)) - { - entity = trackedEntity; - } - - var effectData = new EffectData(effect, amplifier, duration, flags); - entity?.ActiveEffects[effect] = effectData; - - if (entityid == playerEntityID) - { - playerEffects.TryGetValue(effect, out var previousPlayerEffect); - playerEffects[effect] = effectData; - - if (ShouldAnnouncePlayerEffectGain(effectData, previousPlayerEffect)) - AnnouncePlayerEffectGain(effectData); - } - - if (entity is not null) - DispatchBotEvent(bot => bot.OnEntityEffect(entity, effect, amplifier, duration, flags)); - } - - /// - /// Called when an entity has an effect removed - /// - /// Entity ID - /// Effect that was removed - public void OnRemoveEntityEffect(int entityid, Effects effect) - { - Entity? entity = null; - EffectData? removedEffectData = null; - - if (entities.TryGetValue(entityid, out var trackedEntity)) - { - entity = trackedEntity; - if (entity.ActiveEffects.Remove(effect, out var entityEffectData)) - removedEffectData = entityEffectData; - } - - if (entityid == playerEntityID && playerEffects.Remove(effect, out var playerEffectData)) - removedEffectData ??= playerEffectData; - - if (entityid == playerEntityID && removedEffectData is not null) - AnnouncePlayerEffectExpired(removedEffectData); - - if (entity is not null) - DispatchBotEvent(bot => bot.OnRemoveEntityEffect(entity, effect)); - } - - /// - /// Called when a player spawns or enters the client's render distance - /// - public void OnSpawnPlayer(int entityID, Guid uuid, Location location, byte yaw, byte pitch) - { - Entity playerEntity; - if (onlinePlayers.TryGetValue(uuid, out PlayerInfo? player)) - { - playerEntity = new(entityID, EntityType.Player, location, uuid, player.Name, yaw, pitch); - player.entity = playerEntity; - } - else - playerEntity = new(entityID, EntityType.Player, location, uuid, null, yaw, pitch); - OnSpawnEntity(playerEntity); - } - - /// - /// Called on Entity Equipment - /// - /// Entity ID - /// Equipment slot. 0: main hand, 1: off hand, 2-5: armor slot (2: boots, 3: leggings, 4: chestplate, 5: helmet) - /// Item) - public void OnEntityEquipment(int entityid, int slot, Item? item) - { - if (entities.ContainsKey(entityid)) - { - Entity entity = entities[entityid]; - if (entity.Equipment.ContainsKey(slot)) - entity.Equipment.Remove(slot); - if (item is not null) - entity.Equipment[slot] = item; - DispatchBotEvent(bot => bot.OnEntityEquipment(entities[entityid], slot, item)); - } - } - - /// - /// Called when the Game Mode has been updated for a player - /// - /// Player Name - /// Player UUID (Empty for initial gamemode on login) - /// New Game Mode (0: Survival, 1: Creative, 2: Adventure, 3: Spectator). - public void OnGamemodeUpdate(Guid uuid, int gamemode) - { - // Initial gamemode on login - if (uuid == Guid.Empty) - this.gamemode = gamemode; - - // Further regular gamemode change events - if (onlinePlayers.ContainsKey(uuid)) - { - string playerName = onlinePlayers[uuid].Name; - if (playerName == username) - this.gamemode = gamemode; - DispatchBotEvent(bot => bot.OnGamemodeUpdate(playerName, uuid, gamemode)); - } - } - - /// - /// Called when entities dead/despawn. - /// - public void OnDestroyEntities(int[] Entities) - { - foreach (int a in Entities) - { - if (entities.TryGetValue(a, out Entity? entity)) - { - DispatchBotEvent(bot => bot.OnEntityDespawn(entity)); - entities.Remove(a); - } - } - } - - /// - /// Called when an entity's position changed within 8 block of its previous position with rotation. - /// - /// - /// - /// - /// - /// - /// - /// - public void OnEntityPosition(int EntityID, Double Dx, Double Dy, Double Dz, float yaw, float pitch, bool onGround) - { - if (entities.ContainsKey(EntityID)) - { - Location L = entities[EntityID].Location; - L.X += Dx; - L.Y += Dy; - L.Z += Dz; - entities[EntityID].Location = L; - entities[EntityID].Yaw = yaw; - entities[EntityID].Pitch = pitch; - DispatchBotEvent(bot => bot.OnEntityMove(entities[EntityID])); - } - } - - /// - /// Called when an entity's position changed within 8 block of its previous position. - /// - /// - /// - /// - /// - /// - public void OnEntityPosition(int EntityID, Double Dx, Double Dy, Double Dz, bool onGround) - { - if (entities.ContainsKey(EntityID)) - { - Location L = entities[EntityID].Location; - L.X += Dx; - L.Y += Dy; - L.Z += Dz; - entities[EntityID].Location = L; - DispatchBotEvent(bot => bot.OnEntityMove(entities[EntityID])); - } - } - - /// - /// Called when an entity's rotation changed. - /// - /// - /// - /// - /// - public void OnEntityRotation(int EntityID, float yaw, float pitch, bool onGround) - { - if (entities.ContainsKey(EntityID)) - { - entities[EntityID].Yaw = yaw; - entities[EntityID].Pitch = pitch; - DispatchBotEvent(bot => bot.OnEntityRotate(entities[EntityID])); - } - } - - /// - /// Called when an entity moved over 8 block. - /// - /// - /// - /// - /// - /// - public void OnEntityTeleport(int EntityID, Double X, Double Y, Double Z, bool onGround) - { - if (entities.ContainsKey(EntityID)) - { - Location location = new(X, Y, Z); - entities[EntityID].Location = location; - DispatchBotEvent(bot => bot.OnEntityMove(entities[EntityID])); - } - } - - /// - /// Called when an entity velocity update is received. - /// - /// Entity ID - /// Velocity on X axis (blocks/tick) - /// Velocity on Y axis (blocks/tick) - /// Velocity on Z axis (blocks/tick) - public void OnEntityVelocity(int entityID, double velocityX, double velocityY, double velocityZ) - { - if (entities.TryGetValue(entityID, out Entity? entity)) - DispatchBotEvent(bot => bot.OnEntityVelocity(entity, velocityX, velocityY, velocityZ)); - } - - /// - /// Called when a sound packet is received. - /// - /// Sound key when available, otherwise null - /// Sound location when available - /// Sound category id from packet - /// Sound volume - /// Sound pitch - /// Source entity id for entity sound packets, if any - public void OnSoundEffect(string? soundName, Location? location, int category, float volume, float pitch, - int? entityID) - { - Entity? sourceEntity = null; - Location? resolvedLocation = location; - - if (entityID is int id && entities.TryGetValue(id, out Entity? entity)) - { - sourceEntity = entity; - resolvedLocation ??= entity.Location; - } - - DispatchBotEvent(bot => bot.OnSoundEffect(soundName, resolvedLocation, category, volume, pitch, - sourceEntity)); - } - - /// - /// Called when received entity properties from server. - /// - /// - /// - public void OnEntityProperties(int EntityID, Dictionary prop) - { - if (EntityID == playerEntityID) - { - foreach (var kvp in prop) - playerAttributes[kvp.Key] = kvp.Value; - - DispatchBotEvent(bot => bot.OnPlayerProperty(prop)); - } - } - - /// - /// Called when the status of an entity have been changed - /// - /// Entity ID - /// Status ID - public void OnEntityStatus(int entityID, byte status) - { - if (entityID == playerEntityID) - { - DispatchBotEvent(bot => bot.OnPlayerStatus(status)); - } - } - - /// - /// Called when server sent a Time Update packet. - /// - /// - /// - public void OnTimeUpdate(long WorldAge, long TimeOfDay) - { - // TimeUpdate sent every server tick hence used as timeout detect - UpdateKeepAlive(); - // calculate server tps - if (lastAge != 0) - { - DateTime currentTime = DateTime.Now; - long tickDiff = WorldAge - lastAge; - double tps = tickDiff / (currentTime - lastTime).TotalSeconds; - lastAge = WorldAge; - lastTime = currentTime; - if (tps > 0) - { - // A Minecraft server cannot genuinely exceed 20 TPS; values above 20 are - // caused by packet-timing jitter. Clamp instead of discarding so that a - // healthy server averages to 20 rather than being biased downward. - tps = Math.Min(tps, 20.0); - // calculate average tps - if (tpsSamples.Count >= maxSamples) - { - // full - sampleSum -= tpsSamples[0]; - tpsSamples.RemoveAt(0); - } - tpsSamples.Add(tps); - sampleSum += tps; - averageTPS = sampleSum / tpsSamples.Count; - serverTPS = tps; - DispatchBotEvent(bot => bot.OnServerTpsUpdate(tps)); - } - } - else - { - lastAge = WorldAge; - lastTime = DateTime.Now; - } - DispatchBotEvent(bot => bot.OnTimeUpdate(WorldAge, TimeOfDay)); - } - - /// - /// Called when client player's health changed, e.g. getting attack - /// - /// Player current health - public void OnUpdateHealth(float health, int food) - { - playerHealth = health; - playerFoodSaturation = food; - - if (health <= 0) - { - if (Config.Main.Advanced.AutoRespawn) - { - Log.Info(Translations.mcc_player_dead_respawn); - respawnTicks = Settings.ClientTicksPerSecond; - } - else - { - Log.Info(string.Format(Translations.mcc_player_dead, Config.Main.Advanced.InternalCmdChar.ToLogString())); - } - DispatchBotEvent(bot => bot.OnDeath()); - } - - DispatchBotEvent(bot => bot.OnHealthUpdate(health, food)); - } - - /// - /// Called when experience updates - /// - /// Between 0 and 1 - /// Level - /// Total Experience - public void OnSetExperience(float Experiencebar, int Level, int TotalExperience) - { - playerLevel = Level; - playerTotalExperience = TotalExperience; - DispatchBotEvent(bot => bot.OnSetExperience(Experiencebar, Level, TotalExperience)); - } - - /// - /// Called when and explosion occurs on the server - /// - /// Explosion location - /// Explosion strength - /// Amount of affected blocks - public void OnExplosion(Location location, float strength, int affectedBlocks) - { - DispatchBotEvent(bot => bot.OnExplosion(location, strength, affectedBlocks)); - } - - /// - /// Called when Latency is updated - /// - /// player uuid - /// Latency - public void OnLatencyUpdate(Guid uuid, int latency) - { - if (onlinePlayers.ContainsKey(uuid)) - { - PlayerInfo player = onlinePlayers[uuid]; - player.Ping = latency; - string playerName = player.Name; - foreach (KeyValuePair ent in entities) - { - if (ent.Value.UUID == uuid && ent.Value.Name == playerName) - { - ent.Value.Latency = latency; - DispatchBotEvent(bot => bot.OnLatencyUpdate(ent.Value, playerName, uuid, latency)); - break; - } - } - DispatchBotEvent(bot => bot.OnLatencyUpdate(playerName, uuid, latency)); - } - } - - /// - /// Called when held item change - /// - /// item slot - public void OnHeldItemChange(byte slot) - { - CurrentSlot = slot; - DispatchBotEvent(bot => bot.OnHeldItemChange(slot)); - } - - /// - /// Called when an update of the map is sent by the server, take a look at https://wiki.vg/Protocol#Map_Data for more info on the fields - /// Map format and colors: https://minecraft.wiki/w/Map_item_format - /// - /// Map ID of the map being modified - /// A scale of the Map, from 0 for a fully zoomed-in map (1 block per pixel) to 4 for a fully zoomed-out map (16 blocks per pixel) - /// Specifies whether player and item frame icons are shown - /// True if the map has been locked in a cartography table - /// A list of MapIcon objects of map icons, send only if trackingPosition is true - /// Numbs of columns that were updated (map width) (NOTE: If it is 0, the next fields are not used/are set to default values of 0 and null respectively) - /// Map height - /// x offset of the westernmost column - /// z offset of the northernmost row - /// a byte array of colors on the map - public void OnMapData(int mapid, byte scale, bool trackingPosition, bool locked, List icons, byte columnsUpdated, byte rowsUpdated, byte mapCoulmnX, byte mapCoulmnZ, byte[]? colors) - { - DispatchBotEvent(bot => bot.OnMapData(mapid, scale, trackingPosition, locked, icons, columnsUpdated, rowsUpdated, mapCoulmnX, mapCoulmnZ, colors)); - } - - /// - /// Received some Title from the server - /// 0 = set title, 1 = set subtitle, 3 = set action bar, 4 = set times and display, 4 = hide, 5 = reset - /// title text - /// suntitle text - /// action bar text - /// Fade In - /// Stay - /// Fade Out - /// json text - public void OnTitle(int action, string titletext, string subtitletext, string actionbartext, int fadein, int stay, int fadeout, string json) - { - DispatchBotEvent(bot => bot.OnTitle(action, titletext, subtitletext, actionbartext, fadein, stay, fadeout, json)); - } - - /// - /// Called when Soreboard Objective - /// - /// objective name - /// 0 to create the scoreboard. 1 to remove the scoreboard. 2 to update the display text. - /// Only if mode is 0 or 2. The text to be displayed for the score - /// Only if mode is 0 or 2. 0 = "integer", 1 = "hearts". - /// Number format: 0 - blank, 1 - styled, 2 - fixed - public void OnScoreboardObjective(string objectiveName, byte mode, string objectiveValue, int type, int numberFormat) - { - var json = objectiveValue; - objectiveValue = ChatParser.ParseText(objectiveValue); - DispatchBotEvent(bot => bot.OnScoreboardObjective(objectiveName, mode, objectiveValue, type, json, numberFormat)); - } - - /// - /// Called when DisplayScoreboard - /// - /// The entity whose score this is. For players, this is their username; for other entities, it is their UUID. - /// 0 to create/update an item. 1 to remove an item. - /// The name of the objective the score belongs to - /// The name of the objective the score belongs to, but with chat formatting - /// The score to be displayed next to the entry. Only sent when Action does not equal 1. - /// Number format: 0 - blank, 1 - styled, 2 - fixed - public void OnUpdateScore(string entityName, int action, string objectiveName, string objectiveDisplayName, int objectiveValue, int numberFormat) - { - DispatchBotEvent(bot => bot.OnUpdateScore(entityName, action, objectiveName, objectiveDisplayName, objectiveValue, numberFormat)); - } - - /// - /// Called when a Teams packet is received. Updates the internal team state and notifies bots. - /// - public void OnTeam(string teamName, byte method, string displayName, byte friendlyFlags, - string nameTagVisibility, string collisionRule, int color, - string prefix, string suffix, List players) - { - lock (teams) - { - switch (method) - { - case 0: // create - var newTeam = new PlayerTeam - { - Name = teamName, - DisplayName = displayName, - AllowFriendlyFire = (friendlyFlags & 0x01) != 0, - SeeFriendlyInvisibles = (friendlyFlags & 0x02) != 0, - NameTagVisibility = nameTagVisibility, - CollisionRule = collisionRule, - Color = color, - Prefix = prefix, - Suffix = suffix - }; - foreach (var p in players) - newTeam.Members.Add(p); - teams[teamName] = newTeam; - break; - - case 1: // remove - teams.Remove(teamName); - break; - - case 2: // update parameters - if (!teams.TryGetValue(teamName, out var updateTeam)) - { - updateTeam = new PlayerTeam { Name = teamName }; - teams[teamName] = updateTeam; - } - updateTeam.DisplayName = displayName; - updateTeam.AllowFriendlyFire = (friendlyFlags & 0x01) != 0; - updateTeam.SeeFriendlyInvisibles = (friendlyFlags & 0x02) != 0; - updateTeam.NameTagVisibility = nameTagVisibility; - updateTeam.CollisionRule = collisionRule; - updateTeam.Color = color; - updateTeam.Prefix = prefix; - updateTeam.Suffix = suffix; - break; - - case 3: // add players - if (!teams.TryGetValue(teamName, out var addTeam)) - { - addTeam = new PlayerTeam { Name = teamName }; - teams[teamName] = addTeam; - } - foreach (var p in players) - addTeam.Members.Add(p); - break; - - case 4: // remove players - if (teams.TryGetValue(teamName, out var removeTeam)) - foreach (var p in players) - removeTeam.Members.Remove(p); - break; - } - } - DispatchBotEvent(bot => bot.OnTeam(teamName, method, displayName, friendlyFlags, - nameTagVisibility, collisionRule, color, prefix, suffix, players)); - } - - - /// - /// Called when the client received the Tab Header and Footer - /// - /// Header - /// Footer - public void OnTabListHeaderAndFooter(string header, string footer) - { - lock (tabListHeaderFooterLock) - { - tabListHeader = header; - tabListFooter = footer; - } - DispatchBotEvent(bot => bot.OnTabListHeaderAndFooter(header, footer)); - } - - /// - /// Called when the health of an entity changed - /// - /// Entity ID - /// The health of the entity - public void OnEntityHealth(int entityID, float health) - { - if (entities.ContainsKey(entityID)) - { - entities[entityID].Health = health; - DispatchBotEvent(bot => bot.OnEntityHealth(entities[entityID], health)); - } - } - - /// - /// Called when the metadata of an entity changed - /// - /// Entity ID - /// The metadata of the entity - public void OnEntityMetadata(int entityID, Dictionary metadata) - { - if (entities.ContainsKey(entityID)) - { - Entity entity = entities[entityID]; - entity.Metadata = metadata; - int itemEntityMetadataFieldIndex = protocolversion < Protocol18Handler.MC_1_17_Version ? 7 : 8; - - if (entity.Type.ContainsItem() && metadata.TryGetValue(itemEntityMetadataFieldIndex, out object? itemObj) && itemObj is not null && itemObj.GetType() == typeof(Item)) - { - Item item = (Item)itemObj; - if (item is null) - entity.Item = new Item(ItemType.Air, 0, null); - else entity.Item = item; - } - if (metadata.TryGetValue(6, out object? poseObj) && poseObj is not null && poseObj.GetType() == typeof(Int32)) - { - entity.Pose = (EntityPose)poseObj; - } - if (metadata.TryGetValue(2, out object? nameObj) && nameObj is not null && nameObj.GetType() == typeof(string)) - { - string name = nameObj.ToString() ?? string.Empty; - entity.CustomNameJson = name; - entity.CustomName = ChatParser.ParseText(name); - } - if (metadata.TryGetValue(3, out object? nameVisableObj) && nameVisableObj is not null && nameVisableObj.GetType() == typeof(bool)) - { - entity.IsCustomNameVisible = bool.Parse(nameVisableObj.ToString() ?? string.Empty); - } - DispatchBotEvent(bot => bot.OnEntityMetadata(entity, metadata)); - } - } - - /// - /// Called when tradeList is recieved after interacting with villager - /// - /// Window ID - /// List of trades. - /// Contains Level, Experience, IsRegularVillager and CanRestock . - public void OnTradeList(int windowID, List trades, VillagerInfo villagerInfo) - { - DispatchBotEvent(bot => bot.OnTradeList(windowID, trades, villagerInfo)); - } - - /// - /// Will be called every player break block in gamemode 0 - /// - /// Player ID - /// Block location - /// Destroy stage, maximum 255 - public void OnBlockBreakAnimation(int entityId, Location location, byte stage) - { - if (entities.ContainsKey(entityId)) - { - Entity entity = entities[entityId]; - DispatchBotEvent(bot => bot.OnBlockBreakAnimation(entity, location, stage)); - } - } - - /// - /// Will be called every animations of the hit and place block - /// - /// Player ID - /// 0 = LMB, 1 = RMB (RMB Corrent not work) - public void OnEntityAnimation(int entityID, byte animation) - { - if (entities.ContainsKey(entityID)) - { - Entity entity = entities[entityID]; - DispatchBotEvent(bot => bot.OnEntityAnimation(entity, animation)); - } - } - - /// - /// Will be called when a Synchronization sequence is recevied, this sequence need to be sent when breaking or placing blocks - /// - /// Sequence ID - public void OnBlockChangeAck(int sequenceId) - { - this.sequenceId = sequenceId; - } - - /// - /// This method is called when the protocol handler receives server data - /// - /// Indicates if the server has a motd message - /// Server MOTD message - /// Indicates if the server has a an icon - /// Server icon in Base 64 format - /// Indicates if the server previews chat - public void OnServerDataRecived(bool hasMotd, string motd, bool hasIcon, string iconBase64, bool previewsChat) - { - isSupportPreviewsChat = previewsChat; - } - - /// - /// This method is called when the protocol handler receives "Set Display Chat Preview" packet - /// - /// Indicates if the server previews chat - public void OnChatPreviewSettingUpdate(bool previewsChat) - { - isSupportPreviewsChat = previewsChat; - } - - /// - /// This method is called when the protocol handler receives "Login Success" packet - /// - /// The player's UUID received from the server - /// The player's username received from the server - /// Tuple - public void OnLoginSuccess(Guid uuid, string userName, Tuple[]? playerProperty) - { - //string UUID = uuid.ToString().Replace("-", String.Empty); - //Log.Info("now UUID = " + this.uuid); - //Log.Info("new UUID = " + UUID); - ////handler.SetUserUUID(UUID); - - } - - /// - /// Used for a wide variety of game events, from weather to bed use to gamemode to demo messages. - /// - /// Event type - /// Depends on Reason - public void OnGameEvent(byte reason, float value) - { - switch (reason) - { - case 3: - OnGamemodeUpdate(Guid.Empty, (int)value); - break; - case 7: - DispatchBotEvent(bot => bot.OnRainLevelChange(value)); - break; - case 8: - DispatchBotEvent(bot => bot.OnThunderLevelChange(value)); - break; - } - } - - /// - /// Called when a block is changed. - /// - /// The location of the block. - /// The block - public void OnBlockChange(Location location, Block block) - { - world.SetBlock(location, block); - if (!IsSignMaterial(block.Type)) - RemoveKnownSign(location); - DispatchBotEvent(bot => bot.OnBlockChange(location, block)); - } - - public void OnBlockEntityData(Location location, Dictionary? nbt) - { - UpdateKnownSign(location, nbt); - } - - /// - /// Called when "AutoComplete" completes. - /// - /// The number of this result. - /// All commands. - public void OnAutoCompleteDone(int transactionId, string[] result) - { - ConsoleIO.OnAutoCompleteDone(transactionId, result); - } - - public void SetCanSendMessage(bool canSendMessage) - { - CanSendMessage = canSendMessage; - Log.Debug("CanSendMessage = " + canSendMessage); - } - - public void OnRecipeBookAdd(RecipeBookRecipeEntry[] recipes, bool replace) - { - lock (recipeBookLock) - { - if (replace) - unlockedRecipes.Clear(); - - foreach (RecipeBookRecipeEntry recipe in recipes) - { - // Guard against malformed server packets that send empty display IDs. - if (!string.IsNullOrWhiteSpace(recipe.CommandId)) - unlockedRecipes[recipe.CommandId] = recipe; - } - } - } - - public void OnRecipeBookRemove(string[] recipeIds) - { - lock (recipeBookLock) - { - foreach (string recipeId in recipeIds) - { - if (!string.IsNullOrWhiteSpace(recipeId)) - unlockedRecipes.Remove(recipeId); - } - } - } - - public void OnAchievementsUpdate(IReadOnlyList added, IReadOnlyList removedIds, bool reset) - { - lock (achievementsLock) - { - if (reset) - achievements.Clear(); - - // Remove entries - foreach (string id in removedIds) - achievements.Remove(id); - - // Add/update entries. For progress-only updates (no definition), - // merge with existing definition if available. - foreach (Achievement entry in added) - { - if (entry.Title is null && achievements.TryGetValue(entry.Id, out Achievement? existing)) - { - // Progress-only update - merge with existing definition - bool isCompleted = ComputeAchievementCompleted(existing.Requirements, entry.CriteriaProgress); - achievements[entry.Id] = existing with { IsCompleted = isCompleted, CriteriaProgress = entry.CriteriaProgress }; - } - else - { - achievements[entry.Id] = entry; - } - } - } - - DispatchBotEvent(bot => bot.OnAchievementUpdate(added, removedIds, reset)); - } - - public void OnSelectAdvancementTab(string? tabId) - { - activeAdvancementTab = tabId; - } - - /// - /// Compute whether an achievement is completed based on AND-of-ORs requirements. - /// - private static bool ComputeAchievementCompleted(IReadOnlyList> requirements, IReadOnlyDictionary criteria) - { - if (requirements.Count == 0) - return true; - - foreach (IReadOnlyList group in requirements) - { - bool groupSatisfied = false; - foreach (string criterion in group) - { - if (criteria.TryGetValue(criterion, out bool done) && done) - { - groupSatisfied = true; - break; - } - } - if (!groupSatisfied) - return false; - } - return true; - } - - /// - /// Send a click container button packet to the server. - /// Used for Enchanting table, Lectern, stone cutter and loom - /// - /// Id of the window being clicked - /// Id of the clicked button - /// True if packet was successfully sent - - public bool ClickContainerButton(int windowId, int buttonId) - { - return handler.ClickContainerButton(windowId, buttonId); - } - - private void ClearKnownSigns() - { - lock (signDataLock) - { - knownSigns.Clear(); - } - } - - private void RemoveKnownSign(Location location) - { - var key = ToBlockKey(location); - lock (signDataLock) - { - knownSigns.Remove(key); - } - } - - private void UpdateKnownSign(Location location, Dictionary? nbt) - { - var key = ToBlockKey(location); - var block = world.GetBlock(new Location(key.x, key.y, key.z)); - if (!IsSignMaterial(block.Type) || !TryExtractSignText(nbt, out string[] frontText, out string[] backText, out bool isWaxed)) - { - lock (signDataLock) - { - knownSigns.Remove(key); - } - - return; - } - - lock (signDataLock) - { - knownSigns[key] = (block.Type.ToString(), block.GetTypeString(), frontText, backText, isWaxed); - } - } - - private static bool TryExtractSignText(Dictionary? nbt, out string[] frontText, out string[] backText, out bool isWaxed) - { - frontText = ExtractSignLines(nbt, "front_text"); - backText = ExtractSignLines(nbt, "back_text"); - if (frontText.Length == 0 && backText.Length == 0) - frontText = ExtractLegacySignLines(nbt); - - isWaxed = nbt is not null - && nbt.TryGetValue("is_waxed", out object? waxedValue) - && waxedValue is bool waxed - && waxed; - return frontText.Length > 0 || backText.Length > 0; - } - - private static string[] ExtractSignLines(Dictionary? nbt, string sideKey) - { - if (nbt is null - || !nbt.TryGetValue(sideKey, out object? sideValue) - || sideValue is not Dictionary sideData - || !sideData.TryGetValue("messages", out object? messagesValue) - || messagesValue is not object[] messages) - { - return []; - } - - return messages - .Take(4) - .Select(ConvertSignMessage) - .ToArray(); - } - - private static string[] ExtractLegacySignLines(Dictionary? nbt) - { - if (nbt is null) - return []; - - List lines = new(4); - for (int i = 1; i <= 4; i++) - { - if (nbt.TryGetValue($"Text{i}", out object? value)) - lines.Add(ConvertSignMessage(value)); - } - - return lines.ToArray(); - } - - private static string ConvertSignMessage(object? value) - { - try - { - return value switch - { - null => string.Empty, - string text => ParseMaybeJsonText(text), - Dictionary nbt => ChatParser.ParseText(nbt), - object[] items => string.Concat(items.Select(ConvertSignMessage)), - _ => value.ToString() ?? string.Empty - }; - } - catch - { - return value?.ToString() ?? string.Empty; - } - } - - private static string ParseMaybeJsonText(string text) - { - string trimmed = text.Trim(); - if ((trimmed.StartsWith("{", StringComparison.Ordinal) && trimmed.EndsWith("}", StringComparison.Ordinal)) - || (trimmed.StartsWith("[", StringComparison.Ordinal) && trimmed.EndsWith("]", StringComparison.Ordinal))) - { - try - { - return ChatParser.ParseText(trimmed); - } - catch - { - } - } - - return text; - } - - private static bool IsSignMaterial(Material material) - { - return material.ToString().Contains("Sign", StringComparison.Ordinal); - } - - private static (int x, int y, int z) ToBlockKey(Location location) - { - Location blockLocation = location.ToFloor(); - return ((int)blockLocation.X, (int)blockLocation.Y, (int)blockLocation.Z); - } - - private static bool SupportsRecipeBook(ContainerType containerType) - { - return containerType switch - { - ContainerType.PlayerInventory or - ContainerType.Crafting or - ContainerType.Furnace or - ContainerType.BlastFurnace or - ContainerType.Smoker or - ContainerType.Stonecutter => true, - _ => false, - }; - } - - private void ClearUnlockedRecipes() - { - lock (recipeBookLock) - { - unlockedRecipes.Clear(); - } - } - - /// - /// Normalize a recipe argument for the target protocol version. - /// Legacy recipe-book packets use identifiers and default to the minecraft namespace. - /// 1.21.2+ recipe-book packets use numeric recipe display ids and should be left trimmed-only. - /// - internal static string NormalizeRecipeArgument(string recipeId, int protocolVersion) - { - return protocolVersion >= Protocol18Handler.MC_1_21_2_Version - ? recipeId.Trim() - : NormalizeRecipeId(recipeId); - } - - private static string NormalizeRecipeId(string recipeId) - { - string trimmedRecipeId = recipeId.Trim(); - if (trimmedRecipeId.Length == 0) - return string.Empty; - - return trimmedRecipeId.Contains(':', StringComparison.Ordinal) - ? trimmedRecipeId - : "minecraft:" + trimmedRecipeId; - } - - #endregion - } -} diff --git a/MinecraftClient/Mcp/IMccMcpCapabilities.cs b/MinecraftClient/Mcp/IMccMcpCapabilities.cs deleted file mode 100644 index 055fb56146..0000000000 --- a/MinecraftClient/Mcp/IMccMcpCapabilities.cs +++ /dev/null @@ -1,66 +0,0 @@ -namespace MinecraftClient.Mcp; - -public interface IMccMcpCapabilities -{ - MccMcpResult GetSessionStatus(); - MccMcpResult GetServerInfo(); - MccMcpResult GetPlayerState(); - MccMcpResult GetWorldState(); - MccMcpResult GetChunkStatus(double? x, double? y, double? z); - MccMcpResult RaycastBlock(double maxDistance, bool includeNeighbors); - MccMcpResult PreviewPath(double x, double y, double z, bool allowUnsafe, int maxOffset, int minOffset, int timeoutMs, int maxWaypoints); - MccMcpResult GetPlayersList(); - MccMcpResult GetPlayersDetailed(bool includeSelf, bool includeCoordinates); - MccMcpResult GetPlayerStats(); - MccMcpResult GetStatusEffects(); - MccMcpResult GetRecentEvents(long afterId, int maxCount, string? typeFilter); - MccMcpResult GetLoadedBots(); - MccMcpResult GetChatHistory(int maxCount, bool includeJson); - MccMcpResult GetInternalCommands(); - MccMcpResult GetMaterialsList(string? filter, int maxCount); - MccMcpResult GetBlockTypesList(string? filter, int maxCount); - MccMcpResult GetEntityTypesList(string? filter, int maxCount); - MccMcpResult SendChat(string text); - MccMcpResult QuitClient(); - MccMcpResult DisconnectClient(); - MccMcpResult Respawn(); - MccMcpResult RunInternalCommand(string command); - MccMcpResult PlayAnimation(string hand); - MccMcpResult ToggleSneak(bool enabled); - MccMcpResult ToggleSprint(bool enabled); - MccMcpResult UseItemOnHand(); - MccMcpResult ChangeHotbarSlot(int slot); - MccMcpResult SelectHotbarItem(string itemType, bool preferLowestSlot); - MccMcpResult UseItemOnBlock(double x, double y, double z); - MccMcpResult DigBlock(double x, double y, double z, double durationSeconds); - MccMcpResult PlaceBlock(int x, int y, int z, string face, string hand, bool lookAtBlock); - MccMcpResult InteractEntity(int entityId, string interaction, string hand); - MccMcpResult AttackEntity(int entityId); - MccMcpResult ScanNearbyBlocks(int radius, int maxCount, string? materialFilter); - MccMcpResult FindBlocks(string? query, int radius, int maxCount, bool exactMatch); - MccMcpResult IsPlayerNearby(string? playerName, double radius, bool includeSelf); - MccMcpResult LocatePlayer(string playerName, bool includeSelf); - MccMcpResult FindNearestEntity(string? typeFilter, string? nameFilter, double radius, bool includePlayers); - MccMcpResult CanReachPosition(double x, double y, double z, bool allowUnsafe, int maxOffset, int minOffset, int timeoutMs); - MccMcpResult MoveTo(double x, double y, double z, bool allowUnsafe, bool allowDirectTeleport, int maxOffset, int minOffset, int timeoutMs); - MccMcpResult MoveToPlayer(string playerName, bool allowUnsafe, bool allowDirectTeleport, int maxOffset, int minOffset, int timeoutMs); - MccMcpResult LookAt(double x, double y, double z); - MccMcpResult LookDirection(string direction); - MccMcpResult LookAngles(float yaw, float pitch); - MccMcpResult ListInventories(); - MccMcpResult GetInventorySnapshot(int inventoryId); - MccMcpResult SearchInventories(string query, int maxCount, bool exactMatch, bool includeContainers); - MccMcpResult OpenContainerAt(int x, int y, int z, int timeoutMs, bool closeCurrent); - MccMcpResult CloseContainer(int inventoryId, int timeoutMs); - MccMcpResult InventoryWindowAction(int inventoryId, int slotId, string actionType); - MccMcpResult DropInventoryItem(string itemType, int count, int inventoryId, bool preferStack); - MccMcpResult DepositContainerItem(string itemType, int count, int inventoryId, bool preferLargestStack); - MccMcpResult WithdrawContainerItem(string itemType, int count, int inventoryId, bool preferLargestStack); - MccMcpResult QueryEntities(int maxCount); - MccMcpResult ListEntities(int maxCount, string? typeFilter, double radius); - MccMcpResult GetEntityInfo(int entityId, bool includeMetadata, bool includeEquipment, bool includeEffects); - MccMcpResult FindSigns(string text, bool exactMatch, int radius, int maxCount, bool includeBackText); - MccMcpResult ListItemEntities(string? itemType, double radius, int maxCount); - MccMcpResult PickupItems(string itemType, double radius, int maxItems, bool allowUnsafe, int timeoutMs); - MccMcpResult GetWorldBlockAt(int x, int y, int z); -} diff --git a/MinecraftClient/Mcp/MccEmbeddedMcpHost.cs b/MinecraftClient/Mcp/MccEmbeddedMcpHost.cs deleted file mode 100644 index a40b718342..0000000000 --- a/MinecraftClient/Mcp/MccEmbeddedMcpHost.cs +++ /dev/null @@ -1,135 +0,0 @@ -using System; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using ModelContextProtocol.Server; - -namespace MinecraftClient.Mcp; - -public sealed class MccEmbeddedMcpHost -{ - private readonly MccMcpConfig config; - private readonly IMccMcpCapabilities capabilities; - private readonly object stateLock = new(); - private WebApplication? app; - - public MccEmbeddedMcpHost(MccMcpConfig config, IMccMcpCapabilities capabilities) - { - this.config = config; - this.capabilities = capabilities; - } - - public bool IsRunning - { - get - { - lock (stateLock) - { - return app is not null; - } - } - } - - public string Endpoint => $"http://{config.Transport.BindHost}:{config.Transport.Port}{NormalizeRoute(config.Transport.Route)}"; - - public bool Start(out string? error) - { - lock (stateLock) - { - error = null; - if (app is not null) - return true; - - string route = NormalizeRoute(config.Transport.Route); - string bindHost = string.IsNullOrWhiteSpace(config.Transport.BindHost) ? "127.0.0.1" : config.Transport.BindHost.Trim(); - if (config.Transport.Port is < 1 or > 65535) - { - error = "invalid_port"; - return false; - } - - string? requiredToken = null; - if (config.Transport.RequireAuthToken) - { - requiredToken = Environment.GetEnvironmentVariable(config.Transport.AuthTokenEnvVar); - if (string.IsNullOrWhiteSpace(requiredToken)) - { - error = "missing_auth_token"; - return false; - } - } - - WebApplicationBuilder builder = WebApplication.CreateBuilder(); - builder.Logging.ClearProviders(); - builder.Logging.AddFilter(_ => false); - builder.Services.AddSingleton(capabilities); - builder.Services.AddSingleton(config); - builder.Services.AddSingleton(); - builder.Services.AddMcpServer() - .WithHttpTransport() - .WithTools() - .WithPrompts(); - - builder.WebHost.UseUrls($"http://{bindHost}:{config.Transport.Port}"); - WebApplication builtApp = builder.Build(); - - if (config.Transport.RequireAuthToken) - { - builtApp.Use(async (context, next) => - { - if (context.Request.Path.StartsWithSegments(route, StringComparison.OrdinalIgnoreCase)) - { - string auth = context.Request.Headers.Authorization.ToString(); - if (!auth.StartsWith("Bearer ", StringComparison.OrdinalIgnoreCase) - || !string.Equals(auth[7..], requiredToken, StringComparison.Ordinal)) - { - context.Response.StatusCode = StatusCodes.Status401Unauthorized; - await context.Response.WriteAsync("Unauthorized"); - return; - } - } - - await next(); - }); - } - - builtApp.MapMcp(route); - builtApp.StartAsync().GetAwaiter().GetResult(); - app = builtApp; - return true; - } - } - - public bool Stop(out string? error) - { - lock (stateLock) - { - error = null; - if (app is null) - return true; - - try - { - app.StopAsync().GetAwaiter().GetResult(); - app.DisposeAsync().AsTask().GetAwaiter().GetResult(); - app = null; - return true; - } - catch - { - error = "stop_failed"; - return false; - } - } - } - - private static string NormalizeRoute(string route) - { - string normalized = string.IsNullOrWhiteSpace(route) ? "/mcp" : route.Trim(); - if (!normalized.StartsWith('/')) - normalized = '/' + normalized; - return normalized; - } -} diff --git a/MinecraftClient/Mcp/MccMcpCapabilities.cs b/MinecraftClient/Mcp/MccMcpCapabilities.cs deleted file mode 100644 index a0fd431073..0000000000 --- a/MinecraftClient/Mcp/MccMcpCapabilities.cs +++ /dev/null @@ -1,3269 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using MinecraftClient.CommandHandler; -using MinecraftClient.Inventory; -using MinecraftClient.Mapping; -using MinecraftClient.Protocol; -using MinecraftClient.Protocol.Message; -using MinecraftClient.Scripting; - -namespace MinecraftClient.Mcp; - -public sealed class MccMcpCapabilities : IMccMcpCapabilities -{ - private static readonly StringComparer NameComparer = StringComparer.OrdinalIgnoreCase; - private static readonly double[] s_defaultDigAttemptDurations = [1.5, 3.0, 5.0]; - private const int CoordinateRoundingPrecision = 2; - private const double SelfEntityDistanceThreshold = 0.2; - private const int MaxBlockScanRadius = 12; - private const int MaxBlockFindRadius = 32; - private const double MaxRaycastDistance = 128.0; - private const double DigReachDistance = 5.0; - private const double DigReachDistanceSquared = DigReachDistance * DigReachDistance; - private const int DefaultPathQueryTimeoutMs = 5000; - private const int MinPathQueryTimeoutMs = 250; - private const int MaxPathQueryTimeoutMs = 15000; - private const int DefaultArrivalWaitMs = 3500; - private const int MinArrivalWaitMs = 250; - private const int MaxArrivalWaitMs = 15000; - private const double DefaultArrivalTolerance = 1.5; - private const int ArrivalPollIntervalMs = 125; - private const int MaxBlockVerifyWaitMs = 12000; - private const int DefaultContainerWaitMs = 5000; - private const int MinContainerWaitMs = 250; - private const int MaxContainerWaitMs = 20000; - private const int DefaultInventoryActionWaitMs = 3500; - private const int MaxPathPreviewWaypoints = 1000; - - private sealed class InternalCommandInfo - { - public required string Name { get; init; } - public required string Usage { get; init; } - public required string Description { get; init; } - } - - private sealed class NearbyPlayerSnapshot - { - public required int EntityId { get; init; } - public required Guid Uuid { get; init; } - public string? Name { get; set; } - public string? CustomName { get; init; } - public required double X { get; init; } - public required double Y { get; init; } - public required double Z { get; init; } - public required double Distance { get; init; } - public required int Latency { get; init; } - } - - private sealed class NearbyItemSnapshot - { - public required int EntityId { get; init; } - public required ItemType ItemType { get; init; } - public required string TypeLabel { get; init; } - public required int Count { get; init; } - public required double X { get; init; } - public required double Y { get; init; } - public required double Z { get; init; } - public required double Distance { get; init; } - } - - private enum InventoryTransferDirection - { - Deposit, - Withdraw - } - - private readonly Func togglesProvider; - private readonly MccGameApi game; - - public MccMcpCapabilities(Func togglesProvider) - { - this.togglesProvider = togglesProvider; - game = new MccGameApi(GetClient); - } - - private static McClient? GetClient() - { - return McClient.Instance as McClient; - } - - private static MccMcpResult NotConnected() - { - return MccMcpResult.Fail("disconnected"); - } - - private static MccMcpResult ToMcpResult(MccGameResult result) - { - return result.Success - ? MccMcpResult.Ok(message: result.Message) - : MccMcpResult.Fail(result.ErrorCode ?? "unknown", result.Message); - } - - private static MccMcpResult ToMcpResult(MccGameResult result) - { - return result.Success - ? MccMcpResult.Ok(result.Data, result.Message) - : MccMcpResult.Fail(result.ErrorCode ?? "unknown", result.Message, result.Data); - } - - private bool IsCategoryEnabled(Func selector) - { - return selector(togglesProvider()); - } - - public MccMcpResult GetSessionStatus() - { - if (!IsCategoryEnabled(t => t.SessionStatus)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - return client.InvokeOnMainThread(() => - { - Location location = client.GetCurrentLocation(); - return MccMcpResult.Ok(new - { - host = client.GetServerHost(), - port = client.GetServerPort(), - username = client.GetUsername(), - protocolVersion = client.GetProtocolVersion(), - terrainEnabled = client.GetTerrainEnabled(), - inventoryEnabled = client.GetInventoryEnabled(), - entityEnabled = client.GetEntityHandlingEnabled(), - location = ToCoordinate(location) - }); - }); - } - - public MccMcpResult GetServerInfo() - { - if (!IsCategoryEnabled(t => t.SessionStatus)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - return client.InvokeOnMainThread(() => MccMcpResult.Ok(new - { - host = client.GetServerHost(), - port = client.GetServerPort(), - tps = client.GetServerTPS() - })); - } - - public MccMcpResult GetPlayerState() - { - if (!IsCategoryEnabled(t => t.SessionStatus)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - return client.InvokeOnMainThread(() => - { - Location location = client.GetCurrentLocation(); - Dictionary effects = client.GetPlayerEffects(); - return MccMcpResult.Ok(new - { - nickname = client.GetUsername(), - username = client.GetUsername(), - health = client.GetHealth(), - saturation = client.GetSaturation(), - gamemode = client.GetGamemode(), - currentSlot = client.GetCurrentSlot() + 1, - yaw = client.GetYaw(), - pitch = client.GetPitch(), - location = ToCoordinate(location), - effects = effects.Values.Select(effect => new - { - id = effect.Effect.ToString(), - amplifier = effect.Amplifier, - remainingSeconds = effect.RemainingSeconds, - isInfinite = effect.IsInfinite - }).ToArray() - }); - }); - } - - public MccMcpResult GetWorldState() - { - if (!IsCategoryEnabled(t => t.SessionStatus)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - return client.InvokeOnMainThread(() => - { - Location location = client.GetCurrentLocation(); - World world = client.GetWorld(); - Dimension dimension = World.GetDimension(); - MccRuntimeStateSnapshot runtimeState = game.GetRuntimeState(); - int totalChunkCount = world.chunkCnt; - int pendingChunkCount = Math.Max(0, world.chunkLoadNotCompleted); - int loadedChunkCount = GetLoadedChunkCount(world); - - return MccMcpResult.Ok(new - { - host = client.GetServerHost(), - port = client.GetServerPort(), - username = client.GetUsername(), - protocol = client.GetProtocolVersion(), - protocolVersion = client.GetProtocolVersion(), - terrainEnabled = client.GetTerrainEnabled(), - inventoryEnabled = client.GetInventoryEnabled(), - entityEnabled = client.GetEntityHandlingEnabled(), - entityHandlingEnabled = client.GetEntityHandlingEnabled(), - location = ToCoordinate(location), - tps = client.GetServerTPS(), - dimension = dimension.Name, - dimensionDetails = new - { - name = dimension.Name, - minY = dimension.minY, - maxY = dimension.maxY, - height = dimension.height, - logicalHeight = dimension.logicalHeight, - coordinateScale = dimension.coordinateScale, - hasSkylight = dimension.hasSkylight, - hasCeiling = dimension.hasCeiling, - fixedTime = dimension.fixedTime >= 0 ? dimension.fixedTime : (long?)null - }, - loadedChunkCount, - pendingChunkCount, - totalChunkCount, - loadRatio = GetChunkLoadRatio(world), - worldAge = runtimeState.WorldAge, - timeOfDay = runtimeState.TimeOfDay, - rainLevel = runtimeState.RainLevel, - thunderLevel = runtimeState.ThunderLevel - }); - }); - } - - public MccMcpResult GetChunkStatus(double? x, double? y, double? z) - { - if (!IsCategoryEnabled(t => t.EntityWorld)) - return MccMcpResult.Fail("capability_disabled"); - - if (!HasCompleteCoordinateTriple(x, y, z)) - return MccMcpResult.Fail("invalid_args"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - if (!client.GetTerrainEnabled()) - return MccMcpResult.Fail("feature_disabled"); - - return client.InvokeOnMainThread(() => - { - Location queryLocation = x.HasValue && y.HasValue && z.HasValue - ? new Location(x.Value, y.Value, z.Value) - : client.GetCurrentLocation(); - - World world = client.GetWorld(); - ChunkColumn? chunkColumn = world.GetChunkColumn(queryLocation); - return MccMcpResult.Ok(new - { - location = ToCoordinate(queryLocation), - chunk = new - { - x = queryLocation.ChunkX, - z = queryLocation.ChunkZ - }, - chunkX = queryLocation.ChunkX, - chunkZ = queryLocation.ChunkZ, - loaded = chunkColumn is not null, - fullyLoaded = chunkColumn?.FullyLoaded ?? false, - loadedChunkCount = GetLoadedChunkCount(world), - pendingChunkCount = Math.Max(0, world.chunkLoadNotCompleted), - totalChunkCount = world.chunkCnt, - loadRatio = GetChunkLoadRatio(world) - }); - }); - } - - public MccMcpResult RaycastBlock(double maxDistance, bool includeNeighbors) - { - if (!IsCategoryEnabled(t => t.EntityWorld)) - return MccMcpResult.Fail("capability_disabled"); - - if (maxDistance <= 0 || maxDistance > MaxRaycastDistance) - { - return MccMcpResult.Fail("invalid_args", data: new - { - parameter = "maxDistance", - minExclusive = 0, - max = MaxRaycastDistance - }); - } - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - if (!client.GetTerrainEnabled()) - return MccMcpResult.Fail("feature_disabled"); - - return client.InvokeOnMainThread(() => - { - Location playerLocation = client.GetCurrentLocation(); - Location eyeLocation = playerLocation.EyesLocation(); - Tuple raycast = RaycastHelper.RaycastBlock(client, maxDistance, includeFluids: false); - if (!raycast.Item1) - { - return MccMcpResult.Ok(new - { - hit = false, - maxDistance, - playerLocation = ToCoordinate(playerLocation), - eyeLocation = ToCoordinate(eyeLocation), - location = (object?)null, - block = (object?)null, - distance = (double?)null, - eyeDistance = (double?)null, - neighbors = (object?)null - }); - } - - Location blockLocation = raycast.Item2; - Block block = raycast.Item3; - Location targetCenter = blockLocation.ToCenter(); - object? neighbors = includeNeighbors ? GetNeighborBlockSnapshot(client.GetWorld(), blockLocation) : null; - - return MccMcpResult.Ok(new - { - hit = true, - maxDistance, - playerLocation = ToCoordinate(playerLocation), - eyeLocation = ToCoordinate(eyeLocation), - location = ToCoordinate(blockLocation), - block = ToBlockState(block), - distance = playerLocation.Distance(targetCenter), - eyeDistance = eyeLocation.Distance(targetCenter), - neighbors - }); - }); - } - - public MccMcpResult PreviewPath(double x, double y, double z, bool allowUnsafe, int maxOffset, int minOffset, int timeoutMs, int maxWaypoints) - { - if (!IsCategoryEnabled(t => t.Movement)) - return MccMcpResult.Fail("capability_disabled"); - return ToMcpResult(game.PreviewPath(x, y, z, allowUnsafe, maxOffset, minOffset, timeoutMs, maxWaypoints)); - } - - public MccMcpResult GetPlayersList() - { - if (!IsCategoryEnabled(t => t.SessionStatus)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - return client.InvokeOnMainThread(() => MccMcpResult.Ok(new - { - players = client.GetOnlinePlayers() - })); - } - - public MccMcpResult GetPlayersDetailed(bool includeSelf, bool includeCoordinates) - { - if (!IsCategoryEnabled(t => t.SessionStatus)) - return MccMcpResult.Fail("capability_disabled"); - return ToMcpResult(game.GetPlayersDetailed(includeSelf, includeCoordinates)); - } - - public MccMcpResult GetPlayerStats() - { - if (!IsCategoryEnabled(t => t.SessionStatus)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - return client.InvokeOnMainThread(() => - { - Location location = client.GetCurrentLocation(); - return MccMcpResult.Ok(new - { - username = client.GetUsername(), - health = client.GetHealth(), - saturation = client.GetSaturation(), - level = client.GetLevel(), - totalExperience = client.GetTotalExperience(), - gamemode = client.GetGamemode(), - playerEntityId = client.GetPlayerEntityID(), - currentSlot = client.GetCurrentSlot() + 1, - yaw = client.GetYaw(), - pitch = client.GetPitch(), - location = ToCoordinate(location), - tps = client.GetServerTPS() - }); - }); - } - - public MccMcpResult GetStatusEffects() - { - if (!IsCategoryEnabled(t => t.SessionStatus)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - return client.InvokeOnMainThread(() => - { - var effects = client.GetPlayerEffects() - .Values - .Where(effect => !effect.IsExpired) - .OrderBy(effect => effect.Effect) - .Select(effect => new - { - id = effect.Effect.ToString(), - name = effect.GetDisplayName(), - amplifier = effect.Amplifier, - remainingSeconds = effect.RemainingSeconds, - isInfinite = effect.IsInfinite - }) - .ToArray(); - - return MccMcpResult.Ok(new - { - count = effects.Length, - effects - }); - }); - } - - public MccMcpResult GetRecentEvents(long afterId, int maxCount, string? typeFilter) - { - if (!IsCategoryEnabled(t => t.SessionStatus)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - return MccMcpResult.Ok(game.GetRecentEvents(afterId, maxCount, typeFilter)); - } - - public MccMcpResult GetLoadedBots() - { - if (!IsCategoryEnabled(t => t.SessionStatus)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - return client.InvokeOnMainThread(() => - { - var bots = client.GetLoadedChatBots() - .Select(bot => new - { - name = bot.GetType().Name, - fullTypeName = bot.GetType().FullName, - isScript = bot is MinecraftClient.ChatBots.Script - }) - .OrderBy(bot => bot.name, StringComparer.OrdinalIgnoreCase) - .ToArray(); - - return MccMcpResult.Ok(new - { - count = bots.Length, - bots - }); - }); - } - - public MccMcpResult GetChatHistory(int maxCount, bool includeJson) - { - if (!IsCategoryEnabled(t => t.SessionStatus)) - return MccMcpResult.Fail("capability_disabled"); - - if (GetClient() is null) - return NotConnected(); - - return MccMcpResult.Ok(game.GetChatHistory(maxCount, includeJson)); - } - - public MccMcpResult GetInternalCommands() - { - if (!IsCategoryEnabled(t => t.ChatAndCommands)) - return MccMcpResult.Fail("capability_disabled"); - - Type[] commandTypes = Program.GetTypesInNamespace("MinecraftClient.Commands"); - List commands = new(); - - foreach (Type type in commandTypes) - { - if (!type.IsSubclassOf(typeof(Command))) - continue; - - try - { - if (Activator.CreateInstance(type) is Command cmd) - { - commands.Add(new InternalCommandInfo - { - Name = cmd.CmdName, - Usage = cmd.CmdUsage, - Description = ChatBot.GetVerbatim(cmd.CmdDesc) - }); - } - } - catch - { - // ignore command constructors that fail for reflection-only list generation. - } - } - - InternalCommandInfo[] ordered = commands - .OrderBy(command => command.Name, StringComparer.OrdinalIgnoreCase) - .ToArray(); - - return MccMcpResult.Ok(new - { - count = ordered.Length, - commands = ordered.Select(command => new - { - name = command.Name, - usage = command.Usage, - description = command.Description - }).ToArray() - }); - } - - public MccMcpResult GetMaterialsList(string? filter, int maxCount) - { - if (!IsCategoryEnabled(t => t.EntityWorld)) - return MccMcpResult.Fail("capability_disabled"); - - int limit = Math.Clamp(maxCount, 1, 5000); - string? normalizedFilter = string.IsNullOrWhiteSpace(filter) ? null : filter.Trim(); - Material[] allMaterials = Enum.GetValues(); - var materials = allMaterials - .Select(material => new - { - name = material.ToString(), - typeLabel = GetMaterialTypeLabel(material) - }) - .Where(material => normalizedFilter is null - || TextMatchesFilter(material.name, normalizedFilter) - || TextMatchesFilter(material.typeLabel, normalizedFilter)) - .OrderBy(material => material.name, StringComparer.OrdinalIgnoreCase) - .Take(limit) - .ToArray(); - - return MccMcpResult.Ok(new - { - total = allMaterials.Length, - count = materials.Length, - filter = normalizedFilter, - materials - }); - } - - public MccMcpResult GetBlockTypesList(string? filter, int maxCount) - { - if (!IsCategoryEnabled(t => t.EntityWorld)) - return MccMcpResult.Fail("capability_disabled"); - - int limit = Math.Clamp(maxCount, 1, 5000); - string? normalizedFilter = string.IsNullOrWhiteSpace(filter) ? null : filter.Trim(); - Material[] allMaterials = Enum.GetValues(); - var blockTypes = allMaterials - .Select(material => new - { - name = material.ToString(), - typeLabel = GetMaterialTypeLabel(material) - }) - .Where(blockType => normalizedFilter is null - || TextMatchesFilter(blockType.name, normalizedFilter) - || TextMatchesFilter(blockType.typeLabel, normalizedFilter)) - .OrderBy(blockType => blockType.name, StringComparer.OrdinalIgnoreCase) - .Take(limit) - .ToArray(); - - return MccMcpResult.Ok(new - { - total = allMaterials.Length, - count = blockTypes.Length, - filter = normalizedFilter, - blockTypes - }); - } - - public MccMcpResult GetEntityTypesList(string? filter, int maxCount) - { - if (!IsCategoryEnabled(t => t.EntityWorld)) - return MccMcpResult.Fail("capability_disabled"); - - int limit = Math.Clamp(maxCount, 1, 5000); - string? normalizedFilter = string.IsNullOrWhiteSpace(filter) ? null : filter.Trim(); - EntityType[] allEntityTypes = Enum.GetValues(); - var entityTypes = allEntityTypes - .Select(entityType => new - { - name = entityType.ToString(), - typeLabel = Entity.GetTypeString(entityType) - }) - .Where(entityType => normalizedFilter is null - || TextMatchesFilter(entityType.name, normalizedFilter) - || TextMatchesFilter(entityType.typeLabel, normalizedFilter)) - .OrderBy(entityType => entityType.name, StringComparer.OrdinalIgnoreCase) - .Take(limit) - .ToArray(); - - return MccMcpResult.Ok(new - { - total = allEntityTypes.Length, - count = entityTypes.Length, - filter = normalizedFilter, - entityTypes - }); - } - - public MccMcpResult SendChat(string text) - { - if (!IsCategoryEnabled(t => t.ChatAndCommands)) - return MccMcpResult.Fail("capability_disabled"); - - if (string.IsNullOrWhiteSpace(text)) - return MccMcpResult.Fail("invalid_args"); - - string normalized = text.Trim(); - if (normalized.Equals("quit", StringComparison.OrdinalIgnoreCase) - || normalized.Equals("exit", StringComparison.OrdinalIgnoreCase)) - { - return MccMcpResult.Fail("internal_command_text_blocked"); - } - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - bool sent = client.InvokeOnMainThread(() => - { - client.SendText(normalized); - return true; - }); - - return sent ? MccMcpResult.Ok() : MccMcpResult.Fail("action_failed"); - } - - public MccMcpResult QuitClient() - { - if (!IsCategoryEnabled(t => t.ChatAndCommands)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - _ = Task.Run(async () => - { - await Task.Delay(150).ConfigureAwait(false); - Program.Exit(); - }); - - return MccMcpResult.Ok(new { quitting = true }); - } - - public MccMcpResult DisconnectClient() - { - if (!IsCategoryEnabled(t => t.ChatAndCommands)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - _ = Task.Run(async () => - { - await Task.Delay(150).ConfigureAwait(false); - client.Disconnect(); - }); - - return MccMcpResult.Ok(new { disconnecting = true }); - } - - public MccMcpResult Respawn() - { - if (!IsCategoryEnabled(t => t.ChatAndCommands)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - float health = client.InvokeOnMainThread(client.GetHealth); - if (health > 0) - { - return MccMcpResult.Fail("invalid_state", data: new - { - health - }); - } - - bool ok = client.InvokeOnMainThread(client.SendRespawnPacket); - return ok - ? MccMcpResult.Ok(new { success = true }) - : MccMcpResult.Fail("action_failed", data: new { success = false }); - } - - public MccMcpResult RunInternalCommand(string command) - { - if (!IsCategoryEnabled(t => t.ChatAndCommands)) - return MccMcpResult.Fail("capability_disabled"); - - if (string.IsNullOrWhiteSpace(command)) - return MccMcpResult.Fail("invalid_args"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - return ExecuteInternalCommand(client, command.Trim()); - } - - public MccMcpResult PlayAnimation(string hand) - { - if (!IsCategoryEnabled(t => t.Movement)) - return MccMcpResult.Fail("capability_disabled"); - - if (string.IsNullOrWhiteSpace(hand) || !Enum.TryParse(hand, true, out Hand parsedHand)) - return MccMcpResult.Fail("invalid_args"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - int animation = parsedHand == Hand.MainHand ? 1 : 0; - bool ok = client.DoAnimation(animation); - object resultData = new { success = ok, hand = parsedHand.ToString() }; - return ok - ? MccMcpResult.Ok(resultData) - : MccMcpResult.Fail("action_failed", data: resultData); - } - - public MccMcpResult ToggleSneak(bool enabled) - { - if (!IsCategoryEnabled(t => t.Movement)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - EntityActionType action = enabled ? EntityActionType.StartSneaking : EntityActionType.StopSneaking; - bool ok = client.InvokeOnMainThread(() => - { - bool actionResult = client.SendEntityAction(action); - if (actionResult) - client.IsSneaking = enabled; - return actionResult; - }); - - object resultData = new { success = ok, enabled }; - return ok - ? MccMcpResult.Ok(resultData) - : MccMcpResult.Fail("action_failed", data: resultData); - } - - public MccMcpResult ToggleSprint(bool enabled) - { - if (!IsCategoryEnabled(t => t.Movement)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - EntityActionType action = enabled ? EntityActionType.StartSprinting : EntityActionType.StopSprinting; - bool ok = client.SendEntityAction(action); - object resultData = new { success = ok, enabled }; - return ok - ? MccMcpResult.Ok(resultData) - : MccMcpResult.Fail("action_failed", data: resultData); - } - - public MccMcpResult UseItemOnHand() - { - if (!IsCategoryEnabled(t => t.Movement)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - bool ok = client.InvokeOnMainThread(() => client.UseItemOnHand()); - return MccMcpResult.Ok(new { success = ok }); - } - - public MccMcpResult ChangeHotbarSlot(int slot) - { - if (!IsCategoryEnabled(t => t.Inventory)) - return MccMcpResult.Fail("capability_disabled"); - - if (slot is < 1 or > 9) - return MccMcpResult.Fail("invalid_args"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - if (!client.GetInventoryEnabled()) - return MccMcpResult.Fail("feature_disabled"); - - bool ok = client.InvokeOnMainThread(() => client.ChangeSlot((short)(slot - 1))); - return MccMcpResult.Ok(new { success = ok, slot }); - } - - public MccMcpResult SelectHotbarItem(string itemType, bool preferLowestSlot) - { - if (!IsCategoryEnabled(t => t.Inventory)) - return MccMcpResult.Fail("capability_disabled"); - return ToMcpResult(game.SelectHotbarItem(itemType, preferLowestSlot)); - } - - public MccMcpResult UseItemOnBlock(double x, double y, double z) - { - if (!IsCategoryEnabled(t => t.Movement)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - if (!client.GetTerrainEnabled()) - return MccMcpResult.Fail("feature_disabled"); - - string sx = x.ToString(CultureInfo.InvariantCulture); - string sy = y.ToString(CultureInfo.InvariantCulture); - string sz = z.ToString(CultureInfo.InvariantCulture); - return ExecuteInternalCommand(client, $"useitem {sx} {sy} {sz}"); - } - - public MccMcpResult DigBlock(double x, double y, double z, double durationSeconds) - { - if (!IsCategoryEnabled(t => t.Movement)) - return MccMcpResult.Fail("capability_disabled"); - - if (durationSeconds < 0) - { - return MccMcpResult.Fail("invalid_args", data: new - { - parameter = "durationSeconds", - min = 0 - }); - } - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - if (!client.GetTerrainEnabled()) - return MccMcpResult.Fail("feature_disabled"); - - Location target = ToBlockLocation(x, y, z); - Location currentLocation = client.InvokeOnMainThread(client.GetCurrentLocation); - Location eyesLocation = currentLocation.EyesLocation(); - Location centeredTarget = target.ToCenter(); - Block beforeBlock = client.InvokeOnMainThread(() => client.GetWorld().GetBlock(target)); - if (beforeBlock.Type == Material.Air) - { - return MccMcpResult.Fail("invalid_state", data: new - { - target = ToCoordinate(target), - beforeBlock = ToBlockState(beforeBlock) - }); - } - - double distance = eyesLocation.Distance(centeredTarget); - if (distance > DigReachDistance) - { - return MccMcpResult.Fail("action_incomplete", data: new - { - reason = "too_far", - target = ToCoordinate(target), - playerLocation = ToCoordinate(currentLocation), - distance, - maxReach = DigReachDistance, - beforeBlock = ToBlockState(beforeBlock) - }); - } - - double[] attemptDurations = GetDigAttemptDurations(durationSeconds); - List attemptedDurations = new(); - Block afterBlock = beforeBlock; - bool changed = false; - bool commandAccepted = false; - - foreach (double attemptDuration in attemptDurations) - { - attemptedDurations.Add(attemptDuration); - bool accepted = client.InvokeOnMainThread(() => client.DigBlock(target, Direction.Down, duration: attemptDuration)); - commandAccepted |= accepted; - if (!accepted) - continue; - - if (WaitForBlockChange(client, target, beforeBlock, GetDigVerifyWaitMs(attemptDuration), out afterBlock)) - { - changed = true; - break; - } - } - - afterBlock = client.InvokeOnMainThread(() => client.GetWorld().GetBlock(target)); - object resultData = new - { - success = changed, - target = ToCoordinate(target), - beforeBlock = ToBlockState(beforeBlock), - afterBlock = ToBlockState(afterBlock), - commandAccepted, - changed, - destroyed = changed && afterBlock.Type == Material.Air, - attempts = attemptedDurations.Count, - attemptedDurationsSeconds = attemptedDurations.ToArray(), - distance, - playerLocation = ToCoordinate(currentLocation) - }; - - return changed - ? MccMcpResult.Ok(resultData) - : MccMcpResult.Fail("action_incomplete", data: resultData); - } - - public MccMcpResult PlaceBlock(int x, int y, int z, string face, string hand, bool lookAtBlock) - { - if (!IsCategoryEnabled(t => t.Movement)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - if (!client.GetTerrainEnabled()) - return MccMcpResult.Fail("feature_disabled"); - - if (!Enum.TryParse(face, true, out Direction parsedFace)) - return MccMcpResult.Fail("invalid_args"); - - if (!Enum.TryParse(hand, true, out Hand parsedHand)) - return MccMcpResult.Fail("invalid_args"); - - Location location = new(x, y, z); - bool ok = client.InvokeOnMainThread(() => client.PlaceBlock(location, parsedFace, parsedHand, lookAtBlock)); - return MccMcpResult.Ok(new { success = ok, x, y, z, face = parsedFace.ToString(), hand = parsedHand.ToString(), lookAtBlock }); - } - - public MccMcpResult InteractEntity(int entityId, string interaction, string hand) - { - if (!IsCategoryEnabled(t => t.EntityWorld)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - if (!client.GetEntityHandlingEnabled()) - return MccMcpResult.Fail("feature_disabled"); - - if (!Enum.TryParse(interaction, true, out InteractType interactType)) - return MccMcpResult.Fail("invalid_args"); - - if (!Enum.TryParse(hand, true, out Hand parsedHand)) - return MccMcpResult.Fail("invalid_args"); - - bool ok = client.InvokeOnMainThread(() => client.InteractEntity(entityId, interactType, parsedHand)); - return MccMcpResult.Ok(new { success = ok, entityId, interaction = interactType.ToString(), hand = parsedHand.ToString() }); - } - - public MccMcpResult AttackEntity(int entityId) - { - if (!IsCategoryEnabled(t => t.EntityWorld)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - if (!client.GetEntityHandlingEnabled()) - return MccMcpResult.Fail("feature_disabled"); - - return client.InvokeOnMainThread(() => - { - if (!client.GetEntities().ContainsKey(entityId)) - return MccMcpResult.Fail("invalid_state", data: new { entityId }); - - bool ok = client.InteractEntity(entityId, InteractType.Attack); - object resultData = new - { - success = ok, - entityId, - interaction = InteractType.Attack.ToString() - }; - - return ok - ? MccMcpResult.Ok(resultData) - : MccMcpResult.Fail("action_failed", data: resultData); - }); - } - - public MccMcpResult ScanNearbyBlocks(int radius, int maxCount, string? materialFilter) - { - if (!IsCategoryEnabled(t => t.EntityWorld)) - return MccMcpResult.Fail("capability_disabled"); - - if (radius is < 1 or > MaxBlockScanRadius) - { - return MccMcpResult.Fail("invalid_args", data: new - { - parameter = "radius", - min = 1, - max = MaxBlockScanRadius - }); - } - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - if (!client.GetTerrainEnabled()) - return MccMcpResult.Fail("feature_disabled"); - - int limit = Math.Clamp(maxCount, 1, 2000); - string? filter = string.IsNullOrWhiteSpace(materialFilter) ? null : materialFilter.Trim(); - - return client.InvokeOnMainThread(() => - { - Location playerLocation = client.GetCurrentLocation(); - int cx = (int)Math.Floor(playerLocation.X); - int cy = (int)Math.Floor(playerLocation.Y) - 1; - int cz = (int)Math.Floor(playerLocation.Z); - - List found = new(); - World world = client.GetWorld(); - for (int y = cy - radius; y <= cy + radius && found.Count < limit; y++) - { - for (int z = cz - radius; z <= cz + radius && found.Count < limit; z++) - { - for (int x = cx - radius; x <= cx + radius && found.Count < limit; x++) - { - Block block = world.GetBlock(new Location(x, y, z)); - if (block.Type == Material.Air) - continue; - - string material = block.Type.ToString(); - string typeLabel = block.GetTypeString(); - if (filter is not null - && !TextMatchesFilter(material, filter) - && !TextMatchesFilter(typeLabel, filter)) - { - continue; - } - - double dx = x + 0.5 - playerLocation.X; - double dy = y + 0.5 - playerLocation.Y; - double dz = z + 0.5 - playerLocation.Z; - found.Add(new - { - x, - y, - z, - material, - typeLabel, - blockId = block.BlockId, - blockMeta = block.BlockMeta, - stateId = block.StateId, - properties = block.GetStateProperties(), - distance = Math.Sqrt(dx * dx + dy * dy + dz * dz) - }); - } - } - } - - return MccMcpResult.Ok(new - { - center = new { x = cx, y = cy, z = cz }, - radius, - count = found.Count, - blocks = found.ToArray() - }); - }); - } - - public MccMcpResult FindBlocks(string? query, int radius, int maxCount, bool exactMatch) - { - if (!IsCategoryEnabled(t => t.EntityWorld)) - return MccMcpResult.Fail("capability_disabled"); - - if (radius is < 1 or > MaxBlockFindRadius) - { - return MccMcpResult.Fail("invalid_args", data: new - { - parameter = "radius", - min = 1, - max = MaxBlockFindRadius - }); - } - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - if (!client.GetTerrainEnabled()) - return MccMcpResult.Fail("feature_disabled"); - - int limit = Math.Clamp(maxCount, 1, 5000); - string? filter = string.IsNullOrWhiteSpace(query) ? null : query.Trim(); - ParseBlockQuery(filter, out int? blockIdFilter, out int? blockMetaFilter); - - return client.InvokeOnMainThread(() => - { - Location playerLocation = client.GetCurrentLocation(); - int cx = (int)Math.Floor(playerLocation.X); - int cy = (int)Math.Floor(playerLocation.Y) - 1; - int cz = (int)Math.Floor(playerLocation.Z); - - List<(int x, int y, int z, string material, string typeLabel, int blockId, byte blockMeta, int stateId, IReadOnlyDictionary properties, double distance)> found = new(); - World world = client.GetWorld(); - - for (int y = cy - radius; y <= cy + radius && found.Count < limit; y++) - { - for (int z = cz - radius; z <= cz + radius && found.Count < limit; z++) - { - for (int x = cx - radius; x <= cx + radius && found.Count < limit; x++) - { - Block block = world.GetBlock(new Location(x, y, z)); - if (block.Type == Material.Air) - continue; - - if (!BlockMatches(block, filter, exactMatch, blockIdFilter, blockMetaFilter)) - continue; - - double dx = x + 0.5 - playerLocation.X; - double dy = y + 0.5 - playerLocation.Y; - double dz = z + 0.5 - playerLocation.Z; - - found.Add(( - x, - y, - z, - block.Type.ToString(), - block.GetTypeString(), - block.BlockId, - block.BlockMeta, - block.StateId, - block.GetStateProperties(), - Math.Sqrt(dx * dx + dy * dy + dz * dz))); - } - } - } - - return MccMcpResult.Ok(new - { - center = new { x = cx, y = cy, z = cz }, - radius, - query = filter, - exactMatch, - count = found.Count, - blocks = found - .OrderBy(entry => entry.distance) - .Select(entry => new - { - entry.x, - entry.y, - entry.z, - entry.material, - entry.typeLabel, - entry.blockId, - entry.blockMeta, - entry.stateId, - entry.properties, - entry.distance - }) - .ToArray() - }); - }); - } - - public MccMcpResult CanReachPosition(double x, double y, double z, bool allowUnsafe, int maxOffset, int minOffset, int timeoutMs) - { - if (!IsCategoryEnabled(t => t.Movement)) - return MccMcpResult.Fail("capability_disabled"); - - if (!AreValidPathOffsets(maxOffset, minOffset) || timeoutMs < 0) - { - return MccMcpResult.Fail("invalid_args", data: new - { - maxOffset, - minOffset, - timeoutMs - }); - } - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - if (!client.GetTerrainEnabled()) - return MccMcpResult.Fail("feature_disabled"); - - Location goal = new(x, y, z); - Location startLocation = client.InvokeOnMainThread(client.GetCurrentLocation); - World world = client.InvokeOnMainThread(client.GetWorld); - int effectiveTimeoutMs = GetPathQueryTimeoutMs(timeoutMs); - Queue? path = Movement.CalculatePath( - world, - startLocation, - goal, - allowUnsafe, - maxOffset, - minOffset, - TimeSpan.FromMilliseconds(effectiveTimeoutMs)); - Location? finalWaypoint = path?.LastOrDefault(); - double? finalDistance = finalWaypoint is Location waypoint - ? GetDistance(waypoint, goal) - : null; - - return MccMcpResult.Ok(new - { - reachable = path is not null, - exactReachable = finalWaypoint is Location location && location.ToFloor() == goal.ToFloor(), - target = ToCoordinate(goal), - startLocation = ToCoordinate(startLocation), - finalWaypoint = finalWaypoint is Location finalLocation ? ToCoordinate(finalLocation) : null, - finalDistance, - waypointCount = path?.Count ?? 0, - allowUnsafe, - maxOffset, - minOffset, - timeoutMs = effectiveTimeoutMs - }); - } - - public MccMcpResult IsPlayerNearby(string? playerName, double radius, bool includeSelf) - { - if (!IsCategoryEnabled(t => t.EntityWorld)) - return MccMcpResult.Fail("capability_disabled"); - return ToMcpResult(game.IsPlayerNearby(playerName, radius, includeSelf)); - } - - public MccMcpResult LocatePlayer(string playerName, bool includeSelf) - { - if (!IsCategoryEnabled(t => t.EntityWorld)) - return MccMcpResult.Fail("capability_disabled"); - return ToMcpResult(game.LocatePlayer(playerName, includeSelf)); - } - - public MccMcpResult FindNearestEntity(string? typeFilter, string? nameFilter, double radius, bool includePlayers) - { - if (!IsCategoryEnabled(t => t.EntityWorld)) - return MccMcpResult.Fail("capability_disabled"); - return ToMcpResult(game.FindNearestEntity(typeFilter, nameFilter, radius, includePlayers)); - } - - public MccMcpResult MoveTo(double x, double y, double z, bool allowUnsafe, bool allowDirectTeleport, int maxOffset, int minOffset, int timeoutMs) - { - if (!IsCategoryEnabled(t => t.Movement)) - return MccMcpResult.Fail("capability_disabled"); - - if (!AreValidPathOffsets(maxOffset, minOffset) || timeoutMs < 0) - { - return MccMcpResult.Fail("invalid_args", data: new - { - maxOffset, - minOffset, - timeoutMs - }); - } - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - if (!client.GetTerrainEnabled()) - return MccMcpResult.Fail("feature_disabled"); - - Location goal = new(x, y, z); - Location startLocation = client.InvokeOnMainThread(client.GetCurrentLocation); - TimeSpan? timeout = timeoutMs > 0 ? TimeSpan.FromMilliseconds(timeoutMs) : null; - bool pathFound = client.InvokeOnMainThread(() => client.MoveTo(goal, allowUnsafe, allowDirectTeleport, maxOffset, minOffset, timeout)); - - int verifyWaitMs = GetArrivalWaitMs(timeoutMs); - double tolerance = GetArrivalTolerance(maxOffset, minOffset); - Location? finalLocation = null; - bool arrived = pathFound && WaitForArrival(client, goal, verifyWaitMs, tolerance, out finalLocation); - finalLocation ??= client.InvokeOnMainThread(client.GetCurrentLocation); - object resultData = new - { - pathFound, - arrived, - tolerance, - verifyWaitMs, - target = ToCoordinate(goal), - startLocation = ToCoordinate(startLocation), - finalLocation = ToCoordinate(finalLocation.Value), - finalDistance = GetDistance(finalLocation.Value, goal), - distanceMoved = GetDistance(startLocation, finalLocation.Value), - allowUnsafe, - allowDirectTeleport, - maxOffset, - minOffset, - timeoutMs - }; - - return pathFound && arrived - ? MccMcpResult.Ok(resultData) - : MccMcpResult.Fail("action_incomplete", data: resultData); - } - - public MccMcpResult MoveToPlayer(string playerName, bool allowUnsafe, bool allowDirectTeleport, int maxOffset, int minOffset, int timeoutMs) - { - if (!IsCategoryEnabled(t => t.Movement)) - return MccMcpResult.Fail("capability_disabled"); - return ToMcpResult(game.MoveToPlayer(playerName, allowUnsafe, allowDirectTeleport, maxOffset, minOffset, timeoutMs)); - } - - public MccMcpResult LookAt(double x, double y, double z) - { - if (!IsCategoryEnabled(t => t.Movement)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - if (!client.GetTerrainEnabled()) - return MccMcpResult.Fail("feature_disabled"); - - return client.InvokeOnMainThread(() => - { - Location current = client.GetCurrentLocation(); - Location target = new(x, y, z); - client.UpdateLocation(current, target); - bool success = client.SendLocationUpdate(); - return success - ? MccMcpResult.Ok(new - { - success, - yaw = client.GetYaw(), - pitch = client.GetPitch(), - location = ToCoordinate(current), - target = ToCoordinate(target) - }) - : MccMcpResult.Fail("action_failed", data: new - { - success, - target = ToCoordinate(target) - }); - }); - } - - public MccMcpResult LookDirection(string direction) - { - if (!IsCategoryEnabled(t => t.Movement)) - return MccMcpResult.Fail("capability_disabled"); - - if (string.IsNullOrWhiteSpace(direction) || !Enum.TryParse(direction, true, out Direction parsedDirection) || !IsSupportedLookDirection(parsedDirection)) - return MccMcpResult.Fail("invalid_args"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - if (!client.GetTerrainEnabled()) - return MccMcpResult.Fail("feature_disabled"); - - return client.InvokeOnMainThread(() => - { - Location current = client.GetCurrentLocation(); - client.UpdateLocation(current, parsedDirection); - bool success = client.SendLocationUpdate(); - return success - ? MccMcpResult.Ok(new - { - success, - direction = parsedDirection.ToString(), - yaw = client.GetYaw(), - pitch = client.GetPitch(), - location = ToCoordinate(current) - }) - : MccMcpResult.Fail("action_failed", data: new - { - success, - direction = parsedDirection.ToString() - }); - }); - } - - public MccMcpResult LookAngles(float yaw, float pitch) - { - if (!IsCategoryEnabled(t => t.Movement)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - if (!client.GetTerrainEnabled()) - return MccMcpResult.Fail("feature_disabled"); - - return client.InvokeOnMainThread(() => - { - Location current = client.GetCurrentLocation(); - client.UpdateLocation(current, yaw, pitch); - bool success = client.SendLocationUpdate(); - return success - ? MccMcpResult.Ok(new - { - success, - yaw = client.GetYaw(), - pitch = client.GetPitch(), - location = ToCoordinate(current) - }) - : MccMcpResult.Fail("action_failed", data: new - { - success, - yaw, - pitch, - location = ToCoordinate(current) - }); - }); - } - - public MccMcpResult GetInventorySnapshot(int inventoryId) - { - if (!IsCategoryEnabled(t => t.Inventory)) - return MccMcpResult.Fail("capability_disabled"); - return ToMcpResult(game.GetInventorySnapshot(inventoryId)); - } - - public MccMcpResult SearchInventories(string query, int maxCount, bool exactMatch, bool includeContainers) - { - if (!IsCategoryEnabled(t => t.Inventory)) - return MccMcpResult.Fail("capability_disabled"); - return ToMcpResult(game.SearchInventories(query, maxCount, exactMatch, includeContainers)); - } - - public MccMcpResult ListInventories() - { - if (!IsCategoryEnabled(t => t.Inventory)) - return MccMcpResult.Fail("capability_disabled"); - return ToMcpResult(game.ListInventories()); - } - - public MccMcpResult OpenContainerAt(int x, int y, int z, int timeoutMs, bool closeCurrent) - { - if (!IsCategoryEnabled(t => t.Inventory)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - if (!client.GetInventoryEnabled() || !client.GetTerrainEnabled()) - return MccMcpResult.Fail("feature_disabled"); - - Location location = new(x, y, z); - int waitMs = GetContainerWaitMs(timeoutMs); - (Block block, int activeContainerId) state = client.InvokeOnMainThread(() => - { - Block block = client.GetWorld().GetBlock(location); - return (block, GetActiveContainerId(client)); - }); - - if (!IsInteractableContainerMaterial(state.block.Type)) - { - return MccMcpResult.Fail("invalid_state", data: new - { - x, - y, - z, - block = ToBlockState(state.block), - activeContainerId = state.activeContainerId - }); - } - - return OpenContainerCore(client, location, state.block, state.activeContainerId, waitMs, closeCurrent); - } - - public MccMcpResult CloseContainer(int inventoryId, int timeoutMs) - { - if (!IsCategoryEnabled(t => t.Inventory)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - if (!client.GetInventoryEnabled()) - return MccMcpResult.Fail("feature_disabled"); - - int waitMs = GetContainerWaitMs(timeoutMs); - int resolvedInventoryId = client.InvokeOnMainThread(() => ResolveContainerInventoryId(client, inventoryId)); - if (resolvedInventoryId <= 0) - { - if (inventoryId < 0) - { - return MccMcpResult.Ok(new - { - success = true, - closed = false - }); - } - - return MccMcpResult.Fail("invalid_state", data: new { inventoryId }); - } - - bool closeAccepted = client.CloseInventory(resolvedInventoryId); - bool closed = closeAccepted && WaitForContainerClose(client, resolvedInventoryId, waitMs); - var resultData = new - { - success = closeAccepted && closed, - closeAccepted, - closed, - inventoryId = resolvedInventoryId, - timeoutMs = waitMs - }; - - return closeAccepted && closed - ? MccMcpResult.Ok(resultData) - : MccMcpResult.Fail("action_incomplete", data: resultData); - } - - public MccMcpResult InventoryWindowAction(int inventoryId, int slotId, string actionType) - { - if (!IsCategoryEnabled(t => t.Inventory)) - return MccMcpResult.Fail("capability_disabled"); - - if (string.IsNullOrWhiteSpace(actionType)) - return MccMcpResult.Fail("invalid_args"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - if (!client.GetInventoryEnabled()) - return MccMcpResult.Fail("feature_disabled"); - - if (!TryParseWindowAction(actionType, out WindowActionType parsedAction)) - return MccMcpResult.Fail("invalid_args"); - - bool ok = client.InvokeOnMainThread(() => client.DoWindowAction(inventoryId, slotId, parsedAction)); - return MccMcpResult.Ok(new { success = ok, normalizedActionType = parsedAction.ToString() }); - } - - public MccMcpResult DropInventoryItem(string itemType, int count, int inventoryId, bool preferStack) - { - if (!IsCategoryEnabled(t => t.Inventory)) - return MccMcpResult.Fail("capability_disabled"); - - if (string.IsNullOrWhiteSpace(itemType) || count <= 0) - return MccMcpResult.Fail("invalid_args"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - if (!client.GetInventoryEnabled()) - return MccMcpResult.Fail("feature_disabled"); - - if (!TryParseItemType(itemType, out ItemType parsedItemType)) - { - return MccMcpResult.Fail("invalid_args", data: new - { - itemType = itemType.Trim() - }); - } - - return client.InvokeOnMainThread(() => - { - Dictionary inventories = client.GetInventories(); - if (!inventories.TryGetValue(inventoryId, out Container? inventory)) - return MccMcpResult.Fail("invalid_state"); - - int cursorCount = GetCursorItemCount(inventory, parsedItemType); - var matchingSlotQuery = inventory.Items - .Where(pair => IsDroppableInventorySlot(inventory, pair.Key)) - .Where(pair => pair.Value.Type == parsedItemType && pair.Value.Count > 0) - .Select(pair => new - { - slot = pair.Key, - count = pair.Value.Count, - hotbarPriority = inventoryId == 0 && IsHotbarSlot(inventory, pair.Key) ? 0 : 1 - }); - var matchingSlots = (preferStack - ? matchingSlotQuery.OrderBy(pair => pair.hotbarPriority).ThenByDescending(pair => pair.count).ThenBy(pair => pair.slot) - : matchingSlotQuery.OrderBy(pair => pair.hotbarPriority).ThenBy(pair => pair.count).ThenBy(pair => pair.slot)) - .ToArray(); - - int beforeCount = matchingSlots.Sum(pair => pair.count); - if (beforeCount < count) - { - return MccMcpResult.Fail("invalid_state", data: new - { - itemType = parsedItemType.ToString(), - requestedCount = count, - availableCount = beforeCount, - cursorCount, - inventoryId - }); - } - - int remaining = count; - List touchedSlots = new(); - - foreach (var entry in matchingSlots) - { - if (remaining <= 0) - break; - - if (!inventory.Items.TryGetValue(entry.slot, out Item? currentItem) || currentItem.Count <= 0) - continue; - - int dropFromSlot = Math.Min(remaining, currentItem.Count); - touchedSlots.Add(entry.slot); - bool ok = TryDropInventorySlotItems(client, inventoryId, inventory, entry.slot, parsedItemType, dropFromSlot, out int droppedFromSlot); - - if (!ok) - { - Container? failedInventory = client.GetInventory(inventoryId); - int currentCount = failedInventory is null - ? 0 - : failedInventory.Items - .Where(pair => IsDroppableInventorySlot(failedInventory, pair.Key)) - .Where(pair => pair.Value.Type == parsedItemType) - .Sum(pair => pair.Value.Count); - return MccMcpResult.Fail("action_failed", data: new - { - itemType = parsedItemType.ToString(), - requestedCount = count, - droppedCount = count - remaining + droppedFromSlot, - remainingCount = remaining, - currentCount, - inventoryId, - touchedSlots = touchedSlots.ToArray() - }); - } - - remaining -= droppedFromSlot; - } - - Container? finalInventory = client.GetInventory(inventoryId); - int afterCount = finalInventory is null - ? 0 - : finalInventory.Items - .Where(pair => IsDroppableInventorySlot(finalInventory, pair.Key)) - .Where(pair => pair.Value.Type == parsedItemType) - .Sum(pair => pair.Value.Count); - int droppedCount = beforeCount - afterCount; - - if (remaining > 0) - { - return MccMcpResult.Fail("action_failed", data: new - { - itemType = parsedItemType.ToString(), - requestedCount = count, - droppedCount, - remainingCount = remaining, - beforeCount, - afterCount, - inventoryId, - touchedSlots = touchedSlots.ToArray() - }); - } - - return MccMcpResult.Ok(new - { - success = true, - itemType = parsedItemType.ToString(), - requestedCount = count, - droppedCount, - beforeCount, - afterCount, - inventoryId, - touchedSlots = touchedSlots.ToArray() - }); - }); - } - - public MccMcpResult DepositContainerItem(string itemType, int count, int inventoryId, bool preferLargestStack) - { - return TransferContainerItem(itemType, count, inventoryId, preferLargestStack, InventoryTransferDirection.Deposit); - } - - public MccMcpResult WithdrawContainerItem(string itemType, int count, int inventoryId, bool preferLargestStack) - { - return TransferContainerItem(itemType, count, inventoryId, preferLargestStack, InventoryTransferDirection.Withdraw); - } - - public MccMcpResult QueryEntities(int maxCount) - { - if (!IsCategoryEnabled(t => t.EntityWorld)) - return MccMcpResult.Fail("capability_disabled"); - return ToMcpResult(game.QueryEntities(maxCount)); - } - - public MccMcpResult ListEntities(int maxCount, string? typeFilter, double radius) - { - if (!IsCategoryEnabled(t => t.EntityWorld)) - return MccMcpResult.Fail("capability_disabled"); - return ToMcpResult(game.ListEntities(maxCount, typeFilter, radius)); - } - - public MccMcpResult GetEntityInfo(int entityId, bool includeMetadata, bool includeEquipment, bool includeEffects) - { - if (!IsCategoryEnabled(t => t.EntityWorld)) - return MccMcpResult.Fail("capability_disabled"); - return ToMcpResult(game.GetEntityInfo(entityId, includeMetadata, includeEquipment, includeEffects)); - } - - public MccMcpResult FindSigns(string text, bool exactMatch, int radius, int maxCount, bool includeBackText) - { - if (!IsCategoryEnabled(t => t.EntityWorld)) - return MccMcpResult.Fail("capability_disabled"); - - if (string.IsNullOrWhiteSpace(text) || radius is < 1 or > MaxBlockFindRadius) - return MccMcpResult.Fail("invalid_args"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - if (!client.GetTerrainEnabled()) - return MccMcpResult.Fail("feature_disabled"); - - string filter = text.Trim(); - int limit = Math.Clamp(maxCount, 1, 500); - - return client.InvokeOnMainThread(() => - { - Location playerLocation = client.GetCurrentLocation(); - World world = client.GetWorld(); - var signs = client.GetKnownSigns() - .Select(sign => - { - double dx = sign.location.X + 0.5 - playerLocation.X; - double dy = sign.location.Y + 0.5 - playerLocation.Y; - double dz = sign.location.Z + 0.5 - playerLocation.Z; - return new - { - sign, - distance = Math.Sqrt(dx * dx + dy * dy + dz * dz) - }; - }) - .Where(entry => entry.distance <= radius) - .Where(entry => IsSignMaterial(world.GetBlock(entry.sign.location).Type)) - .Select(entry => - { - string[] frontText = entry.sign.frontText.Where(line => !string.IsNullOrWhiteSpace(line)).ToArray(); - string[] backText = includeBackText - ? entry.sign.backText.Where(line => !string.IsNullOrWhiteSpace(line)).ToArray() - : []; - string[] matchedLines = frontText - .Concat(backText) - .Where(line => exactMatch ? TextEqualsFilter(line, filter) : TextMatchesFilter(line, filter)) - .Distinct(NameComparer) - .ToArray(); - - return new - { - entry.sign, - entry.distance, - frontText, - backText, - matchedLines - }; - }) - .Where(entry => entry.matchedLines.Length > 0) - .OrderBy(entry => entry.distance) - .Take(limit) - .Select(entry => new - { - x = (int)Math.Floor(entry.sign.location.X), - y = (int)Math.Floor(entry.sign.location.Y), - z = (int)Math.Floor(entry.sign.location.Z), - material = entry.sign.material, - typeLabel = entry.sign.typeLabel, - distance = entry.distance, - isWaxed = entry.sign.isWaxed, - frontText = entry.frontText, - backText = entry.backText, - matchedLines = entry.matchedLines - }) - .ToArray(); - - return MccMcpResult.Ok(new - { - text = filter, - exactMatch, - radius, - includeBackText, - count = signs.Length, - signs - }); - }); - } - - public MccMcpResult ListItemEntities(string? itemType, double radius, int maxCount) - { - if (!IsCategoryEnabled(t => t.EntityWorld)) - return MccMcpResult.Fail("capability_disabled"); - return ToMcpResult(game.ListItemEntities(itemType, radius, maxCount)); - } - - public MccMcpResult PickupItems(string itemType, double radius, int maxItems, bool allowUnsafe, int timeoutMs) - { - if (!IsCategoryEnabled(t => t.EntityWorld) || !IsCategoryEnabled(t => t.Movement)) - return MccMcpResult.Fail("capability_disabled"); - return ToMcpResult(game.PickupItems(itemType, radius, maxItems, allowUnsafe, timeoutMs)); - } - - public MccMcpResult GetWorldBlockAt(int x, int y, int z) - { - if (!IsCategoryEnabled(t => t.EntityWorld)) - return MccMcpResult.Fail("capability_disabled"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - if (!client.GetTerrainEnabled()) - return MccMcpResult.Fail("feature_disabled"); - - return client.InvokeOnMainThread(() => - { - Location location = new(x, y, z); - Block block = client.GetWorld().GetBlock(location); - return MccMcpResult.Ok(new - { - x, - y, - z, - material = block.Type.ToString(), - blockId = block.BlockId, - blockMeta = block.BlockMeta, - stateId = block.StateId, - properties = block.GetStateProperties() - }); - }); - } - - private static MccMcpResult OpenContainerCore(McClient client, Location location, Block block, int activeContainerId, int waitMs, bool closeCurrent) - { - if (activeContainerId > 0) - { - if (!closeCurrent) - { - return MccMcpResult.Fail("invalid_state", data: new - { - reason = "container_already_open", - activeContainerId, - x = location.X, - y = location.Y, - z = location.Z, - block = ToBlockState(block) - }); - } - - bool closeAccepted = client.CloseInventory(activeContainerId); - bool closed = closeAccepted && WaitForContainerClose(client, activeContainerId, waitMs); - if (!closeAccepted || !closed) - { - return MccMcpResult.Fail("action_incomplete", data: new - { - action = "close_previous_container", - activeContainerId, - closeAccepted, - closed, - timeoutMs = waitMs - }); - } - } - - HashSet beforeIds = client.InvokeOnMainThread(() => client.GetInventories().Keys.Where(id => id > 0).ToHashSet()); - int openedInventoryId = 0; - Container? openedInventory = null; - bool openAccepted = client.InvokeOnMainThread(() => client.PlaceBlock(location, Direction.Down, Hand.MainHand, lookAtBlock: true)); - bool opened = openAccepted && WaitForContainerOpen(client, beforeIds, waitMs, out openedInventoryId, out openedInventory); - var resultData = new - { - success = openAccepted && opened && openedInventory is not null, - openAccepted, - opened, - timeoutMs = waitMs, - x = location.X, - y = location.Y, - z = location.Z, - block = ToBlockState(block), - inventory = openedInventory is null - ? null - : new - { - id = openedInventoryId, - type = openedInventory.Type.ToString(), - title = openedInventory.Title, - slotCount = openedInventory.Type.SlotCount(), - nonEmptySlots = openedInventory.Items.Count - } - }; - - return openAccepted && opened && openedInventory is not null - ? MccMcpResult.Ok(resultData) - : MccMcpResult.Fail("action_incomplete", data: resultData); - } - - private MccMcpResult TransferContainerItem(string itemType, int count, int inventoryId, bool preferLargestStack, InventoryTransferDirection direction) - { - if (!IsCategoryEnabled(t => t.Inventory)) - return MccMcpResult.Fail("capability_disabled"); - - if (string.IsNullOrWhiteSpace(itemType) || count <= 0) - return MccMcpResult.Fail("invalid_args"); - - McClient? client = GetClient(); - if (client is null) - return NotConnected(); - - if (!client.GetInventoryEnabled()) - return MccMcpResult.Fail("feature_disabled"); - - if (!TryParseItemType(itemType, out ItemType parsedItemType)) - { - return MccMcpResult.Fail("invalid_args", data: new - { - itemType = itemType.Trim() - }); - } - - if (TryGetCursorItem(client, out Item? cursorItem)) - { - return MccMcpResult.Fail("invalid_state", data: new - { - reason = "cursor_item_present", - cursor = new { type = cursorItem!.Type.ToString(), count = cursorItem.Count } - }); - } - - int resolvedInventoryId = client.InvokeOnMainThread(() => ResolveContainerInventoryId(client, inventoryId)); - if (resolvedInventoryId <= 0) - { - return MccMcpResult.Fail("invalid_state", data: new - { - inventoryId - }); - } - - Container? initialInventory = client.InvokeOnMainThread(() => client.GetInventory(resolvedInventoryId)); - if (initialInventory is null) - return MccMcpResult.Fail("invalid_state", data: new { inventoryId = resolvedInventoryId }); - - if (!TryGetContainerSlotRanges(initialInventory.Type, out int containerStart, out int containerEnd, out int playerStart, out int playerEnd)) - { - return MccMcpResult.Fail("invalid_state", data: new - { - reason = "unsupported_container_type", - inventoryId = resolvedInventoryId, - type = initialInventory.Type.ToString() - }); - } - - int sourceStart = direction == InventoryTransferDirection.Deposit ? playerStart : containerStart; - int sourceEnd = direction == InventoryTransferDirection.Deposit ? playerEnd : containerEnd; - int targetStart = direction == InventoryTransferDirection.Deposit ? containerStart : playerStart; - int targetEnd = direction == InventoryTransferDirection.Deposit ? containerEnd : playerEnd; - - int beforePlayerCount = CountItemInRange(initialInventory, parsedItemType, playerStart, playerEnd); - int beforeContainerCount = CountItemInRange(initialInventory, parsedItemType, containerStart, containerEnd); - int availableCount = CountItemInRange(initialInventory, parsedItemType, sourceStart, sourceEnd); - if (availableCount < count) - { - return MccMcpResult.Fail("invalid_state", data: new - { - itemType = parsedItemType.ToString(), - requestedCount = count, - availableCount, - inventoryId = resolvedInventoryId, - direction = direction.ToString() - }); - } - - int remaining = count; - List touchedSourceSlots = new(); - List touchedTargetSlots = new(); - - while (remaining > 0) - { - Container? inventory = client.InvokeOnMainThread(() => client.GetInventory(resolvedInventoryId)); - if (inventory is null) - return MccMcpResult.Fail("invalid_state", data: new { inventoryId = resolvedInventoryId }); - - if (TryGetCursorItem(client, out cursorItem)) - { - return MccMcpResult.Fail("invalid_state", data: new - { - reason = "cursor_item_present_mid_transfer", - cursor = new { type = cursorItem!.Type.ToString(), count = cursorItem.Count } - }); - } - - var sourceSlots = GetOrderedItemSlots(inventory, parsedItemType, sourceStart, sourceEnd, preferLargestStack); - if (sourceSlots.Length == 0) - break; - - int beforeSourceCount = CountItemInRange(inventory, parsedItemType, sourceStart, sourceEnd); - int beforeTargetCount = CountItemInRange(inventory, parsedItemType, targetStart, targetEnd); - (int slot, int sourceCount) = sourceSlots[0]; - touchedSourceSlots.Add(slot); - - int movedCount; - List usedTargetSlots = new(); - if (sourceCount <= remaining || direction == InventoryTransferDirection.Withdraw) - { - if (!client.DoWindowAction(resolvedInventoryId, slot, WindowActionType.ShiftClick)) - { - return MccMcpResult.Fail("action_failed", data: new - { - itemType = parsedItemType.ToString(), - requestedCount = count, - remainingCount = remaining, - inventoryId = resolvedInventoryId, - sourceSlot = slot, - direction = direction.ToString() - }); - } - - if (direction == InventoryTransferDirection.Withdraw) - { - if (!WaitForRangeCount(client, resolvedInventoryId, parsedItemType, sourceStart, sourceEnd, countAfterShift => countAfterShift < beforeSourceCount, DefaultInventoryActionWaitMs, out Container? afterShift, out int afterSourceCount)) - { - afterShift = client.InvokeOnMainThread(() => client.GetInventory(resolvedInventoryId)); - afterSourceCount = afterShift is null ? beforeSourceCount : CountItemInRange(afterShift, parsedItemType, sourceStart, sourceEnd); - } - - movedCount = beforeSourceCount - afterSourceCount; - } - else - { - if (!WaitForRangeCount(client, resolvedInventoryId, parsedItemType, targetStart, targetEnd, countAfterShift => countAfterShift > beforeTargetCount, DefaultInventoryActionWaitMs, out Container? afterShift, out int afterTargetCount)) - { - afterShift = client.InvokeOnMainThread(() => client.GetInventory(resolvedInventoryId)); - afterTargetCount = afterShift is null ? beforeTargetCount : CountItemInRange(afterShift, parsedItemType, targetStart, targetEnd); - } - - movedCount = afterTargetCount - beforeTargetCount; - } - - if (direction == InventoryTransferDirection.Withdraw && movedCount > remaining) - { - int excessCount = movedCount - remaining; - MccMcpResult returnExcess = TransferContainerItem(parsedItemType.ToString(), excessCount, resolvedInventoryId, preferLargestStack, InventoryTransferDirection.Deposit); - if (!returnExcess.Success) - { - return MccMcpResult.Fail("action_incomplete", data: new - { - itemType = parsedItemType.ToString(), - requestedCount = count, - remainingCount = remaining, - inventoryId = resolvedInventoryId, - sourceSlot = slot, - direction = direction.ToString(), - excessCount, - returnExcess - }); - } - - movedCount -= excessCount; - } - } - else - { - movedCount = TransferPartialFromSlot( - client, - resolvedInventoryId, - slot, - parsedItemType, - remaining, - sourceStart, - sourceEnd, - targetStart, - targetEnd, - usedTargetSlots); - } - - if (movedCount <= 0) - { - Container? afterFailure = client.InvokeOnMainThread(() => client.GetInventory(resolvedInventoryId)); - return MccMcpResult.Fail("action_incomplete", data: new - { - itemType = parsedItemType.ToString(), - requestedCount = count, - remainingCount = remaining, - inventoryId = resolvedInventoryId, - sourceSlot = slot, - direction = direction.ToString(), - playerCount = afterFailure is null ? 0 : CountItemInRange(afterFailure, parsedItemType, playerStart, playerEnd), - containerCount = afterFailure is null ? 0 : CountItemInRange(afterFailure, parsedItemType, containerStart, containerEnd) - }); - } - - remaining -= movedCount; - touchedTargetSlots.AddRange(usedTargetSlots); - } - - Container? finalInventory = client.InvokeOnMainThread(() => client.GetInventory(resolvedInventoryId)); - if (finalInventory is null) - return MccMcpResult.Fail("invalid_state", data: new { inventoryId = resolvedInventoryId }); - - int afterPlayerCount = CountItemInRange(finalInventory, parsedItemType, playerStart, playerEnd); - int afterContainerCount = CountItemInRange(finalInventory, parsedItemType, containerStart, containerEnd); - int playerDelta = afterPlayerCount - beforePlayerCount; - int containerDelta = afterContainerCount - beforeContainerCount; - int movedTotal = direction == InventoryTransferDirection.Deposit - ? afterContainerCount - beforeContainerCount - : beforeContainerCount - afterContainerCount; - bool countsVerified = direction == InventoryTransferDirection.Deposit - ? containerDelta == count - : containerDelta == -count; - bool playerCountsMatchExpected = direction == InventoryTransferDirection.Deposit - ? playerDelta == -count - : playerDelta == count; - bool succeeded = remaining == 0 && countsVerified; - var resultData = new - { - success = succeeded, - direction = direction.ToString().ToLowerInvariant(), - itemType = parsedItemType.ToString(), - requestedCount = count, - movedCount = movedTotal, - beforePlayerCount, - afterPlayerCount, - beforeContainerCount, - afterContainerCount, - playerDelta, - containerDelta, - playerCountsMatchExpected, - verificationBasis = "container_delta", - inventoryId = resolvedInventoryId, - containerType = finalInventory.Type.ToString(), - touchedSourceSlots = touchedSourceSlots.Distinct().OrderBy(slot => slot).ToArray(), - touchedTargetSlots = touchedTargetSlots.Distinct().OrderBy(slot => slot).ToArray() - }; - - return succeeded - ? MccMcpResult.Ok(resultData) - : MccMcpResult.Fail("action_incomplete", data: resultData); - } - - private static MccMcpResult ExecuteInternalCommand(McClient client, string command) - { - return client.InvokeOnMainThread(() => - { - CmdResult result = new(); - bool ok = client.PerformInternalCommand(command, ref result); - return MccMcpResult.Ok(new - { - success = ok, - status = result.status.ToString(), - output = result.ToString() - }); - }); - } - - private static bool TryGetCursorItem(McClient client, out Item? cursorItem) - { - cursorItem = client.InvokeOnMainThread(() => - { - Container? playerInventory = client.GetInventory(0); - return playerInventory is not null && playerInventory.Items.TryGetValue(-1, out Item? item) ? item : null; - }); - return cursorItem is not null; - } - - private static int ResolveContainerInventoryId(McClient client, int inventoryId) - { - if (inventoryId > 0) - { - Container? inventory = client.GetInventory(inventoryId); - return inventory is not null && inventoryId != 0 ? inventoryId : 0; - } - - return GetActiveContainerId(client); - } - - private static int GetActiveContainerId(McClient client) - { - return client.GetInventories().Keys.Where(id => id > 0).DefaultIfEmpty(0).Max(); - } - - private static bool WaitForContainerOpen(McClient client, ISet beforeIds, int waitMs, out int inventoryId, out Container? inventory) - { - inventoryId = 0; - inventory = null; - DateTime deadline = DateTime.UtcNow.AddMilliseconds(waitMs); - while (true) - { - (int activeId, Container? activeInventory) state = client.InvokeOnMainThread(() => - { - int activeId = GetActiveContainerId(client); - Container? activeInventory = activeId > 0 ? client.GetInventory(activeId) : null; - return (activeId, activeInventory); - }); - - if (state.activeId > 0 && (!beforeIds.Contains(state.activeId) || beforeIds.Count == 0) && state.activeInventory is not null) - { - inventoryId = state.activeId; - inventory = state.activeInventory; - return true; - } - - if (DateTime.UtcNow >= deadline) - return false; - - Thread.Sleep(ArrivalPollIntervalMs); - } - } - - private static bool WaitForContainerClose(McClient client, int inventoryId, int waitMs) - { - DateTime deadline = DateTime.UtcNow.AddMilliseconds(waitMs); - while (true) - { - bool stillOpen = client.InvokeOnMainThread(() => client.GetInventories().ContainsKey(inventoryId)); - if (!stillOpen) - return true; - - if (DateTime.UtcNow >= deadline) - return false; - - Thread.Sleep(ArrivalPollIntervalMs); - } - } - - private static int GetContainerWaitMs(int timeoutMs) - { - if (timeoutMs <= 0) - return DefaultContainerWaitMs; - return Math.Clamp(timeoutMs, MinContainerWaitMs, MaxContainerWaitMs); - } - - private static bool TryGetContainerSlotRanges(ContainerType type, out int containerStart, out int containerEnd, out int playerStart, out int playerEnd) - { - containerStart = 0; - containerEnd = -1; - playerStart = 0; - playerEnd = -1; - - int containerSlots = type switch - { - ContainerType.Generic_9x1 => 9, - ContainerType.Generic_9x2 => 18, - ContainerType.Generic_9x3 => 27, - ContainerType.Generic_9x4 => 36, - ContainerType.Generic_9x5 => 45, - ContainerType.Generic_9x6 => 54, - ContainerType.Generic_3x3 => 9, - ContainerType.Hopper => 5, - ContainerType.ShulkerBox => 27, - ContainerType.Furnace or ContainerType.BlastFurnace or ContainerType.Smoker => 3, - ContainerType.Crafter => 9, - _ => -1 - }; - - if (containerSlots <= 0) - return false; - - int slotCount = type.SlotCount(); - if (slotCount <= containerSlots) - return false; - - containerEnd = containerSlots - 1; - playerStart = containerSlots; - playerEnd = slotCount - 1; - return true; - } - - private static bool IsSnapshotInventorySlot(Container inventory, int slotId) - { - return slotId >= 0 && slotId < inventory.Type.SlotCount(); - } - - private static bool IsDroppableInventorySlot(Container inventory, int slotId) - { - if (!IsSnapshotInventorySlot(inventory, slotId)) - return false; - - return !(slotId == 0 && (inventory.Type == ContainerType.PlayerInventory || inventory.Type == ContainerType.Crafting)); - } - - private static bool IsHotbarSlot(Container inventory, int slotId) - { - return inventory.IsHotbar(slotId, out _); - } - - private static object? TryBuildCursorSnapshot(Container inventory) - { - return inventory.Items.TryGetValue(-1, out Item? cursorItem) && cursorItem.Count > 0 - ? new - { - type = cursorItem.Type.ToString(), - count = cursorItem.Count - } - : null; - } - - private static int GetCursorItemCount(Container inventory, ItemType itemType) - { - return inventory.Items.TryGetValue(-1, out Item? cursorItem) && cursorItem.Type == itemType - ? cursorItem.Count - : 0; - } - - private static bool TryDropInventorySlotItems(McClient client, int inventoryId, Container inventory, int slotId, ItemType itemType, int dropCount, out int droppedCount) - { - droppedCount = 0; - if (!inventory.Items.TryGetValue(slotId, out Item? currentItem) || currentItem.Type != itemType || currentItem.Count <= 0) - return false; - - if (inventoryId == 0 && inventory.IsHotbar(slotId, out int hotbarSlot)) - { - return TryDropHotbarSlotItems(client, slotId, hotbarSlot, itemType, dropCount, currentItem.Count, out droppedCount); - } - - return TryDropWindowSlotItems(client, inventoryId, slotId, itemType, dropCount, currentItem.Count, out droppedCount); - } - - private static int CountItemInRange(Container inventory, ItemType itemType, int startSlot, int endSlot) - { - return inventory.Items - .Where(entry => entry.Key >= startSlot && entry.Key <= endSlot) - .Where(entry => entry.Value.Type == itemType) - .Sum(entry => entry.Value.Count); - } - - private static (int slot, int count)[] GetOrderedItemSlots(Container inventory, ItemType itemType, int startSlot, int endSlot, bool preferLargestStack) - { - var query = inventory.Items - .Where(entry => entry.Key >= startSlot && entry.Key <= endSlot) - .Where(entry => entry.Value.Type == itemType && entry.Value.Count > 0) - .Select(entry => (slot: entry.Key, count: entry.Value.Count)); - - return (preferLargestStack - ? query.OrderByDescending(entry => entry.count).ThenBy(entry => entry.slot) - : query.OrderBy(entry => entry.count).ThenBy(entry => entry.slot)) - .ToArray(); - } - - private static int TransferPartialFromSlot(McClient client, int inventoryId, int sourceSlot, ItemType itemType, int requestedCount, int sourceStart, int sourceEnd, int targetStart, int targetEnd, List touchedTargetSlots) - { - Container? inventory = client.InvokeOnMainThread(() => client.GetInventory(inventoryId)); - if (inventory is null || !inventory.Items.TryGetValue(sourceSlot, out Item? sourceItem) || sourceItem.Count <= 0) - return 0; - - int amountToMove = Math.Min(requestedCount, sourceItem.Count); - if (!client.DoWindowAction(inventoryId, sourceSlot, WindowActionType.LeftClick)) - return 0; - - if (!WaitForCursorItem(client, itemType, DefaultInventoryActionWaitMs, out _)) - return 0; - - int moved = 0; - while (moved < amountToMove) - { - inventory = client.InvokeOnMainThread(() => client.GetInventory(inventoryId)); - if (inventory is null || !TryGetCursorItem(client, out Item? cursorItem) || cursorItem is null || cursorItem.Type != itemType) - break; - - if (!TryFindTransferTargetSlot(inventory, itemType, targetStart, targetEnd, out int targetSlot, out int capacity)) - break; - - int step = Math.Min(amountToMove - moved, Math.Min(capacity, cursorItem.Count)); - int beforeTargetCount = GetSlotItemCount(inventory, targetSlot, itemType); - int beforeCursorCount = cursorItem.Count; - if (step <= 0 || !PlaceItemsFromCursor(client, inventoryId, targetSlot, step)) - break; - - if (!WaitForPlacement(client, inventoryId, targetSlot, itemType, beforeTargetCount, beforeCursorCount, step)) - break; - - touchedTargetSlots.Add(targetSlot); - moved += step; - } - - if (TryGetCursorItem(client, out Item? remainingCursor) && remainingCursor is not null && remainingCursor.Count > 0) - { - inventory = client.InvokeOnMainThread(() => client.GetInventory(inventoryId)); - if (inventory is null) - return 0; - - int returnSlot = GetReturnSlot(inventory, itemType, sourceStart, sourceEnd, sourceSlot); - if (!client.DoWindowAction(inventoryId, returnSlot, WindowActionType.LeftClick)) - return 0; - - if (!WaitForCursorClear(client, DefaultInventoryActionWaitMs)) - return 0; - } - - return TryGetCursorItem(client, out _) - ? 0 - : moved; - } - - private static bool TryFindTransferTargetSlot(Container inventory, ItemType itemType, int startSlot, int endSlot, out int targetSlot, out int capacity) - { - int maxStack = itemType.StackCount(); - for (int slot = startSlot; slot <= endSlot; slot++) - { - if (inventory.Items.TryGetValue(slot, out Item? item) && item.Type == itemType && item.Count < maxStack) - { - targetSlot = slot; - capacity = maxStack - item.Count; - return true; - } - } - - for (int slot = startSlot; slot <= endSlot; slot++) - { - if (!inventory.Items.ContainsKey(slot)) - { - targetSlot = slot; - capacity = maxStack; - return true; - } - } - - targetSlot = -1; - capacity = 0; - return false; - } - - private static bool PlaceItemsFromCursor(McClient client, int inventoryId, int targetSlot, int count) - { - if (count <= 0 || !TryGetCursorItem(client, out Item? cursorItem) || cursorItem is null) - return false; - - if (count == cursorItem.Count) - return client.DoWindowAction(inventoryId, targetSlot, WindowActionType.LeftClick); - - for (int i = 0; i < count; i++) - { - if (!client.DoWindowAction(inventoryId, targetSlot, WindowActionType.RightClick)) - return false; - } - - return true; - } - - private static int GetReturnSlot(Container inventory, ItemType itemType, int startSlot, int endSlot, int originalSourceSlot) - { - if (originalSourceSlot != 0) - return originalSourceSlot; - - int maxStack = itemType.StackCount(); - for (int slot = startSlot; slot <= endSlot; slot++) - { - if (slot == 0) - continue; - - if (inventory.Items.TryGetValue(slot, out Item? item) && item.Type == itemType && item.Count < maxStack) - return slot; - } - - for (int slot = startSlot; slot <= endSlot; slot++) - { - if (slot == 0) - continue; - - if (!inventory.Items.ContainsKey(slot)) - return slot; - } - - return originalSourceSlot; - } - - private static int GetSlotItemCount(Container inventory, int slot, ItemType itemType) - { - return inventory.Items.TryGetValue(slot, out Item? item) && item.Type == itemType ? item.Count : 0; - } - - private static bool TryDropHotbarSlotItems(McClient client, int slotId, int hotbarSlot, ItemType itemType, int dropCount, int availableInSlot, out int droppedCount) - { - droppedCount = 0; - byte previousSlot = client.GetCurrentSlot(); - bool restoreSlot = previousSlot != hotbarSlot; - - if (restoreSlot && !client.ChangeSlot((short)hotbarSlot)) - return false; - - try - { - if (dropCount >= availableInSlot) - { - if (!client.DropSelectedItem(dropEntireStack: true)) - return false; - - if (!WaitForSlotItemCount(client, 0, slotId, itemType, count => count == 0, DefaultInventoryActionWaitMs, out _, out _)) - return false; - - droppedCount = availableInSlot; - return true; - } - - int remaining = dropCount; - while (remaining > 0) - { - Container? currentInventory = client.GetInventory(0); - if (currentInventory is null) - return false; - - int beforeSlotCount = GetSlotItemCount(currentInventory, slotId, itemType); - if (beforeSlotCount <= 0) - break; - - if (!client.DropSelectedItem(dropEntireStack: false)) - return false; - - if (!WaitForSlotItemCount(client, 0, slotId, itemType, count => count <= beforeSlotCount - 1, DefaultInventoryActionWaitMs, out _, out _)) - return false; - - remaining--; - droppedCount++; - } - - return remaining == 0; - } - finally - { - if (restoreSlot) - client.ChangeSlot((short)previousSlot); - } - } - - private static bool TryDropWindowSlotItems(McClient client, int inventoryId, int slotId, ItemType itemType, int dropCount, int availableInSlot, out int droppedCount) - { - droppedCount = 0; - - if (dropCount >= availableInSlot) - { - if (!client.DoWindowAction(inventoryId, slotId, WindowActionType.DropItemStack)) - return false; - - if (!WaitForSlotItemCount(client, inventoryId, slotId, itemType, count => count == 0, DefaultInventoryActionWaitMs, out _, out _)) - return false; - - droppedCount = availableInSlot; - return true; - } - - int remaining = dropCount; - while (remaining > 0) - { - Container? currentInventory = client.GetInventory(inventoryId); - if (currentInventory is null) - return false; - - int beforeSlotCount = GetSlotItemCount(currentInventory, slotId, itemType); - if (beforeSlotCount <= 0) - break; - - if (!client.DoWindowAction(inventoryId, slotId, WindowActionType.DropItem)) - return false; - - if (!WaitForSlotItemCount(client, inventoryId, slotId, itemType, count => count <= beforeSlotCount - 1, DefaultInventoryActionWaitMs, out _, out _)) - return false; - - remaining--; - droppedCount++; - } - - return remaining == 0; - } - - private static bool WaitForCursorItem(McClient client, ItemType itemType, int waitMs, out Item? cursorItem) - { - cursorItem = null; - DateTime deadline = DateTime.UtcNow.AddMilliseconds(waitMs); - while (true) - { - if (TryGetCursorItem(client, out cursorItem) && cursorItem is not null && cursorItem.Type == itemType) - return true; - - if (DateTime.UtcNow >= deadline) - return false; - - Thread.Sleep(ArrivalPollIntervalMs); - } - } - - private static bool WaitForCursorClear(McClient client, int waitMs) - { - DateTime deadline = DateTime.UtcNow.AddMilliseconds(waitMs); - while (true) - { - if (!TryGetCursorItem(client, out _)) - return true; - - if (DateTime.UtcNow >= deadline) - return false; - - Thread.Sleep(ArrivalPollIntervalMs); - } - } - - private static bool WaitForPlacement(McClient client, int inventoryId, int targetSlot, ItemType itemType, int beforeTargetCount, int beforeCursorCount, int placedCount) - { - DateTime deadline = DateTime.UtcNow.AddMilliseconds(DefaultInventoryActionWaitMs); - while (true) - { - bool targetUpdated = false; - bool cursorUpdated = false; - - Container? inventory = client.InvokeOnMainThread(() => client.GetInventory(inventoryId)); - if (inventory is not null) - { - int currentTargetCount = GetSlotItemCount(inventory, targetSlot, itemType); - targetUpdated = currentTargetCount >= beforeTargetCount + placedCount; - } - - if (placedCount >= beforeCursorCount) - { - cursorUpdated = !TryGetCursorItem(client, out _); - } - else if (TryGetCursorItem(client, out Item? cursorItem) && cursorItem is not null && cursorItem.Type == itemType) - { - cursorUpdated = cursorItem.Count <= beforeCursorCount - placedCount; - } - - if (targetUpdated && cursorUpdated) - return true; - - if (DateTime.UtcNow >= deadline) - return false; - - Thread.Sleep(ArrivalPollIntervalMs); - } - } - - private static bool WaitForSlotItemCount(McClient client, int inventoryId, int slotId, ItemType itemType, Func predicate, int waitMs, out Container? inventory, out int itemCount) - { - inventory = null; - itemCount = 0; - DateTime deadline = DateTime.UtcNow.AddMilliseconds(waitMs); - while (true) - { - inventory = client.GetInventory(inventoryId); - if (inventory is not null) - { - itemCount = GetSlotItemCount(inventory, slotId, itemType); - if (predicate(itemCount)) - return true; - } - - if (DateTime.UtcNow >= deadline) - return false; - - Thread.Sleep(ArrivalPollIntervalMs); - } - } - - private static bool WaitForRangeCount(McClient client, int inventoryId, ItemType itemType, int startSlot, int endSlot, Func predicate, int waitMs, out Container? inventory, out int itemCount) - { - inventory = null; - itemCount = 0; - DateTime deadline = DateTime.UtcNow.AddMilliseconds(waitMs); - while (true) - { - inventory = client.InvokeOnMainThread(() => client.GetInventory(inventoryId)); - if (inventory is not null) - { - itemCount = CountItemInRange(inventory, itemType, startSlot, endSlot); - if (predicate(itemCount)) - return true; - } - - if (DateTime.UtcNow >= deadline) - return false; - - Thread.Sleep(ArrivalPollIntervalMs); - } - } - - private static List BuildTrackedPlayerSnapshots(McClient client, bool includeSelf) - { - Location playerLocation = client.GetCurrentLocation(); - string username = client.GetUsername(); - Dictionary uuidToName = client.GetOnlinePlayersWithUUID(); - string[] onlinePlayers = client.GetOnlinePlayers(); - - List trackedPlayers = client.GetEntities().Values - .Where(entity => entity.Type == EntityType.Player) - .Select(entity => - { - double dx = entity.Location.X - playerLocation.X; - double dy = entity.Location.Y - playerLocation.Y; - double dz = entity.Location.Z - playerLocation.Z; - double distance = Math.Sqrt(dx * dx + dy * dy + dz * dz); - string? rawName = ResolvePlayerEntityName(entity, uuidToName); - return new NearbyPlayerSnapshot - { - EntityId = entity.ID, - Uuid = entity.UUID, - Name = rawName, - CustomName = entity.CustomName, - X = entity.Location.X, - Y = entity.Location.Y, - Z = entity.Location.Z, - Distance = distance, - Latency = entity.Latency - }; - }) - .ToList(); - - if (!includeSelf) - { - trackedPlayers = trackedPlayers - .Where(player => !string.Equals(player.Name, username, StringComparison.OrdinalIgnoreCase)) - .Where(player => player.Distance > SelfEntityDistanceThreshold) - .ToList(); - } - - List unnamedTracked = trackedPlayers - .Where(player => string.IsNullOrWhiteSpace(player.Name)) - .OrderBy(player => player.Distance) - .ToList(); - if (unnamedTracked.Count == 0) - return trackedPlayers; - - HashSet assignedNames = trackedPlayers - .Select(player => player.Name) - .OfType() - .ToHashSet(NameComparer); - - string[] unmatchedOnline = onlinePlayers - .Where(name => includeSelf || !string.Equals(name, username, StringComparison.OrdinalIgnoreCase)) - .Where(name => !string.IsNullOrWhiteSpace(name)) - .Where(name => !assignedNames.Contains(name)) - .Distinct(NameComparer) - .ToArray(); - - if (unmatchedOnline.Length == 0) - return trackedPlayers; - - if (unnamedTracked.Count == 1 && unmatchedOnline.Length == 1) - { - unnamedTracked[0].Name = unmatchedOnline[0]; - return trackedPlayers; - } - - int pairCount = Math.Min(unnamedTracked.Count, unmatchedOnline.Length); - string[] sortedNames = unmatchedOnline - .OrderBy(name => name, NameComparer) - .ToArray(); - for (int i = 0; i < pairCount; i++) - unnamedTracked[i].Name = sortedNames[i]; - - return trackedPlayers; - } - - private static object? DescribeMetadataValue(object? value) - { - return value switch - { - null => null, - string s => s, - bool b => b, - byte b => b, - sbyte b => b, - short s => s, - ushort s => s, - int i => i, - uint i => i, - long l => l, - ulong l => l, - float f => f, - double d => d, - decimal d => d, - Enum e => e.ToString(), - Location location => ToCoordinate(location), - Item item => new { type = item.Type.ToString(), count = item.Count }, - byte[] data => new { bytes = data.Length }, - _ => value.ToString() - }; - } - - private static bool PlayerNameMatches(NearbyPlayerSnapshot player, string filter) - { - if (string.IsNullOrWhiteSpace(filter)) - return true; - - string trimmed = filter.Trim(); - if (!string.IsNullOrWhiteSpace(player.Name) && player.Name.Contains(trimmed, StringComparison.OrdinalIgnoreCase)) - return true; - - if (!string.IsNullOrWhiteSpace(player.CustomName) && player.CustomName.Contains(trimmed, StringComparison.OrdinalIgnoreCase)) - return true; - - return false; - } - - private static bool TryParseWindowAction(string rawActionType, out WindowActionType actionType) - { - if (Enum.TryParse(rawActionType, true, out actionType)) - return true; - - string normalized = NormalizeToken(rawActionType); - if (normalized.Length == 0) - return false; - - return normalized switch - { - "left" or "leftclick" => SetAction(WindowActionType.LeftClick, out actionType), - "right" or "rightclick" => SetAction(WindowActionType.RightClick, out actionType), - "middle" or "mid" or "middleclick" => SetAction(WindowActionType.MiddleClick, out actionType), - "shift" or "shiftclick" => SetAction(WindowActionType.ShiftClick, out actionType), - "shiftright" or "shiftrightclick" => SetAction(WindowActionType.ShiftRightClick, out actionType), - "drop" or "dropitem" or "q" => SetAction(WindowActionType.DropItem, out actionType), - "dropstack" or "dropall" or "dropitemstack" or "ctrlq" or "ctrldrop" => SetAction(WindowActionType.DropItemStack, out actionType), - _ => false - }; - } - - private static bool SetAction(WindowActionType value, out WindowActionType actionType) - { - actionType = value; - return true; - } - - private static bool TryParseItemType(string rawItemType, out ItemType itemType) - { - if (Enum.TryParse(rawItemType, true, out itemType) && itemType is not (ItemType.Unknown or ItemType.Null)) - return true; - - string normalized = NormalizeToken(rawItemType); - if (normalized.Length == 0) - { - itemType = ItemType.Unknown; - return false; - } - - foreach (ItemType candidate in Enum.GetValues()) - { - if (candidate is ItemType.Unknown or ItemType.Null) - continue; - if (NormalizeToken(candidate.ToString()) == normalized) - { - itemType = candidate; - return true; - } - } - - itemType = ItemType.Unknown; - return false; - } - - private static string NormalizeToken(string value) - { - if (string.IsNullOrWhiteSpace(value)) - return string.Empty; - - char[] buffer = value - .Where(char.IsLetterOrDigit) - .Select(char.ToLowerInvariant) - .ToArray(); - return new string(buffer); - } - - private static bool WaitForArrival(McClient client, Location goal, int waitMs, double tolerance, out Location? finalLocation) - { - finalLocation = null; - DateTime deadline = DateTime.UtcNow.AddMilliseconds(waitMs); - while (true) - { - Location location = client.InvokeOnMainThread(client.GetCurrentLocation); - finalLocation = location; - double distance = GetDistance(location, goal); - if (distance <= tolerance) - return true; - - if (DateTime.UtcNow >= deadline) - return false; - - Thread.Sleep(ArrivalPollIntervalMs); - } - } - - private static double GetDistance(Location from, Location to) - { - double dx = from.X - to.X; - double dy = from.Y - to.Y; - double dz = from.Z - to.Z; - return Math.Sqrt(dx * dx + dy * dy + dz * dz); - } - - private static int GetArrivalWaitMs(int timeoutMs) - { - if (timeoutMs <= 0) - return DefaultArrivalWaitMs; - return Math.Clamp(timeoutMs, MinArrivalWaitMs, MaxArrivalWaitMs); - } - - private static double GetArrivalTolerance(int maxOffset, int minOffset) - { - double toleranceFromOffset = Math.Max(maxOffset, minOffset) + 1.0; - return Math.Max(DefaultArrivalTolerance, toleranceFromOffset); - } - - private static int GetPathQueryTimeoutMs(int timeoutMs) - { - if (timeoutMs <= 0) - return DefaultPathQueryTimeoutMs; - return Math.Clamp(timeoutMs, MinPathQueryTimeoutMs, MaxPathQueryTimeoutMs); - } - - private static bool WaitForBlockChange(McClient client, Location target, Block beforeBlock, int waitMs, out Block afterBlock) - { - afterBlock = beforeBlock; - DateTime deadline = DateTime.UtcNow.AddMilliseconds(waitMs); - while (true) - { - Block current = client.InvokeOnMainThread(() => client.GetWorld().GetBlock(target)); - afterBlock = current; - if (!AreEquivalentBlocks(current, beforeBlock)) - return true; - - if (DateTime.UtcNow >= deadline) - return false; - - Thread.Sleep(ArrivalPollIntervalMs); - } - } - - private static bool AreEquivalentBlocks(Block left, Block right) - { - return left.BlockId == right.BlockId - && left.BlockMeta == right.BlockMeta - && left.Type == right.Type; - } - - private static double[] GetDigAttemptDurations(double durationSeconds) - { - if (durationSeconds > 0) - return [durationSeconds]; - return s_defaultDigAttemptDurations; - } - - private static int GetDigVerifyWaitMs(double durationSeconds) - { - int waitMs = (int)Math.Ceiling(durationSeconds * 1000) + 2000; - return Math.Clamp(waitMs, 1500, MaxBlockVerifyWaitMs); - } - - private static bool AreValidPathOffsets(int maxOffset, int minOffset) - { - return maxOffset >= 0 && minOffset >= 0 && minOffset <= maxOffset; - } - - private static bool HasCompleteCoordinateTriple(double? x, double? y, double? z) - { - return x.HasValue == y.HasValue && y.HasValue == z.HasValue; - } - - private static int GetLoadedChunkCount(World world) - { - return Math.Max(0, world.chunkCnt - Math.Max(0, world.chunkLoadNotCompleted)); - } - - private static double GetChunkLoadRatio(World world) - { - return world.chunkCnt > 0 - ? GetLoadedChunkCount(world) / (double)world.chunkCnt - : 0.0; - } - - private static object GetNeighborBlockSnapshot(World world, Location location) - { - Location blockLocation = location.ToFloor(); - Location north = new(blockLocation.X, blockLocation.Y, blockLocation.Z - 1); - Location south = new(blockLocation.X, blockLocation.Y, blockLocation.Z + 1); - Location east = new(blockLocation.X + 1, blockLocation.Y, blockLocation.Z); - Location west = new(blockLocation.X - 1, blockLocation.Y, blockLocation.Z); - Location above = new(blockLocation.X, blockLocation.Y + 1, blockLocation.Z); - Location below = new(blockLocation.X, blockLocation.Y - 1, blockLocation.Z); - - return new - { - north = new { location = ToCoordinate(north), block = ToBlockState(world.GetBlock(north)) }, - south = new { location = ToCoordinate(south), block = ToBlockState(world.GetBlock(south)) }, - east = new { location = ToCoordinate(east), block = ToBlockState(world.GetBlock(east)) }, - west = new { location = ToCoordinate(west), block = ToBlockState(world.GetBlock(west)) }, - above = new { location = ToCoordinate(above), block = ToBlockState(world.GetBlock(above)) }, - below = new { location = ToCoordinate(below), block = ToBlockState(world.GetBlock(below)) } - }; - } - - private static bool ItemMatches(Item item, string query, bool exactMatch, ItemType? exactItemType) - { - if (exactItemType.HasValue) - return item.Type == exactItemType.Value; - - string typeName = item.Type.ToString(); - string typeLabel = item.GetTypeString(); - return exactMatch - ? TextEqualsFilter(typeName, query) || TextEqualsFilter(typeLabel, query) - : TextMatchesFilter(typeName, query) || TextMatchesFilter(typeLabel, query); - } - - private static bool EntityNameMatches(string? name, string? customName, string filter) - { - return (!string.IsNullOrWhiteSpace(name) && TextMatchesFilter(name, filter)) - || (!string.IsNullOrWhiteSpace(customName) && TextMatchesFilter(customName, filter)); - } - - private static bool IsSupportedLookDirection(Direction direction) - { - return direction is Direction.Up or Direction.Down or Direction.North or Direction.South or Direction.East or Direction.West; - } - - private static NearbyItemSnapshot[] BuildNearbyItemSnapshots(McClient client, ItemType? itemType, double radius, int maxCount) - { - Location playerLocation = client.GetCurrentLocation(); - return client.GetEntities().Values - .Where(entity => entity.Type == EntityType.Item && !entity.Item.IsEmpty) - .Where(entity => !itemType.HasValue || entity.Item.Type == itemType.Value) - .Select(entity => - { - double dx = entity.Location.X - playerLocation.X; - double dy = entity.Location.Y - playerLocation.Y; - double dz = entity.Location.Z - playerLocation.Z; - return new NearbyItemSnapshot - { - EntityId = entity.ID, - ItemType = entity.Item.Type, - TypeLabel = entity.Item.GetTypeString(), - Count = entity.Item.Count, - X = entity.Location.X, - Y = entity.Location.Y, - Z = entity.Location.Z, - Distance = Math.Sqrt(dx * dx + dy * dy + dz * dz) - }; - }) - .Where(item => item.Distance <= radius) - .OrderBy(item => item.Distance) - .Take(maxCount) - .ToArray(); - } - - private static bool WaitForEntityRemoval(McClient client, int entityId, int waitMs) - { - DateTime deadline = DateTime.UtcNow.AddMilliseconds(waitMs); - while (true) - { - bool exists = client.InvokeOnMainThread(() => client.GetEntities().ContainsKey(entityId)); - if (!exists) - return true; - - if (DateTime.UtcNow >= deadline) - return false; - - Thread.Sleep(ArrivalPollIntervalMs); - } - } - - private static int GetInventoryItemCount(McClient client, ItemType itemType) - { - Container? inventory = client.GetInventory(0); - if (inventory is null) - return 0; - - return inventory.Items.Values - .Where(item => item.Type == itemType) - .Sum(item => item.Count); - } - - private static object ToCoordinate(Location location) - { - return ToCoordinate(location.X, location.Y, location.Z); - } - - private static object ToCoordinate(double x, double y, double z) - { - return new - { - x = RoundCoordinate(x), - y = RoundCoordinate(y), - z = RoundCoordinate(z) - }; - } - - private static double RoundCoordinate(double value) - { - return Math.Round(value, CoordinateRoundingPrecision, MidpointRounding.AwayFromZero); - } - - private static Location ToBlockLocation(double x, double y, double z) - { - return new Location(Math.Floor(x), Math.Floor(y), Math.Floor(z)); - } - - private static object ToBlockState(Block block) - { - return new - { - material = block.Type.ToString(), - typeLabel = block.GetTypeString(), - blockId = block.BlockId, - blockMeta = block.BlockMeta, - stateId = block.StateId, - properties = block.GetStateProperties() - }; - } - - private static string GetMaterialTypeLabel(Material material) - { - string key = "block.minecraft." + ToTranslationKey(material.ToString()); - string? translation = ChatParser.TranslateString(key); - return string.IsNullOrEmpty(translation) ? material.ToString() : translation; - } - - private static string ToTranslationKey(string value) - { - if (string.IsNullOrEmpty(value)) - return string.Empty; - - List chars = new(value.Length * 2); - for (int i = 0; i < value.Length; i++) - { - char current = value[i]; - if (char.IsUpper(current) && i > 0 && (char.IsLower(value[i - 1]) || char.IsDigit(value[i - 1]))) - chars.Add('_'); - chars.Add(char.ToLowerInvariant(current)); - } - - return new string(chars.ToArray()); - } - - private static bool IsSignMaterial(Material material) - { - return material.ToString().Contains("Sign", StringComparison.Ordinal); - } - - private static bool IsInteractableContainerMaterial(Material material) - { - string name = material.ToString(); - return name.Contains("Chest", StringComparison.Ordinal) - || name.Contains("Barrel", StringComparison.Ordinal) - || name.Contains("ShulkerBox", StringComparison.Ordinal) - || name.Contains("Hopper", StringComparison.Ordinal) - || name.Contains("Dispenser", StringComparison.Ordinal) - || name.Contains("Dropper", StringComparison.Ordinal) - || name.Contains("Furnace", StringComparison.Ordinal) - || name.Contains("Smoker", StringComparison.Ordinal) - || name.Contains("BlastFurnace", StringComparison.Ordinal) - || name.Contains("Crafter", StringComparison.Ordinal); - } - - private static string? ResolvePlayerEntityName(Entity entity, IReadOnlyDictionary uuidToName) - { - if (!string.IsNullOrWhiteSpace(entity.Name)) - return entity.Name; - - if (entity.UUID != Guid.Empty - && uuidToName.TryGetValue(entity.UUID.ToString(), out string? mappedName) - && !string.IsNullOrWhiteSpace(mappedName)) - { - return mappedName; - } - - if (!string.IsNullOrWhiteSpace(entity.CustomName)) - return entity.CustomName; - - return null; - } - - private static bool BlockMatches(Block block, string? filter, bool exactMatch, int? blockIdFilter, int? blockMetaFilter) - { - if (blockIdFilter.HasValue) - { - if (block.BlockId != blockIdFilter.Value) - return false; - if (blockMetaFilter.HasValue && block.BlockMeta != blockMetaFilter.Value) - return false; - return true; - } - - if (filter is null) - return true; - - string material = block.Type.ToString(); - string typeLabel = block.GetTypeString(); - if (exactMatch) - { - return TextEqualsFilter(material, filter) - || TextEqualsFilter(typeLabel, filter); - } - - return TextMatchesFilter(material, filter) - || TextMatchesFilter(typeLabel, filter); - } - - private static bool TextEqualsFilter(string text, string filter) - { - return text.Equals(filter, StringComparison.OrdinalIgnoreCase) - || NormalizeToken(text) == NormalizeToken(filter); - } - - private static bool TextMatchesFilter(string text, string filter) - { - if (text.Contains(filter, StringComparison.OrdinalIgnoreCase)) - return true; - - string normalizedFilter = NormalizeToken(filter); - if (normalizedFilter.Length == 0) - return false; - - return NormalizeToken(text).Contains(normalizedFilter, StringComparison.Ordinal); - } - - private static void ParseBlockQuery(string? query, out int? blockId, out int? blockMeta) - { - blockId = null; - blockMeta = null; - if (string.IsNullOrWhiteSpace(query)) - return; - - string trimmed = query.Trim(); - int separator = trimmed.IndexOf(':'); - if (separator >= 0) - { - string idPart = trimmed[..separator].Trim(); - string metaPart = trimmed[(separator + 1)..].Trim(); - if (int.TryParse(idPart, NumberStyles.Integer, CultureInfo.InvariantCulture, out int parsedId)) - { - blockId = parsedId; - if (int.TryParse(metaPart, NumberStyles.Integer, CultureInfo.InvariantCulture, out int parsedMeta)) - blockMeta = parsedMeta; - } - return; - } - - if (int.TryParse(trimmed, NumberStyles.Integer, CultureInfo.InvariantCulture, out int blockStateId)) - blockId = blockStateId; - } -} diff --git a/MinecraftClient/Mcp/MccMcpChatHistory.cs b/MinecraftClient/Mcp/MccMcpChatHistory.cs deleted file mode 100644 index 6cf314f1a4..0000000000 --- a/MinecraftClient/Mcp/MccMcpChatHistory.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Linq; -using MinecraftClient.Scripting; - -namespace MinecraftClient.Mcp; - -public sealed class MccMcpChatHistoryEntry -{ - public required DateTimeOffset TimestampUtc { get; init; } - public required string Kind { get; init; } - public required string Text { get; init; } - public string? Sender { get; init; } - public string? Message { get; init; } - public string? Json { get; init; } -} - -public static class MccMcpChatHistoryStore -{ - public static void Add(MccMcpChatHistoryEntry entry) - { - MccObservedStateStore.AddChatHistoryEntry(new MccChatHistoryEntry - { - TimestampUtc = entry.TimestampUtc, - Kind = entry.Kind, - Text = entry.Text, - Sender = entry.Sender, - Message = entry.Message, - Json = entry.Json - }); - } - - public static MccMcpChatHistoryEntry[] GetLatest(int maxCount) - { - return MccObservedStateStore.GetLatestChatHistory(maxCount) - .Select(entry => new MccMcpChatHistoryEntry - { - TimestampUtc = entry.TimestampUtc, - Kind = entry.Kind, - Text = entry.Text, - Sender = entry.Sender, - Message = entry.Message, - Json = entry.Json - }) - .ToArray(); - } - - public static void Clear() - { - MccObservedStateStore.ClearChatHistory(); - } -} diff --git a/MinecraftClient/Mcp/MccMcpConfig.cs b/MinecraftClient/Mcp/MccMcpConfig.cs deleted file mode 100644 index 1655be628a..0000000000 --- a/MinecraftClient/Mcp/MccMcpConfig.cs +++ /dev/null @@ -1,46 +0,0 @@ -using Tomlet.Attributes; - -namespace MinecraftClient.Mcp; - -public sealed class MccMcpConfig -{ - public bool Enabled { get; set; } - public MccMcpTransportConfig Transport { get; set; } = new(); - public MccMcpCapabilityToggles Capabilities { get; set; } = new(); -} - -public sealed class MccMcpTransportConfig -{ - [TomlInlineComment("$ChatBot.McpServer.Transport.BindHost$")] - public string BindHost { get; set; } = "127.0.0.1"; - - [TomlInlineComment("$ChatBot.McpServer.Transport.Port$")] - public int Port { get; set; } = 33333; - - [TomlInlineComment("$ChatBot.McpServer.Transport.Route$")] - public string Route { get; set; } = "/mcp"; - - [TomlInlineComment("$ChatBot.McpServer.Transport.RequireAuthToken$")] - public bool RequireAuthToken { get; set; } - - [TomlInlineComment("$ChatBot.McpServer.Transport.AuthTokenEnvVar$")] - public string AuthTokenEnvVar { get; set; } = "MCC_MCP_AUTH_TOKEN"; -} - -public sealed class MccMcpCapabilityToggles -{ - [TomlInlineComment("$ChatBot.McpServer.Capabilities.SessionStatus$")] - public bool SessionStatus { get; set; } = true; - - [TomlInlineComment("$ChatBot.McpServer.Capabilities.ChatAndCommands$")] - public bool ChatAndCommands { get; set; } = true; - - [TomlInlineComment("$ChatBot.McpServer.Capabilities.Movement$")] - public bool Movement { get; set; } = true; - - [TomlInlineComment("$ChatBot.McpServer.Capabilities.Inventory$")] - public bool Inventory { get; set; } = true; - - [TomlInlineComment("$ChatBot.McpServer.Capabilities.EntityWorld$")] - public bool EntityWorld { get; set; } = true; -} diff --git a/MinecraftClient/Mcp/MccMcpGuidanceProvider.cs b/MinecraftClient/Mcp/MccMcpGuidanceProvider.cs deleted file mode 100644 index 465d8592af..0000000000 --- a/MinecraftClient/Mcp/MccMcpGuidanceProvider.cs +++ /dev/null @@ -1,263 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Security.Cryptography; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Text.Json.Serialization; - -namespace MinecraftClient.Mcp; - -public sealed class MccMcpGuidanceProvider -{ - private const string EmbeddedPromptResourceSuffix = "MccMcpOperatorPrompt.md"; - private const string BestPracticesHeading = "## Best Practices"; - private const string ExampleScenariosHeading = "## Example Scenarios"; - - private readonly MccMcpConfig config; - private readonly Lazy guidanceDocument; - - public MccMcpGuidanceProvider(MccMcpConfig config) - { - this.config = config; - guidanceDocument = new Lazy(LoadGuidanceDocument); - } - - public string PromptName => "mcc_operator_prompt"; - - public string SkillName => "mcc-mcp-operator"; - - public string GetSystemPrompt() - { - GuidanceDocument document = guidanceDocument.Value; - MccMcpAgentCapabilityStatus capabilityStatus = BuildCapabilityStatus(); - StringBuilder builder = new(); - builder.AppendLine("You are an external agent controlling Minecraft Console Client (MCC) through its built-in MCP server."); - builder.AppendLine("Use the following MCP Operator Prompt as your system prompt. Treat the capability snapshot as authoritative and do not invent unsupported actions."); - builder.AppendLine(); - builder.AppendLine(document.BodyMarkdown); - builder.AppendLine(); - builder.AppendLine("Current capability snapshot"); - builder.AppendLine($"- sessionStatus: {FormatCapability(capabilityStatus.SessionStatus)}"); - builder.AppendLine($"- chatAndCommands: {FormatCapability(capabilityStatus.ChatAndCommands)}"); - builder.AppendLine($"- movement: {FormatCapability(capabilityStatus.Movement)}"); - builder.AppendLine($"- inventory: {FormatCapability(capabilityStatus.Inventory)}"); - builder.AppendLine($"- entityWorld: {FormatCapability(capabilityStatus.EntityWorld)}"); - return builder.ToString().Trim(); - } - - public MccMcpAgentGuidancePayload GetToolPayload() - { - GuidanceDocument document = guidanceDocument.Value; - return new MccMcpAgentGuidancePayload - { - PromptName = PromptName, - PromptMarkdown = document.PromptMarkdown, - SkillName = SkillName, - GuidanceVersion = document.GuidanceVersion, - SkillMarkdown = document.SkillMarkdown, - SystemPrompt = GetSystemPrompt(), - BestPractices = document.BestPractices, - ExampleScenarios = document.ExampleScenarios, - CapabilityStatus = BuildCapabilityStatus() - }; - } - - private GuidanceDocument LoadGuidanceDocument() - { - Assembly assembly = typeof(MccMcpGuidanceProvider).Assembly; - string resourceName = assembly.GetManifestResourceNames() - .FirstOrDefault(name => name.EndsWith(EmbeddedPromptResourceSuffix, StringComparison.Ordinal)) - ?? throw new InvalidOperationException($"Embedded MCP operator prompt resource '{EmbeddedPromptResourceSuffix}' was not found."); - - using Stream? stream = assembly.GetManifestResourceStream(resourceName); - if (stream is null) - throw new InvalidOperationException($"Embedded MCP operator prompt resource '{resourceName}' could not be opened."); - - using StreamReader reader = new(stream, Encoding.UTF8); - string promptMarkdown = reader.ReadToEnd(); - string bodyMarkdown = StripFrontmatter(promptMarkdown); - string bestPracticesSection = ExtractSection(bodyMarkdown, BestPracticesHeading); - string exampleScenariosSection = ExtractSection(bodyMarkdown, ExampleScenariosHeading); - - return new GuidanceDocument( - ComputeGuidanceVersion(promptMarkdown), - promptMarkdown.Replace("\r\n", "\n").Trim(), - bodyMarkdown, - ExtractBulletList(bestPracticesSection), - ExtractExampleScenarios(exampleScenariosSection)); - } - - private MccMcpAgentCapabilityStatus BuildCapabilityStatus() - { - return new MccMcpAgentCapabilityStatus - { - SessionStatus = config.Capabilities.SessionStatus, - ChatAndCommands = config.Capabilities.ChatAndCommands, - Movement = config.Capabilities.Movement, - Inventory = config.Capabilities.Inventory, - EntityWorld = config.Capabilities.EntityWorld - }; - } - - private static string StripFrontmatter(string markdown) - { - string normalized = markdown.Replace("\r\n", "\n"); - if (!normalized.StartsWith("---\n", StringComparison.Ordinal)) - return normalized.Trim(); - - int endOfFrontmatter = normalized.IndexOf("\n---\n", 4, StringComparison.Ordinal); - if (endOfFrontmatter < 0) - return normalized.Trim(); - - return normalized[(endOfFrontmatter + 5)..].Trim(); - } - - private static string ExtractSection(string markdownBody, string heading) - { - int headingIndex = markdownBody.IndexOf(heading, StringComparison.Ordinal); - if (headingIndex < 0) - return string.Empty; - - int sectionStart = headingIndex + heading.Length; - int nextHeading = markdownBody.IndexOf("\n## ", sectionStart, StringComparison.Ordinal); - string section = nextHeading >= 0 - ? markdownBody[sectionStart..nextHeading] - : markdownBody[sectionStart..]; - - return section.Trim(); - } - - private static string[] ExtractBulletList(string section) - { - return section - .Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) - .Where(line => line.StartsWith("- ", StringComparison.Ordinal)) - .Select(line => line[2..].Trim()) - .Where(line => line.Length > 0) - .ToArray(); - } - - private static MccMcpAgentScenario[] ExtractExampleScenarios(string section) - { - if (string.IsNullOrWhiteSpace(section)) - return []; - - List scenarios = []; - string? currentTitle = null; - List currentBodyLines = []; - - foreach (string rawLine in section.Split('\n')) - { - string line = rawLine.TrimEnd(); - if (line.StartsWith("### ", StringComparison.Ordinal)) - { - AddScenario(scenarios, currentTitle, currentBodyLines); - currentTitle = line[4..].Trim(); - currentBodyLines = []; - continue; - } - - if (currentTitle is not null) - currentBodyLines.Add(line); - } - - AddScenario(scenarios, currentTitle, currentBodyLines); - return scenarios.ToArray(); - } - - private static void AddScenario(List scenarios, string? title, List bodyLines) - { - if (string.IsNullOrWhiteSpace(title)) - return; - - string guidance = string.Join('\n', bodyLines) - .Trim(); - - scenarios.Add(new MccMcpAgentScenario - { - Title = title, - Guidance = guidance - }); - } - - private static string FormatCapability(bool enabled) - { - return enabled ? "enabled" : "disabled"; - } - - private static string ComputeGuidanceVersion(string markdown) - { - byte[] bytes = Encoding.UTF8.GetBytes(markdown.Replace("\r\n", "\n").Trim()); - byte[] hash = SHA256.HashData(bytes); - return Convert.ToHexString(hash[..8]).ToLowerInvariant(); - } - - private sealed record GuidanceDocument( - string GuidanceVersion, - string SkillMarkdown, - string BodyMarkdown, - string[] BestPractices, - MccMcpAgentScenario[] ExampleScenarios) - { - public string PromptMarkdown => SkillMarkdown; - } -} - -public sealed class MccMcpAgentGuidancePayload -{ - [JsonPropertyName("promptName")] - public string PromptName { get; init; } = string.Empty; - - [JsonPropertyName("promptMarkdown")] - public string PromptMarkdown { get; init; } = string.Empty; - - [JsonPropertyName("skillName")] - public string SkillName { get; init; } = string.Empty; - - [JsonPropertyName("guidanceVersion")] - public string GuidanceVersion { get; init; } = string.Empty; - - [JsonPropertyName("skillMarkdown")] - public string SkillMarkdown { get; init; } = string.Empty; - - [JsonPropertyName("systemPrompt")] - public string SystemPrompt { get; init; } = string.Empty; - - [JsonPropertyName("bestPractices")] - public string[] BestPractices { get; init; } = []; - - [JsonPropertyName("exampleScenarios")] - public MccMcpAgentScenario[] ExampleScenarios { get; init; } = []; - - [JsonPropertyName("capabilityStatus")] - public MccMcpAgentCapabilityStatus CapabilityStatus { get; init; } = new(); -} - -public sealed class MccMcpAgentScenario -{ - [JsonPropertyName("title")] - public string Title { get; init; } = string.Empty; - - [JsonPropertyName("guidance")] - public string Guidance { get; init; } = string.Empty; -} - -public sealed class MccMcpAgentCapabilityStatus -{ - [JsonPropertyName("sessionStatus")] - public bool SessionStatus { get; init; } - - [JsonPropertyName("chatAndCommands")] - public bool ChatAndCommands { get; init; } - - [JsonPropertyName("movement")] - public bool Movement { get; init; } - - [JsonPropertyName("inventory")] - public bool Inventory { get; init; } - - [JsonPropertyName("entityWorld")] - public bool EntityWorld { get; init; } -} diff --git a/MinecraftClient/Mcp/MccMcpPromptSet.cs b/MinecraftClient/Mcp/MccMcpPromptSet.cs deleted file mode 100644 index 970528a68f..0000000000 --- a/MinecraftClient/Mcp/MccMcpPromptSet.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.ComponentModel; -using ModelContextProtocol.Server; - -namespace MinecraftClient.Mcp; - -public sealed class MccMcpPromptSet -{ - private readonly MccMcpGuidanceProvider guidanceProvider; - - public MccMcpPromptSet(MccMcpGuidanceProvider guidanceProvider) - { - this.guidanceProvider = guidanceProvider; - } - - [McpServerPrompt(Name = "mcc_operator_prompt"), Description("Get the canonical MCC MCP Operator Prompt for external agents using this MCP server.")] - public string OperatorPrompt() - { - return guidanceProvider.GetSystemPrompt(); - } -} diff --git a/MinecraftClient/Mcp/MccMcpRecentEventStore.cs b/MinecraftClient/Mcp/MccMcpRecentEventStore.cs deleted file mode 100644 index 69da1b5750..0000000000 --- a/MinecraftClient/Mcp/MccMcpRecentEventStore.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Linq; -using MinecraftClient.Scripting; - -namespace MinecraftClient.Mcp; - -public sealed class MccMcpRecentEventEntry -{ - public required long Id { get; init; } - public required DateTimeOffset TimestampUtc { get; init; } - public required string Type { get; init; } - public object? Data { get; init; } -} - -public static class MccMcpRecentEventStore -{ - public static long Add(string type, object? data = null) - { - return MccObservedStateStore.AddRecentEvent(type, data); - } - - public static long GetLatestId() - { - return MccObservedStateStore.GetLatestRecentEventId(); - } - - public static MccMcpRecentEventEntry[] GetAfter(long afterId, int maxCount, string? typeFilter = null) - { - return MccObservedStateStore.GetRecentEventsAfter(afterId, maxCount, typeFilter) - .Select(entry => new MccMcpRecentEventEntry - { - Id = entry.Id, - TimestampUtc = entry.TimestampUtc, - Type = entry.Type, - Data = entry.Data - }) - .ToArray(); - } - - public static void Clear() - { - MccObservedStateStore.ClearRecentEvents(); - } -} diff --git a/MinecraftClient/Mcp/MccMcpResult.cs b/MinecraftClient/Mcp/MccMcpResult.cs deleted file mode 100644 index 0c12fbf259..0000000000 --- a/MinecraftClient/Mcp/MccMcpResult.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; - -namespace MinecraftClient.Mcp; - -public sealed class MccMcpResult -{ - public bool Success { get; init; } - public string? ErrorCode { get; init; } - public string? Message { get; init; } - public object? Data { get; init; } - - public static MccMcpResult Ok(object? data = null, string? message = null) - { - return new MccMcpResult - { - Success = true, - Data = data, - Message = message - }; - } - - public static MccMcpResult Fail(string errorCode, string? message = null, object? data = null) - { - ArgumentException.ThrowIfNullOrEmpty(errorCode); - return new MccMcpResult - { - Success = false, - ErrorCode = errorCode, - Message = message, - Data = data - }; - } -} diff --git a/MinecraftClient/Mcp/MccMcpRuntimeStateStore.cs b/MinecraftClient/Mcp/MccMcpRuntimeStateStore.cs deleted file mode 100644 index c9c3daf0e1..0000000000 --- a/MinecraftClient/Mcp/MccMcpRuntimeStateStore.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using MinecraftClient.Scripting; - -namespace MinecraftClient.Mcp; - -public sealed class MccMcpRuntimeStateSnapshot -{ - public long? WorldAge { get; init; } - public long? TimeOfDay { get; init; } - public float? RainLevel { get; init; } - public float? ThunderLevel { get; init; } -} - -public static class MccMcpRuntimeStateStore -{ - public static void SetTime(long newWorldAge, long newTimeOfDay) - { - MccObservedStateStore.SetTime(newWorldAge, newTimeOfDay); - } - - public static void SetRainLevel(float level) - { - MccObservedStateStore.SetRainLevel(level); - } - - public static void SetThunderLevel(float level) - { - MccObservedStateStore.SetThunderLevel(level); - } - - public static MccMcpRuntimeStateSnapshot GetSnapshot() - { - MccRuntimeStateSnapshot snapshot = MccObservedStateStore.GetRuntimeStateSnapshot(); - return new MccMcpRuntimeStateSnapshot - { - WorldAge = snapshot.WorldAge, - TimeOfDay = snapshot.TimeOfDay, - RainLevel = snapshot.RainLevel, - ThunderLevel = snapshot.ThunderLevel - }; - } - - public static void Clear() - { - MccObservedStateStore.ClearRuntimeState(); - } -} diff --git a/MinecraftClient/Mcp/MccMcpToolSet.cs b/MinecraftClient/Mcp/MccMcpToolSet.cs deleted file mode 100644 index 84305e3480..0000000000 --- a/MinecraftClient/Mcp/MccMcpToolSet.cs +++ /dev/null @@ -1,401 +0,0 @@ -using System.ComponentModel; -using ModelContextProtocol.Server; - -namespace MinecraftClient.Mcp; - -[McpServerToolType] -public sealed class MccMcpToolSet -{ - private readonly IMccMcpCapabilities capabilities; - private readonly MccMcpGuidanceProvider guidanceProvider; - - public MccMcpToolSet(IMccMcpCapabilities capabilities, MccMcpGuidanceProvider guidanceProvider) - { - this.capabilities = capabilities; - this.guidanceProvider = guidanceProvider; - } - - [McpServerTool(Name = "mcc_session_status"), Description("Get current MCC session and feature status.")] - public object SessionStatus() - { - return capabilities.GetSessionStatus(); - } - - [McpServerTool(Name = "mcc_server_info"), Description("Get active MCC server connection info and current TPS.")] - public object ServerInfo() - { - return capabilities.GetServerInfo(); - } - - [McpServerTool(Name = "mcc_player_state"), Description("Get current controlled player state.")] - public object PlayerState() - { - return capabilities.GetPlayerState(); - } - - [McpServerTool(Name = "mcc_world_state"), Description("Get current world state, chunk loading progress, and last observed runtime time/weather values.")] - public object WorldState() - { - return capabilities.GetWorldState(); - } - - [McpServerTool(Name = "mcc_chunk_status"), Description("Get chunk loading status for the player location or an explicit world coordinate.")] - public object ChunkStatus(double? x = null, double? y = null, double? z = null) - { - return capabilities.GetChunkStatus(x, y, z); - } - - [McpServerTool(Name = "mcc_raycast_block"), Description("Raycast from the player's current view and return the first non-air block hit.")] - public object RaycastBlock(double maxDistance = 8.0, bool includeNeighbors = false) - { - return capabilities.RaycastBlock(maxDistance, includeNeighbors); - } - - [McpServerTool(Name = "mcc_path_preview"), Description("Compute a path preview to a target world coordinate without moving there.")] - public object PathPreview(double x, double y, double z, bool allowUnsafe = false, int maxOffset = 0, int minOffset = 0, int timeoutMs = 0, int maxWaypoints = 128) - { - return capabilities.PreviewPath(x, y, z, allowUnsafe, maxOffset, minOffset, timeoutMs, maxWaypoints); - } - - [McpServerTool(Name = "mcc_players_list"), Description("List currently known online players.")] - public object PlayersList() - { - return capabilities.GetPlayersList(); - } - - [McpServerTool(Name = "mcc_players_detailed"), Description("List online players with UUID, latency, gamemode, and tracked coordinates when available.")] - public object PlayersDetailed(bool includeSelf = false, bool includeCoordinates = true) - { - return capabilities.GetPlayersDetailed(includeSelf, includeCoordinates); - } - - [McpServerTool(Name = "mcc_player_stats"), Description("Get current controlled player stats, orientation, and location.")] - public object PlayerStats() - { - return capabilities.GetPlayerStats(); - } - - [McpServerTool(Name = "mcc_status_effects"), Description("Get active player status effects only.")] - public object StatusEffects() - { - return capabilities.GetStatusEffects(); - } - - [McpServerTool(Name = "mcc_recent_events"), Description("Get recent high-signal MCP runtime events after a given event ID.")] - public object RecentEvents(long afterId = 0, int maxCount = 50, string? typeFilter = null) - { - return capabilities.GetRecentEvents(afterId, maxCount, typeFilter); - } - - [McpServerTool(Name = "mcc_loaded_bots"), Description("List currently loaded MCC bots and scripts.")] - public object LoadedBots() - { - return capabilities.GetLoadedBots(); - } - - [McpServerTool(Name = "mcc_chat_history"), Description("Get recent chat/system lines seen by MCC.")] - public object ChatHistory(int maxCount = 50, bool includeJson = false) - { - return capabilities.GetChatHistory(maxCount, includeJson); - } - - [McpServerTool(Name = "mcc_internal_commands_list"), Description("List available MCC internal commands with usage and description.")] - public object InternalCommandsList() - { - return capabilities.GetInternalCommands(); - } - - [McpServerTool(Name = "mcc_agent_guidance"), Description("Get the canonical MCC MCP Operator Prompt bundle for external agents using this MCP server.")] - public object AgentGuidance() - { - return guidanceProvider.GetToolPayload(); - } - - [McpServerTool(Name = "mcc_materials_list"), Description("List known MCC material names with optional filtering.")] - public object MaterialsList(string? filter = null, int maxCount = 500) - { - return capabilities.GetMaterialsList(filter, maxCount); - } - - [McpServerTool(Name = "mcc_block_types_list"), Description("List known MCC block type names with optional filtering.")] - public object BlockTypesList(string? filter = null, int maxCount = 500) - { - return capabilities.GetBlockTypesList(filter, maxCount); - } - - [McpServerTool(Name = "mcc_entity_types_list"), Description("List known MCC entity type names with optional filtering.")] - public object EntityTypesList(string? filter = null, int maxCount = 500) - { - return capabilities.GetEntityTypesList(filter, maxCount); - } - - [McpServerTool(Name = "mcc_send_chat"), Description("Send chat text or slash-command to the connected Minecraft server.")] - public object SendChat([Description("Text to send to server chat.")] string text) - { - return capabilities.SendChat(text); - } - - [McpServerTool(Name = "mcc_quit_client"), Description("Quit MCC client process cleanly.")] - public object QuitClient() - { - return capabilities.QuitClient(); - } - - [McpServerTool(Name = "mcc_disconnect"), Description("Disconnect MCC from the current server without quitting the process.")] - public object Disconnect() - { - return capabilities.DisconnectClient(); - } - - [McpServerTool(Name = "mcc_respawn"), Description("Send the respawn packet when the controlled player is dead.")] - public object Respawn() - { - return capabilities.Respawn(); - } - - [McpServerTool(Name = "mcc_run_internal_command"), Description("Run an internal MCC command.")] - public object RunInternalCommand([Description("MCC command line without leading slash.")] string command) - { - return capabilities.RunInternalCommand(command); - } - - [McpServerTool(Name = "mcc_animation"), Description("Play a hand-swing animation with the selected hand.")] - public object Animation(string hand = "MainHand") - { - return capabilities.PlayAnimation(hand); - } - - [McpServerTool(Name = "mcc_toggle_sneak"), Description("Explicitly enable or disable sneaking.")] - public object ToggleSneak(bool enabled) - { - return capabilities.ToggleSneak(enabled); - } - - [McpServerTool(Name = "mcc_toggle_sprint"), Description("Explicitly send start or stop sprinting entity actions.")] - public object ToggleSprint(bool enabled) - { - return capabilities.ToggleSprint(enabled); - } - - [McpServerTool(Name = "mcc_change_hotbar_slot"), Description("Change active hotbar slot (1-9).")] - public object ChangeHotbarSlot(int slot) - { - return capabilities.ChangeHotbarSlot(slot); - } - - [McpServerTool(Name = "mcc_select_item"), Description("Select a hotbar item by item type without rearranging inventory contents.")] - public object SelectItem(string itemType, bool preferLowestSlot = true) - { - return capabilities.SelectHotbarItem(itemType, preferLowestSlot); - } - - [McpServerTool(Name = "mcc_use_item_on_hand"), Description("Use the currently held item.")] - public object UseItemOnHand() - { - return capabilities.UseItemOnHand(); - } - - [McpServerTool(Name = "mcc_use_item_on_block"), Description("Use currently held item on a target block location.")] - public object UseItemOnBlock(double x, double y, double z) - { - return capabilities.UseItemOnBlock(x, y, z); - } - - [McpServerTool(Name = "mcc_dig_block"), Description("Dig a block at target location.")] - public object DigBlock(double x, double y, double z, double durationSeconds = 0) - { - return capabilities.DigBlock(x, y, z, durationSeconds); - } - - [McpServerTool(Name = "mcc_place_block"), Description("Place the currently held block/item at a target block location.")] - public object PlaceBlock(int x, int y, int z, string face = "Up", string hand = "MainHand", bool lookAtBlock = false) - { - return capabilities.PlaceBlock(x, y, z, face, hand, lookAtBlock); - } - - [McpServerTool(Name = "mcc_entity_interact"), Description("Interact with a tracked entity.")] - public object EntityInteract(int entityId, string interaction = "Interact", string hand = "MainHand") - { - return capabilities.InteractEntity(entityId, interaction, hand); - } - - [McpServerTool(Name = "mcc_entity_attack"), Description("Attack a tracked entity explicitly.")] - public object EntityAttack(int entityId) - { - return capabilities.AttackEntity(entityId); - } - - [McpServerTool(Name = "mcc_block_scan"), Description("Scan nearby blocks around player location.")] - public object BlockScan(int radius = 3, int maxCount = 200, string? materialFilter = null) - { - return capabilities.ScanNearbyBlocks(radius, maxCount, materialFilter); - } - - [McpServerTool(Name = "mcc_blocks_find"), Description("Find nearby blocks by block name/type query or block ID.")] - public object BlocksFind(string? query = null, int radius = 6, int maxCount = 200, bool exactMatch = false) - { - return capabilities.FindBlocks(query, radius, maxCount, exactMatch); - } - - [McpServerTool(Name = "mcc_player_nearby"), Description("Check if any player, or a specific player, is nearby.")] - public object PlayerNearby(string? playerName = null, double radius = 32, bool includeSelf = false) - { - return capabilities.IsPlayerNearby(playerName, radius, includeSelf); - } - - [McpServerTool(Name = "mcc_player_locate"), Description("Locate a tracked player entity by name and return exact coordinates when available.")] - public object PlayerLocate(string playerName, bool includeSelf = false) - { - return capabilities.LocatePlayer(playerName, includeSelf); - } - - [McpServerTool(Name = "mcc_entity_nearest"), Description("Return the nearest tracked entity matching the requested filters.")] - public object EntityNearest(string? typeFilter = null, string? nameFilter = null, double radius = 64.0, bool includePlayers = true) - { - return capabilities.FindNearestEntity(typeFilter, nameFilter, radius, includePlayers); - } - - [McpServerTool(Name = "mcc_can_reach_position"), Description("Check whether MCC can currently path to a world coordinate without moving there.")] - public object CanReachPosition(double x, double y, double z, bool allowUnsafe = false, int maxOffset = 0, int minOffset = 0, int timeoutMs = 0) - { - return capabilities.CanReachPosition(x, y, z, allowUnsafe, maxOffset, minOffset, timeoutMs); - } - - [McpServerTool(Name = "mcc_move_to"), Description("Request movement/pathing to a world coordinate and verify arrival.")] - public object MoveTo(double x, double y, double z, bool allowUnsafe = false, bool allowDirectTeleport = false, int maxOffset = 0, int minOffset = 0, int timeoutMs = 0) - { - return capabilities.MoveTo(x, y, z, allowUnsafe, allowDirectTeleport, maxOffset, minOffset, timeoutMs); - } - - [McpServerTool(Name = "mcc_move_to_player"), Description("Locate a tracked player entity, request movement/pathing, and verify arrival.")] - public object MoveToPlayer(string playerName, bool allowUnsafe = false, bool allowDirectTeleport = false, int maxOffset = 0, int minOffset = 0, int timeoutMs = 0) - { - return capabilities.MoveToPlayer(playerName, allowUnsafe, allowDirectTeleport, maxOffset, minOffset, timeoutMs); - } - - [McpServerTool(Name = "mcc_look_at"), Description("Rotate player view toward world coordinates.")] - public object LookAt(double x, double y, double z) - { - return capabilities.LookAt(x, y, z); - } - - [McpServerTool(Name = "mcc_look_direction"), Description("Rotate player view to a cardinal direction or straight up/down.")] - public object LookDirection(string direction) - { - return capabilities.LookDirection(direction); - } - - [McpServerTool(Name = "mcc_look_angles"), Description("Rotate player view to explicit yaw and pitch angles.")] - public object LookAngles(float yaw, float pitch) - { - return capabilities.LookAngles(yaw, pitch); - } - - [McpServerTool(Name = "mcc_inventory_snapshot"), Description("Get a snapshot of one inventory.")] - public object InventorySnapshot([Description("Inventory ID. 0 is the player inventory.")] int inventoryId = 0) - { - return capabilities.GetInventorySnapshot(inventoryId); - } - - [McpServerTool(Name = "mcc_inventory_search"), Description("Search the player inventory and optionally open containers for items matching a query.")] - public object InventorySearch(string query, int maxCount = 100, bool exactMatch = false, bool includeContainers = true) - { - return capabilities.SearchInventories(query, maxCount, exactMatch, includeContainers); - } - - [McpServerTool(Name = "mcc_inventories_list"), Description("List currently open inventories and containers known to MCC.")] - public object InventoriesList() - { - return capabilities.ListInventories(); - } - - [McpServerTool(Name = "mcc_container_open_at"), Description("Open an interactable container block at world coordinates and wait for the container inventory to appear.")] - public object ContainerOpenAt(int x, int y, int z, int timeoutMs = 0, bool closeCurrent = true) - { - return capabilities.OpenContainerAt(x, y, z, timeoutMs, closeCurrent); - } - - [McpServerTool(Name = "mcc_container_close"), Description("Close an open non-player container. Use inventoryId=-1 to close the active container.")] - public object ContainerClose([Description("Container inventory ID, or -1 for the active non-player container.")] int inventoryId = -1, int timeoutMs = 0) - { - return capabilities.CloseContainer(inventoryId, timeoutMs); - } - - [McpServerTool(Name = "mcc_inventory_window_action"), Description("Perform a window action on an inventory slot.")] - public object InventoryWindowAction(int inventoryId, int slotId, [Description("WindowActionType enum name, e.g. LeftClick or ShiftClick.")] string actionType) - { - return capabilities.InventoryWindowAction(inventoryId, slotId, actionType); - } - - [McpServerTool(Name = "mcc_inventory_drop_item"), Description("Drop an exact item count from an inventory by item type.")] - public object InventoryDropItem( - [Description("Item type enum name (e.g. Diamond).")] string itemType, - [Description("Exact number of items to drop.")] int count, - [Description("Inventory ID. 0 is the player inventory.")] int inventoryId = 0, - [Description("Prefer dropping from larger stacks first when true.")] bool preferStack = false) - { - return capabilities.DropInventoryItem(itemType, count, inventoryId, preferStack); - } - - [McpServerTool(Name = "mcc_container_deposit_item"), Description("Move an exact item count from the player inventory into an open container and verify the transfer.")] - public object ContainerDepositItem( - [Description("Item type enum name (e.g. Diamond).")] string itemType, - [Description("Exact number of items to move into the container.")] int count, - [Description("Container inventory ID, or -1 for the active non-player container.")] int inventoryId = -1, - [Description("Prefer larger source stacks first when true.")] bool preferLargestStack = true) - { - return capabilities.DepositContainerItem(itemType, count, inventoryId, preferLargestStack); - } - - [McpServerTool(Name = "mcc_container_withdraw_item"), Description("Move an exact item count from an open container into the player inventory and verify the transfer.")] - public object ContainerWithdrawItem( - [Description("Item type enum name (e.g. Diamond).")] string itemType, - [Description("Exact number of items to move into the player inventory.")] int count, - [Description("Container inventory ID, or -1 for the active non-player container.")] int inventoryId = -1, - [Description("Prefer larger source stacks first when true.")] bool preferLargestStack = true) - { - return capabilities.WithdrawContainerItem(itemType, count, inventoryId, preferLargestStack); - } - - [McpServerTool(Name = "mcc_entities_query"), Description("Query tracked entities.")] - public object EntitiesQuery([Description("Maximum entities to return.")] int maxCount = 50) - { - return capabilities.QueryEntities(maxCount); - } - - [McpServerTool(Name = "mcc_entities_list"), Description("List tracked entities with optional type and radius filtering.")] - public object EntitiesList(int maxCount = 100, string? typeFilter = null, double radius = 0) - { - return capabilities.ListEntities(maxCount, typeFilter, radius); - } - - [McpServerTool(Name = "mcc_entity_info"), Description("Get detailed info for one tracked entity.")] - public object EntityInfo(int entityId, bool includeMetadata = false, bool includeEquipment = true, bool includeEffects = true) - { - return capabilities.GetEntityInfo(entityId, includeMetadata, includeEquipment, includeEffects); - } - - [McpServerTool(Name = "mcc_signs_find"), Description("Find nearby signs whose text exactly matches or contains the requested text.")] - public object SignsFind(string text, bool exactMatch = false, int radius = 16, int maxCount = 50, bool includeBackText = true) - { - return capabilities.FindSigns(text, exactMatch, radius, maxCount, includeBackText); - } - - [McpServerTool(Name = "mcc_items_list"), Description("List nearby dropped item entities with optional item type filtering.")] - public object ItemsList(string? itemType = null, double radius = 32, int maxCount = 100) - { - return capabilities.ListItemEntities(itemType, radius, maxCount); - } - - [McpServerTool(Name = "mcc_items_pickup"), Description("Move to and pick up nearby dropped items of a given item type.")] - public object ItemsPickup(string itemType, double radius = 32, int maxItems = 20, bool allowUnsafe = false, int timeoutMs = 0) - { - return capabilities.PickupItems(itemType, radius, maxItems, allowUnsafe, timeoutMs); - } - - [McpServerTool(Name = "mcc_world_block_at"), Description("Get block information at world coordinates.")] - public object WorldBlockAt(int x, int y, int z) - { - return capabilities.GetWorldBlockAt(x, y, z); - } -} diff --git a/MinecraftClient/Mcp/Prompts/MccMcpOperatorPrompt.md b/MinecraftClient/Mcp/Prompts/MccMcpOperatorPrompt.md deleted file mode 100644 index 7a24541de6..0000000000 --- a/MinecraftClient/Mcp/Prompts/MccMcpOperatorPrompt.md +++ /dev/null @@ -1,139 +0,0 @@ -# MCC MCP Operator Prompt - -Use the MCC MCP toolset as the source of truth for game state and action results. -Do not guess what happened from intent alone. -If tool results and fresh observations disagree, trust the freshest direct observation and report the conflict honestly. - -## Operating Loop - -1. Inspect the current situation before acting. -2. Make the shortest plan that can succeed. -3. Use the smallest set of high-signal tools needed to act. -4. Verify the outcome with fresh tool calls that read the state again after the action. -5. Report only what is verified, and clearly label anything inferred, conflicting, or still unknown. - -If the request is purely conversational and does not require MCC state, answer directly instead of wasting tool calls. -If the user asks for a before/after comparison, keep or obtain explicit before and after observations. If you do not have a verified baseline, say so instead of reconstructing history from memory. - -## Tool Selection Rules - -- Start with `mcc_session_status` whenever connection state, enabled capabilities, or feature availability is uncertain. -- Prefer direct inspection tools such as `mcc_world_state`, `mcc_chunk_status`, `mcc_player_state`, `mcc_player_stats`, `mcc_players_detailed`, `mcc_entities_list`, `mcc_entity_nearest`, `mcc_blocks_find`, `mcc_raycast_block`, `mcc_items_list`, `mcc_inventory_snapshot`, and `mcc_inventory_search` before taking physical actions. -- For player-relative tasks, prefer `mcc_player_locate` or `mcc_players_detailed` before movement so the target is grounded in a fresh tracked position. -- Prefer purpose-built action tools over low-level escape hatches. -- Prefer `mcc_container_open_at`, `mcc_container_deposit_item`, and `mcc_container_withdraw_item` over `mcc_inventory_window_action` for chest or container work. -- Use `mcc_path_preview`, `mcc_can_reach_position`, or a locating tool before pathing when reachability or final approach quality is uncertain. -- Use `mcc_select_item` instead of manual slot changes when the goal is "hold the right item now". -- Use `mcc_look_direction`, `mcc_look_angles`, or `mcc_look_at` before `mcc_raycast_block`, `mcc_use_item_on_block`, or precise block interaction when view direction matters. -- Use `mcc_recent_events` when verifying outcomes that should produce a clear runtime event, such as `inventory_open`, `inventory_close`, `death`, `respawn`, `title`, or `actionbar`. -- Use `mcc_status_effects` when active effects matter, instead of inferring them from health or movement behavior. -- Use `mcc_loaded_bots` when bot/script presence could affect observed behavior. -- For "give this item to that player" requests, remember there is usually no direct inventory-to-inventory transfer tool. The normal MCP-compatible handoff is to move near the player and drop the item near them unless a more specific interaction tool clearly applies. -- Use `mcc_run_internal_command` only when no purpose-built MCP tool covers the task cleanly. -- Treat `success=false`, `action_incomplete`, `capability_disabled`, `feature_disabled`, and `invalid_args` as failed or partial observations, not success. -- After `invalid_args`, simplify the call and try at most one nearby variant. Do not spam near-duplicate guesses. -- Do not repeat the same failing action over and over. If an action fails or arrives short, gather one new observation that changes the plan before retrying. - -## Verification Rules - -- World-state assumptions should be verified with `mcc_world_state` or `mcc_chunk_status` when chunk loading, dimension, or time/weather readiness affects the plan. -- When the user cares about deltas, keep explicit before and after evidence for the exact thing that changed. -- If an action tool reports success but a fresh observation disagrees, trust the fresh observation and report the action as failed, partial, or inconclusive. -- Movement is not complete just because a move request was accepted. Confirm `arrived=true` or verify the new location with a fresh state read. -- A later successful retry proves the final state, not that every earlier attempt also succeeded. -- A path preview is not proof of arrival. Treat `mcc_path_preview` as planning evidence only, then verify the actual move separately. -- Digging is not complete just because `mcc_dig_block` was invoked. Re-check the target block or nearby block search results. -- View-dependent block interaction should be verified with `mcc_raycast_block` or `mcc_world_block_at` before and after the action when precision matters. -- Item pickup is not complete just because the bot moved over an item. Re-check inventory state or nearby dropped-item entities. -- Hotbar selection is not complete just because `mcc_select_item` returned success. Confirm the selected slot or held state with `mcc_player_stats` or a fresh inventory read. -- Dropping an item is not fully verified from intent alone. Re-check the inventory with a fresh `mcc_inventory_snapshot`. When useful, also inspect nearby dropped-item entities with `mcc_items_list`. -- Removing an item from your inventory does not prove another player received it. It only proves the item left your inventory or moved elsewhere. Claim that you "gave" or "delivered" an item to a player only if the stronger claim is supported. Otherwise say that you dropped it near them. -- Container transfers are not complete just because a click or transfer request was accepted. Verify the resulting counts after the transfer. -- Entity targeting should be verified with `mcc_entity_nearest`, `mcc_entity_info`, or another fresh entity read if the target could have moved or despawned. -- Use `mcc_recent_events` to verify eventful outcomes such as inventory open/close, death, respawn, title/actionbar messages, or similar runtime signals. -- Chat or command effects should be verified through state changes, chat history, or another direct observation when possible. -- When evidence is partial, say exactly what was verified and what remains unverified. -- When observations conflict, report the conflict plainly instead of smoothing it over. - -## Best Practices - -- Query first, act second, verify third. -- Keep plans short and concrete. Long speculative tool chains usually make the result worse. -- Prefer high-signal tools that answer the real question directly. -- Prefer newer structured reads like `mcc_world_state`, `mcc_player_stats`, `mcc_players_detailed`, `mcc_inventory_search`, and `mcc_recent_events` when they answer the question more directly than older generic tools. -- Use structured inventory and container tools instead of raw slot manipulation whenever possible. -- Do not claim success from acceptance alone. Always pair actions with a follow-up observation. -- Use fresh post-action reads for high-value or irreversible actions such as dropping items, moving items between inventories, placing blocks, digging blocks, attacking entities, disconnecting, or quitting. -- Preserve baselines when the user is likely to ask "what changed?" or "what did you have before?" later. -- Distinguish verified facts, reasonable inferences, and unknowns in the final answer. -- Use precise verbs. "Moved near", "dropped", "opened", "deposited", "withdrew", and "picked up" are stronger and safer than vague success language. -- Reserve "gave to player", "delivered", or similar wording for cases where that stronger claim is actually supported by evidence. -- If a tool says a capability or feature is disabled, stop using tools from that category and explain the limitation. -- If a path fails or arrives short, revise the plan using the latest position instead of blindly retrying the same action. -- Use `mcc_quit_client` to stop MCC. Do not send bare `quit` or `exit` through chat. -- Keep the final response concise and grounded in the evidence you actually collected. - -## Example Scenarios - -### Move to a player and confirm proximity - -User intent: "Find Zarko and move near them." - -Good flow: -- call `mcc_player_locate` or `mcc_players_list` to confirm the player is known -- if needed, call `mcc_players_detailed` for exact coordinates and `mcc_path_preview` or `mcc_can_reach_position` for the target area -- call `mcc_move_to_player` -- verify `arrived=true` or confirm the new position with `mcc_player_stats` -- report whether proximity was verified or only partially achieved - -### Drop an item for a player and report the result honestly - -User intent: "Move to Zarko and give them one dirt." - -Good flow: -- call `mcc_player_locate` to ground the target player -- call `mcc_inventory_snapshot` or `mcc_inventory_search` if item availability is uncertain -- call `mcc_move_to_player` -- call `mcc_inventory_drop_item` -- verify the result with a fresh `mcc_inventory_snapshot` -- if useful, call `mcc_items_list` nearby to confirm a dropped item entity exists near the handoff location -- report "dropped 1 dirt near Zarko" unless you actually observed stronger delivery evidence such as pickup - -### Open a chest, move an exact item count, and verify the result - -User intent: "Put 5 diamonds in the chest at 11000 64 11021." - -Good flow: -- call `mcc_container_open_at` -- inspect current state with `mcc_inventory_search` or `mcc_inventory_snapshot` if item availability is unclear -- call `mcc_container_deposit_item` or `mcc_container_withdraw_item` -- verify the resulting counts from the transfer result and, when useful, a fresh inventory snapshot or `mcc_recent_events` -- report the exact verified delta, not just that the action was attempted - -### Collect nearby dropped items or dig target blocks and verify the outcome - -User intent: "Pick up nearby apples" or "Break those logs and collect them." - -Good flow: -- call `mcc_items_list`, `mcc_blocks_find`, or `mcc_raycast_block` to locate the target -- move only if the target is not already reachable from the current position -- call `mcc_items_pickup` for dropped items, or `mcc_dig_block` in a sensible order for blocks -- verify the result with `mcc_items_list`, `mcc_inventory_snapshot`, or a fresh block query -- if the result is partial, say what changed and what still remains - -### Answer a before/after question without inventing history - -User intent: "What changed after that action?" or "What did you have before?" - -Good flow: -- if you already captured before and after reads, compare them directly -- if you only have current state, say what is currently verified and explicitly note that the earlier baseline was not captured -- do not backfill a historical claim just because it would make the story sound consistent - -## Output Style - -- Lead with the outcome the user cares about. -- Include the small set of observations that justify the answer. -- If something failed, say what failed, what was verified anyway, and the next sensible step. -- If you dropped an item near a player but did not observe pickup, say exactly that. -- Do not embellish uncertain results. diff --git a/MinecraftClient/MinecraftClient.csproj b/MinecraftClient/MinecraftClient.csproj deleted file mode 100644 index 85d2374595..0000000000 --- a/MinecraftClient/MinecraftClient.csproj +++ /dev/null @@ -1,112 +0,0 @@ - - - net10.0 - Exe - publish\ - false - default - enable - true - true - - false - - - false - - - Resources\AppIcon.ico - - - MinecraftClient.Program - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NU1701 - - - - - - - - - - - - - True - True - AsciiArt.resx - - - True - True - ConfigComments.resx - - - True - True - MinecraftAssets.resx - - - True - True - Translations.resx - - - - - ResXFileCodeGenerator - AsciiArt.Designer.cs - MinecraftClient - - - ResXFileCodeGenerator - ConfigComments.Designer.cs - MinecraftClient - - - ResXFileCodeGenerator - MinecraftAssets.Designer.cs - MinecraftClient - - - ResXFileCodeGenerator - Translations.Designer.cs - MinecraftClient - - - diff --git a/MinecraftClient/Physics/Aabb.cs b/MinecraftClient/Physics/Aabb.cs deleted file mode 100644 index 5ccff50249..0000000000 --- a/MinecraftClient/Physics/Aabb.cs +++ /dev/null @@ -1,195 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.CompilerServices; - -namespace MinecraftClient.Physics -{ - /// - /// Axis-aligned bounding box, mirrors net.minecraft.world.phys.AABB. - /// Immutable — mutating methods return new instances. - /// - public readonly struct Aabb : IEquatable - { - public static readonly Aabb Empty = new(0, 0, 0, 0, 0, 0); - - public readonly double MinX, MinY, MinZ; - public readonly double MaxX, MaxY, MaxZ; - - public Aabb(double x1, double y1, double z1, double x2, double y2, double z2) - { - MinX = Math.Min(x1, x2); - MinY = Math.Min(y1, y2); - MinZ = Math.Min(z1, z2); - MaxX = Math.Max(x1, x2); - MaxY = Math.Max(y1, y2); - MaxZ = Math.Max(z1, z2); - } - - /// - /// Create a player-style AABB centered on feetX/Z with given width and height - /// - public static Aabb OfSize(double centerX, double feetY, double centerZ, double width, double height) - { - double hw = width / 2.0; - return new Aabb(centerX - hw, feetY, centerZ - hw, centerX + hw, feetY + height, centerZ + hw); - } - - /// - /// Full block AABB at given integer position - /// - public static Aabb BlockAt(int x, int y, int z) => - new(x, y, z, x + 1.0, y + 1.0, z + 1.0); - - public double XSize => MaxX - MinX; - public double YSize => MaxY - MinY; - public double ZSize => MaxZ - MinZ; - - public double Min(int axis) => axis switch { 0 => MinX, 1 => MinY, _ => MinZ }; - public double Max(int axis) => axis switch { 0 => MaxX, 1 => MaxY, _ => MaxZ }; - - /// - /// Expand toward a movement direction (vanilla expandTowards) - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Aabb ExpandTowards(double dx, double dy, double dz) - { - double minX = MinX, minY = MinY, minZ = MinZ; - double maxX = MaxX, maxY = MaxY, maxZ = MaxZ; - if (dx < 0) minX += dx; else if (dx > 0) maxX += dx; - if (dy < 0) minY += dy; else if (dy > 0) maxY += dy; - if (dz < 0) minZ += dz; else if (dz > 0) maxZ += dz; - return new Aabb(minX, minY, minZ, maxX, maxY, maxZ); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Aabb ExpandTowards(Vec3d v) => ExpandTowards(v.X, v.Y, v.Z); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Aabb Inflate(double x, double y, double z) => - new(MinX - x, MinY - y, MinZ - z, MaxX + x, MaxY + y, MaxZ + z); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Aabb Inflate(double v) => Inflate(v, v, v); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Aabb Deflate(double x, double y, double z) => Inflate(-x, -y, -z); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Aabb Move(double dx, double dy, double dz) => - new(MinX + dx, MinY + dy, MinZ + dz, MaxX + dx, MaxY + dy, MaxZ + dz); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Aabb Move(Vec3d v) => Move(v.X, v.Y, v.Z); - - /// - /// Strict overlap test (vanilla uses < and >, not <=) - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Intersects(Aabb other) => - MinX < other.MaxX && MaxX > other.MinX && - MinY < other.MaxY && MaxY > other.MinY && - MinZ < other.MaxZ && MaxZ > other.MinZ; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Intersects(double x1, double y1, double z1, double x2, double y2, double z2) => - MinX < x2 && MaxX > x1 && MinY < y2 && MaxY > y1 && MinZ < z2 && MaxZ > z1; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Contains(double x, double y, double z) => - x >= MinX && x < MaxX && y >= MinY && y < MaxY && z >= MinZ && z < MaxZ; - - /// - /// Collide this AABB along a single axis against another AABB. - /// Returns the clamped movement distance. - /// - /// - /// Clip entity movement along X against a block shape (other). - /// Vanilla semantics: VoxelShape.collide(Axis.X, entityBox, movement). - /// - public double CollideX(Aabb other, double movement) - { - if (other.MaxY <= MinY || other.MinY >= MaxY || other.MaxZ <= MinZ || other.MinZ >= MaxZ) - return movement; - if (movement > 0.0 && other.MinX >= MaxX) - { - double d = other.MinX - MaxX; - if (d < movement) movement = d; - } - else if (movement < 0.0 && other.MaxX <= MinX) - { - double d = other.MaxX - MinX; - if (d > movement) movement = d; - } - return movement; - } - - public double CollideY(Aabb other, double movement) - { - if (other.MaxX <= MinX || other.MinX >= MaxX || other.MaxZ <= MinZ || other.MinZ >= MaxZ) - return movement; - if (movement > 0.0 && other.MinY >= MaxY) - { - double d = other.MinY - MaxY; - if (d < movement) movement = d; - } - else if (movement < 0.0 && other.MaxY <= MinY) - { - double d = other.MaxY - MinY; - if (d > movement) movement = d; - } - return movement; - } - - public double CollideZ(Aabb other, double movement) - { - if (other.MaxX <= MinX || other.MinX >= MaxX || other.MaxY <= MinY || other.MinY >= MaxY) - return movement; - if (movement > 0.0 && other.MinZ >= MaxZ) - { - double d = other.MinZ - MaxZ; - if (d < movement) movement = d; - } - else if (movement < 0.0 && other.MaxZ <= MinZ) - { - double d = other.MaxZ - MinZ; - if (d > movement) movement = d; - } - return movement; - } - - /// - /// Collide along an axis (0=X, 1=Y, 2=Z) against another AABB - /// - public double Collide(int axis, Aabb other, double movement) - { - return axis switch - { - 0 => CollideX(other, movement), - 1 => CollideY(other, movement), - 2 => CollideZ(other, movement), - _ => movement - }; - } - - public Vec3d GetCenter() => new( - (MinX + MaxX) * 0.5, - (MinY + MaxY) * 0.5, - (MinZ + MaxZ) * 0.5); - - public Vec3d GetBottomCenter() => new( - (MinX + MaxX) * 0.5, - MinY, - (MinZ + MaxZ) * 0.5); - - public bool Equals(Aabb other) => - MinX == other.MinX && MinY == other.MinY && MinZ == other.MinZ && - MaxX == other.MaxX && MaxY == other.MaxY && MaxZ == other.MaxZ; - - public override bool Equals(object? obj) => obj is Aabb a && Equals(a); - public override int GetHashCode() => HashCode.Combine(MinX, MinY, MinZ, MaxX, MaxY, MaxZ); - public override string ToString() => $"AABB[{MinX:F3},{MinY:F3},{MinZ:F3} -> {MaxX:F3},{MaxY:F3},{MaxZ:F3}]"; - - public static bool operator ==(Aabb a, Aabb b) => a.Equals(b); - public static bool operator !=(Aabb a, Aabb b) => !a.Equals(b); - } -} diff --git a/MinecraftClient/Physics/BlockShapeData.json b/MinecraftClient/Physics/BlockShapeData.json deleted file mode 100644 index 71b589ffa2..0000000000 --- a/MinecraftClient/Physics/BlockShapeData.json +++ /dev/null @@ -1 +0,0 @@ -{"shapes":{"0":[],"1":[[0.0,0.0,0.0,1.0,1.0,1.0]],"2":[[0.0,0.0,0.0,0.1875,0.5625,0.1875],[0.8125,0.0,0.0,1.0,0.5625,0.1875],[0.0,0.1875,0.1875,1.0,0.5625,1.0],[0.1875,0.1875,0.0,0.8125,0.5625,0.1875]],"3":[[0.0,0.0,0.8125,0.1875,0.5625,1.0],[0.8125,0.0,0.8125,1.0,0.5625,1.0],[0.0,0.1875,0.0,1.0,0.5625,0.8125],[0.1875,0.1875,0.8125,0.8125,0.5625,1.0]],"4":[[0.0,0.0,0.0,0.1875,0.5625,0.1875],[0.0,0.0,0.8125,0.1875,0.5625,1.0],[0.0,0.1875,0.1875,1.0,0.5625,0.8125],[0.1875,0.1875,0.0,1.0,0.5625,0.1875],[0.1875,0.1875,0.8125,1.0,0.5625,1.0]],"5":[[0.8125,0.0,0.0,1.0,0.5625,0.1875],[0.8125,0.0,0.8125,1.0,0.5625,1.0],[0.0,0.1875,0.0,0.8125,0.5625,1.0],[0.8125,0.1875,0.1875,1.0,0.5625,0.8125]],"6":[[0.0,0.0,0.25,1.0,1.0,1.0]],"7":[[0.0,0.0,0.0,0.75,1.0,1.0]],"8":[[0.0,0.0,0.0,1.0,1.0,0.75]],"9":[[0.25,0.0,0.0,1.0,1.0,1.0]],"10":[[0.0,0.0,0.0,1.0,0.75,1.0]],"11":[[0.0,0.25,0.0,1.0,1.0,1.0]],"12":[[0.0,0.0,0.0,1.0,1.0,0.25],[0.375,0.375,0.25,0.625,0.625,1.0]],"13":[[0.0,0.0,0.0,1.0,1.0,0.25],[0.375,0.375,0.25,0.625,0.625,1.25]],"14":[[0.75,0.0,0.0,1.0,1.0,1.0],[0.0,0.375,0.375,0.75,0.625,0.625]],"15":[[0.75,0.0,0.0,1.0,1.0,1.0],[-0.25,0.375,0.375,0.75,0.625,0.625]],"16":[[0.0,0.0,0.75,1.0,1.0,1.0],[0.375,0.375,0.0,0.625,0.625,0.75]],"17":[[0.0,0.0,0.75,1.0,1.0,1.0],[0.375,0.375,-0.25,0.625,0.625,0.75]],"18":[[0.0,0.0,0.0,0.25,1.0,1.0],[0.25,0.375,0.375,1.0,0.625,0.625]],"19":[[0.0,0.0,0.0,0.25,1.0,1.0],[0.25,0.375,0.375,1.25,0.625,0.625]],"20":[[0.375,0.0,0.375,0.625,1.0,0.625],[0.0,0.75,0.0,0.375,1.0,1.0],[0.375,0.75,0.0,1.0,1.0,0.375],[0.375,0.75,0.625,1.0,1.0,1.0],[0.625,0.75,0.375,1.0,1.0,0.625]],"21":[[0.375,-0.25,0.375,0.625,1.0,0.625],[0.0,0.75,0.0,0.375,1.0,1.0],[0.375,0.75,0.0,1.0,1.0,0.375],[0.375,0.75,0.625,1.0,1.0,1.0],[0.625,0.75,0.375,1.0,1.0,0.625]],"22":[[0.0,0.0,0.0,1.0,0.25,1.0],[0.375,0.25,0.375,0.625,1.0,0.625]],"23":[[0.0,0.0,0.0,1.0,0.25,1.0],[0.375,0.25,0.375,0.625,1.25,0.625]],"24":[[0.0,0.0,0.6875,1.0,0.25,1.0],[0.0,0.25,0.8125,1.0,1.0,1.0],[0.0,0.75,0.6875,1.0,1.0,0.8125]],"25":[[0.0,0.0,0.0,1.0,0.25,0.3125],[0.0,0.25,0.0,1.0,1.0,0.1875],[0.0,0.75,0.1875,1.0,1.0,0.3125]],"26":[[0.6875,0.0,0.0,1.0,0.25,1.0],[0.8125,0.25,0.0,1.0,1.0,1.0],[0.6875,0.75,0.0,0.8125,1.0,1.0]],"27":[[0.0,0.0,0.0,0.3125,0.25,1.0],[0.0,0.25,0.0,0.1875,1.0,1.0],[0.1875,0.75,0.0,0.3125,1.0,1.0]],"28":[[0.0,0.0,0.0,1.0,1.0,0.5],[0.0,0.5,0.5,1.0,1.0,1.0]],"29":[[0.0,0.0,0.0,0.5,1.0,1.0],[0.5,0.0,0.0,1.0,1.0,0.5],[0.5,0.5,0.5,1.0,1.0,1.0]],"30":[[0.0,0.0,0.0,1.0,1.0,0.5],[0.5,0.0,0.5,1.0,1.0,1.0],[0.0,0.5,0.5,0.5,1.0,1.0]],"31":[[0.0,0.0,0.0,0.5,1.0,0.5],[0.0,0.5,0.5,1.0,1.0,1.0],[0.5,0.5,0.0,1.0,1.0,0.5]],"32":[[0.5,0.0,0.0,1.0,1.0,0.5],[0.0,0.5,0.0,0.5,1.0,1.0],[0.5,0.5,0.5,1.0,1.0,1.0]],"33":[[0.0,0.0,0.0,1.0,0.5,1.0],[0.0,0.5,0.0,1.0,1.0,0.5]],"34":[[0.0,0.0,0.0,1.0,0.5,1.0],[0.0,0.5,0.0,0.5,1.0,1.0],[0.5,0.5,0.0,1.0,1.0,0.5]],"35":[[0.0,0.0,0.0,1.0,0.5,1.0],[0.0,0.5,0.0,1.0,1.0,0.5],[0.5,0.5,0.5,1.0,1.0,1.0]],"36":[[0.0,0.0,0.0,1.0,0.5,1.0],[0.0,0.5,0.0,0.5,1.0,0.5]],"37":[[0.0,0.0,0.0,1.0,0.5,1.0],[0.5,0.5,0.0,1.0,1.0,0.5]],"38":[[0.0,0.0,0.5,1.0,1.0,1.0],[0.0,0.5,0.0,1.0,1.0,0.5]],"39":[[0.0,0.0,0.5,1.0,1.0,1.0],[0.5,0.0,0.0,1.0,1.0,0.5],[0.0,0.5,0.0,0.5,1.0,0.5]],"40":[[0.0,0.0,0.0,0.5,1.0,1.0],[0.5,0.0,0.5,1.0,1.0,1.0],[0.5,0.5,0.0,1.0,1.0,0.5]],"41":[[0.5,0.0,0.5,1.0,1.0,1.0],[0.0,0.5,0.0,0.5,1.0,1.0],[0.5,0.5,0.0,1.0,1.0,0.5]],"42":[[0.0,0.0,0.5,0.5,1.0,1.0],[0.0,0.5,0.0,1.0,1.0,0.5],[0.5,0.5,0.5,1.0,1.0,1.0]],"43":[[0.0,0.0,0.0,1.0,0.5,1.0],[0.0,0.5,0.5,1.0,1.0,1.0]],"44":[[0.0,0.0,0.0,1.0,0.5,1.0],[0.0,0.5,0.5,1.0,1.0,1.0],[0.5,0.5,0.0,1.0,1.0,0.5]],"45":[[0.0,0.0,0.0,1.0,0.5,1.0],[0.0,0.5,0.0,0.5,1.0,1.0],[0.5,0.5,0.5,1.0,1.0,1.0]],"46":[[0.0,0.0,0.0,1.0,0.5,1.0],[0.5,0.5,0.5,1.0,1.0,1.0]],"47":[[0.0,0.0,0.0,1.0,0.5,1.0],[0.0,0.5,0.5,0.5,1.0,1.0]],"48":[[0.0,0.0,0.0,0.5,1.0,1.0],[0.5,0.5,0.0,1.0,1.0,1.0]],"49":[[0.0,0.0,0.0,1.0,0.5,1.0],[0.0,0.5,0.0,0.5,1.0,1.0]],"50":[[0.5,0.0,0.0,1.0,1.0,1.0],[0.0,0.5,0.0,0.5,1.0,1.0]],"51":[[0.0,0.0,0.0,1.0,0.5,1.0],[0.5,0.5,0.0,1.0,1.0,1.0]],"52":[[0.0625,0.0,0.0625,0.9375,0.875,0.9375]],"53":[[0.0625,0.0,0.0625,1.0,0.875,0.9375]],"54":[[0.0,0.0,0.0625,0.9375,0.875,0.9375]],"55":[[0.0625,0.0,0.0,0.9375,0.875,0.9375]],"56":[[0.0625,0.0,0.0625,0.9375,0.875,1.0]],"57":[[0.0,0.0,0.0,1.0,0.9375,1.0]],"58":[[0.0,0.0,0.0,0.1875,1.0,1.0]],"59":[[0.0,0.0,0.8125,1.0,1.0,1.0]],"60":[[0.8125,0.0,0.0,1.0,1.0,1.0]],"61":[[0.0,0.0,0.0,1.0,1.0,0.1875]],"62":[[0.0,0.0,0.8125,1.0,1.0,1.0]],"63":[[0.0,0.0,0.0,1.0,1.0,0.1875]],"64":[[0.8125,0.0,0.0,1.0,1.0,1.0]],"65":[[0.0,0.0,0.0,0.1875,1.0,1.0]],"66":[[0.0,0.875,0.375,1.0,1.0,0.625]],"67":[[0.375,0.875,0.0,0.625,1.0,1.0]],"68":[[0.0,0.0,0.0,1.0,0.125,1.0]],"69":[[0.0,0.0,0.0,1.0,0.25,1.0]],"70":[[0.0,0.0,0.0,1.0,0.375,1.0]],"71":[[0.0,0.0,0.0,1.0,0.5,1.0]],"72":[[0.0,0.0,0.0,1.0,0.625,1.0]],"73":[[0.0,0.0,0.0,1.0,0.75,1.0]],"74":[[0.0,0.0,0.0,1.0,0.875,1.0]],"75":[[0.0625,0.0,0.0625,0.9375,0.9375,0.9375]],"76":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"77":[[0.375,0.0,0.0,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"78":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"79":[[0.375,0.0,0.0,0.625,1.5,0.625],[0.625,0.0,0.375,1.0,1.5,0.625]],"80":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"81":[[0.375,0.0,0.375,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"82":[[0.0,0.0,0.375,1.0,1.5,0.625]],"83":[[0.375,0.0,0.375,1.0,1.5,0.625]],"84":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"85":[[0.375,0.0,0.0,0.625,1.5,1.0]],"86":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"87":[[0.375,0.0,0.0,0.625,1.5,0.625]],"88":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"89":[[0.375,0.0,0.375,0.625,1.5,1.0]],"90":[[0.0,0.0,0.375,0.625,1.5,0.625]],"91":[[0.375,0.0,0.375,0.625,1.5,0.625]],"92":[[0.0,0.0,0.0,1.0,0.875,1.0]],"93":[[0.0625,0.0,0.0625,0.9375,0.5,0.9375]],"94":[[0.1875,0.0,0.0625,0.9375,0.5,0.9375]],"95":[[0.3125,0.0,0.0625,0.9375,0.5,0.9375]],"96":[[0.4375,0.0,0.0625,0.9375,0.5,0.9375]],"97":[[0.5625,0.0,0.0625,0.9375,0.5,0.9375]],"98":[[0.6875,0.0,0.0625,0.9375,0.5,0.9375]],"99":[[0.8125,0.0,0.0625,0.9375,0.5,0.9375]],"100":[[0.0,0.0,0.0,1.0,0.125,1.0]],"101":[[0.0,0.0,0.8125,1.0,1.0,1.0]],"102":[[0.0,0.8125,0.0,1.0,1.0,1.0]],"103":[[0.0,0.0,0.0,1.0,0.1875,1.0]],"104":[[0.0,0.0,0.0,1.0,1.0,0.1875]],"105":[[0.8125,0.0,0.0,1.0,1.0,1.0]],"106":[[0.0,0.0,0.0,0.1875,1.0,1.0]],"107":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"108":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"109":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"110":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"111":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"112":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"113":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"114":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"115":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"116":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"117":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"118":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"119":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"120":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"121":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"122":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"123":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"124":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"125":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"126":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"127":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"128":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"129":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"130":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"131":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"132":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"133":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"134":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"135":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"136":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"137":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"138":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"139":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"140":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"141":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"142":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"143":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"144":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"145":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"146":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"147":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"148":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"149":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"150":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"151":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"152":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"153":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"154":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"155":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"156":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"157":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"158":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"159":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"160":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"161":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"162":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"163":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"164":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"165":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"166":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"167":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"168":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"169":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"170":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"171":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"172":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"173":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"174":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"175":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"176":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"177":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"178":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"179":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"180":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"181":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"182":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"183":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"184":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"185":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"186":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"187":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"188":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"189":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"190":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"191":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"192":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"193":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"194":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"195":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"196":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"197":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"198":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"199":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"200":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"201":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"202":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"203":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"204":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"205":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"206":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"207":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"208":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"209":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"210":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"211":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"212":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"213":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"214":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"215":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"216":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"217":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"218":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"219":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"220":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"221":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"222":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"223":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"224":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"225":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"226":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"227":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"228":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"229":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"230":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"231":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"232":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"233":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"234":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"235":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"236":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"237":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"238":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"239":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"240":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"241":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"242":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"243":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"244":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"245":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"246":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"247":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"248":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"249":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"250":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"251":[[0.0,0.40625,0.40625,1.0,0.59375,0.59375]],"252":[[0.40625,0.0,0.40625,0.59375,1.0,0.59375]],"253":[[0.40625,0.40625,0.0,0.59375,0.59375,1.0]],"254":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"255":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"256":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"257":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"258":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"259":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"260":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"261":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"262":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"263":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"264":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"265":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"266":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"267":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"268":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"269":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"270":[[0.0,0.0,0.375,1.0,1.5,0.625]],"271":[[0.375,0.0,0.0,0.625,1.5,1.0]],"272":[[0.0625,0.0,0.0625,0.9375,0.09375,0.9375]],"273":[[0.0,0.5,0.0,1.0,1.0,1.0]],"274":[[0.0,0.0,0.0,1.0,0.5,1.0]],"275":[[0.25,0.0,0.25,0.75,1.5,0.75]],"276":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"277":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"278":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"279":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"280":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"281":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"282":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"283":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"284":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"285":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"286":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"287":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"288":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"289":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"290":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"291":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"292":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"293":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"294":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"295":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"296":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"297":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"298":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"299":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"300":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"301":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"302":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"303":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"304":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"305":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"306":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"307":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"308":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"309":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"310":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"311":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"312":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"313":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"314":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"315":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"316":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"317":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"318":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"319":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"320":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"321":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"322":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"323":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"324":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"325":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"326":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"327":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"328":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"329":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"330":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"331":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"332":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"333":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"334":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"335":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"336":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"337":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"338":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"339":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"340":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"341":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"342":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"343":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"344":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"345":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"346":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"347":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"348":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"349":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"350":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"351":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"352":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"353":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"354":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"355":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"356":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"357":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"358":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"359":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"360":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"361":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"362":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"363":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"364":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"365":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"366":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"367":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"368":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"369":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"370":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"371":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"372":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"373":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"374":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"375":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"376":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"377":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"378":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"379":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"380":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"381":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"382":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"383":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"384":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"385":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"386":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"387":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"388":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"389":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"390":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"391":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"392":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"393":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"394":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"395":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"396":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"397":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"398":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"399":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"400":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"401":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"402":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"403":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"404":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"405":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"406":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"407":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"408":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"409":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"410":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"411":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"412":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"413":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"414":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"415":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"416":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"417":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"418":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"419":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"420":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"421":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"422":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"423":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"424":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"425":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"426":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"427":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"428":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"429":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"430":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"431":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"432":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"433":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"434":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"435":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"436":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"437":[[0.375,0.0,0.0,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"438":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"439":[[0.375,0.0,0.0,0.625,1.5,0.625],[0.625,0.0,0.375,1.0,1.5,0.625]],"440":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"441":[[0.375,0.0,0.375,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"442":[[0.0,0.0,0.375,1.0,1.5,0.625]],"443":[[0.375,0.0,0.375,1.0,1.5,0.625]],"444":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"445":[[0.375,0.0,0.0,0.625,1.5,1.0]],"446":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"447":[[0.375,0.0,0.0,0.625,1.5,0.625]],"448":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"449":[[0.375,0.0,0.375,0.625,1.5,1.0]],"450":[[0.0,0.0,0.375,0.625,1.5,0.625]],"451":[[0.375,0.0,0.375,0.625,1.5,0.625]],"452":[[0.0,0.0,0.0,1.0,0.75,1.0]],"453":[[0.0625,0.0,0.0625,0.9375,0.125,0.9375],[0.4375,0.125,0.4375,0.5625,0.875,0.5625]],"454":[[0.0,0.0,0.0,0.125,1.0,0.25],[0.0,0.0,0.75,0.125,1.0,1.0],[0.125,0.0,0.0,0.25,1.0,0.125],[0.125,0.0,0.875,0.25,1.0,1.0],[0.75,0.0,0.0,1.0,1.0,0.125],[0.75,0.0,0.875,1.0,1.0,1.0],[0.875,0.0,0.125,1.0,1.0,0.25],[0.875,0.0,0.75,1.0,1.0,0.875],[0.0,0.1875,0.25,1.0,0.25,0.75],[0.125,0.1875,0.125,0.875,0.25,0.25],[0.125,0.1875,0.75,0.875,0.25,0.875],[0.25,0.1875,0.0,0.75,1.0,0.125],[0.25,0.1875,0.875,0.75,1.0,1.0],[0.0,0.25,0.25,0.125,1.0,0.75],[0.875,0.25,0.25,1.0,1.0,0.75]],"455":[[0.0,0.0,0.0,1.0,0.8125,1.0],[0.25,0.8125,0.25,0.75,1.0,0.75]],"456":[[0.0,0.0,0.0,1.0,0.8125,1.0]],"457":[[0.0625,0.0,0.0625,0.9375,1.0,0.9375]],"458":[[0.375,0.4375,0.0625,0.625,0.75,0.3125]],"459":[[0.375,0.4375,0.6875,0.625,0.75,0.9375]],"460":[[0.0625,0.4375,0.375,0.3125,0.75,0.625]],"461":[[0.6875,0.4375,0.375,0.9375,0.75,0.625]],"462":[[0.3125,0.3125,0.0625,0.6875,0.75,0.4375]],"463":[[0.3125,0.3125,0.5625,0.6875,0.75,0.9375]],"464":[[0.0625,0.3125,0.3125,0.4375,0.75,0.6875]],"465":[[0.5625,0.3125,0.3125,0.9375,0.75,0.6875]],"466":[[0.25,0.1875,0.0625,0.75,0.75,0.5625]],"467":[[0.25,0.1875,0.4375,0.75,0.75,0.9375]],"468":[[0.0625,0.1875,0.25,0.5625,0.75,0.75]],"469":[[0.4375,0.1875,0.25,0.9375,0.75,0.75]],"470":[[0.0625,0.0,0.0625,0.9375,0.875,0.9375]],"471":[[0.25,0.0,0.25,0.75,1.5,0.75]],"472":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"473":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"474":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"475":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"476":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"477":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"478":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"479":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"480":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"481":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"482":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"483":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"484":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"485":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"486":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"487":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"488":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"489":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"490":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"491":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"492":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"493":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"494":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"495":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"496":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"497":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"498":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"499":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"500":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"501":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"502":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"503":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"504":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"505":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"506":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"507":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"508":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"509":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"510":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"511":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"512":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"513":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"514":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"515":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"516":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"517":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"518":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"519":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"520":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"521":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"522":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"523":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"524":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"525":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"526":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"527":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"528":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"529":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"530":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"531":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"532":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"533":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"534":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"535":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"536":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"537":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"538":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"539":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"540":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"541":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"542":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"543":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"544":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"545":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"546":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"547":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"548":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"549":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"550":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"551":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"552":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"553":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"554":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"555":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"556":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"557":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"558":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"559":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"560":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"561":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"562":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"563":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"564":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"565":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"566":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"567":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"568":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"569":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"570":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"571":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"572":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"573":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"574":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"575":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"576":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"577":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"578":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"579":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"580":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"581":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"582":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"583":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"584":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"585":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"586":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"587":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"588":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"589":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"590":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"591":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"592":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"593":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"594":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"595":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"596":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"597":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"598":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"599":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"600":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"601":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"602":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"603":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"604":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"605":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"606":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"607":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"608":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"609":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"610":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"611":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"612":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"613":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"614":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"615":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"616":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"617":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"618":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"619":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"620":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"621":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"622":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"623":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"624":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"625":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"626":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"627":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"628":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"629":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"630":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"631":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"632":[[0.25,0.0,0.25,0.75,1.5,0.75]],"633":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"634":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"635":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"636":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"637":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"638":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"639":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"640":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"641":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"642":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"643":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"644":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"645":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"646":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"647":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"648":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"649":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"650":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"651":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"652":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"653":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"654":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"655":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"656":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"657":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"658":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"659":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"660":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"661":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"662":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"663":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"664":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"665":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"666":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"667":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"668":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"669":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"670":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"671":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"672":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"673":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"674":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"675":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"676":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"677":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"678":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"679":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"680":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"681":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"682":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"683":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"684":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"685":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"686":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"687":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"688":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"689":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"690":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"691":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"692":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"693":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"694":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"695":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"696":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"697":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"698":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"699":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"700":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"701":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"702":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"703":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"704":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"705":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"706":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"707":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"708":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"709":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"710":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"711":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"712":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"713":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"714":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"715":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"716":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"717":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"718":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"719":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"720":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"721":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"722":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"723":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"724":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"725":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"726":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"727":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"728":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"729":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"730":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"731":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"732":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"733":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"734":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"735":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"736":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"737":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"738":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"739":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"740":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"741":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"742":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"743":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"744":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"745":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"746":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"747":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"748":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"749":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"750":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"751":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"752":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"753":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"754":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"755":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"756":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"757":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"758":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"759":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"760":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"761":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"762":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"763":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"764":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"765":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"766":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"767":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"768":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"769":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"770":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"771":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"772":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"773":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"774":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"775":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"776":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"777":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"778":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"779":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"780":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"781":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"782":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"783":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"784":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"785":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"786":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"787":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"788":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"789":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"790":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"791":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"792":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"793":[[0.3125,0.0,0.3125,0.6875,0.375,0.6875]],"794":[[0.25,0.0,0.25,0.75,0.5,0.75]],"795":[[0.25,0.25,0.5,0.75,0.75,1.0]],"796":[[0.25,0.25,0.0,0.75,0.75,0.5]],"797":[[0.5,0.25,0.25,1.0,0.75,0.75]],"798":[[0.0,0.25,0.25,0.5,0.75,0.75]],"799":[[0.1875,0.0,0.1875,0.8125,0.5,0.8125]],"800":[[0.1875,0.25,0.5,0.8125,0.75,1.0]],"801":[[0.1875,0.25,0.0,0.8125,0.75,0.5]],"802":[[0.5,0.25,0.1875,1.0,0.75,0.8125]],"803":[[0.0,0.25,0.1875,0.5,0.75,0.8125]],"804":[[0.125,0.0,0.125,0.875,0.25,0.875],[0.25,0.25,0.1875,0.75,0.3125,0.8125],[0.375,0.3125,0.25,0.625,1.0,0.75],[0.1875,0.625,0.0,0.375,1.0,1.0],[0.375,0.625,0.0,0.8125,1.0,0.25],[0.375,0.625,0.75,0.8125,1.0,1.0],[0.625,0.625,0.25,0.8125,1.0,0.75]],"805":[[0.125,0.0,0.125,0.875,0.25,0.875],[0.1875,0.25,0.25,0.8125,0.3125,0.75],[0.25,0.3125,0.375,0.75,1.0,0.625],[0.0,0.625,0.1875,0.25,1.0,0.8125],[0.25,0.625,0.1875,1.0,1.0,0.375],[0.25,0.625,0.625,1.0,1.0,0.8125],[0.75,0.625,0.375,1.0,1.0,0.625]],"806":[[0.0,0.0,0.0,1.0,0.375,1.0]],"807":[[0.375,0.0,0.375,0.625,0.6875,0.625],[0.25,0.25,0.25,0.375,0.6875,0.75],[0.375,0.25,0.25,0.75,0.6875,0.375],[0.375,0.25,0.625,0.75,0.6875,0.75],[0.625,0.25,0.375,0.75,0.6875,0.625],[0.0,0.625,0.0,0.25,0.6875,1.0],[0.25,0.625,0.0,1.0,0.6875,0.25],[0.25,0.625,0.75,1.0,0.6875,1.0],[0.75,0.625,0.25,1.0,0.6875,0.75],[0.0,0.6875,0.0,0.125,1.0,1.0],[0.125,0.6875,0.0,1.0,1.0,0.125],[0.125,0.6875,0.875,1.0,1.0,1.0],[0.875,0.6875,0.125,1.0,1.0,0.875]],"808":[[0.25,0.25,0.25,0.75,0.6875,0.75],[0.375,0.25,0.0,0.625,0.5,0.25],[0.0,0.625,0.0,0.25,0.6875,1.0],[0.25,0.625,0.0,1.0,0.6875,0.25],[0.25,0.625,0.75,1.0,0.6875,1.0],[0.75,0.625,0.25,1.0,0.6875,0.75],[0.0,0.6875,0.0,0.125,1.0,1.0],[0.125,0.6875,0.0,1.0,1.0,0.125],[0.125,0.6875,0.875,1.0,1.0,1.0],[0.875,0.6875,0.125,1.0,1.0,0.875]],"809":[[0.25,0.25,0.25,0.75,0.6875,0.75],[0.375,0.25,0.75,0.625,0.5,1.0],[0.0,0.625,0.0,0.25,0.6875,1.0],[0.25,0.625,0.0,1.0,0.6875,0.25],[0.25,0.625,0.75,1.0,0.6875,1.0],[0.75,0.625,0.25,1.0,0.6875,0.75],[0.0,0.6875,0.0,0.125,1.0,1.0],[0.125,0.6875,0.0,1.0,1.0,0.125],[0.125,0.6875,0.875,1.0,1.0,1.0],[0.875,0.6875,0.125,1.0,1.0,0.875]],"810":[[0.0,0.25,0.375,0.75,0.5,0.625],[0.25,0.25,0.25,0.75,0.6875,0.375],[0.25,0.25,0.625,0.75,0.6875,0.75],[0.25,0.5,0.375,0.75,0.6875,0.625],[0.0,0.625,0.0,0.25,0.6875,1.0],[0.25,0.625,0.0,1.0,0.6875,0.25],[0.25,0.625,0.75,1.0,0.6875,1.0],[0.75,0.625,0.25,1.0,0.6875,0.75],[0.0,0.6875,0.0,0.125,1.0,1.0],[0.125,0.6875,0.0,1.0,1.0,0.125],[0.125,0.6875,0.875,1.0,1.0,1.0],[0.875,0.6875,0.125,1.0,1.0,0.875]],"811":[[0.25,0.25,0.25,0.75,0.6875,0.75],[0.75,0.25,0.375,1.0,0.5,0.625],[0.0,0.625,0.0,0.25,0.6875,1.0],[0.25,0.625,0.0,1.0,0.6875,0.25],[0.25,0.625,0.75,1.0,0.6875,1.0],[0.75,0.625,0.25,1.0,0.6875,0.75],[0.0,0.6875,0.0,0.125,1.0,1.0],[0.125,0.6875,0.0,1.0,1.0,0.125],[0.125,0.6875,0.875,1.0,1.0,1.0],[0.875,0.6875,0.125,1.0,1.0,0.875]],"812":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"813":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"814":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"815":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"816":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"817":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"818":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"819":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"820":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"821":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"822":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"823":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"824":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"825":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"826":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"827":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"828":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"829":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"830":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"831":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"832":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"833":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"834":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"835":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"836":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"837":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"838":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"839":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"840":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"841":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"842":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"843":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"844":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"845":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"846":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"847":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"848":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"849":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"850":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"851":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"852":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"853":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"854":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"855":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"856":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"857":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"858":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"859":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"860":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"861":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"862":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"863":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"864":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"865":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"866":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"867":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"868":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"869":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"870":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"871":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"872":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"873":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"874":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"875":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"876":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"877":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"878":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"879":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"880":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"881":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"882":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"883":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"884":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"885":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"886":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"887":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"888":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"889":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"890":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"891":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"892":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"893":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"894":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"895":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"896":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"897":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"898":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"899":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"900":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"901":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"902":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"903":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"904":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"905":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"906":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"907":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"908":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"909":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"910":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"911":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"912":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"913":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"914":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"915":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"916":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"917":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"918":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"919":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"920":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"921":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"922":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"923":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"924":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"925":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"926":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"927":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"928":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"929":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"930":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"931":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"932":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"933":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"934":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"935":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"936":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"937":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"938":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"939":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"940":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"941":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"942":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"943":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"944":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"945":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"946":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"947":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"948":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"949":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"950":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"951":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"952":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"953":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"954":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"955":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"956":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"957":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"958":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"959":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"960":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"961":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"962":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"963":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"964":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"965":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"966":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"967":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"968":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"969":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"970":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"971":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"972":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"973":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"974":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"975":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"976":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"977":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"978":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"979":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"980":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"981":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"982":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"983":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"984":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"985":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"986":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"987":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"988":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"989":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"990":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"991":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"992":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"993":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"994":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"995":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"996":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"997":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"998":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"999":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"1000":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"1001":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"1002":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"1003":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"1004":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"1005":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"1006":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"1007":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"1008":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"1009":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"1010":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"1011":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"1012":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"1013":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"1014":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"1015":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"1016":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"1017":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"1018":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"1019":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"1020":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"1021":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"1022":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"1023":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"1024":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"1025":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"1026":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"1027":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"1028":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"1029":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"1030":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"1031":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"1032":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"1033":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"1034":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"1035":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"1036":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"1037":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"1038":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"1039":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"1040":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"1041":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"1042":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"1043":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"1044":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"1045":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"1046":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"1047":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"1048":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"1049":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"1050":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"1051":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"1052":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"1053":[[0.4375,0.0,0.0,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"1054":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"1055":[[0.4375,0.0,0.0,0.5625,1.0,0.5625],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"1056":[[0.0,0.0,0.4375,1.0,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"1057":[[0.4375,0.0,0.4375,0.5625,1.0,1.0],[0.5625,0.0,0.4375,1.0,1.0,0.5625]],"1058":[[0.0,0.0,0.4375,1.0,1.0,0.5625]],"1059":[[0.4375,0.0,0.4375,1.0,1.0,0.5625]],"1060":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"1061":[[0.4375,0.0,0.0,0.5625,1.0,1.0]],"1062":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.0,0.5625,1.0,0.4375]],"1063":[[0.4375,0.0,0.0,0.5625,1.0,0.5625]],"1064":[[0.0,0.0,0.4375,0.5625,1.0,0.5625],[0.4375,0.0,0.5625,0.5625,1.0,1.0]],"1065":[[0.4375,0.0,0.4375,0.5625,1.0,1.0]],"1066":[[0.0,0.0,0.4375,0.5625,1.0,0.5625]],"1067":[[0.4375,0.0,0.4375,0.5625,1.0,0.5625]],"1068":[[0.0,0.0,0.0,1.0,0.0625,1.0]],"1069":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"1070":[[0.375,0.0,0.0,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"1071":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"1072":[[0.375,0.0,0.0,0.625,1.5,0.625],[0.625,0.0,0.375,1.0,1.5,0.625]],"1073":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"1074":[[0.375,0.0,0.375,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"1075":[[0.0,0.0,0.375,1.0,1.5,0.625]],"1076":[[0.375,0.0,0.375,1.0,1.5,0.625]],"1077":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"1078":[[0.375,0.0,0.0,0.625,1.5,1.0]],"1079":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"1080":[[0.375,0.0,0.0,0.625,1.5,0.625]],"1081":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"1082":[[0.375,0.0,0.375,0.625,1.5,1.0]],"1083":[[0.0,0.0,0.375,0.625,1.5,0.625]],"1084":[[0.375,0.0,0.375,0.625,1.5,0.625]],"1085":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"1086":[[0.375,0.0,0.0,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"1087":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"1088":[[0.375,0.0,0.0,0.625,1.5,0.625],[0.625,0.0,0.375,1.0,1.5,0.625]],"1089":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"1090":[[0.375,0.0,0.375,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"1091":[[0.0,0.0,0.375,1.0,1.5,0.625]],"1092":[[0.375,0.0,0.375,1.0,1.5,0.625]],"1093":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"1094":[[0.375,0.0,0.0,0.625,1.5,1.0]],"1095":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"1096":[[0.375,0.0,0.0,0.625,1.5,0.625]],"1097":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"1098":[[0.375,0.0,0.375,0.625,1.5,1.0]],"1099":[[0.0,0.0,0.375,0.625,1.5,0.625]],"1100":[[0.375,0.0,0.375,0.625,1.5,0.625]],"1101":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"1102":[[0.375,0.0,0.0,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"1103":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"1104":[[0.375,0.0,0.0,0.625,1.5,0.625],[0.625,0.0,0.375,1.0,1.5,0.625]],"1105":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"1106":[[0.375,0.0,0.375,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"1107":[[0.0,0.0,0.375,1.0,1.5,0.625]],"1108":[[0.375,0.0,0.375,1.0,1.5,0.625]],"1109":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"1110":[[0.375,0.0,0.0,0.625,1.5,1.0]],"1111":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"1112":[[0.375,0.0,0.0,0.625,1.5,0.625]],"1113":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"1114":[[0.375,0.0,0.375,0.625,1.5,1.0]],"1115":[[0.0,0.0,0.375,0.625,1.5,0.625]],"1116":[[0.375,0.0,0.375,0.625,1.5,0.625]],"1117":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"1118":[[0.375,0.0,0.0,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"1119":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"1120":[[0.375,0.0,0.0,0.625,1.5,0.625],[0.625,0.0,0.375,1.0,1.5,0.625]],"1121":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"1122":[[0.375,0.0,0.375,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"1123":[[0.0,0.0,0.375,1.0,1.5,0.625]],"1124":[[0.375,0.0,0.375,1.0,1.5,0.625]],"1125":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"1126":[[0.375,0.0,0.0,0.625,1.5,1.0]],"1127":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"1128":[[0.375,0.0,0.0,0.625,1.5,0.625]],"1129":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"1130":[[0.375,0.0,0.375,0.625,1.5,1.0]],"1131":[[0.0,0.0,0.375,0.625,1.5,0.625]],"1132":[[0.375,0.0,0.375,0.625,1.5,0.625]],"1133":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"1134":[[0.375,0.0,0.0,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"1135":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"1136":[[0.375,0.0,0.0,0.625,1.5,0.625],[0.625,0.0,0.375,1.0,1.5,0.625]],"1137":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"1138":[[0.375,0.0,0.375,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"1139":[[0.0,0.0,0.375,1.0,1.5,0.625]],"1140":[[0.375,0.0,0.375,1.0,1.5,0.625]],"1141":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"1142":[[0.375,0.0,0.0,0.625,1.5,1.0]],"1143":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"1144":[[0.375,0.0,0.0,0.625,1.5,0.625]],"1145":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"1146":[[0.375,0.0,0.375,0.625,1.5,1.0]],"1147":[[0.0,0.0,0.375,0.625,1.5,0.625]],"1148":[[0.375,0.0,0.375,0.625,1.5,0.625]],"1149":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"1150":[[0.375,0.0,0.0,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"1151":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"1152":[[0.375,0.0,0.0,0.625,1.5,0.625],[0.625,0.0,0.375,1.0,1.5,0.625]],"1153":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"1154":[[0.375,0.0,0.375,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"1155":[[0.0,0.0,0.375,1.0,1.5,0.625]],"1156":[[0.375,0.0,0.375,1.0,1.5,0.625]],"1157":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"1158":[[0.375,0.0,0.0,0.625,1.5,1.0]],"1159":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"1160":[[0.375,0.0,0.0,0.625,1.5,0.625]],"1161":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"1162":[[0.375,0.0,0.375,0.625,1.5,1.0]],"1163":[[0.0,0.0,0.375,0.625,1.5,0.625]],"1164":[[0.375,0.0,0.375,0.625,1.5,0.625]],"1165":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"1166":[[0.375,0.0,0.0,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"1167":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"1168":[[0.375,0.0,0.0,0.625,1.5,0.625],[0.625,0.0,0.375,1.0,1.5,0.625]],"1169":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"1170":[[0.375,0.0,0.375,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"1171":[[0.0,0.0,0.375,1.0,1.5,0.625]],"1172":[[0.375,0.0,0.375,1.0,1.5,0.625]],"1173":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"1174":[[0.375,0.0,0.0,0.625,1.5,1.0]],"1175":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"1176":[[0.375,0.0,0.0,0.625,1.5,0.625]],"1177":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"1178":[[0.375,0.0,0.375,0.625,1.5,1.0]],"1179":[[0.0,0.0,0.375,0.625,1.5,0.625]],"1180":[[0.375,0.0,0.375,0.625,1.5,0.625]],"1181":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"1182":[[0.375,0.0,0.0,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"1183":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"1184":[[0.375,0.0,0.0,0.625,1.5,0.625],[0.625,0.0,0.375,1.0,1.5,0.625]],"1185":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"1186":[[0.375,0.0,0.375,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"1187":[[0.0,0.0,0.375,1.0,1.5,0.625]],"1188":[[0.375,0.0,0.375,1.0,1.5,0.625]],"1189":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"1190":[[0.375,0.0,0.0,0.625,1.5,1.0]],"1191":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"1192":[[0.375,0.0,0.0,0.625,1.5,0.625]],"1193":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"1194":[[0.375,0.0,0.375,0.625,1.5,1.0]],"1195":[[0.0,0.0,0.375,0.625,1.5,0.625]],"1196":[[0.375,0.0,0.375,0.625,1.5,0.625]],"1197":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"1198":[[0.375,0.0,0.0,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"1199":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"1200":[[0.375,0.0,0.0,0.625,1.5,0.625],[0.625,0.0,0.375,1.0,1.5,0.625]],"1201":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"1202":[[0.375,0.0,0.375,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"1203":[[0.0,0.0,0.375,1.0,1.5,0.625]],"1204":[[0.375,0.0,0.375,1.0,1.5,0.625]],"1205":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"1206":[[0.375,0.0,0.0,0.625,1.5,1.0]],"1207":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"1208":[[0.375,0.0,0.0,0.625,1.5,0.625]],"1209":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"1210":[[0.375,0.0,0.375,0.625,1.5,1.0]],"1211":[[0.0,0.0,0.375,0.625,1.5,0.625]],"1212":[[0.375,0.0,0.375,0.625,1.5,0.625]],"1213":[[0.375,0.375,0.0,0.625,0.625,1.0]],"1214":[[0.0,0.375,0.375,1.0,0.625,0.625]],"1215":[[0.375,0.0,0.375,0.625,1.0,0.625]],"1216":[[0.1875,0.0,0.1875,0.8125,1.0,0.8125],[0.0,0.1875,0.1875,0.1875,0.8125,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0],[0.8125,0.1875,0.1875,1.0,0.8125,0.8125]],"1217":[[0.1875,0.0,0.1875,0.8125,1.0,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0],[0.8125,0.1875,0.1875,1.0,0.8125,0.8125]],"1218":[[0.1875,0.0,0.1875,0.8125,0.8125,0.8125],[0.0,0.1875,0.1875,0.1875,0.8125,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0],[0.8125,0.1875,0.1875,1.0,0.8125,0.8125]],"1219":[[0.1875,0.0,0.1875,0.8125,0.8125,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0],[0.8125,0.1875,0.1875,1.0,0.8125,0.8125]],"1220":[[0.1875,0.0,0.1875,0.8125,1.0,0.8125],[0.0,0.1875,0.1875,0.1875,0.8125,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875],[0.8125,0.1875,0.1875,1.0,0.8125,0.8125]],"1221":[[0.1875,0.0,0.1875,0.8125,1.0,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875],[0.8125,0.1875,0.1875,1.0,0.8125,0.8125]],"1222":[[0.1875,0.0,0.1875,0.8125,0.8125,0.8125],[0.0,0.1875,0.1875,0.1875,0.8125,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875],[0.8125,0.1875,0.1875,1.0,0.8125,0.8125]],"1223":[[0.1875,0.0,0.1875,0.8125,0.8125,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875],[0.8125,0.1875,0.1875,1.0,0.8125,0.8125]],"1224":[[0.1875,0.0,0.1875,0.8125,1.0,0.8125],[0.0,0.1875,0.1875,0.1875,0.8125,0.8125],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0],[0.8125,0.1875,0.1875,1.0,0.8125,0.8125]],"1225":[[0.1875,0.0,0.1875,0.8125,1.0,0.8125],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0],[0.8125,0.1875,0.1875,1.0,0.8125,0.8125]],"1226":[[0.1875,0.0,0.1875,0.8125,0.8125,0.8125],[0.0,0.1875,0.1875,0.1875,0.8125,0.8125],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0],[0.8125,0.1875,0.1875,1.0,0.8125,0.8125]],"1227":[[0.1875,0.0,0.1875,0.8125,0.8125,0.8125],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0],[0.8125,0.1875,0.1875,1.0,0.8125,0.8125]],"1228":[[0.1875,0.0,0.1875,0.8125,1.0,0.8125],[0.0,0.1875,0.1875,0.1875,0.8125,0.8125],[0.8125,0.1875,0.1875,1.0,0.8125,0.8125]],"1229":[[0.1875,0.0,0.1875,0.8125,1.0,0.8125],[0.8125,0.1875,0.1875,1.0,0.8125,0.8125]],"1230":[[0.1875,0.0,0.1875,0.8125,0.8125,0.8125],[0.0,0.1875,0.1875,0.1875,0.8125,0.8125],[0.8125,0.1875,0.1875,1.0,0.8125,0.8125]],"1231":[[0.1875,0.0,0.1875,0.8125,0.8125,0.8125],[0.8125,0.1875,0.1875,1.0,0.8125,0.8125]],"1232":[[0.1875,0.0,0.1875,0.8125,1.0,0.8125],[0.0,0.1875,0.1875,0.1875,0.8125,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0]],"1233":[[0.1875,0.0,0.1875,0.8125,1.0,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0]],"1234":[[0.1875,0.0,0.1875,0.8125,0.8125,0.8125],[0.0,0.1875,0.1875,0.1875,0.8125,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0]],"1235":[[0.1875,0.0,0.1875,0.8125,0.8125,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0]],"1236":[[0.1875,0.0,0.1875,0.8125,1.0,0.8125],[0.0,0.1875,0.1875,0.1875,0.8125,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875]],"1237":[[0.1875,0.0,0.1875,0.8125,1.0,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875]],"1238":[[0.1875,0.0,0.1875,0.8125,0.8125,0.8125],[0.0,0.1875,0.1875,0.1875,0.8125,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875]],"1239":[[0.1875,0.0,0.1875,0.8125,0.8125,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875]],"1240":[[0.1875,0.0,0.1875,0.8125,1.0,0.8125],[0.0,0.1875,0.1875,0.1875,0.8125,0.8125],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0]],"1241":[[0.1875,0.0,0.1875,0.8125,1.0,0.8125],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0]],"1242":[[0.1875,0.0,0.1875,0.8125,0.8125,0.8125],[0.0,0.1875,0.1875,0.1875,0.8125,0.8125],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0]],"1243":[[0.1875,0.0,0.1875,0.8125,0.8125,0.8125],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0]],"1244":[[0.1875,0.0,0.1875,0.8125,1.0,0.8125],[0.0,0.1875,0.1875,0.1875,0.8125,0.8125]],"1245":[[0.1875,0.0,0.1875,0.8125,1.0,0.8125]],"1246":[[0.1875,0.0,0.1875,0.8125,0.8125,0.8125],[0.0,0.1875,0.1875,0.1875,0.8125,0.8125]],"1247":[[0.1875,0.0,0.1875,0.8125,0.8125,0.8125]],"1248":[[0.0,0.1875,0.1875,1.0,0.8125,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0],[0.1875,0.8125,0.1875,0.8125,1.0,0.8125]],"1249":[[0.1875,0.1875,0.0,0.8125,0.8125,1.0],[0.8125,0.1875,0.1875,1.0,0.8125,0.8125],[0.1875,0.8125,0.1875,0.8125,1.0,0.8125]],"1250":[[0.0,0.1875,0.1875,1.0,0.8125,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0]],"1251":[[0.1875,0.1875,0.0,0.8125,0.8125,1.0],[0.8125,0.1875,0.1875,1.0,0.8125,0.8125]],"1252":[[0.0,0.1875,0.1875,1.0,0.8125,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875],[0.1875,0.8125,0.1875,0.8125,1.0,0.8125]],"1253":[[0.1875,0.1875,0.0,0.8125,0.8125,0.8125],[0.8125,0.1875,0.1875,1.0,0.8125,0.8125],[0.1875,0.8125,0.1875,0.8125,1.0,0.8125]],"1254":[[0.0,0.1875,0.1875,1.0,0.8125,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875]],"1255":[[0.1875,0.1875,0.0,0.8125,0.8125,0.8125],[0.8125,0.1875,0.1875,1.0,0.8125,0.8125]],"1256":[[0.0,0.1875,0.1875,1.0,0.8125,0.8125],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0],[0.1875,0.8125,0.1875,0.8125,1.0,0.8125]],"1257":[[0.1875,0.1875,0.1875,0.8125,0.8125,1.0],[0.8125,0.1875,0.1875,1.0,0.8125,0.8125],[0.1875,0.8125,0.1875,0.8125,1.0,0.8125]],"1258":[[0.0,0.1875,0.1875,1.0,0.8125,0.8125],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0]],"1259":[[0.1875,0.1875,0.1875,0.8125,0.8125,1.0],[0.8125,0.1875,0.1875,1.0,0.8125,0.8125]],"1260":[[0.0,0.1875,0.1875,1.0,0.8125,0.8125],[0.1875,0.8125,0.1875,0.8125,1.0,0.8125]],"1261":[[0.1875,0.1875,0.1875,1.0,0.8125,0.8125],[0.1875,0.8125,0.1875,0.8125,1.0,0.8125]],"1262":[[0.0,0.1875,0.1875,1.0,0.8125,0.8125]],"1263":[[0.1875,0.1875,0.1875,1.0,0.8125,0.8125]],"1264":[[0.0,0.1875,0.1875,0.8125,0.8125,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0],[0.1875,0.8125,0.1875,0.8125,1.0,0.8125]],"1265":[[0.1875,0.1875,0.0,0.8125,0.8125,1.0],[0.1875,0.8125,0.1875,0.8125,1.0,0.8125]],"1266":[[0.0,0.1875,0.1875,0.8125,0.8125,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0]],"1267":[[0.1875,0.1875,0.0,0.8125,0.8125,1.0]],"1268":[[0.0,0.1875,0.1875,0.8125,0.8125,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875],[0.1875,0.8125,0.1875,0.8125,1.0,0.8125]],"1269":[[0.1875,0.1875,0.0,0.8125,0.8125,0.8125],[0.1875,0.8125,0.1875,0.8125,1.0,0.8125]],"1270":[[0.0,0.1875,0.1875,0.8125,0.8125,0.8125],[0.1875,0.1875,0.0,0.8125,0.8125,0.1875]],"1271":[[0.1875,0.1875,0.0,0.8125,0.8125,0.8125]],"1272":[[0.0,0.1875,0.1875,0.8125,0.8125,0.8125],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0],[0.1875,0.8125,0.1875,0.8125,1.0,0.8125]],"1273":[[0.1875,0.1875,0.1875,0.8125,0.8125,1.0],[0.1875,0.8125,0.1875,0.8125,1.0,0.8125]],"1274":[[0.0,0.1875,0.1875,0.8125,0.8125,0.8125],[0.1875,0.1875,0.8125,0.8125,0.8125,1.0]],"1275":[[0.1875,0.1875,0.1875,0.8125,0.8125,1.0]],"1276":[[0.0,0.1875,0.1875,0.8125,0.8125,0.8125],[0.1875,0.8125,0.1875,0.8125,1.0,0.8125]],"1277":[[0.1875,0.1875,0.1875,0.8125,1.0,0.8125]],"1278":[[0.0,0.1875,0.1875,0.8125,0.8125,0.8125]],"1279":[[0.1875,0.1875,0.1875,0.8125,0.8125,0.8125]],"1280":[[0.3125,-0.0625,0.3125,0.6875,0.1875,0.6875]],"1281":[[0.1875,-0.0625,0.1875,0.8125,0.3125,0.8125]],"1282":[[0.0,0.0,0.0,1.0,0.9375,1.0]],"1283":[[0.1875,0.0,0.1875,0.75,0.4375,0.75]],"1284":[[0.0625,0.0,0.0625,0.9375,0.4375,0.9375]],"1285":[[0.0625,0.0,0.125,0.9375,1.0,0.875]],"1286":[[0.1875,0.0,0.1875,0.8125,0.625,0.8125]],"1287":[[0.375,0.0,0.375,0.625,0.375,0.625]],"1288":[[0.1875,0.0,0.1875,0.8125,0.375,0.8125]],"1289":[[0.125,0.0,0.125,0.875,0.375,0.875]],"1290":[[0.125,0.0,0.125,0.875,0.4375,0.875]],"1291":[[0.3125,0.3125,0.3125,0.6875,0.6875,0.6875]],"1292":[[0.15625,0.0,0.15625,0.34375,1.0,0.34375]],"1293":[[0.15625,0.0,0.15625,0.34375,1.0,0.34375]],"1294":[[0.15625,0.0,0.15625,0.34375,1.0,0.34375]],"1295":[[0.15625,0.0,0.15625,0.34375,1.0,0.34375]],"1296":[[0.15625,0.0,0.15625,0.34375,1.0,0.34375]],"1297":[[0.15625,0.0,0.15625,0.34375,1.0,0.34375]],"1298":[[0.15625,0.0,0.15625,0.34375,1.0,0.34375]],"1299":[[0.15625,0.0,0.15625,0.34375,1.0,0.34375]],"1300":[[0.15625,0.0,0.15625,0.34375,1.0,0.34375]],"1301":[[0.15625,0.0,0.15625,0.34375,1.0,0.34375]],"1302":[[0.15625,0.0,0.15625,0.34375,1.0,0.34375]],"1303":[[0.15625,0.0,0.15625,0.34375,1.0,0.34375]],"1304":[[0.25,0.0,0.25,0.75,1.5,0.75]],"1305":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1306":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1307":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"1308":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"1309":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1310":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1311":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1312":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"1313":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1314":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1315":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1316":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1317":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1318":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"1319":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1320":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1321":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1322":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1323":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1324":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"1325":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1326":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1327":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1328":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1329":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1330":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"1331":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1332":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1333":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1334":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1335":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1336":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"1337":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1338":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1339":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1340":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1341":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1342":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"1343":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1344":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1345":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1346":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1347":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1348":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"1349":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1350":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1351":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1352":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1353":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1354":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"1355":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1356":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1357":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1358":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1359":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1360":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"1361":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"1362":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"1363":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1364":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1365":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1366":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1367":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1368":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1369":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1370":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1371":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1372":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1373":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1374":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1375":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1376":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1377":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1378":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1379":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1380":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1381":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1382":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1383":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1384":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1385":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1386":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1387":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1388":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1389":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1390":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1391":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1392":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1393":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1394":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1395":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1396":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1397":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1398":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1399":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1400":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1401":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1402":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1403":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1404":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1405":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1406":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1407":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1408":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1409":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1410":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1411":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1412":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1413":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1414":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"1415":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"1416":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"1417":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1418":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1419":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1420":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1421":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1422":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1423":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1424":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1425":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1426":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1427":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1428":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1429":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1430":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1431":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1432":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1433":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1434":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1435":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1436":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1437":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1438":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1439":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1440":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1441":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1442":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1443":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1444":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1445":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1446":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1447":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1448":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1449":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1450":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1451":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1452":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1453":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1454":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1455":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1456":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1457":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1458":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1459":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1460":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1461":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1462":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1463":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1464":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1465":[[0.25,0.0,0.25,0.75,1.5,0.75]],"1466":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1467":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1468":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"1469":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"1470":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1471":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1472":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1473":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"1474":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1475":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1476":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1477":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1478":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1479":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"1480":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1481":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1482":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1483":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1484":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1485":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"1486":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1487":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1488":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1489":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1490":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1491":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"1492":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1493":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1494":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1495":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1496":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1497":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"1498":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1499":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1500":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1501":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1502":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1503":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"1504":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1505":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1506":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1507":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1508":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1509":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"1510":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1511":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1512":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1513":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1514":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1515":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"1516":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1517":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1518":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1519":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1520":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1521":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"1522":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"1523":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"1524":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1525":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1526":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1527":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1528":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1529":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1530":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1531":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1532":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1533":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1534":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1535":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1536":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1537":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1538":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1539":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1540":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1541":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1542":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1543":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1544":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1545":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1546":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1547":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1548":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1549":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1550":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1551":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1552":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1553":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1554":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1555":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1556":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1557":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1558":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1559":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1560":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1561":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1562":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1563":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1564":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1565":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1566":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1567":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1568":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1569":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1570":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1571":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1572":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1573":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1574":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1575":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"1576":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"1577":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"1578":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1579":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1580":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1581":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1582":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1583":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1584":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1585":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1586":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1587":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1588":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1589":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1590":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1591":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1592":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1593":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1594":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1595":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1596":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1597":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1598":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1599":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1600":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1601":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1602":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1603":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1604":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1605":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1606":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1607":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1608":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1609":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1610":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1611":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1612":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1613":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1614":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1615":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1616":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1617":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1618":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1619":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1620":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1621":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1622":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1623":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1624":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1625":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1626":[[0.25,0.0,0.25,0.75,1.5,0.75]],"1627":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1628":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1629":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"1630":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"1631":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1632":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1633":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1634":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"1635":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1636":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1637":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1638":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1639":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1640":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"1641":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1642":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1643":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1644":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1645":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1646":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"1647":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1648":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1649":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1650":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1651":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1652":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"1653":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1654":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1655":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1656":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1657":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1658":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"1659":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1660":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1661":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1662":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1663":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1664":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"1665":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1666":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1667":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1668":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1669":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1670":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"1671":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1672":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1673":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1674":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1675":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1676":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"1677":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1678":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1679":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1680":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1681":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1682":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"1683":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"1684":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"1685":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1686":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1687":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1688":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1689":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1690":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1691":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1692":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1693":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1694":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1695":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1696":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1697":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1698":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1699":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1700":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1701":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1702":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1703":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1704":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1705":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1706":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1707":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1708":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1709":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1710":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1711":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1712":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1713":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1714":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1715":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1716":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1717":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1718":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1719":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1720":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1721":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1722":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1723":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1724":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1725":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1726":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1727":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1728":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1729":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1730":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1731":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1732":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1733":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1734":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1735":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1736":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"1737":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"1738":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"1739":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1740":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1741":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1742":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1743":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1744":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1745":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1746":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1747":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1748":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1749":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1750":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1751":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1752":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1753":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1754":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1755":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1756":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1757":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1758":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1759":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1760":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1761":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1762":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1763":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1764":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1765":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1766":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1767":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1768":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1769":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1770":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1771":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1772":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1773":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1774":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1775":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1776":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1777":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1778":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1779":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1780":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1781":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1782":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1783":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1784":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1785":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1786":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1787":[[0.25,0.0,0.25,0.75,1.5,0.75]],"1788":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1789":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1790":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"1791":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"1792":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1793":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1794":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1795":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"1796":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1797":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1798":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1799":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1800":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1801":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"1802":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1803":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1804":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1805":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1806":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1807":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"1808":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1809":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1810":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1811":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1812":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1813":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"1814":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1815":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1816":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1817":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1818":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1819":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"1820":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1821":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1822":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1823":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1824":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1825":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"1826":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1827":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1828":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1829":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1830":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1831":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"1832":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1833":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1834":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1835":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1836":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1837":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"1838":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1839":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1840":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1841":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1842":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1843":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"1844":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"1845":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"1846":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1847":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1848":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1849":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1850":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1851":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1852":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1853":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1854":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1855":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1856":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1857":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1858":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1859":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1860":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1861":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1862":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1863":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1864":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1865":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1866":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1867":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1868":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1869":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1870":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1871":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1872":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1873":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1874":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1875":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1876":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1877":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1878":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1879":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1880":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1881":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1882":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1883":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1884":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1885":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1886":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1887":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1888":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1889":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1890":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1891":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1892":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1893":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1894":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1895":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1896":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1897":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"1898":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"1899":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"1900":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1901":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1902":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1903":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1904":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1905":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1906":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1907":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1908":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1909":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1910":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1911":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1912":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1913":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1914":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1915":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1916":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1917":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1918":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1919":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1920":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1921":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1922":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1923":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1924":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1925":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1926":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1927":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1928":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1929":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1930":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1931":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1932":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1933":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1934":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1935":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1936":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1937":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1938":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1939":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1940":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1941":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1942":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"1943":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1944":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1945":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"1946":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1947":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1948":[[0.25,0.0,0.25,0.75,1.5,0.75]],"1949":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1950":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"1951":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"1952":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"1953":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1954":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1955":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1956":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"1957":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1958":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1959":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1960":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1961":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1962":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"1963":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1964":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1965":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1966":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1967":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1968":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"1969":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1970":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1971":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1972":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1973":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1974":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"1975":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1976":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1977":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1978":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1979":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1980":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"1981":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1982":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1983":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1984":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1985":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"1986":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"1987":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1988":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"1989":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1990":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1991":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1992":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"1993":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1994":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"1995":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1996":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1997":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"1998":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"1999":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2000":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2001":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2002":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2003":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2004":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"2005":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2006":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2007":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2008":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2009":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2010":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2011":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2012":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2013":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2014":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2015":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2016":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2017":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2018":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2019":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2020":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2021":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2022":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2023":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2024":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2025":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2026":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2027":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2028":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2029":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2030":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2031":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2032":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2033":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2034":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2035":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2036":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2037":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2038":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2039":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2040":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2041":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2042":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2043":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2044":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2045":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2046":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2047":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2048":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2049":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2050":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2051":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2052":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2053":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2054":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2055":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2056":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2057":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2058":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"2059":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2060":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2061":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2062":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2063":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2064":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2065":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2066":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2067":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2068":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2069":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2070":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2071":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2072":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2073":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2074":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2075":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2076":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2077":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2078":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2079":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2080":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2081":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2082":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2083":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2084":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2085":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2086":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2087":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2088":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2089":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2090":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2091":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2092":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2093":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2094":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2095":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2096":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2097":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2098":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2099":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2100":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2101":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2102":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2103":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2104":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2105":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2106":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2107":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2108":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2109":[[0.25,0.0,0.25,0.75,1.5,0.75]],"2110":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2111":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2112":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"2113":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"2114":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2115":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2116":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2117":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"2118":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2119":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2120":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2121":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2122":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2123":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"2124":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2125":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2126":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2127":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2128":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2129":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"2130":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2131":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2132":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2133":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2134":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2135":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2136":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2137":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2138":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2139":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2140":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2141":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2142":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2143":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2144":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2145":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2146":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2147":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"2148":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2149":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2150":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2151":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2152":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2153":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2154":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2155":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2156":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2157":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2158":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2159":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2160":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2161":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2162":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2163":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2164":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2165":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"2166":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2167":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2168":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2169":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2170":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2171":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2172":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2173":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2174":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2175":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2176":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2177":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2178":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2179":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2180":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2181":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2182":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2183":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2184":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2185":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2186":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2187":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2188":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2189":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2190":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2191":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2192":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2193":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2194":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2195":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2196":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2197":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2198":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2199":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2200":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2201":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2202":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2203":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2204":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2205":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2206":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2207":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2208":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2209":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2210":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2211":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2212":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2213":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2214":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2215":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2216":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2217":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2218":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2219":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"2220":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2221":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2222":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2223":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2224":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2225":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2226":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2227":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2228":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2229":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2230":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2231":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2232":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2233":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2234":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2235":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2236":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2237":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2238":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2239":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2240":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2241":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2242":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2243":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2244":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2245":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2246":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2247":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2248":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2249":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2250":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2251":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2252":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2253":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2254":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2255":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2256":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2257":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2258":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2259":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2260":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2261":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2262":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2263":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2264":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2265":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2266":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2267":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2268":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2269":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2270":[[0.25,0.0,0.25,0.75,1.5,0.75]],"2271":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2272":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2273":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"2274":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"2275":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2276":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2277":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2278":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"2279":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2280":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2281":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2282":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2283":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2284":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"2285":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2286":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2287":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2288":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2289":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2290":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"2291":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2292":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2293":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2294":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2295":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2296":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2297":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2298":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2299":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2300":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2301":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2302":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2303":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2304":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2305":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2306":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2307":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2308":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"2309":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2310":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2311":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2312":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2313":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2314":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2315":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2316":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2317":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2318":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2319":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2320":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2321":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2322":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2323":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2324":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2325":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2326":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"2327":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2328":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2329":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2330":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2331":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2332":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2333":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2334":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2335":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2336":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2337":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2338":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2339":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2340":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2341":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2342":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2343":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2344":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2345":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2346":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2347":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2348":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2349":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2350":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2351":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2352":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2353":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2354":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2355":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2356":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2357":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2358":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2359":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2360":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2361":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2362":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2363":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2364":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2365":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2366":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2367":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2368":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2369":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2370":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2371":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2372":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2373":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2374":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2375":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2376":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2377":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2378":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2379":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2380":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"2381":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2382":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2383":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2384":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2385":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2386":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2387":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2388":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2389":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2390":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2391":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2392":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2393":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2394":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2395":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2396":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2397":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2398":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2399":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2400":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2401":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2402":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2403":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2404":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2405":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2406":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2407":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2408":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2409":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2410":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2411":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2412":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2413":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2414":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2415":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2416":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2417":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2418":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2419":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2420":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2421":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2422":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2423":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2424":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2425":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2426":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2427":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2428":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2429":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2430":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2431":[[0.25,0.0,0.25,0.75,1.5,0.75]],"2432":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2433":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2434":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"2435":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"2436":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2437":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2438":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2439":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"2440":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2441":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2442":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2443":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2444":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2445":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"2446":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2447":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2448":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2449":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2450":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2451":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"2452":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2453":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2454":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2455":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2456":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2457":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2458":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2459":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2460":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2461":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2462":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2463":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2464":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2465":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2466":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2467":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2468":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2469":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"2470":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2471":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2472":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2473":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2474":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2475":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2476":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2477":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2478":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2479":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2480":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2481":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2482":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2483":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2484":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2485":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2486":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2487":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"2488":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2489":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2490":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2491":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2492":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2493":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2494":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2495":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2496":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2497":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2498":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2499":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2500":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2501":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2502":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2503":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2504":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2505":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2506":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2507":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2508":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2509":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2510":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2511":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2512":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2513":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2514":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2515":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2516":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2517":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2518":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2519":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2520":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2521":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2522":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2523":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2524":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2525":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2526":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2527":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2528":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2529":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2530":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2531":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2532":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2533":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2534":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2535":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2536":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2537":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2538":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2539":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2540":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2541":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"2542":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2543":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2544":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2545":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2546":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2547":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2548":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2549":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2550":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2551":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2552":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2553":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2554":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2555":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2556":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2557":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2558":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2559":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2560":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2561":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2562":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2563":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2564":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2565":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2566":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2567":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2568":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2569":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2570":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2571":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2572":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2573":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2574":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2575":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2576":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2577":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2578":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2579":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2580":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2581":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2582":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2583":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2584":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2585":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2586":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2587":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2588":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2589":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2590":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2591":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2592":[[0.25,0.0,0.25,0.75,1.5,0.75]],"2593":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2594":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2595":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"2596":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"2597":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2598":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2599":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2600":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"2601":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2602":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2603":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2604":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2605":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2606":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"2607":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2608":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2609":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2610":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2611":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2612":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"2613":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2614":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2615":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2616":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2617":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2618":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2619":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2620":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2621":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2622":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2623":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2624":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2625":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2626":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2627":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2628":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2629":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2630":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"2631":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2632":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2633":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2634":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2635":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2636":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2637":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2638":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2639":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2640":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2641":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2642":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2643":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2644":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2645":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2646":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2647":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2648":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"2649":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2650":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2651":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2652":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2653":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2654":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2655":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2656":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2657":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2658":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2659":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2660":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2661":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2662":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2663":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2664":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2665":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2666":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2667":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2668":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2669":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2670":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2671":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2672":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2673":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2674":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2675":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2676":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2677":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2678":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2679":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2680":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2681":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2682":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2683":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2684":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2685":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2686":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2687":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2688":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2689":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2690":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2691":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2692":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2693":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2694":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2695":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2696":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2697":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2698":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2699":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2700":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2701":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2702":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"2703":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2704":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2705":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2706":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2707":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2708":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2709":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2710":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2711":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2712":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2713":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2714":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2715":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2716":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2717":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2718":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2719":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2720":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2721":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2722":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2723":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2724":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2725":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2726":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2727":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2728":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2729":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2730":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2731":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2732":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2733":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2734":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2735":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2736":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2737":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2738":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2739":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2740":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2741":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2742":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2743":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2744":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2745":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2746":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2747":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2748":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2749":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2750":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2751":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2752":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2753":[[0.25,0.0,0.25,0.75,1.5,0.75]],"2754":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2755":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2756":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"2757":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"2758":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2759":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2760":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2761":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"2762":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2763":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2764":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2765":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2766":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2767":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"2768":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2769":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2770":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2771":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2772":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2773":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"2774":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2775":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2776":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2777":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2778":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2779":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2780":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2781":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2782":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2783":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2784":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2785":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2786":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2787":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2788":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2789":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2790":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2791":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"2792":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2793":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2794":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2795":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2796":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2797":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2798":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2799":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2800":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2801":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2802":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2803":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2804":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2805":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2806":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2807":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2808":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2809":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"2810":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2811":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2812":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2813":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2814":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2815":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2816":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2817":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2818":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2819":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2820":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2821":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2822":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2823":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2824":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2825":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2826":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2827":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2828":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2829":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2830":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2831":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2832":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2833":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2834":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2835":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2836":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2837":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2838":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2839":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2840":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2841":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2842":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2843":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2844":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2845":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2846":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2847":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2848":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2849":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2850":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2851":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2852":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2853":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2854":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2855":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2856":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2857":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2858":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2859":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2860":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2861":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2862":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2863":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"2864":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2865":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2866":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2867":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2868":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2869":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2870":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2871":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2872":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2873":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2874":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2875":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2876":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2877":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2878":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2879":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2880":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2881":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2882":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2883":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2884":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2885":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2886":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2887":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2888":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2889":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2890":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2891":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2892":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2893":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2894":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2895":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2896":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2897":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2898":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2899":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2900":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2901":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2902":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2903":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2904":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2905":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2906":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2907":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2908":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2909":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2910":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2911":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2912":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2913":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2914":[[0.25,0.0,0.25,0.75,1.5,0.75]],"2915":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2916":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2917":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"2918":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"2919":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2920":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2921":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2922":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"2923":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2924":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2925":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2926":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2927":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2928":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"2929":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2930":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2931":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2932":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2933":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2934":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"2935":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2936":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2937":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2938":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2939":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2940":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2941":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2942":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2943":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2944":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2945":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2946":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2947":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2948":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2949":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2950":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2951":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2952":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"2953":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2954":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2955":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2956":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2957":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2958":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2959":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2960":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2961":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2962":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2963":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2964":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"2965":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2966":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2967":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2968":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2969":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"2970":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"2971":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2972":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"2973":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2974":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2975":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2976":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2977":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2978":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2979":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2980":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2981":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2982":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2983":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2984":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2985":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2986":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2987":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"2988":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2989":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2990":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"2991":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2992":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2993":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2994":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"2995":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2996":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"2997":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"2998":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"2999":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3000":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3001":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3002":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3003":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3004":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3005":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3006":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3007":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3008":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3009":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3010":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3011":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3012":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3013":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3014":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3015":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3016":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3017":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3018":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3019":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3020":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3021":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3022":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3023":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3024":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"3025":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"3026":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"3027":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3028":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3029":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3030":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3031":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3032":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3033":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3034":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3035":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3036":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3037":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3038":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3039":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3040":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3041":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3042":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3043":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3044":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3045":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3046":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3047":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3048":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3049":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3050":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3051":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3052":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3053":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3054":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3055":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3056":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3057":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3058":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3059":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3060":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3061":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3062":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3063":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3064":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3065":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3066":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3067":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3068":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3069":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3070":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3071":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3072":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3073":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3074":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3075":[[0.25,0.0,0.25,0.75,1.5,0.75]],"3076":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3077":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3078":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"3079":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"3080":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3081":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3082":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3083":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"3084":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3085":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3086":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3087":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3088":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3089":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"3090":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3091":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3092":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3093":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3094":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3095":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"3096":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3097":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3098":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3099":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3100":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3101":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"3102":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3103":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3104":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3105":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3106":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3107":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"3108":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3109":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3110":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3111":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3112":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3113":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"3114":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3115":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3116":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3117":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3118":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3119":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"3120":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3121":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3122":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3123":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3124":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3125":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"3126":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3127":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3128":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3129":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3130":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3131":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"3132":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"3133":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"3134":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3135":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3136":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3137":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3138":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3139":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3140":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3141":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3142":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3143":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3144":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3145":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3146":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3147":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3148":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3149":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3150":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3151":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3152":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3153":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3154":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3155":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3156":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3157":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3158":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3159":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3160":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3161":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3162":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3163":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3164":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3165":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3166":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3167":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3168":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3169":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3170":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3171":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3172":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3173":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3174":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3175":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3176":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3177":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3178":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3179":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3180":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3181":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3182":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3183":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3184":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3185":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"3186":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"3187":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"3188":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3189":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3190":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3191":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3192":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3193":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3194":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3195":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3196":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3197":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3198":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3199":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3200":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3201":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3202":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3203":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3204":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3205":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3206":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3207":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3208":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3209":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3210":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3211":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3212":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3213":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3214":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3215":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3216":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3217":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3218":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3219":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3220":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3221":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3222":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3223":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3224":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3225":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3226":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3227":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3228":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3229":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3230":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3231":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3232":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3233":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3234":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3235":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3236":[[0.25,0.0,0.25,0.75,1.5,0.75]],"3237":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3238":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3239":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"3240":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"3241":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3242":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3243":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3244":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"3245":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3246":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3247":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3248":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3249":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3250":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"3251":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3252":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3253":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3254":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3255":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3256":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"3257":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3258":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3259":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3260":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3261":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3262":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"3263":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3264":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3265":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3266":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3267":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3268":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"3269":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3270":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3271":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3272":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3273":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3274":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"3275":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3276":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3277":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3278":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3279":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3280":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"3281":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3282":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3283":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3284":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3285":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3286":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"3287":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3288":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3289":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3290":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3291":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3292":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"3293":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"3294":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"3295":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3296":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3297":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3298":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3299":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3300":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3301":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3302":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3303":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3304":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3305":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3306":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3307":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3308":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3309":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3310":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3311":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3312":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3313":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3314":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3315":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3316":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3317":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3318":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3319":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3320":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3321":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3322":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3323":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3324":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3325":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3326":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3327":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3328":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3329":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3330":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3331":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3332":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3333":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3334":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3335":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3336":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3337":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3338":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3339":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3340":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3341":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3342":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3343":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3344":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3345":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3346":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"3347":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"3348":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"3349":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3350":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3351":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3352":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3353":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3354":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3355":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3356":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3357":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3358":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3359":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3360":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3361":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3362":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3363":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3364":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3365":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3366":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3367":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3368":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3369":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3370":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3371":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3372":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3373":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3374":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3375":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3376":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3377":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3378":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3379":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3380":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3381":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3382":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3383":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3384":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3385":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3386":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3387":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3388":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3389":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3390":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3391":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3392":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3393":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3394":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3395":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3396":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3397":[[0.0,0.0,0.0,0.125,1.0,0.125],[0.0,0.0,0.875,0.125,1.0,1.0],[0.875,0.0,0.0,1.0,1.0,0.125],[0.875,0.0,0.875,1.0,1.0,1.0],[0.0,0.875,0.125,1.0,1.0,0.875],[0.125,0.875,0.0,0.875,1.0,0.125],[0.125,0.875,0.875,0.875,1.0,1.0]],"3398":[[0.125,0.0,0.375,0.25,0.8125,0.625],[0.75,0.0,0.375,0.875,0.8125,0.625],[0.25,0.25,0.125,0.75,1.0,0.875],[0.125,0.4375,0.3125,0.25,0.8125,0.375],[0.125,0.4375,0.625,0.25,0.8125,0.6875],[0.75,0.4375,0.3125,0.875,0.8125,0.375],[0.75,0.4375,0.625,0.875,0.8125,0.6875]],"3399":[[0.125,0.0,0.375,0.25,0.8125,0.625],[0.75,0.0,0.375,0.875,0.8125,0.625],[0.25,0.25,0.125,0.75,1.0,0.875],[0.125,0.4375,0.3125,0.25,0.8125,0.375],[0.125,0.4375,0.625,0.25,0.8125,0.6875],[0.75,0.4375,0.3125,0.875,0.8125,0.375],[0.75,0.4375,0.625,0.875,0.8125,0.6875]],"3400":[[0.375,0.0,0.125,0.625,0.8125,0.25],[0.375,0.0,0.75,0.625,0.8125,0.875],[0.125,0.25,0.25,0.875,1.0,0.75],[0.3125,0.4375,0.125,0.375,0.8125,0.25],[0.3125,0.4375,0.75,0.375,0.8125,0.875],[0.625,0.4375,0.125,0.6875,0.8125,0.25],[0.625,0.4375,0.75,0.6875,0.8125,0.875]],"3401":[[0.375,0.0,0.125,0.625,0.8125,0.25],[0.375,0.0,0.75,0.625,0.8125,0.875],[0.125,0.25,0.25,0.875,1.0,0.75],[0.3125,0.4375,0.125,0.375,0.8125,0.25],[0.3125,0.4375,0.75,0.375,0.8125,0.875],[0.625,0.4375,0.125,0.6875,0.8125,0.25],[0.625,0.4375,0.75,0.6875,0.8125,0.875]],"3402":[[0.25,0.125,0.0,0.75,0.875,0.75],[0.125,0.3125,0.1875,0.25,0.6875,0.5625],[0.75,0.3125,0.1875,0.875,0.6875,0.5625],[0.125,0.375,0.5625,0.25,0.625,1.0],[0.75,0.375,0.5625,0.875,0.625,1.0]],"3403":[[0.25,0.125,0.25,0.75,0.875,1.0],[0.125,0.3125,0.4375,0.25,0.6875,0.8125],[0.75,0.3125,0.4375,0.875,0.6875,0.8125],[0.125,0.375,0.0,0.25,0.625,0.4375],[0.75,0.375,0.0,0.875,0.625,0.4375]],"3404":[[0.0,0.125,0.25,0.75,0.875,0.75],[0.1875,0.3125,0.125,0.5625,0.6875,0.25],[0.1875,0.3125,0.75,0.5625,0.6875,0.875],[0.5625,0.375,0.125,1.0,0.625,0.25],[0.5625,0.375,0.75,1.0,0.625,0.875]],"3405":[[0.25,0.125,0.25,1.0,0.875,0.75],[0.4375,0.3125,0.125,0.8125,0.6875,0.25],[0.4375,0.3125,0.75,0.8125,0.6875,0.875],[0.0,0.375,0.125,0.4375,0.625,0.25],[0.0,0.375,0.75,0.4375,0.625,0.875]],"3406":[[0.25,0.0,0.125,0.75,0.75,0.875],[0.125,0.1875,0.3125,0.25,0.5625,0.6875],[0.75,0.1875,0.3125,0.875,0.5625,0.6875],[0.125,0.5625,0.375,0.25,1.0,0.625],[0.75,0.5625,0.375,0.875,1.0,0.625]],"3407":[[0.25,0.0,0.125,0.75,0.75,0.875],[0.125,0.1875,0.3125,0.25,0.5625,0.6875],[0.75,0.1875,0.3125,0.875,0.5625,0.6875],[0.125,0.5625,0.375,0.25,1.0,0.625],[0.75,0.5625,0.375,0.875,1.0,0.625]],"3408":[[0.125,0.0,0.25,0.875,0.75,0.75],[0.3125,0.1875,0.125,0.6875,0.5625,0.25],[0.3125,0.1875,0.75,0.6875,0.5625,0.875],[0.375,0.5625,0.125,0.625,1.0,0.25],[0.375,0.5625,0.75,0.625,1.0,0.875]],"3409":[[0.125,0.0,0.25,0.875,0.75,0.75],[0.3125,0.1875,0.125,0.6875,0.5625,0.25],[0.3125,0.1875,0.75,0.6875,0.5625,0.875],[0.375,0.5625,0.125,0.625,1.0,0.25],[0.375,0.5625,0.75,0.625,1.0,0.875]],"3410":[[0.0,0.0,0.0,1.0,0.125,1.0],[0.25,0.125,0.25,0.75,0.875,0.75]],"3411":[[0.0,0.0,0.0,1.0,0.5625,1.0]],"3412":[[0.0,0.0,0.25,1.0,1.0,0.75]],"3413":[[0.25,0.0,0.0,0.75,1.0,1.0]],"3414":[[0.25,0.25,0.25,0.75,0.375,0.75],[0.3125,0.375,0.3125,0.6875,0.8125,0.6875],[0.4375,0.8125,0.4375,0.5625,1.0,0.5625]],"3415":[[0.25,0.25,0.25,0.75,0.375,0.75],[0.3125,0.375,0.3125,0.6875,0.8125,0.6875],[0.4375,0.8125,0.0,0.5625,0.9375,0.8125]],"3416":[[0.25,0.25,0.25,0.75,0.375,0.75],[0.3125,0.375,0.3125,0.6875,0.8125,0.6875],[0.4375,0.8125,0.1875,0.5625,0.9375,1.0]],"3417":[[0.25,0.25,0.25,0.75,0.375,0.75],[0.3125,0.375,0.3125,0.6875,0.8125,0.6875],[0.0,0.8125,0.4375,0.8125,0.9375,0.5625]],"3418":[[0.25,0.25,0.25,0.75,0.375,0.75],[0.3125,0.375,0.3125,0.6875,0.8125,0.6875],[0.1875,0.8125,0.4375,1.0,0.9375,0.5625]],"3419":[[0.25,0.25,0.25,0.75,0.375,0.75],[0.3125,0.375,0.3125,0.6875,0.8125,0.6875],[0.4375,0.8125,0.0,0.5625,0.9375,1.0]],"3420":[[0.25,0.25,0.25,0.75,0.375,0.75],[0.3125,0.375,0.3125,0.6875,0.8125,0.6875],[0.0,0.8125,0.4375,1.0,0.9375,0.5625]],"3421":[[0.3125,0.0625,0.3125,0.6875,0.5,0.6875],[0.375,0.5,0.375,0.625,0.625,0.625]],"3422":[[0.3125,0.0,0.3125,0.6875,0.4375,0.6875],[0.375,0.4375,0.375,0.625,0.5625,0.625]],"3423":[[0.0,0.0,0.0,1.0,0.4375,1.0]],"3424":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"3425":[[0.375,0.0,0.0,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"3426":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"3427":[[0.375,0.0,0.0,0.625,1.5,0.625],[0.625,0.0,0.375,1.0,1.5,0.625]],"3428":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"3429":[[0.375,0.0,0.375,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"3430":[[0.0,0.0,0.375,1.0,1.5,0.625]],"3431":[[0.375,0.0,0.375,1.0,1.5,0.625]],"3432":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"3433":[[0.375,0.0,0.0,0.625,1.5,1.0]],"3434":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"3435":[[0.375,0.0,0.0,0.625,1.5,0.625]],"3436":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"3437":[[0.375,0.0,0.375,0.625,1.5,1.0]],"3438":[[0.0,0.0,0.375,0.625,1.5,0.625]],"3439":[[0.375,0.0,0.375,0.625,1.5,0.625]],"3440":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"3441":[[0.375,0.0,0.0,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"3442":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"3443":[[0.375,0.0,0.0,0.625,1.5,0.625],[0.625,0.0,0.375,1.0,1.5,0.625]],"3444":[[0.0,0.0,0.375,1.0,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"3445":[[0.375,0.0,0.375,0.625,1.5,1.0],[0.625,0.0,0.375,1.0,1.5,0.625]],"3446":[[0.0,0.0,0.375,1.0,1.5,0.625]],"3447":[[0.375,0.0,0.375,1.0,1.5,0.625]],"3448":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375],[0.375,0.0,0.625,0.625,1.5,1.0]],"3449":[[0.375,0.0,0.0,0.625,1.5,1.0]],"3450":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.0,0.625,1.5,0.375]],"3451":[[0.375,0.0,0.0,0.625,1.5,0.625]],"3452":[[0.0,0.0,0.375,0.625,1.5,0.625],[0.375,0.0,0.625,0.625,1.5,1.0]],"3453":[[0.375,0.0,0.375,0.625,1.5,1.0]],"3454":[[0.0,0.0,0.375,0.625,1.5,0.625]],"3455":[[0.375,0.0,0.375,0.625,1.5,0.625]],"3456":[[0.0,0.0,0.0,1.0,0.125,1.0],[0.0,0.125,0.0,0.125,1.0,1.0],[0.125,0.125,0.0,1.0,1.0,0.125],[0.125,0.125,0.875,1.0,1.0,1.0],[0.875,0.125,0.125,1.0,1.0,0.875]],"3457":[[0.0625,0.0,0.0625,0.9375,0.9375,0.9375]],"3458":[[0.25,0.0,0.25,0.75,1.5,0.75]],"3459":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3460":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3461":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"3462":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"3463":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3464":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3465":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3466":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"3467":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3468":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3469":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3470":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3471":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3472":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"3473":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3474":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3475":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3476":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3477":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3478":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"3479":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3480":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3481":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3482":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3483":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3484":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"3485":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3486":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3487":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3488":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3489":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3490":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"3491":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3492":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3493":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3494":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3495":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3496":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"3497":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3498":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3499":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3500":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3501":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3502":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"3503":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3504":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3505":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3506":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3507":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3508":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"3509":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3510":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3511":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3512":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3513":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3514":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"3515":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"3516":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"3517":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3518":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3519":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3520":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3521":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3522":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3523":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3524":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3525":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3526":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3527":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3528":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3529":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3530":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3531":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3532":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3533":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3534":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3535":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3536":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3537":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3538":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3539":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3540":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3541":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3542":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3543":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3544":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3545":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3546":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3547":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3548":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3549":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3550":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3551":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3552":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3553":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3554":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3555":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3556":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3557":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3558":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3559":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3560":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3561":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3562":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3563":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3564":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3565":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3566":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3567":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3568":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"3569":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"3570":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"3571":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3572":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3573":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3574":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3575":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3576":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3577":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3578":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3579":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3580":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3581":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3582":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3583":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3584":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3585":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3586":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3587":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3588":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3589":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3590":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3591":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3592":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3593":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3594":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3595":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3596":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3597":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3598":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3599":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3600":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3601":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3602":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3603":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3604":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3605":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3606":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3607":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3608":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3609":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3610":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3611":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3612":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3613":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3614":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3615":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3616":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3617":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3618":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3619":[[0.25,0.0,0.25,0.75,1.5,0.75]],"3620":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3621":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3622":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"3623":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"3624":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3625":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3626":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3627":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"3628":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3629":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3630":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3631":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3632":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3633":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"3634":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3635":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3636":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3637":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3638":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3639":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"3640":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3641":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3642":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3643":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3644":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3645":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"3646":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3647":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3648":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3649":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3650":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3651":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"3652":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3653":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3654":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3655":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3656":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3657":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"3658":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3659":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3660":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3661":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3662":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3663":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"3664":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3665":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3666":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3667":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3668":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3669":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"3670":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3671":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3672":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3673":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3674":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3675":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"3676":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"3677":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"3678":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3679":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3680":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3681":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3682":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3683":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3684":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3685":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3686":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3687":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3688":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3689":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3690":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3691":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3692":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3693":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3694":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3695":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3696":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3697":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3698":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3699":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3700":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3701":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3702":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3703":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3704":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3705":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3706":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3707":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3708":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3709":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3710":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3711":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3712":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3713":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3714":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3715":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3716":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3717":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3718":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3719":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3720":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3721":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3722":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3723":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3724":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3725":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3726":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3727":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3728":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3729":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"3730":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"3731":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"3732":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3733":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3734":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3735":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3736":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3737":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3738":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3739":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3740":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3741":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3742":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3743":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3744":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3745":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3746":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3747":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3748":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3749":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3750":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3751":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3752":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3753":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3754":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3755":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3756":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3757":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3758":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3759":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3760":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3761":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3762":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3763":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3764":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3765":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3766":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3767":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3768":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3769":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3770":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3771":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3772":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3773":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3774":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3775":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3776":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3777":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3778":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3779":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3780":[[0.25,0.0,0.25,0.75,1.5,0.75]],"3781":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3782":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3783":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"3784":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"3785":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3786":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3787":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3788":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"3789":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3790":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3791":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3792":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3793":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3794":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"3795":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3796":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3797":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3798":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3799":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3800":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"3801":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3802":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3803":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3804":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3805":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3806":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"3807":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3808":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3809":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3810":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3811":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3812":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"3813":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3814":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3815":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3816":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3817":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3818":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"3819":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3820":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3821":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3822":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3823":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3824":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"3825":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3826":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3827":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3828":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3829":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3830":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"3831":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3832":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3833":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3834":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3835":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3836":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"3837":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"3838":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"3839":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3840":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3841":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3842":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3843":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3844":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3845":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3846":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3847":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3848":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3849":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3850":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3851":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3852":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3853":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3854":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3855":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3856":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3857":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3858":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3859":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3860":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3861":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3862":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3863":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3864":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3865":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3866":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3867":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3868":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3869":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3870":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3871":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3872":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3873":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3874":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3875":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3876":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3877":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3878":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3879":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3880":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3881":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3882":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3883":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3884":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3885":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3886":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3887":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3888":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3889":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3890":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"3891":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"3892":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"3893":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3894":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3895":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3896":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3897":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3898":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3899":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3900":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3901":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3902":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3903":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3904":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3905":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3906":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3907":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3908":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3909":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3910":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3911":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3912":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3913":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3914":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3915":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3916":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3917":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3918":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3919":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3920":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3921":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3922":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3923":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3924":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3925":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3926":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3927":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3928":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3929":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3930":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3931":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3932":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3933":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3934":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3935":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"3936":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3937":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3938":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"3939":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3940":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3941":[[0.4375,0.0,0.4375,0.5625,0.375,0.5625]],"3942":[[0.3125,0.0,0.375,0.6875,0.375,0.5625]],"3943":[[0.3125,0.0,0.375,0.625,0.375,0.6875]],"3944":[[0.3125,0.0,0.3125,0.6875,0.375,0.625]],"3945":[[0.0625,0.0,0.0625,0.9375,0.5,0.9375],[0.4375,0.5,0.4375,0.5625,0.875,0.5625]],"3946":[[0.1875,0.1875,0.5625,0.8125,0.8125,1.0]],"3947":[[0.0,0.1875,0.1875,0.4375,0.8125,0.8125]],"3948":[[0.1875,0.1875,0.0,0.8125,0.8125,0.4375]],"3949":[[0.5625,0.1875,0.1875,1.0,0.8125,0.8125]],"3950":[[0.1875,0.0,0.1875,0.8125,0.4375,0.8125]],"3951":[[0.1875,0.5625,0.1875,0.8125,1.0,0.8125]],"3952":[[0.1875,0.1875,0.6875,0.8125,0.8125,1.0]],"3953":[[0.0,0.1875,0.1875,0.3125,0.8125,0.8125]],"3954":[[0.1875,0.1875,0.0,0.8125,0.8125,0.3125]],"3955":[[0.6875,0.1875,0.1875,1.0,0.8125,0.8125]],"3956":[[0.1875,0.0,0.1875,0.8125,0.3125,0.8125]],"3957":[[0.1875,0.6875,0.1875,0.8125,1.0,0.8125]],"3958":[[0.1875,0.1875,0.75,0.8125,0.8125,1.0]],"3959":[[0.0,0.1875,0.1875,0.25,0.8125,0.8125]],"3960":[[0.1875,0.1875,0.0,0.8125,0.8125,0.25]],"3961":[[0.75,0.1875,0.1875,1.0,0.8125,0.8125]],"3962":[[0.1875,0.0,0.1875,0.8125,0.25,0.8125]],"3963":[[0.1875,0.75,0.1875,0.8125,1.0,0.8125]],"3964":[[0.25,0.25,0.8125,0.75,0.75,1.0]],"3965":[[0.0,0.25,0.25,0.1875,0.75,0.75]],"3966":[[0.25,0.25,0.0,0.75,0.75,0.1875]],"3967":[[0.8125,0.25,0.25,1.0,0.75,0.75]],"3968":[[0.25,0.0,0.25,0.75,0.1875,0.75]],"3969":[[0.25,0.8125,0.25,0.75,1.0,0.75]],"3970":[[0.25,0.0,0.25,0.75,1.5,0.75]],"3971":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3972":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"3973":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"3974":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"3975":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3976":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3977":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3978":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"3979":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3980":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3981":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3982":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3983":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3984":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"3985":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3986":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3987":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3988":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3989":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"3990":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"3991":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3992":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"3993":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3994":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3995":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"3996":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"3997":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3998":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"3999":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4000":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4001":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4002":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4003":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4004":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4005":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4006":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4007":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4008":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"4009":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4010":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4011":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4012":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4013":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4014":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4015":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4016":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4017":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4018":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4019":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4020":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4021":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4022":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4023":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4024":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4025":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4026":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"4027":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4028":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4029":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4030":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4031":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4032":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4033":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4034":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4035":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4036":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4037":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4038":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4039":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4040":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4041":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4042":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4043":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4044":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4045":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4046":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4047":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4048":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4049":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4050":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4051":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4052":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4053":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4054":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4055":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4056":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4057":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4058":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4059":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4060":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4061":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4062":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4063":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4064":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4065":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4066":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4067":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4068":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4069":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4070":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4071":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4072":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4073":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4074":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4075":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4076":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4077":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4078":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4079":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4080":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"4081":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4082":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4083":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4084":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4085":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4086":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4087":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4088":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4089":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4090":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4091":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4092":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4093":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4094":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4095":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4096":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4097":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4098":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4099":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4100":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4101":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4102":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4103":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4104":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4105":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4106":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4107":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4108":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4109":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4110":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4111":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4112":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4113":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4114":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4115":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4116":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4117":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4118":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4119":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4120":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4121":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4122":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4123":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4124":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4125":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4126":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4127":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4128":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4129":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4130":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4131":[[0.25,0.0,0.25,0.75,1.5,0.75]],"4132":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4133":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4134":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"4135":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"4136":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4137":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4138":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4139":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"4140":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4141":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4142":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4143":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4144":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4145":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"4146":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4147":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4148":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4149":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4150":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4151":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"4152":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4153":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4154":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4155":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4156":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4157":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4158":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4159":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4160":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4161":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4162":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4163":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4164":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4165":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4166":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4167":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4168":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4169":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"4170":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4171":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4172":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4173":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4174":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4175":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4176":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4177":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4178":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4179":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4180":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4181":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4182":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4183":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4184":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4185":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4186":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4187":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"4188":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4189":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4190":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4191":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4192":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4193":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4194":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4195":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4196":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4197":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4198":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4199":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4200":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4201":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4202":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4203":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4204":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4205":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4206":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4207":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4208":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4209":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4210":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4211":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4212":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4213":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4214":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4215":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4216":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4217":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4218":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4219":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4220":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4221":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4222":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4223":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4224":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4225":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4226":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4227":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4228":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4229":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4230":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4231":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4232":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4233":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4234":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4235":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4236":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4237":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4238":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4239":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4240":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4241":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"4242":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4243":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4244":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4245":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4246":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4247":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4248":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4249":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4250":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4251":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4252":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4253":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4254":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4255":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4256":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4257":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4258":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4259":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4260":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4261":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4262":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4263":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4264":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4265":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4266":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4267":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4268":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4269":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4270":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4271":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4272":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4273":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4274":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4275":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4276":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4277":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4278":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4279":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4280":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4281":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4282":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4283":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4284":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4285":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4286":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4287":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4288":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4289":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4290":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4291":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4292":[[0.25,0.0,0.25,0.75,1.5,0.75]],"4293":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4294":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4295":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"4296":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"4297":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4298":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4299":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4300":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"4301":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4302":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4303":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4304":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4305":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4306":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"4307":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4308":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4309":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4310":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4311":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4312":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"4313":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4314":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4315":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4316":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4317":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4318":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4319":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4320":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4321":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4322":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4323":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4324":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4325":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4326":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4327":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4328":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4329":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4330":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"4331":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4332":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4333":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4334":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4335":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4336":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4337":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4338":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4339":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4340":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4341":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4342":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4343":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4344":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4345":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4346":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4347":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4348":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"4349":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4350":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4351":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4352":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4353":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4354":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4355":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4356":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4357":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4358":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4359":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4360":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4361":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4362":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4363":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4364":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4365":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4366":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4367":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4368":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4369":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4370":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4371":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4372":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4373":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4374":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4375":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4376":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4377":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4378":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4379":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4380":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4381":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4382":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4383":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4384":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4385":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4386":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4387":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4388":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4389":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4390":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4391":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4392":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4393":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4394":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4395":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4396":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4397":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4398":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4399":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4400":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4401":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4402":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"4403":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4404":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4405":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4406":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4407":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4408":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4409":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4410":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4411":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4412":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4413":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4414":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4415":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4416":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4417":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4418":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4419":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4420":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4421":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4422":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4423":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4424":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4425":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4426":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4427":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4428":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4429":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4430":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4431":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4432":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4433":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4434":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4435":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4436":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4437":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4438":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4439":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4440":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4441":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4442":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4443":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4444":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4445":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4446":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4447":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4448":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4449":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4450":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4451":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4452":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4453":[[0.0,0.0,0.0,1.0,0.5,1.0]],"4454":[[0.0,0.0,0.0,1.0,0.5,1.0]],"4455":[[0.1875,0.0,0.1875,0.8125,0.875,0.8125]],"4456":[[0.1875,0.0,0.1875,0.5625,1.0,0.5625]],"4457":[[0.1875,0.0,0.1875,0.5625,1.0,0.5625]],"4458":[[0.1875,0.0,0.1875,0.5625,1.0,0.5625]],"4459":[[0.1875,0.0,0.1875,0.5625,1.0,0.5625]],"4460":[[0.1875,0.0,0.1875,0.5625,0.6875,0.5625]],"4461":[[0.1875,0.0,0.1875,0.5625,0.6875,0.5625]],"4462":[[0.1875,0.3125,0.1875,0.5625,1.0,0.5625]],"4463":[[0.1875,0.3125,0.1875,0.5625,1.0,0.5625]],"4464":[[0.125,0.0,0.125,0.625,1.0,0.625]],"4465":[[0.125,0.0,0.125,0.625,1.0,0.625]],"4466":[[0.125,0.0,0.125,0.625,1.0,0.625]],"4467":[[0.125,0.0,0.125,0.625,1.0,0.625]],"4468":[[0.0625,0.0,0.0625,0.6875,1.0,0.6875]],"4469":[[0.0625,0.0,0.0625,0.6875,1.0,0.6875]],"4470":[[0.0625,0.0,0.0625,0.6875,1.0,0.6875]],"4471":[[0.0625,0.0,0.0625,0.6875,1.0,0.6875]],"4472":[[0.0,0.0,0.0,0.75,1.0,0.75]],"4473":[[0.0,0.0,0.0,0.75,1.0,0.75]],"4474":[[0.0,0.0,0.0,0.75,1.0,0.75]],"4475":[[0.0,0.0,0.0,0.75,1.0,0.75]],"4476":[[0.375,0.0,0.375,0.625,1.0,0.625],[0.0,0.5,0.0,0.375,1.0,1.0],[0.375,0.5,0.0,1.0,1.0,0.375],[0.375,0.5,0.625,1.0,1.0,1.0],[0.625,0.5,0.375,1.0,1.0,0.625]],"4477":[[0.0,0.6875,0.0,1.0,0.9375,1.0]],"4478":[[0.0,0.6875,0.0,1.0,0.9375,1.0]],"4479":[[0.0,0.6875,0.0,1.0,0.8125,1.0]],"4480":[[0.0,0.0,0.0,1.0,0.875,1.0]],"4481":[[0.25,0.0,0.25,0.75,1.5,0.75]],"4482":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4483":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4484":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"4485":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"4486":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4487":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4488":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4489":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"4490":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4491":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4492":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4493":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4494":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4495":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"4496":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4497":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4498":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4499":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4500":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4501":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"4502":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4503":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4504":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4505":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4506":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4507":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4508":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4509":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4510":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4511":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4512":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4513":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4514":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4515":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4516":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4517":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4518":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4519":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"4520":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4521":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4522":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4523":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4524":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4525":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4526":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4527":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4528":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4529":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4530":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4531":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4532":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4533":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4534":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4535":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4536":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4537":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"4538":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4539":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4540":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4541":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4542":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4543":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4544":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4545":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4546":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4547":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4548":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4549":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4550":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4551":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4552":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4553":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4554":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4555":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4556":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4557":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4558":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4559":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4560":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4561":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4562":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4563":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4564":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4565":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4566":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4567":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4568":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4569":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4570":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4571":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4572":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4573":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4574":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4575":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4576":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4577":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4578":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4579":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4580":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4581":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4582":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4583":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4584":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4585":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4586":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4587":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4588":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4589":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4590":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4591":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"4592":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4593":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4594":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4595":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4596":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4597":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4598":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4599":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4600":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4601":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4602":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4603":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4604":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4605":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4606":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4607":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4608":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4609":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4610":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4611":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4612":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4613":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4614":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4615":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4616":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4617":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4618":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4619":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4620":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4621":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4622":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4623":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4624":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4625":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4626":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4627":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4628":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4629":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4630":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4631":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4632":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4633":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4634":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4635":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4636":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4637":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4638":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4639":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4640":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4641":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4642":[[0.25,0.0,0.25,0.75,1.5,0.75]],"4643":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4644":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4645":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"4646":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"4647":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4648":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4649":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4650":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"4651":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4652":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4653":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4654":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4655":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4656":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"4657":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4658":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4659":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4660":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4661":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4662":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"4663":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4664":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4665":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4666":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4667":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4668":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4669":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4670":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4671":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4672":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4673":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4674":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4675":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4676":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4677":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4678":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4679":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4680":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"4681":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4682":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4683":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4684":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4685":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4686":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4687":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4688":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4689":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4690":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4691":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4692":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4693":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4694":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4695":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4696":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4697":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4698":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"4699":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4700":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4701":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4702":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4703":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4704":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4705":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4706":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4707":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4708":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4709":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4710":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4711":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4712":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4713":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4714":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4715":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4716":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4717":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4718":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4719":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4720":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4721":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4722":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4723":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4724":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4725":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4726":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4727":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4728":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4729":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4730":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4731":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4732":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4733":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4734":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4735":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4736":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4737":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4738":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4739":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4740":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4741":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4742":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4743":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4744":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4745":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4746":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4747":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4748":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4749":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4750":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4751":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4752":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"4753":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4754":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4755":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4756":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4757":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4758":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4759":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4760":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4761":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4762":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4763":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4764":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4765":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4766":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4767":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4768":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4769":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4770":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4771":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4772":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4773":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4774":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4775":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4776":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4777":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4778":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4779":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4780":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4781":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4782":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4783":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4784":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4785":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4786":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4787":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4788":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4789":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4790":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4791":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4792":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4793":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4794":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4795":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4796":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4797":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4798":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4799":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4800":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4801":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4802":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4803":[[0.25,0.0,0.25,0.75,1.5,0.75]],"4804":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4805":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4806":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"4807":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"4808":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4809":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4810":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4811":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"4812":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4813":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4814":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4815":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4816":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4817":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"4818":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4819":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4820":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4821":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4822":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4823":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"4824":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4825":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4826":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4827":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4828":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4829":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4830":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4831":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4832":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4833":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4834":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4835":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4836":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4837":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4838":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4839":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4840":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4841":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"4842":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4843":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4844":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4845":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4846":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4847":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4848":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4849":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4850":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4851":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4852":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4853":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4854":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4855":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4856":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4857":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4858":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4859":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"4860":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4861":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4862":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4863":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4864":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4865":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4866":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4867":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4868":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4869":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4870":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4871":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4872":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4873":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4874":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4875":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4876":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4877":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4878":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4879":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4880":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4881":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4882":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4883":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4884":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4885":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4886":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4887":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4888":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4889":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4890":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4891":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4892":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4893":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4894":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4895":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4896":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4897":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4898":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4899":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4900":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4901":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4902":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4903":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4904":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4905":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4906":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4907":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4908":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4909":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4910":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4911":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4912":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4913":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"4914":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4915":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"4916":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4917":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4918":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4919":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4920":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4921":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4922":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4923":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4924":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4925":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4926":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4927":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4928":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4929":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4930":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4931":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4932":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4933":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4934":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4935":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4936":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4937":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4938":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4939":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4940":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4941":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4942":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4943":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4944":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4945":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4946":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4947":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4948":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4949":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4950":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4951":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4952":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4953":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4954":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4955":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4956":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4957":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4958":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"4959":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4960":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4961":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"4962":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4963":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4964":[[0.25,0.0,0.25,0.75,1.5,0.75]],"4965":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4966":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"4967":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"4968":[[0.0,0.0,0.3125,0.6875,1.5,0.6875]],"4969":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4970":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4971":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4972":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"4973":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4974":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4975":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4976":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4977":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4978":[[0.3125,0.0,0.3125,0.6875,1.5,1.0]],"4979":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4980":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4981":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4982":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4983":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"4984":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"4985":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4986":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"4987":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4988":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4989":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4990":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4991":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4992":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4993":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4994":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4995":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"4996":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"4997":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4998":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"4999":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"5000":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"5001":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"5002":[[0.3125,0.0,0.0,0.6875,1.5,0.6875]],"5003":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"5004":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"5005":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5006":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5007":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5008":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"5009":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5010":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5011":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5012":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5013":[[0.0,0.0,0.3125,0.75,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5014":[[0.3125,0.0,0.0,0.6875,1.5,1.0]],"5015":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5016":[[0.0,0.0,0.3125,0.6875,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5017":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"5018":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"5019":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"5020":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"5021":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"5022":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"5023":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"5024":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5025":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5026":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"5027":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5028":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5029":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"5030":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5031":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5032":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"5033":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5034":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5035":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"5036":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"5037":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"5038":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"5039":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"5040":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"5041":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"5042":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5043":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5044":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"5045":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5046":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5047":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"5048":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5049":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5050":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"5051":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5052":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5053":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"5054":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"5055":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"5056":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"5057":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"5058":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"5059":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"5060":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5061":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5062":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"5063":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5064":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5065":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"5066":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5067":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5068":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"5069":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5070":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5071":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"5072":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"5073":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75]],"5074":[[0.3125,0.0,0.3125,1.0,1.5,0.6875]],"5075":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"5076":[[0.0,0.0,0.3125,1.0,1.5,0.6875]],"5077":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"5078":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5079":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5080":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"5081":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5082":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5083":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"5084":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5085":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5086":[[0.3125,0.0,0.3125,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"5087":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5088":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5089":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"5090":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"5091":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"5092":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"5093":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"5094":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"5095":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"5096":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5097":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5098":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"5099":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5100":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5101":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"5102":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5103":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5104":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"5105":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5106":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5107":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"5108":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"5109":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25]],"5110":[[0.3125,0.0,0.0,0.6875,1.5,0.6875],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"5111":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"5112":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125]],"5113":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"5114":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5115":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5116":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"5117":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5118":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5119":[[0.25,0.0,0.25,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0],[0.75,0.0,0.3125,1.0,1.5,0.6875]],"5120":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5121":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.25,0.0,0.25,0.75,1.5,0.3125],[0.25,0.0,0.6875,0.75,1.5,0.75],[0.3125,0.0,0.0,0.6875,1.5,0.25],[0.3125,0.0,0.75,0.6875,1.5,1.0]],"5122":[[0.3125,0.0,0.0,0.6875,1.5,1.0],[0.6875,0.0,0.3125,1.0,1.5,0.6875]],"5123":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5124":[[0.0,0.0,0.3125,1.0,1.5,0.6875],[0.3125,0.0,0.0,0.6875,1.5,0.3125],[0.3125,0.0,0.6875,0.6875,1.5,1.0]],"5125":[[0.0625,0.0,0.0625,0.9375,1.0,0.9375]],"5126":[[0.25,0.0,0.25,0.75,0.5,0.75]],"5127":[[0.0,0.0,0.0,1.0,0.0625,1.0]]},"blocks":{"air":0,"stone":1,"granite":1,"polished_granite":1,"diorite":1,"polished_diorite":1,"andesite":1,"polished_andesite":1,"grass_block":1,"dirt":1,"coarse_dirt":1,"podzol":1,"cobblestone":1,"oak_planks":1,"spruce_planks":1,"birch_planks":1,"jungle_planks":1,"acacia_planks":1,"cherry_planks":1,"dark_oak_planks":1,"pale_oak_wood":1,"pale_oak_planks":1,"mangrove_planks":1,"bamboo_planks":1,"bamboo_mosaic":1,"oak_sapling":0,"spruce_sapling":0,"birch_sapling":0,"jungle_sapling":0,"acacia_sapling":0,"cherry_sapling":0,"dark_oak_sapling":0,"pale_oak_sapling":0,"mangrove_propagule":0,"bedrock":1,"water":0,"lava":0,"sand":1,"suspicious_sand":1,"red_sand":1,"gravel":1,"suspicious_gravel":1,"gold_ore":1,"deepslate_gold_ore":1,"iron_ore":1,"deepslate_iron_ore":1,"coal_ore":1,"deepslate_coal_ore":1,"nether_gold_ore":1,"oak_log":1,"spruce_log":1,"birch_log":1,"jungle_log":1,"acacia_log":1,"cherry_log":1,"dark_oak_log":1,"pale_oak_log":1,"mangrove_log":1,"mangrove_roots":1,"muddy_mangrove_roots":1,"bamboo_block":1,"stripped_spruce_log":1,"stripped_birch_log":1,"stripped_jungle_log":1,"stripped_acacia_log":1,"stripped_cherry_log":1,"stripped_dark_oak_log":1,"stripped_pale_oak_log":1,"stripped_oak_log":1,"stripped_mangrove_log":1,"stripped_bamboo_block":1,"oak_wood":1,"spruce_wood":1,"birch_wood":1,"jungle_wood":1,"acacia_wood":1,"cherry_wood":1,"dark_oak_wood":1,"mangrove_wood":1,"stripped_oak_wood":1,"stripped_spruce_wood":1,"stripped_birch_wood":1,"stripped_jungle_wood":1,"stripped_acacia_wood":1,"stripped_cherry_wood":1,"stripped_dark_oak_wood":1,"stripped_pale_oak_wood":1,"stripped_mangrove_wood":1,"oak_leaves":1,"spruce_leaves":1,"birch_leaves":1,"jungle_leaves":1,"acacia_leaves":1,"cherry_leaves":1,"dark_oak_leaves":1,"pale_oak_leaves":1,"mangrove_leaves":1,"azalea_leaves":1,"flowering_azalea_leaves":1,"sponge":1,"wet_sponge":1,"glass":1,"lapis_ore":1,"deepslate_lapis_ore":1,"lapis_block":1,"dispenser":1,"sandstone":1,"chiseled_sandstone":1,"cut_sandstone":1,"note_block":1,"white_bed":[2,3,2,3,3,2,3,2,4,5,4,5,5,4,5,4],"orange_bed":[2,3,2,3,3,2,3,2,4,5,4,5,5,4,5,4],"magenta_bed":[2,3,2,3,3,2,3,2,4,5,4,5,5,4,5,4],"light_blue_bed":[2,3,2,3,3,2,3,2,4,5,4,5,5,4,5,4],"yellow_bed":[2,3,2,3,3,2,3,2,4,5,4,5,5,4,5,4],"lime_bed":[2,3,2,3,3,2,3,2,4,5,4,5,5,4,5,4],"pink_bed":[2,3,2,3,3,2,3,2,4,5,4,5,5,4,5,4],"gray_bed":[2,3,2,3,3,2,3,2,4,5,4,5,5,4,5,4],"light_gray_bed":[2,3,2,3,3,2,3,2,4,5,4,5,5,4,5,4],"cyan_bed":[2,3,2,3,3,2,3,2,4,5,4,5,5,4,5,4],"purple_bed":[2,3,2,3,3,2,3,2,4,5,4,5,5,4,5,4],"blue_bed":[2,3,2,3,3,2,3,2,4,5,4,5,5,4,5,4],"brown_bed":[2,3,2,3,3,2,3,2,4,5,4,5,5,4,5,4],"green_bed":[2,3,2,3,3,2,3,2,4,5,4,5,5,4,5,4],"red_bed":[2,3,2,3,3,2,3,2,4,5,4,5,5,4,5,4],"black_bed":[2,3,2,3,3,2,3,2,4,5,4,5,5,4,5,4],"powered_rail":0,"detector_rail":0,"sticky_piston":[6,7,8,9,10,11,1,1,1,1,1,1],"cobweb":0,"short_grass":0,"fern":0,"dead_bush":0,"bush":0,"short_dry_grass":0,"tall_dry_grass":0,"seagrass":0,"tall_seagrass":0,"piston":[6,7,8,9,10,11,1,1,1,1,1,1],"piston_head":[12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23],"white_wool":1,"orange_wool":1,"magenta_wool":1,"light_blue_wool":1,"yellow_wool":1,"lime_wool":1,"pink_wool":1,"gray_wool":1,"light_gray_wool":1,"cyan_wool":1,"purple_wool":1,"blue_wool":1,"brown_wool":1,"green_wool":1,"red_wool":1,"black_wool":1,"moving_piston":0,"dandelion":0,"torchflower":0,"poppy":0,"blue_orchid":0,"allium":0,"azure_bluet":0,"red_tulip":0,"orange_tulip":0,"white_tulip":0,"pink_tulip":0,"oxeye_daisy":0,"cornflower":0,"wither_rose":0,"lily_of_the_valley":0,"brown_mushroom":0,"red_mushroom":0,"gold_block":1,"iron_block":1,"bricks":1,"tnt":1,"bookshelf":1,"chiseled_bookshelf":1,"acacia_shelf":[24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27],"bamboo_shelf":[24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27],"birch_shelf":[24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27],"cherry_shelf":[24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27],"crimson_shelf":[24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27],"dark_oak_shelf":[24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27],"jungle_shelf":[24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27],"mangrove_shelf":[24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27],"oak_shelf":[24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27],"pale_oak_shelf":[24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27],"spruce_shelf":[24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27],"warped_shelf":[24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27],"mossy_cobblestone":1,"obsidian":1,"torch":0,"wall_torch":0,"fire":0,"soul_fire":0,"spawner":1,"creaking_heart":1,"oak_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"chest":[52,52,53,53,54,54,52,52,54,54,53,53,52,52,55,55,56,56,52,52,56,56,55,55],"redstone_wire":0,"diamond_ore":1,"deepslate_diamond_ore":1,"diamond_block":1,"crafting_table":1,"wheat":0,"farmland":57,"furnace":1,"oak_sign":0,"spruce_sign":0,"birch_sign":0,"acacia_sign":0,"cherry_sign":0,"jungle_sign":0,"dark_oak_sign":0,"pale_oak_sign":0,"mangrove_sign":0,"bamboo_sign":0,"oak_door":[58,58,59,59,60,60,59,59,58,58,59,59,60,60,59,59,60,60,61,61,58,58,61,61,60,60,61,61,58,58,61,61,59,59,60,60,61,61,60,60,59,59,60,60,61,61,60,60,61,61,58,58,59,59,58,58,61,61,58,58,59,59,58,58],"ladder":[62,62,63,63,64,64,65,65],"rail":0,"cobblestone_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"oak_wall_sign":0,"spruce_wall_sign":0,"birch_wall_sign":0,"acacia_wall_sign":0,"cherry_wall_sign":0,"jungle_wall_sign":0,"dark_oak_wall_sign":0,"pale_oak_wall_sign":0,"mangrove_wall_sign":0,"bamboo_wall_sign":0,"oak_hanging_sign":0,"spruce_hanging_sign":0,"birch_hanging_sign":0,"acacia_hanging_sign":0,"cherry_hanging_sign":0,"jungle_hanging_sign":0,"dark_oak_hanging_sign":0,"pale_oak_hanging_sign":0,"crimson_hanging_sign":0,"warped_hanging_sign":0,"mangrove_hanging_sign":0,"bamboo_hanging_sign":0,"oak_wall_hanging_sign":[66,66,66,66,67,67,67,67],"spruce_wall_hanging_sign":[66,66,66,66,67,67,67,67],"birch_wall_hanging_sign":[66,66,66,66,67,67,67,67],"acacia_wall_hanging_sign":[66,66,66,66,67,67,67,67],"cherry_wall_hanging_sign":[66,66,66,66,67,67,67,67],"jungle_wall_hanging_sign":[66,66,66,66,67,67,67,67],"dark_oak_wall_hanging_sign":[66,66,66,66,67,67,67,67],"pale_oak_wall_hanging_sign":[66,66,66,66,67,67,67,67],"mangrove_wall_hanging_sign":[66,66,66,66,67,67,67,67],"crimson_wall_hanging_sign":[66,66,66,66,67,67,67,67],"warped_wall_hanging_sign":[66,66,66,66,67,67,67,67],"bamboo_wall_hanging_sign":[66,66,66,66,67,67,67,67],"lever":0,"stone_pressure_plate":0,"iron_door":[58,58,59,59,60,60,59,59,58,58,59,59,60,60,59,59,60,60,61,61,58,58,61,61,60,60,61,61,58,58,61,61,59,59,60,60,61,61,60,60,59,59,60,60,61,61,60,60,61,61,58,58,59,59,58,58,61,61,58,58,59,59,58,58],"oak_pressure_plate":0,"spruce_pressure_plate":0,"birch_pressure_plate":0,"jungle_pressure_plate":0,"acacia_pressure_plate":0,"cherry_pressure_plate":0,"dark_oak_pressure_plate":0,"pale_oak_pressure_plate":0,"mangrove_pressure_plate":0,"bamboo_pressure_plate":0,"redstone_ore":1,"deepslate_redstone_ore":1,"redstone_torch":0,"redstone_wall_torch":0,"stone_button":0,"snow":[0,68,69,70,71,72,73,74],"ice":1,"snow_block":1,"cactus":75,"cactus_flower":0,"clay":1,"sugar_cane":0,"jukebox":1,"oak_fence":[76,77,76,77,78,79,78,79,80,81,80,81,82,83,82,83,84,85,84,85,86,87,86,87,88,89,88,89,90,91,90,91],"netherrack":1,"soul_sand":92,"soul_soil":1,"basalt":1,"polished_basalt":1,"soul_torch":0,"soul_wall_torch":0,"copper_torch":0,"copper_wall_torch":0,"glowstone":1,"nether_portal":0,"carved_pumpkin":1,"jack_o_lantern":1,"cake":[93,94,95,96,97,98,99],"repeater":100,"white_stained_glass":1,"orange_stained_glass":1,"magenta_stained_glass":1,"light_blue_stained_glass":1,"yellow_stained_glass":1,"lime_stained_glass":1,"pink_stained_glass":1,"gray_stained_glass":1,"light_gray_stained_glass":1,"cyan_stained_glass":1,"purple_stained_glass":1,"blue_stained_glass":1,"brown_stained_glass":1,"green_stained_glass":1,"red_stained_glass":1,"black_stained_glass":1,"oak_trapdoor":[101,101,101,101,102,102,102,102,101,101,101,101,103,103,103,103,104,104,104,104,102,102,102,102,104,104,104,104,103,103,103,103,105,105,105,105,102,102,102,102,105,105,105,105,103,103,103,103,106,106,106,106,102,102,102,102,106,106,106,106,103,103,103,103],"spruce_trapdoor":[101,101,101,101,102,102,102,102,101,101,101,101,103,103,103,103,104,104,104,104,102,102,102,102,104,104,104,104,103,103,103,103,105,105,105,105,102,102,102,102,105,105,105,105,103,103,103,103,106,106,106,106,102,102,102,102,106,106,106,106,103,103,103,103],"birch_trapdoor":[101,101,101,101,102,102,102,102,101,101,101,101,103,103,103,103,104,104,104,104,102,102,102,102,104,104,104,104,103,103,103,103,105,105,105,105,102,102,102,102,105,105,105,105,103,103,103,103,106,106,106,106,102,102,102,102,106,106,106,106,103,103,103,103],"jungle_trapdoor":[101,101,101,101,102,102,102,102,101,101,101,101,103,103,103,103,104,104,104,104,102,102,102,102,104,104,104,104,103,103,103,103,105,105,105,105,102,102,102,102,105,105,105,105,103,103,103,103,106,106,106,106,102,102,102,102,106,106,106,106,103,103,103,103],"acacia_trapdoor":[101,101,101,101,102,102,102,102,101,101,101,101,103,103,103,103,104,104,104,104,102,102,102,102,104,104,104,104,103,103,103,103,105,105,105,105,102,102,102,102,105,105,105,105,103,103,103,103,106,106,106,106,102,102,102,102,106,106,106,106,103,103,103,103],"cherry_trapdoor":[101,101,101,101,102,102,102,102,101,101,101,101,103,103,103,103,104,104,104,104,102,102,102,102,104,104,104,104,103,103,103,103,105,105,105,105,102,102,102,102,105,105,105,105,103,103,103,103,106,106,106,106,102,102,102,102,106,106,106,106,103,103,103,103],"dark_oak_trapdoor":[101,101,101,101,102,102,102,102,101,101,101,101,103,103,103,103,104,104,104,104,102,102,102,102,104,104,104,104,103,103,103,103,105,105,105,105,102,102,102,102,105,105,105,105,103,103,103,103,106,106,106,106,102,102,102,102,106,106,106,106,103,103,103,103],"pale_oak_trapdoor":[101,101,101,101,102,102,102,102,101,101,101,101,103,103,103,103,104,104,104,104,102,102,102,102,104,104,104,104,103,103,103,103,105,105,105,105,102,102,102,102,105,105,105,105,103,103,103,103,106,106,106,106,102,102,102,102,106,106,106,106,103,103,103,103],"mangrove_trapdoor":[101,101,101,101,102,102,102,102,101,101,101,101,103,103,103,103,104,104,104,104,102,102,102,102,104,104,104,104,103,103,103,103,105,105,105,105,102,102,102,102,105,105,105,105,103,103,103,103,106,106,106,106,102,102,102,102,106,106,106,106,103,103,103,103],"bamboo_trapdoor":[101,101,101,101,102,102,102,102,101,101,101,101,103,103,103,103,104,104,104,104,102,102,102,102,104,104,104,104,103,103,103,103,105,105,105,105,102,102,102,102,105,105,105,105,103,103,103,103,106,106,106,106,102,102,102,102,106,106,106,106,103,103,103,103],"stone_bricks":1,"mossy_stone_bricks":1,"cracked_stone_bricks":1,"chiseled_stone_bricks":1,"packed_mud":1,"mud_bricks":1,"infested_stone":1,"infested_cobblestone":1,"infested_stone_bricks":1,"infested_mossy_stone_bricks":1,"infested_cracked_stone_bricks":1,"infested_chiseled_stone_bricks":1,"brown_mushroom_block":1,"red_mushroom_block":1,"mushroom_stem":1,"iron_bars":[107,108,107,108,109,110,109,110,111,112,111,112,113,114,113,114,115,116,115,116,117,118,117,118,119,120,119,120,121,122,121,122],"copper_bars":[123,124,123,124,125,126,125,126,127,128,127,128,129,130,129,130,131,132,131,132,133,134,133,134,135,136,135,136,137,138,137,138],"exposed_copper_bars":[139,140,139,140,141,142,141,142,143,144,143,144,145,146,145,146,147,148,147,148,149,150,149,150,151,152,151,152,153,154,153,154],"weathered_copper_bars":[155,156,155,156,157,158,157,158,159,160,159,160,161,162,161,162,163,164,163,164,165,166,165,166,167,168,167,168,169,170,169,170],"oxidized_copper_bars":[171,172,171,172,173,174,173,174,175,176,175,176,177,178,177,178,179,180,179,180,181,182,181,182,183,184,183,184,185,186,185,186],"waxed_copper_bars":[187,188,187,188,189,190,189,190,191,192,191,192,193,194,193,194,195,196,195,196,197,198,197,198,199,200,199,200,201,202,201,202],"waxed_exposed_copper_bars":[203,204,203,204,205,206,205,206,207,208,207,208,209,210,209,210,211,212,211,212,213,214,213,214,215,216,215,216,217,218,217,218],"waxed_weathered_copper_bars":[219,220,219,220,221,222,221,222,223,224,223,224,225,226,225,226,227,228,227,228,229,230,229,230,231,232,231,232,233,234,233,234],"waxed_oxidized_copper_bars":[235,236,235,236,237,238,237,238,239,240,239,240,241,242,241,242,243,244,243,244,245,246,245,246,247,248,247,248,249,250,249,250],"iron_chain":[251,251,252,252,253,253],"copper_chain":[251,251,252,252,253,253],"exposed_copper_chain":[251,251,252,252,253,253],"weathered_copper_chain":[251,251,252,252,253,253],"oxidized_copper_chain":[251,251,252,252,253,253],"waxed_copper_chain":[251,251,252,252,253,253],"waxed_exposed_copper_chain":[251,251,252,252,253,253],"waxed_weathered_copper_chain":[251,251,252,252,253,253],"waxed_oxidized_copper_chain":[251,251,252,252,253,253],"glass_pane":[254,255,254,255,256,257,256,257,258,259,258,259,260,261,260,261,262,263,262,263,264,265,264,265,266,267,266,267,268,269,268,269],"pumpkin":1,"melon":1,"attached_pumpkin_stem":0,"attached_melon_stem":0,"pumpkin_stem":0,"melon_stem":0,"vine":0,"glow_lichen":0,"resin_clump":0,"oak_fence_gate":[0,0,270,270,0,0,270,270,0,0,270,270,0,0,270,270,0,0,271,271,0,0,271,271,0,0,271,271,0,0,271,271],"brick_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"stone_brick_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"mud_brick_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"mycelium":1,"lily_pad":272,"resin_block":1,"resin_bricks":1,"resin_brick_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"resin_brick_slab":[273,273,274,274,1,1],"resin_brick_wall":[275,276,277,275,276,277,0,278,279,0,278,279,280,281,282,280,281,282,283,284,285,283,284,285,286,287,288,286,287,288,289,290,291,289,290,291,292,293,294,292,293,294,295,296,297,295,296,297,298,299,300,298,299,300,301,302,303,301,302,303,304,305,306,304,305,306,307,308,309,307,308,309,310,311,312,310,311,312,313,314,315,313,314,315,316,317,318,316,317,318,319,320,321,319,320,321,322,323,324,322,323,324,325,326,327,325,326,327,328,329,330,328,329,330,331,332,333,331,332,333,334,335,336,334,335,336,337,338,339,337,338,339,340,341,342,340,341,342,343,344,345,343,344,345,346,347,348,346,347,348,349,350,351,349,350,351,352,353,354,352,353,354,355,356,357,355,356,357,358,359,360,358,359,360,361,362,363,361,362,363,364,365,366,364,365,366,367,368,369,367,368,369,370,371,372,370,371,372,373,374,375,373,374,375,376,377,378,376,377,378,379,380,381,379,380,381,382,383,384,382,383,384,385,386,387,385,386,387,388,389,390,388,389,390,391,392,393,391,392,393,394,395,396,394,395,396,397,398,399,397,398,399,400,401,402,400,401,402,403,404,405,403,404,405,406,407,408,406,407,408,409,410,411,409,410,411,412,413,414,412,413,414,415,416,417,415,416,417,418,419,420,418,419,420,421,422,423,421,422,423,424,425,426,424,425,426,427,428,429,427,428,429,430,431,432,430,431,432,433,434,435,433,434,435],"chiseled_resin_bricks":1,"nether_bricks":1,"nether_brick_fence":[436,437,436,437,438,439,438,439,440,441,440,441,442,443,442,443,444,445,444,445,446,447,446,447,448,449,448,449,450,451,450,451],"nether_brick_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"nether_wart":0,"enchanting_table":452,"brewing_stand":453,"cauldron":454,"water_cauldron":454,"lava_cauldron":454,"powder_snow_cauldron":454,"end_portal":0,"end_portal_frame":[455,455,455,455,456,456,456,456],"end_stone":1,"dragon_egg":457,"redstone_lamp":1,"cocoa":[458,459,460,461,462,463,464,465,466,467,468,469],"sandstone_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"emerald_ore":1,"deepslate_emerald_ore":1,"ender_chest":470,"tripwire_hook":0,"tripwire":0,"emerald_block":1,"spruce_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"birch_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"jungle_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"command_block":1,"beacon":1,"cobblestone_wall":[471,472,473,471,472,473,0,474,475,0,474,475,476,477,478,476,477,478,479,480,481,479,480,481,482,483,484,482,483,484,485,486,487,485,486,487,488,489,490,488,489,490,491,492,493,491,492,493,494,495,496,494,495,496,497,498,499,497,498,499,500,501,502,500,501,502,503,504,505,503,504,505,506,507,508,506,507,508,509,510,511,509,510,511,512,513,514,512,513,514,515,516,517,515,516,517,518,519,520,518,519,520,521,522,523,521,522,523,524,525,526,524,525,526,527,528,529,527,528,529,530,531,532,530,531,532,533,534,535,533,534,535,536,537,538,536,537,538,539,540,541,539,540,541,542,543,544,542,543,544,545,546,547,545,546,547,548,549,550,548,549,550,551,552,553,551,552,553,554,555,556,554,555,556,557,558,559,557,558,559,560,561,562,560,561,562,563,564,565,563,564,565,566,567,568,566,567,568,569,570,571,569,570,571,572,573,574,572,573,574,575,576,577,575,576,577,578,579,580,578,579,580,581,582,583,581,582,583,584,585,586,584,585,586,587,588,589,587,588,589,590,591,592,590,591,592,593,594,595,593,594,595,596,597,598,596,597,598,599,600,601,599,600,601,602,603,604,602,603,604,605,606,607,605,606,607,608,609,610,608,609,610,611,612,613,611,612,613,614,615,616,614,615,616,617,618,619,617,618,619,620,621,622,620,621,622,623,624,625,623,624,625,626,627,628,626,627,628,629,630,631,629,630,631],"mossy_cobblestone_wall":[632,633,634,632,633,634,0,635,636,0,635,636,637,638,639,637,638,639,640,641,642,640,641,642,643,644,645,643,644,645,646,647,648,646,647,648,649,650,651,649,650,651,652,653,654,652,653,654,655,656,657,655,656,657,658,659,660,658,659,660,661,662,663,661,662,663,664,665,666,664,665,666,667,668,669,667,668,669,670,671,672,670,671,672,673,674,675,673,674,675,676,677,678,676,677,678,679,680,681,679,680,681,682,683,684,682,683,684,685,686,687,685,686,687,688,689,690,688,689,690,691,692,693,691,692,693,694,695,696,694,695,696,697,698,699,697,698,699,700,701,702,700,701,702,703,704,705,703,704,705,706,707,708,706,707,708,709,710,711,709,710,711,712,713,714,712,713,714,715,716,717,715,716,717,718,719,720,718,719,720,721,722,723,721,722,723,724,725,726,724,725,726,727,728,729,727,728,729,730,731,732,730,731,732,733,734,735,733,734,735,736,737,738,736,737,738,739,740,741,739,740,741,742,743,744,742,743,744,745,746,747,745,746,747,748,749,750,748,749,750,751,752,753,751,752,753,754,755,756,754,755,756,757,758,759,757,758,759,760,761,762,760,761,762,763,764,765,763,764,765,766,767,768,766,767,768,769,770,771,769,770,771,772,773,774,772,773,774,775,776,777,775,776,777,778,779,780,778,779,780,781,782,783,781,782,783,784,785,786,784,785,786,787,788,789,787,788,789,790,791,792,790,791,792],"flower_pot":793,"potted_torchflower":793,"potted_oak_sapling":793,"potted_spruce_sapling":793,"potted_birch_sapling":793,"potted_jungle_sapling":793,"potted_acacia_sapling":793,"potted_cherry_sapling":793,"potted_dark_oak_sapling":793,"potted_pale_oak_sapling":793,"potted_mangrove_propagule":793,"potted_fern":793,"potted_dandelion":793,"potted_poppy":793,"potted_blue_orchid":793,"potted_allium":793,"potted_azure_bluet":793,"potted_red_tulip":793,"potted_orange_tulip":793,"potted_white_tulip":793,"potted_pink_tulip":793,"potted_oxeye_daisy":793,"potted_cornflower":793,"potted_lily_of_the_valley":793,"potted_wither_rose":793,"potted_red_mushroom":793,"potted_brown_mushroom":793,"potted_dead_bush":793,"potted_cactus":793,"carrots":0,"potatoes":0,"oak_button":0,"spruce_button":0,"birch_button":0,"jungle_button":0,"acacia_button":0,"cherry_button":0,"dark_oak_button":0,"pale_oak_button":0,"mangrove_button":0,"bamboo_button":0,"skeleton_skull":794,"skeleton_wall_skull":[795,795,796,796,797,797,798,798],"wither_skeleton_skull":794,"wither_skeleton_wall_skull":[795,795,796,796,797,797,798,798],"zombie_head":794,"zombie_wall_head":[795,795,796,796,797,797,798,798],"player_head":794,"player_wall_head":[795,795,796,796,797,797,798,798],"creeper_head":794,"creeper_wall_head":[795,795,796,796,797,797,798,798],"dragon_head":794,"dragon_wall_head":[795,795,796,796,797,797,798,798],"piglin_head":799,"piglin_wall_head":[800,800,801,801,802,802,803,803],"anvil":[804,804,805,805],"chipped_anvil":[804,804,805,805],"damaged_anvil":[804,804,805,805],"trapped_chest":[52,52,53,53,54,54,52,52,54,54,53,53,52,52,55,55,56,56,52,52,56,56,55,55],"light_weighted_pressure_plate":0,"heavy_weighted_pressure_plate":0,"comparator":100,"daylight_detector":806,"redstone_block":1,"nether_quartz_ore":1,"hopper":[807,808,809,810,811,807,808,809,810,811],"quartz_block":1,"chiseled_quartz_block":1,"quartz_pillar":1,"quartz_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"activator_rail":0,"dropper":1,"white_terracotta":1,"orange_terracotta":1,"magenta_terracotta":1,"light_blue_terracotta":1,"yellow_terracotta":1,"lime_terracotta":1,"pink_terracotta":1,"gray_terracotta":1,"light_gray_terracotta":1,"cyan_terracotta":1,"purple_terracotta":1,"blue_terracotta":1,"brown_terracotta":1,"green_terracotta":1,"red_terracotta":1,"black_terracotta":1,"white_stained_glass_pane":[812,813,812,813,814,815,814,815,816,817,816,817,818,819,818,819,820,821,820,821,822,823,822,823,824,825,824,825,826,827,826,827],"orange_stained_glass_pane":[828,829,828,829,830,831,830,831,832,833,832,833,834,835,834,835,836,837,836,837,838,839,838,839,840,841,840,841,842,843,842,843],"magenta_stained_glass_pane":[844,845,844,845,846,847,846,847,848,849,848,849,850,851,850,851,852,853,852,853,854,855,854,855,856,857,856,857,858,859,858,859],"light_blue_stained_glass_pane":[860,861,860,861,862,863,862,863,864,865,864,865,866,867,866,867,868,869,868,869,870,871,870,871,872,873,872,873,874,875,874,875],"yellow_stained_glass_pane":[876,877,876,877,878,879,878,879,880,881,880,881,882,883,882,883,884,885,884,885,886,887,886,887,888,889,888,889,890,891,890,891],"lime_stained_glass_pane":[892,893,892,893,894,895,894,895,896,897,896,897,898,899,898,899,900,901,900,901,902,903,902,903,904,905,904,905,906,907,906,907],"pink_stained_glass_pane":[908,909,908,909,910,911,910,911,912,913,912,913,914,915,914,915,916,917,916,917,918,919,918,919,920,921,920,921,922,923,922,923],"gray_stained_glass_pane":[924,925,924,925,926,927,926,927,928,929,928,929,930,931,930,931,932,933,932,933,934,935,934,935,936,937,936,937,938,939,938,939],"light_gray_stained_glass_pane":[940,941,940,941,942,943,942,943,944,945,944,945,946,947,946,947,948,949,948,949,950,951,950,951,952,953,952,953,954,955,954,955],"cyan_stained_glass_pane":[956,957,956,957,958,959,958,959,960,961,960,961,962,963,962,963,964,965,964,965,966,967,966,967,968,969,968,969,970,971,970,971],"purple_stained_glass_pane":[972,973,972,973,974,975,974,975,976,977,976,977,978,979,978,979,980,981,980,981,982,983,982,983,984,985,984,985,986,987,986,987],"blue_stained_glass_pane":[988,989,988,989,990,991,990,991,992,993,992,993,994,995,994,995,996,997,996,997,998,999,998,999,1000,1001,1000,1001,1002,1003,1002,1003],"brown_stained_glass_pane":[1004,1005,1004,1005,1006,1007,1006,1007,1008,1009,1008,1009,1010,1011,1010,1011,1012,1013,1012,1013,1014,1015,1014,1015,1016,1017,1016,1017,1018,1019,1018,1019],"green_stained_glass_pane":[1020,1021,1020,1021,1022,1023,1022,1023,1024,1025,1024,1025,1026,1027,1026,1027,1028,1029,1028,1029,1030,1031,1030,1031,1032,1033,1032,1033,1034,1035,1034,1035],"red_stained_glass_pane":[1036,1037,1036,1037,1038,1039,1038,1039,1040,1041,1040,1041,1042,1043,1042,1043,1044,1045,1044,1045,1046,1047,1046,1047,1048,1049,1048,1049,1050,1051,1050,1051],"black_stained_glass_pane":[1052,1053,1052,1053,1054,1055,1054,1055,1056,1057,1056,1057,1058,1059,1058,1059,1060,1061,1060,1061,1062,1063,1062,1063,1064,1065,1064,1065,1066,1067,1066,1067],"acacia_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"cherry_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"dark_oak_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"pale_oak_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"mangrove_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"bamboo_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"bamboo_mosaic_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"slime_block":1,"barrier":1,"light":0,"iron_trapdoor":[101,101,101,101,102,102,102,102,101,101,101,101,103,103,103,103,104,104,104,104,102,102,102,102,104,104,104,104,103,103,103,103,105,105,105,105,102,102,102,102,105,105,105,105,103,103,103,103,106,106,106,106,102,102,102,102,106,106,106,106,103,103,103,103],"prismarine":1,"prismarine_bricks":1,"dark_prismarine":1,"prismarine_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"prismarine_brick_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"dark_prismarine_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"prismarine_slab":[273,273,274,274,1,1],"prismarine_brick_slab":[273,273,274,274,1,1],"dark_prismarine_slab":[273,273,274,274,1,1],"sea_lantern":1,"hay_block":1,"white_carpet":1068,"orange_carpet":1068,"magenta_carpet":1068,"light_blue_carpet":1068,"yellow_carpet":1068,"lime_carpet":1068,"pink_carpet":1068,"gray_carpet":1068,"light_gray_carpet":1068,"cyan_carpet":1068,"purple_carpet":1068,"blue_carpet":1068,"brown_carpet":1068,"green_carpet":1068,"red_carpet":1068,"black_carpet":1068,"terracotta":1,"coal_block":1,"packed_ice":1,"sunflower":0,"lilac":0,"rose_bush":0,"peony":0,"tall_grass":0,"large_fern":0,"white_banner":0,"orange_banner":0,"magenta_banner":0,"light_blue_banner":0,"yellow_banner":0,"lime_banner":0,"pink_banner":0,"gray_banner":0,"light_gray_banner":0,"cyan_banner":0,"purple_banner":0,"blue_banner":0,"brown_banner":0,"green_banner":0,"red_banner":0,"black_banner":0,"white_wall_banner":0,"orange_wall_banner":0,"magenta_wall_banner":0,"light_blue_wall_banner":0,"yellow_wall_banner":0,"lime_wall_banner":0,"pink_wall_banner":0,"gray_wall_banner":0,"light_gray_wall_banner":0,"cyan_wall_banner":0,"purple_wall_banner":0,"blue_wall_banner":0,"brown_wall_banner":0,"green_wall_banner":0,"red_wall_banner":0,"black_wall_banner":0,"red_sandstone":1,"chiseled_red_sandstone":1,"cut_red_sandstone":1,"red_sandstone_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"oak_slab":[273,273,274,274,1,1],"spruce_slab":[273,273,274,274,1,1],"birch_slab":[273,273,274,274,1,1],"jungle_slab":[273,273,274,274,1,1],"acacia_slab":[273,273,274,274,1,1],"cherry_slab":[273,273,274,274,1,1],"dark_oak_slab":[273,273,274,274,1,1],"pale_oak_slab":[273,273,274,274,1,1],"mangrove_slab":[273,273,274,274,1,1],"bamboo_slab":[273,273,274,274,1,1],"bamboo_mosaic_slab":[273,273,274,274,1,1],"stone_slab":[273,273,274,274,1,1],"smooth_stone_slab":[273,273,274,274,1,1],"sandstone_slab":[273,273,274,274,1,1],"cut_sandstone_slab":[273,273,274,274,1,1],"petrified_oak_slab":[273,273,274,274,1,1],"cobblestone_slab":[273,273,274,274,1,1],"brick_slab":[273,273,274,274,1,1],"stone_brick_slab":[273,273,274,274,1,1],"mud_brick_slab":[273,273,274,274,1,1],"nether_brick_slab":[273,273,274,274,1,1],"quartz_slab":[273,273,274,274,1,1],"red_sandstone_slab":[273,273,274,274,1,1],"cut_red_sandstone_slab":[273,273,274,274,1,1],"purpur_slab":[273,273,274,274,1,1],"smooth_stone":1,"smooth_sandstone":1,"smooth_quartz":1,"smooth_red_sandstone":1,"spruce_fence_gate":[0,0,270,270,0,0,270,270,0,0,270,270,0,0,270,270,0,0,271,271,0,0,271,271,0,0,271,271,0,0,271,271],"birch_fence_gate":[0,0,270,270,0,0,270,270,0,0,270,270,0,0,270,270,0,0,271,271,0,0,271,271,0,0,271,271,0,0,271,271],"jungle_fence_gate":[0,0,270,270,0,0,270,270,0,0,270,270,0,0,270,270,0,0,271,271,0,0,271,271,0,0,271,271,0,0,271,271],"acacia_fence_gate":[0,0,270,270,0,0,270,270,0,0,270,270,0,0,270,270,0,0,271,271,0,0,271,271,0,0,271,271,0,0,271,271],"cherry_fence_gate":[0,0,270,270,0,0,270,270,0,0,270,270,0,0,270,270,0,0,271,271,0,0,271,271,0,0,271,271,0,0,271,271],"dark_oak_fence_gate":[0,0,270,270,0,0,270,270,0,0,270,270,0,0,270,270,0,0,271,271,0,0,271,271,0,0,271,271,0,0,271,271],"pale_oak_fence_gate":[0,0,270,270,0,0,270,270,0,0,270,270,0,0,270,270,0,0,271,271,0,0,271,271,0,0,271,271,0,0,271,271],"mangrove_fence_gate":[0,0,270,270,0,0,270,270,0,0,270,270,0,0,270,270,0,0,271,271,0,0,271,271,0,0,271,271,0,0,271,271],"bamboo_fence_gate":[0,0,270,270,0,0,270,270,0,0,270,270,0,0,270,270,0,0,271,271,0,0,271,271,0,0,271,271,0,0,271,271],"spruce_fence":[1069,1070,1069,1070,1071,1072,1071,1072,1073,1074,1073,1074,1075,1076,1075,1076,1077,1078,1077,1078,1079,1080,1079,1080,1081,1082,1081,1082,1083,1084,1083,1084],"birch_fence":[1085,1086,1085,1086,1087,1088,1087,1088,1089,1090,1089,1090,1091,1092,1091,1092,1093,1094,1093,1094,1095,1096,1095,1096,1097,1098,1097,1098,1099,1100,1099,1100],"jungle_fence":[1101,1102,1101,1102,1103,1104,1103,1104,1105,1106,1105,1106,1107,1108,1107,1108,1109,1110,1109,1110,1111,1112,1111,1112,1113,1114,1113,1114,1115,1116,1115,1116],"acacia_fence":[1117,1118,1117,1118,1119,1120,1119,1120,1121,1122,1121,1122,1123,1124,1123,1124,1125,1126,1125,1126,1127,1128,1127,1128,1129,1130,1129,1130,1131,1132,1131,1132],"cherry_fence":[1133,1134,1133,1134,1135,1136,1135,1136,1137,1138,1137,1138,1139,1140,1139,1140,1141,1142,1141,1142,1143,1144,1143,1144,1145,1146,1145,1146,1147,1148,1147,1148],"dark_oak_fence":[1149,1150,1149,1150,1151,1152,1151,1152,1153,1154,1153,1154,1155,1156,1155,1156,1157,1158,1157,1158,1159,1160,1159,1160,1161,1162,1161,1162,1163,1164,1163,1164],"pale_oak_fence":[1165,1166,1165,1166,1167,1168,1167,1168,1169,1170,1169,1170,1171,1172,1171,1172,1173,1174,1173,1174,1175,1176,1175,1176,1177,1178,1177,1178,1179,1180,1179,1180],"mangrove_fence":[1181,1182,1181,1182,1183,1184,1183,1184,1185,1186,1185,1186,1187,1188,1187,1188,1189,1190,1189,1190,1191,1192,1191,1192,1193,1194,1193,1194,1195,1196,1195,1196],"bamboo_fence":[1197,1198,1197,1198,1199,1200,1199,1200,1201,1202,1201,1202,1203,1204,1203,1204,1205,1206,1205,1206,1207,1208,1207,1208,1209,1210,1209,1210,1211,1212,1211,1212],"spruce_door":[58,58,59,59,60,60,59,59,58,58,59,59,60,60,59,59,60,60,61,61,58,58,61,61,60,60,61,61,58,58,61,61,59,59,60,60,61,61,60,60,59,59,60,60,61,61,60,60,61,61,58,58,59,59,58,58,61,61,58,58,59,59,58,58],"birch_door":[58,58,59,59,60,60,59,59,58,58,59,59,60,60,59,59,60,60,61,61,58,58,61,61,60,60,61,61,58,58,61,61,59,59,60,60,61,61,60,60,59,59,60,60,61,61,60,60,61,61,58,58,59,59,58,58,61,61,58,58,59,59,58,58],"jungle_door":[58,58,59,59,60,60,59,59,58,58,59,59,60,60,59,59,60,60,61,61,58,58,61,61,60,60,61,61,58,58,61,61,59,59,60,60,61,61,60,60,59,59,60,60,61,61,60,60,61,61,58,58,59,59,58,58,61,61,58,58,59,59,58,58],"acacia_door":[58,58,59,59,60,60,59,59,58,58,59,59,60,60,59,59,60,60,61,61,58,58,61,61,60,60,61,61,58,58,61,61,59,59,60,60,61,61,60,60,59,59,60,60,61,61,60,60,61,61,58,58,59,59,58,58,61,61,58,58,59,59,58,58],"cherry_door":[58,58,59,59,60,60,59,59,58,58,59,59,60,60,59,59,60,60,61,61,58,58,61,61,60,60,61,61,58,58,61,61,59,59,60,60,61,61,60,60,59,59,60,60,61,61,60,60,61,61,58,58,59,59,58,58,61,61,58,58,59,59,58,58],"dark_oak_door":[58,58,59,59,60,60,59,59,58,58,59,59,60,60,59,59,60,60,61,61,58,58,61,61,60,60,61,61,58,58,61,61,59,59,60,60,61,61,60,60,59,59,60,60,61,61,60,60,61,61,58,58,59,59,58,58,61,61,58,58,59,59,58,58],"pale_oak_door":[58,58,59,59,60,60,59,59,58,58,59,59,60,60,59,59,60,60,61,61,58,58,61,61,60,60,61,61,58,58,61,61,59,59,60,60,61,61,60,60,59,59,60,60,61,61,60,60,61,61,58,58,59,59,58,58,61,61,58,58,59,59,58,58],"mangrove_door":[58,58,59,59,60,60,59,59,58,58,59,59,60,60,59,59,60,60,61,61,58,58,61,61,60,60,61,61,58,58,61,61,59,59,60,60,61,61,60,60,59,59,60,60,61,61,60,60,61,61,58,58,59,59,58,58,61,61,58,58,59,59,58,58],"bamboo_door":[58,58,59,59,60,60,59,59,58,58,59,59,60,60,59,59,60,60,61,61,58,58,61,61,60,60,61,61,58,58,61,61,59,59,60,60,61,61,60,60,59,59,60,60,61,61,60,60,61,61,58,58,59,59,58,58,61,61,58,58,59,59,58,58],"end_rod":[1213,1214,1213,1214,1215,1215],"chorus_plant":[1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279],"chorus_flower":1,"purpur_block":1,"purpur_pillar":1,"purpur_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"end_stone_bricks":1,"torchflower_crop":0,"pitcher_crop":[0,1280,0,1281,0,1281,0,1281,0,1281],"pitcher_plant":0,"beetroots":0,"dirt_path":1282,"end_gateway":0,"repeating_command_block":1,"chain_command_block":1,"frosted_ice":1,"magma_block":1,"nether_wart_block":1,"red_nether_bricks":1,"bone_block":1,"structure_void":0,"observer":1,"shulker_box":1,"white_shulker_box":1,"orange_shulker_box":1,"magenta_shulker_box":1,"light_blue_shulker_box":1,"yellow_shulker_box":1,"lime_shulker_box":1,"pink_shulker_box":1,"gray_shulker_box":1,"light_gray_shulker_box":1,"cyan_shulker_box":1,"purple_shulker_box":1,"blue_shulker_box":1,"brown_shulker_box":1,"green_shulker_box":1,"red_shulker_box":1,"black_shulker_box":1,"white_glazed_terracotta":1,"orange_glazed_terracotta":1,"magenta_glazed_terracotta":1,"light_blue_glazed_terracotta":1,"yellow_glazed_terracotta":1,"lime_glazed_terracotta":1,"pink_glazed_terracotta":1,"gray_glazed_terracotta":1,"light_gray_glazed_terracotta":1,"cyan_glazed_terracotta":1,"purple_glazed_terracotta":1,"blue_glazed_terracotta":1,"brown_glazed_terracotta":1,"green_glazed_terracotta":1,"red_glazed_terracotta":1,"black_glazed_terracotta":1,"white_concrete":1,"orange_concrete":1,"magenta_concrete":1,"light_blue_concrete":1,"yellow_concrete":1,"lime_concrete":1,"pink_concrete":1,"gray_concrete":1,"light_gray_concrete":1,"cyan_concrete":1,"purple_concrete":1,"blue_concrete":1,"brown_concrete":1,"green_concrete":1,"red_concrete":1,"black_concrete":1,"white_concrete_powder":1,"orange_concrete_powder":1,"magenta_concrete_powder":1,"light_blue_concrete_powder":1,"yellow_concrete_powder":1,"lime_concrete_powder":1,"pink_concrete_powder":1,"gray_concrete_powder":1,"light_gray_concrete_powder":1,"cyan_concrete_powder":1,"purple_concrete_powder":1,"blue_concrete_powder":1,"brown_concrete_powder":1,"green_concrete_powder":1,"red_concrete_powder":1,"black_concrete_powder":1,"kelp":0,"kelp_plant":0,"dried_kelp_block":1,"turtle_egg":[1283,1283,1283,1284,1284,1284,1284,1284,1284,1284,1284,1284],"sniffer_egg":1285,"dried_ghast":1286,"dead_tube_coral_block":1,"dead_brain_coral_block":1,"dead_bubble_coral_block":1,"dead_fire_coral_block":1,"dead_horn_coral_block":1,"tube_coral_block":1,"brain_coral_block":1,"bubble_coral_block":1,"fire_coral_block":1,"horn_coral_block":1,"dead_tube_coral":0,"dead_brain_coral":0,"dead_bubble_coral":0,"dead_fire_coral":0,"dead_horn_coral":0,"tube_coral":0,"brain_coral":0,"bubble_coral":0,"fire_coral":0,"horn_coral":0,"dead_tube_coral_fan":0,"dead_brain_coral_fan":0,"dead_bubble_coral_fan":0,"dead_fire_coral_fan":0,"dead_horn_coral_fan":0,"tube_coral_fan":0,"brain_coral_fan":0,"bubble_coral_fan":0,"fire_coral_fan":0,"horn_coral_fan":0,"dead_tube_coral_wall_fan":0,"dead_brain_coral_wall_fan":0,"dead_bubble_coral_wall_fan":0,"dead_fire_coral_wall_fan":0,"dead_horn_coral_wall_fan":0,"tube_coral_wall_fan":0,"brain_coral_wall_fan":0,"bubble_coral_wall_fan":0,"fire_coral_wall_fan":0,"horn_coral_wall_fan":0,"sea_pickle":[1287,1287,1288,1288,1289,1289,1290,1290],"blue_ice":1,"conduit":1291,"bamboo_sapling":0,"bamboo":[1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303],"potted_bamboo":793,"void_air":0,"cave_air":0,"bubble_column":0,"polished_granite_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"smooth_red_sandstone_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"mossy_stone_brick_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"polished_diorite_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"mossy_cobblestone_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"end_stone_brick_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"stone_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"smooth_sandstone_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"smooth_quartz_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"granite_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"andesite_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"red_nether_brick_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"polished_andesite_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"diorite_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"polished_granite_slab":[273,273,274,274,1,1],"smooth_red_sandstone_slab":[273,273,274,274,1,1],"mossy_stone_brick_slab":[273,273,274,274,1,1],"polished_diorite_slab":[273,273,274,274,1,1],"mossy_cobblestone_slab":[273,273,274,274,1,1],"end_stone_brick_slab":[273,273,274,274,1,1],"smooth_sandstone_slab":[273,273,274,274,1,1],"smooth_quartz_slab":[273,273,274,274,1,1],"granite_slab":[273,273,274,274,1,1],"andesite_slab":[273,273,274,274,1,1],"red_nether_brick_slab":[273,273,274,274,1,1],"polished_andesite_slab":[273,273,274,274,1,1],"diorite_slab":[273,273,274,274,1,1],"brick_wall":[1304,1305,1306,1304,1305,1306,0,1307,1308,0,1307,1308,1309,1310,1311,1309,1310,1311,1312,1313,1314,1312,1313,1314,1315,1316,1317,1315,1316,1317,1318,1319,1320,1318,1319,1320,1321,1322,1323,1321,1322,1323,1324,1325,1326,1324,1325,1326,1327,1328,1329,1327,1328,1329,1330,1331,1332,1330,1331,1332,1333,1334,1335,1333,1334,1335,1336,1337,1338,1336,1337,1338,1339,1340,1341,1339,1340,1341,1342,1343,1344,1342,1343,1344,1345,1346,1347,1345,1346,1347,1348,1349,1350,1348,1349,1350,1351,1352,1353,1351,1352,1353,1354,1355,1356,1354,1355,1356,1357,1358,1359,1357,1358,1359,1360,1361,1362,1360,1361,1362,1363,1364,1365,1363,1364,1365,1366,1367,1368,1366,1367,1368,1369,1370,1371,1369,1370,1371,1372,1373,1374,1372,1373,1374,1375,1376,1377,1375,1376,1377,1378,1379,1380,1378,1379,1380,1381,1382,1383,1381,1382,1383,1384,1385,1386,1384,1385,1386,1387,1388,1389,1387,1388,1389,1390,1391,1392,1390,1391,1392,1393,1394,1395,1393,1394,1395,1396,1397,1398,1396,1397,1398,1399,1400,1401,1399,1400,1401,1402,1403,1404,1402,1403,1404,1405,1406,1407,1405,1406,1407,1408,1409,1410,1408,1409,1410,1411,1412,1413,1411,1412,1413,1414,1415,1416,1414,1415,1416,1417,1418,1419,1417,1418,1419,1420,1421,1422,1420,1421,1422,1423,1424,1425,1423,1424,1425,1426,1427,1428,1426,1427,1428,1429,1430,1431,1429,1430,1431,1432,1433,1434,1432,1433,1434,1435,1436,1437,1435,1436,1437,1438,1439,1440,1438,1439,1440,1441,1442,1443,1441,1442,1443,1444,1445,1446,1444,1445,1446,1447,1448,1449,1447,1448,1449,1450,1451,1452,1450,1451,1452,1453,1454,1455,1453,1454,1455,1456,1457,1458,1456,1457,1458,1459,1460,1461,1459,1460,1461,1462,1463,1464,1462,1463,1464],"prismarine_wall":[1465,1466,1467,1465,1466,1467,0,1468,1469,0,1468,1469,1470,1471,1472,1470,1471,1472,1473,1474,1475,1473,1474,1475,1476,1477,1478,1476,1477,1478,1479,1480,1481,1479,1480,1481,1482,1483,1484,1482,1483,1484,1485,1486,1487,1485,1486,1487,1488,1489,1490,1488,1489,1490,1491,1492,1493,1491,1492,1493,1494,1495,1496,1494,1495,1496,1497,1498,1499,1497,1498,1499,1500,1501,1502,1500,1501,1502,1503,1504,1505,1503,1504,1505,1506,1507,1508,1506,1507,1508,1509,1510,1511,1509,1510,1511,1512,1513,1514,1512,1513,1514,1515,1516,1517,1515,1516,1517,1518,1519,1520,1518,1519,1520,1521,1522,1523,1521,1522,1523,1524,1525,1526,1524,1525,1526,1527,1528,1529,1527,1528,1529,1530,1531,1532,1530,1531,1532,1533,1534,1535,1533,1534,1535,1536,1537,1538,1536,1537,1538,1539,1540,1541,1539,1540,1541,1542,1543,1544,1542,1543,1544,1545,1546,1547,1545,1546,1547,1548,1549,1550,1548,1549,1550,1551,1552,1553,1551,1552,1553,1554,1555,1556,1554,1555,1556,1557,1558,1559,1557,1558,1559,1560,1561,1562,1560,1561,1562,1563,1564,1565,1563,1564,1565,1566,1567,1568,1566,1567,1568,1569,1570,1571,1569,1570,1571,1572,1573,1574,1572,1573,1574,1575,1576,1577,1575,1576,1577,1578,1579,1580,1578,1579,1580,1581,1582,1583,1581,1582,1583,1584,1585,1586,1584,1585,1586,1587,1588,1589,1587,1588,1589,1590,1591,1592,1590,1591,1592,1593,1594,1595,1593,1594,1595,1596,1597,1598,1596,1597,1598,1599,1600,1601,1599,1600,1601,1602,1603,1604,1602,1603,1604,1605,1606,1607,1605,1606,1607,1608,1609,1610,1608,1609,1610,1611,1612,1613,1611,1612,1613,1614,1615,1616,1614,1615,1616,1617,1618,1619,1617,1618,1619,1620,1621,1622,1620,1621,1622,1623,1624,1625,1623,1624,1625],"red_sandstone_wall":[1626,1627,1628,1626,1627,1628,0,1629,1630,0,1629,1630,1631,1632,1633,1631,1632,1633,1634,1635,1636,1634,1635,1636,1637,1638,1639,1637,1638,1639,1640,1641,1642,1640,1641,1642,1643,1644,1645,1643,1644,1645,1646,1647,1648,1646,1647,1648,1649,1650,1651,1649,1650,1651,1652,1653,1654,1652,1653,1654,1655,1656,1657,1655,1656,1657,1658,1659,1660,1658,1659,1660,1661,1662,1663,1661,1662,1663,1664,1665,1666,1664,1665,1666,1667,1668,1669,1667,1668,1669,1670,1671,1672,1670,1671,1672,1673,1674,1675,1673,1674,1675,1676,1677,1678,1676,1677,1678,1679,1680,1681,1679,1680,1681,1682,1683,1684,1682,1683,1684,1685,1686,1687,1685,1686,1687,1688,1689,1690,1688,1689,1690,1691,1692,1693,1691,1692,1693,1694,1695,1696,1694,1695,1696,1697,1698,1699,1697,1698,1699,1700,1701,1702,1700,1701,1702,1703,1704,1705,1703,1704,1705,1706,1707,1708,1706,1707,1708,1709,1710,1711,1709,1710,1711,1712,1713,1714,1712,1713,1714,1715,1716,1717,1715,1716,1717,1718,1719,1720,1718,1719,1720,1721,1722,1723,1721,1722,1723,1724,1725,1726,1724,1725,1726,1727,1728,1729,1727,1728,1729,1730,1731,1732,1730,1731,1732,1733,1734,1735,1733,1734,1735,1736,1737,1738,1736,1737,1738,1739,1740,1741,1739,1740,1741,1742,1743,1744,1742,1743,1744,1745,1746,1747,1745,1746,1747,1748,1749,1750,1748,1749,1750,1751,1752,1753,1751,1752,1753,1754,1755,1756,1754,1755,1756,1757,1758,1759,1757,1758,1759,1760,1761,1762,1760,1761,1762,1763,1764,1765,1763,1764,1765,1766,1767,1768,1766,1767,1768,1769,1770,1771,1769,1770,1771,1772,1773,1774,1772,1773,1774,1775,1776,1777,1775,1776,1777,1778,1779,1780,1778,1779,1780,1781,1782,1783,1781,1782,1783,1784,1785,1786,1784,1785,1786],"mossy_stone_brick_wall":[1787,1788,1789,1787,1788,1789,0,1790,1791,0,1790,1791,1792,1793,1794,1792,1793,1794,1795,1796,1797,1795,1796,1797,1798,1799,1800,1798,1799,1800,1801,1802,1803,1801,1802,1803,1804,1805,1806,1804,1805,1806,1807,1808,1809,1807,1808,1809,1810,1811,1812,1810,1811,1812,1813,1814,1815,1813,1814,1815,1816,1817,1818,1816,1817,1818,1819,1820,1821,1819,1820,1821,1822,1823,1824,1822,1823,1824,1825,1826,1827,1825,1826,1827,1828,1829,1830,1828,1829,1830,1831,1832,1833,1831,1832,1833,1834,1835,1836,1834,1835,1836,1837,1838,1839,1837,1838,1839,1840,1841,1842,1840,1841,1842,1843,1844,1845,1843,1844,1845,1846,1847,1848,1846,1847,1848,1849,1850,1851,1849,1850,1851,1852,1853,1854,1852,1853,1854,1855,1856,1857,1855,1856,1857,1858,1859,1860,1858,1859,1860,1861,1862,1863,1861,1862,1863,1864,1865,1866,1864,1865,1866,1867,1868,1869,1867,1868,1869,1870,1871,1872,1870,1871,1872,1873,1874,1875,1873,1874,1875,1876,1877,1878,1876,1877,1878,1879,1880,1881,1879,1880,1881,1882,1883,1884,1882,1883,1884,1885,1886,1887,1885,1886,1887,1888,1889,1890,1888,1889,1890,1891,1892,1893,1891,1892,1893,1894,1895,1896,1894,1895,1896,1897,1898,1899,1897,1898,1899,1900,1901,1902,1900,1901,1902,1903,1904,1905,1903,1904,1905,1906,1907,1908,1906,1907,1908,1909,1910,1911,1909,1910,1911,1912,1913,1914,1912,1913,1914,1915,1916,1917,1915,1916,1917,1918,1919,1920,1918,1919,1920,1921,1922,1923,1921,1922,1923,1924,1925,1926,1924,1925,1926,1927,1928,1929,1927,1928,1929,1930,1931,1932,1930,1931,1932,1933,1934,1935,1933,1934,1935,1936,1937,1938,1936,1937,1938,1939,1940,1941,1939,1940,1941,1942,1943,1944,1942,1943,1944,1945,1946,1947,1945,1946,1947],"granite_wall":[1948,1949,1950,1948,1949,1950,0,1951,1952,0,1951,1952,1953,1954,1955,1953,1954,1955,1956,1957,1958,1956,1957,1958,1959,1960,1961,1959,1960,1961,1962,1963,1964,1962,1963,1964,1965,1966,1967,1965,1966,1967,1968,1969,1970,1968,1969,1970,1971,1972,1973,1971,1972,1973,1974,1975,1976,1974,1975,1976,1977,1978,1979,1977,1978,1979,1980,1981,1982,1980,1981,1982,1983,1984,1985,1983,1984,1985,1986,1987,1988,1986,1987,1988,1989,1990,1991,1989,1990,1991,1992,1993,1994,1992,1993,1994,1995,1996,1997,1995,1996,1997,1998,1999,2000,1998,1999,2000,2001,2002,2003,2001,2002,2003,2004,2005,2006,2004,2005,2006,2007,2008,2009,2007,2008,2009,2010,2011,2012,2010,2011,2012,2013,2014,2015,2013,2014,2015,2016,2017,2018,2016,2017,2018,2019,2020,2021,2019,2020,2021,2022,2023,2024,2022,2023,2024,2025,2026,2027,2025,2026,2027,2028,2029,2030,2028,2029,2030,2031,2032,2033,2031,2032,2033,2034,2035,2036,2034,2035,2036,2037,2038,2039,2037,2038,2039,2040,2041,2042,2040,2041,2042,2043,2044,2045,2043,2044,2045,2046,2047,2048,2046,2047,2048,2049,2050,2051,2049,2050,2051,2052,2053,2054,2052,2053,2054,2055,2056,2057,2055,2056,2057,2058,2059,2060,2058,2059,2060,2061,2062,2063,2061,2062,2063,2064,2065,2066,2064,2065,2066,2067,2068,2069,2067,2068,2069,2070,2071,2072,2070,2071,2072,2073,2074,2075,2073,2074,2075,2076,2077,2078,2076,2077,2078,2079,2080,2081,2079,2080,2081,2082,2083,2084,2082,2083,2084,2085,2086,2087,2085,2086,2087,2088,2089,2090,2088,2089,2090,2091,2092,2093,2091,2092,2093,2094,2095,2096,2094,2095,2096,2097,2098,2099,2097,2098,2099,2100,2101,2102,2100,2101,2102,2103,2104,2105,2103,2104,2105,2106,2107,2108,2106,2107,2108],"stone_brick_wall":[2109,2110,2111,2109,2110,2111,0,2112,2113,0,2112,2113,2114,2115,2116,2114,2115,2116,2117,2118,2119,2117,2118,2119,2120,2121,2122,2120,2121,2122,2123,2124,2125,2123,2124,2125,2126,2127,2128,2126,2127,2128,2129,2130,2131,2129,2130,2131,2132,2133,2134,2132,2133,2134,2135,2136,2137,2135,2136,2137,2138,2139,2140,2138,2139,2140,2141,2142,2143,2141,2142,2143,2144,2145,2146,2144,2145,2146,2147,2148,2149,2147,2148,2149,2150,2151,2152,2150,2151,2152,2153,2154,2155,2153,2154,2155,2156,2157,2158,2156,2157,2158,2159,2160,2161,2159,2160,2161,2162,2163,2164,2162,2163,2164,2165,2166,2167,2165,2166,2167,2168,2169,2170,2168,2169,2170,2171,2172,2173,2171,2172,2173,2174,2175,2176,2174,2175,2176,2177,2178,2179,2177,2178,2179,2180,2181,2182,2180,2181,2182,2183,2184,2185,2183,2184,2185,2186,2187,2188,2186,2187,2188,2189,2190,2191,2189,2190,2191,2192,2193,2194,2192,2193,2194,2195,2196,2197,2195,2196,2197,2198,2199,2200,2198,2199,2200,2201,2202,2203,2201,2202,2203,2204,2205,2206,2204,2205,2206,2207,2208,2209,2207,2208,2209,2210,2211,2212,2210,2211,2212,2213,2214,2215,2213,2214,2215,2216,2217,2218,2216,2217,2218,2219,2220,2221,2219,2220,2221,2222,2223,2224,2222,2223,2224,2225,2226,2227,2225,2226,2227,2228,2229,2230,2228,2229,2230,2231,2232,2233,2231,2232,2233,2234,2235,2236,2234,2235,2236,2237,2238,2239,2237,2238,2239,2240,2241,2242,2240,2241,2242,2243,2244,2245,2243,2244,2245,2246,2247,2248,2246,2247,2248,2249,2250,2251,2249,2250,2251,2252,2253,2254,2252,2253,2254,2255,2256,2257,2255,2256,2257,2258,2259,2260,2258,2259,2260,2261,2262,2263,2261,2262,2263,2264,2265,2266,2264,2265,2266,2267,2268,2269,2267,2268,2269],"mud_brick_wall":[2270,2271,2272,2270,2271,2272,0,2273,2274,0,2273,2274,2275,2276,2277,2275,2276,2277,2278,2279,2280,2278,2279,2280,2281,2282,2283,2281,2282,2283,2284,2285,2286,2284,2285,2286,2287,2288,2289,2287,2288,2289,2290,2291,2292,2290,2291,2292,2293,2294,2295,2293,2294,2295,2296,2297,2298,2296,2297,2298,2299,2300,2301,2299,2300,2301,2302,2303,2304,2302,2303,2304,2305,2306,2307,2305,2306,2307,2308,2309,2310,2308,2309,2310,2311,2312,2313,2311,2312,2313,2314,2315,2316,2314,2315,2316,2317,2318,2319,2317,2318,2319,2320,2321,2322,2320,2321,2322,2323,2324,2325,2323,2324,2325,2326,2327,2328,2326,2327,2328,2329,2330,2331,2329,2330,2331,2332,2333,2334,2332,2333,2334,2335,2336,2337,2335,2336,2337,2338,2339,2340,2338,2339,2340,2341,2342,2343,2341,2342,2343,2344,2345,2346,2344,2345,2346,2347,2348,2349,2347,2348,2349,2350,2351,2352,2350,2351,2352,2353,2354,2355,2353,2354,2355,2356,2357,2358,2356,2357,2358,2359,2360,2361,2359,2360,2361,2362,2363,2364,2362,2363,2364,2365,2366,2367,2365,2366,2367,2368,2369,2370,2368,2369,2370,2371,2372,2373,2371,2372,2373,2374,2375,2376,2374,2375,2376,2377,2378,2379,2377,2378,2379,2380,2381,2382,2380,2381,2382,2383,2384,2385,2383,2384,2385,2386,2387,2388,2386,2387,2388,2389,2390,2391,2389,2390,2391,2392,2393,2394,2392,2393,2394,2395,2396,2397,2395,2396,2397,2398,2399,2400,2398,2399,2400,2401,2402,2403,2401,2402,2403,2404,2405,2406,2404,2405,2406,2407,2408,2409,2407,2408,2409,2410,2411,2412,2410,2411,2412,2413,2414,2415,2413,2414,2415,2416,2417,2418,2416,2417,2418,2419,2420,2421,2419,2420,2421,2422,2423,2424,2422,2423,2424,2425,2426,2427,2425,2426,2427,2428,2429,2430,2428,2429,2430],"nether_brick_wall":[2431,2432,2433,2431,2432,2433,0,2434,2435,0,2434,2435,2436,2437,2438,2436,2437,2438,2439,2440,2441,2439,2440,2441,2442,2443,2444,2442,2443,2444,2445,2446,2447,2445,2446,2447,2448,2449,2450,2448,2449,2450,2451,2452,2453,2451,2452,2453,2454,2455,2456,2454,2455,2456,2457,2458,2459,2457,2458,2459,2460,2461,2462,2460,2461,2462,2463,2464,2465,2463,2464,2465,2466,2467,2468,2466,2467,2468,2469,2470,2471,2469,2470,2471,2472,2473,2474,2472,2473,2474,2475,2476,2477,2475,2476,2477,2478,2479,2480,2478,2479,2480,2481,2482,2483,2481,2482,2483,2484,2485,2486,2484,2485,2486,2487,2488,2489,2487,2488,2489,2490,2491,2492,2490,2491,2492,2493,2494,2495,2493,2494,2495,2496,2497,2498,2496,2497,2498,2499,2500,2501,2499,2500,2501,2502,2503,2504,2502,2503,2504,2505,2506,2507,2505,2506,2507,2508,2509,2510,2508,2509,2510,2511,2512,2513,2511,2512,2513,2514,2515,2516,2514,2515,2516,2517,2518,2519,2517,2518,2519,2520,2521,2522,2520,2521,2522,2523,2524,2525,2523,2524,2525,2526,2527,2528,2526,2527,2528,2529,2530,2531,2529,2530,2531,2532,2533,2534,2532,2533,2534,2535,2536,2537,2535,2536,2537,2538,2539,2540,2538,2539,2540,2541,2542,2543,2541,2542,2543,2544,2545,2546,2544,2545,2546,2547,2548,2549,2547,2548,2549,2550,2551,2552,2550,2551,2552,2553,2554,2555,2553,2554,2555,2556,2557,2558,2556,2557,2558,2559,2560,2561,2559,2560,2561,2562,2563,2564,2562,2563,2564,2565,2566,2567,2565,2566,2567,2568,2569,2570,2568,2569,2570,2571,2572,2573,2571,2572,2573,2574,2575,2576,2574,2575,2576,2577,2578,2579,2577,2578,2579,2580,2581,2582,2580,2581,2582,2583,2584,2585,2583,2584,2585,2586,2587,2588,2586,2587,2588,2589,2590,2591,2589,2590,2591],"andesite_wall":[2592,2593,2594,2592,2593,2594,0,2595,2596,0,2595,2596,2597,2598,2599,2597,2598,2599,2600,2601,2602,2600,2601,2602,2603,2604,2605,2603,2604,2605,2606,2607,2608,2606,2607,2608,2609,2610,2611,2609,2610,2611,2612,2613,2614,2612,2613,2614,2615,2616,2617,2615,2616,2617,2618,2619,2620,2618,2619,2620,2621,2622,2623,2621,2622,2623,2624,2625,2626,2624,2625,2626,2627,2628,2629,2627,2628,2629,2630,2631,2632,2630,2631,2632,2633,2634,2635,2633,2634,2635,2636,2637,2638,2636,2637,2638,2639,2640,2641,2639,2640,2641,2642,2643,2644,2642,2643,2644,2645,2646,2647,2645,2646,2647,2648,2649,2650,2648,2649,2650,2651,2652,2653,2651,2652,2653,2654,2655,2656,2654,2655,2656,2657,2658,2659,2657,2658,2659,2660,2661,2662,2660,2661,2662,2663,2664,2665,2663,2664,2665,2666,2667,2668,2666,2667,2668,2669,2670,2671,2669,2670,2671,2672,2673,2674,2672,2673,2674,2675,2676,2677,2675,2676,2677,2678,2679,2680,2678,2679,2680,2681,2682,2683,2681,2682,2683,2684,2685,2686,2684,2685,2686,2687,2688,2689,2687,2688,2689,2690,2691,2692,2690,2691,2692,2693,2694,2695,2693,2694,2695,2696,2697,2698,2696,2697,2698,2699,2700,2701,2699,2700,2701,2702,2703,2704,2702,2703,2704,2705,2706,2707,2705,2706,2707,2708,2709,2710,2708,2709,2710,2711,2712,2713,2711,2712,2713,2714,2715,2716,2714,2715,2716,2717,2718,2719,2717,2718,2719,2720,2721,2722,2720,2721,2722,2723,2724,2725,2723,2724,2725,2726,2727,2728,2726,2727,2728,2729,2730,2731,2729,2730,2731,2732,2733,2734,2732,2733,2734,2735,2736,2737,2735,2736,2737,2738,2739,2740,2738,2739,2740,2741,2742,2743,2741,2742,2743,2744,2745,2746,2744,2745,2746,2747,2748,2749,2747,2748,2749,2750,2751,2752,2750,2751,2752],"red_nether_brick_wall":[2753,2754,2755,2753,2754,2755,0,2756,2757,0,2756,2757,2758,2759,2760,2758,2759,2760,2761,2762,2763,2761,2762,2763,2764,2765,2766,2764,2765,2766,2767,2768,2769,2767,2768,2769,2770,2771,2772,2770,2771,2772,2773,2774,2775,2773,2774,2775,2776,2777,2778,2776,2777,2778,2779,2780,2781,2779,2780,2781,2782,2783,2784,2782,2783,2784,2785,2786,2787,2785,2786,2787,2788,2789,2790,2788,2789,2790,2791,2792,2793,2791,2792,2793,2794,2795,2796,2794,2795,2796,2797,2798,2799,2797,2798,2799,2800,2801,2802,2800,2801,2802,2803,2804,2805,2803,2804,2805,2806,2807,2808,2806,2807,2808,2809,2810,2811,2809,2810,2811,2812,2813,2814,2812,2813,2814,2815,2816,2817,2815,2816,2817,2818,2819,2820,2818,2819,2820,2821,2822,2823,2821,2822,2823,2824,2825,2826,2824,2825,2826,2827,2828,2829,2827,2828,2829,2830,2831,2832,2830,2831,2832,2833,2834,2835,2833,2834,2835,2836,2837,2838,2836,2837,2838,2839,2840,2841,2839,2840,2841,2842,2843,2844,2842,2843,2844,2845,2846,2847,2845,2846,2847,2848,2849,2850,2848,2849,2850,2851,2852,2853,2851,2852,2853,2854,2855,2856,2854,2855,2856,2857,2858,2859,2857,2858,2859,2860,2861,2862,2860,2861,2862,2863,2864,2865,2863,2864,2865,2866,2867,2868,2866,2867,2868,2869,2870,2871,2869,2870,2871,2872,2873,2874,2872,2873,2874,2875,2876,2877,2875,2876,2877,2878,2879,2880,2878,2879,2880,2881,2882,2883,2881,2882,2883,2884,2885,2886,2884,2885,2886,2887,2888,2889,2887,2888,2889,2890,2891,2892,2890,2891,2892,2893,2894,2895,2893,2894,2895,2896,2897,2898,2896,2897,2898,2899,2900,2901,2899,2900,2901,2902,2903,2904,2902,2903,2904,2905,2906,2907,2905,2906,2907,2908,2909,2910,2908,2909,2910,2911,2912,2913,2911,2912,2913],"sandstone_wall":[2914,2915,2916,2914,2915,2916,0,2917,2918,0,2917,2918,2919,2920,2921,2919,2920,2921,2922,2923,2924,2922,2923,2924,2925,2926,2927,2925,2926,2927,2928,2929,2930,2928,2929,2930,2931,2932,2933,2931,2932,2933,2934,2935,2936,2934,2935,2936,2937,2938,2939,2937,2938,2939,2940,2941,2942,2940,2941,2942,2943,2944,2945,2943,2944,2945,2946,2947,2948,2946,2947,2948,2949,2950,2951,2949,2950,2951,2952,2953,2954,2952,2953,2954,2955,2956,2957,2955,2956,2957,2958,2959,2960,2958,2959,2960,2961,2962,2963,2961,2962,2963,2964,2965,2966,2964,2965,2966,2967,2968,2969,2967,2968,2969,2970,2971,2972,2970,2971,2972,2973,2974,2975,2973,2974,2975,2976,2977,2978,2976,2977,2978,2979,2980,2981,2979,2980,2981,2982,2983,2984,2982,2983,2984,2985,2986,2987,2985,2986,2987,2988,2989,2990,2988,2989,2990,2991,2992,2993,2991,2992,2993,2994,2995,2996,2994,2995,2996,2997,2998,2999,2997,2998,2999,3000,3001,3002,3000,3001,3002,3003,3004,3005,3003,3004,3005,3006,3007,3008,3006,3007,3008,3009,3010,3011,3009,3010,3011,3012,3013,3014,3012,3013,3014,3015,3016,3017,3015,3016,3017,3018,3019,3020,3018,3019,3020,3021,3022,3023,3021,3022,3023,3024,3025,3026,3024,3025,3026,3027,3028,3029,3027,3028,3029,3030,3031,3032,3030,3031,3032,3033,3034,3035,3033,3034,3035,3036,3037,3038,3036,3037,3038,3039,3040,3041,3039,3040,3041,3042,3043,3044,3042,3043,3044,3045,3046,3047,3045,3046,3047,3048,3049,3050,3048,3049,3050,3051,3052,3053,3051,3052,3053,3054,3055,3056,3054,3055,3056,3057,3058,3059,3057,3058,3059,3060,3061,3062,3060,3061,3062,3063,3064,3065,3063,3064,3065,3066,3067,3068,3066,3067,3068,3069,3070,3071,3069,3070,3071,3072,3073,3074,3072,3073,3074],"end_stone_brick_wall":[3075,3076,3077,3075,3076,3077,0,3078,3079,0,3078,3079,3080,3081,3082,3080,3081,3082,3083,3084,3085,3083,3084,3085,3086,3087,3088,3086,3087,3088,3089,3090,3091,3089,3090,3091,3092,3093,3094,3092,3093,3094,3095,3096,3097,3095,3096,3097,3098,3099,3100,3098,3099,3100,3101,3102,3103,3101,3102,3103,3104,3105,3106,3104,3105,3106,3107,3108,3109,3107,3108,3109,3110,3111,3112,3110,3111,3112,3113,3114,3115,3113,3114,3115,3116,3117,3118,3116,3117,3118,3119,3120,3121,3119,3120,3121,3122,3123,3124,3122,3123,3124,3125,3126,3127,3125,3126,3127,3128,3129,3130,3128,3129,3130,3131,3132,3133,3131,3132,3133,3134,3135,3136,3134,3135,3136,3137,3138,3139,3137,3138,3139,3140,3141,3142,3140,3141,3142,3143,3144,3145,3143,3144,3145,3146,3147,3148,3146,3147,3148,3149,3150,3151,3149,3150,3151,3152,3153,3154,3152,3153,3154,3155,3156,3157,3155,3156,3157,3158,3159,3160,3158,3159,3160,3161,3162,3163,3161,3162,3163,3164,3165,3166,3164,3165,3166,3167,3168,3169,3167,3168,3169,3170,3171,3172,3170,3171,3172,3173,3174,3175,3173,3174,3175,3176,3177,3178,3176,3177,3178,3179,3180,3181,3179,3180,3181,3182,3183,3184,3182,3183,3184,3185,3186,3187,3185,3186,3187,3188,3189,3190,3188,3189,3190,3191,3192,3193,3191,3192,3193,3194,3195,3196,3194,3195,3196,3197,3198,3199,3197,3198,3199,3200,3201,3202,3200,3201,3202,3203,3204,3205,3203,3204,3205,3206,3207,3208,3206,3207,3208,3209,3210,3211,3209,3210,3211,3212,3213,3214,3212,3213,3214,3215,3216,3217,3215,3216,3217,3218,3219,3220,3218,3219,3220,3221,3222,3223,3221,3222,3223,3224,3225,3226,3224,3225,3226,3227,3228,3229,3227,3228,3229,3230,3231,3232,3230,3231,3232,3233,3234,3235,3233,3234,3235],"diorite_wall":[3236,3237,3238,3236,3237,3238,0,3239,3240,0,3239,3240,3241,3242,3243,3241,3242,3243,3244,3245,3246,3244,3245,3246,3247,3248,3249,3247,3248,3249,3250,3251,3252,3250,3251,3252,3253,3254,3255,3253,3254,3255,3256,3257,3258,3256,3257,3258,3259,3260,3261,3259,3260,3261,3262,3263,3264,3262,3263,3264,3265,3266,3267,3265,3266,3267,3268,3269,3270,3268,3269,3270,3271,3272,3273,3271,3272,3273,3274,3275,3276,3274,3275,3276,3277,3278,3279,3277,3278,3279,3280,3281,3282,3280,3281,3282,3283,3284,3285,3283,3284,3285,3286,3287,3288,3286,3287,3288,3289,3290,3291,3289,3290,3291,3292,3293,3294,3292,3293,3294,3295,3296,3297,3295,3296,3297,3298,3299,3300,3298,3299,3300,3301,3302,3303,3301,3302,3303,3304,3305,3306,3304,3305,3306,3307,3308,3309,3307,3308,3309,3310,3311,3312,3310,3311,3312,3313,3314,3315,3313,3314,3315,3316,3317,3318,3316,3317,3318,3319,3320,3321,3319,3320,3321,3322,3323,3324,3322,3323,3324,3325,3326,3327,3325,3326,3327,3328,3329,3330,3328,3329,3330,3331,3332,3333,3331,3332,3333,3334,3335,3336,3334,3335,3336,3337,3338,3339,3337,3338,3339,3340,3341,3342,3340,3341,3342,3343,3344,3345,3343,3344,3345,3346,3347,3348,3346,3347,3348,3349,3350,3351,3349,3350,3351,3352,3353,3354,3352,3353,3354,3355,3356,3357,3355,3356,3357,3358,3359,3360,3358,3359,3360,3361,3362,3363,3361,3362,3363,3364,3365,3366,3364,3365,3366,3367,3368,3369,3367,3368,3369,3370,3371,3372,3370,3371,3372,3373,3374,3375,3373,3374,3375,3376,3377,3378,3376,3377,3378,3379,3380,3381,3379,3380,3381,3382,3383,3384,3382,3383,3384,3385,3386,3387,3385,3386,3387,3388,3389,3390,3388,3389,3390,3391,3392,3393,3391,3392,3393,3394,3395,3396,3394,3395,3396],"scaffolding":3397,"loom":1,"barrel":1,"smoker":1,"blast_furnace":1,"cartography_table":1,"fletching_table":1,"grindstone":[3398,3399,3400,3401,3402,3403,3404,3405,3406,3407,3408,3409],"lectern":3410,"smithing_table":1,"stonecutter":3411,"bell":[3412,3412,3412,3412,3413,3413,3413,3413,3414,3414,3414,3414,3414,3414,3414,3414,3415,3415,3416,3416,3417,3417,3418,3418,3419,3419,3419,3419,3420,3420,3420,3420],"lantern":[3421,3421,3422,3422],"soul_lantern":[3421,3421,3422,3422],"copper_lantern":[3421,3421,3422,3422],"exposed_copper_lantern":[3421,3421,3422,3422],"weathered_copper_lantern":[3421,3421,3422,3422],"oxidized_copper_lantern":[3421,3421,3422,3422],"waxed_copper_lantern":[3421,3421,3422,3422],"waxed_exposed_copper_lantern":[3421,3421,3422,3422],"waxed_weathered_copper_lantern":[3421,3421,3422,3422],"waxed_oxidized_copper_lantern":[3421,3421,3422,3422],"campfire":3423,"soul_campfire":3423,"sweet_berry_bush":0,"warped_stem":1,"stripped_warped_stem":1,"warped_hyphae":1,"stripped_warped_hyphae":1,"warped_nylium":1,"warped_fungus":0,"warped_wart_block":1,"warped_roots":0,"nether_sprouts":0,"crimson_stem":1,"stripped_crimson_stem":1,"crimson_hyphae":1,"stripped_crimson_hyphae":1,"crimson_nylium":1,"crimson_fungus":0,"shroomlight":1,"weeping_vines":0,"weeping_vines_plant":0,"twisting_vines":0,"twisting_vines_plant":0,"crimson_roots":0,"crimson_planks":1,"warped_planks":1,"crimson_slab":[273,273,274,274,1,1],"warped_slab":[273,273,274,274,1,1],"crimson_pressure_plate":0,"warped_pressure_plate":0,"crimson_fence":[3424,3425,3424,3425,3426,3427,3426,3427,3428,3429,3428,3429,3430,3431,3430,3431,3432,3433,3432,3433,3434,3435,3434,3435,3436,3437,3436,3437,3438,3439,3438,3439],"warped_fence":[3440,3441,3440,3441,3442,3443,3442,3443,3444,3445,3444,3445,3446,3447,3446,3447,3448,3449,3448,3449,3450,3451,3450,3451,3452,3453,3452,3453,3454,3455,3454,3455],"crimson_trapdoor":[101,101,101,101,102,102,102,102,101,101,101,101,103,103,103,103,104,104,104,104,102,102,102,102,104,104,104,104,103,103,103,103,105,105,105,105,102,102,102,102,105,105,105,105,103,103,103,103,106,106,106,106,102,102,102,102,106,106,106,106,103,103,103,103],"warped_trapdoor":[101,101,101,101,102,102,102,102,101,101,101,101,103,103,103,103,104,104,104,104,102,102,102,102,104,104,104,104,103,103,103,103,105,105,105,105,102,102,102,102,105,105,105,105,103,103,103,103,106,106,106,106,102,102,102,102,106,106,106,106,103,103,103,103],"crimson_fence_gate":[0,0,270,270,0,0,270,270,0,0,270,270,0,0,270,270,0,0,271,271,0,0,271,271,0,0,271,271,0,0,271,271],"warped_fence_gate":[0,0,270,270,0,0,270,270,0,0,270,270,0,0,270,270,0,0,271,271,0,0,271,271,0,0,271,271,0,0,271,271],"crimson_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"warped_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"crimson_button":0,"warped_button":0,"crimson_door":[58,58,59,59,60,60,59,59,58,58,59,59,60,60,59,59,60,60,61,61,58,58,61,61,60,60,61,61,58,58,61,61,59,59,60,60,61,61,60,60,59,59,60,60,61,61,60,60,61,61,58,58,59,59,58,58,61,61,58,58,59,59,58,58],"warped_door":[58,58,59,59,60,60,59,59,58,58,59,59,60,60,59,59,60,60,61,61,58,58,61,61,60,60,61,61,58,58,61,61,59,59,60,60,61,61,60,60,59,59,60,60,61,61,60,60,61,61,58,58,59,59,58,58,61,61,58,58,59,59,58,58],"crimson_sign":0,"warped_sign":0,"crimson_wall_sign":0,"warped_wall_sign":0,"structure_block":1,"jigsaw":1,"test_block":1,"test_instance_block":1,"composter":3456,"target":1,"bee_nest":1,"beehive":1,"honey_block":3457,"honeycomb_block":1,"netherite_block":1,"ancient_debris":1,"crying_obsidian":1,"respawn_anchor":1,"potted_crimson_fungus":793,"potted_warped_fungus":793,"potted_crimson_roots":793,"potted_warped_roots":793,"lodestone":1,"blackstone":1,"blackstone_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"blackstone_wall":[3458,3459,3460,3458,3459,3460,0,3461,3462,0,3461,3462,3463,3464,3465,3463,3464,3465,3466,3467,3468,3466,3467,3468,3469,3470,3471,3469,3470,3471,3472,3473,3474,3472,3473,3474,3475,3476,3477,3475,3476,3477,3478,3479,3480,3478,3479,3480,3481,3482,3483,3481,3482,3483,3484,3485,3486,3484,3485,3486,3487,3488,3489,3487,3488,3489,3490,3491,3492,3490,3491,3492,3493,3494,3495,3493,3494,3495,3496,3497,3498,3496,3497,3498,3499,3500,3501,3499,3500,3501,3502,3503,3504,3502,3503,3504,3505,3506,3507,3505,3506,3507,3508,3509,3510,3508,3509,3510,3511,3512,3513,3511,3512,3513,3514,3515,3516,3514,3515,3516,3517,3518,3519,3517,3518,3519,3520,3521,3522,3520,3521,3522,3523,3524,3525,3523,3524,3525,3526,3527,3528,3526,3527,3528,3529,3530,3531,3529,3530,3531,3532,3533,3534,3532,3533,3534,3535,3536,3537,3535,3536,3537,3538,3539,3540,3538,3539,3540,3541,3542,3543,3541,3542,3543,3544,3545,3546,3544,3545,3546,3547,3548,3549,3547,3548,3549,3550,3551,3552,3550,3551,3552,3553,3554,3555,3553,3554,3555,3556,3557,3558,3556,3557,3558,3559,3560,3561,3559,3560,3561,3562,3563,3564,3562,3563,3564,3565,3566,3567,3565,3566,3567,3568,3569,3570,3568,3569,3570,3571,3572,3573,3571,3572,3573,3574,3575,3576,3574,3575,3576,3577,3578,3579,3577,3578,3579,3580,3581,3582,3580,3581,3582,3583,3584,3585,3583,3584,3585,3586,3587,3588,3586,3587,3588,3589,3590,3591,3589,3590,3591,3592,3593,3594,3592,3593,3594,3595,3596,3597,3595,3596,3597,3598,3599,3600,3598,3599,3600,3601,3602,3603,3601,3602,3603,3604,3605,3606,3604,3605,3606,3607,3608,3609,3607,3608,3609,3610,3611,3612,3610,3611,3612,3613,3614,3615,3613,3614,3615,3616,3617,3618,3616,3617,3618],"blackstone_slab":[273,273,274,274,1,1],"polished_blackstone":1,"polished_blackstone_bricks":1,"cracked_polished_blackstone_bricks":1,"chiseled_polished_blackstone":1,"polished_blackstone_brick_slab":[273,273,274,274,1,1],"polished_blackstone_brick_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"polished_blackstone_brick_wall":[3619,3620,3621,3619,3620,3621,0,3622,3623,0,3622,3623,3624,3625,3626,3624,3625,3626,3627,3628,3629,3627,3628,3629,3630,3631,3632,3630,3631,3632,3633,3634,3635,3633,3634,3635,3636,3637,3638,3636,3637,3638,3639,3640,3641,3639,3640,3641,3642,3643,3644,3642,3643,3644,3645,3646,3647,3645,3646,3647,3648,3649,3650,3648,3649,3650,3651,3652,3653,3651,3652,3653,3654,3655,3656,3654,3655,3656,3657,3658,3659,3657,3658,3659,3660,3661,3662,3660,3661,3662,3663,3664,3665,3663,3664,3665,3666,3667,3668,3666,3667,3668,3669,3670,3671,3669,3670,3671,3672,3673,3674,3672,3673,3674,3675,3676,3677,3675,3676,3677,3678,3679,3680,3678,3679,3680,3681,3682,3683,3681,3682,3683,3684,3685,3686,3684,3685,3686,3687,3688,3689,3687,3688,3689,3690,3691,3692,3690,3691,3692,3693,3694,3695,3693,3694,3695,3696,3697,3698,3696,3697,3698,3699,3700,3701,3699,3700,3701,3702,3703,3704,3702,3703,3704,3705,3706,3707,3705,3706,3707,3708,3709,3710,3708,3709,3710,3711,3712,3713,3711,3712,3713,3714,3715,3716,3714,3715,3716,3717,3718,3719,3717,3718,3719,3720,3721,3722,3720,3721,3722,3723,3724,3725,3723,3724,3725,3726,3727,3728,3726,3727,3728,3729,3730,3731,3729,3730,3731,3732,3733,3734,3732,3733,3734,3735,3736,3737,3735,3736,3737,3738,3739,3740,3738,3739,3740,3741,3742,3743,3741,3742,3743,3744,3745,3746,3744,3745,3746,3747,3748,3749,3747,3748,3749,3750,3751,3752,3750,3751,3752,3753,3754,3755,3753,3754,3755,3756,3757,3758,3756,3757,3758,3759,3760,3761,3759,3760,3761,3762,3763,3764,3762,3763,3764,3765,3766,3767,3765,3766,3767,3768,3769,3770,3768,3769,3770,3771,3772,3773,3771,3772,3773,3774,3775,3776,3774,3775,3776,3777,3778,3779,3777,3778,3779],"gilded_blackstone":1,"polished_blackstone_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"polished_blackstone_slab":[273,273,274,274,1,1],"polished_blackstone_pressure_plate":0,"polished_blackstone_button":0,"polished_blackstone_wall":[3780,3781,3782,3780,3781,3782,0,3783,3784,0,3783,3784,3785,3786,3787,3785,3786,3787,3788,3789,3790,3788,3789,3790,3791,3792,3793,3791,3792,3793,3794,3795,3796,3794,3795,3796,3797,3798,3799,3797,3798,3799,3800,3801,3802,3800,3801,3802,3803,3804,3805,3803,3804,3805,3806,3807,3808,3806,3807,3808,3809,3810,3811,3809,3810,3811,3812,3813,3814,3812,3813,3814,3815,3816,3817,3815,3816,3817,3818,3819,3820,3818,3819,3820,3821,3822,3823,3821,3822,3823,3824,3825,3826,3824,3825,3826,3827,3828,3829,3827,3828,3829,3830,3831,3832,3830,3831,3832,3833,3834,3835,3833,3834,3835,3836,3837,3838,3836,3837,3838,3839,3840,3841,3839,3840,3841,3842,3843,3844,3842,3843,3844,3845,3846,3847,3845,3846,3847,3848,3849,3850,3848,3849,3850,3851,3852,3853,3851,3852,3853,3854,3855,3856,3854,3855,3856,3857,3858,3859,3857,3858,3859,3860,3861,3862,3860,3861,3862,3863,3864,3865,3863,3864,3865,3866,3867,3868,3866,3867,3868,3869,3870,3871,3869,3870,3871,3872,3873,3874,3872,3873,3874,3875,3876,3877,3875,3876,3877,3878,3879,3880,3878,3879,3880,3881,3882,3883,3881,3882,3883,3884,3885,3886,3884,3885,3886,3887,3888,3889,3887,3888,3889,3890,3891,3892,3890,3891,3892,3893,3894,3895,3893,3894,3895,3896,3897,3898,3896,3897,3898,3899,3900,3901,3899,3900,3901,3902,3903,3904,3902,3903,3904,3905,3906,3907,3905,3906,3907,3908,3909,3910,3908,3909,3910,3911,3912,3913,3911,3912,3913,3914,3915,3916,3914,3915,3916,3917,3918,3919,3917,3918,3919,3920,3921,3922,3920,3921,3922,3923,3924,3925,3923,3924,3925,3926,3927,3928,3926,3927,3928,3929,3930,3931,3929,3930,3931,3932,3933,3934,3932,3933,3934,3935,3936,3937,3935,3936,3937,3938,3939,3940,3938,3939,3940],"chiseled_nether_bricks":1,"cracked_nether_bricks":1,"quartz_bricks":1,"candle":[3941,3941,3941,3941,3942,3942,3942,3942,3943,3943,3943,3943,3944,3944,3944,3944],"white_candle":[3941,3941,3941,3941,3942,3942,3942,3942,3943,3943,3943,3943,3944,3944,3944,3944],"orange_candle":[3941,3941,3941,3941,3942,3942,3942,3942,3943,3943,3943,3943,3944,3944,3944,3944],"magenta_candle":[3941,3941,3941,3941,3942,3942,3942,3942,3943,3943,3943,3943,3944,3944,3944,3944],"light_blue_candle":[3941,3941,3941,3941,3942,3942,3942,3942,3943,3943,3943,3943,3944,3944,3944,3944],"yellow_candle":[3941,3941,3941,3941,3942,3942,3942,3942,3943,3943,3943,3943,3944,3944,3944,3944],"lime_candle":[3941,3941,3941,3941,3942,3942,3942,3942,3943,3943,3943,3943,3944,3944,3944,3944],"pink_candle":[3941,3941,3941,3941,3942,3942,3942,3942,3943,3943,3943,3943,3944,3944,3944,3944],"gray_candle":[3941,3941,3941,3941,3942,3942,3942,3942,3943,3943,3943,3943,3944,3944,3944,3944],"light_gray_candle":[3941,3941,3941,3941,3942,3942,3942,3942,3943,3943,3943,3943,3944,3944,3944,3944],"cyan_candle":[3941,3941,3941,3941,3942,3942,3942,3942,3943,3943,3943,3943,3944,3944,3944,3944],"purple_candle":[3941,3941,3941,3941,3942,3942,3942,3942,3943,3943,3943,3943,3944,3944,3944,3944],"blue_candle":[3941,3941,3941,3941,3942,3942,3942,3942,3943,3943,3943,3943,3944,3944,3944,3944],"brown_candle":[3941,3941,3941,3941,3942,3942,3942,3942,3943,3943,3943,3943,3944,3944,3944,3944],"green_candle":[3941,3941,3941,3941,3942,3942,3942,3942,3943,3943,3943,3943,3944,3944,3944,3944],"red_candle":[3941,3941,3941,3941,3942,3942,3942,3942,3943,3943,3943,3943,3944,3944,3944,3944],"black_candle":[3941,3941,3941,3941,3942,3942,3942,3942,3943,3943,3943,3943,3944,3944,3944,3944],"candle_cake":3945,"white_candle_cake":3945,"orange_candle_cake":3945,"magenta_candle_cake":3945,"light_blue_candle_cake":3945,"yellow_candle_cake":3945,"lime_candle_cake":3945,"pink_candle_cake":3945,"gray_candle_cake":3945,"light_gray_candle_cake":3945,"cyan_candle_cake":3945,"purple_candle_cake":3945,"blue_candle_cake":3945,"brown_candle_cake":3945,"green_candle_cake":3945,"red_candle_cake":3945,"black_candle_cake":3945,"amethyst_block":1,"budding_amethyst":1,"amethyst_cluster":[3946,3946,3947,3947,3948,3948,3949,3949,3950,3950,3951,3951],"large_amethyst_bud":[3952,3952,3953,3953,3954,3954,3955,3955,3956,3956,3957,3957],"medium_amethyst_bud":[3958,3958,3959,3959,3960,3960,3961,3961,3962,3962,3963,3963],"small_amethyst_bud":[3964,3964,3965,3965,3966,3966,3967,3967,3968,3968,3969,3969],"tuff":1,"tuff_slab":[273,273,274,274,1,1],"tuff_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"tuff_wall":[3970,3971,3972,3970,3971,3972,0,3973,3974,0,3973,3974,3975,3976,3977,3975,3976,3977,3978,3979,3980,3978,3979,3980,3981,3982,3983,3981,3982,3983,3984,3985,3986,3984,3985,3986,3987,3988,3989,3987,3988,3989,3990,3991,3992,3990,3991,3992,3993,3994,3995,3993,3994,3995,3996,3997,3998,3996,3997,3998,3999,4000,4001,3999,4000,4001,4002,4003,4004,4002,4003,4004,4005,4006,4007,4005,4006,4007,4008,4009,4010,4008,4009,4010,4011,4012,4013,4011,4012,4013,4014,4015,4016,4014,4015,4016,4017,4018,4019,4017,4018,4019,4020,4021,4022,4020,4021,4022,4023,4024,4025,4023,4024,4025,4026,4027,4028,4026,4027,4028,4029,4030,4031,4029,4030,4031,4032,4033,4034,4032,4033,4034,4035,4036,4037,4035,4036,4037,4038,4039,4040,4038,4039,4040,4041,4042,4043,4041,4042,4043,4044,4045,4046,4044,4045,4046,4047,4048,4049,4047,4048,4049,4050,4051,4052,4050,4051,4052,4053,4054,4055,4053,4054,4055,4056,4057,4058,4056,4057,4058,4059,4060,4061,4059,4060,4061,4062,4063,4064,4062,4063,4064,4065,4066,4067,4065,4066,4067,4068,4069,4070,4068,4069,4070,4071,4072,4073,4071,4072,4073,4074,4075,4076,4074,4075,4076,4077,4078,4079,4077,4078,4079,4080,4081,4082,4080,4081,4082,4083,4084,4085,4083,4084,4085,4086,4087,4088,4086,4087,4088,4089,4090,4091,4089,4090,4091,4092,4093,4094,4092,4093,4094,4095,4096,4097,4095,4096,4097,4098,4099,4100,4098,4099,4100,4101,4102,4103,4101,4102,4103,4104,4105,4106,4104,4105,4106,4107,4108,4109,4107,4108,4109,4110,4111,4112,4110,4111,4112,4113,4114,4115,4113,4114,4115,4116,4117,4118,4116,4117,4118,4119,4120,4121,4119,4120,4121,4122,4123,4124,4122,4123,4124,4125,4126,4127,4125,4126,4127,4128,4129,4130,4128,4129,4130],"polished_tuff":1,"polished_tuff_slab":[273,273,274,274,1,1],"polished_tuff_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"polished_tuff_wall":[4131,4132,4133,4131,4132,4133,0,4134,4135,0,4134,4135,4136,4137,4138,4136,4137,4138,4139,4140,4141,4139,4140,4141,4142,4143,4144,4142,4143,4144,4145,4146,4147,4145,4146,4147,4148,4149,4150,4148,4149,4150,4151,4152,4153,4151,4152,4153,4154,4155,4156,4154,4155,4156,4157,4158,4159,4157,4158,4159,4160,4161,4162,4160,4161,4162,4163,4164,4165,4163,4164,4165,4166,4167,4168,4166,4167,4168,4169,4170,4171,4169,4170,4171,4172,4173,4174,4172,4173,4174,4175,4176,4177,4175,4176,4177,4178,4179,4180,4178,4179,4180,4181,4182,4183,4181,4182,4183,4184,4185,4186,4184,4185,4186,4187,4188,4189,4187,4188,4189,4190,4191,4192,4190,4191,4192,4193,4194,4195,4193,4194,4195,4196,4197,4198,4196,4197,4198,4199,4200,4201,4199,4200,4201,4202,4203,4204,4202,4203,4204,4205,4206,4207,4205,4206,4207,4208,4209,4210,4208,4209,4210,4211,4212,4213,4211,4212,4213,4214,4215,4216,4214,4215,4216,4217,4218,4219,4217,4218,4219,4220,4221,4222,4220,4221,4222,4223,4224,4225,4223,4224,4225,4226,4227,4228,4226,4227,4228,4229,4230,4231,4229,4230,4231,4232,4233,4234,4232,4233,4234,4235,4236,4237,4235,4236,4237,4238,4239,4240,4238,4239,4240,4241,4242,4243,4241,4242,4243,4244,4245,4246,4244,4245,4246,4247,4248,4249,4247,4248,4249,4250,4251,4252,4250,4251,4252,4253,4254,4255,4253,4254,4255,4256,4257,4258,4256,4257,4258,4259,4260,4261,4259,4260,4261,4262,4263,4264,4262,4263,4264,4265,4266,4267,4265,4266,4267,4268,4269,4270,4268,4269,4270,4271,4272,4273,4271,4272,4273,4274,4275,4276,4274,4275,4276,4277,4278,4279,4277,4278,4279,4280,4281,4282,4280,4281,4282,4283,4284,4285,4283,4284,4285,4286,4287,4288,4286,4287,4288,4289,4290,4291,4289,4290,4291],"chiseled_tuff":1,"tuff_bricks":1,"tuff_brick_slab":[273,273,274,274,1,1],"tuff_brick_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"tuff_brick_wall":[4292,4293,4294,4292,4293,4294,0,4295,4296,0,4295,4296,4297,4298,4299,4297,4298,4299,4300,4301,4302,4300,4301,4302,4303,4304,4305,4303,4304,4305,4306,4307,4308,4306,4307,4308,4309,4310,4311,4309,4310,4311,4312,4313,4314,4312,4313,4314,4315,4316,4317,4315,4316,4317,4318,4319,4320,4318,4319,4320,4321,4322,4323,4321,4322,4323,4324,4325,4326,4324,4325,4326,4327,4328,4329,4327,4328,4329,4330,4331,4332,4330,4331,4332,4333,4334,4335,4333,4334,4335,4336,4337,4338,4336,4337,4338,4339,4340,4341,4339,4340,4341,4342,4343,4344,4342,4343,4344,4345,4346,4347,4345,4346,4347,4348,4349,4350,4348,4349,4350,4351,4352,4353,4351,4352,4353,4354,4355,4356,4354,4355,4356,4357,4358,4359,4357,4358,4359,4360,4361,4362,4360,4361,4362,4363,4364,4365,4363,4364,4365,4366,4367,4368,4366,4367,4368,4369,4370,4371,4369,4370,4371,4372,4373,4374,4372,4373,4374,4375,4376,4377,4375,4376,4377,4378,4379,4380,4378,4379,4380,4381,4382,4383,4381,4382,4383,4384,4385,4386,4384,4385,4386,4387,4388,4389,4387,4388,4389,4390,4391,4392,4390,4391,4392,4393,4394,4395,4393,4394,4395,4396,4397,4398,4396,4397,4398,4399,4400,4401,4399,4400,4401,4402,4403,4404,4402,4403,4404,4405,4406,4407,4405,4406,4407,4408,4409,4410,4408,4409,4410,4411,4412,4413,4411,4412,4413,4414,4415,4416,4414,4415,4416,4417,4418,4419,4417,4418,4419,4420,4421,4422,4420,4421,4422,4423,4424,4425,4423,4424,4425,4426,4427,4428,4426,4427,4428,4429,4430,4431,4429,4430,4431,4432,4433,4434,4432,4433,4434,4435,4436,4437,4435,4436,4437,4438,4439,4440,4438,4439,4440,4441,4442,4443,4441,4442,4443,4444,4445,4446,4444,4445,4446,4447,4448,4449,4447,4448,4449,4450,4451,4452,4450,4451,4452],"chiseled_tuff_bricks":1,"calcite":1,"tinted_glass":1,"powder_snow":0,"sculk_sensor":4453,"calibrated_sculk_sensor":4453,"sculk":1,"sculk_vein":0,"sculk_catalyst":1,"sculk_shrieker":4454,"copper_block":1,"exposed_copper":1,"weathered_copper":1,"oxidized_copper":1,"copper_ore":1,"deepslate_copper_ore":1,"oxidized_cut_copper":1,"weathered_cut_copper":1,"exposed_cut_copper":1,"cut_copper":1,"oxidized_chiseled_copper":1,"weathered_chiseled_copper":1,"exposed_chiseled_copper":1,"chiseled_copper":1,"waxed_oxidized_chiseled_copper":1,"waxed_weathered_chiseled_copper":1,"waxed_exposed_chiseled_copper":1,"waxed_chiseled_copper":1,"oxidized_cut_copper_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"weathered_cut_copper_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"exposed_cut_copper_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"cut_copper_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"oxidized_cut_copper_slab":[273,273,274,274,1,1],"weathered_cut_copper_slab":[273,273,274,274,1,1],"exposed_cut_copper_slab":[273,273,274,274,1,1],"cut_copper_slab":[273,273,274,274,1,1],"waxed_copper_block":1,"waxed_weathered_copper":1,"waxed_exposed_copper":1,"waxed_oxidized_copper":1,"waxed_oxidized_cut_copper":1,"waxed_weathered_cut_copper":1,"waxed_exposed_cut_copper":1,"waxed_cut_copper":1,"waxed_oxidized_cut_copper_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"waxed_weathered_cut_copper_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"waxed_exposed_cut_copper_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"waxed_cut_copper_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"waxed_oxidized_cut_copper_slab":[273,273,274,274,1,1],"waxed_weathered_cut_copper_slab":[273,273,274,274,1,1],"waxed_exposed_cut_copper_slab":[273,273,274,274,1,1],"waxed_cut_copper_slab":[273,273,274,274,1,1],"copper_door":[58,58,59,59,60,60,59,59,58,58,59,59,60,60,59,59,60,60,61,61,58,58,61,61,60,60,61,61,58,58,61,61,59,59,60,60,61,61,60,60,59,59,60,60,61,61,60,60,61,61,58,58,59,59,58,58,61,61,58,58,59,59,58,58],"exposed_copper_door":[58,58,59,59,60,60,59,59,58,58,59,59,60,60,59,59,60,60,61,61,58,58,61,61,60,60,61,61,58,58,61,61,59,59,60,60,61,61,60,60,59,59,60,60,61,61,60,60,61,61,58,58,59,59,58,58,61,61,58,58,59,59,58,58],"oxidized_copper_door":[58,58,59,59,60,60,59,59,58,58,59,59,60,60,59,59,60,60,61,61,58,58,61,61,60,60,61,61,58,58,61,61,59,59,60,60,61,61,60,60,59,59,60,60,61,61,60,60,61,61,58,58,59,59,58,58,61,61,58,58,59,59,58,58],"weathered_copper_door":[58,58,59,59,60,60,59,59,58,58,59,59,60,60,59,59,60,60,61,61,58,58,61,61,60,60,61,61,58,58,61,61,59,59,60,60,61,61,60,60,59,59,60,60,61,61,60,60,61,61,58,58,59,59,58,58,61,61,58,58,59,59,58,58],"waxed_copper_door":[58,58,59,59,60,60,59,59,58,58,59,59,60,60,59,59,60,60,61,61,58,58,61,61,60,60,61,61,58,58,61,61,59,59,60,60,61,61,60,60,59,59,60,60,61,61,60,60,61,61,58,58,59,59,58,58,61,61,58,58,59,59,58,58],"waxed_exposed_copper_door":[58,58,59,59,60,60,59,59,58,58,59,59,60,60,59,59,60,60,61,61,58,58,61,61,60,60,61,61,58,58,61,61,59,59,60,60,61,61,60,60,59,59,60,60,61,61,60,60,61,61,58,58,59,59,58,58,61,61,58,58,59,59,58,58],"waxed_oxidized_copper_door":[58,58,59,59,60,60,59,59,58,58,59,59,60,60,59,59,60,60,61,61,58,58,61,61,60,60,61,61,58,58,61,61,59,59,60,60,61,61,60,60,59,59,60,60,61,61,60,60,61,61,58,58,59,59,58,58,61,61,58,58,59,59,58,58],"waxed_weathered_copper_door":[58,58,59,59,60,60,59,59,58,58,59,59,60,60,59,59,60,60,61,61,58,58,61,61,60,60,61,61,58,58,61,61,59,59,60,60,61,61,60,60,59,59,60,60,61,61,60,60,61,61,58,58,59,59,58,58,61,61,58,58,59,59,58,58],"copper_trapdoor":[101,101,101,101,102,102,102,102,101,101,101,101,103,103,103,103,104,104,104,104,102,102,102,102,104,104,104,104,103,103,103,103,105,105,105,105,102,102,102,102,105,105,105,105,103,103,103,103,106,106,106,106,102,102,102,102,106,106,106,106,103,103,103,103],"exposed_copper_trapdoor":[101,101,101,101,102,102,102,102,101,101,101,101,103,103,103,103,104,104,104,104,102,102,102,102,104,104,104,104,103,103,103,103,105,105,105,105,102,102,102,102,105,105,105,105,103,103,103,103,106,106,106,106,102,102,102,102,106,106,106,106,103,103,103,103],"oxidized_copper_trapdoor":[101,101,101,101,102,102,102,102,101,101,101,101,103,103,103,103,104,104,104,104,102,102,102,102,104,104,104,104,103,103,103,103,105,105,105,105,102,102,102,102,105,105,105,105,103,103,103,103,106,106,106,106,102,102,102,102,106,106,106,106,103,103,103,103],"weathered_copper_trapdoor":[101,101,101,101,102,102,102,102,101,101,101,101,103,103,103,103,104,104,104,104,102,102,102,102,104,104,104,104,103,103,103,103,105,105,105,105,102,102,102,102,105,105,105,105,103,103,103,103,106,106,106,106,102,102,102,102,106,106,106,106,103,103,103,103],"waxed_copper_trapdoor":[101,101,101,101,102,102,102,102,101,101,101,101,103,103,103,103,104,104,104,104,102,102,102,102,104,104,104,104,103,103,103,103,105,105,105,105,102,102,102,102,105,105,105,105,103,103,103,103,106,106,106,106,102,102,102,102,106,106,106,106,103,103,103,103],"waxed_exposed_copper_trapdoor":[101,101,101,101,102,102,102,102,101,101,101,101,103,103,103,103,104,104,104,104,102,102,102,102,104,104,104,104,103,103,103,103,105,105,105,105,102,102,102,102,105,105,105,105,103,103,103,103,106,106,106,106,102,102,102,102,106,106,106,106,103,103,103,103],"waxed_oxidized_copper_trapdoor":[101,101,101,101,102,102,102,102,101,101,101,101,103,103,103,103,104,104,104,104,102,102,102,102,104,104,104,104,103,103,103,103,105,105,105,105,102,102,102,102,105,105,105,105,103,103,103,103,106,106,106,106,102,102,102,102,106,106,106,106,103,103,103,103],"waxed_weathered_copper_trapdoor":[101,101,101,101,102,102,102,102,101,101,101,101,103,103,103,103,104,104,104,104,102,102,102,102,104,104,104,104,103,103,103,103,105,105,105,105,102,102,102,102,105,105,105,105,103,103,103,103,106,106,106,106,102,102,102,102,106,106,106,106,103,103,103,103],"copper_grate":1,"exposed_copper_grate":1,"weathered_copper_grate":1,"oxidized_copper_grate":1,"waxed_copper_grate":1,"waxed_exposed_copper_grate":1,"waxed_weathered_copper_grate":1,"waxed_oxidized_copper_grate":1,"copper_bulb":1,"exposed_copper_bulb":1,"weathered_copper_bulb":1,"oxidized_copper_bulb":1,"waxed_copper_bulb":1,"waxed_exposed_copper_bulb":1,"waxed_weathered_copper_bulb":1,"waxed_oxidized_copper_bulb":1,"copper_chest":[52,52,53,53,54,54,52,52,54,54,53,53,52,52,55,55,56,56,52,52,56,56,55,55],"exposed_copper_chest":[52,52,53,53,54,54,52,52,54,54,53,53,52,52,55,55,56,56,52,52,56,56,55,55],"weathered_copper_chest":[52,52,53,53,54,54,52,52,54,54,53,53,52,52,55,55,56,56,52,52,56,56,55,55],"oxidized_copper_chest":[52,52,53,53,54,54,52,52,54,54,53,53,52,52,55,55,56,56,52,52,56,56,55,55],"waxed_copper_chest":[52,52,53,53,54,54,52,52,54,54,53,53,52,52,55,55,56,56,52,52,56,56,55,55],"waxed_exposed_copper_chest":[52,52,53,53,54,54,52,52,54,54,53,53,52,52,55,55,56,56,52,52,56,56,55,55],"waxed_weathered_copper_chest":[52,52,53,53,54,54,52,52,54,54,53,53,52,52,55,55,56,56,52,52,56,56,55,55],"waxed_oxidized_copper_chest":[52,52,53,53,54,54,52,52,54,54,53,53,52,52,55,55,56,56,52,52,56,56,55,55],"copper_golem_statue":4455,"exposed_copper_golem_statue":4455,"weathered_copper_golem_statue":4455,"oxidized_copper_golem_statue":4455,"waxed_copper_golem_statue":4455,"waxed_exposed_copper_golem_statue":4455,"waxed_weathered_copper_golem_statue":4455,"waxed_oxidized_copper_golem_statue":4455,"lightning_rod":[1213,1213,1213,1213,1214,1214,1214,1214,1213,1213,1213,1213,1214,1214,1214,1214,1215,1215,1215,1215,1215,1215,1215,1215],"exposed_lightning_rod":[1213,1213,1213,1213,1214,1214,1214,1214,1213,1213,1213,1213,1214,1214,1214,1214,1215,1215,1215,1215,1215,1215,1215,1215],"weathered_lightning_rod":[1213,1213,1213,1213,1214,1214,1214,1214,1213,1213,1213,1213,1214,1214,1214,1214,1215,1215,1215,1215,1215,1215,1215,1215],"oxidized_lightning_rod":[1213,1213,1213,1213,1214,1214,1214,1214,1213,1213,1213,1213,1214,1214,1214,1214,1215,1215,1215,1215,1215,1215,1215,1215],"waxed_lightning_rod":[1213,1213,1213,1213,1214,1214,1214,1214,1213,1213,1213,1213,1214,1214,1214,1214,1215,1215,1215,1215,1215,1215,1215,1215],"waxed_exposed_lightning_rod":[1213,1213,1213,1213,1214,1214,1214,1214,1213,1213,1213,1213,1214,1214,1214,1214,1215,1215,1215,1215,1215,1215,1215,1215],"waxed_weathered_lightning_rod":[1213,1213,1213,1213,1214,1214,1214,1214,1213,1213,1213,1213,1214,1214,1214,1214,1215,1215,1215,1215,1215,1215,1215,1215],"waxed_oxidized_lightning_rod":[1213,1213,1213,1213,1214,1214,1214,1214,1213,1213,1213,1213,1214,1214,1214,1214,1215,1215,1215,1215,1215,1215,1215,1215],"pointed_dripstone":[4456,4457,4458,4459,4460,4461,4462,4463,4464,4465,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475],"dripstone_block":1,"cave_vines":0,"cave_vines_plant":0,"spore_blossom":0,"azalea":4476,"flowering_azalea":4476,"moss_carpet":1068,"pink_petals":0,"wildflowers":0,"leaf_litter":0,"moss_block":1,"big_dripleaf":[4477,4477,4478,4478,4479,4479,0,0,4477,4477,4478,4478,4479,4479,0,0,4477,4477,4478,4478,4479,4479,0,0,4477,4477,4478,4478,4479,4479,0,0],"big_dripleaf_stem":0,"small_dripleaf":0,"hanging_roots":0,"rooted_dirt":1,"mud":4480,"deepslate":1,"cobbled_deepslate":1,"cobbled_deepslate_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"cobbled_deepslate_slab":[273,273,274,274,1,1],"cobbled_deepslate_wall":[4481,4482,4483,4481,4482,4483,0,4484,4485,0,4484,4485,4486,4487,4488,4486,4487,4488,4489,4490,4491,4489,4490,4491,4492,4493,4494,4492,4493,4494,4495,4496,4497,4495,4496,4497,4498,4499,4500,4498,4499,4500,4501,4502,4503,4501,4502,4503,4504,4505,4506,4504,4505,4506,4507,4508,4509,4507,4508,4509,4510,4511,4512,4510,4511,4512,4513,4514,4515,4513,4514,4515,4516,4517,4518,4516,4517,4518,4519,4520,4521,4519,4520,4521,4522,4523,4524,4522,4523,4524,4525,4526,4527,4525,4526,4527,4528,4529,4530,4528,4529,4530,4531,4532,4533,4531,4532,4533,4534,4535,4536,4534,4535,4536,4537,4538,4539,4537,4538,4539,4540,4541,4542,4540,4541,4542,4543,4544,4545,4543,4544,4545,4546,4547,4548,4546,4547,4548,4549,4550,4551,4549,4550,4551,4552,4553,4554,4552,4553,4554,4555,4556,4557,4555,4556,4557,4558,4559,4560,4558,4559,4560,4561,4562,4563,4561,4562,4563,4564,4565,4566,4564,4565,4566,4567,4568,4569,4567,4568,4569,4570,4571,4572,4570,4571,4572,4573,4574,4575,4573,4574,4575,4576,4577,4578,4576,4577,4578,4579,4580,4581,4579,4580,4581,4582,4583,4584,4582,4583,4584,4585,4586,4587,4585,4586,4587,4588,4589,4590,4588,4589,4590,4591,4592,4593,4591,4592,4593,4594,4595,4596,4594,4595,4596,4597,4598,4599,4597,4598,4599,4600,4601,4602,4600,4601,4602,4603,4604,4605,4603,4604,4605,4606,4607,4608,4606,4607,4608,4609,4610,4611,4609,4610,4611,4612,4613,4614,4612,4613,4614,4615,4616,4617,4615,4616,4617,4618,4619,4620,4618,4619,4620,4621,4622,4623,4621,4622,4623,4624,4625,4626,4624,4625,4626,4627,4628,4629,4627,4628,4629,4630,4631,4632,4630,4631,4632,4633,4634,4635,4633,4634,4635,4636,4637,4638,4636,4637,4638,4639,4640,4641,4639,4640,4641],"polished_deepslate":1,"polished_deepslate_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"polished_deepslate_slab":[273,273,274,274,1,1],"polished_deepslate_wall":[4642,4643,4644,4642,4643,4644,0,4645,4646,0,4645,4646,4647,4648,4649,4647,4648,4649,4650,4651,4652,4650,4651,4652,4653,4654,4655,4653,4654,4655,4656,4657,4658,4656,4657,4658,4659,4660,4661,4659,4660,4661,4662,4663,4664,4662,4663,4664,4665,4666,4667,4665,4666,4667,4668,4669,4670,4668,4669,4670,4671,4672,4673,4671,4672,4673,4674,4675,4676,4674,4675,4676,4677,4678,4679,4677,4678,4679,4680,4681,4682,4680,4681,4682,4683,4684,4685,4683,4684,4685,4686,4687,4688,4686,4687,4688,4689,4690,4691,4689,4690,4691,4692,4693,4694,4692,4693,4694,4695,4696,4697,4695,4696,4697,4698,4699,4700,4698,4699,4700,4701,4702,4703,4701,4702,4703,4704,4705,4706,4704,4705,4706,4707,4708,4709,4707,4708,4709,4710,4711,4712,4710,4711,4712,4713,4714,4715,4713,4714,4715,4716,4717,4718,4716,4717,4718,4719,4720,4721,4719,4720,4721,4722,4723,4724,4722,4723,4724,4725,4726,4727,4725,4726,4727,4728,4729,4730,4728,4729,4730,4731,4732,4733,4731,4732,4733,4734,4735,4736,4734,4735,4736,4737,4738,4739,4737,4738,4739,4740,4741,4742,4740,4741,4742,4743,4744,4745,4743,4744,4745,4746,4747,4748,4746,4747,4748,4749,4750,4751,4749,4750,4751,4752,4753,4754,4752,4753,4754,4755,4756,4757,4755,4756,4757,4758,4759,4760,4758,4759,4760,4761,4762,4763,4761,4762,4763,4764,4765,4766,4764,4765,4766,4767,4768,4769,4767,4768,4769,4770,4771,4772,4770,4771,4772,4773,4774,4775,4773,4774,4775,4776,4777,4778,4776,4777,4778,4779,4780,4781,4779,4780,4781,4782,4783,4784,4782,4783,4784,4785,4786,4787,4785,4786,4787,4788,4789,4790,4788,4789,4790,4791,4792,4793,4791,4792,4793,4794,4795,4796,4794,4795,4796,4797,4798,4799,4797,4798,4799,4800,4801,4802,4800,4801,4802],"deepslate_tiles":1,"deepslate_tile_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"deepslate_tile_slab":[273,273,274,274,1,1],"deepslate_tile_wall":[4803,4804,4805,4803,4804,4805,0,4806,4807,0,4806,4807,4808,4809,4810,4808,4809,4810,4811,4812,4813,4811,4812,4813,4814,4815,4816,4814,4815,4816,4817,4818,4819,4817,4818,4819,4820,4821,4822,4820,4821,4822,4823,4824,4825,4823,4824,4825,4826,4827,4828,4826,4827,4828,4829,4830,4831,4829,4830,4831,4832,4833,4834,4832,4833,4834,4835,4836,4837,4835,4836,4837,4838,4839,4840,4838,4839,4840,4841,4842,4843,4841,4842,4843,4844,4845,4846,4844,4845,4846,4847,4848,4849,4847,4848,4849,4850,4851,4852,4850,4851,4852,4853,4854,4855,4853,4854,4855,4856,4857,4858,4856,4857,4858,4859,4860,4861,4859,4860,4861,4862,4863,4864,4862,4863,4864,4865,4866,4867,4865,4866,4867,4868,4869,4870,4868,4869,4870,4871,4872,4873,4871,4872,4873,4874,4875,4876,4874,4875,4876,4877,4878,4879,4877,4878,4879,4880,4881,4882,4880,4881,4882,4883,4884,4885,4883,4884,4885,4886,4887,4888,4886,4887,4888,4889,4890,4891,4889,4890,4891,4892,4893,4894,4892,4893,4894,4895,4896,4897,4895,4896,4897,4898,4899,4900,4898,4899,4900,4901,4902,4903,4901,4902,4903,4904,4905,4906,4904,4905,4906,4907,4908,4909,4907,4908,4909,4910,4911,4912,4910,4911,4912,4913,4914,4915,4913,4914,4915,4916,4917,4918,4916,4917,4918,4919,4920,4921,4919,4920,4921,4922,4923,4924,4922,4923,4924,4925,4926,4927,4925,4926,4927,4928,4929,4930,4928,4929,4930,4931,4932,4933,4931,4932,4933,4934,4935,4936,4934,4935,4936,4937,4938,4939,4937,4938,4939,4940,4941,4942,4940,4941,4942,4943,4944,4945,4943,4944,4945,4946,4947,4948,4946,4947,4948,4949,4950,4951,4949,4950,4951,4952,4953,4954,4952,4953,4954,4955,4956,4957,4955,4956,4957,4958,4959,4960,4958,4959,4960,4961,4962,4963,4961,4962,4963],"deepslate_bricks":1,"deepslate_brick_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"deepslate_brick_slab":[273,273,274,274,1,1],"deepslate_brick_wall":[4964,4965,4966,4964,4965,4966,0,4967,4968,0,4967,4968,4969,4970,4971,4969,4970,4971,4972,4973,4974,4972,4973,4974,4975,4976,4977,4975,4976,4977,4978,4979,4980,4978,4979,4980,4981,4982,4983,4981,4982,4983,4984,4985,4986,4984,4985,4986,4987,4988,4989,4987,4988,4989,4990,4991,4992,4990,4991,4992,4993,4994,4995,4993,4994,4995,4996,4997,4998,4996,4997,4998,4999,5000,5001,4999,5000,5001,5002,5003,5004,5002,5003,5004,5005,5006,5007,5005,5006,5007,5008,5009,5010,5008,5009,5010,5011,5012,5013,5011,5012,5013,5014,5015,5016,5014,5015,5016,5017,5018,5019,5017,5018,5019,5020,5021,5022,5020,5021,5022,5023,5024,5025,5023,5024,5025,5026,5027,5028,5026,5027,5028,5029,5030,5031,5029,5030,5031,5032,5033,5034,5032,5033,5034,5035,5036,5037,5035,5036,5037,5038,5039,5040,5038,5039,5040,5041,5042,5043,5041,5042,5043,5044,5045,5046,5044,5045,5046,5047,5048,5049,5047,5048,5049,5050,5051,5052,5050,5051,5052,5053,5054,5055,5053,5054,5055,5056,5057,5058,5056,5057,5058,5059,5060,5061,5059,5060,5061,5062,5063,5064,5062,5063,5064,5065,5066,5067,5065,5066,5067,5068,5069,5070,5068,5069,5070,5071,5072,5073,5071,5072,5073,5074,5075,5076,5074,5075,5076,5077,5078,5079,5077,5078,5079,5080,5081,5082,5080,5081,5082,5083,5084,5085,5083,5084,5085,5086,5087,5088,5086,5087,5088,5089,5090,5091,5089,5090,5091,5092,5093,5094,5092,5093,5094,5095,5096,5097,5095,5096,5097,5098,5099,5100,5098,5099,5100,5101,5102,5103,5101,5102,5103,5104,5105,5106,5104,5105,5106,5107,5108,5109,5107,5108,5109,5110,5111,5112,5110,5111,5112,5113,5114,5115,5113,5114,5115,5116,5117,5118,5116,5117,5118,5119,5120,5121,5119,5120,5121,5122,5123,5124,5122,5123,5124],"chiseled_deepslate":1,"cracked_deepslate_bricks":1,"cracked_deepslate_tiles":1,"infested_deepslate":1,"smooth_basalt":1,"raw_iron_block":1,"raw_copper_block":1,"raw_gold_block":1,"potted_azalea_bush":793,"potted_flowering_azalea_bush":793,"ochre_froglight":1,"verdant_froglight":1,"pearlescent_froglight":1,"frogspawn":0,"reinforced_deepslate":1,"decorated_pot":5125,"crafter":1,"trial_spawner":1,"vault":1,"heavy_core":5126,"pale_moss_block":1,"pale_moss_carpet":[5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,5127,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"pale_hanging_moss":0,"open_eyeblossom":0,"closed_eyeblossom":0,"potted_open_eyeblossom":793,"potted_closed_eyeblossom":793,"firefly_bush":0,"sulfur":1,"potent_sulfur":1,"polished_sulfur":1,"sulfur_bricks":1,"chiseled_sulfur":1,"cinnabar":1,"polished_cinnabar":1,"cinnabar_bricks":1,"chiseled_cinnabar":1,"sulfur_slab":[273,273,274,274,1,1],"polished_sulfur_slab":[273,273,274,274,1,1],"sulfur_brick_slab":[273,273,274,274,1,1],"cinnabar_slab":[273,273,274,274,1,1],"polished_cinnabar_slab":[273,273,274,274,1,1],"cinnabar_brick_slab":[273,273,274,274,1,1],"sulfur_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"polished_sulfur_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"sulfur_brick_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"cinnabar_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"polished_cinnabar_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"cinnabar_brick_stairs":[28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,40,40,29,29,42,42,31,31,49,49,45,45,34,34,47,47,36,36,50,50,30,30,39,39,32,32,41,41,51,51,35,35,44,44,37,37,46,46],"sulfur_wall":[2109,2110,2111,2109,2110,2111,0,2112,2113,0,2112,2113,2114,2115,2116,2114,2115,2116,2117,2118,2119,2117,2118,2119,2120,2121,2122,2120,2121,2122,2123,2124,2125,2123,2124,2125,2126,2127,2128,2126,2127,2128,2129,2130,2131,2129,2130,2131,2132,2133,2134,2132,2133,2134,2135,2136,2137,2135,2136,2137,2138,2139,2140,2138,2139,2140,2141,2142,2143,2141,2142,2143,2144,2145,2146,2144,2145,2146,2147,2148,2149,2147,2148,2149,2150,2151,2152,2150,2151,2152,2153,2154,2155,2153,2154,2155,2156,2157,2158,2156,2157,2158,2159,2160,2161,2159,2160,2161,2162,2163,2164,2162,2163,2164,2165,2166,2167,2165,2166,2167,2168,2169,2170,2168,2169,2170,2171,2172,2173,2171,2172,2173,2174,2175,2176,2174,2175,2176,2177,2178,2179,2177,2178,2179,2180,2181,2182,2180,2181,2182,2183,2184,2185,2183,2184,2185,2186,2187,2188,2186,2187,2188,2189,2190,2191,2189,2190,2191,2192,2193,2194,2192,2193,2194,2195,2196,2197,2195,2196,2197,2198,2199,2200,2198,2199,2200,2201,2202,2203,2201,2202,2203,2204,2205,2206,2204,2205,2206,2207,2208,2209,2207,2208,2209,2210,2211,2212,2210,2211,2212,2213,2214,2215,2213,2214,2215,2216,2217,2218,2216,2217,2218,2219,2220,2221,2219,2220,2221,2222,2223,2224,2222,2223,2224,2225,2226,2227,2225,2226,2227,2228,2229,2230,2228,2229,2230,2231,2232,2233,2231,2232,2233,2234,2235,2236,2234,2235,2236,2237,2238,2239,2237,2238,2239,2240,2241,2242,2240,2241,2242,2243,2244,2245,2243,2244,2245,2246,2247,2248,2246,2247,2248,2249,2250,2251,2249,2250,2251,2252,2253,2254,2252,2253,2254,2255,2256,2257,2255,2256,2257,2258,2259,2260,2258,2259,2260,2261,2262,2263,2261,2262,2263,2264,2265,2266,2264,2265,2266,2267,2268,2269,2267,2268,2269],"polished_sulfur_wall":[2109,2110,2111,2109,2110,2111,0,2112,2113,0,2112,2113,2114,2115,2116,2114,2115,2116,2117,2118,2119,2117,2118,2119,2120,2121,2122,2120,2121,2122,2123,2124,2125,2123,2124,2125,2126,2127,2128,2126,2127,2128,2129,2130,2131,2129,2130,2131,2132,2133,2134,2132,2133,2134,2135,2136,2137,2135,2136,2137,2138,2139,2140,2138,2139,2140,2141,2142,2143,2141,2142,2143,2144,2145,2146,2144,2145,2146,2147,2148,2149,2147,2148,2149,2150,2151,2152,2150,2151,2152,2153,2154,2155,2153,2154,2155,2156,2157,2158,2156,2157,2158,2159,2160,2161,2159,2160,2161,2162,2163,2164,2162,2163,2164,2165,2166,2167,2165,2166,2167,2168,2169,2170,2168,2169,2170,2171,2172,2173,2171,2172,2173,2174,2175,2176,2174,2175,2176,2177,2178,2179,2177,2178,2179,2180,2181,2182,2180,2181,2182,2183,2184,2185,2183,2184,2185,2186,2187,2188,2186,2187,2188,2189,2190,2191,2189,2190,2191,2192,2193,2194,2192,2193,2194,2195,2196,2197,2195,2196,2197,2198,2199,2200,2198,2199,2200,2201,2202,2203,2201,2202,2203,2204,2205,2206,2204,2205,2206,2207,2208,2209,2207,2208,2209,2210,2211,2212,2210,2211,2212,2213,2214,2215,2213,2214,2215,2216,2217,2218,2216,2217,2218,2219,2220,2221,2219,2220,2221,2222,2223,2224,2222,2223,2224,2225,2226,2227,2225,2226,2227,2228,2229,2230,2228,2229,2230,2231,2232,2233,2231,2232,2233,2234,2235,2236,2234,2235,2236,2237,2238,2239,2237,2238,2239,2240,2241,2242,2240,2241,2242,2243,2244,2245,2243,2244,2245,2246,2247,2248,2246,2247,2248,2249,2250,2251,2249,2250,2251,2252,2253,2254,2252,2253,2254,2255,2256,2257,2255,2256,2257,2258,2259,2260,2258,2259,2260,2261,2262,2263,2261,2262,2263,2264,2265,2266,2264,2265,2266,2267,2268,2269,2267,2268,2269],"sulfur_brick_wall":[2109,2110,2111,2109,2110,2111,0,2112,2113,0,2112,2113,2114,2115,2116,2114,2115,2116,2117,2118,2119,2117,2118,2119,2120,2121,2122,2120,2121,2122,2123,2124,2125,2123,2124,2125,2126,2127,2128,2126,2127,2128,2129,2130,2131,2129,2130,2131,2132,2133,2134,2132,2133,2134,2135,2136,2137,2135,2136,2137,2138,2139,2140,2138,2139,2140,2141,2142,2143,2141,2142,2143,2144,2145,2146,2144,2145,2146,2147,2148,2149,2147,2148,2149,2150,2151,2152,2150,2151,2152,2153,2154,2155,2153,2154,2155,2156,2157,2158,2156,2157,2158,2159,2160,2161,2159,2160,2161,2162,2163,2164,2162,2163,2164,2165,2166,2167,2165,2166,2167,2168,2169,2170,2168,2169,2170,2171,2172,2173,2171,2172,2173,2174,2175,2176,2174,2175,2176,2177,2178,2179,2177,2178,2179,2180,2181,2182,2180,2181,2182,2183,2184,2185,2183,2184,2185,2186,2187,2188,2186,2187,2188,2189,2190,2191,2189,2190,2191,2192,2193,2194,2192,2193,2194,2195,2196,2197,2195,2196,2197,2198,2199,2200,2198,2199,2200,2201,2202,2203,2201,2202,2203,2204,2205,2206,2204,2205,2206,2207,2208,2209,2207,2208,2209,2210,2211,2212,2210,2211,2212,2213,2214,2215,2213,2214,2215,2216,2217,2218,2216,2217,2218,2219,2220,2221,2219,2220,2221,2222,2223,2224,2222,2223,2224,2225,2226,2227,2225,2226,2227,2228,2229,2230,2228,2229,2230,2231,2232,2233,2231,2232,2233,2234,2235,2236,2234,2235,2236,2237,2238,2239,2237,2238,2239,2240,2241,2242,2240,2241,2242,2243,2244,2245,2243,2244,2245,2246,2247,2248,2246,2247,2248,2249,2250,2251,2249,2250,2251,2252,2253,2254,2252,2253,2254,2255,2256,2257,2255,2256,2257,2258,2259,2260,2258,2259,2260,2261,2262,2263,2261,2262,2263,2264,2265,2266,2264,2265,2266,2267,2268,2269,2267,2268,2269],"cinnabar_wall":[2109,2110,2111,2109,2110,2111,0,2112,2113,0,2112,2113,2114,2115,2116,2114,2115,2116,2117,2118,2119,2117,2118,2119,2120,2121,2122,2120,2121,2122,2123,2124,2125,2123,2124,2125,2126,2127,2128,2126,2127,2128,2129,2130,2131,2129,2130,2131,2132,2133,2134,2132,2133,2134,2135,2136,2137,2135,2136,2137,2138,2139,2140,2138,2139,2140,2141,2142,2143,2141,2142,2143,2144,2145,2146,2144,2145,2146,2147,2148,2149,2147,2148,2149,2150,2151,2152,2150,2151,2152,2153,2154,2155,2153,2154,2155,2156,2157,2158,2156,2157,2158,2159,2160,2161,2159,2160,2161,2162,2163,2164,2162,2163,2164,2165,2166,2167,2165,2166,2167,2168,2169,2170,2168,2169,2170,2171,2172,2173,2171,2172,2173,2174,2175,2176,2174,2175,2176,2177,2178,2179,2177,2178,2179,2180,2181,2182,2180,2181,2182,2183,2184,2185,2183,2184,2185,2186,2187,2188,2186,2187,2188,2189,2190,2191,2189,2190,2191,2192,2193,2194,2192,2193,2194,2195,2196,2197,2195,2196,2197,2198,2199,2200,2198,2199,2200,2201,2202,2203,2201,2202,2203,2204,2205,2206,2204,2205,2206,2207,2208,2209,2207,2208,2209,2210,2211,2212,2210,2211,2212,2213,2214,2215,2213,2214,2215,2216,2217,2218,2216,2217,2218,2219,2220,2221,2219,2220,2221,2222,2223,2224,2222,2223,2224,2225,2226,2227,2225,2226,2227,2228,2229,2230,2228,2229,2230,2231,2232,2233,2231,2232,2233,2234,2235,2236,2234,2235,2236,2237,2238,2239,2237,2238,2239,2240,2241,2242,2240,2241,2242,2243,2244,2245,2243,2244,2245,2246,2247,2248,2246,2247,2248,2249,2250,2251,2249,2250,2251,2252,2253,2254,2252,2253,2254,2255,2256,2257,2255,2256,2257,2258,2259,2260,2258,2259,2260,2261,2262,2263,2261,2262,2263,2264,2265,2266,2264,2265,2266,2267,2268,2269,2267,2268,2269],"polished_cinnabar_wall":[2109,2110,2111,2109,2110,2111,0,2112,2113,0,2112,2113,2114,2115,2116,2114,2115,2116,2117,2118,2119,2117,2118,2119,2120,2121,2122,2120,2121,2122,2123,2124,2125,2123,2124,2125,2126,2127,2128,2126,2127,2128,2129,2130,2131,2129,2130,2131,2132,2133,2134,2132,2133,2134,2135,2136,2137,2135,2136,2137,2138,2139,2140,2138,2139,2140,2141,2142,2143,2141,2142,2143,2144,2145,2146,2144,2145,2146,2147,2148,2149,2147,2148,2149,2150,2151,2152,2150,2151,2152,2153,2154,2155,2153,2154,2155,2156,2157,2158,2156,2157,2158,2159,2160,2161,2159,2160,2161,2162,2163,2164,2162,2163,2164,2165,2166,2167,2165,2166,2167,2168,2169,2170,2168,2169,2170,2171,2172,2173,2171,2172,2173,2174,2175,2176,2174,2175,2176,2177,2178,2179,2177,2178,2179,2180,2181,2182,2180,2181,2182,2183,2184,2185,2183,2184,2185,2186,2187,2188,2186,2187,2188,2189,2190,2191,2189,2190,2191,2192,2193,2194,2192,2193,2194,2195,2196,2197,2195,2196,2197,2198,2199,2200,2198,2199,2200,2201,2202,2203,2201,2202,2203,2204,2205,2206,2204,2205,2206,2207,2208,2209,2207,2208,2209,2210,2211,2212,2210,2211,2212,2213,2214,2215,2213,2214,2215,2216,2217,2218,2216,2217,2218,2219,2220,2221,2219,2220,2221,2222,2223,2224,2222,2223,2224,2225,2226,2227,2225,2226,2227,2228,2229,2230,2228,2229,2230,2231,2232,2233,2231,2232,2233,2234,2235,2236,2234,2235,2236,2237,2238,2239,2237,2238,2239,2240,2241,2242,2240,2241,2242,2243,2244,2245,2243,2244,2245,2246,2247,2248,2246,2247,2248,2249,2250,2251,2249,2250,2251,2252,2253,2254,2252,2253,2254,2255,2256,2257,2255,2256,2257,2258,2259,2260,2258,2259,2260,2261,2262,2263,2261,2262,2263,2264,2265,2266,2264,2265,2266,2267,2268,2269,2267,2268,2269],"cinnabar_brick_wall":[2109,2110,2111,2109,2110,2111,0,2112,2113,0,2112,2113,2114,2115,2116,2114,2115,2116,2117,2118,2119,2117,2118,2119,2120,2121,2122,2120,2121,2122,2123,2124,2125,2123,2124,2125,2126,2127,2128,2126,2127,2128,2129,2130,2131,2129,2130,2131,2132,2133,2134,2132,2133,2134,2135,2136,2137,2135,2136,2137,2138,2139,2140,2138,2139,2140,2141,2142,2143,2141,2142,2143,2144,2145,2146,2144,2145,2146,2147,2148,2149,2147,2148,2149,2150,2151,2152,2150,2151,2152,2153,2154,2155,2153,2154,2155,2156,2157,2158,2156,2157,2158,2159,2160,2161,2159,2160,2161,2162,2163,2164,2162,2163,2164,2165,2166,2167,2165,2166,2167,2168,2169,2170,2168,2169,2170,2171,2172,2173,2171,2172,2173,2174,2175,2176,2174,2175,2176,2177,2178,2179,2177,2178,2179,2180,2181,2182,2180,2181,2182,2183,2184,2185,2183,2184,2185,2186,2187,2188,2186,2187,2188,2189,2190,2191,2189,2190,2191,2192,2193,2194,2192,2193,2194,2195,2196,2197,2195,2196,2197,2198,2199,2200,2198,2199,2200,2201,2202,2203,2201,2202,2203,2204,2205,2206,2204,2205,2206,2207,2208,2209,2207,2208,2209,2210,2211,2212,2210,2211,2212,2213,2214,2215,2213,2214,2215,2216,2217,2218,2216,2217,2218,2219,2220,2221,2219,2220,2221,2222,2223,2224,2222,2223,2224,2225,2226,2227,2225,2226,2227,2228,2229,2230,2228,2229,2230,2231,2232,2233,2231,2232,2233,2234,2235,2236,2234,2235,2236,2237,2238,2239,2237,2238,2239,2240,2241,2242,2240,2241,2242,2243,2244,2245,2243,2244,2245,2246,2247,2248,2246,2247,2248,2249,2250,2251,2249,2250,2251,2252,2253,2254,2252,2253,2254,2255,2256,2257,2255,2256,2257,2258,2259,2260,2258,2259,2260,2261,2262,2263,2261,2262,2263,2264,2265,2266,2264,2265,2266,2267,2268,2269,2267,2268,2269],"sulfur_spike":[4456,4457,4458,4459,4460,4461,4462,4463,4464,4465,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475]}} \ No newline at end of file diff --git a/MinecraftClient/Physics/BlockShapes.cs b/MinecraftClient/Physics/BlockShapes.cs deleted file mode 100644 index c960913c21..0000000000 --- a/MinecraftClient/Physics/BlockShapes.cs +++ /dev/null @@ -1,243 +0,0 @@ -using System; -using System.Collections.Frozen; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text.Json; -using MinecraftClient.Mapping; -using MinecraftClient.Mapping.BlockPalettes; - -namespace MinecraftClient.Physics -{ - /// - /// Registry of block collision shapes. Maps block state IDs to collision AABBs. - /// Data sourced from PrismarineJS/minecraft-data blockCollisionShapes.json. - /// - public static class BlockShapes - { - private static readonly Aabb FullBlock = new(0, 0, 0, 1, 1, 1); - private static readonly Aabb[] FullBlockArray = { FullBlock }; - private static readonly Aabb[] EmptyArray = Array.Empty(); - - private static FrozenDictionary? stateToShape; - private static Dictionary? prismarineBlocks; - private static Dictionary? prismarineShapes; - - /// - /// Initialize the shape registry from embedded data + current palette. - /// Call once after the block palette is set. - /// - public static void Initialize() - { - LoadPrismarineData(); - BuildStateMap(); - } - - /// - /// Get collision shapes for a block state ID. - /// Returns empty array for air/passable blocks, single full-block for solid cubes, etc. - /// - public static Aabb[] GetShapes(int blockStateId) - { - if (stateToShape is not null && stateToShape.TryGetValue(blockStateId, out var shapes)) - return shapes; - return FallbackShape(blockStateId); - } - - /// - /// Get collision shapes for a Block at a specific position (state-aware) - /// - public static Aabb[] GetShapes(Block block) => GetShapes(block.BlockId); - - /// - /// Check if a block state is effectively empty (no collision) - /// - public static bool IsEmpty(int blockStateId) - { - var shapes = GetShapes(blockStateId); - return shapes.Length == 0; - } - - private static Aabb[] FallbackShape(int blockStateId) - { - Material mat = Block.Palette.FromId(blockStateId); - if (mat == Material.Air) return EmptyArray; - if (mat.IsLiquid()) return EmptyArray; - if (mat.IsSolid()) return FullBlockArray; - return EmptyArray; - } - - private static void LoadPrismarineData() - { - prismarineBlocks = new Dictionary(); - prismarineShapes = new Dictionary(); - - try - { - var assembly = Assembly.GetExecutingAssembly(); - using var stream = assembly.GetManifestResourceStream("BlockShapeData.json"); - if (stream is null) - { - ConsoleIO.WriteLineFormatted("§e[Physics] BlockShapeData.json not found as embedded resource"); - return; - } - using var doc = JsonDocument.Parse(stream); - var root = doc.RootElement; - - // Parse shapes: shapeId -> list of AABB boxes - if (root.TryGetProperty("shapes", out var shapesEl)) - { - foreach (var prop in shapesEl.EnumerateObject()) - { - if (int.TryParse(prop.Name, out int shapeId)) - { - var boxes = new List(); - foreach (var boxEl in prop.Value.EnumerateArray()) - { - var coords = new double[6]; - int idx = 0; - foreach (var c in boxEl.EnumerateArray()) - { - if (idx < 6) coords[idx++] = c.GetDouble(); - } - if (idx == 6) - boxes.Add(new Aabb(coords[0], coords[1], coords[2], coords[3], coords[4], coords[5])); - } - prismarineShapes[shapeId] = boxes.ToArray(); - } - } - } - - // Parse blocks: blockName -> shapeId (int) or list of shapeIds - if (root.TryGetProperty("blocks", out var blocksEl)) - { - foreach (var prop in blocksEl.EnumerateObject()) - { - string blockName = prop.Name; - if (prop.Value.ValueKind == JsonValueKind.Number) - { - prismarineBlocks[blockName] = prop.Value.GetInt32(); - } - else if (prop.Value.ValueKind == JsonValueKind.Array) - { - var ids = new List(); - foreach (var el in prop.Value.EnumerateArray()) - ids.Add(el.GetInt32()); - prismarineBlocks[blockName] = ids; - } - } - } - } - catch (Exception ex) - { - ConsoleIO.WriteLineFormatted($"§e[Physics] Failed to load BlockShapeData.json: {ex.Message}"); - } - } - - private static void BuildStateMap() - { - var builder = new Dictionary(); - - if (prismarineBlocks is null || prismarineShapes is null) - { - stateToShape = builder.ToFrozenDictionary(); - return; - } - - var palette = Block.Palette; - var dict = GetPaletteDict(palette); - if (dict is null) - { - stateToShape = builder.ToFrozenDictionary(); - return; - } - - // Group consecutive state IDs by Material to find state ranges per block - var materialRanges = new Dictionary>(); - int? rangeStart = null; - Material? currentMat = null; - - foreach (var kvp in dict.OrderBy(k => k.Key)) - { - if (currentMat == kvp.Value && rangeStart.HasValue && kvp.Key == (materialRanges[currentMat.Value].Last().end + 1)) - { - var ranges = materialRanges[currentMat.Value]; - ranges[ranges.Count - 1] = (ranges.Last().start, kvp.Key); - } - else - { - currentMat = kvp.Value; - if (!materialRanges.ContainsKey(currentMat.Value)) - materialRanges[currentMat.Value] = new List<(int, int)>(); - materialRanges[currentMat.Value].Add((kvp.Key, kvp.Key)); - } - } - - // Map each Material to PrismarineJS block name - foreach (var kvp in materialRanges) - { - string snakeName = MaterialToSnakeCase(kvp.Key); - if (!prismarineBlocks.TryGetValue(snakeName, out var blockShapeData)) - continue; - - int globalStateOffset = 0; - foreach (var (start, end) in kvp.Value) - { - int stateCount = end - start + 1; - - if (blockShapeData is int singleShapeId) - { - var shapes = prismarineShapes.GetValueOrDefault(singleShapeId, EmptyArray); - for (int sid = start; sid <= end; sid++) - builder[sid] = shapes; - } - else if (blockShapeData is List shapeIdList) - { - for (int i = 0; i < stateCount && (globalStateOffset + i) < shapeIdList.Count; i++) - { - int shapeId = shapeIdList[globalStateOffset + i]; - builder[start + i] = prismarineShapes.GetValueOrDefault(shapeId, EmptyArray); - } - } - globalStateOffset += stateCount; - } - } - stateToShape = builder.ToFrozenDictionary(); - } - - /// - /// Convert Material enum name (PascalCase) to snake_case block name - /// - private static string MaterialToSnakeCase(Material mat) - { - string name = mat.ToString(); - var sb = new System.Text.StringBuilder(name.Length + 5); - for (int i = 0; i < name.Length; i++) - { - char c = name[i]; - if (char.IsUpper(c) && i > 0) - sb.Append('_'); - sb.Append(char.ToLowerInvariant(c)); - } - return sb.ToString(); - } - - /// - /// Access the internal dictionary of a palette via reflection (all palettes store it the same way) - /// - private static Dictionary? GetPaletteDict(BlockPalette palette) - { - try - { - var method = palette.GetType().GetMethod("GetDict", - BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy); - return method?.Invoke(palette, null) as Dictionary; - } - catch - { - return null; - } - } - } -} diff --git a/MinecraftClient/Physics/CollisionDetector.cs b/MinecraftClient/Physics/CollisionDetector.cs deleted file mode 100644 index 0788e93b01..0000000000 --- a/MinecraftClient/Physics/CollisionDetector.cs +++ /dev/null @@ -1,204 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Mapping; - -namespace MinecraftClient.Physics -{ - /// - /// Performs AABB collision detection against the block world. - /// Mirrors Entity.collide(), collideBoundingBox(), collideWithShapes() from vanilla MC. - /// - public static class CollisionDetector - { - /// - /// Resolve movement with full collision detection including step-up. - /// This is the main entry point, equivalent to Entity.collide(Vec3). - /// - public static Vec3d Collide(World world, Aabb entityBox, Vec3d movement, bool onGround, float maxUpStep) - { - if (movement.LengthSqr() == 0.0) - return movement; - - // Collect block collision shapes in the movement path - var colliders = CollectBlockColliders(world, entityBox.ExpandTowards(movement)); - Vec3d resolved = CollideWithShapes(movement, entityBox, colliders); - - bool blockedX = movement.X != resolved.X; - bool blockedZ = movement.Z != resolved.Z; - bool blockedY = movement.Y != resolved.Y; - bool hitGroundDuringMove = blockedY && movement.Y < 0.0; - - // Step-up logic: if blocked horizontally and on ground or just landed - if (maxUpStep > 0.0f && (hitGroundDuringMove || onGround) && (blockedX || blockedZ)) - { - // Try stepping up - Aabb stepBase = hitGroundDuringMove ? entityBox.Move(0, resolved.Y, 0) : entityBox; - Aabb expanded = stepBase.ExpandTowards(movement.X, maxUpStep, movement.Z) - .ExpandTowards(0, hitGroundDuringMove ? 0 : -1.0E-5, 0); - - var stepColliders = CollectBlockColliders(world, expanded); - - // Try various step heights - float[] candidateHeights = CollectCandidateStepHeights(stepBase, stepColliders, maxUpStep, (float)resolved.Y); - - foreach (float stepY in candidateHeights) - { - Vec3d stepMovement = new Vec3d(movement.X, stepY, movement.Z); - Vec3d stepResolved = CollideWithShapes(stepMovement, stepBase, stepColliders); - - if (stepResolved.HorizontalDistanceSqr() > resolved.HorizontalDistanceSqr()) - { - double yOffset = entityBox.MinY - stepBase.MinY; - return stepResolved.Subtract(0, yOffset, 0); - } - } - } - - return resolved; - } - - /// - /// Collide movement against a list of shapes using axis-separated resolution. - /// Matches Entity.collideWithShapes() — processes axes in order of smallest movement first. - /// - private static Vec3d CollideWithShapes(Vec3d movement, Aabb entityBox, List colliders) - { - if (colliders.Count == 0) - return movement; - - Vec3d accumulated = Vec3d.Zero; - int[] axisOrder = GetAxisStepOrder(movement); - - foreach (int axis in axisOrder) - { - double dist = movement.Get(axis); - if (dist == 0.0) continue; - - double resolved = CollideAxis(axis, entityBox.Move(accumulated), colliders, dist); - accumulated = accumulated.With(axis, resolved); - } - - return accumulated; - } - - /// - /// Get axis processing order: Y first if moving down, otherwise smallest absolute movement first. - /// Vanilla uses Direction.axisStepOrder(Vec3) which returns axes sorted by absolute movement. - /// - private static int[] GetAxisStepOrder(Vec3d movement) - { - double absX = Math.Abs(movement.X); - double absY = Math.Abs(movement.Y); - double absZ = Math.Abs(movement.Z); - - if (absX > absZ) - { - if (absZ > absY) - return new[] { 1, 2, 0 }; // Y Z X - if (absX > absY) - return new[] { 1, 0, 2 }; // Y X Z - return new[] { 0, 1, 2 }; // X Y Z - } - else - { - if (absX > absY) - return new[] { 1, 0, 2 }; // Y X Z - if (absZ > absY) - return new[] { 1, 2, 0 }; // Y Z X - return new[] { 2, 1, 0 }; // Z Y X - } - } - - /// - /// Collide along a single axis against all block shapes. - /// Equivalent to Shapes.collide(axis, box, shapes, distance). - /// - private static double CollideAxis(int axis, Aabb entityBox, List colliders, double movement) - { - foreach (var collider in colliders) - { - if (Math.Abs(movement) < PhysicsConsts.CollisionEpsilon) - return 0.0; - movement = entityBox.Collide(axis, collider, movement); - } - return movement; - } - - /// - /// Collect all block collision AABBs that overlap the given search area. - /// Equivalent to BlockCollisions iterator in vanilla. - /// - public static List CollectBlockColliders(World world, Aabb searchBox) - { - var result = new List(); - - int minBX = (int)Math.Floor(searchBox.MinX - PhysicsConsts.CollisionEpsilon) - 1; - int maxBX = (int)Math.Floor(searchBox.MaxX + PhysicsConsts.CollisionEpsilon) + 1; - int minBY = (int)Math.Floor(searchBox.MinY - PhysicsConsts.CollisionEpsilon) - 1; - int maxBY = (int)Math.Floor(searchBox.MaxY + PhysicsConsts.CollisionEpsilon) + 1; - int minBZ = (int)Math.Floor(searchBox.MinZ - PhysicsConsts.CollisionEpsilon) - 1; - int maxBZ = (int)Math.Floor(searchBox.MaxZ + PhysicsConsts.CollisionEpsilon) + 1; - - for (int bx = minBX; bx <= maxBX; bx++) - { - for (int bz = minBZ; bz <= maxBZ; bz++) - { - for (int by = minBY; by <= maxBY; by++) - { - Block block = world.GetBlock(new Location(bx, by, bz)); - Aabb[] shapes = BlockShapes.GetShapes(block); - - foreach (var shape in shapes) - { - Aabb worldShape = shape.Move(bx, by, bz); - if (worldShape.Intersects(searchBox)) - result.Add(worldShape); - } - } - } - } - - return result; - } - - /// - /// Collect candidate step-up heights, matching Entity.collectCandidateStepUpHeights(). - /// Returns sorted distinct step heights between current resolved Y and maxUpStep. - /// - private static float[] CollectCandidateStepHeights(Aabb stepBase, List colliders, float maxUpStep, float currentY) - { - var heights = new SortedSet(); - - foreach (var collider in colliders) - { - float h = (float)(collider.MaxY - stepBase.MinY); - if (h > currentY && h <= maxUpStep) - heights.Add(h); - } - - if (heights.Count == 0) - return new[] { maxUpStep }; - - var result = new float[heights.Count]; - heights.CopyTo(result); - return result; - } - - /// - /// Check if a position is on ground by testing for vertical collision below. - /// - public static bool IsOnGround(World world, Aabb entityBox) - { - Aabb testBox = entityBox.ExpandTowards(0, -0.06, 0); - return CollectBlockColliders(world, testBox).Count > 0; - } - - /// - /// Check if a given position has no collision (for checking if player fits somewhere). - /// - public static bool NoCollision(World world, Aabb entityBox) - { - return CollectBlockColliders(world, entityBox).Count == 0; - } - } -} diff --git a/MinecraftClient/Physics/MovementInput.cs b/MinecraftClient/Physics/MovementInput.cs deleted file mode 100644 index f1899d579e..0000000000 --- a/MinecraftClient/Physics/MovementInput.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; - -namespace MinecraftClient.Physics -{ - /// - /// Represents movement input state, equivalent to vanilla ClientInput / KeyboardInput. - /// - public class MovementInput - { - public bool Forward; - public bool Back; - public bool Left; - public bool Right; - public bool Jump; - public bool Sneak; - public bool Sprint; - - /// - /// Get the raw input vector (xxa, zza) before rotation. - /// Forward = +zza, Back = -zza, Left = +xxa, Right = -xxa. - /// Then normalized if magnitude > 1. - /// - public (float xxa, float zza) GetMoveVector() - { - float xxa = 0; - float zza = 0; - - if (Forward) zza += 1.0f; - if (Back) zza -= 1.0f; - if (Left) xxa += 1.0f; - if (Right) xxa -= 1.0f; - - float lenSqr = xxa * xxa + zza * zza; - if (lenSqr > 1.0f) - { - float len = MathF.Sqrt(lenSqr); - xxa /= len; - zza /= len; - } - - return (xxa, zza); - } - - public void Reset() - { - Forward = false; - Back = false; - Left = false; - Right = false; - Jump = false; - Sneak = false; - Sprint = false; - } - } -} diff --git a/MinecraftClient/Physics/PhysicsConsts.cs b/MinecraftClient/Physics/PhysicsConsts.cs deleted file mode 100644 index 95cb02c1fd..0000000000 --- a/MinecraftClient/Physics/PhysicsConsts.cs +++ /dev/null @@ -1,87 +0,0 @@ -namespace MinecraftClient.Physics -{ - /// - /// All physics constants matching vanilla Minecraft 1.21.11. - /// Values sourced from Entity.java, LivingEntity.java, Player.java, LocalPlayer.java. - /// - public static class PhysicsConsts - { - // --- Player dimensions --- - public const double PlayerWidth = 0.6; - public const double PlayerHeight = 1.8; - public const double PlayerSneakHeight = 1.5; - public const double PlayerSwimHeight = 0.6; - public const double PlayerEyeHeight = 1.62; - - // --- Gravity --- - public const double DefaultGravity = 0.08; - public const double SlowFallingCap = 0.01; - - // --- Step height --- - public const float StepHeight = 0.6f; - - // --- Friction / drag --- - public const float FrictionMultiplier = 0.91f; - public const float DragY = 0.98f; - public const float InputFriction = 0.98f; - public const float GroundAccelerationFactor = 0.21600002f; // 0.216 / (f^3) - public const float AirAcceleration = 0.02f; - - // --- Default block friction --- - public const float DefaultBlockFriction = 0.6f; - public const float IceFriction = 0.98f; - public const float PackedIceFriction = 0.98f; - public const float BlueIceFriction = 0.989f; - public const float SlimeBlockFriction = 0.8f; - - // --- Speed factors --- - public const float DefaultSpeedFactor = 1.0f; - public const float SoulSandSpeedFactor = 0.4f; - public const float HoneySpeedFactor = 0.4f; - - // --- Water --- - public const float WaterSlowDown = 0.8f; - public const float WaterSprintSlowDown = 0.9f; - public const float DolphinsGraceSlowDown = 0.96f; - public const float WaterBaseSpeed = 0.02f; - public const float WaterYDamping = 0.8f; - public const float WaterFloatImpulse = 0.04f; - - // --- Lava --- - public const float LavaSpeed = 0.02f; - public const double LavaHorizontalDamping = 0.5; - public const double LavaVerticalDamping = 0.8; - - // --- Jump --- - public const float BaseJumpPower = 0.42f; - public const double SprintJumpHorizontalBoost = 0.2; - - // --- Climb --- - public const float ClimbMaxSpeed = 0.15f; - public const double ClimbWallBump = 0.2; - - // --- Velocity zeroing thresholds (from LivingEntity.aiStep) --- - public const double PlayerHorizontalVelocityThresholdSqr = 9.0E-6; // < 0.003 length - public const double NonPlayerVelocityThreshold = 0.003; - public const double VerticalVelocityThreshold = 0.003; - - // --- Collision epsilon --- - public const double CollisionEpsilon = 1.0E-7; - - // --- Position packet sending (from LocalPlayer.sendPosition) --- - public const double PositionSendThresholdSqr = 4.0E-8; // (2e-4)^2 - public const int PositionReminderInterval = 20; - - // --- Flying detection --- - public const double FloatingYThreshold = -0.03125; - - // --- Elytra --- - public const double ElytraXZDrag = 0.99; - public const double ElytraYDrag = 0.98; - - // --- Creative/spectator fly --- - public const float DefaultFlySpeed = 0.05f; - public const double FlyVerticalDamping = 0.6; - public const double FlyVerticalBoostScale = 3.0; - } -} diff --git a/MinecraftClient/Physics/PlayerPhysics.cs b/MinecraftClient/Physics/PlayerPhysics.cs deleted file mode 100644 index bf18429f46..0000000000 --- a/MinecraftClient/Physics/PlayerPhysics.cs +++ /dev/null @@ -1,579 +0,0 @@ -using System; -using MinecraftClient.Mapping; - -namespace MinecraftClient.Physics -{ - /// - /// Core physics tick engine for the player, faithfully replicating vanilla 1.21.11 physics. - /// Mirrors the combined logic of Entity.move(), LivingEntity.aiStep()/travel()/travelInAir(), - /// Player.travel(), and LocalPlayer.aiStep(). - /// - public class PlayerPhysics - { - // --- State --- - public Vec3d Position; - public Vec3d DeltaMovement; - public float Yaw; - public float Pitch; - public bool OnGround; - public bool HorizontalCollision; - public bool VerticalCollision; - public bool VerticalCollisionBelow; - public double FallDistance; - public Vec3d StuckSpeedMultiplier = Vec3d.Zero; - - // Movement input - public float Xxa; // strafe - public float Zza; // forward - public float Yya; // vertical (creative fly) - public bool Jumping; - - // Movement mode flags - public bool Sprinting; - public bool Sneaking; - public bool CreativeFlying; - public bool InWater; - public bool InLava; - public bool OnClimbable; - public bool HasSlowFalling; - public bool HasLevitation; - public int LevitationAmplifier; - - // Player dimensions - public double PlayerWidth = PhysicsConsts.PlayerWidth; - public double PlayerHeight = PhysicsConsts.PlayerHeight; - - // Anti-jump-spam - private int noJumpDelay; - - // Tick counter for position packet timing - public int TickCount; - - // Movement speed attribute (base = 0.1 for players) - public float MovementSpeed = 0.1f; - - /// - /// Get the player's bounding box at current position - /// - public Aabb GetBoundingBox() - { - return Aabb.OfSize(Position.X, Position.Y, Position.Z, PlayerWidth, PlayerHeight); - } - - /// - /// Run one physics tick. Call at 20 TPS. - /// - public void Tick(World world) - { - TickCount++; - - // Velocity threshold zeroing (LivingEntity.aiStep) - ZeroTinyVelocity(); - - // Jump handling - HandleJumping(world); - - // Build travel input - Vec3d travelInput = new(Xxa, Yya, Zza); - - // Travel (dispatches to air/water/lava/fly) - Travel(world, travelInput); - - if (noJumpDelay > 0) - noJumpDelay--; - } - - /// - /// Apply the movement input from MovementInput to xxa/zza. - /// Call before Tick() each frame. - /// - public void ApplyInput(MovementInput input) - { - var (rawXxa, rawZza) = input.GetMoveVector(); - - // Scale by INPUT_FRICTION (0.98) — this matches LocalPlayer.modifyInput - rawXxa *= PhysicsConsts.InputFriction; - rawZza *= PhysicsConsts.InputFriction; - - // Sneak slowdown - if (input.Sneak) - { - rawXxa *= 0.3f; - rawZza *= 0.3f; - } - - Xxa = rawXxa; - Zza = rawZza; - Yya = 0; - Jumping = input.Jump; - Sneaking = input.Sneak; - Sprinting = input.Sprint; - - // Creative/spectator fly vertical - if (CreativeFlying) - { - if (input.Jump) - Yya += (float)(PhysicsConsts.DefaultFlySpeed * PhysicsConsts.FlyVerticalBoostScale); - if (input.Sneak) - Yya -= (float)(PhysicsConsts.DefaultFlySpeed * PhysicsConsts.FlyVerticalBoostScale); - } - } - - private void ZeroTinyVelocity() - { - double dx = DeltaMovement.X; - double dy = DeltaMovement.Y; - double dz = DeltaMovement.Z; - - // Player-specific: zero horizontal if combined length < 0.003 - if (dx * dx + dz * dz < PhysicsConsts.PlayerHorizontalVelocityThresholdSqr) - { - dx = 0; - dz = 0; - } - if (Math.Abs(dy) < PhysicsConsts.VerticalVelocityThreshold) - dy = 0; - - DeltaMovement = new Vec3d(dx, dy, dz); - } - - private void HandleJumping(World world) - { - if (!Jumping) { noJumpDelay = 0; return; } - - if (InWater || InLava) - { - // Jump in fluid: add upward impulse - DeltaMovement = DeltaMovement.Add(0, PhysicsConsts.WaterFloatImpulse, 0); - } - else if (OnGround && noJumpDelay == 0) - { - JumpFromGround(); - noJumpDelay = 10; - } - } - - private void JumpFromGround() - { - float jumpPower = PhysicsConsts.BaseJumpPower; - if (jumpPower <= 1.0E-5f) return; - - DeltaMovement = new Vec3d( - DeltaMovement.X, - Math.Max(jumpPower, DeltaMovement.Y), - DeltaMovement.Z); - - if (Sprinting) - { - float yawRad = Yaw * (MathF.PI / 180.0f); - DeltaMovement = DeltaMovement.Add( - -MathF.Sin(yawRad) * PhysicsConsts.SprintJumpHorizontalBoost, - 0, - MathF.Cos(yawRad) * PhysicsConsts.SprintJumpHorizontalBoost); - } - } - - private void Travel(World world, Vec3d input) - { - if (InWater && !CreativeFlying) - { - TravelInWater(world, input); - } - else if (InLava && !CreativeFlying) - { - TravelInLava(world, input); - } - else - { - TravelInAir(world, input); - } - } - - /// - /// Ground/air travel — LivingEntity.travelInAir(Vec3) - /// - private void TravelInAir(World world, Vec3d input) - { - // Get block friction at feet - float blockFriction = OnGround ? GetBlockFriction(world) : 1.0f; - float f = blockFriction * PhysicsConsts.FrictionMultiplier; - - // Apply input → velocity (handleRelativeFrictionAndCalculateMovement) - float speed = GetFrictionInfluencedSpeed(blockFriction); - MoveRelative(speed, input); - - // Handle climbable - HandleOnClimbable(); - - // Execute collision - Move(world, DeltaMovement); - - Vec3d postMoveVel = DeltaMovement; - double vy = postMoveVel.Y; - - // Climbing wall bump - if ((HorizontalCollision || Jumping) && OnClimbable) - { - vy = PhysicsConsts.ClimbWallBump; - } - - // Apply gravity - if (HasLevitation) - { - vy += (0.05 * (LevitationAmplifier + 1) - vy) * 0.2; - } - else - { - vy -= GetEffectiveGravity(); - } - - // Apply drag/friction - if (CreativeFlying) - { - // Player.travel override: creative fly preserves horizontal from parent, damps Y - DeltaMovement = new Vec3d(postMoveVel.X * f, vy * PhysicsConsts.FlyVerticalDamping, postMoveVel.Z * f); - } - else - { - DeltaMovement = new Vec3d(postMoveVel.X * f, vy * PhysicsConsts.DragY, postMoveVel.Z * f); - } - - // Block speed factor (soul sand, honey, etc.) - ApplyBlockSpeedFactor(world); - } - - /// - /// Water travel — LivingEntity.travelInWater(Vec3, ...) - /// - private void TravelInWater(World world, Vec3d input) - { - float slowDown = Sprinting ? PhysicsConsts.WaterSprintSlowDown : PhysicsConsts.WaterSlowDown; - float speed = PhysicsConsts.WaterBaseSpeed; - - MoveRelative(speed, input); - Move(world, DeltaMovement); - - Vec3d vel = DeltaMovement; - - // Climbing bump in water - if (HorizontalCollision && OnClimbable) - vel = new Vec3d(vel.X, PhysicsConsts.ClimbWallBump, vel.Z); - - vel = vel.Multiply(slowDown, PhysicsConsts.WaterYDamping, slowDown); - - // Gravity adjustment in water - double gravity = GetEffectiveGravity(); - if (gravity != 0.0) - { - double adjustedY = vel.Y; - bool falling = vel.Y <= 0.0; - if (falling && Math.Abs(vel.Y - 0.005) >= PhysicsConsts.VerticalVelocityThreshold) - { - adjustedY -= gravity / 16.0; - } - - if (!OnGround) - adjustedY -= gravity / 16.0; - - vel = new Vec3d(vel.X, adjustedY, vel.Z); - } - - DeltaMovement = vel; - } - - /// - /// Lava travel — LivingEntity.travelInLava(Vec3, ...) - /// - private void TravelInLava(World world, Vec3d input) - { - MoveRelative(PhysicsConsts.LavaSpeed, input); - Move(world, DeltaMovement); - - double gravity = GetEffectiveGravity(); - Vec3d vel = DeltaMovement; - vel = vel.Multiply(PhysicsConsts.LavaHorizontalDamping, PhysicsConsts.LavaVerticalDamping, PhysicsConsts.LavaHorizontalDamping); - - if (gravity != 0.0) - { - vel = vel.Add(0, -gravity / 4.0, 0); - } - - DeltaMovement = vel; - } - - /// - /// Add input vector rotated by yaw to deltaMovement. - /// Equivalent to Entity.moveRelative(float, Vec3) + getInputVector(). - /// - private void MoveRelative(float speed, Vec3d input) - { - Vec3d rotated = GetInputVector(input, speed, Yaw); - DeltaMovement = DeltaMovement.Add(rotated); - } - - /// - /// Rotate input by yaw and scale by speed. Equivalent to Entity.getInputVector(). - /// - private static Vec3d GetInputVector(Vec3d input, float speed, float yaw) - { - double lenSqr = input.LengthSqr(); - if (lenSqr < 1.0E-7) - return Vec3d.Zero; - - Vec3d scaled = (lenSqr > 1.0 ? input.Normalize() : input).Scale(speed); - float sinYaw = MathF.Sin(yaw * (MathF.PI / 180.0f)); - float cosYaw = MathF.Cos(yaw * (MathF.PI / 180.0f)); - - return new Vec3d( - scaled.X * cosYaw - scaled.Z * sinYaw, - scaled.Y, - scaled.Z * cosYaw + scaled.X * sinYaw); - } - - /// - /// Execute movement with collision detection. - /// Equivalent to Entity.move(MoverType.SELF, delta). - /// - private void Move(World world, Vec3d movement) - { - if (StuckSpeedMultiplier.LengthSqr() > 1.0E-7) - { - movement = movement.Multiply(StuckSpeedMultiplier); - StuckSpeedMultiplier = Vec3d.Zero; - DeltaMovement = Vec3d.Zero; - } - - // Sneak edge back-off - if (Sneaking && OnGround) - movement = MaybeBackOffFromEdge(world, movement); - - Aabb box = GetBoundingBox(); - Vec3d resolved = CollisionDetector.Collide(world, box, movement, OnGround, PhysicsConsts.StepHeight); - - double resolvedLenSqr = resolved.LengthSqr(); - if (resolvedLenSqr > 1.0E-7 || movement.LengthSqr() - resolvedLenSqr < 1.0E-7) - { - // Fall distance reset via trace (simplified: reset on hitting ground) - if (FallDistance != 0.0 && resolvedLenSqr >= 1.0) - { - // Simplified: just check vertical collision - } - - Position = Position.Add(resolved); - } - - // Collision flags - bool blockedX = !MthEqual(movement.X, resolved.X); - bool blockedZ = !MthEqual(movement.Z, resolved.Z); - HorizontalCollision = blockedX || blockedZ; - VerticalCollision = movement.Y != resolved.Y; - VerticalCollisionBelow = VerticalCollision && movement.Y < 0.0; - OnGround = VerticalCollisionBelow; - - // Fall distance tracking - if (OnGround) - FallDistance = 0; - else if (resolved.Y < 0) - FallDistance -= resolved.Y; - - // Zero velocity on blocked axes - if (HorizontalCollision) - { - DeltaMovement = new Vec3d( - blockedX ? 0 : DeltaMovement.X, - DeltaMovement.Y, - blockedZ ? 0 : DeltaMovement.Z); - } - - if (VerticalCollision) - { - // Slime block bounce would go here; for now just zero Y - DeltaMovement = new Vec3d(DeltaMovement.X, 0, DeltaMovement.Z); - } - } - - /// - /// Sneak edge detection: prevent walking off edges while sneaking. - /// Equivalent to Player.maybeBackOffFromEdge(Vec3, MoverType). - /// - private Vec3d MaybeBackOffFromEdge(World world, Vec3d movement) - { - if (movement.Y > 0) return movement; - - double step = 0.05; - double dx = movement.X; - double dz = movement.Z; - Aabb box = GetBoundingBox(); - - while (dx != 0.0 && CollisionDetector.CollectBlockColliders(world, - box.Move(dx, -1.0, 0)).Count == 0) - { - dx = dx < step && dx >= -step ? 0.0 : (dx > 0.0 ? dx - step : dx + step); - } - - while (dz != 0.0 && CollisionDetector.CollectBlockColliders(world, - box.Move(0, -1.0, dz)).Count == 0) - { - dz = dz < step && dz >= -step ? 0.0 : (dz > 0.0 ? dz - step : dz + step); - } - - while (dx != 0.0 && dz != 0.0 && CollisionDetector.CollectBlockColliders(world, - box.Move(dx, -1.0, dz)).Count == 0) - { - dx = dx < step && dx >= -step ? 0.0 : (dx > 0.0 ? dx - step : dx + step); - dz = dz < step && dz >= -step ? 0.0 : (dz > 0.0 ? dz - step : dz + step); - } - - return new Vec3d(dx, movement.Y, dz); - } - - /// - /// Clamp velocity for climbable blocks. - /// Equivalent to LivingEntity.handleOnClimbable(Vec3). - /// - private void HandleOnClimbable() - { - if (!OnClimbable) return; - - FallDistance = 0; - double vx = Math.Clamp(DeltaMovement.X, -PhysicsConsts.ClimbMaxSpeed, PhysicsConsts.ClimbMaxSpeed); - double vz = Math.Clamp(DeltaMovement.Z, -PhysicsConsts.ClimbMaxSpeed, PhysicsConsts.ClimbMaxSpeed); - double vy = Math.Max(DeltaMovement.Y, -PhysicsConsts.ClimbMaxSpeed); - - // Sneaking on ladder prevents sliding down - if (vy < 0.0 && Sneaking) - vy = 0.0; - - DeltaMovement = new Vec3d(vx, vy, vz); - } - - /// - /// Get effective gravity considering slow falling effect. - /// - private double GetEffectiveGravity() - { - double gravity = PhysicsConsts.DefaultGravity; - if (HasSlowFalling && DeltaMovement.Y <= 0.0) - return Math.Min(gravity, PhysicsConsts.SlowFallingCap); - return gravity; - } - - /// - /// Get speed based on friction: ground uses attribute speed * 0.216/(f^3), air uses 0.02. - /// Equivalent to LivingEntity.getFrictionInfluencedSpeed(float). - /// - private float GetFrictionInfluencedSpeed(float friction) - { - if (OnGround) - { - return MovementSpeed * (PhysicsConsts.GroundAccelerationFactor / (friction * friction * friction)); - } - else - { - return CreativeFlying ? MovementSpeed * 0.1f : PhysicsConsts.AirAcceleration; - } - } - - /// - /// Get the friction of the block below the player's feet. - /// - private float GetBlockFriction(World world) - { - Location belowFeet = new(Position.X, Position.Y - 0.5000010, Position.Z); - Material mat = world.GetBlock(belowFeet).Type; - return GetMaterialFriction(mat); - } - - /// - /// Apply block speed factor (soul sand, honey, etc.) - /// Equivalent to Entity.getBlockSpeedFactor(). - /// - private void ApplyBlockSpeedFactor(World world) - { - Location atFeet = new(Position.X, Position.Y, Position.Z); - Material mat = world.GetBlock(atFeet).Type; - float factor = GetMaterialSpeedFactor(mat); - - if (factor == 1.0f) - { - Location belowFeet = new(Position.X, Position.Y - 0.5000010, Position.Z); - mat = world.GetBlock(belowFeet).Type; - factor = GetMaterialSpeedFactor(mat); - } - - if (factor != 1.0f) - { - DeltaMovement = DeltaMovement.Multiply(factor, 1.0, factor); - } - } - - /// - /// Get friction value for a material. Default 0.6, special blocks differ. - /// - public static float GetMaterialFriction(Material mat) - { - return mat switch - { - Material.Ice or Material.PackedIce => PhysicsConsts.IceFriction, - Material.BlueIce => PhysicsConsts.BlueIceFriction, - Material.SlimeBlock => PhysicsConsts.SlimeBlockFriction, - Material.FrostedIce => PhysicsConsts.IceFriction, - _ => PhysicsConsts.DefaultBlockFriction - }; - } - - /// - /// Get speed factor for a material. - /// - public static float GetMaterialSpeedFactor(Material mat) - { - return mat switch - { - Material.SoulSand or Material.SoulSoil => PhysicsConsts.SoulSandSpeedFactor, - Material.HoneyBlock => PhysicsConsts.HoneySpeedFactor, - _ => PhysicsConsts.DefaultSpeedFactor - }; - } - - /// - /// Update environmental state flags (in water, in lava, on climbable, etc.) - /// Call before each Tick(). - /// - public void UpdateEnvironment(World world) - { - Location feetLoc = new(Position.X, Position.Y, Position.Z); - Location headLoc = new(Position.X, Position.Y + PlayerHeight * 0.5, Position.Z); - - Material feetBlock = world.GetBlock(feetLoc).Type; - Material headBlock = world.GetBlock(headLoc).Type; - - InWater = feetBlock == Material.Water || headBlock == Material.Water - || feetBlock == Material.BubbleColumn; - InLava = feetBlock == Material.Lava || headBlock == Material.Lava; - OnClimbable = feetBlock.CanBeClimbedOn(); - } - - /// - /// Set position from server teleport / initial spawn. - /// - public void SetPosition(double x, double y, double z) - { - Position = new Vec3d(x, y, z); - } - - /// - /// Set position and reset velocity (for teleports). - /// - public void Teleport(double x, double y, double z) - { - Position = new Vec3d(x, y, z); - DeltaMovement = Vec3d.Zero; - FallDistance = 0; - } - - private static bool MthEqual(double a, double b) - { - return Math.Abs(a - b) < 1.0E-5; - } - } -} diff --git a/MinecraftClient/Physics/Vec3d.cs b/MinecraftClient/Physics/Vec3d.cs deleted file mode 100644 index bbda4331c0..0000000000 --- a/MinecraftClient/Physics/Vec3d.cs +++ /dev/null @@ -1,102 +0,0 @@ -using System; -using System.Runtime.CompilerServices; - -namespace MinecraftClient.Physics -{ - /// - /// Immutable 3D double vector, mirrors net.minecraft.world.phys.Vec3 - /// - public readonly struct Vec3d : IEquatable - { - public static readonly Vec3d Zero = new(0, 0, 0); - - public readonly double X; - public readonly double Y; - public readonly double Z; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Vec3d(double x, double y, double z) - { - X = x; - Y = y; - Z = z; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Vec3d Add(double x, double y, double z) => new(X + x, Y + y, Z + z); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Vec3d Add(Vec3d other) => new(X + other.X, Y + other.Y, Z + other.Z); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Vec3d Subtract(Vec3d other) => new(X - other.X, Y - other.Y, Z - other.Z); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Vec3d Subtract(double x, double y, double z) => new(X - x, Y - y, Z - z); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Vec3d Scale(double factor) => new(X * factor, Y * factor, Z * factor); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Vec3d Multiply(double x, double y, double z) => new(X * x, Y * y, Z * z); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Vec3d Multiply(Vec3d other) => new(X * other.X, Y * other.Y, Z * other.Z); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public double LengthSqr() => X * X + Y * Y + Z * Z; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public double Length() => Math.Sqrt(LengthSqr()); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public double HorizontalDistanceSqr() => X * X + Z * Z; - - public Vec3d Normalize() - { - double len = Length(); - return len < 1.0E-7 ? Zero : new Vec3d(X / len, Y / len, Z / len); - } - - /// - /// Get component by axis index: 0=X, 1=Y, 2=Z - /// - public double Get(int axis) => axis switch - { - 0 => X, - 1 => Y, - 2 => Z, - _ => throw new ArgumentOutOfRangeException(nameof(axis)) - }; - - /// - /// Return a new Vec3d with one axis replaced - /// - public Vec3d With(int axis, double value) => axis switch - { - 0 => new Vec3d(value, Y, Z), - 1 => new Vec3d(X, value, Z), - 2 => new Vec3d(X, Y, value), - _ => throw new ArgumentOutOfRangeException(nameof(axis)) - }; - - public bool Equals(Vec3d other) => - X == other.X && Y == other.Y && Z == other.Z; - - public override bool Equals(object? obj) => - obj is Vec3d other && Equals(other); - - public override int GetHashCode() => - HashCode.Combine(X, Y, Z); - - public override string ToString() => - $"({X:F4}, {Y:F4}, {Z:F4})"; - - public static bool operator ==(Vec3d a, Vec3d b) => a.Equals(b); - public static bool operator !=(Vec3d a, Vec3d b) => !a.Equals(b); - public static Vec3d operator +(Vec3d a, Vec3d b) => a.Add(b); - public static Vec3d operator -(Vec3d a, Vec3d b) => a.Subtract(b); - public static Vec3d operator *(Vec3d a, double s) => a.Scale(s); - public static Vec3d operator -(Vec3d a) => new(-a.X, -a.Y, -a.Z); - } -} diff --git a/MinecraftClient/Program.cs b/MinecraftClient/Program.cs deleted file mode 100644 index dcf5daaf2c..0000000000 --- a/MinecraftClient/Program.cs +++ /dev/null @@ -1,1406 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Runtime.Loader; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Mapping.BlockPalettes; -using MinecraftClient.Mapping.EntityPalettes; -using MinecraftClient.Protocol; -using MinecraftClient.Protocol.Handlers.Forge; -using MinecraftClient.Protocol.ProfileKey; -using MinecraftClient.Protocol.Session; -using MinecraftClient.Scripting; -using MinecraftClient.WinAPI; -using Sentry; -using static MinecraftClient.Settings; -using static MinecraftClient.Settings.ConsoleConfigHealper.ConsoleConfig; -using static MinecraftClient.Settings.MainConfigHelper.MainConfig.AdvancedConfig; -using static MinecraftClient.Settings.MainConfigHelper.MainConfig.GeneralConfig; - -namespace MinecraftClient -{ - /// - /// Minecraft Console Client by the MCC Team (c) 2012-2022. - /// Allows to connect to any Minecraft server, send and receive text, automated scripts. - /// This source code is released under the CDDL 1.0 License. - /// - /// - /// Typical steps to update MCC for a new Minecraft version - /// - Implement protocol changes (see Protocol18.cs) - /// - Handle new block types and states (see Material.cs) - /// - Add support for new entity types (see EntityType.cs) - /// - Add new item types for inventories (see ItemType.cs) - /// - Mark new version as handled (see ProtocolHandler.cs) - /// - Update MCHighestVersion field below (for versionning) - /// - static class Program - { - private static McClient? client; - public static string[]? startupargs; - public static CultureInfo ActualCulture = CultureInfo.CurrentCulture; - - public const string Version = MCHighestVersion; - public const string MCLowestVersion = "1.4.6"; - public const string MCHighestVersion = "26.2"; - public static readonly string? BuildInfo = null; - - private static IDisposable? _sentrySdk = null; - private static bool useMcVersionOnce = false; - private static readonly RestartCoordinator restartCoordinator = new(ExecuteRestartAsync, ReportRestartFailure); - private static long connectionAttempt; - private static readonly AttemptOwnedRoute offlinePromptRoute = new(); - private static int exitOnFailurePending; - private static string settingsIniPath = "MinecraftClient.ini"; - private static AuthenticationSelection? pendingAuthenticationSelection; - - // [SENTRY] - // Setting this string to an empty string will disable Sentry - private const string SentryDSN = ""; - - /// - /// Snapshot of all state collected before the console backend is initialized. - /// Passed to once the backend is ready. - /// - internal sealed class StartupState - { - public Settings.ConfigLoadResult ConfigResult { get; init; } - public bool NewlyGenerated { get; init; } - public bool SentryEnabled { get; init; } - } - - /// - /// The main entry point of Minecraft Console Client - /// - static void Main(string[] args) - { - // [SENTRY] Initialize Sentry SDK only if the DSN is not empty - if (SentryDSN != string.Empty) - { - _sentrySdk = SentrySdk.Init(options => - { - options.Dsn = SentryDSN; - options.AutoSessionTracking = true; - options.IsGlobalModeEnabled = true; - options.TracesSampleRate = 1.0; - options.SendDefaultPii = false; - }); - - AppDomain.CurrentDomain.UnhandledException += (sender, eventArgs) => - { - SentrySdk.CaptureException((Exception)eventArgs.ExceptionObject); - }; - } - - Task.Run(() => - { - // "ToLower" require "CultureInfo" to be initialized on first run, which can take a lot of time. - _ = "a".ToLower(); - - //Take advantage of Windows 10 / Mac / Linux UTF-8 console - if (OperatingSystem.IsWindows()) - { - // If we're on windows, check if our version is Win10 or greater. - if (OperatingSystem.IsWindowsVersionAtLeast(10)) - Console.OutputEncoding = Console.InputEncoding = Encoding.UTF8; - } - else - { - // Apply to all other operating systems. - Console.OutputEncoding = Console.InputEncoding = Encoding.UTF8; - } - - // Fix issue #2119 - Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); - }); - - ConsoleIO.LogPrefix = "§8[MCC] "; - if (args.Length >= 1 && args[^1] == "BasicIO" || args.Length >= 1 && args[^1] == "BasicIO-NoColor") - { - if (args.Length >= 1 && args[^1] == "BasicIO-NoColor") - { - ConsoleIO.BasicIO_NoColor = true; - } - ConsoleIO.BasicIO = true; - args = args.Where(o => !Object.ReferenceEquals(o, args[^1])).ToArray(); - } - - //Debug input ? - if (args.Length == 1 && args[0] == "--keyboard-debug") - { - if (!ConsoleIO.BasicIO) - { - ConsoleIO.Backend = new ClassicConsoleBackend(); - ConsoleIO.Backend.Init(); - } - ConsoleIO.WriteLine("Keyboard debug mode: Press any key to display info"); - ConsoleIO.DebugReadInput(); - } - - // --- Load config as early as possible (no printing yet) --- - Settings.ConfigLoadResult configResult; - bool newlyGenerated = false; - - if (args.Length >= 1 && File.Exists(args[0]) && Settings.ToLowerIfNeed(Path.GetExtension(args[0])) == ".ini") - { - configResult = Settings.LoadFromFile(args[0]); - settingsIniPath = args[0]; - - List args_tmp = args.ToList(); - args_tmp.RemoveAt(0); - args = args_tmp.ToArray(); - } - else if (File.Exists("MinecraftClient.ini")) - { - configResult = Settings.LoadFromFile("MinecraftClient.ini"); - } - else - { - configResult = new Settings.ConfigLoadResult { Success = true, NeedWriteDefault = true }; - newlyGenerated = true; - } - - if (configResult.NeedWriteDefault) - Config.Main.Advanced.Language = Settings.GetDefaultGameLanguage(); - - if (!Config.Main.Advanced.EnableSentry) - _sentrySdk?.Dispose(); - - var startupState = new StartupState - { - ConfigResult = configResult, - NewlyGenerated = newlyGenerated, - SentryEnabled = SentryDSN != string.Empty, - }; - - // --- Determine console mode and initialize backend --- - if (!OperatingSystem.IsWindows()) - InstallCursesNativeResolver(); - - if (!ConsoleIO.BasicIO && Config.Console.General.ConsoleMode == ConsoleModeType.tui) - { - ConsoleIO.Backend?.Shutdown(); - try - { - var tuiBackend = new Tui.TuiConsoleBackend(); - ConsoleIO.Backend = tuiBackend; - tuiBackend.RunTuiMainLoop(args, startupState); - } - catch (Exception ex) - { - HandleTuiStartupFailure(ex); - } - return; - } - - // Classic mode: init backend, then print and process startup state. - if (!ConsoleIO.BasicIO) - { - ConsoleIO.Backend = new ClassicConsoleBackend(); - ConsoleIO.Backend.Init(); - - // Config deserialization triggers OnSettingUpdate before the backend - // exists, so console-specific settings (UseVT100ColorCode, colors, etc.) - // are never applied. Re-apply them now that the backend is ready. - Config.Console.OnSettingUpdate(); - } - - if (!ProcessStartupState(startupState)) - return; - - // Wait for this issue to be fixed before enabling it: https://github.com/Consolonia/Consolonia/issues/602 - // MaybePrintClassicModeTuiRecommendation(); - - RunStartupSequence(args); - } - - /// - /// Consolonia's Unix.Terminal uses [DllImport("libcoreclr.so")] to reach - /// dlopen/dlsym on .NET Core. The library ships a - /// SetDllImportResolver that maps libcoreclr.so to the current - /// process, but it is compiled under #if NET6_0 (exact TFM match) instead - /// of NET6_0_OR_GREATER, so it is dead code when the consuming project - /// targets net8.0+. On a self-contained single-file publish the physical - /// libcoreclr.so does not exist on the search path, causing a - /// DllNotFoundException that crashes the TUI. - /// - /// We work around this by registering our own resolver before any Consolonia - /// code runs: if any assembly asks for libcoreclr.so we return - /// (IntPtr)(-1) which the runtime interprets as "the current process". - /// - private static void InstallCursesNativeResolver() - { - AssemblyLoadContext.Default.ResolvingUnmanagedDll += (assembly, libraryName) => - libraryName == "libcoreclr.so" ? (IntPtr)(-1) : IntPtr.Zero; - } - - private static void HandleTuiStartupFailure(Exception exception) - { - Config.Console.General.ConsoleMode = ConsoleModeType.classic; - WriteBackSettings(enableBackup: false); - - ConsoleIO.Backend = new ClassicConsoleBackend(); - ConsoleIO.Backend.Init(); - Config.Console.OnSettingUpdate(); - - ConsoleIO.WriteLineFormatted("§c" + Translations.mcc_tui_startup_failed); - ConsoleIO.WriteLine(exception.ToString()); - ConsoleIO.WriteLineFormatted("§e" + Translations.mcc_report_issue); - ConsoleIO.WriteLineFormatted("§e" + Translations.mcc_tui_startup_fallback_classic); - } - - /// - /// Prints the application banner and processes the startup state collected before - /// the console backend was ready. Called once from classic mode or from TUI after - /// the view is initialized. - /// - /// True if startup can continue; false if config load failed and user chose to exit. - internal static bool ProcessStartupState(StartupState state) - { - if (Config.Console.General.Display_Icon_Banner && ConsoleIO.Backend is Tui.TuiConsoleBackend tuiBanner) - { - var view = tuiBanner.GetView(); - if (view is not null) - { - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - var panel = Tui.MccBannerPanelBuilder.Build(BuildInfo); - view.AppendControlToLog(panel); - }); - } - else - { - ShowClassicBanner(); - } - } - else - { - ShowClassicBanner(); - } - - var cfg = state.ConfigResult; - - if (cfg.NeedWriteDefault) - { - WriteBackSettings(false); - - if (cfg.IsLegacyUpgrade) - { - ConsoleIO.WriteLineFormatted("§c" + Translations.mcc_use_new_config); - ConsoleIO.WriteLineFormatted("§c" + string.Format(Translations.mcc_backup_old_config, cfg.LegacyBackupPath)); - } - - if (state.NewlyGenerated) - ConsoleIO.WriteLineFormatted("§c" + Translations.mcc_settings_generated); - - ConsoleIO.WriteLine(Translations.mcc_run_with_default_settings); - - if (state.SentryEnabled) - ConsoleIO.WriteLine(Translations.mcc_sentry_logging); - } - else if (!cfg.Success) - { - ConsoleIO.WriteLineFormatted("§c" + Translations.config_load_fail); - if (cfg.ErrorMessage is not null) - ConsoleIO.WriteLine(cfg.ErrorMessage); - HandleConfigLoadFailure(); - return false; - } - else - { - WriteBackSettings(true); - - if (!Config.Main.Advanced.Language.StartsWith("en")) - ConsoleIO.WriteLine(string.Format(Translations.mcc_help_us_translate, Settings.TranslationProjectUrl)); - } - - return true; - } - - private static void ShowClassicBanner() - { - ConsoleIO.WriteLine(string.Format(Translations.mcc_banner_classic, Version, MCLowestVersion, MCHighestVersion, "Github.com/MCCTeam")); - if (BuildInfo is not null) - ConsoleIO.WriteLineFormatted("§8" + BuildInfo); - if (Config.Main.Advanced.ShowGithubStarReminder) - ConsoleIO.WriteLineFormatted("§e" + Translations.mcc_banner_star_reminder); - } - - private static void MaybePrintClassicModeTuiRecommendation() - { - if (ConsoleIO.BasicIO - || Config.Console.General.ConsoleMode != ConsoleModeType.classic - || Console.IsInputRedirected) - { - return; - } - - char cmdChar = Config.Main.Advanced.InternalCmdChar.ToChar(); - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.mcc_console_mode_tui_recommendation, cmdChar)); - } - - /// - /// Handles a failed config load by prompting the user to fix or regenerate the config file. - /// - internal static void HandleConfigLoadFailure() - { - ConsoleIO.Backend?.StopReadThread(); - string command = " "; - while (command.Length > 0) - { - ConsoleIO.WriteLine(string.Empty); - ConsoleIO.WriteLineFormatted(string.Format(Translations.mcc_invaild_config, Config.Main.Advanced.InternalCmdChar.ToLogString())); - if (ConsoleIO.Backend is Tui.TuiConsoleBackend) - ConsoleIO.WriteLineFormatted(string.Format(Translations.mcc_use_quit_to_exit, Config.Main.Advanced.InternalCmdChar.ToLogString())); - else - ConsoleIO.WriteLineFormatted(Translations.mcc_press_exit, acceptnewlines: true); - command = ConsoleIO.ReadLine().Trim(); - if (command.Length > 0) - { - if (Config.Main.Advanced.InternalCmdChar.ToChar() != ' ' - && command[0] == Config.Main.Advanced.InternalCmdChar.ToChar()) - command = command[1..]; - - if (command.StartsWith("exit") || command.StartsWith("quit")) - { - return; - } - else if (command.StartsWith("new")) - { - Config.Main.Advanced.Language = Settings.GetDefaultGameLanguage(); - WriteBackSettings(true); - ConsoleIO.WriteLineFormatted(string.Format(Translations.mcc_gen_new_config, settingsIniPath)); - return; - } - } - else - { - return; - } - } - } - - /// - /// Runs the main startup sequence: CLI argument processing, auth, and connection. - /// Called from Main() for classic/basic mode, or from TuiConsoleBackend on a - /// background thread after the Avalonia UI loop has started. - /// - internal static void RunStartupSequence(string[] args) - { - //Other command-line arguments - if (args.Length >= 1) - { - if (args.Contains("--help")) - { - Console.WriteLine("Command-Line Help:"); - Console.WriteLine("MinecraftClient.exe "); - Console.WriteLine("MinecraftClient.exe \"/mycommand\""); - Console.WriteLine("MinecraftClient.exe --setting=value [--other settings]"); - Console.WriteLine("MinecraftClient.exe --section.setting=value [--other settings]"); - Console.WriteLine("MinecraftClient.exe [--other settings]"); - return; - } - - if (args.Contains("--upgrade")) - { - UpgradeHelper.HandleBlockingUpdate(forceUpgrade: false); - return; - } - - if (args.Contains("--force-upgrade")) - { - UpgradeHelper.HandleBlockingUpdate(forceUpgrade: true); - return; - } - - if (args.Contains("--generate")) - { - string dataGenerator = ""; - string dataPath = ""; - - foreach (string argument in args) - { - if (argument.StartsWith("--") && !argument.Contains("--generate")) - { - if (!argument.Contains('=')) - throw new ArgumentException(string.Format(Translations.error_setting_argument_syntax, argument)); - - string[] argParts = argument[2..].Split('='); - string argName = argParts[0].Trim(); - string argValue = argParts[1].Replace("\"", "").Trim(); - - if (argName == "data-path") - { - Console.WriteLine(dataPath); - dataPath = argValue; - } - - if (argName == "data-generator") - { - dataGenerator = argValue; - } - } - } - - if (string.IsNullOrEmpty(dataGenerator) || !(Settings.ToLowerIfNeed(dataGenerator).Equals("entity") || Settings.ToLowerIfNeed(dataGenerator).Equals("item") || Settings.ToLowerIfNeed(dataGenerator).Equals("block"))) - { - Console.WriteLine(Translations.error_generator_invalid); - Console.WriteLine(Translations.error_usage + " MinecraftClient.exe --data-generator= --data-path=\"\""); - return; - } - - if (string.IsNullOrEmpty(dataPath)) - { - Console.WriteLine(string.Format(Translations.error_missing_argument, "--data-path")); - Console.WriteLine(Translations.error_usage + " MinecraftClient.exe --data-generator= --data-path=\"\""); - return; - } - - if (!File.Exists(dataPath)) - { - Console.WriteLine(string.Format(Translations.error_generator_path, dataPath)); - return; - } - - if (!dataPath.EndsWith(".json")) - { - Console.WriteLine(string.Format(Translations.error_generator_json, dataPath)); - return; - } - - Console.WriteLine(string.Format(Translations.mcc_generator_generating, dataGenerator, dataPath)); - - switch (dataGenerator) - { - case "entity": - EntityPaletteGenerator.GenerateEntityTypes(dataPath); - break; - - case "item": - ItemPaletteGenerator.GenerateItemType(dataPath); - break; - - case "block": - BlockPaletteGenerator.GenerateBlockPalette(dataPath); - break; - } - - Console.WriteLine(string.Format(Translations.mcc_generator_done, dataGenerator, dataPath)); - return; - } - } - - if (OperatingSystem.IsWindows() && !string.IsNullOrWhiteSpace(Config.Main.Advanced.ConsoleTitle)) - { - InternalConfig.Username = "New Window"; - Console.Title = Config.AppVar.ExpandVars(Config.Main.Advanced.ConsoleTitle); - } - - // Check for updates - UpgradeHelper.CheckUpdate(); - - // Load command-line arguments - if (args.Length >= 1) - { - try - { - Settings.LoadArguments(args); - } - catch (ArgumentException e) - { - InternalConfig.InteractiveMode = false; - HandleFailure(e.Message); - return; - } - } - - //Test line to troubleshoot invisible colors - if (Config.Logging.DebugMessages) - { - ConsoleIO.WriteLineFormatted(string.Format(Translations.debug_color_test, "[0123456789ABCDEF]: (4bit)[§00§11§22§33§44§55§66§77§88§99§aA§bB§cC§dD§eE§fF§r]")); - Random random = new(); - { // Test 8 bit color - StringBuilder sb = new(); - sb.Append("[0123456789]: (vt100 8bit)["); - for (int i = 0; i < 10; ++i) - { - sb.Append(ColorHelper.GetColorEscapeCode((byte)random.Next(255), - (byte)random.Next(255), - (byte)random.Next(255), - true, - ConsoleColorModeType.vt100_8bit)).Append(i); - } - sb.Append(ColorHelper.GetResetEscapeCode()).Append(']'); - ConsoleIO.WriteLine(string.Format(Translations.debug_color_test, sb)); - } - { // Test 24 bit color - StringBuilder sb = new(); - sb.Append("[0123456789]: (vt100 24bit)["); - for (int i = 0; i < 10; ++i) - { - sb.Append(ColorHelper.GetColorEscapeCode((byte)random.Next(255), - (byte)random.Next(255), - (byte)random.Next(255), - true, - ConsoleColorModeType.vt100_24bit)).Append(i); - } - sb.Append(ColorHelper.GetResetEscapeCode()).Append(']'); - ConsoleIO.WriteLine(string.Format(Translations.debug_color_test, sb)); - } - } - - //Load cached sessions from disk if necessary - if (Config.Main.Advanced.SessionCache == CacheType.disk) - { - bool cacheLoaded = SessionCache.InitializeDiskCache(); - if (Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted("§8" + (cacheLoaded ? Translations.debug_session_cache_ok : Translations.debug_session_cache_fail), acceptnewlines: true); - } - - // Setup exit cleaning code - ExitCleanUp.Add(() => { DoExit(); }); - - if (HasNoConfiguredLoginDetails()) - { - if (!PromptForAuthenticationSelection()) - return; - } - - //Asking the user to type in missing data such as Username and Password - bool useBrowser = Config.Main.General.AccountType == LoginType.microsoft && Config.Main.General.Method == LoginMethod.browser; - bool useDeviceCode = Config.Main.General.AccountType == LoginType.microsoft && Config.Main.General.Method == LoginMethod.mcc; - bool skipPassword = useBrowser || useDeviceCode; - if (string.IsNullOrWhiteSpace(InternalConfig.Account.Login) && !skipPassword) - { - if (!RequestLogin()) - { - HandleFailure(Translations.error_login_blocked, false, ChatBot.DisconnectReason.LoginRejected); - return; - } - } - InternalConfig.Username = InternalConfig.Account.Login; - if (string.IsNullOrWhiteSpace(InternalConfig.Account.Password) && !skipPassword && - (Config.Main.Advanced.SessionCache == CacheType.none || !SessionCache.Contains(ToLowerIfNeed(InternalConfig.Account.Login)))) - { - RequestPassword(); - } - - startupargs = args; - InitializeClient(); - } - - /// - /// Reduest user to submit password. - /// - private static void RequestPassword() - { - ConsoleIO.WriteLine(ConsoleIO.BasicIO ? string.Format(Translations.mcc_password_basic_io, InternalConfig.Account.Login) + "\n" : Translations.mcc_password_hidden); - string? password = ConsoleIO.BasicIO ? Console.ReadLine() : ConsoleIO.ReadPassword(); - if (string.IsNullOrWhiteSpace(password)) - InternalConfig.Account.Password = "-"; - else - InternalConfig.Account.Password = password; - } - - private static bool HasNoConfiguredLoginDetails() - => string.IsNullOrWhiteSpace(InternalConfig.Account.Login) - && string.IsNullOrWhiteSpace(InternalConfig.Account.Password); - - private static bool PromptForAuthenticationSelection() - { - while (true) - { - ConsoleIO.WriteLine(Translations.mcc_auth_method_prompt); - string selection = ConsoleIO.ReadLine().Trim(); - - switch (selection.ToLowerInvariant()) - { - case "1": - case "offline": - BeginAuthenticationSelection(LoginType.mojang, LoginMethod.mcc); - if (!RequestLogin()) - { - DiscardAuthenticationSelection(); - HandleFailure(Translations.error_login_blocked, false, ChatBot.DisconnectReason.LoginRejected); - return false; - } - - InternalConfig.Account.Password = "-"; - return true; - - case "2": - case "online": - case "microsoft": - BeginAuthenticationSelection(LoginType.microsoft, LoginMethod.mcc); - return true; - - case "3": - case "yggdrasil": - BeginAuthenticationSelection(LoginType.yggdrasil, LoginMethod.mcc); - if (!RequestLogin() || !RequestRequiredPassword()) - { - DiscardAuthenticationSelection(); - HandleFailure(Translations.error_login_blocked, false, ChatBot.DisconnectReason.LoginRejected); - return false; - } - - if (!RequestAuthlibServer()) - { - DiscardAuthenticationSelection(); - return false; - } - - return true; - - default: - ConsoleIO.WriteLine(Translations.mcc_auth_method_invalid); - break; - } - } - } - - private static void BeginAuthenticationSelection(LoginType accountType, LoginMethod method) - { - pendingAuthenticationSelection ??= new AuthenticationSelection( - Config.Main.General.AccountType, - Config.Main.General.Method, - Config.Main.General.AuthServerUrl); - - Config.Main.General.AccountType = accountType; - Config.Main.General.Method = method; - } - - private static bool RequestLogin() - { - ConsoleIO.WriteLine(ConsoleIO.BasicIO ? Translations.mcc_login_basic_io : Translations.mcc_login); - InternalConfig.Account.Login = ConsoleIO.ReadLine().Trim(); - return !string.IsNullOrWhiteSpace(InternalConfig.Account.Login); - } - - private static bool RequestRequiredPassword() - { - ConsoleIO.WriteLine(ConsoleIO.BasicIO ? string.Format(Translations.mcc_password_basic_io, InternalConfig.Account.Login) + "\n" : Translations.mcc_password_hidden); - string? password = ConsoleIO.BasicIO ? Console.ReadLine() : ConsoleIO.ReadPassword(); - if (string.IsNullOrWhiteSpace(password)) - return false; - - InternalConfig.Account.Password = password; - return true; - } - - private static bool RequestAuthlibServer() - { - while (true) - { - ConsoleIO.WriteLine(Translations.mcc_yggdrasil_url); - string authServerUrl = ConsoleIO.ReadLine().Trim(); - if (!Config.Main.General.TrySetAuthServerUrl(authServerUrl) - || !Config.Main.General.TryGetAuthServerUri(out Uri? authServerUri)) - { - ConsoleIO.WriteLine(Translations.mcc_yggdrasil_invalid_url); - continue; - } - - switch (ProtocolHandler.ValidateAuthlibServer(authServerUri)) - { - case ProtocolHandler.AuthlibServerValidationResult.Valid: - return true; - case ProtocolHandler.AuthlibServerValidationResult.Unreachable: - ConsoleIO.WriteLine(Translations.mcc_yggdrasil_server_unreachable); - break; - default: - ConsoleIO.WriteLine(Translations.mcc_yggdrasil_server_invalid); - break; - } - } - } - - private static void PersistAuthenticationSelection(SessionToken session) - { - if (pendingAuthenticationSelection is null) - return; - - if (string.IsNullOrWhiteSpace(InternalConfig.Account.Login)) - InternalConfig.Account.Login = session.PlayerName; - - Config.Main.General.Account = InternalConfig.Account; - WriteBackSettings(); - pendingAuthenticationSelection = null; - } - - private static void DiscardAuthenticationSelection() - { - if (pendingAuthenticationSelection is not AuthenticationSelection selection) - return; - - Config.Main.General.AccountType = selection.AccountType; - Config.Main.General.Method = selection.Method; - Config.Main.General.AuthServerUrl = selection.AuthServerUrl; - pendingAuthenticationSelection = null; - } - - private sealed record AuthenticationSelection(LoginType AccountType, LoginMethod Method, string AuthServerUrl); - - internal static long CurrentConnectionAttempt => Volatile.Read(ref connectionAttempt); - - /// - /// Start a new Client - /// - private static void InitializeClient() - { - long attempt = Interlocked.Increment(ref connectionAttempt); - - // Ensure that we use the provided Minecraft version if we can't connect automatically. - // - // useMcVersionOnce is set to true on HandleFailure() - // whenever we are unable to connect to the server and the user provides a version number. - if (!useMcVersionOnce) - InternalConfig.MinecraftVersion = Config.Main.Advanced.MinecraftVersion; - - SessionToken session = new(); - PlayerKeyPair? playerKeyPair = null; - - ProtocolHandler.LoginResult result = ProtocolHandler.LoginResult.LoginRequired; - - string loginLower = ToLowerIfNeed(InternalConfig.Account.Login); - if (InternalConfig.Account.Password == "-") - { - ConsoleIO.WriteLineFormatted("§8" + Translations.mcc_offline, acceptnewlines: true); - result = ProtocolHandler.LoginResult.Success; - session.PlayerID = "0"; - session.PlayerName = InternalConfig.Account.Login; - } - else - { - // Validate cached session or login new session. - if (Config.Main.Advanced.SessionCache != CacheType.none && SessionCache.Contains(loginLower) && Config.Main.General.AccountType != LoginType.yggdrasil) - { - session = SessionCache.Get(loginLower); - result = ProtocolHandler.GetTokenValidation(session); - if (result != ProtocolHandler.LoginResult.Success) - { - ConsoleIO.WriteLineFormatted("§8" + Translations.mcc_session_invalid, acceptnewlines: true); - // Try to refresh access token - if (!string.IsNullOrWhiteSpace(session.RefreshToken)) - { - try - { - result = ProtocolHandler.MicrosoftLoginRefresh(session.RefreshToken, out session); - } - catch (Exception ex) - { - ConsoleIO.WriteLine("Refresh access token fail: " + ex.Message); - result = ProtocolHandler.LoginResult.InvalidResponse; - } - } - - if (result != ProtocolHandler.LoginResult.Success - && string.IsNullOrWhiteSpace(InternalConfig.Account.Password) - && !(Config.Main.General.AccountType == LoginType.microsoft)) - RequestPassword(); - } - else ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.mcc_session_valid, session.PlayerName)); - } - - if (result != ProtocolHandler.LoginResult.Success) - { - ConsoleIO.WriteLine(string.Format(Translations.mcc_connecting, Config.Main.General.AccountType == LoginType.mojang ? "Minecraft.net" : (Config.Main.General.AccountType == LoginType.microsoft ? "Microsoft" : Config.Main.General.AuthServerUrl))); - result = ProtocolHandler.GetLogin(InternalConfig.Account.Login, InternalConfig.Account.Password, Config.Main.General.AccountType, out session); - } - - if (result == ProtocolHandler.LoginResult.Success) - { - PersistAuthenticationSelection(session); - loginLower = ToLowerIfNeed(InternalConfig.Account.Login); - - if (Config.Main.Advanced.SessionCache != CacheType.none) - SessionCache.Store(loginLower, session); - } - - if (result == ProtocolHandler.LoginResult.Success) - session.SessionPreCheckTask = Task.Factory.StartNew(() => session.SessionPreCheck(Config.Main.General.AccountType)); - } - - if (result == ProtocolHandler.LoginResult.Success) - PersistAuthenticationSelection(session); - - if (result == ProtocolHandler.LoginResult.Success) - { - InternalConfig.Username = session.PlayerName; - bool isRealms = false; - - if (OperatingSystem.IsWindows() && !string.IsNullOrWhiteSpace(Config.Main.Advanced.ConsoleTitle)) - Console.Title = Config.AppVar.ExpandVars(Config.Main.Advanced.ConsoleTitle); - - if (Config.Main.Advanced.PlayerHeadAsIcon && OperatingSystem.IsWindows()) - ConsoleIcon.SetPlayerIconAsync(InternalConfig.Username); - - if (Config.Logging.DebugMessages) - ConsoleIO.WriteLine(string.Format(Translations.debug_session_id, session.ID)); - - List availableWorlds = new(); - if (Config.Main.Advanced.MinecraftRealms && !String.IsNullOrEmpty(session.ID)) - availableWorlds = ProtocolHandler.RealmsListWorlds(InternalConfig.Username, session.PlayerID, session.ID); - - if (InternalConfig.ServerIP == string.Empty) - { - ConsoleIO.WriteLine(Translations.mcc_ip); - string addressInput = ConsoleIO.ReadLine(); - if (addressInput.StartsWith("realms:")) - { - if (Config.Main.Advanced.MinecraftRealms) - { - if (availableWorlds.Count == 0) - { - HandleFailure(Translations.error_realms_access_denied, false, ChatBot.DisconnectReason.LoginRejected); - return; - } - string worldId = addressInput.Split(':')[1]; - if (!availableWorlds.Contains(worldId) && int.TryParse(worldId, NumberStyles.Any, CultureInfo.CurrentCulture, out int worldIndex) && worldIndex < availableWorlds.Count) - worldId = availableWorlds[worldIndex]; - if (availableWorlds.Contains(worldId)) - { - string realmsAddress = ProtocolHandler.GetRealmsWorldServerAddress(worldId, InternalConfig.Username, session.PlayerID, session.ID); - if (realmsAddress != "") - { - addressInput = realmsAddress; - isRealms = true; - InternalConfig.MinecraftVersion = MCHighestVersion; - } - else - { - HandleFailure(Translations.error_realms_server_unavailable, false, ChatBot.DisconnectReason.LoginRejected); - return; - } - } - else - { - HandleFailure(Translations.error_realms_server_id, false, ChatBot.DisconnectReason.LoginRejected); - return; - } - } - else - { - HandleFailure(Translations.error_realms_disabled); - return; - } - } - Config.Main.SetServerIP(new MainConfigHelper.MainConfig.ServerInfoConfig(addressInput), true); - } - - ConsoleInputRouter.EnsureStarted(); - - //Get server version - int protocolversion = 0; - ForgeInfo? forgeInfo = null; - - if (InternalConfig.MinecraftVersion != "" && Settings.ToLowerIfNeed(InternalConfig.MinecraftVersion) != "auto") - { - protocolversion = ProtocolHandler.MCVer2ProtocolVersion(InternalConfig.MinecraftVersion); - - if (protocolversion != 0) - ConsoleIO.WriteLineFormatted(string.Format(Translations.mcc_use_version, InternalConfig.MinecraftVersion, protocolversion)); - else - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.mcc_unknown_version, InternalConfig.MinecraftVersion)); - - if (useMcVersionOnce) - { - useMcVersionOnce = false; - InternalConfig.MinecraftVersion = ""; - } - } - - //Retrieve server info if version is not manually set OR if need to retrieve Forge information - if (!isRealms && (protocolversion == 0 || (Config.Main.Advanced.EnableForge == ForgeConfigType.auto) || - ((Config.Main.Advanced.EnableForge == ForgeConfigType.force) && !ProtocolHandler.ProtocolMayForceForge(protocolversion)))) - { - if (protocolversion != 0) - ConsoleIO.WriteLine(Translations.mcc_forge); - else - ConsoleIO.WriteLine(Translations.mcc_retrieve); - if (!ProtocolHandler.GetServerInfo(InternalConfig.ServerIP, InternalConfig.ServerPort, ref protocolversion, ref forgeInfo)) - { - HandleFailure(Translations.error_ping, true, ChatBot.DisconnectReason.ConnectionLost); - return; - } - } - - if ((Config.Main.General.AccountType == LoginType.microsoft || Config.Main.General.AccountType == LoginType.yggdrasil) - && InternalConfig.Account.Password != "-" - && Config.Signature.LoginWithSecureProfile - && protocolversion >= 759 /* 1.19 and above */ - && !string.IsNullOrWhiteSpace(session.ID)) - { - // Load cached profile key from disk if necessary - if (Config.Main.Advanced.ProfileKeyCache == CacheType.disk) - { - bool cacheKeyLoaded = KeysCache.InitializeDiskCache(); - if (Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted("§8" + (cacheKeyLoaded ? Translations.debug_keys_cache_ok : Translations.debug_keys_cache_fail), acceptnewlines: true); - } - - if (Config.Main.Advanced.ProfileKeyCache != CacheType.none && KeysCache.Contains(loginLower)) - { - playerKeyPair = KeysCache.Get(loginLower); - if (playerKeyPair.NeedRefresh()) - ConsoleIO.WriteLineFormatted("§8" + Translations.mcc_profile_key_invalid, acceptnewlines: true); - else - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.mcc_profile_key_valid, session.PlayerName)); - } - - if (playerKeyPair is null || playerKeyPair.NeedRefresh()) - { - ConsoleIO.WriteLineFormatted(Translations.mcc_fetching_key, acceptnewlines: true); - playerKeyPair = KeyUtils.GetNewProfileKeys(session.ID, Config.Main.General.AccountType == LoginType.yggdrasil); - if (Config.Main.Advanced.ProfileKeyCache != CacheType.none && playerKeyPair is not null) - { - KeysCache.Store(loginLower, playerKeyPair); - } - } - } - - //Force-enable Forge support? - if (!isRealms && (Config.Main.Advanced.EnableForge == ForgeConfigType.force) && forgeInfo is null) - { - if (ProtocolHandler.ProtocolMayForceForge(protocolversion)) - { - ConsoleIO.WriteLine(Translations.mcc_forgeforce); - forgeInfo = ProtocolHandler.ProtocolForceForge(protocolversion); - } - else - { - HandleFailure(Translations.error_forgeforce, true, ChatBot.DisconnectReason.ConnectionLost); - return; - } - } - - //Proceed to server login - if (protocolversion != 0) - { - try - { - //Start the main TCP client - client = new McClient(session, playerKeyPair, InternalConfig.ServerIP, InternalConfig.ServerPort, protocolversion, forgeInfo, attempt); - - //Update console title - if (OperatingSystem.IsWindows() && !string.IsNullOrWhiteSpace(Config.Main.Advanced.ConsoleTitle)) - Console.Title = Config.AppVar.ExpandVars(Config.Main.Advanced.ConsoleTitle); - } - catch (NotSupportedException) - { - HandleFailure(Translations.error_unsupported, true); - } - catch (NotImplementedException) - { - throw; - } - catch (Exception e) - { - // [SENTRY] - SentrySdk.CaptureException(e); - - ConsoleIO.WriteLine(e.Message); - ConsoleIO.WriteLine(e.StackTrace ?? ""); - HandleFailure(); // Other error - } - } - else HandleFailure(Translations.error_determine, true); - } - else - { - DiscardAuthenticationSelection(); - string failureMessage = Translations.error_login; - string failureReason = result switch - { -#pragma warning disable format // @formatter:off - ProtocolHandler.LoginResult.AccountMigrated => Translations.error_login_migrated, - ProtocolHandler.LoginResult.ServiceUnavailable => Translations.error_login_server, - ProtocolHandler.LoginResult.WrongPassword => Translations.error_login_blocked, - ProtocolHandler.LoginResult.InvalidResponse => Translations.error_login_response, - ProtocolHandler.LoginResult.NotPremium => Translations.error_login_premium, - ProtocolHandler.LoginResult.OtherError => Translations.error_login_network, - ProtocolHandler.LoginResult.SSLError => Translations.error_login_ssl, - ProtocolHandler.LoginResult.UserCancel => Translations.error_login_cancel, - ProtocolHandler.LoginResult.WrongSelection => Translations.error_login_blocked, - _ => Translations.error_login_unknown, -#pragma warning restore format // @formatter:on - }; - failureMessage += failureReason; - HandleFailure(failureMessage, false, ChatBot.DisconnectReason.LoginRejected); - } - } - - /// - /// Reloads settings - /// - public static void ReloadSettings(bool keepAccountAndServerSettings = false) - { - var result = Settings.LoadFromFile(settingsIniPath, keepAccountAndServerSettings); - if (result.Success) - ConsoleIO.WriteLine(string.Format(Translations.config_load, settingsIniPath)); - } - - /// - /// Write-back settings - /// - public static void WriteBackSettings(bool enableBackup = true) - { - Settings.WriteToFile(settingsIniPath, enableBackup); - } - - /// - /// Disconnect the current client from the server and restart it - /// - /// Optional delay, in seconds, before restarting - /// Optional, keep account and server settings - public static void Restart(int delaySeconds = 0, bool keepAccountAndServerSettings = false) - { - TryRestart(TimeSpan.FromSeconds(Math.Max(0, delaySeconds)), keepAccountAndServerSettings); - } - - internal static bool HasRestartPending(long sourceConnectionAttempt) - { - return restartCoordinator.HasScheduledRestart(sourceConnectionAttempt); - } - - internal static RestartSettingsSnapshot CaptureRestartSettings() - { - return new RestartSettingsSnapshot(InternalConfig.Account, InternalConfig.ServerIP, InternalConfig.ServerPort); - } - - internal static void RestoreRestartSettings(RestartSettingsSnapshot settingsSnapshot) - { - InternalConfig.Account = settingsSnapshot.Account; - InternalConfig.ServerIP = settingsSnapshot.ServerIP; - InternalConfig.ServerPort = settingsSnapshot.ServerPort; - } - - internal static bool TryRestart(int delaySeconds = 0, bool keepAccountAndServerSettings = false) - { - return TryRestart(TimeSpan.FromSeconds(Math.Max(0, delaySeconds)), keepAccountAndServerSettings); - } - - internal static bool TryRestart(TimeSpan delay, bool keepAccountAndServerSettings = false) - { - return TryRestart(CurrentConnectionAttempt, delay, keepAccountAndServerSettings); - } - - internal static bool TryRestart( - long sourceConnectionAttempt, - TimeSpan delay, - bool keepAccountAndServerSettings = false, - bool replaceUntilCommit = false, - Task? sourceCleanupCompletion = null) - { - if (Volatile.Read(ref exitOnFailurePending) != 0) - return false; - - if (sourceConnectionAttempt != CurrentConnectionAttempt) - return false; - - if (delay < TimeSpan.Zero) - delay = TimeSpan.Zero; - - RestartSettingsSnapshot? settingsSnapshot = keepAccountAndServerSettings - ? CaptureRestartSettings() - : null; - - bool scheduled = restartCoordinator.TrySchedule( - new RestartRequest( - sourceConnectionAttempt, - delay, - keepAccountAndServerSettings, - settingsSnapshot, - replaceUntilCommit, - sourceCleanupCompletion), - () => BeginOfflinePrompt(sourceConnectionAttempt)); - return scheduled; - } - - private static async Task ExecuteRestartAsync(RestartRequest request, CancellationToken cancellationToken) - { - if (request.ConnectionAttempt != CurrentConnectionAttempt) - return; - - McClient? disconnectedClient = client; - if (disconnectedClient is not null) - { - disconnectedClient.Disconnect(); - if (ReferenceEquals(client, disconnectedClient)) - client = null; - } - - ConsoleIO.Reset(); - - if (request.Delay > TimeSpan.Zero) - { - ConsoleIO.WriteLine(string.Format(Translations.mcc_restart_delay, request.Delay.TotalSeconds)); - await Task.Delay(request.Delay, TimeProvider.System, cancellationToken).ConfigureAwait(false); - } - - cancellationToken.ThrowIfCancellationRequested(); - if (request.ConnectionAttempt != CurrentConnectionAttempt - || !restartCoordinator.TryBeginCommit(request, out RestartRequest latestRequest) - || latestRequest.ConnectionAttempt != CurrentConnectionAttempt) - { - return; - } - - ConsoleIO.WriteLine(Translations.mcc_restart); - ReloadSettings(latestRequest.KeepAccountAndServerSettings); - if (latestRequest.SettingsSnapshot is RestartSettingsSnapshot settingsSnapshot) - { - InternalConfig.Account = settingsSnapshot.Account; - InternalConfig.ServerIP = settingsSnapshot.ServerIP; - InternalConfig.ServerPort = settingsSnapshot.ServerPort; - } - TransferOfflinePrompt(latestRequest.ConnectionAttempt, latestRequest.ConnectionAttempt + 1); - InitializeClient(); - } - - private static void ReportRestartFailure(Exception exception) - { - SentrySdk.CaptureException(exception); - ConsoleIO.WriteLine(exception.ToString()); - HandleFailure(); - } - - /// - /// Marks the current failure as terminal when MCC is running under an external supervisor. - /// Further restart requests are rejected so disconnect cleanup cannot revive the process. - /// - internal static bool PrepareExitOnFailure() - { - if (InternalConfig.InteractiveMode) - return false; - - Interlocked.Exchange(ref exitOnFailurePending, 1); - restartCoordinator.Stop(); - return true; - } - - public static void DoExit(int exitcode = 0) - { - WriteBackSettings(); - ConsoleIO.WriteLineFormatted("§a" + string.Format(Translations.config_saving, settingsIniPath)); - - restartCoordinator.Stop(); - if (client is not null) { client.Disconnect(); ConsoleIO.Reset(); } - EndOfflinePrompt(); - ConsoleInputRouter.ShutdownRouter(); - if (Config.Main.Advanced.PlayerHeadAsIcon && OperatingSystem.IsWindows()) { ConsoleIcon.RevertToMCCIcon(); } - ConsoleIO.Backend?.Shutdown(); - Environment.Exit(exitcode); - } - - /// - /// Disconnect the current client from the server and exit the app - /// - public static void Exit(int exitcode = 0) - { - new Thread(() => { DoExit(exitcode); }).Start(); - } - - /// - /// Handle fatal errors such as ping failure, login failure, server disconnection, and so on. - /// Allows AutoRelog to perform on fatal errors, prompt for server version, and offline commands. - /// - /// Error message to display and optionally pass to AutoRelog bot - /// Specify if the error is related to an incompatible or unkown server version - /// If set, the error message will be processed by the AutoRelog bot - public static void HandleFailure(string? errorMessage = null, bool versionError = false, ChatBot.DisconnectReason? disconnectReason = null) - { - bool autoRelogHandled = false; - - if (!string.IsNullOrEmpty(errorMessage)) - { - ConsoleIO.Reset(); - if (!ConsoleInputRouter.IsStarted && ConsoleIO.Backend is not Tui.TuiConsoleBackend) - { - try - { - while (Console.KeyAvailable) - Console.ReadKey(true); - } - catch { } - } - ConsoleIO.WriteLine(errorMessage); - } - - if (PrepareExitOnFailure()) - { - Exit(GetFailureExitCode(disconnectReason)); - return; - } - - if (!string.IsNullOrEmpty(errorMessage) && disconnectReason.HasValue) - { - autoRelogHandled = true; - if (ChatBots.AutoRelog.OnDisconnectStatic(disconnectReason.Value, errorMessage, CurrentConnectionAttempt)) - return; - } - - if (InternalConfig.InteractiveMode) - { - if (versionError) - { - ConsoleIO.WriteLine(Translations.mcc_server_version); - InternalConfig.MinecraftVersion = ConsoleIO.ReadLine(); - if (InternalConfig.MinecraftVersion != "") - { - useMcVersionOnce = true; - Restart(0, true); - return; - } - } - - if (!autoRelogHandled && disconnectReason.HasValue) - { - if (ChatBots.AutoRelog.OnDisconnectStatic(disconnectReason.Value, errorMessage!, CurrentConnectionAttempt)) - return; - } - - BeginOfflinePrompt(CurrentConnectionAttempt); - } - } - - private static bool BeginOfflinePrompt(long connectionAttempt) - { - long currentConnectionAttempt = CurrentConnectionAttempt; - if (connectionAttempt != currentConnectionAttempt) - return false; - - if (offlinePromptRoute.TryActivate(connectionAttempt, currentConnectionAttempt, () => - { - ConsoleInputRouter.RouteOffline(HandleOfflineCommand); - ConsoleIO.WriteLine(string.Empty); - ConsoleIO.WriteLineFormatted(string.Format(Translations.mcc_disconnected, Config.Main.Advanced.InternalCmdChar.ToLogString())); - if (ConsoleIO.Backend is Tui.TuiConsoleBackend) - ConsoleIO.WriteLineFormatted(string.Format(Translations.mcc_use_quit_to_exit, Config.Main.Advanced.InternalCmdChar.ToLogString())); - else - ConsoleIO.WriteLineFormatted(Translations.mcc_press_exit, acceptnewlines: true); - })) - { - return true; - } - - return offlinePromptRoute.OwnerAttempt == connectionAttempt; - } - - private static void EndOfflinePrompt() - { - offlinePromptRoute.TryDeactivate(() => - { - ConsoleInputRouter.ClearOfflineRoute(HandleOfflineCommand); - ConsoleIO.Reset(); - }); - } - - internal static void EndOfflinePrompt(long connectionAttempt) - { - offlinePromptRoute.TryDeactivate(connectionAttempt, () => - { - ConsoleInputRouter.ClearOfflineRoute(HandleOfflineCommand); - ConsoleIO.Reset(); - }); - } - - private static void TransferOfflinePrompt(long sourceConnectionAttempt, long targetConnectionAttempt) - { - offlinePromptRoute.TryTransfer(sourceConnectionAttempt, targetConnectionAttempt); - } - - private static void HandleOfflineCommand(string input) - { - string command = input.Trim(); - if (command.Length == 0) - { - if (ConsoleIO.Backend is not Tui.TuiConsoleBackend) - Commands.Exit.DoExit(Config.AppVar.ExpandVars(command)); - return; - } - - if (Config.Main.Advanced.InternalCmdChar.ToChar() != ' ' - && command[0] == Config.Main.Advanced.InternalCmdChar.ToChar()) - { - command = command[1..]; - } - - string message = string.Empty; - if (command.StartsWith("reco", StringComparison.Ordinal)) - { - message = Commands.Reco.DoReconnect(Config.AppVar.ExpandVars(command)); - if (message.Length == 0) - return; - } - else if (command.StartsWith("connect", StringComparison.Ordinal)) - { - message = Commands.Connect.DoConnect(Config.AppVar.ExpandVars(command)); - if (message.Length == 0) - return; - } - else if (command.StartsWith("exit", StringComparison.Ordinal) - || command.StartsWith("quit", StringComparison.Ordinal)) - { - message = Commands.Exit.DoExit(Config.AppVar.ExpandVars(command)); - } - else if (command.StartsWith("help", StringComparison.Ordinal)) - { - ConsoleIO.WriteLineFormatted("§8MCC: " + - Config.Main.Advanced.InternalCmdChar.ToLogString() + - new Commands.Reco().GetCmdDescTranslated()); - ConsoleIO.WriteLineFormatted("§8MCC: " + - Config.Main.Advanced.InternalCmdChar.ToLogString() + - new Commands.Connect().GetCmdDescTranslated()); - } - else - { - ConsoleIO.WriteLineFormatted(string.Format(Translations.icmd_unknown, command.Split(' ')[0])); - } - - if (message.Length != 0) - ConsoleIO.WriteLineFormatted("§8MCC: " + message); - } - - private static int GetFailureExitCode(ChatBot.DisconnectReason? disconnectReason) - { - return disconnectReason switch - { - ChatBot.DisconnectReason.InGameKick => 2, - ChatBot.DisconnectReason.ConnectionLost => 3, - ChatBot.DisconnectReason.LoginRejected => 4, - _ => 1, - }; - } - - /// - /// Enumerate types in namespace through reflection - /// - /// Namespace to process - /// Assembly to use. Default is Assembly.GetExecutingAssembly() - /// - public static Type[] GetTypesInNamespace(string nameSpace, Assembly? assembly = null) - { - if (assembly is null) { assembly = Assembly.GetExecutingAssembly(); } - return assembly.GetTypes().Where(t => string.Equals(t.Namespace, nameSpace, StringComparison.Ordinal)).ToArray(); - } - - /// - /// Static initialization of build information, read from assembly information - /// - static Program() - { - if (typeof(Program) - .Assembly - .GetCustomAttributes(typeof(AssemblyConfigurationAttribute), false) - .FirstOrDefault() is AssemblyConfigurationAttribute attribute) - BuildInfo = attribute.Configuration; - } - } -} diff --git a/MinecraftClient/Properties/AssemblyInfo.cs b/MinecraftClient/Properties/AssemblyInfo.cs deleted file mode 100644 index 7e608e538b..0000000000 --- a/MinecraftClient/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -[assembly: InternalsVisibleTo("MinecraftClient.Tests")] - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Minecraft Console Client")] -[assembly: AssemblyDescription("Lightweight console for Minecraft chat and automated scripts")] -//[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("https://github.com/MCCTeam/Minecraft-Console-Client")] -[assembly: AssemblyProduct("MinecraftClient")] -[assembly: AssemblyCopyright("Copyright © 2012-2022 The MCC Team")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("78af6200-1f48-4daa-b473-109a9728b61f")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -// [assembly: AssemblyVersion("1.0.0")] -// [assembly: AssemblyFileVersion("1.0.0")] - -// AppVeyor Build Number -// MCC will use the following command as CMD pre-build script in AppVeyor msbuild settings: -// echo [assembly: AssemblyConfiguration("AppVeyor build %APPVEYOR_BUILD_NUMBER%, built on %DATE% from commit %APPVEYOR_REPO_COMMIT:~0,7%")] >> MinecraftClient\Properties\AssemblyInfo.cs -// The command will add build info like the example below to be incorporated in Assembly Info in order to display build info on launch -// [assembly: AssemblyConfiguration("AppVeyor build 1234, built on Sun 31/12/2017 from commit abc1def")] diff --git a/MinecraftClient/Protocol/DataTypeGenerator.cs b/MinecraftClient/Protocol/DataTypeGenerator.cs deleted file mode 100644 index d8315b8180..0000000000 --- a/MinecraftClient/Protocol/DataTypeGenerator.cs +++ /dev/null @@ -1,144 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; - -namespace MinecraftClient.Protocol -{ - /// - /// Generic generator for MCC Enumerations such as ItemType or EntityType, mapping protocol IDs to actual enumeration fields such as 1 => Stone for inventories. - /// Works by processing Minecraft registries.json exported from minecraft_server.jar - /// - /// java -cp minecraft_server.jar net.minecraft.data.Main --reports - public static class DataTypeGenerator - { - /// - /// Read Minecraft registry from Json and build a dictionary - /// - /// Path to registries.json generated from Minecraft server Jar - /// Name of registry we want to process, e.g. minecraft:item - /// - private static Dictionary LoadRegistry(string registriesJsonFile, string jsonRegistryName) - { - var rawJson = Json.ParseJson(File.ReadAllText(registriesJsonFile)); - var rawRegistry = rawJson![jsonRegistryName]!["entries"]!.AsObject(); - Dictionary registry = new(); - - foreach (var entry in rawRegistry) - { - int entryId = int.Parse(entry.Value!["protocol_id"].GetStringValue(), NumberStyles.Any, CultureInfo.CurrentCulture); - - //minecraft:item_name => ItemName - string entryName = String.Concat( - entry.Key.Replace("minecraft:", "") - .Split('_') - .Select(word => char.ToUpper(word[0]) + word[1..]) - ); - - if (registry.ContainsKey(entryId)) - throw new InvalidDataException("Duplicate entry ID " + entryId + "!?"); - - registry.Add(entryId, entryName); - } - - return registry; - } - - /// - /// Generate MCC Enum from a Minecraft registry without Palette (static enum that does not change between versions) - /// - /// Path to registries.json generated from Minecraft server Jar - /// Name of registry we want to process, e.g. minecraft:item - /// Output enum name, e.g. ItemType (output file will be ItemType.cs) - /// Output enum namespace, e.g. MinecraftClient.Inventory - public static void GenerateEnum(string registriesJsonFile, string jsonRegistryName, string outputEnum, string enumNamespace) - { - List outputEnumLines = new(); - - outputEnumLines.AddRange(new[] { - "namespace " + enumNamespace, - "{", - " public enum " + outputEnum, - " {" - }); - - Dictionary registry = LoadRegistry(registriesJsonFile, jsonRegistryName); - foreach (KeyValuePair entry in registry) - outputEnumLines.Add(" " + entry.Value + " = " + entry.Key + ','); - - outputEnumLines.AddRange(new[] { - " }", - "}" - }); - - string outputEnumPath = Path.Combine(Path.GetDirectoryName(registriesJsonFile)!, outputEnum + "XXX.cs"); - File.WriteAllLines(outputEnumPath, outputEnumLines); - } - - /// - /// Generate MCC Enum from a Minecraft registry with Palette (dynamic enum that changes between versions) - /// - /// Path to registries.json generated from Minecraft server Jar - /// Name of registry we want to process, e.g. minecraft:item - /// Output enum name, e.g. ItemType (output file will be ItemType.cs) - /// Enum namespace, e.g. MinecraftClient.Mapping - /// Output palette name, e.g. ItemPalette (output file will be ItemPalette.cs and ItemPaletteXXX.cs) - /// Palette namespace, e.g. MinecraftClient.EntityPalettes - public static void GenerateEnumWithPalette(string registriesJsonFile, string jsonRegistryName, string outputEnum, string enumNamespace, string outputPalette, string paletteNamespace) - { - List outputEnumLines = new(); - List outputPaletteLines = new(); - - outputEnumLines.AddRange(new[] { - "namespace " + enumNamespace, - "{", - " public enum " + outputEnum, - " {" - }); - - outputPaletteLines.AddRange(new[] { - "using System.Collections.Generic;", - "", - "namespace " + paletteNamespace, - "{", - " public class " + outputPalette + "XXX : " + outputPalette, - " {", - " private static readonly Dictionary mappings = new();", - "", - " static " + outputPalette + "XXX()", - " {", - }); - - Dictionary registry = LoadRegistry(registriesJsonFile, jsonRegistryName); - - foreach (KeyValuePair entry in registry) - { - outputEnumLines.Add(" " + entry.Value + ','); - outputPaletteLines.Add(" mappings[" + entry.Key + "] = " + outputEnum + "." + entry.Value + ";"); - } - - outputEnumLines.AddRange(new[] { - " }", - "}" - }); - - outputPaletteLines.AddRange(new[] { - " }", - "", - " protected override Dictionary GetDict()", - " {", - " return mappings;", - " }", - " }", - "}" - }); - - string outputEnumPath = Path.Combine(Path.GetDirectoryName(registriesJsonFile)!, outputEnum + "XXX.cs"); - string outputPalettePath = Path.Combine(Path.GetDirectoryName(registriesJsonFile)!, outputPalette + "XXX.cs"); - - File.WriteAllLines(outputEnumPath, outputEnumLines); - File.WriteAllLines(outputPalettePath, outputPaletteLines); - } - } -} diff --git a/MinecraftClient/Protocol/Dialogs/DialogNbtParser.cs b/MinecraftClient/Protocol/Dialogs/DialogNbtParser.cs deleted file mode 100644 index 2636b5be8b..0000000000 --- a/MinecraftClient/Protocol/Dialogs/DialogNbtParser.cs +++ /dev/null @@ -1,475 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using MinecraftClient.Dialogs; -using MinecraftClient.Protocol.Message; - -namespace MinecraftClient.Protocol.Dialogs; - -public sealed class DialogNbtParser -{ - public DialogDefinition Parse(Dictionary nbt) - { - var type = NormalizeType(GetString(nbt, "type") ?? "minecraft:notice"); - var common = ParseCommon(nbt, type); - var actions = new List(); - DialogActionDefinition? cancelAction = null; - var columns = GetInt(nbt, "columns", 1); - var buttonWidth = GetInt(nbt, "button_width", 150); - - switch (type) - { - case "minecraft:notice": - var noticeAction = ParseButton(nbt, "action", 1); - actions.Add(noticeAction ?? new DialogButton(1, Translations.dialog_action_ok, null)); - cancelAction = actions[0].Action; - break; - - case "minecraft:confirmation": - AddIfNotNull(actions, ParseButton(nbt, "yes", 1)); - AddIfNotNull(actions, ParseButton(nbt, "no", 2)); - cancelAction = actions.Count >= 2 ? actions[1].Action : null; - break; - - case "minecraft:multi_action": - actions.AddRange(ParseButtonList(GetValue(nbt, "actions"))); - cancelAction = ParseButton(nbt, "exit_action", 0)?.Action; - break; - - case "minecraft:dialog_list": - actions.AddRange(ParseDialogListActions(GetValue(nbt, "dialogs"))); - cancelAction = ParseButton(nbt, "exit_action", 0)?.Action; - break; - - case "minecraft:server_links": - cancelAction = ParseButton(nbt, "exit_action", 0)?.Action; - break; - } - - return new DialogDefinition( - type, - common.Title, - common.ExternalTitle, - common.CanCloseWithEscape, - common.Pause, - common.AfterAction, - common.Body, - common.Inputs, - actions, - cancelAction, - columns, - buttonWidth); - } - - public DialogDefinition? TryParse(Dictionary? nbt) - { - return nbt is null ? null : Parse(nbt); - } - - private static DialogCommon ParseCommon(Dictionary nbt, string type) - { - var title = ParseComponent(GetValue(nbt, "title")); - var externalTitle = nbt.TryGetValue("external_title", out var externalTitleValue) - ? ParseComponent(externalTitleValue) - : null; - var canCloseWithEscape = GetBool(nbt, "can_close_with_escape", true); - var pause = GetBool(nbt, "pause", true); - var afterAction = ParseAfterAction(GetString(nbt, "after_action") ?? "close"); - var body = ParseBody(GetValue(nbt, "body")); - var inputs = ParseInputs(GetValue(nbt, "inputs")); - - return new DialogCommon(title, externalTitle, canCloseWithEscape, pause, afterAction, body, inputs); - } - - private static IReadOnlyList ParseBody(object? value) - { - if (value is null) - return []; - - List body = []; - foreach (var item in Enumerate(value)) - { - if (item is Dictionary compound) - { - var type = NormalizeType(GetString(compound, "type") ?? "minecraft:plain_message"); - if (type == "minecraft:item") - { - var description = compound.TryGetValue("description", out var desc) - ? ParsePlainMessage(desc) - : string.Empty; - body.Add(new DialogBody(DialogBodyKind.Item, string.IsNullOrWhiteSpace(description) ? Translations.dialog_item_body : description, type)); - continue; - } - - body.Add(new DialogBody(DialogBodyKind.PlainMessage, ParsePlainMessage(compound), type)); - continue; - } - - body.Add(new DialogBody(DialogBodyKind.PlainMessage, ParseComponent(item), "minecraft:plain_message")); - } - - return body; - } - - private static string ParsePlainMessage(object? value) - { - if (value is Dictionary compound && compound.TryGetValue("contents", out var contents)) - return ParseComponent(contents); - - return ParseComponent(value); - } - - private static IReadOnlyList ParseInputs(object? value) - { - if (value is null) - return []; - - List inputs = []; - foreach (var item in Enumerate(value)) - { - if (item is not Dictionary inputData) - continue; - - var key = GetString(inputData, "key"); - if (string.IsNullOrWhiteSpace(key)) - continue; - - var control = inputData.TryGetValue("control", out var controlValue) && controlValue is Dictionary controlData - ? controlData - : inputData; - - var type = NormalizeType(GetString(control, "type") ?? "minecraft:text"); - inputs.Add(type switch - { - "minecraft:boolean" => ParseBooleanInput(key, type, control), - "minecraft:number_range" => ParseNumberInput(key, type, control), - "minecraft:single_option" => ParseOptionInput(key, type, control), - "minecraft:text" => ParseTextInput(key, type, control), - _ => new DialogInput(key, DialogInputKind.Unknown, ParseComponent(GetValue(control, "label")), string.Empty, Type: type) - }); - } - - return inputs; - } - - private static DialogInput ParseTextInput(string key, string type, Dictionary control) - { - return new DialogInput( - key, - DialogInputKind.Text, - ParseComponent(GetValue(control, "label")), - GetString(control, "initial") ?? string.Empty, - MaxLength: GetInt(control, "max_length", 32), - LabelVisible: GetBool(control, "label_visible", true), - Multiline: control.ContainsKey("multiline"), - Type: type); - } - - private static DialogInput ParseBooleanInput(string key, string type, Dictionary control) - { - var initial = GetBool(control, "initial", false); - return new DialogInput( - key, - DialogInputKind.Boolean, - ParseComponent(GetValue(control, "label")), - initial ? "true" : "false", - OnTrue: GetString(control, "on_true") ?? "true", - OnFalse: GetString(control, "on_false") ?? "false", - Type: type); - } - - private static DialogInput ParseOptionInput(string key, string type, Dictionary control) - { - var options = ParseOptions(GetValue(control, "options")); - var initial = options.FirstOrDefault(static option => option.Initial)?.Id - ?? options.FirstOrDefault()?.Id - ?? string.Empty; - return new DialogInput( - key, - DialogInputKind.SingleOption, - ParseComponent(GetValue(control, "label")), - initial, - LabelVisible: GetBool(control, "label_visible", true), - Options: options, - Type: type); - } - - private static DialogInput ParseNumberInput(string key, string type, Dictionary control) - { - var range = control.TryGetValue("range_info", out var rangeValue) && rangeValue is Dictionary rangeData - ? rangeData - : control; - var start = GetFloat(range, "start", 0); - var end = GetFloat(range, "end", 1); - var initial = TryGetFloat(range, "initial") ?? ((start + end) / 2F); - return new DialogInput( - key, - DialogInputKind.NumberRange, - ParseComponent(GetValue(control, "label")), - NumberToString(initial), - Start: start, - End: end, - InitialNumber: initial, - Step: TryGetFloat(range, "step"), - Type: type); - } - - private static IReadOnlyList ParseOptions(object? value) - { - if (value is null) - return []; - - List options = []; - foreach (var item in Enumerate(value)) - { - if (item is string id) - { - options.Add(new DialogOption(id, id, false)); - continue; - } - - if (item is Dictionary option) - { - var optionId = GetString(option, "id"); - if (optionId is null) - continue; - - var display = option.TryGetValue("display", out var displayValue) - ? ParseComponent(displayValue) - : optionId; - options.Add(new DialogOption(optionId, display, GetBool(option, "initial", false))); - } - } - - return options; - } - - private static List ParseButtonList(object? value) - { - List buttons = []; - var index = 1; - foreach (var item in Enumerate(value)) - { - if (item is Dictionary buttonData) - buttons.Add(ParseButton(buttonData, index++) ?? new DialogButton(index - 1, Translations.dialog_action_unnamed, null)); - } - - return buttons; - } - - private static IEnumerable ParseDialogListActions(object? value) - { - List buttons = []; - var index = 1; - foreach (var item in Enumerate(value)) - { - switch (item) - { - case string tag when tag.StartsWith('#'): - buttons.Add(new DialogButton(index++, tag, new DialogActionDefinition(DialogActionKind.Unknown, Type: "dialog_tag"))); - break; - case string resource: - buttons.Add(new DialogButton(index++, resource, new DialogActionDefinition(DialogActionKind.ShowDialog, Value: resource, Type: "dialog_reference_name"))); - break; - case Dictionary dialog: - var nested = new DialogNbtParser().Parse(dialog); - buttons.Add(new DialogButton(index++, nested.DisplayTitle(), new DialogActionDefinition(DialogActionKind.ShowDialog, NestedDialog: nested))); - break; - } - } - - return buttons; - } - - private static DialogButton? ParseButton(Dictionary owner, string key, int index) - { - return owner.TryGetValue(key, out var value) && value is Dictionary data - ? ParseButton(data, index) - : null; - } - - private static DialogButton? ParseButton(Dictionary data, int index) - { - var label = data.TryGetValue("label", out var labelValue) - ? ParseComponent(labelValue) - : Translations.dialog_action_unnamed; - var action = data.TryGetValue("action", out var actionValue) && actionValue is Dictionary actionData - ? ParseAction(actionData) - : null; - return new DialogButton(index, label, action); - } - - private static DialogActionDefinition ParseAction(Dictionary action) - { - var type = NormalizeType(GetString(action, "type") ?? GetString(action, "action") ?? "minecraft:none"); - return type switch - { - "minecraft:run_command" => new DialogActionDefinition(DialogActionKind.RunCommand, Value: GetString(action, "command"), Type: type), - "minecraft:dynamic/run_command" => new DialogActionDefinition(DialogActionKind.RunCommand, Value: GetString(action, "template"), Type: type), - "minecraft:custom" => new DialogActionDefinition(DialogActionKind.CustomClick, Id: GetString(action, "id"), Payload: GetCompound(action, "payload"), Type: type), - "minecraft:dynamic/custom" => new DialogActionDefinition(DialogActionKind.CustomClick, Id: GetString(action, "id"), Payload: GetCompound(action, "additions"), Type: type), - "minecraft:open_url" => new DialogActionDefinition(DialogActionKind.OpenUrl, Value: GetString(action, "url"), Type: type), - "minecraft:suggest_command" => new DialogActionDefinition(DialogActionKind.SuggestCommand, Value: GetString(action, "command"), Type: type), - "minecraft:copy_to_clipboard" => new DialogActionDefinition(DialogActionKind.CopyToClipboard, Value: GetString(action, "value"), Type: type), - "minecraft:show_dialog" => ParseShowDialogAction(action, type), - _ => new DialogActionDefinition(DialogActionKind.Unknown, Type: type) - }; - } - - private static DialogActionDefinition ParseShowDialogAction(Dictionary action, string type) - { - if (!action.TryGetValue("dialog", out var value)) - return new DialogActionDefinition(DialogActionKind.ShowDialog, Type: type); - - if (value is Dictionary dialogData) - return new DialogActionDefinition(DialogActionKind.ShowDialog, NestedDialog: new DialogNbtParser().Parse(dialogData), Type: type); - - if (value is int protocolId) - return new DialogActionDefinition(DialogActionKind.ShowDialog, DialogReferenceId: protocolId, Type: type); - - return new DialogActionDefinition(DialogActionKind.ShowDialog, Value: value.ToString(), Type: type); - } - - private static DialogAfterAction ParseAfterAction(string value) - { - return value switch - { - "none" => DialogAfterAction.None, - "wait_for_response" => DialogAfterAction.WaitForResponse, - _ => DialogAfterAction.Close - }; - } - - private static string ParseComponent(object? value) - { - if (value is null) - return string.Empty; - - try - { - return value switch - { - Dictionary compound => ChatParser.ParseText(compound), - string text when text.StartsWith('{') || text.StartsWith('[') => ChatParser.ParseText(text), - string text => text, - _ => value.ToString() ?? string.Empty - }; - } - catch - { - return value.ToString() ?? string.Empty; - } - } - - private static IEnumerable Enumerate(object? value) - { - if (value is null) - yield break; - - if (value is object[] array) - { - foreach (var item in array) - yield return item; - yield break; - } - - yield return value; - } - - private static object? GetValue(Dictionary data, string key) - { - return data.TryGetValue(key, out var value) ? value : null; - } - - private static string? GetString(Dictionary data, string key) - { - return data.TryGetValue(key, out var value) ? value as string ?? value.ToString() : null; - } - - private static Dictionary? GetCompound(Dictionary data, string key) - { - return data.TryGetValue(key, out var value) && value is Dictionary compound ? compound : null; - } - - private static bool GetBool(Dictionary data, string key, bool fallback) - { - if (!data.TryGetValue(key, out var value)) - return fallback; - - return value switch - { - bool boolean => boolean, - byte number => number != 0, - sbyte number => number != 0, - int number => number != 0, - string text when bool.TryParse(text, out var parsed) => parsed, - _ => fallback - }; - } - - private static int GetInt(Dictionary data, string key, int fallback) - { - if (!data.TryGetValue(key, out var value)) - return fallback; - - return value switch - { - byte number => number, - short number => number, - int number => number, - long number => (int)number, - string text when int.TryParse(text, NumberStyles.Integer, CultureInfo.InvariantCulture, out var parsed) => parsed, - _ => fallback - }; - } - - private static float GetFloat(Dictionary data, string key, float fallback) - { - return TryGetFloat(data, key) ?? fallback; - } - - private static float? TryGetFloat(Dictionary data, string key) - { - if (!data.TryGetValue(key, out var value)) - return null; - - return value switch - { - float number => number, - double number => (float)number, - int number => number, - long number => number, - string text when float.TryParse(text, NumberStyles.Float, CultureInfo.InvariantCulture, out var parsed) => parsed, - _ => null - }; - } - - private static string NormalizeType(string type) - { - return type.Contains(':', StringComparison.Ordinal) ? type : "minecraft:" + type; - } - - private static void AddIfNotNull(List buttons, DialogButton? button) - { - if (button is not null) - buttons.Add(button); - } - - private static string NumberToString(float value) - { - var integer = (int)value; - return integer == value - ? integer.ToString(CultureInfo.InvariantCulture) - : value.ToString(CultureInfo.InvariantCulture); - } - - private sealed record DialogCommon( - string Title, - string? ExternalTitle, - bool CanCloseWithEscape, - bool Pause, - DialogAfterAction AfterAction, - IReadOnlyList Body, - IReadOnlyList Inputs); -} diff --git a/MinecraftClient/Protocol/EntityActionType.cs b/MinecraftClient/Protocol/EntityActionType.cs deleted file mode 100644 index 88005de43a..0000000000 --- a/MinecraftClient/Protocol/EntityActionType.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace MinecraftClient.Protocol -{ - public enum EntityActionType - { - StartSneaking = 0, - StopSneaking = 1, - LeaveBed = 2, - StartSprinting = 3, - StopSprinting = 4, - StartJumpWithHorse = 5, - StopJumpWithHorse = 6, - OpenHorseInventory = 7, - StartFlyingWithElytra = 8, - } -} diff --git a/MinecraftClient/Protocol/GuidExtensions.cs b/MinecraftClient/Protocol/GuidExtensions.cs deleted file mode 100644 index c5ce264595..0000000000 --- a/MinecraftClient/Protocol/GuidExtensions.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; - -namespace MinecraftClient.Protocol -{ - public static class GuidExtensions - { - /// - /// A CLSCompliant method to convert a Java big-endian Guid to a .NET - /// little-endian Guid. - /// The Guid Constructor (UInt32, UInt16, UInt16, Byte, Byte, Byte, Byte, - /// Byte, Byte, Byte, Byte) is not CLSCompliant. - /// - public static Guid ToLittleEndian(this Guid javaGuid) - { - byte[] net = new byte[16]; - byte[] java = javaGuid.ToByteArray(); - for (int i = 8; i < 16; i++) - { - net[i] = java[i]; - } - net[3] = java[0]; - net[2] = java[1]; - net[1] = java[2]; - net[0] = java[3]; - net[5] = java[4]; - net[4] = java[5]; - net[6] = java[7]; - net[7] = java[6]; - return new Guid(net); - } - - /// - /// Converts little-endian .NET guids to big-endian Java guids: - /// - public static Guid ToBigEndian(this Guid netGuid) - { - byte[] java = new byte[16]; - byte[] net = netGuid.ToByteArray(); - for (int i = 8; i < 16; i++) - { - java[i] = net[i]; - } - java[0] = net[3]; - java[1] = net[2]; - java[2] = net[1]; - java[3] = net[0]; - java[4] = net[5]; - java[5] = net[4]; - java[6] = net[7]; - java[7] = net[6]; - return new Guid(java); - } - - /// - /// Converts little-endian .NET guids to big-endian Java guids: - /// - public static byte[] ToBigEndianBytes(this Guid netGuid) - { - byte[] java = new byte[16]; - byte[] net = netGuid.ToByteArray(); - for (int i = 8; i < 16; i++) - { - java[i] = net[i]; - } - java[0] = net[3]; - java[1] = net[2]; - java[2] = net[1]; - java[3] = net[0]; - java[4] = net[5]; - java[5] = net[4]; - java[6] = net[7]; - java[7] = net[6]; - return java; - } - } -} diff --git a/MinecraftClient/Protocol/Handlers/ConfigurationPacketTypesIn.cs b/MinecraftClient/Protocol/Handlers/ConfigurationPacketTypesIn.cs deleted file mode 100644 index d140bbcc70..0000000000 --- a/MinecraftClient/Protocol/Handlers/ConfigurationPacketTypesIn.cs +++ /dev/null @@ -1,27 +0,0 @@ -namespace MinecraftClient.Protocol.Handlers; - -public enum ConfigurationPacketTypesIn -{ - CookieRequest, - CustomReportDetails, - Disconnect, - FeatureFlags, - FinishConfiguration, - KeepAlive, - KnownDataPacks, - Ping, - PluginMessage, - RegistryData, - RemoveResourcePack, - ResetChat, - ResourcePack, - ServerLinks, - StoreCookie, - Transfer, - UpdateTags, - ClearDialog, // Added in 1.21.6 - ShowDialog, // Added in 1.21.6 - CodeOfConduct, // Added in 1.21.9 - - Unknown -} diff --git a/MinecraftClient/Protocol/Handlers/ConfigurationPacketTypesOut.cs b/MinecraftClient/Protocol/Handlers/ConfigurationPacketTypesOut.cs deleted file mode 100644 index 1bb492d274..0000000000 --- a/MinecraftClient/Protocol/Handlers/ConfigurationPacketTypesOut.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace MinecraftClient.Protocol.Handlers; - -public enum ConfigurationPacketTypesOut -{ - ClientInformation, - PluginMessage, - FinishConfiguration, - KeepAlive, - Pong, - ResourcePackResponse, - CookieResponse, - KnownDataPacks, - CustomClickAction, // Added in 1.21.6 - AcceptCodeOfConduct, // Added in 1.21.9 - - Unknown -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/DataTypes.cs b/MinecraftClient/Protocol/Handlers/DataTypes.cs deleted file mode 100644 index a3e95cb4ea..0000000000 --- a/MinecraftClient/Protocol/Handlers/DataTypes.cs +++ /dev/null @@ -1,2109 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using System.Text; -using MinecraftClient.Inventory; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Mapping; -using MinecraftClient.Mapping.EntityPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; -using MinecraftClient.Protocol.Message; - -namespace MinecraftClient.Protocol.Handlers -{ - /// - /// Handle data types encoding / decoding - /// - public class DataTypes(int protocol) - { - /// - /// Protocol version for adjusting data types - /// - private readonly int protocolversion = protocol; - - /// - /// Protocol version used to adjust wire encodings. - /// - public int ProtocolVersion => protocolversion; - - /// - /// Read some data from a cache of bytes and remove it from the cache - /// - /// Amount of bytes to read - /// Cache of bytes to read from - /// The data read from the cache as an array - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public byte[] ReadData(int offset, Queue cache) - { - byte[] result = new byte[offset]; - for (int i = 0; i < offset; i++) - result[i] = cache.Dequeue(); - return result; - } - - /// - /// Read some data from a cache of bytes and remove it from the cache - /// - /// Cache of bytes to read from - /// Storage results - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public void ReadDataReverse(Queue cache, Span dest) - { - for (int i = (dest.Length - 1); i >= 0; --i) - dest[i] = cache.Dequeue(); - } - - /// - /// Remove some data from the cache - /// - /// Amount of bytes to drop - /// Cache of bytes to drop - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public void DropData(int offset, Queue cache) - { - while (offset-- > 0) - cache.Dequeue(); - } - - /// - /// Read a string from a cache of bytes and remove it from the cache - /// - /// Cache of bytes to read from - /// The string - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public string ReadNextString(Queue cache) - { - int length = ReadNextVarInt(cache); - if (length > 0) - { - return Encoding.UTF8.GetString(ReadData(length, cache)); - } - else return ""; - } - - /// - /// Skip a string from a cache of bytes and remove it from the cache - /// - /// Cache of bytes to read from - public void SkipNextString(Queue cache) - { - int length = ReadNextVarInt(cache); - DropData(length, cache); - } - - /// - /// Read a boolean from a cache of bytes and remove it from the cache - /// - /// The boolean value - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public bool ReadNextBool(Queue cache) - { - return ReadNextByte(cache) != 0x00; - } - - /// - /// Read a short integer from a cache of bytes and remove it from the cache - /// - /// The short integer value - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public short ReadNextShort(Queue cache) - { - Span rawValue = stackalloc byte[2]; - for (int i = (2 - 1); i >= 0; --i) //Endianness - rawValue[i] = cache.Dequeue(); - return BitConverter.ToInt16(rawValue); - } - - /// - /// Read an integer from a cache of bytes and remove it from the cache - /// - /// The integer value - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public int ReadNextInt(Queue cache) - { - Span rawValue = stackalloc byte[4]; - for (int i = (4 - 1); i >= 0; --i) //Endianness - rawValue[i] = cache.Dequeue(); - return BitConverter.ToInt32(rawValue); - } - - /// - /// Read a long integer from a cache of bytes and remove it from the cache - /// - /// The unsigned long integer value - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public long ReadNextLong(Queue cache) - { - Span rawValue = stackalloc byte[8]; - for (int i = (8 - 1); i >= 0; --i) //Endianness - rawValue[i] = cache.Dequeue(); - return BitConverter.ToInt64(rawValue); - } - - /// - /// Read an unsigned short integer from a cache of bytes and remove it from the cache - /// - /// The unsigned short integer value - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public ushort ReadNextUShort(Queue cache) - { - Span rawValue = stackalloc byte[2]; - for (int i = (2 - 1); i >= 0; --i) //Endianness - rawValue[i] = cache.Dequeue(); - return BitConverter.ToUInt16(rawValue); - } - - /// - /// Read an unsigned long integer from a cache of bytes and remove it from the cache - /// - /// The unsigned long integer value - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public ulong ReadNextULong(Queue cache) - { - Span rawValue = stackalloc byte[8]; - for (int i = (8 - 1); i >= 0; --i) //Endianness - rawValue[i] = cache.Dequeue(); - return BitConverter.ToUInt64(rawValue); - } - - /// - /// Read a Location encoded as an ulong field and remove it from the cache - /// - /// The Location value - public Location ReadNextLocation(Queue cache) - { - ulong locEncoded = ReadNextULong(cache); - int x, y, z; - if (protocolversion >= Protocol18Handler.MC_1_14_Version) - { - x = (int)(locEncoded >> 38); - y = (int)(locEncoded & 0xFFF); - z = (int)(locEncoded << 26 >> 38); - } - else - { - x = (int)(locEncoded >> 38); - y = (int)((locEncoded >> 26) & 0xFFF); - z = (int)(locEncoded << 38 >> 38); - } - - if (x >= 0x02000000) // 33,554,432 - x -= 0x04000000; // 67,108,864 - if (y >= 0x00000800) // 2,048 - y -= 0x00001000; // 4,096 - if (z >= 0x02000000) // 33,554,432 - z -= 0x04000000; // 67,108,864 - return new Location(x, y, z); - } - - /// - /// Read several little endian unsigned short integers at once from a cache of bytes and remove them from the cache - /// - /// The unsigned short integer value - public ushort[] ReadNextUShortsLittleEndian(int amount, Queue cache) - { - byte[] rawValues = ReadData(2 * amount, cache); - ushort[] result = new ushort[amount]; - for (int i = 0; i < amount; i++) - result[i] = BitConverter.ToUInt16(rawValues, i * 2); - return result; - } - - /// - /// Read a uuid from a cache of bytes and remove it from the cache - /// - /// Cache of bytes to read from - /// The uuid - public Guid ReadNextUUID(Queue cache) - { - Span javaUUID = stackalloc byte[16]; - for (int i = 0; i < 16; ++i) - javaUUID[i] = cache.Dequeue(); - Guid guid = new(javaUUID); - if (BitConverter.IsLittleEndian) - guid = guid.ToLittleEndian(); - return guid; - } - - /// - /// Read a byte array from a cache of bytes and remove it from the cache - /// - /// Cache of bytes to read from - /// The byte array - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public byte[] ReadNextByteArray(Queue cache) - { - int len = protocolversion >= Protocol18Handler.MC_1_8_Version - ? ReadNextVarInt(cache) - : ReadNextShort(cache); - return ReadData(len, cache); - } - - /// - /// Read a byte array with given length from a cache of bytes and remove it from the cache - /// - /// Cache of bytes to read from - /// Length of the bytes array - /// The byte array - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public byte[] ReadNextByteArray(Queue cache, int length) - { - return ReadData(length, cache); - } - - /// - /// Reads a length-prefixed array of unsigned long integers and removes it from the cache - /// - /// The unsigned long integer values - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public ulong[] ReadNextULongArray(Queue cache) - { - int len = ReadNextVarInt(cache); - ulong[] result = new ulong[len]; - for (int i = 0; i < len; i++) - result[i] = ReadNextULong(cache); - return result; - } - - /// - /// Read a double from a cache of bytes and remove it from the cache - /// - /// The double value - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public double ReadNextDouble(Queue cache) - { - Span rawValue = stackalloc byte[8]; - for (int i = (8 - 1); i >= 0; --i) //Endianness - rawValue[i] = cache.Dequeue(); - return BitConverter.ToDouble(rawValue); - } - - /// - /// Read a float from a cache of bytes and remove it from the cache - /// - /// The float value - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public float ReadNextFloat(Queue cache) - { - Span rawValue = stackalloc byte[4]; - for (int i = (4 - 1); i >= 0; --i) //Endianness - rawValue[i] = cache.Dequeue(); - return BitConverter.ToSingle(rawValue); - } - - /// - /// Read an integer from the network - /// - /// The integer - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public int ReadNextVarIntRAW(SocketWrapper socket) - { - int i = 0; - int j = 0; - byte b; - while (true) - { - b = socket.ReadDataRAW(1)[0]; - i |= (b & 0x7F) << j++ * 7; - if (j > 5) throw new OverflowException("VarInt too big"); - if ((b & 0x80) != 128) break; - } - - return i; - } - - /// - /// Read an integer from a cache of bytes and remove it from the cache - /// - /// Cache of bytes to read from - /// The integer - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public int ReadNextVarInt(Queue cache) - { - int i = 0; - int j = 0; - byte b; - do - { - b = cache.Dequeue(); - i |= (b & 0x7F) << j++ * 7; - if (j > 5) throw new OverflowException("VarInt too big"); - } while ((b & 0x80) == 128); - - return i; - } - - /// - /// Skip a VarInt from a cache of bytes with better performance - /// - /// Cache of bytes to read from - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public void SkipNextVarInt(Queue cache) - { - while (true) - if ((ReadNextByte(cache) & 0x80) != 128) - break; - } - - /// - /// Read an "extended short", which is actually an int of some kind, from the cache of bytes. - /// This is only done with forge. It looks like it's a normal short, except that if the high - /// bit is set, it has an extra byte. - /// - /// Cache of bytes to read from - /// The int - public int ReadNextVarShort(Queue cache) - { - ushort low = ReadNextUShort(cache); - byte high = 0; - if ((low & 0x8000) != 0) - { - low &= 0x7FFF; - high = ReadNextByte(cache); - } - - return ((high & 0xFF) << 15) | low; - } - - /// - /// Read a long from a cache of bytes and remove it from the cache - /// - /// Cache of bytes to read from - /// The long value - public long ReadNextVarLong(Queue cache) - { - int numRead = 0; - long result = 0; - byte read; - do - { - read = ReadNextByte(cache); - long value = (read & 0x7F); - result |= (value << (7 * numRead)); - - numRead++; - if (numRead > 10) - { - throw new OverflowException("VarLong is too big"); - } - } while ((read & 0x80) != 0); - - return result; - } - - /// - /// Read a single byte from a cache of bytes and remove it from the cache - /// - /// The byte that was read - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public byte ReadNextByte(Queue cache) - { - byte result = cache.Dequeue(); - return result; - } - - /// - /// Read an uncompressed Named Binary Tag blob and remove it from the cache - /// - public Dictionary ReadNextNbt(Queue cache) - { - return ReadNextNbt(cache, true); - } - - public object? ReadNextNbtTag(Queue cache) - { - var tagType = ReadNextByte(cache); - return tagType == 0 ? null : ReadNbtField(cache, tagType); - } - - /// - /// Read an ItemStackTemplate (26.1+) from a cache of bytes. - /// Unlike ItemStack, this uses item-first encoding: item_id, count, DataComponentPatch. - /// ItemStackTemplate is always non-empty (no count=0 sentinel). - /// - public Item ReadNextItemStackTemplate(Queue cache, ItemPalette itemPalette) - { - var itemId = ReadNextVarInt(cache); - var itemCount = ReadNextVarInt(cache); - var item = new Item(itemPalette.FromId(itemId), itemCount, null); - - var numberOfComponentsToAdd = ReadNextVarInt(cache); - var numberofComponentsToRemove = ReadNextVarInt(cache); - var structuredComponentHandler = new StructuredComponentsHandler(protocolversion, this, itemPalette); - var strcturedComponentsToAdd = new List(numberOfComponentsToAdd); - - for (var i = 0; i < numberOfComponentsToAdd; i++) - { - var componentTypeId = ReadNextVarInt(cache); - strcturedComponentsToAdd.Add(structuredComponentHandler.Parse(componentTypeId, cache)); - } - - for (var i = 0; i < numberofComponentsToRemove; i++) - ReadNextVarInt(cache); - - if (strcturedComponentsToAdd.Count > 0) - item.Components = strcturedComponentsToAdd; - - return item; - } - - /// - /// Read a single item slot from a cache of bytes and remove it from the cache - /// - /// The item that was read or NULL for an empty slot - public Item? ReadNextItemSlot(Queue cache, ItemPalette itemPalette) - { - var itemId = -1; - var itemCount = 0; - var nbt = null as Dictionary; - var item = null as Item; - var strcturedComponentsToAdd = new List(); - - switch (protocolversion) - { - // MC 1.13.2 and greater - case >= Protocol18Handler.MC_1_20_6_Version: - itemCount = ReadNextVarInt(cache); - - if (itemCount <= 0) return null; - - itemId = ReadNextVarInt(cache); - item = new Item(itemPalette.FromId(itemId), itemCount, null); - - var numberOfComponentsToAdd = ReadNextVarInt(cache); - var numberofComponentsToRemove = ReadNextVarInt(cache); - var structuredComponentHandler = new StructuredComponentsHandler(protocolversion, this, itemPalette); - var parsedComponents = new List(numberOfComponentsToAdd); - - for (var i = 0; i < numberOfComponentsToAdd; i++) - { - var componentTypeId = ReadNextVarInt(cache); - var componentName = structuredComponentHandler.GetComponentName(componentTypeId); - parsedComponents.Add($"{i}:{componentTypeId}:{componentName}:next={GetQueuePreview(cache, 24)}"); - - try - { - strcturedComponentsToAdd.Add(structuredComponentHandler.Parse(componentTypeId, cache)); - } - catch (Exception ex) - { - var preview = GetQueuePreview(cache, 48); - throw new System.IO.InvalidDataException( - $"Failed to decode item component {componentTypeId} ({componentName}) for itemId {itemId}, " + - $"itemCount {itemCount}, addCount {numberOfComponentsToAdd}, removeCount {numberofComponentsToRemove}, " + - $"componentIndex {i}, remainingBytes {cache.Count}, nextBytes {preview}, " + - $"componentTrace [{string.Join(" | ", parsedComponents)}].", - ex); - } - } - - for (var i = 0; i < numberofComponentsToRemove; i++) - ReadNextVarInt(cache); - - if (strcturedComponentsToAdd.Count > 0) - item.Components = strcturedComponentsToAdd; - - return item; - case >= Protocol18Handler.MC_1_13_2_Version: - { - var itemPresent = ReadNextBool(cache); - - if (!itemPresent) - return null; - - itemId = ReadNextVarInt(cache); - - if (itemId == -1) - return null; - - var type = itemPalette.FromId(itemId); - itemCount = ReadNextByte(cache); - nbt = ReadNextNbt(cache); - return new Item(type, itemCount, itemId, nbt); - } - case >= Protocol18Handler.MC_1_13_Version: - { - itemId = ReadNextShort(cache); - - if (itemId == -1) - return null; - - var type = itemPalette.FromId(itemId); - itemCount = ReadNextByte(cache); - nbt = ReadNextNbt(cache); - return new Item(type, itemCount, itemId, nbt); - } - default: - { - itemId = ReadNextShort(cache); - - if (itemId == -1) - return null; - - itemCount = ReadNextByte(cache); - var data = ReadNextShort(cache); - nbt = ReadNextNbt(cache); - - // For 1.8 - 1.12.2 we combine Item Id and Item Data/Damage to a single value using: (id << 16) | data - return new Item(itemPalette.FromId((itemId << 16) | (ushort)data), itemCount, data, nbt); - } - } - } - - private void ReadNextDetail(Queue cache) - { - var potionEffectId = ReadNextVarInt(cache); - - // Details - var potionEffectAmplifier = ReadNextVarInt(cache); - var duration = ReadNextVarInt(cache); // -1 for infinite - var ambient = ReadNextBool(cache); - var showParticles = ReadNextBool(cache); - var showIcon = ReadNextBool(cache); - var hasHiddenEffect = ReadNextBool(cache); - - if (hasHiddenEffect) - { - ReadNextDetail(cache); - } - } - - private static string GetQueuePreview(Queue cache, int maxBytes) - { - if (cache.Count == 0) - return ""; - - var bytes = cache.ToArray(); - var length = Math.Min(bytes.Length, maxBytes); - var preview = new StringBuilder(length * 3); - - for (var i = 0; i < length; i++) - { - if (i > 0) - preview.Append(' '); - - preview.Append(bytes[i].ToString("X2")); - } - - if (bytes.Length > maxBytes) - preview.Append(" ..."); - - return preview.ToString(); - } - - /// - /// Read entity information from a cache of bytes and remove it from the cache - /// - /// Mappings for converting entity type Ids to EntityType - /// TRUE for living entities (layout differs) - /// Entity information - public Entity ReadNextEntity(Queue cache, EntityPalette entityPalette, bool living) - { - int entityID = ReadNextVarInt(cache); - Guid entityUUID = Guid.Empty; - - // UUID field added in 1.9 + - if (protocolversion >= Protocol18Handler.MC_1_9_Version) - entityUUID = ReadNextUUID(cache); - - // Entity type data type change from byte to varint in 1.13.2 - EntityType entityType; - - if (living) - { - // For living entities the Type field was changed to VarInt from Byte in 1.11 + - if (protocolversion >= Protocol18Handler.MC_1_11_Version) - entityType = entityPalette.FromId(ReadNextVarInt(cache), living); - else entityType = entityPalette.FromId(ReadNextByte(cache), living); - } - else - { - // For non-living entities the Type field was changed to VarInt from Byte in 1.13.2 + - if (protocolversion >= Protocol18Handler.MC_1_13_2_Version) - entityType = entityPalette.FromId(ReadNextVarInt(cache), living); - else entityType = entityPalette.FromId(ReadNextByte(cache), living); - } - - Double entityX, entityY, entityZ; - - if (protocolversion < Protocol18Handler.MC_1_9_Version) - { - entityX = ReadNextInt(cache) / 32.0D; // X - entityY = ReadNextInt(cache) / 32.0D; // Y - entityZ = ReadNextInt(cache) / 32.0D; // Z - } - else - { - entityX = ReadNextDouble(cache); // X - entityY = ReadNextDouble(cache); // Y - entityZ = ReadNextDouble(cache); // Z - } - - int data = -1; - byte entityPitch, entityYaw; - - if (protocolversion >= Protocol18Handler.MC_1_21_9_Version) - { - // 1.21.9+: LpVec3 movement before angles, unified format - ReadNextLpVec3(cache); // Movement (LpVec3) - entityPitch = ReadNextByte(cache); // xRot - entityYaw = ReadNextByte(cache); // yRot - ReadNextByte(cache); // yHeadRot - data = ReadNextVarInt(cache); // Data - } - else if (living) - { - entityYaw = ReadNextByte(cache); // Yaw - entityPitch = ReadNextByte(cache); // Pitch - entityPitch = ReadNextByte(cache); // Head Pitch - - // Velocity (3 shorts) - if (protocolversion < Protocol18Handler.MC_1_9_Version) - { - // no velocity for living entities in <1.9 - } - else - { - ReadNextShort(cache); - ReadNextShort(cache); - ReadNextShort(cache); - } - } - else - { - entityPitch = ReadNextByte(cache); // Pitch - entityYaw = ReadNextByte(cache); // Yaw - - if (protocolversion >= Protocol18Handler.MC_1_19_Version) - entityYaw = ReadNextByte(cache); // Head Yaw - - // Data - data = protocolversion >= Protocol18Handler.MC_1_19_Version - ? ReadNextVarInt(cache) - : ReadNextInt(cache); - - // Velocity (3 shorts) - if (protocolversion < Protocol18Handler.MC_1_9_Version) - { - if (data != 0) - { - ReadNextShort(cache); - ReadNextShort(cache); - ReadNextShort(cache); - } - } - else - { - ReadNextShort(cache); - ReadNextShort(cache); - ReadNextShort(cache); - } - } - - var entity = new Entity(entityID, entityType, new Location(entityX, entityY, entityZ), entityYaw, entityPitch, - data); - entity.UUID = entityUUID; - return entity; - } - - /// - /// Read an uncompressed Named Binary Tag blob and remove it from the cache (internal) - /// - private Dictionary ReadNextNbt(Queue cache, bool root) - { - Dictionary nbtData = new(); - - if (root) - { - if (cache.Peek() == 0) // TAG_End - { - cache.Dequeue(); - return nbtData; - } - - var nextId = cache.Dequeue(); - if (protocolversion < Protocol18Handler.MC_1_20_2_Version) - { - if (nextId is not 10) // TAG_Compound - throw new System.IO.InvalidDataException( - "Failed to decode NBT: Does not start with TAG_Compound"); - - // NBT root name - var rootName = Encoding.ASCII.GetString(ReadData(ReadNextUShort(cache), cache)); - - if (!string.IsNullOrEmpty(rootName)) - nbtData[""] = rootName; - } - // In 1.20.2 The root TAG_Compound doesn't have a name - // In 1.20.3+ The root can be TAG_Compound or TAG_String - else - { - if (nextId is not (10 or 8)) // TAG_Compound or TAG_String - throw new System.IO.InvalidDataException( - "Failed to decode NBT: Does not start with TAG_Compound or TAG_String"); - - // Read TAG_String - if (nextId is 8) - { - var byteArrayLength = ReadNextUShort(cache); - var result = Encoding.UTF8.GetString(ReadData(byteArrayLength, cache)); - - return new Dictionary() - { - { "", result } - }; - } - } - } - - while (true) - { - int fieldType = ReadNextByte(cache); - - if (fieldType == 0) // TAG_End - return nbtData; - - int fieldNameLength = ReadNextUShort(cache); - string fieldName = Encoding.ASCII.GetString(ReadData(fieldNameLength, cache)); - object fieldValue = ReadNbtField(cache, fieldType); - - // This will override previous tags with the same name - nbtData[fieldName] = fieldValue; - } - } - - /// - /// Read a single Named Binary Tag field of the specified type and remove it from the cache - /// - private object ReadNbtField(Queue cache, int fieldType) - { - switch (fieldType) - { - case 1: // TAG_Byte - return ReadNextByte(cache); - case 2: // TAG_Short - return ReadNextShort(cache); - case 3: // TAG_Int - return ReadNextInt(cache); - case 4: // TAG_Long - return ReadNextLong(cache); - case 5: // TAG_Float - return ReadNextFloat(cache); - case 6: // TAG_Double - return ReadNextDouble(cache); - case 7: // TAG_Byte_Array - return ReadData(ReadNextInt(cache), cache); - case 8: // TAG_String - return Encoding.UTF8.GetString(ReadData(ReadNextUShort(cache), cache)); - case 9: // TAG_List - int listType = ReadNextByte(cache); - int listLength = ReadNextInt(cache); - object[] listItems = new object[listLength]; - for (int i = 0; i < listLength; i++) - listItems[i] = ReadNbtField(cache, listType); - return listItems; - case 10: // TAG_Compound - return ReadNextNbt(cache, false); - case 11: // TAG_Int_Array - listType = 3; - listLength = ReadNextInt(cache); - listItems = new object[listLength]; - for (int i = 0; i < listLength; i++) - listItems[i] = ReadNbtField(cache, listType); - return listItems; - case 12: // TAG_Long_Array - listType = 4; - listLength = ReadNextInt(cache); - listItems = new object[listLength]; - for (int i = 0; i < listLength; i++) - listItems[i] = ReadNbtField(cache, listType); - return listItems; - default: - throw new System.IO.InvalidDataException("Failed to decode NBT: Unknown field type " + fieldType); - } - } - - /// - /// Read a Entity MetaData and remove it from the cache - /// - /// - /// - /// - /// - /// - /// - public Dictionary ReadNextMetadata(Queue cache, ItemPalette itemPalette, - EntityMetadataPalette metadataPalette) - { - try - { - Dictionary data = new(); - byte key = ReadNextByte(cache); - byte terminteValue = protocolversion <= Protocol18Handler.MC_1_8_Version - ? (byte)0x7f // 1.8 (https://wiki.vg/index.php?title=Entity_metadata&oldid=6220#Entity_Metadata_Format) - : (byte)0xff; // 1.9+ - - while (key != terminteValue) - { - int typeId = protocolversion <= Protocol18Handler.MC_1_8_Version - ? key >> 5 // 1.8 - : ReadNextVarInt(cache); // 1.9+ - - EntityMetaDataType type; - try - { - type = metadataPalette.GetDataType(typeId); - } - catch (KeyNotFoundException) - { - throw new System.IO.InvalidDataException("Unknown Metadata Type ID " + typeId + - ". Is this up to date for new MC Version?"); - } - - if (protocolversion <= Protocol18Handler.MC_1_8_Version) - key = (byte)(key & 0x1f); - - // Value's data type is depended on Type - object? value = null; - - switch (type) - { - case EntityMetaDataType.Short: // 1.8 only - value = ReadNextShort(cache); - break; - case EntityMetaDataType.Int: // 1.8 only - value = ReadNextInt(cache); - break; - case EntityMetaDataType.Vector3Int: // 1.8 only - value = new List() - { - ReadNextInt(cache), - ReadNextInt(cache), - ReadNextInt(cache), - }; - break; - case EntityMetaDataType.Byte: // byte - value = ReadNextByte(cache); - break; - case EntityMetaDataType.VarInt: // VarInt - value = ReadNextVarInt(cache); - break; - case EntityMetaDataType.VarLong: // Long - value = ReadNextVarLong(cache); - break; - case EntityMetaDataType.Float: // Float - value = ReadNextFloat(cache); - break; - case EntityMetaDataType.String: // String - value = ReadNextString(cache); - break; - case EntityMetaDataType.Chat: // Chat - value = ReadNextChat(cache); - break; - case EntityMetaDataType.OptionalChat: // Optional Chat - if (ReadNextBool(cache)) - value = ReadNextChat(cache); - break; - case EntityMetaDataType.Slot: // Slot - value = ReadNextItemSlot(cache, itemPalette); - break; - case EntityMetaDataType.Boolean: // Boolean - value = ReadNextBool(cache); - break; - case EntityMetaDataType.Rotation: // Rotation (3x floats) - value = new List - { - ReadNextFloat(cache), - ReadNextFloat(cache), - ReadNextFloat(cache) - }; - break; - case EntityMetaDataType.Position: // Position - value = ReadNextLocation(cache); - break; - case EntityMetaDataType.OptionalPosition: // Optional Position - if (ReadNextBool(cache)) - { - value = ReadNextLocation(cache); - } - - break; - case EntityMetaDataType.Direction: // Direction (VarInt) - value = ReadNextVarInt(cache); - break; - case EntityMetaDataType.OptionalUuid: // Optional UUID - case EntityMetaDataType.OptionalLivingEntityReference: // Optional Living Entity Reference (1.21.5+, same wire format) - if (ReadNextBool(cache)) - { - value = ReadNextUUID(cache); - } - - break; - case EntityMetaDataType.BlockId: // BlockID (VarInt) - value = ReadNextVarInt(cache); - break; - case EntityMetaDataType.OptionalBlockId: // Optional BlockID (VarInt) - value = ReadNextVarInt(cache); - break; - case EntityMetaDataType.Nbt: // NBT - value = ReadNextNbt(cache); - break; - case EntityMetaDataType.Particle: // Particle - ReadParticleData(cache, itemPalette); - break; - case EntityMetaDataType.Particles: // List of Particle (1.20.6+) - int particleCount = ReadNextVarInt(cache); - for (int i = 0; i < particleCount; i++) - ReadParticleData(cache, itemPalette); - break; - case EntityMetaDataType.VillagerData: // Villager Data (3x VarInt) - value = new List - { - ReadNextVarInt(cache), - ReadNextVarInt(cache), - ReadNextVarInt(cache) - }; - break; - case EntityMetaDataType.OptionalVarInt: // Optional VarInt - - if (protocolversion < Protocol18Handler.MC_1_20_6_Version) - { - if (ReadNextBool(cache)) - value = ReadNextVarInt(cache); - } - else value = ReadNextVarInt(cache); - - break; - case EntityMetaDataType.Pose: // Pose - value = ReadNextVarInt(cache); - break; - case EntityMetaDataType.CatVariant: // Cat Variant - case EntityMetaDataType.CatSoundVariant: // Cat Sound Variant (26.1+) - value = ReadNextVarInt(cache); - break; - case EntityMetaDataType.CowVariant: // Cow Variant (1.21.5+) - case EntityMetaDataType.CowSoundVariant: // Cow Sound Variant (26.1+) - case EntityMetaDataType.WolfVariant: // Wolf Variant (1.20.6+) - case EntityMetaDataType.WolfSoundVariant: // Wolf Sound Variant (1.21.5+) - value = ReadNextVarInt(cache); - break; - case EntityMetaDataType.FrogVariant: // Frog Variant - case EntityMetaDataType.PigVariant: // Pig Variant (1.21.5+) - case EntityMetaDataType.PigSoundVariant: // Pig Sound Variant (26.1+) - case EntityMetaDataType.ChickenVariant: // Chicken Variant (1.21.5+) - case EntityMetaDataType.ChickenSoundVariant: // Chicken Sound Variant (26.1+) - value = ReadNextVarInt(cache); - break; - case EntityMetaDataType.GlobalPosition: // GlobalPos - // Dimension and blockPos, currently not in use - value = new Tuple(ReadNextString(cache), ReadNextLocation(cache)); - break; - case EntityMetaDataType.OptionalGlobalPosition: - // FIXME: wiki.vg is bool + string + location - // but minecraft-data is bool + string - if (ReadNextBool(cache)) - { - // Dimension and blockPos, currently not in use - value = new Tuple(ReadNextString(cache), ReadNextLocation(cache)); - } - - break; - case EntityMetaDataType.PaintingVariant: // Painting Variant - value = ReadNextVarInt(cache); - break; - case EntityMetaDataType.SnifferState: // Sniffer state - value = ReadNextVarInt(cache); - break; - case EntityMetaDataType.ArmadilloState: // Armadillo state (1.20.6+) - value = ReadNextVarInt(cache); - break; - case EntityMetaDataType.CopperGolemState: // Copper Golem state (1.21.9+) - case EntityMetaDataType.WeatheringCopperState: // Weathering Copper state (1.21.9+) - value = ReadNextVarInt(cache); - break; - case EntityMetaDataType.ZombieNautilusVariant: // ZombieNautilus Variant (1.21.11+) - case EntityMetaDataType.HumanoidArm: // Humanoid Arm (1.21.11+) - value = ReadNextVarInt(cache); - break; - case EntityMetaDataType.ResolvableProfile: // ResolvableProfile (1.21.9+) - ReadNextResolvableProfile(cache); - break; - case EntityMetaDataType.Vector3: // Vector 3f - value = new List - { - ReadNextFloat(cache), - ReadNextFloat(cache), - ReadNextFloat(cache) - }; - break; - case EntityMetaDataType.Quaternion: // Quaternion - value = new List - { - ReadNextFloat(cache), - ReadNextFloat(cache), - ReadNextFloat(cache), - ReadNextFloat(cache) - }; - break; - } - - data[key] = value; - key = ReadNextByte(cache); - } - - return data; - } - catch (Exception) - { - return new Dictionary(); - } - } - - private static bool HasLpVec3Continuation(int firstByte) => (firstByte & 4) == 4; - - private static double UnpackLpVec3(long packedAxis) - { - return Math.Min((double)(packedAxis & 32767L), 32766.0) * 2.0 / 32766.0 - 1.0; - } - - /// - /// Read and decode an LpVec3 (low-precision vec3) from the cache (1.21.9+). - /// Returned vector is expressed in blocks per tick. - /// - public (double X, double Y, double Z) ReadNextLpVec3Values(Queue cache) - { - int first = ReadNextByte(cache); - if (first == 0) - return (0.0, 0.0, 0.0); - - int second = ReadNextByte(cache); - uint high = (uint)ReadNextInt(cache); - long packed = ((long)high << 16) | (long)(second << 8) | (uint)first; - - long scale = first & 3; - if (HasLpVec3Continuation(first)) - scale |= ((long)ReadNextVarInt(cache) & 0xFFFFFFFFL) << 2; - - return ( - UnpackLpVec3(packed >> 3) * scale, - UnpackLpVec3(packed >> 18) * scale, - UnpackLpVec3(packed >> 33) * scale - ); - } - - /// - /// Read an LpVec3 (low-precision vec3) from the cache (1.21.9+) and discard it. - /// - public void ReadNextLpVec3(Queue cache) - { - ReadNextLpVec3Values(cache); - } - - /// - /// Consume bytes for a ResolvableProfile (1.21.9+). - /// Wire: Either(GameProfile, Partial) + PlayerSkin.Patch - /// - private void ReadNextResolvableProfile(Queue cache) - { - bool isFullProfile = ReadNextBool(cache); // Either flag: true=GameProfile, false=Partial - if (isFullProfile) - { - ReadNextUUID(cache); // UUID - ReadNextString(cache); // player name (max 16 chars) - ReadGameProfileProperties(cache); - } - else - { - // Partial: optional name, optional UUID, properties - if (ReadNextBool(cache)) - ReadNextString(cache); // optional player name - if (ReadNextBool(cache)) - ReadNextUUID(cache); // optional UUID - ReadGameProfileProperties(cache); - } - - // PlayerSkin.Patch: 4 optional fields - // body (optional ResourceLocation string) - if (ReadNextBool(cache)) - ReadNextString(cache); - // cape - if (ReadNextBool(cache)) - ReadNextString(cache); - // elytra - if (ReadNextBool(cache)) - ReadNextString(cache); - // model (optional bool: true=SLIM, false=WIDE) - if (ReadNextBool(cache)) - ReadNextBool(cache); - } - - /// - /// Read GameProfile properties (PropertyMap): VarInt count, then per entry: - /// name string, value string, optional signature string. - /// - private void ReadGameProfileProperties(Queue cache) - { - int count = ReadNextVarInt(cache); - for (int i = 0; i < count; i++) - { - ReadNextString(cache); // property name - ReadNextString(cache); // property value - if (ReadNextBool(cache)) // has signature? - ReadNextString(cache); // signature - } - } - - /// - /// Currently not handled. Reading data only - /// - /// - /// - public void ReadParticleData(Queue cache, ItemPalette itemPalette) - { - if (protocolversion < Protocol18Handler.MC_1_13_Version) - return; - - var particleId = ReadNextVarInt(cache); - - // Documentation: - // 1.19.3+ - https://wiki.vg/index.php?title=Data_types&oldid=17986 - // 1.18 - https://wiki.vg/index.php?title=Data_types&oldid=17180 - // 1.17 - https://wiki.vg/index.php?title=Data_types&oldid=16740 - // 1.15 - https://wiki.vg/index.php?title=Data_types&oldid=15338 - // 1.13 - https://wiki.vg/index.php?title=Data_types&oldid=14271 - - switch (particleId) - { - case 1: // 1.20.6+ - if (protocolversion >= Protocol18Handler.MC_1_20_6_Version) - ReadNextVarInt(cache); // BlockState (minecraft:block) - break; - - case 2: - // 1.18 - if (protocolversion > Protocol18Handler.MC_1_17_1_Version) - ReadNextVarInt(cache); // Block state (minecraft:block before 1.20.6, minecraft:block_marker in 1.20.6+) - break; - case 3: - if (protocolversion is (< Protocol18Handler.MC_1_17_Version or > Protocol18Handler.MC_1_17_1_Version) - and < Protocol18Handler.MC_1_20_6_Version) - ReadNextVarInt( - cache); // Block State (minecraft:block before 1.18, minecraft:block_marker after 1.18 up to 1.20.6) - break; - case 4: - if (protocolversion is Protocol18Handler.MC_1_17_Version or Protocol18Handler.MC_1_17_1_Version) - ReadNextVarInt(cache); // Block State (minecraft:block) - break; - case 11: - // 1.13 - 1.14.4 - if (protocolversion < Protocol18Handler.MC_1_15_Version) - ReadDustParticle(cache); - break; - case 13: - // 1.20.6+ - minecraft:dust - ReadDustParticle(cache); - break; - case 14: - switch (protocolversion) - { - // 1.15 - 1.16.5 and 1.18 - 1.20.4 - case >= Protocol18Handler.MC_1_15_Version and < Protocol18Handler.MC_1_17_Version - or > Protocol18Handler.MC_1_17_1_Version and < Protocol18Handler.MC_1_20_6_Version: - ReadDustParticle(cache); - break; - // 1.20.6+ - case >= Protocol18Handler.MC_1_20_6_Version: - ReadDustParticleColorTransition(cache); - break; - } - - break; - case 15: - switch (protocolversion) - { - case Protocol18Handler.MC_1_17_Version or Protocol18Handler.MC_1_17_1_Version: - ReadDustParticle(cache); - break; - // 1.18 - 1.20.4 - case > Protocol18Handler.MC_1_17_1_Version and < Protocol18Handler.MC_1_20_6_Version: - ReadDustParticleColorTransition(cache); - break; - } - - break; - case 16: - if (protocolversion is Protocol18Handler.MC_1_17_Version or Protocol18Handler.MC_1_17_1_Version) - ReadDustParticleColorTransition(cache); - break; - case 20: - // 1.20.6+ - if (protocolversion >= Protocol18Handler.MC_1_20_6_Version) - ReadNextInt(cache); // minecraft:entity_effect - break; - case 23: - // 1.15 - 1.16.5 - if (protocolversion is >= Protocol18Handler.MC_1_15_Version and < Protocol18Handler.MC_1_17_Version) - ReadNextVarInt(cache); // Block State (minecraft:falling_dust) - break; - case 24: - // 1.18 - 1.19.3 - if (protocolversion is > Protocol18Handler.MC_1_17_1_Version - and < Protocol18Handler.MC_1_19_3_Version) - ReadNextVarInt(cache); // Block State (minecraft:falling_dust) - break; - case 25: - // 1.17 - 1.17.1 and 1.19.3 - 1.20.4 - if (protocolversion is Protocol18Handler.MC_1_17_Version or Protocol18Handler.MC_1_17_1_Version - or (>= Protocol18Handler.MC_1_19_3_Version and < Protocol18Handler.MC_1_20_6_Version)) - ReadNextVarInt(cache); // Block State (minecraft:falling_dust) - break; - case 27: - // 1.13 - 1.14.4 - if (protocolversion < Protocol18Handler.MC_1_15_Version) - ReadNextItemSlot(cache, itemPalette); // Item (minecraft:item) - break; - case 28: - // 1.20.6+ - if (protocolversion >= Protocol18Handler.MC_1_20_6_Version) - ReadNextVarInt(cache); // minecraft:falling_dust (BlockState) - break; - case 30: - // 1.19.3 - 1.20.4 - if (protocolversion is >= Protocol18Handler.MC_1_19_3_Version and < Protocol18Handler.MC_1_20_6_Version) - ReadNextFloat(cache); // Roll (minecraft:sculk_charge) - break; - case 32: - // 1.15 - 1.16.5 - if (protocolversion is >= Protocol18Handler.MC_1_15_Version and < Protocol18Handler.MC_1_17_Version) - ReadNextItemSlot(cache, itemPalette); // Item (minecraft:item) - break; - case 35: - // 1.20.6+ - if (protocolversion >= Protocol18Handler.MC_1_20_6_Version) - ReadNextFloat(cache); // minecraft:sculk_charge (Roll) - break; - case 36: - switch (protocolversion) - { - // 1.17 - 1.17.1 - case Protocol18Handler.MC_1_17_Version or Protocol18Handler.MC_1_17_1_Version: - ReadNextItemSlot(cache, itemPalette); // Item (minecraft:item) - break; - // 1.18 - 1.19.2 - case > Protocol18Handler.MC_1_17_1_Version and < Protocol18Handler.MC_1_19_3_Version: - // minecraft:vibration - ReadNextLocation(cache); // Origin (Starting Position) - ReadNextLocation(cache); // Destination (Ending Position) - ReadNextVarInt(cache); // Ticks - break; - } - - break; - case 37: - // minecraft:vibration - 1.17 - 1.17.1 - if (protocolversion is Protocol18Handler.MC_1_17_Version or Protocol18Handler.MC_1_17_1_Version) - { - ReadNextDouble(cache); // Origin X - ReadNextDouble(cache); // Origin Y - ReadNextDouble(cache); // Origin Z - ReadNextDouble(cache); // Destination X - ReadNextDouble(cache); // Destination Y - ReadNextDouble(cache); // Destination Z - ReadNextInt(cache); // Ticks - } - - break; - case 39: - // 1.19.3 - 1.20.4 - if (protocolversion is >= Protocol18Handler.MC_1_19_3_Version and < Protocol18Handler.MC_1_20_6_Version) - ReadNextItemSlot(cache, itemPalette); // Item (minecraft:item) - break; - case 40: - // 1.19.3 - 1.20.4 - if (protocolversion is >= Protocol18Handler.MC_1_19_3_Version and < Protocol18Handler.MC_1_20_6_Version) - { - var positionSourceType = ReadNextString(cache); - switch (positionSourceType) - { - case "minecraft:block": - ReadNextLocation(cache); - break; - case "minecraft:entity": - ReadNextVarInt(cache); - ReadNextFloat(cache); - break; - } - - ReadNextVarInt(cache); - } - - break; - case 44: - // 1.20.6+ - if (protocolversion >= Protocol18Handler.MC_1_20_6_Version) - ReadNextItemSlot(cache, itemPalette); // minecraft:item (Item) - break; - case 45: - // 1.21+ - if (protocolversion >= Protocol18Handler.MC_1_21_Version) - ReadVibration(cache); - break; - case 99: - // 1.20.6+ - if (protocolversion >= Protocol18Handler.MC_1_20_6_Version) - ReadNextVarInt(cache); // minecraft:shriek (Delay) - break; - case 105: - // 1.20.6+ - if (protocolversion >= Protocol18Handler.MC_1_20_6_Version) - ReadNextVarInt(cache); // minecraft:dust_pillar (BlockState) - break; - } - } - - private void ReadDustParticle(Queue cache) - { - ReadNextFloat(cache); // Red - ReadNextFloat(cache); // Green - ReadNextFloat(cache); // Blue - ReadNextFloat(cache); // Scale - } - - private void ReadDustParticleColorTransition(Queue cache) - { - ReadNextFloat(cache); // From red - ReadNextFloat(cache); // From green - ReadNextFloat(cache); // From blue - ReadNextFloat(cache); // To red - ReadNextFloat(cache); // To green - ReadNextFloat(cache); // To blue - ReadNextFloat(cache); // Scale - } - - private void ReadVibration(Queue cache) - { - ReadNextVarInt(cache); // Position Source Type - ReadNextLocation(cache); // Block Position - ReadNextVarInt(cache); // Entity ID - ReadNextFloat(cache); // Entity eye height - ReadNextVarInt(cache); // Ticks - } - - /// - /// Read a single villager trade from a cache of bytes and remove it from the cache - /// - /// The item that was read or NULL for an empty slot - public VillagerTrade ReadNextTrade(Queue cache, ItemPalette itemPalette) - { - Item inputItem1 = ReadNextTradeCost(cache, itemPalette)!; - Item outputItem = ReadNextItemSlot(cache, itemPalette)!; - - Item? inputItem2 = null; - - if (protocolversion >= Protocol18Handler.MC_1_20_6_Version) - inputItem2 = ReadNextOptionalTradeCost(cache, itemPalette); - else if (protocolversion >= Protocol18Handler.MC_1_19_3_Version) - inputItem2 = ReadNextItemSlot(cache, itemPalette); - else - { - if (ReadNextBool(cache)) //check if villager has second item - inputItem2 = ReadNextItemSlot(cache, itemPalette); - } - - bool tradeDisabled = ReadNextBool(cache); - int numberOfTradeUses = ReadNextInt(cache); - int maximumNumberOfTradeUses = ReadNextInt(cache); - int xp = ReadNextInt(cache); - int specialPrice = ReadNextInt(cache); - float priceMultiplier = ReadNextFloat(cache); - int demand = ReadNextInt(cache); - return new VillagerTrade(inputItem1, outputItem, inputItem2, tradeDisabled, numberOfTradeUses, - maximumNumberOfTradeUses, xp, specialPrice, priceMultiplier, demand); - } - - private Item? ReadNextTradeCost(Queue cache, ItemPalette itemPalette) - { - if (protocolversion < Protocol18Handler.MC_1_20_6_Version) - return ReadNextItemSlot(cache, itemPalette); - - var itemId = ReadNextVarInt(cache); - var itemCount = ReadNextVarInt(cache); - var item = new Item(itemPalette.FromId(itemId), itemCount, null); - var componentCount = ReadNextVarInt(cache); - - if (componentCount > 0) - { - var structuredComponentHandler = new StructuredComponentsHandler(protocolversion, this, itemPalette); - var components = new List(componentCount); - for (var i = 0; i < componentCount; i++) - { - var componentTypeId = ReadNextVarInt(cache); - components.Add(structuredComponentHandler.Parse(componentTypeId, cache)); - } - - item.Components = components; - } - - return item; - } - - private Item? ReadNextOptionalTradeCost(Queue cache, ItemPalette itemPalette) - { - if (!ReadNextBool(cache)) - return null; - - return ReadNextTradeCost(cache, itemPalette); - } - - public string ReadNextChat(Queue cache) - { - if (protocolversion >= Protocol18Handler.MC_1_20_4_Version) - { - // Vanilla 1.20.4+ uses NBT here, but Hypixel exposed a JSON-string fallback on the same path. - Queue fallbackCache = new(cache); - try - { - var r = ReadNextNbt(cache); - return ChatParser.ParseText(r); - } - catch (System.IO.InvalidDataException) - { - cache.Clear(); - foreach (var b in fallbackCache) - cache.Enqueue(b); - } - } - - // Read as String - var json = ReadNextString(cache); - return ChatParser.ParseText(json); - } - - /// - /// Build an uncompressed Named Binary Tag blob for sending over the network - /// - /// Dictionary to encode as Nbt - /// Byte array for this NBT tag - public byte[] GetNbt(Dictionary? nbt) - { - return GetNbt(nbt, true); - } - - public byte[] GetNbtTag(object? tag) - { - if (tag is null) - return [0]; - - var tagData = GetNbtField(tag, out var tagType); - var data = new List { tagType }; - data.AddRange(tagData); - return data.ToArray(); - } - - /// - /// Build an uncompressed Named Binary Tag blob for sending over the network (internal) - /// - /// Dictionary to encode as Nbt - /// TRUE if starting a new NBT tag, FALSE if processing a nested NBT tag - /// Byte array for this NBT tag - private byte[] GetNbt(Dictionary? nbt, bool root) - { - if (nbt is null || nbt.Count == 0) - return [0]; // TAG_End - - List bytes = new(); - - if (root) - { - if (protocolversion >= Protocol18Handler.MC_1_20_4_Version - && nbt.Count == 1 - && nbt.TryGetValue("", out var rootVal) && rootVal is string rootStr) - { - bytes.Add(8); // TAG_String - var strBytes = Encoding.UTF8.GetBytes(rootStr); - bytes.AddRange(GetUShort((ushort)strBytes.Length)); - bytes.AddRange(strBytes); - return bytes.ToArray(); - } - - bytes.Add(10); // TAG_Compound - - if (protocolversion < Protocol18Handler.MC_1_20_2_Version) - { - string? rootName = null; - - if (nbt.ContainsKey("")) - rootName = nbt[""] as string; - - rootName ??= ""; - - bytes.AddRange(GetUShort((ushort)rootName.Length)); - bytes.AddRange(Encoding.ASCII.GetBytes(rootName)); - } - } - - foreach (var item in nbt) - { - // Skip NBT root name - if (item.Key == "" && root) - continue; - - byte[] fieldNameLength = GetUShort((ushort)item.Key.Length); - byte[] fieldName = Encoding.ASCII.GetBytes(item.Key); - byte[] fieldData = GetNbtField(item.Value, out byte fieldType); - bytes.Add(fieldType); - bytes.AddRange(fieldNameLength); - bytes.AddRange(fieldName); - bytes.AddRange(fieldData); - } - - bytes.Add(0); // TAG_End - return bytes.ToArray(); - } - - /// - /// Convert a single object into its NBT representation (internal) - /// - /// Object to convert - /// Field type for the passed object - /// Binary data for the passed object - private byte[] GetNbtField(object obj, out byte fieldType) - { - if (obj is byte) - { - fieldType = 1; // TAG_Byte - return new[] { (byte)obj }; - } - else if (obj is short) - { - fieldType = 2; // TAG_Short - return GetShort((short)obj); - } - else if (obj is int) - { - fieldType = 3; // TAG_Int - return GetInt((int)obj); - } - else if (obj is long) - { - fieldType = 4; // TAG_Long - return GetLong((long)obj); - } - else if (obj is float) - { - fieldType = 5; // TAG_Float - return GetFloat((float)obj); - } - else if (obj is double) - { - fieldType = 6; // TAG_Double - return GetDouble((double)obj); - } - else if (obj is byte[]) - { - fieldType = 7; // TAG_Byte_Array - return (byte[])obj; - } - else if (obj is string) - { - fieldType = 8; // TAG_String - byte[] stringBytes = Encoding.UTF8.GetBytes((string)obj); - return ConcatBytes(GetUShort((ushort)stringBytes.Length), stringBytes); - } - else if (obj is object[]) - { - fieldType = 9; // TAG_List - - List list = new((object[])obj); - int arrayLengthTotal = list.Count; - - // Treat empty list as TAG_Byte, length 0 - if (arrayLengthTotal == 0) - return ConcatBytes(new[] { (byte)1 }, GetInt(0)); - - // Encode first list item, retain its type - string firstItemTypeString = list[0].GetType().Name; - byte[] firstItemBytes = GetNbtField(list[0], out byte firstItemType); - list.RemoveAt(0); - - // Encode further list items, check they have the same type - List subsequentItemsBytes = new(); - foreach (object item in list) - { - subsequentItemsBytes.AddRange(GetNbtField(item, out byte subsequentItemType)); - if (subsequentItemType != firstItemType) - throw new System.IO.InvalidDataException( - "GetNbt: Cannot encode object[] list with mixed types: " + firstItemTypeString + ", " + - item.GetType().Name + " into NBT!"); - } - - // Build NBT list: type, length, item array - return ConcatBytes(new[] { firstItemType }, GetInt(arrayLengthTotal), firstItemBytes, - subsequentItemsBytes.ToArray()); - } - else if (obj is Dictionary) - { - fieldType = 10; // TAG_Compound - return GetNbt((Dictionary)obj, false); - } - else if (obj is int[]) - { - fieldType = 11; // TAG_Int_Array - - int[] srcIntList = (int[])obj; - List encIntList = new(); - encIntList.AddRange(GetInt(srcIntList.Length)); - foreach (int item in srcIntList) - encIntList.AddRange(GetInt(item)); - return encIntList.ToArray(); - } - else if (obj is long[]) - { - fieldType = 12; // TAG_Long_Array - - long[] srcLongList = (long[])obj; - List encLongList = new(); - encLongList.AddRange(GetInt(srcLongList.Length)); - foreach (long item in srcLongList) - encLongList.AddRange(GetLong(item)); - return encLongList.ToArray(); - } - else - { - throw new System.IO.InvalidDataException("GetNbt: Cannot encode data type " + obj.GetType().Name + - " into NBT!"); - } - } - - /// - /// Build an integer for sending over the network - /// - /// Integer to encode - /// Byte array for this integer - public static byte[] GetVarInt(int paramInt) - { - List bytes = new(); - while ((paramInt & -128) != 0) - { - bytes.Add((byte)(paramInt & 127 | 128)); - paramInt = (int)(((uint)paramInt) >> 7); - } - - bytes.Add((byte)paramInt); - return bytes.ToArray(); - } - - /// - /// Build an boolean for sending over the network - /// - /// Boolean to encode - /// Byte array for this boolean - public byte[] GetBool(bool paramBool) - { - List bytes = new() - { - Convert.ToByte(paramBool) - }; - return bytes.ToArray(); - } - - /// - /// Get byte array representing a long integer - /// - /// Long to process - /// Array ready to send - public static byte[] GetLong(long number) - { - byte[] theLong = BitConverter.GetBytes(number); - Array.Reverse(theLong); - return theLong; - } - - /// - /// Get byte array representing a long integer - /// - /// Long to process - /// Array ready to send - public static byte[] GetULong(ulong number) - { - byte[] theLong = BitConverter.GetBytes(number); - Array.Reverse(theLong); - return theLong; - } - - /// - /// Get byte array representing an integer - /// - /// Integer to process - /// Array ready to send - public static byte[] GetInt(int number) - { - byte[] theInt = BitConverter.GetBytes(number); - Array.Reverse(theInt); - return theInt; - } - - /// - /// Get byte array representing a short - /// - /// Short to process - /// Array ready to send - public byte[] GetShort(short number) - { - byte[] theShort = BitConverter.GetBytes(number); - Array.Reverse(theShort); - return theShort; - } - - /// - /// Get byte array representing an unsigned short - /// - /// Short to process - /// Array ready to send - public byte[] GetUShort(ushort number) - { - byte[] theShort = BitConverter.GetBytes(number); - Array.Reverse(theShort); - return theShort; - } - - /// - /// Get byte array representing a double - /// - /// Double to process - /// Array ready to send - public byte[] GetDouble(double number) - { - byte[] theDouble = BitConverter.GetBytes(number); - Array.Reverse(theDouble); //Endianness - return theDouble; - } - - /// - /// Get byte array representing a float - /// - /// Floalt to process - /// Array ready to send - public byte[] GetFloat(float number) - { - byte[] theFloat = BitConverter.GetBytes(number); - Array.Reverse(theFloat); //Endianness - return theFloat; - } - - /// - /// Get byte array with length information prepended to it - /// - /// Array to process - /// Array ready to send - public byte[] GetArray(byte[] array) - { - if (protocolversion < Protocol18Handler.MC_1_8_Version) - { - byte[] length = BitConverter.GetBytes((short)array.Length); - Array.Reverse(length); //Endianness - return ConcatBytes(length, array); - } - else return ConcatBytes(GetVarInt(array.Length), array); - } - - /// - /// Get a byte array from the given string for sending over the network, with length information prepended. - /// - /// String to process - /// Array ready to send - public byte[] GetString(string text) - { - byte[] bytes = Encoding.UTF8.GetBytes(text); - return ConcatBytes(GetVarInt(bytes.Length), bytes); - } - - /// - /// Get a byte array representing the given location encoded as an unsigned long - /// - /// - /// A modulo will be applied if the location is outside the following ranges: - /// X: -33,554,432 to +33,554,431 - /// Y: -2,048 to +2,047 - /// Z: -33,554,432 to +33,554,431 - /// - /// Location representation as ulong - public byte[] GetLocation(Location location) - { - byte[] locationBytes; - ulong x = (ulong)(int)Math.Floor(location.X) & 0x3FFFFFF; - ulong y = (ulong)(int)Math.Floor(location.Y) & 0xFFF; - ulong z = (ulong)(int)Math.Floor(location.Z) & 0x3FFFFFF; - if (protocolversion >= Protocol18Handler.MC_1_14_Version) - { - locationBytes = BitConverter.GetBytes((x << 38) | (z << 12) | y); - } - else - locationBytes = BitConverter.GetBytes((x << 38) | (y << 26) | z); - - Array.Reverse(locationBytes); //Endianness - return locationBytes; - } - - /// - /// Get a byte array representing the given item as a HashedStack (1.21.5+). - /// Used for serverbound container_click where the server expects HashedStack instead of full ItemStack. - /// Wire format: Optional<ActualItem> where ActualItem = holderRegistry(item_id) + VarInt(count) + HashedPatchMap. - /// Since MCC doesn't track component hashes, we send an empty HashedPatchMap (0 added, 0 removed). - /// The server will detect the stateId mismatch and resync. - /// - public byte[] GetHashedItemSlot(Item? item, ItemPalette itemPalette) - { - List slotData = new(); - - if (item is null || item.IsEmpty) - { - slotData.AddRange(GetBool(false)); - } - else - { - slotData.AddRange(GetBool(true)); - slotData.AddRange(GetVarInt(itemPalette.ToId(item.Type))); - slotData.AddRange(GetVarInt(item.Count)); - slotData.AddRange(GetVarInt(0)); // HashedPatchMap: 0 added components - slotData.AddRange(GetVarInt(0)); // HashedPatchMap: 0 removed components - } - - return slotData.ToArray(); - } - - /// - /// Get a byte array representing the given item as an item slot - /// - /// Item - /// Item Palette - /// Item slot representation - public byte[] GetItemSlot(Item? item, ItemPalette itemPalette) - { - List slotData = new(); - - if (protocolversion >= Protocol18Handler.MC_1_20_6_Version) - { - if (item is null || item.IsEmpty) - { - slotData.AddRange(GetVarInt(0)); - } - else - { - slotData.AddRange(GetVarInt(item.Count)); - slotData.AddRange(GetVarInt(itemPalette.ToId(item.Type))); - - if (item.Components is not null && item.Components.Count > 0) - { - slotData.AddRange(GetVarInt(item.Components.Count)); - slotData.AddRange(GetVarInt(0)); // components to remove - foreach (var component in item.Components) - { - slotData.AddRange(GetVarInt(component.TypeId)); - var serialized = component.Serialize(); - slotData.AddRange(serialized); - } - } - else - { - slotData.AddRange(GetVarInt(0)); // no components to add - slotData.AddRange(GetVarInt(0)); // no components to remove - } - } - } - else if (protocolversion >= Protocol18Handler.MC_1_13_2_Version) - { - if (item is null || item.IsEmpty) - slotData.AddRange(GetBool(false)); - else - { - slotData.AddRange(GetBool(true)); - slotData.AddRange(GetVarInt(itemPalette.ToId(item.Type))); - slotData.Add((byte)item.Count); - slotData.AddRange(GetNbt(item.NBT)); - } - } - else if (protocolversion >= Protocol18Handler.MC_1_13_Version) - { - if (item is null || item.IsEmpty) - slotData.AddRange(GetShort(-1)); - else - { - slotData.AddRange(GetShort((short)itemPalette.ToId(item.Type))); - slotData.Add((byte)item.Count); - slotData.AddRange(GetNbt(item.NBT)); - } - } - else - { - if (item is null || item.IsEmpty) - slotData.AddRange(GetShort(-1)); - else - { - slotData.AddRange(GetShort((short)(itemPalette.ToId(item.Type) >> 16))); - slotData.Add((byte)item.Count); - // Legacy (<1.13) item slot wire format uses a SHORT for item damage/data. - slotData.AddRange(GetShort((short)item.Data)); - slotData.AddRange(GetNbt(item.NBT)); - } - } - - return slotData.ToArray(); - } - - /// - /// Get a byte array representing the given item as a non-empty ItemStackTemplate. - /// - /// Item - /// Item Palette - /// ItemStackTemplate representation - public byte[] GetItemStackTemplate(Item item, ItemPalette itemPalette) - { - List slotData = new(); - - slotData.AddRange(GetVarInt(itemPalette.ToId(item.Type))); - slotData.AddRange(GetVarInt(item.Count)); - - if (item.Components is not null && item.Components.Count > 0) - { - slotData.AddRange(GetVarInt(item.Components.Count)); - slotData.AddRange(GetVarInt(0)); // components to remove - foreach (var component in item.Components) - { - slotData.AddRange(GetVarInt(component.TypeId)); - var serialized = component.Serialize(); - slotData.AddRange(serialized); - } - } - else - { - slotData.AddRange(GetVarInt(0)); // no components to add - slotData.AddRange(GetVarInt(0)); // no components to remove - } - - return slotData.ToArray(); - } - - /// - /// Get a byte array representing an array of item slots - /// - /// Items - /// Item Palette - /// Array of Item slot representations - public byte[] GetSlotsArray(Dictionary items, ItemPalette itemPalette) - { - byte[] slotsArray = new byte[items.Count]; - - foreach (KeyValuePair item in items) - { - slotsArray = ConcatBytes(slotsArray, GetShort((short)item.Key), GetItemSlot(item.Value, itemPalette)); - } - - return slotsArray; - } - - /// - /// Get protocol block face from Direction - /// - /// Direction - /// Block face byte enum - public byte GetBlockFace(Direction direction) - { - return direction switch - { - Direction.Down => 0, - Direction.Up => 1, - Direction.North => 2, - Direction.South => 3, - Direction.West => 4, - Direction.East => 5, - _ => throw new NotImplementedException("Unknown direction: " + direction.ToString()), - }; - } - - /// - /// Get a byte array from the given uuid - /// - /// UUID of Player/Entity - /// UUID representation - public static byte[] GetUUID(Guid UUID) - { - return UUID.ToBigEndianBytes(); - } - - /// - /// Easily append several byte arrays - /// - /// Bytes to append - /// Array containing all the data - public byte[] ConcatBytes(params byte[][] bytes) - { - List result = new(); - foreach (byte[] array in bytes) - result.AddRange(array); - return result.ToArray(); - } - - /// - /// Convert a byte array to an hexadecimal string representation (for debugging purposes) - /// - /// Byte array - /// String representation - public string ByteArrayToString(byte[]? bytes) - { - if (bytes is null) - return "null"; - else - return BitConverter.ToString(bytes).Replace("-", " "); - } - - /// - /// Write LastSeenMessageList - /// - /// Message.LastSeenMessageList - /// Whether the server is in online mode - /// Message.LastSeenMessageList Packet Data - public byte[] GetLastSeenMessageList(Message.LastSeenMessageList msgList, bool isOnlineMode) - { - if (!isOnlineMode) - return GetVarInt(0); // Message list size - else - { - List fields = new(); - fields.AddRange(GetVarInt(msgList.entries.Length)); // Message list size - foreach (Message.LastSeenMessageList.AcknowledgedMessage entry in msgList.entries) - { - fields.AddRange(entry.profileId.ToBigEndianBytes()); // UUID - fields.AddRange(GetVarInt(entry.signature.Length)); // Signature length - fields.AddRange(entry.signature); // Signature data - } - - return fields.ToArray(); - } - } - - /// - /// Write LastSeenMessageList.Acknowledgment - /// - /// Acknowledgment - /// Whether the server is in online mode - /// Acknowledgment Packet Data - public byte[] GetAcknowledgment(Message.LastSeenMessageList.Acknowledgment ack, bool isOnlineMode) - { - List fields = new(); - fields.AddRange(GetLastSeenMessageList(ack.lastSeen, isOnlineMode)); - if (!isOnlineMode || ack.lastReceived is null) - fields.AddRange(GetBool(false)); // Has last received message - else - { - fields.AddRange(GetBool(true)); - fields.AddRange(ack.lastReceived.profileId.ToBigEndianBytes()); // Has last received message - fields.AddRange(GetVarInt(ack.lastReceived.signature.Length)); // Last received message signature length - fields.AddRange(ack.lastReceived.signature); // Last received message signature data - } - - return fields.ToArray(); - } - } -} diff --git a/MinecraftClient/Protocol/Handlers/Forge/FMLHandshakeClientState.cs b/MinecraftClient/Protocol/Handlers/Forge/FMLHandshakeClientState.cs deleted file mode 100755 index 4bc9bfb2f1..0000000000 --- a/MinecraftClient/Protocol/Handlers/Forge/FMLHandshakeClientState.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace MinecraftClient.Protocol.Handlers.Forge -{ - /// - /// Copy of the forge enum for client states. - /// https://github.com/MinecraftForge/MinecraftForge/blob/ebe9b6d4cbc4a5281c386994f1fbda04df5d2e1f/src/main/java/net/minecraftforge/fml/common/network/handshake/FMLHandshakeClientState.java - /// - enum FMLHandshakeClientState : byte - { - START, - HELLO, - WAITINGSERVERDATA, - WAITINGSERVERCOMPLETE, - PENDINGCOMPLETE, - COMPLETE, - DONE, - ERROR - } -} diff --git a/MinecraftClient/Protocol/Handlers/Forge/FMLHandshakeDiscriminator.cs b/MinecraftClient/Protocol/Handlers/Forge/FMLHandshakeDiscriminator.cs deleted file mode 100755 index 6e9bca461a..0000000000 --- a/MinecraftClient/Protocol/Handlers/Forge/FMLHandshakeDiscriminator.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace MinecraftClient.Protocol.Handlers.Forge -{ - /// - /// Different "discriminator byte" values for the forge handshake. - /// https://github.com/MinecraftForge/MinecraftForge/blob/ebe9b6d4cbc4a5281c386994f1fbda04df5d2e1f/src/main/java/net/minecraftforge/fml/common/network/handshake/FMLHandshakeCodec.java - /// - enum FMLHandshakeDiscriminator : byte - { - ServerHello = 0, - ClientHello = 1, - ModList = 2, - RegistryData = 3, - HandshakeAck = 255, //-1 - HandshakeReset = 254, //-2 - } -} diff --git a/MinecraftClient/Protocol/Handlers/Forge/FMLVersion.cs b/MinecraftClient/Protocol/Handlers/Forge/FMLVersion.cs deleted file mode 100644 index d9980dc3d2..0000000000 --- a/MinecraftClient/Protocol/Handlers/Forge/FMLVersion.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace MinecraftClient.Protocol.Handlers.Forge -{ - /// - /// Version of the FML protocol - /// - /// - enum FMLVersion - { - FML, - FML2, - FML3 - } -} diff --git a/MinecraftClient/Protocol/Handlers/Forge/ForgeInfo.cs b/MinecraftClient/Protocol/Handlers/Forge/ForgeInfo.cs deleted file mode 100755 index 644be909be..0000000000 --- a/MinecraftClient/Protocol/Handlers/Forge/ForgeInfo.cs +++ /dev/null @@ -1,255 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.Forge -{ - /// - /// Contains information about a modded server install. - /// - public class ForgeInfo - { - /// - /// Represents an individual forge mod. - /// - public record ForgeMod(string ModID, string Version) - { - public override string ToString() - { - return ModID + " v" + Version; - } - } - - public List Mods; - internal FMLVersion Version; - - /// - /// Create a new ForgeInfo with the given version. - /// - /// FML version to use - internal ForgeInfo(FMLVersion fmlVersion) - { - switch (fmlVersion) - { - case FMLVersion.FML2: - Mods = new List - { - new ForgeMod("forge", "ANY") - }; - Version = fmlVersion; - break; - case FMLVersion.FML3: - Mods = new List - { - new ForgeMod("forge", "ANY") - }; - Version = fmlVersion; - break; - default: - throw new InvalidOperationException(Translations.error_forgeforce); - } - } - - /// - /// Create a new ForgeInfo from the given data. - /// - /// The modinfo JSON tag. - /// Forge protocol version - internal ForgeInfo(System.Text.Json.Nodes.JsonObject data, FMLVersion fmlVersion) - { - Mods = new List(); - Version = fmlVersion; - - switch (fmlVersion) - { - case FMLVersion.FML: - - // Example ModInfo for Minecraft 1.12 and lower (FML) - - // "modinfo": { - // "type": "FML", - // "modList": [{ - // "modid": "mcp", - // "version": "9.05" - // }, { - // "modid": "FML", - // "version": "8.0.99.99" - // }, { - // "modid": "Forge", - // "version": "11.14.3.1512" - // }, { - // "modid": "rpcraft", - // "version": "Beta 1.3 - 1.8.0" - // }] - // } - - foreach (var mod in data["modList"]!.AsArray()) - { - String modid = mod!["modid"]!.GetStringValue(); - String modversion = mod["version"]!.GetStringValue(); - - Mods.Add(new ForgeMod(modid, modversion)); - } - - break; - - case FMLVersion.FML2: - - // Example ModInfo for Minecraft 1.13 and greater (FML2) - - // "forgeData": { - // "channels": [{ - // "res": "minecraft:unregister", - // "version": "FML2", - // "required": true - // }, { - // "res": "minecraft:register", - // "version": "FML2", - // "required": true - // }], - // "mods": [{ - // "modId": "minecraft", - // "modmarker": "1.15.2" - // }, { - // "modId": "forge", - // "modmarker": "ANY" - // }, { - // "modId": "rats", - // "modmarker": "5.3.2" - // }, { - // "modId": "citadel", - // "modmarker": "1.1.11" - // }], - // "fmlNetworkVersion": 2 - // } - - foreach (var mod in data["mods"]!.AsArray()) - { - String modid = mod!["modId"]!.GetStringValue(); - String modmarker = mod["modmarker"]!.GetStringValue(); - - Mods.Add(new ForgeMod(modid, modmarker)); - } - - break; - case FMLVersion.FML3: - // Example ModInfo for Minecraft 1.18 and greater (FML3) - - // "forgeData": { - // "channels": [], - // "mods": [], - // "truncated": false, // legacy versions see truncated lists, modern versions ignore this truncated flag (binary data has its own) - // "fmlNetworkVersion": 3, - // "d": "ȳ\u0000\u0000ࠨ㐤獋㙖⹌ᦘ̺⸱恤䒸⡑⛧沮婙㨹牥ఈㄵচ₀沮婙㨹牥ఈㄵচ倠⹡岙㜲獥䋊㷍᭳ႇׇ஌᜘㘴娘▅筳ص䰭宛㘲、\u0000ᠸጋ囗湌夜㘲杩棐䐱ᅱ挃☥ోᤗ㌮ఀ׈䬣 坖ɍ䮌ᤘ\r\n旉䠳ዣ◆䲌㜃瑥廮ⷉࠋ–䁠奚Ҵ㔱摜䂸ᅱ獳ౠᡚ㜷汥戊䂸űဓĠ嵛㖱数嫤Ǎ塰䛶ⶎᮚ㞳晲擞ᖝ″ዣ䘆ఋʂ潦令ඕ爈䖔⺁ᥚ⾹潳棤㦥ᬻ挐؅䅀㠹楬ۨ㣄উ瀀渀嬛㘼扩搢䃀熁挂♥\r\n墋㒺摬牜ࣜ䁠嘗湌孛㜴浩惂䠙熙排٥孁㒰ͮ屢Ӏ䠐⚐䷮ᣛ㊴瑳戚䢸熁匒إ஍᜚ܴ䫜巑፻ᚷؠ䀀ㆃ牵䋨㦥ࠫ㋣䗆䂌㨈慲䫬ᖱᮓᘧ汬尚ㆰ٫屲㣄ᆉ恳ಭ川㤷፫擨妅挫♖乮塘 㖱慰\r\n囆䓩\t" - // } - - // 1.18 and greater, the mod list and channel list is compressed to forgeData["d"] for efficiency, - // - Here is how forge encode and decode them: - // https://github.com/MinecraftForge/MinecraftForge/blob/cb12df41e13da576b781be695f80728b9594c25f/src/main/java/net/minecraftforge/network/ServerStatusPing.java#L264 - // - Here is the discussion: - // see https://github.com/MinecraftForge/MinecraftForge/pull/8169 - - string encodedData = data["d"]!.GetStringValue(); - Queue dataPackage = decodeOptimized(encodedData); - DataTypes dataTypes = new DataTypes(Protocol18Handler.MC_1_18_1_Version); - - // - // [ Truncated ][ Bool ] // Unused - // [ Mod Size ][ Unsigned short ] - // - dataTypes.ReadNextBool(dataPackage); // truncated: boolean - var modsSize = dataTypes.ReadNextUShort(dataPackage); - - Dictionary mods = new(); - // Mod Array Definition: - // [ Channel Size And Version Flag ][ VarInt ] // If the value at bit Mask 0x01 is 1, The Mod Version will be ignore. - // // The one-right-shifted int is the Channel List size. - // [ Mod Id ][ String ] - // [ Mod Version ][ Optional String ] // Depends on the Flag above - // [ Channel List ][ Array ] [ Channel Name ][ String ] - // [ Channel Version ][ String ] - // [ Required On Client ][ Bool ] - - for (var i = 0; i < modsSize; i++) - { - var channelSizeAndVersionFlag = dataTypes.ReadNextVarInt(dataPackage); - var channelSize = channelSizeAndVersionFlag >> 1; - - int VERSION_FLAG_IGNORESERVERONLY = 0b1; - var isIgnoreServerOnly = (channelSizeAndVersionFlag & VERSION_FLAG_IGNORESERVERONLY) != 0; - - var modId = dataTypes.ReadNextString(dataPackage); - - string IGNORESERVERONLY = "IGNORED"; - var modVersion = isIgnoreServerOnly ? IGNORESERVERONLY : dataTypes.ReadNextString(dataPackage); - - for (var i1 = 0; i1 < channelSize; i1++) - { - dataTypes.ReadNextString(dataPackage); // channelName - dataTypes.ReadNextString(dataPackage); // channelVersion - dataTypes.ReadNextBool(dataPackage); // requiredOnClient - } - - mods.Add(modId, modVersion); - Mods.Add(new ForgeMod(modId, modVersion)); - } - - // Ignore the left data, which is NonMod Channel List - // [ nonMod Channel Count ][ VarInt ] - // [ nonMod Channel List ][ Array ] [ Channel Name ][ String ] - // [ Channel Version ][ Bool ] - // [ Required On Client ][ Bool ] - - break; - default: - throw new NotImplementedException("FMLVersion '" + fmlVersion + "' not implemented!"); - } - } - - /// - /// Decompress binary data ForgeData["d"] (FML 3) - /// - /// The encoded data. - /// Decoded forge data Queue. - /// - /// 1.18 and greater, the mod list and channel list is compressed for efficiency - /// The code below is converted from forge source code, see: - /// https://github.com/MinecraftForge/MinecraftForge/blob/cb12df41e13da576b781be695f80728b9594c25f/src/main/java/net/minecraftforge/network/ServerStatusPing.java#L361 - /// - private static Queue decodeOptimized(string encodedData) - { - int size0 = encodedData[0]; - int size1 = encodedData[1]; - int size = size0 | (size1 << 15); - - List packageData = new(); - - int stringIndex = 2; - int buffer = 0; - int bitsInBuf = 0; - - while (stringIndex < encodedData.Length) - { - while (bitsInBuf >= 8) - { - packageData.Add((byte)buffer); - buffer >>= 8; - bitsInBuf -= 8; - } - - char c = encodedData[stringIndex]; - buffer |= (c & 0x7FFF) << bitsInBuf; - bitsInBuf += 15; - stringIndex++; - } - - while (packageData.Count < size) - { - packageData.Add((byte)buffer); - buffer >>= 8; - bitsInBuf -= 8; - } - - return new Queue(packageData.ToArray()); - } - } -} diff --git a/MinecraftClient/Protocol/Handlers/Packet/s2c/DeclareCommands.cs b/MinecraftClient/Protocol/Handlers/Packet/s2c/DeclareCommands.cs deleted file mode 100644 index 57f1bb92da..0000000000 --- a/MinecraftClient/Protocol/Handlers/Packet/s2c/DeclareCommands.cs +++ /dev/null @@ -1,785 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.packet.s2c -{ - internal static class DeclareCommands - { - private const byte NodeTypeMask = 0x03; - private const byte NodeExecutableFlag = 0x04; - private const byte NodeRedirectFlag = 0x08; - private const byte NodeCustomSuggestionsFlag = 0x10; - private const byte NodeRestrictedFlag = 0x20; - - private static readonly Dictionary s_argumentTypeCatalog = CreateArgumentTypeCatalog(); - private static readonly ArgumentTypeLayout s_unknownLegacyArgumentType = new("minecraft:unknown"); - - // Generated from tools/gen_command_argument_registry.py with IDE-only registrations excluded. - private static readonly string[] s_modernArgumentTypes1206 = - [ - "brigadier:bool", "brigadier:float", "brigadier:double", "brigadier:integer", "brigadier:long", "brigadier:string", - "entity", "game_profile", "block_pos", "column_pos", "vec3", "vec2", "block_state", "block_predicate", - "item_stack", "item_predicate", "color", "component", "style", "message", "nbt_compound_tag", "nbt_tag", - "nbt_path", "objective", "objective_criteria", "operation", "particle", "angle", "rotation", - "scoreboard_slot", "score_holder", "swizzle", "team", "item_slot", "item_slots", "resource_location", - "function", "entity_anchor", "int_range", "float_range", "dimension", "gamemode", "time", - "resource_or_tag", "resource_or_tag_key", "resource", "resource_key", "template_mirror", - "template_rotation", "heightmap", "loot_table", "loot_predicate", "loot_modifier", "uuid" - ]; - - private static readonly string[] s_modernArgumentTypes1215 = - [ - "brigadier:bool", "brigadier:float", "brigadier:double", "brigadier:integer", "brigadier:long", "brigadier:string", - "entity", "game_profile", "block_pos", "column_pos", "vec3", "vec2", "block_state", "block_predicate", - "item_stack", "item_predicate", "color", "component", "style", "message", "nbt_compound_tag", "nbt_tag", - "nbt_path", "objective", "objective_criteria", "operation", "particle", "angle", "rotation", - "scoreboard_slot", "score_holder", "swizzle", "team", "item_slot", "item_slots", "resource_location", - "function", "entity_anchor", "int_range", "float_range", "dimension", "gamemode", "time", - "resource_or_tag", "resource_or_tag_key", "resource", "resource_key", "resource_selector", - "template_mirror", "template_rotation", "heightmap", "loot_table", "loot_predicate", "loot_modifier", "uuid" - ]; - - private static readonly string[] s_modernArgumentTypes1216 = - [ - "brigadier:bool", "brigadier:float", "brigadier:double", "brigadier:integer", "brigadier:long", "brigadier:string", - "entity", "game_profile", "block_pos", "column_pos", "vec3", "vec2", "block_state", "block_predicate", - "item_stack", "item_predicate", "color", "hex_color", "component", "style", "message", - "nbt_compound_tag", "nbt_tag", "nbt_path", "objective", "objective_criteria", "operation", "particle", - "angle", "rotation", "scoreboard_slot", "score_holder", "swizzle", "team", "item_slot", "item_slots", - "resource_location", "function", "entity_anchor", "int_range", "float_range", "dimension", "gamemode", - "time", "resource_or_tag", "resource_or_tag_key", "resource", "resource_key", "resource_selector", - "template_mirror", "template_rotation", "heightmap", "loot_table", "loot_predicate", "loot_modifier", - "dialog", "uuid" - ]; - - private static int RootIdx = -1; - private static CommandNode[] Nodes = Array.Empty(); - private static bool HasLoadedTree; - internal static string? LastReadError { get; private set; } - - public static bool IsCommandTreeAvailable => HasValidCommandTree(); - - public static void Read(DataTypes dataTypes, Queue packetData, int protocolVersion) - { - Reset(); - ConsoleIO.OnDeclareMinecraftCommand(Array.Empty()); - - try - { - ReadCommandTree(dataTypes, packetData, protocolVersion); - } - catch (Exception ex) - { - LastReadError = ex.ToString(); - Reset(); - } - - ConsoleIO.OnDeclareMinecraftCommand(HasLoadedTree ? ExtractRootCommand() : Array.Empty()); - } - - public static List> CollectSignArguments(string command) - { - List> needSigned = new(); - if (!HasValidCommandTree() || string.IsNullOrEmpty(command)) - return needSigned; - - return TryMatchNode(RootIdx, command, 0, needSigned, out List> matchedArguments) - ? matchedArguments - : []; - } - - private static void ReadCommandTree(DataTypes dataTypes, Queue packetData, int protocolVersion) - { - int count = dataTypes.ReadNextVarInt(packetData); - Nodes = new CommandNode[count]; - - for (int i = 0; i < count; ++i) - { - byte flags = dataTypes.ReadNextByte(packetData); - int[] children = ReadChildIndices(dataTypes, packetData); - int redirectNode = (flags & NodeRedirectFlag) != 0 ? dataTypes.ReadNextVarInt(packetData) : -1; - - CommandNodeKind nodeKind = (CommandNodeKind)(flags & NodeTypeMask); - CommandNode node = nodeKind switch - { - CommandNodeKind.Root => new(flags, children, redirectNode), - CommandNodeKind.Literal => new(flags, children, redirectNode, dataTypes.ReadNextString(packetData)), - CommandNodeKind.Argument => ReadArgumentNode(dataTypes, packetData, protocolVersion, flags, children, redirectNode), - _ => throw new InvalidOperationException($"Unsupported DeclareCommands node type {(byte)nodeKind}.") - }; - - Nodes[i] = node; - } - - RootIdx = dataTypes.ReadNextVarInt(packetData); - HasLoadedTree = IsValidNodeIndex(RootIdx); - } - - private static CommandNode ReadArgumentNode( - DataTypes dataTypes, - Queue packetData, - int protocolVersion, - byte flags, - int[] children, - int redirectNode) - { - string name = dataTypes.ReadNextString(packetData); - int parserId = dataTypes.ReadNextVarInt(packetData); - - if (!TryResolveArgumentTypeLayout(protocolVersion, parserId, out ArgumentTypeLayout layout)) - throw new InvalidOperationException($"Unsupported DeclareCommands argument type id {parserId} for protocol {protocolVersion}."); - - CommandArgumentDescriptor descriptor = ReadArgumentDescriptor(dataTypes, packetData, layout); - string? suggestionsType = (flags & NodeCustomSuggestionsFlag) != 0 ? dataTypes.ReadNextString(packetData) : null; - - return new(flags, children, redirectNode, name, descriptor, suggestionsType, parserId); - } - - private static int[] ReadChildIndices(DataTypes dataTypes, Queue packetData) - { - int childCount = dataTypes.ReadNextVarInt(packetData); - int[] children = new int[childCount]; - - for (int i = 0; i < childCount; ++i) - children[i] = dataTypes.ReadNextVarInt(packetData); - - return children; - } - - private static CommandArgumentDescriptor ReadArgumentDescriptor(DataTypes dataTypes, Queue packetData, ArgumentTypeLayout layout) - { - switch (layout.PayloadKind) - { - case ArgumentPayloadKind.None: - return layout.CreateDescriptor(); - case ArgumentPayloadKind.BrigadierFloat: - ReadNumberBounds(dataTypes, packetData, static (types, data) => types.ReadNextFloat(data)); - return layout.CreateDescriptor(); - case ArgumentPayloadKind.BrigadierDouble: - ReadNumberBounds(dataTypes, packetData, static (types, data) => types.ReadNextDouble(data)); - return layout.CreateDescriptor(); - case ArgumentPayloadKind.BrigadierInteger: - ReadNumberBounds(dataTypes, packetData, static (types, data) => types.ReadNextInt(data)); - return layout.CreateDescriptor(); - case ArgumentPayloadKind.BrigadierLong: - ReadNumberBounds(dataTypes, packetData, static (types, data) => types.ReadNextLong(data)); - return layout.CreateDescriptor(); - case ArgumentPayloadKind.BrigadierString: - ArgumentConsumption consumption = dataTypes.ReadNextVarInt(packetData) switch - { - 0 => ArgumentConsumption.SingleToken, - 1 => ArgumentConsumption.QuotedStringOrWord, - 2 => ArgumentConsumption.GreedyTail, - int stringType => throw new InvalidOperationException($"Unsupported brigadier:string type {stringType}.") - }; - return layout.CreateDescriptor(consumption); - case ArgumentPayloadKind.Entity: - case ArgumentPayloadKind.ScoreHolder: - dataTypes.ReadNextByte(packetData); - return layout.CreateDescriptor(); - case ArgumentPayloadKind.Time: - dataTypes.ReadNextInt(packetData); - return layout.CreateDescriptor(); - case ArgumentPayloadKind.RegistryKey: - case ArgumentPayloadKind.ForgeEnum: - dataTypes.ReadNextString(packetData); - return layout.CreateDescriptor(); - default: - throw new InvalidOperationException($"Unsupported DeclareCommands payload kind {layout.PayloadKind}."); - } - } - - private static void ReadNumberBounds(DataTypes dataTypes, Queue packetData, Func, TValue> readValue) - { - byte flags = dataTypes.ReadNextByte(packetData); - if ((flags & 0x01) != 0) - _ = readValue(dataTypes, packetData); - if ((flags & 0x02) != 0) - _ = readValue(dataTypes, packetData); - } - - private static string[] ExtractRootCommand() - { - if (!HasValidCommandTree()) - return Array.Empty(); - - List commands = new(); - CommandNode root = Nodes[RootIdx]; - - foreach (int child in root.Children) - { - if (!IsValidNodeIndex(child)) - continue; - - string? childName = Nodes[child].Name; - if (!string.IsNullOrEmpty(childName)) - commands.Add(childName); - } - - return commands.ToArray(); - } - - private static bool TryMatchNode( - int nodeIdx, - string command, - int position, - List> signedArguments, - out List> matchedArguments) - { - matchedArguments = signedArguments; - if (!IsValidNodeIndex(nodeIdx)) - return false; - - CommandNode node = Nodes[nodeIdx]; - if (!TryConsumeNode(node, command, position, out int nextPosition, out Tuple? signedCapture)) - return false; - - List> currentArguments = signedArguments; - if (signedCapture is not null) - { - currentArguments = new List>(signedArguments.Count + 1); - currentArguments.AddRange(signedArguments); - currentArguments.Add(signedCapture); - } - - int traversalNodeIdx = ResolveRedirect(nodeIdx); - bool canStopHere = node.IsExecutable || - (traversalNodeIdx != nodeIdx && IsValidNodeIndex(traversalNodeIdx) && Nodes[traversalNodeIdx].IsExecutable); - - if (nextPosition == command.Length) - { - if (canStopHere) - { - matchedArguments = currentArguments; - return true; - } - - return false; - } - - int childPosition = nextPosition; - if (node.Kind != CommandNodeKind.Root) - { - if (command[childPosition] != ' ') - return false; - childPosition++; - } - - return TryMatchChildren(traversalNodeIdx, command, childPosition, currentArguments, out matchedArguments); - } - - private static bool TryMatchChildren( - int nodeIdx, - string command, - int position, - List> signedArguments, - out List> matchedArguments) - { - matchedArguments = signedArguments; - if (!IsValidNodeIndex(nodeIdx)) - return false; - - int[] children = Nodes[nodeIdx].Children; - - for (int pass = 0; pass < 2; ++pass) - { - foreach (int childIdx in children) - { - if (!IsValidNodeIndex(childIdx)) - continue; - - bool isLiteral = Nodes[childIdx].Kind == CommandNodeKind.Literal; - if ((pass == 0 && !isLiteral) || (pass == 1 && isLiteral)) - continue; - - if (TryMatchNode(childIdx, command, position, signedArguments, out matchedArguments)) - return true; - } - } - - return false; - } - - private static bool TryConsumeNode( - CommandNode node, - string command, - int position, - out int nextPosition, - out Tuple? signedCapture) - { - nextPosition = position; - signedCapture = null; - - switch (node.Kind) - { - case CommandNodeKind.Root: - return true; - case CommandNodeKind.Literal: - return TryConsumeLiteral(command, position, node.Name!, out nextPosition); - case CommandNodeKind.Argument: - if (node.Argument is null || !TryConsumeArgument(command, position, node.Argument.Value, out nextPosition)) - return false; - - if (node.Argument.Value.IsSigned) - signedCapture = new Tuple(node.Name!, command[position..nextPosition]); - - return true; - default: - return false; - } - } - - private static bool TryConsumeLiteral(string command, int position, string literal, out int nextPosition) - { - nextPosition = position; - if (position + literal.Length > command.Length) - return false; - - if (string.CompareOrdinal(command, position, literal, 0, literal.Length) != 0) - return false; - - nextPosition = position + literal.Length; - return nextPosition == command.Length || command[nextPosition] == ' '; - } - - private static bool TryConsumeArgument(string command, int position, CommandArgumentDescriptor descriptor, out int nextPosition) - { - nextPosition = position; - - return descriptor.Consumption switch - { - ArgumentConsumption.SingleToken => TryConsumeSingleToken(command, position, out nextPosition), - ArgumentConsumption.QuotedStringOrWord => TryConsumeQuotedStringOrWord(command, position, out nextPosition), - ArgumentConsumption.GreedyTail => TryConsumeGreedyTail(command, position, out nextPosition), - ArgumentConsumption.FixedTokenCount => TryConsumeFixedTokenCount(command, position, descriptor.TokenCount, out nextPosition), - _ => false - }; - } - - private static bool TryConsumeSingleToken(string command, int position, out int nextPosition) - { - nextPosition = position; - if (position >= command.Length) - return false; - - int cursor = position; - while (cursor < command.Length && command[cursor] != ' ') - cursor++; - - nextPosition = cursor; - return cursor > position; - } - - private static bool TryConsumeQuotedStringOrWord(string command, int position, out int nextPosition) - { - nextPosition = position; - if (position >= command.Length) - return false; - - if (command[position] != '"') - return TryConsumeSingleToken(command, position, out nextPosition); - - bool escaped = false; - for (int cursor = position + 1; cursor < command.Length; ++cursor) - { - char current = command[cursor]; - if (escaped) - { - escaped = false; - continue; - } - - if (current == '\\') - { - escaped = true; - continue; - } - - if (current == '"') - { - nextPosition = cursor + 1; - return nextPosition == command.Length || command[nextPosition] == ' '; - } - } - - return false; - } - - private static bool TryConsumeGreedyTail(string command, int position, out int nextPosition) - { - nextPosition = command.Length; - return position < command.Length; - } - - private static bool TryConsumeFixedTokenCount(string command, int position, int tokenCount, out int nextPosition) - { - nextPosition = position; - int cursor = position; - - for (int i = 0; i < tokenCount; ++i) - { - if (!TryConsumeSingleToken(command, cursor, out int tokenEnd)) - return false; - - cursor = tokenEnd; - if (i < tokenCount - 1) - { - if (cursor >= command.Length || command[cursor] != ' ') - return false; - - cursor++; - } - } - - nextPosition = cursor; - return true; - } - - private static int ResolveRedirect(int nodeIdx) - { - if (!IsValidNodeIndex(nodeIdx)) - return -1; - - HashSet visited = new(); - int current = nodeIdx; - - while (IsValidNodeIndex(current) && Nodes[current].RedirectNode >= 0) - { - if (!visited.Add(current)) - return current; - - current = Nodes[current].RedirectNode; - } - - return IsValidNodeIndex(current) ? current : -1; - } - - private static bool TryResolveArgumentTypeLayout(int protocolVersion, int parserId, out ArgumentTypeLayout layout) - { - return protocolVersion >= Protocol18Handler.MC_1_20_6_Version - ? TryResolveModernArgumentTypeLayout(protocolVersion, parserId, out layout) - : TryResolveLegacyArgumentTypeLayout(protocolVersion, parserId, out layout); - } - - private static bool TryResolveModernArgumentTypeLayout(int protocolVersion, int parserId, out ArgumentTypeLayout layout) - { - string[] registry = protocolVersion switch - { - >= Protocol18Handler.MC_1_21_6_Version => s_modernArgumentTypes1216, - >= Protocol18Handler.MC_1_21_5_Version => s_modernArgumentTypes1215, - _ => s_modernArgumentTypes1206 - }; - - if (parserId < 0 || parserId >= registry.Length) - { - layout = default; - return false; - } - - return s_argumentTypeCatalog.TryGetValue(ToCanonicalArgumentTypeName(registry[parserId]), out layout); - } - - private static bool TryResolveLegacyArgumentTypeLayout(int protocolVersion, int parserId, out ArgumentTypeLayout layout) - { - string? name; - - if (protocolVersion <= Protocol18Handler.MC_1_19_2_Version) - { - name = parserId switch - { - 1 => "brigadier:float", - 2 => "brigadier:double", - 3 => "brigadier:integer", - 4 => "brigadier:long", - 5 => "brigadier:string", - 6 => "minecraft:entity", - 8 => "minecraft:block_pos", - 9 => "minecraft:column_pos", - 10 => "minecraft:vec3", - 11 => "minecraft:vec2", - 18 => "minecraft:message", - 27 => "minecraft:rotation", - 29 => "minecraft:score_holder", - 43 => "minecraft:resource_or_tag", - 44 => "minecraft:resource", - 50 => "forge:enum", - _ => null - }; - } - else if (protocolVersion <= Protocol18Handler.MC_1_19_3_Version) - { - name = parserId switch - { - 1 => "brigadier:float", - 2 => "brigadier:double", - 3 => "brigadier:integer", - 4 => "brigadier:long", - 5 => "brigadier:string", - 6 => "minecraft:entity", - 8 => "minecraft:block_pos", - 9 => "minecraft:column_pos", - 10 => "minecraft:vec3", - 11 => "minecraft:vec2", - 18 => "minecraft:message", - 27 => "minecraft:rotation", - 29 => "minecraft:score_holder", - 41 => "minecraft:resource_or_tag", - 42 => "minecraft:resource_or_tag_key", - 43 => "minecraft:resource", - 44 => "minecraft:resource_key", - 50 => "forge:enum", - _ => null - }; - } - else if (protocolVersion <= Protocol18Handler.MC_1_20_2_Version) - { - name = parserId switch - { - 1 => "brigadier:float", - 2 => "brigadier:double", - 3 => "brigadier:integer", - 4 => "brigadier:long", - 5 => "brigadier:string", - 6 => "minecraft:entity", - 8 => "minecraft:block_pos", - 9 => "minecraft:column_pos", - 10 => "minecraft:vec3", - 11 => "minecraft:vec2", - 18 => "minecraft:message", - 27 => "minecraft:rotation", - 29 => "minecraft:score_holder", - 40 => "minecraft:time", - 41 => "minecraft:resource_or_tag", - 42 => "minecraft:resource_or_tag_key", - 43 => "minecraft:resource", - 44 => "minecraft:resource_key", - 50 when protocolVersion == Protocol18Handler.MC_1_19_4_Version => "forge:enum", - 51 when protocolVersion is >= Protocol18Handler.MC_1_20_Version and <= Protocol18Handler.MC_1_20_2_Version => "forge:enum", - _ => null - }; - } - else - { - name = parserId switch - { - 1 => "brigadier:float", - 2 => "brigadier:double", - 3 => "brigadier:integer", - 4 => "brigadier:long", - 5 => "brigadier:string", - 6 => "minecraft:entity", - 8 => "minecraft:block_pos", - 9 => "minecraft:column_pos", - 10 => "minecraft:vec3", - 11 => "minecraft:vec2", - 18 or 19 => "minecraft:message", - 27 => "minecraft:rotation", - 30 => "minecraft:score_holder", - 41 => "minecraft:time", - 42 => "minecraft:resource_or_tag", - 43 => "minecraft:resource_or_tag_key", - 44 => "minecraft:resource", - 45 => "minecraft:resource_key", - 52 => "forge:enum", - _ => null - }; - } - - if (name is null) - { - layout = s_unknownLegacyArgumentType; - return true; - } - - return s_argumentTypeCatalog.TryGetValue(name, out layout); - } - - private static string ToCanonicalArgumentTypeName(string rawName) - { - return rawName.Contains(':', StringComparison.Ordinal) ? rawName : "minecraft:" + rawName; - } - - private static void Reset() - { - RootIdx = -1; - Nodes = Array.Empty(); - HasLoadedTree = false; - LastReadError = null; - } - - private static bool HasValidCommandTree() - { - return HasLoadedTree && IsValidNodeIndex(RootIdx); - } - - private static bool IsValidNodeIndex(int nodeIdx) - { - return nodeIdx >= 0 && nodeIdx < Nodes.Length; - } - - private static Dictionary CreateArgumentTypeCatalog() - { - Dictionary catalog = new(StringComparer.Ordinal); - - static void Add( - Dictionary items, - string name, - ArgumentPayloadKind payloadKind = ArgumentPayloadKind.None, - ArgumentConsumption consumption = ArgumentConsumption.SingleToken, - int tokenCount = 1, - bool isSigned = false) - { - items[name] = new ArgumentTypeLayout(name, payloadKind, consumption, tokenCount, isSigned); - } - - static void AddFixedTokens(Dictionary items, string name, int tokenCount) - { - Add(items, name, consumption: ArgumentConsumption.FixedTokenCount, tokenCount: tokenCount); - } - - Add(catalog, "brigadier:bool"); - Add(catalog, "brigadier:float", ArgumentPayloadKind.BrigadierFloat); - Add(catalog, "brigadier:double", ArgumentPayloadKind.BrigadierDouble); - Add(catalog, "brigadier:integer", ArgumentPayloadKind.BrigadierInteger); - Add(catalog, "brigadier:long", ArgumentPayloadKind.BrigadierLong); - Add(catalog, "brigadier:string", ArgumentPayloadKind.BrigadierString); - Add(catalog, "minecraft:entity", ArgumentPayloadKind.Entity); - Add(catalog, "minecraft:game_profile"); - AddFixedTokens(catalog, "minecraft:block_pos", 3); - AddFixedTokens(catalog, "minecraft:column_pos", 2); - AddFixedTokens(catalog, "minecraft:vec3", 3); - AddFixedTokens(catalog, "minecraft:vec2", 2); - Add(catalog, "minecraft:block_state"); - Add(catalog, "minecraft:block_predicate"); - Add(catalog, "minecraft:item_stack"); - Add(catalog, "minecraft:item_predicate"); - Add(catalog, "minecraft:color"); - Add(catalog, "minecraft:hex_color"); - Add(catalog, "minecraft:component"); - Add(catalog, "minecraft:style"); - Add(catalog, "minecraft:message", consumption: ArgumentConsumption.GreedyTail, isSigned: true); - Add(catalog, "minecraft:nbt_compound_tag"); - Add(catalog, "minecraft:nbt_tag"); - Add(catalog, "minecraft:nbt_path"); - Add(catalog, "minecraft:objective"); - Add(catalog, "minecraft:objective_criteria"); - Add(catalog, "minecraft:operation"); - Add(catalog, "minecraft:particle"); - Add(catalog, "minecraft:angle"); - AddFixedTokens(catalog, "minecraft:rotation", 2); - Add(catalog, "minecraft:scoreboard_slot"); - Add(catalog, "minecraft:score_holder", ArgumentPayloadKind.ScoreHolder); - Add(catalog, "minecraft:swizzle"); - Add(catalog, "minecraft:team"); - Add(catalog, "minecraft:item_slot"); - Add(catalog, "minecraft:item_slots"); - Add(catalog, "minecraft:resource_location"); - Add(catalog, "minecraft:function"); - Add(catalog, "minecraft:entity_anchor"); - Add(catalog, "minecraft:int_range"); - Add(catalog, "minecraft:float_range"); - Add(catalog, "minecraft:dimension"); - Add(catalog, "minecraft:gamemode"); - Add(catalog, "minecraft:time", ArgumentPayloadKind.Time); - Add(catalog, "minecraft:resource_or_tag", ArgumentPayloadKind.RegistryKey); - Add(catalog, "minecraft:resource_or_tag_key", ArgumentPayloadKind.RegistryKey); - Add(catalog, "minecraft:resource", ArgumentPayloadKind.RegistryKey); - Add(catalog, "minecraft:resource_key", ArgumentPayloadKind.RegistryKey); - Add(catalog, "minecraft:resource_selector", ArgumentPayloadKind.RegistryKey); - Add(catalog, "minecraft:template_mirror"); - Add(catalog, "minecraft:template_rotation"); - Add(catalog, "minecraft:heightmap"); - Add(catalog, "minecraft:loot_table"); - Add(catalog, "minecraft:loot_predicate"); - Add(catalog, "minecraft:loot_modifier"); - Add(catalog, "minecraft:dialog"); - Add(catalog, "minecraft:uuid"); - Add(catalog, "forge:enum", ArgumentPayloadKind.ForgeEnum); - - return catalog; - } - - private enum CommandNodeKind : byte - { - Root = 0, - Literal = 1, - Argument = 2 - } - - private enum ArgumentConsumption - { - SingleToken, - QuotedStringOrWord, - GreedyTail, - FixedTokenCount - } - - private enum ArgumentPayloadKind - { - None, - BrigadierFloat, - BrigadierDouble, - BrigadierInteger, - BrigadierLong, - BrigadierString, - Entity, - ScoreHolder, - Time, - RegistryKey, - ForgeEnum - } - - private sealed record CommandNode( - byte Flags, - int[] Children, - int RedirectNode = -1, - string? Name = null, - CommandArgumentDescriptor? Argument = null, - string? SuggestionsType = null, - int ParserId = -1) - { - public CommandNodeKind Kind => (CommandNodeKind)(Flags & NodeTypeMask); - public bool IsExecutable => (Flags & NodeExecutableFlag) != 0; - public bool IsRestricted => (Flags & NodeRestrictedFlag) != 0; - } - - private readonly record struct CommandArgumentDescriptor( - string Name, - ArgumentConsumption Consumption, - int TokenCount = 1, - bool IsSigned = false); - - private readonly struct ArgumentTypeLayout - { - public string Name { get; } - public ArgumentPayloadKind PayloadKind { get; } - public ArgumentConsumption Consumption { get; } - public int TokenCount { get; } - public bool IsSigned { get; } - - public ArgumentTypeLayout( - string name, - ArgumentPayloadKind payloadKind = ArgumentPayloadKind.None, - ArgumentConsumption consumption = ArgumentConsumption.SingleToken, - int tokenCount = 1, - bool isSigned = false) - { - Name = name; - PayloadKind = payloadKind; - Consumption = consumption; - TokenCount = tokenCount; - IsSigned = isSigned; - } - - public CommandArgumentDescriptor CreateDescriptor() - { - return new CommandArgumentDescriptor(Name, Consumption, TokenCount, IsSigned); - } - - public CommandArgumentDescriptor CreateDescriptor(ArgumentConsumption consumption) - { - return new CommandArgumentDescriptor(Name, consumption, TokenCount, IsSigned); - } - } - } -} diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette110.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette110.cs deleted file mode 100644 index 4b51bc5306..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette110.cs +++ /dev/null @@ -1,126 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes -{ - public class PacketPalette110 : PacketTypePalette - { - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.SpawnEntity }, - { 0x01, PacketTypesIn.SpawnExperienceOrb }, - { 0x02, PacketTypesIn.SpawnWeatherEntity }, - { 0x03, PacketTypesIn.SpawnLivingEntity }, - { 0x04, PacketTypesIn.SpawnPainting }, - { 0x05, PacketTypesIn.SpawnPlayer }, - { 0x06, PacketTypesIn.EntityAnimation }, - { 0x07, PacketTypesIn.Statistics }, - { 0x08, PacketTypesIn.BlockBreakAnimation }, - { 0x09, PacketTypesIn.BlockEntityData }, - { 0x0A, PacketTypesIn.BlockAction }, - { 0x0B, PacketTypesIn.BlockChange }, - { 0x0C, PacketTypesIn.BossBar }, - { 0x0D, PacketTypesIn.ServerDifficulty }, - { 0x0E, PacketTypesIn.TabComplete }, - { 0x0F, PacketTypesIn.ChatMessage }, - { 0x10, PacketTypesIn.MultiBlockChange }, - { 0x11, PacketTypesIn.WindowConfirmation }, - { 0x12, PacketTypesIn.CloseWindow }, - { 0x13, PacketTypesIn.OpenWindow }, - { 0x14, PacketTypesIn.WindowItems }, - { 0x15, PacketTypesIn.WindowProperty }, - { 0x16, PacketTypesIn.SetSlot }, - { 0x17, PacketTypesIn.SetCooldown }, - { 0x18, PacketTypesIn.PluginMessage }, - { 0x19, PacketTypesIn.NamedSoundEffect }, - { 0x1A, PacketTypesIn.Disconnect }, - { 0x1B, PacketTypesIn.EntityStatus }, - { 0x1C, PacketTypesIn.Explosion }, - { 0x1D, PacketTypesIn.UnloadChunk }, - { 0x1E, PacketTypesIn.ChangeGameState }, - { 0x1F, PacketTypesIn.KeepAlive }, - { 0x20, PacketTypesIn.ChunkData }, - { 0x21, PacketTypesIn.Effect }, - { 0x22, PacketTypesIn.Particle }, - { 0x23, PacketTypesIn.JoinGame }, - { 0x24, PacketTypesIn.MapData }, - { 0x25, PacketTypesIn.EntityPosition }, - { 0x26, PacketTypesIn.EntityPositionAndRotation }, - { 0x27, PacketTypesIn.EntityRotation }, - { 0x28, PacketTypesIn.EntityMovement }, - { 0x29, PacketTypesIn.VehicleMove }, - { 0x2A, PacketTypesIn.OpenSignEditor }, - { 0x2B, PacketTypesIn.PlayerAbilities }, - { 0x2C, PacketTypesIn.CombatEvent }, - { 0x2D, PacketTypesIn.PlayerInfo }, - { 0x2E, PacketTypesIn.PlayerPositionAndLook }, - { 0x2F, PacketTypesIn.UseBed }, - { 0x30, PacketTypesIn.DestroyEntities }, - { 0x31, PacketTypesIn.RemoveEntityEffect }, - { 0x32, PacketTypesIn.ResourcePackSend }, - { 0x33, PacketTypesIn.Respawn }, - { 0x34, PacketTypesIn.EntityHeadLook }, - { 0x35, PacketTypesIn.WorldBorder }, - { 0x36, PacketTypesIn.Camera }, - { 0x37, PacketTypesIn.HeldItemChange }, - { 0x38, PacketTypesIn.DisplayScoreboard }, - { 0x39, PacketTypesIn.EntityMetadata }, - { 0x3A, PacketTypesIn.AttachEntity }, - { 0x3B, PacketTypesIn.EntityVelocity }, - { 0x3C, PacketTypesIn.EntityEquipment }, - { 0x3D, PacketTypesIn.SetExperience }, - { 0x3E, PacketTypesIn.UpdateHealth }, - { 0x3F, PacketTypesIn.ScoreboardObjective }, - { 0x40, PacketTypesIn.SetPassengers }, - { 0x41, PacketTypesIn.Teams }, - { 0x42, PacketTypesIn.UpdateScore }, - { 0x43, PacketTypesIn.SpawnPosition }, - { 0x44, PacketTypesIn.TimeUpdate }, - { 0x45, PacketTypesIn.Title }, - { 0x46, PacketTypesIn.SoundEffect }, - { 0x47, PacketTypesIn.PlayerListHeaderAndFooter }, - { 0x48, PacketTypesIn.CollectItem }, - { 0x49, PacketTypesIn.EntityTeleport }, - { 0x4A, PacketTypesIn.EntityProperties }, - { 0x4B, PacketTypesIn.EntityEffect }, - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, - { 0x01, PacketTypesOut.TabComplete }, - { 0x02, PacketTypesOut.ChatMessage }, - { 0x03, PacketTypesOut.ClientStatus }, - { 0x04, PacketTypesOut.ClientSettings }, - { 0x05, PacketTypesOut.WindowConfirmation }, - { 0x06, PacketTypesOut.EnchantItem }, - { 0x07, PacketTypesOut.ClickWindow }, - { 0x08, PacketTypesOut.CloseWindow }, - { 0x09, PacketTypesOut.PluginMessage }, - { 0x0A, PacketTypesOut.InteractEntity }, - { 0x0B, PacketTypesOut.KeepAlive }, - { 0x0C, PacketTypesOut.PlayerPosition }, - { 0x0D, PacketTypesOut.PlayerPositionAndRotation }, - { 0x0E, PacketTypesOut.PlayerRotation }, - { 0x0F, PacketTypesOut.PlayerMovement }, - { 0x10, PacketTypesOut.VehicleMove }, - { 0x11, PacketTypesOut.SteerBoat }, - { 0x12, PacketTypesOut.PlayerAbilities }, - { 0x13, PacketTypesOut.PlayerDigging }, - { 0x14, PacketTypesOut.EntityAction }, - { 0x15, PacketTypesOut.SteerVehicle }, - { 0x16, PacketTypesOut.ResourcePackStatus }, - { 0x17, PacketTypesOut.HeldItemChange }, - { 0x18, PacketTypesOut.CreativeInventoryAction }, - { 0x19, PacketTypesOut.UpdateSign }, - { 0x1A, PacketTypesOut.Animation }, - { 0x1B, PacketTypesOut.Spectate }, - { 0x1C, PacketTypesOut.PlayerBlockPlacement }, - { 0x1D, PacketTypesOut.UseItem }, - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => new(); - protected override Dictionary GetConfigurationListOut() => new(); - } -} diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette112.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette112.cs deleted file mode 100644 index 9a5fc6855e..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette112.cs +++ /dev/null @@ -1,132 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes -{ - public class PacketPalette112 : PacketTypePalette - { - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.SpawnEntity }, - { 0x01, PacketTypesIn.SpawnExperienceOrb }, - { 0x02, PacketTypesIn.SpawnWeatherEntity }, - { 0x03, PacketTypesIn.SpawnLivingEntity }, - { 0x04, PacketTypesIn.SpawnPainting }, - { 0x05, PacketTypesIn.SpawnPlayer }, - { 0x06, PacketTypesIn.EntityAnimation }, - { 0x07, PacketTypesIn.Statistics }, - { 0x08, PacketTypesIn.BlockBreakAnimation }, - { 0x09, PacketTypesIn.BlockEntityData }, - { 0x0A, PacketTypesIn.BlockAction }, - { 0x0B, PacketTypesIn.BlockChange }, - { 0x0C, PacketTypesIn.BossBar }, - { 0x0D, PacketTypesIn.ServerDifficulty }, - { 0x0E, PacketTypesIn.TabComplete }, - { 0x0F, PacketTypesIn.ChatMessage }, - { 0x10, PacketTypesIn.MultiBlockChange }, - { 0x11, PacketTypesIn.WindowConfirmation }, - { 0x12, PacketTypesIn.CloseWindow }, - { 0x13, PacketTypesIn.OpenWindow }, - { 0x14, PacketTypesIn.WindowItems }, - { 0x15, PacketTypesIn.WindowProperty }, - { 0x16, PacketTypesIn.SetSlot }, - { 0x17, PacketTypesIn.SetCooldown }, - { 0x18, PacketTypesIn.PluginMessage }, - { 0x19, PacketTypesIn.NamedSoundEffect }, - { 0x1A, PacketTypesIn.Disconnect }, - { 0x1B, PacketTypesIn.EntityStatus }, - { 0x1C, PacketTypesIn.Explosion }, - { 0x1D, PacketTypesIn.UnloadChunk }, - { 0x1E, PacketTypesIn.ChangeGameState }, - { 0x1F, PacketTypesIn.KeepAlive }, - { 0x20, PacketTypesIn.ChunkData }, - { 0x21, PacketTypesIn.Effect }, - { 0x22, PacketTypesIn.Particle }, - { 0x23, PacketTypesIn.JoinGame }, - { 0x24, PacketTypesIn.MapData }, - { 0x25, PacketTypesIn.EntityMovement }, - { 0x26, PacketTypesIn.EntityPosition }, - { 0x27, PacketTypesIn.EntityPositionAndRotation }, - { 0x28, PacketTypesIn.EntityRotation }, - { 0x29, PacketTypesIn.VehicleMove }, - { 0x2A, PacketTypesIn.OpenSignEditor }, - { 0x2B, PacketTypesIn.PlayerAbilities }, - { 0x2C, PacketTypesIn.CombatEvent }, - { 0x2D, PacketTypesIn.PlayerInfo }, - { 0x2E, PacketTypesIn.PlayerPositionAndLook }, - { 0x2F, PacketTypesIn.UseBed }, - { 0x30, PacketTypesIn.UnlockRecipes }, - { 0x31, PacketTypesIn.DestroyEntities }, - { 0x32, PacketTypesIn.RemoveEntityEffect }, - { 0x33, PacketTypesIn.ResourcePackSend }, - { 0x34, PacketTypesIn.Respawn }, - { 0x35, PacketTypesIn.EntityHeadLook }, - { 0x36, PacketTypesIn.SelectAdvancementTab }, - { 0x37, PacketTypesIn.WorldBorder }, - { 0x38, PacketTypesIn.Camera }, - { 0x39, PacketTypesIn.HeldItemChange }, - { 0x3A, PacketTypesIn.DisplayScoreboard }, - { 0x3B, PacketTypesIn.EntityMetadata }, - { 0x3C, PacketTypesIn.AttachEntity }, - { 0x3D, PacketTypesIn.EntityVelocity }, - { 0x3E, PacketTypesIn.EntityEquipment }, - { 0x3F, PacketTypesIn.SetExperience }, - { 0x40, PacketTypesIn.UpdateHealth }, - { 0x41, PacketTypesIn.ScoreboardObjective }, - { 0x42, PacketTypesIn.SetPassengers }, - { 0x43, PacketTypesIn.Teams }, - { 0x44, PacketTypesIn.UpdateScore }, - { 0x45, PacketTypesIn.SpawnPosition }, - { 0x46, PacketTypesIn.TimeUpdate }, - { 0x47, PacketTypesIn.Title }, - { 0x48, PacketTypesIn.SoundEffect }, - { 0x49, PacketTypesIn.PlayerListHeaderAndFooter }, - { 0x4A, PacketTypesIn.CollectItem }, - { 0x4B, PacketTypesIn.EntityTeleport }, - { 0x4C, PacketTypesIn.Advancements }, - { 0x4D, PacketTypesIn.EntityProperties }, - { 0x4E, PacketTypesIn.EntityEffect }, - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, - { 0x01, PacketTypesOut.Unknown }, - { 0x02, PacketTypesOut.TabComplete }, - { 0x03, PacketTypesOut.ChatMessage }, - { 0x04, PacketTypesOut.ClientStatus }, - { 0x05, PacketTypesOut.ClientSettings }, - { 0x06, PacketTypesOut.WindowConfirmation }, - { 0x07, PacketTypesOut.EnchantItem }, - { 0x08, PacketTypesOut.ClickWindow }, - { 0x09, PacketTypesOut.CloseWindow }, - { 0x0A, PacketTypesOut.PluginMessage }, - { 0x0B, PacketTypesOut.InteractEntity }, - { 0x0C, PacketTypesOut.KeepAlive }, - { 0x0D, PacketTypesOut.PlayerMovement }, - { 0x0E, PacketTypesOut.PlayerPosition }, - { 0x0F, PacketTypesOut.PlayerPositionAndRotation }, - { 0x10, PacketTypesOut.PlayerRotation }, - { 0x11, PacketTypesOut.VehicleMove }, - { 0x12, PacketTypesOut.SteerBoat }, - { 0x13, PacketTypesOut.PlayerAbilities }, - { 0x14, PacketTypesOut.PlayerDigging }, - { 0x15, PacketTypesOut.EntityAction }, - { 0x16, PacketTypesOut.SteerVehicle }, - { 0x17, PacketTypesOut.RecipeBookData }, - { 0x18, PacketTypesOut.ResourcePackStatus }, - { 0x19, PacketTypesOut.AdvancementTab }, - { 0x1A, PacketTypesOut.HeldItemChange }, - { 0x1B, PacketTypesOut.CreativeInventoryAction }, - { 0x1C, PacketTypesOut.UpdateSign }, - { 0x1D, PacketTypesOut.Animation }, - { 0x1E, PacketTypesOut.Spectate }, - { 0x1F, PacketTypesOut.PlayerBlockPlacement }, - { 0x20, PacketTypesOut.UseItem }, - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => new(); - protected override Dictionary GetConfigurationListOut() => new(); - } -} diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1122.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1122.cs deleted file mode 100644 index e1a2e64ce7..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1122.cs +++ /dev/null @@ -1,133 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes -{ - public class PacketPalette1122 : PacketTypePalette - { - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.SpawnEntity }, - { 0x01, PacketTypesIn.SpawnExperienceOrb }, - { 0x02, PacketTypesIn.SpawnWeatherEntity }, - { 0x03, PacketTypesIn.SpawnLivingEntity }, - { 0x04, PacketTypesIn.SpawnPainting }, - { 0x05, PacketTypesIn.SpawnPlayer }, - { 0x06, PacketTypesIn.EntityAnimation }, - { 0x07, PacketTypesIn.Statistics }, - { 0x08, PacketTypesIn.BlockBreakAnimation }, - { 0x09, PacketTypesIn.BlockEntityData }, - { 0x0A, PacketTypesIn.BlockAction }, - { 0x0B, PacketTypesIn.BlockChange }, - { 0x0C, PacketTypesIn.BossBar }, - { 0x0D, PacketTypesIn.ServerDifficulty }, - { 0x0E, PacketTypesIn.TabComplete }, - { 0x0F, PacketTypesIn.ChatMessage }, - { 0x10, PacketTypesIn.MultiBlockChange }, - { 0x11, PacketTypesIn.WindowConfirmation }, - { 0x12, PacketTypesIn.CloseWindow }, - { 0x13, PacketTypesIn.OpenWindow }, - { 0x14, PacketTypesIn.WindowItems }, - { 0x15, PacketTypesIn.WindowProperty }, - { 0x16, PacketTypesIn.SetSlot }, - { 0x17, PacketTypesIn.SetCooldown }, - { 0x18, PacketTypesIn.PluginMessage }, - { 0x19, PacketTypesIn.NamedSoundEffect }, - { 0x1A, PacketTypesIn.Disconnect }, - { 0x1B, PacketTypesIn.EntityStatus }, - { 0x1C, PacketTypesIn.Explosion }, - { 0x1D, PacketTypesIn.UnloadChunk }, - { 0x1E, PacketTypesIn.ChangeGameState }, - { 0x1F, PacketTypesIn.KeepAlive }, - { 0x20, PacketTypesIn.ChunkData }, - { 0x21, PacketTypesIn.Effect }, - { 0x22, PacketTypesIn.Particle }, - { 0x23, PacketTypesIn.JoinGame }, - { 0x24, PacketTypesIn.MapData }, - { 0x25, PacketTypesIn.EntityMovement }, - { 0x26, PacketTypesIn.EntityPosition }, - { 0x27, PacketTypesIn.EntityPositionAndRotation }, - { 0x28, PacketTypesIn.EntityRotation }, - { 0x29, PacketTypesIn.VehicleMove }, - { 0x2A, PacketTypesIn.OpenSignEditor }, - { 0x2B, PacketTypesIn.CraftRecipeResponse }, - { 0x2C, PacketTypesIn.PlayerAbilities }, - { 0x2D, PacketTypesIn.CombatEvent }, - { 0x2E, PacketTypesIn.PlayerInfo }, - { 0x2F, PacketTypesIn.PlayerPositionAndLook }, - { 0x30, PacketTypesIn.UseBed }, - { 0x31, PacketTypesIn.UnlockRecipes }, - { 0x32, PacketTypesIn.DestroyEntities }, - { 0x33, PacketTypesIn.RemoveEntityEffect }, - { 0x34, PacketTypesIn.ResourcePackSend }, - { 0x35, PacketTypesIn.Respawn }, - { 0x36, PacketTypesIn.EntityHeadLook }, - { 0x37, PacketTypesIn.SelectAdvancementTab }, - { 0x38, PacketTypesIn.WorldBorder }, - { 0x39, PacketTypesIn.Camera }, - { 0x3A, PacketTypesIn.HeldItemChange }, - { 0x3B, PacketTypesIn.DisplayScoreboard }, - { 0x3C, PacketTypesIn.EntityMetadata }, - { 0x3D, PacketTypesIn.AttachEntity }, - { 0x3E, PacketTypesIn.EntityVelocity }, - { 0x3F, PacketTypesIn.EntityEquipment }, - { 0x40, PacketTypesIn.SetExperience }, - { 0x41, PacketTypesIn.UpdateHealth }, - { 0x42, PacketTypesIn.ScoreboardObjective }, - { 0x43, PacketTypesIn.SetPassengers }, - { 0x44, PacketTypesIn.Teams }, - { 0x45, PacketTypesIn.UpdateScore }, - { 0x46, PacketTypesIn.SpawnPosition }, - { 0x47, PacketTypesIn.TimeUpdate }, - { 0x48, PacketTypesIn.Title }, - { 0x49, PacketTypesIn.SoundEffect }, - { 0x4A, PacketTypesIn.PlayerListHeaderAndFooter }, - { 0x4B, PacketTypesIn.CollectItem }, - { 0x4C, PacketTypesIn.EntityTeleport }, - { 0x4D, PacketTypesIn.Advancements }, - { 0x4E, PacketTypesIn.EntityProperties }, - { 0x4F, PacketTypesIn.EntityEffect }, - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, - { 0x01, PacketTypesOut.TabComplete }, - { 0x02, PacketTypesOut.ChatMessage }, - { 0x03, PacketTypesOut.ClientStatus }, - { 0x04, PacketTypesOut.ClientSettings }, - { 0x05, PacketTypesOut.WindowConfirmation }, - { 0x06, PacketTypesOut.EnchantItem }, - { 0x07, PacketTypesOut.ClickWindow }, - { 0x08, PacketTypesOut.CloseWindow }, - { 0x09, PacketTypesOut.PluginMessage }, - { 0x0A, PacketTypesOut.InteractEntity }, - { 0x0B, PacketTypesOut.KeepAlive }, - { 0x0C, PacketTypesOut.PlayerMovement }, - { 0x0D, PacketTypesOut.PlayerPosition }, - { 0x0E, PacketTypesOut.PlayerPositionAndRotation }, - { 0x0F, PacketTypesOut.PlayerRotation }, - { 0x10, PacketTypesOut.VehicleMove }, - { 0x11, PacketTypesOut.SteerBoat }, - { 0x12, PacketTypesOut.CraftRecipeRequest }, - { 0x13, PacketTypesOut.PlayerAbilities }, - { 0x14, PacketTypesOut.PlayerDigging }, - { 0x15, PacketTypesOut.EntityAction }, - { 0x16, PacketTypesOut.SteerVehicle }, - { 0x17, PacketTypesOut.RecipeBookData }, - { 0x18, PacketTypesOut.ResourcePackStatus }, - { 0x19, PacketTypesOut.AdvancementTab }, - { 0x1A, PacketTypesOut.HeldItemChange }, - { 0x1B, PacketTypesOut.CreativeInventoryAction }, - { 0x1C, PacketTypesOut.UpdateSign }, - { 0x1D, PacketTypesOut.Animation }, - { 0x1E, PacketTypesOut.Spectate }, - { 0x1F, PacketTypesOut.PlayerBlockPlacement }, - { 0x20, PacketTypesOut.UseItem }, - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => new(); - protected override Dictionary GetConfigurationListOut() => new(); - } -} diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette113.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette113.cs deleted file mode 100644 index 7f35edd1b1..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette113.cs +++ /dev/null @@ -1,149 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes -{ - public class PacketPalette113 : PacketTypePalette - { - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.SpawnEntity }, - { 0x01, PacketTypesIn.SpawnExperienceOrb }, - { 0x02, PacketTypesIn.SpawnWeatherEntity }, - { 0x03, PacketTypesIn.SpawnLivingEntity }, - { 0x04, PacketTypesIn.SpawnPainting }, - { 0x05, PacketTypesIn.SpawnPlayer }, - { 0x06, PacketTypesIn.EntityAnimation }, - { 0x07, PacketTypesIn.Statistics }, - { 0x08, PacketTypesIn.BlockBreakAnimation }, - { 0x09, PacketTypesIn.BlockEntityData }, - { 0x0A, PacketTypesIn.BlockAction }, - { 0x0B, PacketTypesIn.BlockChange }, - { 0x0C, PacketTypesIn.BossBar }, - { 0x0D, PacketTypesIn.ServerDifficulty }, - { 0x0E, PacketTypesIn.ChatMessage }, - { 0x0F, PacketTypesIn.MultiBlockChange }, - { 0x10, PacketTypesIn.TabComplete }, - { 0x11, PacketTypesIn.DeclareCommands }, - { 0x12, PacketTypesIn.WindowConfirmation }, - { 0x13, PacketTypesIn.CloseWindow }, - { 0x14, PacketTypesIn.OpenWindow }, - { 0x15, PacketTypesIn.WindowItems }, - { 0x16, PacketTypesIn.WindowProperty }, - { 0x17, PacketTypesIn.SetSlot }, - { 0x18, PacketTypesIn.SetCooldown }, - { 0x19, PacketTypesIn.PluginMessage }, - { 0x1A, PacketTypesIn.NamedSoundEffect }, - { 0x1B, PacketTypesIn.Disconnect }, - { 0x1C, PacketTypesIn.EntityStatus }, - { 0x1D, PacketTypesIn.NBTQueryResponse }, - { 0x1E, PacketTypesIn.Explosion }, - { 0x1F, PacketTypesIn.UnloadChunk }, - { 0x20, PacketTypesIn.ChangeGameState }, - { 0x21, PacketTypesIn.KeepAlive }, - { 0x22, PacketTypesIn.ChunkData }, - { 0x23, PacketTypesIn.Effect }, - { 0x24, PacketTypesIn.Particle }, - { 0x25, PacketTypesIn.JoinGame }, - { 0x26, PacketTypesIn.MapData }, - { 0x27, PacketTypesIn.EntityMovement }, - { 0x28, PacketTypesIn.EntityPosition }, - { 0x29, PacketTypesIn.EntityPositionAndRotation }, - { 0x2A, PacketTypesIn.EntityRotation }, - { 0x2B, PacketTypesIn.VehicleMove }, - { 0x2C, PacketTypesIn.OpenSignEditor }, - { 0x2D, PacketTypesIn.CraftRecipeResponse }, - { 0x2E, PacketTypesIn.PlayerAbilities }, - { 0x2F, PacketTypesIn.CombatEvent }, - { 0x30, PacketTypesIn.PlayerInfo }, - { 0x31, PacketTypesIn.FacePlayer }, - { 0x32, PacketTypesIn.PlayerPositionAndLook }, - { 0x33, PacketTypesIn.UseBed }, - { 0x34, PacketTypesIn.UnlockRecipes }, - { 0x35, PacketTypesIn.DestroyEntities }, - { 0x36, PacketTypesIn.RemoveEntityEffect }, - { 0x37, PacketTypesIn.ResourcePackSend }, - { 0x38, PacketTypesIn.Respawn }, - { 0x39, PacketTypesIn.EntityHeadLook }, - { 0x3A, PacketTypesIn.SelectAdvancementTab }, - { 0x3B, PacketTypesIn.WorldBorder }, - { 0x3C, PacketTypesIn.Camera }, - { 0x3D, PacketTypesIn.HeldItemChange }, - { 0x3E, PacketTypesIn.DisplayScoreboard }, - { 0x3F, PacketTypesIn.EntityMetadata }, - { 0x40, PacketTypesIn.AttachEntity }, - { 0x41, PacketTypesIn.EntityVelocity }, - { 0x42, PacketTypesIn.EntityEquipment }, - { 0x43, PacketTypesIn.SetExperience }, - { 0x44, PacketTypesIn.UpdateHealth }, - { 0x45, PacketTypesIn.ScoreboardObjective }, - { 0x46, PacketTypesIn.SetPassengers }, - { 0x47, PacketTypesIn.Teams }, - { 0x48, PacketTypesIn.UpdateScore }, - { 0x49, PacketTypesIn.SpawnPosition }, - { 0x4A, PacketTypesIn.TimeUpdate }, - { 0x4B, PacketTypesIn.Title }, - { 0x4C, PacketTypesIn.StopSound }, - { 0x4D, PacketTypesIn.SoundEffect }, - { 0x4E, PacketTypesIn.PlayerListHeaderAndFooter }, - { 0x4F, PacketTypesIn.CollectItem }, - { 0x50, PacketTypesIn.EntityTeleport }, - { 0x51, PacketTypesIn.Advancements }, - { 0x52, PacketTypesIn.EntityProperties }, - { 0x53, PacketTypesIn.EntityEffect }, - { 0x54, PacketTypesIn.DeclareRecipes }, - { 0x55, PacketTypesIn.Tags }, - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, - { 0x01, PacketTypesOut.QueryBlockNBT }, - { 0x02, PacketTypesOut.ChatMessage }, - { 0x03, PacketTypesOut.ClientStatus }, - { 0x04, PacketTypesOut.ClientSettings }, - { 0x05, PacketTypesOut.TabComplete }, - { 0x06, PacketTypesOut.WindowConfirmation }, - { 0x07, PacketTypesOut.EnchantItem }, - { 0x08, PacketTypesOut.ClickWindow }, - { 0x09, PacketTypesOut.CloseWindow }, - { 0x0A, PacketTypesOut.PluginMessage }, - { 0x0B, PacketTypesOut.EditBook }, - { 0x0C, PacketTypesOut.EntityNBTRequest }, - { 0x0D, PacketTypesOut.InteractEntity }, - { 0x0E, PacketTypesOut.KeepAlive }, - { 0x0F, PacketTypesOut.PlayerMovement }, - { 0x10, PacketTypesOut.PlayerPosition }, - { 0x11, PacketTypesOut.PlayerPositionAndRotation }, - { 0x12, PacketTypesOut.PlayerRotation }, - { 0x13, PacketTypesOut.VehicleMove }, - { 0x14, PacketTypesOut.SteerBoat }, - { 0x15, PacketTypesOut.PickItem }, - { 0x16, PacketTypesOut.CraftRecipeRequest }, - { 0x17, PacketTypesOut.PlayerAbilities }, - { 0x18, PacketTypesOut.PlayerDigging }, - { 0x19, PacketTypesOut.EntityAction }, - { 0x1A, PacketTypesOut.SteerVehicle }, - { 0x1B, PacketTypesOut.RecipeBookData }, - { 0x1C, PacketTypesOut.NameItem }, - { 0x1D, PacketTypesOut.ResourcePackStatus }, - { 0x1E, PacketTypesOut.AdvancementTab }, - { 0x1F, PacketTypesOut.SelectTrade }, - { 0x20, PacketTypesOut.SetBeaconEffect }, - { 0x21, PacketTypesOut.HeldItemChange }, - { 0x22, PacketTypesOut.UpdateCommandBlock }, - { 0x23, PacketTypesOut.UpdateCommandBlockMinecart }, - { 0x24, PacketTypesOut.CreativeInventoryAction }, - { 0x25, PacketTypesOut.UpdateStructureBlock }, - { 0x26, PacketTypesOut.UpdateSign }, - { 0x27, PacketTypesOut.Animation }, - { 0x28, PacketTypesOut.Spectate }, - { 0x29, PacketTypesOut.PlayerBlockPlacement }, - { 0x2A, PacketTypesOut.UseItem }, - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => new(); - protected override Dictionary GetConfigurationListOut() => new(); - } -} diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette114.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette114.cs deleted file mode 100644 index 472bd860b1..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette114.cs +++ /dev/null @@ -1,159 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes -{ - public class PacketPalette114 : PacketTypePalette - { - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.SpawnEntity }, - { 0x01, PacketTypesIn.SpawnExperienceOrb }, - { 0x02, PacketTypesIn.SpawnWeatherEntity }, - { 0x03, PacketTypesIn.SpawnLivingEntity }, - { 0x04, PacketTypesIn.SpawnPainting }, - { 0x05, PacketTypesIn.SpawnPlayer }, - { 0x06, PacketTypesIn.EntityAnimation }, - { 0x07, PacketTypesIn.Statistics }, - { 0x08, PacketTypesIn.BlockBreakAnimation }, - { 0x09, PacketTypesIn.BlockEntityData }, - { 0x0A, PacketTypesIn.BlockAction }, - { 0x0B, PacketTypesIn.BlockChange }, - { 0x0C, PacketTypesIn.BossBar }, - { 0x0D, PacketTypesIn.ServerDifficulty }, - { 0x0E, PacketTypesIn.ChatMessage }, - { 0x0F, PacketTypesIn.MultiBlockChange }, - { 0x10, PacketTypesIn.TabComplete }, - { 0x11, PacketTypesIn.DeclareCommands }, - { 0x12, PacketTypesIn.WindowConfirmation }, - { 0x13, PacketTypesIn.CloseWindow }, - { 0x14, PacketTypesIn.WindowItems }, - { 0x15, PacketTypesIn.WindowProperty }, - { 0x16, PacketTypesIn.SetSlot }, - { 0x17, PacketTypesIn.SetCooldown }, - { 0x18, PacketTypesIn.PluginMessage }, - { 0x19, PacketTypesIn.NamedSoundEffect }, - { 0x1A, PacketTypesIn.Disconnect }, - { 0x1B, PacketTypesIn.EntityStatus }, - { 0x1C, PacketTypesIn.Explosion }, - { 0x1D, PacketTypesIn.UnloadChunk }, - { 0x1E, PacketTypesIn.ChangeGameState }, - { 0x1F, PacketTypesIn.OpenHorseWindow }, - { 0x20, PacketTypesIn.KeepAlive }, - { 0x21, PacketTypesIn.ChunkData }, - { 0x22, PacketTypesIn.Effect }, - { 0x23, PacketTypesIn.Particle }, - { 0x24, PacketTypesIn.UpdateLight }, - { 0x25, PacketTypesIn.JoinGame }, - { 0x26, PacketTypesIn.MapData }, - { 0x27, PacketTypesIn.TradeList }, - { 0x28, PacketTypesIn.EntityPosition }, - { 0x29, PacketTypesIn.EntityPositionAndRotation }, - { 0x2A, PacketTypesIn.EntityRotation }, - { 0x2B, PacketTypesIn.EntityMovement }, - { 0x2C, PacketTypesIn.VehicleMove }, - { 0x2D, PacketTypesIn.OpenBook }, - { 0x2E, PacketTypesIn.OpenWindow }, - { 0x2F, PacketTypesIn.OpenSignEditor }, - { 0x30, PacketTypesIn.CraftRecipeResponse }, - { 0x31, PacketTypesIn.PlayerAbilities }, - { 0x32, PacketTypesIn.CombatEvent }, - { 0x33, PacketTypesIn.PlayerInfo }, - { 0x34, PacketTypesIn.FacePlayer }, - { 0x35, PacketTypesIn.PlayerPositionAndLook }, - { 0x36, PacketTypesIn.UnlockRecipes }, - { 0x37, PacketTypesIn.DestroyEntities }, - { 0x38, PacketTypesIn.RemoveEntityEffect }, - { 0x39, PacketTypesIn.ResourcePackSend }, - { 0x3A, PacketTypesIn.Respawn }, - { 0x3B, PacketTypesIn.EntityHeadLook }, - { 0x3C, PacketTypesIn.SelectAdvancementTab }, - { 0x3D, PacketTypesIn.WorldBorder }, - { 0x3E, PacketTypesIn.Camera }, - { 0x3F, PacketTypesIn.HeldItemChange }, - { 0x40, PacketTypesIn.UpdateViewPosition }, - { 0x41, PacketTypesIn.UpdateViewDistance }, - { 0x42, PacketTypesIn.DisplayScoreboard }, - { 0x43, PacketTypesIn.EntityMetadata }, - { 0x44, PacketTypesIn.AttachEntity }, - { 0x45, PacketTypesIn.EntityVelocity }, - { 0x46, PacketTypesIn.EntityEquipment }, - { 0x47, PacketTypesIn.SetExperience }, - { 0x48, PacketTypesIn.UpdateHealth }, - { 0x49, PacketTypesIn.ScoreboardObjective }, - { 0x4A, PacketTypesIn.SetPassengers }, - { 0x4B, PacketTypesIn.Teams }, - { 0x4C, PacketTypesIn.UpdateScore }, - { 0x4D, PacketTypesIn.SpawnPosition }, - { 0x4E, PacketTypesIn.TimeUpdate }, - { 0x4F, PacketTypesIn.Title }, - { 0x50, PacketTypesIn.EntitySoundEffect }, - { 0x51, PacketTypesIn.SoundEffect }, - { 0x52, PacketTypesIn.StopSound }, - { 0x53, PacketTypesIn.PlayerListHeaderAndFooter }, - { 0x54, PacketTypesIn.NBTQueryResponse }, - { 0x55, PacketTypesIn.CollectItem }, - { 0x56, PacketTypesIn.EntityTeleport }, - { 0x57, PacketTypesIn.Advancements }, - { 0x58, PacketTypesIn.EntityProperties }, - { 0x59, PacketTypesIn.EntityEffect }, - { 0x5A, PacketTypesIn.DeclareRecipes }, - { 0x5B, PacketTypesIn.Tags }, - { 0x5C, PacketTypesIn.AcknowledgePlayerDigging }, - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, - { 0x01, PacketTypesOut.QueryBlockNBT }, - { 0x02, PacketTypesOut.SetDifficulty }, - { 0x03, PacketTypesOut.ChatMessage }, - { 0x04, PacketTypesOut.ClientStatus }, - { 0x05, PacketTypesOut.ClientSettings }, - { 0x06, PacketTypesOut.TabComplete }, - { 0x07, PacketTypesOut.WindowConfirmation }, - { 0x08, PacketTypesOut.ClickWindowButton }, - { 0x09, PacketTypesOut.ClickWindow }, - { 0x0A, PacketTypesOut.CloseWindow }, - { 0x0B, PacketTypesOut.PluginMessage }, - { 0x0C, PacketTypesOut.EditBook }, - { 0x0D, PacketTypesOut.EntityNBTRequest }, - { 0x0E, PacketTypesOut.InteractEntity }, - { 0x0F, PacketTypesOut.KeepAlive }, - { 0x10, PacketTypesOut.LockDifficulty }, - { 0x11, PacketTypesOut.PlayerPosition }, - { 0x12, PacketTypesOut.PlayerPositionAndRotation }, - { 0x13, PacketTypesOut.PlayerRotation }, - { 0x14, PacketTypesOut.PlayerMovement }, - { 0x15, PacketTypesOut.VehicleMove }, - { 0x16, PacketTypesOut.SteerBoat }, - { 0x17, PacketTypesOut.PickItem }, - { 0x18, PacketTypesOut.CraftRecipeRequest }, - { 0x19, PacketTypesOut.PlayerAbilities }, - { 0x1A, PacketTypesOut.PlayerDigging }, - { 0x1B, PacketTypesOut.EntityAction }, - { 0x1C, PacketTypesOut.SteerVehicle }, - { 0x1D, PacketTypesOut.RecipeBookData }, - { 0x1E, PacketTypesOut.NameItem }, - { 0x1F, PacketTypesOut.ResourcePackStatus }, - { 0x20, PacketTypesOut.AdvancementTab }, - { 0x21, PacketTypesOut.SelectTrade }, - { 0x22, PacketTypesOut.SetBeaconEffect }, - { 0x23, PacketTypesOut.HeldItemChange }, - { 0x24, PacketTypesOut.UpdateCommandBlock }, - { 0x25, PacketTypesOut.UpdateCommandBlockMinecart }, - { 0x26, PacketTypesOut.CreativeInventoryAction }, - { 0x27, PacketTypesOut.UpdateJigsawBlock }, - { 0x28, PacketTypesOut.UpdateStructureBlock }, - { 0x29, PacketTypesOut.UpdateSign }, - { 0x2A, PacketTypesOut.Animation }, - { 0x2B, PacketTypesOut.Spectate }, - { 0x2C, PacketTypesOut.PlayerBlockPlacement }, - { 0x2D, PacketTypesOut.UseItem }, - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => new(); - protected override Dictionary GetConfigurationListOut() => new(); - } -} diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette115.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette115.cs deleted file mode 100644 index 4ce879b191..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette115.cs +++ /dev/null @@ -1,159 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes -{ - public class PacketPalette115 : PacketTypePalette - { - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.SpawnEntity }, - { 0x01, PacketTypesIn.SpawnExperienceOrb }, - { 0x02, PacketTypesIn.SpawnWeatherEntity }, - { 0x03, PacketTypesIn.SpawnLivingEntity }, - { 0x04, PacketTypesIn.SpawnPainting }, - { 0x05, PacketTypesIn.SpawnPlayer }, - { 0x06, PacketTypesIn.EntityAnimation }, - { 0x07, PacketTypesIn.Statistics }, - { 0x08, PacketTypesIn.AcknowledgePlayerDigging }, - { 0x09, PacketTypesIn.BlockBreakAnimation }, - { 0x0A, PacketTypesIn.BlockEntityData }, - { 0x0B, PacketTypesIn.BlockAction }, - { 0x0C, PacketTypesIn.BlockChange }, - { 0x0D, PacketTypesIn.BossBar }, - { 0x0E, PacketTypesIn.ServerDifficulty }, - { 0x0F, PacketTypesIn.ChatMessage }, - { 0x10, PacketTypesIn.MultiBlockChange }, - { 0x11, PacketTypesIn.TabComplete }, - { 0x12, PacketTypesIn.DeclareCommands }, - { 0x13, PacketTypesIn.WindowConfirmation }, - { 0x14, PacketTypesIn.CloseWindow }, - { 0x15, PacketTypesIn.WindowItems }, - { 0x16, PacketTypesIn.WindowProperty }, - { 0x17, PacketTypesIn.SetSlot }, - { 0x18, PacketTypesIn.SetCooldown }, - { 0x19, PacketTypesIn.PluginMessage }, - { 0x1A, PacketTypesIn.NamedSoundEffect }, - { 0x1B, PacketTypesIn.Disconnect }, - { 0x1C, PacketTypesIn.EntityStatus }, - { 0x1D, PacketTypesIn.Explosion }, - { 0x1E, PacketTypesIn.UnloadChunk }, - { 0x1F, PacketTypesIn.ChangeGameState }, - { 0x20, PacketTypesIn.OpenHorseWindow }, - { 0x21, PacketTypesIn.KeepAlive }, - { 0x22, PacketTypesIn.ChunkData }, - { 0x23, PacketTypesIn.Effect }, - { 0x24, PacketTypesIn.Particle }, - { 0x25, PacketTypesIn.UpdateLight }, - { 0x26, PacketTypesIn.JoinGame }, - { 0x27, PacketTypesIn.MapData }, - { 0x28, PacketTypesIn.TradeList }, - { 0x29, PacketTypesIn.EntityPosition }, - { 0x2A, PacketTypesIn.EntityPositionAndRotation }, - { 0x2B, PacketTypesIn.EntityRotation }, - { 0x2C, PacketTypesIn.EntityMovement }, - { 0x2D, PacketTypesIn.VehicleMove }, - { 0x2E, PacketTypesIn.OpenBook }, - { 0x2F, PacketTypesIn.OpenWindow }, - { 0x30, PacketTypesIn.OpenSignEditor }, - { 0x31, PacketTypesIn.CraftRecipeResponse }, - { 0x32, PacketTypesIn.PlayerAbilities }, - { 0x33, PacketTypesIn.CombatEvent }, - { 0x34, PacketTypesIn.PlayerInfo }, - { 0x35, PacketTypesIn.FacePlayer }, - { 0x36, PacketTypesIn.PlayerPositionAndLook }, - { 0x37, PacketTypesIn.UnlockRecipes }, - { 0x38, PacketTypesIn.DestroyEntities }, - { 0x39, PacketTypesIn.RemoveEntityEffect }, - { 0x3A, PacketTypesIn.ResourcePackSend }, - { 0x3B, PacketTypesIn.Respawn }, - { 0x3C, PacketTypesIn.EntityHeadLook }, - { 0x3D, PacketTypesIn.SelectAdvancementTab }, - { 0x3E, PacketTypesIn.WorldBorder }, - { 0x3F, PacketTypesIn.Camera }, - { 0x40, PacketTypesIn.HeldItemChange }, - { 0x41, PacketTypesIn.UpdateViewPosition }, - { 0x42, PacketTypesIn.UpdateViewDistance }, - { 0x43, PacketTypesIn.DisplayScoreboard }, - { 0x44, PacketTypesIn.EntityMetadata }, - { 0x45, PacketTypesIn.AttachEntity }, - { 0x46, PacketTypesIn.EntityVelocity }, - { 0x47, PacketTypesIn.EntityEquipment }, - { 0x48, PacketTypesIn.SetExperience }, - { 0x49, PacketTypesIn.UpdateHealth }, - { 0x4A, PacketTypesIn.ScoreboardObjective }, - { 0x4B, PacketTypesIn.SetPassengers }, - { 0x4C, PacketTypesIn.Teams }, - { 0x4D, PacketTypesIn.UpdateScore }, - { 0x4E, PacketTypesIn.SpawnPosition }, - { 0x4F, PacketTypesIn.TimeUpdate }, - { 0x50, PacketTypesIn.Title }, - { 0x51, PacketTypesIn.EntitySoundEffect }, - { 0x52, PacketTypesIn.SoundEffect }, - { 0x53, PacketTypesIn.StopSound }, - { 0x54, PacketTypesIn.PlayerListHeaderAndFooter }, - { 0x55, PacketTypesIn.NBTQueryResponse }, - { 0x56, PacketTypesIn.CollectItem }, - { 0x57, PacketTypesIn.EntityTeleport }, - { 0x58, PacketTypesIn.Advancements }, - { 0x59, PacketTypesIn.EntityProperties }, - { 0x5A, PacketTypesIn.EntityEffect }, - { 0x5B, PacketTypesIn.DeclareRecipes }, - { 0x5C, PacketTypesIn.Tags }, - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, - { 0x01, PacketTypesOut.QueryBlockNBT }, - { 0x02, PacketTypesOut.SetDifficulty }, - { 0x03, PacketTypesOut.ChatMessage }, - { 0x04, PacketTypesOut.ClientStatus }, - { 0x05, PacketTypesOut.ClientSettings }, - { 0x06, PacketTypesOut.TabComplete }, - { 0x07, PacketTypesOut.WindowConfirmation }, - { 0x08, PacketTypesOut.ClickWindowButton }, - { 0x09, PacketTypesOut.ClickWindow }, - { 0x0A, PacketTypesOut.CloseWindow }, - { 0x0B, PacketTypesOut.PluginMessage }, - { 0x0C, PacketTypesOut.EditBook }, - { 0x0D, PacketTypesOut.EntityNBTRequest }, - { 0x0E, PacketTypesOut.InteractEntity }, - { 0x0F, PacketTypesOut.KeepAlive }, - { 0x10, PacketTypesOut.LockDifficulty }, - { 0x11, PacketTypesOut.PlayerPosition }, - { 0x12, PacketTypesOut.PlayerPositionAndRotation }, - { 0x13, PacketTypesOut.PlayerRotation }, - { 0x14, PacketTypesOut.PlayerMovement }, - { 0x15, PacketTypesOut.VehicleMove }, - { 0x16, PacketTypesOut.SteerBoat }, - { 0x17, PacketTypesOut.PickItem }, - { 0x18, PacketTypesOut.CraftRecipeRequest }, - { 0x19, PacketTypesOut.PlayerAbilities }, - { 0x1A, PacketTypesOut.PlayerDigging }, - { 0x1B, PacketTypesOut.EntityAction }, - { 0x1C, PacketTypesOut.SteerVehicle }, - { 0x1D, PacketTypesOut.RecipeBookData }, - { 0x1E, PacketTypesOut.NameItem }, - { 0x1F, PacketTypesOut.ResourcePackStatus }, - { 0x20, PacketTypesOut.AdvancementTab }, - { 0x21, PacketTypesOut.SelectTrade }, - { 0x22, PacketTypesOut.SetBeaconEffect }, - { 0x23, PacketTypesOut.HeldItemChange }, - { 0x24, PacketTypesOut.UpdateCommandBlock }, - { 0x25, PacketTypesOut.UpdateCommandBlockMinecart }, - { 0x26, PacketTypesOut.CreativeInventoryAction }, - { 0x27, PacketTypesOut.UpdateJigsawBlock }, - { 0x28, PacketTypesOut.UpdateStructureBlock }, - { 0x29, PacketTypesOut.UpdateSign }, - { 0x2A, PacketTypesOut.Animation }, - { 0x2B, PacketTypesOut.Spectate }, - { 0x2C, PacketTypesOut.PlayerBlockPlacement }, - { 0x2D, PacketTypesOut.UseItem }, - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => new(); - protected override Dictionary GetConfigurationListOut() => new(); - } -} diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette116.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette116.cs deleted file mode 100644 index 0d17ba6ca9..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette116.cs +++ /dev/null @@ -1,159 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes -{ - public class PacketPalette116 : PacketTypePalette - { - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.SpawnEntity }, - { 0x01, PacketTypesIn.SpawnExperienceOrb }, - { 0x02, PacketTypesIn.SpawnLivingEntity }, - { 0x03, PacketTypesIn.SpawnPainting }, - { 0x04, PacketTypesIn.SpawnPlayer }, - { 0x05, PacketTypesIn.EntityAnimation }, - { 0x06, PacketTypesIn.Statistics }, - { 0x07, PacketTypesIn.AcknowledgePlayerDigging }, - { 0x08, PacketTypesIn.BlockBreakAnimation }, - { 0x09, PacketTypesIn.BlockEntityData }, - { 0x0A, PacketTypesIn.BlockAction }, - { 0x0B, PacketTypesIn.BlockChange }, - { 0x0C, PacketTypesIn.BossBar }, - { 0x0D, PacketTypesIn.ServerDifficulty }, - { 0x0E, PacketTypesIn.ChatMessage }, - { 0x0F, PacketTypesIn.MultiBlockChange }, - { 0x10, PacketTypesIn.TabComplete }, - { 0x11, PacketTypesIn.DeclareCommands }, - { 0x12, PacketTypesIn.WindowConfirmation }, - { 0x13, PacketTypesIn.CloseWindow }, - { 0x14, PacketTypesIn.WindowItems }, - { 0x15, PacketTypesIn.WindowProperty }, - { 0x16, PacketTypesIn.SetSlot }, - { 0x17, PacketTypesIn.SetCooldown }, - { 0x18, PacketTypesIn.PluginMessage }, - { 0x19, PacketTypesIn.NamedSoundEffect }, - { 0x1A, PacketTypesIn.Disconnect }, - { 0x1B, PacketTypesIn.EntityStatus }, - { 0x1C, PacketTypesIn.Explosion }, - { 0x1D, PacketTypesIn.UnloadChunk }, - { 0x1E, PacketTypesIn.ChangeGameState }, - { 0x1F, PacketTypesIn.OpenHorseWindow }, - { 0x20, PacketTypesIn.KeepAlive }, - { 0x21, PacketTypesIn.ChunkData }, - { 0x22, PacketTypesIn.Effect }, - { 0x23, PacketTypesIn.Particle }, - { 0x24, PacketTypesIn.UpdateLight }, - { 0x25, PacketTypesIn.JoinGame }, - { 0x26, PacketTypesIn.MapData }, - { 0x27, PacketTypesIn.TradeList }, - { 0x28, PacketTypesIn.EntityPosition }, - { 0x29, PacketTypesIn.EntityPositionAndRotation }, - { 0x2A, PacketTypesIn.EntityRotation }, - { 0x2B, PacketTypesIn.EntityMovement }, - { 0x2C, PacketTypesIn.VehicleMove }, - { 0x2D, PacketTypesIn.OpenBook }, - { 0x2E, PacketTypesIn.OpenWindow }, - { 0x2F, PacketTypesIn.OpenSignEditor }, - { 0x30, PacketTypesIn.CraftRecipeResponse }, - { 0x31, PacketTypesIn.PlayerAbilities }, - { 0x32, PacketTypesIn.CombatEvent }, - { 0x33, PacketTypesIn.PlayerInfo }, - { 0x34, PacketTypesIn.FacePlayer }, - { 0x35, PacketTypesIn.PlayerPositionAndLook }, - { 0x36, PacketTypesIn.UnlockRecipes }, - { 0x37, PacketTypesIn.DestroyEntities }, - { 0x38, PacketTypesIn.RemoveEntityEffect }, - { 0x39, PacketTypesIn.ResourcePackSend }, - { 0x3A, PacketTypesIn.Respawn }, - { 0x3B, PacketTypesIn.EntityHeadLook }, - { 0x3C, PacketTypesIn.SelectAdvancementTab }, - { 0x3D, PacketTypesIn.WorldBorder }, - { 0x3E, PacketTypesIn.Camera }, - { 0x3F, PacketTypesIn.HeldItemChange }, - { 0x40, PacketTypesIn.UpdateViewPosition }, - { 0x41, PacketTypesIn.UpdateViewDistance }, - { 0x42, PacketTypesIn.SpawnPosition }, - { 0x43, PacketTypesIn.DisplayScoreboard }, - { 0x44, PacketTypesIn.EntityMetadata }, - { 0x45, PacketTypesIn.AttachEntity }, - { 0x46, PacketTypesIn.EntityVelocity }, - { 0x47, PacketTypesIn.EntityEquipment }, - { 0x48, PacketTypesIn.SetExperience }, - { 0x49, PacketTypesIn.UpdateHealth }, - { 0x4A, PacketTypesIn.ScoreboardObjective }, - { 0x4B, PacketTypesIn.SetPassengers }, - { 0x4C, PacketTypesIn.Teams }, - { 0x4D, PacketTypesIn.UpdateScore }, - { 0x4E, PacketTypesIn.TimeUpdate }, - { 0x4F, PacketTypesIn.Title }, - { 0x50, PacketTypesIn.EntitySoundEffect }, - { 0x51, PacketTypesIn.SoundEffect }, - { 0x52, PacketTypesIn.StopSound }, - { 0x53, PacketTypesIn.PlayerListHeaderAndFooter }, - { 0x54, PacketTypesIn.NBTQueryResponse }, - { 0x55, PacketTypesIn.CollectItem }, - { 0x56, PacketTypesIn.EntityTeleport }, - { 0x57, PacketTypesIn.Advancements }, - { 0x58, PacketTypesIn.EntityProperties }, - { 0x59, PacketTypesIn.EntityEffect }, - { 0x5A, PacketTypesIn.DeclareRecipes }, - { 0x5B, PacketTypesIn.Tags }, - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, - { 0x01, PacketTypesOut.QueryBlockNBT }, - { 0x02, PacketTypesOut.SetDifficulty }, - { 0x03, PacketTypesOut.ChatMessage }, - { 0x04, PacketTypesOut.ClientStatus }, - { 0x05, PacketTypesOut.ClientSettings }, - { 0x06, PacketTypesOut.TabComplete }, - { 0x07, PacketTypesOut.WindowConfirmation }, - { 0x08, PacketTypesOut.ClickWindowButton }, - { 0x09, PacketTypesOut.ClickWindow }, - { 0x0A, PacketTypesOut.CloseWindow }, - { 0x0B, PacketTypesOut.PluginMessage }, - { 0x0C, PacketTypesOut.EditBook }, - { 0x0D, PacketTypesOut.EntityNBTRequest }, - { 0x0E, PacketTypesOut.InteractEntity }, - { 0x0F, PacketTypesOut.GenerateStructure }, - { 0x10, PacketTypesOut.KeepAlive }, - { 0x11, PacketTypesOut.LockDifficulty }, - { 0x12, PacketTypesOut.PlayerPosition }, - { 0x13, PacketTypesOut.PlayerPositionAndRotation }, - { 0x14, PacketTypesOut.PlayerRotation }, - { 0x15, PacketTypesOut.PlayerMovement }, - { 0x16, PacketTypesOut.VehicleMove }, - { 0x17, PacketTypesOut.SteerBoat }, - { 0x18, PacketTypesOut.PickItem }, - { 0x19, PacketTypesOut.CraftRecipeRequest }, - { 0x1A, PacketTypesOut.PlayerAbilities }, - { 0x1B, PacketTypesOut.PlayerDigging }, - { 0x1C, PacketTypesOut.EntityAction }, - { 0x1D, PacketTypesOut.SteerVehicle }, - { 0x1E, PacketTypesOut.RecipeBookData }, - { 0x1F, PacketTypesOut.NameItem }, - { 0x20, PacketTypesOut.ResourcePackStatus }, - { 0x21, PacketTypesOut.AdvancementTab }, - { 0x22, PacketTypesOut.SelectTrade }, - { 0x23, PacketTypesOut.SetBeaconEffect }, - { 0x24, PacketTypesOut.HeldItemChange }, - { 0x25, PacketTypesOut.UpdateCommandBlock }, - { 0x26, PacketTypesOut.UpdateCommandBlockMinecart }, - { 0x27, PacketTypesOut.CreativeInventoryAction }, - { 0x28, PacketTypesOut.UpdateJigsawBlock }, - { 0x29, PacketTypesOut.UpdateStructureBlock }, - { 0x2A, PacketTypesOut.UpdateSign }, - { 0x2B, PacketTypesOut.Animation }, - { 0x2C, PacketTypesOut.Spectate }, - { 0x2D, PacketTypesOut.PlayerBlockPlacement }, - { 0x2E, PacketTypesOut.UseItem }, - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => new(); - protected override Dictionary GetConfigurationListOut() => new(); - } -} diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1162.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1162.cs deleted file mode 100644 index 521fcf2a19..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1162.cs +++ /dev/null @@ -1,160 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes -{ - public class PacketPalette1162 : PacketTypePalette - { - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.SpawnEntity }, - { 0x01, PacketTypesIn.SpawnExperienceOrb }, - { 0x02, PacketTypesIn.SpawnLivingEntity }, - { 0x03, PacketTypesIn.SpawnPainting }, - { 0x04, PacketTypesIn.SpawnPlayer }, - { 0x05, PacketTypesIn.EntityAnimation }, - { 0x06, PacketTypesIn.Statistics }, - { 0x07, PacketTypesIn.AcknowledgePlayerDigging }, - { 0x08, PacketTypesIn.BlockBreakAnimation }, - { 0x09, PacketTypesIn.BlockEntityData }, - { 0x0A, PacketTypesIn.BlockAction }, - { 0x0B, PacketTypesIn.BlockChange }, - { 0x0C, PacketTypesIn.BossBar }, - { 0x0D, PacketTypesIn.ServerDifficulty }, - { 0x0E, PacketTypesIn.ChatMessage }, - { 0x0F, PacketTypesIn.TabComplete }, - { 0x10, PacketTypesIn.DeclareCommands }, - { 0x11, PacketTypesIn.WindowConfirmation }, - { 0x12, PacketTypesIn.CloseWindow }, - { 0x13, PacketTypesIn.WindowItems }, - { 0x14, PacketTypesIn.WindowProperty }, - { 0x15, PacketTypesIn.SetSlot }, - { 0x16, PacketTypesIn.SetCooldown }, - { 0x17, PacketTypesIn.PluginMessage }, - { 0x18, PacketTypesIn.NamedSoundEffect }, - { 0x19, PacketTypesIn.Disconnect }, - { 0x1A, PacketTypesIn.EntityStatus }, - { 0x1B, PacketTypesIn.Explosion }, - { 0x1C, PacketTypesIn.UnloadChunk }, - { 0x1D, PacketTypesIn.ChangeGameState }, - { 0x1E, PacketTypesIn.OpenHorseWindow }, - { 0x1F, PacketTypesIn.KeepAlive }, - { 0x20, PacketTypesIn.ChunkData }, - { 0x21, PacketTypesIn.Effect }, - { 0x22, PacketTypesIn.Particle }, - { 0x23, PacketTypesIn.UpdateLight }, - { 0x24, PacketTypesIn.JoinGame }, - { 0x25, PacketTypesIn.MapData }, - { 0x26, PacketTypesIn.TradeList }, - { 0x27, PacketTypesIn.EntityPosition }, - { 0x28, PacketTypesIn.EntityPositionAndRotation }, - { 0x29, PacketTypesIn.EntityRotation }, - { 0x2A, PacketTypesIn.EntityMovement }, - { 0x2B, PacketTypesIn.VehicleMove }, - { 0x2C, PacketTypesIn.OpenBook }, - { 0x2D, PacketTypesIn.OpenWindow }, - { 0x2E, PacketTypesIn.OpenSignEditor }, - { 0x2F, PacketTypesIn.CraftRecipeResponse }, - { 0x30, PacketTypesIn.PlayerAbilities }, - { 0x31, PacketTypesIn.CombatEvent }, - { 0x32, PacketTypesIn.PlayerInfo }, - { 0x33, PacketTypesIn.FacePlayer }, - { 0x34, PacketTypesIn.PlayerPositionAndLook }, - { 0x35, PacketTypesIn.UnlockRecipes }, - { 0x36, PacketTypesIn.DestroyEntities }, - { 0x37, PacketTypesIn.RemoveEntityEffect }, - { 0x38, PacketTypesIn.ResourcePackSend }, - { 0x39, PacketTypesIn.Respawn }, - { 0x3A, PacketTypesIn.EntityHeadLook }, - { 0x3B, PacketTypesIn.MultiBlockChange }, - { 0x3C, PacketTypesIn.SelectAdvancementTab }, - { 0x3D, PacketTypesIn.WorldBorder }, - { 0x3E, PacketTypesIn.Camera }, - { 0x3F, PacketTypesIn.HeldItemChange }, - { 0x40, PacketTypesIn.UpdateViewPosition }, - { 0x41, PacketTypesIn.UpdateViewDistance }, - { 0x42, PacketTypesIn.SpawnPosition }, - { 0x43, PacketTypesIn.DisplayScoreboard }, - { 0x44, PacketTypesIn.EntityMetadata }, - { 0x45, PacketTypesIn.AttachEntity }, - { 0x46, PacketTypesIn.EntityVelocity }, - { 0x47, PacketTypesIn.EntityEquipment }, - { 0x48, PacketTypesIn.SetExperience }, - { 0x49, PacketTypesIn.UpdateHealth }, - { 0x4A, PacketTypesIn.ScoreboardObjective }, - { 0x4B, PacketTypesIn.SetPassengers }, - { 0x4C, PacketTypesIn.Teams }, - { 0x4D, PacketTypesIn.UpdateScore }, - { 0x4E, PacketTypesIn.TimeUpdate }, - { 0x4F, PacketTypesIn.Title }, - { 0x50, PacketTypesIn.EntitySoundEffect }, - { 0x51, PacketTypesIn.SoundEffect }, - { 0x52, PacketTypesIn.StopSound }, - { 0x53, PacketTypesIn.PlayerListHeaderAndFooter }, - { 0x54, PacketTypesIn.NBTQueryResponse }, - { 0x55, PacketTypesIn.CollectItem }, - { 0x56, PacketTypesIn.EntityTeleport }, - { 0x57, PacketTypesIn.Advancements }, - { 0x58, PacketTypesIn.EntityProperties }, - { 0x59, PacketTypesIn.EntityEffect }, - { 0x5A, PacketTypesIn.DeclareRecipes }, - { 0x5B, PacketTypesIn.Tags }, - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, - { 0x01, PacketTypesOut.QueryBlockNBT }, - { 0x02, PacketTypesOut.SetDifficulty }, - { 0x03, PacketTypesOut.ChatMessage }, - { 0x04, PacketTypesOut.ClientStatus }, - { 0x05, PacketTypesOut.ClientSettings }, - { 0x06, PacketTypesOut.TabComplete }, - { 0x07, PacketTypesOut.WindowConfirmation }, - { 0x08, PacketTypesOut.ClickWindowButton }, - { 0x09, PacketTypesOut.ClickWindow }, - { 0x0A, PacketTypesOut.CloseWindow }, - { 0x0B, PacketTypesOut.PluginMessage }, - { 0x0C, PacketTypesOut.EditBook }, - { 0x0D, PacketTypesOut.EntityNBTRequest }, - { 0x0E, PacketTypesOut.InteractEntity }, - { 0x0F, PacketTypesOut.GenerateStructure }, - { 0x10, PacketTypesOut.KeepAlive }, - { 0x11, PacketTypesOut.LockDifficulty }, - { 0x12, PacketTypesOut.PlayerPosition }, - { 0x13, PacketTypesOut.PlayerPositionAndRotation }, - { 0x14, PacketTypesOut.PlayerRotation }, - { 0x15, PacketTypesOut.PlayerMovement }, - { 0x16, PacketTypesOut.VehicleMove }, - { 0x17, PacketTypesOut.SteerBoat }, - { 0x18, PacketTypesOut.PickItem }, - { 0x19, PacketTypesOut.CraftRecipeRequest }, - { 0x1A, PacketTypesOut.PlayerAbilities }, - { 0x1B, PacketTypesOut.PlayerDigging }, - { 0x1C, PacketTypesOut.EntityAction }, - { 0x1D, PacketTypesOut.SteerVehicle }, - { 0x1E, PacketTypesOut.SetDisplayedRecipe }, - { 0x1F, PacketTypesOut.SetRecipeBookState }, - { 0x20, PacketTypesOut.NameItem }, - { 0x21, PacketTypesOut.ResourcePackStatus }, - { 0x22, PacketTypesOut.AdvancementTab }, - { 0x23, PacketTypesOut.SelectTrade }, - { 0x24, PacketTypesOut.SetBeaconEffect }, - { 0x25, PacketTypesOut.HeldItemChange }, - { 0x26, PacketTypesOut.UpdateCommandBlock }, - { 0x27, PacketTypesOut.UpdateCommandBlockMinecart }, - { 0x28, PacketTypesOut.CreativeInventoryAction }, - { 0x29, PacketTypesOut.UpdateJigsawBlock }, - { 0x2A, PacketTypesOut.UpdateStructureBlock }, - { 0x2B, PacketTypesOut.UpdateSign }, - { 0x2C, PacketTypesOut.Animation }, - { 0x2D, PacketTypesOut.Spectate }, - { 0x2E, PacketTypesOut.PlayerBlockPlacement }, - { 0x2F, PacketTypesOut.UseItem }, - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => new(); - protected override Dictionary GetConfigurationListOut() => new(); - } -} diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette117.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette117.cs deleted file mode 100644 index 70191896e3..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette117.cs +++ /dev/null @@ -1,171 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes -{ - public class PacketPalette117 : PacketTypePalette - { - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.SpawnEntity }, - { 0x01, PacketTypesIn.SpawnExperienceOrb }, - { 0x02, PacketTypesIn.SpawnLivingEntity }, - { 0x03, PacketTypesIn.SpawnPainting }, - { 0x04, PacketTypesIn.SpawnPlayer }, - { 0x05, PacketTypesIn.SkulkVibrationSignal }, - { 0x06, PacketTypesIn.EntityAnimation }, - { 0x07, PacketTypesIn.Statistics }, - { 0x08, PacketTypesIn.AcknowledgePlayerDigging }, - { 0x09, PacketTypesIn.BlockBreakAnimation }, - { 0x0A, PacketTypesIn.BlockEntityData }, - { 0x0B, PacketTypesIn.BlockAction }, - { 0x0C, PacketTypesIn.BlockChange }, - { 0x0D, PacketTypesIn.BossBar }, - { 0x0E, PacketTypesIn.ServerDifficulty }, - { 0x0F, PacketTypesIn.ChatMessage }, - { 0x10, PacketTypesIn.ClearTiles }, - { 0x11, PacketTypesIn.TabComplete }, - { 0x12, PacketTypesIn.DeclareCommands }, - { 0x13, PacketTypesIn.CloseWindow }, - { 0x14, PacketTypesIn.WindowItems }, - { 0x15, PacketTypesIn.WindowProperty }, - { 0x16, PacketTypesIn.SetSlot }, - { 0x17, PacketTypesIn.SetCooldown }, - { 0x18, PacketTypesIn.PluginMessage }, - { 0x19, PacketTypesIn.NamedSoundEffect }, - { 0x1A, PacketTypesIn.Disconnect }, - { 0x1B, PacketTypesIn.EntityStatus }, - { 0x1C, PacketTypesIn.Explosion }, - { 0x1D, PacketTypesIn.UnloadChunk }, - { 0x1E, PacketTypesIn.ChangeGameState }, - { 0x1F, PacketTypesIn.OpenHorseWindow }, - { 0x20, PacketTypesIn.InitializeWorldBorder }, - { 0x21, PacketTypesIn.KeepAlive }, - { 0x22, PacketTypesIn.ChunkData }, - { 0x23, PacketTypesIn.Effect }, - { 0x24, PacketTypesIn.Particle }, - { 0x25, PacketTypesIn.UpdateLight }, - { 0x26, PacketTypesIn.JoinGame }, - { 0x27, PacketTypesIn.MapData }, - { 0x28, PacketTypesIn.TradeList }, - { 0x29, PacketTypesIn.EntityPosition }, - { 0x2A, PacketTypesIn.EntityPositionAndRotation }, - { 0x2B, PacketTypesIn.EntityRotation }, - { 0x2C, PacketTypesIn.VehicleMove }, - { 0x2D, PacketTypesIn.OpenBook }, - { 0x2E, PacketTypesIn.OpenWindow }, - { 0x2F, PacketTypesIn.OpenSignEditor }, - { 0x30, PacketTypesIn.Ping }, - { 0x31, PacketTypesIn.CraftRecipeResponse }, - { 0x32, PacketTypesIn.PlayerAbilities }, - { 0x33, PacketTypesIn.EndCombatEvent }, - { 0x34, PacketTypesIn.EnterCombatEvent }, - { 0x35, PacketTypesIn.DeathCombatEvent }, - { 0x36, PacketTypesIn.PlayerInfo }, - { 0x37, PacketTypesIn.FacePlayer }, - { 0x38, PacketTypesIn.PlayerPositionAndLook }, - { 0x39, PacketTypesIn.UnlockRecipes }, - { 0x3A, PacketTypesIn.DestroyEntities }, - { 0x3B, PacketTypesIn.RemoveEntityEffect }, - { 0x3C, PacketTypesIn.ResourcePackSend }, - { 0x3D, PacketTypesIn.Respawn }, - { 0x3E, PacketTypesIn.EntityHeadLook }, - { 0x3F, PacketTypesIn.MultiBlockChange }, - { 0x40, PacketTypesIn.SelectAdvancementTab }, - { 0x41, PacketTypesIn.ActionBar }, - { 0x42, PacketTypesIn.WorldBorderCenter }, - { 0x43, PacketTypesIn.WorldBorderLerpSize }, - { 0x44, PacketTypesIn.WorldBorderSize }, - { 0x45, PacketTypesIn.WorldBorderWarningDelay }, - { 0x46, PacketTypesIn.WorldBorderWarningReach }, - { 0x47, PacketTypesIn.Camera }, - { 0x48, PacketTypesIn.HeldItemChange }, - { 0x49, PacketTypesIn.UpdateViewPosition }, - { 0x4A, PacketTypesIn.UpdateViewDistance }, - { 0x4B, PacketTypesIn.SpawnPosition }, - { 0x4C, PacketTypesIn.DisplayScoreboard }, - { 0x4D, PacketTypesIn.EntityMetadata }, - { 0x4E, PacketTypesIn.AttachEntity }, - { 0x4F, PacketTypesIn.EntityVelocity }, - { 0x50, PacketTypesIn.EntityEquipment }, - { 0x51, PacketTypesIn.SetExperience }, - { 0x52, PacketTypesIn.UpdateHealth }, - { 0x53, PacketTypesIn.ScoreboardObjective }, - { 0x54, PacketTypesIn.SetPassengers }, - { 0x55, PacketTypesIn.Teams }, - { 0x56, PacketTypesIn.UpdateScore }, - { 0x57, PacketTypesIn.SetTitleSubTitle }, - { 0x58, PacketTypesIn.TimeUpdate }, - { 0x59, PacketTypesIn.SetTitleText }, - { 0x5A, PacketTypesIn.SetTitleTime }, - { 0x5B, PacketTypesIn.EntitySoundEffect }, - { 0x5C, PacketTypesIn.SoundEffect }, - { 0x5D, PacketTypesIn.StopSound }, - { 0x5E, PacketTypesIn.PlayerListHeaderAndFooter }, - { 0x5F, PacketTypesIn.NBTQueryResponse }, - { 0x60, PacketTypesIn.CollectItem }, - { 0x61, PacketTypesIn.EntityTeleport }, - { 0x62, PacketTypesIn.Advancements }, - { 0x63, PacketTypesIn.EntityProperties }, - { 0x64, PacketTypesIn.EntityEffect }, - { 0x65, PacketTypesIn.DeclareRecipes }, - { 0x66, PacketTypesIn.Tags }, - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, - { 0x01, PacketTypesOut.QueryBlockNBT }, - { 0x02, PacketTypesOut.SetDifficulty }, - { 0x03, PacketTypesOut.ChatMessage }, - { 0x04, PacketTypesOut.ClientStatus }, - { 0x05, PacketTypesOut.ClientSettings }, - { 0x06, PacketTypesOut.TabComplete }, - { 0x07, PacketTypesOut.ClickWindowButton }, - { 0x08, PacketTypesOut.ClickWindow }, - { 0x09, PacketTypesOut.CloseWindow }, - { 0x0A, PacketTypesOut.PluginMessage }, - { 0x0B, PacketTypesOut.EditBook }, - { 0x0C, PacketTypesOut.EntityNBTRequest }, - { 0x0D, PacketTypesOut.InteractEntity }, - { 0x0E, PacketTypesOut.GenerateStructure }, - { 0x0F, PacketTypesOut.KeepAlive }, - { 0x10, PacketTypesOut.LockDifficulty }, - { 0x11, PacketTypesOut.PlayerPosition }, - { 0x12, PacketTypesOut.PlayerPositionAndRotation }, - { 0x13, PacketTypesOut.PlayerRotation }, - { 0x14, PacketTypesOut.PlayerMovement }, - { 0x15, PacketTypesOut.VehicleMove }, - { 0x16, PacketTypesOut.SteerBoat }, - { 0x17, PacketTypesOut.PickItem }, - { 0x18, PacketTypesOut.CraftRecipeRequest }, - { 0x19, PacketTypesOut.PlayerAbilities }, - { 0x1A, PacketTypesOut.PlayerDigging }, - { 0x1B, PacketTypesOut.EntityAction }, - { 0x1C, PacketTypesOut.SteerVehicle }, - { 0x1D, PacketTypesOut.Pong }, - { 0x1E, PacketTypesOut.SetDisplayedRecipe }, - { 0x1F, PacketTypesOut.SetRecipeBookState }, - { 0x20, PacketTypesOut.NameItem }, - { 0x21, PacketTypesOut.ResourcePackStatus }, - { 0x22, PacketTypesOut.AdvancementTab }, - { 0x23, PacketTypesOut.SelectTrade }, - { 0x24, PacketTypesOut.SetBeaconEffect }, - { 0x25, PacketTypesOut.HeldItemChange }, - { 0x26, PacketTypesOut.UpdateCommandBlock }, - { 0x27, PacketTypesOut.UpdateCommandBlockMinecart }, - { 0x28, PacketTypesOut.CreativeInventoryAction }, - { 0x29, PacketTypesOut.UpdateJigsawBlock }, - { 0x2A, PacketTypesOut.UpdateStructureBlock }, - { 0x2B, PacketTypesOut.UpdateSign }, - { 0x2C, PacketTypesOut.Animation }, - { 0x2D, PacketTypesOut.Spectate }, - { 0x2E, PacketTypesOut.PlayerBlockPlacement }, - { 0x2F, PacketTypesOut.UseItem }, - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => new(); - protected override Dictionary GetConfigurationListOut() => new(); - } -} diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette118.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette118.cs deleted file mode 100644 index ffecc3db44..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette118.cs +++ /dev/null @@ -1,172 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes -{ - public class PacketPalette118 : PacketTypePalette - { - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.SpawnEntity }, - { 0x01, PacketTypesIn.SpawnExperienceOrb }, - { 0x02, PacketTypesIn.SpawnLivingEntity }, - { 0x03, PacketTypesIn.SpawnPainting }, - { 0x04, PacketTypesIn.SpawnPlayer }, - { 0x05, PacketTypesIn.SkulkVibrationSignal }, - { 0x06, PacketTypesIn.EntityAnimation }, - { 0x07, PacketTypesIn.Statistics }, - { 0x08, PacketTypesIn.AcknowledgePlayerDigging }, - { 0x09, PacketTypesIn.BlockBreakAnimation }, - { 0x0A, PacketTypesIn.BlockEntityData }, - { 0x0B, PacketTypesIn.BlockAction }, - { 0x0C, PacketTypesIn.BlockChange }, - { 0x0D, PacketTypesIn.BossBar }, - { 0x0E, PacketTypesIn.ServerDifficulty }, - { 0x0F, PacketTypesIn.ChatMessage }, - { 0x10, PacketTypesIn.ClearTiles }, - { 0x11, PacketTypesIn.TabComplete }, - { 0x12, PacketTypesIn.DeclareCommands }, - { 0x13, PacketTypesIn.CloseWindow }, - { 0x14, PacketTypesIn.WindowItems }, - { 0x15, PacketTypesIn.WindowProperty }, - { 0x16, PacketTypesIn.SetSlot }, - { 0x17, PacketTypesIn.SetCooldown }, - { 0x18, PacketTypesIn.PluginMessage }, - { 0x19, PacketTypesIn.NamedSoundEffect }, - { 0x1A, PacketTypesIn.Disconnect }, - { 0x1B, PacketTypesIn.EntityStatus }, - { 0x1C, PacketTypesIn.Explosion }, - { 0x1D, PacketTypesIn.UnloadChunk }, - { 0x1E, PacketTypesIn.ChangeGameState }, - { 0x1F, PacketTypesIn.OpenHorseWindow }, - { 0x20, PacketTypesIn.InitializeWorldBorder }, - { 0x21, PacketTypesIn.KeepAlive }, - { 0x22, PacketTypesIn.ChunkData }, - { 0x23, PacketTypesIn.Effect }, - { 0x24, PacketTypesIn.Particle }, - { 0x25, PacketTypesIn.UpdateLight }, - { 0x26, PacketTypesIn.JoinGame }, - { 0x27, PacketTypesIn.MapData }, - { 0x28, PacketTypesIn.TradeList }, - { 0x29, PacketTypesIn.EntityPosition }, - { 0x2A, PacketTypesIn.EntityPositionAndRotation }, - { 0x2B, PacketTypesIn.EntityRotation }, - { 0x2C, PacketTypesIn.VehicleMove }, - { 0x2D, PacketTypesIn.OpenBook }, - { 0x2E, PacketTypesIn.OpenWindow }, - { 0x2F, PacketTypesIn.OpenSignEditor }, - { 0x30, PacketTypesIn.Ping }, - { 0x31, PacketTypesIn.CraftRecipeResponse }, - { 0x32, PacketTypesIn.PlayerAbilities }, - { 0x33, PacketTypesIn.EndCombatEvent }, - { 0x34, PacketTypesIn.EnterCombatEvent }, - { 0x35, PacketTypesIn.DeathCombatEvent }, - { 0x36, PacketTypesIn.PlayerInfo }, - { 0x37, PacketTypesIn.FacePlayer }, - { 0x38, PacketTypesIn.PlayerPositionAndLook }, - { 0x39, PacketTypesIn.UnlockRecipes }, - { 0x3A, PacketTypesIn.DestroyEntities }, - { 0x3B, PacketTypesIn.RemoveEntityEffect }, - { 0x3C, PacketTypesIn.ResourcePackSend }, - { 0x3D, PacketTypesIn.Respawn }, - { 0x3E, PacketTypesIn.EntityHeadLook }, - { 0x3F, PacketTypesIn.MultiBlockChange }, - { 0x40, PacketTypesIn.SelectAdvancementTab }, - { 0x41, PacketTypesIn.ActionBar }, - { 0x42, PacketTypesIn.WorldBorderCenter }, - { 0x43, PacketTypesIn.WorldBorderLerpSize }, - { 0x44, PacketTypesIn.WorldBorderSize }, - { 0x45, PacketTypesIn.WorldBorderWarningDelay }, - { 0x46, PacketTypesIn.WorldBorderWarningReach }, - { 0x47, PacketTypesIn.Camera }, - { 0x48, PacketTypesIn.HeldItemChange }, - { 0x49, PacketTypesIn.UpdateViewPosition }, - { 0x4A, PacketTypesIn.UpdateViewDistance }, - { 0x4B, PacketTypesIn.SpawnPosition }, - { 0x4C, PacketTypesIn.DisplayScoreboard }, - { 0x4D, PacketTypesIn.EntityMetadata }, - { 0x4E, PacketTypesIn.AttachEntity }, - { 0x4F, PacketTypesIn.EntityVelocity }, - { 0x50, PacketTypesIn.EntityEquipment }, - { 0x51, PacketTypesIn.SetExperience }, - { 0x52, PacketTypesIn.UpdateHealth }, - { 0x53, PacketTypesIn.ScoreboardObjective }, - { 0x54, PacketTypesIn.SetPassengers }, - { 0x55, PacketTypesIn.Teams }, - { 0x56, PacketTypesIn.UpdateScore }, - { 0x57, PacketTypesIn.UpdateSimulationDistance }, - { 0x58, PacketTypesIn.SetTitleSubTitle }, - { 0x59, PacketTypesIn.TimeUpdate }, - { 0x5A, PacketTypesIn.SetTitleText }, - { 0x5B, PacketTypesIn.SetTitleTime }, - { 0x5C, PacketTypesIn.EntitySoundEffect }, - { 0x5D, PacketTypesIn.SoundEffect }, - { 0x5E, PacketTypesIn.StopSound }, - { 0x5F, PacketTypesIn.PlayerListHeaderAndFooter }, - { 0x60, PacketTypesIn.NBTQueryResponse }, - { 0x61, PacketTypesIn.CollectItem }, - { 0x62, PacketTypesIn.EntityTeleport }, - { 0x63, PacketTypesIn.Advancements }, - { 0x64, PacketTypesIn.EntityProperties }, - { 0x65, PacketTypesIn.EntityEffect }, - { 0x66, PacketTypesIn.DeclareRecipes }, - { 0x67, PacketTypesIn.Tags }, - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, - { 0x01, PacketTypesOut.QueryBlockNBT }, - { 0x02, PacketTypesOut.SetDifficulty }, - { 0x03, PacketTypesOut.ChatMessage }, - { 0x04, PacketTypesOut.ClientStatus }, - { 0x05, PacketTypesOut.ClientSettings }, - { 0x06, PacketTypesOut.TabComplete }, - { 0x07, PacketTypesOut.ClickWindowButton }, - { 0x08, PacketTypesOut.ClickWindow }, - { 0x09, PacketTypesOut.CloseWindow }, - { 0x0A, PacketTypesOut.PluginMessage }, - { 0x0B, PacketTypesOut.EditBook }, - { 0x0C, PacketTypesOut.EntityNBTRequest }, - { 0x0D, PacketTypesOut.InteractEntity }, - { 0x0E, PacketTypesOut.GenerateStructure }, - { 0x0F, PacketTypesOut.KeepAlive }, - { 0x10, PacketTypesOut.LockDifficulty }, - { 0x11, PacketTypesOut.PlayerPosition }, - { 0x12, PacketTypesOut.PlayerPositionAndRotation }, - { 0x13, PacketTypesOut.PlayerRotation }, - { 0x14, PacketTypesOut.PlayerMovement }, - { 0x15, PacketTypesOut.VehicleMove }, - { 0x16, PacketTypesOut.SteerBoat }, - { 0x17, PacketTypesOut.PickItem }, - { 0x18, PacketTypesOut.CraftRecipeRequest }, - { 0x19, PacketTypesOut.PlayerAbilities }, - { 0x1A, PacketTypesOut.PlayerDigging }, - { 0x1B, PacketTypesOut.EntityAction }, - { 0x1C, PacketTypesOut.SteerVehicle }, - { 0x1D, PacketTypesOut.Pong }, - { 0x1E, PacketTypesOut.SetDisplayedRecipe }, - { 0x1F, PacketTypesOut.SetRecipeBookState }, - { 0x20, PacketTypesOut.NameItem }, - { 0x21, PacketTypesOut.ResourcePackStatus }, - { 0x22, PacketTypesOut.AdvancementTab }, - { 0x23, PacketTypesOut.SelectTrade }, - { 0x24, PacketTypesOut.SetBeaconEffect }, - { 0x25, PacketTypesOut.HeldItemChange }, - { 0x26, PacketTypesOut.UpdateCommandBlock }, - { 0x27, PacketTypesOut.UpdateCommandBlockMinecart }, - { 0x28, PacketTypesOut.CreativeInventoryAction }, - { 0x29, PacketTypesOut.UpdateJigsawBlock }, - { 0x2A, PacketTypesOut.UpdateStructureBlock }, - { 0x2B, PacketTypesOut.UpdateSign }, - { 0x2C, PacketTypesOut.Animation }, - { 0x2D, PacketTypesOut.Spectate }, - { 0x2E, PacketTypesOut.PlayerBlockPlacement }, - { 0x2F, PacketTypesOut.UseItem }, - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => new(); - protected override Dictionary GetConfigurationListOut() => new(); - } -} diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette119.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette119.cs deleted file mode 100644 index 7a7e9eb64d..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette119.cs +++ /dev/null @@ -1,175 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes -{ - public class PacketPalette119 : PacketTypePalette - { - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.SpawnEntity }, // Changed in 1.19 (Wiki name: Spawn Entity) - { 0x01, PacketTypesIn.SpawnExperienceOrb }, // (Wiki name: Spawn Exeprience Orb) - { 0x02, PacketTypesIn.SpawnPlayer }, // - { 0x03, PacketTypesIn.EntityAnimation }, // (Wiki name: Entity Animation (clientbound)) - { 0x04, PacketTypesIn.Statistics }, // (Wiki name: Award Statistics) - { 0x05, PacketTypesIn.BlockChangedAck }, // Added 1.19 (Wiki name: Acknowledge Block Change) - { 0x06, PacketTypesIn.BlockBreakAnimation }, // (Wiki name: Set Block Destroy Stage) - { 0x07, PacketTypesIn.BlockEntityData }, // - { 0x08, PacketTypesIn.BlockAction }, // - { 0x09, PacketTypesIn.BlockChange }, // (Wiki name: Block Update) - { 0x0A, PacketTypesIn.BossBar }, // - { 0x0B, PacketTypesIn.ServerDifficulty }, // (Wiki name: Change Difficulty) - { 0x0C, PacketTypesIn.ChatPreview }, // Added 1.19 - { 0x0D, PacketTypesIn.ClearTiles }, // - { 0x0E, PacketTypesIn.TabComplete }, // (Wiki name: Command Suggestions Response) - { 0x0F, PacketTypesIn.DeclareCommands }, // (Wiki name: Commands) - { 0x10, PacketTypesIn.CloseWindow }, // (Wiki name: Close Container (clientbound)) - { 0x11, PacketTypesIn.WindowItems }, // (Wiki name: Set Container Content) - { 0x12, PacketTypesIn.WindowProperty }, // (Wiki name: Set Container Property) - { 0x13, PacketTypesIn.SetSlot }, // (Wiki name: Set Container Slot) - { 0x14, PacketTypesIn.SetCooldown }, // - { 0x15, PacketTypesIn.PluginMessage }, // (Wiki name: Plugin Message (clientbound)) - { 0x16, PacketTypesIn.NamedSoundEffect }, // Changed in 1.19 (Added "Speed" field) (Wiki name: Custom Sound Effect) (No need to be implemented) - { 0x17, PacketTypesIn.Disconnect }, // - { 0x18, PacketTypesIn.EntityStatus }, // (Wiki name: Entity Event) - { 0x19, PacketTypesIn.Explosion }, // Changed in 1.19 (Location fields are now Double instead of Float) (Wiki name: Explosion) - { 0x1A, PacketTypesIn.UnloadChunk }, // (Wiki name: Forget Chunk) - { 0x1B, PacketTypesIn.ChangeGameState }, // (Wiki name: Game Event) - { 0x1C, PacketTypesIn.OpenHorseWindow }, // (Wiki name: Horse Screen Open) - { 0x1D, PacketTypesIn.InitializeWorldBorder }, // - { 0x1E, PacketTypesIn.KeepAlive }, // - { 0x1F, PacketTypesIn.ChunkData }, // - { 0x20, PacketTypesIn.Effect }, // (Wiki name: Level Event) - { 0x21, PacketTypesIn.Particle }, // Changed in 1.19 ("Particle Data" field is now "Max Speed", it's the same Float data type) (Wiki name: Level Particle) (No need to be implemented) - { 0x22, PacketTypesIn.UpdateLight }, // (Wiki name: Light Update) - { 0x23, PacketTypesIn.JoinGame }, // Changed in 1.19 (lot's of changes) (Wiki name: Login (play)) - { 0x24, PacketTypesIn.MapData }, // (Wiki name: Map Item Data) - { 0x25, PacketTypesIn.TradeList }, // (Wiki name: Merchant Offers) - { 0x26, PacketTypesIn.EntityPosition }, // (Wiki name: Move Entity Position) - { 0x27, PacketTypesIn.EntityPositionAndRotation }, // (Wiki name: Move Entity Position and Rotation) - { 0x28, PacketTypesIn.EntityRotation }, // (Wiki name: Move Entity Rotation) - { 0x29, PacketTypesIn.VehicleMove }, // (Wiki name: Move Vehicle) - { 0x2A, PacketTypesIn.OpenBook }, // - { 0x2B, PacketTypesIn.OpenWindow }, // (Wiki name: Open Screen) - { 0x2C, PacketTypesIn.OpenSignEditor }, // - { 0x2D, PacketTypesIn.Ping }, // (Wiki name: Ping (play)) - { 0x2E, PacketTypesIn.CraftRecipeResponse }, // (Wiki name: Place Ghost Recipe) - { 0x2F, PacketTypesIn.PlayerAbilities }, // - { 0x30, PacketTypesIn.ChatMessage }, // Changed in 1.19 (Completely changed) (Wiki name: Player Chat Message) - { 0x31, PacketTypesIn.EndCombatEvent }, // (Wiki name: Player Combat End) - { 0x32, PacketTypesIn.EnterCombatEvent }, // (Wiki name: Player Combat Enter) - { 0x33, PacketTypesIn.DeathCombatEvent }, // (Wiki name: Player Combat Kill) - { 0x34, PacketTypesIn.PlayerInfo }, // Changed in 1.19 (Heavy changes) - { 0x35, PacketTypesIn.FacePlayer }, // (Wiki name: Player Look At) - { 0x36, PacketTypesIn.PlayerPositionAndLook }, // (Wiki name: Player Position) - { 0x37, PacketTypesIn.UnlockRecipes }, // (Wiki name: Recipe) - { 0x38, PacketTypesIn.DestroyEntities }, // (Wiki name: Remove Entites) - { 0x39, PacketTypesIn.RemoveEntityEffect }, // - { 0x3A, PacketTypesIn.ResourcePackSend }, // (Wiki name: Resource Pack) - { 0x3B, PacketTypesIn.Respawn }, // Changed in 1.19 (Heavy changes) - { 0x3C, PacketTypesIn.EntityHeadLook }, // (Wiki name: Rotate Head) - { 0x3D, PacketTypesIn.MultiBlockChange }, // (Wiki name: Sections Block Update) - { 0x3E, PacketTypesIn.SelectAdvancementTab }, // - { 0x3F, PacketTypesIn.ServerData }, // Added in 1.19 - { 0x40, PacketTypesIn.ActionBar }, // (Wiki name: Set Action Bar Text) - { 0x41, PacketTypesIn.WorldBorderCenter }, // (Wiki name: Set Border Center) - { 0x42, PacketTypesIn.WorldBorderLerpSize }, // - { 0x43, PacketTypesIn.WorldBorderSize }, // (Wiki name: Set World Border Size) - { 0x44, PacketTypesIn.WorldBorderWarningDelay }, // (Wiki name: Set World Border Warning Delay) - { 0x45, PacketTypesIn.WorldBorderWarningReach }, // (Wiki name: Set Border Warning Distance) - { 0x46, PacketTypesIn.Camera }, // (Wiki name: Set Camera) - { 0x47, PacketTypesIn.HeldItemChange }, // (Wiki name: Set Carried Item (clientbound)) - { 0x48, PacketTypesIn.UpdateViewPosition }, // (Wiki name: Set Chunk Cache Center) - { 0x49, PacketTypesIn.UpdateViewDistance }, // (Wiki name: Set Chunk Cache Radius) - { 0x4A, PacketTypesIn.SpawnPosition }, // (Wiki name: Set Default Spawn Position) - { 0x4B, PacketTypesIn.SetDisplayChatPreview }, // Added in 1.19 (Wiki name: Set Display Chat Preview) - { 0x4C, PacketTypesIn.DisplayScoreboard }, // (Wiki name: Set Display Objective) - { 0x4D, PacketTypesIn.EntityMetadata }, // (Wiki name: Set Entity Metadata) - { 0x4E, PacketTypesIn.AttachEntity }, // (Wiki name: Set Entity Link) - { 0x4F, PacketTypesIn.EntityVelocity }, // (Wiki name: Set Entity Motion) - { 0x50, PacketTypesIn.EntityEquipment }, // (Wiki name: Set Equipment) - { 0x51, PacketTypesIn.SetExperience }, // - { 0x52, PacketTypesIn.UpdateHealth }, // (Wiki name: Set Health) - { 0x53, PacketTypesIn.ScoreboardObjective }, // (Wiki name: Set Objective) - { 0x54, PacketTypesIn.SetPassengers }, // - { 0x55, PacketTypesIn.Teams }, // (Wiki name: Set Player Team) - { 0x56, PacketTypesIn.UpdateScore }, // (Wiki name: Set Score) - { 0x57, PacketTypesIn.UpdateSimulationDistance }, // (Wiki name: Set Simulation Distance) - { 0x58, PacketTypesIn.SetTitleSubTitle }, // (Wiki name: Set Subtitle Test) - { 0x59, PacketTypesIn.TimeUpdate }, // (Wiki name: Set Time) - { 0x5A, PacketTypesIn.SetTitleText }, // (Wiki name: Set Title) - { 0x5B, PacketTypesIn.SetTitleTime }, // (Wiki name: Set Titles Animation) - { 0x5C, PacketTypesIn.EntitySoundEffect }, // (Wiki name: Sound Entity) - { 0x5D, PacketTypesIn.SoundEffect }, // Changed in 1.19 (Added "Seed" field) (Wiki name: Sound Effect) (No need to be implemented) - { 0x5E, PacketTypesIn.StopSound }, // - { 0x5F, PacketTypesIn.SystemChat }, // Added in 1.19 (Wiki name: System Chat Message) - { 0x60, PacketTypesIn.PlayerListHeaderAndFooter }, // (Wiki name: Tab List) - { 0x61, PacketTypesIn.NBTQueryResponse }, // (Wiki name: Tab Query) - { 0x62, PacketTypesIn.CollectItem }, // (Wiki name: Take Item Entity) - { 0x63, PacketTypesIn.EntityTeleport }, // (Wiki name: Teleport Entity) - { 0x64, PacketTypesIn.Advancements }, // (Wiki name: Update Advancements) - { 0x65, PacketTypesIn.EntityProperties }, // (Wiki name: Update Attributes) - { 0x66, PacketTypesIn.EntityEffect }, // Changed in 1.19 (Added "Has Factor Data" and "Factor Codec" fields) (Wiki name: Entity Effect) - { 0x67, PacketTypesIn.DeclareRecipes }, // (Wiki name: Update Recipes) - { 0x68, PacketTypesIn.Tags }, // (Wiki name: Update Tags) - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, // (Wiki name: Confirm Teleportation) - { 0x01, PacketTypesOut.QueryBlockNBT }, // (Wiki name: Query Block Entity Tag) - { 0x02, PacketTypesOut.SetDifficulty }, // (Wiki name: Change Difficutly) - { 0x03, PacketTypesOut.ChatCommand }, // Added in 1.19 - { 0x04, PacketTypesOut.ChatMessage }, // Changed in 1.19 (Completely changed) (Wiki name: Chat) - { 0x05, PacketTypesOut.ChatPreview }, // Added in 1.19 (Wiki name: Chat Preview (serverbound)) - { 0x06, PacketTypesOut.ClientStatus }, // (Wiki name: Client Command) - { 0x07, PacketTypesOut.ClientSettings }, // (Wiki name: Client Information) - { 0x08, PacketTypesOut.TabComplete }, // (Wiki name: Command Suggestions Request) - { 0x09, PacketTypesOut.ClickWindowButton }, // (Wiki name: Click Container Button) - { 0x0A, PacketTypesOut.ClickWindow }, // (Wiki name: Click Container) - { 0x0B, PacketTypesOut.CloseWindow }, // (Wiki name: Close Container (serverbound)) - { 0x0C, PacketTypesOut.PluginMessage }, // (Wiki name: Plugin Message (serverbound)) - { 0x0D, PacketTypesOut.EditBook }, // - { 0x0E, PacketTypesOut.EntityNBTRequest }, // (Wiki name: Query Entity Tag) - { 0x0F, PacketTypesOut.InteractEntity }, // (Wiki name: Interact) - { 0x10, PacketTypesOut.GenerateStructure }, // (Wiki name: Jigsaw Generate) - { 0x11, PacketTypesOut.KeepAlive }, // - { 0x12, PacketTypesOut.LockDifficulty }, // - { 0x13, PacketTypesOut.PlayerPosition }, // (Wiki name: Move Player Position) - { 0x14, PacketTypesOut.PlayerPositionAndRotation }, // (Wiki name: Set Player Position and Rotation) - { 0x15, PacketTypesOut.PlayerRotation }, // (Wiki name: Set Player Rotation) - { 0x16, PacketTypesOut.PlayerMovement }, // (Wiki name: Set Player On Ground) - { 0x17, PacketTypesOut.VehicleMove }, // (Wiki name: Move Vehicle (serverbound)) - { 0x18, PacketTypesOut.SteerBoat }, // (Wiki name: Paddle Boat) - { 0x19, PacketTypesOut.PickItem }, // - { 0x1A, PacketTypesOut.CraftRecipeRequest }, // (Wiki name: Place recipe) - { 0x1B, PacketTypesOut.PlayerAbilities }, // - { 0x1C, PacketTypesOut.PlayerDigging }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Player Action) - { 0x1D, PacketTypesOut.EntityAction }, // (Wiki name: Player Command) - { 0x1E, PacketTypesOut.SteerVehicle }, // (Wiki name: Player Input) - { 0x1F, PacketTypesOut.Pong }, // (Wiki name: Pong (play)) - { 0x20, PacketTypesOut.SetDisplayedRecipe }, // (Wiki name: Recipe Book Change Settings) - { 0x21, PacketTypesOut.SetRecipeBookState }, // (Wiki name: Recipe Book Seen Recipe) - { 0x22, PacketTypesOut.NameItem }, // (Wiki name: Rename Item) - { 0x23, PacketTypesOut.ResourcePackStatus }, // (Wiki name: Resource Pack (serverbound)) - { 0x24, PacketTypesOut.AdvancementTab }, // (Wiki name: Seen Advancements) - { 0x25, PacketTypesOut.SelectTrade }, // - { 0x26, PacketTypesOut.SetBeaconEffect }, // Changed in 1.19 (Added a "Secondary Effect Present" and "Secondary Effect" fields) (Wiki name: Set Beacon) - (No need to be implemented) - { 0x27, PacketTypesOut.HeldItemChange }, // (Wiki name: Set Carried Item (serverbound)) - { 0x28, PacketTypesOut.UpdateCommandBlock }, // (Wiki name: Set Command Block) - { 0x29, PacketTypesOut.UpdateCommandBlockMinecart }, // - { 0x2A, PacketTypesOut.CreativeInventoryAction }, // (Wiki name: Set Creative Mode Slot) - { 0x2B, PacketTypesOut.UpdateJigsawBlock }, // (Wiki name: Set Jigsaw Block) - { 0x2C, PacketTypesOut.UpdateStructureBlock }, // (Wiki name: Set Structure Block) - { 0x2D, PacketTypesOut.UpdateSign }, // (Wiki name: Sign Update) - { 0x2E, PacketTypesOut.Animation }, // (Wiki name: Swing) - { 0x2F, PacketTypesOut.Spectate }, // (Wiki name: Teleport To Entity) - { 0x30, PacketTypesOut.PlayerBlockPlacement }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Use Item On) - { 0x31, PacketTypesOut.UseItem }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Use Item) - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => new(); - protected override Dictionary GetConfigurationListOut() => new(); - } -} diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1192.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1192.cs deleted file mode 100644 index 2fb5a291de..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1192.cs +++ /dev/null @@ -1,179 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes -{ - public class PacketPalette1192 : PacketTypePalette - { - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.SpawnEntity }, // Changed in 1.19 (Wiki name: Spawn Entity) - { 0x01, PacketTypesIn.SpawnExperienceOrb }, // (Wiki name: Spawn Exeprience Orb) - { 0x02, PacketTypesIn.SpawnPlayer }, // - { 0x03, PacketTypesIn.EntityAnimation }, // (Wiki name: Entity Animation (clientbound)) - { 0x04, PacketTypesIn.Statistics }, // (Wiki name: Award Statistics) - { 0x05, PacketTypesIn.BlockChangedAck }, // Added 1.19 (Wiki name: Acknowledge Block Change) - { 0x06, PacketTypesIn.BlockBreakAnimation }, // (Wiki name: Set Block Destroy Stage) - { 0x07, PacketTypesIn.BlockEntityData }, // - { 0x08, PacketTypesIn.BlockAction }, // - { 0x09, PacketTypesIn.BlockChange }, // (Wiki name: Block Update) - { 0x0A, PacketTypesIn.BossBar }, // - { 0x0B, PacketTypesIn.ServerDifficulty }, // (Wiki name: Change Difficulty) - { 0x0C, PacketTypesIn.ChatPreview }, // Added 1.19 - { 0x0D, PacketTypesIn.ClearTiles }, // - { 0x0E, PacketTypesIn.TabComplete }, // (Wiki name: Command Suggestions Response) - { 0x0F, PacketTypesIn.DeclareCommands }, // (Wiki name: Commands) - { 0x10, PacketTypesIn.CloseWindow }, // (Wiki name: Close Container (clientbound)) - { 0x11, PacketTypesIn.WindowItems }, // (Wiki name: Set Container Content) - { 0x12, PacketTypesIn.WindowProperty }, // (Wiki name: Set Container Property) - { 0x13, PacketTypesIn.SetSlot }, // (Wiki name: Set Container Slot) - { 0x14, PacketTypesIn.SetCooldown }, // - { 0x15, PacketTypesIn.ChatSuggestions }, // Added 1.19.1 - { 0x16, PacketTypesIn.PluginMessage }, // (Wiki name: Plugin Message (clientbound)) - { 0x17, PacketTypesIn.NamedSoundEffect }, // Changed in 1.19 (Added "Speed" field) (Wiki name: Custom Sound Effect) (No need to be implemented) - { 0x18, PacketTypesIn.HideMessage }, // Added 1.19.1 - { 0x19, PacketTypesIn.Disconnect }, // - { 0x1A, PacketTypesIn.EntityStatus }, // (Wiki name: Entity Event) - { 0x1B, PacketTypesIn.Explosion }, // Changed in 1.19 (Location fields are now Double instead of Float) (Wiki name: Explosion) - { 0x1C, PacketTypesIn.UnloadChunk }, // (Wiki name: Forget Chunk) - { 0x1D, PacketTypesIn.ChangeGameState }, // (Wiki name: Game Event) - { 0x1E, PacketTypesIn.OpenHorseWindow }, // (Wiki name: Horse Screen Open) - { 0x1F, PacketTypesIn.InitializeWorldBorder }, // - { 0x20, PacketTypesIn.KeepAlive }, // - { 0x21, PacketTypesIn.ChunkData }, // - { 0x22, PacketTypesIn.Effect }, // (Wiki name: Level Event) - { 0x23, PacketTypesIn.Particle }, // Changed in 1.19 ("Particle Data" field is now "Max Speed", it's the same Float data type) (Wiki name: Level Particle) (No need to be implemented) - { 0x24, PacketTypesIn.UpdateLight }, // (Wiki name: Light Update) - { 0x25, PacketTypesIn.JoinGame }, // Changed in 1.19 (lot's of changes) (Wiki name: Login (play)) - { 0x26, PacketTypesIn.MapData }, // (Wiki name: Map Item Data) - { 0x27, PacketTypesIn.TradeList }, // (Wiki name: Merchant Offers) - { 0x28, PacketTypesIn.EntityPosition }, // (Wiki name: Move Entity Position) - { 0x29, PacketTypesIn.EntityPositionAndRotation }, // (Wiki name: Move Entity Position and Rotation) - { 0x2A, PacketTypesIn.EntityRotation }, // (Wiki name: Move Entity Rotation) - { 0x2B, PacketTypesIn.VehicleMove }, // (Wiki name: Move Vehicle) - { 0x2C, PacketTypesIn.OpenBook }, // - { 0x2D, PacketTypesIn.OpenWindow }, // (Wiki name: Open Screen) - { 0x2E, PacketTypesIn.OpenSignEditor }, // - { 0x2F, PacketTypesIn.Ping }, // (Wiki name: Ping (play)) - { 0x30, PacketTypesIn.CraftRecipeResponse }, // (Wiki name: Place Ghost Recipe) - { 0x31, PacketTypesIn.PlayerAbilities }, // - { 0x32, PacketTypesIn.MessageHeader }, // Added 1.19.1 - { 0x33, PacketTypesIn.ChatMessage }, // Changed in 1.19 (Completely changed) (Wiki name: Player Chat Message) - { 0x34, PacketTypesIn.EndCombatEvent }, // (Wiki name: Player Combat End) - { 0x35, PacketTypesIn.EnterCombatEvent }, // (Wiki name: Player Combat Enter) - { 0x36, PacketTypesIn.DeathCombatEvent }, // (Wiki name: Player Combat Kill) - { 0x37, PacketTypesIn.PlayerInfo }, // Changed in 1.19 (Heavy changes) - { 0x38, PacketTypesIn.FacePlayer }, // (Wiki name: Player Look At) - { 0x39, PacketTypesIn.PlayerPositionAndLook }, // (Wiki name: Player Position) - { 0x3A, PacketTypesIn.UnlockRecipes }, // (Wiki name: Recipe) - { 0x3B, PacketTypesIn.DestroyEntities }, // (Wiki name: Remove Entites) - { 0x3C, PacketTypesIn.RemoveEntityEffect }, // - { 0x3D, PacketTypesIn.ResourcePackSend }, // (Wiki name: Resource Pack) - { 0x3E, PacketTypesIn.Respawn }, // Changed in 1.19 (Heavy changes) - { 0x3F, PacketTypesIn.EntityHeadLook }, // (Wiki name: Rotate Head) - { 0x40, PacketTypesIn.MultiBlockChange }, // (Wiki name: Sections Block Update) - { 0x41, PacketTypesIn.SelectAdvancementTab }, // - { 0x42, PacketTypesIn.ServerData }, // Added in 1.19 - { 0x43, PacketTypesIn.ActionBar }, // (Wiki name: Set Action Bar Text) - { 0x44, PacketTypesIn.WorldBorderCenter }, // (Wiki name: Set Border Center) - { 0x45, PacketTypesIn.WorldBorderLerpSize }, // - { 0x46, PacketTypesIn.WorldBorderSize }, // (Wiki name: Set World Border Size) - { 0x47, PacketTypesIn.WorldBorderWarningDelay }, // (Wiki name: Set World Border Warning Delay) - { 0x48, PacketTypesIn.WorldBorderWarningReach }, // (Wiki name: Set Border Warning Distance) - { 0x49, PacketTypesIn.Camera }, // (Wiki name: Set Camera) - { 0x4A, PacketTypesIn.HeldItemChange }, // (Wiki name: Set Carried Item (clientbound)) - { 0x4B, PacketTypesIn.UpdateViewPosition }, // (Wiki name: Set Chunk Cache Center) - { 0x4C, PacketTypesIn.UpdateViewDistance }, // (Wiki name: Set Chunk Cache Radius) - { 0x4D, PacketTypesIn.SpawnPosition }, // (Wiki name: Set Default Spawn Position) - { 0x4E, PacketTypesIn.SetDisplayChatPreview }, // Added in 1.19 (Wiki name: Set Display Chat Preview) - { 0x4F, PacketTypesIn.DisplayScoreboard }, // (Wiki name: Set Display Objective) - { 0x50, PacketTypesIn.EntityMetadata }, // (Wiki name: Set Entity Metadata) - { 0x51, PacketTypesIn.AttachEntity }, // (Wiki name: Set Entity Link) - { 0x52, PacketTypesIn.EntityVelocity }, // (Wiki name: Set Entity Motion) - { 0x53, PacketTypesIn.EntityEquipment }, // (Wiki name: Set Equipment) - { 0x54, PacketTypesIn.SetExperience }, // - { 0x55, PacketTypesIn.UpdateHealth }, // (Wiki name: Set Health) - { 0x56, PacketTypesIn.ScoreboardObjective }, // (Wiki name: Set Objective) - { 0x57, PacketTypesIn.SetPassengers }, // - { 0x58, PacketTypesIn.Teams }, // (Wiki name: Set Player Team) - { 0x59, PacketTypesIn.UpdateScore }, // (Wiki name: Set Score) - { 0x5A, PacketTypesIn.UpdateSimulationDistance }, // (Wiki name: Set Simulation Distance) - { 0x5B, PacketTypesIn.SetTitleSubTitle }, // (Wiki name: Set Subtitle Test) - { 0x5C, PacketTypesIn.TimeUpdate }, // (Wiki name: Set Time) - { 0x5D, PacketTypesIn.SetTitleText }, // (Wiki name: Set Title) - { 0x5E, PacketTypesIn.SetTitleTime }, // (Wiki name: Set Titles Animation) - { 0x5F, PacketTypesIn.EntitySoundEffect }, // (Wiki name: Sound Entity) - { 0x60, PacketTypesIn.SoundEffect }, // Changed in 1.19 (Added "Seed" field) (Wiki name: Sound Effect) (No need to be implemented) - { 0x61, PacketTypesIn.StopSound }, // - { 0x62, PacketTypesIn.SystemChat }, // Added in 1.19 (Wiki name: System Chat Message) - { 0x63, PacketTypesIn.PlayerListHeaderAndFooter }, // (Wiki name: Tab List) - { 0x64, PacketTypesIn.NBTQueryResponse }, // (Wiki name: Tab Query) - { 0x65, PacketTypesIn.CollectItem }, // (Wiki name: Take Item Entity) - { 0x66, PacketTypesIn.EntityTeleport }, // (Wiki name: Teleport Entity) - { 0x67, PacketTypesIn.Advancements }, // (Wiki name: Update Advancements) - { 0x68, PacketTypesIn.EntityProperties }, // (Wiki name: Update Attributes) - { 0x69, PacketTypesIn.EntityEffect }, // Changed in 1.19 (Added "Has Factor Data" and "Factor Codec" fields) (Wiki name: Entity Effect) - { 0x6A, PacketTypesIn.DeclareRecipes }, // (Wiki name: Update Recipes) - { 0x6B, PacketTypesIn.Tags }, // (Wiki name: Update Tags) - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, // (Wiki name: Confirm Teleportation) - { 0x01, PacketTypesOut.QueryBlockNBT }, // (Wiki name: Query Block Entity Tag) - { 0x02, PacketTypesOut.SetDifficulty }, // (Wiki name: Change Difficutly) - { 0x03, PacketTypesOut.MessageAcknowledgment }, // Added in 1.19.1 - { 0x04, PacketTypesOut.ChatCommand }, // Added in 1.19 - { 0x05, PacketTypesOut.ChatMessage }, // Changed in 1.19 (Completely changed) (Wiki name: Chat) - { 0x06, PacketTypesOut.ChatPreview }, // Added in 1.19 (Wiki name: Chat Preview (serverbound)) - { 0x07, PacketTypesOut.ClientStatus }, // (Wiki name: Client Command) - { 0x08, PacketTypesOut.ClientSettings }, // (Wiki name: Client Information) - { 0x09, PacketTypesOut.TabComplete }, // (Wiki name: Command Suggestions Request) - { 0x0A, PacketTypesOut.ClickWindowButton }, // (Wiki name: Click Container Button) - { 0x0B, PacketTypesOut.ClickWindow }, // (Wiki name: Click Container) - { 0x0C, PacketTypesOut.CloseWindow }, // (Wiki name: Close Container (serverbound)) - { 0x0D, PacketTypesOut.PluginMessage }, // (Wiki name: Plugin Message (serverbound)) - { 0x0E, PacketTypesOut.EditBook }, // - { 0x0F, PacketTypesOut.EntityNBTRequest }, // (Wiki name: Query Entity Tag) - { 0x10, PacketTypesOut.InteractEntity }, // (Wiki name: Interact) - { 0x11, PacketTypesOut.GenerateStructure }, // (Wiki name: Jigsaw Generate) - { 0x12, PacketTypesOut.KeepAlive }, // - { 0x13, PacketTypesOut.LockDifficulty }, // - { 0x14, PacketTypesOut.PlayerPosition }, // (Wiki name: Move Player Position) - { 0x15, PacketTypesOut.PlayerPositionAndRotation }, // (Wiki name: Set Player Position and Rotation) - { 0x16, PacketTypesOut.PlayerRotation }, // (Wiki name: Set Player Rotation) - { 0x17, PacketTypesOut.PlayerMovement }, // (Wiki name: Set Player On Ground) - { 0x18, PacketTypesOut.VehicleMove }, // (Wiki name: Move Vehicle (serverbound)) - { 0x19, PacketTypesOut.SteerBoat }, // (Wiki name: Paddle Boat) - { 0x1A, PacketTypesOut.PickItem }, // - { 0x1B, PacketTypesOut.CraftRecipeRequest }, // (Wiki name: Place recipe) - { 0x1C, PacketTypesOut.PlayerAbilities }, // - { 0x1D, PacketTypesOut.PlayerDigging }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Player Action) - { 0x1E, PacketTypesOut.EntityAction }, // (Wiki name: Player Command) - { 0x1F, PacketTypesOut.SteerVehicle }, // (Wiki name: Player Input) - { 0x20, PacketTypesOut.Pong }, // (Wiki name: Pong (play)) - { 0x21, PacketTypesOut.SetDisplayedRecipe }, // (Wiki name: Recipe Book Change Settings) - { 0x22, PacketTypesOut.SetRecipeBookState }, // (Wiki name: Recipe Book Seen Recipe) - { 0x23, PacketTypesOut.NameItem }, // (Wiki name: Rename Item) - { 0x24, PacketTypesOut.ResourcePackStatus }, // (Wiki name: Resource Pack (serverbound)) - { 0x25, PacketTypesOut.AdvancementTab }, // (Wiki name: Seen Advancements) - { 0x26, PacketTypesOut.SelectTrade }, // - { 0x27, PacketTypesOut.SetBeaconEffect }, // Changed in 1.19 (Added a "Secondary Effect Present" and "Secondary Effect" fields) (Wiki name: Set Beacon) - (No need to be implemented) - { 0x28, PacketTypesOut.HeldItemChange }, // (Wiki name: Set Carried Item (serverbound)) - { 0x29, PacketTypesOut.UpdateCommandBlock }, // (Wiki name: Set Command Block) - { 0x2A, PacketTypesOut.UpdateCommandBlockMinecart }, // - { 0x2B, PacketTypesOut.CreativeInventoryAction }, // (Wiki name: Set Creative Mode Slot) - { 0x2C, PacketTypesOut.UpdateJigsawBlock }, // (Wiki name: Set Jigsaw Block) - { 0x2D, PacketTypesOut.UpdateStructureBlock }, // (Wiki name: Set Structure Block) - { 0x2E, PacketTypesOut.UpdateSign }, // (Wiki name: Sign Update) - { 0x2F, PacketTypesOut.Animation }, // (Wiki name: Swing) - { 0x30, PacketTypesOut.Spectate }, // (Wiki name: Teleport To Entity) - { 0x31, PacketTypesOut.PlayerBlockPlacement }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Use Item On) - { 0x32, PacketTypesOut.UseItem }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Use Item) - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => new(); - protected override Dictionary GetConfigurationListOut() => new(); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1193.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1193.cs deleted file mode 100644 index 49e27a583a..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1193.cs +++ /dev/null @@ -1,178 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes -{ - public class PacketPalette1193 : PacketTypePalette - { - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.SpawnEntity }, // Changed in 1.19 (Wiki name: Spawn Entity) - { 0x01, PacketTypesIn.SpawnExperienceOrb }, // (Wiki name: Spawn Exeprience Orb) - { 0x02, PacketTypesIn.SpawnPlayer }, // - { 0x03, PacketTypesIn.EntityAnimation }, // (Wiki name: Entity Animation (clientbound)) - { 0x04, PacketTypesIn.Statistics }, // (Wiki name: Award Statistics) - { 0x05, PacketTypesIn.BlockChangedAck }, // Added 1.19 (Wiki name: Acknowledge Block Change) - { 0x06, PacketTypesIn.BlockBreakAnimation }, // (Wiki name: Set Block Destroy Stage) - { 0x07, PacketTypesIn.BlockEntityData }, // - { 0x08, PacketTypesIn.BlockAction }, // - { 0x09, PacketTypesIn.BlockChange }, // (Wiki name: Block Update) - { 0x0A, PacketTypesIn.BossBar }, // - { 0x0B, PacketTypesIn.ServerDifficulty }, // (Wiki name: Change Difficulty) - { 0x0C, PacketTypesIn.ClearTiles }, // - { 0x0D, PacketTypesIn.TabComplete }, // (Wiki name: Command Suggestions Response) - { 0x0E, PacketTypesIn.DeclareCommands }, // (Wiki name: Commands) - { 0x0F, PacketTypesIn.CloseWindow }, // (Wiki name: Close Container (clientbound)) - { 0x10, PacketTypesIn.WindowItems }, // (Wiki name: Set Container Content) - { 0x11, PacketTypesIn.WindowProperty }, // (Wiki name: Set Container Property) - { 0x12, PacketTypesIn.SetSlot }, // (Wiki name: Set Container Slot) - { 0x13, PacketTypesIn.SetCooldown }, // - { 0x14, PacketTypesIn.ChatSuggestions }, // Added in 1.19.1 - { 0x15, PacketTypesIn.PluginMessage }, // (Wiki name: Plugin Message (clientbound)) - { 0x16, PacketTypesIn.HideMessage }, // Added in 1.19.1 - { 0x17, PacketTypesIn.Disconnect }, // - { 0x18, PacketTypesIn.ProfilelessChatMessage }, // Added in 1.19.3 (Wiki name: Disguised Chat Message) - { 0x19, PacketTypesIn.EntityStatus }, // (Wiki name: Entity Event) - { 0x1A, PacketTypesIn.Explosion }, // Changed in 1.19 (Location fields are now Double instead of Float) (Wiki name: Explosion) - { 0x1B, PacketTypesIn.UnloadChunk }, // (Wiki name: Forget Chunk) - { 0x1C, PacketTypesIn.ChangeGameState }, // (Wiki name: Game Event) - { 0x1D, PacketTypesIn.OpenHorseWindow }, // (Wiki name: Horse Screen Open) - { 0x1E, PacketTypesIn.InitializeWorldBorder }, // - { 0x1F, PacketTypesIn.KeepAlive }, // - { 0x20, PacketTypesIn.ChunkData }, // - { 0x21, PacketTypesIn.Effect }, // (Wiki name: World Event) - { 0x22, PacketTypesIn.Particle }, // Changed in 1.19 ("Particle Data" field is now "Max Speed", it's the same Float data type) (Wiki name: Level Particle) (No need to be implemented) - { 0x23, PacketTypesIn.UpdateLight }, // (Wiki name: Light Update) - { 0x24, PacketTypesIn.JoinGame }, // Changed in 1.19 (lot's of changes) (Wiki name: Login (play)) - { 0x25, PacketTypesIn.MapData }, // (Wiki name: Map Item Data) - { 0x26, PacketTypesIn.TradeList }, // (Wiki name: Merchant Offers) - { 0x27, PacketTypesIn.EntityPosition }, // (Wiki name: Move Entity Position) - { 0x28, PacketTypesIn.EntityPositionAndRotation }, // (Wiki name: Move Entity Position and Rotation) - { 0x29, PacketTypesIn.EntityRotation }, // (Wiki name: Move Entity Rotation) - { 0x2A, PacketTypesIn.VehicleMove }, // (Wiki name: Move Vehicle) - { 0x2B, PacketTypesIn.OpenBook }, // - { 0x2C, PacketTypesIn.OpenWindow }, // (Wiki name: Open Screen) - { 0x2D, PacketTypesIn.OpenSignEditor }, // - { 0x2E, PacketTypesIn.Ping }, // (Wiki name: Ping (play)) - { 0x2F, PacketTypesIn.CraftRecipeResponse }, // (Wiki name: Place Ghost Recipe) - { 0x30, PacketTypesIn.PlayerAbilities }, // - { 0x31, PacketTypesIn.ChatMessage }, // Changed in 1.19 (Completely changed) (Wiki name: Player Chat Message) - { 0x32, PacketTypesIn.EndCombatEvent }, // (Wiki name: Player Combat End) - { 0x33, PacketTypesIn.EnterCombatEvent }, // (Wiki name: Player Combat Enter) - { 0x34, PacketTypesIn.DeathCombatEvent }, // (Wiki name: Player Combat Kill) - { 0x35, PacketTypesIn.PlayerRemove }, // Added in 1.19.3 (Not used) - { 0x36, PacketTypesIn.PlayerInfo }, // Changed in 1.19 (Heavy changes) - { 0x37, PacketTypesIn.FacePlayer }, // (Wiki name: Player Look At) - { 0x38, PacketTypesIn.PlayerPositionAndLook }, // (Wiki name: Player Position) - { 0x39, PacketTypesIn.UnlockRecipes }, // (Wiki name: Recipe) - { 0x3A, PacketTypesIn.DestroyEntities }, // (Wiki name: Remove Entites) - { 0x3B, PacketTypesIn.RemoveEntityEffect }, // - { 0x3C, PacketTypesIn.ResourcePackSend }, // (Wiki name: Resource Pack) - { 0x3D, PacketTypesIn.Respawn }, // Changed in 1.19 (Heavy changes) - { 0x3E, PacketTypesIn.EntityHeadLook }, // (Wiki name: Rotate Head) - { 0x3F, PacketTypesIn.MultiBlockChange }, // (Wiki name: Sections Block Update) - { 0x40, PacketTypesIn.SelectAdvancementTab }, // - { 0x41, PacketTypesIn.ServerData }, // Added in 1.19 - { 0x42, PacketTypesIn.ActionBar }, // (Wiki name: Set Action Bar Text) - { 0x43, PacketTypesIn.WorldBorderCenter }, // (Wiki name: Set Border Center) - { 0x44, PacketTypesIn.WorldBorderLerpSize }, // - { 0x45, PacketTypesIn.WorldBorderSize }, // (Wiki name: Set World Border Size) - { 0x46, PacketTypesIn.WorldBorderWarningDelay }, // (Wiki name: Set World Border Warning Delay) - { 0x47, PacketTypesIn.WorldBorderWarningReach }, // (Wiki name: Set Border Warning Distance) - { 0x48, PacketTypesIn.Camera }, // (Wiki name: Set Camera) - { 0x49, PacketTypesIn.HeldItemChange }, // (Wiki name: Set Carried Item (clientbound)) - { 0x4A, PacketTypesIn.UpdateViewPosition }, // (Wiki name: Set Chunk Cache Center) - { 0x4B, PacketTypesIn.UpdateViewDistance }, // (Wiki name: Set Chunk Cache Radius) - { 0x4C, PacketTypesIn.SpawnPosition }, // (Wiki name: Set Default Spawn Position) - { 0x4D, PacketTypesIn.DisplayScoreboard }, // (Wiki name: Set Display Objective) - { 0x4E, PacketTypesIn.EntityMetadata }, // (Wiki name: Set Entity Metadata) - { 0x4F, PacketTypesIn.AttachEntity }, // (Wiki name: Set Entity Link) - { 0x50, PacketTypesIn.EntityVelocity }, // (Wiki name: Set Entity Motion) - { 0x51, PacketTypesIn.EntityEquipment }, // (Wiki name: Set Equipment) - { 0x52, PacketTypesIn.SetExperience }, // - { 0x53, PacketTypesIn.UpdateHealth }, // (Wiki name: Set Health) - { 0x54, PacketTypesIn.ScoreboardObjective }, // (Wiki name: Set Objective) - { 0x55, PacketTypesIn.SetPassengers }, // - { 0x56, PacketTypesIn.Teams }, // (Wiki name: Set Player Team) - { 0x57, PacketTypesIn.UpdateScore }, // (Wiki name: Set Score) - { 0x58, PacketTypesIn.UpdateSimulationDistance }, // (Wiki name: Set Simulation Distance) - { 0x59, PacketTypesIn.SetTitleSubTitle }, // (Wiki name: Set Subtitle Test) - { 0x5A, PacketTypesIn.TimeUpdate }, // (Wiki name: Set Time) - { 0x5B, PacketTypesIn.SetTitleText }, // (Wiki name: Set Title) - { 0x5C, PacketTypesIn.SetTitleTime }, // (Wiki name: Set Titles Animation) - { 0x5D, PacketTypesIn.EntitySoundEffect }, // (Wiki name: Sound Entity) - { 0x5E, PacketTypesIn.SoundEffect }, // Changed in 1.19 (Added "Seed" field) (Wiki name: Sound Effect) (No need to be implemented) - { 0x5F, PacketTypesIn.StopSound }, // - { 0x60, PacketTypesIn.SystemChat }, // Added in 1.19 (Wiki name: System Chat Message) - { 0x61, PacketTypesIn.PlayerListHeaderAndFooter }, // (Wiki name: Tab List) - { 0x62, PacketTypesIn.NBTQueryResponse }, // (Wiki name: Tab Query) - { 0x63, PacketTypesIn.CollectItem }, // (Wiki name: Take Item Entity) - { 0x64, PacketTypesIn.EntityTeleport }, // (Wiki name: Teleport Entity) - { 0x65, PacketTypesIn.Advancements }, // (Wiki name: Update Advancements) - { 0x66, PacketTypesIn.EntityProperties }, // (Wiki name: Update Attributes) - { 0x67, PacketTypesIn.FeatureFlags }, // Added in 1.19.3 (Not yet clear what is the purpose of this packet) - { 0x68, PacketTypesIn.EntityEffect }, // Changed in 1.19 (Added "Has Factor Data" and "Factor Codec" fields) (Wiki name: Entity Effect) - { 0x69, PacketTypesIn.DeclareRecipes }, // (Wiki name: Update Recipes) - { 0x6A, PacketTypesIn.Tags }, // (Wiki name: Update Tags) - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, // (Wiki name: Confirm Teleportation) - { 0x01, PacketTypesOut.QueryBlockNBT }, // (Wiki name: Query Block Entity Tag) - { 0x02, PacketTypesOut.SetDifficulty }, // (Wiki name: Change Difficutly) - { 0x03, PacketTypesOut.MessageAcknowledgment }, // Added in 1.19.1 - { 0x04, PacketTypesOut.ChatCommand }, // Added in 1.19 - { 0x05, PacketTypesOut.ChatMessage }, // Changed in 1.19 (Completely changed) (Wiki name: Chat) - { 0x06, PacketTypesOut.ClientStatus }, // (Wiki name: Client Command) - { 0x07, PacketTypesOut.ClientSettings }, // (Wiki name: Client Information) - { 0x08, PacketTypesOut.TabComplete }, // (Wiki name: Command Suggestions Request) - { 0x09, PacketTypesOut.ClickWindowButton }, // (Wiki name: Click Container Button) - { 0x0A, PacketTypesOut.ClickWindow }, // (Wiki name: Click Container) - { 0x0B, PacketTypesOut.CloseWindow }, // (Wiki name: Close Container (serverbound)) - { 0x0C, PacketTypesOut.PluginMessage }, // (Wiki name: Plugin Message (serverbound)) - { 0x0D, PacketTypesOut.EditBook }, // - { 0x0E, PacketTypesOut.EntityNBTRequest }, // (Wiki name: Query Entity Tag) - { 0x0F, PacketTypesOut.InteractEntity }, // (Wiki name: Interact) - { 0x10, PacketTypesOut.GenerateStructure }, // (Wiki name: Jigsaw Generate) - { 0x11, PacketTypesOut.KeepAlive }, // - { 0x12, PacketTypesOut.LockDifficulty }, // - { 0x13, PacketTypesOut.PlayerPosition }, // (Wiki name: Move Player Position) - { 0x14, PacketTypesOut.PlayerPositionAndRotation }, // (Wiki name: Set Player Position and Rotation) - { 0x15, PacketTypesOut.PlayerRotation }, // (Wiki name: Set Player Rotation) - { 0x16, PacketTypesOut.PlayerMovement }, // (Wiki name: Set Player On Ground) - { 0x17, PacketTypesOut.VehicleMove }, // (Wiki name: Move Vehicle (serverbound)) - { 0x18, PacketTypesOut.SteerBoat }, // (Wiki name: Paddle Boat) - { 0x19, PacketTypesOut.PickItem }, // - { 0x1A, PacketTypesOut.CraftRecipeRequest }, // (Wiki name: Place recipe) - { 0x1B, PacketTypesOut.PlayerAbilities }, // - { 0x1C, PacketTypesOut.PlayerDigging }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Player Action) - { 0x1D, PacketTypesOut.EntityAction }, // (Wiki name: Player Command) - { 0x1E, PacketTypesOut.SteerVehicle }, // (Wiki name: Player Input) - { 0x1F, PacketTypesOut.Pong }, // (Wiki name: Pong (play)) - { 0x20, PacketTypesOut.PlayerSession }, // Added in 1.19.3 - { 0x21, PacketTypesOut.SetDisplayedRecipe }, // (Wiki name: Recipe Book Change Settings) - { 0x22, PacketTypesOut.SetRecipeBookState }, // (Wiki name: Recipe Book Seen Recipe) - { 0x23, PacketTypesOut.NameItem }, // (Wiki name: Rename Item) - { 0x24, PacketTypesOut.ResourcePackStatus }, // (Wiki name: Resource Pack (serverbound)) - { 0x25, PacketTypesOut.AdvancementTab }, // (Wiki name: Seen Advancements) - { 0x26, PacketTypesOut.SelectTrade }, // - { 0x27, PacketTypesOut.SetBeaconEffect }, // Changed in 1.19 (Added a "Secondary Effect Present" and "Secondary Effect" fields) (Wiki name: Set Beacon) - (No need to be implemented) - { 0x28, PacketTypesOut.HeldItemChange }, // (Wiki name: Set Carried Item (serverbound)) - { 0x29, PacketTypesOut.UpdateCommandBlock }, // (Wiki name: Set Command Block) - { 0x2A, PacketTypesOut.UpdateCommandBlockMinecart }, // - { 0x2B, PacketTypesOut.CreativeInventoryAction }, // (Wiki name: Set Creative Mode Slot) - { 0x2C, PacketTypesOut.UpdateJigsawBlock }, // (Wiki name: Set Jigsaw Block) - { 0x2D, PacketTypesOut.UpdateStructureBlock }, // (Wiki name: Set Structure Block) - { 0x2E, PacketTypesOut.UpdateSign }, // (Wiki name: Sign Update) - { 0x2F, PacketTypesOut.Animation }, // (Wiki name: Swing) - { 0x30, PacketTypesOut.Spectate }, // (Wiki name: Teleport To Entity) - { 0x31, PacketTypesOut.PlayerBlockPlacement }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Use Item On) - { 0x32, PacketTypesOut.UseItem }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Use Item) - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => new(); - protected override Dictionary GetConfigurationListOut() => new(); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1194.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1194.cs deleted file mode 100644 index 489961feec..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1194.cs +++ /dev/null @@ -1,183 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes -{ - public class PacketPalette1194 : PacketTypePalette - { - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.Bundle }, // Added in 1.19.4 - { 0x01, PacketTypesIn.SpawnEntity }, // Changed in 1.19 (Wiki name: Spawn Entity) - { 0x02, PacketTypesIn.SpawnExperienceOrb }, // (Wiki name: Spawn Exeprience Orb) - { 0x03, PacketTypesIn.SpawnPlayer }, // - { 0x04, PacketTypesIn.EntityAnimation }, // (Wiki name: Entity Animation (clientbound)) - { 0x05, PacketTypesIn.Statistics }, // (Wiki name: Award Statistics) - { 0x06, PacketTypesIn.BlockChangedAck }, // Added 1.19 (Wiki name: Acknowledge Block Change) - { 0x07, PacketTypesIn.BlockBreakAnimation }, // (Wiki name: Set Block Destroy Stage) - { 0x08, PacketTypesIn.BlockEntityData }, // - { 0x09, PacketTypesIn.BlockAction }, // - { 0x0A, PacketTypesIn.BlockChange }, // (Wiki name: Block Update) - { 0x0B, PacketTypesIn.BossBar }, // - { 0x0C, PacketTypesIn.ServerDifficulty }, // (Wiki name: Change Difficulty) - { 0x0D, PacketTypesIn.ChunksBiomes }, // Added in 1.19.4 - { 0x0E, PacketTypesIn.ClearTiles }, // - { 0x0F, PacketTypesIn.TabComplete }, // (Wiki name: Command Suggestions Response) - { 0x10, PacketTypesIn.DeclareCommands }, // (Wiki name: Commands) - { 0x11, PacketTypesIn.CloseWindow }, // (Wiki name: Close Container (clientbound)) - { 0x12, PacketTypesIn.WindowItems }, // (Wiki name: Set Container Content) - { 0x13, PacketTypesIn.WindowProperty }, // (Wiki name: Set Container Property) - { 0x14, PacketTypesIn.SetSlot }, // (Wiki name: Set Container Slot) - { 0x15, PacketTypesIn.SetCooldown }, // - { 0x16, PacketTypesIn.ChatSuggestions }, // Added in 1.19.1 - { 0x17, PacketTypesIn.PluginMessage }, // (Wiki name: Plugin Message (clientbound)) - { 0x18, PacketTypesIn.DamageEvent }, // Added in 1.19.4 - { 0x19, PacketTypesIn.HideMessage }, // Added in 1.19.1 - { 0x1A, PacketTypesIn.Disconnect }, // - { 0x1B, PacketTypesIn.ProfilelessChatMessage }, // Added in 1.19.3 (Wiki name: Disguised Chat Message) - { 0x1C, PacketTypesIn.EntityStatus }, // (Wiki name: Entity Event) - { 0x1D, PacketTypesIn.Explosion }, // Changed in 1.19 (Location fields are now Double instead of Float) (Wiki name: Explosion) - { 0x1E, PacketTypesIn.UnloadChunk }, // (Wiki name: Forget Chunk) - { 0x1F, PacketTypesIn.ChangeGameState }, // (Wiki name: Game Event) - { 0x20, PacketTypesIn.OpenHorseWindow }, // (Wiki name: Horse Screen Open) - { 0x21, PacketTypesIn.HurtAnimation }, // 1.19.4 - { 0x22, PacketTypesIn.InitializeWorldBorder }, // - { 0x23, PacketTypesIn.KeepAlive }, // - { 0x24, PacketTypesIn.ChunkData }, // - { 0x25, PacketTypesIn.Effect }, // (Wiki name: World Event) - { 0x26, PacketTypesIn.Particle }, // Changed in 1.19 ("Particle Data" field is now "Max Speed", it's the same Float data type) (Wiki name: Level Particle) (No need to be implemented) - { 0x27, PacketTypesIn.UpdateLight }, // (Wiki name: Light Update) - { 0x28, PacketTypesIn.JoinGame }, // Changed in 1.19 (lot's of changes) (Wiki name: Login (play)) - { 0x29, PacketTypesIn.MapData }, // (Wiki name: Map Item Data) - { 0x2A, PacketTypesIn.TradeList }, // (Wiki name: Merchant Offers) - { 0x2B, PacketTypesIn.EntityPosition }, // (Wiki name: Move Entity Position) - { 0x2C, PacketTypesIn.EntityPositionAndRotation }, // (Wiki name: Move Entity Position and Rotation) - { 0x2D, PacketTypesIn.EntityRotation }, // (Wiki name: Move Entity Rotation) - { 0x2E, PacketTypesIn.VehicleMove }, // (Wiki name: Move Vehicle) - { 0x2F, PacketTypesIn.OpenBook }, // - { 0x30, PacketTypesIn.OpenWindow }, // (Wiki name: Open Screen) - { 0x31, PacketTypesIn.OpenSignEditor }, // - { 0x32, PacketTypesIn.Ping }, // (Wiki name: Ping (play)) - { 0x33, PacketTypesIn.CraftRecipeResponse }, // (Wiki name: Place Ghost Recipe) - { 0x34, PacketTypesIn.PlayerAbilities }, // - { 0x35, PacketTypesIn.ChatMessage }, // Changed in 1.19 (Completely changed) (Wiki name: Player Chat Message) - { 0x36, PacketTypesIn.EndCombatEvent }, // (Wiki name: Player Combat End) - { 0x37, PacketTypesIn.EnterCombatEvent }, // (Wiki name: Player Combat Enter) - { 0x38, PacketTypesIn.DeathCombatEvent }, // (Wiki name: Player Combat Kill) - { 0x39, PacketTypesIn.PlayerRemove }, // Added in 1.19.3 (Not used) - { 0x3A, PacketTypesIn.PlayerInfo }, // Changed in 1.19 (Heavy changes) - { 0x3B, PacketTypesIn.FacePlayer }, // (Wiki name: Player Look At) - { 0x3C, PacketTypesIn.PlayerPositionAndLook }, // (Wiki name: Player Position) - { 0x3D, PacketTypesIn.UnlockRecipes }, // (Wiki name: Recipe) - { 0x3E, PacketTypesIn.DestroyEntities }, // (Wiki name: Remove Entites) - { 0x3F, PacketTypesIn.RemoveEntityEffect }, // - { 0x40, PacketTypesIn.ResourcePackSend }, // (Wiki name: Resource Pack) - { 0x41, PacketTypesIn.Respawn }, // Changed in 1.19 (Heavy changes) - { 0x42, PacketTypesIn.EntityHeadLook }, // (Wiki name: Rotate Head) - { 0x43, PacketTypesIn.MultiBlockChange }, // (Wiki name: Sections Block Update) - { 0x44, PacketTypesIn.SelectAdvancementTab }, // - { 0x45, PacketTypesIn.ServerData }, // Added in 1.19 - { 0x46, PacketTypesIn.ActionBar }, // (Wiki name: Set Action Bar Text) - { 0x47, PacketTypesIn.WorldBorderCenter }, // (Wiki name: Set Border Center) - { 0x48, PacketTypesIn.WorldBorderLerpSize }, // - { 0x49, PacketTypesIn.WorldBorderSize }, // (Wiki name: Set World Border Size) - { 0x4A, PacketTypesIn.WorldBorderWarningDelay }, // (Wiki name: Set World Border Warning Delay) - { 0x4B, PacketTypesIn.WorldBorderWarningReach }, // (Wiki name: Set Border Warning Distance) - { 0x4C, PacketTypesIn.Camera }, // (Wiki name: Set Camera) - { 0x4D, PacketTypesIn.HeldItemChange }, // (Wiki name: Set Carried Item (clientbound)) - { 0x4E, PacketTypesIn.UpdateViewPosition }, // (Wiki name: Set Chunk Cache Center) - { 0x4F, PacketTypesIn.UpdateViewDistance }, // (Wiki name: Set Chunk Cache Radius) - { 0x50, PacketTypesIn.SpawnPosition }, // (Wiki name: Set Default Spawn Position) - { 0x51, PacketTypesIn.DisplayScoreboard }, // (Wiki name: Set Display Objective) - { 0x52, PacketTypesIn.EntityMetadata }, // (Wiki name: Set Entity Metadata) - { 0x53, PacketTypesIn.AttachEntity }, // (Wiki name: Set Entity Link) - { 0x54, PacketTypesIn.EntityVelocity }, // (Wiki name: Set Entity Motion) - { 0x55, PacketTypesIn.EntityEquipment }, // (Wiki name: Set Equipment) - { 0x56, PacketTypesIn.SetExperience }, // - { 0x57, PacketTypesIn.UpdateHealth }, // (Wiki name: Set Health) - { 0x58, PacketTypesIn.ScoreboardObjective }, // (Wiki name: Set Objective) - { 0x59, PacketTypesIn.SetPassengers }, // - { 0x5A, PacketTypesIn.Teams }, // (Wiki name: Set Player Team) - { 0x5B, PacketTypesIn.UpdateScore }, // (Wiki name: Set Score) - { 0x5C, PacketTypesIn.UpdateSimulationDistance }, // (Wiki name: Set Simulation Distance) - { 0x5D, PacketTypesIn.SetTitleSubTitle }, // (Wiki name: Set Subtitle Test) - { 0x5E, PacketTypesIn.TimeUpdate }, // (Wiki name: Set Time) - { 0x5F, PacketTypesIn.SetTitleText }, // (Wiki name: Set Title) - { 0x60, PacketTypesIn.SetTitleTime }, // (Wiki name: Set Titles Animation) - { 0x61, PacketTypesIn.EntitySoundEffect }, // (Wiki name: Sound Entity) - { 0x62, PacketTypesIn.SoundEffect }, // Changed in 1.19 (Added "Seed" field) (Wiki name: Sound Effect) (No need to be implemented) - { 0x63, PacketTypesIn.StopSound }, // - { 0x64, PacketTypesIn.SystemChat }, // Added in 1.19 (Wiki name: System Chat Message) - { 0x65, PacketTypesIn.PlayerListHeaderAndFooter }, // (Wiki name: Tab List) - { 0x66, PacketTypesIn.NBTQueryResponse }, // (Wiki name: Tab Query) - { 0x67, PacketTypesIn.CollectItem }, // (Wiki name: Take Item Entity) - { 0x68, PacketTypesIn.EntityTeleport }, // (Wiki name: Teleport Entity) - { 0x69, PacketTypesIn.Advancements }, // (Wiki name: Update Advancements) (Unused) - { 0x6A, PacketTypesIn.EntityProperties }, // (Wiki name: Update Attributes) - { 0x6B, PacketTypesIn.FeatureFlags }, // Added in 1.19.3 (Not yet clear what is the purpose of this packet) - { 0x6C, PacketTypesIn.EntityEffect }, // Changed in 1.19 (Added "Has Factor Data" and "Factor Codec" fields) (Wiki name: Entity Effect) - { 0x6D, PacketTypesIn.DeclareRecipes }, // (Wiki name: Update Recipes) (Unused) - { 0x6E, PacketTypesIn.Tags }, // (Wiki name: Update Tags) - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, // (Wiki name: Confirm Teleportation) - { 0x01, PacketTypesOut.QueryBlockNBT }, // (Wiki name: Query Block Entity Tag) - { 0x02, PacketTypesOut.SetDifficulty }, // (Wiki name: Change Difficutly) - { 0x03, PacketTypesOut.MessageAcknowledgment }, // Added in 1.19.1 - { 0x04, PacketTypesOut.ChatCommand }, // Added in 1.19 - { 0x05, PacketTypesOut.ChatMessage }, // Changed in 1.19 (Completely changed) (Wiki name: Chat) - { 0x06, PacketTypesOut.PlayerSession }, // Added in 1.19.3 - { 0x07, PacketTypesOut.ClientStatus }, // (Wiki name: Client Command) - { 0x08, PacketTypesOut.ClientSettings }, // (Wiki name: Client Information) - { 0x09, PacketTypesOut.TabComplete }, // (Wiki name: Command Suggestions Request) - { 0x0A, PacketTypesOut.ClickWindowButton }, // (Wiki name: Click Container Button) - { 0x0B, PacketTypesOut.ClickWindow }, // (Wiki name: Click Container) - { 0x0C, PacketTypesOut.CloseWindow }, // (Wiki name: Close Container (serverbound)) - { 0x0D, PacketTypesOut.PluginMessage }, // (Wiki name: Plugin Message (serverbound)) - { 0x0E, PacketTypesOut.EditBook }, // - { 0x0F, PacketTypesOut.EntityNBTRequest }, // (Wiki name: Query Entity Tag) - { 0x10, PacketTypesOut.InteractEntity }, // (Wiki name: Interact) - { 0x11, PacketTypesOut.GenerateStructure }, // (Wiki name: Jigsaw Generate) - { 0x12, PacketTypesOut.KeepAlive }, // - { 0x13, PacketTypesOut.LockDifficulty }, // - { 0x14, PacketTypesOut.PlayerPosition }, // (Wiki name: Move Player Position) - { 0x15, PacketTypesOut.PlayerPositionAndRotation }, // (Wiki name: Set Player Position and Rotation) - { 0x16, PacketTypesOut.PlayerRotation }, // (Wiki name: Set Player Rotation) - { 0x17, PacketTypesOut.PlayerMovement }, // (Wiki name: Set Player On Ground) - { 0x18, PacketTypesOut.VehicleMove }, // (Wiki name: Move Vehicle (serverbound)) - { 0x19, PacketTypesOut.SteerBoat }, // (Wiki name: Paddle Boat) - { 0x1A, PacketTypesOut.PickItem }, // - { 0x1B, PacketTypesOut.CraftRecipeRequest }, // (Wiki name: Place recipe) - { 0x1C, PacketTypesOut.PlayerAbilities }, // - { 0x1D, PacketTypesOut.PlayerDigging }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Player Action) - { 0x1E, PacketTypesOut.EntityAction }, // (Wiki name: Player Command) - { 0x1F, PacketTypesOut.SteerVehicle }, // (Wiki name: Player Input) - { 0x20, PacketTypesOut.Pong }, // (Wiki name: Pong (play)) - - { 0x21, PacketTypesOut.SetDisplayedRecipe }, // (Wiki name: Recipe Book Change Settings) - { 0x22, PacketTypesOut.SetRecipeBookState }, // (Wiki name: Recipe Book Seen Recipe) - { 0x23, PacketTypesOut.NameItem }, // (Wiki name: Rename Item) - { 0x24, PacketTypesOut.ResourcePackStatus }, // (Wiki name: Resource Pack (serverbound)) - { 0x25, PacketTypesOut.AdvancementTab }, // (Wiki name: Seen Advancements) - { 0x26, PacketTypesOut.SelectTrade }, // - { 0x27, PacketTypesOut.SetBeaconEffect }, // Changed in 1.19 (Added a "Secondary Effect Present" and "Secondary Effect" fields) (Wiki name: Set Beacon) - (No need to be implemented) - { 0x28, PacketTypesOut.HeldItemChange }, // (Wiki name: Set Carried Item (serverbound)) - { 0x29, PacketTypesOut.UpdateCommandBlock }, // (Wiki name: Set Command Block) - { 0x2A, PacketTypesOut.UpdateCommandBlockMinecart }, // - { 0x2B, PacketTypesOut.CreativeInventoryAction }, // (Wiki name: Set Creative Mode Slot) - { 0x2C, PacketTypesOut.UpdateJigsawBlock }, // (Wiki name: Set Jigsaw Block) - { 0x2D, PacketTypesOut.UpdateStructureBlock }, // (Wiki name: Set Structure Block) - { 0x2E, PacketTypesOut.UpdateSign }, // (Wiki name: Sign Update) - { 0x2F, PacketTypesOut.Animation }, // (Wiki name: Swing) - { 0x30, PacketTypesOut.Spectate }, // (Wiki name: Teleport To Entity) - { 0x31, PacketTypesOut.PlayerBlockPlacement }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Use Item On) - { 0x32, PacketTypesOut.UseItem }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Use Item) - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => new(); - protected override Dictionary GetConfigurationListOut() => new(); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1202.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1202.cs deleted file mode 100644 index 7781a9c972..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1202.cs +++ /dev/null @@ -1,210 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes -{ - public class PacketPalette1202 : PacketTypePalette - { - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.Bundle }, // Added in 1.19.4 - { 0x01, PacketTypesIn.SpawnEntity }, // Changed in 1.19 (Wiki name: Spawn Entity) - { 0x02, PacketTypesIn.SpawnExperienceOrb }, // (Wiki name: Spawn Exeprience Orb) - { 0x03, PacketTypesIn.EntityAnimation }, // (Wiki name: Entity Animation (clientbound)) - { 0x04, PacketTypesIn.Statistics }, // (Wiki name: Award Statistics) - { 0x05, PacketTypesIn.BlockChangedAck }, // Added 1.19 (Wiki name: Acknowledge Block Change) - { 0x06, PacketTypesIn.BlockBreakAnimation }, // (Wiki name: Set Block Destroy Stage) - { 0x07, PacketTypesIn.BlockEntityData }, // - { 0x08, PacketTypesIn.BlockAction }, // - { 0x09, PacketTypesIn.BlockChange }, // (Wiki name: Block Update) - { 0x0A, PacketTypesIn.BossBar }, // - { 0x0B, PacketTypesIn.ServerDifficulty }, // (Wiki name: Change Difficulty) - { 0x0C, PacketTypesIn.ChunkBatchFinished }, // Added in 1.20.2 - { 0x0D, PacketTypesIn.ChunkBatchStarted }, // Added in 1.20.2 - { 0x0E, PacketTypesIn.ChunksBiomes }, // Added in 1.19.4 - { 0x0F, PacketTypesIn.ClearTiles }, // - { 0x10, PacketTypesIn.TabComplete }, // (Wiki name: Command Suggestions Response) - { 0x11, PacketTypesIn.DeclareCommands }, // (Wiki name: Commands) - { 0x12, PacketTypesIn.CloseWindow }, // (Wiki name: Close Container (clientbound)) - { 0x13, PacketTypesIn.WindowItems }, // (Wiki name: Set Container Content) - { 0x14, PacketTypesIn.WindowProperty }, // (Wiki name: Set Container Property) - { 0x15, PacketTypesIn.SetSlot }, // (Wiki name: Set Container Slot) - { 0x16, PacketTypesIn.SetCooldown }, // - { 0x17, PacketTypesIn.ChatSuggestions }, // Added in 1.19.1 - { 0x18, PacketTypesIn.PluginMessage }, // (Wiki name: Plugin Message (clientbound)) - { 0x19, PacketTypesIn.DamageEvent }, // Added in 1.19.4 - { 0x1A, PacketTypesIn.HideMessage }, // Added in 1.19.1 - { 0x1B, PacketTypesIn.Disconnect }, // - { 0x1C, PacketTypesIn.ProfilelessChatMessage }, // Added in 1.19.3 (Wiki name: Disguised Chat Message) - { 0x1D, PacketTypesIn.EntityStatus }, // (Wiki name: Entity Event) - { 0x1E, PacketTypesIn.Explosion }, // Changed in 1.19 (Location fields are now Double instead of Float) (Wiki name: Explosion) - { 0x1F, PacketTypesIn.UnloadChunk }, // (Wiki name: Forget Chunk) - { 0x20, PacketTypesIn.ChangeGameState }, // (Wiki name: Game Event) - { 0x21, PacketTypesIn.OpenHorseWindow }, // (Wiki name: Horse Screen Open) - { 0x22, PacketTypesIn.HurtAnimation }, // Added in 1.19.4 - { 0x23, PacketTypesIn.InitializeWorldBorder }, // - { 0x24, PacketTypesIn.KeepAlive }, // - { 0x25, PacketTypesIn.ChunkData }, // - { 0x26, PacketTypesIn.Effect }, // (Wiki name: World Event) - { 0x27, PacketTypesIn.Particle }, // Changed in 1.19 ("Particle Data" field is now "Max Speed", it's the same Float data type) (Wiki name: Level Particle) (No need to be implemented) - { 0x28, PacketTypesIn.UpdateLight }, // (Wiki name: Light Update) - { 0x29, PacketTypesIn.JoinGame }, // Changed in 1.20.2 (Wiki name: Login (play)) - { 0x2A, PacketTypesIn.MapData }, // (Wiki name: Map Item Data) - { 0x2B, PacketTypesIn.TradeList }, // (Wiki name: Merchant Offers) - { 0x2C, PacketTypesIn.EntityPosition }, // (Wiki name: Move Entity Position) - { 0x2D, PacketTypesIn.EntityPositionAndRotation }, // (Wiki name: Move Entity Position and Rotation) - { 0x2E, PacketTypesIn.EntityRotation }, // (Wiki name: Move Entity Rotation) - { 0x2F, PacketTypesIn.VehicleMove }, // (Wiki name: Move Vehicle) - { 0x30, PacketTypesIn.OpenBook }, // - { 0x31, PacketTypesIn.OpenWindow }, // (Wiki name: Open Screen) - { 0x32, PacketTypesIn.OpenSignEditor }, // - { 0x33, PacketTypesIn.Ping }, // (Wiki name: Ping (play)) - { 0x34, PacketTypesIn.PingResponse }, // Added in 1.20.2 - { 0x35, PacketTypesIn.CraftRecipeResponse }, // (Wiki name: Place Ghost Recipe) - { 0x36, PacketTypesIn.PlayerAbilities }, // - { 0x37, PacketTypesIn.ChatMessage }, // Changed in 1.19 (Completely changed) (Wiki name: Player Chat Message) - { 0x38, PacketTypesIn.EndCombatEvent }, // (Wiki name: End Combat) - { 0x39, PacketTypesIn.EnterCombatEvent }, // (Wiki name: Enter Combat) - { 0x3A, PacketTypesIn.DeathCombatEvent }, // (Wiki name: Combat Death) - { 0x3B, PacketTypesIn.PlayerRemove }, // Added in 1.19.3 (Not used) - { 0x3C, PacketTypesIn.PlayerInfo }, // Changed in 1.19 (Heavy changes) - { 0x3D, PacketTypesIn.FacePlayer }, // (Wiki name: Player Look At) - { 0x3E, PacketTypesIn.PlayerPositionAndLook }, // (Wiki name: Synchronize Player Position) - { 0x3F, PacketTypesIn.UnlockRecipes }, // (Wiki name: Update Recipe Book) - { 0x40, PacketTypesIn.DestroyEntities }, // (Wiki name: Remove Entites) - { 0x41, PacketTypesIn.RemoveEntityEffect }, // - { 0x42, PacketTypesIn.ResourcePackSend }, // (Wiki name: Resource Pack) - { 0x43, PacketTypesIn.Respawn }, // Changed in 1.20.2 - { 0x44, PacketTypesIn.EntityHeadLook }, // (Wiki name: Set Head Rotation) - { 0x45, PacketTypesIn.MultiBlockChange }, // (Wiki name: Update Section Blocks) - { 0x46, PacketTypesIn.SelectAdvancementTab }, // - { 0x47, PacketTypesIn.ServerData }, // Added in 1.19 - { 0x48, PacketTypesIn.ActionBar }, // (Wiki name: Set Action Bar Text) - { 0x49, PacketTypesIn.WorldBorderCenter }, // (Wiki name: Set Border Center) - { 0x4A, PacketTypesIn.WorldBorderLerpSize }, // - { 0x4B, PacketTypesIn.WorldBorderSize }, // (Wiki name: Set World Border Size) - { 0x4C, PacketTypesIn.WorldBorderWarningDelay }, // (Wiki name: Set World Border Warning Delay) - { 0x4D, PacketTypesIn.WorldBorderWarningReach }, // (Wiki name: Set Border Warning Distance) - { 0x4E, PacketTypesIn.Camera }, // (Wiki name: Set Camera) - { 0x4F, PacketTypesIn.HeldItemChange }, // (Wiki name: Set Held Item) - { 0x50, PacketTypesIn.UpdateViewPosition }, // (Wiki name: Set Center Chunk) - { 0x51, PacketTypesIn.UpdateViewDistance }, // (Wiki name: Set Render Distance) - { 0x52, PacketTypesIn.SpawnPosition }, // (Wiki name: Set Default Spawn Position) - { 0x53, PacketTypesIn.DisplayScoreboard }, // (Wiki name: Set Display Objective) - { 0x54, PacketTypesIn.EntityMetadata }, // (Wiki name: Set Entity Metadata) - { 0x55, PacketTypesIn.AttachEntity }, // (Wiki name: Link Entities) - { 0x56, PacketTypesIn.EntityVelocity }, // (Wiki name: Set Entity Velocity) - { 0x57, PacketTypesIn.EntityEquipment }, // (Wiki name: Set Equipment) - { 0x58, PacketTypesIn.SetExperience }, // Changed in 1.20.2 - { 0x59, PacketTypesIn.UpdateHealth }, // (Wiki name: Set Health) - { 0x5A, PacketTypesIn.ScoreboardObjective }, // (Wiki name: Update Objectives) - { 0x5B, PacketTypesIn.SetPassengers }, // - { 0x5C, PacketTypesIn.Teams }, // (Wiki name: Update Teams) - { 0x5D, PacketTypesIn.UpdateScore }, // (Wiki name: Update Score) - { 0x5E, PacketTypesIn.UpdateSimulationDistance }, // (Wiki name: Set Simulation Distance) - { 0x5F, PacketTypesIn.SetTitleSubTitle }, // (Wiki name: Set Subtitle Test) - { 0x60, PacketTypesIn.TimeUpdate }, // (Wiki name: Set Time) - { 0x61, PacketTypesIn.SetTitleText }, // (Wiki name: Set Title) - { 0x62, PacketTypesIn.SetTitleTime }, // (Wiki name: Set Title Animation Times) - { 0x63, PacketTypesIn.EntitySoundEffect }, // (Wiki name: Sound Entity) - { 0x64, PacketTypesIn.SoundEffect }, // Changed in 1.19 (Added "Seed" field) (Wiki name: Sound Effect) (No need to be implemented) - { 0x65, PacketTypesIn.StartConfiguration }, // Added in 1.20.2 - { 0x66, PacketTypesIn.StopSound }, // - { 0x67, PacketTypesIn.SystemChat }, // Added in 1.19 (Wiki name: System Chat Message) - { 0x68, PacketTypesIn.PlayerListHeaderAndFooter }, // (Wiki name: Set Tab List Header And Footer) - { 0x69, PacketTypesIn.NBTQueryResponse }, // (Wiki name: Tag Query Response) - { 0x6A, PacketTypesIn.CollectItem }, // (Wiki name: Pickup Item) - { 0x6B, PacketTypesIn.EntityTeleport }, // (Wiki name: Teleport Entity) - { 0x6C, PacketTypesIn.Advancements }, // (Wiki name: Update Advancements) (Unused) - { 0x6D, PacketTypesIn.EntityProperties }, // (Wiki name: Update Attributes) - { 0x6E, PacketTypesIn.EntityEffect }, // Changed in 1.19 (Added "Has Factor Data" and "Factor Codec" fields) (Wiki name: Entity Effect) - { 0x6F, PacketTypesIn.DeclareRecipes }, // (Wiki name: Update Recipes) (Unused) - { 0x70, PacketTypesIn.Tags }, // (Wiki name: Update Tags) - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, // (Wiki name: Confirm Teleportation) - { 0x01, PacketTypesOut.QueryBlockNBT }, // (Wiki name: Query Block Entity Tag) - { 0x02, PacketTypesOut.SetDifficulty }, // (Wiki name: Change Difficulty) - { 0x03, PacketTypesOut.MessageAcknowledgment }, // Added in 1.19.1 - { 0x04, PacketTypesOut.ChatCommand }, // Added in 1.19 - { 0x05, PacketTypesOut.ChatMessage }, // Changed in 1.19 (Completely changed) (Wiki name: Chat) - { 0x06, PacketTypesOut.PlayerSession }, // Added in 1.19.3 - { 0x07, PacketTypesOut.ChunkBatchReceived }, // Added in 1.20.2 - { 0x08, PacketTypesOut.ClientStatus }, // (Wiki name: Client Command) - { 0x09, PacketTypesOut.ClientSettings }, // (Wiki name: Client Information) - { 0x0A, PacketTypesOut.TabComplete }, // (Wiki name: Command Suggestions Request) - { 0x0B, PacketTypesOut.AcknowledgeConfiguration }, // Added in 1.20.2 - { 0x0C, PacketTypesOut.ClickWindowButton }, // (Wiki name: Click Container Button) - { 0x0D, PacketTypesOut.ClickWindow }, // (Wiki name: Click Container) - { 0x0E, PacketTypesOut.CloseWindow }, // (Wiki name: Close Container (serverbound)) - { 0x0F, PacketTypesOut.PluginMessage }, // (Wiki name: Serverbound Plugin Message) - { 0x10, PacketTypesOut.EditBook }, // - { 0x11, PacketTypesOut.EntityNBTRequest }, // (Wiki name: Query Entity Tag) - { 0x12, PacketTypesOut.InteractEntity }, // (Wiki name: Interact) - { 0x13, PacketTypesOut.GenerateStructure }, // (Wiki name: Jigsaw Generate) - { 0x14, PacketTypesOut.KeepAlive }, // (Wiki name: Serverbound Keep Alive (play)) - { 0x15, PacketTypesOut.LockDifficulty }, // - { 0x16, PacketTypesOut.PlayerPosition }, // (Wiki name: Move Player Position) - { 0x17, PacketTypesOut.PlayerPositionAndRotation }, // (Wiki name: Set Player Position and Rotation) - { 0x18, PacketTypesOut.PlayerRotation }, // (Wiki name: Set Player Rotation) - { 0x19, PacketTypesOut.PlayerMovement }, // (Wiki name: Set Player On Ground) - { 0x1A, PacketTypesOut.VehicleMove }, // (Wiki name: Move Vehicle (serverbound)) - { 0x1B, PacketTypesOut.SteerBoat }, // (Wiki name: Paddle Boat) - { 0x1C, PacketTypesOut.PickItem }, // - { 0x1D, PacketTypesOut.PingRequest }, // Added in 1.20.2 - { 0x1E, PacketTypesOut.CraftRecipeRequest }, // (Wiki name: Place recipe) - { 0x1F, PacketTypesOut.PlayerAbilities }, // - { 0x20, PacketTypesOut.PlayerDigging }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Player Action) - { 0x21, PacketTypesOut.EntityAction }, // (Wiki name: Player Command) - { 0x22, PacketTypesOut.SteerVehicle }, // (Wiki name: Player Input) - { 0x23, PacketTypesOut.Pong }, // (Wiki name: Pong (play)) - { 0x24, PacketTypesOut.SetDisplayedRecipe }, // (Wiki name: Recipe Book Change Settings) - { 0x25, PacketTypesOut.SetRecipeBookState }, // (Wiki name: Recipe Book Seen Recipe) - { 0x26, PacketTypesOut.NameItem }, // (Wiki name: Rename Item) - { 0x27, PacketTypesOut.ResourcePackStatus }, // (Wiki name: Resource Pack (serverbound)) - { 0x28, PacketTypesOut.AdvancementTab }, // (Wiki name: Seen Advancements) - { 0x29, PacketTypesOut.SelectTrade }, // - { 0x2A, PacketTypesOut.SetBeaconEffect }, // Changed in 1.19 (Added a "Secondary Effect Present" and "Secondary Effect" fields) (Wiki name: Set Beacon) - (No need to be implemented) - { 0x2B, PacketTypesOut.HeldItemChange }, // (Wiki name: Set Carried Item (serverbound)) - { 0x2C, PacketTypesOut.UpdateCommandBlock }, // (Wiki name: Program Command Block) - { 0x2D, PacketTypesOut.UpdateCommandBlockMinecart }, // (Wiki name: Program Command Block Minecart) - { 0x2E, PacketTypesOut.CreativeInventoryAction }, // (Wiki name: Set Creative Mode Slot) - { 0x2F, PacketTypesOut.UpdateJigsawBlock }, // (Wiki name: Program Jigsaw Block) - { 0x30, PacketTypesOut.UpdateStructureBlock }, // (Wiki name: Program Structure Block) - { 0x31, PacketTypesOut.UpdateSign }, // (Wiki name: Update Sign) - { 0x32, PacketTypesOut.Animation }, // (Wiki name: Swing Arm) - { 0x33, PacketTypesOut.Spectate }, // (Wiki name: Teleport To Entity) - { 0x34, PacketTypesOut.PlayerBlockPlacement }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Use Item On) - { 0x35, PacketTypesOut.UseItem }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Use Item) - }; - - private readonly Dictionary configurationTypesIn = new() - { - { 0x00, ConfigurationPacketTypesIn.PluginMessage }, - { 0x01, ConfigurationPacketTypesIn.Disconnect }, - { 0x02, ConfigurationPacketTypesIn.FinishConfiguration }, - { 0x03, ConfigurationPacketTypesIn.KeepAlive }, - { 0x04, ConfigurationPacketTypesIn.Ping }, - { 0x05, ConfigurationPacketTypesIn.RegistryData }, - { 0x06, ConfigurationPacketTypesIn.ResourcePack }, - { 0x07, ConfigurationPacketTypesIn.FeatureFlags }, - { 0x08, ConfigurationPacketTypesIn.UpdateTags }, - }; - - private readonly Dictionary configurationTypesOut = new() - { - { 0x00, ConfigurationPacketTypesOut.ClientInformation }, - { 0x01, ConfigurationPacketTypesOut.PluginMessage }, - { 0x02, ConfigurationPacketTypesOut.FinishConfiguration }, - { 0x03, ConfigurationPacketTypesOut.KeepAlive }, - { 0x04, ConfigurationPacketTypesOut.Pong }, - { 0x05, ConfigurationPacketTypesOut.ResourcePackResponse } - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => configurationTypesIn!; - protected override Dictionary GetConfigurationListOut() => configurationTypesOut!; - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1204.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1204.cs deleted file mode 100644 index 4672123149..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1204.cs +++ /dev/null @@ -1,215 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes; - -public class PacketPalette1204 : PacketTypePalette -{ - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.Bundle }, // Added in 1.19.4 - { 0x01, PacketTypesIn.SpawnEntity }, // Changed in 1.19 (Wiki name: Spawn Entity) - { 0x02, PacketTypesIn.SpawnExperienceOrb }, // (Wiki name: Spawn Exeprience Orb) - { 0x03, PacketTypesIn.EntityAnimation }, // (Wiki name: Entity Animation (clientbound)) - { 0x04, PacketTypesIn.Statistics }, // (Wiki name: Award Statistics) - { 0x05, PacketTypesIn.BlockChangedAck }, // Added 1.19 (Wiki name: Acknowledge Block Change) - { 0x06, PacketTypesIn.BlockBreakAnimation }, // (Wiki name: Set Block Destroy Stage) - { 0x07, PacketTypesIn.BlockEntityData }, // - { 0x08, PacketTypesIn.BlockAction }, // - { 0x09, PacketTypesIn.BlockChange }, // (Wiki name: Block Update) - { 0x0A, PacketTypesIn.BossBar }, // - { 0x0B, PacketTypesIn.ServerDifficulty }, // (Wiki name: Change Difficulty) - { 0x0C, PacketTypesIn.ChunkBatchFinished }, // Added in 1.20.2 - { 0x0D, PacketTypesIn.ChunkBatchStarted }, // Added in 1.20.2 - { 0x0E, PacketTypesIn.ChunksBiomes }, // Added in 1.19.4 - { 0x0F, PacketTypesIn.ClearTiles }, // - { 0x10, PacketTypesIn.TabComplete }, // (Wiki name: Command Suggestions Response) - { 0x11, PacketTypesIn.DeclareCommands }, // (Wiki name: Commands) - { 0x12, PacketTypesIn.CloseWindow }, // (Wiki name: Close Container (clientbound)) - { 0x13, PacketTypesIn.WindowItems }, // (Wiki name: Set Container Content) - { 0x14, PacketTypesIn.WindowProperty }, // (Wiki name: Set Container Property) - { 0x15, PacketTypesIn.SetSlot }, // (Wiki name: Set Container Slot) - { 0x16, PacketTypesIn.SetCooldown }, // - { 0x17, PacketTypesIn.ChatSuggestions }, // Added in 1.19.1 - { 0x18, PacketTypesIn.PluginMessage }, // (Wiki name: Plugin Message (clientbound)) - { 0x19, PacketTypesIn.DamageEvent }, // Added in 1.19.4 - { 0x1A, PacketTypesIn.HideMessage }, // Added in 1.19.1 - { 0x1B, PacketTypesIn.Disconnect }, // - { 0x1C, PacketTypesIn.ProfilelessChatMessage }, // Added in 1.19.3 (Wiki name: Disguised Chat Message) - { 0x1D, PacketTypesIn.EntityStatus }, // (Wiki name: Entity Event) - { 0x1E, PacketTypesIn.Explosion }, // Changed in 1.19 (Location fields are now Double instead of Float) (Wiki name: Explosion) - { 0x1F, PacketTypesIn.UnloadChunk }, // (Wiki name: Forget Chunk) - { 0x20, PacketTypesIn.ChangeGameState }, // (Wiki name: Game Event) - { 0x21, PacketTypesIn.OpenHorseWindow }, // (Wiki name: Horse Screen Open) - { 0x22, PacketTypesIn.HurtAnimation }, // Added in 1.19.4 - { 0x23, PacketTypesIn.InitializeWorldBorder }, // - { 0x24, PacketTypesIn.KeepAlive }, // - { 0x25, PacketTypesIn.ChunkData }, // - { 0x26, PacketTypesIn.Effect }, // (Wiki name: World Event) - { 0x27, PacketTypesIn.Particle }, // Changed in 1.19 (Wiki name: Level Particle) (No need to be implemented) - { 0x28, PacketTypesIn.UpdateLight }, // (Wiki name: Light Update) - { 0x29, PacketTypesIn.JoinGame }, // Changed in 1.20.2 (Wiki name: Login (play)) - { 0x2A, PacketTypesIn.MapData }, // (Wiki name: Map Item Data) - { 0x2B, PacketTypesIn.TradeList }, // (Wiki name: Merchant Offers) - { 0x2C, PacketTypesIn.EntityPosition }, // (Wiki name: Move Entity Position) - { 0x2D, PacketTypesIn.EntityPositionAndRotation }, // (Wiki name: Move Entity Position and Rotation) - { 0x2E, PacketTypesIn.EntityRotation }, // (Wiki name: Move Entity Rotation) - { 0x2F, PacketTypesIn.VehicleMove }, // (Wiki name: Move Vehicle) - { 0x30, PacketTypesIn.OpenBook }, // - { 0x31, PacketTypesIn.OpenWindow }, // (Wiki name: Open Screen) - { 0x32, PacketTypesIn.OpenSignEditor }, // - { 0x33, PacketTypesIn.Ping }, // (Wiki name: Ping (play)) - { 0x34, PacketTypesIn.PingResponse }, // Added in 1.20.2 - { 0x35, PacketTypesIn.CraftRecipeResponse }, // (Wiki name: Place Ghost Recipe) - { 0x36, PacketTypesIn.PlayerAbilities }, // - { 0x37, PacketTypesIn.ChatMessage }, // Changed in 1.19 (Completely changed) (Wiki name: Player Chat Message) - { 0x38, PacketTypesIn.EndCombatEvent }, // (Wiki name: End Combat) - { 0x39, PacketTypesIn.EnterCombatEvent }, // (Wiki name: Enter Combat) - { 0x3A, PacketTypesIn.DeathCombatEvent }, // (Wiki name: Combat Death) - { 0x3B, PacketTypesIn.PlayerRemove }, // Added in 1.19.3 (Not used) - { 0x3C, PacketTypesIn.PlayerInfo }, // Changed in 1.19 (Heavy changes) - { 0x3D, PacketTypesIn.FacePlayer }, // (Wiki name: Player Look At) - { 0x3E, PacketTypesIn.PlayerPositionAndLook }, // (Wiki name: Synchronize Player Position) - { 0x3F, PacketTypesIn.UnlockRecipes }, // (Wiki name: Update Recipe Book) - { 0x40, PacketTypesIn.DestroyEntities }, // (Wiki name: Remove Entites) - { 0x41, PacketTypesIn.RemoveEntityEffect }, // - { 0x42, PacketTypesIn.ResetScore }, // Added in 1.20.3 - { 0x43, PacketTypesIn.RemoveResourcePack }, // Added in 1.20.3 - { 0x44, PacketTypesIn.ResourcePackSend }, // (Wiki name: Add Resource pack (play)) - { 0x45, PacketTypesIn.Respawn }, // Changed in 1.20.2 - { 0x46, PacketTypesIn.EntityHeadLook }, // (Wiki name: Set Head Rotation) - { 0x47, PacketTypesIn.MultiBlockChange }, // (Wiki name: Update Section Blocks) - { 0x48, PacketTypesIn.SelectAdvancementTab }, // - { 0x49, PacketTypesIn.ServerData }, // Added in 1.19 - { 0x4A, PacketTypesIn.ActionBar }, // (Wiki name: Set Action Bar Text) - { 0x4B, PacketTypesIn.WorldBorderCenter }, // (Wiki name: Set Border Center) - { 0x4C, PacketTypesIn.WorldBorderLerpSize }, // - { 0x4D, PacketTypesIn.WorldBorderSize }, // (Wiki name: Set World Border Size) - { 0x4E, PacketTypesIn.WorldBorderWarningDelay }, // (Wiki name: Set World Border Warning Delay) - { 0x4F, PacketTypesIn.WorldBorderWarningReach }, // (Wiki name: Set Border Warning Distance) - { 0x50, PacketTypesIn.Camera }, // (Wiki name: Set Camera) - { 0x51, PacketTypesIn.HeldItemChange }, // (Wiki name: Set Held Item) - { 0x52, PacketTypesIn.UpdateViewPosition }, // (Wiki name: Set Center Chunk) - { 0x53, PacketTypesIn.UpdateViewDistance }, // (Wiki name: Set Render Distance) - { 0x54, PacketTypesIn.SpawnPosition }, // (Wiki name: Set Default Spawn Position) - { 0x55, PacketTypesIn.DisplayScoreboard }, // (Wiki name: Set Display Objective) - { 0x56, PacketTypesIn.EntityMetadata }, // (Wiki name: Set Entity Metadata) - { 0x57, PacketTypesIn.AttachEntity }, // (Wiki name: Link Entities) - { 0x58, PacketTypesIn.EntityVelocity }, // (Wiki name: Set Entity Velocity) - { 0x59, PacketTypesIn.EntityEquipment }, // (Wiki name: Set Equipment) - { 0x5A, PacketTypesIn.SetExperience }, // Changed in 1.20.2 - { 0x5B, PacketTypesIn.UpdateHealth }, // (Wiki name: Set Health) - { 0x5C, PacketTypesIn.ScoreboardObjective }, // (Wiki name: Update Objectives) - Changed in 1.20.3 - { 0x5D, PacketTypesIn.SetPassengers }, // - { 0x5E, PacketTypesIn.Teams }, // (Wiki name: Update Teams) - { 0x5F, PacketTypesIn.UpdateScore }, // (Wiki name: Update Score) - { 0x60, PacketTypesIn.UpdateSimulationDistance }, // (Wiki name: Set Simulation Distance) - { 0x61, PacketTypesIn.SetTitleSubTitle }, // (Wiki name: Set Subtitle Test) - { 0x62, PacketTypesIn.TimeUpdate }, // (Wiki name: Set Time) - { 0x63, PacketTypesIn.SetTitleText }, // (Wiki name: Set Title) - { 0x64, PacketTypesIn.SetTitleTime }, // (Wiki name: Set Title Animation Times) - { 0x65, PacketTypesIn.EntitySoundEffect }, // (Wiki name: Sound Entity) - { 0x66, PacketTypesIn.SoundEffect }, // Changed in 1.19 (Added "Seed" field) (Wiki name: Sound Effect) (No need to be implemented) - { 0x67, PacketTypesIn.StartConfiguration }, // Added in 1.20.2 - { 0x68, PacketTypesIn.StopSound }, // - { 0x69, PacketTypesIn.SystemChat }, // Added in 1.19 (Wiki name: System Chat Message) - { 0x6A, PacketTypesIn.PlayerListHeaderAndFooter }, // (Wiki name: Set Tab List Header And Footer) - { 0x6B, PacketTypesIn.NBTQueryResponse }, // (Wiki name: Tag Query Response) - { 0x6C, PacketTypesIn.CollectItem }, // (Wiki name: Pickup Item) - { 0x6D, PacketTypesIn.EntityTeleport }, // (Wiki name: Teleport Entity) - { 0x6E, PacketTypesIn.SetTickingState }, // Added in 1.20.3 - { 0x6F, PacketTypesIn.StepTick }, // Added in 1.20.3 - { 0x70, PacketTypesIn.Advancements }, // (Wiki name: Update Advancements) (Unused) - { 0x71, PacketTypesIn.EntityProperties }, // (Wiki name: Update Attributes) - { 0x72, PacketTypesIn.EntityEffect }, // Changed in 1.19 (Added "Has Factor Data" and "Factor Codec" fields) (Wiki name: Entity Effect) - { 0x73, PacketTypesIn.DeclareRecipes }, // (Wiki name: Update Recipes) (Unused) - { 0x74, PacketTypesIn.Tags }, // (Wiki name: Update Tags) - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, // (Wiki name: Confirm Teleportation) - { 0x01, PacketTypesOut.QueryBlockNBT }, // (Wiki name: Query Block Entity Tag) - { 0x02, PacketTypesOut.SetDifficulty }, // (Wiki name: Change Difficulty) - { 0x03, PacketTypesOut.MessageAcknowledgment }, // Added in 1.19.1 - { 0x04, PacketTypesOut.ChatCommand }, // Added in 1.19 - { 0x05, PacketTypesOut.ChatMessage }, // Changed in 1.19 (Completely changed) (Wiki name: Chat) - { 0x06, PacketTypesOut.PlayerSession }, // Added in 1.19.3 - { 0x07, PacketTypesOut.ChunkBatchReceived }, // Added in 1.20.2 - { 0x08, PacketTypesOut.ClientStatus }, // (Wiki name: Client Command) - { 0x09, PacketTypesOut.ClientSettings }, // (Wiki name: Client Information) - { 0x0A, PacketTypesOut.TabComplete }, // (Wiki name: Command Suggestions Request) - { 0x0B, PacketTypesOut.AcknowledgeConfiguration }, // Added in 1.20.2 - { 0x0C, PacketTypesOut.ClickWindowButton }, // (Wiki name: Click Container Button) - { 0x0D, PacketTypesOut.ClickWindow }, // (Wiki name: Click Container) - { 0x0E, PacketTypesOut.CloseWindow }, // (Wiki name: Close Container (serverbound)) - { 0x0F, PacketTypesOut.ChangeContainerSlotState }, // Added in 1.20.3 - { 0x10, PacketTypesOut.PluginMessage }, // (Wiki name: Serverbound Plugin Message) - { 0x11, PacketTypesOut.EditBook }, // - { 0x12, PacketTypesOut.EntityNBTRequest }, // (Wiki name: Query Entity Tag) - { 0x13, PacketTypesOut.InteractEntity }, // (Wiki name: Interact) - { 0x14, PacketTypesOut.GenerateStructure }, // (Wiki name: Jigsaw Generate) - { 0x15, PacketTypesOut.KeepAlive }, // (Wiki name: Serverbound Keep Alive (play)) - { 0x16, PacketTypesOut.LockDifficulty }, // - { 0x17, PacketTypesOut.PlayerPosition }, // (Wiki name: Move Player Position) - { 0x18, PacketTypesOut.PlayerPositionAndRotation }, // (Wiki name: Set Player Position and Rotation) - { 0x19, PacketTypesOut.PlayerRotation }, // (Wiki name: Set Player Rotation) - { 0x1A, PacketTypesOut.PlayerMovement }, // (Wiki name: Set Player On Ground) - { 0x1B, PacketTypesOut.VehicleMove }, // (Wiki name: Move Vehicle (serverbound)) - { 0x1C, PacketTypesOut.SteerBoat }, // (Wiki name: Paddle Boat) - { 0x1D, PacketTypesOut.PickItem }, // - { 0x1E, PacketTypesOut.PingRequest }, // Added in 1.20.2 - { 0x1F, PacketTypesOut.CraftRecipeRequest }, // (Wiki name: Place recipe) - { 0x20, PacketTypesOut.PlayerAbilities }, // - { 0x21, PacketTypesOut.PlayerDigging }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Player Action) - { 0x22, PacketTypesOut.EntityAction }, // (Wiki name: Player Command) - { 0x23, PacketTypesOut.SteerVehicle }, // (Wiki name: Player Input) - { 0x24, PacketTypesOut.Pong }, // (Wiki name: Pong (play)) - { 0x25, PacketTypesOut.SetDisplayedRecipe }, // (Wiki name: Recipe Book Change Settings) - { 0x26, PacketTypesOut.SetRecipeBookState }, // (Wiki name: Recipe Book Seen Recipe) - { 0x27, PacketTypesOut.NameItem }, // (Wiki name: Rename Item) - { 0x28, PacketTypesOut.ResourcePackStatus }, // (Wiki name: Resource Pack (serverbound)) - { 0x29, PacketTypesOut.AdvancementTab }, // (Wiki name: Seen Advancements) - { 0x2A, PacketTypesOut.SelectTrade }, // - { 0x2B, PacketTypesOut.SetBeaconEffect }, // Changed in 1.19 (No need to be implemented yet) - { 0x2C, PacketTypesOut.HeldItemChange }, // (Wiki name: Set Carried Item (serverbound)) - { 0x2D, PacketTypesOut.UpdateCommandBlock }, // (Wiki name: Program Command Block) - { 0x2E, PacketTypesOut.UpdateCommandBlockMinecart }, // (Wiki name: Program Command Block Minecart) - { 0x2F, PacketTypesOut.CreativeInventoryAction }, // (Wiki name: Set Creative Mode Slot) - { 0x30, PacketTypesOut.UpdateJigsawBlock }, // (Wiki name: Program Jigsaw Block) - { 0x31, PacketTypesOut.UpdateStructureBlock }, // (Wiki name: Program Structure Block) - { 0x32, PacketTypesOut.UpdateSign }, // (Wiki name: Update Sign) - { 0x33, PacketTypesOut.Animation }, // (Wiki name: Swing Arm) - { 0x34, PacketTypesOut.Spectate }, // (Wiki name: Teleport To Entity) - { 0x35, PacketTypesOut.PlayerBlockPlacement }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Use Item On) - { 0x36, PacketTypesOut.UseItem }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Use Item) - }; - - private readonly Dictionary configurationTypesIn = new() - { - { 0x00, ConfigurationPacketTypesIn.PluginMessage }, - { 0x01, ConfigurationPacketTypesIn.Disconnect }, - { 0x02, ConfigurationPacketTypesIn.FinishConfiguration }, - { 0x03, ConfigurationPacketTypesIn.KeepAlive }, - { 0x04, ConfigurationPacketTypesIn.Ping }, - { 0x05, ConfigurationPacketTypesIn.RegistryData }, - { 0x06, ConfigurationPacketTypesIn.RemoveResourcePack }, - { 0x07, ConfigurationPacketTypesIn.ResourcePack }, - { 0x08, ConfigurationPacketTypesIn.FeatureFlags }, - { 0x09, ConfigurationPacketTypesIn.UpdateTags }, - }; - - private readonly Dictionary configurationTypesOut = new() - { - { 0x00, ConfigurationPacketTypesOut.ClientInformation }, - { 0x01, ConfigurationPacketTypesOut.PluginMessage }, - { 0x02, ConfigurationPacketTypesOut.FinishConfiguration }, - { 0x03, ConfigurationPacketTypesOut.KeepAlive }, - { 0x04, ConfigurationPacketTypesOut.Pong }, - { 0x05, ConfigurationPacketTypesOut.ResourcePackResponse } - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => configurationTypesIn!; - protected override Dictionary GetConfigurationListOut() => configurationTypesOut!; -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1206.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1206.cs deleted file mode 100644 index f053d41ea2..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1206.cs +++ /dev/null @@ -1,230 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes; - -public class PacketPalette1206 : PacketTypePalette -{ - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.Bundle }, // Added in 1.19.4 - { 0x01, PacketTypesIn.SpawnEntity }, // Changed in 1.19 (Wiki name: Spawn Entity) - { 0x02, PacketTypesIn.SpawnExperienceOrb }, // (Wiki name: Spawn Exeprience Orb) - { 0x03, PacketTypesIn.EntityAnimation }, // (Wiki name: Entity Animation (clientbound)) - { 0x04, PacketTypesIn.Statistics }, // (Wiki name: Award Statistics) - { 0x05, PacketTypesIn.BlockChangedAck }, // Added 1.19 (Wiki name: Acknowledge Block Change) - { 0x06, PacketTypesIn.BlockBreakAnimation }, // (Wiki name: Set Block Destroy Stage) - { 0x07, PacketTypesIn.BlockEntityData }, // - { 0x08, PacketTypesIn.BlockAction }, // - { 0x09, PacketTypesIn.BlockChange }, // (Wiki name: Block Update) - { 0x0A, PacketTypesIn.BossBar }, // - { 0x0B, PacketTypesIn.ServerDifficulty }, // (Wiki name: Change Difficulty) - { 0x0C, PacketTypesIn.ChunkBatchFinished }, // Added in 1.20.2 - { 0x0D, PacketTypesIn.ChunkBatchStarted }, // Added in 1.20.2 - { 0x0E, PacketTypesIn.ChunksBiomes }, // Added in 1.19.4 - { 0x0F, PacketTypesIn.ClearTiles }, // - { 0x10, PacketTypesIn.TabComplete }, // (Wiki name: Command Suggestions Response) - { 0x11, PacketTypesIn.DeclareCommands }, // (Wiki name: Commands) - { 0x12, PacketTypesIn.CloseWindow }, // (Wiki name: Close Container (clientbound)) - { 0x13, PacketTypesIn.WindowItems }, // (Wiki name: Set Container Content) - { 0x14, PacketTypesIn.WindowProperty }, // (Wiki name: Set Container Property) - { 0x15, PacketTypesIn.SetSlot }, // (Wiki name: Set Container Slot) - { 0x16, PacketTypesIn.CookieRequest }, // Added in 1.20.6 - { 0x17, PacketTypesIn.SetCooldown }, // - { 0x18, PacketTypesIn.ChatSuggestions }, // Added in 1.19.1 - { 0x19, PacketTypesIn.PluginMessage }, // (Wiki name: Plugin Message (clientbound)) - { 0x1A, PacketTypesIn.DamageEvent }, // Added in 1.19.4 - { 0x1B, PacketTypesIn.DebugSample }, // Added in 1.20.6 - { 0x1C, PacketTypesIn.HideMessage }, // Added in 1.19.1 - { 0x1D, PacketTypesIn.Disconnect }, // - { 0x1E, PacketTypesIn.ProfilelessChatMessage }, // Added in 1.19.3 (Wiki name: Disguised Chat Message) - { 0x1F, PacketTypesIn.EntityStatus }, // (Wiki name: Entity Event) - { 0x20, PacketTypesIn.Explosion }, // Changed in 1.19 (Location fields are now Double instead of Float) (Wiki name: Explosion) - { 0x21, PacketTypesIn.UnloadChunk }, // (Wiki name: Forget Chunk) - { 0x22, PacketTypesIn.ChangeGameState }, // (Wiki name: Game Event) - { 0x23, PacketTypesIn.OpenHorseWindow }, // (Wiki name: Horse Screen Open) - { 0x24, PacketTypesIn.HurtAnimation }, // Added in 1.19.4 - { 0x25, PacketTypesIn.InitializeWorldBorder }, // - { 0x26, PacketTypesIn.KeepAlive }, // - { 0x27, PacketTypesIn.ChunkData }, // - { 0x28, PacketTypesIn.Effect }, // (Wiki name: World Event) - { 0x29, PacketTypesIn.Particle }, // Changed in 1.19 (Wiki name: Level Particle) (No need to be implemented) - { 0x2A, PacketTypesIn.UpdateLight }, // (Wiki name: Light Update) - { 0x2B, PacketTypesIn.JoinGame }, // Changed in 1.20.2 (Wiki name: Login (play)) - { 0x2C, PacketTypesIn.MapData }, // (Wiki name: Map Item Data) - { 0x2D, PacketTypesIn.TradeList }, // (Wiki name: Merchant Offers) - { 0x2E, PacketTypesIn.EntityPosition }, // (Wiki name: Move Entity Position) - { 0x2F, PacketTypesIn.EntityPositionAndRotation }, // (Wiki name: Move Entity Position and Rotation) - { 0x30, PacketTypesIn.EntityRotation }, // (Wiki name: Move Entity Rotation) - { 0x31, PacketTypesIn.VehicleMove }, // (Wiki name: Move Vehicle) - { 0x32, PacketTypesIn.OpenBook }, // - { 0x33, PacketTypesIn.OpenWindow }, // (Wiki name: Open Screen) - { 0x34, PacketTypesIn.OpenSignEditor }, // - { 0x35, PacketTypesIn.Ping }, // (Wiki name: Ping (play)) - { 0x36, PacketTypesIn.PingResponse }, // Added in 1.20.2 - { 0x37, PacketTypesIn.CraftRecipeResponse }, // (Wiki name: Place Ghost Recipe) - { 0x38, PacketTypesIn.PlayerAbilities }, // - { 0x39, PacketTypesIn.ChatMessage }, // Changed in 1.19 (Completely changed) (Wiki name: Player Chat Message) - { 0x3A, PacketTypesIn.EndCombatEvent }, // (Wiki name: End Combat) - { 0x3B, PacketTypesIn.EnterCombatEvent }, // (Wiki name: Enter Combat) - { 0x3C, PacketTypesIn.DeathCombatEvent }, // (Wiki name: Combat Death) - { 0x3D, PacketTypesIn.PlayerRemove }, // Added in 1.19.3 (Not used) - { 0x3E, PacketTypesIn.PlayerInfo }, // Changed in 1.19 (Heavy changes) - { 0x3F, PacketTypesIn.FacePlayer }, // (Wiki name: Player Look At) - { 0x40, PacketTypesIn.PlayerPositionAndLook }, // (Wiki name: Synchronize Player Position) - { 0x41, PacketTypesIn.UnlockRecipes }, // (Wiki name: Update Recipe Book) - { 0x42, PacketTypesIn.DestroyEntities }, // (Wiki name: Remove Entites) - { 0x43, PacketTypesIn.RemoveEntityEffect }, // - { 0x44, PacketTypesIn.ResetScore }, // Added in 1.20.3 - { 0x45, PacketTypesIn.RemoveResourcePack }, // Added in 1.20.3 - { 0x46, PacketTypesIn.ResourcePackSend }, // (Wiki name: Add Resource pack (play)) - { 0x47, PacketTypesIn.Respawn }, // Changed in 1.20.2 - { 0x48, PacketTypesIn.EntityHeadLook }, // (Wiki name: Set Head Rotation) - { 0x49, PacketTypesIn.MultiBlockChange }, // (Wiki name: Update Section Blocks) - { 0x4A, PacketTypesIn.SelectAdvancementTab }, // - { 0x4B, PacketTypesIn.ServerData }, // Added in 1.19 - { 0x4C, PacketTypesIn.ActionBar }, // (Wiki name: Set Action Bar Text) - { 0x4D, PacketTypesIn.WorldBorderCenter }, // (Wiki name: Set Border Center) - { 0x4E, PacketTypesIn.WorldBorderLerpSize }, // - { 0x4F, PacketTypesIn.WorldBorderSize }, // (Wiki name: Set World Border Size) - { 0x50, PacketTypesIn.WorldBorderWarningDelay }, // (Wiki name: Set World Border Warning Delay) - { 0x51, PacketTypesIn.WorldBorderWarningReach }, // (Wiki name: Set Border Warning Distance) - { 0x52, PacketTypesIn.Camera }, // (Wiki name: Set Camera) - { 0x53, PacketTypesIn.HeldItemChange }, // (Wiki name: Set Held Item) - { 0x54, PacketTypesIn.UpdateViewPosition }, // (Wiki name: Set Center Chunk) - { 0x55, PacketTypesIn.UpdateViewDistance }, // (Wiki name: Set Render Distance) - { 0x56, PacketTypesIn.SpawnPosition }, // (Wiki name: Set Default Spawn Position) - { 0x57, PacketTypesIn.DisplayScoreboard }, // (Wiki name: Set Display Objective) - { 0x58, PacketTypesIn.EntityMetadata }, // (Wiki name: Set Entity Metadata) - { 0x59, PacketTypesIn.AttachEntity }, // (Wiki name: Link Entities) - { 0x5A, PacketTypesIn.EntityVelocity }, // (Wiki name: Set Entity Velocity) - { 0x5B, PacketTypesIn.EntityEquipment }, // (Wiki name: Set Equipment) - { 0x5C, PacketTypesIn.SetExperience }, // Changed in 1.20.2 - { 0x5D, PacketTypesIn.UpdateHealth }, // (Wiki name: Set Health) - { 0x5E, PacketTypesIn.ScoreboardObjective }, // (Wiki name: Update Objectives) - Changed in 1.20.3 - { 0x5F, PacketTypesIn.SetPassengers }, // - { 0x60, PacketTypesIn.Teams }, // (Wiki name: Update Teams) - { 0x61, PacketTypesIn.UpdateScore }, // (Wiki name: Update Score) - { 0x62, PacketTypesIn.UpdateSimulationDistance }, // (Wiki name: Set Simulation Distance) - { 0x63, PacketTypesIn.SetTitleSubTitle }, // (Wiki name: Set Subtitle Test) - { 0x64, PacketTypesIn.TimeUpdate }, // (Wiki name: Set Time) - { 0x65, PacketTypesIn.SetTitleText }, // (Wiki name: Set Title) - { 0x66, PacketTypesIn.SetTitleTime }, // (Wiki name: Set Title Animation Times) - { 0x67, PacketTypesIn.EntitySoundEffect }, // (Wiki name: Sound Entity) - { 0x68, PacketTypesIn.SoundEffect }, // Changed in 1.19 (Added "Seed" field) (Wiki name: Sound Effect) (No need to be implemented) - { 0x69, PacketTypesIn.StartConfiguration }, // Added in 1.20.2 - { 0x6A, PacketTypesIn.StopSound }, // - { 0x6B, PacketTypesIn.StoreCookie }, // Added in 1.20.6 - { 0x6C, PacketTypesIn.SystemChat }, // Added in 1.19 (Wiki name: System Chat Message) - { 0x6D, PacketTypesIn.PlayerListHeaderAndFooter }, // (Wiki name: Set Tab List Header And Footer) - { 0x6E, PacketTypesIn.NBTQueryResponse }, // (Wiki name: Tag Query Response) - { 0x6F, PacketTypesIn.CollectItem }, // (Wiki name: Pickup Item) - { 0x70, PacketTypesIn.EntityTeleport }, // (Wiki name: Teleport Entity) - { 0x71, PacketTypesIn.SetTickingState }, // Added in 1.20.3 - { 0x72, PacketTypesIn.StepTick }, // Added in 1.20.3 - { 0x73, PacketTypesIn.Transfer }, // Added in 1.20.6 - { 0x74, PacketTypesIn.Advancements }, // (Wiki name: Update Advancements) (Unused) - { 0x75, PacketTypesIn.EntityProperties }, // (Wiki name: Update Attributes) - { 0x76, PacketTypesIn.EntityEffect }, // Changed in 1.19 (Added "Has Factor Data" and "Factor Codec" fields) (Wiki name: Entity Effect) - { 0x77, PacketTypesIn.DeclareRecipes }, // (Wiki name: Update Recipes) (Unused) - { 0x78, PacketTypesIn.Tags }, // (Wiki name: Update Tags) - { 0x79, PacketTypesIn.ProjectilePower }, // Added in 1.20.6 - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, // (Wiki name: Confirm Teleportation) - { 0x01, PacketTypesOut.QueryBlockNBT }, // (Wiki name: Query Block Entity Tag) - { 0x02, PacketTypesOut.SetDifficulty }, // (Wiki name: Change Difficulty) - { 0x03, PacketTypesOut.MessageAcknowledgment }, // Added in 1.19.1 - { 0x04, PacketTypesOut.ChatCommand }, // Added in 1.19 - { 0x05, PacketTypesOut.SignedChatCommand }, // Added in 1.20.6 - { 0x06, PacketTypesOut.ChatMessage }, // Changed in 1.19 (Completely changed) (Wiki name: Chat) - { 0x07, PacketTypesOut.PlayerSession }, // Added in 1.19.3 - { 0x08, PacketTypesOut.ChunkBatchReceived }, // Added in 1.20.2 - { 0x09, PacketTypesOut.ClientStatus }, // (Wiki name: Client Command) - { 0x0A, PacketTypesOut.ClientSettings }, // (Wiki name: Client Information) - { 0x0B, PacketTypesOut.TabComplete }, // (Wiki name: Command Suggestions Request) - { 0x0C, PacketTypesOut.AcknowledgeConfiguration }, // Added in 1.20.2 - { 0x0D, PacketTypesOut.ClickWindowButton }, // (Wiki name: Click Container Button) - { 0x0E, PacketTypesOut.ClickWindow }, // (Wiki name: Click Container) - { 0x0F, PacketTypesOut.CloseWindow }, // (Wiki name: Close Container (serverbound)) - { 0x10, PacketTypesOut.ChangeContainerSlotState }, // Added in 1.20.3 - { 0x11, PacketTypesOut.CookieResponse }, // Added in 1.20.6 - { 0x12, PacketTypesOut.PluginMessage }, // (Wiki name: Serverbound Plugin Message) - { 0x13, PacketTypesOut.DebugSampleSubscription }, // Added in 1.20.6 - { 0x14, PacketTypesOut.EditBook }, // - { 0x15, PacketTypesOut.EntityNBTRequest }, // (Wiki name: Query Entity Tag) - { 0x16, PacketTypesOut.InteractEntity }, // (Wiki name: Interact) - { 0x17, PacketTypesOut.GenerateStructure }, // (Wiki name: Jigsaw Generate) - { 0x18, PacketTypesOut.KeepAlive }, // (Wiki name: Serverbound Keep Alive (play)) - { 0x19, PacketTypesOut.LockDifficulty }, // - { 0x1A, PacketTypesOut.PlayerPosition }, // (Wiki name: Move Player Position) - { 0x1B, PacketTypesOut.PlayerPositionAndRotation }, // (Wiki name: Set Player Position and Rotation) - { 0x1C, PacketTypesOut.PlayerRotation }, // (Wiki name: Set Player Rotation) - { 0x1D, PacketTypesOut.PlayerMovement }, // (Wiki name: Set Player On Ground) - { 0x1E, PacketTypesOut.VehicleMove }, // (Wiki name: Move Vehicle (serverbound)) - { 0x1F, PacketTypesOut.SteerBoat }, // (Wiki name: Paddle Boat) - { 0x20, PacketTypesOut.PickItem }, // - { 0x21, PacketTypesOut.PingRequest }, // Added in 1.20.2 - { 0x22, PacketTypesOut.CraftRecipeRequest }, // (Wiki name: Place recipe) - { 0x23, PacketTypesOut.PlayerAbilities }, // - { 0x24, PacketTypesOut.PlayerDigging }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Player Action) - { 0x25, PacketTypesOut.EntityAction }, // (Wiki name: Player Command) - { 0x26, PacketTypesOut.SteerVehicle }, // (Wiki name: Player Input) - { 0x27, PacketTypesOut.Pong }, // (Wiki name: Pong (play)) - { 0x28, PacketTypesOut.SetDisplayedRecipe }, // (Wiki name: Recipe Book Change Settings) - { 0x29, PacketTypesOut.SetRecipeBookState }, // (Wiki name: Recipe Book Seen Recipe) - { 0x2A, PacketTypesOut.NameItem }, // (Wiki name: Rename Item) - { 0x2B, PacketTypesOut.ResourcePackStatus }, // (Wiki name: Resource Pack (serverbound)) - { 0x2C, PacketTypesOut.AdvancementTab }, // (Wiki name: Seen Advancements) - { 0x2D, PacketTypesOut.SelectTrade }, // - { 0x2E, PacketTypesOut.SetBeaconEffect }, // Changed in 1.19 (No need to be implemented yet) - { 0x2F, PacketTypesOut.HeldItemChange }, // (Wiki name: Set Carried Item (serverbound)) - { 0x30, PacketTypesOut.UpdateCommandBlock }, // (Wiki name: Program Command Block) - { 0x31, PacketTypesOut.UpdateCommandBlockMinecart }, // (Wiki name: Program Command Block Minecart) - { 0x32, PacketTypesOut.CreativeInventoryAction }, // (Wiki name: Set Creative Mode Slot) - { 0x33, PacketTypesOut.UpdateJigsawBlock }, // (Wiki name: Program Jigsaw Block) - { 0x34, PacketTypesOut.UpdateStructureBlock }, // (Wiki name: Program Structure Block) - { 0x35, PacketTypesOut.UpdateSign }, // (Wiki name: Update Sign) - { 0x36, PacketTypesOut.Animation }, // (Wiki name: Swing Arm) - { 0x37, PacketTypesOut.Spectate }, // (Wiki name: Teleport To Entity) - { 0x38, PacketTypesOut.PlayerBlockPlacement }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Use Item On) - { 0x39, PacketTypesOut.UseItem }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Use Item) - }; - - private readonly Dictionary configurationTypesIn = new() - { - { 0x00, ConfigurationPacketTypesIn.CookieRequest }, - { 0x01, ConfigurationPacketTypesIn.PluginMessage }, - { 0x02, ConfigurationPacketTypesIn.Disconnect }, - { 0x03, ConfigurationPacketTypesIn.FinishConfiguration }, - { 0x04, ConfigurationPacketTypesIn.KeepAlive }, - { 0x05, ConfigurationPacketTypesIn.Ping }, - { 0x06, ConfigurationPacketTypesIn.ResetChat }, - { 0x07, ConfigurationPacketTypesIn.RegistryData }, - { 0x08, ConfigurationPacketTypesIn.RemoveResourcePack }, - { 0x09, ConfigurationPacketTypesIn.ResourcePack }, - { 0x0A, ConfigurationPacketTypesIn.StoreCookie }, - { 0x0B, ConfigurationPacketTypesIn.Transfer }, - { 0x0C, ConfigurationPacketTypesIn.FeatureFlags }, - { 0x0D, ConfigurationPacketTypesIn.UpdateTags }, - { 0x0E, ConfigurationPacketTypesIn.KnownDataPacks } - }; - - private readonly Dictionary configurationTypesOut = new() - { - { 0x00, ConfigurationPacketTypesOut.ClientInformation }, - { 0x01, ConfigurationPacketTypesOut.CookieResponse }, - { 0x02, ConfigurationPacketTypesOut.PluginMessage }, - { 0x03, ConfigurationPacketTypesOut.FinishConfiguration }, - { 0x04, ConfigurationPacketTypesOut.KeepAlive }, - { 0x05, ConfigurationPacketTypesOut.Pong }, - { 0x06, ConfigurationPacketTypesOut.ResourcePackResponse }, - { 0x07, ConfigurationPacketTypesOut.KnownDataPacks } - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => configurationTypesIn!; - protected override Dictionary GetConfigurationListOut() => configurationTypesOut!; -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette121.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette121.cs deleted file mode 100644 index 8c35b2c86d..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette121.cs +++ /dev/null @@ -1,234 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes; - -public class PacketPalette121 : PacketTypePalette -{ - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.Bundle }, // Added in 1.19.4 - { 0x01, PacketTypesIn.SpawnEntity }, // Changed in 1.19 (Wiki name: Spawn Entity) - { 0x02, PacketTypesIn.SpawnExperienceOrb }, // (Wiki name: Spawn Exeprience Orb) - { 0x03, PacketTypesIn.EntityAnimation }, // (Wiki name: Entity Animation (clientbound)) - { 0x04, PacketTypesIn.Statistics }, // (Wiki name: Award Statistics) - { 0x05, PacketTypesIn.BlockChangedAck }, // Added 1.19 (Wiki name: Acknowledge Block Change) - { 0x06, PacketTypesIn.BlockBreakAnimation }, // (Wiki name: Set Block Destroy Stage) - { 0x07, PacketTypesIn.BlockEntityData }, // - { 0x08, PacketTypesIn.BlockAction }, // - { 0x09, PacketTypesIn.BlockChange }, // (Wiki name: Block Update) - { 0x0A, PacketTypesIn.BossBar }, // - { 0x0B, PacketTypesIn.ServerDifficulty }, // (Wiki name: Change Difficulty) - { 0x0C, PacketTypesIn.ChunkBatchFinished }, // Added in 1.20.2 - { 0x0D, PacketTypesIn.ChunkBatchStarted }, // Added in 1.20.2 - { 0x0E, PacketTypesIn.ChunksBiomes }, // Added in 1.19.4 - { 0x0F, PacketTypesIn.ClearTiles }, // - { 0x10, PacketTypesIn.TabComplete }, // (Wiki name: Command Suggestions Response) - { 0x11, PacketTypesIn.DeclareCommands }, // (Wiki name: Commands) - { 0x12, PacketTypesIn.CloseWindow }, // (Wiki name: Close Container (clientbound)) - { 0x13, PacketTypesIn.WindowItems }, // (Wiki name: Set Container Content) - { 0x14, PacketTypesIn.WindowProperty }, // (Wiki name: Set Container Property) - { 0x15, PacketTypesIn.SetSlot }, // (Wiki name: Set Container Slot) - { 0x16, PacketTypesIn.CookieRequest }, // Added in 1.20.6 - { 0x17, PacketTypesIn.SetCooldown }, // - { 0x18, PacketTypesIn.ChatSuggestions }, // Added in 1.19.1 - { 0x19, PacketTypesIn.PluginMessage }, // (Wiki name: Plugin Message (clientbound)) - { 0x1A, PacketTypesIn.DamageEvent }, // Added in 1.19.4 - { 0x1B, PacketTypesIn.DebugSample }, // Added in 1.20.6 - { 0x1C, PacketTypesIn.HideMessage }, // Added in 1.19.1 - { 0x1D, PacketTypesIn.Disconnect }, // - { 0x1E, PacketTypesIn.ProfilelessChatMessage }, // Added in 1.19.3 (Wiki name: Disguised Chat Message) - { 0x1F, PacketTypesIn.EntityStatus }, // (Wiki name: Entity Event) - { 0x20, PacketTypesIn.Explosion }, // Changed in 1.19 (Location fields are now Double instead of Float) (Wiki name: Explosion) - { 0x21, PacketTypesIn.UnloadChunk }, // (Wiki name: Forget Chunk) - { 0x22, PacketTypesIn.ChangeGameState }, // (Wiki name: Game Event) - { 0x23, PacketTypesIn.OpenHorseWindow }, // (Wiki name: Horse Screen Open) - { 0x24, PacketTypesIn.HurtAnimation }, // Added in 1.19.4 - { 0x25, PacketTypesIn.InitializeWorldBorder }, // - { 0x26, PacketTypesIn.KeepAlive }, // - { 0x27, PacketTypesIn.ChunkData }, // - { 0x28, PacketTypesIn.Effect }, // (Wiki name: World Event) - { 0x29, PacketTypesIn.Particle }, // Changed in 1.19 (Wiki name: Level Particle) (No need to be implemented) - { 0x2A, PacketTypesIn.UpdateLight }, // (Wiki name: Light Update) - { 0x2B, PacketTypesIn.JoinGame }, // Changed in 1.20.2 (Wiki name: Login (play)) - { 0x2C, PacketTypesIn.MapData }, // (Wiki name: Map Item Data) - { 0x2D, PacketTypesIn.TradeList }, // (Wiki name: Merchant Offers) - { 0x2E, PacketTypesIn.EntityPosition }, // (Wiki name: Move Entity Position) - { 0x2F, PacketTypesIn.EntityPositionAndRotation }, // (Wiki name: Move Entity Position and Rotation) - { 0x30, PacketTypesIn.EntityRotation }, // (Wiki name: Move Entity Rotation) - { 0x31, PacketTypesIn.VehicleMove }, // (Wiki name: Move Vehicle) - { 0x32, PacketTypesIn.OpenBook }, // - { 0x33, PacketTypesIn.OpenWindow }, // (Wiki name: Open Screen) - { 0x34, PacketTypesIn.OpenSignEditor }, // - { 0x35, PacketTypesIn.Ping }, // (Wiki name: Ping (play)) - { 0x36, PacketTypesIn.PingResponse }, // Added in 1.20.2 - { 0x37, PacketTypesIn.CraftRecipeResponse }, // (Wiki name: Place Ghost Recipe) - { 0x38, PacketTypesIn.PlayerAbilities }, // - { 0x39, PacketTypesIn.ChatMessage }, // Changed in 1.19 (Completely changed) (Wiki name: Player Chat Message) - { 0x3A, PacketTypesIn.EndCombatEvent }, // (Wiki name: End Combat) - { 0x3B, PacketTypesIn.EnterCombatEvent }, // (Wiki name: Enter Combat) - { 0x3C, PacketTypesIn.DeathCombatEvent }, // (Wiki name: Combat Death) - { 0x3D, PacketTypesIn.PlayerRemove }, // Added in 1.19.3 (Not used) - { 0x3E, PacketTypesIn.PlayerInfo }, // Changed in 1.19 (Heavy changes) - { 0x3F, PacketTypesIn.FacePlayer }, // (Wiki name: Player Look At) - { 0x40, PacketTypesIn.PlayerPositionAndLook }, // (Wiki name: Synchronize Player Position) - { 0x41, PacketTypesIn.UnlockRecipes }, // (Wiki name: Update Recipe Book) - { 0x42, PacketTypesIn.DestroyEntities }, // (Wiki name: Remove Entites) - { 0x43, PacketTypesIn.RemoveEntityEffect }, // - { 0x44, PacketTypesIn.ResetScore }, // Added in 1.20.3 - { 0x45, PacketTypesIn.RemoveResourcePack }, // Added in 1.20.3 - { 0x46, PacketTypesIn.ResourcePackSend }, // (Wiki name: Add Resource pack (play)) - { 0x47, PacketTypesIn.Respawn }, // Changed in 1.20.2 - { 0x48, PacketTypesIn.EntityHeadLook }, // (Wiki name: Set Head Rotation) - { 0x49, PacketTypesIn.MultiBlockChange }, // (Wiki name: Update Section Blocks) - { 0x4A, PacketTypesIn.SelectAdvancementTab }, // - { 0x4B, PacketTypesIn.ServerData }, // Added in 1.19 - { 0x4C, PacketTypesIn.ActionBar }, // (Wiki name: Set Action Bar Text) - { 0x4D, PacketTypesIn.WorldBorderCenter }, // (Wiki name: Set Border Center) - { 0x4E, PacketTypesIn.WorldBorderLerpSize }, // - { 0x4F, PacketTypesIn.WorldBorderSize }, // (Wiki name: Set World Border Size) - { 0x50, PacketTypesIn.WorldBorderWarningDelay }, // (Wiki name: Set World Border Warning Delay) - { 0x51, PacketTypesIn.WorldBorderWarningReach }, // (Wiki name: Set Border Warning Distance) - { 0x52, PacketTypesIn.Camera }, // (Wiki name: Set Camera) - { 0x53, PacketTypesIn.HeldItemChange }, // (Wiki name: Set Held Item) - { 0x54, PacketTypesIn.UpdateViewPosition }, // (Wiki name: Set Center Chunk) - { 0x55, PacketTypesIn.UpdateViewDistance }, // (Wiki name: Set Render Distance) - { 0x56, PacketTypesIn.SpawnPosition }, // (Wiki name: Set Default Spawn Position) - { 0x57, PacketTypesIn.DisplayScoreboard }, // (Wiki name: Set Display Objective) - { 0x58, PacketTypesIn.EntityMetadata }, // (Wiki name: Set Entity Metadata) - { 0x59, PacketTypesIn.AttachEntity }, // (Wiki name: Link Entities) - { 0x5A, PacketTypesIn.EntityVelocity }, // (Wiki name: Set Entity Velocity) - { 0x5B, PacketTypesIn.EntityEquipment }, // (Wiki name: Set Equipment) - { 0x5C, PacketTypesIn.SetExperience }, // Changed in 1.20.2 - { 0x5D, PacketTypesIn.UpdateHealth }, // (Wiki name: Set Health) - { 0x5E, PacketTypesIn.ScoreboardObjective }, // (Wiki name: Update Objectives) - Changed in 1.20.3 - { 0x5F, PacketTypesIn.SetPassengers }, // - { 0x60, PacketTypesIn.Teams }, // (Wiki name: Update Teams) - { 0x61, PacketTypesIn.UpdateScore }, // (Wiki name: Update Score) - { 0x62, PacketTypesIn.UpdateSimulationDistance }, // (Wiki name: Set Simulation Distance) - { 0x63, PacketTypesIn.SetTitleSubTitle }, // (Wiki name: Set Subtitle Test) - { 0x64, PacketTypesIn.TimeUpdate }, // (Wiki name: Set Time) - { 0x65, PacketTypesIn.SetTitleText }, // (Wiki name: Set Title) - { 0x66, PacketTypesIn.SetTitleTime }, // (Wiki name: Set Title Animation Times) - { 0x67, PacketTypesIn.EntitySoundEffect }, // (Wiki name: Sound Entity) - { 0x68, PacketTypesIn.SoundEffect }, // Changed in 1.19 (Added "Seed" field) (Wiki name: Sound Effect) (No need to be implemented) - { 0x69, PacketTypesIn.StartConfiguration }, // Added in 1.20.2 - { 0x6A, PacketTypesIn.StopSound }, // - { 0x6B, PacketTypesIn.StoreCookie }, // Added in 1.20.6 - { 0x6C, PacketTypesIn.SystemChat }, // Added in 1.19 (Wiki name: System Chat Message) - { 0x6D, PacketTypesIn.PlayerListHeaderAndFooter }, // (Wiki name: Set Tab List Header And Footer) - { 0x6E, PacketTypesIn.NBTQueryResponse }, // (Wiki name: Tag Query Response) - { 0x6F, PacketTypesIn.CollectItem }, // (Wiki name: Pickup Item) - { 0x70, PacketTypesIn.EntityTeleport }, // (Wiki name: Teleport Entity) - { 0x71, PacketTypesIn.SetTickingState }, // Added in 1.20.3 - { 0x72, PacketTypesIn.StepTick }, // Added in 1.20.3 - { 0x73, PacketTypesIn.Transfer }, // Added in 1.20.6 - { 0x74, PacketTypesIn.Advancements }, // (Wiki name: Update Advancements) (Unused) - { 0x75, PacketTypesIn.EntityProperties }, // (Wiki name: Update Attributes) - { 0x76, PacketTypesIn.EntityEffect }, // Changed in 1.19 (Added "Has Factor Data" and "Factor Codec" fields) (Wiki name: Entity Effect) - { 0x77, PacketTypesIn.DeclareRecipes }, // (Wiki name: Update Recipes) (Unused) - { 0x78, PacketTypesIn.Tags }, // (Wiki name: Update Tags) - { 0x79, PacketTypesIn.ProjectilePower }, // Added in 1.20.6 - { 0x7A, PacketTypesIn.CustomReportDetails }, // Added in 1.21 - { 0x7B, PacketTypesIn.ServerLinks } // Added in 1.21 - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, // (Wiki name: Confirm Teleportation) - { 0x01, PacketTypesOut.QueryBlockNBT }, // (Wiki name: Query Block Entity Tag) - { 0x02, PacketTypesOut.SetDifficulty }, // (Wiki name: Change Difficulty) - { 0x03, PacketTypesOut.MessageAcknowledgment }, // Added in 1.19.1 - { 0x04, PacketTypesOut.ChatCommand }, // Added in 1.19 - { 0x05, PacketTypesOut.SignedChatCommand }, // Added in 1.20.6 - { 0x06, PacketTypesOut.ChatMessage }, // Changed in 1.19 (Completely changed) (Wiki name: Chat) - { 0x07, PacketTypesOut.PlayerSession }, // Added in 1.19.3 - { 0x08, PacketTypesOut.ChunkBatchReceived }, // Added in 1.20.2 - { 0x09, PacketTypesOut.ClientStatus }, // (Wiki name: Client Command) - { 0x0A, PacketTypesOut.ClientSettings }, // (Wiki name: Client Information) - { 0x0B, PacketTypesOut.TabComplete }, // (Wiki name: Command Suggestions Request) - { 0x0C, PacketTypesOut.AcknowledgeConfiguration }, // Added in 1.20.2 - { 0x0D, PacketTypesOut.ClickWindowButton }, // (Wiki name: Click Container Button) - { 0x0E, PacketTypesOut.ClickWindow }, // (Wiki name: Click Container) - { 0x0F, PacketTypesOut.CloseWindow }, // (Wiki name: Close Container (serverbound)) - { 0x10, PacketTypesOut.ChangeContainerSlotState }, // Added in 1.20.3 - { 0x11, PacketTypesOut.CookieResponse }, // Added in 1.20.6 - { 0x12, PacketTypesOut.PluginMessage }, // (Wiki name: Serverbound Plugin Message) - { 0x13, PacketTypesOut.DebugSampleSubscription }, // Added in 1.20.6 - { 0x14, PacketTypesOut.EditBook }, // - { 0x15, PacketTypesOut.EntityNBTRequest }, // (Wiki name: Query Entity Tag) - { 0x16, PacketTypesOut.InteractEntity }, // (Wiki name: Interact) - { 0x17, PacketTypesOut.GenerateStructure }, // (Wiki name: Jigsaw Generate) - { 0x18, PacketTypesOut.KeepAlive }, // (Wiki name: Serverbound Keep Alive (play)) - { 0x19, PacketTypesOut.LockDifficulty }, // - { 0x1A, PacketTypesOut.PlayerPosition }, // (Wiki name: Move Player Position) - { 0x1B, PacketTypesOut.PlayerPositionAndRotation }, // (Wiki name: Set Player Position and Rotation) - { 0x1C, PacketTypesOut.PlayerRotation }, // (Wiki name: Set Player Rotation) - { 0x1D, PacketTypesOut.PlayerMovement }, // (Wiki name: Set Player On Ground) - { 0x1E, PacketTypesOut.VehicleMove }, // (Wiki name: Move Vehicle (serverbound)) - { 0x1F, PacketTypesOut.SteerBoat }, // (Wiki name: Paddle Boat) - { 0x20, PacketTypesOut.PickItem }, // - { 0x21, PacketTypesOut.PingRequest }, // Added in 1.20.2 - { 0x22, PacketTypesOut.CraftRecipeRequest }, // (Wiki name: Place recipe) - { 0x23, PacketTypesOut.PlayerAbilities }, // - { 0x24, PacketTypesOut.PlayerDigging }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Player Action) - { 0x25, PacketTypesOut.EntityAction }, // (Wiki name: Player Command) - { 0x26, PacketTypesOut.SteerVehicle }, // (Wiki name: Player Input) - { 0x27, PacketTypesOut.Pong }, // (Wiki name: Pong (play)) - { 0x28, PacketTypesOut.SetDisplayedRecipe }, // (Wiki name: Recipe Book Change Settings) - { 0x29, PacketTypesOut.SetRecipeBookState }, // (Wiki name: Recipe Book Seen Recipe) - { 0x2A, PacketTypesOut.NameItem }, // (Wiki name: Rename Item) - { 0x2B, PacketTypesOut.ResourcePackStatus }, // (Wiki name: Resource Pack (serverbound)) - { 0x2C, PacketTypesOut.AdvancementTab }, // (Wiki name: Seen Advancements) - { 0x2D, PacketTypesOut.SelectTrade }, // - { 0x2E, PacketTypesOut.SetBeaconEffect }, // Changed in 1.19 (No need to be implemented yet) - { 0x2F, PacketTypesOut.HeldItemChange }, // (Wiki name: Set Carried Item (serverbound)) - { 0x30, PacketTypesOut.UpdateCommandBlock }, // (Wiki name: Program Command Block) - { 0x31, PacketTypesOut.UpdateCommandBlockMinecart }, // (Wiki name: Program Command Block Minecart) - { 0x32, PacketTypesOut.CreativeInventoryAction }, // (Wiki name: Set Creative Mode Slot) - { 0x33, PacketTypesOut.UpdateJigsawBlock }, // (Wiki name: Program Jigsaw Block) - { 0x34, PacketTypesOut.UpdateStructureBlock }, // (Wiki name: Program Structure Block) - { 0x35, PacketTypesOut.UpdateSign }, // (Wiki name: Update Sign) - { 0x36, PacketTypesOut.Animation }, // (Wiki name: Swing Arm) - { 0x37, PacketTypesOut.Spectate }, // (Wiki name: Teleport To Entity) - { 0x38, PacketTypesOut.PlayerBlockPlacement }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Use Item On) - { 0x39, PacketTypesOut.UseItem }, // Changed in 1.19 (Added a "Sequence" field) (Wiki name: Use Item) - }; - - private readonly Dictionary configurationTypesIn = new() - { - { 0x00, ConfigurationPacketTypesIn.CookieRequest }, - { 0x01, ConfigurationPacketTypesIn.PluginMessage }, - { 0x02, ConfigurationPacketTypesIn.Disconnect }, - { 0x03, ConfigurationPacketTypesIn.FinishConfiguration }, - { 0x04, ConfigurationPacketTypesIn.KeepAlive }, - { 0x05, ConfigurationPacketTypesIn.Ping }, - { 0x06, ConfigurationPacketTypesIn.ResetChat }, - { 0x07, ConfigurationPacketTypesIn.RegistryData }, - { 0x08, ConfigurationPacketTypesIn.RemoveResourcePack }, - { 0x09, ConfigurationPacketTypesIn.ResourcePack }, - { 0x0A, ConfigurationPacketTypesIn.StoreCookie }, - { 0x0B, ConfigurationPacketTypesIn.Transfer }, - { 0x0C, ConfigurationPacketTypesIn.FeatureFlags }, - { 0x0D, ConfigurationPacketTypesIn.UpdateTags }, - { 0x0E, ConfigurationPacketTypesIn.KnownDataPacks }, - { 0x0F, ConfigurationPacketTypesIn.CustomReportDetails }, // Added in 1.21 (Not used) - { 0x10, ConfigurationPacketTypesIn.ServerLinks } // Added in 1.21 (Not used) - }; - - private readonly Dictionary configurationTypesOut = new() - { - { 0x00, ConfigurationPacketTypesOut.ClientInformation }, - { 0x01, ConfigurationPacketTypesOut.CookieResponse }, - { 0x02, ConfigurationPacketTypesOut.PluginMessage }, - { 0x03, ConfigurationPacketTypesOut.FinishConfiguration }, - { 0x04, ConfigurationPacketTypesOut.KeepAlive }, - { 0x05, ConfigurationPacketTypesOut.Pong }, - { 0x06, ConfigurationPacketTypesOut.ResourcePackResponse }, - { 0x07, ConfigurationPacketTypesOut.KnownDataPacks } - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => configurationTypesIn!; - protected override Dictionary GetConfigurationListOut() => configurationTypesOut!; -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1212.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1212.cs deleted file mode 100644 index e5aa2e63e9..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1212.cs +++ /dev/null @@ -1,243 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes; - -public class PacketPalette1212 : PacketTypePalette -{ - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.Bundle }, // Bundle delimiter - { 0x01, PacketTypesIn.SpawnEntity }, // Add Entity - { 0x02, PacketTypesIn.SpawnExperienceOrb }, // Add Experience Orb - { 0x03, PacketTypesIn.EntityAnimation }, // Animate - { 0x04, PacketTypesIn.Statistics }, // Award Stats - { 0x05, PacketTypesIn.BlockChangedAck }, // Block Changed Ack - { 0x06, PacketTypesIn.BlockBreakAnimation }, // Block Destruction - { 0x07, PacketTypesIn.BlockEntityData }, // Block Entity Data - { 0x08, PacketTypesIn.BlockAction }, // Block Event - { 0x09, PacketTypesIn.BlockChange }, // Block Update - { 0x0A, PacketTypesIn.BossBar }, // Boss Event - { 0x0B, PacketTypesIn.ServerDifficulty }, // Change Difficulty - { 0x0C, PacketTypesIn.ChunkBatchFinished }, // Chunk Batch Finished - { 0x0D, PacketTypesIn.ChunkBatchStarted }, // Chunk Batch Start - { 0x0E, PacketTypesIn.ChunksBiomes }, // Chunks Biomes - { 0x0F, PacketTypesIn.ClearTiles }, // Clear Titles - { 0x10, PacketTypesIn.TabComplete }, // Command Suggestions - { 0x11, PacketTypesIn.DeclareCommands }, // Commands - { 0x12, PacketTypesIn.CloseWindow }, // Container Close - { 0x13, PacketTypesIn.WindowItems }, // Container Set Content - { 0x14, PacketTypesIn.WindowProperty }, // Container Set Data - { 0x15, PacketTypesIn.SetSlot }, // Container Set Slot - { 0x16, PacketTypesIn.CookieRequest }, // Cookie Request - { 0x17, PacketTypesIn.SetCooldown }, // Cooldown - { 0x18, PacketTypesIn.ChatSuggestions }, // Custom Chat Completions - { 0x19, PacketTypesIn.PluginMessage }, // Custom Payload - { 0x1A, PacketTypesIn.DamageEvent }, // Damage Event - { 0x1B, PacketTypesIn.DebugSample }, // Debug Sample - { 0x1C, PacketTypesIn.HideMessage }, // Delete Chat - { 0x1D, PacketTypesIn.Disconnect }, // Disconnect - { 0x1E, PacketTypesIn.ProfilelessChatMessage }, // Disguised Chat - { 0x1F, PacketTypesIn.EntityStatus }, // Entity Event - { 0x20, PacketTypesIn.EntityPositionSync }, // Entity Position Sync (new in 1.21.2) - { 0x21, PacketTypesIn.Explosion }, // Explode - { 0x22, PacketTypesIn.UnloadChunk }, // Forget Level Chunk - { 0x23, PacketTypesIn.ChangeGameState }, // Game Event - { 0x24, PacketTypesIn.OpenHorseWindow }, // Horse Screen Open - { 0x25, PacketTypesIn.HurtAnimation }, // Hurt Animation - { 0x26, PacketTypesIn.InitializeWorldBorder }, // Initialize Border - { 0x27, PacketTypesIn.KeepAlive }, // Keep Alive - { 0x28, PacketTypesIn.ChunkData }, // Level Chunk With Light - { 0x29, PacketTypesIn.Effect }, // Level Event - { 0x2A, PacketTypesIn.Particle }, // Level Particles - { 0x2B, PacketTypesIn.UpdateLight }, // Light Update - { 0x2C, PacketTypesIn.JoinGame }, // Login - { 0x2D, PacketTypesIn.MapData }, // Map Item Data - { 0x2E, PacketTypesIn.TradeList }, // Merchant Offers - { 0x2F, PacketTypesIn.EntityPosition }, // Move Entity Pos - { 0x30, PacketTypesIn.EntityPositionAndRotation }, // Move Entity Pos Rot - { 0x31, PacketTypesIn.MoveMinecartAlongTrack }, // Move Minecart Along Track (new in 1.21.2) - { 0x32, PacketTypesIn.EntityRotation }, // Move Entity Rot - { 0x33, PacketTypesIn.VehicleMove }, // Move Vehicle - { 0x34, PacketTypesIn.OpenBook }, // Open Book - { 0x35, PacketTypesIn.OpenWindow }, // Open Screen - { 0x36, PacketTypesIn.OpenSignEditor }, // Open Sign Editor - { 0x37, PacketTypesIn.Ping }, // Ping - { 0x38, PacketTypesIn.PingResponse }, // Pong Response - { 0x39, PacketTypesIn.CraftRecipeResponse }, // Place Ghost Recipe - { 0x3A, PacketTypesIn.PlayerAbilities }, // Player Abilities - { 0x3B, PacketTypesIn.ChatMessage }, // Player Chat - { 0x3C, PacketTypesIn.EndCombatEvent }, // Player Combat End - { 0x3D, PacketTypesIn.EnterCombatEvent }, // Player Combat Enter - { 0x3E, PacketTypesIn.DeathCombatEvent }, // Player Combat Kill - { 0x3F, PacketTypesIn.PlayerRemove }, // Player Info Remove - { 0x40, PacketTypesIn.PlayerInfo }, // Player Info Update - { 0x41, PacketTypesIn.FacePlayer }, // Player Look At - { 0x42, PacketTypesIn.PlayerPositionAndLook }, // Player Position - { 0x43, PacketTypesIn.PlayerRotation }, // Player Rotation (new in 1.21.2) - { 0x44, PacketTypesIn.RecipeBookAdd }, // Recipe Book Add (new in 1.21.2, replaces UnlockRecipes) - { 0x45, PacketTypesIn.RecipeBookRemove }, // Recipe Book Remove (new in 1.21.2) - { 0x46, PacketTypesIn.RecipeBookSettings }, // Recipe Book Settings (new in 1.21.2) - { 0x47, PacketTypesIn.DestroyEntities }, // Remove Entities - { 0x48, PacketTypesIn.RemoveEntityEffect }, // Remove Mob Effect - { 0x49, PacketTypesIn.ResetScore }, // Reset Score - { 0x4A, PacketTypesIn.RemoveResourcePack }, // Resource Pack Pop - { 0x4B, PacketTypesIn.ResourcePackSend }, // Resource Pack Push - { 0x4C, PacketTypesIn.Respawn }, // Respawn - { 0x4D, PacketTypesIn.EntityHeadLook }, // Rotate Head - { 0x4E, PacketTypesIn.MultiBlockChange }, // Section Blocks Update - { 0x4F, PacketTypesIn.SelectAdvancementTab }, // Select Advancements Tab - { 0x50, PacketTypesIn.ServerData }, // Server Data - { 0x51, PacketTypesIn.ActionBar }, // Set Action Bar Text - { 0x52, PacketTypesIn.WorldBorderCenter }, // Set Border Center - { 0x53, PacketTypesIn.WorldBorderLerpSize }, // Set Border Lerp Size - { 0x54, PacketTypesIn.WorldBorderSize }, // Set Border Size - { 0x55, PacketTypesIn.WorldBorderWarningDelay }, // Set Border Warning Delay - { 0x56, PacketTypesIn.WorldBorderWarningReach }, // Set Border Warning Distance - { 0x57, PacketTypesIn.Camera }, // Set Camera - { 0x58, PacketTypesIn.UpdateViewPosition }, // Set Chunk Cache Center - { 0x59, PacketTypesIn.UpdateViewDistance }, // Set Chunk Cache Radius - { 0x5A, PacketTypesIn.SetCursorItem }, // Set Cursor Item (new in 1.21.2) - { 0x5B, PacketTypesIn.SpawnPosition }, // Set Default Spawn Position - { 0x5C, PacketTypesIn.DisplayScoreboard }, // Set Display Objective - { 0x5D, PacketTypesIn.EntityMetadata }, // Set Entity Data - { 0x5E, PacketTypesIn.AttachEntity }, // Set Entity Link - { 0x5F, PacketTypesIn.EntityVelocity }, // Set Entity Motion - { 0x60, PacketTypesIn.EntityEquipment }, // Set Equipment - { 0x61, PacketTypesIn.SetExperience }, // Set Experience - { 0x62, PacketTypesIn.UpdateHealth }, // Set Health - { 0x63, PacketTypesIn.SetHeldSlot }, // Set Held Slot (new in 1.21.2, replaces HeldItemChange) - { 0x64, PacketTypesIn.ScoreboardObjective }, // Set Objective - { 0x65, PacketTypesIn.SetPassengers }, // Set Passengers - { 0x66, PacketTypesIn.SetPlayerInventory }, // Set Player Inventory (new in 1.21.2) - { 0x67, PacketTypesIn.Teams }, // Set Player Team - { 0x68, PacketTypesIn.UpdateScore }, // Set Score - { 0x69, PacketTypesIn.UpdateSimulationDistance }, // Set Simulation Distance - { 0x6A, PacketTypesIn.SetTitleSubTitle }, // Set Subtitle Text - { 0x6B, PacketTypesIn.TimeUpdate }, // Set Time - { 0x6C, PacketTypesIn.SetTitleText }, // Set Title Text - { 0x6D, PacketTypesIn.SetTitleTime }, // Set Titles Animation - { 0x6E, PacketTypesIn.EntitySoundEffect }, // Sound Entity - { 0x6F, PacketTypesIn.SoundEffect }, // Sound - { 0x70, PacketTypesIn.StartConfiguration }, // Start Configuration - { 0x71, PacketTypesIn.StopSound }, // Stop Sound - { 0x72, PacketTypesIn.StoreCookie }, // Store Cookie - { 0x73, PacketTypesIn.SystemChat }, // System Chat - { 0x74, PacketTypesIn.PlayerListHeaderAndFooter }, // Tab List - { 0x75, PacketTypesIn.NBTQueryResponse }, // Tag Query - { 0x76, PacketTypesIn.CollectItem }, // Take Item Entity - { 0x77, PacketTypesIn.EntityTeleport }, // Teleport Entity - { 0x78, PacketTypesIn.SetTickingState }, // Ticking State - { 0x79, PacketTypesIn.StepTick }, // Ticking Step - { 0x7A, PacketTypesIn.Transfer }, // Transfer - { 0x7B, PacketTypesIn.Advancements }, // Update Advancements - { 0x7C, PacketTypesIn.EntityProperties }, // Update Attributes - { 0x7D, PacketTypesIn.EntityEffect }, // Update Mob Effect - { 0x7E, PacketTypesIn.DeclareRecipes }, // Update Recipes - { 0x7F, PacketTypesIn.Tags }, // Update Tags - { 0x80, PacketTypesIn.ProjectilePower }, // Projectile Power - { 0x81, PacketTypesIn.CustomReportDetails }, // Custom Report Details - { 0x82, PacketTypesIn.ServerLinks } // Server Links - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, // Accept Teleportation - { 0x01, PacketTypesOut.QueryBlockNBT }, // Block Entity Tag Query - { 0x02, PacketTypesOut.BundleItemSelected }, // Bundle Item Selected (new in 1.21.2) - { 0x03, PacketTypesOut.SetDifficulty }, // Change Difficulty - { 0x04, PacketTypesOut.MessageAcknowledgment }, // Chat Ack - { 0x05, PacketTypesOut.ChatCommand }, // Chat Command - { 0x06, PacketTypesOut.SignedChatCommand }, // Chat Command Signed - { 0x07, PacketTypesOut.ChatMessage }, // Chat - { 0x08, PacketTypesOut.PlayerSession }, // Chat Session Update - { 0x09, PacketTypesOut.ChunkBatchReceived }, // Chunk Batch Received - { 0x0A, PacketTypesOut.ClientStatus }, // Client Command - { 0x0B, PacketTypesOut.ClientTickEnd }, // Client Tick End (new in 1.21.2) - { 0x0C, PacketTypesOut.ClientSettings }, // Client Information - { 0x0D, PacketTypesOut.TabComplete }, // Command Suggestion - { 0x0E, PacketTypesOut.AcknowledgeConfiguration }, // Configuration Acknowledged - { 0x0F, PacketTypesOut.ClickWindowButton }, // Container Button Click - { 0x10, PacketTypesOut.ClickWindow }, // Container Click - { 0x11, PacketTypesOut.CloseWindow }, // Container Close - { 0x12, PacketTypesOut.ChangeContainerSlotState }, // Container Slot State Changed - { 0x13, PacketTypesOut.CookieResponse }, // Cookie Response - { 0x14, PacketTypesOut.PluginMessage }, // Custom Payload - { 0x15, PacketTypesOut.DebugSampleSubscription }, // Debug Sample Subscription - { 0x16, PacketTypesOut.EditBook }, // Edit Book - { 0x17, PacketTypesOut.EntityNBTRequest }, // Entity Tag Query - { 0x18, PacketTypesOut.InteractEntity }, // Interact - { 0x19, PacketTypesOut.GenerateStructure }, // Jigsaw Generate - { 0x1A, PacketTypesOut.KeepAlive }, // Keep Alive - { 0x1B, PacketTypesOut.LockDifficulty }, // Lock Difficulty - { 0x1C, PacketTypesOut.PlayerPosition }, // Move Player Pos - { 0x1D, PacketTypesOut.PlayerPositionAndRotation }, // Move Player Pos Rot - { 0x1E, PacketTypesOut.PlayerRotation }, // Move Player Rot - { 0x1F, PacketTypesOut.PlayerMovement }, // Move Player Status Only - { 0x20, PacketTypesOut.VehicleMove }, // Move Vehicle - { 0x21, PacketTypesOut.SteerBoat }, // Paddle Boat - { 0x22, PacketTypesOut.PickItem }, // Pick Item - { 0x23, PacketTypesOut.PingRequest }, // Ping Request - { 0x24, PacketTypesOut.CraftRecipeRequest }, // Place Recipe - { 0x25, PacketTypesOut.PlayerAbilities }, // Player Abilities - { 0x26, PacketTypesOut.PlayerDigging }, // Player Action - { 0x27, PacketTypesOut.EntityAction }, // Player Command - { 0x28, PacketTypesOut.SteerVehicle }, // Player Input - { 0x29, PacketTypesOut.Pong }, // Pong - { 0x2A, PacketTypesOut.SetDisplayedRecipe }, // Recipe Book Change Settings - { 0x2B, PacketTypesOut.SetRecipeBookState }, // Recipe Book Seen Recipe - { 0x2C, PacketTypesOut.NameItem }, // Rename Item - { 0x2D, PacketTypesOut.ResourcePackStatus }, // Resource Pack - { 0x2E, PacketTypesOut.AdvancementTab }, // Seen Advancements - { 0x2F, PacketTypesOut.SelectTrade }, // Select Trade - { 0x30, PacketTypesOut.SetBeaconEffect }, // Set Beacon - { 0x31, PacketTypesOut.HeldItemChange }, // Set Carried Item - { 0x32, PacketTypesOut.UpdateCommandBlock }, // Set Command Block - { 0x33, PacketTypesOut.UpdateCommandBlockMinecart }, // Set Command Minecart - { 0x34, PacketTypesOut.CreativeInventoryAction }, // Set Creative Mode Slot - { 0x35, PacketTypesOut.UpdateJigsawBlock }, // Set Jigsaw Block - { 0x36, PacketTypesOut.UpdateStructureBlock }, // Set Structure Block - { 0x37, PacketTypesOut.UpdateSign }, // Sign Update - { 0x38, PacketTypesOut.Animation }, // Swing - { 0x39, PacketTypesOut.Spectate }, // Teleport To Entity - { 0x3A, PacketTypesOut.PlayerBlockPlacement }, // Use Item On - { 0x3B, PacketTypesOut.UseItem }, // Use Item - }; - - private readonly Dictionary configurationTypesIn = new() - { - { 0x00, ConfigurationPacketTypesIn.CookieRequest }, - { 0x01, ConfigurationPacketTypesIn.PluginMessage }, - { 0x02, ConfigurationPacketTypesIn.Disconnect }, - { 0x03, ConfigurationPacketTypesIn.FinishConfiguration }, - { 0x04, ConfigurationPacketTypesIn.KeepAlive }, - { 0x05, ConfigurationPacketTypesIn.Ping }, - { 0x06, ConfigurationPacketTypesIn.ResetChat }, - { 0x07, ConfigurationPacketTypesIn.RegistryData }, - { 0x08, ConfigurationPacketTypesIn.RemoveResourcePack }, - { 0x09, ConfigurationPacketTypesIn.ResourcePack }, - { 0x0A, ConfigurationPacketTypesIn.StoreCookie }, - { 0x0B, ConfigurationPacketTypesIn.Transfer }, - { 0x0C, ConfigurationPacketTypesIn.FeatureFlags }, - { 0x0D, ConfigurationPacketTypesIn.UpdateTags }, - { 0x0E, ConfigurationPacketTypesIn.KnownDataPacks }, - { 0x0F, ConfigurationPacketTypesIn.CustomReportDetails }, - { 0x10, ConfigurationPacketTypesIn.ServerLinks } - }; - - private readonly Dictionary configurationTypesOut = new() - { - { 0x00, ConfigurationPacketTypesOut.ClientInformation }, - { 0x01, ConfigurationPacketTypesOut.CookieResponse }, - { 0x02, ConfigurationPacketTypesOut.PluginMessage }, - { 0x03, ConfigurationPacketTypesOut.FinishConfiguration }, - { 0x04, ConfigurationPacketTypesOut.KeepAlive }, - { 0x05, ConfigurationPacketTypesOut.Pong }, - { 0x06, ConfigurationPacketTypesOut.ResourcePackResponse }, - { 0x07, ConfigurationPacketTypesOut.KnownDataPacks } - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => configurationTypesIn!; - protected override Dictionary GetConfigurationListOut() => configurationTypesOut!; -} diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1214.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1214.cs deleted file mode 100644 index a7b90eca92..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1214.cs +++ /dev/null @@ -1,245 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes; - -public class PacketPalette1214 : PacketTypePalette -{ - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.Bundle }, // Bundle delimiter - { 0x01, PacketTypesIn.SpawnEntity }, // Add Entity - { 0x02, PacketTypesIn.SpawnExperienceOrb }, // Add Experience Orb - { 0x03, PacketTypesIn.EntityAnimation }, // Animate - { 0x04, PacketTypesIn.Statistics }, // Award Stats - { 0x05, PacketTypesIn.BlockChangedAck }, // Block Changed Ack - { 0x06, PacketTypesIn.BlockBreakAnimation }, // Block Destruction - { 0x07, PacketTypesIn.BlockEntityData }, // Block Entity Data - { 0x08, PacketTypesIn.BlockAction }, // Block Event - { 0x09, PacketTypesIn.BlockChange }, // Block Update - { 0x0A, PacketTypesIn.BossBar }, // Boss Event - { 0x0B, PacketTypesIn.ServerDifficulty }, // Change Difficulty - { 0x0C, PacketTypesIn.ChunkBatchFinished }, // Chunk Batch Finished - { 0x0D, PacketTypesIn.ChunkBatchStarted }, // Chunk Batch Start - { 0x0E, PacketTypesIn.ChunksBiomes }, // Chunks Biomes - { 0x0F, PacketTypesIn.ClearTiles }, // Clear Titles - { 0x10, PacketTypesIn.TabComplete }, // Command Suggestions - { 0x11, PacketTypesIn.DeclareCommands }, // Commands - { 0x12, PacketTypesIn.CloseWindow }, // Container Close - { 0x13, PacketTypesIn.WindowItems }, // Container Set Content - { 0x14, PacketTypesIn.WindowProperty }, // Container Set Data - { 0x15, PacketTypesIn.SetSlot }, // Container Set Slot - { 0x16, PacketTypesIn.CookieRequest }, // Cookie Request - { 0x17, PacketTypesIn.SetCooldown }, // Cooldown - { 0x18, PacketTypesIn.ChatSuggestions }, // Custom Chat Completions - { 0x19, PacketTypesIn.PluginMessage }, // Custom Payload - { 0x1A, PacketTypesIn.DamageEvent }, // Damage Event - { 0x1B, PacketTypesIn.DebugSample }, // Debug Sample - { 0x1C, PacketTypesIn.HideMessage }, // Delete Chat - { 0x1D, PacketTypesIn.Disconnect }, // Disconnect - { 0x1E, PacketTypesIn.ProfilelessChatMessage }, // Disguised Chat - { 0x1F, PacketTypesIn.EntityStatus }, // Entity Event - { 0x20, PacketTypesIn.EntityPositionSync }, // Entity Position Sync (new in 1.21.2) - { 0x21, PacketTypesIn.Explosion }, // Explode - { 0x22, PacketTypesIn.UnloadChunk }, // Forget Level Chunk - { 0x23, PacketTypesIn.ChangeGameState }, // Game Event - { 0x24, PacketTypesIn.OpenHorseWindow }, // Horse Screen Open - { 0x25, PacketTypesIn.HurtAnimation }, // Hurt Animation - { 0x26, PacketTypesIn.InitializeWorldBorder }, // Initialize Border - { 0x27, PacketTypesIn.KeepAlive }, // Keep Alive - { 0x28, PacketTypesIn.ChunkData }, // Level Chunk With Light - { 0x29, PacketTypesIn.Effect }, // Level Event - { 0x2A, PacketTypesIn.Particle }, // Level Particles - { 0x2B, PacketTypesIn.UpdateLight }, // Light Update - { 0x2C, PacketTypesIn.JoinGame }, // Login - { 0x2D, PacketTypesIn.MapData }, // Map Item Data - { 0x2E, PacketTypesIn.TradeList }, // Merchant Offers - { 0x2F, PacketTypesIn.EntityPosition }, // Move Entity Pos - { 0x30, PacketTypesIn.EntityPositionAndRotation }, // Move Entity Pos Rot - { 0x31, PacketTypesIn.MoveMinecartAlongTrack }, // Move Minecart Along Track (new in 1.21.2) - { 0x32, PacketTypesIn.EntityRotation }, // Move Entity Rot - { 0x33, PacketTypesIn.VehicleMove }, // Move Vehicle - { 0x34, PacketTypesIn.OpenBook }, // Open Book - { 0x35, PacketTypesIn.OpenWindow }, // Open Screen - { 0x36, PacketTypesIn.OpenSignEditor }, // Open Sign Editor - { 0x37, PacketTypesIn.Ping }, // Ping - { 0x38, PacketTypesIn.PingResponse }, // Pong Response - { 0x39, PacketTypesIn.CraftRecipeResponse }, // Place Ghost Recipe - { 0x3A, PacketTypesIn.PlayerAbilities }, // Player Abilities - { 0x3B, PacketTypesIn.ChatMessage }, // Player Chat - { 0x3C, PacketTypesIn.EndCombatEvent }, // Player Combat End - { 0x3D, PacketTypesIn.EnterCombatEvent }, // Player Combat Enter - { 0x3E, PacketTypesIn.DeathCombatEvent }, // Player Combat Kill - { 0x3F, PacketTypesIn.PlayerRemove }, // Player Info Remove - { 0x40, PacketTypesIn.PlayerInfo }, // Player Info Update - { 0x41, PacketTypesIn.FacePlayer }, // Player Look At - { 0x42, PacketTypesIn.PlayerPositionAndLook }, // Player Position - { 0x43, PacketTypesIn.PlayerRotation }, // Player Rotation (new in 1.21.2) - { 0x44, PacketTypesIn.RecipeBookAdd }, // Recipe Book Add (new in 1.21.2, replaces UnlockRecipes) - { 0x45, PacketTypesIn.RecipeBookRemove }, // Recipe Book Remove (new in 1.21.2) - { 0x46, PacketTypesIn.RecipeBookSettings }, // Recipe Book Settings (new in 1.21.2) - { 0x47, PacketTypesIn.DestroyEntities }, // Remove Entities - { 0x48, PacketTypesIn.RemoveEntityEffect }, // Remove Mob Effect - { 0x49, PacketTypesIn.ResetScore }, // Reset Score - { 0x4A, PacketTypesIn.RemoveResourcePack }, // Resource Pack Pop - { 0x4B, PacketTypesIn.ResourcePackSend }, // Resource Pack Push - { 0x4C, PacketTypesIn.Respawn }, // Respawn - { 0x4D, PacketTypesIn.EntityHeadLook }, // Rotate Head - { 0x4E, PacketTypesIn.MultiBlockChange }, // Section Blocks Update - { 0x4F, PacketTypesIn.SelectAdvancementTab }, // Select Advancements Tab - { 0x50, PacketTypesIn.ServerData }, // Server Data - { 0x51, PacketTypesIn.ActionBar }, // Set Action Bar Text - { 0x52, PacketTypesIn.WorldBorderCenter }, // Set Border Center - { 0x53, PacketTypesIn.WorldBorderLerpSize }, // Set Border Lerp Size - { 0x54, PacketTypesIn.WorldBorderSize }, // Set Border Size - { 0x55, PacketTypesIn.WorldBorderWarningDelay }, // Set Border Warning Delay - { 0x56, PacketTypesIn.WorldBorderWarningReach }, // Set Border Warning Distance - { 0x57, PacketTypesIn.Camera }, // Set Camera - { 0x58, PacketTypesIn.UpdateViewPosition }, // Set Chunk Cache Center - { 0x59, PacketTypesIn.UpdateViewDistance }, // Set Chunk Cache Radius - { 0x5A, PacketTypesIn.SetCursorItem }, // Set Cursor Item (new in 1.21.2) - { 0x5B, PacketTypesIn.SpawnPosition }, // Set Default Spawn Position - { 0x5C, PacketTypesIn.DisplayScoreboard }, // Set Display Objective - { 0x5D, PacketTypesIn.EntityMetadata }, // Set Entity Data - { 0x5E, PacketTypesIn.AttachEntity }, // Set Entity Link - { 0x5F, PacketTypesIn.EntityVelocity }, // Set Entity Motion - { 0x60, PacketTypesIn.EntityEquipment }, // Set Equipment - { 0x61, PacketTypesIn.SetExperience }, // Set Experience - { 0x62, PacketTypesIn.UpdateHealth }, // Set Health - { 0x63, PacketTypesIn.SetHeldSlot }, // Set Held Slot (new in 1.21.2, replaces HeldItemChange) - { 0x64, PacketTypesIn.ScoreboardObjective }, // Set Objective - { 0x65, PacketTypesIn.SetPassengers }, // Set Passengers - { 0x66, PacketTypesIn.SetPlayerInventory }, // Set Player Inventory (new in 1.21.2) - { 0x67, PacketTypesIn.Teams }, // Set Player Team - { 0x68, PacketTypesIn.UpdateScore }, // Set Score - { 0x69, PacketTypesIn.UpdateSimulationDistance }, // Set Simulation Distance - { 0x6A, PacketTypesIn.SetTitleSubTitle }, // Set Subtitle Text - { 0x6B, PacketTypesIn.TimeUpdate }, // Set Time - { 0x6C, PacketTypesIn.SetTitleText }, // Set Title Text - { 0x6D, PacketTypesIn.SetTitleTime }, // Set Titles Animation - { 0x6E, PacketTypesIn.EntitySoundEffect }, // Sound Entity - { 0x6F, PacketTypesIn.SoundEffect }, // Sound - { 0x70, PacketTypesIn.StartConfiguration }, // Start Configuration - { 0x71, PacketTypesIn.StopSound }, // Stop Sound - { 0x72, PacketTypesIn.StoreCookie }, // Store Cookie - { 0x73, PacketTypesIn.SystemChat }, // System Chat - { 0x74, PacketTypesIn.PlayerListHeaderAndFooter }, // Tab List - { 0x75, PacketTypesIn.NBTQueryResponse }, // Tag Query - { 0x76, PacketTypesIn.CollectItem }, // Take Item Entity - { 0x77, PacketTypesIn.EntityTeleport }, // Teleport Entity - { 0x78, PacketTypesIn.SetTickingState }, // Ticking State - { 0x79, PacketTypesIn.StepTick }, // Ticking Step - { 0x7A, PacketTypesIn.Transfer }, // Transfer - { 0x7B, PacketTypesIn.Advancements }, // Update Advancements - { 0x7C, PacketTypesIn.EntityProperties }, // Update Attributes - { 0x7D, PacketTypesIn.EntityEffect }, // Update Mob Effect - { 0x7E, PacketTypesIn.DeclareRecipes }, // Update Recipes - { 0x7F, PacketTypesIn.Tags }, // Update Tags - { 0x80, PacketTypesIn.ProjectilePower }, // Projectile Power - { 0x81, PacketTypesIn.CustomReportDetails }, // Custom Report Details - { 0x82, PacketTypesIn.ServerLinks } // Server Links - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, // Accept Teleportation - { 0x01, PacketTypesOut.QueryBlockNBT }, // Block Entity Tag Query - { 0x02, PacketTypesOut.BundleItemSelected }, // Bundle Item Selected - { 0x03, PacketTypesOut.SetDifficulty }, // Change Difficulty - { 0x04, PacketTypesOut.MessageAcknowledgment }, // Chat Ack - { 0x05, PacketTypesOut.ChatCommand }, // Chat Command - { 0x06, PacketTypesOut.SignedChatCommand }, // Chat Command Signed - { 0x07, PacketTypesOut.ChatMessage }, // Chat - { 0x08, PacketTypesOut.PlayerSession }, // Chat Session Update - { 0x09, PacketTypesOut.ChunkBatchReceived }, // Chunk Batch Received - { 0x0A, PacketTypesOut.ClientStatus }, // Client Command - { 0x0B, PacketTypesOut.ClientTickEnd }, // Client Tick End - { 0x0C, PacketTypesOut.ClientSettings }, // Client Information - { 0x0D, PacketTypesOut.TabComplete }, // Command Suggestion - { 0x0E, PacketTypesOut.AcknowledgeConfiguration }, // Configuration Acknowledged - { 0x0F, PacketTypesOut.ClickWindowButton }, // Container Button Click - { 0x10, PacketTypesOut.ClickWindow }, // Container Click - { 0x11, PacketTypesOut.CloseWindow }, // Container Close - { 0x12, PacketTypesOut.ChangeContainerSlotState }, // Container Slot State Changed - { 0x13, PacketTypesOut.CookieResponse }, // Cookie Response - { 0x14, PacketTypesOut.PluginMessage }, // Custom Payload - { 0x15, PacketTypesOut.DebugSampleSubscription }, // Debug Sample Subscription - { 0x16, PacketTypesOut.EditBook }, // Edit Book - { 0x17, PacketTypesOut.EntityNBTRequest }, // Entity Tag Query - { 0x18, PacketTypesOut.InteractEntity }, // Interact - { 0x19, PacketTypesOut.GenerateStructure }, // Jigsaw Generate - { 0x1A, PacketTypesOut.KeepAlive }, // Keep Alive - { 0x1B, PacketTypesOut.LockDifficulty }, // Lock Difficulty - { 0x1C, PacketTypesOut.PlayerPosition }, // Move Player Pos - { 0x1D, PacketTypesOut.PlayerPositionAndRotation }, // Move Player Pos Rot - { 0x1E, PacketTypesOut.PlayerRotation }, // Move Player Rot - { 0x1F, PacketTypesOut.PlayerMovement }, // Move Player Status Only - { 0x20, PacketTypesOut.VehicleMove }, // Move Vehicle - { 0x21, PacketTypesOut.SteerBoat }, // Paddle Boat - { 0x22, PacketTypesOut.PickItem }, // Pick Item From Block (split in 1.21.4) - { 0x23, PacketTypesOut.PickItemFromEntity }, // Pick Item From Entity (new in 1.21.4) - { 0x24, PacketTypesOut.PingRequest }, // Ping Request - { 0x25, PacketTypesOut.CraftRecipeRequest }, // Place Recipe - { 0x26, PacketTypesOut.PlayerAbilities }, // Player Abilities - { 0x27, PacketTypesOut.PlayerDigging }, // Player Action - { 0x28, PacketTypesOut.EntityAction }, // Player Command - { 0x29, PacketTypesOut.SteerVehicle }, // Player Input - { 0x2A, PacketTypesOut.PlayerLoaded }, // Player Loaded (new in 1.21.4) - { 0x2B, PacketTypesOut.Pong }, // Pong - { 0x2C, PacketTypesOut.SetDisplayedRecipe }, // Recipe Book Change Settings - { 0x2D, PacketTypesOut.SetRecipeBookState }, // Recipe Book Seen Recipe - { 0x2E, PacketTypesOut.NameItem }, // Rename Item - { 0x2F, PacketTypesOut.ResourcePackStatus }, // Resource Pack - { 0x30, PacketTypesOut.AdvancementTab }, // Seen Advancements - { 0x31, PacketTypesOut.SelectTrade }, // Select Trade - { 0x32, PacketTypesOut.SetBeaconEffect }, // Set Beacon - { 0x33, PacketTypesOut.HeldItemChange }, // Set Carried Item - { 0x34, PacketTypesOut.UpdateCommandBlock }, // Set Command Block - { 0x35, PacketTypesOut.UpdateCommandBlockMinecart }, // Set Command Minecart - { 0x36, PacketTypesOut.CreativeInventoryAction }, // Set Creative Mode Slot - { 0x37, PacketTypesOut.UpdateJigsawBlock }, // Set Jigsaw Block - { 0x38, PacketTypesOut.UpdateStructureBlock }, // Set Structure Block - { 0x39, PacketTypesOut.UpdateSign }, // Sign Update - { 0x3A, PacketTypesOut.Animation }, // Swing - { 0x3B, PacketTypesOut.Spectate }, // Teleport To Entity - { 0x3C, PacketTypesOut.PlayerBlockPlacement }, // Use Item On - { 0x3D, PacketTypesOut.UseItem }, // Use Item - }; - - private readonly Dictionary configurationTypesIn = new() - { - { 0x00, ConfigurationPacketTypesIn.CookieRequest }, - { 0x01, ConfigurationPacketTypesIn.PluginMessage }, - { 0x02, ConfigurationPacketTypesIn.Disconnect }, - { 0x03, ConfigurationPacketTypesIn.FinishConfiguration }, - { 0x04, ConfigurationPacketTypesIn.KeepAlive }, - { 0x05, ConfigurationPacketTypesIn.Ping }, - { 0x06, ConfigurationPacketTypesIn.ResetChat }, - { 0x07, ConfigurationPacketTypesIn.RegistryData }, - { 0x08, ConfigurationPacketTypesIn.RemoveResourcePack }, - { 0x09, ConfigurationPacketTypesIn.ResourcePack }, - { 0x0A, ConfigurationPacketTypesIn.StoreCookie }, - { 0x0B, ConfigurationPacketTypesIn.Transfer }, - { 0x0C, ConfigurationPacketTypesIn.FeatureFlags }, - { 0x0D, ConfigurationPacketTypesIn.UpdateTags }, - { 0x0E, ConfigurationPacketTypesIn.KnownDataPacks }, - { 0x0F, ConfigurationPacketTypesIn.CustomReportDetails }, - { 0x10, ConfigurationPacketTypesIn.ServerLinks } - }; - - private readonly Dictionary configurationTypesOut = new() - { - { 0x00, ConfigurationPacketTypesOut.ClientInformation }, - { 0x01, ConfigurationPacketTypesOut.CookieResponse }, - { 0x02, ConfigurationPacketTypesOut.PluginMessage }, - { 0x03, ConfigurationPacketTypesOut.FinishConfiguration }, - { 0x04, ConfigurationPacketTypesOut.KeepAlive }, - { 0x05, ConfigurationPacketTypesOut.Pong }, - { 0x06, ConfigurationPacketTypesOut.ResourcePackResponse }, - { 0x07, ConfigurationPacketTypesOut.KnownDataPacks } - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => configurationTypesIn!; - protected override Dictionary GetConfigurationListOut() => configurationTypesOut!; -} diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1215.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1215.cs deleted file mode 100644 index 0e8f7a9384..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1215.cs +++ /dev/null @@ -1,247 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes; - -public class PacketPalette1215 : PacketTypePalette -{ - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.Bundle }, // Bundle delimiter - { 0x01, PacketTypesIn.SpawnEntity }, // Add Entity - { 0x02, PacketTypesIn.EntityAnimation }, // Animate (was 0x03 in 1.21.4; AddExperienceOrb removed) - { 0x03, PacketTypesIn.Statistics }, // Award Stats - { 0x04, PacketTypesIn.BlockChangedAck }, // Block Changed Ack - { 0x05, PacketTypesIn.BlockBreakAnimation }, // Block Destruction - { 0x06, PacketTypesIn.BlockEntityData }, // Block Entity Data - { 0x07, PacketTypesIn.BlockAction }, // Block Event - { 0x08, PacketTypesIn.BlockChange }, // Block Update - { 0x09, PacketTypesIn.BossBar }, // Boss Event - { 0x0A, PacketTypesIn.ServerDifficulty }, // Change Difficulty - { 0x0B, PacketTypesIn.ChunkBatchFinished }, // Chunk Batch Finished - { 0x0C, PacketTypesIn.ChunkBatchStarted }, // Chunk Batch Start - { 0x0D, PacketTypesIn.ChunksBiomes }, // Chunks Biomes - { 0x0E, PacketTypesIn.ClearTiles }, // Clear Titles - { 0x0F, PacketTypesIn.TabComplete }, // Command Suggestions - { 0x10, PacketTypesIn.DeclareCommands }, // Commands - { 0x11, PacketTypesIn.CloseWindow }, // Container Close - { 0x12, PacketTypesIn.WindowItems }, // Container Set Content - { 0x13, PacketTypesIn.WindowProperty }, // Container Set Data - { 0x14, PacketTypesIn.SetSlot }, // Container Set Slot - { 0x15, PacketTypesIn.CookieRequest }, // Cookie Request - { 0x16, PacketTypesIn.SetCooldown }, // Cooldown - { 0x17, PacketTypesIn.ChatSuggestions }, // Custom Chat Completions - { 0x18, PacketTypesIn.PluginMessage }, // Custom Payload - { 0x19, PacketTypesIn.DamageEvent }, // Damage Event - { 0x1A, PacketTypesIn.DebugSample }, // Debug Sample - { 0x1B, PacketTypesIn.HideMessage }, // Delete Chat - { 0x1C, PacketTypesIn.Disconnect }, // Disconnect - { 0x1D, PacketTypesIn.ProfilelessChatMessage }, // Disguised Chat - { 0x1E, PacketTypesIn.EntityStatus }, // Entity Event - { 0x1F, PacketTypesIn.EntityPositionSync }, // Entity Position Sync - { 0x20, PacketTypesIn.Explosion }, // Explode - { 0x21, PacketTypesIn.UnloadChunk }, // Forget Level Chunk - { 0x22, PacketTypesIn.ChangeGameState }, // Game Event - { 0x23, PacketTypesIn.OpenHorseWindow }, // Horse Screen Open - { 0x24, PacketTypesIn.HurtAnimation }, // Hurt Animation - { 0x25, PacketTypesIn.InitializeWorldBorder }, // Initialize Border - { 0x26, PacketTypesIn.KeepAlive }, // Keep Alive - { 0x27, PacketTypesIn.ChunkData }, // Level Chunk With Light - { 0x28, PacketTypesIn.Effect }, // Level Event - { 0x29, PacketTypesIn.Particle }, // Level Particles - { 0x2A, PacketTypesIn.UpdateLight }, // Light Update - { 0x2B, PacketTypesIn.JoinGame }, // Login - { 0x2C, PacketTypesIn.MapData }, // Map Item Data - { 0x2D, PacketTypesIn.TradeList }, // Merchant Offers - { 0x2E, PacketTypesIn.EntityPosition }, // Move Entity Pos - { 0x2F, PacketTypesIn.EntityPositionAndRotation }, // Move Entity Pos Rot - { 0x30, PacketTypesIn.MoveMinecartAlongTrack }, // Move Minecart Along Track - { 0x31, PacketTypesIn.EntityRotation }, // Move Entity Rot - { 0x32, PacketTypesIn.VehicleMove }, // Move Vehicle - { 0x33, PacketTypesIn.OpenBook }, // Open Book - { 0x34, PacketTypesIn.OpenWindow }, // Open Screen - { 0x35, PacketTypesIn.OpenSignEditor }, // Open Sign Editor - { 0x36, PacketTypesIn.Ping }, // Ping - { 0x37, PacketTypesIn.PingResponse }, // Pong Response - { 0x38, PacketTypesIn.CraftRecipeResponse }, // Place Ghost Recipe - { 0x39, PacketTypesIn.PlayerAbilities }, // Player Abilities - { 0x3A, PacketTypesIn.ChatMessage }, // Player Chat - { 0x3B, PacketTypesIn.EndCombatEvent }, // Player Combat End - { 0x3C, PacketTypesIn.EnterCombatEvent }, // Player Combat Enter - { 0x3D, PacketTypesIn.DeathCombatEvent }, // Player Combat Kill - { 0x3E, PacketTypesIn.PlayerRemove }, // Player Info Remove - { 0x3F, PacketTypesIn.PlayerInfo }, // Player Info Update - { 0x40, PacketTypesIn.FacePlayer }, // Player Look At - { 0x41, PacketTypesIn.PlayerPositionAndLook }, // Player Position - { 0x42, PacketTypesIn.PlayerRotation }, // Player Rotation - { 0x43, PacketTypesIn.RecipeBookAdd }, // Recipe Book Add - { 0x44, PacketTypesIn.RecipeBookRemove }, // Recipe Book Remove - { 0x45, PacketTypesIn.RecipeBookSettings }, // Recipe Book Settings - { 0x46, PacketTypesIn.DestroyEntities }, // Remove Entities - { 0x47, PacketTypesIn.RemoveEntityEffect }, // Remove Mob Effect - { 0x48, PacketTypesIn.ResetScore }, // Reset Score - { 0x49, PacketTypesIn.RemoveResourcePack }, // Resource Pack Pop - { 0x4A, PacketTypesIn.ResourcePackSend }, // Resource Pack Push - { 0x4B, PacketTypesIn.Respawn }, // Respawn - { 0x4C, PacketTypesIn.EntityHeadLook }, // Rotate Head - { 0x4D, PacketTypesIn.MultiBlockChange }, // Section Blocks Update - { 0x4E, PacketTypesIn.SelectAdvancementTab }, // Select Advancements Tab - { 0x4F, PacketTypesIn.ServerData }, // Server Data - { 0x50, PacketTypesIn.ActionBar }, // Set Action Bar Text - { 0x51, PacketTypesIn.WorldBorderCenter }, // Set Border Center - { 0x52, PacketTypesIn.WorldBorderLerpSize }, // Set Border Lerp Size - { 0x53, PacketTypesIn.WorldBorderSize }, // Set Border Size - { 0x54, PacketTypesIn.WorldBorderWarningDelay }, // Set Border Warning Delay - { 0x55, PacketTypesIn.WorldBorderWarningReach }, // Set Border Warning Distance - { 0x56, PacketTypesIn.Camera }, // Set Camera - { 0x57, PacketTypesIn.UpdateViewPosition }, // Set Chunk Cache Center - { 0x58, PacketTypesIn.UpdateViewDistance }, // Set Chunk Cache Radius - { 0x59, PacketTypesIn.SetCursorItem }, // Set Cursor Item - { 0x5A, PacketTypesIn.SpawnPosition }, // Set Default Spawn Position - { 0x5B, PacketTypesIn.DisplayScoreboard }, // Set Display Objective - { 0x5C, PacketTypesIn.EntityMetadata }, // Set Entity Data - { 0x5D, PacketTypesIn.AttachEntity }, // Set Entity Link - { 0x5E, PacketTypesIn.EntityVelocity }, // Set Entity Motion - { 0x5F, PacketTypesIn.EntityEquipment }, // Set Equipment - { 0x60, PacketTypesIn.SetExperience }, // Set Experience - { 0x61, PacketTypesIn.UpdateHealth }, // Set Health - { 0x62, PacketTypesIn.SetHeldSlot }, // Set Held Slot - { 0x63, PacketTypesIn.ScoreboardObjective }, // Set Objective - { 0x64, PacketTypesIn.SetPassengers }, // Set Passengers - { 0x65, PacketTypesIn.SetPlayerInventory }, // Set Player Inventory - { 0x66, PacketTypesIn.Teams }, // Set Player Team - { 0x67, PacketTypesIn.UpdateScore }, // Set Score - { 0x68, PacketTypesIn.UpdateSimulationDistance }, // Set Simulation Distance - { 0x69, PacketTypesIn.SetTitleSubTitle }, // Set Subtitle Text - { 0x6A, PacketTypesIn.TimeUpdate }, // Set Time - { 0x6B, PacketTypesIn.SetTitleText }, // Set Title Text - { 0x6C, PacketTypesIn.SetTitleTime }, // Set Titles Animation - { 0x6D, PacketTypesIn.EntitySoundEffect }, // Sound Entity - { 0x6E, PacketTypesIn.SoundEffect }, // Sound - { 0x6F, PacketTypesIn.StartConfiguration }, // Start Configuration - { 0x70, PacketTypesIn.StopSound }, // Stop Sound - { 0x71, PacketTypesIn.StoreCookie }, // Store Cookie - { 0x72, PacketTypesIn.SystemChat }, // System Chat - { 0x73, PacketTypesIn.PlayerListHeaderAndFooter }, // Tab List - { 0x74, PacketTypesIn.NBTQueryResponse }, // Tag Query - { 0x75, PacketTypesIn.CollectItem }, // Take Item Entity - { 0x76, PacketTypesIn.EntityTeleport }, // Teleport Entity - { 0x77, PacketTypesIn.TestInstanceBlockStatus }, // Test Instance Block Status (new in 1.21.5) - { 0x78, PacketTypesIn.SetTickingState }, // Ticking State - { 0x79, PacketTypesIn.StepTick }, // Ticking Step - { 0x7A, PacketTypesIn.Transfer }, // Transfer - { 0x7B, PacketTypesIn.Advancements }, // Update Advancements - { 0x7C, PacketTypesIn.EntityProperties }, // Update Attributes - { 0x7D, PacketTypesIn.EntityEffect }, // Update Mob Effect - { 0x7E, PacketTypesIn.DeclareRecipes }, // Update Recipes - { 0x7F, PacketTypesIn.Tags }, // Update Tags - { 0x80, PacketTypesIn.ProjectilePower }, // Projectile Power - { 0x81, PacketTypesIn.CustomReportDetails }, // Custom Report Details - { 0x82, PacketTypesIn.ServerLinks } // Server Links - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, // Accept Teleportation - { 0x01, PacketTypesOut.QueryBlockNBT }, // Block Entity Tag Query - { 0x02, PacketTypesOut.BundleItemSelected }, // Bundle Item Selected - { 0x03, PacketTypesOut.SetDifficulty }, // Change Difficulty - { 0x04, PacketTypesOut.MessageAcknowledgment }, // Chat Ack - { 0x05, PacketTypesOut.ChatCommand }, // Chat Command - { 0x06, PacketTypesOut.SignedChatCommand }, // Chat Command Signed - { 0x07, PacketTypesOut.ChatMessage }, // Chat - { 0x08, PacketTypesOut.PlayerSession }, // Chat Session Update - { 0x09, PacketTypesOut.ChunkBatchReceived }, // Chunk Batch Received - { 0x0A, PacketTypesOut.ClientStatus }, // Client Command - { 0x0B, PacketTypesOut.ClientTickEnd }, // Client Tick End - { 0x0C, PacketTypesOut.ClientSettings }, // Client Information - { 0x0D, PacketTypesOut.TabComplete }, // Command Suggestion - { 0x0E, PacketTypesOut.AcknowledgeConfiguration }, // Configuration Acknowledged - { 0x0F, PacketTypesOut.ClickWindowButton }, // Container Button Click - { 0x10, PacketTypesOut.ClickWindow }, // Container Click - { 0x11, PacketTypesOut.CloseWindow }, // Container Close - { 0x12, PacketTypesOut.ChangeContainerSlotState }, // Container Slot State Changed - { 0x13, PacketTypesOut.CookieResponse }, // Cookie Response - { 0x14, PacketTypesOut.PluginMessage }, // Custom Payload - { 0x15, PacketTypesOut.DebugSampleSubscription }, // Debug Sample Subscription - { 0x16, PacketTypesOut.EditBook }, // Edit Book - { 0x17, PacketTypesOut.EntityNBTRequest }, // Entity Tag Query - { 0x18, PacketTypesOut.InteractEntity }, // Interact - { 0x19, PacketTypesOut.GenerateStructure }, // Jigsaw Generate - { 0x1A, PacketTypesOut.KeepAlive }, // Keep Alive - { 0x1B, PacketTypesOut.LockDifficulty }, // Lock Difficulty - { 0x1C, PacketTypesOut.PlayerPosition }, // Move Player Pos - { 0x1D, PacketTypesOut.PlayerPositionAndRotation }, // Move Player Pos Rot - { 0x1E, PacketTypesOut.PlayerRotation }, // Move Player Rot - { 0x1F, PacketTypesOut.PlayerMovement }, // Move Player Status Only - { 0x20, PacketTypesOut.VehicleMove }, // Move Vehicle - { 0x21, PacketTypesOut.SteerBoat }, // Paddle Boat - { 0x22, PacketTypesOut.PickItem }, // Pick Item From Block - { 0x23, PacketTypesOut.PickItemFromEntity }, // Pick Item From Entity - { 0x24, PacketTypesOut.PingRequest }, // Ping Request - { 0x25, PacketTypesOut.CraftRecipeRequest }, // Place Recipe - { 0x26, PacketTypesOut.PlayerAbilities }, // Player Abilities - { 0x27, PacketTypesOut.PlayerDigging }, // Player Action - { 0x28, PacketTypesOut.EntityAction }, // Player Command - { 0x29, PacketTypesOut.SteerVehicle }, // Player Input - { 0x2A, PacketTypesOut.PlayerLoaded }, // Player Loaded - { 0x2B, PacketTypesOut.Pong }, // Pong - { 0x2C, PacketTypesOut.SetDisplayedRecipe }, // Recipe Book Change Settings - { 0x2D, PacketTypesOut.SetRecipeBookState }, // Recipe Book Seen Recipe - { 0x2E, PacketTypesOut.NameItem }, // Rename Item - { 0x2F, PacketTypesOut.ResourcePackStatus }, // Resource Pack - { 0x30, PacketTypesOut.AdvancementTab }, // Seen Advancements - { 0x31, PacketTypesOut.SelectTrade }, // Select Trade - { 0x32, PacketTypesOut.SetBeaconEffect }, // Set Beacon - { 0x33, PacketTypesOut.HeldItemChange }, // Set Carried Item - { 0x34, PacketTypesOut.UpdateCommandBlock }, // Set Command Block - { 0x35, PacketTypesOut.UpdateCommandBlockMinecart }, // Set Command Minecart - { 0x36, PacketTypesOut.CreativeInventoryAction }, // Set Creative Mode Slot - { 0x37, PacketTypesOut.UpdateJigsawBlock }, // Set Jigsaw Block - { 0x38, PacketTypesOut.UpdateStructureBlock }, // Set Structure Block - { 0x39, PacketTypesOut.SetTestBlock }, // Set Test Block (new in 1.21.5) - { 0x3A, PacketTypesOut.UpdateSign }, // Sign Update - { 0x3B, PacketTypesOut.Animation }, // Swing - { 0x3C, PacketTypesOut.Spectate }, // Teleport To Entity - { 0x3D, PacketTypesOut.TestInstanceBlockAction }, // Test Instance Block Action (new in 1.21.5) - { 0x3E, PacketTypesOut.PlayerBlockPlacement }, // Use Item On - { 0x3F, PacketTypesOut.UseItem }, // Use Item - }; - - private readonly Dictionary configurationTypesIn = new() - { - { 0x00, ConfigurationPacketTypesIn.CookieRequest }, - { 0x01, ConfigurationPacketTypesIn.PluginMessage }, - { 0x02, ConfigurationPacketTypesIn.Disconnect }, - { 0x03, ConfigurationPacketTypesIn.FinishConfiguration }, - { 0x04, ConfigurationPacketTypesIn.KeepAlive }, - { 0x05, ConfigurationPacketTypesIn.Ping }, - { 0x06, ConfigurationPacketTypesIn.ResetChat }, - { 0x07, ConfigurationPacketTypesIn.RegistryData }, - { 0x08, ConfigurationPacketTypesIn.RemoveResourcePack }, - { 0x09, ConfigurationPacketTypesIn.ResourcePack }, - { 0x0A, ConfigurationPacketTypesIn.StoreCookie }, - { 0x0B, ConfigurationPacketTypesIn.Transfer }, - { 0x0C, ConfigurationPacketTypesIn.FeatureFlags }, - { 0x0D, ConfigurationPacketTypesIn.UpdateTags }, - { 0x0E, ConfigurationPacketTypesIn.KnownDataPacks }, - { 0x0F, ConfigurationPacketTypesIn.CustomReportDetails }, - { 0x10, ConfigurationPacketTypesIn.ServerLinks } - }; - - private readonly Dictionary configurationTypesOut = new() - { - { 0x00, ConfigurationPacketTypesOut.ClientInformation }, - { 0x01, ConfigurationPacketTypesOut.CookieResponse }, - { 0x02, ConfigurationPacketTypesOut.PluginMessage }, - { 0x03, ConfigurationPacketTypesOut.FinishConfiguration }, - { 0x04, ConfigurationPacketTypesOut.KeepAlive }, - { 0x05, ConfigurationPacketTypesOut.Pong }, - { 0x06, ConfigurationPacketTypesOut.ResourcePackResponse }, - { 0x07, ConfigurationPacketTypesOut.KnownDataPacks } - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => configurationTypesIn!; - protected override Dictionary GetConfigurationListOut() => configurationTypesOut!; -} diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1216.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1216.cs deleted file mode 100644 index 3f1520f76d..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1216.cs +++ /dev/null @@ -1,255 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes; - -public class PacketPalette1216 : PacketTypePalette -{ - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.Bundle }, // Bundle delimiter - { 0x01, PacketTypesIn.SpawnEntity }, // Add Entity - { 0x02, PacketTypesIn.EntityAnimation }, // Animate - { 0x03, PacketTypesIn.Statistics }, // Award Stats - { 0x04, PacketTypesIn.BlockChangedAck }, // Block Changed Ack - { 0x05, PacketTypesIn.BlockBreakAnimation }, // Block Destruction - { 0x06, PacketTypesIn.BlockEntityData }, // Block Entity Data - { 0x07, PacketTypesIn.BlockAction }, // Block Event - { 0x08, PacketTypesIn.BlockChange }, // Block Update - { 0x09, PacketTypesIn.BossBar }, // Boss Event - { 0x0A, PacketTypesIn.ServerDifficulty }, // Change Difficulty - { 0x0B, PacketTypesIn.ChunkBatchFinished }, // Chunk Batch Finished - { 0x0C, PacketTypesIn.ChunkBatchStarted }, // Chunk Batch Start - { 0x0D, PacketTypesIn.ChunksBiomes }, // Chunks Biomes - { 0x0E, PacketTypesIn.ClearTiles }, // Clear Titles - { 0x0F, PacketTypesIn.TabComplete }, // Command Suggestions - { 0x10, PacketTypesIn.DeclareCommands }, // Commands - { 0x11, PacketTypesIn.CloseWindow }, // Container Close - { 0x12, PacketTypesIn.WindowItems }, // Container Set Content - { 0x13, PacketTypesIn.WindowProperty }, // Container Set Data - { 0x14, PacketTypesIn.SetSlot }, // Container Set Slot - { 0x15, PacketTypesIn.CookieRequest }, // Cookie Request - { 0x16, PacketTypesIn.SetCooldown }, // Cooldown - { 0x17, PacketTypesIn.ChatSuggestions }, // Custom Chat Completions - { 0x18, PacketTypesIn.PluginMessage }, // Custom Payload - { 0x19, PacketTypesIn.DamageEvent }, // Damage Event - { 0x1A, PacketTypesIn.DebugSample }, // Debug Sample - { 0x1B, PacketTypesIn.HideMessage }, // Delete Chat - { 0x1C, PacketTypesIn.Disconnect }, // Disconnect - { 0x1D, PacketTypesIn.ProfilelessChatMessage }, // Disguised Chat - { 0x1E, PacketTypesIn.EntityStatus }, // Entity Event - { 0x1F, PacketTypesIn.EntityPositionSync }, // Entity Position Sync - { 0x20, PacketTypesIn.Explosion }, // Explode - { 0x21, PacketTypesIn.UnloadChunk }, // Forget Level Chunk - { 0x22, PacketTypesIn.ChangeGameState }, // Game Event - { 0x23, PacketTypesIn.OpenHorseWindow }, // Horse Screen Open - { 0x24, PacketTypesIn.HurtAnimation }, // Hurt Animation - { 0x25, PacketTypesIn.InitializeWorldBorder }, // Initialize Border - { 0x26, PacketTypesIn.KeepAlive }, // Keep Alive - { 0x27, PacketTypesIn.ChunkData }, // Level Chunk With Light - { 0x28, PacketTypesIn.Effect }, // Level Event - { 0x29, PacketTypesIn.Particle }, // Level Particles - { 0x2A, PacketTypesIn.UpdateLight }, // Light Update - { 0x2B, PacketTypesIn.JoinGame }, // Login - { 0x2C, PacketTypesIn.MapData }, // Map Item Data - { 0x2D, PacketTypesIn.TradeList }, // Merchant Offers - { 0x2E, PacketTypesIn.EntityPosition }, // Move Entity Pos - { 0x2F, PacketTypesIn.EntityPositionAndRotation }, // Move Entity Pos Rot - { 0x30, PacketTypesIn.MoveMinecartAlongTrack }, // Move Minecart Along Track - { 0x31, PacketTypesIn.EntityRotation }, // Move Entity Rot - { 0x32, PacketTypesIn.VehicleMove }, // Move Vehicle - { 0x33, PacketTypesIn.OpenBook }, // Open Book - { 0x34, PacketTypesIn.OpenWindow }, // Open Screen - { 0x35, PacketTypesIn.OpenSignEditor }, // Open Sign Editor - { 0x36, PacketTypesIn.Ping }, // Ping - { 0x37, PacketTypesIn.PingResponse }, // Pong Response - { 0x38, PacketTypesIn.CraftRecipeResponse }, // Place Ghost Recipe - { 0x39, PacketTypesIn.PlayerAbilities }, // Player Abilities - { 0x3A, PacketTypesIn.ChatMessage }, // Player Chat - { 0x3B, PacketTypesIn.EndCombatEvent }, // Player Combat End - { 0x3C, PacketTypesIn.EnterCombatEvent }, // Player Combat Enter - { 0x3D, PacketTypesIn.DeathCombatEvent }, // Player Combat Kill - { 0x3E, PacketTypesIn.PlayerRemove }, // Player Info Remove - { 0x3F, PacketTypesIn.PlayerInfo }, // Player Info Update - { 0x40, PacketTypesIn.FacePlayer }, // Player Look At - { 0x41, PacketTypesIn.PlayerPositionAndLook }, // Player Position - { 0x42, PacketTypesIn.PlayerRotation }, // Player Rotation - { 0x43, PacketTypesIn.RecipeBookAdd }, // Recipe Book Add - { 0x44, PacketTypesIn.RecipeBookRemove }, // Recipe Book Remove - { 0x45, PacketTypesIn.RecipeBookSettings }, // Recipe Book Settings - { 0x46, PacketTypesIn.DestroyEntities }, // Remove Entities - { 0x47, PacketTypesIn.RemoveEntityEffect }, // Remove Mob Effect - { 0x48, PacketTypesIn.ResetScore }, // Reset Score - { 0x49, PacketTypesIn.RemoveResourcePack }, // Resource Pack Pop - { 0x4A, PacketTypesIn.ResourcePackSend }, // Resource Pack Push - { 0x4B, PacketTypesIn.Respawn }, // Respawn - { 0x4C, PacketTypesIn.EntityHeadLook }, // Rotate Head - { 0x4D, PacketTypesIn.MultiBlockChange }, // Section Blocks Update - { 0x4E, PacketTypesIn.SelectAdvancementTab }, // Select Advancements Tab - { 0x4F, PacketTypesIn.ServerData }, // Server Data - { 0x50, PacketTypesIn.ActionBar }, // Set Action Bar Text - { 0x51, PacketTypesIn.WorldBorderCenter }, // Set Border Center - { 0x52, PacketTypesIn.WorldBorderLerpSize }, // Set Border Lerp Size - { 0x53, PacketTypesIn.WorldBorderSize }, // Set Border Size - { 0x54, PacketTypesIn.WorldBorderWarningDelay }, // Set Border Warning Delay - { 0x55, PacketTypesIn.WorldBorderWarningReach }, // Set Border Warning Distance - { 0x56, PacketTypesIn.Camera }, // Set Camera - { 0x57, PacketTypesIn.UpdateViewPosition }, // Set Chunk Cache Center - { 0x58, PacketTypesIn.UpdateViewDistance }, // Set Chunk Cache Radius - { 0x59, PacketTypesIn.SetCursorItem }, // Set Cursor Item - { 0x5A, PacketTypesIn.SpawnPosition }, // Set Default Spawn Position - { 0x5B, PacketTypesIn.DisplayScoreboard }, // Set Display Objective - { 0x5C, PacketTypesIn.EntityMetadata }, // Set Entity Data - { 0x5D, PacketTypesIn.AttachEntity }, // Set Entity Link - { 0x5E, PacketTypesIn.EntityVelocity }, // Set Entity Motion - { 0x5F, PacketTypesIn.EntityEquipment }, // Set Equipment - { 0x60, PacketTypesIn.SetExperience }, // Set Experience - { 0x61, PacketTypesIn.UpdateHealth }, // Set Health - { 0x62, PacketTypesIn.SetHeldSlot }, // Set Held Slot - { 0x63, PacketTypesIn.ScoreboardObjective }, // Set Objective - { 0x64, PacketTypesIn.SetPassengers }, // Set Passengers - { 0x65, PacketTypesIn.SetPlayerInventory }, // Set Player Inventory - { 0x66, PacketTypesIn.Teams }, // Set Player Team - { 0x67, PacketTypesIn.UpdateScore }, // Set Score - { 0x68, PacketTypesIn.UpdateSimulationDistance }, // Set Simulation Distance - { 0x69, PacketTypesIn.SetTitleSubTitle }, // Set Subtitle Text - { 0x6A, PacketTypesIn.TimeUpdate }, // Set Time - { 0x6B, PacketTypesIn.SetTitleText }, // Set Title Text - { 0x6C, PacketTypesIn.SetTitleTime }, // Set Titles Animation - { 0x6D, PacketTypesIn.EntitySoundEffect }, // Sound Entity - { 0x6E, PacketTypesIn.SoundEffect }, // Sound - { 0x6F, PacketTypesIn.StartConfiguration }, // Start Configuration - { 0x70, PacketTypesIn.StopSound }, // Stop Sound - { 0x71, PacketTypesIn.StoreCookie }, // Store Cookie - { 0x72, PacketTypesIn.SystemChat }, // System Chat - { 0x73, PacketTypesIn.PlayerListHeaderAndFooter }, // Tab List - { 0x74, PacketTypesIn.NBTQueryResponse }, // Tag Query - { 0x75, PacketTypesIn.CollectItem }, // Take Item Entity - { 0x76, PacketTypesIn.EntityTeleport }, // Teleport Entity - { 0x77, PacketTypesIn.TestInstanceBlockStatus }, // Test Instance Block Status - { 0x78, PacketTypesIn.SetTickingState }, // Ticking State - { 0x79, PacketTypesIn.StepTick }, // Ticking Step - { 0x7A, PacketTypesIn.Transfer }, // Transfer - { 0x7B, PacketTypesIn.Advancements }, // Update Advancements - { 0x7C, PacketTypesIn.EntityProperties }, // Update Attributes - { 0x7D, PacketTypesIn.EntityEffect }, // Update Mob Effect - { 0x7E, PacketTypesIn.DeclareRecipes }, // Update Recipes - { 0x7F, PacketTypesIn.Tags }, // Update Tags - { 0x80, PacketTypesIn.ProjectilePower }, // Projectile Power - { 0x81, PacketTypesIn.CustomReportDetails }, // Custom Report Details - { 0x82, PacketTypesIn.ServerLinks }, // Server Links - { 0x83, PacketTypesIn.Waypoint }, // Waypoint (new in 1.21.6) - { 0x84, PacketTypesIn.ClearDialog }, // Clear Dialog (new in 1.21.6) - { 0x85, PacketTypesIn.ShowDialog } // Show Dialog (new in 1.21.6) - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, // Accept Teleportation - { 0x01, PacketTypesOut.QueryBlockNBT }, // Block Entity Tag Query - { 0x02, PacketTypesOut.BundleItemSelected }, // Bundle Item Selected - { 0x03, PacketTypesOut.SetDifficulty }, // Change Difficulty - { 0x04, PacketTypesOut.ChangeGameMode }, // Change Game Mode (new in 1.21.6) - { 0x05, PacketTypesOut.MessageAcknowledgment }, // Chat Ack - { 0x06, PacketTypesOut.ChatCommand }, // Chat Command - { 0x07, PacketTypesOut.SignedChatCommand }, // Chat Command Signed - { 0x08, PacketTypesOut.ChatMessage }, // Chat - { 0x09, PacketTypesOut.PlayerSession }, // Chat Session Update - { 0x0A, PacketTypesOut.ChunkBatchReceived }, // Chunk Batch Received - { 0x0B, PacketTypesOut.ClientStatus }, // Client Command - { 0x0C, PacketTypesOut.ClientTickEnd }, // Client Tick End - { 0x0D, PacketTypesOut.ClientSettings }, // Client Information - { 0x0E, PacketTypesOut.TabComplete }, // Command Suggestion - { 0x0F, PacketTypesOut.AcknowledgeConfiguration }, // Configuration Acknowledged - { 0x10, PacketTypesOut.ClickWindowButton }, // Container Button Click - { 0x11, PacketTypesOut.ClickWindow }, // Container Click - { 0x12, PacketTypesOut.CloseWindow }, // Container Close - { 0x13, PacketTypesOut.ChangeContainerSlotState }, // Container Slot State Changed - { 0x14, PacketTypesOut.CookieResponse }, // Cookie Response - { 0x15, PacketTypesOut.PluginMessage }, // Custom Payload - { 0x16, PacketTypesOut.DebugSampleSubscription }, // Debug Sample Subscription - { 0x17, PacketTypesOut.EditBook }, // Edit Book - { 0x18, PacketTypesOut.EntityNBTRequest }, // Entity Tag Query - { 0x19, PacketTypesOut.InteractEntity }, // Interact - { 0x1A, PacketTypesOut.GenerateStructure }, // Jigsaw Generate - { 0x1B, PacketTypesOut.KeepAlive }, // Keep Alive - { 0x1C, PacketTypesOut.LockDifficulty }, // Lock Difficulty - { 0x1D, PacketTypesOut.PlayerPosition }, // Move Player Pos - { 0x1E, PacketTypesOut.PlayerPositionAndRotation }, // Move Player Pos Rot - { 0x1F, PacketTypesOut.PlayerRotation }, // Move Player Rot - { 0x20, PacketTypesOut.PlayerMovement }, // Move Player Status Only - { 0x21, PacketTypesOut.VehicleMove }, // Move Vehicle - { 0x22, PacketTypesOut.SteerBoat }, // Paddle Boat - { 0x23, PacketTypesOut.PickItem }, // Pick Item From Block - { 0x24, PacketTypesOut.PickItemFromEntity }, // Pick Item From Entity - { 0x25, PacketTypesOut.PingRequest }, // Ping Request - { 0x26, PacketTypesOut.CraftRecipeRequest }, // Place Recipe - { 0x27, PacketTypesOut.PlayerAbilities }, // Player Abilities - { 0x28, PacketTypesOut.PlayerDigging }, // Player Action - { 0x29, PacketTypesOut.EntityAction }, // Player Command - { 0x2A, PacketTypesOut.SteerVehicle }, // Player Input - { 0x2B, PacketTypesOut.PlayerLoaded }, // Player Loaded - { 0x2C, PacketTypesOut.Pong }, // Pong - { 0x2D, PacketTypesOut.SetDisplayedRecipe }, // Recipe Book Change Settings - { 0x2E, PacketTypesOut.SetRecipeBookState }, // Recipe Book Seen Recipe - { 0x2F, PacketTypesOut.NameItem }, // Rename Item - { 0x30, PacketTypesOut.ResourcePackStatus }, // Resource Pack - { 0x31, PacketTypesOut.AdvancementTab }, // Seen Advancements - { 0x32, PacketTypesOut.SelectTrade }, // Select Trade - { 0x33, PacketTypesOut.SetBeaconEffect }, // Set Beacon - { 0x34, PacketTypesOut.HeldItemChange }, // Set Carried Item - { 0x35, PacketTypesOut.UpdateCommandBlock }, // Set Command Block - { 0x36, PacketTypesOut.UpdateCommandBlockMinecart }, // Set Command Minecart - { 0x37, PacketTypesOut.CreativeInventoryAction }, // Set Creative Mode Slot - { 0x38, PacketTypesOut.UpdateJigsawBlock }, // Set Jigsaw Block - { 0x39, PacketTypesOut.UpdateStructureBlock }, // Set Structure Block - { 0x3A, PacketTypesOut.SetTestBlock }, // Set Test Block - { 0x3B, PacketTypesOut.UpdateSign }, // Sign Update - { 0x3C, PacketTypesOut.Animation }, // Swing - { 0x3D, PacketTypesOut.Spectate }, // Teleport To Entity - { 0x3E, PacketTypesOut.TestInstanceBlockAction }, // Test Instance Block Action - { 0x3F, PacketTypesOut.PlayerBlockPlacement }, // Use Item On - { 0x40, PacketTypesOut.UseItem }, // Use Item - { 0x41, PacketTypesOut.CustomClickAction } // Custom Click Action (new in 1.21.6) - }; - - private readonly Dictionary configurationTypesIn = new() - { - { 0x00, ConfigurationPacketTypesIn.CookieRequest }, - { 0x01, ConfigurationPacketTypesIn.PluginMessage }, - { 0x02, ConfigurationPacketTypesIn.Disconnect }, - { 0x03, ConfigurationPacketTypesIn.FinishConfiguration }, - { 0x04, ConfigurationPacketTypesIn.KeepAlive }, - { 0x05, ConfigurationPacketTypesIn.Ping }, - { 0x06, ConfigurationPacketTypesIn.ResetChat }, - { 0x07, ConfigurationPacketTypesIn.RegistryData }, - { 0x08, ConfigurationPacketTypesIn.RemoveResourcePack }, - { 0x09, ConfigurationPacketTypesIn.ResourcePack }, - { 0x0A, ConfigurationPacketTypesIn.StoreCookie }, - { 0x0B, ConfigurationPacketTypesIn.Transfer }, - { 0x0C, ConfigurationPacketTypesIn.FeatureFlags }, - { 0x0D, ConfigurationPacketTypesIn.UpdateTags }, - { 0x0E, ConfigurationPacketTypesIn.KnownDataPacks }, - { 0x0F, ConfigurationPacketTypesIn.CustomReportDetails }, - { 0x10, ConfigurationPacketTypesIn.ServerLinks }, - { 0x11, ConfigurationPacketTypesIn.ClearDialog }, // New in 1.21.6 - { 0x12, ConfigurationPacketTypesIn.ShowDialog } // New in 1.21.6 - }; - - private readonly Dictionary configurationTypesOut = new() - { - { 0x00, ConfigurationPacketTypesOut.ClientInformation }, - { 0x01, ConfigurationPacketTypesOut.CookieResponse }, - { 0x02, ConfigurationPacketTypesOut.PluginMessage }, - { 0x03, ConfigurationPacketTypesOut.FinishConfiguration }, - { 0x04, ConfigurationPacketTypesOut.KeepAlive }, - { 0x05, ConfigurationPacketTypesOut.Pong }, - { 0x06, ConfigurationPacketTypesOut.ResourcePackResponse }, - { 0x07, ConfigurationPacketTypesOut.KnownDataPacks }, - { 0x08, ConfigurationPacketTypesOut.CustomClickAction } // New in 1.21.6 - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => configurationTypesIn!; - protected override Dictionary GetConfigurationListOut() => configurationTypesOut!; -} diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1219.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1219.cs deleted file mode 100644 index 5aab09bc94..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette1219.cs +++ /dev/null @@ -1,262 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes; - -public class PacketPalette1219 : PacketTypePalette -{ - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.Bundle }, // Bundle delimiter - { 0x01, PacketTypesIn.SpawnEntity }, // Add Entity - { 0x02, PacketTypesIn.EntityAnimation }, // Animate - { 0x03, PacketTypesIn.Statistics }, // Award Stats - { 0x04, PacketTypesIn.BlockChangedAck }, // Block Changed Ack - { 0x05, PacketTypesIn.BlockBreakAnimation }, // Block Destruction - { 0x06, PacketTypesIn.BlockEntityData }, // Block Entity Data - { 0x07, PacketTypesIn.BlockAction }, // Block Event - { 0x08, PacketTypesIn.BlockChange }, // Block Update - { 0x09, PacketTypesIn.BossBar }, // Boss Event - { 0x0A, PacketTypesIn.ServerDifficulty }, // Change Difficulty - { 0x0B, PacketTypesIn.ChunkBatchFinished }, // Chunk Batch Finished - { 0x0C, PacketTypesIn.ChunkBatchStarted }, // Chunk Batch Start - { 0x0D, PacketTypesIn.ChunksBiomes }, // Chunks Biomes - { 0x0E, PacketTypesIn.ClearTiles }, // Clear Titles - { 0x0F, PacketTypesIn.TabComplete }, // Command Suggestions - { 0x10, PacketTypesIn.DeclareCommands }, // Commands - { 0x11, PacketTypesIn.CloseWindow }, // Container Close - { 0x12, PacketTypesIn.WindowItems }, // Container Set Content - { 0x13, PacketTypesIn.WindowProperty }, // Container Set Data - { 0x14, PacketTypesIn.SetSlot }, // Container Set Slot - { 0x15, PacketTypesIn.CookieRequest }, // Cookie Request - { 0x16, PacketTypesIn.SetCooldown }, // Cooldown - { 0x17, PacketTypesIn.ChatSuggestions }, // Custom Chat Completions - { 0x18, PacketTypesIn.PluginMessage }, // Custom Payload - { 0x19, PacketTypesIn.DamageEvent }, // Damage Event - { 0x1A, PacketTypesIn.DebugBlockValue }, // Debug Block Value (new in 1.21.9) - { 0x1B, PacketTypesIn.DebugChunkValue }, // Debug Chunk Value (new in 1.21.9) - { 0x1C, PacketTypesIn.DebugEntityValue }, // Debug Entity Value (new in 1.21.9) - { 0x1D, PacketTypesIn.DebugEvent }, // Debug Event (new in 1.21.9) - { 0x1E, PacketTypesIn.DebugSample }, // Debug Sample - { 0x1F, PacketTypesIn.HideMessage }, // Delete Chat - { 0x20, PacketTypesIn.Disconnect }, // Disconnect - { 0x21, PacketTypesIn.ProfilelessChatMessage }, // Disguised Chat - { 0x22, PacketTypesIn.EntityStatus }, // Entity Event - { 0x23, PacketTypesIn.EntityPositionSync }, // Entity Position Sync - { 0x24, PacketTypesIn.Explosion }, // Explode - { 0x25, PacketTypesIn.UnloadChunk }, // Forget Level Chunk - { 0x26, PacketTypesIn.ChangeGameState }, // Game Event - { 0x27, PacketTypesIn.GameTestHighlightPos }, // Game Test Highlight Pos (new in 1.21.9) - { 0x28, PacketTypesIn.OpenHorseWindow }, // Horse Screen Open - { 0x29, PacketTypesIn.HurtAnimation }, // Hurt Animation - { 0x2A, PacketTypesIn.InitializeWorldBorder }, // Initialize Border - { 0x2B, PacketTypesIn.KeepAlive }, // Keep Alive - { 0x2C, PacketTypesIn.ChunkData }, // Level Chunk With Light - { 0x2D, PacketTypesIn.Effect }, // Level Event - { 0x2E, PacketTypesIn.Particle }, // Level Particles - { 0x2F, PacketTypesIn.UpdateLight }, // Light Update - { 0x30, PacketTypesIn.JoinGame }, // Login - { 0x31, PacketTypesIn.MapData }, // Map Item Data - { 0x32, PacketTypesIn.TradeList }, // Merchant Offers - { 0x33, PacketTypesIn.EntityPosition }, // Move Entity Pos - { 0x34, PacketTypesIn.EntityPositionAndRotation }, // Move Entity Pos Rot - { 0x35, PacketTypesIn.MoveMinecartAlongTrack }, // Move Minecart Along Track - { 0x36, PacketTypesIn.EntityRotation }, // Move Entity Rot - { 0x37, PacketTypesIn.VehicleMove }, // Move Vehicle - { 0x38, PacketTypesIn.OpenBook }, // Open Book - { 0x39, PacketTypesIn.OpenWindow }, // Open Screen - { 0x3A, PacketTypesIn.OpenSignEditor }, // Open Sign Editor - { 0x3B, PacketTypesIn.Ping }, // Ping - { 0x3C, PacketTypesIn.PingResponse }, // Pong Response - { 0x3D, PacketTypesIn.CraftRecipeResponse }, // Place Ghost Recipe - { 0x3E, PacketTypesIn.PlayerAbilities }, // Player Abilities - { 0x3F, PacketTypesIn.ChatMessage }, // Player Chat - { 0x40, PacketTypesIn.EndCombatEvent }, // Player Combat End - { 0x41, PacketTypesIn.EnterCombatEvent }, // Player Combat Enter - { 0x42, PacketTypesIn.DeathCombatEvent }, // Player Combat Kill - { 0x43, PacketTypesIn.PlayerRemove }, // Player Info Remove - { 0x44, PacketTypesIn.PlayerInfo }, // Player Info Update - { 0x45, PacketTypesIn.FacePlayer }, // Player Look At - { 0x46, PacketTypesIn.PlayerPositionAndLook }, // Player Position - { 0x47, PacketTypesIn.PlayerRotation }, // Player Rotation - { 0x48, PacketTypesIn.RecipeBookAdd }, // Recipe Book Add - { 0x49, PacketTypesIn.RecipeBookRemove }, // Recipe Book Remove - { 0x4A, PacketTypesIn.RecipeBookSettings }, // Recipe Book Settings - { 0x4B, PacketTypesIn.DestroyEntities }, // Remove Entities - { 0x4C, PacketTypesIn.RemoveEntityEffect }, // Remove Mob Effect - { 0x4D, PacketTypesIn.ResetScore }, // Reset Score - { 0x4E, PacketTypesIn.RemoveResourcePack }, // Resource Pack Pop - { 0x4F, PacketTypesIn.ResourcePackSend }, // Resource Pack Push - { 0x50, PacketTypesIn.Respawn }, // Respawn - { 0x51, PacketTypesIn.EntityHeadLook }, // Rotate Head - { 0x52, PacketTypesIn.MultiBlockChange }, // Section Blocks Update - { 0x53, PacketTypesIn.SelectAdvancementTab }, // Select Advancements Tab - { 0x54, PacketTypesIn.ServerData }, // Server Data - { 0x55, PacketTypesIn.ActionBar }, // Set Action Bar Text - { 0x56, PacketTypesIn.WorldBorderCenter }, // Set Border Center - { 0x57, PacketTypesIn.WorldBorderLerpSize }, // Set Border Lerp Size - { 0x58, PacketTypesIn.WorldBorderSize }, // Set Border Size - { 0x59, PacketTypesIn.WorldBorderWarningDelay }, // Set Border Warning Delay - { 0x5A, PacketTypesIn.WorldBorderWarningReach }, // Set Border Warning Distance - { 0x5B, PacketTypesIn.Camera }, // Set Camera - { 0x5C, PacketTypesIn.UpdateViewPosition }, // Set Chunk Cache Center - { 0x5D, PacketTypesIn.UpdateViewDistance }, // Set Chunk Cache Radius - { 0x5E, PacketTypesIn.SetCursorItem }, // Set Cursor Item - { 0x5F, PacketTypesIn.SpawnPosition }, // Set Default Spawn Position - { 0x60, PacketTypesIn.DisplayScoreboard }, // Set Display Objective - { 0x61, PacketTypesIn.EntityMetadata }, // Set Entity Data - { 0x62, PacketTypesIn.AttachEntity }, // Set Entity Link - { 0x63, PacketTypesIn.EntityVelocity }, // Set Entity Motion - { 0x64, PacketTypesIn.EntityEquipment }, // Set Equipment - { 0x65, PacketTypesIn.SetExperience }, // Set Experience - { 0x66, PacketTypesIn.UpdateHealth }, // Set Health - { 0x67, PacketTypesIn.SetHeldSlot }, // Set Held Slot - { 0x68, PacketTypesIn.ScoreboardObjective }, // Set Objective - { 0x69, PacketTypesIn.SetPassengers }, // Set Passengers - { 0x6A, PacketTypesIn.SetPlayerInventory }, // Set Player Inventory - { 0x6B, PacketTypesIn.Teams }, // Set Player Team - { 0x6C, PacketTypesIn.UpdateScore }, // Set Score - { 0x6D, PacketTypesIn.UpdateSimulationDistance }, // Set Simulation Distance - { 0x6E, PacketTypesIn.SetTitleSubTitle }, // Set Subtitle Text - { 0x6F, PacketTypesIn.TimeUpdate }, // Set Time - { 0x70, PacketTypesIn.SetTitleText }, // Set Title Text - { 0x71, PacketTypesIn.SetTitleTime }, // Set Titles Animation - { 0x72, PacketTypesIn.EntitySoundEffect }, // Sound Entity - { 0x73, PacketTypesIn.SoundEffect }, // Sound - { 0x74, PacketTypesIn.StartConfiguration }, // Start Configuration - { 0x75, PacketTypesIn.StopSound }, // Stop Sound - { 0x76, PacketTypesIn.StoreCookie }, // Store Cookie - { 0x77, PacketTypesIn.SystemChat }, // System Chat - { 0x78, PacketTypesIn.PlayerListHeaderAndFooter }, // Tab List - { 0x79, PacketTypesIn.NBTQueryResponse }, // Tag Query - { 0x7A, PacketTypesIn.CollectItem }, // Take Item Entity - { 0x7B, PacketTypesIn.EntityTeleport }, // Teleport Entity - { 0x7C, PacketTypesIn.TestInstanceBlockStatus }, // Test Instance Block Status - { 0x7D, PacketTypesIn.SetTickingState }, // Ticking State - { 0x7E, PacketTypesIn.StepTick }, // Ticking Step - { 0x7F, PacketTypesIn.Transfer }, // Transfer - { 0x80, PacketTypesIn.Advancements }, // Update Advancements - { 0x81, PacketTypesIn.EntityProperties }, // Update Attributes - { 0x82, PacketTypesIn.EntityEffect }, // Update Mob Effect - { 0x83, PacketTypesIn.DeclareRecipes }, // Update Recipes - { 0x84, PacketTypesIn.Tags }, // Update Tags - { 0x85, PacketTypesIn.ProjectilePower }, // Projectile Power - { 0x86, PacketTypesIn.CustomReportDetails }, // Custom Report Details - { 0x87, PacketTypesIn.ServerLinks }, // Server Links - { 0x88, PacketTypesIn.Waypoint }, // Waypoint - { 0x89, PacketTypesIn.ClearDialog }, // Clear Dialog - { 0x8A, PacketTypesIn.ShowDialog } // Show Dialog - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, // Accept Teleportation - { 0x01, PacketTypesOut.QueryBlockNBT }, // Block Entity Tag Query - { 0x02, PacketTypesOut.BundleItemSelected }, // Bundle Item Selected - { 0x03, PacketTypesOut.SetDifficulty }, // Change Difficulty - { 0x04, PacketTypesOut.ChangeGameMode }, // Change Game Mode - { 0x05, PacketTypesOut.MessageAcknowledgment }, // Chat Ack - { 0x06, PacketTypesOut.ChatCommand }, // Chat Command - { 0x07, PacketTypesOut.SignedChatCommand }, // Chat Command Signed - { 0x08, PacketTypesOut.ChatMessage }, // Chat - { 0x09, PacketTypesOut.PlayerSession }, // Chat Session Update - { 0x0A, PacketTypesOut.ChunkBatchReceived }, // Chunk Batch Received - { 0x0B, PacketTypesOut.ClientStatus }, // Client Command - { 0x0C, PacketTypesOut.ClientTickEnd }, // Client Tick End - { 0x0D, PacketTypesOut.ClientSettings }, // Client Information - { 0x0E, PacketTypesOut.TabComplete }, // Command Suggestion - { 0x0F, PacketTypesOut.AcknowledgeConfiguration }, // Configuration Acknowledged - { 0x10, PacketTypesOut.ClickWindowButton }, // Container Button Click - { 0x11, PacketTypesOut.ClickWindow }, // Container Click - { 0x12, PacketTypesOut.CloseWindow }, // Container Close - { 0x13, PacketTypesOut.ChangeContainerSlotState }, // Container Slot State Changed - { 0x14, PacketTypesOut.CookieResponse }, // Cookie Response - { 0x15, PacketTypesOut.PluginMessage }, // Custom Payload - { 0x16, PacketTypesOut.DebugSampleSubscription }, // Debug Subscription Request - { 0x17, PacketTypesOut.EditBook }, // Edit Book - { 0x18, PacketTypesOut.EntityNBTRequest }, // Entity Tag Query - { 0x19, PacketTypesOut.InteractEntity }, // Interact - { 0x1A, PacketTypesOut.GenerateStructure }, // Jigsaw Generate - { 0x1B, PacketTypesOut.KeepAlive }, // Keep Alive - { 0x1C, PacketTypesOut.LockDifficulty }, // Lock Difficulty - { 0x1D, PacketTypesOut.PlayerPosition }, // Move Player Pos - { 0x1E, PacketTypesOut.PlayerPositionAndRotation }, // Move Player Pos Rot - { 0x1F, PacketTypesOut.PlayerRotation }, // Move Player Rot - { 0x20, PacketTypesOut.PlayerMovement }, // Move Player Status Only - { 0x21, PacketTypesOut.VehicleMove }, // Move Vehicle - { 0x22, PacketTypesOut.SteerBoat }, // Paddle Boat - { 0x23, PacketTypesOut.PickItem }, // Pick Item From Block - { 0x24, PacketTypesOut.PickItemFromEntity }, // Pick Item From Entity - { 0x25, PacketTypesOut.PingRequest }, // Ping Request - { 0x26, PacketTypesOut.CraftRecipeRequest }, // Place Recipe - { 0x27, PacketTypesOut.PlayerAbilities }, // Player Abilities - { 0x28, PacketTypesOut.PlayerDigging }, // Player Action - { 0x29, PacketTypesOut.EntityAction }, // Player Command - { 0x2A, PacketTypesOut.SteerVehicle }, // Player Input - { 0x2B, PacketTypesOut.PlayerLoaded }, // Player Loaded - { 0x2C, PacketTypesOut.Pong }, // Pong - { 0x2D, PacketTypesOut.SetDisplayedRecipe }, // Recipe Book Change Settings - { 0x2E, PacketTypesOut.SetRecipeBookState }, // Recipe Book Seen Recipe - { 0x2F, PacketTypesOut.NameItem }, // Rename Item - { 0x30, PacketTypesOut.ResourcePackStatus }, // Resource Pack - { 0x31, PacketTypesOut.AdvancementTab }, // Seen Advancements - { 0x32, PacketTypesOut.SelectTrade }, // Select Trade - { 0x33, PacketTypesOut.SetBeaconEffect }, // Set Beacon - { 0x34, PacketTypesOut.HeldItemChange }, // Set Carried Item - { 0x35, PacketTypesOut.UpdateCommandBlock }, // Set Command Block - { 0x36, PacketTypesOut.UpdateCommandBlockMinecart }, // Set Command Minecart - { 0x37, PacketTypesOut.CreativeInventoryAction }, // Set Creative Mode Slot - { 0x38, PacketTypesOut.UpdateJigsawBlock }, // Set Jigsaw Block - { 0x39, PacketTypesOut.UpdateStructureBlock }, // Set Structure Block - { 0x3A, PacketTypesOut.SetTestBlock }, // Set Test Block - { 0x3B, PacketTypesOut.UpdateSign }, // Sign Update - { 0x3C, PacketTypesOut.Animation }, // Swing - { 0x3D, PacketTypesOut.Spectate }, // Teleport To Entity - { 0x3E, PacketTypesOut.TestInstanceBlockAction }, // Test Instance Block Action - { 0x3F, PacketTypesOut.PlayerBlockPlacement }, // Use Item On - { 0x40, PacketTypesOut.UseItem }, // Use Item - { 0x41, PacketTypesOut.CustomClickAction } // Custom Click Action - }; - - private readonly Dictionary configurationTypesIn = new() - { - { 0x00, ConfigurationPacketTypesIn.CookieRequest }, - { 0x01, ConfigurationPacketTypesIn.PluginMessage }, - { 0x02, ConfigurationPacketTypesIn.Disconnect }, - { 0x03, ConfigurationPacketTypesIn.FinishConfiguration }, - { 0x04, ConfigurationPacketTypesIn.KeepAlive }, - { 0x05, ConfigurationPacketTypesIn.Ping }, - { 0x06, ConfigurationPacketTypesIn.ResetChat }, - { 0x07, ConfigurationPacketTypesIn.RegistryData }, - { 0x08, ConfigurationPacketTypesIn.RemoveResourcePack }, - { 0x09, ConfigurationPacketTypesIn.ResourcePack }, - { 0x0A, ConfigurationPacketTypesIn.StoreCookie }, - { 0x0B, ConfigurationPacketTypesIn.Transfer }, - { 0x0C, ConfigurationPacketTypesIn.FeatureFlags }, - { 0x0D, ConfigurationPacketTypesIn.UpdateTags }, - { 0x0E, ConfigurationPacketTypesIn.KnownDataPacks }, - { 0x0F, ConfigurationPacketTypesIn.CustomReportDetails }, - { 0x10, ConfigurationPacketTypesIn.ServerLinks }, - { 0x11, ConfigurationPacketTypesIn.ClearDialog }, - { 0x12, ConfigurationPacketTypesIn.ShowDialog }, - { 0x13, ConfigurationPacketTypesIn.CodeOfConduct } // New in 1.21.9 - }; - - private readonly Dictionary configurationTypesOut = new() - { - { 0x00, ConfigurationPacketTypesOut.ClientInformation }, - { 0x01, ConfigurationPacketTypesOut.CookieResponse }, - { 0x02, ConfigurationPacketTypesOut.PluginMessage }, - { 0x03, ConfigurationPacketTypesOut.FinishConfiguration }, - { 0x04, ConfigurationPacketTypesOut.KeepAlive }, - { 0x05, ConfigurationPacketTypesOut.Pong }, - { 0x06, ConfigurationPacketTypesOut.ResourcePackResponse }, - { 0x07, ConfigurationPacketTypesOut.KnownDataPacks }, - { 0x08, ConfigurationPacketTypesOut.CustomClickAction }, - { 0x09, ConfigurationPacketTypesOut.AcceptCodeOfConduct } // New in 1.21.9 - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => configurationTypesIn!; - protected override Dictionary GetConfigurationListOut() => configurationTypesOut!; -} diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette17.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette17.cs deleted file mode 100644 index ecbdf4a92d..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette17.cs +++ /dev/null @@ -1,121 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes -{ - public class PacketPalette17 : PacketTypePalette - { - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.KeepAlive }, - { 0x01, PacketTypesIn.JoinGame }, - { 0x02, PacketTypesIn.ChatMessage }, - { 0x03, PacketTypesIn.TimeUpdate }, - { 0x04, PacketTypesIn.EntityEquipment }, - { 0x05, PacketTypesIn.SpawnPosition }, - { 0x06, PacketTypesIn.UpdateHealth }, - { 0x07, PacketTypesIn.Respawn }, - { 0x08, PacketTypesIn.PlayerPositionAndLook }, - { 0x09, PacketTypesIn.HeldItemChange }, - { 0x0A, PacketTypesIn.UseBed }, - { 0x0B, PacketTypesIn.EntityAnimation }, - { 0x0C, PacketTypesIn.SpawnPlayer }, - { 0x0D, PacketTypesIn.CollectItem }, - { 0x0E, PacketTypesIn.SpawnEntity }, - { 0x0F, PacketTypesIn.SpawnLivingEntity }, - { 0x10, PacketTypesIn.SpawnPainting }, - { 0x11, PacketTypesIn.SpawnExperienceOrb }, - { 0x12, PacketTypesIn.EntityVelocity }, - { 0x13, PacketTypesIn.DestroyEntities }, - { 0x14, PacketTypesIn.EntityMovement }, - { 0x15, PacketTypesIn.EntityPosition }, - { 0x16, PacketTypesIn.EntityRotation }, - { 0x17, PacketTypesIn.EntityPositionAndRotation }, - { 0x18, PacketTypesIn.EntityTeleport }, - { 0x19, PacketTypesIn.EntityHeadLook }, - { 0x1A, PacketTypesIn.EntityStatus }, - { 0x1B, PacketTypesIn.AttachEntity }, - { 0x1C, PacketTypesIn.EntityMetadata }, - { 0x1D, PacketTypesIn.EntityEffect }, - { 0x1E, PacketTypesIn.RemoveEntityEffect }, - { 0x1F, PacketTypesIn.SetExperience }, - { 0x20, PacketTypesIn.EntityProperties }, - { 0x21, PacketTypesIn.ChunkData }, - { 0x22, PacketTypesIn.MultiBlockChange }, - { 0x23, PacketTypesIn.BlockChange }, - { 0x24, PacketTypesIn.BlockAction }, - { 0x25, PacketTypesIn.BlockBreakAnimation }, - { 0x26, PacketTypesIn.MapChunkBulk }, - { 0x27, PacketTypesIn.Explosion }, - { 0x28, PacketTypesIn.Effect }, - { 0x29, PacketTypesIn.SoundEffect }, - { 0x2A, PacketTypesIn.Particle }, - { 0x2B, PacketTypesIn.ChangeGameState }, - { 0x2C, PacketTypesIn.SpawnWeatherEntity }, - { 0x2D, PacketTypesIn.OpenWindow }, - { 0x2E, PacketTypesIn.CloseWindow }, - { 0x2F, PacketTypesIn.SetSlot }, - { 0x30, PacketTypesIn.WindowItems }, - { 0x31, PacketTypesIn.WindowProperty }, - { 0x32, PacketTypesIn.WindowConfirmation }, - { 0x33, PacketTypesIn.UpdateSign }, - { 0x34, PacketTypesIn.MapData }, - { 0x35, PacketTypesIn.BlockEntityData }, - { 0x36, PacketTypesIn.OpenSignEditor }, - { 0x37, PacketTypesIn.Statistics }, - { 0x38, PacketTypesIn.PlayerInfo }, - { 0x39, PacketTypesIn.PlayerAbilities }, - { 0x3A, PacketTypesIn.TabComplete }, - { 0x3B, PacketTypesIn.ScoreboardObjective }, - { 0x3C, PacketTypesIn.UpdateScore }, - { 0x3D, PacketTypesIn.DisplayScoreboard }, - { 0x3E, PacketTypesIn.Teams }, - { 0x3F, PacketTypesIn.PluginMessage }, - { 0x40, PacketTypesIn.Disconnect }, - { 0x41, PacketTypesIn.ServerDifficulty }, - { 0x42, PacketTypesIn.CombatEvent }, - { 0x43, PacketTypesIn.Camera }, - { 0x44, PacketTypesIn.WorldBorder }, - { 0x45, PacketTypesIn.Title }, - { 0x46, PacketTypesIn.SetCompression }, - { 0x47, PacketTypesIn.PlayerListHeaderAndFooter }, - { 0x48, PacketTypesIn.ResourcePackSend }, - { 0x49, PacketTypesIn.UpdateEntityNBT }, - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.KeepAlive }, - { 0x01, PacketTypesOut.ChatMessage }, - { 0x02, PacketTypesOut.InteractEntity }, - { 0x03, PacketTypesOut.PlayerMovement }, - { 0x04, PacketTypesOut.PlayerPosition }, - { 0x05, PacketTypesOut.PlayerRotation }, - { 0x06, PacketTypesOut.PlayerPositionAndRotation }, - { 0x07, PacketTypesOut.PlayerDigging }, - { 0x08, PacketTypesOut.PlayerBlockPlacement }, - { 0x09, PacketTypesOut.HeldItemChange }, - { 0x0A, PacketTypesOut.Animation }, - { 0x0B, PacketTypesOut.EntityAction }, - { 0x0C, PacketTypesOut.SteerVehicle }, - { 0x0D, PacketTypesOut.CloseWindow }, - { 0x0E, PacketTypesOut.ClickWindow }, - { 0x0F, PacketTypesOut.WindowConfirmation }, - { 0x10, PacketTypesOut.CreativeInventoryAction }, - { 0x11, PacketTypesOut.EnchantItem }, - { 0x12, PacketTypesOut.UpdateSign }, - { 0x13, PacketTypesOut.PlayerAbilities }, - { 0x14, PacketTypesOut.TabComplete }, - { 0x15, PacketTypesOut.ClientSettings }, - { 0x16, PacketTypesOut.ClientStatus }, - { 0x17, PacketTypesOut.PluginMessage }, - { 0x18, PacketTypesOut.Spectate }, - { 0x19, PacketTypesOut.ResourcePackStatus }, - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - - protected override Dictionary GetConfigurationListIn() => new(); - protected override Dictionary GetConfigurationListOut() => new(); - } -} diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette18.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette18.cs deleted file mode 100644 index 26d43f9d81..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette18.cs +++ /dev/null @@ -1,125 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes -{ - public class PacketPalette18 : PacketTypePalette - { - private Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.KeepAlive }, - { 0x01, PacketTypesIn.JoinGame }, - { 0x02, PacketTypesIn.ChatMessage }, - { 0x03, PacketTypesIn.TimeUpdate }, - { 0x04, PacketTypesIn.EntityEquipment }, - { 0x05, PacketTypesIn.SpawnPosition }, - { 0x06, PacketTypesIn.UpdateHealth }, - { 0x07, PacketTypesIn.Respawn }, - { 0x08, PacketTypesIn.PlayerPositionAndLook }, - { 0x09, PacketTypesIn.HeldItemChange }, - { 0x0A, PacketTypesIn.UseBed }, - { 0x0B, PacketTypesIn.EntityAnimation }, - { 0x0C, PacketTypesIn.SpawnPlayer }, - { 0x0D, PacketTypesIn.CollectItem }, - { 0x0E, PacketTypesIn.SpawnEntity }, - { 0x0F, PacketTypesIn.SpawnLivingEntity }, - { 0x10, PacketTypesIn.SpawnPainting }, - { 0x11, PacketTypesIn.SpawnExperienceOrb }, - { 0x12, PacketTypesIn.EntityVelocity }, - { 0x13, PacketTypesIn.DestroyEntities }, - { 0x15, PacketTypesIn.EntityMovement }, - { 0x16, PacketTypesIn.EntityRotation }, - { 0x17, PacketTypesIn.EntityPositionAndRotation }, - { 0x18, PacketTypesIn.EntityTeleport }, - { 0x19, PacketTypesIn.EntityHeadLook }, - { 0x1A, PacketTypesIn.EntityStatus }, - { 0x1B, PacketTypesIn.AttachEntity }, - { 0x1C, PacketTypesIn.EntityMetadata }, - { 0x1D, PacketTypesIn.EntityEffect }, - { 0x1E, PacketTypesIn.RemoveEntityEffect }, - { 0x1F, PacketTypesIn.SetExperience }, - { 0x20, PacketTypesIn.EntityProperties }, - { 0x21, PacketTypesIn.ChunkData }, - { 0x22, PacketTypesIn.MultiBlockChange }, - { 0x23, PacketTypesIn.BlockChange }, - { 0x24, PacketTypesIn.BlockAction }, - { 0x25, PacketTypesIn.BlockBreakAnimation }, - // Missing Chunk Bulk Data - { 0x27, PacketTypesIn.Explosion }, - { 0x28, PacketTypesIn.Effect }, - { 0x29, PacketTypesIn.SoundEffect }, - { 0x2A, PacketTypesIn.Particle }, - { 0x2B, PacketTypesIn.ChangeGameState }, - { 0x2C, PacketTypesIn.SpawnWeatherEntity }, - { 0x2D, PacketTypesIn.OpenWindow }, - { 0x2E, PacketTypesIn.CloseWindow }, - { 0x2F, PacketTypesIn.SetSlot }, - { 0x30, PacketTypesIn.WindowItems }, - { 0x31, PacketTypesIn.WindowProperty }, - { 0x32, PacketTypesIn.WindowConfirmation }, - // Missing Update Sign - { 0x34, PacketTypesIn.MapData }, - { 0x35, PacketTypesIn.BlockEntityData }, - { 0x36, PacketTypesIn.OpenSignEditor }, - { 0x37, PacketTypesIn.Statistics }, - // Missing Player List Item - { 0x39, PacketTypesIn.PlayerAbilities }, - { 0x3A, PacketTypesIn.TabComplete }, - { 0x3B, PacketTypesIn.ScoreboardObjective }, - { 0x3C, PacketTypesIn.UpdateScore }, - { 0x3D, PacketTypesIn.DisplayScoreboard }, - { 0x3E, PacketTypesIn.Teams }, - { 0x3D, PacketTypesIn.PluginMessage }, - { 0x40, PacketTypesIn.Disconnect }, - { 0x41, PacketTypesIn.ServerDifficulty }, - { 0x42, PacketTypesIn.CombatEvent }, - { 0x43, PacketTypesIn.Camera }, - { 0x44, PacketTypesIn.WorldBorder }, - { 0x45, PacketTypesIn.Title }, - { 0x47, PacketTypesIn.PlayerListHeaderAndFooter }, - { 0x48, PacketTypesIn.ResourcePackSend }, - { 0x49, PacketTypesIn.UpdateEntityNBT } - }; - - private Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, - { 0x01, PacketTypesOut.Unknown }, - { 0x02, PacketTypesOut.TabComplete }, - { 0x03, PacketTypesOut.ChatMessage }, - { 0x04, PacketTypesOut.ClientStatus }, - { 0x05, PacketTypesOut.ClientSettings }, - { 0x06, PacketTypesOut.WindowConfirmation }, - { 0x07, PacketTypesOut.EnchantItem }, - { 0x08, PacketTypesOut.ClickWindow }, - { 0x09, PacketTypesOut.CloseWindow }, - { 0x0A, PacketTypesOut.PluginMessage }, - { 0x0B, PacketTypesOut.InteractEntity }, - { 0x0C, PacketTypesOut.KeepAlive }, - { 0x0D, PacketTypesOut.PlayerMovement }, - { 0x0E, PacketTypesOut.PlayerPosition }, - { 0x0F, PacketTypesOut.PlayerPositionAndRotation }, - { 0x10, PacketTypesOut.PlayerRotation }, - { 0x11, PacketTypesOut.VehicleMove }, - { 0x12, PacketTypesOut.SteerBoat }, - { 0x13, PacketTypesOut.PlayerAbilities }, - { 0x14, PacketTypesOut.PlayerDigging }, - { 0x15, PacketTypesOut.EntityAction }, - { 0x16, PacketTypesOut.SteerVehicle }, - { 0x17, PacketTypesOut.RecipeBookData }, - { 0x18, PacketTypesOut.ResourcePackStatus }, - { 0x19, PacketTypesOut.AdvancementTab }, - { 0x1A, PacketTypesOut.HeldItemChange }, - { 0x1B, PacketTypesOut.CreativeInventoryAction }, - { 0x1C, PacketTypesOut.UpdateSign }, - { 0x1D, PacketTypesOut.Animation }, - { 0x1E, PacketTypesOut.Spectate }, - { 0x1F, PacketTypesOut.PlayerBlockPlacement }, - { 0x20, PacketTypesOut.UseItem }, - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => new(); - protected override Dictionary GetConfigurationListOut() => new(); - } -} diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette19.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette19.cs deleted file mode 100644 index ebffc31af9..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette19.cs +++ /dev/null @@ -1,127 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes -{ - public class PacketPalette19 : PacketTypePalette - { - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.SpawnEntity }, - { 0x01, PacketTypesIn.SpawnExperienceOrb }, - { 0x02, PacketTypesIn.SpawnWeatherEntity }, - { 0x03, PacketTypesIn.SpawnLivingEntity }, - { 0x04, PacketTypesIn.SpawnPainting }, - { 0x05, PacketTypesIn.SpawnPlayer }, - { 0x06, PacketTypesIn.EntityAnimation }, - { 0x07, PacketTypesIn.Statistics }, - { 0x08, PacketTypesIn.BlockBreakAnimation }, - { 0x09, PacketTypesIn.BlockEntityData }, - { 0x0A, PacketTypesIn.BlockAction }, - { 0x0B, PacketTypesIn.BlockChange }, - { 0x0C, PacketTypesIn.BossBar }, - { 0x0D, PacketTypesIn.ServerDifficulty }, - { 0x0E, PacketTypesIn.TabComplete }, - { 0x0F, PacketTypesIn.ChatMessage }, - { 0x10, PacketTypesIn.MultiBlockChange }, - { 0x11, PacketTypesIn.WindowConfirmation }, - { 0x12, PacketTypesIn.CloseWindow }, - { 0x13, PacketTypesIn.OpenWindow }, - { 0x14, PacketTypesIn.WindowItems }, - { 0x15, PacketTypesIn.WindowProperty }, - { 0x16, PacketTypesIn.SetSlot }, - { 0x17, PacketTypesIn.SetCooldown }, - { 0x18, PacketTypesIn.PluginMessage }, - { 0x19, PacketTypesIn.NamedSoundEffect }, - { 0x1A, PacketTypesIn.Disconnect }, - { 0x1B, PacketTypesIn.EntityStatus }, - { 0x1C, PacketTypesIn.Explosion }, - { 0x1D, PacketTypesIn.UnloadChunk }, - { 0x1E, PacketTypesIn.ChangeGameState }, - { 0x1F, PacketTypesIn.KeepAlive }, - { 0x20, PacketTypesIn.ChunkData }, - { 0x21, PacketTypesIn.Effect }, - { 0x22, PacketTypesIn.Particle }, - { 0x23, PacketTypesIn.JoinGame }, - { 0x24, PacketTypesIn.MapData }, - { 0x25, PacketTypesIn.EntityPosition }, - { 0x26, PacketTypesIn.EntityPositionAndRotation }, - { 0x27, PacketTypesIn.EntityRotation }, - { 0x28, PacketTypesIn.EntityMovement }, - { 0x29, PacketTypesIn.VehicleMove }, - { 0x2A, PacketTypesIn.OpenSignEditor }, - { 0x2B, PacketTypesIn.PlayerAbilities }, - { 0x2C, PacketTypesIn.CombatEvent }, - { 0x2D, PacketTypesIn.PlayerInfo }, - { 0x2E, PacketTypesIn.PlayerPositionAndLook }, - { 0x2F, PacketTypesIn.UseBed }, - { 0x30, PacketTypesIn.DestroyEntities }, - { 0x31, PacketTypesIn.RemoveEntityEffect }, - { 0x32, PacketTypesIn.ResourcePackSend }, - { 0x33, PacketTypesIn.Respawn }, - { 0x34, PacketTypesIn.EntityHeadLook }, - { 0x35, PacketTypesIn.WorldBorder }, - { 0x36, PacketTypesIn.Camera }, - { 0x37, PacketTypesIn.HeldItemChange }, - { 0x38, PacketTypesIn.DisplayScoreboard }, - { 0x39, PacketTypesIn.EntityMetadata }, - { 0x3A, PacketTypesIn.AttachEntity }, - { 0x3B, PacketTypesIn.EntityVelocity }, - { 0x3C, PacketTypesIn.EntityEquipment }, - { 0x3D, PacketTypesIn.SetExperience }, - { 0x3E, PacketTypesIn.UpdateHealth }, - { 0x3F, PacketTypesIn.ScoreboardObjective }, - { 0x40, PacketTypesIn.SetPassengers }, - { 0x41, PacketTypesIn.Teams }, - { 0x42, PacketTypesIn.UpdateScore }, - { 0x43, PacketTypesIn.SpawnPosition }, - { 0x44, PacketTypesIn.TimeUpdate }, - { 0x45, PacketTypesIn.Title }, - { 0x46, PacketTypesIn.UpdateSign }, - { 0x47, PacketTypesIn.SoundEffect }, - { 0x48, PacketTypesIn.PlayerListHeaderAndFooter }, - { 0x49, PacketTypesIn.CollectItem }, - { 0x4A, PacketTypesIn.EntityTeleport }, - { 0x4B, PacketTypesIn.EntityProperties }, - { 0x4C, PacketTypesIn.EntityEffect }, - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, - { 0x01, PacketTypesOut.TabComplete }, - { 0x02, PacketTypesOut.ChatMessage }, - { 0x03, PacketTypesOut.ClientStatus }, - { 0x04, PacketTypesOut.ClientSettings }, - { 0x05, PacketTypesOut.WindowConfirmation }, - { 0x06, PacketTypesOut.EnchantItem }, - { 0x07, PacketTypesOut.ClickWindow }, - { 0x08, PacketTypesOut.CloseWindow }, - { 0x09, PacketTypesOut.PluginMessage }, - { 0x0A, PacketTypesOut.InteractEntity }, - { 0x0B, PacketTypesOut.KeepAlive }, - { 0x0C, PacketTypesOut.PlayerPosition }, - { 0x0D, PacketTypesOut.PlayerPositionAndRotation }, - { 0x0E, PacketTypesOut.PlayerRotation }, - { 0x0F, PacketTypesOut.PlayerMovement }, - { 0x10, PacketTypesOut.VehicleMove }, - { 0x11, PacketTypesOut.SteerBoat }, - { 0x12, PacketTypesOut.PlayerAbilities }, - { 0x13, PacketTypesOut.PlayerDigging }, - { 0x14, PacketTypesOut.EntityAction }, - { 0x15, PacketTypesOut.SteerVehicle }, - { 0x16, PacketTypesOut.ResourcePackStatus }, - { 0x17, PacketTypesOut.HeldItemChange }, - { 0x18, PacketTypesOut.CreativeInventoryAction }, - { 0x19, PacketTypesOut.UpdateSign }, - { 0x1A, PacketTypesOut.Animation }, - { 0x1B, PacketTypesOut.Spectate }, - { 0x1C, PacketTypesOut.PlayerBlockPlacement }, - { 0x1D, PacketTypesOut.UseItem }, - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => new(); - protected override Dictionary GetConfigurationListOut() => new(); - } -} diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette261.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette261.cs deleted file mode 100644 index 0f58c527b0..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPalette261.cs +++ /dev/null @@ -1,266 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes; - -public class PacketPalette261 : PacketTypePalette -{ - private readonly Dictionary typeIn = new() - { - { 0x00, PacketTypesIn.Bundle }, // Bundle delimiter - { 0x01, PacketTypesIn.SpawnEntity }, // Add Entity - { 0x02, PacketTypesIn.EntityAnimation }, // Animate - { 0x03, PacketTypesIn.Statistics }, // Award Stats - { 0x04, PacketTypesIn.BlockChangedAck }, // Block Changed Ack - { 0x05, PacketTypesIn.BlockBreakAnimation }, // Block Destruction - { 0x06, PacketTypesIn.BlockEntityData }, // Block Entity Data - { 0x07, PacketTypesIn.BlockAction }, // Block Event - { 0x08, PacketTypesIn.BlockChange }, // Block Update - { 0x09, PacketTypesIn.BossBar }, // Boss Event - { 0x0A, PacketTypesIn.ServerDifficulty }, // Change Difficulty - { 0x0B, PacketTypesIn.ChunkBatchFinished }, // Chunk Batch Finished - { 0x0C, PacketTypesIn.ChunkBatchStarted }, // Chunk Batch Start - { 0x0D, PacketTypesIn.ChunksBiomes }, // Chunks Biomes - { 0x0E, PacketTypesIn.ClearTiles }, // Clear Titles - { 0x0F, PacketTypesIn.TabComplete }, // Command Suggestions - { 0x10, PacketTypesIn.DeclareCommands }, // Commands - { 0x11, PacketTypesIn.CloseWindow }, // Container Close - { 0x12, PacketTypesIn.WindowItems }, // Container Set Content - { 0x13, PacketTypesIn.WindowProperty }, // Container Set Data - { 0x14, PacketTypesIn.SetSlot }, // Container Set Slot - { 0x15, PacketTypesIn.CookieRequest }, // Cookie Request - { 0x16, PacketTypesIn.SetCooldown }, // Cooldown - { 0x17, PacketTypesIn.ChatSuggestions }, // Custom Chat Completions - { 0x18, PacketTypesIn.PluginMessage }, // Custom Payload - { 0x19, PacketTypesIn.DamageEvent }, // Damage Event - { 0x1A, PacketTypesIn.DebugBlockValue }, // Debug Block Value - { 0x1B, PacketTypesIn.DebugChunkValue }, // Debug Chunk Value - { 0x1C, PacketTypesIn.DebugEntityValue }, // Debug Entity Value - { 0x1D, PacketTypesIn.DebugEvent }, // Debug Event - { 0x1E, PacketTypesIn.DebugSample }, // Debug Sample - { 0x1F, PacketTypesIn.HideMessage }, // Delete Chat - { 0x20, PacketTypesIn.Disconnect }, // Disconnect - { 0x21, PacketTypesIn.ProfilelessChatMessage }, // Disguised Chat - { 0x22, PacketTypesIn.EntityStatus }, // Entity Event - { 0x23, PacketTypesIn.EntityPositionSync }, // Entity Position Sync - { 0x24, PacketTypesIn.Explosion }, // Explode - { 0x25, PacketTypesIn.UnloadChunk }, // Forget Level Chunk - { 0x26, PacketTypesIn.ChangeGameState }, // Game Event - { 0x27, PacketTypesIn.GameRuleValues }, // Game Rule Values (new in 26.1) - { 0x28, PacketTypesIn.GameTestHighlightPos }, // Game Test Highlight Pos - { 0x29, PacketTypesIn.OpenHorseWindow }, // Mount Screen Open (renamed from Horse Screen Open) - { 0x2A, PacketTypesIn.HurtAnimation }, // Hurt Animation - { 0x2B, PacketTypesIn.InitializeWorldBorder }, // Initialize Border - { 0x2C, PacketTypesIn.KeepAlive }, // Keep Alive - { 0x2D, PacketTypesIn.ChunkData }, // Level Chunk With Light - { 0x2E, PacketTypesIn.Effect }, // Level Event - { 0x2F, PacketTypesIn.Particle }, // Level Particles - { 0x30, PacketTypesIn.UpdateLight }, // Light Update - { 0x31, PacketTypesIn.JoinGame }, // Login - { 0x32, PacketTypesIn.LowDiskSpaceWarning }, // Low Disk Space Warning (new in 26.1) - { 0x33, PacketTypesIn.MapData }, // Map Item Data - { 0x34, PacketTypesIn.TradeList }, // Merchant Offers - { 0x35, PacketTypesIn.EntityPosition }, // Move Entity Pos - { 0x36, PacketTypesIn.EntityPositionAndRotation }, // Move Entity Pos Rot - { 0x37, PacketTypesIn.MoveMinecartAlongTrack }, // Move Minecart Along Track - { 0x38, PacketTypesIn.EntityRotation }, // Move Entity Rot - { 0x39, PacketTypesIn.VehicleMove }, // Move Vehicle - { 0x3A, PacketTypesIn.OpenBook }, // Open Book - { 0x3B, PacketTypesIn.OpenWindow }, // Open Screen - { 0x3C, PacketTypesIn.OpenSignEditor }, // Open Sign Editor - { 0x3D, PacketTypesIn.Ping }, // Ping - { 0x3E, PacketTypesIn.PingResponse }, // Pong Response - { 0x3F, PacketTypesIn.CraftRecipeResponse }, // Place Ghost Recipe - { 0x40, PacketTypesIn.PlayerAbilities }, // Player Abilities - { 0x41, PacketTypesIn.ChatMessage }, // Player Chat - { 0x42, PacketTypesIn.EndCombatEvent }, // Player Combat End - { 0x43, PacketTypesIn.EnterCombatEvent }, // Player Combat Enter - { 0x44, PacketTypesIn.DeathCombatEvent }, // Player Combat Kill - { 0x45, PacketTypesIn.PlayerRemove }, // Player Info Remove - { 0x46, PacketTypesIn.PlayerInfo }, // Player Info Update - { 0x47, PacketTypesIn.FacePlayer }, // Player Look At - { 0x48, PacketTypesIn.PlayerPositionAndLook }, // Player Position - { 0x49, PacketTypesIn.PlayerRotation }, // Player Rotation - { 0x4A, PacketTypesIn.RecipeBookAdd }, // Recipe Book Add - { 0x4B, PacketTypesIn.RecipeBookRemove }, // Recipe Book Remove - { 0x4C, PacketTypesIn.RecipeBookSettings }, // Recipe Book Settings - { 0x4D, PacketTypesIn.DestroyEntities }, // Remove Entities - { 0x4E, PacketTypesIn.RemoveEntityEffect }, // Remove Mob Effect - { 0x4F, PacketTypesIn.ResetScore }, // Reset Score - { 0x50, PacketTypesIn.RemoveResourcePack }, // Resource Pack Pop - { 0x51, PacketTypesIn.ResourcePackSend }, // Resource Pack Push - { 0x52, PacketTypesIn.Respawn }, // Respawn - { 0x53, PacketTypesIn.EntityHeadLook }, // Rotate Head - { 0x54, PacketTypesIn.MultiBlockChange }, // Section Blocks Update - { 0x55, PacketTypesIn.SelectAdvancementTab }, // Select Advancements Tab - { 0x56, PacketTypesIn.ServerData }, // Server Data - { 0x57, PacketTypesIn.ActionBar }, // Set Action Bar Text - { 0x58, PacketTypesIn.WorldBorderCenter }, // Set Border Center - { 0x59, PacketTypesIn.WorldBorderLerpSize }, // Set Border Lerp Size - { 0x5A, PacketTypesIn.WorldBorderSize }, // Set Border Size - { 0x5B, PacketTypesIn.WorldBorderWarningDelay }, // Set Border Warning Delay - { 0x5C, PacketTypesIn.WorldBorderWarningReach }, // Set Border Warning Distance - { 0x5D, PacketTypesIn.Camera }, // Set Camera - { 0x5E, PacketTypesIn.UpdateViewPosition }, // Set Chunk Cache Center - { 0x5F, PacketTypesIn.UpdateViewDistance }, // Set Chunk Cache Radius - { 0x60, PacketTypesIn.SetCursorItem }, // Set Cursor Item - { 0x61, PacketTypesIn.SpawnPosition }, // Set Default Spawn Position - { 0x62, PacketTypesIn.DisplayScoreboard }, // Set Display Objective - { 0x63, PacketTypesIn.EntityMetadata }, // Set Entity Data - { 0x64, PacketTypesIn.AttachEntity }, // Set Entity Link - { 0x65, PacketTypesIn.EntityVelocity }, // Set Entity Motion - { 0x66, PacketTypesIn.EntityEquipment }, // Set Equipment - { 0x67, PacketTypesIn.SetExperience }, // Set Experience - { 0x68, PacketTypesIn.UpdateHealth }, // Set Health - { 0x69, PacketTypesIn.SetHeldSlot }, // Set Held Slot - { 0x6A, PacketTypesIn.ScoreboardObjective }, // Set Objective - { 0x6B, PacketTypesIn.SetPassengers }, // Set Passengers - { 0x6C, PacketTypesIn.SetPlayerInventory }, // Set Player Inventory - { 0x6D, PacketTypesIn.Teams }, // Set Player Team - { 0x6E, PacketTypesIn.UpdateScore }, // Set Score - { 0x6F, PacketTypesIn.UpdateSimulationDistance }, // Set Simulation Distance - { 0x70, PacketTypesIn.SetTitleSubTitle }, // Set Subtitle Text - { 0x71, PacketTypesIn.TimeUpdate }, // Set Time - { 0x72, PacketTypesIn.SetTitleText }, // Set Title Text - { 0x73, PacketTypesIn.SetTitleTime }, // Set Titles Animation - { 0x74, PacketTypesIn.EntitySoundEffect }, // Sound Entity - { 0x75, PacketTypesIn.SoundEffect }, // Sound - { 0x76, PacketTypesIn.StartConfiguration }, // Start Configuration - { 0x77, PacketTypesIn.StopSound }, // Stop Sound - { 0x78, PacketTypesIn.StoreCookie }, // Store Cookie - { 0x79, PacketTypesIn.SystemChat }, // System Chat - { 0x7A, PacketTypesIn.PlayerListHeaderAndFooter }, // Tab List - { 0x7B, PacketTypesIn.NBTQueryResponse }, // Tag Query - { 0x7C, PacketTypesIn.CollectItem }, // Take Item Entity - { 0x7D, PacketTypesIn.EntityTeleport }, // Teleport Entity - { 0x7E, PacketTypesIn.TestInstanceBlockStatus }, // Test Instance Block Status - { 0x7F, PacketTypesIn.SetTickingState }, // Ticking State - { 0x80, PacketTypesIn.StepTick }, // Ticking Step - { 0x81, PacketTypesIn.Transfer }, // Transfer - { 0x82, PacketTypesIn.Advancements }, // Update Advancements - { 0x83, PacketTypesIn.EntityProperties }, // Update Attributes - { 0x84, PacketTypesIn.EntityEffect }, // Update Mob Effect - { 0x85, PacketTypesIn.DeclareRecipes }, // Update Recipes - { 0x86, PacketTypesIn.Tags }, // Update Tags - { 0x87, PacketTypesIn.ProjectilePower }, // Projectile Power - { 0x88, PacketTypesIn.CustomReportDetails }, // Custom Report Details - { 0x89, PacketTypesIn.ServerLinks }, // Server Links - { 0x8A, PacketTypesIn.Waypoint }, // Waypoint - { 0x8B, PacketTypesIn.ClearDialog }, // Clear Dialog - { 0x8C, PacketTypesIn.ShowDialog } // Show Dialog - }; - - private readonly Dictionary typeOut = new() - { - { 0x00, PacketTypesOut.TeleportConfirm }, // Accept Teleportation - { 0x01, PacketTypesOut.Attack }, // Attack (new in 26.1) - { 0x02, PacketTypesOut.QueryBlockNBT }, // Block Entity Tag Query - { 0x03, PacketTypesOut.BundleItemSelected }, // Bundle Item Selected - { 0x04, PacketTypesOut.SetDifficulty }, // Change Difficulty - { 0x05, PacketTypesOut.ChangeGameMode }, // Change Game Mode - { 0x06, PacketTypesOut.MessageAcknowledgment }, // Chat Ack - { 0x07, PacketTypesOut.ChatCommand }, // Chat Command - { 0x08, PacketTypesOut.SignedChatCommand }, // Chat Command Signed - { 0x09, PacketTypesOut.ChatMessage }, // Chat - { 0x0A, PacketTypesOut.PlayerSession }, // Chat Session Update - { 0x0B, PacketTypesOut.ChunkBatchReceived }, // Chunk Batch Received - { 0x0C, PacketTypesOut.ClientStatus }, // Client Command - { 0x0D, PacketTypesOut.ClientTickEnd }, // Client Tick End - { 0x0E, PacketTypesOut.ClientSettings }, // Client Information - { 0x0F, PacketTypesOut.TabComplete }, // Command Suggestion - { 0x10, PacketTypesOut.AcknowledgeConfiguration }, // Configuration Acknowledged - { 0x11, PacketTypesOut.ClickWindowButton }, // Container Button Click - { 0x12, PacketTypesOut.ClickWindow }, // Container Click - { 0x13, PacketTypesOut.CloseWindow }, // Container Close - { 0x14, PacketTypesOut.ChangeContainerSlotState }, // Container Slot State Changed - { 0x15, PacketTypesOut.CookieResponse }, // Cookie Response - { 0x16, PacketTypesOut.PluginMessage }, // Custom Payload - { 0x17, PacketTypesOut.DebugSampleSubscription }, // Debug Subscription Request (renamed) - { 0x18, PacketTypesOut.EditBook }, // Edit Book - { 0x19, PacketTypesOut.EntityNBTRequest }, // Entity Tag Query - { 0x1A, PacketTypesOut.InteractEntity }, // Interact - { 0x1B, PacketTypesOut.GenerateStructure }, // Jigsaw Generate - { 0x1C, PacketTypesOut.KeepAlive }, // Keep Alive - { 0x1D, PacketTypesOut.LockDifficulty }, // Lock Difficulty - { 0x1E, PacketTypesOut.PlayerPosition }, // Move Player Pos - { 0x1F, PacketTypesOut.PlayerPositionAndRotation }, // Move Player Pos Rot - { 0x20, PacketTypesOut.PlayerRotation }, // Move Player Rot - { 0x21, PacketTypesOut.PlayerMovement }, // Move Player Status Only - { 0x22, PacketTypesOut.VehicleMove }, // Move Vehicle - { 0x23, PacketTypesOut.SteerBoat }, // Paddle Boat - { 0x24, PacketTypesOut.PickItem }, // Pick Item From Block - { 0x25, PacketTypesOut.PickItemFromEntity }, // Pick Item From Entity - { 0x26, PacketTypesOut.PingRequest }, // Ping Request - { 0x27, PacketTypesOut.CraftRecipeRequest }, // Place Recipe - { 0x28, PacketTypesOut.PlayerAbilities }, // Player Abilities - { 0x29, PacketTypesOut.PlayerDigging }, // Player Action - { 0x2A, PacketTypesOut.EntityAction }, // Player Command - { 0x2B, PacketTypesOut.SteerVehicle }, // Player Input - { 0x2C, PacketTypesOut.PlayerLoaded }, // Player Loaded - { 0x2D, PacketTypesOut.Pong }, // Pong - { 0x2E, PacketTypesOut.SetDisplayedRecipe }, // Recipe Book Change Settings - { 0x2F, PacketTypesOut.SetRecipeBookState }, // Recipe Book Seen Recipe - { 0x30, PacketTypesOut.NameItem }, // Rename Item - { 0x31, PacketTypesOut.ResourcePackStatus }, // Resource Pack - { 0x32, PacketTypesOut.AdvancementTab }, // Seen Advancements - { 0x33, PacketTypesOut.SelectTrade }, // Select Trade - { 0x34, PacketTypesOut.SetBeaconEffect }, // Set Beacon - { 0x35, PacketTypesOut.HeldItemChange }, // Set Carried Item - { 0x36, PacketTypesOut.UpdateCommandBlock }, // Set Command Block - { 0x37, PacketTypesOut.UpdateCommandBlockMinecart }, // Set Command Minecart - { 0x38, PacketTypesOut.CreativeInventoryAction }, // Set Creative Mode Slot - { 0x39, PacketTypesOut.SetGameRule }, // Set Game Rule (new in 26.1) - { 0x3A, PacketTypesOut.UpdateJigsawBlock }, // Set Jigsaw Block - { 0x3B, PacketTypesOut.UpdateStructureBlock }, // Set Structure Block - { 0x3C, PacketTypesOut.SetTestBlock }, // Set Test Block - { 0x3D, PacketTypesOut.UpdateSign }, // Sign Update - { 0x3F, PacketTypesOut.Animation }, // Swing - { 0x40, PacketTypesOut.Spectate }, // Teleport To Entity - { 0x41, PacketTypesOut.TestInstanceBlockAction }, // Test Instance Block Action - { 0x42, PacketTypesOut.PlayerBlockPlacement }, // Use Item On - { 0x43, PacketTypesOut.UseItem }, // Use Item - { 0x44, PacketTypesOut.CustomClickAction } // Custom Click Action - }; - - private readonly Dictionary configurationTypesIn = new() - { - { 0x00, ConfigurationPacketTypesIn.CookieRequest }, - { 0x01, ConfigurationPacketTypesIn.PluginMessage }, - { 0x02, ConfigurationPacketTypesIn.Disconnect }, - { 0x03, ConfigurationPacketTypesIn.FinishConfiguration }, - { 0x04, ConfigurationPacketTypesIn.KeepAlive }, - { 0x05, ConfigurationPacketTypesIn.Ping }, - { 0x06, ConfigurationPacketTypesIn.ResetChat }, - { 0x07, ConfigurationPacketTypesIn.RegistryData }, - { 0x08, ConfigurationPacketTypesIn.RemoveResourcePack }, - { 0x09, ConfigurationPacketTypesIn.ResourcePack }, - { 0x0A, ConfigurationPacketTypesIn.StoreCookie }, - { 0x0B, ConfigurationPacketTypesIn.Transfer }, - { 0x0C, ConfigurationPacketTypesIn.FeatureFlags }, - { 0x0D, ConfigurationPacketTypesIn.UpdateTags }, - { 0x0E, ConfigurationPacketTypesIn.KnownDataPacks }, - { 0x0F, ConfigurationPacketTypesIn.CustomReportDetails }, - { 0x10, ConfigurationPacketTypesIn.ServerLinks }, - { 0x11, ConfigurationPacketTypesIn.ClearDialog }, - { 0x12, ConfigurationPacketTypesIn.ShowDialog }, - { 0x13, ConfigurationPacketTypesIn.CodeOfConduct } - }; - - private readonly Dictionary configurationTypesOut = new() - { - { 0x00, ConfigurationPacketTypesOut.ClientInformation }, - { 0x01, ConfigurationPacketTypesOut.CookieResponse }, - { 0x02, ConfigurationPacketTypesOut.PluginMessage }, - { 0x03, ConfigurationPacketTypesOut.FinishConfiguration }, - { 0x04, ConfigurationPacketTypesOut.KeepAlive }, - { 0x05, ConfigurationPacketTypesOut.Pong }, - { 0x06, ConfigurationPacketTypesOut.ResourcePackResponse }, - { 0x07, ConfigurationPacketTypesOut.KnownDataPacks }, - { 0x08, ConfigurationPacketTypesOut.CustomClickAction }, - { 0x09, ConfigurationPacketTypesOut.AcceptCodeOfConduct } - }; - - protected override Dictionary GetListIn() => typeIn; - protected override Dictionary GetListOut() => typeOut; - protected override Dictionary GetConfigurationListIn() => configurationTypesIn!; - protected override Dictionary GetConfigurationListOut() => configurationTypesOut!; -} diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPaletteHelper.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPaletteHelper.cs deleted file mode 100644 index 84d5365189..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketPaletteHelper.cs +++ /dev/null @@ -1,164 +0,0 @@ -using System.Collections.Generic; -using System.IO; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes -{ - public static class PacketPaletteHelper - { - /// - /// Generate a code snippet of updated IDs from a modified packet palette (usually when you have updated packet item position) - /// - /// - /// You have inserted a new packet type with ID 0x02 into the copied new packet palette: - /// { 0x00, PacketTypesIn.SpawnEntity }, - /// { 0x01, PacketTypesIn.SpawnExperienceOrb }, - /// { 0xFF, PacketTypesIn.IamNewPacket }, // use 0xFF because it has conflict with old packet ID, we will correct the IDs now - /// { 0x02, PacketTypesIn.SpawnWeatherEntity }, - /// ... - /// - /// Call this method with your new packet palette: - /// UpdatePacketIdByItemPosition(new PacketPaletteXXXX(), "code_snippet.txt"); - /// And it will generate a Dictionary format with the Packet IDs corrected for you to copy and paste: - /// { 0x00, PacketTypesIn.SpawnEntity }, - /// { 0x01, PacketTypesIn.SpawnExperienceOrb }, - /// { 0x02, PacketTypesIn.IamNewPacket }, - /// { 0x03, PacketTypesIn.SpawnWeatherEntity }, - /// ... - /// - /// - /// - public static void UpdatePacketIdByItemPosition(PacketTypePalette palette, string outputFile) - { - // I am just too tired to create another full .cs file so... please just copy and paste - List lines = new() - { - "=== Inbound Packets ===" - }; - int i = 0; - foreach (var t in palette.GetMappingIn()) - { - lines.Add(string.Format("{{ 0x{0}, {1} }},", i.ToString("X2"), t.Value)); - i++; - } - lines.Add("=== End of Inbound ==="); - lines.Add(""); - lines.Add("=== Outbound Packets ==="); - i = 0; - foreach (var t in palette.GetMappingOut()) - { - lines.Add(string.Format("{{ 0x{0}, {1} }},", i.ToString("X2"), t.Value)); - i++; - } - lines.Add("=== End of Outbound ==="); - - File.WriteAllText(outputFile, string.Join("\r\n", lines)); - } - - /// - /// Generate a code snippet of rearranged order of packet types from a modified packet palette (usually when you have updated packet IDs) - /// - /// - /// You have changed some packet IDs: - /// { 0x00, PacketTypesIn.SpawnEntity }, - /// { 0x02, PacketTypesIn.SpawnExperienceOrb }, // ID changed from 0x02 -> 0x01 - /// { 0x01, PacketTypesIn.SpawnWeatherEntity }, // ID changed from 0x01 -> 0x02 - /// ... - /// - /// Call this method with your new packet palette: - /// UpdatePacketPositionToAscending(new PacketPaletteXXXX(), "code_snippet.txt"); - /// And it will generate a Dictionary format with the ascending order of Packet IDs for you to copy and paste: - /// { 0x00, PacketTypesIn.SpawnEntity }, - /// { 0x01, PacketTypesIn.SpawnWeatherEntity }, - /// { 0x02, PacketTypesIn.SpawnExperienceOrb }, - /// ... - /// - /// - /// - public static void UpdatePacketPositionToAscending(PacketTypePalette palette, string outputFile) - { - // I am just too tired to create another full .cs file so... please just copy and paste - List lines = new() - { - "=== Inbound Packets ===" - }; - for (int i = 0; i < palette.GetMappingIn().Count; i++) - { - lines.Add(string.Format("{{ 0x{0}, {1} }},", i.ToString("X2"), palette.GetMappingIn()[i])); - } - lines.Add("=== End of Inbound ==="); - lines.Add(""); - lines.Add("=== Outbound Packets ==="); - for (int i = 0; i < palette.GetMappingOut().Count; i++) - { - lines.Add(string.Format("{{ 0x{0}, {1} }},", i.ToString("X2"), palette.GetMappingOut()[i])); - } - lines.Add("=== End of Outbound ==="); - - File.WriteAllText(outputFile, string.Join("\r\n", lines)); - } - - /// - /// Generate PacketPaletteXXX.cs by feeding PacketTypesIn and PacketTypesOut list - /// - /// The output file name - /// The namespace to use in the generated class - /// Class name - /// List of PacketTypesIn - /// List of PacketTypesOut - /// - /// You need to make sure the order of each item are all correct for that MC version - /// Example format: - /// List pIn = new List() - /// { - /// PacketTypesIn.SpawnEntity, // packet ID of 0x00 - /// PacketTypesIn.SpawnExperienceOrb, // packet ID of 0x01 and so on - /// ... - /// } - /// - public static void GenerateIDsPacketByList(string outputFile, string namespaceToUse, string className, List pIn, List pOut) - { - const string TAB = " "; - const string TAB2 = " "; - const string TAB3 = " "; - List lines = new() - { - "using System.Collections.Generic;", - "", - "namespace " + namespaceToUse, - "{", - TAB + "public class " + className + " : PacketTypePalette", - TAB + "{", - TAB2 + "private readonly Dictionary typeIn = new()", - TAB2 + "{" - }; - for (int i = 0; i < pIn.Count; i++) - { - lines.Add(TAB3 + string.Format("{{ 0x{0}, PacketTypesIn.{1} }},", i.ToString("X2"), pIn[i])); - } - lines.Add(TAB2 + "};"); - lines.Add(""); - lines.Add(TAB2 + "private readonly Dictionary typeOut = new()"); - lines.Add(TAB2 + "{"); - for (int i = 0; i < pOut.Count; i++) - { - lines.Add(TAB3 + string.Format("{{ 0x{0}, PacketTypesOut.{1} }},", i.ToString("X2"), pOut[i])); - } - lines.Add(TAB2 + "};"); - lines.Add(""); - lines.Add(TAB2 + "protected override Dictionary GetListIn()"); - lines.Add(TAB2 + "{"); - lines.Add(TAB3 + "return typeIn;"); - lines.Add(TAB2 + "}"); - lines.Add(""); - lines.Add(TAB2 + "protected override Dictionary GetListOut()"); - lines.Add(TAB2 + "{"); - lines.Add(TAB3 + "return typeOut;"); - lines.Add(TAB2 + "}"); - lines.Add(TAB + "}"); - lines.Add("}"); - lines.Add(""); - - File.WriteAllText(outputFile, string.Join("\r\n", lines)); - } - } -} diff --git a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketTypePalette.cs b/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketTypePalette.cs deleted file mode 100644 index a3807275f4..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketPalettes/PacketTypePalette.cs +++ /dev/null @@ -1,212 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.PacketPalettes -{ - /// - /// Packet type palette - /// - /// - /// Steps for implementing palette for new Minecraft version: - /// 1. Check out https://wiki.vg/Pre-release_protocol to see if there is any packet got added/removed - /// 2. Add new packet type to PacketTypesIn.cs and PacketTypesOut.cs (if any) - /// 3. Create a new PacketPaletteXXX.cs by copying the latest version of existing PacketPaletteXXX.cs (could reduce massive works on writing a brand new one) - /// 4. Apply change to the copied PacketPaletteXXX.cs by either: - /// - Inserting new packet type to the correct position - /// - Removing packet type that got deleted - /// OR - /// - Changing the packet IDs manually - /// 5. Use PacketPaletteHelper to generate a code snippet and copy the generated code snippet back to PacketPaletteXXX.cs - /// - Use UpdatePacketPositionToAscending() if you changed the packet IDs manually - /// - Use UpdatePacketIdByItemPosition() if you inserted some packet type into the dictionary - /// Simply add the method call in Program.cs and run the program once. The code snippet will be generated - /// - /// - /// The way how Mojang change the packet ID is simple: - /// * Either adding/removing a packet from middle and cause packet ID below it get shifted - /// * Append a new packet at the end (but this is rare) - /// - public abstract class PacketTypePalette - { - protected abstract Dictionary GetListIn(); - protected abstract Dictionary GetListOut(); - protected abstract Dictionary GetConfigurationListIn(); - protected abstract Dictionary GetConfigurationListOut(); - - private readonly Dictionary reverseMappingIn = new(); - private readonly Dictionary reverseMappingOut = new(); - - private readonly Dictionary configurationReverseMappingIn = new(); - private readonly Dictionary configurationReverseMappingOut = new(); - - private bool forgeEnabled = false; - - public PacketTypePalette() - { - foreach (var p in GetListIn()) - reverseMappingIn.Add(p.Value, p.Key); - - foreach (var p in GetListOut()) - reverseMappingOut.Add(p.Value, p.Key); - - foreach (var p in GetConfigurationListIn()) - configurationReverseMappingIn.Add(p.Value, p.Key); - - foreach (var p in GetConfigurationListOut()) - configurationReverseMappingOut.Add(p.Value, p.Key); - } - - /// - /// Get incoming packet type by packet ID - /// - /// packet ID - /// Packet type - public PacketTypesIn GetIncomingTypeById(int packetId) - { - if (GetListIn().TryGetValue(packetId, out var p)) - { - return p; - } - else if (forgeEnabled) - { - if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLogLine("Ignoring unknown packet ID of 0x" + packetId.ToString("X2")); - return PacketTypesIn.Unknown; - } - else - throw new KeyNotFoundException("Packet ID of 0x" + packetId.ToString("X2") + " doesn't exist!"); - } - - /// - /// Get incoming packet ID by packet type - /// - /// Packet type - /// packet ID - public int GetIncomingIdByType(PacketTypesIn packetType) => reverseMappingIn[packetType]; - - /// - /// Get incoming configuration packet type by packet ID - /// - /// packet ID - /// Packet type - public ConfigurationPacketTypesIn GetIncomingConfigurationTypeById(int packetId) - { - if (GetConfigurationListIn().TryGetValue(packetId, out var p)) - { - return p; - } - else if (forgeEnabled) - { - if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLogLine("Ignoring unknown packet ID of 0x" + packetId.ToString("X2")); - return ConfigurationPacketTypesIn.Unknown; - } - else - throw new KeyNotFoundException("Configuration Packet ID of 0x" + packetId.ToString("X2") + - " doesn't exist!"); - } - - /// - /// Get incoming packet ID by packet type for configuration packets - /// - /// Packet type - /// packet ID - public int GetIncomingIdByType(ConfigurationPacketTypesIn packetType) => - configurationReverseMappingIn[packetType]; - - /// - /// Get outgoing packet type by packet ID - /// - /// Packet ID - /// Packet type - public PacketTypesOut GetOutgoingTypeById(int packetId) - { - if (GetListOut().TryGetValue(packetId, out var p)) - { - return p; - } - else if (forgeEnabled) - { - if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLogLine("Ignoring unknown packet ID of 0x" + packetId.ToString("X2")); - return PacketTypesOut.Unknown; - } - else - throw new KeyNotFoundException("Packet ID of 0x" + packetId.ToString("X2") + " doesn't exist!"); - } - - /// - /// Get outgoing packet ID by packet type - /// - /// Packet type - /// Packet ID - public int GetOutgoingIdByType(PacketTypesOut packetType) => reverseMappingOut[packetType]; - - /// - /// Get outgoing configuration packet type by packet ID - /// - /// Packet ID - /// Packet type - public ConfigurationPacketTypesOut GetOutgoingConfigurationTypeById(int packetId) - { - if (GetConfigurationListOut().TryGetValue(packetId, out var p)) - { - return p; - } - else if (forgeEnabled) - { - if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLogLine("Ignoring unknown packet ID of 0x" + packetId.ToString("X2")); - return ConfigurationPacketTypesOut.Unknown; - } - else - throw new KeyNotFoundException("Configuration Packet ID of 0x" + packetId.ToString("X2") + - " doesn't exist!"); - } - - /// - /// Get outgoing packet ID by packet type for configuration packets - /// - /// Packet type - /// Packet ID - public int GetOutgoingIdByTypeConfiguration(ConfigurationPacketTypesOut packetType) => - configurationReverseMappingOut[packetType]; - - /// - /// Public method for getting the type mapping - /// - /// PacketTypesIn with packet ID as index - public Dictionary GetMappingIn() => GetListIn(); - - /// - /// Public method for getting the type mapping - /// - /// PacketTypesOut with packet ID as index - public Dictionary GetMappingOut() => GetListOut(); - - /// - /// Public method for getting the type mapping for configuration packets - /// - /// PacketTypesIn with packet ID as index - public Dictionary GetMappingInConfiguration() => GetConfigurationListIn(); - - /// - /// Public method for getting the type mapping for configuration packets - /// - /// PacketTypesOut with packet ID as index - public Dictionary GetMappingOutConfiguration() => GetConfigurationListOut(); - - /// - /// Enable forge or disable forge - /// - /// - /// Have a rare chance that forge mod may modify packet ID. - /// Ignore packet type not found when forge enabled to - /// prevent program crash. - /// - /// - public void SetForgeEnabled(bool enabled) - { - forgeEnabled = enabled; - } - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/PacketType18Handler.cs b/MinecraftClient/Protocol/Handlers/PacketType18Handler.cs deleted file mode 100644 index 05443e379e..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketType18Handler.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using MinecraftClient.Protocol.Handlers.PacketPalettes; - -namespace MinecraftClient.Protocol.Handlers -{ - public class PacketTypeHandler - { - private readonly int protocol; - private readonly bool forgeEnabled = false; - - /// - /// Initialize the handler - /// - /// Protocol version to use - public PacketTypeHandler(int protocol) - { - this.protocol = protocol; - } - /// - /// Initialize the handler - /// - /// Protocol version to use - /// Is forge enabled or not - public PacketTypeHandler(int protocol, bool forgeEnabled) - { - this.protocol = protocol; - this.forgeEnabled = forgeEnabled; - } - /// - /// Initialize the handler - /// - public PacketTypeHandler() { } - - /// - /// Get the packet type palette - /// - /// - public PacketTypePalette GetTypeHandler() - { - return GetTypeHandler(protocol); - } - /// - /// Get the packet type palette - /// - /// Protocol version to use - /// - public PacketTypePalette GetTypeHandler(int protocol) - { - PacketTypePalette p = protocol switch - { - > Protocol18Handler.MC_26_2_Version => throw new NotImplementedException(Translations - .exception_palette_packet), - >= Protocol18Handler.MC_26_1_Version => new PacketPalette261(), // 26.1 - 26.2 (packet IDs unchanged in 26.2) - <= Protocol18Handler.MC_1_21_11_Version and > Protocol18Handler.MC_1_21_7_Version => new PacketPalette1219(), - <= Protocol18Handler.MC_1_21_7_Version and > Protocol18Handler.MC_1_21_5_Version => new PacketPalette1216(), - <= Protocol18Handler.MC_1_21_5_Version and > Protocol18Handler.MC_1_21_4_Version => new PacketPalette1215(), - <= Protocol18Handler.MC_1_21_4_Version and > Protocol18Handler.MC_1_21_2_Version => new PacketPalette1214(), - <= Protocol18Handler.MC_1_8_Version => new PacketPalette17(), - <= Protocol18Handler.MC_1_9_2_Version => new PacketPalette19(), - <= Protocol18Handler.MC_1_11_2_Version => new PacketPalette110(), - <= Protocol18Handler.MC_1_12_Version => new PacketPalette112(), - <= Protocol18Handler.MC_1_12_2_Version => new PacketPalette1122(), - < Protocol18Handler.MC_1_14_Version => new PacketPalette113(), - < Protocol18Handler.MC_1_15_Version => new PacketPalette114(), - <= Protocol18Handler.MC_1_15_2_Version => new PacketPalette115(), - <= Protocol18Handler.MC_1_16_1_Version => new PacketPalette116(), - <= Protocol18Handler.MC_1_16_5_Version => new PacketPalette1162(), - <= Protocol18Handler.MC_1_17_1_Version => new PacketPalette117(), - <= Protocol18Handler.MC_1_18_2_Version => new PacketPalette118(), - <= Protocol18Handler.MC_1_19_Version => new PacketPalette119(), - <= Protocol18Handler.MC_1_19_2_Version => new PacketPalette1192(), - <= Protocol18Handler.MC_1_19_3_Version => new PacketPalette1193(), - <= Protocol18Handler.MC_1_19_4_Version => new PacketPalette1194(), - <= Protocol18Handler.MC_1_20_Version => new PacketPalette1194(), - <= Protocol18Handler.MC_1_20_2_Version => new PacketPalette1202(), - <= Protocol18Handler.MC_1_20_4_Version => new PacketPalette1204(), - <= Protocol18Handler.MC_1_20_6_Version => new PacketPalette1206(), - <= Protocol18Handler.MC_1_21_Version => new PacketPalette121(), - _ => new PacketPalette1212() - }; - - p.SetForgeEnabled(forgeEnabled); - return p; - } - } -} diff --git a/MinecraftClient/Protocol/Handlers/PacketTypesIn.cs b/MinecraftClient/Protocol/Handlers/PacketTypesIn.cs deleted file mode 100644 index 8aee524a44..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketTypesIn.cs +++ /dev/null @@ -1,175 +0,0 @@ -namespace MinecraftClient.Protocol.Handlers -{ - /// - /// Incoming packet types - /// - public enum PacketTypesIn - { - AcknowledgePlayerDigging, // - ActionBar, // - Advancements, // - AttachEntity, // - Bundle, // Added in 1.19.4 - BlockAction, // - BlockBreakAnimation, // - BlockChange, // - BlockChangedAck, // Added in 1.19 - BlockEntityData, // - BossBar, // - Camera, // - ChangeGameState, // - ChatMessage, // - ChatPreview, // Added in 1.19 - ChatSuggestions, // Added in 1.19.1 (1.19.2) - ChunkBatchFinished, // Added in 1.20.2 - ChunkBatchStarted, // Added in 1.12.2 - ChunksBiomes, // Added in 1.19.4 - ChunkData, // - ClearTiles, // - CloseWindow, // - CollectItem, // - CombatEvent, // - CookieRequest, // Added in 1.20.6 - CraftRecipeResponse, // - CustomReportDetails, // Added in 1.21 (Not used) - DamageEvent, // Added in 1.19.4 - DeathCombatEvent, // - DebugSample, // Added in 1.20.6 - DeclareCommands, // - DeclareRecipes, // - DestroyEntities, // - Disconnect, // - DisplayScoreboard, // - Effect, // - EndCombatEvent, // - EnterCombatEvent, // - EntityAnimation, // - EntityEffect, // - EntityEquipment, // - EntityHeadLook, // - EntityMetadata, // - EntityMovement, // - EntityPosition, // - EntityPositionAndRotation, // - EntityPositionSync, // Added in 1.21.2 - EntityProperties, // - EntityRotation, // - EntitySoundEffect, // - EntityStatus, // - EntityTeleport, // - EntityVelocity, // - Explosion, // - MoveMinecartAlongTrack, // Added in 1.21.2 - FacePlayer, // - FeatureFlags, // Added in 1.19.3 - HeldItemChange, // - HideMessage, // Added in 1.19.1 (1.19.2) - HurtAnimation, // Added in 1.19.4 - InitializeWorldBorder, // - JoinGame, // - KeepAlive, // - MapChunkBulk, // For 1.8 or below - MapData, // - MessageHeader, // Added in 1.19.1 (1.19.2) - MultiBlockChange, // - NamedSoundEffect, // - NBTQueryResponse, // - OpenBook, // - OpenHorseWindow, // - OpenSignEditor, // - OpenWindow, // - Particle, // - Ping, // - PingResponse, // Added in 1.20.2 - PlayerAbilities, // - PlayerInfo, // - PlayerListHeaderAndFooter, // - PlayerRemove, // Added in 1.19.3 (Not used) - PlayerPositionAndLook, // - PlayerRotation, // Added in 1.21.2 - PluginMessage, // - ProfilelessChatMessage, // Added in 1.19.3 - ProjectilePower, // Added in 1.20.6 - RemoveEntityEffect, // - RemoveResourcePack, // Added in 1.20.3 - ResetScore, // Added in 1.20.3 - ResourcePackSend, // - Respawn, // - RecipeBookAdd, // Added in 1.21.2 (replaces UnlockRecipes) - RecipeBookRemove, // Added in 1.21.2 - RecipeBookSettings, // Added in 1.21.2 - ScoreboardObjective, // - SelectAdvancementTab, // - ServerData, // Added in 1.19 - ServerDifficulty, // - ServerLinks, // Added in 1.21 (Not used) - SetCompression, // For 1.8 or below - SetCooldown, // - SetCursorItem, // Added in 1.21.2 - SetDisplayChatPreview, // Added in 1.19 - SetExperience, // - SetHeldSlot, // Added in 1.21.2 (replaces HeldItemChange clientbound) - SetPassengers, // - SetPlayerInventory, // Added in 1.21.2 - SetSlot, // - SetTickingState, // Added in 1.20.3 - StepTick, // Added in 1.20.3 - SetTitleSubTitle, // - SetTitleText, // - SetTitleTime, // - SkulkVibrationSignal, // - SoundEffect, // - SpawnEntity, // - SpawnExperienceOrb, // - SpawnLivingEntity, // - SpawnPainting, // - SpawnPlayer, // - SpawnPosition, // - SpawnWeatherEntity, // - StartConfiguration, // Added in 1.20.2 - Statistics, // - StopSound, // - StoreCookie, // Added in 1.20.6 - SystemChat, // Added in 1.19 - TabComplete, // - Tags, // - Teams, // - TestInstanceBlockStatus, // Added in 1.21.5 - TimeUpdate, // - Title, // - TradeList, // - Transfer, // Added in 1.20.6 - Unknown, // For old version packet that have been removed and not used by mcc - UnloadChunk, // - UnlockRecipes, // - UpdateEntityNBT, // For 1.8 or below - UpdateHealth, // - UpdateLight, // - UpdateScore, // - UpdateSign, // For 1.8 or below, and 1.9-1.9.2 - UpdateSimulationDistance, // - UpdateViewDistance, // - UpdateViewPosition, // - UseBed, // For 1.13.2 or below - VehicleMove, // - WindowConfirmation, // - WindowItems, // - WindowProperty, // - WorldBorder, // - WorldBorderCenter, // - WorldBorderLerpSize, // - WorldBorderSize, // - WorldBorderWarningDelay, // - WorldBorderWarningReach, // - Waypoint, // Added in 1.21.6 - ClearDialog, // Added in 1.21.6 - ShowDialog, // Added in 1.21.6 - DebugBlockValue, // Added in 1.21.9 - DebugChunkValue, // Added in 1.21.9 - DebugEntityValue, // Added in 1.21.9 - DebugEvent, // Added in 1.21.9 - GameTestHighlightPos, // Added in 1.21.9 - GameRuleValues, // Added in 26.1 - LowDiskSpaceWarning, // Added in 26.1 - } -} diff --git a/MinecraftClient/Protocol/Handlers/PacketTypesOut.cs b/MinecraftClient/Protocol/Handlers/PacketTypesOut.cs deleted file mode 100644 index 99704ae86b..0000000000 --- a/MinecraftClient/Protocol/Handlers/PacketTypesOut.cs +++ /dev/null @@ -1,84 +0,0 @@ -namespace MinecraftClient.Protocol.Handlers -{ - /// - /// Outgoing packet types - /// - public enum PacketTypesOut - { - AcknowledgeConfiguration, // Added in 1.20.2 - AdvancementTab, // - Animation, // - BundleItemSelected, // Added in 1.21.2 - ChangeContainerSlotState, // Added in 1.20.3 - ChatCommand, // Added in 1.19 - ChatMessage, // - ChatPreview, // Added in 1.19 - ChunkBatchReceived, // Added in 1.20.2 - ClickWindow, // - ClickWindowButton, // - ClientSettings, // - ClientStatus, // - ClientTickEnd, // Added in 1.21.2 - CloseWindow, // - CraftRecipeRequest, // - CreativeInventoryAction, // - CookieResponse, // Added in 1.20.6 - DebugSampleSubscription, // Added in 1.20.6 - EditBook, // - EnchantItem, // For 1.13.2 or below - EntityAction, // - EntityNBTRequest, // - GenerateStructure, // Added in 1.16 - HeldItemChange, // - InteractEntity, // - KeepAlive, // - KnownDataPacks, // Added in 1.20.6 - LockDifficulty, // - MessageAcknowledgment, // Added in 1.19.1 (1.19.2) - NameItem, // - PickItem, // - PickItemFromEntity, // Added in 1.21.4 (split from PickItem) - PingRequest, // Added in 1.20.2 - PlayerAbilities, // - PlayerBlockPlacement, // - PlayerDigging, // - PlayerLoaded, // Added in 1.21.4 - PlayerMovement, // - PlayerPosition, // - PlayerPositionAndRotation, // - PlayerRotation, // - PlayerSession, // Added in 1.19.3 - PluginMessage, // - Pong, // - PrepareCraftingGrid, // For 1.12 - 1.12.1 only - QueryBlockNBT, // - RecipeBookData, // - ResourcePackStatus, // - SelectTrade, // - SetBeaconEffect, // - SetDifficulty, // - SetDisplayedRecipe, // Added in 1.16.2 - SetRecipeBookState, // Added in 1.16.2 - SignedChatCommand, // Added in 1.20.6 - Spectate, // - SteerBoat, // - SteerVehicle, // - TabComplete, // - TeleportConfirm, // - Unknown, // For old version packet that have been removed and not used by mcc - UpdateCommandBlock, // - UpdateCommandBlockMinecart, // - UpdateJigsawBlock, // - UpdateSign, // - UpdateStructureBlock, // - SetTestBlock, // Added in 1.21.5 - TestInstanceBlockAction, // Added in 1.21.5 - UseItem, // - VehicleMove, // - WindowConfirmation, // - ChangeGameMode, // Added in 1.21.6 - CustomClickAction, // Added in 1.21.6 - Attack, // Added in 26.1 - SetGameRule, // Added in 26.1 - } -} diff --git a/MinecraftClient/Protocol/Handlers/Protocol16.cs b/MinecraftClient/Protocol/Handlers/Protocol16.cs deleted file mode 100644 index f7bd3d4aac..0000000000 --- a/MinecraftClient/Protocol/Handlers/Protocol16.cs +++ /dev/null @@ -1,970 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; -using System.Linq; -using System.Net.Sockets; -using System.Security.Cryptography; -using System.Text; -using System.Threading; -using MinecraftClient.Crypto; -using MinecraftClient.Inventory; -using MinecraftClient.Mapping; -using MinecraftClient.Protocol.Message; -using MinecraftClient.Protocol.ProfileKey; -using MinecraftClient.Protocol.Session; -using MinecraftClient.Proxy; -using MinecraftClient.Scripting; -using static MinecraftClient.Settings; -using static MinecraftClient.Settings.MainConfigHelper.MainConfig.GeneralConfig; - -namespace MinecraftClient.Protocol.Handlers -{ - /// - /// Implementation for Minecraft 1.4.X, 1.5.X, 1.6.X Protocols - /// - - class Protocol16Handler : IMinecraftCom - { - readonly IMinecraftComHandler handler; - private bool encrypted = false; - private readonly int protocolversion; - private Tuple? netRead = null; - Crypto.AesCfb8Stream? s; - readonly TcpClient c; - - public Protocol16Handler(TcpClient Client, int ProtocolVersion, IMinecraftComHandler Handler) - { - ConsoleIO.SetAutoCompleteEngine(this); - if (protocolversion >= 72) - ChatParser.InitTranslations(); - c = Client; - protocolversion = ProtocolVersion; - handler = Handler; - - if (Handler.GetTerrainEnabled()) - { - ConsoleIO.WriteLineFormatted("§c" + Translations.extra_terrainandmovement_disabled, acceptnewlines: true); - Handler.SetTerrainEnabled(false); - } - - if (handler.GetInventoryEnabled()) - { - ConsoleIO.WriteLineFormatted("§c" + Translations.extra_inventory_disabled, acceptnewlines: true); - handler.SetInventoryEnabled(false); - } - - if (handler.GetEntityHandlingEnabled()) - { - ConsoleIO.WriteLineFormatted("§c" + Translations.extra_entity_disabled, acceptnewlines: true); - handler.SetEntityHandlingEnabled(false); - } - } - -#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. - // "IMinecraftComHandler handler" will not be used here. - private Protocol16Handler(TcpClient Client) -#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. - { - c = Client; - } - - private void Updater(object? o) - { - var cancelToken = (CancellationToken)o!; - - if (cancelToken.IsCancellationRequested) - return; - - try - { - Stopwatch stopWatch = Stopwatch.StartNew(); - long nextUpdateDue = 0; - - while (!cancelToken.IsCancellationRequested) - { - cancelToken.ThrowIfCancellationRequested(); - - long elapsedMilliseconds = stopWatch.ElapsedMilliseconds; - while (elapsedMilliseconds >= nextUpdateDue) - { - if (!Update()) - return; - - nextUpdateDue += ClientTickIntervalMilliseconds; - elapsedMilliseconds = stopWatch.ElapsedMilliseconds; - } - - long sleepLength = nextUpdateDue - stopWatch.ElapsedMilliseconds; - if (sleepLength > 1) - Thread.Sleep((int)Math.Min(sleepLength, ClientTickIntervalMilliseconds)); - } - } - catch (System.IO.IOException) { } - catch (SocketException) { } - catch (ObjectDisposedException) { } - catch (OperationCanceledException) { } - - if (cancelToken.IsCancellationRequested) - return; - - handler.OnConnectionLost(ChatBot.DisconnectReason.ConnectionLost, ""); - } - - private bool Update() - { - handler.OnUpdate(); - bool connection_ok = true; - while (c.Client.Available > 0 && connection_ok) - { - byte id = ReadNextByte(); - connection_ok = ProcessPacket(id); - } - return connection_ok; - } - - private bool ProcessPacket(byte id) - { - int nbr; - switch (id) - { - case 0x00: - byte[] keepalive = new byte[5] { 0, 0, 0, 0, 0 }; - Receive(keepalive, 1, 4, SocketFlags.None); - handler.OnServerKeepAlive(); - handler.SetCanSendMessage(true); - Send(keepalive); break; - case 0x01: ReadData(4); ReadNextString(); ReadData(5); break; - case 0x02: ReadData(1); ReadNextString(); ReadNextString(); ReadData(4); break; - case 0x03: - string message = ReadNextString(); - handler.OnTextReceived(new ChatMessage(message, null, protocolversion >= 72, -1, Guid.Empty)); break; - case 0x04: ReadData(16); break; - case 0x05: ReadData(6); ReadNextItemSlot(); break; - case 0x06: ReadData(12); break; - case 0x07: ReadData(9); break; - case 0x08: if (protocolversion >= 72) { ReadData(10); } else ReadData(8); break; - case 0x09: ReadData(8); ReadNextString(); break; - case 0x0A: ReadData(1); break; - case 0x0B: ReadData(33); break; - case 0x0C: ReadData(9); break; - case 0x0D: ReadData(41); break; - case 0x0E: ReadData(11); break; - case 0x0F: ReadData(10); ReadNextItemSlot(); ReadData(3); break; - case 0x10: ReadData(2); break; - case 0x11: ReadData(14); break; - case 0x12: ReadData(5); break; - case 0x13: if (protocolversion >= 72) { ReadData(9); } else ReadData(5); break; - case 0x14: ReadData(4); ReadNextString(); ReadData(16); ReadNextEntityMetaData(); break; - case 0x16: ReadData(8); break; - case 0x17: ReadData(19); ReadNextObjectData(); break; - case 0x18: ReadData(26); ReadNextEntityMetaData(); break; - case 0x19: ReadData(4); ReadNextString(); ReadData(16); break; - case 0x1A: ReadData(18); break; - case 0x1B: if (protocolversion >= 72) { ReadData(10); } break; - case 0x1C: ReadData(10); break; - case 0x1D: nbr = (int)ReadNextByte(); ReadData(nbr * 4); break; - case 0x1E: ReadData(4); break; - case 0x1F: ReadData(7); break; - case 0x20: ReadData(6); break; - case 0x21: ReadData(9); break; - case 0x22: ReadData(18); break; - case 0x23: ReadData(5); break; - case 0x26: ReadData(5); break; - case 0x27: if (protocolversion >= 72) { ReadData(9); } else ReadData(8); break; - case 0x28: ReadData(4); ReadNextEntityMetaData(); break; - case 0x29: ReadData(8); break; - case 0x2A: ReadData(5); break; - case 0x2B: ReadData(8); break; - case 0x2C: if (protocolversion >= 72) { ReadNextEntityProperties(protocolversion); } break; - case 0x33: ReadData(13); nbr = ReadNextInt(); ReadData(nbr); break; - case 0x34: ReadData(10); nbr = ReadNextInt(); ReadData(nbr); break; - case 0x35: ReadData(12); break; - case 0x36: ReadData(14); break; - case 0x37: ReadData(17); break; - case 0x38: ReadNextChunkBulkData(); break; - case 0x3C: ReadData(28); nbr = ReadNextInt(); ReadData(3 * nbr); ReadData(12); break; - case 0x3D: ReadData(18); break; - case 0x3E: ReadNextString(); ReadData(17); break; - case 0x3F: if (protocolversion > 51) { ReadNextString(); ReadData(32); } break; - case 0x46: ReadData(2); break; - case 0x47: ReadData(17); break; - case 0x64: ReadNextWindowData(protocolversion); break; - case 0x65: ReadData(1); break; - case 0x66: ReadData(7); ReadNextItemSlot(); break; - case 0x67: ReadData(3); ReadNextItemSlot(); break; - case 0x68: ReadData(1); for (nbr = ReadNextShort(); nbr > 0; nbr--) { ReadNextItemSlot(); } break; - case 0x69: ReadData(5); break; - case 0x6A: ReadData(4); break; - case 0x6B: ReadData(2); ReadNextItemSlot(); break; - case 0x6C: ReadData(2); break; - case 0x82: ReadData(10); ReadNextString(); ReadNextString(); ReadNextString(); ReadNextString(); break; - case 0x83: ReadData(4); nbr = ReadNextShort(); ReadData(nbr); break; - case 0x84: ReadData(11); nbr = ReadNextShort(); if (nbr > 0) { ReadData(nbr); } break; - case 0x85: if (protocolversion >= 74) { ReadData(13); } break; - case 0xC8: - if (ReadNextInt() == 2022) { ConsoleIO.WriteLogLine(Translations.mcc_player_dead, acceptnewlines: true); } - if (protocolversion >= 72) { ReadData(4); } else ReadData(1); - break; - case 0xC9: - string name = ReadNextString(); bool online = ReadNextByte() != 0x00; ReadData(2); - Guid FakeUUID = new(MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(name)).Take(16).ToArray()); - if (online) handler.OnPlayerJoin(new PlayerInfo(name, FakeUUID)); - else handler.OnPlayerLeave(FakeUUID); - break; - case 0xCA: if (protocolversion >= 72) { ReadData(9); } else ReadData(3); break; - case 0xCB: - string resultString = ReadNextString(); - if (!string.IsNullOrEmpty(resultString)) - { - string[] result = resultString.Split((char)0x00); - handler.OnAutoCompleteDone(0, result); - } - break; - case 0xCC: ReadNextString(); ReadData(4); break; - case 0xCD: ReadData(1); break; - case 0xCE: if (protocolversion > 51) { ReadNextString(); ReadNextString(); ReadData(1); } break; - case 0xCF: if (protocolversion > 51) { ReadNextString(); ReadData(1); ReadNextString(); } ReadData(4); break; - case 0xD0: if (protocolversion > 51) { ReadData(1); ReadNextString(); } break; - case 0xD1: if (protocolversion > 51) { ReadNextTeamData(); } break; - case 0xFA: - string channel = ReadNextString(); - byte[] payload = ReadNextByteArray(); - handler.OnPluginChannelMessage(channel, payload); - break; - case 0xFF: - string reason = ReadNextString(); - handler.OnConnectionLost(ChatBot.DisconnectReason.InGameKick, reason); break; - default: return false; //unknown packet! - } - return true; //packet has been successfully skipped - } - - private void StartUpdating() - { - netRead = new(new Thread(new ParameterizedThreadStart(Updater)), new CancellationTokenSource()); - netRead.Item1.Name = "ProtocolPacketHandler"; - netRead.Item1.Start(netRead.Item2.Token); - } - - /// - /// Get net read thread (main thread) ID - /// - /// Net read thread ID - public int GetNetMainThreadId() - { - return netRead is not null ? netRead.Item1.ManagedThreadId : -1; - } - - public bool SendCookieResponse(string name, byte[]? data) - { - throw new NotImplementedException(); - } - - public bool SendKnownDataPacks(List<(string, string, string)> knownDataPacks) - { - throw new NotImplementedException(); - } - - public bool SendCustomClickAction(string id, Dictionary? payload) - { - return false; - } - - public void Dispose() - { - try - { - if (netRead is not null) - { - netRead.Item2.Cancel(); - c.Close(); - } - } - catch { } - } - - private void ReadData(int offset) - { - if (offset > 0) - { - try - { - byte[] cache = new byte[offset]; - Receive(cache, 0, offset, SocketFlags.None); - } - catch (OutOfMemoryException) { } - } - } - - private string ReadNextString() - { - ushort length = (ushort)ReadNextShort(); - if (length > 0) - { - byte[] cache = new byte[length * 2]; - Receive(cache, 0, length * 2, SocketFlags.None); - string result = Encoding.BigEndianUnicode.GetString(cache); - return result; - } - else return ""; - } - public bool SendEntityAction(int PlayerEntityID, int ActionID) - { - return false; - } - - private byte[] ReadNextByteArray() - { - short len = ReadNextShort(); - byte[] data = new byte[len]; - Receive(data, 0, len, SocketFlags.None); - return data; - } - - private short ReadNextShort() - { - byte[] tmp = new byte[2]; - Receive(tmp, 0, 2, SocketFlags.None); - Array.Reverse(tmp); - return BitConverter.ToInt16(tmp, 0); - } - - private int ReadNextInt() - { - byte[] tmp = new byte[4]; - Receive(tmp, 0, 4, SocketFlags.None); - Array.Reverse(tmp); - return BitConverter.ToInt32(tmp, 0); - } - - private byte ReadNextByte() - { - byte[] result = new byte[1]; - Receive(result, 0, 1, SocketFlags.None); - return result[0]; - } - - private void ReadNextItemSlot() - { - short itemid = ReadNextShort(); - //If slot not empty (item ID != -1) - if (itemid != -1) - { - ReadData(1); //Item count - ReadData(2); //Item damage - short length = ReadNextShort(); - //If length of optional NBT data > 0, read it - if (length > 0) { ReadData(length); } - } - } - - private void ReadNextEntityMetaData() - { - do - { - byte[] id = new byte[1]; - Receive(id, 0, 1, SocketFlags.None); - if (id[0] == 0x7F) { break; } - int index = id[0] & 0x1F; - int type = id[0] >> 5; - switch (type) - { - case 0: ReadData(1); break; //Byte - case 1: ReadData(2); break; //Short - case 2: ReadData(4); break; //Int - case 3: ReadData(4); break; //Float - case 4: ReadNextString(); break; //String - case 5: ReadNextItemSlot(); break; //Slot - case 6: ReadData(12); break; //Vector (3 Int) - } - } while (true); - } - - private void ReadNextObjectData() - { - int id = ReadNextInt(); - if (id != 0) { ReadData(6); } - } - - private void ReadNextTeamData() - { - ReadNextString(); //Internal Name - byte mode = ReadNextByte(); - - if (mode == 0 || mode == 2) - { - ReadNextString(); //Display Name - ReadNextString(); //Prefix - ReadNextString(); //Suffix - ReadData(1); //Friendly Fire - } - - if (mode == 0 || mode == 3 || mode == 4) - { - short count = ReadNextShort(); - for (int i = 0; i < count; i++) - { - ReadNextString(); //Players - } - } - } - - private void ReadNextEntityProperties(int protocolversion) - { - if (protocolversion >= 72) - { - if (protocolversion >= 74) - { - //Minecraft 1.6.2 - ReadNextInt(); //Entity ID - int count = ReadNextInt(); - for (int i = 0; i < count; i++) - { - ReadNextString(); //Property name - ReadData(8); //Property value (Double) - short othercount = ReadNextShort(); - ReadData(25 * othercount); - } - } - else - { - //Minecraft 1.6.0 / 1.6.1 - ReadNextInt(); //Entity ID - int count = ReadNextInt(); - for (int i = 0; i < count; i++) - { - ReadNextString(); //Property name - ReadData(8); //Property value (Double) - } - } - } - } - - private void ReadNextWindowData(int protocolversion) - { - ReadData(1); - byte windowtype = ReadNextByte(); - ReadNextString(); - ReadData(1); - if (protocolversion > 51) - { - ReadData(1); - if (protocolversion >= 72 && windowtype == 0xb) - { - ReadNextInt(); - } - } - } - - private void ReadNextChunkBulkData() - { - short chunkcount = ReadNextShort(); - int datalen = ReadNextInt(); - ReadData(1); - ReadData(datalen); - ReadData(12 * (chunkcount)); - } - - private void Receive(byte[] buffer, int start, int offset, SocketFlags f) - { - int read = 0; - while (read < offset) - { - if (encrypted) - read += s!.Read(buffer, start + read, offset - read); - else - read += c.Client.Receive(buffer, start + read, offset - read, f); - } - } - - private void Send(byte[] buffer) - { - if (encrypted) - s!.Write(buffer, 0, buffer.Length); - else - c.Client.Send(buffer); - } - - private bool Handshake(string uuid, string username, string sessionID, string host, int port, SessionToken session) - { - //array - byte[] data = new byte[10 + (username.Length + host.Length) * 2]; - - //packet id - data[0] = (byte)2; - - //Protocol Version - data[1] = (byte)protocolversion; - - //short len - byte[] sh = BitConverter.GetBytes((short)username.Length); - Array.Reverse(sh); - sh.CopyTo(data, 2); - - //username - byte[] bname = Encoding.BigEndianUnicode.GetBytes(username); - bname.CopyTo(data, 4); - - //short len - sh = BitConverter.GetBytes((short)host.Length); - Array.Reverse(sh); - sh.CopyTo(data, 4 + (username.Length * 2)); - - //host - byte[] bhost = Encoding.BigEndianUnicode.GetBytes(host); - bhost.CopyTo(data, 6 + (username.Length * 2)); - - //port - sh = BitConverter.GetBytes(port); - Array.Reverse(sh); - sh.CopyTo(data, 6 + (username.Length * 2) + (host.Length * 2)); - - Send(data); - - byte[] pid = new byte[1]; - Receive(pid, 0, 1, SocketFlags.None); - while (pid[0] == 0xFA) //Skip some early plugin messages - { - ProcessPacket(pid[0]); - Receive(pid, 0, 1, SocketFlags.None); - } - if (pid[0] == 0xFD) - { - string serverID = ReadNextString(); - byte[] PublicServerkey = ReadNextByteArray(); - byte[] token = ReadNextByteArray(); - - if (serverID == "-") - ConsoleIO.WriteLineFormatted("§8" + Translations.mcc_server_offline, acceptnewlines: true); - else if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.mcc_handshake, serverID)); - - return StartEncryption(uuid, username, sessionID, Config.Main.General.AccountType, token, serverID, PublicServerkey, session); - } - else - { - ConsoleIO.WriteLineFormatted("§8" + Translations.error_invalid_response, acceptnewlines: true); - return false; - } - } - - private bool StartEncryption(string uuid, string username, string sessionID, LoginType type, byte[] token, string serverIDhash, byte[] serverPublicKey, SessionToken session) - { - RSACryptoServiceProvider RSAService = CryptoHandler.DecodeRSAPublicKey(serverPublicKey)!; - byte[] secretKey = CryptoHandler.ClientAESPrivateKey ?? CryptoHandler.GenerateAESPrivateKey(); - - if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted("§8" + Translations.debug_crypto, acceptnewlines: true); - - if (serverIDhash != "-" && !string.IsNullOrWhiteSpace(sessionID)) - { - ConsoleIO.WriteLine(Translations.mcc_session); - string serverHash = CryptoHandler.GetServerHash(serverIDhash, serverPublicKey, secretKey); - - bool needCheckSession = true; - if (session.ServerPublicKey is not null && session.SessionPreCheckTask is not null - && serverIDhash == session.ServerIDhash && Enumerable.SequenceEqual(serverPublicKey, session.ServerPublicKey)) - { - session.SessionPreCheckTask.Wait(); - if (session.SessionPreCheckTask.Result) // PreCheck Successed - needCheckSession = false; - } - - if (needCheckSession) - { - if (ProtocolHandler.SessionCheck(uuid, sessionID, serverHash, type)) - { - session.ServerIDhash = serverIDhash; - session.ServerPublicKey = serverPublicKey; - SessionCache.Store(InternalConfig.Account.Login.ToLower(), session); - } - else - { - handler.OnConnectionLost(ChatBot.DisconnectReason.LoginRejected, Translations.mcc_session_fail); - return false; - } - } - } - - - //Encrypt the data - byte[] key_enc = RSAService.Encrypt(secretKey, false); - byte[] token_enc = RSAService.Encrypt(token, false); - byte[] keylen = BitConverter.GetBytes((short)key_enc.Length); - byte[] tokenlen = BitConverter.GetBytes((short)token_enc.Length); - - Array.Reverse(keylen); - Array.Reverse(tokenlen); - - //Building the packet - byte[] data = new byte[5 + (short)key_enc.Length + (short)token_enc.Length]; - data[0] = 0xFC; - keylen.CopyTo(data, 1); - key_enc.CopyTo(data, 3); - tokenlen.CopyTo(data, 3 + (short)key_enc.Length); - token_enc.CopyTo(data, 5 + (short)key_enc.Length); - - //Send it back - Send(data); - - //Getting the next packet - byte[] pid = new byte[1]; - Receive(pid, 0, 1, SocketFlags.None); - if (pid[0] == 0xFC) - { - ReadData(4); - s = new AesCfb8Stream(c.GetStream(), secretKey); - encrypted = true; - return true; - } - else - { - ConsoleIO.WriteLineFormatted("§8" + Translations.error_invalid_encrypt, acceptnewlines: true); - return false; - } - } - - public bool Login(PlayerKeyPair? playerKeyPair, SessionToken session, bool isTransfer = false) - { - if (Handshake(handler.GetUserUuidStr(), handler.GetUsername(), handler.GetSessionID(), handler.GetServerHost(), handler.GetServerPort(), session)) - { - Send(new byte[] { 0xCD, 0 }); - try - { - byte[] pid = new byte[1]; - try - { - if (c.Connected) - { - Receive(pid, 0, 1, SocketFlags.None); - while (pid[0] >= 0xC0 && pid[0] != 0xFF) //Skip some early packets or plugin messages - { - ProcessPacket(pid[0]); - Receive(pid, 0, 1, SocketFlags.None); - } - if (pid[0] == (byte)1) - { - ReadData(4); ReadNextString(); ReadData(5); - StartUpdating(); - return true; //The Server accepted the request - } - else if (pid[0] == (byte)0xFF) - { - string reason = ReadNextString(); - handler.OnConnectionLost(ChatBot.DisconnectReason.LoginRejected, reason); - return false; - } - } - } - catch (Exception e) - { - //Connection failed - ConsoleIO.WriteLineFormatted("§8" + e.GetType().Name + ": " + e.Message); - return false; - } - } - catch - { - handler.OnConnectionLost(ChatBot.DisconnectReason.ConnectionLost, ""); - return false; - } - return false; //Login was unsuccessful (received a kick...) - } - else return false; - } - - public void Disconnect() - { - const string message = "disconnect.quitting"; - - try - { - byte[] reason = new byte[3 + (message.Length * 2)]; - reason[0] = (byte)0xff; - - byte[] msglen; - msglen = BitConverter.GetBytes((short)message.Length); - Array.Reverse(msglen); - msglen.CopyTo(reason, 1); - - if (message.Length > 0) - { - byte[] msg; - msg = Encoding.BigEndianUnicode.GetBytes(message); - msg.CopyTo(reason, 3); - } - - Send(reason); - } - catch (SocketException) { } - catch (System.IO.IOException) { } - } - - public int GetMaxChatMessageLength() - { - int configOverride = Settings.MainConfigHelper.Config.Advanced.MaxChatMessageLength; - return configOverride > 0 ? configOverride : 100; - } - - public int GetProtocolVersion() - { - return protocolversion; - } - - public bool SendChatMessage(string message, PlayerKeyPair? playerKeyPair) - { - if (String.IsNullOrEmpty(message)) - return true; - - try - { - byte[] chat = new byte[3 + (message.Length * 2)]; - chat[0] = (byte)3; - - byte[] msglen; - msglen = BitConverter.GetBytes((short)message.Length); - Array.Reverse(msglen); - msglen.CopyTo(chat, 1); - - byte[] msg; - msg = Encoding.BigEndianUnicode.GetBytes(message); - msg.CopyTo(chat, 3); - - Send(chat); - return true; - } - catch (SocketException) { return false; } - catch (System.IO.IOException) { return false; } - } - - public bool SendRespawnPacket() - { - try - { - Send(new byte[] { 0xCD, 1 }); - return true; - } - catch (SocketException) { return false; } - } - - public bool SendUpdateSign(Location location, string line1, string line2, string line3, string line4, bool isFrontText = true) - { - return false; //Currently not implemented - } - - public bool SendBrandInfo(string brandInfo) - { - return false; //Only supported since MC 1.7 - } - - public bool SendClientSettings(string language, byte viewDistance, byte difficulty, byte chatMode, bool chatColors, byte skinParts, byte mainHand) - { - return false; //Currently not implemented - } - - public bool SendLocationUpdate(Location location, bool onGround, bool horizontalCollision, float? yaw, float? pitch) - { - return false; //Currently not implemented - } - - public bool SendInteractEntity(int EntityID, int type) - { - return false; //Currently not implemented - } - - public bool SendInteractEntity(int EntityID, int type, float X, float Y, float Z, int hand) - { - return false; //Currently not implemented - } - - public bool SendInteractEntity(int EntityID, int type, float X, float Y, float Z) - { - return false; //Currently not implemented - } - - public bool SendInteractEntity(int EntityID, int type, int hand) - { - return false; //Currently not implemented - } - - public bool UpdateCommandBlock(Location location, string command, CommandBlockMode mode, CommandBlockFlags flags) - { - return false; //Currently not implemented - } - - public bool SendUseItem(int hand, int sequenceId) - { - return false; //Currently not implemented - } - - public bool SendWindowAction(int windowId, int slotId, WindowActionType action, Item? item, List> changedSlots, int stateId) - { - return false; //Currently not implemented - } - - public bool SendAnimation(int animation, int playerid) - { - return false; //Currently not implemented - } - - public bool SendCreativeInventoryAction(int slot, ItemType item, int count, Dictionary? nbt) - { - return false; //Currently not implemented - } - - public bool ClickContainerButton(int windowId, int buttonId) - { - return false; //Currently not implemented - } - - public bool SendPlaceRecipe(int windowId, string recipeId, bool makeAll) - { - return false; //MC 1.8-1.12.1 recipe book not supported - } - - public bool SendEditBook(Item currentBook, IReadOnlyList pages, string? title, string author, int selectedHotbarSlot) - { - return false; //MC 1.4.6-1.6.4 book editing is not supported - } - - public bool SendCloseWindow(int windowId) - { - return false; //Currently not implemented - } - - public bool SendPlayerBlockPlacement(int hand, Location location, Direction face, int sequenceId) - { - return false; //Currently not implemented - } - - public bool SendHeldItemChange(short slot) - { - return false; //Currently not implemented - } - - public bool SendPlayerDigging(int status, Location location, Direction face, int sequenceId) - { - return false; //Currently not implemented - } - - /// - /// Send a plugin channel packet to the server. - /// - /// Channel to send packet on - /// packet Data - public bool SendPluginChannelPacket(string channel, byte[] data) - { - try - { - byte[] channelLength = BitConverter.GetBytes((short)channel.Length); - Array.Reverse(channelLength); - - byte[] channelData = Encoding.BigEndianUnicode.GetBytes(channel); - - byte[] dataLength = BitConverter.GetBytes((short)data.Length); - Array.Reverse(dataLength); - - Send(ConcatBytes(new byte[] { 0xFA }, channelLength, channelData, dataLength, data)); - - return true; - } - catch (SocketException) { return false; } - catch (System.IO.IOException) { return false; } - } - - int IAutoComplete.AutoComplete(string BehindCursor) - { - if (String.IsNullOrEmpty(BehindCursor)) - return -1; - - byte[] autocomplete = new byte[3 + (BehindCursor.Length * 2)]; - autocomplete[0] = 0xCB; - byte[] msglen = BitConverter.GetBytes((short)BehindCursor.Length); - Array.Reverse(msglen); - msglen.CopyTo(autocomplete, 1); - byte[] msg = Encoding.BigEndianUnicode.GetBytes(BehindCursor); - msg.CopyTo(autocomplete, 3); - ConsoleIO.AutoCompleteDone = false; - Send(autocomplete); - return 0; - } - - private static byte[] ConcatBytes(params byte[][] bytes) - { - List result = new(); - foreach (byte[] array in bytes) - result.AddRange(array); - return result.ToArray(); - } - - public static bool DoPing(string host, int port, ref int protocolversion) - { - try - { - string version = ""; - TcpClient tcp = ProxyHandler.NewTcpClient(host, port); - tcp.ReceiveTimeout = 30000; // 30 seconds - tcp.ReceiveTimeout = 5000; //MC 1.7.2+ SpigotMC servers won't respond, so we need a reasonable timeout. - byte[] ping = new byte[2] { 0xfe, 0x01 }; - tcp.Client.Send(ping, SocketFlags.None); - tcp.Client.Receive(ping, 0, 1, SocketFlags.None); - - if (ping[0] == 0xff) - { - Protocol16Handler ComTmp = new(tcp); - string result = ComTmp.ReadNextString(); - - if (Settings.Config.Logging.DebugMessages) - { - // May contain formatting codes, cannot use WriteLineFormatted - Console.ForegroundColor = ConsoleColor.DarkGray; - ConsoleIO.WriteLine(result); - Console.ForegroundColor = ConsoleColor.Gray; - } - - if (result.Length > 2 && result[0] == '§' && result[1] == '1') - { - string[] tmp = result.Split((char)0x00); - protocolversion = (byte)Int16.Parse(tmp[1], NumberStyles.Any, CultureInfo.CurrentCulture); - version = tmp[2]; - - if (protocolversion == 127) //MC 1.7.2+ - return false; - } - else - { - protocolversion = (byte)39; - version = "B1.8.1 - 1.3.2"; - } - - ConsoleIO.WriteLineFormatted(string.Format(Translations.mcc_use_version, version, protocolversion)); - - return true; - } - else return false; - } - catch { return false; } - } - - public bool SelectTrade(int selectedSlot) - { - return false; //MC 1.13+ - } - - public bool SendSpectate(Guid UUID) - { - return false; //Currently not implemented - } - - public bool SendRenameItem(string itemName) - { - return false; - } - - public bool SendPlayerSession(PlayerKeyPair? playerKeyPair) - { - return false; - } - } -} diff --git a/MinecraftClient/Protocol/Handlers/Protocol18.cs b/MinecraftClient/Protocol/Handlers/Protocol18.cs deleted file mode 100644 index e0508513b7..0000000000 --- a/MinecraftClient/Protocol/Handlers/Protocol18.cs +++ /dev/null @@ -1,6787 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; -using System.Linq; -using System.Net.Sockets; -using System.Security.Cryptography; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading; -using MinecraftClient.Crypto; -using MinecraftClient.Dialogs; -using MinecraftClient.Inventory; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Logger; -using MinecraftClient.Mapping; -using MinecraftClient.Mapping.BlockPalettes; -using MinecraftClient.Mapping.EntityPalettes; -using MinecraftClient.Protocol.Handlers.Forge; -using MinecraftClient.Protocol.Handlers.packet.s2c; -using MinecraftClient.Protocol.Handlers.PacketPalettes; -using MinecraftClient.Protocol.Dialogs; -using MinecraftClient.Protocol.Message; -using MinecraftClient.Protocol.ProfileKey; -using MinecraftClient.Protocol.Session; -using MinecraftClient.Proxy; -using MinecraftClient.Scripting; -using Sentry; -using static MinecraftClient.Settings; -using static MinecraftClient.Settings.MainConfigHelper.MainConfig.GeneralConfig; - -namespace MinecraftClient.Protocol.Handlers -{ - /// - /// Implementation for Minecraft 1.8.X+ Protocols - /// - /// - /// Typical update steps for implementing protocol changes for a new Minecraft version: - /// - Perform a diff between latest supported version in MCC and new stable version to support on https://wiki.vg/Protocol - /// - If there are any changes in packets implemented by MCC, add MCXXXVersion field below and implement new packet layouts - /// - Add the packet type palette for that Minecraft version. Please see PacketTypePalette.cs for more information - /// - Also see Material.cs and ItemType.cs for updating block and item data inside MCC - /// - class Protocol18Handler : IMinecraftCom - { - internal const int MC_1_8_Version = 47; - internal const int MC_1_9_Version = 107; - internal const int MC_1_9_1_Version = 108; - internal const int MC_1_9_2_Version = 109; - internal const int MC_1_10_Version = 210; - internal const int MC_1_11_Version = 315; - internal const int MC_1_11_2_Version = 316; - internal const int MC_1_12_Version = 335; - internal const int MC_1_12_2_Version = 340; - internal const int MC_1_13_Version = 393; - internal const int MC_1_13_2_Version = 404; - internal const int MC_1_14_Version = 477; - internal const int MC_1_15_Version = 573; - internal const int MC_1_15_2_Version = 578; - internal const int MC_1_16_Version = 735; - internal const int MC_1_16_1_Version = 736; - internal const int MC_1_16_2_Version = 751; - internal const int MC_1_16_3_Version = 753; - internal const int MC_1_16_5_Version = 754; - internal const int MC_1_17_Version = 755; - internal const int MC_1_17_1_Version = 756; - internal const int MC_1_18_1_Version = 757; - internal const int MC_1_18_2_Version = 758; - internal const int MC_1_19_Version = 759; - internal const int MC_1_19_2_Version = 760; - internal const int MC_1_19_3_Version = 761; - internal const int MC_1_19_4_Version = 762; - internal const int MC_1_20_Version = 763; - internal const int MC_1_20_2_Version = 764; - internal const int MC_1_20_4_Version = 765; - internal const int MC_1_20_6_Version = 766; - internal const int MC_1_21_Version = 767; - internal const int MC_1_21_2_Version = 768; - internal const int MC_1_21_4_Version = 769; - internal const int MC_1_21_5_Version = 770; - internal const int MC_1_21_6_Version = 771; - internal const int MC_1_21_7_Version = 772; - internal const int MC_1_21_9_Version = 773; - internal const int MC_1_21_11_Version = 774; - internal const int MC_26_1_Version = 775; - internal const int MC_26_2_Version = 776; - - private int compression_treshold = -1; - private int autocomplete_transaction_id = 0; - private readonly Dictionary window_actions = new(); - private CurrentState currentState = CurrentState.Login; - private readonly int protocolVersion; - private readonly int rawProtocolVersion; - private int currentDimension; - private bool isOnlineMode = false; - private readonly BlockingCollection>> packetQueue = new(); - private readonly Dictionary legacyAchievementProgress = new(StringComparer.Ordinal); - private float LastYaw, LastPitch; - private double lastSentX, lastSentY, lastSentZ; - private float lastSentYaw, lastSentPitch; - private bool lastSentOnGround; - private bool lastSentHorizontalCollision; - private int positionReminder; - private long chunkBatchStartTime; - private double aggregatedNanosPerChunk = 2000000.0; - private int oldSamplesWeight = 1; - - private bool receiveDeclareCommands = false, receivePlayerInfo = false; - private readonly Lock MessageSigningLock = new(); - private Guid chatUuid = Guid.NewGuid(); - private int pendingAcknowledgments = 0, messageIndex = 0; - private LastSeenMessagesCollector lastSeenMessagesCollector; - private LastSeenMessageList.AcknowledgedMessage? lastReceivedMessage = null; - readonly Protocol18Forge pForge; - readonly Protocol18Terrain pTerrain; - readonly IMinecraftComHandler handler; - readonly EntityPalette entityPalette; - readonly EntityMetadataPalette entityMetadataPalette; - readonly ItemPalette itemPalette; - readonly PacketTypePalette packetPalette; - readonly SocketWrapper socketWrapper; - readonly DataTypes dataTypes; - readonly DialogNbtParser dialogNbtParser = new(); - Tuple? netMain = null; // main thread - Tuple? netReader = null; // reader thread - readonly ILogger log; - readonly RandomNumberGenerator randomGen; - private bool legacyAchievementsInitialized; - - public Protocol18Handler(TcpClient Client, int protocolVersion, IMinecraftComHandler handler, - ForgeInfo? forgeInfo, int rawProtocolVersion = 0) - { - ConsoleIO.SetAutoCompleteEngine(this); - ChatParser.InitTranslations(); - socketWrapper = new SocketWrapper(Client); - dataTypes = new DataTypes(protocolVersion); - this.protocolVersion = protocolVersion; - this.rawProtocolVersion = rawProtocolVersion != 0 ? rawProtocolVersion : protocolVersion; - this.handler = handler; - pForge = new Protocol18Forge(forgeInfo, protocolVersion, dataTypes, this, handler); - pTerrain = new Protocol18Terrain(protocolVersion, dataTypes, handler); - packetPalette = new PacketTypeHandler(protocolVersion, forgeInfo is not null).GetTypeHandler(); - log = handler.GetLogger(); - randomGen = RandomNumberGenerator.Create(); - lastSeenMessagesCollector = protocolVersion >= MC_1_19_3_Version ? new(20) : new(5); - chunkBatchStartTime = GetNanos(); - - if (handler.GetTerrainEnabled() && protocolVersion > MC_26_2_Version) - { - log.Error($"§c{Translations.extra_terrainandmovement_disabled}"); - handler.SetTerrainEnabled(false); - } - - if (handler.GetInventoryEnabled() && - protocolVersion is < MC_1_8_Version or > MC_26_2_Version) - { - log.Error($"§c{Translations.extra_inventory_disabled}"); - handler.SetInventoryEnabled(false); - } - - if (handler.GetEntityHandlingEnabled() && - protocolVersion is < MC_1_8_Version or > MC_26_2_Version) - { - log.Error($"§c{Translations.extra_entity_disabled}"); - handler.SetEntityHandlingEnabled(false); - } - - Block.Palette = protocolVersion switch - { - // Block palette - > MC_26_2_Version when handler.GetTerrainEnabled() => - throw new NotImplementedException(Translations.exception_palette_block), - >= MC_26_2_Version => new Palette262(), - >= MC_26_1_Version => new Palette261(), - >= MC_1_21_9_Version => new Palette1219(), - >= MC_1_21_6_Version => new Palette1216(), // 1.21.7/1.21.8 blocks unchanged, reuse 1216 - >= MC_1_21_5_Version => new Palette1215(), - >= MC_1_21_4_Version => new Palette1214(), - >= MC_1_21_2_Version => new Palette1212(), - >= MC_1_20_6_Version => new Palette1206(), - >= MC_1_20_4_Version => new Palette1204(), - >= MC_1_20_Version => new Palette120(), - MC_1_19_4_Version => new Palette1194(), - MC_1_19_3_Version => new Palette1193(), - >= MC_1_19_Version => new Palette119(), - >= MC_1_17_Version => new Palette117(), - >= MC_1_16_Version => new Palette116(), - >= MC_1_15_Version => new Palette115(), - >= MC_1_14_Version => new Palette114(), - >= MC_1_13_Version => new Palette113(), - _ => new Palette112() - }; - - entityPalette = protocolVersion switch - { - // Entity palette - > MC_26_2_Version when handler.GetEntityHandlingEnabled() => - throw new NotImplementedException(Translations.exception_palette_entity), - >= MC_26_2_Version => new EntityPalette262(), - >= MC_26_1_Version => new EntityPalette261(), - >= MC_1_21_11_Version => new EntityPalette12111(), - >= MC_1_21_9_Version => new EntityPalette1219(), - >= MC_1_21_6_Version => new EntityPalette1216(), // 1.21.7/1.21.8 entities unchanged, reuse 1216 - >= MC_1_21_5_Version => new EntityPalette1215(), - >= MC_1_21_4_Version => new EntityPalette1214(), - >= MC_1_21_2_Version => new EntityPalette1212(), - >= MC_1_20_6_Version => new EntityPalette1206(), - >= MC_1_20_4_Version => new EntityPalette1204(), - >= MC_1_20_Version => new EntityPalette120(), - MC_1_19_4_Version => new EntityPalette1194(), - MC_1_19_3_Version => new EntityPalette1193(), - >= MC_1_19_Version => new EntityPalette119(), - >= MC_1_17_Version => new EntityPalette117(), - >= MC_1_16_2_Version => new EntityPalette1162(), - >= MC_1_16_Version => new EntityPalette1161(), - >= MC_1_15_Version => new EntityPalette115(), - >= MC_1_14_Version => new EntityPalette114(), - >= MC_1_13_Version => new EntityPalette113(), - >= MC_1_12_Version => new EntityPalette112(), - >= MC_1_11_Version => new EntityPalette112(), - _ => new EntityPalette18() - }; - - entityMetadataPalette = EntityMetadataPalette.GetPalette(protocolVersion); - - itemPalette = protocolVersion switch - { - // Item palette - > MC_26_2_Version when handler.GetInventoryEnabled() => - throw new NotImplementedException(Translations.exception_palette_item), - >= MC_26_2_Version => new ItemPalette262(), - >= MC_26_1_Version => new ItemPalette261(), - >= MC_1_21_11_Version => new ItemPalette12111(), - >= MC_1_21_9_Version => new ItemPalette1219(), - >= MC_1_21_7_Version => new ItemPalette1217(), - >= MC_1_21_6_Version => new ItemPalette1216(), - >= MC_1_21_5_Version => new ItemPalette1215(), - >= MC_1_21_4_Version => new ItemPalette1214(), - >= MC_1_21_2_Version => new ItemPalette1212(), - >= MC_1_21_Version => new ItemPalette121(), - >= MC_1_20_6_Version => new ItemPalette1206(), - >= MC_1_20_4_Version => new ItemPalette1204(), - >= MC_1_20_Version => new ItemPalette120(), - MC_1_19_4_Version => new ItemPalette1194(), - MC_1_19_3_Version => new ItemPalette1193(), - >= MC_1_19_Version => new ItemPalette119(), - >= MC_1_18_1_Version => new ItemPalette118(), - >= MC_1_17_Version => new ItemPalette117(), - >= MC_1_16_2_Version => new ItemPalette1162(), - >= MC_1_16_1_Version => new ItemPalette1161(), - >= MC_1_15_Version => new ItemPalette115(), - >= MC_1_14_Version => new ItemPalette114(), - >= MC_1_13_2_Version => new ItemPalette1132(), - >= MC_1_13_Version => new ItemPalette113(), - >= MC_1_12_Version => new ItemPalette112(), - >= MC_1_11_Version => new ItemPalette111(), - >= MC_1_10_Version => new ItemPalette110(), - >= MC_1_9_Version => new ItemPalette19(), - _ => new ItemPalette18() - }; - - ChatParser.ChatId2Type = this.protocolVersion switch - { - // MessageType - // You can find it in https://wiki.vg/Protocol#Player_Chat_Message or /net/minecraft/network/message/MessageType.java - >= MC_1_19_2_Version => new() - { - { 0, ChatParser.MessageType.CHAT }, - { 1, ChatParser.MessageType.SAY_COMMAND }, - { 2, ChatParser.MessageType.MSG_COMMAND_INCOMING }, - { 3, ChatParser.MessageType.MSG_COMMAND_OUTGOING }, - { 4, ChatParser.MessageType.TEAM_MSG_COMMAND_INCOMING }, - { 5, ChatParser.MessageType.TEAM_MSG_COMMAND_OUTGOING }, - { 6, ChatParser.MessageType.EMOTE_COMMAND }, - }, - MC_1_19_Version => new() - { - { 0, ChatParser.MessageType.CHAT }, - { 1, ChatParser.MessageType.RAW_MSG }, - { 2, ChatParser.MessageType.RAW_MSG }, - { 3, ChatParser.MessageType.SAY_COMMAND }, - { 4, ChatParser.MessageType.MSG_COMMAND_INCOMING }, - { 5, ChatParser.MessageType.TEAM_MSG_COMMAND_INCOMING }, - { 6, ChatParser.MessageType.EMOTE_COMMAND }, - { 7, ChatParser.MessageType.RAW_MSG }, - }, - _ => ChatParser.ChatId2Type - }; - ChatParser.ClearChatTypeDecorations(); - } - - /// - /// Separate thread. Network reading loop. - /// - private void Updater(object? o) - { - var cancelToken = (CancellationToken)o!; - var exitReason = Translations.debug_packet_loop_reason_queue_completed; - - if (cancelToken.IsCancellationRequested) - return; - - try - { - Stopwatch stopWatch = Stopwatch.StartNew(); - long nextUpdateDue = 0; - // Continue until the reader has finished and every queued packet has been handled. - // A server can close immediately after a Disconnect packet, completing the queue - // while that final packet is still waiting to be processed. - while (!packetQueue.IsCompleted) - { - cancelToken.ThrowIfCancellationRequested(); - - long elapsedMilliseconds = stopWatch.ElapsedMilliseconds; - while (elapsedMilliseconds >= nextUpdateDue) - { - handler.OnUpdate(); - nextUpdateDue += ClientTickIntervalMilliseconds; - elapsedMilliseconds = stopWatch.ElapsedMilliseconds; - } - - if (packetQueue.TryTake(out var packetInfo, 1)) - { - var (packetId, packetData) = packetInfo; - HandlePacket(packetId, packetData); - continue; - } - - long sleepLength = nextUpdateDue - stopWatch.ElapsedMilliseconds; - if (sleepLength > 1) - Thread.Sleep((int)Math.Min(sleepLength, ClientTickIntervalMilliseconds)); - } - } - catch (ObjectDisposedException) - { - exitReason = nameof(ObjectDisposedException); - } - catch (OperationCanceledException) - { - exitReason = nameof(OperationCanceledException); - } - catch (NullReferenceException) - { - exitReason = nameof(NullReferenceException); - } - catch (SocketException) - { - exitReason = nameof(SocketException); - } - catch (System.IO.IOException) - { - exitReason = nameof(System.IO.IOException); - } - - if (cancelToken.IsCancellationRequested) - return; - - LogNetworkLoopExit(nameof(Updater), exitReason); - handler.OnConnectionLost(ChatBot.DisconnectReason.ConnectionLost, ""); - } - - /// - /// Read and decompress packets. - /// - internal void PacketReader(object? o) - { - var cancelToken = (CancellationToken)o!; - var exitReason = Translations.debug_packet_loop_reason_socket_closed; - while (socketWrapper.IsConnected() && !cancelToken.IsCancellationRequested) - { - try - { - while (socketWrapper.HasDataAvailable()) - { - var packet = ReadNextPacket(); - if (packet.Item1 == -1) - continue; - packetQueue.Add(packet, cancelToken); - - if (cancelToken.IsCancellationRequested) - break; - } - } - catch (OperationCanceledException) - { - exitReason = nameof(OperationCanceledException); - break; - } - catch (System.IO.IOException) - { - exitReason = nameof(System.IO.IOException); - break; - } - catch (SocketException) - { - exitReason = nameof(SocketException); - break; - } - catch (NullReferenceException) - { - exitReason = nameof(NullReferenceException); - break; - } - catch (System.IO.InvalidDataException) - { - exitReason = nameof(System.IO.InvalidDataException); - break; - } - - if (cancelToken.IsCancellationRequested) - { - exitReason = Translations.debug_packet_loop_reason_cancelled; - break; - } - - Thread.Sleep(10); - } - - if (cancelToken.IsCancellationRequested) - exitReason = Translations.debug_packet_loop_reason_cancelled; - - LogNetworkLoopExit(nameof(PacketReader), exitReason); - packetQueue.CompleteAdding(); - } - - /// - /// Read the next packet from the network - /// - /// will contain packet ID - /// will contain raw packet Data - internal Tuple> ReadNextPacket() - { - var size = dataTypes.ReadNextVarIntRAW(socketWrapper); //Packet size - var rawBytes = socketWrapper.ReadDataRAW(size); - Queue packetData = new(rawBytes); //Packet contents - var compressed = false; - var sizeUncompressed = 0; - - //Handle packet decompression - if (protocolVersion >= MC_1_8_Version - && compression_treshold >= 0) - { - sizeUncompressed = dataTypes.ReadNextVarInt(packetData); - if (sizeUncompressed != 0) // != 0 means compressed, let's decompress - { - var toDecompress = packetData.ToArray(); - var uncompressed = ZlibUtils.Decompress(toDecompress, sizeUncompressed); - packetData = new Queue(uncompressed); - compressed = true; - } - } - - if (packetData.Count == 0) - { - var rawHex = rawBytes.Length > 0 ? BitConverter.ToString(rawBytes).Replace("-", " ") : "(empty)"; - log.Debug("Empty packet after decompress: size={0}, sizeUncompressed={1}, protocol={2}, state={3}, rawBytes=[{4}]", size, sizeUncompressed, protocolVersion, currentState, rawHex); - return new(-1, packetData); - } - - var packetId = dataTypes.ReadNextVarInt(packetData); // Packet ID - LogIncomingPacket(packetId, packetData.Count, size, compressed, sizeUncompressed); - if (handler.GetNetworkPacketCaptureEnabled()) - handler.OnNetworkPacket(packetId, packetData.ToList(), currentState == CurrentState.Login, true); - - return new(packetId, packetData); - } - - /// - /// Handle the given packet - /// - /// Packet ID - /// Packet contents - /// TRUE if the packet was processed, FALSE if ignored or unknown - internal bool HandlePacket(int packetId, Queue packetData) - { - // This copy is necessary because by the time we get to the catch block, - // the packetData queue will have been processed and the data will be lost - var _copy = packetData.ToArray(); - - try - { - switch (currentState) - { - // https://wiki.vg/Protocol#Login - case CurrentState.Login: - switch (packetId) - { - // Set Compression - case 0x03: - if (protocolVersion >= MC_1_8_Version) - compression_treshold = dataTypes.ReadNextVarInt(packetData); - break; - - // Login Plugin Request - case 0x04: - var messageId = dataTypes.ReadNextVarInt(packetData); - var channel = dataTypes.ReadNextString(packetData); - List responseData = new(); - var understood = pForge.HandleLoginPluginRequest(channel, packetData, ref responseData); - SendLoginPluginResponse(messageId, understood, responseData.ToArray()); - break; - - // Cookie Request - case 0x05: - var cookieName = dataTypes.ReadNextString(packetData); - var cookieData = null as byte[]; - McClient.Instance?.GetCookie(cookieName, out cookieData); - SendCookieResponse(cookieName, cookieData); - break; - - // Ignore other packets at this stage - default: - return true; - } - - break; - - // https://wiki.vg/Protocol#Configuration - case CurrentState.Configuration: - if (!packetPalette.GetMappingInConfiguration().TryGetValue(packetId, out var configurationPacketType)) - { - if (packetPalette.GetMappingIn().ContainsKey(packetId)) - { - SetCurrentState(CurrentState.Play); - return HandlePlayPackets(packetId, packetData); - } - - throw new KeyNotFoundException("Configuration Packet ID of 0x" + packetId.ToString("X2") + - " doesn't exist!"); - } - - switch (configurationPacketType) - { - case ConfigurationPacketTypesIn.CookieRequest: - var cookieName = dataTypes.ReadNextString(packetData); - var cookieData = null as byte[]; - McClient.Instance?.GetCookie(cookieName, out cookieData); - SendCookieResponse(cookieName, cookieData); - break; - - case ConfigurationPacketTypesIn.Disconnect: - handler.OnConnectionLost(ChatBot.DisconnectReason.InGameKick, - dataTypes.ReadNextChat(packetData)); - return false; - - case ConfigurationPacketTypesIn.FinishConfiguration: - SetCurrentState(CurrentState.Play); - SendPacket(ConfigurationPacketTypesOut.FinishConfiguration, new List()); - break; - - case ConfigurationPacketTypesIn.KeepAlive: - SendPacket(ConfigurationPacketTypesOut.KeepAlive, packetData); - break; - - case ConfigurationPacketTypesIn.Ping: - SendPacket(ConfigurationPacketTypesOut.Pong, packetData); - break; - - case ConfigurationPacketTypesIn.RegistryData: - if (protocolVersion < MC_1_20_6_Version) - { - var registryCodec = dataTypes.ReadNextNbt(packetData); - ChatParser.ReadChatType(registryCodec); - - if (handler.GetTerrainEnabled()) - World.StoreDimensionList(registryCodec); - } - else - { - var registryId = dataTypes.ReadNextString(packetData); - var entryCount = dataTypes.ReadNextVarInt(packetData); - - var isChat = registryId == "minecraft:chat_type"; - var isDimension = registryId == "minecraft:dimension_type"; - var isAttribute = registryId == "minecraft:attribute"; - var isEnchantment = registryId == "minecraft:enchantment"; - var isDialog = registryId == "minecraft:dialog"; - - var dimensionIdMap = isDimension ? new Dictionary() : null; - var attributeIdMap = isAttribute ? new Dictionary() : null; - var enchantmentIdMap = isEnchantment ? new Dictionary() : null; - - for (var i = 0; i < entryCount; i++) - { - var entryId = dataTypes.ReadNextString(packetData); - var hasData = dataTypes.ReadNextBool(packetData); - - Dictionary? nbtData = null; - if (hasData) - nbtData = dataTypes.ReadNextNbt(packetData); - - if (isChat) - ChatParser.ReadChatType(i, entryId, nbtData); - else if (isDimension) - { - dimensionIdMap!.Add(i, entryId); - if (nbtData is not null && handler.GetTerrainEnabled()) - World.StoreOneDimension(entryId, nbtData); - } - else if (isAttribute) - { - var attrName = entryId.StartsWith("minecraft:") - ? entryId.Substring("minecraft:".Length) - : entryId; - attributeIdMap!.Add(i, attrName); - } - else if (isEnchantment) - enchantmentIdMap!.Add(i, entryId); - else if (isDialog && nbtData is not null) - handler.OnDialogRegistryData(i, entryId, dialogNbtParser.Parse(nbtData)); - } - - if (isDimension) - { - World.SetDimensionIdMap(dimensionIdMap!); - if (!handler.GetTerrainEnabled() || !World.HasAnyDimension()) - World.LoadDefaultDimensions1206Plus(); - } - else if (isAttribute) - World.SetAttributeIdMap(attributeIdMap!); - else if (isEnchantment) - EnchantmentMapping.SetDynamicEnchantmentIdMap(enchantmentIdMap!); - } - - break; - - case ConfigurationPacketTypesIn.RemoveResourcePack: - if (dataTypes.ReadNextBool(packetData)) // Has UUID - ChatParser.RemoveResourcePackTranslations(dataTypes.ReadNextUUID(packetData).ToString("D")); // UUID - else - ChatParser.ClearResourcePackTranslations(); - break; - - case ConfigurationPacketTypesIn.ResourcePack: - HandleResourcePackPacket(packetData); - break; - - case ConfigurationPacketTypesIn.StoreCookie: - var name = dataTypes.ReadNextString(packetData); - var data = dataTypes.ReadNextByteArray(packetData); - McClient.Instance?.SetCookie(name, data); - break; - - case ConfigurationPacketTypesIn.Transfer: - var host = dataTypes.ReadNextString(packetData); - var port = dataTypes.ReadNextVarInt(packetData); - - McClient.Instance?.Transfer(host, port); - break; - - case ConfigurationPacketTypesIn.KnownDataPacks: - var knownPacksCount = dataTypes.ReadNextVarInt(packetData); - List<(string, string, string)> knownDataPacks = new(); - - for (var i = 0; i < knownPacksCount; i++) - { - var nameSpace = dataTypes.ReadNextString(packetData); - var id = dataTypes.ReadNextString(packetData); - var version = dataTypes.ReadNextString(packetData); - knownDataPacks.Add((nameSpace, id, version)); - } - - var vanillaPacks = knownDataPacks - .Where(p => p.Item1 == "minecraft") - .ToList(); - SendKnownDataPacks(vanillaPacks); - break; - - case ConfigurationPacketTypesIn.CustomReportDetails: - var cfgDetailsCount = dataTypes.ReadNextVarInt(packetData); - for (var i = 0; i < cfgDetailsCount; i++) - { - dataTypes.ReadNextString(packetData); // Title - dataTypes.ReadNextString(packetData); // Description - } - break; - - case ConfigurationPacketTypesIn.CodeOfConduct: - dataTypes.ReadNextString(packetData); // Code of conduct text - SendPacket(ConfigurationPacketTypesOut.AcceptCodeOfConduct, new List()); - break; - - case ConfigurationPacketTypesIn.ServerLinks: - handler.OnServerLinksUpdated(ReadServerLinks(packetData)); - break; - - case ConfigurationPacketTypesIn.ClearDialog: - handler.OnDialogCleared(); - break; - - case ConfigurationPacketTypesIn.ShowDialog: - HandleShowDialog(packetData, DialogPhase.Configuration); - break; - - // Ignore other packets at this stage - default: - return true; - } - - break; - - // https://wiki.vg/Protocol#Play - case CurrentState.Play: - return HandlePlayPackets(packetId, packetData); - - default: - return true; - } - } - catch (Exception innerException) - { - if (innerException is ThreadAbortException || innerException is SocketException || - innerException.InnerException is SocketException) - throw; //Thread abort or Connection lost rather than invalid data - - var exception = new System.IO.InvalidDataException( - string.Format(Translations.exception_packet_process, - packetPalette.GetIncomingTypeById(packetId), - packetId, - protocolVersion, - currentState == CurrentState.Login, - innerException.GetType()), - innerException); - - SentrySdk.AddBreadcrumb(new Breadcrumb("S -> C Packet", "network", new Dictionary() - { - { "Packet ID", packetId.ToString() }, - { "Packet Type ", packetPalette.GetIncomingTypeById(packetId).ToString() }, - { "Protocol Version", protocolVersion.ToString() }, - { "Minecraft Version", ProtocolHandler.ProtocolVersion2MCVer(protocolVersion) }, - { "Current State", currentState.ToString() }, - { "Packet Data", string.Join(" ", _copy.Select(b => b.ToString("X2"))) }, - { "Inner Exception", innerException.GetType().ToString() } - }, "packet", BreadcrumbLevel.Error)); - - SentrySdk.CaptureException(exception); - - throw exception; - } - - return true; - } - - public void HandleResourcePackPacket(Queue packetData) - { - var uuid = Guid.Empty; - - if (protocolVersion >= MC_1_20_4_Version) - uuid = dataTypes.ReadNextUUID(packetData); - - var url = dataTypes.ReadNextString(packetData); - var hash = dataTypes.ReadNextString(packetData); - // Use the server-provided UUID when available, then fall back to the legacy SHA-1 hash, - // and finally the URL so pre-UUID resource packs can still be replaced or cleared locally. - string packIdentifier; - if (uuid != Guid.Empty) - packIdentifier = uuid.ToString("D"); - else if (hash.Length == 40) - packIdentifier = hash; - else - packIdentifier = url; - - if (protocolVersion >= MC_1_17_Version) - { - dataTypes.ReadNextBool(packetData); // Forced - if (dataTypes.ReadNextBool(packetData)) // Has Prompt Message - dataTypes.ReadNextChat(packetData); // Prompt Message - } - - // Some server plugins may send invalid resource packs to probe the client and we need to ignore them (issue #1056) - if (!url.StartsWith("http") && - hash.Length != 40) // Some server may have null hash value - return; - - //Send back "accepted" and "successfully loaded" responses for plugins or server config making use of resource pack mandatory - var responseHeader = - protocolVersion < MC_1_10_Version // After 1.10, the MC does not include resource pack hash in responses - ? dataTypes.ConcatBytes(DataTypes.GetVarInt(hash.Length), Encoding.UTF8.GetBytes(hash)) - : []; - - var basePacketData = protocolVersion >= MC_1_20_4_Version && uuid != Guid.Empty - ? dataTypes.ConcatBytes(responseHeader, DataTypes.GetUUID(uuid)) - : responseHeader; - - var acceptedResourcePackData = dataTypes.ConcatBytes(basePacketData, DataTypes.GetVarInt(3)); - var loadedResourcePackData = dataTypes.ConcatBytes(basePacketData, DataTypes.GetVarInt(0)); - - if (currentState == CurrentState.Configuration) - { - SendPacket(ConfigurationPacketTypesOut.ResourcePackResponse, acceptedResourcePackData); // Accepted - SendPacket(ConfigurationPacketTypesOut.ResourcePackResponse, - loadedResourcePackData); // Successfully loaded - } - else - { - SendPacket(PacketTypesOut.ResourcePackStatus, acceptedResourcePackData); // Accepted - SendPacket(PacketTypesOut.ResourcePackStatus, loadedResourcePackData); // Successfully loaded - } - - ChatParser.LoadResourcePackTranslations(packIdentifier, url, hash); - } - - private bool HandlePlayPackets(int packetId, Queue packetData) - { - switch (packetPalette.GetIncomingTypeById(packetId)) - { - case PacketTypesIn.KeepAlive: // Keep Alive (Play) - SendPacket(PacketTypesOut.KeepAlive, packetData); - handler.OnServerKeepAlive(); - break; - - case PacketTypesIn.Ping: - SendPacket(PacketTypesOut.Pong, packetData); - break; - - case PacketTypesIn.JoinGame: - // Temporary fix - log.PacketDebug("Receive JoinGame"); - - receiveDeclareCommands = receivePlayerInfo = false; - - messageIndex = 0; - pendingAcknowledgments = 0; - - lastReceivedMessage = null; - lastSeenMessagesCollector = protocolVersion >= MC_1_19_3_Version ? new(20) : new(5); - - handler.OnGameJoined(isOnlineMode); - - var playerEntityId = dataTypes.ReadNextInt(packetData); - handler.OnReceivePlayerEntityID(playerEntityId); - - if (protocolVersion >= MC_1_16_2_Version) - dataTypes.ReadNextBool(packetData); // Is hardcore - 1.16.2 and above - - if (protocolVersion < MC_1_20_2_Version) - handler.OnGamemodeUpdate(Guid.Empty, dataTypes.ReadNextByte(packetData)); - - if (protocolVersion >= MC_1_16_Version) - { - if (protocolVersion < MC_1_20_2_Version) - dataTypes.ReadNextByte(packetData); // Previous Gamemode - 1.16 - 1.20.2 - - var worldCount = - dataTypes.ReadNextVarInt( - packetData); // Dimension Count (World Count) - 1.16 and above - for (var i = 0; i < worldCount; i++) - dataTypes.ReadNextString( - packetData); // Dimension Names (World Names) - 1.16 and above - - if (protocolVersion < MC_1_20_2_Version) - { - var registryCodec = - dataTypes.ReadNextNbt( - packetData); // Registry Codec (Dimension Codec) - 1.16 - 1.20.1 - if (protocolVersion >= MC_1_19_Version) - ChatParser.ReadChatType(registryCodec); - if (handler.GetTerrainEnabled()) - World.StoreDimensionList(registryCodec); - } - } - - if (protocolVersion < MC_1_20_2_Version) - { - // Current dimension - // String: 1.19 and above - // NBT Tag Compound: [1.16.2 to 1.18.2] - // String identifier: 1.16 and 1.16.1 - // varInt: [1.9.1 to 1.15.2] - // byte: below 1.9.1 - string? dimensionTypeName = null; - Dictionary? dimensionType = null; - switch (protocolVersion) - { - case >= MC_1_16_Version: - { - switch (protocolVersion) - { - case >= MC_1_19_Version: - dimensionTypeName = - dataTypes.ReadNextString(packetData); // Dimension Type: Identifier - break; - case >= MC_1_16_2_Version: - dimensionType = - dataTypes.ReadNextNbt( - packetData); // Dimension Type: NBT Tag Compound - break; - default: - dimensionTypeName = dataTypes.ReadNextString(packetData); - break; - } - - currentDimension = 0; - break; - } - case >= MC_1_9_1_Version: - currentDimension = dataTypes.ReadNextInt(packetData); - break; - default: - currentDimension = (sbyte)dataTypes.ReadNextByte(packetData); - break; - } - - switch (protocolVersion) - { - case < MC_1_14_Version: - dataTypes.ReadNextByte(packetData); // Difficulty - 1.13 and below - break; - case >= MC_1_16_Version: - { - var dimensionName = - dataTypes.ReadNextString( - packetData); // Dimension Name (World Name) - 1.16 and above - - if (handler.GetTerrainEnabled()) - { - switch (protocolVersion) - { - case >= MC_1_16_2_Version and <= MC_1_18_2_Version: - World.StoreOneDimension(dimensionName, dimensionType!); - World.SetDimension(dimensionName); - break; - default: - World.SetDimension(dimensionTypeName!); - break; - } - } - - break; - } - } - } - - if (protocolVersion is >= MC_1_15_Version and < MC_1_20_2_Version) - dataTypes.ReadNextLong(packetData); // Hashed world seed - 1.15 - 1.20.2 - if (protocolVersion >= MC_1_16_2_Version) - dataTypes.ReadNextVarInt(packetData); // Max Players - 1.16.2 and above - else - dataTypes.ReadNextByte(packetData); // Max Players - 1.16.1 and below - if (protocolVersion < MC_1_16_Version) - dataTypes.SkipNextString(packetData); // Level Type - 1.15 and below - if (protocolVersion >= MC_1_14_Version) - dataTypes.ReadNextVarInt(packetData); // View distance - 1.14 and above - if (protocolVersion >= MC_1_18_1_Version) - dataTypes.ReadNextVarInt(packetData); // Simulation Distance - 1.18 and above - if (protocolVersion >= MC_1_8_Version) - dataTypes.ReadNextBool(packetData); // Reduced debug info - 1.8 and above - if (protocolVersion >= MC_1_15_Version) - dataTypes.ReadNextBool(packetData); // Enable respawn screen - 1.15 and above - - if (protocolVersion < MC_1_20_2_Version) - { - if (protocolVersion >= MC_1_16_Version) - { - dataTypes.ReadNextBool(packetData); // Is Debug - 1.16 and 1.20.2 - dataTypes.ReadNextBool(packetData); // Is Flat - 1.16 and 1.20.2 - } - - if (protocolVersion >= MC_1_19_Version) - { - if (dataTypes.ReadNextBool(packetData)) // Has death location - { - dataTypes.SkipNextString(packetData); // Death dimension name: Identifier - dataTypes.ReadNextLocation(packetData); // Death location - } - } - - if (protocolVersion >= MC_1_20_Version) - dataTypes.ReadNextVarInt(packetData); // Portal Cooldown - 1.20 and above - } - else - { - dataTypes.ReadNextBool(packetData); // Do limited crafting - - var dimensionTypeName = protocolVersion < MC_1_20_6_Version - ? dataTypes.ReadNextString(packetData) - : World.GetDimensionNameById(dataTypes.ReadNextVarInt(packetData)); - - dataTypes.ReadNextString(packetData); // Dimension Name (World Name) - 1.16 and above - - if (handler.GetTerrainEnabled()) - World.SetDimension(dimensionTypeName); - - dataTypes.ReadNextLong(packetData); // Hashed world seed - handler.OnGamemodeUpdate(Guid.Empty, dataTypes.ReadNextByte(packetData)); - dataTypes.ReadNextByte(packetData); // Previous Gamemode - dataTypes.ReadNextBool(packetData); // Is Debug - dataTypes.ReadNextBool(packetData); // Is Flat - var hasDeathLocation = dataTypes.ReadNextBool(packetData); // Has death location - if (hasDeathLocation) - { - dataTypes.SkipNextString(packetData); // Death dimension name: Identifier - dataTypes.ReadNextLocation(packetData); // Death location - } - - dataTypes.ReadNextVarInt(packetData); // Portal Cooldown - - if (protocolVersion >= MC_1_20_6_Version) - dataTypes.ReadNextBool(packetData); // Enforoces Secure Chat - } - - if (protocolVersion >= MC_1_21_4_Version) - SendPacket(PacketTypesOut.PlayerLoaded, new List()); - - break; - case PacketTypesIn.SpawnPainting: // Just skip, no need for this - return true; - case PacketTypesIn.DeclareCommands: - if (protocolVersion >= MC_1_19_Version) - { - log.PacketDebug("Receive DeclareCommands"); - DeclareCommands.Read(dataTypes, packetData, protocolVersion); - receiveDeclareCommands = true; - if (receivePlayerInfo) - handler.SetCanSendMessage(true); - } - - break; - case PacketTypesIn.ChatMessage: - var messageType = 0; - - if (protocolVersion <= MC_1_18_2_Version) // 1.18 and bellow - { - var message = dataTypes.ReadNextString(packetData); - - Guid senderUuid; - if (protocolVersion >= MC_1_8_Version) - { - //Hide system messages or xp bar messages? - messageType = dataTypes.ReadNextByte(packetData); - if (messageType == 1 && !Config.Main.Advanced.ShowSystemMessages - || messageType == 2 && !Config.Main.Advanced.ShowSystemMessages) - break; - - senderUuid = protocolVersion >= MC_1_16_5_Version - ? dataTypes.ReadNextUUID(packetData) - : Guid.Empty; - } - else - senderUuid = Guid.Empty; - - handler.OnTextReceived(new(message, null, true, messageType, senderUuid)); - } - else if (protocolVersion == MC_1_19_Version) // 1.19 - { - var signedChat = dataTypes.ReadNextString(packetData); - var hasUnsignedChatContent = dataTypes.ReadNextBool(packetData); - var unsignedChatContent = hasUnsignedChatContent ? dataTypes.ReadNextString(packetData) : null; - - messageType = dataTypes.ReadNextVarInt(packetData); - if (messageType == 1 && !Config.Main.Advanced.ShowSystemMessages - || messageType == 2 && !Config.Main.Advanced.ShowXPBarMessages) - break; - - var senderUuid = dataTypes.ReadNextUUID(packetData); - var senderDisplayName = ChatParser.ParseText(dataTypes.ReadNextString(packetData)); - var hasSenderTeamName = dataTypes.ReadNextBool(packetData); - var senderTeamName = hasSenderTeamName - ? ChatParser.ParseText(dataTypes.ReadNextString(packetData)) - : null; - - var timestamp = dataTypes.ReadNextLong(packetData); - var salt = dataTypes.ReadNextLong(packetData); - var messageSignature = dataTypes.ReadNextByteArray(packetData); - - bool verifyResult; - if (!isOnlineMode) - verifyResult = false; - else if (senderUuid == handler.GetUserUuid()) - verifyResult = true; - else - { - var player = handler.GetPlayerInfo(senderUuid); - verifyResult = player is not null && player.VerifyMessage(signedChat, timestamp, salt, - ref messageSignature); - } - - ChatMessage chat = new(signedChat, true, messageType, senderUuid, unsignedChatContent, - senderDisplayName, senderTeamName, timestamp, messageSignature, verifyResult); - handler.OnTextReceived(chat); - } - else if (protocolVersion == MC_1_19_2_Version) - { - // 1.19.1 - 1.19.2 - var precedingSignature = dataTypes.ReadNextBool(packetData) - ? dataTypes.ReadNextByteArray(packetData) - : null; - var senderUuid = dataTypes.ReadNextUUID(packetData); - var headerSignature = dataTypes.ReadNextByteArray(packetData); - var signedChat = dataTypes.ReadNextString(packetData); - var decorated = dataTypes.ReadNextBool(packetData) - ? dataTypes.ReadNextString(packetData) - : null; - - var timestamp = dataTypes.ReadNextLong(packetData); - var salt = dataTypes.ReadNextLong(packetData); - - var lastSeenMessageListLen = dataTypes.ReadNextVarInt(packetData); - var lastSeenMessageList = - new LastSeenMessageList.AcknowledgedMessage[lastSeenMessageListLen]; - - for (var i = 0; i < lastSeenMessageListLen; ++i) - { - var user = dataTypes.ReadNextUUID(packetData); - var lastSignature = dataTypes.ReadNextByteArray(packetData); - lastSeenMessageList[i] = new(user, lastSignature, true); - } - - LastSeenMessageList lastSeenMessages = new(lastSeenMessageList); - var unsignedChatContent = dataTypes.ReadNextBool(packetData) - ? dataTypes.ReadNextString(packetData) - : null; - - var filterEnum = (MessageFilterType)dataTypes.ReadNextVarInt(packetData); - if (filterEnum == MessageFilterType.PartiallyFiltered) - dataTypes.ReadNextULongArray(packetData); - - var chatTypeId = dataTypes.ReadNextVarInt(packetData); - var chatName = dataTypes.ReadNextString(packetData); - var targetName = dataTypes.ReadNextBool(packetData) - ? dataTypes.ReadNextString(packetData) - : null; - - var chatInfo = Json.ParseJson(chatName)?.AsObject(); - var senderDisplayName = chatInfo is not null && chatInfo.Count > 0 - ? (chatInfo.ContainsKey("insertion") ? chatInfo["insertion"] : chatInfo["text"]) - .GetStringValue() - : ""; - string? senderTeamName = null; - var messageTypeEnum = - ChatParser.ChatId2Type!.GetValueOrDefault(chatTypeId, ChatParser.MessageType.CHAT); - - if (targetName is not null && - (messageTypeEnum == ChatParser.MessageType.TEAM_MSG_COMMAND_INCOMING || - messageTypeEnum == ChatParser.MessageType.TEAM_MSG_COMMAND_OUTGOING)) - senderTeamName = Json.ParseJson(targetName)!["with"]![0]! - ["text"]!.GetStringValue(); - - if (string.IsNullOrWhiteSpace(senderDisplayName)) - { - var player = handler.GetPlayerInfo(senderUuid); - if (player is not null && (player.DisplayName is not null || player is { Name: not null }) && - string.IsNullOrWhiteSpace(senderDisplayName)) - { - senderDisplayName = ChatParser.ParseText(player.DisplayName ?? player.Name); - if (string.IsNullOrWhiteSpace(senderDisplayName)) - senderDisplayName = player.DisplayName ?? player.Name; - else - senderDisplayName += "§r"; - } - } - - bool verifyResult; - if (!isOnlineMode) - verifyResult = false; - else if (senderUuid == handler.GetUserUuid()) - verifyResult = true; - else - { - var player = handler.GetPlayerInfo(senderUuid); - if (player is null || !player.IsMessageChainLegal()) - verifyResult = false; - else - { - var lastVerifyResult = player.IsMessageChainLegal(); - verifyResult = player.VerifyMessage(signedChat, timestamp, salt, - ref headerSignature, ref precedingSignature, lastSeenMessages); - if (lastVerifyResult && !verifyResult) - log.Warn(string.Format(Translations.chat_message_chain_broken, - senderDisplayName)); - } - } - - ChatMessage chat = new(signedChat, false, chatTypeId, senderUuid, unsignedChatContent, - senderDisplayName, senderTeamName, timestamp, headerSignature, verifyResult); - if (isOnlineMode && !chat.LacksSender()) - Acknowledge(chat); - handler.OnTextReceived(chat); - } - else if (protocolVersion >= MC_1_19_3_Version) - { - // 1.19.3+ - // Header section - // net.minecraft.network.packet.s2c.play.ChatMessageS2CPacket#write - - // 1.21.5+: globalIndex prepended before sender UUID - if (protocolVersion >= MC_1_21_5_Version) - dataTypes.ReadNextVarInt(packetData); - - var senderUuid = dataTypes.ReadNextUUID(packetData); - var index = dataTypes.ReadNextVarInt(packetData); - // Signature is fixed size of 256 bytes - var messageSignature = dataTypes.ReadNextBool(packetData) - ? dataTypes.ReadNextByteArray(packetData, 256) - : null; - - // Body - // net.minecraft.network.message.MessageBody.Serialized#write - var message = dataTypes.ReadNextString(packetData); - var timestamp = dataTypes.ReadNextLong(packetData); - var salt = dataTypes.ReadNextLong(packetData); - - // Previous Messages - // net.minecraft.network.message.LastSeenMessageList.Indexed#write - // net.minecraft.network.message.MessageSignatureData.Indexed#write - var totalPreviousMessages = dataTypes.ReadNextVarInt(packetData); - var previousMessageSignatures = new Tuple[totalPreviousMessages]; - - for (var i = 0; i < totalPreviousMessages; i++) - { - // net.minecraft.network.message.MessageSignatureData.Indexed#fromBuf - var messageId = dataTypes.ReadNextVarInt(packetData) - 1; - if (messageId == -1) - previousMessageSignatures[i] = new Tuple(messageId, - dataTypes.ReadNextByteArray(packetData, 256)); - else - previousMessageSignatures[i] = new Tuple(messageId, null); - } - - // Other - var unsignedChatContent = dataTypes.ReadNextBool(packetData) - ? dataTypes.ReadNextChat(packetData) - : null; - - var filterType = (MessageFilterType)dataTypes.ReadNextVarInt(packetData); - - if (filterType == MessageFilterType.PartiallyFiltered) - dataTypes.ReadNextULongArray(packetData); - - // Network Target - // net.minecraft.network.message.MessageType.Serialized#write - var chatTypeId = ChatParser.ReadChatTypeHolder( - dataTypes, packetData, protocolVersion, out var directChatTypeDecoration); - var chatName = dataTypes.ReadNextChat(packetData); - var targetName = dataTypes.ReadNextBool(packetData) - ? dataTypes.ReadNextChat(packetData) - : null; - - var messageTypeEnum = - ChatParser.ChatId2Type!.GetValueOrDefault(chatTypeId, ChatParser.MessageType.CHAT); - - //var chatInfo = Json.ParseJson(targetName ?? chatName).Properties; - var senderDisplayName = chatName; - string? senderTeamName = targetName; - - if (string.IsNullOrWhiteSpace(senderDisplayName)) - { - var player = handler.GetPlayerInfo(senderUuid); - if (player is not null && (player.DisplayName is not null || player.Name is not null) && - string.IsNullOrWhiteSpace(senderDisplayName)) - { - senderDisplayName = player.DisplayName ?? player.Name; - if (string.IsNullOrWhiteSpace(senderDisplayName)) - senderDisplayName = player.DisplayName ?? player.Name; - else - senderDisplayName += "§r"; - } - } - - bool verifyResult; - if (!isOnlineMode || messageSignature is null) - verifyResult = false; - else - { - if (senderUuid == handler.GetUserUuid()) - verifyResult = true; - else - { - var player = handler.GetPlayerInfo(senderUuid); - if (player is null || !player.IsMessageChainLegal()) - verifyResult = false; - else - { - verifyResult = player.VerifyMessage(message, senderUuid, player.ChatUuid, - index, timestamp, salt, ref messageSignature, - previousMessageSignatures); - } - } - } - - ChatMessage chat = new(message, false, chatTypeId, senderUuid, unsignedChatContent, - senderDisplayName, senderTeamName, timestamp, messageSignature, verifyResult) - { - chatTypeDecoration = directChatTypeDecoration - }; - lock (MessageSigningLock) - Acknowledge(chat); - handler.OnTextReceived(chat); - } - - break; - case PacketTypesIn.ChunkBatchFinished: - var batchSize = dataTypes.ReadNextVarInt(packetData); // Number of chunks received - - if (batchSize > 0) - { - var d = GetNanos() - chunkBatchStartTime; - var d2 = d / (double)batchSize; - var d3 = Math.Clamp(d2, aggregatedNanosPerChunk / 3.0, aggregatedNanosPerChunk * 3.0); - aggregatedNanosPerChunk = - (aggregatedNanosPerChunk * oldSamplesWeight + d3) / (oldSamplesWeight + 1); - oldSamplesWeight = Math.Min(49, oldSamplesWeight + 1); - } - - SendChunkBatchReceived((float)(7000000.0 / aggregatedNanosPerChunk)); - break; - case PacketTypesIn.ChunkBatchStarted: - chunkBatchStartTime = GetNanos(); - break; - case PacketTypesIn.StartConfiguration: - SetCurrentState(CurrentState.Configuration); - SendAcknowledgeConfiguration(); - break; - case PacketTypesIn.HideMessage: - var hideMessageSignature = dataTypes.ReadNextByteArray(packetData); - ConsoleIO.WriteLine( - $"HideMessage was not processed! (SigLen={hideMessageSignature.Length})"); - break; - case PacketTypesIn.SystemChat: - var systemMessage = dataTypes.ReadNextChat(packetData); - - if (protocolVersion >= MC_1_19_3_Version) - { - var isOverlay = dataTypes.ReadNextBool(packetData); - if (isOverlay) - { - if (!Config.Main.Advanced.ShowXPBarMessages) - break; - } - else - { - if (!Config.Main.Advanced.ShowSystemMessages) - break; - } - - handler.OnTextReceived(new(systemMessage, null, false, -1, Guid.Empty, true)); - } - else - { - var msgType = dataTypes.ReadNextVarInt(packetData); - if (msgType == 1 && !Config.Main.Advanced.ShowSystemMessages) - break; - handler.OnTextReceived(new(systemMessage, null, true, msgType, Guid.Empty, true)); - } - - break; - case PacketTypesIn.ProfilelessChatMessage: - var message_ = dataTypes.ReadNextChat(packetData); - var messageType_ = ChatParser.ReadChatTypeHolder( - dataTypes, packetData, protocolVersion, out var directProfilelessChatTypeDecoration); - var messageName = dataTypes.ReadNextChat(packetData); - var targetName_ = dataTypes.ReadNextBool(packetData) - ? dataTypes.ReadNextChat(packetData) - : null; - ChatMessage profilelessChat = new(message_, messageName, false, messageType_, - Guid.Empty, true); - profilelessChat.isSenderJson = false; - profilelessChat.teamName = targetName_; - profilelessChat.chatTypeDecoration = directProfilelessChatTypeDecoration; - handler.OnTextReceived(profilelessChat); - break; - case PacketTypesIn.CombatEvent: - // 1.8 - 1.16.5 - if (protocolVersion is >= MC_1_8_Version and <= MC_1_16_5_Version) - { - var eventType = (CombatEventType)dataTypes.ReadNextVarInt(packetData); - - if (eventType == CombatEventType.EntityDead) - { - dataTypes.SkipNextVarInt(packetData); - - handler.OnPlayerKilled( - dataTypes.ReadNextInt(packetData), - ChatParser.ParseText(dataTypes.ReadNextString(packetData)) - ); - } - } - - break; - case PacketTypesIn.DeathCombatEvent: - dataTypes.SkipNextVarInt(packetData); - - handler.OnPlayerKilled( - protocolVersion >= MC_1_20_Version ? -1 : dataTypes.ReadNextInt(packetData), - ChatParser.ParseText(dataTypes.ReadNextChat(packetData)) - ); - - break; - case PacketTypesIn.DamageEvent: // 1.19.4 - if (handler.GetEntityHandlingEnabled() && protocolVersion >= MC_1_19_4_Version) - { - var entityId = dataTypes.ReadNextVarInt(packetData); - var sourceTypeId = dataTypes.ReadNextVarInt(packetData); - var sourceCauseId = dataTypes.ReadNextVarInt(packetData); - var sourceDirectId = dataTypes.ReadNextVarInt(packetData); - - Location? sourcePosition; - if (dataTypes.ReadNextBool(packetData)) - { - sourcePosition = new Location() - { - X = dataTypes.ReadNextDouble(packetData), - Y = dataTypes.ReadNextDouble(packetData), - Z = dataTypes.ReadNextDouble(packetData) - }; - } - - // Maybe write a function to use this data ? But seems not too useful - } - - break; - case PacketTypesIn.MessageHeader: // 1.19.2 only - if (protocolVersion == MC_1_19_2_Version) - { - var precedingSignature = dataTypes.ReadNextBool(packetData) - ? dataTypes.ReadNextByteArray(packetData) - : null; - - var senderUuid = dataTypes.ReadNextUUID(packetData); - var headerSignature = dataTypes.ReadNextByteArray(packetData); - var bodyDigest = dataTypes.ReadNextByteArray(packetData); - - bool verifyResult; - - if (!isOnlineMode) - verifyResult = false; - else if (senderUuid == handler.GetUserUuid()) - verifyResult = true; - else - { - var player = handler.GetPlayerInfo(senderUuid); - - if (player is null || !player.IsMessageChainLegal()) - verifyResult = false; - else - { - var lastVerifyResult = player.IsMessageChainLegal(); - verifyResult = player.VerifyMessageHead(ref precedingSignature, - ref headerSignature, ref bodyDigest); - if (lastVerifyResult && !verifyResult) - log.Warn(string.Format(Translations.chat_message_chain_broken, - player.Name)); - } - } - } - - break; - case PacketTypesIn.Respawn: - string? dimensionTypeNameRespawn = null; - Dictionary? dimensionTypeRespawn = null; - - if (protocolVersion >= MC_1_16_Version) - { - switch (protocolVersion) - { - case >= MC_1_20_6_Version: - dimensionTypeNameRespawn = World.GetDimensionNameById(dataTypes.ReadNextVarInt(packetData)); - break; - case >= MC_1_19_Version: - dimensionTypeNameRespawn = - dataTypes.ReadNextString(packetData); // Dimension Type: Identifier - break; - case >= MC_1_16_2_Version: - dimensionTypeRespawn = - dataTypes.ReadNextNbt(packetData); // Dimension Type: NBT Tag Compound - break; - default: - dimensionTypeNameRespawn = dataTypes.ReadNextString(packetData); - break; - } - - currentDimension = 0; - } - else - { - // 1.15 and below - currentDimension = dataTypes.ReadNextInt(packetData); - } - - switch (protocolVersion) - { - case >= MC_1_16_Version: - { - var dimensionName = - dataTypes.ReadNextString( - packetData); // Dimension Name (World Name) - 1.16 and above - - if (handler.GetTerrainEnabled()) - { - switch (protocolVersion) - { - case >= MC_1_16_2_Version and <= MC_1_18_2_Version: - World.StoreOneDimension(dimensionName, dimensionTypeRespawn!); - World.SetDimension(dimensionName); - break; - default: - World.SetDimension(dimensionTypeNameRespawn!); - break; - } - } - - break; - } - case < MC_1_14_Version: - dataTypes.ReadNextByte(packetData); // Difficulty - 1.13 and below - break; - } - - if (protocolVersion >= MC_1_15_Version) - dataTypes.ReadNextLong(packetData); // Hashed world seed - 1.15 and above - dataTypes.ReadNextByte(packetData); // Gamemode - - switch (protocolVersion) - { - case >= MC_1_16_Version: - dataTypes.ReadNextByte(packetData); // Previous Game mode - 1.16 and above - break; - case < MC_1_16_Version: - dataTypes.SkipNextString(packetData); // Level Type - 1.15 and below - break; - } - - if (protocolVersion >= MC_1_16_Version) - { - dataTypes.ReadNextBool(packetData); // Is Debug - 1.16 and above - dataTypes.ReadNextBool(packetData); // Is Flat - 1.16 and above - - if (protocolVersion < MC_1_20_2_Version) - dataTypes.ReadNextBool(packetData); // Copy metadata (Data Kept) - 1.16 - 1.20.2 - } - - if (protocolVersion >= MC_1_19_Version) - { - if (dataTypes.ReadNextBool(packetData)) // Has death location - { - dataTypes.ReadNextString(packetData); // Death dimension name: Identifier - dataTypes.ReadNextLocation(packetData); // Death location - } - } - - if (protocolVersion >= MC_1_20_Version) - dataTypes.ReadNextVarInt(packetData); // Portal Cooldown - - if (protocolVersion >= MC_1_20_2_Version) - dataTypes.ReadNextBool(packetData); // Copy metadata (Data Kept) - 1.20.2 and above - - handler.OnRespawn(); - break; - case PacketTypesIn.PlayerPositionAndLook: - { - int teleportId; - Location location; - float yaw, pitch; - int locMask; - - if (protocolVersion >= MC_1_21_2_Version) - { - teleportId = dataTypes.ReadNextVarInt(packetData); - location = new Location( - dataTypes.ReadNextDouble(packetData), // X - dataTypes.ReadNextDouble(packetData), // Y - dataTypes.ReadNextDouble(packetData) // Z - ); - dataTypes.ReadNextDouble(packetData); // Delta X - dataTypes.ReadNextDouble(packetData); // Delta Y - dataTypes.ReadNextDouble(packetData); // Delta Z - yaw = dataTypes.ReadNextFloat(packetData); - pitch = dataTypes.ReadNextFloat(packetData); - locMask = dataTypes.ReadNextInt(packetData); // Int flags (was Byte before 1.21.2) - } - else - { - location = new Location( - dataTypes.ReadNextDouble(packetData), // X - dataTypes.ReadNextDouble(packetData), // Y - dataTypes.ReadNextDouble(packetData) // Z - ); - yaw = dataTypes.ReadNextFloat(packetData); - pitch = dataTypes.ReadNextFloat(packetData); - locMask = dataTypes.ReadNextByte(packetData); - teleportId = protocolVersion >= MC_1_9_Version - ? dataTypes.ReadNextVarInt(packetData) : -1; - } - - if (handler.GetTerrainEnabled() || handler.GetEntityHandlingEnabled()) - { - if (protocolVersion >= MC_1_8_Version) - { - var currentLocation = handler.GetCurrentLocation(); - location.X = (locMask & 1 << 0) != 0 ? currentLocation.X + location.X : location.X; - location.Y = (locMask & 1 << 1) != 0 ? currentLocation.Y + location.Y : location.Y; - location.Z = (locMask & 1 << 2) != 0 ? currentLocation.Z + location.Z : location.Z; - } - } - - if (teleportId >= 0) - { - LastYaw = yaw; - LastPitch = pitch; - handler.UpdateLocation(location, yaw, pitch); - SendPacket(PacketTypesOut.TeleportConfirm, DataTypes.GetVarInt(teleportId)); - - if (Config.Main.Advanced.TemporaryFixBadpacket) - { - SendLocationUpdate(location, true, false, yaw, pitch, true); - - if (teleportId == 1) - SendLocationUpdate(location, true, false, yaw, pitch, true); - } - } - else - { - handler.UpdateLocation(location, yaw, pitch); - LastYaw = yaw; - LastPitch = pitch; - } - - if (protocolVersion is >= MC_1_17_Version and < MC_1_19_4_Version) - dataTypes.ReadNextBool(packetData); // Dismount Vehicle - 1.17 to 1.19.3 - } - break; - case PacketTypesIn.ChunkData: - if (handler.GetTerrainEnabled()) - { - Interlocked.Increment(ref handler.GetWorld().chunkCnt); - Interlocked.Increment(ref handler.GetWorld().chunkLoadNotCompleted); - - var chunkX = dataTypes.ReadNextInt(packetData); - var chunkZ = dataTypes.ReadNextInt(packetData); - if (protocolVersion >= MC_1_17_Version) - { - ulong[]? verticalStripBitmask = null; - - if (protocolVersion is MC_1_17_Version or MC_1_17_1_Version) - verticalStripBitmask = - dataTypes.ReadNextULongArray( - packetData); // Bit Mask Length and Primary Bit Mask - - if (protocolVersion >= MC_1_21_5_Version) - { - // 1.21.5: Heightmaps encoded as map instead of NBT - var hmCount = dataTypes.ReadNextVarInt(packetData); - for (var hm = 0; hm < hmCount; hm++) - { - dataTypes.ReadNextVarInt(packetData); // Heightmap type id - var longCount = dataTypes.ReadNextVarInt(packetData); - for (var l = 0; l < longCount; l++) - dataTypes.ReadNextLong(packetData); - } - } - else - { - dataTypes.ReadNextNbt(packetData); // Heightmaps (NBT format) - } - - if (protocolVersion is MC_1_17_Version or MC_1_17_1_Version) - { - var biomesLength = dataTypes.ReadNextVarInt(packetData); // Biomes length - for (var i = 0; i < biomesLength; i++) - dataTypes.SkipNextVarInt(packetData); // Biomes - } - - var dataSize = dataTypes.ReadNextVarInt(packetData); // Size - - pTerrain.ProcessChunkColumnData(chunkX, chunkZ, verticalStripBitmask, packetData); - ProcessChunkBlockEntityData(chunkX, chunkZ, packetData); - Interlocked.Decrement(ref handler.GetWorld().chunkLoadNotCompleted); - - // Block Entity data: ignored - // Trust edges: ignored (Removed in 1.20) - // Light data: ignored - } - else - { - var chunksContinuous = dataTypes.ReadNextBool(packetData); - if (protocolVersion is >= MC_1_16_Version and <= MC_1_16_1_Version) - dataTypes.ReadNextBool(packetData); // Ignore old data - 1.16 to 1.16.1 only - var chunkMask = protocolVersion >= MC_1_9_Version - ? (ushort)dataTypes.ReadNextVarInt(packetData) - : dataTypes.ReadNextUShort(packetData); - if (protocolVersion < MC_1_8_Version) - { - var addBitmap = dataTypes.ReadNextUShort(packetData); - var compressedDataSize = dataTypes.ReadNextInt(packetData); - var compressed = dataTypes.ReadData(compressedDataSize, packetData); - var decompressed = ZlibUtils.Decompress(compressed); - - pTerrain.ProcessChunkColumnData(chunkX, chunkZ, chunkMask, addBitmap, - currentDimension == 0, chunksContinuous, currentDimension, - new Queue(decompressed)); - Interlocked.Decrement(ref handler.GetWorld().chunkLoadNotCompleted); - } - else - { - if (protocolVersion >= MC_1_14_Version) - dataTypes.ReadNextNbt(packetData); // Heightmaps - 1.14 and above - var biomesLength = 0; - if (protocolVersion >= MC_1_16_2_Version) - if (chunksContinuous) - biomesLength = - dataTypes.ReadNextVarInt( - packetData); // Biomes length - 1.16.2 and above - if (protocolVersion >= MC_1_15_Version && chunksContinuous) - { - if (protocolVersion >= MC_1_16_2_Version) - { - for (var i = 0; i < biomesLength; i++) - { - // Biomes - 1.16.2 and above - // Don't use ReadNextVarInt because it cost too much time - dataTypes.SkipNextVarInt(packetData); - } - } - else dataTypes.DropData(1024 * 4, packetData); // Biomes - 1.15 and above - } - - var dataSize = dataTypes.ReadNextVarInt(packetData); - pTerrain.ProcessChunkColumnData(chunkX, chunkZ, chunkMask, 0, false, - chunksContinuous, currentDimension, packetData); - Interlocked.Decrement(ref handler.GetWorld().chunkLoadNotCompleted); - } - } - } - - break; - case PacketTypesIn.ChunksBiomes: // 1.19.4 - // Biomes are not handled by MCC - break; - case PacketTypesIn.MapData: - if (protocolVersion < MC_1_8_Version) - break; - - var mapId = dataTypes.ReadNextVarInt(packetData); - var scale = dataTypes.ReadNextByte(packetData); - - - // 1.9 + - var trackingPosition = true; - - // 1.14+ - var locked = false; - - // 1.17+ (locked and trackingPosition switched places) - if (protocolVersion >= MC_1_17_Version) - { - if (protocolVersion >= MC_1_14_Version) - locked = dataTypes.ReadNextBool(packetData); - - if (protocolVersion >= MC_1_9_Version) - trackingPosition = dataTypes.ReadNextBool(packetData); - } - else - { - if (protocolVersion >= MC_1_9_Version) - trackingPosition = dataTypes.ReadNextBool(packetData); - - if (protocolVersion >= MC_1_14_Version) - locked = dataTypes.ReadNextBool(packetData); - } - - var iconCount = 0; - List icons = new(); - - // 1,9 + = needs tracking position to be true to get the icons - if (protocolVersion <= MC_1_16_5_Version || trackingPosition) - { - iconCount = dataTypes.ReadNextVarInt(packetData); - - for (var i = 0; i < iconCount; i++) - { - MapIcon mapIcon = new(); - - switch (protocolVersion) - { - // 1.8 - 1.13 - case < MC_1_13_2_Version: - { - var directionAndType = dataTypes.ReadNextByte(packetData); - byte direction, type; - - // 1.12.2+ - if (protocolVersion >= MC_1_12_2_Version) - { - direction = (byte)(directionAndType & 0xF); - type = (byte)(directionAndType >> 4 & 0xF); - } - else // 1.8 - 1.12 - { - direction = (byte)(directionAndType >> 4 & 0xF); - type = (byte)(directionAndType & 0xF); - } - - mapIcon.Type = (MapIconType)type; - mapIcon.Direction = direction; - break; - } - // 1.13.2+ - case >= MC_1_13_2_Version: - mapIcon.Type = (MapIconType)dataTypes.ReadNextVarInt(packetData); - break; - } - - mapIcon.X = dataTypes.ReadNextByte(packetData); - mapIcon.Z = dataTypes.ReadNextByte(packetData); - - // 1.13.2+ - if (protocolVersion >= MC_1_13_2_Version) - { - mapIcon.Direction = dataTypes.ReadNextByte(packetData); - - if (dataTypes.ReadNextBool(packetData)) // Has Display Name? - mapIcon.DisplayName = - ChatParser.ParseText(dataTypes.ReadNextChat(packetData)); - } - - icons.Add(mapIcon); - } - } - - var columnsUpdated = dataTypes.ReadNextByte(packetData); // width - byte rowsUpdated = 0; // height - byte mapColumnX = 0; - byte mapRowZ = 0; - byte[]? colors = null; - - if (columnsUpdated > 0) - { - rowsUpdated = dataTypes.ReadNextByte(packetData); // height - mapColumnX = dataTypes.ReadNextByte(packetData); - mapRowZ = dataTypes.ReadNextByte(packetData); - colors = dataTypes.ReadNextByteArray(packetData); - } - - handler.OnMapData(mapId, scale, trackingPosition, locked, icons, columnsUpdated, - rowsUpdated, mapColumnX, mapRowZ, colors); - break; - case PacketTypesIn.TradeList: - if (protocolVersion >= MC_1_14_Version && handler.GetInventoryEnabled()) - { - // MC 1.14 or greater - var windowId = dataTypes.ReadNextVarInt(packetData); - int size = dataTypes.ReadNextByte(packetData); - - List trades = new(); - for (var tradeId = 0; tradeId < size; tradeId++) - { - var trade = dataTypes.ReadNextTrade(packetData, itemPalette); - trades.Add(trade); - } - - VillagerInfo villagerInfo = new() - { - Level = dataTypes.ReadNextVarInt(packetData), - Experience = dataTypes.ReadNextVarInt(packetData), - IsRegularVillager = dataTypes.ReadNextBool(packetData), - CanRestock = dataTypes.ReadNextBool(packetData) - }; - handler.OnTradeList(windowId, trades, villagerInfo); - } - - break; - case PacketTypesIn.Title: - if (protocolVersion >= MC_1_8_Version) - { - var action2 = dataTypes.ReadNextVarInt(packetData); - var titleText = string.Empty; - var subtitleText = string.Empty; - var actionBarText = string.Empty; - var json = string.Empty; - var fadein = -1; - var stay = -1; - var fadeout = -1; - - if (protocolVersion >= MC_1_10_Version) - { - switch (action2) - { - case 0: - json = titleText; - titleText = ChatParser.ParseText(dataTypes.ReadNextString(packetData)); - break; - case 1: - json = subtitleText; - subtitleText = ChatParser.ParseText(dataTypes.ReadNextString(packetData)); - break; - case 2: - json = actionBarText; - actionBarText = ChatParser.ParseText(dataTypes.ReadNextString(packetData)); - break; - case 3: - fadein = dataTypes.ReadNextInt(packetData); - stay = dataTypes.ReadNextInt(packetData); - fadeout = dataTypes.ReadNextInt(packetData); - break; - } - } - else - { - switch (action2) - { - case 0: - json = titleText; - titleText = ChatParser.ParseText(dataTypes.ReadNextString(packetData)); - break; - case 1: - json = subtitleText; - subtitleText = ChatParser.ParseText(dataTypes.ReadNextString(packetData)); - break; - case 2: - fadein = dataTypes.ReadNextInt(packetData); - stay = dataTypes.ReadNextInt(packetData); - fadeout = dataTypes.ReadNextInt(packetData); - break; - } - } - - handler.OnTitle(action2, titleText, subtitleText, actionBarText, fadein, stay, fadeout, - json); - } - - break; - case PacketTypesIn.MultiBlockChange: - if (handler.GetTerrainEnabled()) - { - if (protocolVersion >= MC_1_16_2_Version) - { - var chunkSection = dataTypes.ReadNextLong(packetData); - var sectionX = (int)(chunkSection >> 42); - var sectionY = (int)(chunkSection << 44 >> 44); - var sectionZ = (int)(chunkSection << 22 >> 42); - - if (protocolVersion < MC_1_20_Version) - dataTypes.ReadNextBool(packetData); // Useless boolean (Related to light update) - - var blocksSize = dataTypes.ReadNextVarInt(packetData); - for (var i = 0; i < blocksSize; i++) - { - var chunkSectionPosition = (ulong)dataTypes.ReadNextVarLong(packetData); - var blockId = (int)(chunkSectionPosition >> 12); - var localX = (int)(chunkSectionPosition >> 8 & 0x0F); - var localZ = (int)(chunkSectionPosition >> 4 & 0x0F); - var localY = (int)(chunkSectionPosition & 0x0F); - - var block = new Block((ushort)blockId); - var blockX = sectionX * 16 + localX; - var blockY = sectionY * 16 + localY; - var blockZ = sectionZ * 16 + localZ; - - Location location = new(blockX, blockY, blockZ); - - handler.OnBlockChange(location, block); - } - } - else - { - var chunkX = dataTypes.ReadNextInt(packetData); - var chunkZ = dataTypes.ReadNextInt(packetData); - var recordCount = protocolVersion < MC_1_8_Version - ? dataTypes.ReadNextShort(packetData) - : dataTypes.ReadNextVarInt(packetData); - - for (var i = 0; i < recordCount; i++) - { - byte locationXZ; - ushort blockIdMeta; - int blockY; - - if (protocolVersion < MC_1_8_Version) - { - blockIdMeta = dataTypes.ReadNextUShort(packetData); - blockY = dataTypes.ReadNextByte(packetData); - locationXZ = dataTypes.ReadNextByte(packetData); - } - else - { - locationXZ = dataTypes.ReadNextByte(packetData); - blockY = dataTypes.ReadNextByte(packetData); - blockIdMeta = (ushort)dataTypes.ReadNextVarInt(packetData); - } - - var blockX = locationXZ >> 4; - var blockZ = locationXZ & 0x0F; - - Location location = new(chunkX, chunkZ, blockX, blockY, blockZ); - Block block = new(blockIdMeta); - handler.OnBlockChange(location, block); - } - } - } - - break; - case PacketTypesIn.ServerData: - var motd = "-"; - - var hasMotd = false; - if (protocolVersion < MC_1_19_4_Version) - { - hasMotd = dataTypes.ReadNextBool(packetData); - - if (hasMotd) - motd = ChatParser.ParseText(dataTypes.ReadNextChat(packetData)); - } - else - { - hasMotd = true; - motd = ChatParser.ParseText(dataTypes.ReadNextChat(packetData)); - } - - var iconBase64 = "-"; - var hasIcon = dataTypes.ReadNextBool(packetData); - if (hasIcon) - { - if (protocolVersion < MC_1_20_2_Version) - iconBase64 = dataTypes.ReadNextString(packetData); - else - { - var pngData = dataTypes.ReadNextByteArray(packetData); - iconBase64 = Convert.ToBase64String(pngData); - } - } - - var previewsChat = false; - if (protocolVersion < MC_1_19_3_Version) - previewsChat = dataTypes.ReadNextBool(packetData); - - handler.OnServerDataRecived(hasMotd, motd, hasIcon, iconBase64, previewsChat); - break; - case PacketTypesIn.BlockChange: - if (handler.GetTerrainEnabled()) - { - if (protocolVersion < MC_1_8_Version) - { - var blockX = dataTypes.ReadNextInt(packetData); - var blockY = dataTypes.ReadNextByte(packetData); - var blockZ = dataTypes.ReadNextInt(packetData); - var blockId = (short)dataTypes.ReadNextVarInt(packetData); - var blockMeta = dataTypes.ReadNextByte(packetData); - - Location location = new(blockX, blockY, blockZ); - Block block = new(blockId, blockMeta); - handler.OnBlockChange(location, block); - } - else - { - var location = dataTypes.ReadNextLocation(packetData); - Block block = new((ushort)dataTypes.ReadNextVarInt(packetData)); - handler.OnBlockChange(location, block); - } - } - - break; - case PacketTypesIn.SetDisplayChatPreview: - handler.OnChatPreviewSettingUpdate(dataTypes.ReadNextBool(packetData)); // Preview Chat Settings - break; - case PacketTypesIn.ChatSuggestions: - break; - case PacketTypesIn.MapChunkBulk: - if (protocolVersion < MC_1_9_Version && handler.GetTerrainEnabled()) - { - int chunkCount; - bool hasSkyLight; - var chunkData = packetData; - - //Read global fields - if (protocolVersion < MC_1_8_Version) - { - chunkCount = dataTypes.ReadNextShort(packetData); - var compressedDataSize = dataTypes.ReadNextInt(packetData); - hasSkyLight = dataTypes.ReadNextBool(packetData); - var compressed = dataTypes.ReadData(compressedDataSize, packetData); - var decompressed = ZlibUtils.Decompress(compressed); - chunkData = new Queue(decompressed); - } - else - { - hasSkyLight = dataTypes.ReadNextBool(packetData); - chunkCount = dataTypes.ReadNextVarInt(packetData); - } - - //Read chunk records - var chunkXs = new int[chunkCount]; - var chunkZs = new int[chunkCount]; - var chunkMasks = new ushort[chunkCount]; - var addBitmaps = new ushort[chunkCount]; - for (var chunkColumnNo = 0; chunkColumnNo < chunkCount; chunkColumnNo++) - { - chunkXs[chunkColumnNo] = dataTypes.ReadNextInt(packetData); - chunkZs[chunkColumnNo] = dataTypes.ReadNextInt(packetData); - chunkMasks[chunkColumnNo] = dataTypes.ReadNextUShort(packetData); - addBitmaps[chunkColumnNo] = protocolVersion < MC_1_8_Version - ? dataTypes.ReadNextUShort(packetData) - : (ushort)0; - } - - //Process chunk records - for (var chunkColumnNo = 0; chunkColumnNo < chunkCount; chunkColumnNo++) - { - pTerrain.ProcessChunkColumnData(chunkXs[chunkColumnNo], chunkZs[chunkColumnNo], - chunkMasks[chunkColumnNo], addBitmaps[chunkColumnNo], hasSkyLight, true, - currentDimension, chunkData); - Interlocked.Decrement(ref handler.GetWorld().chunkLoadNotCompleted); - } - } - - break; - case PacketTypesIn.UnloadChunk: - if (protocolVersion >= MC_1_9_Version && handler.GetTerrainEnabled()) - { - var chunkX = dataTypes.ReadNextInt(packetData); - var chunkZ = dataTypes.ReadNextInt(packetData); - - // Warning: It is legal to include unloaded chunks in the UnloadChunk packet. - // Since chunks that have not been loaded are not recorded, this may result - // in loading chunks that should be unloaded and inaccurate statistics. - if (handler.GetWorld()[chunkX, chunkZ] is not null) - Interlocked.Decrement(ref handler.GetWorld().chunkCnt); - - handler.GetWorld()[chunkX, chunkZ] = null; - } - - break; - case PacketTypesIn.ChangeGameState: - var reason = dataTypes.ReadNextByte(packetData); - var state = dataTypes.ReadNextFloat(packetData); - handler.OnGameEvent(reason, state); - - break; - case PacketTypesIn.PlayerInfo: - if (protocolVersion >= MC_1_19_3_Version) - { - var actionBitset = dataTypes.ReadNextByte(packetData); - var entryCount = dataTypes.ReadNextVarInt(packetData); - for (var i = 0; i < entryCount; i++) - { - var playerUuid = dataTypes.ReadNextUUID(packetData); - - PlayerInfo player; - if ((actionBitset & 1 << 0) > 0) // Actions bit 0: add player - { - var name = dataTypes.ReadNextString(packetData); - var numberOfProperties = dataTypes.ReadNextVarInt(packetData); - for (var j = 0; j < numberOfProperties; ++j) - { - dataTypes.SkipNextString(packetData); - dataTypes.SkipNextString(packetData); - if (dataTypes.ReadNextBool(packetData)) - dataTypes.SkipNextString(packetData); - } - - player = new(name, playerUuid); - handler.OnPlayerJoin(player); - } - else - { - var playerGet = handler.GetPlayerInfo(playerUuid); - if (playerGet is null) - { - player = new(string.Empty, playerUuid); - handler.OnPlayerJoin(player); - } - else - { - player = playerGet; - } - } - - if ((actionBitset & 1 << 1) > 0) // Actions bit 1: initialize chat - { - var hasSignatureData = dataTypes.ReadNextBool(packetData); - - if (hasSignatureData) - { - var chatUuid = dataTypes.ReadNextUUID(packetData); - var publicKeyExpiryTime = dataTypes.ReadNextLong(packetData); - var encodedPublicKey = dataTypes.ReadNextByteArray(packetData); - var publicKeySignature = dataTypes.ReadNextByteArray(packetData); - player.SetPublicKey(chatUuid, publicKeyExpiryTime, encodedPublicKey, - publicKeySignature); - - if (playerUuid == handler.GetUserUuid()) - { - log.PacketDebug($"Receive ChatUuid = {chatUuid}"); - this.chatUuid = chatUuid; - } - } - else - { - player.ClearPublicKey(); - - if (playerUuid == handler.GetUserUuid()) - log.PacketDebug("Receive ChatUuid = Empty"); - } - - if (playerUuid == handler.GetUserUuid()) - { - receivePlayerInfo = true; - if (receiveDeclareCommands) - handler.SetCanSendMessage(true); - } - } - - if ((actionBitset & 1 << 2) > 0) // Actions bit 2: update gamemode - handler.OnGamemodeUpdate(playerUuid, dataTypes.ReadNextVarInt(packetData)); - - if ((actionBitset & 1 << 3) > 0) // Actions bit 3: update listed - player.Listed = dataTypes.ReadNextBool(packetData); - - if ((actionBitset & 1 << 4) > 0) // Actions bit 4: update latency - { - var latency = dataTypes.ReadNextVarInt(packetData); - handler.OnLatencyUpdate(playerUuid, latency); //Update latency; - } - - // Actions bit 5: update display name - if ((actionBitset & 1 << 5) > 0) - { - player.DisplayName = dataTypes.ReadNextBool(packetData) - ? dataTypes.ReadNextChat(packetData) - : null; - } - - // Consume all action-selected fields to keep entry boundaries aligned. - if (protocolVersion >= MC_1_21_2_Version && (actionBitset & 1 << 6) > 0) // Actions bit 6: update list order - player.TabListOrder = dataTypes.ReadNextVarInt(packetData); - - if (protocolVersion >= MC_1_21_4_Version && (actionBitset & 1 << 7) > 0) // Actions bit 7: update hat - dataTypes.ReadNextBool(packetData); - } - } - else if (protocolVersion >= MC_1_8_Version) - { - var action = dataTypes.ReadNextVarInt(packetData); // Action Name - var numberOfPlayers = dataTypes.ReadNextVarInt(packetData); // Number Of Players - - for (var i = 0; i < numberOfPlayers; i++) - { - var uuid = dataTypes.ReadNextUUID(packetData); // Player UUID - - switch (action) - { - case 0x00: //Player Join (Add player since 1.19) - var name = dataTypes.ReadNextString(packetData); // Player name - var propNum = - dataTypes.ReadNextVarInt( - packetData); // Number of properties in the following array - - // Property: Tuple[propNum] : null; - for (var p = 0; p < propNum; p++) - { - var propertyName = - dataTypes.ReadNextString(packetData); // Name: String (32767) - var val = - dataTypes.ReadNextString(packetData); // Value: String (32767) - string? propertySignature = null; - if (dataTypes.ReadNextBool(packetData)) // Is Signed - propertySignature = - dataTypes.ReadNextString( - packetData); // Signature: String (32767) - if (useProperty) - properties![p] = new(propertyName, val, propertySignature); - } -#pragma warning restore CS0162 // Unreachable code detected - - var gameMode = dataTypes.ReadNextVarInt(packetData); // Gamemode - handler.OnGamemodeUpdate(uuid, gameMode); - - var ping = dataTypes.ReadNextVarInt(packetData); // Ping - - string? displayName = null; - if (dataTypes.ReadNextBool(packetData)) // Has display name - displayName = ChatParser.ParseText(dataTypes.ReadNextString(packetData)); // Display name - - // 1.19 Additions - long? keyExpiration = null; - byte[]? publicKey = null, signature = null; - if (protocolVersion >= MC_1_19_Version) - { - if (dataTypes.ReadNextBool( - packetData)) // Has Sig Data (if true, red the following fields) - { - keyExpiration = dataTypes.ReadNextLong(packetData); // Timestamp - - var publicKeyLength = - dataTypes.ReadNextVarInt(packetData); // Public Key Length - if (publicKeyLength > 0) - publicKey = dataTypes.ReadData(publicKeyLength, - packetData); // Public key - - var signatureLength = - dataTypes.ReadNextVarInt(packetData); // Signature Length - if (signatureLength > 0) - signature = dataTypes.ReadData(signatureLength, - packetData); // Public key - } - } - - handler.OnPlayerJoin(new PlayerInfo(uuid, name, properties, gameMode, ping, - displayName, keyExpiration, publicKey, signature)); - break; - case 0x01: // Update Gamemode - handler.OnGamemodeUpdate(uuid, dataTypes.ReadNextVarInt(packetData)); - break; - case 0x02: // Update latency - var latency = dataTypes.ReadNextVarInt(packetData); - handler.OnLatencyUpdate(uuid, latency); // Update latency; - break; - case 0x03: // Update display name - if (dataTypes.ReadNextBool(packetData)) - { - var player = handler.GetPlayerInfo(uuid); - if (player is not null) - player.DisplayName = ChatParser.ParseText(dataTypes.ReadNextString(packetData)); - else - dataTypes.SkipNextString(packetData); - } - - break; - case 0x04: // Player Leave - handler.OnPlayerLeave(uuid); - break; - default: - // Unknown player list item type - break; - } - } - } - else // MC 1.7.X does not provide UUID in tab-list updates - { - var name = dataTypes.ReadNextString(packetData); - var online = dataTypes.ReadNextBool(packetData); - var ping = dataTypes.ReadNextShort(packetData); - var fakeUuid = new Guid(MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(name)).Take(16) - .ToArray()); - if (online) - handler.OnPlayerJoin(new PlayerInfo(name, fakeUuid)); - else handler.OnPlayerLeave(fakeUuid); - } - - break; - case PacketTypesIn.PlayerRemove: - var numberOfLeavePlayers = dataTypes.ReadNextVarInt(packetData); - for (var i = 0; i < numberOfLeavePlayers; ++i) - { - var playerUuid = dataTypes.ReadNextUUID(packetData); - handler.OnPlayerLeave(playerUuid); - } - - break; - case PacketTypesIn.PlayerListHeaderAndFooter: - handler.OnTabListHeaderAndFooter( - dataTypes.ReadNextChat(packetData), - dataTypes.ReadNextChat(packetData)); - break; - case PacketTypesIn.TabComplete: - var oldTransactionId = autocomplete_transaction_id; - if (protocolVersion >= MC_1_13_Version) - { - autocomplete_transaction_id = dataTypes.ReadNextVarInt(packetData); - dataTypes.ReadNextVarInt(packetData); // Start of text to replace - dataTypes.ReadNextVarInt(packetData); // Length of text to replace - } - - var autocompleteCount = dataTypes.ReadNextVarInt(packetData); - var autocompleteResult = new string[autocompleteCount]; - for (var i = 0; i < autocompleteCount; i++) - { - autocompleteResult[i] = dataTypes.ReadNextString(packetData); - if (protocolVersion < MC_1_13_Version) continue; - - // Skip optional tooltip for each tab-complete resul`t - if (dataTypes.ReadNextBool(packetData)) - dataTypes.ReadNextChat(packetData); - } - - handler.OnAutoCompleteDone(oldTransactionId, autocompleteResult); - break; - case PacketTypesIn.PluginMessage: - var channel = dataTypes.ReadNextString(packetData); - // Length is unneeded as the whole remaining packetData is the entire payload of the packet. - if (protocolVersion < MC_1_8_Version) - pForge.ReadNextVarShort(packetData); - if (IsOpenBookPluginChannel(channel)) - handler.OnBookOpen(ReadBookHand(new Queue(packetData))); - handler.OnPluginChannelMessage(channel, packetData.ToArray()); - return pForge.HandlePluginMessage(channel, packetData, ref currentDimension); - case PacketTypesIn.OpenBook: - handler.OnBookOpen(ReadBookHand(packetData)); - break; - case PacketTypesIn.Disconnect: - handler.OnConnectionLost(ChatBot.DisconnectReason.InGameKick, - dataTypes.ReadNextChat(packetData)); - return false; - case PacketTypesIn.SetCompression: - if (protocolVersion is >= MC_1_8_Version and < MC_1_9_Version) - compression_treshold = dataTypes.ReadNextVarInt(packetData); - break; - case PacketTypesIn.OpenWindow: - if (handler.GetInventoryEnabled()) - { - if (protocolVersion < MC_1_14_Version) - { - // MC 1.13 or lower - var windowId = dataTypes.ReadNextByte(packetData); - var type = dataTypes.ReadNextString(packetData).Replace("minecraft:", "") - .ToUpper(); - var inventoryType = - (ContainerTypeOld)Enum.Parse(typeof(ContainerTypeOld), type); - var title = dataTypes.ReadNextChat(packetData); - var slots = dataTypes.ReadNextByte(packetData); - Container inventory = new(windowId, inventoryType, ChatParser.ParseText(title)); - handler.OnInventoryOpen(windowId, inventory); - } - else - { - // MC 1.14 or greater - var windowId = dataTypes.ReadNextVarInt(packetData); - var windowType = dataTypes.ReadNextVarInt(packetData); - var title = dataTypes.ReadNextChat(packetData); - Container inventory = new(windowId, windowType, ChatParser.ParseText(title), protocolVersion); - handler.OnInventoryOpen(windowId, inventory); - } - } - - break; - case PacketTypesIn.CloseWindow: - if (handler.GetInventoryEnabled()) - { - var windowId = protocolVersion >= MC_1_21_2_Version - ? dataTypes.ReadNextVarInt(packetData) - : dataTypes.ReadNextByte(packetData); - lock (window_actions) - { - window_actions[windowId] = 0; - } - - handler.OnInventoryClose(windowId); - } - - break; - case PacketTypesIn.WindowItems: - if (handler.GetInventoryEnabled()) - { - var windowId = (byte)(protocolVersion >= MC_1_21_2_Version - ? dataTypes.ReadNextVarInt(packetData) - : dataTypes.ReadNextByte(packetData)); - var stateId = -1; - int elements; - - if (protocolVersion >= MC_1_17_1_Version) - { - // State ID and Elements as VarInt - 1.17.1 and above - stateId = dataTypes.ReadNextVarInt(packetData); - elements = dataTypes.ReadNextVarInt(packetData); - } - else - { - // Elements as Short - 1.17.0 and below - elements = dataTypes.ReadNextShort(packetData); - } - - Dictionary inventorySlots = new(); - for (var slotId = 0; slotId < elements; slotId++) - { - var item = dataTypes.ReadNextItemSlot(packetData, itemPalette); - if (item is not null) - inventorySlots[slotId] = item; - } - - if (protocolVersion >= MC_1_17_1_Version) // Carried Item - 1.17.1 and above - dataTypes.ReadNextItemSlot(packetData, itemPalette); - - handler.OnWindowItems(windowId, inventorySlots, stateId); - } - - break; - case PacketTypesIn.WindowProperty: - var containerId = (byte)(protocolVersion >= MC_1_21_2_Version - ? dataTypes.ReadNextVarInt(packetData) - : dataTypes.ReadNextByte(packetData)); - var propertyId = dataTypes.ReadNextShort(packetData); - var propertyValue = dataTypes.ReadNextShort(packetData); - handler.OnWindowProperties(containerId, propertyId, propertyValue); - break; - case PacketTypesIn.SetSlot: - if (handler.GetInventoryEnabled()) - { - var windowId = (byte)(protocolVersion >= MC_1_21_2_Version - ? dataTypes.ReadNextVarInt(packetData) - : dataTypes.ReadNextByte(packetData)); - var stateId = -1; - if (protocolVersion >= MC_1_17_1_Version) - stateId = dataTypes.ReadNextVarInt(packetData); // State ID - 1.17.1 and above - var slotId = dataTypes.ReadNextShort(packetData); - var item = dataTypes.ReadNextItemSlot(packetData, itemPalette); - handler.OnSetSlot(windowId, slotId, item, stateId); - } - - break; - case PacketTypesIn.WindowConfirmation: - if (handler.GetInventoryEnabled()) - { - var windowId = dataTypes.ReadNextByte(packetData); - var actionId = dataTypes.ReadNextShort(packetData); - var accepted = dataTypes.ReadNextBool(packetData); - if (!accepted) - SendWindowConfirmation(windowId, actionId, true); - } - - break; - case PacketTypesIn.RemoveResourcePack: - if (dataTypes.ReadNextBool(packetData)) // Has UUID - ChatParser.RemoveResourcePackTranslations(dataTypes.ReadNextUUID(packetData).ToString("D")); // UUID - else - ChatParser.ClearResourcePackTranslations(); - break; - case PacketTypesIn.ResourcePackSend: - HandleResourcePackPacket(packetData); - break; - case PacketTypesIn.ResetScore: - dataTypes.ReadNextString(packetData); // Entity Name - if (dataTypes.ReadNextBool(packetData)) // Has Objective Name - dataTypes.ReadNextString(packetData); // Objective Name - - break; - case PacketTypesIn.SpawnEntity: - if (handler.GetEntityHandlingEnabled()) - { - var entity = dataTypes.ReadNextEntity(packetData, entityPalette, false); - - if (protocolVersion >= MC_1_20_2_Version) - { - if (entity.Type == EntityType.Player) - handler.OnSpawnPlayer(entity.ID, entity.UUID, entity.Location, (byte)entity.Yaw, (byte)entity.Pitch); - else - handler.OnSpawnEntity(entity); - - break; - } - - handler.OnSpawnEntity(entity); - } - - break; - case PacketTypesIn.EntityEquipment: - if (handler.GetEntityHandlingEnabled()) - { - var entityId = dataTypes.ReadNextVarInt(packetData); - if (protocolVersion >= MC_1_16_Version) - { - bool hasNext; - do - { - var bitsData = dataTypes.ReadNextByte(packetData); - // Top bit set if another entry follows, and otherwise unset if this is the last item in the array - hasNext = bitsData >> 7 == 1; - var slot2 = bitsData & 0x7F; - var item = dataTypes.ReadNextItemSlot(packetData, itemPalette); - handler.OnEntityEquipment(entityId, slot2, item); - } while (hasNext); - } - else - { - var slot2 = protocolVersion < MC_1_9_Version - ? dataTypes.ReadNextShort(packetData) - : dataTypes.ReadNextVarInt(packetData); - - var item = dataTypes.ReadNextItemSlot(packetData, itemPalette); - handler.OnEntityEquipment(entityId, slot2, item); - } - } - - break; - case PacketTypesIn.SpawnLivingEntity: - if (handler.GetEntityHandlingEnabled()) - { - var entity = dataTypes.ReadNextEntity(packetData, entityPalette, true); - // packet before 1.15 has metadata at the end - // this is not handled in dataTypes.ReadNextEntity() - // we are simply ignoring leftover data in packet - handler.OnSpawnEntity(entity); - } - - break; - case PacketTypesIn.SpawnPlayer: - if (handler.GetEntityHandlingEnabled()) - { - var entityId = dataTypes.ReadNextVarInt(packetData); - var uuid = dataTypes.ReadNextUUID(packetData); - double x, y, z; - - if (protocolVersion < MC_1_9_Version) - { - x = dataTypes.ReadNextInt(packetData) / 32.0D; - y = dataTypes.ReadNextInt(packetData) / 32.0D; - z = dataTypes.ReadNextInt(packetData) / 32.0D; - } - else - { - x = dataTypes.ReadNextDouble(packetData); - y = dataTypes.ReadNextDouble(packetData); - z = dataTypes.ReadNextDouble(packetData); - } - - var yaw = dataTypes.ReadNextByte(packetData); - var pitch = dataTypes.ReadNextByte(packetData); - handler.OnSpawnPlayer(entityId, uuid, new(x, y, z), yaw, pitch); - } - - break; - case PacketTypesIn.EntityEffect: - if (handler.GetEntityHandlingEnabled()) - { - var entityId = dataTypes.ReadNextVarInt(packetData); - var effectId = protocolVersion >= MC_1_20_4_Version - ? dataTypes.ReadNextVarInt(packetData) + 1 - : dataTypes.ReadNextByte(packetData); - - if (Enum.IsDefined(typeof(Effects), effectId)) - { - var effect = (Effects)effectId; - var amplifier = protocolVersion >= MC_1_20_6_Version - ? dataTypes.ReadNextVarInt(packetData) - : dataTypes.ReadNextByte(packetData); - var duration = dataTypes.ReadNextVarInt(packetData); - var flags = dataTypes.ReadNextByte(packetData); - var hasFactorData = false; - Dictionary? factorCodec = null; - - if (protocolVersion >= MC_1_19_Version && protocolVersion < MC_1_20_6_Version) - { - hasFactorData = dataTypes.ReadNextBool(packetData); - if (hasFactorData) - factorCodec = dataTypes.ReadNextNbt(packetData); - } - - handler.OnEntityEffect(entityId, effect, amplifier, duration, flags, hasFactorData, - factorCodec); - } - } - - break; - case PacketTypesIn.RemoveEntityEffect: - if (handler.GetEntityHandlingEnabled()) - { - var entityId = dataTypes.ReadNextVarInt(packetData); - var effectId = protocolVersion >= MC_1_20_4_Version - ? dataTypes.ReadNextVarInt(packetData) + 1 - : dataTypes.ReadNextByte(packetData); - - if (Enum.IsDefined(typeof(Effects), effectId)) - { - var effect = (Effects)effectId; - handler.OnRemoveEntityEffect(entityId, effect); - } - } - - break; - case PacketTypesIn.DestroyEntities: - if (handler.GetEntityHandlingEnabled()) - { - var entityCount = 1; // 1.17.0 has only one entity per packet - if (protocolVersion != MC_1_17_Version) - entityCount = - dataTypes.ReadNextVarInt(packetData); // All other versions have a "count" field - - var entityList = new int[entityCount]; - for (var i = 0; i < entityCount; i++) - entityList[i] = dataTypes.ReadNextVarInt(packetData); - - handler.OnDestroyEntities(entityList); - } - - break; - case PacketTypesIn.EntityPosition: - if (handler.GetEntityHandlingEnabled()) - { - var entityId = dataTypes.ReadNextVarInt(packetData); - double deltaX, deltaY, deltaZ; - - if (protocolVersion < MC_1_9_Version) - { - deltaX = Convert.ToDouble(dataTypes.ReadNextByte(packetData)); - deltaY = Convert.ToDouble(dataTypes.ReadNextByte(packetData)); - deltaZ = Convert.ToDouble(dataTypes.ReadNextByte(packetData)); - } - else - { - deltaX = Convert.ToDouble(dataTypes.ReadNextShort(packetData)); - deltaY = Convert.ToDouble(dataTypes.ReadNextShort(packetData)); - deltaZ = Convert.ToDouble(dataTypes.ReadNextShort(packetData)); - } - - var isOnGround = dataTypes.ReadNextBool(packetData); - deltaX = deltaX / (128 * 32); - deltaY = deltaY / (128 * 32); - deltaZ = deltaZ / (128 * 32); - - handler.OnEntityPosition(entityId, deltaX, deltaY, deltaZ, isOnGround); - } - - break; - case PacketTypesIn.EntityPositionAndRotation: - if (handler.GetEntityHandlingEnabled()) - { - var entityId = dataTypes.ReadNextVarInt(packetData); - double deltaX, deltaY, deltaZ; - - if (protocolVersion < MC_1_9_Version) - { - deltaX = dataTypes.ReadNextByte(packetData) / 32.0D; - deltaY = dataTypes.ReadNextByte(packetData) / 32.0D; - deltaZ = dataTypes.ReadNextByte(packetData) / 32.0D; - } - else - { - deltaX = Convert.ToDouble(dataTypes.ReadNextShort(packetData)); - deltaY = Convert.ToDouble(dataTypes.ReadNextShort(packetData)); - deltaZ = Convert.ToDouble(dataTypes.ReadNextShort(packetData)); - } - - - var yaw = dataTypes.ReadNextByte(packetData) * (1F / 256) * 360; - var pitch = dataTypes.ReadNextByte(packetData) * (1F / 256) * 360; - var isOnGround = dataTypes.ReadNextBool(packetData); - deltaX = deltaX / (128 * 32); - deltaY = deltaY / (128 * 32); - deltaZ = deltaZ / (128 * 32); - - handler.OnEntityPosition(entityId, deltaX, deltaY, deltaZ, yaw, pitch, isOnGround); - } - - break; - case PacketTypesIn.EntityRotation: - if (handler.GetEntityHandlingEnabled()) - { - var entityId = dataTypes.ReadNextVarInt(packetData); - var yaw = dataTypes.ReadNextByte(packetData) * (1F / 256) * 360; - var pitch = dataTypes.ReadNextByte(packetData) * (1F / 256) * 360; - var isOnGround = dataTypes.ReadNextBool(packetData); - - handler.OnEntityRotation(entityId, yaw, pitch, isOnGround); - } - - break; - case PacketTypesIn.EntityVelocity: - if (handler.GetEntityHandlingEnabled()) - { - var entityId = dataTypes.ReadNextVarInt(packetData); - double velocityX, velocityY, velocityZ; - - if (protocolVersion >= MC_1_21_9_Version) - { - (velocityX, velocityY, velocityZ) = dataTypes.ReadNextLpVec3Values(packetData); - } - else - { - velocityX = dataTypes.ReadNextShort(packetData) / 8000.0D; - velocityY = dataTypes.ReadNextShort(packetData) / 8000.0D; - velocityZ = dataTypes.ReadNextShort(packetData) / 8000.0D; - } - - handler.OnEntityVelocity(entityId, velocityX, velocityY, velocityZ); - } - - break; - case PacketTypesIn.EntityProperties: - if (handler.GetEntityHandlingEnabled()) - { - var entityId = dataTypes.ReadNextVarInt(packetData); - var numberOfProperties = protocolVersion >= MC_1_17_Version - ? dataTypes.ReadNextVarInt(packetData) - : dataTypes.ReadNextInt(packetData); - - Dictionary keys = new(); - for (var i = 0; i < numberOfProperties; i++) - { - string propertyKey; - if (protocolVersion < MC_1_20_6_Version) - { - propertyKey = dataTypes.ReadNextString(packetData); - } - else - { - var attrId = dataTypes.ReadNextVarInt(packetData); - propertyKey = World.GetAttributeNameById(attrId) ?? "unknown"; - } - var propertyValue2 = dataTypes.ReadNextDouble(packetData); - - List op0 = new(); - List op1 = new(); - List op2 = new(); - - var numberOfModifiers = dataTypes.ReadNextVarInt(packetData); - for (var j = 0; j < numberOfModifiers; j++) - { - var modifierId = protocolVersion < MC_1_21_Version ? dataTypes.ReadNextUUID(packetData).ToString() : dataTypes.ReadNextString(packetData); - var amount = dataTypes.ReadNextDouble(packetData); - var operation = dataTypes.ReadNextByte(packetData); - switch (operation) - { - case 0: - op0.Add(amount); - break; - case 1: - op1.Add(amount); - break; - case 2: - op2.Add(amount + 1); - break; - } - } - - if (op0.Count > 0) propertyValue2 += op0.Sum(); - if (op1.Count > 0) propertyValue2 *= 1 + op1.Sum(); - if (op2.Count > 0) propertyValue2 *= op2.Aggregate((a, _x) => a * _x); - keys[propertyKey] = propertyValue2; - } - - handler.OnEntityProperties(entityId, keys); - } - - break; - case PacketTypesIn.EntityMetadata: - if (handler.GetEntityHandlingEnabled()) - { - var entityId = dataTypes.ReadNextVarInt(packetData); - var metadata = dataTypes.ReadNextMetadata(packetData, itemPalette, entityMetadataPalette); - - // Also make a palette for field? Will be a lot of work - var healthField = protocolVersion switch - { - > MC_26_2_Version => throw new NotImplementedException(Translations - .exception_palette_healthfield), - // 1.17 and above - >= MC_1_17_Version => 9, - // 1.14 and above - >= MC_1_14_Version => 8, - // 1.10 and above - >= MC_1_10_Version => 7, - // 1.8 and above - >= MC_1_8_Version => 6, - _ => throw new NotImplementedException(Translations.exception_palette_healthfield) - }; - - if (metadata.TryGetValue(healthField, out var healthObj) && healthObj is float healthObj2) - handler.OnEntityHealth(entityId, healthObj2); - - handler.OnEntityMetadata(entityId, metadata); - } - - break; - case PacketTypesIn.EntityStatus: - if (handler.GetEntityHandlingEnabled()) - { - var entityId = dataTypes.ReadNextInt(packetData); - var status = dataTypes.ReadNextByte(packetData); - handler.OnEntityStatus(entityId, status); - } - - break; - case PacketTypesIn.TimeUpdate: - if (protocolVersion >= MC_26_1_Version) - { - var worldAge = dataTypes.ReadNextLong(packetData); - long timeOfDay = 0; - var clockCount = dataTypes.ReadNextVarInt(packetData); - for (int i = 0; i < clockCount; i++) - { - dataTypes.ReadNextVarInt(packetData); // clock holder id - var totalTicks = dataTypes.ReadNextVarLong(packetData); - dataTypes.ReadNextFloat(packetData); // partialTick - dataTypes.ReadNextFloat(packetData); // rate - if (i == 0) - timeOfDay = totalTicks; - } - handler.OnTimeUpdate(worldAge, timeOfDay); - } - else - { - var worldAge = dataTypes.ReadNextLong(packetData); - var timeOfDay = dataTypes.ReadNextLong(packetData); - if (protocolVersion >= MC_1_21_2_Version) - dataTypes.ReadNextBool(packetData); // Tick day time - handler.OnTimeUpdate(worldAge, timeOfDay); - } - break; - case PacketTypesIn.EntityTeleport: - if (handler.GetEntityHandlingEnabled()) - { - var entityId = dataTypes.ReadNextVarInt(packetData); - double x, y, z; - - if (protocolVersion >= MC_1_21_2_Version) - { - // 1.21.2+: PositionMoveRotation + relative flags - x = dataTypes.ReadNextDouble(packetData); - y = dataTypes.ReadNextDouble(packetData); - z = dataTypes.ReadNextDouble(packetData); - dataTypes.ReadNextDouble(packetData); // Delta movement X - dataTypes.ReadNextDouble(packetData); // Delta movement Y - dataTypes.ReadNextDouble(packetData); // Delta movement Z - dataTypes.ReadNextFloat(packetData); // Yaw - dataTypes.ReadNextFloat(packetData); // Pitch - dataTypes.ReadNextInt(packetData); // Relative flags bitmask - var isOnGround = dataTypes.ReadNextBool(packetData); - handler.OnEntityTeleport(entityId, x, y, z, isOnGround); - } - else if (protocolVersion < MC_1_9_Version) - { - x = dataTypes.ReadNextInt(packetData) / 32.0D; - y = dataTypes.ReadNextInt(packetData) / 32.0D; - z = dataTypes.ReadNextInt(packetData) / 32.0D; - dataTypes.ReadNextByte(packetData); // Yaw - dataTypes.ReadNextByte(packetData); // Pitch - var isOnGround = dataTypes.ReadNextBool(packetData); - handler.OnEntityTeleport(entityId, x, y, z, isOnGround); - } - else - { - x = dataTypes.ReadNextDouble(packetData); - y = dataTypes.ReadNextDouble(packetData); - z = dataTypes.ReadNextDouble(packetData); - dataTypes.ReadNextByte(packetData); // Yaw - dataTypes.ReadNextByte(packetData); // Pitch - var isOnGround = dataTypes.ReadNextBool(packetData); - handler.OnEntityTeleport(entityId, x, y, z, isOnGround); - } - } - - break; - case PacketTypesIn.UpdateHealth: - var health = dataTypes.ReadNextFloat(packetData); - var food = protocolVersion >= MC_1_8_Version - ? dataTypes.ReadNextVarInt(packetData) - : dataTypes.ReadNextShort(packetData); - dataTypes.ReadNextFloat(packetData); // Food Saturation - handler.OnUpdateHealth(health, food); - break; - case PacketTypesIn.SetExperience: - var experienceBar = dataTypes.ReadNextFloat(packetData); - var level = dataTypes.ReadNextVarInt(packetData); - var totalExperience = dataTypes.ReadNextVarInt(packetData); - handler.OnSetExperience(experienceBar, level, totalExperience); - break; - case PacketTypesIn.Explosion: - Location explosionLocation; - float explosionStrength; - int explosionBlockCount; - - if (protocolVersion >= MC_1_21_2_Version) - { - explosionLocation = new(dataTypes.ReadNextDouble(packetData), - dataTypes.ReadNextDouble(packetData), dataTypes.ReadNextDouble(packetData)); - - if (protocolVersion >= MC_1_21_9_Version) - { - // 1.21.9+: added radius (float), blockCount (int), and blockParticles (WeightedList) - explosionStrength = dataTypes.ReadNextFloat(packetData); // Radius - explosionBlockCount = dataTypes.ReadNextInt(packetData); // Block count - } - else - { - // 1.21.2–1.21.8: no strength/block-count fields - explosionStrength = 0; - explosionBlockCount = 0; - } - - if (dataTypes.ReadNextBool(packetData)) // Has player knockback - { - dataTypes.ReadNextDouble(packetData); // Knockback X - dataTypes.ReadNextDouble(packetData); // Knockback Y - dataTypes.ReadNextDouble(packetData); // Knockback Z - } - - dataTypes.ReadParticleData(packetData, itemPalette); // Explosion particle - - var soundHolderId = dataTypes.ReadNextVarInt(packetData); - if (soundHolderId == 0) - { - dataTypes.ReadNextString(packetData); // Sound ResourceLocation - if (dataTypes.ReadNextBool(packetData)) - dataTypes.ReadNextFloat(packetData); // Fixed range - } - - if (protocolVersion >= MC_1_21_9_Version) - { - // 1.21.9+: WeightedList blockParticles - // Each entry: particle + float scaling + float speed + VarInt weight - var blockParticleCount = dataTypes.ReadNextVarInt(packetData); - for (var i = 0; i < blockParticleCount; i++) - { - dataTypes.ReadParticleData(packetData, itemPalette); // Particle type - dataTypes.ReadNextFloat(packetData); // Scaling - dataTypes.ReadNextFloat(packetData); // Speed - dataTypes.ReadNextVarInt(packetData); // Weight - } - } - } - else - { - if (protocolVersion >= MC_1_19_3_Version) - explosionLocation = new(dataTypes.ReadNextDouble(packetData), - dataTypes.ReadNextDouble(packetData), dataTypes.ReadNextDouble(packetData)); - else - explosionLocation = new(dataTypes.ReadNextFloat(packetData), - dataTypes.ReadNextFloat(packetData), dataTypes.ReadNextFloat(packetData)); - - explosionStrength = dataTypes.ReadNextFloat(packetData); - explosionBlockCount = protocolVersion >= MC_1_17_Version - ? dataTypes.ReadNextVarInt(packetData) - : dataTypes.ReadNextInt(packetData); - - for (var i = 0; i < explosionBlockCount; i++) - dataTypes.ReadNextByteArray(packetData, 3); - - dataTypes.ReadNextFloat(packetData); // Player Motion X - dataTypes.ReadNextFloat(packetData); // Player Motion Y - dataTypes.ReadNextFloat(packetData); // Player Motion Z - - if (protocolVersion >= MC_1_20_4_Version) - { - dataTypes.ReadNextVarInt(packetData); // Block Interaction - dataTypes.ReadParticleData(packetData, itemPalette); // Small Explosion Particles - dataTypes.ReadParticleData(packetData, itemPalette); // Large Explosion Particles - - var soundHolderId = dataTypes.ReadNextVarInt(packetData); - if (soundHolderId == 0) - { - dataTypes.ReadNextString(packetData); // Sound ResourceLocation - if (dataTypes.ReadNextBool(packetData)) - dataTypes.ReadNextFloat(packetData); // Fixed range - } - } - } - - handler.OnExplosion(explosionLocation, explosionStrength, explosionBlockCount); - break; - case PacketTypesIn.NamedSoundEffect: - { - string? soundName = dataTypes.ReadNextString(packetData); - int category = dataTypes.ReadNextVarInt(packetData); - double x = dataTypes.ReadNextInt(packetData) / 8.0D; - double y = dataTypes.ReadNextInt(packetData) / 8.0D; - double z = dataTypes.ReadNextInt(packetData) / 8.0D; - float volume = dataTypes.ReadNextFloat(packetData); - float pitch = protocolVersion < MC_1_10_Version - ? dataTypes.ReadNextByte(packetData) / 63.0f - : dataTypes.ReadNextFloat(packetData); - - handler.OnSoundEffect(soundName, new Location(x, y, z), category, volume, pitch, null); - break; - } - case PacketTypesIn.SoundEffect: - { - string? soundName; - if (protocolVersion >= MC_1_19_Version) - soundName = ReadSoundEventHolderName(packetData); - else - { - dataTypes.ReadNextVarInt(packetData); // Sound id - soundName = null; - } - - if (protocolVersion < MC_1_19_Version && packetData.Count < 21) - break; - - int category = dataTypes.ReadNextVarInt(packetData); - double x = dataTypes.ReadNextInt(packetData) / 8.0D; - double y = dataTypes.ReadNextInt(packetData) / 8.0D; - double z = dataTypes.ReadNextInt(packetData) / 8.0D; - float volume = dataTypes.ReadNextFloat(packetData); - float pitch = protocolVersion < MC_1_10_Version - ? dataTypes.ReadNextByte(packetData) / 63.0f - : dataTypes.ReadNextFloat(packetData); - - if (protocolVersion >= MC_1_19_Version) - dataTypes.ReadNextLong(packetData); // Seed - - handler.OnSoundEffect(soundName, new Location(x, y, z), category, volume, pitch, null); - break; - } - case PacketTypesIn.EntitySoundEffect: - { - string? soundName; - if (protocolVersion >= MC_1_19_Version) - soundName = ReadSoundEventHolderName(packetData); - else - { - dataTypes.ReadNextVarInt(packetData); // Sound id - soundName = null; - } - - int category = dataTypes.ReadNextVarInt(packetData); - int entityId = dataTypes.ReadNextVarInt(packetData); - float volume = dataTypes.ReadNextFloat(packetData); - float pitch = dataTypes.ReadNextFloat(packetData); - - if (protocolVersion >= MC_1_19_Version) - dataTypes.ReadNextLong(packetData); // Seed - - handler.OnSoundEffect(soundName, null, category, volume, pitch, entityId); - break; - } - case PacketTypesIn.HeldItemChange: - case PacketTypesIn.SetHeldSlot: - var heldSlot = protocolVersion >= MC_1_21_4_Version - ? dataTypes.ReadNextVarInt(packetData) - : dataTypes.ReadNextByte(packetData); - handler.OnHeldItemChange((byte)heldSlot); - break; - case PacketTypesIn.ScoreboardObjective: - var objectiveName = dataTypes.ReadNextString(packetData); - var mode = dataTypes.ReadNextByte(packetData); - - var objectiveValue = string.Empty; - var objectiveType = -1; - var numberFormat = 0; - - if (mode is 0 or 2) - { - objectiveValue = dataTypes.ReadNextChat(packetData); - objectiveType = dataTypes.ReadNextVarInt(packetData); - - if (protocolVersion >= MC_1_20_4_Version) - { - if (dataTypes.ReadNextBool(packetData)) // Has Number Format - { - numberFormat = dataTypes.ReadNextVarInt(packetData); // Number Format - switch (numberFormat) - { - case 1: // styled - dataTypes.ReadNextNbt(packetData); // Styling compound tag - break; - case 2: // fixed - dataTypes.ReadNextChat(packetData); // Content text component - break; - } - } - } - } - - handler.OnScoreboardObjective(objectiveName, mode, objectiveValue, objectiveType, numberFormat); - break; - case PacketTypesIn.UpdateScore: - var entityName = dataTypes.ReadNextString(packetData); - - var action3 = 0; - var objectiveName3 = string.Empty; - var objectiveValue2 = -1; - var objectiveDisplayName3 = string.Empty; - var numberFormat2 = 0; - - if (protocolVersion >= MC_1_20_4_Version) - { - objectiveName3 = dataTypes.ReadNextString(packetData); // Objective Name - objectiveValue2 = dataTypes.ReadNextVarInt(packetData); // Value - - if (dataTypes.ReadNextBool(packetData)) // Has Display Name - objectiveDisplayName3 = dataTypes.ReadNextChat(packetData); - - if (dataTypes.ReadNextBool(packetData)) // Has Number Format - { - numberFormat2 = dataTypes.ReadNextVarInt(packetData); // Number Format - switch (numberFormat2) - { - case 1: // styled - dataTypes.ReadNextNbt(packetData); // Styling compound tag - break; - case 2: // fixed - dataTypes.ReadNextChat(packetData); // Content text component - break; - } - } - } - else - { - action3 = protocolVersion >= MC_1_18_2_Version - ? dataTypes.ReadNextVarInt(packetData) - : dataTypes.ReadNextByte(packetData); - - if (action3 != 1 || protocolVersion >= MC_1_8_Version) - objectiveName3 = dataTypes.ReadNextString(packetData); - - if (action3 != 1) - objectiveValue2 = dataTypes.ReadNextVarInt(packetData); - } - - handler.OnUpdateScore(entityName, action3, objectiveName3, objectiveDisplayName3, objectiveValue2, - numberFormat2); - break; - case PacketTypesIn.Teams: - // Wire format per version: - // All versions: name (string), method (byte) - // 1.7.x method 0/2: - // displayName (string), prefix (string), suffix (string), - // friendlyFire (byte) - // 1.8/1.8.9 method 0/2: - // displayName (string), prefix (string), suffix (string), - // options (byte), nameTagVisibility, color (byte) - // 1.9-1.12.2 method 0/2: - // displayName (string), prefix (string), suffix (string), - // options (byte), nameTagVisibility, collisionRule, - // color (byte) - // 1.13-1.21.4 method 0/2: - // displayName (component), options (byte), - // nameTagVisibility, collisionRule, color (VarInt), - // prefix (component), suffix (component) - // 1.21.5-26.1 method 0/2: - // displayName (component), options (byte), - // nameTagVisibility (VarInt), collisionRule (VarInt), - // color (VarInt), prefix (component), suffix (component) - // 26.2+ method 0/2: - // displayName (component), prefix (component), - // suffix (component), nameTagVisibility (VarInt), - // collisionRule (VarInt), color (Optional), - // options (byte) - // 1.7.x method 0/3/4: players list (Short count + strings) - // 1.8+ method 0/3/4: players list (VarInt count + strings) - var teamName = dataTypes.ReadNextString(packetData); - var teamMethod = dataTypes.ReadNextByte(packetData); - - var teamDisplayName = string.Empty; - byte teamFriendlyFlags = 0; - var teamNameTagVisibility = string.Empty; - var teamCollisionRule = string.Empty; - var teamColor = -1; - var teamPrefix = string.Empty; - var teamSuffix = string.Empty; - - if (teamMethod is 0 or 2) - { - if (protocolVersion < MC_1_13_Version) - { - teamDisplayName = dataTypes.ReadNextString(packetData); - teamPrefix = dataTypes.ReadNextString(packetData); - teamSuffix = dataTypes.ReadNextString(packetData); - teamFriendlyFlags = dataTypes.ReadNextByte(packetData); - - if (protocolVersion >= MC_1_8_Version) - { - teamNameTagVisibility = dataTypes.ReadNextString(packetData); - - if (protocolVersion >= MC_1_9_Version) - teamCollisionRule = dataTypes.ReadNextString(packetData); - - teamColor = unchecked((sbyte)dataTypes.ReadNextByte(packetData)); - } - } - else if (protocolVersion >= MC_26_2_Version) - { - teamDisplayName = dataTypes.ReadNextChat(packetData); - teamPrefix = dataTypes.ReadNextChat(packetData); - teamSuffix = dataTypes.ReadNextChat(packetData); - - // STREAM_CODEC: 0=always, 1=never, 2=hideForOtherTeams, 3=hideForOwnTeam - teamNameTagVisibility = dataTypes.ReadNextVarInt(packetData) switch - { - 0 => "always", - 1 => "never", - 2 => "hideForOtherTeams", - 3 => "hideForOwnTeam", - _ => "always" - }; - - // STREAM_CODEC: 0=always, 1=never, 2=pushOtherTeams, 3=pushOwnTeam - teamCollisionRule = dataTypes.ReadNextVarInt(packetData) switch - { - 0 => "always", - 1 => "never", - 2 => "pushOtherTeams", - 3 => "pushOwnTeam", - _ => "always" - }; - - // Optional: bool + VarInt id (ids match legacy color ordinals 0-15) - teamColor = dataTypes.ReadNextBool(packetData) - ? dataTypes.ReadNextVarInt(packetData) - : -1; - - teamFriendlyFlags = dataTypes.ReadNextByte(packetData); - } - else - { - teamDisplayName = dataTypes.ReadNextChat(packetData); - teamFriendlyFlags = dataTypes.ReadNextByte(packetData); - - // nameTagVisibility - if (protocolVersion >= MC_1_21_5_Version) - { - // STREAM_CODEC: 0=always, 1=never, 2=hideForOtherTeams, 3=hideForOwnTeam - teamNameTagVisibility = dataTypes.ReadNextVarInt(packetData) switch - { - 0 => "always", - 1 => "never", - 2 => "hideForOtherTeams", - 3 => "hideForOwnTeam", - _ => "always" - }; - } - else - { - teamNameTagVisibility = dataTypes.ReadNextString(packetData); - } - - // collisionRule - if (protocolVersion >= MC_1_21_5_Version) - { - // STREAM_CODEC: 0=always, 1=never, 2=pushOtherTeams, 3=pushOwnTeam - teamCollisionRule = dataTypes.ReadNextVarInt(packetData) switch - { - 0 => "always", - 1 => "never", - 2 => "pushOtherTeams", - 3 => "pushOwnTeam", - _ => "always" - }; - } - else - { - teamCollisionRule = dataTypes.ReadNextString(packetData); - } - - teamColor = dataTypes.ReadNextVarInt(packetData); - teamPrefix = dataTypes.ReadNextChat(packetData); - teamSuffix = dataTypes.ReadNextChat(packetData); - } - } - - var teamPlayers = new List(); - if (teamMethod is 0 or 3 or 4) - { - int playerCount = protocolVersion < MC_1_8_Version - ? dataTypes.ReadNextShort(packetData) - : dataTypes.ReadNextVarInt(packetData); - for (int i = 0; i < playerCount; i++) - teamPlayers.Add(dataTypes.ReadNextString(packetData)); - } - - handler.OnTeam(teamName, teamMethod, teamDisplayName, teamFriendlyFlags, - teamNameTagVisibility, teamCollisionRule, teamColor, - teamPrefix, teamSuffix, teamPlayers); - break; - case PacketTypesIn.BlockChangedAck: - handler.OnBlockChangeAck(dataTypes.ReadNextVarInt(packetData)); - break; - case PacketTypesIn.BlockBreakAnimation: - if (handler.GetEntityHandlingEnabled() && handler.GetTerrainEnabled()) - { - var playerId = dataTypes.ReadNextVarInt(packetData); - var blockLocation = dataTypes.ReadNextLocation(packetData); - var stage = dataTypes.ReadNextByte(packetData); - handler.OnBlockBreakAnimation(playerId, blockLocation, stage); - } - - break; - case PacketTypesIn.EntityAnimation: - if (handler.GetEntityHandlingEnabled()) - { - var playerId = dataTypes.ReadNextVarInt(packetData); - var animation = dataTypes.ReadNextByte(packetData); - handler.OnEntityAnimation(playerId, animation); - } - - break; - - case PacketTypesIn.OpenSignEditor: - var signLocation = dataTypes.ReadNextLocation(packetData); - var isFrontText = true; - - if (protocolVersion >= MC_1_20_Version) - isFrontText = dataTypes.ReadNextBool(packetData); - - // TODO: Use - break; - case PacketTypesIn.BlockEntityData: - if (handler.GetTerrainEnabled() && protocolVersion >= MC_1_17_Version) - { - var location_ = dataTypes.ReadNextLocation(packetData); - dataTypes.ReadNextVarInt(packetData); // Block entity type registry id - var nbt = dataTypes.ReadNextNbt(packetData); - handler.OnBlockEntityData(location_, nbt); - } - - break; - - case PacketTypesIn.SetTickingState: - dataTypes.ReadNextFloat(packetData); - dataTypes.ReadNextBool(packetData); - break; - - case PacketTypesIn.CookieRequest: - var cookieName = dataTypes.ReadNextString(packetData); - var cookieData = null as byte[]; - McClient.Instance?.GetCookie(cookieName, out cookieData); - SendCookieResponse(cookieName, cookieData); - break; - - case PacketTypesIn.StoreCookie: - var cookieName2 = dataTypes.ReadNextString(packetData); - var cookieData2 = dataTypes.ReadNextByteArray(packetData); - McClient.Instance?.SetCookie(cookieName2, cookieData2); - break; - - case PacketTypesIn.Transfer: - var host = dataTypes.ReadNextString(packetData); - var port = dataTypes.ReadNextVarInt(packetData); - - McClient.Instance?.Transfer(host, port); - break; - - case PacketTypesIn.ProjectilePower: - dataTypes.ReadNextVarInt(packetData); // Entity ID - if (protocolVersion >= MC_1_21_Version) - { - dataTypes.ReadNextDouble(packetData); // Acceleration Power - } - else - { - dataTypes.ReadNextDouble(packetData); // X Power - dataTypes.ReadNextDouble(packetData); // Y Power - dataTypes.ReadNextDouble(packetData); // Z Power - } - break; - - case PacketTypesIn.CustomReportDetails: - var detailsCount = dataTypes.ReadNextVarInt(packetData); - for (var i = 0; i < detailsCount; i++) - { - dataTypes.ReadNextString(packetData); // Title - dataTypes.ReadNextString(packetData); // Description - } - break; - - case PacketTypesIn.ServerLinks: - handler.OnServerLinksUpdated(ReadServerLinks(packetData)); - break; - - case PacketTypesIn.ClearDialog: - handler.OnDialogCleared(); - break; - - case PacketTypesIn.ShowDialog: - HandleShowDialog(packetData, DialogPhase.Play); - break; - - // 1.21.2+ new packets - case PacketTypesIn.SetCursorItem: - if (handler.GetInventoryEnabled()) - { - dataTypes.ReadNextItemSlot(packetData, itemPalette); - } - break; - - case PacketTypesIn.SetPlayerInventory: - if (handler.GetInventoryEnabled()) - { - var slotId = dataTypes.ReadNextVarInt(packetData); - var item = dataTypes.ReadNextItemSlot(packetData, itemPalette); - handler.OnSetSlot(0, (short)slotId, item, -1); - } - break; - - case PacketTypesIn.EntityPositionSync: - if (handler.GetEntityHandlingEnabled()) - { - var entityId = dataTypes.ReadNextVarInt(packetData); - var x = dataTypes.ReadNextDouble(packetData); - var y = dataTypes.ReadNextDouble(packetData); - var z = dataTypes.ReadNextDouble(packetData); - dataTypes.ReadNextDouble(packetData); // Delta movement X - dataTypes.ReadNextDouble(packetData); // Delta movement Y - dataTypes.ReadNextDouble(packetData); // Delta movement Z - var yaw = dataTypes.ReadNextFloat(packetData); - var pitch = dataTypes.ReadNextFloat(packetData); - var isOnGround = dataTypes.ReadNextBool(packetData); - handler.OnEntityTeleport(entityId, x, y, z, isOnGround); - } - break; - - case PacketTypesIn.PlayerRotation: - dataTypes.ReadNextFloat(packetData); // Yaw - dataTypes.ReadNextFloat(packetData); // Pitch - break; - - case PacketTypesIn.MoveMinecartAlongTrack: - { - dataTypes.ReadNextVarInt(packetData); // Entity ID - var stepCount = dataTypes.ReadNextVarInt(packetData); - for (var i = 0; i < stepCount; i++) - { - dataTypes.ReadNextDouble(packetData); // Pos X - dataTypes.ReadNextDouble(packetData); // Pos Y - dataTypes.ReadNextDouble(packetData); // Pos Z - dataTypes.ReadNextDouble(packetData); // Movement X - dataTypes.ReadNextDouble(packetData); // Movement Y - dataTypes.ReadNextDouble(packetData); // Movement Z - dataTypes.ReadNextByte(packetData); // Yaw - dataTypes.ReadNextByte(packetData); // Pitch - dataTypes.ReadNextFloat(packetData); // Weight - } - } - break; - - case PacketTypesIn.UnlockRecipes: - if (protocolVersion >= MC_1_13_Version) - HandleUnlockRecipes(packetData); - break; - - case PacketTypesIn.RecipeBookAdd: - if (protocolVersion >= MC_1_21_2_Version) - { - try - { - HandleRecipeBookAdd(packetData); - } - catch - { - // Ignore this packet due to oversized VarInt from anti-MCC server - } - } - break; - case PacketTypesIn.RecipeBookRemove: - if (protocolVersion >= MC_1_21_2_Version) - handler.OnRecipeBookRemove(ReadRecipeBookDisplayIds(packetData)); - break; - case PacketTypesIn.RecipeBookSettings: - break; - - case PacketTypesIn.Statistics: - if (protocolVersion < MC_1_12_Version) - HandleLegacyStatistics(packetData); - break; - - case PacketTypesIn.Advancements: - HandleAdvancements(packetData); - break; - - case PacketTypesIn.SelectAdvancementTab: - HandleSelectAdvancementTab(packetData); - break; - - default: - return false; //Ignored packet - } - - return true; //Packet processed - } - - /// - /// Read a Holder<SoundEvent> from packet data and return its key when inline. - /// Returns null when the holder is a registry reference. - /// - private string? ReadSoundEventHolderName(Queue packetData) - { - int soundHolderId = dataTypes.ReadNextVarInt(packetData); - if (soundHolderId != 0) - return null; - - string soundName = dataTypes.ReadNextString(packetData); - bool hasFixedRange = dataTypes.ReadNextBool(packetData); - if (hasFixedRange) - dataTypes.ReadNextFloat(packetData); - return soundName; - } - - /// - /// Handle the Statistics packet for pre-1.12 legacy achievements. - /// - private void HandleLegacyStatistics(Queue packetData) - { - int statCount = dataTypes.ReadNextVarInt(packetData); - - for (int i = 0; i < statCount; i++) - { - string statId = dataTypes.ReadNextString(packetData); - int value = dataTypes.ReadNextVarInt(packetData); - - if (statId.StartsWith("achievement.", StringComparison.Ordinal)) - legacyAchievementProgress[statId] = value > 0; - } - - List added = new(LegacyAchievementCatalog.Ids.Count + legacyAchievementProgress.Count); - - foreach (string achievementId in LegacyAchievementCatalog.Ids) - added.Add(CreateLegacyAchievement(achievementId, legacyAchievementProgress.TryGetValue(achievementId, out bool completed) && completed)); - - foreach (var (achievementId, completed) in legacyAchievementProgress) - { - if (!LegacyAchievementCatalog.Contains(achievementId)) - added.Add(CreateLegacyAchievement(achievementId, completed)); - } - - handler.OnAchievementsUpdate(added, [], reset: !legacyAchievementsInitialized); - legacyAchievementsInitialized = true; - } - - /// - /// Handle the Advancements packet (1.12+). - /// - private void HandleAdvancements(Queue packetData) - { - bool reset = dataTypes.ReadNextBool(packetData); - - // --- Added advancements --- - int addedCount = dataTypes.ReadNextVarInt(packetData); - var added = new List(addedCount); - var addedDefinitions = new Dictionary> requirements)>(addedCount); - - for (int i = 0; i < addedCount; i++) - { - string id = dataTypes.ReadNextString(packetData); - - // Parent - bool hasParent = dataTypes.ReadNextBool(packetData); - if (hasParent) - dataTypes.ReadNextString(packetData); // parentId - read and discard - - // Display - string? title = null; - string? description = null; - var type = AchievementType.Task; - bool isHidden = false; - - bool hasDisplay = dataTypes.ReadNextBool(packetData); - if (hasDisplay) - { - title = dataTypes.ReadNextChat(packetData); - description = dataTypes.ReadNextChat(packetData); - dataTypes.ReadNextItemSlot(packetData, itemPalette); // icon - read and discard - - int frameType = dataTypes.ReadNextVarInt(packetData); - type = frameType switch - { - 1 => AchievementType.Challenge, - 2 => AchievementType.Goal, - _ => AchievementType.Task - }; - - int flags = dataTypes.ReadNextInt(packetData); - isHidden = (flags & 0x04) != 0; - if ((flags & 0x01) != 0) - dataTypes.ReadNextString(packetData); // background texture - read and discard - - dataTypes.ReadNextFloat(packetData); // x - dataTypes.ReadNextFloat(packetData); // y - } - - // Criteria and requirements differ by version - var requirements = new List>(); - - if (protocolVersion < MC_1_20_2_Version) - { - // Builder-based (pre-1.20.2): criteria names list, then requirements - int criteriaCount = dataTypes.ReadNextVarInt(packetData); - for (int c = 0; c < criteriaCount; c++) - dataTypes.ReadNextString(packetData); // criterion name only, no trigger data - } - - // Requirements (all versions) - int reqGroupCount = dataTypes.ReadNextVarInt(packetData); - for (int g = 0; g < reqGroupCount; g++) - { - int groupSize = dataTypes.ReadNextVarInt(packetData); - var group = new List(groupSize); - for (int s = 0; s < groupSize; s++) - group.Add(dataTypes.ReadNextString(packetData)); - requirements.Add(group); - } - - // sendsTelemetryEvent (added in 1.20, present in all versions since) - if (protocolVersion >= MC_1_20_Version) - dataTypes.ReadNextBool(packetData); - - addedDefinitions[id] = (title, description, type, isHidden, requirements); - } - - // --- Removed advancement IDs --- - int removedCount = dataTypes.ReadNextVarInt(packetData); - var removedIds = new List(removedCount); - for (int i = 0; i < removedCount; i++) - removedIds.Add(dataTypes.ReadNextString(packetData)); - - // --- Progress updates --- - int progressCount = dataTypes.ReadNextVarInt(packetData); - var progressMap = new Dictionary>(progressCount); - - for (int i = 0; i < progressCount; i++) - { - string id = dataTypes.ReadNextString(packetData); - int criteriaEntries = dataTypes.ReadNextVarInt(packetData); - var criteria = new Dictionary(criteriaEntries); - - for (int c = 0; c < criteriaEntries; c++) - { - string criterionName = dataTypes.ReadNextString(packetData); - bool isDone = dataTypes.ReadNextBool(packetData); - if (isDone) - dataTypes.ReadNextLong(packetData); // epochMs - read and discard - criteria[criterionName] = isDone; - } - - progressMap[id] = criteria; - } - - // showAdvancements boolean added in 1.21.11+ - if (protocolVersion >= MC_1_21_11_Version) - dataTypes.ReadNextBool(packetData); // showAdvancements - read and discard - - // Build Achievement records from definitions + progress - foreach (var (id, def) in addedDefinitions) - { - progressMap.TryGetValue(id, out var criteria); - criteria ??= new Dictionary(); - - bool isCompleted = ComputeAdvancementCompleted(def.requirements, criteria); - - var readOnlyReqs = def.requirements.ConvertAll>(static g => g.AsReadOnly()); - added.Add(new Achievement(id, def.title, def.description, def.type, def.isHidden, isCompleted, readOnlyReqs.AsReadOnly(), criteria)); - } - - // Also build Achievement records for progress-only updates (no definition change) - foreach (var (id, criteria) in progressMap) - { - if (!addedDefinitions.ContainsKey(id)) - added.Add(new Achievement(id, null, null, AchievementType.Task, false, false, [], criteria)); - } - - handler.OnAchievementsUpdate(added, removedIds, reset); - } - - private static Achievement CreateLegacyAchievement(string id, bool isCompleted) - { - Dictionary criteria = new(StringComparer.Ordinal) - { - [id] = isCompleted - }; - IReadOnlyList[] requirements = [[id]]; - return new Achievement(id, null, null, AchievementType.Legacy, false, isCompleted, requirements, criteria); - } - - /// - /// Compute whether an advancement is completed based on AND-of-ORs requirements. - /// - private static bool ComputeAdvancementCompleted(List> requirements, Dictionary criteria) - { - // Zero requirements = automatically done - if (requirements.Count == 0) - return true; - - // Each OR-group must have at least one satisfied criterion - foreach (var group in requirements) - { - bool groupSatisfied = false; - foreach (string criterion in group) - { - if (criteria.TryGetValue(criterion, out bool done) && done) - { - groupSatisfied = true; - break; - } - } - if (!groupSatisfied) - return false; - } - return true; - } - - /// - /// Handle the SelectAdvancementTab packet. - /// - private void HandleSelectAdvancementTab(Queue packetData) - { - bool hasTab = dataTypes.ReadNextBool(packetData); - string? tabId = hasTab ? dataTypes.ReadNextString(packetData) : null; - handler.OnSelectAdvancementTab(tabId); - } - - private void HandleUnlockRecipes(Queue packetData) - { - int action = dataTypes.ReadNextVarInt(packetData); - if (!SkipRecipeBookSettings(packetData)) - return; - - string[] recipeIds = ReadRecipeBookRecipeIds(packetData); - RecipeBookRecipeEntry[] recipeEntries = recipeIds.Select(static recipeId => new RecipeBookRecipeEntry(recipeId, recipeId)).ToArray(); - - switch (action) - { - case 0: - handler.OnRecipeBookAdd(recipeEntries, replace: true); - // INIT packets also include a second "to be displayed" recipe list. - // MCC only needs the unlocked recipe identifiers for listing/crafting. - _ = ReadRecipeBookRecipeIds(packetData); - break; - case 1: - case 3: - // Action 3 is the silent-add variant, so MCC tracks it like a regular add. - handler.OnRecipeBookAdd(recipeEntries, replace: false); - break; - case 2: - handler.OnRecipeBookRemove(recipeIds); - break; - } - } - - private void HandleRecipeBookAdd(Queue packetData) - { - int entryCount = dataTypes.ReadNextVarInt(packetData); - RecipeBookRecipeEntry[] recipeEntries = new RecipeBookRecipeEntry[entryCount]; - - // 1.21.2+ RecipeBookAdd contains one display entry per recipe: - // RecipeDisplayEntry (display id, recipe display, group, category, optional requirements), then flags. - for (int i = 0; i < entryCount; i++) - { - recipeEntries[i] = ReadRecipeBookDisplayEntry(packetData); - _ = dataTypes.ReadNextByte(packetData); // flags - } - - bool replace = dataTypes.ReadNextBool(packetData); - handler.OnRecipeBookAdd(recipeEntries, replace); - } - - private string[] ReadRecipeBookRecipeIds(Queue packetData) - { - int recipeCount = dataTypes.ReadNextVarInt(packetData); - string[] recipeIds = new string[recipeCount]; - - for (int i = 0; i < recipeCount; i++) - recipeIds[i] = dataTypes.ReadNextString(packetData); - - return recipeIds; - } - - private string[] ReadRecipeBookDisplayIds(Queue packetData) - { - int recipeCount = dataTypes.ReadNextVarInt(packetData); - string[] recipeIds = new string[recipeCount]; - - for (int i = 0; i < recipeCount; i++) - recipeIds[i] = dataTypes.ReadNextVarInt(packetData).ToString(CultureInfo.InvariantCulture); - - return recipeIds; - } - - private RecipeBookRecipeEntry ReadRecipeBookDisplayEntry(Queue packetData) - { - int displayId = dataTypes.ReadNextVarInt(packetData); - string resultLabel = ReadRecipeDisplayResultLabel(packetData); - - _ = dataTypes.ReadNextVarInt(packetData); // Optional group, encoded as varint+1 or 0 - _ = dataTypes.ReadNextVarInt(packetData); // Recipe book category registry id - SkipOptionalCraftingRequirements(packetData); - - string commandId = displayId.ToString(CultureInfo.InvariantCulture); - string displayText = $"{commandId}: {resultLabel}"; - return new RecipeBookRecipeEntry(commandId, displayText); - } - - private string ReadRecipeDisplayResultLabel(Queue packetData) - { - int displayType = dataTypes.ReadNextVarInt(packetData); - return displayType switch - { - 0 => ReadShapelessRecipeDisplayResultLabel(packetData), - 1 => ReadShapedRecipeDisplayResultLabel(packetData), - 2 => ReadFurnaceRecipeDisplayResultLabel(packetData), - 3 => ReadStonecutterRecipeDisplayResultLabel(packetData), - 4 => ReadSmithingRecipeDisplayResultLabel(packetData), - _ => $"recipe_display_{displayType}", - }; - } - - private string ReadShapelessRecipeDisplayResultLabel(Queue packetData) - { - int ingredientCount = dataTypes.ReadNextVarInt(packetData); - for (int i = 0; i < ingredientCount; i++) - _ = ReadSlotDisplayLabel(packetData); - - string result = ReadSlotDisplayLabel(packetData); - _ = ReadSlotDisplayLabel(packetData); // crafting station - return result; - } - - private string ReadShapedRecipeDisplayResultLabel(Queue packetData) - { - _ = dataTypes.ReadNextVarInt(packetData); // width - _ = dataTypes.ReadNextVarInt(packetData); // height - int ingredientCount = dataTypes.ReadNextVarInt(packetData); - for (int i = 0; i < ingredientCount; i++) - _ = ReadSlotDisplayLabel(packetData); - - string result = ReadSlotDisplayLabel(packetData); - _ = ReadSlotDisplayLabel(packetData); // crafting station - return result; - } - - private string ReadFurnaceRecipeDisplayResultLabel(Queue packetData) - { - _ = ReadSlotDisplayLabel(packetData); // ingredient - _ = ReadSlotDisplayLabel(packetData); // fuel - string result = ReadSlotDisplayLabel(packetData); - _ = ReadSlotDisplayLabel(packetData); // crafting station - _ = dataTypes.ReadNextVarInt(packetData); // duration - _ = dataTypes.ReadNextFloat(packetData); // experience - return result; - } - - private string ReadStonecutterRecipeDisplayResultLabel(Queue packetData) - { - _ = ReadSlotDisplayLabel(packetData); // input - string result = ReadSlotDisplayLabel(packetData); - _ = ReadSlotDisplayLabel(packetData); // crafting station - return result; - } - - private string ReadSmithingRecipeDisplayResultLabel(Queue packetData) - { - _ = ReadSlotDisplayLabel(packetData); // template - _ = ReadSlotDisplayLabel(packetData); // base - _ = ReadSlotDisplayLabel(packetData); // addition - string result = ReadSlotDisplayLabel(packetData); - _ = ReadSlotDisplayLabel(packetData); // crafting station - return result; - } - - private string ReadSlotDisplayLabel(Queue packetData) - { - int slotDisplayType = dataTypes.ReadNextVarInt(packetData); - - // 26.1 changed the slot display registry order, inserting 3 new types: - // Pre-26.1: 0=empty, 1=any_fuel, 2=item, 3=item_stack, 4=tag, 5=smithing_trim, 6=with_remainder, 7=composite - // 26.1+: 0=empty, 1=any_fuel, 2=with_any_potion, 3=only_with_component, 4=item, 5=item_stack, 6=tag, 7=dyed, 8=smithing_trim, 9=with_remainder, 10=composite - if (protocolVersion >= MC_26_1_Version) - { - return slotDisplayType switch - { - 0 => "Empty", - 1 => "Any Fuel", - 2 => ReadWithAnyPotionSlotDisplayLabel(packetData), - 3 => ReadOnlyWithComponentSlotDisplayLabel(packetData), - 4 => Item.GetTypeString(itemPalette.FromId(dataTypes.ReadNextVarInt(packetData))), - 5 => ReadItemStackTemplateLabel(packetData), - 6 => "#" + dataTypes.ReadNextString(packetData), - 7 => ReadDyedSlotDisplayLabel(packetData), - 8 => ReadSmithingTrimSlotDisplayLabel(packetData), - 9 => ReadWithRemainderSlotDisplayLabel(packetData), - 10 => ReadCompositeSlotDisplayLabel(packetData), - _ => $"slot_display_{slotDisplayType}", - }; - } - - return slotDisplayType switch - { - 0 => "Empty", - 1 => "Any Fuel", - 2 => Item.GetTypeString(itemPalette.FromId(dataTypes.ReadNextVarInt(packetData))), - 3 => dataTypes.ReadNextItemSlot(packetData, itemPalette)?.GetTypeString() ?? "Empty", - 4 => "#" + dataTypes.ReadNextString(packetData), - 5 => ReadSmithingTrimSlotDisplayLabel(packetData), - 6 => ReadWithRemainderSlotDisplayLabel(packetData), - 7 => ReadCompositeSlotDisplayLabel(packetData), - _ => $"slot_display_{slotDisplayType}", - }; - } - - /// - /// Reads a with_any_potion slot display (26.1+): contains a nested SlotDisplay. - /// - private string ReadWithAnyPotionSlotDisplayLabel(Queue packetData) - { - return ReadSlotDisplayLabel(packetData); - } - - /// - /// Reads an only_with_component slot display (26.1+): contains a nested SlotDisplay and a DataComponentType VarInt ID. - /// - private string ReadOnlyWithComponentSlotDisplayLabel(Queue packetData) - { - string sourceLabel = ReadSlotDisplayLabel(packetData); - _ = dataTypes.ReadNextVarInt(packetData); // DataComponentType registry id - return sourceLabel; - } - - /// - /// Reads a dyed slot display (26.1+): contains two nested SlotDisplays (dye + target). - /// - private string ReadDyedSlotDisplayLabel(Queue packetData) - { - _ = ReadSlotDisplayLabel(packetData); // dye - string targetLabel = ReadSlotDisplayLabel(packetData); // target - return targetLabel; - } - - private string ReadSmithingTrimSlotDisplayLabel(Queue packetData) - { - string baseLabel = ReadSlotDisplayLabel(packetData); - _ = ReadSlotDisplayLabel(packetData); // material - _ = dataTypes.ReadNextVarInt(packetData); // trim pattern registry id - return baseLabel; - } - - private string ReadWithRemainderSlotDisplayLabel(Queue packetData) - { - string inputLabel = ReadSlotDisplayLabel(packetData); - _ = ReadSlotDisplayLabel(packetData); // remainder - return inputLabel; - } - - private string ReadCompositeSlotDisplayLabel(Queue packetData) - { - int optionCount = dataTypes.ReadNextVarInt(packetData); - string label = "Composite"; - - for (int i = 0; i < optionCount; i++) - { - string optionLabel = ReadSlotDisplayLabel(packetData); - if (label == "Composite" && optionLabel is not "Empty" and not "Composite") - label = optionLabel; - } - - return label; - } - - /// - /// Read an ItemStackTemplate (26.1+) which encodes fields in a different order - /// than ItemStack: item_id (VarInt), count (VarInt), DataComponentPatch. - /// - private string ReadItemStackTemplateLabel(Queue packetData) - { - return dataTypes.ReadNextItemStackTemplate(packetData, itemPalette).GetTypeString(); - } - - private void SkipOptionalCraftingRequirements(Queue packetData) - { - if (!dataTypes.ReadNextBool(packetData)) - return; - - int ingredientCount = dataTypes.ReadNextVarInt(packetData); - for (int i = 0; i < ingredientCount; i++) - SkipItemHolderSet(packetData); - } - - private void SkipItemHolderSet(Queue packetData) - { - int entryCount = dataTypes.ReadNextVarInt(packetData) - 1; - if (entryCount == -1) - { - _ = dataTypes.ReadNextString(packetData); - return; - } - - for (int i = 0; i < entryCount; i++) - _ = dataTypes.ReadNextVarInt(packetData); - } - - private bool SkipRecipeBookSettings(Queue packetData) - { - // MC 1.13-1.16.1 uses 4 booleans for the crafting/smelting recipe book states. - // MC 1.16.2+ expands this to 8 booleans through RecipeBookSettings. - int boolCount = protocolVersion >= MC_1_16_2_Version ? 8 : 4; - if (packetData.Count < boolCount) - return false; - - for (int i = 0; i < boolCount; i++) - _ = dataTypes.ReadNextBool(packetData); - - return true; - } - - /// - /// Start the updating thread. Should be called after login success. - /// - private void StartUpdating() - { - Thread threadUpdater = new(new ParameterizedThreadStart(Updater)) - { - Name = "ProtocolPacketHandler" - }; - netMain = new Tuple(threadUpdater, new CancellationTokenSource()); - threadUpdater.Start(netMain.Item2.Token); - - Thread threadReader = new(new ParameterizedThreadStart(PacketReader)) - { - Name = "ProtocolPacketReader" - }; - netReader = new Tuple(threadReader, new CancellationTokenSource()); - threadReader.Start(netReader.Item2.Token); - } - - /// - /// Get net read thread (main thread) ID - /// - /// Net read thread ID - public int GetNetMainThreadId() - { - return netMain is not null ? netMain.Item1.ManagedThreadId : -1; - } - - /// - /// Disconnect from the server, cancel network reading. - /// - public void Dispose() - { - try - { - netMain?.Item2.Cancel(); - } - finally - { - try - { - netReader?.Item2.Cancel(); - } - finally - { - socketWrapper.Disconnect(); - McClient.Instance?.DeleteAllCookies(); - } - } - } - - /// - /// Send a packet to the server. Packet ID, compression, and encryption will be handled automatically. - /// - /// packet type - /// packet Data - private void SendPacket(PacketTypesOut packet, IEnumerable packetData) - { - SendPacket(packetPalette.GetOutgoingIdByType(packet), packetData, packet.ToString()); - } - - private void ProcessChunkBlockEntityData(int chunkX, int chunkZ, Queue packetData) - { - if (protocolVersion < MC_1_17_Version || packetData.Count == 0) - return; - - int blockEntityCount = dataTypes.ReadNextVarInt(packetData); - for (int i = 0; i < blockEntityCount; i++) - { - if (protocolVersion < MC_1_18_1_Version) - { - Dictionary? blockEntityNbt = dataTypes.ReadNextNbt(packetData); - if (blockEntityNbt.TryGetValue("x", out var nbtX) - && blockEntityNbt.TryGetValue("y", out var nbtY) - && blockEntityNbt.TryGetValue("z", out var nbtZ)) - { - handler.OnBlockEntityData( - new Location(Convert.ToInt32(nbtX), Convert.ToInt32(nbtY), Convert.ToInt32(nbtZ)), - blockEntityNbt); - } - - continue; - } - - int packedXZ = dataTypes.ReadNextByte(packetData); - int y = dataTypes.ReadNextShort(packetData); - dataTypes.ReadNextVarInt(packetData); // Block entity type registry id - Dictionary? nbt = dataTypes.ReadNextNbt(packetData); - int blockX = chunkX * Chunk.SizeX + ((packedXZ >> 4) & 0x0F); - int blockZ = chunkZ * Chunk.SizeZ + (packedXZ & 0x0F); - handler.OnBlockEntityData(new Location(blockX, y, blockZ), nbt); - } - } - - /// - /// Send a configuration packet to the server. Packet ID, compression, and encryption will be handled automatically. - /// - /// packet type - /// packet Data - private void SendPacket(ConfigurationPacketTypesOut packet, IEnumerable packetData) - { - SendPacket(packetPalette.GetOutgoingIdByTypeConfiguration(packet), packetData, packet.ToString()); - } - - private void HandleShowDialog(Queue packetData, DialogPhase phase) - { - if (phase == DialogPhase.Play) - { - var holderId = dataTypes.ReadNextVarInt(packetData); - if (holderId != 0) - { - handler.OnDialogRegistryReferenceShown(holderId - 1, phase); - return; - } - } - - var dialog = dialogNbtParser.Parse(dataTypes.ReadNextNbt(packetData)); - handler.OnDialogShown(dialog, phase); - } - - private IReadOnlyList ReadServerLinks(Queue packetData) - { - var linksCount = dataTypes.ReadNextVarInt(packetData); - List links = new(linksCount); - - for (var i = 0; i < linksCount; i++) - { - string label; - var isBuiltIn = dataTypes.ReadNextBool(packetData); - if (isBuiltIn) - label = GetKnownServerLinkLabel(dataTypes.ReadNextVarInt(packetData)); - else - label = dataTypes.ReadNextChat(packetData); - - var url = dataTypes.ReadNextString(packetData); - links.Add(new DialogServerLink(label, url)); - } - - return links; - } - - private static string GetKnownServerLinkLabel(int id) - { - return id switch - { - 0 => Translations.dialog_server_link_report_bug, - 1 => Translations.dialog_server_link_community_guidelines, - 2 => Translations.dialog_server_link_support, - 3 => Translations.dialog_server_link_status, - 4 => Translations.dialog_server_link_feedback, - 5 => Translations.dialog_server_link_community, - 6 => Translations.dialog_server_link_website, - 7 => Translations.dialog_server_link_forums, - 8 => Translations.dialog_server_link_news, - 9 => Translations.dialog_server_link_announcements, - _ => id.ToString(CultureInfo.InvariantCulture) - }; - } - - /// - /// Send a packet to the server. Compression and encryption will be handled automatically. - /// - /// packet ID - /// packet Data - private void SendPacket(int packetId, IEnumerable packetData, string? packetType = null) - { - byte[] payload = packetData as byte[] ?? packetData.ToArray(); - LogOutgoingPacket(packetId, payload.Length, packetType); - - if (handler.GetNetworkPacketCaptureEnabled()) - { - handler.OnNetworkPacket(packetId, payload.ToList(), currentState == CurrentState.Login, false); - } - - //log.Info($"[C -> S] Sending packet {packetId:X} > {dataTypes.ByteArrayToString(packetData.ToArray())}"); - - //The inner packet - byte[] packetIdBytes = DataTypes.GetVarInt(packetId); - byte[] thePacket = new byte[packetIdBytes.Length + payload.Length]; - Buffer.BlockCopy(packetIdBytes, 0, thePacket, 0, packetIdBytes.Length); - Buffer.BlockCopy(payload, 0, thePacket, packetIdBytes.Length, payload.Length); - - if (compression_treshold >= 0) //Compression enabled? - { - byte[] compressedHeader = thePacket.Length >= compression_treshold - ? DataTypes.GetVarInt(thePacket.Length) - : DataTypes.GetVarInt(0); - byte[] compressedPayload = thePacket.Length >= compression_treshold - ? ZlibUtils.Compress(thePacket) - : thePacket; - - byte[] compressedPacket = new byte[compressedHeader.Length + compressedPayload.Length]; - Buffer.BlockCopy(compressedHeader, 0, compressedPacket, 0, compressedHeader.Length); - Buffer.BlockCopy(compressedPayload, 0, compressedPacket, compressedHeader.Length, compressedPayload.Length); - thePacket = compressedPacket; - } - - //log.Debug("[C -> S] Sending packet " + packetId + " > " + dataTypes.ByteArrayToString(dataTypes.ConcatBytes(dataTypes.GetVarInt(thePacket.Length), thePacket))); - byte[] packetLengthBytes = DataTypes.GetVarInt(thePacket.Length); - byte[] fullPacket = new byte[packetLengthBytes.Length + thePacket.Length]; - Buffer.BlockCopy(packetLengthBytes, 0, fullPacket, 0, packetLengthBytes.Length); - Buffer.BlockCopy(thePacket, 0, fullPacket, packetLengthBytes.Length, thePacket.Length); - socketWrapper.SendDataRAW(fullPacket); - } - - private void SetCurrentState(CurrentState newState) - { - if (currentState == newState) - return; - - var previousState = currentState; - currentState = newState; - - if (!log.DebugEnabled) - return; - - log.PacketDebug(string.Format(Translations.debug_packet_state_change, previousState, newState)); - } - - private static bool IsPacketExcluded(string packetType) - { - var exclusions = Settings.Config.Logging.PacketDebugExclusions; - return exclusions.Count > 0 && exclusions.Contains(packetType, StringComparer.OrdinalIgnoreCase); - } - - private void LogIncomingPacket(int packetId, int payloadLength, int frameLength, bool compressed, int uncompressedLength) - { - if (!log.DebugEnabled) - return; - - var packetType = ResolveIncomingPacketType(packetId); - if (IsPacketExcluded(packetType)) - return; - - var compressionInfo = compression_treshold < 0 - ? Translations.debug_packet_compression_disabled - : compressed - ? string.Format(Translations.debug_packet_compression_compressed, uncompressedLength) - : Translations.debug_packet_compression_uncompressed; - - log.PacketDebug(string.Format(Translations.debug_packet_incoming, - currentState, - packetId, - packetType, - payloadLength, - frameLength, - compressionInfo)); - } - - private void LogOutgoingPacket(int packetId, int payloadLength, string? packetType) - { - if (!log.DebugEnabled) - return; - - var resolvedType = packetType ?? ResolveOutgoingPacketType(packetId); - if (IsPacketExcluded(resolvedType)) - return; - - log.PacketDebug(string.Format(Translations.debug_packet_outgoing, - currentState, - packetId, - resolvedType, - payloadLength, - compression_treshold)); - } - - private void LogNetworkLoopExit(string loopName, string reason) - { - if (!log.DebugEnabled) - return; - - log.PacketDebug(string.Format(Translations.debug_packet_loop_exit, - loopName, - reason, - currentState, - socketWrapper.IsConnected())); - } - - private string ResolveIncomingPacketType(int packetId) - { - return currentState switch - { - CurrentState.Login => packetId switch - { - 0x00 => "Disconnect", - 0x01 => "EncryptionRequest", - 0x02 => "LoginSuccess", - 0x03 => "SetCompression", - 0x04 => "LoginPluginRequest", - 0x05 => "CookieRequest", - _ => string.Format(Translations.debug_packet_unknown_type, packetId) - }, - CurrentState.Configuration when packetPalette.GetMappingInConfiguration().TryGetValue(packetId, out var configurationPacket) => - configurationPacket.ToString(), - CurrentState.Play when packetPalette.GetMappingIn().TryGetValue(packetId, out var playPacket) => - playPacket.ToString(), - _ => string.Format(Translations.debug_packet_unknown_type, packetId) - }; - } - - private string ResolveOutgoingPacketType(int packetId) - { - return currentState switch - { - CurrentState.Login => packetId switch - { - 0x00 => "LoginStart", - 0x01 => "EncryptionResponse", - 0x02 => "LoginPluginResponse", - 0x03 => "LoginAcknowledged", - 0x04 => "CookieResponse", - _ => string.Format(Translations.debug_packet_unknown_type, packetId) - }, - CurrentState.Configuration when packetPalette.GetMappingOutConfiguration().TryGetValue(packetId, out var configurationPacket) => - configurationPacket.ToString(), - CurrentState.Play when packetPalette.GetMappingOut().TryGetValue(packetId, out var playPacket) => - playPacket.ToString(), - _ => string.Format(Translations.debug_packet_unknown_type, packetId) - }; - } - - /// - /// Do the Minecraft login. - /// - /// True if login successful - public bool Login(PlayerKeyPair? playerKeyPair, SessionToken session, bool isTransfer = false) - { - int nextState = isTransfer && protocolVersion >= MC_1_20_6_Version ? 3 : 2; - - if (nextState == 3) - log.PacketDebug("Using transfer handshake intent for transferred login."); - - // 1. Send the handshake packet - SendPacket(0x00, dataTypes.ConcatBytes( - // Protocol Version (use raw version for snapshot/RC servers) - DataTypes.GetVarInt(rawProtocolVersion), - - // Server Address - dataTypes.GetString(pForge.GetServerAddress(handler.GetServerHost())), - - // Server Port - dataTypes.GetUShort((ushort)handler.GetServerPort()), - - // Next State - DataTypes.GetVarInt(nextState)), // 2 is Login, 3 is Transfer - "Handshake" - ); - - // 2. Send the Login Start packet - List fullLoginPacket = new(); - fullLoginPacket.AddRange(dataTypes.GetString(handler.GetUsername())); // Username - - // 1.19 - 1.19.2 - if (protocolVersion is >= MC_1_19_Version and < MC_1_19_3_Version) - { - if (playerKeyPair is null) - fullLoginPacket.AddRange(dataTypes.GetBool(false)); // Has Sig Data - else - { - fullLoginPacket.AddRange(dataTypes.GetBool(true)); // Has Sig Data - fullLoginPacket.AddRange( - DataTypes.GetLong(playerKeyPair.GetExpirationMilliseconds())); // Expiration time - fullLoginPacket.AddRange( - dataTypes.GetArray(playerKeyPair.PublicKey.Key)); // Public key received from Microsoft API - if (protocolVersion >= MC_1_19_2_Version) - fullLoginPacket.AddRange( - dataTypes.GetArray(playerKeyPair.PublicKey - .SignatureV2!)); // Public key signature received from Microsoft API - else - fullLoginPacket.AddRange( - dataTypes.GetArray(playerKeyPair.PublicKey - .Signature!)); // Public key signature received from Microsoft API - } - } - - var uuid = handler.GetUserUuid(); - switch (protocolVersion) - { - case >= MC_1_19_2_Version and < MC_1_20_2_Version: - { - if (uuid == Guid.Empty) - fullLoginPacket.AddRange(dataTypes.GetBool(false)); // Has UUID - else - { - fullLoginPacket.AddRange(dataTypes.GetBool(true)); // Has UUID - fullLoginPacket.AddRange(DataTypes.GetUUID(uuid)); // UUID - } - - break; - } - case >= MC_1_20_2_Version: - uuid = handler.GetUserUuid(); - - if (uuid == Guid.Empty) - uuid = Guid.NewGuid(); - - fullLoginPacket.AddRange(DataTypes.GetUUID(uuid)); // UUID - break; - } - - SendPacket(0x00, fullLoginPacket, "LoginStart"); - - // 3. Encryption Request - 9. Login Acknowledged - while (true) - { - var (packetId, packetData) = ReadNextPacket(); - - switch (packetId) - { - // Login rejected - case 0x00: - handler.OnConnectionLost(ChatBot.DisconnectReason.LoginRejected, - ChatParser.ParseText(dataTypes.ReadNextString(packetData))); - return false; - - // Encryption request - case 0x01: - { - isOnlineMode = true; - var serverId = dataTypes.ReadNextString(packetData); - var serverPublicKey = dataTypes.ReadNextByteArray(packetData); - var token = dataTypes.ReadNextByteArray(packetData); - - var shouldAuthetnicate = false; - - if (protocolVersion >= MC_1_20_6_Version) - shouldAuthetnicate = dataTypes.ReadNextBool(packetData); - - return StartEncryption(handler.GetUserUuidStr(), handler.GetSessionID(), - Config.Main.General.AccountType, token, serverId, - serverPublicKey, playerKeyPair, session, shouldAuthetnicate); - } - - // Login successful - case 0x02: - { - log.Info($"§8{Translations.mcc_server_offline}"); - SetCurrentState(protocolVersion < MC_1_20_2_Version - ? CurrentState.Play - : CurrentState.Configuration); - - if (protocolVersion >= MC_1_20_2_Version) - { - // Hypixel and other 1.20.2+ servers stay in configuration until ClientInformation is sent. - SendPacket(0x03, new List(), "LoginAcknowledged"); - SendConfiguredClientSettings(); - } - - if (!pForge.CompleteForgeHandshake()) - { - log.Error($"§8{Translations.error_forge}"); - return false; - } - - StartUpdating(); - return true; //No need to check session or start encryption - } - default: - HandlePacket(packetId, packetData); - break; - } - } - } - - /// - /// Start network encryption. Automatically called by Login() if the server requests encryption. - /// - /// True if encryption was successful - private bool StartEncryption(string uuid, string sessionID, LoginType type, byte[] token, string serverIDhash, - byte[] serverPublicKey, PlayerKeyPair? playerKeyPair, SessionToken session, bool shouldAuthetnicate) - { - var RSAService = CryptoHandler.DecodeRSAPublicKey(serverPublicKey)!; - var secretKey = CryptoHandler.ClientAESPrivateKey ?? CryptoHandler.GenerateAESPrivateKey(); - - log.PacketDebug($"§8{Translations.debug_crypto}"); - - if (serverIDhash != "-" && !string.IsNullOrWhiteSpace(sessionID)) - { - log.Info(Translations.mcc_session); - - var needCheckSession = true; - if (session is { ServerPublicKey: not null, SessionPreCheckTask: not null } - && serverIDhash == session.ServerIDhash && - serverPublicKey.SequenceEqual(session.ServerPublicKey)) - { - session.SessionPreCheckTask.Wait(); - if (session.SessionPreCheckTask.Result) // PreCheck Success - needCheckSession = false; - } - - // 1.20.6++ - if (shouldAuthetnicate) - needCheckSession = true; - - if (needCheckSession) - { - var serverHash = CryptoHandler.GetServerHash(serverIDhash, serverPublicKey, secretKey); - if (ProtocolHandler.SessionCheck(uuid, sessionID, serverHash, type)) - { - session.ServerIDhash = serverIDhash; - session.ServerPublicKey = serverPublicKey; - SessionCache.Store(InternalConfig.Account.Login.ToLower(), session); - } - else - { - handler.OnConnectionLost(ChatBot.DisconnectReason.LoginRejected, Translations.mcc_session_fail); - return false; - } - } - } - - // Encryption Response packet - List encryptionResponse = new(); - encryptionResponse.AddRange(dataTypes.GetArray(RSAService.Encrypt(secretKey, false))); // Shared Secret - - // 1.19 - 1.19.2 - if (protocolVersion is >= MC_1_19_Version and < MC_1_19_3_Version) - { - if (playerKeyPair is null) - { - encryptionResponse.AddRange(dataTypes.GetBool(true)); // Has Verify Token - encryptionResponse.AddRange(dataTypes.GetArray(RSAService.Encrypt(token, false))); // Verify Token - } - else - { - var salt = GenerateSalt(); - var messageSignature = playerKeyPair.PrivateKey.SignData(dataTypes.ConcatBytes(token, salt)); - - encryptionResponse.AddRange(dataTypes.GetBool(false)); // Has Verify Token - encryptionResponse.AddRange(salt); // Salt - encryptionResponse.AddRange(dataTypes.GetArray(messageSignature)); // Message Signature - } - } - else - { - encryptionResponse.AddRange(dataTypes.GetArray(RSAService.Encrypt(token, false))); // Verify Token - } - - SendPacket(0x01, encryptionResponse); - - // Start client-side encryption - socketWrapper.SwitchToEncrypted(secretKey); // pre switch - - // Process the next packet - int loopPrevention = ushort.MaxValue; - while (true) - { - var (packetId, packetData) = ReadNextPacket(); - if (packetId < 0 || loopPrevention-- < 0) // Failed to read packet or too many iterations (issue #1150) - { - handler.OnConnectionLost(ChatBot.DisconnectReason.ConnectionLost, - $"§8{Translations.error_invalid_encrypt}"); - return false; - } - - switch (packetId) - { - //Login rejected - case 0x00: - handler.OnConnectionLost(ChatBot.DisconnectReason.LoginRejected, - ChatParser.ParseText(dataTypes.ReadNextString(packetData))); - return false; - - //Login successful - case 0x02: - { - var uuidReceived = protocolVersion >= MC_1_16_Version - ? dataTypes.ReadNextUUID(packetData) - : Guid.Parse(dataTypes.ReadNextString(packetData)); - var userName = dataTypes.ReadNextString(packetData); - Tuple[]? playerProperty = null; - if (protocolVersion >= MC_1_19_Version) - { - var count = dataTypes.ReadNextVarInt(packetData); // Number Of Properties - playerProperty = new Tuple[count]; - for (var i = 0; i < count; ++i) - { - var name = dataTypes.ReadNextString(packetData); - var value = dataTypes.ReadNextString(packetData); - var isSigned = dataTypes.ReadNextBool(packetData); - var signature = isSigned ? dataTypes.ReadNextString(packetData) : string.Empty; - playerProperty[i] = new Tuple(name, value, signature); - } - } - - // Strict Error Handling (removed in 1.21.2) - if (protocolVersion >= MC_1_20_6_Version && protocolVersion < MC_1_21_2_Version) - dataTypes.ReadNextBool(packetData); - - SetCurrentState(protocolVersion < MC_1_20_2_Version - ? CurrentState.Play - : CurrentState.Configuration); - - if (protocolVersion >= MC_1_20_2_Version) - { - // Hypixel and other 1.20.2+ servers stay in configuration until ClientInformation is sent. - SendPacket(0x03, new List(), "LoginAcknowledged"); - SendConfiguredClientSettings(); - } - - handler.OnLoginSuccess(uuidReceived, userName, playerProperty); - - if (!pForge.CompleteForgeHandshake()) - { - log.Error($"§8{Translations.error_forge_encrypt}"); - return false; - } - - StartUpdating(); - return true; - } - default: - HandlePacket(packetId, packetData); - break; - } - } - } - - /// - /// Disconnect from the server - /// - public void Disconnect() - { - socketWrapper.Disconnect(); - } - - /// - /// Autocomplete text while typing username or command - /// - /// Text behind cursor - /// Completed text - int IAutoComplete.AutoComplete(string BehindCursor) - { - if (string.IsNullOrEmpty(BehindCursor)) - return -1; - - var transactionId = DataTypes.GetVarInt(autocomplete_transaction_id); - byte[] assumeCommand = [0x00]; - byte[] hasPosition = [0x00]; - byte[] tabCompletePacket = []; - - switch (protocolVersion) - { - case >= MC_1_8_Version and >= MC_1_13_Version: - tabCompletePacket = dataTypes.ConcatBytes(tabCompletePacket, transactionId); - tabCompletePacket = dataTypes.ConcatBytes(tabCompletePacket, - dataTypes.GetString(BehindCursor.Replace(' ', (char)0x00))); - break; - case >= MC_1_8_Version: - { - tabCompletePacket = dataTypes.ConcatBytes(tabCompletePacket, dataTypes.GetString(BehindCursor)); - - if (protocolVersion >= MC_1_9_Version) - tabCompletePacket = dataTypes.ConcatBytes(tabCompletePacket, assumeCommand); - - tabCompletePacket = dataTypes.ConcatBytes(tabCompletePacket, hasPosition); - break; - } - default: - tabCompletePacket = dataTypes.ConcatBytes(dataTypes.GetString(BehindCursor)); - break; - } - - ConsoleIO.AutoCompleteDone = false; - SendPacket(PacketTypesOut.TabComplete, tabCompletePacket); - return autocomplete_transaction_id; - } - - /// - /// Ping a Minecraft server to get information about the server - /// - /// True if ping was successful - public static bool DoPing(string host, int port, ref int protocolVersion, ref ForgeInfo? forgeInfo) - { - SocketWrapper? socketWrapper = null; - - try - { - var version = ""; - var tcp = ProxyHandler.NewTcpClient(host, port); - tcp.ReceiveTimeout = 30000; // 30 seconds - tcp.ReceiveBufferSize = 1024 * 1024; - socketWrapper = new SocketWrapper(tcp); - DataTypes dataTypes = new(MC_1_8_Version); - - var serverPort = BitConverter.GetBytes((ushort)port); - Array.Reverse(serverPort); - - // Ping Packet - var pingPacket = dataTypes.ConcatBytes( - // Packet Id - DataTypes.GetVarInt(0), - - // Protocol Version - DataTypes.GetVarInt(-1), - - // Server IP (Host) - dataTypes.GetString(host), - - // Server port - serverPort, - - // Next State - DataTypes.GetVarInt(1)); - - socketWrapper.SendDataRAW(dataTypes.ConcatBytes(DataTypes.GetVarInt(pingPacket.Length), pingPacket)); - - // Status Request Packet - var statusRequest = DataTypes.GetVarInt(0); - socketWrapper.SendDataRAW(dataTypes.ConcatBytes(DataTypes.GetVarInt(statusRequest.Length), statusRequest)); - - // Read Response length - var packetLength = dataTypes.ReadNextVarIntRAW(socketWrapper); - if (packetLength <= 0) - return false; - - // Read the Packet Id - var packetData = new Queue(socketWrapper.ReadDataRAW(packetLength)); - if (dataTypes.ReadNextVarInt(packetData) != 0x00) - return false; - - // Get the Json data - var result = dataTypes.ReadNextString(packetData); - - if (Config.Logging.DebugMessages) - { - // May contain formatting codes, cannot use WriteLineFormatted - Console.ForegroundColor = ConsoleColor.DarkGray; - ConsoleIO.WriteLine(result); - Console.ForegroundColor = ConsoleColor.Gray; - } - - if (string.IsNullOrEmpty(result) || !result.StartsWith("{") || !result.EndsWith("}")) - return false; - - var jsonData = Json.ParseJson(result); - if (jsonData is not System.Text.Json.Nodes.JsonObject jsonObj || !jsonObj.ContainsKey("version")) - return false; - - var versionData = jsonObj["version"]!.AsObject(); - - // Retrieve display name of the Minecraft version - if (versionData["name"] is { } nameNode) - version = nameNode.GetStringValue(); - - // Retrieve protocol version number for handling this server - if (versionData["protocol"] is { } protocolNode) - protocolVersion = int.Parse(protocolNode.GetStringValue(), - NumberStyles.Any, CultureInfo.CurrentCulture); - - // Check for forge on the server. - Protocol18Forge.ServerInfoCheckForge(jsonObj, ref forgeInfo); - - int onlinePlayers = 0, maxPlayers = 0; - List samplePlayers = []; - - if (jsonObj["players"] is System.Text.Json.Nodes.JsonObject playersObj) - { - if (playersObj["online"] is { } onlineNode) - onlinePlayers = int.Parse(onlineNode.GetStringValue(), NumberStyles.Any, CultureInfo.CurrentCulture); - if (playersObj["max"] is { } maxNode) - maxPlayers = int.Parse(maxNode.GetStringValue(), NumberStyles.Any, CultureInfo.CurrentCulture); - if (playersObj["sample"] is System.Text.Json.Nodes.JsonArray sampleArray) - { - foreach (var entry in sampleArray) - { - if (entry is not System.Text.Json.Nodes.JsonObject playerObj) continue; - samplePlayers.Add(new ServerStatusInfo.SamplePlayer - { - Name = playerObj["name"]?.GetStringValue() ?? "", - Id = playerObj["id"]?.GetStringValue() ?? "" - }); - } - } - } - - string motdRaw = ""; - if (jsonObj["description"] is { } descNode) - motdRaw = descNode.ToJsonString(); - - string? faviconBase64 = null; - if (jsonObj["favicon"] is { } faviconNode) - { - var faviconStr = faviconNode.GetStringValue(); - const string prefix = "data:image/png;base64,"; - faviconBase64 = faviconStr.StartsWith(prefix, StringComparison.Ordinal) - ? faviconStr[prefix.Length..] - : faviconStr; - } - - long pingMs = -1; - try - { - long pingPayload = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); - var pingRequest = dataTypes.ConcatBytes(DataTypes.GetVarInt(0x01), DataTypes.GetLong(pingPayload)); - socketWrapper.SendDataRAW(dataTypes.ConcatBytes(DataTypes.GetVarInt(pingRequest.Length), pingRequest)); - - packetLength = dataTypes.ReadNextVarIntRAW(socketWrapper); - if (packetLength > 0) - { - packetData = new Queue(socketWrapper.ReadDataRAW(packetLength)); - if (dataTypes.ReadNextVarInt(packetData) == 0x01) - { - long pongPayload = dataTypes.ReadNextLong(packetData); - pingMs = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() - pingPayload; - } - } - } - catch - { - // Some servers may close the probe connection immediately after the status response. - } - - var statusInfo = new ServerStatusInfo - { - Host = host, - Port = port, - VersionName = version, - ProtocolVersion = protocolVersion, - OnlinePlayers = onlinePlayers, - MaxPlayers = maxPlayers, - SamplePlayers = samplePlayers, - MotdRaw = motdRaw, - FaviconBase64 = faviconBase64, - PingMs = pingMs - }; - - ProtocolHandler.TryUpgradeProtocolVersion(version, ref protocolVersion); - statusInfo.ResolvedProtocol = protocolVersion; - - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.mcc_server_protocol, version, - protocolVersion + (forgeInfo is not null ? Translations.mcc_with_forge : ""))); - - ServerStatusDisplay.Show(statusInfo); - - return true; - } - finally - { - socketWrapper?.Disconnect(); - } - } - - /// - /// Get max length for chat messages - /// - /// Max length, in characters - public int GetMaxChatMessageLength() - { - int configOverride = Settings.MainConfigHelper.Config.Advanced.MaxChatMessageLength; - if (configOverride > 0) - return configOverride; - return protocolVersion > MC_1_10_Version ? 256 : 100; - } - - /// - /// Get the current protocol version. - /// - /// - /// Version-specific operations should be handled inside the Protocol handled whenever possible. - /// - /// Minecraft Protocol version number - public int GetProtocolVersion() - { - return protocolVersion; - } - - /// - /// Send MessageAcknowledgment packet - /// - /// Message acknowledgment - /// True if properly sent - public bool SendMessageAcknowledgment(LastSeenMessageList.Acknowledgment acknowledgment) - { - try - { - var fields = dataTypes.GetAcknowledgment(acknowledgment, - isOnlineMode && Config.Signature.LoginWithSecureProfile); - - SendPacket(PacketTypesOut.MessageAcknowledgment, fields); - - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - /// - /// Send MessageAcknowledgment packet - /// - /// Message acknowledgment - /// True if properly sent - public bool SendMessageAcknowledgment(int messageCount) - { - try - { - var fields = DataTypes.GetVarInt(messageCount); - SendPacket(PacketTypesOut.MessageAcknowledgment, fields); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public LastSeenMessageList.Acknowledgment ConsumeAcknowledgment() - { - pendingAcknowledgments = 0; - return new LastSeenMessageList.Acknowledgment(lastSeenMessagesCollector.GetLastSeenMessages(), - lastReceivedMessage); - } - - public void Acknowledge(ChatMessage message) - { - var entry = message.ToLastSeenMessageEntry(); - if (entry is null) return; - - if (protocolVersion >= MC_1_19_3_Version) - { - if (!lastSeenMessagesCollector.Add_1_19_3(entry, true)) return; - if (lastSeenMessagesCollector.messageCount <= 64) return; - - var messageCount = lastSeenMessagesCollector.ResetMessageCount(); - if (messageCount > 0) - SendMessageAcknowledgment(messageCount); - } - else - { - lastSeenMessagesCollector.Add_1_19_2(entry); - lastReceivedMessage = null; - if (pendingAcknowledgments++ > 64) - SendMessageAcknowledgment(ConsumeAcknowledgment()); - } - } - - /// - /// Send a chat command to the server, with or without signing based on the online mode and version. - /// - /// Command - /// PlayerKeyPair (optional) - /// True if properly sent - public bool SendChatCommand(string command, PlayerKeyPair? playerKeyPair = null) - { - if (string.IsNullOrEmpty(command)) - return true; - - command = Regex.Replace(command, @"\s+", " "); - command = Regex.Replace(command, @"\s$", string.Empty); - - log.PacketDebug($"chat command = {command}"); - - if (protocolVersion >= MC_1_20_6_Version && !isOnlineMode) - { - List fields = new(); - fields.AddRange(dataTypes.GetString(command)); - SendPacket(PacketTypesOut.ChatCommand, fields); - return true; - } - - try - { - List>? needSigned = null; - bool canSignCommand = protocolVersion >= MC_1_19_Version && - isOnlineMode && - playerKeyPair is not null && - Config.Signature.LoginWithSecureProfile && - Config.Signature.SignMessageInCommand; - - if (canSignCommand) - { - if (DeclareCommands.IsCommandTreeAvailable) - { - needSigned = DeclareCommands.CollectSignArguments(command); - } - else - { - needSigned = []; - log.PacketDebug("DeclareCommands tree unavailable, sending command without signed arguments."); - } - } - - lock (MessageSigningLock) - { - var acknowledgment1192 = protocolVersion == MC_1_19_2_Version ? ConsumeAcknowledgment() : null; - - var (acknowledgment1193, bitset1193, messageCount1193) = protocolVersion >= MC_1_19_3_Version - ? lastSeenMessagesCollector.Collect_1_19_3() - : new(Array.Empty(), Array.Empty(), 0); - - List fields = new(); - fields.AddRange(dataTypes.GetString(command)); - var timeNow = DateTimeOffset.UtcNow; - fields.AddRange(DataTypes.GetLong(timeNow.ToUnixTimeMilliseconds())); - - if (needSigned is null || needSigned.Count == 0) - { - fields.AddRange(DataTypes.GetLong(0)); - fields.AddRange(DataTypes.GetVarInt(0)); - } - else - { - var uuid = handler.GetUserUuid(); - var salt = GenerateSalt(); - fields.AddRange(salt); - fields.AddRange(DataTypes.GetVarInt(needSigned.Count)); - - foreach (var (argName, message) in needSigned) - { - fields.AddRange(dataTypes.GetString(argName)); - var sign = protocolVersion switch - { - MC_1_19_Version => playerKeyPair!.PrivateKey.SignMessage(message, uuid, timeNow, ref salt), - MC_1_19_2_Version => playerKeyPair!.PrivateKey.SignMessage(message, uuid, timeNow, ref salt, acknowledgment1192!.lastSeen), - _ => playerKeyPair!.PrivateKey.SignMessage(message, uuid, chatUuid, messageIndex++, timeNow, ref salt, acknowledgment1193) - }; - - if (protocolVersion <= MC_1_19_2_Version) - fields.AddRange(DataTypes.GetVarInt(sign.Length)); - - fields.AddRange(sign); - } - } - - if (protocolVersion <= MC_1_19_2_Version) - fields.AddRange(dataTypes.GetBool(false)); - - switch (protocolVersion) - { - case MC_1_19_2_Version: - fields.AddRange(dataTypes.GetAcknowledgment(acknowledgment1192!, isOnlineMode && Config.Signature.LoginWithSecureProfile)); - break; - case >= MC_1_19_3_Version: - fields.AddRange(DataTypes.GetVarInt(messageCount1193)); - fields.AddRange(bitset1193); - - // Checksum: Byte (1.21.5+, 0 = skip verification) - if (protocolVersion >= MC_1_21_5_Version) - fields.Add(0); - break; - } - - SendPacket(protocolVersion < MC_1_20_6_Version ? PacketTypesOut.ChatCommand : PacketTypesOut.SignedChatCommand, fields); - } - - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool SendCustomClickAction(string id, Dictionary? payload) - { - if (protocolVersion < MC_1_21_6_Version) - return false; - - try - { - List fields = new(); - fields.AddRange(dataTypes.GetString(id.Contains(':', StringComparison.Ordinal) ? id : "minecraft:" + id)); - - var tagBytes = dataTypes.GetNbtTag(payload); - if (tagBytes.Length > 65536) - return false; - - fields.AddRange(DataTypes.GetVarInt(tagBytes.Length)); - fields.AddRange(tagBytes); - - switch (currentState) - { - case CurrentState.Configuration: - SendPacket(ConfigurationPacketTypesOut.CustomClickAction, fields); - return true; - case CurrentState.Play: - SendPacket(PacketTypesOut.CustomClickAction, fields); - return true; - default: - return false; - } - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - /// - /// Send a chat message to the server - /// - /// Message - /// PlayerKeyPair - /// True if properly sent - public bool SendChatMessage(string message, PlayerKeyPair? playerKeyPair) - { - if (string.IsNullOrEmpty(message)) - return true; - - // Process Chat Command - 1.19 and above - if (protocolVersion >= MC_1_19_Version && message.StartsWith('/')) - return SendChatCommand(message[1..], playerKeyPair); - - try - { - List fields = new(); - - // Message: String (up to 256 chars) - fields.AddRange(dataTypes.GetString(message)); - - if (protocolVersion >= MC_1_19_Version) - { - lock (MessageSigningLock) - { - var acknowledgment1192 = - protocolVersion == MC_1_19_2_Version ? ConsumeAcknowledgment() : null; - - var (acknowledgment1193, bitset1193, messageCount1193) = - protocolVersion >= MC_1_19_3_Version - ? lastSeenMessagesCollector.Collect_1_19_3() - : new(Array.Empty(), Array.Empty(), 0); - - // Timestamp: Instant(Long) - var timeNow = DateTimeOffset.UtcNow; - fields.AddRange(DataTypes.GetLong(timeNow.ToUnixTimeMilliseconds())); - - if (!isOnlineMode || playerKeyPair is null || !Config.Signature.LoginWithSecureProfile || - !Config.Signature.SignChat) - { - fields.AddRange(DataTypes.GetLong(0)); // Salt: Long - fields.AddRange(protocolVersion < MC_1_19_3_Version - ? DataTypes.GetVarInt(0) // Signature Length: VarInt (1.19 - 1.19.2) - : dataTypes.GetBool(false)); // Has signature: bool (1.19.3) - } - else - { - // Salt: Long - var salt = GenerateSalt(); - fields.AddRange(salt); - - // Signature Length & Signature: (VarInt) and Byte Array - var playerUuid = handler.GetUserUuid(); - var sign = protocolVersion switch - { - MC_1_19_Version => playerKeyPair.PrivateKey.SignMessage(message, playerUuid, timeNow, - ref salt), - MC_1_19_2_Version => playerKeyPair.PrivateKey.SignMessage(message, playerUuid, timeNow, - ref salt, acknowledgment1192!.lastSeen), - _ => playerKeyPair.PrivateKey.SignMessage(message, playerUuid, chatUuid, messageIndex++, - timeNow, ref salt, acknowledgment1193) - }; - - fields.AddRange(protocolVersion >= MC_1_19_3_Version - ? dataTypes.GetBool(true) - : DataTypes.GetVarInt(sign.Length)); - fields.AddRange(sign); - } - - if (protocolVersion <= MC_1_19_2_Version) - fields.AddRange(dataTypes.GetBool(false)); // Signed Preview: Boolean - - switch (protocolVersion) - { - case >= MC_1_19_3_Version: - // message count - fields.AddRange(DataTypes.GetVarInt(messageCount1193)); - - // Acknowledged: BitSet - fields.AddRange(bitset1193); - - // Checksum: Byte (1.21.5+, 0 = skip verification) - if (protocolVersion >= MC_1_21_5_Version) - fields.Add(0); - break; - case MC_1_19_2_Version: - // Message Acknowledgment - fields.AddRange(dataTypes.GetAcknowledgment(acknowledgment1192!, - isOnlineMode && Config.Signature.LoginWithSecureProfile)); - break; - } - } - } - - SendPacket(PacketTypesOut.ChatMessage, fields); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool SendEntityAction(int PlayerEntityID, int ActionID) - { - try - { - List fields = new(); - fields.AddRange(DataTypes.GetVarInt(PlayerEntityID)); - fields.AddRange(DataTypes.GetVarInt(ActionID)); - fields.AddRange(DataTypes.GetVarInt(0)); - SendPacket(PacketTypesOut.EntityAction, fields); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - /// - /// Send a respawn packet to the server - /// - /// True if properly sent - public bool SendRespawnPacket() - { - try - { - SendPacket(PacketTypesOut.ClientStatus, [0]); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - /// - /// Tell the server what client is being used to connect to the server - /// - /// Client string describing the client - /// True if brand info was successfully sent - public bool SendBrandInfo(string brandInfo) - { - if (string.IsNullOrEmpty(brandInfo)) - return false; - - // Plugin channels were significantly changed between Minecraft 1.12 and 1.13 - // https://wiki.vg/index.php?title=Pre-release_protocol&oldid=14132#Plugin_Channels - return SendPluginChannelPacket(protocolVersion >= MC_1_13_Version ? "minecraft:brand" : "MC|Brand", - dataTypes.GetString(brandInfo)); - } - - /// - /// Inform the server of the client's Minecraft settings - /// - /// Client language eg en_US - /// View distance, in chunks - /// Game difficulty (client-side...) - /// Chat mode (allows muting yourself) - /// Show chat colors - /// Show skin layers - /// 1.9+ main hand - /// True if client settings were successfully sent - public bool SendClientSettings(string language, byte viewDistance, byte difficulty, byte chatMode, - bool chatColors, byte skinParts, byte mainHand) - { - try - { - List fields = new(); - fields.AddRange(dataTypes.GetString(language)); - fields.Add(viewDistance); - - fields.AddRange(protocolVersion >= MC_1_9_Version - ? DataTypes.GetVarInt(chatMode) - : [chatMode]); - - fields.Add(chatColors ? (byte)1 : (byte)0); - if (protocolVersion < MC_1_8_Version) - { - fields.Add(difficulty); - fields.Add((byte)(skinParts & 0x1)); //show cape - } - else fields.Add(skinParts); - - if (protocolVersion >= MC_1_9_Version) - fields.AddRange(DataTypes.GetVarInt(mainHand)); - if (protocolVersion >= MC_1_17_Version) - { - fields.Add(protocolVersion >= MC_1_18_1_Version - ? (byte)0 - : (byte)1); // 1.17 and 1.17.1 - Disable text filtering. (Always true) - // 1.18 and above - Enable text filtering. (Always false) - } - - if (protocolVersion >= MC_1_18_1_Version) - fields.Add(1); // 1.18 and above - Allow server listings - - if (protocolVersion >= MC_1_21_2_Version) - fields.AddRange(DataTypes.GetVarInt(0)); // 1.21.2+ Particle status: 0=All, 1=Decreased, 2=Minimal - - if (currentState == CurrentState.Configuration) - SendPacket(ConfigurationPacketTypesOut.ClientInformation, fields); - else - SendPacket(PacketTypesOut.ClientSettings, fields); - - return true; - } - catch (SocketException) - { - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - - return false; - } - - private bool SendConfiguredClientSettings() - { - if (!Config.MCSettings.Enabled) - return true; - - // Keep the configuration-phase send separate so modern servers receive ClientInformation, not play-era ClientSettings. - return SendClientSettings( - Config.MCSettings.Locale, - Config.MCSettings.RenderDistance, - (byte)Config.MCSettings.Difficulty, - (byte)Config.MCSettings.ChatMode, - Config.MCSettings.ChatColors, - Config.MCSettings.Skin.GetByte(), - (byte)Config.MCSettings.MainHand); - } - - - /// - /// Send a location update to the server - /// - /// The new location of the player - /// True if the player is on the ground - /// True if the player is colliding horizontally - /// Optional new yaw for updating player look - /// Optional new pitch for updating player look - /// True if the location update was successfully sent - public bool SendLocationUpdate(Location location, bool onGround, bool horizontalCollision, float? yaw, float? pitch) - { - return SendLocationUpdate(location, onGround, horizontalCollision, yaw, pitch, true); - } - - public bool SendLocationUpdate(Location location, bool onGround, bool horizontalCollision, float? yaw = null, float? pitch = null, - bool forceUpdate = false) - { - if (handler.GetTerrainEnabled()) - { - bool legacyMovementCadence = protocolVersion < MC_1_9_Version; - bool supportsHorizontalCollision = protocolVersion >= MC_1_21_5_Version; - int positionReminderInterval = ClientTicksPerSecond; - - double dx = location.X - lastSentX; - double dy = location.Y - lastSentY; - double dz = location.Z - lastSentZ; - double distSqr = dx * dx + dy * dy + dz * dz; - - bool rotationChanged = false; - if (yaw.HasValue && pitch.HasValue) - rotationChanged = forceUpdate || yaw.Value != lastSentYaw || pitch.Value != lastSentPitch; - - positionReminder++; - - try - { - PacketTypesOut packetType; - byte[] payload; - byte flags = (byte)(onGround ? 1 : 0); - bool positionChanged; - - if (legacyMovementCadence) - { - // 1.7.2-1.8.9 mirrors EntityPlayerSP#onUpdateWalkingPlayer: - // send an idle PlayerMovement packet every client tick and force - // a position refresh every 20 ticks even if the player is standing still. - positionChanged = distSqr > 9.0E-4 || positionReminder >= positionReminderInterval; - - if (positionChanged && rotationChanged && yaw.HasValue && pitch.HasValue) - { - packetType = PacketTypesOut.PlayerPositionAndRotation; - payload = dataTypes.ConcatBytes( - dataTypes.GetDouble(location.X), - dataTypes.GetDouble(location.Y), - protocolVersion < MC_1_8_Version - ? dataTypes.GetDouble(location.Y + 1.62) - : [], - dataTypes.GetDouble(location.Z), - dataTypes.GetFloat(yaw.Value), - dataTypes.GetFloat(pitch.Value), - new[] { flags }); - lastSentYaw = yaw.Value; - lastSentPitch = pitch.Value; - LastYaw = yaw.Value; - LastPitch = pitch.Value; - } - else if (positionChanged) - { - packetType = PacketTypesOut.PlayerPosition; - payload = dataTypes.ConcatBytes( - dataTypes.GetDouble(location.X), - dataTypes.GetDouble(location.Y), - protocolVersion < MC_1_8_Version - ? dataTypes.GetDouble(location.Y + 1.62) - : [], - dataTypes.GetDouble(location.Z), - new[] { flags }); - } - else if (rotationChanged && yaw.HasValue && pitch.HasValue) - { - packetType = PacketTypesOut.PlayerRotation; - payload = dataTypes.ConcatBytes( - dataTypes.GetFloat(yaw.Value), - dataTypes.GetFloat(pitch.Value), - new[] { flags }); - lastSentYaw = yaw.Value; - lastSentPitch = pitch.Value; - LastYaw = yaw.Value; - LastPitch = pitch.Value; - } - else - { - packetType = PacketTypesOut.PlayerMovement; - payload = new[] { flags }; - } - } - else - { - positionChanged = distSqr > 4.0E-8 || positionReminder >= positionReminderInterval; - bool movementStateChanged = onGround != lastSentOnGround - || (supportsHorizontalCollision && horizontalCollision != lastSentHorizontalCollision); - - if (!positionChanged && !rotationChanged && !movementStateChanged) - return true; // Nothing to send - - if (supportsHorizontalCollision && horizontalCollision) - flags |= 0x2; - - if (positionChanged && rotationChanged && yaw.HasValue && pitch.HasValue) - { - packetType = PacketTypesOut.PlayerPositionAndRotation; - payload = dataTypes.ConcatBytes( - dataTypes.GetDouble(location.X), - dataTypes.GetDouble(location.Y), - protocolVersion < MC_1_8_Version - ? dataTypes.GetDouble(location.Y + 1.62) - : [], - dataTypes.GetDouble(location.Z), - dataTypes.GetFloat(yaw.Value), - dataTypes.GetFloat(pitch.Value), - new[] { flags }); - lastSentYaw = yaw.Value; - lastSentPitch = pitch.Value; - LastYaw = yaw.Value; - LastPitch = pitch.Value; - } - else if (positionChanged) - { - packetType = PacketTypesOut.PlayerPosition; - payload = dataTypes.ConcatBytes( - dataTypes.GetDouble(location.X), - dataTypes.GetDouble(location.Y), - protocolVersion < MC_1_8_Version - ? dataTypes.GetDouble(location.Y + 1.62) - : [], - dataTypes.GetDouble(location.Z), - new[] { flags }); - } - else if (rotationChanged && yaw.HasValue && pitch.HasValue) - { - packetType = PacketTypesOut.PlayerRotation; - payload = dataTypes.ConcatBytes( - dataTypes.GetFloat(yaw.Value), - dataTypes.GetFloat(pitch.Value), - new[] { flags }); - lastSentYaw = yaw.Value; - lastSentPitch = pitch.Value; - LastYaw = yaw.Value; - LastPitch = pitch.Value; - } - else - { - packetType = PacketTypesOut.PlayerMovement; - payload = new[] { flags }; - } - } - - if (positionChanged) - { - lastSentX = location.X; - lastSentY = location.Y; - lastSentZ = location.Z; - positionReminder = 0; - } - lastSentOnGround = onGround; - lastSentHorizontalCollision = horizontalCollision; - - SendPacket(packetType, payload); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - else return false; - } - - /// - /// Send a plugin channel packet (0x17) to the server, compression and encryption will be handled automatically - /// - /// Channel to send packet on - /// packet Data - public bool SendPluginChannelPacket(string channel, byte[] data) - { - try - { - // In 1.7, length needs to be included. - // In 1.8, it must not be. - if (protocolVersion < MC_1_8_Version) - { - var length = BitConverter.GetBytes((short)data.Length); - Array.Reverse(length); - - SendPacket(PacketTypesOut.PluginMessage, - dataTypes.ConcatBytes(dataTypes.GetString(channel), length, data)); - } - else - { - SendPacket(PacketTypesOut.PluginMessage, dataTypes.ConcatBytes(dataTypes.GetString(channel), data)); - } - - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - private bool IsOpenBookPluginChannel(string channel) - { - return protocolVersion < MC_1_13_Version - ? string.Equals(channel, "MC|BOpen", StringComparison.Ordinal) - : string.Equals(channel, "minecraft:book_open", StringComparison.Ordinal); - } - - private int ReadBookHand(Queue packetData) - { - return packetData.Count > 0 ? dataTypes.ReadNextVarInt(packetData) : (int)BookHand.Main; - } - - /// - /// Send a Login Plugin Response packet (0x02) - /// - /// Login Plugin Request message Id - /// TRUE if the request was understood - /// Response to the request - /// TRUE if successfully sent - public bool SendLoginPluginResponse(int messageId, bool understood, byte[] data) - { - try - { - SendPacket(0x02, - dataTypes.ConcatBytes(DataTypes.GetVarInt(messageId), dataTypes.GetBool(understood), data), - "LoginPluginResponse"); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - /// - /// Send an Interact Entity Packet to server - /// - /// - /// - /// - public bool SendInteractEntity(int EntityID, int type) - { - try - { - List fields = new(); - fields.AddRange(DataTypes.GetVarInt(EntityID)); - - if (protocolVersion >= MC_26_1_Version && type == (int)InteractType.Attack) - { - SendPacket(PacketTypesOut.Attack, fields); - return true; - } - - fields.AddRange(DataTypes.GetVarInt(type)); - - // Is player Sneaking (Only 1.16 and above) - // Currently hardcoded to false - // TODO: Update to reflect the real player state - if (protocolVersion >= MC_1_16_Version) - fields.AddRange(dataTypes.GetBool(false)); - - SendPacket(PacketTypesOut.InteractEntity, fields); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - // TODO: Interact at block location (e.g. chest minecart) - public bool SendInteractEntity(int EntityID, int type, float X, float Y, float Z, int hand) - { - try - { - List fields = new(); - fields.AddRange(DataTypes.GetVarInt(EntityID)); - fields.AddRange(DataTypes.GetVarInt(type)); - fields.AddRange(dataTypes.GetFloat(X)); - fields.AddRange(dataTypes.GetFloat(Y)); - fields.AddRange(dataTypes.GetFloat(Z)); - fields.AddRange(DataTypes.GetVarInt(hand)); - // Is player Sneaking (Only 1.16 and above) - // Currently hardcoded to false - // TODO: Update to reflect the real player state - if (protocolVersion >= MC_1_16_Version) - fields.AddRange(dataTypes.GetBool(false)); - SendPacket(PacketTypesOut.InteractEntity, fields); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool SendInteractEntity(int EntityID, int type, int hand) - { - try - { - List fields = new(); - fields.AddRange(DataTypes.GetVarInt(EntityID)); - fields.AddRange(DataTypes.GetVarInt(type)); - fields.AddRange(DataTypes.GetVarInt(hand)); - // Is player Sneaking (Only 1.16 and above) - // Currently hardcoded to false - // TODO: Update to reflect the real player state - if (protocolVersion >= MC_1_16_Version) - fields.AddRange(dataTypes.GetBool(false)); - SendPacket(PacketTypesOut.InteractEntity, fields); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool SendInteractEntity(int EntityID, int type, float X, float Y, float Z) - { - return false; - } - - public bool SendUseItem(int hand, int sequenceId) - { - if (protocolVersion < MC_1_9_Version) - return false; // Packet does not exist prior to MC 1.9 - // According to https://wiki.vg/index.php?title=Protocol&oldid=5486#Player_Block_Placement - // MC 1.7 does this using Player Block Placement with special values - // TODO once Player Block Placement is implemented for older versions - try - { - List packet = new(); - packet.AddRange(DataTypes.GetVarInt(hand)); - if (protocolVersion >= MC_1_19_Version) - packet.AddRange(DataTypes.GetVarInt(sequenceId)); - - if (protocolVersion >= MC_1_21_Version) - { - packet.AddRange(dataTypes.GetFloat(LastYaw)); - packet.AddRange(dataTypes.GetFloat(LastPitch)); - } - - SendPacket(PacketTypesOut.UseItem, packet); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool SendPlayerDigging(int status, Location location, Direction face, int sequenceId) - { - try - { - List packet = new(); - packet.AddRange(DataTypes.GetVarInt(status)); - packet.AddRange(dataTypes.GetLocation(location)); - packet.AddRange(DataTypes.GetVarInt(dataTypes.GetBlockFace(face))); - if (protocolVersion >= MC_1_19_Version) - packet.AddRange(DataTypes.GetVarInt(sequenceId)); - SendPacket(PacketTypesOut.PlayerDigging, packet); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool SendPlayerBlockPlacement(int hand, Location location, Direction face, int sequenceId) - { - try - { - var packet = new List(); - var (cursorX, cursorY, cursorZ) = GetFaceHitCursor(face); - - switch (protocolVersion) - { - case < MC_1_9_Version: - packet.AddRange(dataTypes.GetLocation(location)); - packet.Add(dataTypes.GetBlockFace(face)); - - var playerInventory = handler.GetInventory(0); - - if (playerInventory?.Items is null) - return false; - - int[] slotWindowIds = [36, 37, 38, 39, 40, 41, 42, 43, 44]; - var currentSlot = ((McClient)handler).GetCurrentSlot(); - - playerInventory.Items.TryGetValue(slotWindowIds[currentSlot], out var item); - packet.AddRange(dataTypes.GetItemSlot(item, itemPalette)); - - AddLegacyBlockPlacementCursor(packet, cursorX, cursorY, cursorZ); - - SendPacket(PacketTypesOut.PlayerBlockPlacement, packet); - return true; - case < MC_1_14_Version: - packet.AddRange(dataTypes.GetLocation(location)); - packet.AddRange(DataTypes.GetVarInt(dataTypes.GetBlockFace(face))); - packet.AddRange(DataTypes.GetVarInt(hand)); - break; - default: - packet.AddRange(DataTypes.GetVarInt(hand)); - packet.AddRange(dataTypes.GetLocation(location)); - packet.AddRange(DataTypes.GetVarInt(dataTypes.GetBlockFace(face))); - break; - } - - if (protocolVersion < MC_1_11_Version) - AddLegacyBlockPlacementCursor(packet, cursorX, cursorY, cursorZ); - else - { - packet.AddRange(dataTypes.GetFloat(cursorX)); // cursorX - packet.AddRange(dataTypes.GetFloat(cursorY)); // cursorY - packet.AddRange(dataTypes.GetFloat(cursorZ)); // cursorZ - } - - if (protocolVersion >= MC_1_14_Version) - packet.Add(0); // insideBlock = false - - if (protocolVersion >= MC_1_21_2_Version) - packet.Add(0); // worldBorderHit = false - - if (protocolVersion >= MC_1_19_Version) - packet.AddRange(DataTypes.GetVarInt(sequenceId)); - - SendPacket(PacketTypesOut.PlayerBlockPlacement, packet); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - private static (float x, float y, float z) GetFaceHitCursor(Direction face) => face switch - { - Direction.Up => (0.5f, 1.0f, 0.5f), - Direction.Down => (0.5f, 0.0f, 0.5f), - Direction.North => (0.5f, 0.5f, 0.0f), - Direction.South => (0.5f, 0.5f, 1.0f), - Direction.West => (0.0f, 0.5f, 0.5f), - Direction.East => (1.0f, 0.5f, 0.5f), - _ => (0.5f, 0.5f, 0.5f), - }; - - private static void AddLegacyBlockPlacementCursor(List packet, float cursorX, float cursorY, float cursorZ) - { - packet.Add(ToLegacyBlockPlacementCursor(cursorX)); - packet.Add(ToLegacyBlockPlacementCursor(cursorY)); - packet.Add(ToLegacyBlockPlacementCursor(cursorZ)); - } - - private static byte ToLegacyBlockPlacementCursor(float cursor) - { - return (byte)Math.Clamp((int)(cursor * 16.0f), 0, 15); - } - - public bool SendHeldItemChange(short slot) - { - try - { - List packet = new(); - packet.AddRange(dataTypes.GetShort(slot)); - SendPacket(PacketTypesOut.HeldItemChange, packet); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool SendWindowAction(int windowId, int slotId, WindowActionType action, Item? item, - List> changedSlots, int stateId) - { - try - { - short actionNumber; - lock (window_actions) - { - if (!window_actions.ContainsKey(windowId)) - window_actions[windowId] = 0; - actionNumber = (short)(window_actions[windowId] + 1); - window_actions[windowId] = actionNumber; - } - - byte button = 0; - byte mode = 0; - - switch (action) - { - case WindowActionType.LeftClick: - button = 0; - break; - case WindowActionType.RightClick: - button = 1; - break; - case WindowActionType.MiddleClick: - button = 2; - mode = 3; - break; - case WindowActionType.ShiftClick: - button = 0; - mode = 1; - item = new Item(ItemType.Null, 0, null); - break; - case WindowActionType.ShiftRightClick: // Right-shift click uses button 1 - button = 1; - mode = 1; - item = new Item(ItemType.Null, 0, null); - break; - case WindowActionType.DropItem: - button = 0; - mode = 4; - item = new Item(ItemType.Null, 0, null); - break; - case WindowActionType.DropItemStack: - button = 1; - mode = 4; - item = new Item(ItemType.Null, 0, null); - break; - case WindowActionType.StartDragLeft: - button = 0; - mode = 5; - item = new Item(ItemType.Null, 0, null); - slotId = -999; - break; - case WindowActionType.StartDragRight: - button = 4; - mode = 5; - item = new Item(ItemType.Null, 0, null); - slotId = -999; - break; - case WindowActionType.StartDragMiddle: - button = 8; - mode = 5; - item = new Item(ItemType.Null, 0, null); - slotId = -999; - break; - case WindowActionType.EndDragLeft: - button = 2; - mode = 5; - item = new Item(ItemType.Null, 0, null); - slotId = -999; - break; - case WindowActionType.EndDragRight: - button = 6; - mode = 5; - item = new Item(ItemType.Null, 0, null); - slotId = -999; - break; - case WindowActionType.EndDragMiddle: - button = 10; - mode = 5; - item = new Item(ItemType.Null, 0, null); - slotId = -999; - break; - case WindowActionType.AddDragLeft: - button = 1; - mode = 5; - item = new Item(ItemType.Null, 0, null); - break; - case WindowActionType.AddDragRight: - button = 5; - mode = 5; - item = new Item(ItemType.Null, 0, null); - break; - case WindowActionType.AddDragMiddle: - button = 9; - mode = 5; - item = new Item(ItemType.Null, 0, null); - break; - } - - List packet = new(); - if (protocolVersion >= MC_1_21_2_Version) - packet.AddRange(DataTypes.GetVarInt(windowId)); // Window ID (VarInt in 1.21.2+) - else - packet.Add((byte)windowId); // Window ID (byte before 1.21.2) - - switch (protocolVersion) - { - // 1.17.1+ - case >= MC_1_17_1_Version: - packet.AddRange(DataTypes.GetVarInt(stateId)); // State ID - packet.AddRange(dataTypes.GetShort((short)slotId)); // Slot ID - break; - // Older - default: - packet.AddRange(dataTypes.GetShort((short)slotId)); // Slot ID - break; - } - - packet.Add(button); // Button - - if (protocolVersion < MC_1_17_Version) - packet.AddRange(dataTypes.GetShort(actionNumber)); - - if (protocolVersion >= MC_1_9_Version) - packet.AddRange(DataTypes.GetVarInt(mode)); // Mode - else packet.Add(mode); - - // 1.17+ Array of changed slots - if (protocolVersion >= MC_1_17_Version) - { - packet.AddRange(DataTypes.GetVarInt(changedSlots.Count)); // Length of the array - foreach (var slot in changedSlots) - { - packet.AddRange(dataTypes.GetShort(slot.Item1)); // slot ID - // 1.21.5+ uses HashedStack instead of ItemStack for container_click - if (protocolVersion >= MC_1_21_5_Version) - packet.AddRange(dataTypes.GetHashedItemSlot(slot.Item2, itemPalette)); - else - packet.AddRange(dataTypes.GetItemSlot(slot.Item2, itemPalette)); - } - } - - // 1.21.5+ uses HashedStack instead of ItemStack for carried item - if (protocolVersion >= MC_1_21_5_Version) - packet.AddRange(dataTypes.GetHashedItemSlot(item, itemPalette)); - else - packet.AddRange(dataTypes.GetItemSlot(item, itemPalette)); - - SendPacket(PacketTypesOut.ClickWindow, packet); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool SendCreativeInventoryAction(int slot, ItemType itemType, int count, Dictionary? nbt) - { - try - { - List packet = new(); - packet.AddRange(dataTypes.GetShort((short)slot)); - packet.AddRange(dataTypes.GetItemSlot(new Item(itemType, count, nbt), itemPalette)); - SendPacket(PacketTypesOut.CreativeInventoryAction, packet); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool SendChunkBatchReceived(float desiredNumberOfChunksPerBatch) - { - try - { - List packet = new(); - packet.AddRange(dataTypes.GetFloat(desiredNumberOfChunksPerBatch)); - SendPacket(PacketTypesOut.ChunkBatchReceived, packet); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool SendAcknowledgeConfiguration() - { - try - { - SendPacket(PacketTypesOut.AcknowledgeConfiguration, new List()); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool ClickContainerButton(int windowId, int buttonId) - { - try - { - List packet = new(); - if (protocolVersion >= MC_1_20_6_Version) - { - packet.AddRange(DataTypes.GetVarInt(windowId)); - packet.AddRange(DataTypes.GetVarInt(buttonId)); - } - else - { - packet.Add((byte)windowId); - packet.Add((byte)buttonId); - } - - SendPacket(PacketTypesOut.ClickWindowButton, packet); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool SendPlaceRecipe(int windowId, string recipeId, bool makeAll) - { - try - { - List packet = new(); - if (protocolVersion < MC_1_13_Version) - return false; - - packet.AddRange(DataTypes.GetVarInt(windowId)); - if (protocolVersion >= MC_1_21_2_Version) - packet.AddRange(DataTypes.GetVarInt(int.Parse(recipeId, CultureInfo.InvariantCulture))); - else - packet.AddRange(dataTypes.GetString(recipeId)); - packet.AddRange(dataTypes.GetBool(makeAll)); - SendPacket(PacketTypesOut.CraftRecipeRequest, packet); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool SendEditBook(Item currentBook, IReadOnlyList pages, string? title, string author, int selectedHotbarSlot) - { - try - { - if (protocolVersion < MC_1_8_Version) - return false; - - bool signing = title is not null; - IReadOnlyList normalizedPages = BookContentHelper.NormalizePages(pages); - - if (protocolVersion < MC_1_13_Version) - { - Item payload = signing - ? BookContentHelper.CreateWrittenPayload( - currentBook, - normalizedPages, - title ?? string.Empty, - author, - encodePagesAsJson: protocolVersion < MC_1_9_Version) - : BookContentHelper.CreateWritablePayload(currentBook, normalizedPages); - - byte[] payloadData = dataTypes.GetItemSlot(payload, itemPalette); - if (payloadData.Length > 32767) - return false; - - return SendPluginChannelPacket(signing ? "MC|BSign" : "MC|BEdit", payloadData); - } - - if (protocolVersion < MC_1_17_Version) - { - Item payload = signing - ? BookContentHelper.CreateWrittenPayload(currentBook, normalizedPages, title ?? string.Empty, author, encodePagesAsJson: false) - : BookContentHelper.CreateWritablePayload(currentBook, normalizedPages); - - List packet = new(); - packet.AddRange(dataTypes.GetItemSlot(payload, itemPalette)); - packet.AddRange(dataTypes.GetBool(signing)); - - if (protocolVersion >= MC_1_16_5_Version) - packet.AddRange(DataTypes.GetVarInt(selectedHotbarSlot)); - else if (protocolVersion >= MC_1_13_2_Version) - packet.AddRange(DataTypes.GetVarInt((int)BookHand.Main)); - - SendPacket(PacketTypesOut.EditBook, packet); - return true; - } - - List modernPacket = new(); - modernPacket.AddRange(DataTypes.GetVarInt(selectedHotbarSlot)); - modernPacket.AddRange(DataTypes.GetVarInt(normalizedPages.Count)); - foreach (string page in normalizedPages) - modernPacket.AddRange(dataTypes.GetString(page)); - - modernPacket.AddRange(dataTypes.GetBool(signing)); - if (signing) - modernPacket.AddRange(dataTypes.GetString(title ?? string.Empty)); - - SendPacket(PacketTypesOut.EditBook, modernPacket); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool SendAnimation(int animation, int playerId) - { - try - { - if (animation is not (0 or 1)) return false; - - List packet = new(); - - switch (protocolVersion) - { - case < MC_1_8_Version: - packet.AddRange(DataTypes.GetInt(playerId)); - packet.Add(1); // Swing arm - break; - case < MC_1_9_Version: - // No fields in 1.8.X - break; - // MC 1.9+ - default: - packet.AddRange(DataTypes.GetVarInt(animation)); - break; - } - - SendPacket(PacketTypesOut.Animation, packet); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool SendCloseWindow(int windowId) - { - try - { - lock (window_actions) - { - if (window_actions.ContainsKey(windowId)) - window_actions[windowId] = 0; - } - - SendPacket(PacketTypesOut.CloseWindow, - protocolVersion >= MC_1_21_2_Version - ? DataTypes.GetVarInt(windowId) - : new[] { (byte)windowId }); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool SendUpdateSign(Location sign, string line1, string line2, string line3, string line4, - bool isFrontText = true) - { - try - { - if (line1.Length > 23) - line1 = line1[..23]; - if (line2.Length > 23) - line2 = line2[..23]; - if (line3.Length > 23) - line3 = line3[..23]; - if (line4.Length > 23) - line4 = line4[..23]; - - List packet = new(); - packet.AddRange(dataTypes.GetLocation(sign)); - if (protocolVersion >= MC_1_20_Version) - packet.AddRange(dataTypes.GetBool(isFrontText)); - packet.AddRange(dataTypes.GetString(line1)); - packet.AddRange(dataTypes.GetString(line2)); - packet.AddRange(dataTypes.GetString(line3)); - packet.AddRange(dataTypes.GetString(line4)); - SendPacket(PacketTypesOut.UpdateSign, packet); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool UpdateCommandBlock(Location location, string command, CommandBlockMode mode, - CommandBlockFlags flags) - { - if (protocolVersion > MC_1_13_Version) return false; - - try - { - List packet = new(); - packet.AddRange(dataTypes.GetLocation(location)); - packet.AddRange(dataTypes.GetString(command)); - packet.AddRange(DataTypes.GetVarInt((int)mode)); - packet.Add((byte)flags); - SendPacket(PacketTypesOut.UpdateSign, packet); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool SendWindowConfirmation(byte windowID, short actionID, bool accepted) - { - try - { - var packet = new List() { windowID }; - packet.AddRange(dataTypes.GetShort(actionID)); - packet.Add(accepted ? (byte)1 : (byte)0); - SendPacket(PacketTypesOut.WindowConfirmation, packet); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool SelectTrade(int selectedSlot) - { - // MC 1.13 or greater - if (protocolVersion < MC_1_13_Version) return false; - - try - { - List packet = new(); - packet.AddRange(DataTypes.GetVarInt(selectedSlot)); - SendPacket(PacketTypesOut.SelectTrade, packet); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool SendSpectate(Guid uuid) - { - // MC 1.8 or greater - if (protocolVersion < MC_1_8_Version) return false; - - try - { - List packet = new(); - packet.AddRange(DataTypes.GetUUID(uuid)); - SendPacket(PacketTypesOut.Spectate, packet); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool SendPlayerSession(PlayerKeyPair? playerKeyPair) - { - if (playerKeyPair is null || !isOnlineMode) - return false; - - if (protocolVersion >= MC_1_19_3_Version) - { - try - { - List packet = new(); - - packet.AddRange(DataTypes.GetUUID(chatUuid)); - packet.AddRange(DataTypes.GetLong(playerKeyPair.GetExpirationMilliseconds())); - packet.AddRange(DataTypes.GetVarInt(playerKeyPair.PublicKey.Key.Length)); - packet.AddRange(playerKeyPair.PublicKey.Key); - packet.AddRange(DataTypes.GetVarInt(playerKeyPair.PublicKey.SignatureV2!.Length)); - packet.AddRange(playerKeyPair.PublicKey.SignatureV2); - - log.PacketDebug( - $"SendPlayerSession MessageUUID = {chatUuid.ToString()}, len(PublicKey) = {playerKeyPair.PublicKey.Key.Length}, len(SignatureV2) = {playerKeyPair.PublicKey.SignatureV2!.Length}"); - - SendPacket(PacketTypesOut.PlayerSession, packet); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - return false; - } - - public bool SendRenameItem(string itemName) - { - try - { - List packet = new(); - packet.AddRange(dataTypes.GetString(itemName.Length > 50 ? itemName[..50] : itemName)); - SendPacket(PacketTypesOut.NameItem, packet); - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool SendCookieResponse(string name, byte[]? data) - { - try - { - var packet = new List(); - var hasPayload = data is not null; - packet.AddRange(dataTypes.GetString(name)); // Identifier - packet.AddRange(dataTypes.GetBool(hasPayload)); // Has payload - - if (hasPayload) - packet.AddRange(dataTypes.GetArray(data!)); // Payload Data Array Size + Data Array - - switch (currentState) - { - case CurrentState.Login: - SendPacket(0x04, packet, "CookieResponse"); - break; - - case CurrentState.Configuration: - SendPacket(ConfigurationPacketTypesOut.CookieResponse, packet); - break; - - case CurrentState.Play: - SendPacket(PacketTypesOut.CookieResponse, packet); - break; - } - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - public bool SendKnownDataPacks(List<(string, string, string)> knownDataPacks) - { - try - { - var packet = new List(); - packet.AddRange(DataTypes.GetVarInt(knownDataPacks.Count)); // Known Packs Count - foreach (var dataPack in knownDataPacks) - { - packet.AddRange(dataTypes.GetString(dataPack.Item1)); - packet.AddRange(dataTypes.GetString(dataPack.Item2)); - packet.AddRange(dataTypes.GetString(dataPack.Item3)); - } - - switch (currentState) - { - case CurrentState.Configuration: - SendPacket(ConfigurationPacketTypesOut.KnownDataPacks, packet); - break; - - case CurrentState.Play: - SendPacket(PacketTypesOut.KnownDataPacks, packet); - break; - } - - return true; - } - catch (SocketException) - { - return false; - } - catch (System.IO.IOException) - { - return false; - } - catch (ObjectDisposedException) - { - return false; - } - } - - private byte[] GenerateSalt() - { - var salt = new byte[8]; - randomGen.GetNonZeroBytes(salt); - return salt; - } - - private static long GetNanos() - { - var nano = 10000L * Stopwatch.GetTimestamp(); - nano /= TimeSpan.TicksPerMillisecond; - nano *= 100L; - return nano; - } - } - - internal enum CurrentState - { - Login = 0, - Configuration, - Play, - Transfer - } -} diff --git a/MinecraftClient/Protocol/Handlers/Protocol18Forge.cs b/MinecraftClient/Protocol/Handlers/Protocol18Forge.cs deleted file mode 100644 index e940fc11af..0000000000 --- a/MinecraftClient/Protocol/Handlers/Protocol18Forge.cs +++ /dev/null @@ -1,573 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using MinecraftClient.Protocol.Handlers.Forge; -using MinecraftClient.Protocol.Message; -using MinecraftClient.Scripting; - -namespace MinecraftClient.Protocol.Handlers -{ - /// - /// Handler for the Minecraft Forge protocol - /// - class Protocol18Forge(ForgeInfo? forgeInfo, int protocolVersion, DataTypes dataTypes, Protocol18Handler protocol18, IMinecraftComHandler mcHandler) - { - private readonly int protocolversion = protocolVersion; - private readonly DataTypes dataTypes = dataTypes; - private readonly Protocol18Handler protocol18 = protocol18; - private readonly IMinecraftComHandler mcHandler = mcHandler; - - private readonly ForgeInfo? forgeInfo = forgeInfo; - private FMLHandshakeClientState fmlHandshakeState = FMLHandshakeClientState.START; - private bool ForgeEnabled() { return forgeInfo is not null; } - - /// - /// Get Forge-Tagged server address - /// - /// Server Address - /// Forge-Tagged server address - public string GetServerAddress(string serverAddress) - { - if (ForgeEnabled()) - return serverAddress + "\0" + forgeInfo!.Version + "\0"; - return serverAddress; - } - - /// - /// Completes the Minecraft Forge handshake (Forge Protocol version 1: FML) - /// - /// Whether the handshake was successful. - public bool CompleteForgeHandshake() - { - if (ForgeEnabled() && forgeInfo!.Version == FMLVersion.FML) - { - while (fmlHandshakeState != FMLHandshakeClientState.DONE) - { - (int packetID, Queue packetData) = protocol18.ReadNextPacket(); - - if (packetID == 0x40) // Disconnect - { - mcHandler.OnConnectionLost(ChatBot.DisconnectReason.LoginRejected, ChatParser.ParseText(dataTypes.ReadNextString(packetData))); - return false; - } - else - { - // Send back regular packet to the vanilla protocol handler - protocol18.HandlePacket(packetID, packetData); - } - } - } - return true; - } - - /// - /// Read Forge VarShort field - /// - /// Packet data to read from - /// Length from packet data - public int ReadNextVarShort(Queue packetData) - { - if (ForgeEnabled()) - { - // Forge special VarShort field. - return (int)dataTypes.ReadNextVarShort(packetData); - } - else - { - // Vanilla regular Short field - return (int)dataTypes.ReadNextShort(packetData); - } - } - - /// - /// Handle Forge plugin messages (Forge Protocol version 1: FML) - /// - /// Plugin message channel - /// Plugin message data - /// Current world dimension - /// TRUE if the plugin message was recognized and handled - public bool HandlePluginMessage(string channel, Queue packetData, ref int currentDimension) - { - if (ForgeEnabled() && forgeInfo!.Version == FMLVersion.FML && fmlHandshakeState != FMLHandshakeClientState.DONE) - { - if (channel == "FML|HS") - { - FMLHandshakeDiscriminator discriminator = (FMLHandshakeDiscriminator)dataTypes.ReadNextByte(packetData); - - if (discriminator == FMLHandshakeDiscriminator.HandshakeReset) - { - fmlHandshakeState = FMLHandshakeClientState.START; - return true; - } - - switch (fmlHandshakeState) - { - case FMLHandshakeClientState.START: - if (discriminator != FMLHandshakeDiscriminator.ServerHello) - return false; - - // Send the plugin channel registration. - // REGISTER is somewhat special in that it doesn't actually include length information, - // and is also \0-separated. - // Also, yes, "FML" is there twice. Don't ask me why, but that's the way forge does it. - string[] channels = { "FML|HS", "FML", "FML|MP", "FML", "FORGE" }; - protocol18.SendPluginChannelPacket("REGISTER", Encoding.UTF8.GetBytes(string.Join("\0", channels))); - - byte fmlProtocolVersion = dataTypes.ReadNextByte(packetData); - - if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.forge_version, fmlProtocolVersion)); - - if (fmlProtocolVersion >= 1) - currentDimension = dataTypes.ReadNextInt(packetData); - - // Tell the server we're running the same version. - SendForgeHandshakePacket(FMLHandshakeDiscriminator.ClientHello, new byte[] { fmlProtocolVersion }); - - // Then tell the server that we're running the same mods. - if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted("§8" + Translations.forge_send_mod, acceptnewlines: true); - byte[][] mods = new byte[forgeInfo.Mods.Count][]; - for (int i = 0; i < forgeInfo.Mods.Count; i++) - { - ForgeInfo.ForgeMod mod = forgeInfo.Mods[i]; - mods[i] = dataTypes.ConcatBytes(dataTypes.GetString(mod.ModID), dataTypes.GetString(mod.Version)); - } - SendForgeHandshakePacket(FMLHandshakeDiscriminator.ModList, - dataTypes.ConcatBytes(DataTypes.GetVarInt(forgeInfo.Mods.Count), dataTypes.ConcatBytes(mods))); - - fmlHandshakeState = FMLHandshakeClientState.WAITINGSERVERDATA; - - return true; - case FMLHandshakeClientState.WAITINGSERVERDATA: - if (discriminator != FMLHandshakeDiscriminator.ModList) - return false; - - Thread.Sleep(2000); - - if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted("§8" + Translations.forge_accept, acceptnewlines: true); - // Tell the server that yes, we are OK with the mods it has - // even though we don't actually care what mods it has. - - SendForgeHandshakePacket(FMLHandshakeDiscriminator.HandshakeAck, - new byte[] { (byte)FMLHandshakeClientState.WAITINGSERVERDATA }); - - fmlHandshakeState = FMLHandshakeClientState.WAITINGSERVERCOMPLETE; - return false; - case FMLHandshakeClientState.WAITINGSERVERCOMPLETE: - // The server now will tell us a bunch of registry information. - // We need to read it all, though, until it says that there is no more. - if (discriminator != FMLHandshakeDiscriminator.RegistryData) - return false; - - if (protocolversion < Protocol18Handler.MC_1_8_Version) - { - // 1.7.10 and below have one registry - // with blocks and items. - int registrySize = dataTypes.ReadNextVarInt(packetData); - - if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.forge_registry, registrySize)); - - fmlHandshakeState = FMLHandshakeClientState.PENDINGCOMPLETE; - } - else - { - // 1.8+ has more than one registry. - - bool hasNextRegistry = dataTypes.ReadNextBool(packetData); - string registryName = dataTypes.ReadNextString(packetData); - int registrySize = dataTypes.ReadNextVarInt(packetData); - if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.forge_registry_2, registryName, registrySize)); - if (!hasNextRegistry) - fmlHandshakeState = FMLHandshakeClientState.PENDINGCOMPLETE; - } - - return false; - case FMLHandshakeClientState.PENDINGCOMPLETE: - // The server will ask us to accept the registries. - // Just say yes. - if (discriminator != FMLHandshakeDiscriminator.HandshakeAck) - return false; - if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted("§8" + Translations.forge_accept_registry, acceptnewlines: true); - SendForgeHandshakePacket(FMLHandshakeDiscriminator.HandshakeAck, - new byte[] { (byte)FMLHandshakeClientState.PENDINGCOMPLETE }); - fmlHandshakeState = FMLHandshakeClientState.COMPLETE; - - return true; - case FMLHandshakeClientState.COMPLETE: - // One final "OK". On the actual forge source, a packet is sent from - // the client to the client saying that the connection was complete, but - // we don't need to do that. - - SendForgeHandshakePacket(FMLHandshakeDiscriminator.HandshakeAck, - new byte[] { (byte)FMLHandshakeClientState.COMPLETE }); - if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLine(Translations.forge_complete); - fmlHandshakeState = FMLHandshakeClientState.DONE; - return true; - } - } - } - return false; - } - - /// - /// Handle Forge plugin messages during login phase (Forge Protocol version 2: FML2 or Forge Protocol version 3: FML3) - /// - /// Plugin message channel - /// Plugin message data - /// Response data to return to server - /// TRUE/FALSE depending on whether the packet was understood or not - public bool HandleLoginPluginRequest(string channel, Queue packetData, ref List responseData) - { - if (ForgeEnabled() && (forgeInfo!.Version == FMLVersion.FML2 || forgeInfo!.Version == FMLVersion.FML3) && channel == "fml:loginwrapper") - { - // Forge Handshake handler source code used to implement the FML2 packets: - // https://github.com/MinecraftForge/MinecraftForge/blob/1.13.x/src/main/java/net/minecraftforge/fml/network/FMLNetworkConstants.java - // https://github.com/MinecraftForge/MinecraftForge/blob/1.13.x/src/main/java/net/minecraftforge/fml/network/FMLHandshakeHandler.java - // https://github.com/MinecraftForge/MinecraftForge/blob/1.13.x/src/main/java/net/minecraftforge/fml/network/NetworkInitialization.java - // https://github.com/MinecraftForge/MinecraftForge/blob/1.13.x/src/main/java/net/minecraftforge/fml/network/FMLLoginWrapper.java - // https://github.com/MinecraftForge/MinecraftForge/blob/1.13.x/src/main/java/net/minecraftforge/fml/network/FMLHandshakeMessages.java - // - // FML3 packets: - // https://github.com/MinecraftForge/MinecraftForge/blob/1.18.x/src/main/java/net/minecraftforge/network/NetworkInitialization.java - // https://github.com/MinecraftForge/MinecraftForge/blob/1.18.x/src/main/java/net/minecraftforge/fml/network/FMLHandshakeMessages.java - // - // During Login, Forge will send a set of LoginPluginRequest packets and we need to respond accordingly. - // Each login plugin message contains in its payload field an inner packet created by FMLLoginWrapper.java: - // - // [ ResourceLocation ][ String ] // FML Channel name - // [ Inner Packet ][ Packet ] // Minecraft-Like packet - // - // The channel name allows identifying which handler in Forge will process the packet - // For instance, the handshake channel is fml:handshake as per FMLNetworkConstants.java - // - // The inner packet has the same layout as a Minecraft packet. - // Forge uses Minecraft's PacketBuffer class to decode the packet. - // We assume no network compression is active at this point. - // - // [ Length ][ VarInt ] - // [ PacketID ][ VarInt ] - // [ Data ][ .... ] - // - // Once decoded, the packet ID for fml:handshake is mapped in NetworkInitialization.java: - // - // 99 = Client to Server - Client ACK - // 1 = Server to Client - Mod List - // 2 = Client to Server - Mod List - // 3 = Server to Client - Registry - // 4 = Server to Client - Config - // 5 = Server to Client - Mod Data List (FML3) - // 6 = Server to Client - MismatchedMod List (FML3) - // - // The content of each message is mapped into a class inside FMLHandshakeMessages.java - // FMLHandshakeHandler will then process the packet, e.g. handleServerModListOnClient() for Server Mod List. - - string fmlChannel = dataTypes.ReadNextString(packetData); - dataTypes.ReadNextVarInt(packetData); // Packet length - int packetID = dataTypes.ReadNextVarInt(packetData); - - if (fmlChannel == "fml:handshake") - { - bool fmlResponseReady = false; - List fmlResponsePacket = new(); - - switch (packetID) - { - case 1: - // Server Mod List: FMLHandshakeMessages.java > S2CModList > decode() - // - // [ Mod Count ][ VarInt ] - // [ Mod Name ][ String ] // Amount of entries according to Mod Count - // [ Channel Count ][ VarInt ] - // [ Chan Name ][ String ] // Amount of entries according to Channel Count - // [ Version ][ String ] // Each entry is a pair of Channel Name + Version (1) - // [ Registry Count ][ VarInt ] - // [ Registry ][ String ] // Amount of entries according to Registry Count - // - // [1]: Version is usually set to "FML2" for FML stuff and "1" for mods - - if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted("§8" + Translations.forge_fml2_mod, acceptnewlines: true); - - List mods = new(); - int modCount = dataTypes.ReadNextVarInt(packetData); - for (int i = 0; i < modCount; i++) - mods.Add(dataTypes.ReadNextString(packetData)); - - ChatParser.LoadForgeModTranslations(mods); - - Dictionary channels = new(); - int channelCount = dataTypes.ReadNextVarInt(packetData); - for (int i = 0; i < channelCount; i++) - channels.Add(dataTypes.ReadNextString(packetData), dataTypes.ReadNextString(packetData)); - - List registries = new(); - int registryCount = dataTypes.ReadNextVarInt(packetData); - for (int i = 0; i < registryCount; i++) - registries.Add(dataTypes.ReadNextString(packetData)); - - // FML3 specific, - List dataPackRegistries = new(); - if (forgeInfo!.Version == FMLVersion.FML3 && packetData.Count != 0) - { - int dataPackRegistryCount = dataTypes.ReadNextVarInt(packetData); - for (int i = 0; i < dataPackRegistryCount; i++) - dataPackRegistries.Add(dataTypes.ReadNextString(packetData)); - } - - // Server Mod List Reply: FMLHandshakeMessages.java > C2SModListReply > encode() - // - // [ Mod Count ][ VarInt ] - // [ Mod Name ][ String ] // Amount of entries according to Mod Count - // [ Channel Count ][ VarInt ] - // [ Chan Name ][ String ] // Amount of entries according to Channel Count - // [ Version ][ String ] // Each entry is a pair of Channel Name + Version - // [ Registry Count ][ VarInt ] - // [ Registry ][ String ] // Amount of entries according to Registry Count - // [ Version ][ String ] // Each entry is a pair of Registry Name + Version - // - // We are supposed to validate server info against our set of installed mods, then reply with our list - // In MCC, we just want to send a valid response so we'll reply back with data collected from the server. - - if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted("§8" + Translations.forge_fml2_mod_send, acceptnewlines: true); - - // Packet ID 2: Client to Server Mod List - fmlResponsePacket.AddRange(DataTypes.GetVarInt(2)); - fmlResponsePacket.AddRange(DataTypes.GetVarInt(mods.Count)); - foreach (string mod in mods) - fmlResponsePacket.AddRange(dataTypes.GetString(mod)); - - fmlResponsePacket.AddRange(DataTypes.GetVarInt(channels.Count)); - foreach (KeyValuePair item in channels) - { - fmlResponsePacket.AddRange(dataTypes.GetString(item.Key)); - fmlResponsePacket.AddRange(dataTypes.GetString(item.Value)); - } - - fmlResponsePacket.AddRange(DataTypes.GetVarInt(registries.Count)); - foreach (string registry in registries) - { - fmlResponsePacket.AddRange(dataTypes.GetString(registry)); - // We don't have Registry mapping from server, leave it empty - fmlResponsePacket.AddRange(dataTypes.GetString("")); - } - fmlResponseReady = true; - break; - - case 3: - // Server Registry: FMLHandshakeMessages.java > S2CRegistry > decode() - // - // [ Registry Name ][ String ] - // [ Snapshot Present ][ Bool ] - // [ Snapshot data ][ .... ] // Only if "Snapshot Present" is True - // - // Registry Snapshot: ForgeRegistry.java > Snapshot > read(PacketBuffer) - // Not documented yet. We're ignoring this packet in MCC - - if (Settings.Config.Logging.DebugMessages) - { - string registryName = dataTypes.ReadNextString(packetData); - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.forge_fml2_registry, registryName)); - } - - fmlResponsePacket.AddRange(DataTypes.GetVarInt(99)); - fmlResponseReady = true; - break; - - case 4: - // Server Config: FMLHandshakeMessages.java > S2CConfigData > decode() - // - // [ Config Name ][ String ] - // [ Config Data ][ .... ] // Remaining packet data (1) - // - // [1] Config data may containt a standard Minecraft string readable with dataTypes.readNextString() - // We're ignoring this packet in MCC - - if (Settings.Config.Logging.DebugMessages) - { - string configName = dataTypes.ReadNextString(packetData); - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.forge_fml2_config, configName)); - } - - fmlResponsePacket.AddRange(DataTypes.GetVarInt(99)); - fmlResponseReady = true; - break; - - case 5: - // FML 3 - // Server Config: FMLHandshakeMessages.java > S2CModData > decode() - // [ Size ][ VarInt ] - // [ Mod Data List ][ Array ] [ Mod Id ][ String ] - // [ Display Name ][ String ] - // [ Version ][ String ] - // - // We're ignoring this packet in MCC - - if (Settings.Config.Logging.DebugMessages) - { - ConsoleIO.WriteLineFormatted("§8" + "Received FML3 Server Mod Data List"); - } - break; - - case 6: - // FML 3 - // Server Config: FMLHandshakeMessages.java > S2CChannelMismatchData > decode() - // [ Size ][ VarInt ] - // [ Mismatched Mod List ][ Array ] [ Mod Id ][ String ] - // [ Version ][ String ] - // We're ignoring this packet in MCC - - if (Settings.Config.Logging.DebugMessages) - { - ConsoleIO.WriteLineFormatted("§8" + "Received FML3 Server Mismatched Mods List"); - } - break; - - default: - if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.forge_fml2_unknown, packetID)); - break; - } - - if (fmlResponseReady) - { - // Wrap our FML packet into a LoginPluginResponse payload - responseData.Clear(); - responseData.AddRange(dataTypes.GetString(fmlChannel)); - responseData.AddRange(DataTypes.GetVarInt(fmlResponsePacket.Count)); - responseData.AddRange(fmlResponsePacket); - return true; - } - } - else if (Settings.Config.Logging.DebugMessages) - { - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.forge_fml2_unknown_channel, fmlChannel)); - } - } - return false; - } - - /// - /// Send a forge plugin channel packet ("FML|HS"). Compression and encryption will be handled automatically. (Forge Protocol version 1: FML) - /// - /// Discriminator to use. - /// packet Data - private void SendForgeHandshakePacket(FMLHandshakeDiscriminator discriminator, byte[] data) - { - protocol18.SendPluginChannelPacket("FML|HS", dataTypes.ConcatBytes(new byte[] { (byte)discriminator }, data)); - } - - /// - /// Server Info: Check for For Forge versions 1 and 2 on a Minecraft server Ping result - /// - /// JSON data returned by the server - /// ForgeInfo to populate - /// True if the server is running Forge - public static bool ServerInfoCheckForge(System.Text.Json.Nodes.JsonObject jsonData, ref ForgeInfo? forgeInfo) - { - return ServerInfoCheckForgeSub(jsonData, ref forgeInfo, FMLVersion.FML) // MC 1.12 and lower - || ServerInfoCheckForgeSub(jsonData, ref forgeInfo, FMLVersion.FML2) // MC 1.13 to 1.17 - || ServerInfoCheckForgeSub(jsonData, ref forgeInfo, FMLVersion.FML3); // MC 1.18 and greater - } - - /// - /// Server Info: Check if we can force-enable Forge support for this Minecraft version without using server Ping - /// - /// Minecraft protocol version - /// TRUE if we can force-enable Forge support without using server Ping - public static bool ServerMayForceForge(int protocolVersion) - { - return protocolVersion >= ProtocolHandler.MCVer2ProtocolVersion("1.13"); - } - - /// - /// Server Info: Consider Forge to be enabled regardless of server Ping - /// - /// Minecraft protocol version - /// ForgeInfo item stating that Forge is enabled - /// - /// 1.18 change the fml version to 3 - /// https://github.com/MinecraftForge/MinecraftForge/commit/997d8e0aa28b831edcd712e59a96181d3b2117d4 - /// - public static ForgeInfo ServerForceForge(int protocolVersion) - { - if (ServerMayForceForge(protocolVersion)) - { - if (protocolVersion >= ProtocolHandler.MCVer2ProtocolVersion("1.18")) - { - return new ForgeInfo(FMLVersion.FML3); - } - return new ForgeInfo(FMLVersion.FML2); - } - else throw new InvalidOperationException(Translations.error_forgeforce); - } - - /// - /// Server Info: Check for For Forge on a Minecraft server Ping result (Handles FML and FML2 and FML3 - /// - /// JSON data returned by the server - /// ForgeInfo to populate - /// Forge protocol version - /// True if the server is running Forge - private static bool ServerInfoCheckForgeSub(System.Text.Json.Nodes.JsonObject jsonData, ref ForgeInfo? forgeInfo, FMLVersion fmlVersion) - { - string forgeDataTag; - string versionField; - string versionString; - - switch (fmlVersion) - { - case FMLVersion.FML: - forgeDataTag = "modinfo"; - versionField = "type"; - versionString = "FML"; - break; - case FMLVersion.FML2: - forgeDataTag = "forgeData"; - versionField = "fmlNetworkVersion"; - versionString = "2"; - break; - case FMLVersion.FML3: - forgeDataTag = "forgeData"; - versionField = "fmlNetworkVersion"; - versionString = "3"; - break; - default: - throw new NotImplementedException("FMLVersion '" + fmlVersion + "' not implemented!"); - } - - if (jsonData[forgeDataTag] is System.Text.Json.Nodes.JsonObject modData) - { - if (modData[versionField] is not null && modData[versionField]!.GetStringValue() == versionString) - { - forgeInfo = new ForgeInfo(modData, fmlVersion); - if (forgeInfo.Mods.Any()) - { - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.forge_with_mod, forgeInfo.Mods.Count)); - if (Settings.Config.Logging.DebugMessages) - { - ConsoleIO.WriteLineFormatted("§8" + Translations.forge_mod_list, acceptnewlines: true); - foreach (ForgeInfo.ForgeMod mod in forgeInfo.Mods) - ConsoleIO.WriteLineFormatted("§8 " + mod.ToString()); - } - return true; - } - else - { - ConsoleIO.WriteLineFormatted("§8" + Translations.forge_no_mod, acceptnewlines: true); - forgeInfo = null; - } - } - } - return false; - } - } -} diff --git a/MinecraftClient/Protocol/Handlers/Protocol18Terrain.cs b/MinecraftClient/Protocol/Handlers/Protocol18Terrain.cs deleted file mode 100644 index 9bd29e87c4..0000000000 --- a/MinecraftClient/Protocol/Handlers/Protocol18Terrain.cs +++ /dev/null @@ -1,499 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -//using System.Linq; -//using System.Text; -using MinecraftClient.Mapping; - -namespace MinecraftClient.Protocol.Handlers -{ - /// - /// Terrain Decoding handler for Protocol18 - /// - class Protocol18Terrain(int protocolVersion, DataTypes dataTypes, IMinecraftComHandler handler) - { - private readonly int protocolversion = protocolVersion; - private readonly DataTypes dataTypes = dataTypes; - private readonly IMinecraftComHandler handler = handler; - - /// - /// Reading the "Block states" field: consists of 4096 entries, representing all the blocks in the chunk section. - /// - /// Cache for reading data - [MethodImpl(MethodImplOptions.AggressiveOptimization)] - private Chunk? ReadBlockStatesField(Queue cache) - { - // read Block states (Type: Paletted Container) - byte bitsPerEntry = dataTypes.ReadNextByte(cache); - - // 1.18(1.18.1) add a pattle named "Single valued" to replace the vertical strip bitmask in the old - if (bitsPerEntry == 0 && protocolversion >= Protocol18Handler.MC_1_18_1_Version) - { - // Palettes: Single valued - 1.18(1.18.1) and above - ushort blockId = (ushort)dataTypes.ReadNextVarInt(cache); - Block block = new(blockId); - - if (protocolversion < Protocol18Handler.MC_1_21_5_Version) - dataTypes.SkipNextVarInt(cache); // Data Array Length will be zero (removed in 1.21.5) - - // Empty chunks will not be stored - if (block.Type == Material.Air) - return null; - - // Warning: If you need to support modification of block data, you need to create 4096 objects here - Chunk chunk = new(); - for (int blockY = 0; blockY < Chunk.SizeY; blockY++) - for (int blockZ = 0; blockZ < Chunk.SizeZ; blockZ++) - for (int blockX = 0; blockX < Chunk.SizeX; blockX++) - chunk.SetWithoutCheck(blockX, blockY, blockZ, block); - return chunk; - } - else - { - // Palettes: Indirect or Direct - bool usePalette = (bitsPerEntry <= 8); - - // Indirect Mode: For block states with bits per entry <= 4, 4 bits are used to represent a block. - if (bitsPerEntry < 4) bitsPerEntry = 4; - - // Direct Mode: Bit mask covering bitsPerEntry bits - // EG, if bitsPerEntry = 5, valueMask = 00011111 in binary - uint valueMask = (uint)((1 << bitsPerEntry) - 1); - - int paletteLength = usePalette ? dataTypes.ReadNextVarInt(cache) : 0; // Assume zero when length is absent - - Span palette = paletteLength < 256 ? stackalloc uint[paletteLength] : new uint[paletteLength]; - for (int i = 0; i < paletteLength; i++) - palette[i] = (uint)dataTypes.ReadNextVarInt(cache); - - //// Block IDs are packed in the array of 64-bits integers - if (protocolversion < Protocol18Handler.MC_1_21_5_Version) - dataTypes.SkipNextVarInt(cache); // Entry length (removed in 1.21.5) - Span entryDataByte = stackalloc byte[8]; - Span entryDataLong = MemoryMarshal.Cast(entryDataByte); // Faster than MemoryMarshal.Read - - Chunk chunk = new(); - int startOffset = 64; // Read the first data immediately - for (int blockY = 0; blockY < Chunk.SizeY; blockY++) - { - for (int blockZ = 0; blockZ < Chunk.SizeZ; blockZ++) - { - for (int blockX = 0; blockX < Chunk.SizeX; blockX++) - { - // Calculate location of next block ID inside the array of Longs - if ((startOffset += bitsPerEntry) > (64 - bitsPerEntry)) - { - // In MC 1.16+, padding is applied to prevent overlapping between Longs: - // [ LONG INTEGER ][ LONG INTEGER ] - // [Block][Block][Block]XXX[Block][Block][Block]XXX - - // When overlapping, move forward to the beginning of the next Long - startOffset = 0; - dataTypes.ReadDataReverse(cache, entryDataByte); // read long - } - - uint blockId = (uint)(entryDataLong[0] >> startOffset) & valueMask; - - // Map small IDs to actual larger block IDs - if (usePalette) - { - if (paletteLength <= blockId) - { - int blockNumber = (blockY * Chunk.SizeZ + blockZ) * Chunk.SizeX + blockX; - throw new IndexOutOfRangeException(String.Format("Block ID {0} is outside Palette range 0-{1}! (bitsPerBlock: {2}, blockNumber: {3})", - blockId, - paletteLength - 1, - bitsPerEntry, - blockNumber)); - } - - blockId = palette[(int)blockId]; - } - - // NOTICE: In the future a single ushort may not store the entire block id; - // the Block class may need to change if block state IDs go beyond 65535 - Block block = new((ushort)blockId); - - // We have our block, save the block into the chunk - chunk.SetWithoutCheck(blockX, blockY, blockZ, block); - } - } - } - return chunk; - } - } - - /// - /// Process chunk column data from the server and (un)load the chunk from the Minecraft world - 1.17 and above - /// - /// Chunk X location - /// Chunk Z location - /// Chunk mask for reading data, store in bitset, used in 1.17 and 1.17.1 - /// Cache for reading chunk data - /// token to cancel the task - [MethodImpl(MethodImplOptions.AggressiveOptimization)] - public void ProcessChunkColumnData(int chunkX, int chunkZ, ulong[]? verticalStripBitmask, Queue cache) - { - World world = handler.GetWorld(); - - int chunkColumnSize = (World.GetDimension().height + 15) / 16; // Round up - - if (protocolversion >= Protocol18Handler.MC_1_17_Version) - { - // 1.17 and above chunk format - // Unloading chunks is handled by a separate packet - - for (int chunkY = 0; chunkY < chunkColumnSize; chunkY++) - { - int lastChunkY; - if (protocolversion == Protocol18Handler.MC_1_17_Version || protocolversion == Protocol18Handler.MC_1_17_1_Version) - { - lastChunkY = 0; - for (int i = verticalStripBitmask!.Length - 1; i >= 0; --i) - { - if (verticalStripBitmask![i] != 0) - { - lastChunkY = (sizeof(ulong) * 8 * i) + (sizeof(ulong) * 8 - 1 - BitOperations.LeadingZeroCount(verticalStripBitmask![i])); - break; - } - } - } - else - { - lastChunkY = chunkColumnSize - 1; - } - - // 1.18 and above always contains all chunk section in data - // 1.17 and 1.17.1 need vertical strip bitmask to know if the chunk section is included - if ((protocolversion >= Protocol18Handler.MC_1_18_1_Version) || - ((verticalStripBitmask![chunkY / 64] & (1UL << (chunkY % 64))) != 0)) - { - // Non-air block count inside chunk section, for lighting purposes - int blockCnt = dataTypes.ReadNextShort(cache); - - if (protocolversion >= Protocol18Handler.MC_26_1_Version) - dataTypes.ReadNextShort(cache); // Fluid count (26.1+) - - // Read Block states (Type: Paletted Container) - Chunk? chunk = ReadBlockStatesField(cache); - - //We have our chunk, save the chunk into the world - world.StoreChunk(chunkX, chunkY, chunkZ, chunkColumnSize, chunk, chunkY == lastChunkY); - - // Skip Read Biomes (Type: Paletted Container) - 1.18(1.18.1) and above - if (protocolversion >= Protocol18Handler.MC_1_18_1_Version) - { - byte bitsPerEntryBiome = dataTypes.ReadNextByte(cache); // Bits Per Entry - if (bitsPerEntryBiome == 0) - { - dataTypes.SkipNextVarInt(cache); // Value - if (protocolversion < Protocol18Handler.MC_1_21_5_Version) - dataTypes.SkipNextVarInt(cache); // Data Array Length (removed in 1.21.5) - } - else - { - if (bitsPerEntryBiome <= 3) - { - int paletteLength = dataTypes.ReadNextVarInt(cache); // Palette Length - for (int i = 0; i < paletteLength; i++) - dataTypes.SkipNextVarInt(cache); // Palette - } - if (protocolversion >= Protocol18Handler.MC_1_21_5_Version) - { - // 1.21.5: No VarInt length prefix; calculate from bits per entry - // Biome container has 64 entries (4x4x4) - // Uses SimpleBitStorage: valuesPerLong = 64/bitsPerEntry, longs = ceil(64/valuesPerLong) - int valuesPerLong = 64 / bitsPerEntryBiome; - int dataArrayLength = (64 + valuesPerLong - 1) / valuesPerLong; - dataTypes.DropData(dataArrayLength * 8, cache); - } - else - { - int dataArrayLength = dataTypes.ReadNextVarInt(cache); // Data Array Length - dataTypes.DropData(dataArrayLength * 8, cache); // Data Array - } - } - } - } - } - // Don't worry about skipping remaining data since there is no useful data afterwards in 1.9 - // (plus, it would require parsing the tile entity lists' NBT) - } - } - - /// - /// Process chunk column data from the server and (un)load the chunk from the Minecraft world - 1.17 below - /// - /// Chunk X location - /// Chunk Z location - /// Chunk mask for reading data - /// Chunk mask for some additional 1.7 metadata - /// Contains skylight info - /// Are the chunk continuous - /// Current dimension type (0 = overworld) - /// Cache for reading chunk data - /// token to cancel the task - [MethodImpl(MethodImplOptions.AggressiveOptimization)] - public void ProcessChunkColumnData(int chunkX, int chunkZ, ushort chunkMask, ushort chunkMask2, bool hasSkyLight, bool chunksContinuous, int currentDimension, Queue cache) - { - World world = handler.GetWorld(); - - const int chunkColumnSize = 16; - if (protocolversion >= Protocol18Handler.MC_1_9_Version) - { - // 1.9 and above chunk format - // Unloading chunks is handled by a separate packet - int maxChunkY = sizeof(int) * 8 - 1 - BitOperations.LeadingZeroCount(chunkMask); - for (int chunkY = 0; chunkY <= maxChunkY; chunkY++) - { - if ((chunkMask & (1 << chunkY)) != 0) - { - // 1.14 and above Non-air block count inside chunk section, for lighting purposes - if (protocolversion >= Protocol18Handler.MC_1_14_Version) - dataTypes.ReadNextShort(cache); - - byte bitsPerBlock = dataTypes.ReadNextByte(cache); - bool usePalette = (bitsPerBlock <= 8); - - // Vanilla Minecraft will use at least 4 bits per block - if (bitsPerBlock < 4) - bitsPerBlock = 4; - - // MC 1.9 to 1.12 will set palette length field to 0 when palette - // is not used, MC 1.13+ does not send the field at all in this case - int paletteLength = 0; // Assume zero when length is absent - if (usePalette || protocolversion < Protocol18Handler.MC_1_13_Version) - paletteLength = dataTypes.ReadNextVarInt(cache); - - int[] palette = new int[paletteLength]; - for (int i = 0; i < paletteLength; i++) - palette[i] = dataTypes.ReadNextVarInt(cache); - - // Bit mask covering bitsPerBlock bits - // EG, if bitsPerBlock = 5, valueMask = 00011111 in binary - uint valueMask = (uint)((1 << bitsPerBlock) - 1); - - // Block IDs are packed in the array of 64-bits integers - ulong[] dataArray = dataTypes.ReadNextULongArray(cache); - - Chunk chunk = new(); - - if (dataArray.Length > 0) - { - int longIndex = 0; - int startOffset = 0 - bitsPerBlock; - - for (int blockY = 0; blockY < Chunk.SizeY; blockY++) - { - for (int blockZ = 0; blockZ < Chunk.SizeZ; blockZ++) - { - for (int blockX = 0; blockX < Chunk.SizeX; blockX++) - { - // NOTICE: In the future a single ushort may not store the entire block id; - // the Block class may need to change if block state IDs go beyond 65535 - ushort blockId; - - // Calculate location of next block ID inside the array of Longs - startOffset += bitsPerBlock; - bool overlap = false; - - if ((startOffset + bitsPerBlock) > 64) - { - if (protocolversion >= Protocol18Handler.MC_1_16_Version) - { - // In MC 1.16+, padding is applied to prevent overlapping between Longs: - // [ LONG INTEGER ][ LONG INTEGER ] - // [Block][Block][Block]XXXXX[Block][Block][Block]XXXXX - - // When overlapping, move forward to the beginning of the next Long - startOffset = 0; - longIndex++; - } - else - { - // In MC 1.15 and lower, block IDs can overlap between Longs: - // [ LONG INTEGER ][ LONG INTEGER ] - // [Block][Block][Block][Blo ck][Block][Block][Block][ - - // Detect when we reached the next Long or switch to overlap mode - if (startOffset >= 64) - { - startOffset -= 64; - longIndex++; - } - else overlap = true; - } - } - - // Extract Block ID - if (overlap) - { - int endOffset = 64 - startOffset; - blockId = (ushort)((dataArray[longIndex] >> startOffset | dataArray[longIndex + 1] << endOffset) & valueMask); - } - else - { - blockId = (ushort)((dataArray[longIndex] >> startOffset) & valueMask); - } - - // Map small IDs to actual larger block IDs - if (usePalette) - { - if (paletteLength <= blockId) - { - int blockNumber = (blockY * Chunk.SizeZ + blockZ) * Chunk.SizeX + blockX; - throw new IndexOutOfRangeException(String.Format("Block ID {0} is outside Palette range 0-{1}! (bitsPerBlock: {2}, blockNumber: {3})", - blockId, - paletteLength - 1, - bitsPerBlock, - blockNumber)); - } - - blockId = (ushort)palette[blockId]; - } - - // We have our block, save the block into the chunk - chunk.SetWithoutCheck(blockX, blockY, blockZ, new Block(blockId)); - } - } - } - } - - //We have our chunk, save the chunk into the world - world.StoreChunk(chunkX, chunkY, chunkZ, chunkColumnSize, chunk, chunkY == maxChunkY); - - //Pre-1.14 Lighting data - if (protocolversion < Protocol18Handler.MC_1_14_Version) - { - //Skip block light - dataTypes.DropData((Chunk.SizeX * Chunk.SizeY * Chunk.SizeZ) / 2, cache); - - //Skip sky light - if (currentDimension == 0) - // Sky light is not sent in the nether or the end - dataTypes.DropData((Chunk.SizeX * Chunk.SizeY * Chunk.SizeZ) / 2, cache); - } - } - } - - // Don't worry about skipping remaining data since there is no useful data afterwards in 1.9 - // (plus, it would require parsing the tile entity lists' NBT) - } - else if (protocolversion >= Protocol18Handler.MC_1_8_Version) - { - // 1.8 chunk format - if (chunksContinuous && chunkMask == 0) - { - //Unload the entire chunk column - handler.InvokeOnMainThread(() => - { - world[chunkX, chunkZ] = null; - }); - } - else - { - //Load chunk data from the server - int maxChunkY = sizeof(int) * 8 - 1 - BitOperations.LeadingZeroCount(chunkMask); - for (int chunkY = 0; chunkY <= maxChunkY; chunkY++) - { - if ((chunkMask & (1 << chunkY)) != 0) - { - Chunk chunk = new(); - - //Read chunk data, all at once for performance reasons, and build the chunk object - Queue queue = new(dataTypes.ReadNextUShortsLittleEndian(Chunk.SizeX * Chunk.SizeY * Chunk.SizeZ, cache)); - for (int blockY = 0; blockY < Chunk.SizeY; blockY++) - for (int blockZ = 0; blockZ < Chunk.SizeZ; blockZ++) - for (int blockX = 0; blockX < Chunk.SizeX; blockX++) - chunk.SetWithoutCheck(blockX, blockY, blockZ, new Block(queue.Dequeue())); - - //We have our chunk, save the chunk into the world - world.StoreChunk(chunkX, chunkY, chunkZ, chunkColumnSize, chunk, chunkY == maxChunkY); - } - } - - //Skip light information - for (int chunkY = 0; chunkY < chunkColumnSize; chunkY++) - { - if ((chunkMask & (1 << chunkY)) != 0) - { - //Skip block light - dataTypes.DropData((Chunk.SizeX * Chunk.SizeY * Chunk.SizeZ) / 2, cache); - - //Skip sky light - if (hasSkyLight) - dataTypes.DropData((Chunk.SizeX * Chunk.SizeY * Chunk.SizeZ) / 2, cache); - } - } - - //Skip biome metadata - if (chunksContinuous) - dataTypes.DropData(Chunk.SizeX * Chunk.SizeZ, cache); - } - } - else - { - // 1.7 chunk format - if (chunksContinuous && chunkMask == 0) - { - //Unload the entire chunk column - handler.InvokeOnMainThread(() => - { - world[chunkX, chunkZ] = null; - }); - } - else - { - //Count chunk sections - int sectionCount = 0; - int addDataSectionCount = 0; - for (int chunkY = 0; chunkY < chunkColumnSize; chunkY++) - { - if ((chunkMask & (1 << chunkY)) != 0) - sectionCount++; - if ((chunkMask2 & (1 << chunkY)) != 0) - addDataSectionCount++; - } - - //Read chunk data, unpacking 4-bit values into 8-bit values for block metadata - Queue blockTypes = new(dataTypes.ReadData(Chunk.SizeX * Chunk.SizeY * Chunk.SizeZ * sectionCount, cache)); - Queue blockMeta = new(); - foreach (byte packed in dataTypes.ReadData((Chunk.SizeX * Chunk.SizeY * Chunk.SizeZ * sectionCount) / 2, cache)) - { - byte hig = (byte)(packed >> 4); - byte low = (byte)(packed & (byte)0x0F); - blockMeta.Enqueue(hig); - blockMeta.Enqueue(low); - } - - //Skip data we don't need - dataTypes.DropData((Chunk.SizeX * Chunk.SizeY * Chunk.SizeZ * sectionCount) / 2, cache); //Block light - if (hasSkyLight) - dataTypes.DropData((Chunk.SizeX * Chunk.SizeY * Chunk.SizeZ * sectionCount) / 2, cache); //Sky light - dataTypes.DropData((Chunk.SizeX * Chunk.SizeY * Chunk.SizeZ * addDataSectionCount) / 2, cache); //BlockAdd - if (chunksContinuous) - dataTypes.DropData(Chunk.SizeX * Chunk.SizeZ, cache); //Biomes - - //Load chunk data - int maxChunkY = sizeof(int) * 8 - 1 - BitOperations.LeadingZeroCount(chunkMask); - for (int chunkY = 0; chunkY <= maxChunkY; chunkY++) - { - if ((chunkMask & (1 << chunkY)) != 0) - { - Chunk chunk = new(); - - for (int blockY = 0; blockY < Chunk.SizeY; blockY++) - for (int blockZ = 0; blockZ < Chunk.SizeZ; blockZ++) - for (int blockX = 0; blockX < Chunk.SizeX; blockX++) - chunk.SetWithoutCheck(blockX, blockY, blockZ, new Block(blockTypes.Dequeue(), blockMeta.Dequeue())); - - world.StoreChunk(chunkX, chunkY, chunkZ, chunkColumnSize, chunk, chunkY == maxChunkY); - } - } - } - } - } - } -} diff --git a/MinecraftClient/Protocol/Handlers/SocketWrapper.cs b/MinecraftClient/Protocol/Handlers/SocketWrapper.cs deleted file mode 100644 index 7aaac71c7d..0000000000 --- a/MinecraftClient/Protocol/Handlers/SocketWrapper.cs +++ /dev/null @@ -1,124 +0,0 @@ -using System; -using System.IO; -using System.Net.Sockets; -using MinecraftClient.Crypto; - -namespace MinecraftClient.Protocol.Handlers -{ - /// - /// Wrapper for handling unencrypted & encrypted socket - /// - public class SocketWrapper - { - readonly TcpClient c; - AesCfb8Stream? s; - bool encrypted = false; - - /// - /// Initialize a new SocketWrapper - /// - /// TcpClient connected to the server - public SocketWrapper(TcpClient client) - { - c = client; - } - - /// - /// Check if the socket is still connected - /// - /// TRUE if still connected - /// Silently dropped connection can only be detected by attempting to read/write data - public bool IsConnected() - { - return c.Client is not null && c.Connected; - } - - /// - /// Check if the socket has data available to read - /// - /// TRUE if data is available to read - public bool HasDataAvailable() - { - return c.Client.Available > 0 || c.Client.Poll(0, SelectMode.SelectRead); - } - - /// - /// Switch network reading/writing to an encrypted stream - /// - /// AES secret key - public void SwitchToEncrypted(byte[] secretKey) - { - if (encrypted) - throw new InvalidOperationException("Stream is already encrypted!?"); - s = new AesCfb8Stream(c.GetStream(), secretKey); - encrypted = true; - } - - /// - /// Network reading method. Read bytes from the socket or encrypted socket. - /// - private void Receive(byte[] buffer, int start, int offset, SocketFlags f) - { - int read = 0; - while (read < offset) - { - int bytesRead; - if (encrypted) - bytesRead = s!.Read(buffer, start + read, offset - read); - else - bytesRead = c.Client.Receive(buffer, start + read, offset - read, f); - - if (bytesRead == 0) - throw new EndOfStreamException(); - - read += bytesRead; - } - } - - /// - /// Read some data from the server. - /// - /// Amount of bytes to read - /// The data read from the network as an array - public byte[] ReadDataRAW(int length) - { - if (length > 0) - { - byte[] cache = new byte[length]; - Receive(cache, 0, length, SocketFlags.None); - return cache; - } - return Array.Empty(); - } - - /// - /// Send raw data to the server. - /// - /// data to send - public void SendDataRAW(byte[] buffer) - { - if (!IsConnected()) - throw new SocketException((int)SocketError.NotConnected); - - if (encrypted) - s!.Write(buffer, 0, buffer.Length); - else - c.Client.Send(buffer); - } - - /// - /// Disconnect from the server - /// - public void Disconnect() - { - try - { - c.Close(); - } - catch (SocketException) { } - catch (System.IO.IOException) { } - catch (NullReferenceException) { } - catch (ObjectDisposedException) { } - } - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/AttributeModifiersComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/AttributeModifiersComponent.cs deleted file mode 100644 index 4741eed068..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/AttributeModifiersComponent.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class AttributeModifiersComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int NumberOfAttributes { get; set; } - public List Attributes { get; set; } = new(); - public bool ShowInTooltip { get; set; } - - public override void Parse(Queue data) - { - NumberOfAttributes = DataTypes.ReadNextVarInt(data); - - for (var i = 0; i < NumberOfAttributes; i++) - Attributes.Add(SubComponentRegistry.ParseSubComponent(SubComponents.Attribute, data)); - - ShowInTooltip = DataTypes.ReadNextBool(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(NumberOfAttributes)); - - if (Attributes.Count != NumberOfAttributes) - throw new ArgumentNullException($"Can not serialize a AttributeModifiersComponent when the Attributes count != NumberOfAttributes!"); - - foreach (var attribute in Attributes) - data.AddRange(attribute.Serialize()); - - data.AddRange(DataTypes.GetBool(ShowInTooltip)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/BannerPatternsComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/BannerPatternsComponent.cs deleted file mode 100644 index fb2a21a459..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/BannerPatternsComponent.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class BannerPatternsComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int NumberOfLayers { get; set; } - public List Layers { get; set; } = []; - - public override void Parse(Queue data) - { - NumberOfLayers = DataTypes.ReadNextVarInt(data); - - for (var i = 0; i < NumberOfLayers; i++) - { - var patternType = DataTypes.ReadNextVarInt(data); - Layers.Add(new BannerLayer - { - PatternType = patternType, - AssetId = patternType == 0 ? DataTypes.ReadNextString(data) : null, - TranslationKey = patternType == 0 ? DataTypes.ReadNextString(data) : null, - DyeColor = DataTypes.ReadNextVarInt(data) - }); - } - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(NumberOfLayers)); - - if (NumberOfLayers > 0) - { - if (NumberOfLayers != Layers.Count) - throw new Exception("Can't serialize BannerPatternsComponent because NumberOfLayers and Layers.Count differ!"); - - foreach (var bannerLayer in Layers) - { - data.AddRange(DataTypes.GetVarInt(bannerLayer.PatternType)); - - if (bannerLayer.PatternType == 0) - { - if (string.IsNullOrEmpty(bannerLayer.AssetId) || string.IsNullOrEmpty(bannerLayer.TranslationKey)) - throw new Exception("Can't serialize BannerPatternsComponent because AssetId or TranslationKey is null/empty!"); - - data.AddRange(DataTypes.GetString(bannerLayer.AssetId)); - data.AddRange(DataTypes.GetString(bannerLayer.TranslationKey)); - } - - data.AddRange(DataTypes.GetVarInt(bannerLayer.DyeColor)); - } - } - - return new Queue(data); - } -} - -public record BannerLayer -{ - public int PatternType { get; set; } - public string? AssetId { get; set; } = null!; - public string? TranslationKey { get; set; } = null!; - public int DyeColor { get; set; } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/BaseColorComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/BaseColorComponent.cs deleted file mode 100644 index 615328d236..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/BaseColorComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class BaseColorComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int DyeColor { get; set; } - - public override void Parse(Queue data) - { - DyeColor = DataTypes.ReadNextVarInt(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(DyeColor)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/BeesComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/BeesComponent.cs deleted file mode 100644 index 575bfda3c9..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/BeesComponent.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class BeesComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int NumberOfBees { get; set; } - public List Bees { get; set; } = []; - - public override void Parse(Queue data) - { - NumberOfBees = DataTypes.ReadNextVarInt(data); - for (var i = 0; i < NumberOfBees; i++) - { - Bees.Add(new Bee(DataTypes.ReadNextNbt(data), DataTypes.ReadNextVarInt(data), DataTypes.ReadNextVarInt(data))); - } - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(NumberOfBees)); - - if (NumberOfBees > 0) - { - if (NumberOfBees != Bees.Count) - throw new Exception("Can't serialize the BeeComponent because NumberOfBees and Bees.Count differ!"); - - foreach (var bee in Bees) - { - data.AddRange(DataTypes.GetNbt(bee.EntityDataNbt)); - data.AddRange(DataTypes.GetVarInt(bee.TicksInHive)); - data.AddRange(DataTypes.GetVarInt(bee.MinTicksInHive)); - } - } - - return new Queue(data); - } -} - -public record Bee(Dictionary? EntityDataNbt, int TicksInHive, int MinTicksInHive); \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/BlockStateComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/BlockStateComponent.cs deleted file mode 100644 index 8bbeeb2b29..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/BlockStateComponent.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class BlockStateComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public List<(string, string)> Properties { get; set; } = []; - - public override void Parse(Queue data) - { - var count = DataTypes.ReadNextVarInt(data); - for (var i = 0; i < count; i++) - Properties.Add((DataTypes.ReadNextString(data), DataTypes.ReadNextString(data))); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Properties.Count)); - foreach (var (key, value) in Properties) - { - data.AddRange(DataTypes.GetString(key)); - data.AddRange(DataTypes.GetString(value)); - } - - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/BundleContentsComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/BundleContentsComponent.cs deleted file mode 100644 index 76e11195f5..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/BundleContentsComponent.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class BundleContentsComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public List Items { get; set; } = []; - - public override void Parse(Queue data) - { - var count = DataTypes.ReadNextVarInt(data); - - for (var i = 0; i < count; i++) - { - var item = DataTypes.ReadNextItemSlot(data, ItemPalette); - if (item is not null) - Items.Add(item); - } - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Items.Count)); - - foreach (var item in Items) - data.AddRange(DataTypes.GetItemSlot(item, ItemPalette)); - - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/CanBreakComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/CanBreakComponent.cs deleted file mode 100644 index aeff50f22f..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/CanBreakComponent.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class CanBreakComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int NumberOfPredicates { get; set; } - public List BlockPredicates { get; set; } = new(); - public bool ShowInTooltip { get; set; } - - public override void Parse(Queue data) - { - NumberOfPredicates = DataTypes.ReadNextVarInt(data); - - for (var i = 0; i < NumberOfPredicates; i++) - BlockPredicates.Add((BlockPredicateSubcomponent)SubComponentRegistry.ParseSubComponent(SubComponents.BlockPredicate, data)); - - ShowInTooltip = DataTypes.ReadNextBool(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(NumberOfPredicates)); - - if (NumberOfPredicates > 0 && BlockPredicates.Count == 0) - throw new ArgumentNullException($"Can not serialize a CanBreakComponent when the BlockPredicates is empty but NumberOfPredicates is > 0!"); - - foreach (var blockPredicate in BlockPredicates) - data.AddRange(blockPredicate.Serialize()); - - data.AddRange(DataTypes.GetBool(ShowInTooltip)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/CanPlaceOnComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/CanPlaceOnComponent.cs deleted file mode 100644 index 0134563e7b..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/CanPlaceOnComponent.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class CanPlaceOnComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int NumberOfPredicates { get; set; } - public List BlockPredicates { get; set; } = new(); - public bool ShowInTooltip { get; set; } - - public override void Parse(Queue data) - { - NumberOfPredicates = DataTypes.ReadNextVarInt(data); - - for (var i = 0; i < NumberOfPredicates; i++) - BlockPredicates.Add((BlockPredicateSubcomponent)SubComponentRegistry.ParseSubComponent(SubComponents.BlockPredicate, data)); - - ShowInTooltip = DataTypes.ReadNextBool(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(NumberOfPredicates)); - - if (NumberOfPredicates > 0 && BlockPredicates.Count == 0) - throw new ArgumentNullException($"Can not serialize a CanPlaceOnComponent when the BlockPredicates is empty but NumberOfPredicates is > 0!"); - - foreach (var blockPredicate in BlockPredicates) - data.AddRange(blockPredicate.Serialize()); - - data.AddRange(DataTypes.GetBool(ShowInTooltip)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/ChargedProjectilesComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/ChargedProjectilesComponent.cs deleted file mode 100644 index 5a5259add1..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/ChargedProjectilesComponent.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class ChargedProjectilesComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public List Items { get; set; } = []; - - public override void Parse(Queue data) - { - var count = DataTypes.ReadNextVarInt(data); - - for (var i = 0; i < count; i++) - { - var item = DataTypes.ReadNextItemSlot(data, ItemPalette); - if (item is not null) - Items.Add(item); - } - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Items.Count)); - - foreach (var item in Items) - data.AddRange(DataTypes.GetItemSlot(item, ItemPalette)); - - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/ContainerComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/ContainerComponent.cs deleted file mode 100644 index 5264f43de2..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/ContainerComponent.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class ContainerComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public List Items { get; set; } = []; - - public override void Parse(Queue data) - { - var count = DataTypes.ReadNextVarInt(data); - for (var i = 0; i < count; i++) - Items.Add(DataTypes.ReadNextItemSlot(data, ItemPalette)); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Items.Count)); - foreach (var item in Items) - data.AddRange(DataTypes.GetItemSlot(item, ItemPalette)); - - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/ContainerLootComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/ContainerLootComponent.cs deleted file mode 100644 index 8b68ecd7aa..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/ContainerLootComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class ContainerLootComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public Dictionary? Nbt { get; set; } - - public override void Parse(Queue data) - { - Nbt = DataTypes.ReadNextNbt(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetNbt(Nbt)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/CreativeSlotLockComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/CreativeSlotLockComponent.cs deleted file mode 100644 index 6d18839720..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/CreativeSlotLockComponent.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class CreativeSlotLockComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : EmptyComponent(dataTypes, itemPalette, subComponentRegistry); \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/CustomDataComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/CustomDataComponent.cs deleted file mode 100644 index 9509d53951..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/CustomDataComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class CustomDataComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public Dictionary? Nbt { get; set; } = new(); - - public override void Parse(Queue data) - { - Nbt = DataTypes.ReadNextNbt(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetNbt(Nbt)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/CustomModelDataComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/CustomModelDataComponent.cs deleted file mode 100644 index 20df087084..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/CustomModelDataComponent.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class CustomModelDataComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public List Floats { get; set; } = []; - public List Flags { get; set; } = []; - public List Strings { get; set; } = []; - public List Colors { get; set; } = []; - - public override void Parse(Queue data) - { - Floats = ReadList(data, static (dataTypes, componentData) => dataTypes.ReadNextFloat(componentData)); - Flags = ReadList(data, static (dataTypes, componentData) => dataTypes.ReadNextBool(componentData)); - Strings = ReadList(data, static (dataTypes, componentData) => dataTypes.ReadNextString(componentData)); - Colors = ReadList(data, static (dataTypes, componentData) => dataTypes.ReadNextInt(componentData)); - } - - public override Queue Serialize() - { - var data = new List(); - WriteList(data, Floats, static (dataTypes, value) => dataTypes.GetFloat(value)); - WriteList(data, Flags, static (dataTypes, value) => dataTypes.GetBool(value)); - WriteList(data, Strings, static (dataTypes, value) => dataTypes.GetString(value)); - WriteList(data, Colors, static (_, value) => DataTypes.GetInt(value)); - return new Queue(data); - } - - private List ReadList(Queue data, ReadDelegate read) - { - var count = DataTypes.ReadNextVarInt(data); - var values = new List(count); - - for (var i = 0; i < count; i++) - values.Add(read(DataTypes, data)); - - return values; - } - - private void WriteList(List data, List values, WriteDelegate write) - { - data.AddRange(DataTypes.GetVarInt(values.Count)); - foreach (var value in values) - data.AddRange(write(DataTypes, value)); - } - - private delegate T ReadDelegate(DataTypes dataTypes, Queue data); - private delegate byte[] WriteDelegate(DataTypes dataTypes, T value); -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/CustomModelDataComponent1206.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/CustomModelDataComponent1206.cs deleted file mode 100644 index 5483b3848d..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/CustomModelDataComponent1206.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class CustomModelDataComponent1206(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int Value { get; set; } - - public override void Parse(Queue data) - { - Value = DataTypes.ReadNextVarInt(data); - } - - public override Queue Serialize() - { - return new Queue(DataTypes.GetVarInt(Value)); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/CustomNameComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/CustomNameComponent.cs deleted file mode 100644 index 1104b598e0..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/CustomNameComponent.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; -using MinecraftClient.Protocol.Message; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class CustomNameComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public string CustomName { get; set; } = string.Empty; - public Dictionary? CustomNameNbt { get; set; } - - public override void Parse(Queue data) - { - CustomNameNbt = DataTypes.ReadNextNbt(data); - CustomName = ChatParser.ParseText(CustomNameNbt); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetNbt(CustomNameNbt)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/DamageComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/DamageComponent.cs deleted file mode 100644 index c105ee0c09..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/DamageComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class DamageComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int Damage { get; set; } - - public override void Parse(Queue data) - { - Damage = DataTypes.ReadNextVarInt(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Damage)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/DebugStickStateComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/DebugStickStateComponent.cs deleted file mode 100644 index a39a352d3e..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/DebugStickStateComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class DebugStickStateComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public Dictionary? Nbt { get; set; } - - public override void Parse(Queue data) - { - Nbt = DataTypes.ReadNextNbt(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetNbt(Nbt)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/DyeColorComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/DyeColorComponent.cs deleted file mode 100644 index d887ecee48..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/DyeColorComponent.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class DyeColorComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int Color { get; set; } - public bool ShowInTooltip { get; set; } - - public override void Parse(Queue data) - { - Color = DataTypes.ReadNextInt(data); - ShowInTooltip = DataTypes.ReadNextBool(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetInt(Color)); - data.AddRange(DataTypes.GetBool(ShowInTooltip)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/EnchantmentGlintOverrideComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/EnchantmentGlintOverrideComponent.cs deleted file mode 100644 index 6528ffb5be..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/EnchantmentGlintOverrideComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class EnchantmentGlintOverrideComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public bool HasGlint { get; set; } - - public override void Parse(Queue data) - { - HasGlint = DataTypes.ReadNextBool(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetBool(HasGlint)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/EnchantmentsComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/EnchantmentsComponent.cs deleted file mode 100644 index 8322201f79..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/EnchantmentsComponent.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class EnchantmentsComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int NumberOfEnchantments { get; set; } - public List Enchantments { get; set; } = new(); - public bool ShowTooltip { get; set; } - - public override void Parse(Queue data) - { - NumberOfEnchantments = DataTypes.ReadNextVarInt(data); - - for (var i = 0; i < NumberOfEnchantments; i++) - { - var registryId = DataTypes.ReadNextVarInt(data); - var level = DataTypes.ReadNextVarInt(data); - Enchantments.Add(new Enchantment(EnchantmentMapping.GetEnchantmentByRegistryId1206(DataTypes.ProtocolVersion, registryId), level)); - } - - ShowTooltip = DataTypes.ReadNextBool(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Enchantments.Count)); - foreach (var enchantment in Enchantments) - { - data.AddRange(DataTypes.GetVarInt(EnchantmentMapping.GetRegistryId1206ByEnchantment(DataTypes.ProtocolVersion, enchantment.Type))); - data.AddRange(DataTypes.GetVarInt(enchantment.Level)); - } - data.AddRange(DataTypes.GetBool(ShowTooltip)); - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/EntityDataComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/EntityDataComponent.cs deleted file mode 100644 index ba31c9f99a..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/EntityDataComponent.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class EntityDataComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public Dictionary? Nbt { get; set; } - - public override void Parse(Queue data) - { - Nbt = DataTypes.ReadNextNbt(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetNbt(Nbt)); - return new Queue(data); - } -} - -public class BucketEntityDataComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : EntityDataComponent(dataTypes, itemPalette, subComponentRegistry) -{ } - -public class BlockEntityDataComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : EntityDataComponent(dataTypes, itemPalette, subComponentRegistry) -{ } \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/FireResistantComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/FireResistantComponent.cs deleted file mode 100644 index 351eb684f9..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/FireResistantComponent.cs +++ /dev/null @@ -1,7 +0,0 @@ -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class FireResistantComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : EmptyComponent(dataTypes, itemPalette, subComponentRegistry); \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/FireworkExplosionComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/FireworkExplosionComponent.cs deleted file mode 100644 index a515f3bb5d..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/FireworkExplosionComponent.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Mapping; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class FireworkExplosionComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public FireworkExplosionSubComponent? FireworkExplosionSubComponent { get; set; } - - public override void Parse(Queue data) - { - FireworkExplosionSubComponent = (FireworkExplosionSubComponent)SubComponentRegistry.ParseSubComponent(SubComponents.FireworkExplosion, data); - } - - public override Queue Serialize() - { - return FireworkExplosionSubComponent!.Serialize(); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/FireworksComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/FireworksComponent.cs deleted file mode 100644 index db73c815f1..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/FireworksComponent.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Mapping; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class FireworksComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int FlightDuration { get; set; } - public int NumberOfExplosions { get; set; } - - public List Explosions { get; set; } = []; - - public override void Parse(Queue data) - { - FlightDuration = DataTypes.ReadNextVarInt(data); - NumberOfExplosions = DataTypes.ReadNextVarInt(data); - - if (NumberOfExplosions > 0) - { - for (var i = 0; i < NumberOfExplosions; i++) - Explosions.Add( - (FireworkExplosionSubComponent)SubComponentRegistry.ParseSubComponent(SubComponents.FireworkExplosion, - data)); - } - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(FlightDuration)); - data.AddRange(DataTypes.GetVarInt(NumberOfExplosions)); - if (NumberOfExplosions > 0) - { - if (NumberOfExplosions != Explosions.Count) - throw new Exception("Can't serialize FireworksComponent because NumberOfExplosions and the lenght of Explosions differ!"); - - foreach (var explosion in Explosions) - data.AddRange(explosion.Serialize().ToList()); - } - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/FoodComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/FoodComponent.cs deleted file mode 100644 index f8679473ad..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/FoodComponent.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class FoodComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int Nutrition { get; set; } - public float Saturation { get; set; } - public bool CanAlwaysEat { get; set; } - public float SecondsToEat { get; set; } - public List Effects { get; set; } = new(); - - public override void Parse(Queue data) - { - Nutrition = DataTypes.ReadNextVarInt(data); - Saturation = DataTypes.ReadNextFloat(data); - CanAlwaysEat = DataTypes.ReadNextBool(data); - SecondsToEat = DataTypes.ReadNextFloat(data); - var numberOfEffects = DataTypes.ReadNextVarInt(data); - - for (var i = 0; i < numberOfEffects; i++) - Effects.Add((EffectSubComponent)SubComponentRegistry.ParseSubComponent(SubComponents.Effect, data)); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Nutrition)); - data.AddRange(DataTypes.GetFloat(Saturation)); - data.AddRange(DataTypes.GetBool(CanAlwaysEat)); - data.AddRange(DataTypes.GetFloat(SecondsToEat)); - data.AddRange(DataTypes.GetVarInt(Effects.Count)); - - foreach (var effect in Effects) - data.AddRange(effect.Serialize()); - - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/HideAdditionalTooltipComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/HideAdditionalTooltipComponent.cs deleted file mode 100644 index 9f659b9fe7..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/HideAdditionalTooltipComponent.cs +++ /dev/null @@ -1,7 +0,0 @@ -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class HideAdditionalTooltipComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : EmptyComponent(dataTypes, itemPalette, subComponentRegistry); \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/HideTooltipComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/HideTooltipComponent.cs deleted file mode 100644 index 77cdc7fae2..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/HideTooltipComponent.cs +++ /dev/null @@ -1,7 +0,0 @@ -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class HideTooltipComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : EmptyComponent(dataTypes, itemPalette, subComponentRegistry); \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/InstrumentComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/InstrumentComponent.cs deleted file mode 100644 index 87692b7008..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/InstrumentComponent.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class InstrumentComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - // holder ID: 0 = inline instrument data, N>0 = registry reference (id = N-1) - public int InstrumentHolderId { get; set; } - - // Inline instrument fields (only when InstrumentHolderId == 0): - // holder ID for SoundEvent: 0 = inline sound, N>0 = registry reference (id = N-1) - public int SoundEventHolderId { get; set; } - // Inline SoundEvent fields (only when SoundEventHolderId == 0): - public string? SoundLocation { get; set; } - public bool HasFixedRange { get; set; } - public float FixedRange { get; set; } - - public int UseDuration { get; set; } - public float Range { get; set; } - - public override void Parse(Queue data) - { - InstrumentHolderId = DataTypes.ReadNextVarInt(data); - - if (InstrumentHolderId == 0) - { - SoundEventHolderId = DataTypes.ReadNextVarInt(data); - - if (SoundEventHolderId == 0) - { - SoundLocation = DataTypes.ReadNextString(data); - HasFixedRange = DataTypes.ReadNextBool(data); - if (HasFixedRange) - FixedRange = DataTypes.ReadNextFloat(data); - } - - UseDuration = DataTypes.ReadNextVarInt(data); - Range = DataTypes.ReadNextFloat(data); - } - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(InstrumentHolderId)); - - if (InstrumentHolderId == 0) - { - data.AddRange(DataTypes.GetVarInt(SoundEventHolderId)); - - if (SoundEventHolderId == 0) - { - data.AddRange(DataTypes.GetString(SoundLocation ?? "")); - data.AddRange(DataTypes.GetBool(HasFixedRange)); - if (HasFixedRange) - data.AddRange(DataTypes.GetFloat(FixedRange)); - } - - data.AddRange(DataTypes.GetVarInt(UseDuration)); - data.AddRange(DataTypes.GetFloat(Range)); - } - - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/IntangibleProjectileComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/IntangibleProjectileComponent.cs deleted file mode 100644 index b6d24a5e9d..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/IntangibleProjectileComponent.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class IntangibleProjectileComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : EmptyComponent(dataTypes, itemPalette, subComponentRegistry) -{ -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/ItemNameComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/ItemNameComponent.cs deleted file mode 100644 index 4b42c77965..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/ItemNameComponent.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; -using MinecraftClient.Protocol.Message; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class ItemNameComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public string ItemName { get; set; } = string.Empty; - public Dictionary? ItemNameNbt { get; set; } - - public override void Parse(Queue data) - { - ItemNameNbt = DataTypes.ReadNextNbt(data); - ItemName = ChatParser.ParseText(ItemNameNbt); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetNbt(ItemNameNbt)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/LockComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/LockComponent.cs deleted file mode 100644 index 85d050e2fa..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/LockComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class LockComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public Dictionary? Nbt { get; set; } - - public override void Parse(Queue data) - { - Nbt = DataTypes.ReadNextNbt(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetNbt(Nbt)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/LodestoneTrackerComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/LodestoneTrackerComponent.cs deleted file mode 100644 index f3353755cb..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/LodestoneTrackerComponent.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Mapping; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class LodestoneTrackerComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public bool HasGlobalPosition { get; set; } - public string Dimension { get; set; } = null!; - public Location Position { get; set; } - public bool Tracked { get; set; } - - public override void Parse(Queue data) - { - HasGlobalPosition = DataTypes.ReadNextBool(data); - - if (HasGlobalPosition) - { - Dimension = DataTypes.ReadNextString(data); - Position = DataTypes.ReadNextLocation(data); - } - - Tracked = DataTypes.ReadNextBool(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetBool(HasGlobalPosition)); - - if (HasGlobalPosition) - { - data.AddRange(DataTypes.GetString(Dimension)); - data.AddRange(DataTypes.GetLocation(Position)); - } - - data.AddRange(DataTypes.GetBool(Tracked)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/LoreComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/LoreComponent.cs deleted file mode 100644 index d8cb51616c..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/LoreComponent.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; -using MinecraftClient.Protocol.Message; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class LoreNameComponent1206(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int NumberOfLines { get; set; } - public List Lines { get; set; } = []; - public List> LinesNbt { get; set; } = []; - - public override void Parse(Queue data) - { - NumberOfLines = DataTypes.ReadNextVarInt(data); - - if (NumberOfLines <= 0) return; - - for (var i = 0; i < NumberOfLines; i++) - { - var lineNbt = DataTypes.ReadNextNbt(data); - LinesNbt.Add(lineNbt); - Lines.Add(ChatParser.ParseText(lineNbt)); - } - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(LinesNbt.Count)); - - foreach (var lineNbt in LinesNbt) - data.AddRange(DataTypes.GetNbt(lineNbt)); - - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/MapColorComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/MapColorComponent.cs deleted file mode 100644 index 457e74b5e2..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/MapColorComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class MapColorComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int Id { get; set; } - - public override void Parse(Queue data) - { - Id = DataTypes.ReadNextInt(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetInt(Id)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/MapDecorationsComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/MapDecorationsComponent.cs deleted file mode 100644 index 70b8b28d00..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/MapDecorationsComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class MapDecorationsComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public Dictionary? Nbt { get; set; } = new(); - - public override void Parse(Queue data) - { - Nbt = DataTypes.ReadNextNbt(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetNbt(Nbt)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/MapIdComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/MapIdComponent.cs deleted file mode 100644 index 712b721fae..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/MapIdComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class MapIdComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int Id { get; set; } - - public override void Parse(Queue data) - { - Id = DataTypes.ReadNextVarInt(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Id)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/MapPostProcessingComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/MapPostProcessingComponent.cs deleted file mode 100644 index c7d58700f0..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/MapPostProcessingComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class MapPostProcessingComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int Type { get; set; } - - public override void Parse(Queue data) - { - Type = DataTypes.ReadNextVarInt(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Type)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/MaxDamageComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/MaxDamageComponent.cs deleted file mode 100644 index 45e8545bcc..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/MaxDamageComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class MaxDamageComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int MaxDamage { get; set; } - - public override void Parse(Queue data) - { - MaxDamage = DataTypes.ReadNextVarInt(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(MaxDamage)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/MaxStackSizeComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/MaxStackSizeComponent.cs deleted file mode 100644 index 32da4c9f83..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/MaxStackSizeComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class MaxStackSizeComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int MaxStackSize { get; set; } - - public override void Parse(Queue data) - { - MaxStackSize = DataTypes.ReadNextVarInt(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(MaxStackSize)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/NoteBlockSoundComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/NoteBlockSoundComponent.cs deleted file mode 100644 index 5d7c079252..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/NoteBlockSoundComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class NoteBlockSoundComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public string Identifier { get; set; } = null!; - - public override void Parse(Queue data) - { - Identifier = DataTypes.ReadNextString(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetString(Identifier)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/OminousBottleAmplifierComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/OminousBottleAmplifierComponent.cs deleted file mode 100644 index ed92d9533d..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/OminousBottleAmplifierComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class OminousBottleAmplifierComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int Amplifier { get; set; } - - public override void Parse(Queue data) - { - Amplifier = DataTypes.ReadNextVarInt(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Amplifier)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/PotDecorationsComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/PotDecorationsComponent.cs deleted file mode 100644 index 97b918274c..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/PotDecorationsComponent.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class PotDecorationsComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public List Items { get; set; } = []; - - public override void Parse(Queue data) - { - var count = DataTypes.ReadNextVarInt(data); - for (var i = 0; i < count; i++) - Items.Add(DataTypes.ReadNextVarInt(data)); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Items.Count)); - foreach (var item in Items) - data.AddRange(DataTypes.GetVarInt(item)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/PotionContentsComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/PotionContentsComponent.cs deleted file mode 100644 index b56e6897dc..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/PotionContentsComponent.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class PotionContentsComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public bool HasPotionId { get; set; } - public int PotionId { get; set; } - public bool HasCustomColor { get; set; } - public int CustomColor { get; set; } - public List Effects { get; set; } = new(); - - public override void Parse(Queue data) - { - HasPotionId = DataTypes.ReadNextBool(data); - if (HasPotionId) - PotionId = DataTypes.ReadNextVarInt(data); - - HasCustomColor = DataTypes.ReadNextBool(data); - if (HasCustomColor) - CustomColor = DataTypes.ReadNextInt(data); - - var numberOfEffects = DataTypes.ReadNextVarInt(data); - for (var i = 0; i < numberOfEffects; i++) - Effects.Add((PotionEffectSubComponent)SubComponentRegistry.ParseSubComponent(SubComponents.PotionEffect, data)); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetBool(HasPotionId)); - if (HasPotionId) - data.AddRange(DataTypes.GetVarInt(PotionId)); - - data.AddRange(DataTypes.GetBool(HasCustomColor)); - if (HasCustomColor) - data.AddRange(DataTypes.GetInt(CustomColor)); - - data.AddRange(DataTypes.GetVarInt(Effects.Count)); - foreach (var effect in Effects) - data.AddRange(effect.Serialize()); - - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/ProfileComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/ProfileComponent.cs deleted file mode 100644 index 23cc92bf26..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/ProfileComponent.cs +++ /dev/null @@ -1,218 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class ProfileComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public bool HasName { get; set; } - public string? Name { get; set; } = null!; - public bool HasUniqueId { get; set; } - public Guid Uuid { get; set; } - public int NumberOfProperties { get; set; } - public List ProfileProperties { get; set; } = []; - public bool IsFullProfile { get; set; } - public string? BodyAssetId { get; set; } - public string? CapeAssetId { get; set; } - public string? ElytraAssetId { get; set; } - public ProfileSkinModel? Model { get; set; } - - public override void Parse(Queue data) - { - ResetState(); - - if (DataTypes.ProtocolVersion >= Protocol18Handler.MC_1_21_9_Version) - { - ParseResolvableProfile(data); - return; - } - - ParseLegacyProfile(data); - } - - public override Queue Serialize() - { - return DataTypes.ProtocolVersion >= Protocol18Handler.MC_1_21_9_Version - ? SerializeResolvableProfile() - : SerializeLegacyProfile(); - } - - private void ResetState() - { - HasName = false; - Name = null; - HasUniqueId = false; - Uuid = Guid.Empty; - NumberOfProperties = 0; - ProfileProperties = []; - IsFullProfile = false; - BodyAssetId = null; - CapeAssetId = null; - ElytraAssetId = null; - Model = null; - } - - private void ParseLegacyProfile(Queue data) - { - HasName = DataTypes.ReadNextBool(data); - - if (HasName) - Name = DataTypes.ReadNextString(data); - - HasUniqueId = DataTypes.ReadNextBool(data); - - if (HasUniqueId) - Uuid = DataTypes.ReadNextUUID(data); - - NumberOfProperties = DataTypes.ReadNextVarInt(data); - ProfileProperties = ReadProfileProperties(data, NumberOfProperties); - } - - private void ParseResolvableProfile(Queue data) - { - IsFullProfile = DataTypes.ReadNextBool(data); - - if (IsFullProfile) - { - HasUniqueId = true; - Uuid = DataTypes.ReadNextUUID(data); - HasName = true; - Name = DataTypes.ReadNextString(data); - NumberOfProperties = DataTypes.ReadNextVarInt(data); - ProfileProperties = ReadProfileProperties(data, NumberOfProperties); - } - else - { - HasName = DataTypes.ReadNextBool(data); - if (HasName) - Name = DataTypes.ReadNextString(data); - - HasUniqueId = DataTypes.ReadNextBool(data); - if (HasUniqueId) - Uuid = DataTypes.ReadNextUUID(data); - - NumberOfProperties = DataTypes.ReadNextVarInt(data); - ProfileProperties = ReadProfileProperties(data, NumberOfProperties); - } - - BodyAssetId = ReadOptionalResourceLocation(data); - CapeAssetId = ReadOptionalResourceLocation(data); - ElytraAssetId = ReadOptionalResourceLocation(data); - - if (DataTypes.ReadNextBool(data)) - Model = DataTypes.ReadNextBool(data) ? ProfileSkinModel.Slim : ProfileSkinModel.Wide; - } - - private Queue SerializeLegacyProfile() - { - var data = new List(); - NumberOfProperties = ProfileProperties.Count; - - data.AddRange(DataTypes.GetBool(HasName)); - if (HasName) - data.AddRange(DataTypes.GetString(Name ?? "")); - - data.AddRange(DataTypes.GetBool(HasUniqueId)); - if (HasUniqueId) - data.AddRange(DataTypes.GetUUID(Uuid)); - - data.AddRange(DataTypes.GetVarInt(NumberOfProperties)); - SerializeProfileProperties(data); - - return new Queue(data); - } - - private Queue SerializeResolvableProfile() - { - var data = new List(); - NumberOfProperties = ProfileProperties.Count; - - data.AddRange(DataTypes.GetBool(IsFullProfile)); - if (IsFullProfile) - { - if (!HasUniqueId) - throw new NullReferenceException("Can't serialize the ProfileComponent because a full profile requires a UUID!"); - - data.AddRange(DataTypes.GetUUID(Uuid)); - data.AddRange(DataTypes.GetString(Name ?? "")); - } - else - { - data.AddRange(DataTypes.GetBool(HasName)); - if (HasName) - data.AddRange(DataTypes.GetString(Name ?? "")); - - data.AddRange(DataTypes.GetBool(HasUniqueId)); - if (HasUniqueId) - data.AddRange(DataTypes.GetUUID(Uuid)); - } - - data.AddRange(DataTypes.GetVarInt(NumberOfProperties)); - SerializeProfileProperties(data); - - SerializeOptionalResourceLocation(data, BodyAssetId); - SerializeOptionalResourceLocation(data, CapeAssetId); - SerializeOptionalResourceLocation(data, ElytraAssetId); - - data.AddRange(DataTypes.GetBool(Model.HasValue)); - if (Model.HasValue) - data.AddRange(DataTypes.GetBool(Model.Value == ProfileSkinModel.Slim)); - - return new Queue(data); - } - - private List ReadProfileProperties(Queue data, int count) - { - var properties = new List(count); - for (var i = 0; i < count; i++) - { - var propertyName = DataTypes.ReadNextString(data); - var propertyValue = DataTypes.ReadNextString(data); - var hasSignature = DataTypes.ReadNextBool(data); - var signature = hasSignature ? DataTypes.ReadNextString(data) : null; - - properties.Add(new ProfileProperty(propertyName, propertyValue, hasSignature, signature)); - } - - return properties; - } - - private void SerializeProfileProperties(List data) - { - foreach (var profileProperty in ProfileProperties) - { - data.AddRange(DataTypes.GetString(profileProperty.Name)); - data.AddRange(DataTypes.GetString(profileProperty.Value)); - data.AddRange(DataTypes.GetBool(profileProperty.HasSignature)); - if (!profileProperty.HasSignature) - continue; - - if (string.IsNullOrEmpty(profileProperty.Signature)) - throw new NullReferenceException("Can't serialize the ProfileComponent because HasSignature is true, but the Signature is null/empty!"); - - data.AddRange(DataTypes.GetString(profileProperty.Signature)); - } - } - - private string? ReadOptionalResourceLocation(Queue data) - { - return DataTypes.ReadNextBool(data) ? DataTypes.ReadNextString(data) : null; - } - - private void SerializeOptionalResourceLocation(List data, string? resourceLocation) - { - data.AddRange(DataTypes.GetBool(!string.IsNullOrEmpty(resourceLocation))); - if (!string.IsNullOrEmpty(resourceLocation)) - data.AddRange(DataTypes.GetString(resourceLocation)); - } -} - -public record ProfileProperty(string Name, string Value, bool HasSignature, string? Signature); - -public enum ProfileSkinModel -{ - Wide, - Slim -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/RarityComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/RarityComponent.cs deleted file mode 100644 index cbe3b9e9c6..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/RarityComponent.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class RarityComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public ItemRarity Rarity { get; set; } - - public override void Parse(Queue data) - { - Rarity = (ItemRarity)DataTypes.ReadNextVarInt(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt((int)Rarity)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/RecipesComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/RecipesComponent.cs deleted file mode 100644 index 9df0e22be8..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/RecipesComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class RecipesComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public Dictionary? Nbt { get; set; } - - public override void Parse(Queue data) - { - Nbt = DataTypes.ReadNextNbt(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetNbt(Nbt)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/RepairCostComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/RepairCostComponent.cs deleted file mode 100644 index 951f14f54e..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/RepairCostComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class RepairCostComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int Cost { get; set; } - - public override void Parse(Queue data) - { - Cost = DataTypes.ReadNextVarInt(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Cost)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/StoredEnchantmentsComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/StoredEnchantmentsComponent.cs deleted file mode 100644 index a741d54d5f..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/StoredEnchantmentsComponent.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class StoredEnchantmentsComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : EnchantmentsComponent(dataTypes, itemPalette, subComponentRegistry); \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/SuspiciousStewEffectsComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/SuspiciousStewEffectsComponent.cs deleted file mode 100644 index b6518820ad..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/SuspiciousStewEffectsComponent.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using MinecraftClient.Inventory; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class SuspiciousStewEffectsComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int NumberOfEffects { get; set; } - public List Effects { get; set; } = new(); - - public override void Parse(Queue data) - { - NumberOfEffects = DataTypes.ReadNextVarInt(data); - - for (var i = 0; i < NumberOfEffects; i++) - Effects.Add(new SuspiciousStewEffect(DataTypes.ReadNextVarInt(data), DataTypes.ReadNextVarInt(data))); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(NumberOfEffects)); - - if (NumberOfEffects != Effects.Count) - throw new InvalidOperationException("Can not serialize SuspiciousStewEffectsComponent1206 because umberOfEffects != Effects.Count!"); - - foreach (var effect in Effects) - { - data.AddRange(DataTypes.GetVarInt(effect.TypeId)); - data.AddRange(DataTypes.GetVarInt(effect.Duration)); - } - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/ToolComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/ToolComponent.cs deleted file mode 100644 index 2d761739ab..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/ToolComponent.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class ToolComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int NumberOfRules { get; set; } - public List Rules { get; set; } = new(); - public float DefaultMiningSpeed { get; set; } - public int DamagePerBlock { get; set; } - - public override void Parse(Queue data) - { - NumberOfRules = DataTypes.ReadNextVarInt(data); - - for (var i = 0; i < NumberOfRules; i++) - Rules.Add((RuleSubComponent)SubComponentRegistry.ParseSubComponent(SubComponents.Rule, data)); - - DefaultMiningSpeed = DataTypes.ReadNextFloat(data); - DamagePerBlock = DataTypes.ReadNextVarInt(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(NumberOfRules)); - - if (Rules.Count != NumberOfRules) - throw new ArgumentNullException($"Can not serialize a ToolComponent1206 when the Rules count != NumberOfRules!"); - - foreach (var rule in Rules) - data.AddRange(rule.Serialize()); - - data.AddRange(DataTypes.GetFloat(DefaultMiningSpeed)); - data.AddRange(DataTypes.GetVarInt(DamagePerBlock)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/TrimComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/TrimComponent.cs deleted file mode 100644 index 90b7912729..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/TrimComponent.cs +++ /dev/null @@ -1,111 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; -using MinecraftClient.Protocol.Message; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class TrimComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int TrimMaterialType { get; set; } - public string AssetName { get; set; } = null!; - public int Ingredient { get; set; } - public float ItemModelIndex { get; set; } - public int NumberOfOverrides { get; set; } - public List? Overrides { get; set; } - public Dictionary? DescriptionNbt { get; set; } - public string Description { get; set; } = null!; - public int TrimPatternType { get; set; } - public string TrimPatternTypeAssetName { get; set; } = null!; - public int TemplateItem { get; set; } - public Dictionary? TrimPatternTypeDescriptionNbt { get; set; } - public string TrimPatternTypeDescription { get; set; } = null!; - public bool Decal { get; set; } - public bool ShowInTooltip { get; set; } - - public override void Parse(Queue data) - { - TrimMaterialType = DataTypes.ReadNextVarInt(data); - - if (TrimMaterialType == 0) - { - AssetName = DataTypes.ReadNextString(data); - Ingredient = DataTypes.ReadNextVarInt(data); - ItemModelIndex = DataTypes.ReadNextFloat(data); - NumberOfOverrides = DataTypes.ReadNextVarInt(data); - - if (NumberOfOverrides > 0) - { - Overrides = []; - - for (var i = 0; i < NumberOfOverrides; i++) - Overrides.Add(new TrimAssetOverride(DataTypes.ReadNextVarInt(data), - DataTypes.ReadNextString(data))); - } - - DescriptionNbt = DataTypes.ReadNextNbt(data); - Description = ChatParser.ParseText(DescriptionNbt); - } - - TrimPatternType = DataTypes.ReadNextVarInt(data); - - if (TrimPatternType == 0) - { - TrimPatternTypeAssetName = DataTypes.ReadNextString(data); - TemplateItem = DataTypes.ReadNextVarInt(data); - TrimPatternTypeDescriptionNbt = DataTypes.ReadNextNbt(data); - TrimPatternTypeDescription = ChatParser.ParseText(TrimPatternTypeDescriptionNbt); - Decal = DataTypes.ReadNextBool(data); - } - - ShowInTooltip = DataTypes.ReadNextBool(data); - } - - public override Queue Serialize() - { - var data = new List(); - - data.AddRange(DataTypes.GetVarInt(TrimMaterialType)); - - if (TrimMaterialType == 0) - { - if (string.IsNullOrEmpty(AssetName)) - throw new NullReferenceException("Can't serialize the TrimComponent because the Asset Name is null!"); - - data.AddRange(DataTypes.GetString(AssetName)); - data.AddRange(DataTypes.GetVarInt(Ingredient)); - data.AddRange(DataTypes.GetFloat(ItemModelIndex)); - data.AddRange(DataTypes.GetVarInt(NumberOfOverrides)); - if (NumberOfOverrides > 0) - { - if (NumberOfOverrides != Overrides?.Count) - throw new NullReferenceException("Can't serialize the TrimComponent because value of NumberOfOverrides and the size of Overrides don't match!"); - - foreach (var (armorMaterialType, assetName) in Overrides) - { - data.AddRange(DataTypes.GetVarInt(armorMaterialType)); - data.AddRange(DataTypes.GetString(assetName)); - } - } - data.AddRange(DataTypes.GetNbt(DescriptionNbt)); - } - - data.AddRange(DataTypes.GetVarInt(TrimPatternType)); - if (TrimPatternType == 0) - { - if (string.IsNullOrEmpty(TrimPatternTypeAssetName)) - throw new NullReferenceException("Can't serialize the TrimComponent because the TrimPatternTypeAssetName is null!"); - - data.AddRange(DataTypes.GetString(TrimPatternTypeAssetName)); - data.AddRange(DataTypes.GetVarInt(TemplateItem)); - data.AddRange(DataTypes.GetNbt(TrimPatternTypeDescriptionNbt)); - data.AddRange(DataTypes.GetBool(Decal)); - } - - data.AddRange(DataTypes.GetBool(ShowInTooltip)); - - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/UnbreakableComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/UnbreakableComponent.cs deleted file mode 100644 index b4f354f66e..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/UnbreakableComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class UnbreakableComponent1206(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public bool Unbreakable { get; set; } - - public override void Parse(Queue data) - { - Unbreakable = DataTypes.ReadNextBool(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetBool(Unbreakable)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/WritableBookContentComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/WritableBookContentComponent.cs deleted file mode 100644 index 59dc040913..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/WritableBookContentComponent.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class WritableBookContentComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public List Pages { get; set; } = []; - - public override void Parse(Queue data) - { - var count = DataTypes.ReadNextVarInt(data); - - for (var i = 0; i < count; i++) - { - var rawContent = DataTypes.ReadNextString(data); - var hasFilteredContent = DataTypes.ReadNextBool(data); - var filteredContent = null as string; - - if (hasFilteredContent) - filteredContent = DataTypes.ReadNextString(data); - - Pages.Add(new BookPage(rawContent, hasFilteredContent, filteredContent)); - } - } - - public override Queue Serialize() - { - var data = new List(); - - data.AddRange(DataTypes.GetVarInt(Pages.Count)); - - foreach (var page in Pages) - { - data.AddRange(DataTypes.GetString(page.RawContent)); - data.AddRange(DataTypes.GetBool(page.HasFilteredContent)); - - if (page.HasFilteredContent) - { - if (page.FilteredContent is null) - throw new InvalidOperationException("Can not serialize WritableBookContentComponent because page.HasFilteredContent = true, but FilteredContent is null!"); - - data.AddRange(DataTypes.GetString(page.FilteredContent)); - } - } - - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/WrittenBookContentComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/WrittenBookContentComponent.cs deleted file mode 100644 index 413c94d814..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/WrittenBookContentComponent.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; -using MinecraftClient.Protocol.Message; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -public class WrittenBookContentComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public string RawTitle { get; set; } = null!; - public bool HasFilteredTitle { get; set; } - public string? FilteredTitle { get; set; } - public string Author { get; set; } = null!; - public int Generation { get; set; } - public int NumberOfPages { get; set; } - public List Pages { get; set; } = []; - public bool Resolved { get; set; } - - public override void Parse(Queue data) - { - RawTitle = DataTypes.ReadNextString(data); - HasFilteredTitle = DataTypes.ReadNextBool(data); - - if (HasFilteredTitle) - FilteredTitle = DataTypes.ReadNextString(data); - - Author = DataTypes.ReadNextString(data); - Generation = DataTypes.ReadNextVarInt(data); - NumberOfPages = DataTypes.ReadNextVarInt(data); - - for (var i = 0; i < NumberOfPages; i++) - { - var (rawContent, rawContentNbt) = ReadPageComponent(data); - var hasFilteredContent = DataTypes.ReadNextBool(data); - Dictionary? filteredContentNbt = null; - string? filteredContent = null; - - if (hasFilteredContent) - (filteredContent, filteredContentNbt) = ReadPageComponent(data); - - Pages.Add(new BookPage(rawContent, hasFilteredContent, filteredContent, rawContentNbt, filteredContentNbt)); - } - - Resolved = DataTypes.ReadNextBool(data); - } - - private (string Content, Dictionary Nbt) ReadPageComponent(Queue data) - { - // Hypixel sent page payloads in the string-shaped form on this structured-book path, - // so keep the parser tolerant while still preserving the raw data for serialization. - Queue fallbackData = new(data); - - try - { - var nbt = DataTypes.ReadNextNbt(data); - return (ChatParser.ParseText(nbt), nbt); - } - catch (System.IO.InvalidDataException) - { - data.Clear(); - foreach (var b in fallbackData) - data.Enqueue(b); - - var json = DataTypes.ReadNextString(data); - return (ChatParser.ParseText(json), new Dictionary { [""] = json }); - } - } - - public override Queue Serialize() - { - var data = new List(); - - data.AddRange(DataTypes.GetString(RawTitle)); - data.AddRange(DataTypes.GetBool(HasFilteredTitle)); - - if (HasFilteredTitle) - { - if (FilteredTitle is null) - throw new InvalidOperationException("Can not serialize WrittenBookContentComponent because HasFilteredTitle is true but FilteredTitle is null!"); - - data.AddRange(DataTypes.GetString(FilteredTitle)); - } - - data.AddRange(DataTypes.GetString(Author)); - data.AddRange(DataTypes.GetVarInt(Generation)); - data.AddRange(DataTypes.GetVarInt(Pages.Count)); - - foreach (var page in Pages) - { - data.AddRange(DataTypes.GetNbt(page.RawContentNbt)); - data.AddRange(DataTypes.GetBool(page.HasFilteredContent)); - - if (page.HasFilteredContent) - data.AddRange(DataTypes.GetNbt(page.FilteredContentNbt)); - } - data.AddRange(DataTypes.GetBool(Resolved)); - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21/JukeBoxPlayableComponent121.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21/JukeBoxPlayableComponent121.cs deleted file mode 100644 index 0b4266fd9f..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21/JukeBoxPlayableComponent121.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_21; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; -using MinecraftClient.Protocol.Message; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21; - -public class JukeBoxPlayableComponent121(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public bool IsHolder { get; set; } - public int HolderId { get; set; } - public string? ResourceKey { get; set; } - public SoundEventSubComponent? SoundEvent { get; set; } - public Dictionary? DescriptionNbt { get; set; } - public string Description { get; set; } = string.Empty; - public float Duration { get; set; } - public int ComparatorOutput { get; set; } - public bool ShowTooltip { get; set; } - - public override void Parse(Queue data) - { - IsHolder = DataTypes.ReadNextBool(data); - - if (IsHolder) - { - HolderId = DataTypes.ReadNextVarInt(data); - if (HolderId == 0) - { - SoundEvent = (SoundEventSubComponent)SubComponentRegistry.ParseSubComponent(SubComponents.SoundEvent, data); - DescriptionNbt = DataTypes.ReadNextNbt(data); - Description = ChatParser.ParseText(DescriptionNbt); - Duration = DataTypes.ReadNextFloat(data); - ComparatorOutput = DataTypes.ReadNextVarInt(data); - } - } - else - { - ResourceKey = DataTypes.ReadNextString(data); - } - - ShowTooltip = DataTypes.ReadNextBool(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetBool(IsHolder)); - - if (IsHolder) - { - data.AddRange(DataTypes.GetVarInt(HolderId)); - if (HolderId == 0) - { - if (SoundEvent is null) - throw new ArgumentNullException(nameof(SoundEvent), "Inline jukebox song requires a sound event."); - - if (DescriptionNbt is null) - throw new ArgumentNullException(nameof(DescriptionNbt), "Inline jukebox song requires a description."); - - data.AddRange(SoundEvent.Serialize()); - data.AddRange(DataTypes.GetNbt(DescriptionNbt)); - data.AddRange(DataTypes.GetFloat(Duration)); - data.AddRange(DataTypes.GetVarInt(ComparatorOutput)); - } - } - else - { - if (string.IsNullOrEmpty(ResourceKey)) - throw new ArgumentNullException(nameof(ResourceKey), "Resource key is required for key-backed jukebox songs."); - - data.AddRange(DataTypes.GetString(ResourceKey)); - } - - data.AddRange(DataTypes.GetBool(ShowTooltip)); - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_11/AttackRangeComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_11/AttackRangeComponent.cs deleted file mode 100644 index f06bff4228..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_11/AttackRangeComponent.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_11; - -public class AttackRangeComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public float MinRange { get; set; } - public float MaxRange { get; set; } - public float MinCreativeRange { get; set; } - public float MaxCreativeRange { get; set; } - public float HitboxMargin { get; set; } - public float MobFactor { get; set; } - - public override void Parse(Queue data) - { - MinRange = DataTypes.ReadNextFloat(data); - MaxRange = DataTypes.ReadNextFloat(data); - MinCreativeRange = DataTypes.ReadNextFloat(data); - MaxCreativeRange = DataTypes.ReadNextFloat(data); - HitboxMargin = DataTypes.ReadNextFloat(data); - MobFactor = DataTypes.ReadNextFloat(data); - } - - public override Queue Serialize() - { - var bytes = new List(); - bytes.AddRange(DataTypes.GetFloat(MinRange)); - bytes.AddRange(DataTypes.GetFloat(MaxRange)); - bytes.AddRange(DataTypes.GetFloat(MinCreativeRange)); - bytes.AddRange(DataTypes.GetFloat(MaxCreativeRange)); - bytes.AddRange(DataTypes.GetFloat(HitboxMargin)); - bytes.AddRange(DataTypes.GetFloat(MobFactor)); - return new Queue(bytes); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_11/KineticWeaponComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_11/KineticWeaponComponent.cs deleted file mode 100644 index 4d676f5154..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_11/KineticWeaponComponent.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_11; - -public class KineticWeaponComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int ContactCooldownTicks { get; set; } - public int DelayTicks { get; set; } - public KineticWeaponConditionData? DismountConditions { get; set; } - public KineticWeaponConditionData? KnockbackConditions { get; set; } - public KineticWeaponConditionData? DamageConditions { get; set; } - public float ForwardMovement { get; set; } - public float DamageMultiplier { get; set; } - public SoundEventHolderData? Sound { get; set; } - public SoundEventHolderData? HitSound { get; set; } - - public override void Parse(Queue data) - { - ContactCooldownTicks = DataTypes.ReadNextVarInt(data); - DelayTicks = DataTypes.ReadNextVarInt(data); - DismountConditions = ReadOptionalCondition(data); - KnockbackConditions = ReadOptionalCondition(data); - DamageConditions = ReadOptionalCondition(data); - ForwardMovement = DataTypes.ReadNextFloat(data); - DamageMultiplier = DataTypes.ReadNextFloat(data); - Sound = StructuredComponentCodecHelpers.ReadOptionalSoundEventHolder(DataTypes, data); - HitSound = StructuredComponentCodecHelpers.ReadOptionalSoundEventHolder(DataTypes, data); - } - - private KineticWeaponConditionData? ReadOptionalCondition(Queue data) - { - if (!DataTypes.ReadNextBool(data)) - return null; - - return new KineticWeaponConditionData( - DataTypes.ReadNextVarInt(data), - DataTypes.ReadNextFloat(data), - DataTypes.ReadNextFloat(data)); - } - - private void WriteOptionalCondition(List data, KineticWeaponConditionData? condition) - { - data.AddRange(DataTypes.GetBool(condition is not null)); - if (condition is null) - return; - - data.AddRange(DataTypes.GetVarInt(condition.MaxDurationTicks)); - data.AddRange(DataTypes.GetFloat(condition.MinSpeed)); - data.AddRange(DataTypes.GetFloat(condition.MinRelativeSpeed)); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(ContactCooldownTicks)); - data.AddRange(DataTypes.GetVarInt(DelayTicks)); - WriteOptionalCondition(data, DismountConditions); - WriteOptionalCondition(data, KnockbackConditions); - WriteOptionalCondition(data, DamageConditions); - data.AddRange(DataTypes.GetFloat(ForwardMovement)); - data.AddRange(DataTypes.GetFloat(DamageMultiplier)); - StructuredComponentCodecHelpers.WriteOptionalSoundEventHolder(DataTypes, data, Sound); - StructuredComponentCodecHelpers.WriteOptionalSoundEventHolder(DataTypes, data, HitSound); - return new Queue(data); - } -} - -public sealed record KineticWeaponConditionData(int MaxDurationTicks, float MinSpeed, float MinRelativeSpeed); diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_11/PiercingWeaponComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_11/PiercingWeaponComponent.cs deleted file mode 100644 index a6af8beff7..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_11/PiercingWeaponComponent.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_11; - -public class PiercingWeaponComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public bool DealsKnockback { get; set; } - public bool Dismounts { get; set; } - public SoundEventHolderData? Sound { get; set; } - public SoundEventHolderData? HitSound { get; set; } - - public override void Parse(Queue data) - { - DealsKnockback = DataTypes.ReadNextBool(data); - Dismounts = DataTypes.ReadNextBool(data); - Sound = StructuredComponentCodecHelpers.ReadOptionalSoundEventHolder(DataTypes, data); - HitSound = StructuredComponentCodecHelpers.ReadOptionalSoundEventHolder(DataTypes, data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetBool(DealsKnockback)); - data.AddRange(DataTypes.GetBool(Dismounts)); - StructuredComponentCodecHelpers.WriteOptionalSoundEventHolder(DataTypes, data, Sound); - StructuredComponentCodecHelpers.WriteOptionalSoundEventHolder(DataTypes, data, HitSound); - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_11/RegistryEitherHolderComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_11/RegistryEitherHolderComponent.cs deleted file mode 100644 index 6d786f8ce3..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_11/RegistryEitherHolderComponent.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_11; - -/// -/// EitherHolder backed by holderRegistry (VarInt = raw registry ID, 0 is valid). -/// Used for DamageType and ZombieNautilusVariant where the holder codec is holderRegistry(), -/// unlike the holder() codec used in SoundEvent (where 0 means inline). -/// -public class RegistryEitherHolderComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public bool IsHolder { get; set; } - public int HolderId { get; set; } - public string? ResourceKey { get; set; } - - public override void Parse(Queue data) - { - IsHolder = DataTypes.ReadNextBool(data); - if (IsHolder) - HolderId = DataTypes.ReadNextVarInt(data); - else - ResourceKey = DataTypes.ReadNextString(data); - } - - public override Queue Serialize() - { - var bytes = new List(); - bytes.AddRange(DataTypes.GetBool(IsHolder)); - if (IsHolder) - bytes.AddRange(DataTypes.GetVarInt(HolderId)); - else - bytes.AddRange(DataTypes.GetString(ResourceKey ?? "")); - return new Queue(bytes); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_11/SwingAnimationComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_11/SwingAnimationComponent.cs deleted file mode 100644 index 3ce4792041..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_11/SwingAnimationComponent.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_11; - -public class SwingAnimationComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int AnimationType { get; set; } - public int Duration { get; set; } - - public override void Parse(Queue data) - { - AnimationType = DataTypes.ReadNextVarInt(data); - Duration = DataTypes.ReadNextVarInt(data); - } - - public override Queue Serialize() - { - var bytes = new List(); - bytes.AddRange(DataTypes.GetVarInt(AnimationType)); - bytes.AddRange(DataTypes.GetVarInt(Duration)); - return new Queue(bytes); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_11/UseEffectsComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_11/UseEffectsComponent.cs deleted file mode 100644 index a4b72a9fd0..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_11/UseEffectsComponent.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_11; - -public class UseEffectsComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public bool CanSprint { get; set; } - public bool InteractVibrations { get; set; } - public float SpeedMultiplier { get; set; } - - public override void Parse(Queue data) - { - CanSprint = DataTypes.ReadNextBool(data); - InteractVibrations = DataTypes.ReadNextBool(data); - SpeedMultiplier = DataTypes.ReadNextFloat(data); - } - - public override Queue Serialize() - { - var bytes = new List(); - bytes.AddRange(DataTypes.GetBool(CanSprint)); - bytes.AddRange(DataTypes.GetBool(InteractVibrations)); - bytes.AddRange(DataTypes.GetFloat(SpeedMultiplier)); - return new Queue(bytes); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/ConsumableComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/ConsumableComponent.cs deleted file mode 100644 index ac3c34eab2..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/ConsumableComponent.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_21; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_2; - -public class ConsumableComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public float ConsumeSeconds { get; set; } - public int Animation { get; set; } - public SoundEventSubComponent? Sound { get; set; } - public bool HasConsumeParticles { get; set; } - public List Effects { get; set; } = new(); - - public override void Parse(Queue data) - { - ConsumeSeconds = DataTypes.ReadNextFloat(data); - Animation = DataTypes.ReadNextVarInt(data); - Sound = (SoundEventSubComponent)SubComponentRegistry.ParseSubComponent(SubComponents.SoundEvent, data); - HasConsumeParticles = DataTypes.ReadNextBool(data); - - var effectCount = DataTypes.ReadNextVarInt(data); - for (var i = 0; i < effectCount; i++) - { - var effectTypeId = DataTypes.ReadNextVarInt(data); - var effectData = ReadConsumeEffectPayload(effectTypeId, data); - Effects.Add(new ConsumeEffectData(effectTypeId, effectData)); - } - } - - private byte[] ReadConsumeEffectPayload(int effectTypeId, Queue data) - { - var payload = new List(); - switch (effectTypeId) - { - case 0: // apply_effects: List + probability(float) - var effectCount = DataTypes.ReadNextVarInt(data); - payload.AddRange(DataTypes.GetVarInt(effectCount)); - for (var i = 0; i < effectCount; i++) - payload.AddRange(ReadMobEffectInstance(data)); - payload.AddRange(DataTypes.GetFloat(DataTypes.ReadNextFloat(data))); - break; - case 1: // remove_effects: HolderSet - payload.AddRange(ReadHolderSet(data)); - break; - case 2: // clear_all_effects: empty - break; - case 3: // teleport_randomly: float diameter - payload.AddRange(DataTypes.GetFloat(DataTypes.ReadNextFloat(data))); - break; - case 4: // play_sound: Holder - var sound = (SoundEventSubComponent)SubComponentRegistry.ParseSubComponent(SubComponents.SoundEvent, data); - payload.AddRange(sound.Serialize()); - break; - } - return payload.ToArray(); - } - - private byte[] ReadMobEffectInstance(Queue data) - { - var result = new List(); - var effectId = DataTypes.ReadNextVarInt(data); - result.AddRange(DataTypes.GetVarInt(effectId)); - result.AddRange(ReadMobEffectDetails(data)); - return result.ToArray(); - } - - private byte[] ReadMobEffectDetails(Queue data) - { - var result = new List(); - var amplifier = DataTypes.ReadNextVarInt(data); - result.AddRange(DataTypes.GetVarInt(amplifier)); - var duration = DataTypes.ReadNextVarInt(data); - result.AddRange(DataTypes.GetVarInt(duration)); - var ambient = DataTypes.ReadNextBool(data); - result.AddRange(DataTypes.GetBool(ambient)); - var showParticles = DataTypes.ReadNextBool(data); - result.AddRange(DataTypes.GetBool(showParticles)); - var showIcon = DataTypes.ReadNextBool(data); - result.AddRange(DataTypes.GetBool(showIcon)); - var hasHiddenEffect = DataTypes.ReadNextBool(data); - result.AddRange(DataTypes.GetBool(hasHiddenEffect)); - if (hasHiddenEffect) - result.AddRange(ReadMobEffectDetails(data)); - return result.ToArray(); - } - - private byte[] ReadHolderSet(Queue data) - { - var result = new List(); - var type = DataTypes.ReadNextVarInt(data); - result.AddRange(DataTypes.GetVarInt(type)); - if (type == 0) - { - var tagName = DataTypes.ReadNextString(data); - result.AddRange(DataTypes.GetString(tagName)); - } - else - { - for (var i = 0; i < type - 1; i++) - { - var id = DataTypes.ReadNextVarInt(data); - result.AddRange(DataTypes.GetVarInt(id)); - } - } - return result.ToArray(); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetFloat(ConsumeSeconds)); - data.AddRange(DataTypes.GetVarInt(Animation)); - if (Sound is not null) data.AddRange(Sound.Serialize()); - data.AddRange(DataTypes.GetBool(HasConsumeParticles)); - data.AddRange(DataTypes.GetVarInt(Effects.Count)); - foreach (var effect in Effects) - { - data.AddRange(DataTypes.GetVarInt(effect.EffectTypeId)); - data.AddRange(effect.Payload); - } - return new Queue(data); - } - - public record ConsumeEffectData(int EffectTypeId, byte[] Payload); -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/DamageResistantComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/DamageResistantComponent.cs deleted file mode 100644 index cc5867bb74..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/DamageResistantComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_2; - -public class DamageResistantComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public string Types { get; set; } = null!; - - public override void Parse(Queue data) - { - Types = DataTypes.ReadNextString(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetString(Types)); - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/DeathProtectionComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/DeathProtectionComponent.cs deleted file mode 100644 index 5b5cc011e4..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/DeathProtectionComponent.cs +++ /dev/null @@ -1,106 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_21; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_2; - -public class DeathProtectionComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public List DeathEffects { get; set; } = new(); - - public override void Parse(Queue data) - { - var effectCount = DataTypes.ReadNextVarInt(data); - for (var i = 0; i < effectCount; i++) - { - var effectTypeId = DataTypes.ReadNextVarInt(data); - var effectData = ReadConsumeEffectPayload(effectTypeId, data); - DeathEffects.Add(new ConsumeEffectData(effectTypeId, effectData)); - } - } - - private byte[] ReadConsumeEffectPayload(int effectTypeId, Queue data) - { - var payload = new List(); - switch (effectTypeId) - { - case 0: // apply_effects - var effectCount = DataTypes.ReadNextVarInt(data); - payload.AddRange(DataTypes.GetVarInt(effectCount)); - for (var i = 0; i < effectCount; i++) - payload.AddRange(ReadMobEffectInstance(data)); - payload.AddRange(DataTypes.GetFloat(DataTypes.ReadNextFloat(data))); - break; - case 1: // remove_effects - payload.AddRange(ReadHolderSet(data)); - break; - case 2: // clear_all_effects - break; - case 3: // teleport_randomly - payload.AddRange(DataTypes.GetFloat(DataTypes.ReadNextFloat(data))); - break; - case 4: // play_sound - var sound = (SoundEventSubComponent)SubComponentRegistry.ParseSubComponent(SubComponents.SoundEvent, data); - payload.AddRange(sound.Serialize()); - break; - } - return payload.ToArray(); - } - - private byte[] ReadMobEffectInstance(Queue data) - { - var result = new List(); - result.AddRange(DataTypes.GetVarInt(DataTypes.ReadNextVarInt(data))); - result.AddRange(ReadMobEffectDetails(data)); - return result.ToArray(); - } - - private byte[] ReadMobEffectDetails(Queue data) - { - var result = new List(); - result.AddRange(DataTypes.GetVarInt(DataTypes.ReadNextVarInt(data))); - result.AddRange(DataTypes.GetVarInt(DataTypes.ReadNextVarInt(data))); - result.AddRange(DataTypes.GetBool(DataTypes.ReadNextBool(data))); - result.AddRange(DataTypes.GetBool(DataTypes.ReadNextBool(data))); - result.AddRange(DataTypes.GetBool(DataTypes.ReadNextBool(data))); - var hasHidden = DataTypes.ReadNextBool(data); - result.AddRange(DataTypes.GetBool(hasHidden)); - if (hasHidden) - result.AddRange(ReadMobEffectDetails(data)); - return result.ToArray(); - } - - private byte[] ReadHolderSet(Queue data) - { - var result = new List(); - var type = DataTypes.ReadNextVarInt(data); - result.AddRange(DataTypes.GetVarInt(type)); - if (type == 0) - { - result.AddRange(DataTypes.GetString(DataTypes.ReadNextString(data))); - } - else - { - for (var i = 0; i < type - 1; i++) - result.AddRange(DataTypes.GetVarInt(DataTypes.ReadNextVarInt(data))); - } - return result.ToArray(); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(DeathEffects.Count)); - foreach (var effect in DeathEffects) - { - data.AddRange(DataTypes.GetVarInt(effect.EffectTypeId)); - data.AddRange(effect.Payload); - } - return new Queue(data); - } - - public record ConsumeEffectData(int EffectTypeId, byte[] Payload); -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/EnchantableComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/EnchantableComponent.cs deleted file mode 100644 index f522dbd9bc..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/EnchantableComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_2; - -public class EnchantableComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int Value { get; set; } - - public override void Parse(Queue data) - { - Value = DataTypes.ReadNextVarInt(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Value)); - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/EquippableComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/EquippableComponent.cs deleted file mode 100644 index eb3a93b097..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/EquippableComponent.cs +++ /dev/null @@ -1,94 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_21; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_2; - -public class EquippableComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int Slot { get; set; } - public SoundEventSubComponent? EquipSound { get; set; } - public bool HasModel { get; set; } - public string? Model { get; set; } - public bool HasCameraOverlay { get; set; } - public string? CameraOverlay { get; set; } - public bool HasAllowedEntities { get; set; } - public int AllowedEntitiesType { get; set; } - public string? AllowedEntitiesTag { get; set; } - public List? AllowedEntitiesIds { get; set; } - public bool Dispensable { get; set; } - public bool Swappable { get; set; } - public bool DamageOnHurt { get; set; } - - public override void Parse(Queue data) - { - Slot = DataTypes.ReadNextVarInt(data); - EquipSound = (SoundEventSubComponent)SubComponentRegistry.ParseSubComponent(SubComponents.SoundEvent, data); - - HasModel = DataTypes.ReadNextBool(data); - if (HasModel) - Model = DataTypes.ReadNextString(data); - - HasCameraOverlay = DataTypes.ReadNextBool(data); - if (HasCameraOverlay) - CameraOverlay = DataTypes.ReadNextString(data); - - HasAllowedEntities = DataTypes.ReadNextBool(data); - if (HasAllowedEntities) - { - AllowedEntitiesType = DataTypes.ReadNextVarInt(data); - if (AllowedEntitiesType == 0) - { - AllowedEntitiesTag = DataTypes.ReadNextString(data); - } - else - { - AllowedEntitiesIds = new List(); - for (var i = 0; i < AllowedEntitiesType - 1; i++) - AllowedEntitiesIds.Add(DataTypes.ReadNextVarInt(data)); - } - } - - Dispensable = DataTypes.ReadNextBool(data); - Swappable = DataTypes.ReadNextBool(data); - DamageOnHurt = DataTypes.ReadNextBool(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Slot)); - if (EquipSound is not null) data.AddRange(EquipSound.Serialize()); - - data.AddRange(DataTypes.GetBool(HasModel)); - if (HasModel && Model is not null) - data.AddRange(DataTypes.GetString(Model)); - - data.AddRange(DataTypes.GetBool(HasCameraOverlay)); - if (HasCameraOverlay && CameraOverlay is not null) - data.AddRange(DataTypes.GetString(CameraOverlay)); - - data.AddRange(DataTypes.GetBool(HasAllowedEntities)); - if (HasAllowedEntities) - { - data.AddRange(DataTypes.GetVarInt(AllowedEntitiesType)); - if (AllowedEntitiesType == 0 && AllowedEntitiesTag is not null) - { - data.AddRange(DataTypes.GetString(AllowedEntitiesTag)); - } - else if (AllowedEntitiesIds is not null) - { - foreach (var id in AllowedEntitiesIds) - data.AddRange(DataTypes.GetVarInt(id)); - } - } - - data.AddRange(DataTypes.GetBool(Dispensable)); - data.AddRange(DataTypes.GetBool(Swappable)); - data.AddRange(DataTypes.GetBool(DamageOnHurt)); - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/FoodComponent1212.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/FoodComponent1212.cs deleted file mode 100644 index 65c58d53d7..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/FoodComponent1212.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_2; - -public class FoodComponent1212(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int Nutrition { get; set; } - public float Saturation { get; set; } - public bool CanAlwaysEat { get; set; } - - public override void Parse(Queue data) - { - Nutrition = DataTypes.ReadNextVarInt(data); - Saturation = DataTypes.ReadNextFloat(data); - CanAlwaysEat = DataTypes.ReadNextBool(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Nutrition)); - data.AddRange(DataTypes.GetFloat(Saturation)); - data.AddRange(DataTypes.GetBool(CanAlwaysEat)); - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/GliderComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/GliderComponent.cs deleted file mode 100644 index 1aa739d077..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/GliderComponent.cs +++ /dev/null @@ -1,8 +0,0 @@ -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_2; - -public class GliderComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : EmptyComponent(dataTypes, itemPalette, subComponentRegistry); diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/ItemModelComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/ItemModelComponent.cs deleted file mode 100644 index 97915e6617..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/ItemModelComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_2; - -public class ItemModelComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public string Identifier { get; set; } = null!; - - public override void Parse(Queue data) - { - Identifier = DataTypes.ReadNextString(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetString(Identifier)); - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/PotionContentsComponent1212.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/PotionContentsComponent1212.cs deleted file mode 100644 index a729adb05c..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/PotionContentsComponent1212.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_2; - -public class PotionContentsComponent1212(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public bool HasPotionId { get; set; } - public int PotionId { get; set; } - public bool HasCustomColor { get; set; } - public int CustomColor { get; set; } - public List Effects { get; set; } = []; - public bool HasCustomName { get; set; } - public string? CustomName { get; set; } - - public override void Parse(Queue data) - { - HasPotionId = DataTypes.ReadNextBool(data); - if (HasPotionId) - PotionId = DataTypes.ReadNextVarInt(data); - - HasCustomColor = DataTypes.ReadNextBool(data); - if (HasCustomColor) - CustomColor = DataTypes.ReadNextInt(data); - - var numberOfEffects = DataTypes.ReadNextVarInt(data); - Effects = new List(numberOfEffects); - for (var i = 0; i < numberOfEffects; i++) - Effects.Add((PotionEffectSubComponent)SubComponentRegistry.ParseSubComponent(SubComponents.PotionEffect, data)); - - HasCustomName = DataTypes.ReadNextBool(data); - if (HasCustomName) - CustomName = DataTypes.ReadNextString(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetBool(HasPotionId)); - if (HasPotionId) - data.AddRange(DataTypes.GetVarInt(PotionId)); - - data.AddRange(DataTypes.GetBool(HasCustomColor)); - if (HasCustomColor) - data.AddRange(DataTypes.GetInt(CustomColor)); - - data.AddRange(DataTypes.GetVarInt(Effects.Count)); - foreach (var effect in Effects) - data.AddRange(effect.Serialize()); - - data.AddRange(DataTypes.GetBool(HasCustomName)); - if (HasCustomName && CustomName is not null) - data.AddRange(DataTypes.GetString(CustomName)); - - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/RepairableComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/RepairableComponent.cs deleted file mode 100644 index 481c58a38d..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/RepairableComponent.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_2; - -public class RepairableComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int Type { get; set; } - public string? TagName { get; set; } - public List? ItemIds { get; set; } - - public override void Parse(Queue data) - { - Type = DataTypes.ReadNextVarInt(data); - if (Type == 0) - { - TagName = DataTypes.ReadNextString(data); - } - else - { - ItemIds = new List(); - for (var i = 0; i < Type - 1; i++) - ItemIds.Add(DataTypes.ReadNextVarInt(data)); - } - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Type)); - if (Type == 0 && TagName is not null) - { - data.AddRange(DataTypes.GetString(TagName)); - } - else if (ItemIds is not null) - { - foreach (var id in ItemIds) - data.AddRange(DataTypes.GetVarInt(id)); - } - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/TooltipStyleComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/TooltipStyleComponent.cs deleted file mode 100644 index ac25df8f0c..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/TooltipStyleComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_2; - -public class TooltipStyleComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public string Identifier { get; set; } = null!; - - public override void Parse(Queue data) - { - Identifier = DataTypes.ReadNextString(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetString(Identifier)); - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/UseCooldownComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/UseCooldownComponent.cs deleted file mode 100644 index 217c56ceac..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/UseCooldownComponent.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_2; - -public class UseCooldownComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public float Seconds { get; set; } - public bool HasCooldownGroup { get; set; } - public string? CooldownGroup { get; set; } - - public override void Parse(Queue data) - { - Seconds = DataTypes.ReadNextFloat(data); - HasCooldownGroup = DataTypes.ReadNextBool(data); - if (HasCooldownGroup) - CooldownGroup = DataTypes.ReadNextString(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetFloat(Seconds)); - data.AddRange(DataTypes.GetBool(HasCooldownGroup)); - if (HasCooldownGroup && CooldownGroup is not null) - data.AddRange(DataTypes.GetString(CooldownGroup)); - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/UseRemainderComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/UseRemainderComponent.cs deleted file mode 100644 index da371a95ea..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_2/UseRemainderComponent.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_2; - -public class UseRemainderComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public Item? ConvertInto { get; set; } - - public override void Parse(Queue data) - { - ConvertInto = DataTypes.ReadNextItemSlot(data, ItemPalette); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetItemSlot(ConvertInto, ItemPalette)); - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/AdventureModePredicateComponents1215.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/AdventureModePredicateComponents1215.cs deleted file mode 100644 index 28652f86b4..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/AdventureModePredicateComponents1215.cs +++ /dev/null @@ -1,136 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; - -/// -/// 1.21.5+ uses AdventureModePredicate.STREAM_CODEC: -/// list, where each BlockPredicate ends with DataComponentMatchers. -/// Tooltip visibility moved to minecraft:tooltip_display. -/// -public sealed class CanBreakComponent1215(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : AdventureModePredicateComponent1215Base(dataTypes, itemPalette, subComponentRegistry); - -/// -/// 1.21.5+ uses AdventureModePredicate.STREAM_CODEC: -/// list, where each BlockPredicate ends with DataComponentMatchers. -/// Tooltip visibility moved to minecraft:tooltip_display. -/// -public sealed class CanPlaceOnComponent1215(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : AdventureModePredicateComponent1215Base(dataTypes, itemPalette, subComponentRegistry); - -public abstract class AdventureModePredicateComponent1215Base(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public List BlockPredicates { get; set; } = []; - - public override void Parse(Queue data) - { - var predicateCount = DataTypes.ReadNextVarInt(data); - BlockPredicates = new List(predicateCount); - var componentHandler = new StructuredComponentsHandler(DataTypes.ProtocolVersion, DataTypes, ItemPalette); - - for (var i = 0; i < predicateCount; i++) - BlockPredicates.Add(ParseBlockPredicate(data, componentHandler)); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(BlockPredicates.Count)); - - foreach (var predicate in BlockPredicates) - SerializeBlockPredicate(data, predicate); - - return new Queue(data); - } - - private AdventureModeBlockPredicate1215 ParseBlockPredicate(Queue data, StructuredComponentsHandler componentHandler) - { - BlockSetSubcomponent? blockSet = null; - if (DataTypes.ReadNextBool(data)) - blockSet = (BlockSetSubcomponent)SubComponentRegistry.ParseSubComponent(SubComponents.BlockSet, data); - - List properties = []; - if (DataTypes.ReadNextBool(data)) - { - var propertyCount = DataTypes.ReadNextVarInt(data); - properties = new List(propertyCount); - for (var i = 0; i < propertyCount; i++) - properties.Add((PropertySubComponent)SubComponentRegistry.ParseSubComponent(SubComponents.Property, data)); - } - - Dictionary? nbt = null; - if (DataTypes.ReadNextBool(data)) - nbt = DataTypes.ReadNextNbt(data); - - var exactComponentCount = DataTypes.ReadNextVarInt(data); - var exactComponents = new List(exactComponentCount); - for (var i = 0; i < exactComponentCount; i++) - { - var componentTypeId = DataTypes.ReadNextVarInt(data); - exactComponents.Add(componentHandler.Parse(componentTypeId, data)); - } - - var partialPredicateCount = DataTypes.ReadNextVarInt(data); - var partialPredicates = new List(partialPredicateCount); - for (var i = 0; i < partialPredicateCount; i++) - { - partialPredicates.Add(new DataComponentPredicatePayload1215( - DataTypes.ReadNextVarInt(data), - DataTypes.ReadNextNbt(data))); - } - - return new AdventureModeBlockPredicate1215(blockSet, properties, nbt, exactComponents, partialPredicates); - } - - private void SerializeBlockPredicate(List data, AdventureModeBlockPredicate1215 predicate) - { - data.AddRange(DataTypes.GetBool(predicate.BlockSet is not null)); - if (predicate.BlockSet is not null) - data.AddRange(predicate.BlockSet.Serialize()); - - data.AddRange(DataTypes.GetBool(predicate.Properties.Count > 0)); - if (predicate.Properties.Count > 0) - { - data.AddRange(DataTypes.GetVarInt(predicate.Properties.Count)); - foreach (var property in predicate.Properties) - data.AddRange(property.Serialize()); - } - - data.AddRange(DataTypes.GetBool(predicate.Nbt is not null)); - if (predicate.Nbt is not null) - data.AddRange(DataTypes.GetNbt(predicate.Nbt)); - - data.AddRange(DataTypes.GetVarInt(predicate.ExactComponents.Count)); - foreach (var component in predicate.ExactComponents) - { - if (component.TypeId < 0) - throw new ArgumentException("Exact predicate component is missing its data component type id.", nameof(component)); - - data.AddRange(DataTypes.GetVarInt(component.TypeId)); - data.AddRange(component.Serialize()); - } - - data.AddRange(DataTypes.GetVarInt(predicate.PartialPredicates.Count)); - foreach (var predicatePayload in predicate.PartialPredicates) - { - data.AddRange(DataTypes.GetVarInt(predicatePayload.TypeId)); - data.AddRange(DataTypes.GetNbt(predicatePayload.Payload)); - } - } -} - -public sealed record AdventureModeBlockPredicate1215( - BlockSetSubcomponent? BlockSet, - List Properties, - Dictionary? Nbt, - List ExactComponents, - List PartialPredicates); - -public sealed record DataComponentPredicatePayload1215(int TypeId, Dictionary Payload); diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/AttributeModifiersComponent1215.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/AttributeModifiersComponent1215.cs deleted file mode 100644 index f7371eac6c..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/AttributeModifiersComponent1215.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; - -public class AttributeModifiersComponent1215(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int NumberOfAttributes { get; set; } - public List Attributes { get; set; } = []; - - public override void Parse(Queue data) - { - NumberOfAttributes = DataTypes.ReadNextVarInt(data); - Attributes = new List(NumberOfAttributes); - - for (var i = 0; i < NumberOfAttributes; i++) - Attributes.Add(SubComponentRegistry.ParseSubComponent(SubComponents.Attribute, data)); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(NumberOfAttributes)); - - if (Attributes.Count != NumberOfAttributes) - throw new ArgumentNullException(nameof(Attributes), "Attributes count must match NumberOfAttributes."); - - foreach (var attribute in Attributes) - data.AddRange(attribute.Serialize()); - - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/BlocksAttacksComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/BlocksAttacksComponent.cs deleted file mode 100644 index 5c497bf411..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/BlocksAttacksComponent.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; - -public class BlocksAttacksComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public float BlockDelaySeconds { get; set; } - public float DisableCooldownScale { get; set; } - public List DamageReductions { get; set; } = []; - public float ItemDamageThreshold { get; set; } - public float ItemDamageBase { get; set; } - public float ItemDamageFactor { get; set; } - public string? BypassedBy { get; set; } - public SoundEventHolderData? BlockSound { get; set; } - public SoundEventHolderData? DisableSound { get; set; } - - public override void Parse(Queue data) - { - BlockDelaySeconds = DataTypes.ReadNextFloat(data); - DisableCooldownScale = DataTypes.ReadNextFloat(data); - - var reductionCount = DataTypes.ReadNextVarInt(data); - for (var i = 0; i < reductionCount; i++) - { - var horizontalBlockingAngle = DataTypes.ReadNextFloat(data); - - var hasTypeFilter = DataTypes.ReadNextBool(data); - var typeFilter = hasTypeFilter - ? StructuredComponentCodecHelpers.ReadHolderSet(DataTypes, data) - : null; - - var baseDmg = DataTypes.ReadNextFloat(data); - var factor = DataTypes.ReadNextFloat(data); - DamageReductions.Add(new DamageReductionData(horizontalBlockingAngle, typeFilter, baseDmg, factor)); - } - - ItemDamageThreshold = DataTypes.ReadNextFloat(data); - ItemDamageBase = DataTypes.ReadNextFloat(data); - ItemDamageFactor = DataTypes.ReadNextFloat(data); - - var hasBypassedBy = DataTypes.ReadNextBool(data); - if (hasBypassedBy) - BypassedBy = DataTypes.ReadNextString(data); // TagKey as ResourceLocation - - BlockSound = StructuredComponentCodecHelpers.ReadOptionalSoundEventHolder(DataTypes, data); - DisableSound = StructuredComponentCodecHelpers.ReadOptionalSoundEventHolder(DataTypes, data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetFloat(BlockDelaySeconds)); - data.AddRange(DataTypes.GetFloat(DisableCooldownScale)); - data.AddRange(DataTypes.GetVarInt(DamageReductions.Count)); - foreach (var reduction in DamageReductions) - { - data.AddRange(DataTypes.GetFloat(reduction.HorizontalBlockingAngle)); - data.AddRange(DataTypes.GetBool(reduction.Type is not null)); - if (reduction.Type is not null) - StructuredComponentCodecHelpers.WriteHolderSet(DataTypes, data, reduction.Type); - data.AddRange(DataTypes.GetFloat(reduction.Base)); - data.AddRange(DataTypes.GetFloat(reduction.Factor)); - } - - data.AddRange(DataTypes.GetFloat(ItemDamageThreshold)); - data.AddRange(DataTypes.GetFloat(ItemDamageBase)); - data.AddRange(DataTypes.GetFloat(ItemDamageFactor)); - data.AddRange(DataTypes.GetBool(BypassedBy is not null)); - if (BypassedBy is not null) - data.AddRange(DataTypes.GetString(BypassedBy)); - StructuredComponentCodecHelpers.WriteOptionalSoundEventHolder(DataTypes, data, BlockSound); - StructuredComponentCodecHelpers.WriteOptionalSoundEventHolder(DataTypes, data, DisableSound); - return new Queue(data); - } -} - -public sealed record DamageReductionData(float HorizontalBlockingAngle, HolderSetData? Type, float Base, float Factor); diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/DyeColorComponent1215.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/DyeColorComponent1215.cs deleted file mode 100644 index 7fa2453c2a..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/DyeColorComponent1215.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; - -/// -/// 1.21.5+ dyed_color only carries the RGB integer. -/// Tooltip visibility moved to minecraft:tooltip_display. -/// -public class DyeColorComponent1215(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int Color { get; set; } - - public override void Parse(Queue data) - { - Color = DataTypes.ReadNextInt(data); - } - - public override Queue Serialize() - { - return new Queue(DataTypes.GetInt(Color)); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/EitherHolderComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/EitherHolderComponent.cs deleted file mode 100644 index 352e5f3ec7..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/EitherHolderComponent.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; - -public class EitherHolderComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public bool IsHolder { get; set; } - public int HolderId { get; set; } - public string? ResourceKey { get; set; } - - public override void Parse(Queue data) - { - IsHolder = DataTypes.ReadNextBool(data); - if (IsHolder) - { - HolderId = DataTypes.ReadNextVarInt(data); - // For simple entity variants, holderId > 0 means registry ref (id = holderId - 1) - // holderId == 0 means inline data; for most variants the inline is just the variant fields - // We skip inline data since MCC doesn't use variant details - if (HolderId == 0) - { - // Read inline variant data - varies by type, but most are simple - // For chicken/variant specifically this might have additional fields - // We'll consume what we can based on the pattern - // TODO: If needed, specialize per variant type - } - } - else - { - ResourceKey = DataTypes.ReadNextString(data); - } - } - - public override Queue Serialize() - { - var bytes = new List(); - bytes.AddRange(DataTypes.GetBool(IsHolder)); - if (IsHolder) - { - bytes.AddRange(DataTypes.GetVarInt(HolderId)); - } - else - { - bytes.AddRange(DataTypes.GetString(ResourceKey ?? "")); - } - return new Queue(bytes); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/EnchantmentsComponent1215.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/EnchantmentsComponent1215.cs deleted file mode 100644 index 67633788a2..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/EnchantmentsComponent1215.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; - -/// -/// 1.21.5+ enchantments: showInTooltip removed from wire format (moved to tooltip_display component). -/// Wire: VarInt count, then (VarInt holder_id + VarInt level) per entry. No trailing boolean. -/// -public class EnchantmentsComponent1215(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : EnchantmentsComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public override void Parse(Queue data) - { - NumberOfEnchantments = DataTypes.ReadNextVarInt(data); - - for (var i = 0; i < NumberOfEnchantments; i++) - { - var registryId = DataTypes.ReadNextVarInt(data); - var level = DataTypes.ReadNextVarInt(data); - Enchantments.Add(new Enchantment(EnchantmentMapping.GetEnchantmentByRegistryId1206(DataTypes.ProtocolVersion, registryId), level)); - } - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Enchantments.Count)); - foreach (var enchantment in Enchantments) - { - data.AddRange(DataTypes.GetVarInt(EnchantmentMapping.GetRegistryId1206ByEnchantment(DataTypes.ProtocolVersion, enchantment.Type))); - data.AddRange(DataTypes.GetVarInt(enchantment.Level)); - } - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/EquippableComponent1215.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/EquippableComponent1215.cs deleted file mode 100644 index 4376574c51..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/EquippableComponent1215.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_21; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; - -public class EquippableComponent1215(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int Slot { get; set; } - public SoundEventSubComponent? EquipSound { get; set; } - public bool HasAssetId { get; set; } - public string? AssetId { get; set; } - public bool HasCameraOverlay { get; set; } - public string? CameraOverlay { get; set; } - public bool HasAllowedEntities { get; set; } - public int AllowedEntitiesType { get; set; } - public string? AllowedEntitiesTag { get; set; } - public List? AllowedEntitiesIds { get; set; } - public bool Dispensable { get; set; } - public bool Swappable { get; set; } - public bool DamageOnHurt { get; set; } - public bool EquipOnInteract { get; set; } - - public override void Parse(Queue data) - { - Slot = DataTypes.ReadNextVarInt(data); - EquipSound = (SoundEventSubComponent)SubComponentRegistry.ParseSubComponent(SubComponents.SoundEvent, data); - - HasAssetId = DataTypes.ReadNextBool(data); - if (HasAssetId) - AssetId = DataTypes.ReadNextString(data); - - HasCameraOverlay = DataTypes.ReadNextBool(data); - if (HasCameraOverlay) - CameraOverlay = DataTypes.ReadNextString(data); - - HasAllowedEntities = DataTypes.ReadNextBool(data); - if (HasAllowedEntities) - { - AllowedEntitiesType = DataTypes.ReadNextVarInt(data); - if (AllowedEntitiesType == 0) - { - AllowedEntitiesTag = DataTypes.ReadNextString(data); - AllowedEntitiesIds = null; - } - else - { - AllowedEntitiesTag = null; - AllowedEntitiesIds = new List(Math.Max(AllowedEntitiesType - 1, 0)); - for (var i = 0; i < AllowedEntitiesType - 1; i++) - AllowedEntitiesIds.Add(DataTypes.ReadNextVarInt(data)); - } - } - - Dispensable = DataTypes.ReadNextBool(data); - Swappable = DataTypes.ReadNextBool(data); - DamageOnHurt = DataTypes.ReadNextBool(data); - EquipOnInteract = DataTypes.ReadNextBool(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Slot)); - - if (EquipSound is null) - throw new ArgumentNullException(nameof(EquipSound), "EquipSound is required."); - - data.AddRange(EquipSound.Serialize()); - - data.AddRange(DataTypes.GetBool(HasAssetId)); - if (HasAssetId && AssetId is not null) - data.AddRange(DataTypes.GetString(AssetId)); - - data.AddRange(DataTypes.GetBool(HasCameraOverlay)); - if (HasCameraOverlay && CameraOverlay is not null) - data.AddRange(DataTypes.GetString(CameraOverlay)); - - data.AddRange(DataTypes.GetBool(HasAllowedEntities)); - if (HasAllowedEntities) - { - data.AddRange(DataTypes.GetVarInt(AllowedEntitiesType)); - if (AllowedEntitiesType == 0 && AllowedEntitiesTag is not null) - { - data.AddRange(DataTypes.GetString(AllowedEntitiesTag)); - } - else if (AllowedEntitiesIds is not null) - { - foreach (var id in AllowedEntitiesIds) - data.AddRange(DataTypes.GetVarInt(id)); - } - } - - data.AddRange(DataTypes.GetBool(Dispensable)); - data.AddRange(DataTypes.GetBool(Swappable)); - data.AddRange(DataTypes.GetBool(DamageOnHurt)); - data.AddRange(DataTypes.GetBool(EquipOnInteract)); - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/InstrumentComponent1215.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/InstrumentComponent1215.cs deleted file mode 100644 index beba31d82e..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/InstrumentComponent1215.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; - -public class InstrumentComponent1215(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public override void Parse(Queue data) - { - // EitherHolder: Bool + (Holder OR ResourceLocation) - var isHolder = DataTypes.ReadNextBool(data); - if (isHolder) - { - var holderId = DataTypes.ReadNextVarInt(data); - if (holderId == 0) - { - // Inline Instrument: SoundEvent holder + Float useDuration + Float range + Component description - var soundHolderId = DataTypes.ReadNextVarInt(data); - if (soundHolderId == 0) - { - DataTypes.ReadNextString(data); // ResourceLocation - var hasFixedRange = DataTypes.ReadNextBool(data); - if (hasFixedRange) - DataTypes.ReadNextFloat(data); - } - DataTypes.ReadNextFloat(data); // useDuration - DataTypes.ReadNextFloat(data); // range - // ComponentSerialization.STREAM_CODEC is NBT-backed, not a plain string. - DataTypes.ReadNextNbt(data); - } - } - else - { - DataTypes.ReadNextString(data); // ResourceLocation key - } - } - - public override Queue Serialize() - { - return new Queue(); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/JukeBoxPlayableComponent1215.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/JukeBoxPlayableComponent1215.cs deleted file mode 100644 index 10985e31b9..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/JukeBoxPlayableComponent1215.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_21; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; -using MinecraftClient.Protocol.Message; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; - -public class JukeBoxPlayableComponent1215(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public bool IsHolder { get; set; } - public int HolderId { get; set; } - public string? ResourceKey { get; set; } - public SoundEventSubComponent? SoundEvent { get; set; } - public Dictionary? DescriptionNbt { get; set; } - public string Description { get; set; } = string.Empty; - public float Duration { get; set; } - public int ComparatorOutput { get; set; } - - public override void Parse(Queue data) - { - IsHolder = DataTypes.ReadNextBool(data); - - if (IsHolder) - { - HolderId = DataTypes.ReadNextVarInt(data); - if (HolderId == 0) - { - SoundEvent = (SoundEventSubComponent)SubComponentRegistry.ParseSubComponent(SubComponents.SoundEvent, data); - DescriptionNbt = DataTypes.ReadNextNbt(data); - Description = ChatParser.ParseText(DescriptionNbt); - Duration = DataTypes.ReadNextFloat(data); - ComparatorOutput = DataTypes.ReadNextVarInt(data); - } - } - else - { - ResourceKey = DataTypes.ReadNextString(data); - } - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetBool(IsHolder)); - - if (IsHolder) - { - data.AddRange(DataTypes.GetVarInt(HolderId)); - if (HolderId == 0) - { - if (SoundEvent is null) - throw new ArgumentNullException(nameof(SoundEvent), "Inline jukebox song requires a sound event."); - - if (DescriptionNbt is null) - throw new ArgumentNullException(nameof(DescriptionNbt), "Inline jukebox song requires a description."); - - data.AddRange(SoundEvent.Serialize()); - data.AddRange(DataTypes.GetNbt(DescriptionNbt)); - data.AddRange(DataTypes.GetFloat(Duration)); - data.AddRange(DataTypes.GetVarInt(ComparatorOutput)); - } - } - else - { - if (string.IsNullOrEmpty(ResourceKey)) - throw new ArgumentNullException(nameof(ResourceKey), "Resource key is required for key-backed jukebox songs."); - - data.AddRange(DataTypes.GetString(ResourceKey)); - } - - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/PaintingVariantHolderComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/PaintingVariantHolderComponent.cs deleted file mode 100644 index 4e061f1320..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/PaintingVariantHolderComponent.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; - -public class PaintingVariantHolderComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public override void Parse(Queue data) - { - // Holder: VarInt discriminator - var holderId = DataTypes.ReadNextVarInt(data); - if (holderId == 0) - { - // Inline PaintingVariant: VarInt width + VarInt height + ResourceLocation assetId - DataTypes.ReadNextVarInt(data); // width - DataTypes.ReadNextVarInt(data); // height - DataTypes.ReadNextString(data); // assetId - - // Optional title - if (DataTypes.ReadNextBool(data)) - DataTypes.ReadNextNbt(data); - - // Optional author - if (DataTypes.ReadNextBool(data)) - DataTypes.ReadNextNbt(data); - } - } - - public override Queue Serialize() - { - return new Queue(); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/PotionDurationScaleComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/PotionDurationScaleComponent.cs deleted file mode 100644 index 88354b2cea..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/PotionDurationScaleComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; - -public class PotionDurationScaleComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public float Scale { get; set; } - - public override void Parse(Queue data) - { - Scale = DataTypes.ReadNextFloat(data); - } - - public override Queue Serialize() - { - var bytes = new List(); - bytes.AddRange(DataTypes.GetFloat(Scale)); - return new Queue(bytes); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/ProvidesBannerPatternsComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/ProvidesBannerPatternsComponent.cs deleted file mode 100644 index cc2356e144..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/ProvidesBannerPatternsComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; - -public class ProvidesBannerPatternsComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public string TagKey { get; set; } = string.Empty; - - public override void Parse(Queue data) - { - TagKey = DataTypes.ReadNextString(data); // ResourceLocation - } - - public override Queue Serialize() - { - var bytes = new List(); - bytes.AddRange(DataTypes.GetString(TagKey)); - return new Queue(bytes); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/ProvidesTrimMaterialComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/ProvidesTrimMaterialComponent.cs deleted file mode 100644 index f3ad9fac7d..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/ProvidesTrimMaterialComponent.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; - -public class ProvidesTrimMaterialComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public override void Parse(Queue data) - { - // EitherHolder: Bool + (Holder OR ResourceLocation) - var isHolder = DataTypes.ReadNextBool(data); - if (isHolder) - { - var holderId = DataTypes.ReadNextVarInt(data); - if (holderId == 0) - { - // Inline TrimMaterial: MaterialAssetGroup + Component description - // MaterialAssetGroup: string + map - DataTypes.ReadNextString(data); // base asset suffix - var overrideCount = DataTypes.ReadNextVarInt(data); - for (var i = 0; i < overrideCount; i++) - { - DataTypes.ReadNextString(data); // ResourceKey - DataTypes.ReadNextString(data); // override suffix - } - // ComponentSerialization.STREAM_CODEC is NBT-backed, not a plain string. - DataTypes.ReadNextNbt(data); - } - } - else - { - DataTypes.ReadNextString(data); // ResourceLocation key - } - } - - public override Queue Serialize() - { - return new Queue(); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/SoundEventHolderComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/SoundEventHolderComponent.cs deleted file mode 100644 index 8fe14f7d89..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/SoundEventHolderComponent.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; - -public class SoundEventHolderComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int HolderId { get; set; } - public string? SoundLocation { get; set; } - public bool HasFixedRange { get; set; } - public float FixedRange { get; set; } - - public override void Parse(Queue data) - { - HolderId = DataTypes.ReadNextVarInt(data); - if (HolderId == 0) - { - SoundLocation = DataTypes.ReadNextString(data); - HasFixedRange = DataTypes.ReadNextBool(data); - if (HasFixedRange) - FixedRange = DataTypes.ReadNextFloat(data); - } - } - - public override Queue Serialize() - { - var bytes = new List(); - bytes.AddRange(DataTypes.GetVarInt(HolderId)); - if (HolderId == 0) - { - bytes.AddRange(DataTypes.GetString(SoundLocation ?? "")); - bytes.AddRange(DataTypes.GetBool(HasFixedRange)); - if (HasFixedRange) - bytes.AddRange(DataTypes.GetFloat(FixedRange)); - } - return new Queue(bytes); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/StoredEnchantmentsComponent1215.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/StoredEnchantmentsComponent1215.cs deleted file mode 100644 index 8daf09eaf1..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/StoredEnchantmentsComponent1215.cs +++ /dev/null @@ -1,7 +0,0 @@ -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; - -public class StoredEnchantmentsComponent1215(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : EnchantmentsComponent1215(dataTypes, itemPalette, subComponentRegistry); diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/ToolComponent1215.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/ToolComponent1215.cs deleted file mode 100644 index c617fabd70..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/ToolComponent1215.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; - -public class ToolComponent1215(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int NumberOfRules { get; set; } - public List Rules { get; set; } = []; - public float DefaultMiningSpeed { get; set; } - public int DamagePerBlock { get; set; } - public bool CanDestroyBlocksInCreative { get; set; } - - public override void Parse(Queue data) - { - NumberOfRules = DataTypes.ReadNextVarInt(data); - Rules = new List(NumberOfRules); - - for (var i = 0; i < NumberOfRules; i++) - Rules.Add((RuleSubComponent)SubComponentRegistry.ParseSubComponent(SubComponents.Rule, data)); - - DefaultMiningSpeed = DataTypes.ReadNextFloat(data); - DamagePerBlock = DataTypes.ReadNextVarInt(data); - CanDestroyBlocksInCreative = DataTypes.ReadNextBool(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(NumberOfRules)); - - if (Rules.Count != NumberOfRules) - throw new ArgumentNullException(nameof(Rules), "Rules count must match NumberOfRules."); - - foreach (var rule in Rules) - data.AddRange(rule.Serialize()); - - data.AddRange(DataTypes.GetFloat(DefaultMiningSpeed)); - data.AddRange(DataTypes.GetVarInt(DamagePerBlock)); - data.AddRange(DataTypes.GetBool(CanDestroyBlocksInCreative)); - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/TooltipDisplayComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/TooltipDisplayComponent.cs deleted file mode 100644 index 859b3cbc16..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/TooltipDisplayComponent.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; - -public class TooltipDisplayComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public bool HideTooltip { get; set; } - public List HiddenComponentIds { get; set; } = []; - - public override void Parse(Queue data) - { - HideTooltip = DataTypes.ReadNextBool(data); - var count = DataTypes.ReadNextVarInt(data); - for (var i = 0; i < count; i++) - HiddenComponentIds.Add(DataTypes.ReadNextVarInt(data)); - } - - public override Queue Serialize() - { - var bytes = new List(); - bytes.AddRange(DataTypes.GetBool(HideTooltip)); - bytes.AddRange(DataTypes.GetVarInt(HiddenComponentIds.Count)); - foreach (var id in HiddenComponentIds) - bytes.AddRange(DataTypes.GetVarInt(id)); - return new Queue(bytes); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/TrimComponent1215.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/TrimComponent1215.cs deleted file mode 100644 index e1b1ebc978..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/TrimComponent1215.cs +++ /dev/null @@ -1,106 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; -using MinecraftClient.Protocol.Message; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; - -/// -/// 1.21.5+ trim uses ArmorTrim.STREAM_CODEC: -/// Holder<TrimMaterial> + Holder<TrimPattern>. -/// The holder codec is ByteBufCodecs.holder(), so 0 means direct inline data and non-zero means registry reference. -/// -public class TrimComponent1215(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int MaterialHolderValue { get; set; } - public DirectTrimMaterial1215? DirectMaterial { get; set; } - public int PatternHolderValue { get; set; } - public DirectTrimPattern1215? DirectPattern { get; set; } - - public override void Parse(Queue data) - { - MaterialHolderValue = DataTypes.ReadNextVarInt(data); - if (MaterialHolderValue == 0) - DirectMaterial = ParseDirectMaterial(data); - - PatternHolderValue = DataTypes.ReadNextVarInt(data); - if (PatternHolderValue == 0) - DirectPattern = ParseDirectPattern(data); - } - - public override Queue Serialize() - { - var data = new List(); - - data.AddRange(DataTypes.GetVarInt(MaterialHolderValue)); - if (MaterialHolderValue == 0) - { - if (DirectMaterial is null) - throw new ArgumentNullException(nameof(DirectMaterial), "Direct trim material payload is required when holder value is 0."); - - data.AddRange(DataTypes.GetString(DirectMaterial.BaseSuffix)); - data.AddRange(DataTypes.GetVarInt(DirectMaterial.OverrideSuffixes.Count)); - foreach (var (assetKey, suffix) in DirectMaterial.OverrideSuffixes) - { - data.AddRange(DataTypes.GetString(assetKey)); - data.AddRange(DataTypes.GetString(suffix)); - } - - data.AddRange(DataTypes.GetNbt(DirectMaterial.DescriptionNbt)); - } - - data.AddRange(DataTypes.GetVarInt(PatternHolderValue)); - if (PatternHolderValue == 0) - { - if (DirectPattern is null) - throw new ArgumentNullException(nameof(DirectPattern), "Direct trim pattern payload is required when holder value is 0."); - - data.AddRange(DataTypes.GetString(DirectPattern.AssetId)); - data.AddRange(DataTypes.GetNbt(DirectPattern.DescriptionNbt)); - data.AddRange(DataTypes.GetBool(DirectPattern.Decal)); - } - - return new Queue(data); - } - - private DirectTrimMaterial1215 ParseDirectMaterial(Queue data) - { - var baseSuffix = DataTypes.ReadNextString(data); - var overrideCount = DataTypes.ReadNextVarInt(data); - var overrideSuffixes = new Dictionary(overrideCount, StringComparer.Ordinal); - - for (var i = 0; i < overrideCount; i++) - { - var assetKey = DataTypes.ReadNextString(data); - var suffix = DataTypes.ReadNextString(data); - overrideSuffixes[assetKey] = suffix; - } - - var descriptionNbt = DataTypes.ReadNextNbt(data); - var description = ChatParser.ParseText(descriptionNbt); - return new DirectTrimMaterial1215(baseSuffix, overrideSuffixes, descriptionNbt, description); - } - - private DirectTrimPattern1215 ParseDirectPattern(Queue data) - { - var assetId = DataTypes.ReadNextString(data); - var descriptionNbt = DataTypes.ReadNextNbt(data); - var description = ChatParser.ParseText(descriptionNbt); - var decal = DataTypes.ReadNextBool(data); - return new DirectTrimPattern1215(assetId, descriptionNbt, description, decal); - } -} - -public sealed record DirectTrimMaterial1215( - string BaseSuffix, - Dictionary OverrideSuffixes, - Dictionary DescriptionNbt, - string Description); - -public sealed record DirectTrimPattern1215( - string AssetId, - Dictionary DescriptionNbt, - string Description, - bool Decal); diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/VarIntComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/VarIntComponent.cs deleted file mode 100644 index 38eebf96f6..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/VarIntComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; - -public class VarIntComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int Value { get; set; } - - public override void Parse(Queue data) - { - Value = DataTypes.ReadNextVarInt(data); - } - - public override Queue Serialize() - { - var bytes = new List(); - bytes.AddRange(DataTypes.GetVarInt(Value)); - return new Queue(bytes); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/WeaponComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/WeaponComponent.cs deleted file mode 100644 index f831e82bf3..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_5/WeaponComponent.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; - -public class WeaponComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int ItemDamagePerAttack { get; set; } - public float DisableBlockingForSeconds { get; set; } - - public override void Parse(Queue data) - { - ItemDamagePerAttack = DataTypes.ReadNextVarInt(data); - DisableBlockingForSeconds = DataTypes.ReadNextFloat(data); - } - - public override Queue Serialize() - { - var bytes = new List(); - bytes.AddRange(DataTypes.GetVarInt(ItemDamagePerAttack)); - bytes.AddRange(DataTypes.GetFloat(DisableBlockingForSeconds)); - return new Queue(bytes); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_8/AttributeModifiersComponent1218.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_8/AttributeModifiersComponent1218.cs deleted file mode 100644 index 92ce146e97..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_8/AttributeModifiersComponent1218.cs +++ /dev/null @@ -1,99 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; -using MinecraftClient.Protocol.Message; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_8; - -public class AttributeModifiersComponent1218(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int NumberOfAttributes { get; set; } - public List Attributes { get; set; } = []; - public List Displays { get; set; } = []; - - public override void Parse(Queue data) - { - NumberOfAttributes = DataTypes.ReadNextVarInt(data); - Attributes = new List(NumberOfAttributes); - Displays = new List(NumberOfAttributes); - - for (var i = 0; i < NumberOfAttributes; i++) - { - Attributes.Add(SubComponentRegistry.ParseSubComponent(SubComponents.Attribute, data)); - Displays.Add(ReadDisplay(data)); - } - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(NumberOfAttributes)); - - if (Attributes.Count != NumberOfAttributes) - throw new ArgumentNullException(nameof(Attributes), "Attributes count must match NumberOfAttributes."); - - if (Displays.Count != NumberOfAttributes) - throw new ArgumentNullException(nameof(Displays), "Displays count must match NumberOfAttributes."); - - for (var i = 0; i < NumberOfAttributes; i++) - { - data.AddRange(Attributes[i].Serialize()); - data.AddRange(SerializeDisplay(Displays[i])); - } - - return new Queue(data); - } - - private AttributeModifierDisplay ReadDisplay(Queue data) - { - var displayType = DataTypes.ReadNextVarInt(data); - return displayType switch - { - 0 => new AttributeModifierDisplay(AttributeModifierDisplayType.Default), - 1 => new AttributeModifierDisplay(AttributeModifierDisplayType.Hidden), - 2 => ReadOverrideDisplay(data), - _ => throw new InvalidDataException($"Unknown attribute modifier display type: {displayType}") - }; - } - - private AttributeModifierDisplay ReadOverrideDisplay(Queue data) - { - var overrideTextNbt = DataTypes.ReadNextNbt(data); - var overrideText = ChatParser.ParseText(overrideTextNbt); - return new AttributeModifierDisplay(AttributeModifierDisplayType.Override, overrideTextNbt, overrideText); - } - - private Queue SerializeDisplay(AttributeModifierDisplay display) - { - var data = new List - { - }; - data.AddRange(DataTypes.GetVarInt((int)display.Type)); - - if (display.Type == AttributeModifierDisplayType.Override) - { - if (display.OverrideTextNbt is null) - throw new ArgumentNullException(nameof(display.OverrideTextNbt), "Override display requires component NBT."); - - data.AddRange(DataTypes.GetNbt(display.OverrideTextNbt)); - } - - return new Queue(data); - } -} - -public sealed record AttributeModifierDisplay( - AttributeModifierDisplayType Type, - Dictionary? OverrideTextNbt = null, - string? OverrideText = null); - -public enum AttributeModifierDisplayType -{ - Default = 0, - Hidden = 1, - Override = 2 -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_8/EquippableComponent1218.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_8/EquippableComponent1218.cs deleted file mode 100644 index 224e1b05d3..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_8/EquippableComponent1218.cs +++ /dev/null @@ -1,113 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_21; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_8; - -public class EquippableComponent1218(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int Slot { get; set; } - public SoundEventSubComponent? EquipSound { get; set; } - public bool HasAssetId { get; set; } - public string? AssetId { get; set; } - public bool HasCameraOverlay { get; set; } - public string? CameraOverlay { get; set; } - public bool HasAllowedEntities { get; set; } - public int AllowedEntitiesType { get; set; } - public string? AllowedEntitiesTag { get; set; } - public List? AllowedEntitiesIds { get; set; } - public bool Dispensable { get; set; } - public bool Swappable { get; set; } - public bool DamageOnHurt { get; set; } - public bool EquipOnInteract { get; set; } - public bool CanBeSheared { get; set; } - public SoundEventSubComponent? ShearingSound { get; set; } - - public override void Parse(Queue data) - { - Slot = DataTypes.ReadNextVarInt(data); - EquipSound = (SoundEventSubComponent)SubComponentRegistry.ParseSubComponent(SubComponents.SoundEvent, data); - - HasAssetId = DataTypes.ReadNextBool(data); - if (HasAssetId) - AssetId = DataTypes.ReadNextString(data); - - HasCameraOverlay = DataTypes.ReadNextBool(data); - if (HasCameraOverlay) - CameraOverlay = DataTypes.ReadNextString(data); - - HasAllowedEntities = DataTypes.ReadNextBool(data); - if (HasAllowedEntities) - { - AllowedEntitiesType = DataTypes.ReadNextVarInt(data); - if (AllowedEntitiesType == 0) - { - AllowedEntitiesTag = DataTypes.ReadNextString(data); - AllowedEntitiesIds = null; - } - else - { - AllowedEntitiesTag = null; - AllowedEntitiesIds = new List(Math.Max(AllowedEntitiesType - 1, 0)); - for (var i = 0; i < AllowedEntitiesType - 1; i++) - AllowedEntitiesIds.Add(DataTypes.ReadNextVarInt(data)); - } - } - - Dispensable = DataTypes.ReadNextBool(data); - Swappable = DataTypes.ReadNextBool(data); - DamageOnHurt = DataTypes.ReadNextBool(data); - EquipOnInteract = DataTypes.ReadNextBool(data); - CanBeSheared = DataTypes.ReadNextBool(data); - ShearingSound = (SoundEventSubComponent)SubComponentRegistry.ParseSubComponent(SubComponents.SoundEvent, data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Slot)); - - if (EquipSound is null) - throw new ArgumentNullException(nameof(EquipSound), "EquipSound is required."); - - if (ShearingSound is null) - throw new ArgumentNullException(nameof(ShearingSound), "ShearingSound is required."); - - data.AddRange(EquipSound.Serialize()); - - data.AddRange(DataTypes.GetBool(HasAssetId)); - if (HasAssetId && AssetId is not null) - data.AddRange(DataTypes.GetString(AssetId)); - - data.AddRange(DataTypes.GetBool(HasCameraOverlay)); - if (HasCameraOverlay && CameraOverlay is not null) - data.AddRange(DataTypes.GetString(CameraOverlay)); - - data.AddRange(DataTypes.GetBool(HasAllowedEntities)); - if (HasAllowedEntities) - { - data.AddRange(DataTypes.GetVarInt(AllowedEntitiesType)); - if (AllowedEntitiesType == 0 && AllowedEntitiesTag is not null) - { - data.AddRange(DataTypes.GetString(AllowedEntitiesTag)); - } - else if (AllowedEntitiesIds is not null) - { - foreach (var id in AllowedEntitiesIds) - data.AddRange(DataTypes.GetVarInt(id)); - } - } - - data.AddRange(DataTypes.GetBool(Dispensable)); - data.AddRange(DataTypes.GetBool(Swappable)); - data.AddRange(DataTypes.GetBool(DamageOnHurt)); - data.AddRange(DataTypes.GetBool(EquipOnInteract)); - data.AddRange(DataTypes.GetBool(CanBeSheared)); - data.AddRange(ShearingSound.Serialize()); - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_9/BeesComponent1219.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_9/BeesComponent1219.cs deleted file mode 100644 index b8142caaac..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_21_9/BeesComponent1219.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_9; - -public class BeesComponent1219(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int NumberOfBees { get; set; } - public List Bees { get; set; } = []; - - public override void Parse(Queue data) - { - NumberOfBees = DataTypes.ReadNextVarInt(data); - Bees = new List(NumberOfBees); - - for (var i = 0; i < NumberOfBees; i++) - { - Bees.Add( - new TypedBee( - DataTypes.ReadNextVarInt(data), - DataTypes.ReadNextNbt(data), - DataTypes.ReadNextVarInt(data), - DataTypes.ReadNextVarInt(data))); - } - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(NumberOfBees)); - - if (NumberOfBees != Bees.Count) - throw new InvalidOperationException("Can't serialize the BeesComponent1219 because NumberOfBees and Bees.Count differ!"); - - foreach (var bee in Bees) - { - data.AddRange(DataTypes.GetVarInt(bee.EntityTypeId)); - data.AddRange(DataTypes.GetNbt(bee.EntityDataNbt)); - data.AddRange(DataTypes.GetVarInt(bee.TicksInHive)); - data.AddRange(DataTypes.GetVarInt(bee.MinTicksInHive)); - } - - return new Queue(data); - } -} - -public sealed record TypedBee(int EntityTypeId, Dictionary? EntityDataNbt, int TicksInHive, int MinTicksInHive); diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/ContainerComponent261.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/ContainerComponent261.cs deleted file mode 100644 index 87a83a4e08..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/ContainerComponent261.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._26_1; - -public class ContainerComponent261(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public List Items { get; set; } = []; - - public override void Parse(Queue data) - { - var count = DataTypes.ReadNextVarInt(data); - for (var i = 0; i < count; i++) - Items.Add(DataTypes.ReadNextBool(data) ? DataTypes.ReadNextItemStackTemplate(data, ItemPalette) : null); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Items.Count)); - foreach (var item in Items) - { - var hasItem = item is not null && !item.IsEmpty; - data.AddRange(DataTypes.GetBool(hasItem)); - if (hasItem) - data.AddRange(DataTypes.GetItemStackTemplate(item!, ItemPalette)); - } - - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/HolderSetComponent261.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/HolderSetComponent261.cs deleted file mode 100644 index 516117ab88..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/HolderSetComponent261.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._26_1; - -public class HolderSetComponent261(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public string? TagKey { get; set; } - public List HolderIds { get; } = []; - - public override void Parse(Queue data) - { - var count = DataTypes.ReadNextVarInt(data) - 1; - if (count == -1) - { - TagKey = DataTypes.ReadNextString(data); - return; - } - - for (var i = 0; i < count; i++) - HolderIds.Add(DataTypes.ReadNextVarInt(data)); - } - - public override Queue Serialize() - { - var bytes = new List(); - if (TagKey is not null) - { - bytes.AddRange(DataTypes.GetVarInt(0)); - bytes.AddRange(DataTypes.GetString(TagKey)); - return new Queue(bytes); - } - - bytes.AddRange(DataTypes.GetVarInt(HolderIds.Count + 1)); - foreach (var holderId in HolderIds) - bytes.AddRange(DataTypes.GetVarInt(holderId)); - - return new Queue(bytes); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/InstrumentComponent261.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/InstrumentComponent261.cs deleted file mode 100644 index 0f91f0b325..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/InstrumentComponent261.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._26_1; - -public class InstrumentComponent261(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int HolderId { get; set; } - - public override void Parse(Queue data) - { - HolderId = DataTypes.ReadNextVarInt(data); - if (HolderId != 0) - return; - - var soundHolderId = DataTypes.ReadNextVarInt(data); - if (soundHolderId == 0) - { - DataTypes.ReadNextString(data); // ResourceLocation - var hasFixedRange = DataTypes.ReadNextBool(data); - if (hasFixedRange) - DataTypes.ReadNextFloat(data); - } - - DataTypes.ReadNextFloat(data); // useDuration - DataTypes.ReadNextFloat(data); // range - DataTypes.ReadNextNbt(data); // ComponentSerialization.STREAM_CODEC - } - - public override Queue Serialize() - { - var bytes = new List(); - bytes.AddRange(DataTypes.GetVarInt(HolderId)); - return new Queue(bytes); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/ItemStackTemplateListComponent261.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/ItemStackTemplateListComponent261.cs deleted file mode 100644 index 7c7fdc74ca..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/ItemStackTemplateListComponent261.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._26_1; - -public class ItemStackTemplateListComponent261(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public List Items { get; set; } = []; - - public override void Parse(Queue data) - { - var count = DataTypes.ReadNextVarInt(data); - - for (var i = 0; i < count; i++) - Items.Add(DataTypes.ReadNextItemStackTemplate(data, ItemPalette)); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Items.Count)); - - foreach (var item in Items) - data.AddRange(DataTypes.GetItemStackTemplate(item, ItemPalette)); - - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/NbtTagComponent261.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/NbtTagComponent261.cs deleted file mode 100644 index 1c864dcfed..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/NbtTagComponent261.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._26_1; - -public class NbtTagComponent261(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public object? Tag { get; set; } - - public override void Parse(Queue data) - { - Tag = DataTypes.ReadNextNbtTag(data); - } - - public override Queue Serialize() - { - return new Queue(DataTypes.GetNbtTag(Tag)); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/ProvidesTrimMaterialComponent261.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/ProvidesTrimMaterialComponent261.cs deleted file mode 100644 index 7c76b44aa5..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/ProvidesTrimMaterialComponent261.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._26_1; - -public class ProvidesTrimMaterialComponent261(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int HolderId { get; set; } - - public override void Parse(Queue data) - { - HolderId = DataTypes.ReadNextVarInt(data); - if (HolderId != 0) - return; - - DataTypes.ReadNextString(data); // base asset suffix - - var overrideCount = DataTypes.ReadNextVarInt(data); - for (var i = 0; i < overrideCount; i++) - { - DataTypes.ReadNextString(data); // ResourceKey - DataTypes.ReadNextString(data); // override suffix - } - - DataTypes.ReadNextNbt(data); // ComponentSerialization.STREAM_CODEC - } - - public override Queue Serialize() - { - var bytes = new List(); - bytes.AddRange(DataTypes.GetVarInt(HolderId)); - return new Queue(bytes); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/TypedEntityDataComponent261.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/TypedEntityDataComponent261.cs deleted file mode 100644 index d05b147a5b..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/TypedEntityDataComponent261.cs +++ /dev/null @@ -1,13 +0,0 @@ -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._26_1; - -public class TypedEntityDataComponent261(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : TypedEntityDataComponent(dataTypes, itemPalette, subComponentRegistry) -{ } - -public class BlockEntityDataComponent261(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : TypedBlockEntityDataComponent(dataTypes, itemPalette, subComponentRegistry) -{ } diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/UseRemainderComponent261.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/UseRemainderComponent261.cs deleted file mode 100644 index e5b3323ea7..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_1/UseRemainderComponent261.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._26_1; - -public class UseRemainderComponent261(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public Item? ConvertInto { get; set; } - - public override void Parse(Queue data) - { - ConvertInto = DataTypes.ReadNextItemStackTemplate(data, ItemPalette); - } - - public override Queue Serialize() - { - var data = new List(); - if (ConvertInto is not null && !ConvertInto.IsEmpty) - data.AddRange(DataTypes.GetItemStackTemplate(ConvertInto, ItemPalette)); - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_2/SulfurCubeContentComponent262.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_2/SulfurCubeContentComponent262.cs deleted file mode 100644 index 282373d1b2..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/26_2/SulfurCubeContentComponent262.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._26_2; - -public class SulfurCubeContentComponent262(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public Item? AbsorbedBlockItemStack { get; set; } - - public override void Parse(Queue data) - { - AbsorbedBlockItemStack = DataTypes.ReadNextItemStackTemplate(data, ItemPalette); - } - - public override Queue Serialize() - { - var data = new List(); - if (AbsorbedBlockItemStack is not null && !AbsorbedBlockItemStack.IsEmpty) - data.AddRange(DataTypes.GetItemStackTemplate(AbsorbedBlockItemStack, ItemPalette)); - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/EmptyComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/EmptyComponent.cs deleted file mode 100644 index 8b49c90822..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/EmptyComponent.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components; - -public class EmptyComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public override void Parse(Queue data) - { - } - - public override Queue Serialize() - { - return new Queue(); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/StructuredComponentCodecHelpers.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/StructuredComponentCodecHelpers.cs deleted file mode 100644 index dc3fc21871..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/StructuredComponentCodecHelpers.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components; - -internal static class StructuredComponentCodecHelpers -{ - public static HolderSetData ReadHolderSet(DataTypes dataTypes, Queue data) - { - var sizeOrTag = dataTypes.ReadNextVarInt(data); - if (sizeOrTag == 0) - return new HolderSetData(dataTypes.ReadNextString(data), []); - - var count = sizeOrTag - 1; - var holderIds = new List(count); - for (var i = 0; i < count; i++) - holderIds.Add(dataTypes.ReadNextVarInt(data)); - - return new HolderSetData(null, holderIds); - } - - public static void WriteHolderSet(DataTypes dataTypes, List bytes, HolderSetData holderSet) - { - if (holderSet.Tag is not null) - { - bytes.AddRange(DataTypes.GetVarInt(0)); - bytes.AddRange(dataTypes.GetString(holderSet.Tag)); - return; - } - - bytes.AddRange(DataTypes.GetVarInt(holderSet.HolderIds.Count + 1)); - foreach (var holderId in holderSet.HolderIds) - bytes.AddRange(DataTypes.GetVarInt(holderId)); - } - - public static SoundEventHolderData ReadSoundEventHolder(DataTypes dataTypes, Queue data) - { - var holderId = dataTypes.ReadNextVarInt(data); - if (holderId != 0) - return new SoundEventHolderData(holderId, null, false, 0); - - var soundLocation = dataTypes.ReadNextString(data); - var hasFixedRange = dataTypes.ReadNextBool(data); - var fixedRange = hasFixedRange ? dataTypes.ReadNextFloat(data) : 0; - return new SoundEventHolderData(holderId, soundLocation, hasFixedRange, fixedRange); - } - - public static void WriteSoundEventHolder(DataTypes dataTypes, List bytes, SoundEventHolderData soundEvent) - { - bytes.AddRange(DataTypes.GetVarInt(soundEvent.HolderId)); - if (soundEvent.HolderId != 0) - return; - - bytes.AddRange(dataTypes.GetString(soundEvent.SoundLocation ?? "")); - bytes.AddRange(dataTypes.GetBool(soundEvent.HasFixedRange)); - if (soundEvent.HasFixedRange) - bytes.AddRange(dataTypes.GetFloat(soundEvent.FixedRange)); - } - - public static SoundEventHolderData? ReadOptionalSoundEventHolder(DataTypes dataTypes, Queue data) - { - return dataTypes.ReadNextBool(data) ? ReadSoundEventHolder(dataTypes, data) : null; - } - - public static void WriteOptionalSoundEventHolder(DataTypes dataTypes, List bytes, SoundEventHolderData? soundEvent) - { - bytes.AddRange(dataTypes.GetBool(soundEvent is not null)); - if (soundEvent is not null) - WriteSoundEventHolder(dataTypes, bytes, soundEvent); - } -} - -public sealed record HolderSetData(string? Tag, List HolderIds); - -public sealed record SoundEventHolderData(int HolderId, string? SoundLocation, bool HasFixedRange, float FixedRange); diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/AttributeSubComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/AttributeSubComponent.cs deleted file mode 100644 index 729053555f..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/AttributeSubComponent.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6; - -public class AttributeSubComponent(DataTypes dataTypes, SubComponentRegistry subComponentRegistry) : SubComponent(dataTypes, subComponentRegistry) -{ - public int TypeId { get; set; } - public Guid Uuid { get; set; } - public string? Name { get; set; } - public double Value { get; set; } - public int Operation { get; set; } - public int Slot { get; set; } - - protected override void Parse(Queue data) - { - TypeId = DataTypes.ReadNextVarInt(data); - Uuid = DataTypes.ReadNextUUID(data); - Name = DataTypes.ReadNextString(data); - Value = DataTypes.ReadNextDouble(data); - Operation = DataTypes.ReadNextVarInt(data); - Slot = DataTypes.ReadNextVarInt(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(TypeId)); - data.AddRange(DataTypes.GetUUID(Uuid)); - - if (string.IsNullOrEmpty(Name?.Trim())) - throw new ArgumentNullException($"Can not serialize AttributeSubComponent due to Name being null or empty!"); - - data.AddRange(DataTypes.GetString(Name)); - data.AddRange(DataTypes.GetDouble(Value)); - data.AddRange(DataTypes.GetVarInt(Operation)); - data.AddRange(DataTypes.GetVarInt(Slot)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/BlockPredicateSubcomponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/BlockPredicateSubcomponent.cs deleted file mode 100644 index 74639c6e75..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/BlockPredicateSubcomponent.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6; - -public class BlockPredicateSubcomponent(DataTypes dataTypes, SubComponentRegistry subComponentRegistry) : SubComponent(dataTypes, subComponentRegistry) -{ - public bool HasBlocks { get; set; } - public BlockSetSubcomponent? BlockSet { get; set; } - public bool HasProperities { get; set; } - public List? Properties { get; set; } - public bool HasNbt { get; set; } - public Dictionary? Nbt { get; set; } - - protected override void Parse(Queue data) - { - HasBlocks = DataTypes.ReadNextBool(data); - - if (HasBlocks) - BlockSet = (BlockSetSubcomponent)SubComponentRegistry.ParseSubComponent(SubComponents.BlockSet, data); - - HasProperities = DataTypes.ReadNextBool(data); - - if (HasProperities) - { - Properties = new(); - var numberOfProperties = DataTypes.ReadNextVarInt(data); - for (var i = 0; i < numberOfProperties; i++) - Properties.Add((PropertySubComponent)SubComponentRegistry.ParseSubComponent(SubComponents.Property, data)); - } - - HasNbt = DataTypes.ReadNextBool(data); - - if (HasNbt) - Nbt = DataTypes.ReadNextNbt(data); - } - - public override Queue Serialize() - { - var data = new List(); - - // Block Sets - data.AddRange(DataTypes.GetBool(HasBlocks)); - if (HasBlocks) - { - if (BlockSet is null) - throw new ArgumentNullException($"Can not serialize a BlockPredicate when the BlockSet is empty but HasBlocks is true!"); - - data.AddRange(BlockSet.Serialize()); - } - - // Properties - data.AddRange(DataTypes.GetBool(HasProperities)); - if (HasProperities) - { - if (Properties is null || Properties.Count == 0) - throw new ArgumentNullException($"Can not serialize a BlockPredicate when the Properties is empty but HasProperties is true!"); - - data.AddRange(DataTypes.GetVarInt(Properties.Count)); - foreach (var property in Properties) - data.AddRange(property.Serialize()); - } - - // NBT - data.AddRange(DataTypes.GetBool(HasNbt)); - if (HasNbt) - { - if (Nbt is null) - throw new ArgumentNullException($"Can not serialize a BlockPredicate when the Nbt is empty but HasNbt is true!"); - - data.AddRange(DataTypes.GetNbt(Nbt)); - } - - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/BlockSetSubcomponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/BlockSetSubcomponent.cs deleted file mode 100644 index 2fe1be6d44..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/BlockSetSubcomponent.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6; - -public class BlockSetSubcomponent(DataTypes dataTypes, SubComponentRegistry subComponentRegistry) : SubComponent(dataTypes, subComponentRegistry) -{ - public int Type { get; set; } - public string? TagName { get; set; } - public List? BlockIds { get; set; } - - protected override void Parse(Queue data) - { - Type = DataTypes.ReadNextVarInt(data); - - if (Type == 0) - TagName = DataTypes.ReadNextString(data); - - if (Type == 0) return; - - BlockIds = []; - - for (var i = 0; i < Type - 1; i++) - BlockIds.Add(DataTypes.ReadNextVarInt(data)); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Type)); - if (Type == 0) - { - if (string.IsNullOrEmpty(TagName?.Trim())) - throw new ArgumentNullException($"Can not serialize an empty tag name when the Block Set type is 0!"); - - data.AddRange(DataTypes.GetString(TagName)); - } - - if (Type == 0) return new Queue(data); - - if (BlockIds is null || BlockIds.Count == 0) - throw new ArgumentNullException($"Can not serialize an empty list of Block IDs in a Block Set when the type is not 0!"); - - for (var i = 0; i < Type - 1; i++) - data.AddRange(DataTypes.GetVarInt(BlockIds[i])); - - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/DetailsSubComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/DetailsSubComponent.cs deleted file mode 100644 index 05b3c91806..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/DetailsSubComponent.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6; - -public class DetailsSubComponent(DataTypes dataTypes, SubComponentRegistry subComponentRegistry) : SubComponent(dataTypes, subComponentRegistry) -{ - public int Amplifier { get; set; } - public int Duration { get; set; } - public bool Ambient { get; set; } - public bool ShowParticles { get; set; } - public bool ShowIcon { get; set; } - public bool HasHiddenEffects { get; set; } - public DetailsSubComponent? Detail { get; set; } - - protected override void Parse(Queue data) - { - Amplifier = DataTypes.ReadNextVarInt(data); - Duration = DataTypes.ReadNextVarInt(data); - Ambient = DataTypes.ReadNextBool(data); - ShowParticles = DataTypes.ReadNextBool(data); - ShowIcon = DataTypes.ReadNextBool(data); - HasHiddenEffects = DataTypes.ReadNextBool(data); - - if (HasHiddenEffects) - Detail = (DetailsSubComponent)SubComponentRegistry.ParseSubComponent(SubComponents.Details, data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Amplifier)); - data.AddRange(DataTypes.GetVarInt(Duration)); - data.AddRange(DataTypes.GetBool(Ambient)); - data.AddRange(DataTypes.GetBool(ShowParticles)); - data.AddRange(DataTypes.GetBool(ShowIcon)); - data.AddRange(DataTypes.GetBool(HasHiddenEffects)); - - if (HasHiddenEffects) - { - if (Detail is null) - throw new ArgumentNullException($"Can not serialize a DetailSubComponent1206 when the Detail is empty but HasHiddenEffects is true!"); - - data.AddRange(Detail.Serialize()); - } - - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/EffectSubComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/EffectSubComponent.cs deleted file mode 100644 index d17d43f086..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/EffectSubComponent.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6; - -public class EffectSubComponent(DataTypes dataTypes, SubComponentRegistry subComponentRegistry) : SubComponent(dataTypes, subComponentRegistry) -{ - public PotionEffectSubComponent TypeId { get; set; } = null!; - public float Probability { get; set; } - - protected override void Parse(Queue data) - { - TypeId = (PotionEffectSubComponent)SubComponentRegistry.ParseSubComponent(SubComponents.PotionEffect, data); - Probability = DataTypes.ReadNextFloat(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(TypeId.Serialize()); - data.AddRange(DataTypes.GetFloat(Probability)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/FireworkExplosionSubComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/FireworkExplosionSubComponent.cs deleted file mode 100644 index 8073964c16..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/FireworkExplosionSubComponent.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6; - -public class FireworkExplosionSubComponent(DataTypes dataTypes, SubComponentRegistry subComponentRegistry) : SubComponent(dataTypes, subComponentRegistry) -{ - public int Shape { get; set; } - public int NumberOfColors { get; set; } - public List Colors { get; set; } = []; - public int NumberOfFadeColors { get; set; } - public List FadeColors { get; set; } = []; - public bool HasTrail { get; set; } - public bool HasTwinkle { get; set; } - - protected override void Parse(Queue data) - { - Shape = DataTypes.ReadNextVarInt(data); - NumberOfColors = DataTypes.ReadNextVarInt(data); - - for (var i = 0; i < NumberOfColors; i++) - Colors.Add(DataTypes.ReadNextInt(data)); - - NumberOfFadeColors = DataTypes.ReadNextVarInt(data); - - for (var i = 0; i < NumberOfFadeColors; i++) - FadeColors.Add(DataTypes.ReadNextInt(data)); - - HasTrail = DataTypes.ReadNextBool(data); - HasTwinkle = DataTypes.ReadNextBool(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Shape)); - - data.AddRange(DataTypes.GetVarInt(NumberOfColors)); - if (NumberOfColors > 0) - { - if (NumberOfColors != Colors.Count) - throw new Exception("Can't serialize FireworkExplosionComponent because NumberOfColors and the length of Colors list differ!"); - - foreach (var color in Colors) - data.AddRange(DataTypes.GetInt(color)); - } - - data.AddRange(DataTypes.GetVarInt(NumberOfFadeColors)); - if (NumberOfFadeColors > 0) - { - if (NumberOfFadeColors != FadeColors.Count) - throw new Exception("Can't serialize FireworkExplosionComponent because NumberOfFadeColors and the length of FadeColors list differ!"); - - foreach (var fadeColor in FadeColors) - data.AddRange(DataTypes.GetInt(fadeColor)); - } - - data.AddRange(DataTypes.GetBool(HasTrail)); - data.AddRange(DataTypes.GetBool(HasTwinkle)); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/PotionEffectSubComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/PotionEffectSubComponent.cs deleted file mode 100644 index dc9e31f069..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/PotionEffectSubComponent.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6; - -public class PotionEffectSubComponent(DataTypes dataTypes, SubComponentRegistry subComponentRegistry) : SubComponent(dataTypes, subComponentRegistry) -{ - public int TypeId { get; set; } - public DetailsSubComponent Details { get; set; } = null!; - - protected override void Parse(Queue data) - { - TypeId = DataTypes.ReadNextVarInt(data); - Details = (DetailsSubComponent)SubComponentRegistry.ParseSubComponent(SubComponents.Details, data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(TypeId)); - data.AddRange(Details.Serialize()); - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/PropertySubComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/PropertySubComponent.cs deleted file mode 100644 index 52e187702d..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/PropertySubComponent.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6; - -public class PropertySubComponent(DataTypes dataTypes, SubComponentRegistry subComponentRegistry) : SubComponent(dataTypes, subComponentRegistry) -{ - public string? Name { get; set; } - public bool IsExactMatch { get; set; } - public string? ExactValue { get; set; } - public string? MinValue { get; set; } - public string? MaxValue { get; set; } - - protected override void Parse(Queue data) - { - Name = DataTypes.ReadNextString(data); - IsExactMatch = DataTypes.ReadNextBool(data); - - if (IsExactMatch) - { - ExactValue = DataTypes.ReadNextString(data); - } - else - { - MinValue = DataTypes.ReadNextBool(data) ? DataTypes.ReadNextString(data) : null; - MaxValue = DataTypes.ReadNextBool(data) ? DataTypes.ReadNextString(data) : null; - } - } - - public override Queue Serialize() - { - var data = new List(); - - if (string.IsNullOrEmpty(Name?.Trim())) - throw new ArgumentNullException($"Can not serialize a Property sub-component if the Name is null or empty!"); - - data.AddRange(DataTypes.GetString(Name)); - data.AddRange(DataTypes.GetBool(IsExactMatch)); - - if (IsExactMatch) - { - if (string.IsNullOrEmpty(ExactValue?.Trim())) - throw new ArgumentNullException($"Can not serialize a Property sub-component if the ExactValue is null or empty when the type is Exact Match!"); - - data.AddRange(DataTypes.GetString(ExactValue)); - } - else - { - data.AddRange(DataTypes.GetBool(MinValue is not null)); - if (MinValue is not null) - data.AddRange(DataTypes.GetString(MinValue)); - - data.AddRange(DataTypes.GetBool(MaxValue is not null)); - if (MaxValue is not null) - data.AddRange(DataTypes.GetString(MaxValue)); - } - - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/RuleSubComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/RuleSubComponent.cs deleted file mode 100644 index 74565c9b8b..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_20_6/RuleSubComponent.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6; - -public class RuleSubComponent(DataTypes dataTypes, SubComponentRegistry subComponentRegistry) : SubComponent(dataTypes, subComponentRegistry) -{ - public BlockSetSubcomponent Blocks { get; set; } = null!; - public bool HasSpeed { get; set; } - public float Speed { get; set; } - public bool HasCorrectDropForBlocks { get; set; } - public bool CorrectDropForBlocks { get; set; } - - protected override void Parse(Queue data) - { - Blocks = (BlockSetSubcomponent)SubComponentRegistry.ParseSubComponent(SubComponents.BlockSet, data); - HasSpeed = DataTypes.ReadNextBool(data); - - if (HasSpeed) - Speed = DataTypes.ReadNextFloat(data); - - HasCorrectDropForBlocks = DataTypes.ReadNextBool(data); - - if (HasCorrectDropForBlocks) - CorrectDropForBlocks = DataTypes.ReadNextBool(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(Blocks.Serialize()); - data.AddRange(DataTypes.GetBool(HasSpeed)); - if (HasSpeed) - data.AddRange(DataTypes.GetFloat(Speed)); - - data.AddRange(DataTypes.GetBool(HasCorrectDropForBlocks)); - if (HasCorrectDropForBlocks) - data.AddRange(DataTypes.GetBool(CorrectDropForBlocks)); - - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_21/AttributeSubComponent121.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_21/AttributeSubComponent121.cs deleted file mode 100644 index 60bc94dc41..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_21/AttributeSubComponent121.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_21; - -public class AttributeSubComponent121(DataTypes dataTypes, SubComponentRegistry subComponentRegistry) : SubComponent(dataTypes, subComponentRegistry) -{ - public int TypeId { get; set; } - public string? ResourceLocation { get; set; } - public double Value { get; set; } - public int Operation { get; set; } - public int Slot { get; set; } - - protected override void Parse(Queue data) - { - TypeId = DataTypes.ReadNextVarInt(data); - ResourceLocation = DataTypes.ReadNextString(data); - Value = DataTypes.ReadNextDouble(data); - Operation = DataTypes.ReadNextVarInt(data); - Slot = DataTypes.ReadNextVarInt(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(TypeId)); - - if (string.IsNullOrEmpty(ResourceLocation?.Trim())) - throw new ArgumentNullException($"Can not serialize AttributeSubComponent121 due to ResourceLocation being null or empty!"); - - data.AddRange(DataTypes.GetString(ResourceLocation)); - data.AddRange(DataTypes.GetDouble(Value)); - data.AddRange(DataTypes.GetVarInt(Operation)); - data.AddRange(DataTypes.GetVarInt(Slot)); - return new Queue(data); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_21/SoundEventSubComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_21/SoundEventSubComponent.cs deleted file mode 100644 index 2c2885c803..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_21/SoundEventSubComponent.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_21; - -public class SoundEventSubComponent(DataTypes dataTypes, SubComponentRegistry subComponentRegistry) : SubComponent(dataTypes, subComponentRegistry) -{ - public int Type { get; set; } - public string? SoundName { get; set; } - public bool HasFixedRange { get; set; } - public float FixedRange { get; set; } - - protected override void Parse(Queue data) - { - Type = DataTypes.ReadNextVarInt(data); - - if (Type != 0) return; - - SoundName = DataTypes.ReadNextString(data); - HasFixedRange = DataTypes.ReadNextBool(data); - - if (HasFixedRange) - FixedRange = DataTypes.ReadNextFloat(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(Type)); - - if (Type != 0) return new Queue(data); - - if (string.IsNullOrEmpty(SoundName?.Trim())) - throw new ArgumentNullException($"Can not serialize SoundEventSubComponent due to SoundName being null or empty!"); - - data.AddRange(DataTypes.GetString(SoundName)); - data.AddRange(DataTypes.GetBool(HasFixedRange)); - - if (HasFixedRange) - data.AddRange(DataTypes.GetFloat(FixedRange)); - - return new Queue(data); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/SubComponents.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/SubComponents.cs deleted file mode 100644 index 9fdc974cf4..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/SubComponents.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; - -public abstract class SubComponents -{ - public const string BlockPredicate = "BlockPredicate"; - public const string BlockSet = "BlockSet"; - public const string Property = "Property"; - public const string Attribute = "Attribute"; - public const string Effect = "Effect"; - public const string PotionEffect = "PotionEffect"; - public const string Details = "Details"; - public const string Rule = "Rule"; - public const string FireworkExplosion = "FireworkExplosion"; - public const string SoundEvent = "SoundEvent"; -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/TypedEntityDataComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/TypedEntityDataComponent.cs deleted file mode 100644 index ab7ae279e1..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/TypedEntityDataComponent.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components; - -public class TypedEntityDataComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) -{ - public int EntityTypeId { get; set; } - public Dictionary? Nbt { get; set; } - - public override void Parse(Queue data) - { - EntityTypeId = DataTypes.ReadNextVarInt(data); - Nbt = DataTypes.ReadNextNbt(data); - } - - public override Queue Serialize() - { - var data = new List(); - data.AddRange(DataTypes.GetVarInt(EntityTypeId)); - data.AddRange(DataTypes.GetNbt(Nbt)); - return new Queue(data); - } -} - -public class TypedBlockEntityDataComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : TypedEntityDataComponent(dataTypes, itemPalette, subComponentRegistry) -{ } diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Core/StructuredComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Core/StructuredComponent.cs deleted file mode 100644 index 5fa5f82ddc..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Core/StructuredComponent.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Collections.Generic; -using System.Text.Json.Serialization; -using MinecraftClient.Inventory.ItemPalettes; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -public abstract class StructuredComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) -{ - protected DataTypes DataTypes { get; private set; } = dataTypes; - protected SubComponentRegistry SubComponentRegistry { get; private set; } = subComponentRegistry; - protected ItemPalette ItemPalette { get; private set; } = itemPalette; - - /// - /// The registry type ID assigned during parsing, used for round-trip serialization. - /// - [JsonIgnore] - public int TypeId { get; set; } = -1; - - /// - /// The registry name assigned during parsing (e.g. "minecraft:custom_data"), used for NBT serialization. - /// - [JsonIgnore] - public string ComponentName { get; set; } = string.Empty; - - public abstract void Parse(Queue data); - public abstract Queue Serialize(); -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Core/StructuredComponentRegistry.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Core/StructuredComponentRegistry.cs deleted file mode 100644 index 805f2a79a0..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Core/StructuredComponentRegistry.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -public abstract class StructuredComponentRegistry(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) -{ - private Dictionary ComponentParsers { get; } = new(); - private Dictionary IdToComponent { get; } = new(); - private Dictionary ComponentToId { get; } = new(); - - protected void RegisterComponent(int id, string name) where T : StructuredComponent - { - if (string.IsNullOrEmpty(name) || string.IsNullOrWhiteSpace(name)) - throw new ArgumentNullException(nameof(name)); - - name = name.ToLower(); - - if (ComponentParsers.ContainsKey(name) || IdToComponent.ContainsValue(name) - || ComponentToId.ContainsKey(name) || IdToComponent.ContainsKey(id)) - throw new InvalidOperationException($"A component with name '{name}' or id '{id}' is already registered."); - - ComponentParsers[name] = typeof(T); - IdToComponent[id] = name; - ComponentToId[name] = id; - } - - public StructuredComponent ParseComponent(int id, Queue data) - { - if (IdToComponent.TryGetValue(id, out var name)) - { - if (ComponentParsers.TryGetValue(name, out var type)) - { - var component = - Activator.CreateInstance(type, dataTypes, itemPalette, subComponentRegistry) as StructuredComponent - ?? throw new InvalidOperationException($"Could not instantiate a parser for a structured component type {name}"); - - component.TypeId = id; - component.ComponentName = name; - component.Parse(data); - return component; - } - } - - throw new Exception($"No parser found for component with ID {id}"); - } - - public string GetComponentNameById(int id) - { - if (IdToComponent.TryGetValue(id, out var value)) - return value; - - throw new Exception($"No component found for ID {id}"); - } - - public int GetComponentIdByName(string name) - { - name = name.ToLower(); - - if (ComponentToId.TryGetValue(name, out var value)) - return value; - - throw new Exception($"No ID found for component {name}"); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Core/SubComponent.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Core/SubComponent.cs deleted file mode 100644 index be235a9163..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Core/SubComponent.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Collections.Generic; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -public abstract class SubComponent(DataTypes dataTypes, SubComponentRegistry subComponentRegistry) -{ - protected DataTypes DataTypes { get; private set; } = dataTypes; - protected SubComponentRegistry SubComponentRegistry { get; private set; } = subComponentRegistry; - - protected abstract void Parse(Queue data); - public abstract Queue Serialize(); -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Core/SubComponentRegistry.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Core/SubComponentRegistry.cs deleted file mode 100644 index 0da8120b63..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Core/SubComponentRegistry.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Reflection; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -public abstract class SubComponentRegistry(DataTypes dataTypes) -{ - private readonly Dictionary _subComponentParsers = new(); - - protected void RegisterSubComponent(string name) where T : SubComponent - { - if (_subComponentParsers.TryGetValue(name, out _)) - throw new Exception($"Sub component {name} already registered!"); - - _subComponentParsers.Add(name, typeof(T)); - } - - protected void ReplaceSubComponent(string name) where T : SubComponent - { - _subComponentParsers[name] = typeof(T); - } - - public SubComponent ParseSubComponent(string name, Queue data) - { - if (!_subComponentParsers.TryGetValue(name, out var subComponentParserType)) - throw new Exception($"Sub component {name} not registered!"); - - var instance = Activator.CreateInstance(subComponentParserType, dataTypes, this) as SubComponent ?? - throw new InvalidOperationException($"Could not create instance of a sub component parser type: {subComponentParserType.Name}"); - - var parseMethod = instance.GetType().GetMethod("Parse", BindingFlags.Instance | BindingFlags.NonPublic); - - if (parseMethod is null) - throw new InvalidOperationException($"Sub component parser type {subComponentParserType.Name} does not have a Parse method."); - - parseMethod.Invoke(instance, new object[] { data }); - return instance; - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry1206.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry1206.cs deleted file mode 100644 index 8f5dee2e29..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry1206.cs +++ /dev/null @@ -1,69 +0,0 @@ -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Registries; - -public class StructuredComponentsRegistry1206 : StructuredComponentRegistry -{ - public StructuredComponentsRegistry1206(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : base(dataTypes, itemPalette, subComponentRegistry) - { - RegisterComponent(0, "minecraft:custom_data"); - RegisterComponent(1, "minecraft:max_stack_size"); - RegisterComponent(2, "minecraft:max_damage"); - RegisterComponent(3, "minecraft:damage"); - RegisterComponent(4, "minecraft:unbreakable"); - RegisterComponent(5, "minecraft:custom_name"); - RegisterComponent(6, "minecraft:item_name"); - RegisterComponent(7, "minecraft:lore"); - RegisterComponent(8, "minecraft:rarity"); - RegisterComponent(9, "minecraft:enchantments"); - RegisterComponent(10, "minecraft:can_place_on"); - RegisterComponent(11, "minecraft:can_break"); - RegisterComponent(12, "minecraft:attribute_modifiers"); - RegisterComponent(13, "minecraft:custom_model_data"); - RegisterComponent(14, "minecraft:hide_additional_tooltip"); - RegisterComponent(15, "minecraft:hide_tooltip"); - RegisterComponent(16, "minecraft:repair_cost"); - RegisterComponent(17, "minecraft:creative_slot_lock"); - RegisterComponent(18, "minecraft:enchantment_glint_override"); - RegisterComponent(19, "minecraft:intangible_projectile"); - RegisterComponent(20, "minecraft:food"); - RegisterComponent(21, "minecraft:fire_resistant"); - RegisterComponent(22, "minecraft:tool"); - RegisterComponent(23, "minecraft:stored_enchantments"); - RegisterComponent(24, "minecraft:dyed_color"); - RegisterComponent(25, "minecraft:map_color"); - RegisterComponent(26, "minecraft:map_id"); - RegisterComponent(27, "minecraft:map_decorations"); - RegisterComponent(28, "minecraft:map_post_processing"); - RegisterComponent(29, "minecraft:charged_projectiles"); - RegisterComponent(30, "minecraft:bundle_contents"); - RegisterComponent(31, "minecraft:potion_contents"); - RegisterComponent(32, "minecraft:suspicious_stew_effects"); - RegisterComponent(33, "minecraft:writable_book_content"); - RegisterComponent(34, "minecraft:written_book_content"); - RegisterComponent(35, "minecraft:trim"); - RegisterComponent(36, "minecraft:debug_stick_state"); - RegisterComponent(37, "minecraft:entity_data"); - RegisterComponent(38, "minecraft:bucket_entity_data"); - RegisterComponent(39, "minecraft:block_entity_data"); - RegisterComponent(40, "minecraft:instrument"); - RegisterComponent(41, "minecraft:ominous_bottle_amplifier"); - RegisterComponent(42, "minecraft:recipes"); - RegisterComponent(43, "minecraft:lodestone_tracker"); - RegisterComponent(44, "minecraft:firework_explosion"); - RegisterComponent(45, "minecraft:fireworks"); - RegisterComponent(46, "minecraft:profile"); - RegisterComponent(47, "minecraft:note_block_sound"); - RegisterComponent(48, "minecraft:banner_patterns"); - RegisterComponent(49, "minecraft:base_color"); - RegisterComponent(50, "minecraft:pot_decorations"); - RegisterComponent(51, "minecraft:container"); - RegisterComponent(52, "minecraft:block_state"); - RegisterComponent(53, "minecraft:bees"); - RegisterComponent(54, "minecraft:lock"); - RegisterComponent(55, "minecraft:container_loot"); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry121.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry121.cs deleted file mode 100644 index 5e22bd7862..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry121.cs +++ /dev/null @@ -1,71 +0,0 @@ -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Registries; - -public class StructuredComponentsRegistry121 : StructuredComponentRegistry -{ - public StructuredComponentsRegistry121(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : base(dataTypes, itemPalette, subComponentRegistry) - { - RegisterComponent(0, "minecraft:custom_data"); - RegisterComponent(1, "minecraft:max_stack_size"); - RegisterComponent(2, "minecraft:max_damage"); - RegisterComponent(3, "minecraft:damage"); - RegisterComponent(4, "minecraft:unbreakable"); - RegisterComponent(5, "minecraft:custom_name"); - RegisterComponent(6, "minecraft:item_name"); - RegisterComponent(7, "minecraft:lore"); - RegisterComponent(8, "minecraft:rarity"); - RegisterComponent(9, "minecraft:enchantments"); - RegisterComponent(10, "minecraft:can_place_on"); - RegisterComponent(11, "minecraft:can_break"); - RegisterComponent(12, "minecraft:attribute_modifiers"); - RegisterComponent(13, "minecraft:custom_model_data"); - RegisterComponent(14, "minecraft:hide_additional_tooltip"); - RegisterComponent(15, "minecraft:hide_tooltip"); - RegisterComponent(16, "minecraft:repair_cost"); - RegisterComponent(17, "minecraft:creative_slot_lock"); - RegisterComponent(18, "minecraft:enchantment_glint_override"); - RegisterComponent(19, "minecraft:intangible_projectile"); - RegisterComponent(20, "minecraft:food"); - RegisterComponent(21, "minecraft:fire_resistant"); - RegisterComponent(22, "minecraft:tool"); - RegisterComponent(23, "minecraft:stored_enchantments"); - RegisterComponent(24, "minecraft:dyed_color"); - RegisterComponent(25, "minecraft:map_color"); - RegisterComponent(26, "minecraft:map_id"); - RegisterComponent(27, "minecraft:map_decorations"); - RegisterComponent(28, "minecraft:map_post_processing"); - RegisterComponent(29, "minecraft:charged_projectiles"); - RegisterComponent(30, "minecraft:bundle_contents"); - RegisterComponent(31, "minecraft:potion_contents"); - RegisterComponent(32, "minecraft:suspicious_stew_effects"); - RegisterComponent(33, "minecraft:writable_book_content"); - RegisterComponent(34, "minecraft:written_book_content"); - RegisterComponent(35, "minecraft:trim"); - RegisterComponent(36, "minecraft:debug_stick_state"); - RegisterComponent(37, "minecraft:entity_data"); - RegisterComponent(38, "minecraft:bucket_entity_data"); - RegisterComponent(39, "minecraft:block_entity_data"); - RegisterComponent(40, "minecraft:instrument"); - RegisterComponent(41, "minecraft:ominous_bottle_amplifier"); - RegisterComponent(42, "minecraft:jukebox_playable"); - RegisterComponent(43, "minecraft:recipes"); - RegisterComponent(44, "minecraft:lodestone_tracker"); - RegisterComponent(45, "minecraft:firework_explosion"); - RegisterComponent(46, "minecraft:fireworks"); - RegisterComponent(47, "minecraft:profile"); - RegisterComponent(48, "minecraft:note_block_sound"); - RegisterComponent(49, "minecraft:banner_patterns"); - RegisterComponent(50, "minecraft:base_color"); - RegisterComponent(51, "minecraft:pot_decorations"); - RegisterComponent(52, "minecraft:container"); - RegisterComponent(53, "minecraft:block_state"); - RegisterComponent(54, "minecraft:bees"); - RegisterComponent(55, "minecraft:lock"); - RegisterComponent(56, "minecraft:container_loot"); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry12111.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry12111.cs deleted file mode 100644 index 0be0c7d2ad..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry12111.cs +++ /dev/null @@ -1,126 +0,0 @@ -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_2; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_8; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_9; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_11; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._26_1; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Registries; - -public class StructuredComponentsRegistry12111 : StructuredComponentRegistry -{ - public StructuredComponentsRegistry12111(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : base(dataTypes, itemPalette, subComponentRegistry) - { - RegisterComponent(0, "minecraft:custom_data"); - RegisterComponent(1, "minecraft:max_stack_size"); - RegisterComponent(2, "minecraft:max_damage"); - RegisterComponent(3, "minecraft:damage"); - RegisterComponent(4, "minecraft:unbreakable"); - RegisterComponent(5, "minecraft:use_effects"); - RegisterComponent(6, "minecraft:custom_name"); - RegisterComponent(7, "minecraft:minimum_attack_charge"); - RegisterComponent(8, "minecraft:damage_type"); - RegisterComponent(9, "minecraft:item_name"); - RegisterComponent(10, "minecraft:item_model"); - RegisterComponent(11, "minecraft:lore"); - RegisterComponent(12, "minecraft:rarity"); - RegisterComponent(13, "minecraft:enchantments"); - RegisterComponent(14, "minecraft:can_place_on"); - RegisterComponent(15, "minecraft:can_break"); - RegisterComponent(16, "minecraft:attribute_modifiers"); - RegisterComponent(17, "minecraft:custom_model_data"); - RegisterComponent(18, "minecraft:tooltip_display"); - RegisterComponent(19, "minecraft:repair_cost"); - RegisterComponent(20, "minecraft:creative_slot_lock"); - RegisterComponent(21, "minecraft:enchantment_glint_override"); - RegisterComponent(22, "minecraft:intangible_projectile"); - RegisterComponent(23, "minecraft:food"); - RegisterComponent(24, "minecraft:consumable"); - RegisterComponent(25, "minecraft:use_remainder"); - RegisterComponent(26, "minecraft:use_cooldown"); - RegisterComponent(27, "minecraft:damage_resistant"); - RegisterComponent(28, "minecraft:tool"); - RegisterComponent(29, "minecraft:weapon"); - RegisterComponent(30, "minecraft:attack_range"); - RegisterComponent(31, "minecraft:enchantable"); - RegisterComponent(32, "minecraft:equippable"); - RegisterComponent(33, "minecraft:repairable"); - RegisterComponent(34, "minecraft:glider"); - RegisterComponent(35, "minecraft:tooltip_style"); - RegisterComponent(36, "minecraft:death_protection"); - RegisterComponent(37, "minecraft:blocks_attacks"); - RegisterComponent(38, "minecraft:piercing_weapon"); - RegisterComponent(39, "minecraft:kinetic_weapon"); - RegisterComponent(40, "minecraft:swing_animation"); - RegisterComponent(41, "minecraft:stored_enchantments"); - RegisterComponent(42, "minecraft:dyed_color"); - RegisterComponent(43, "minecraft:map_color"); - RegisterComponent(44, "minecraft:map_id"); - RegisterComponent(45, "minecraft:map_decorations"); - RegisterComponent(46, "minecraft:map_post_processing"); - RegisterComponent(47, "minecraft:charged_projectiles"); - RegisterComponent(48, "minecraft:bundle_contents"); - RegisterComponent(49, "minecraft:potion_contents"); - RegisterComponent(50, "minecraft:potion_duration_scale"); - RegisterComponent(51, "minecraft:suspicious_stew_effects"); - RegisterComponent(52, "minecraft:writable_book_content"); - RegisterComponent(53, "minecraft:written_book_content"); - RegisterComponent(54, "minecraft:trim"); - RegisterComponent(55, "minecraft:debug_stick_state"); - RegisterComponent(56, "minecraft:entity_data"); - RegisterComponent(57, "minecraft:bucket_entity_data"); - RegisterComponent(58, "minecraft:block_entity_data"); - RegisterComponent(59, "minecraft:instrument"); - RegisterComponent(60, "minecraft:provides_trim_material"); - RegisterComponent(61, "minecraft:ominous_bottle_amplifier"); - RegisterComponent(62, "minecraft:jukebox_playable"); - RegisterComponent(63, "minecraft:provides_banner_patterns"); - RegisterComponent(64, "minecraft:recipes"); - RegisterComponent(65, "minecraft:lodestone_tracker"); - RegisterComponent(66, "minecraft:firework_explosion"); - RegisterComponent(67, "minecraft:fireworks"); - RegisterComponent(68, "minecraft:profile"); - RegisterComponent(69, "minecraft:note_block_sound"); - RegisterComponent(70, "minecraft:banner_patterns"); - RegisterComponent(71, "minecraft:base_color"); - RegisterComponent(72, "minecraft:pot_decorations"); - RegisterComponent(73, "minecraft:container"); - RegisterComponent(74, "minecraft:block_state"); - RegisterComponent(75, "minecraft:bees"); - RegisterComponent(76, "minecraft:lock"); - RegisterComponent(77, "minecraft:container_loot"); - - RegisterComponent(78, "minecraft:break_sound"); - RegisterComponent(79, "minecraft:villager/variant"); - RegisterComponent(80, "minecraft:wolf/variant"); - RegisterComponent(81, "minecraft:wolf/sound_variant"); - RegisterComponent(82, "minecraft:wolf/collar"); - RegisterComponent(83, "minecraft:fox/variant"); - RegisterComponent(84, "minecraft:salmon/size"); - RegisterComponent(85, "minecraft:parrot/variant"); - RegisterComponent(86, "minecraft:tropical_fish/pattern"); - RegisterComponent(87, "minecraft:tropical_fish/base_color"); - RegisterComponent(88, "minecraft:tropical_fish/pattern_color"); - RegisterComponent(89, "minecraft:mooshroom/variant"); - RegisterComponent(90, "minecraft:rabbit/variant"); - RegisterComponent(91, "minecraft:pig/variant"); - RegisterComponent(92, "minecraft:cow/variant"); - RegisterComponent(93, "minecraft:chicken/variant"); - RegisterComponent(94, "minecraft:zombie_nautilus/variant"); - RegisterComponent(95, "minecraft:frog/variant"); - RegisterComponent(96, "minecraft:horse/variant"); - RegisterComponent(97, "minecraft:painting/variant"); - RegisterComponent(98, "minecraft:llama/variant"); - RegisterComponent(99, "minecraft:axolotl/variant"); - RegisterComponent(100, "minecraft:cat/variant"); - RegisterComponent(101, "minecraft:cat/collar"); - RegisterComponent(102, "minecraft:sheep/color"); - RegisterComponent(103, "minecraft:shulker/color"); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry1212.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry1212.cs deleted file mode 100644 index ffe89d0f4a..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry1212.cs +++ /dev/null @@ -1,85 +0,0 @@ -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_2; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Registries; - -public class StructuredComponentsRegistry1212 : StructuredComponentRegistry -{ - public StructuredComponentsRegistry1212(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : base(dataTypes, itemPalette, subComponentRegistry) - { - RegisterComponent(0, "minecraft:custom_data"); - RegisterComponent(1, "minecraft:max_stack_size"); - RegisterComponent(2, "minecraft:max_damage"); - RegisterComponent(3, "minecraft:damage"); - RegisterComponent(4, "minecraft:unbreakable"); - RegisterComponent(5, "minecraft:custom_name"); - RegisterComponent(6, "minecraft:item_name"); - RegisterComponent(7, "minecraft:item_model"); - RegisterComponent(8, "minecraft:lore"); - RegisterComponent(9, "minecraft:rarity"); - RegisterComponent(10, "minecraft:enchantments"); - RegisterComponent(11, "minecraft:can_place_on"); - RegisterComponent(12, "minecraft:can_break"); - RegisterComponent(13, "minecraft:attribute_modifiers"); - if (dataTypes.ProtocolVersion >= Protocol18Handler.MC_1_21_4_Version) - RegisterComponent(14, "minecraft:custom_model_data"); - else - RegisterComponent(14, "minecraft:custom_model_data"); - RegisterComponent(15, "minecraft:hide_additional_tooltip"); - RegisterComponent(16, "minecraft:hide_tooltip"); - RegisterComponent(17, "minecraft:repair_cost"); - RegisterComponent(18, "minecraft:creative_slot_lock"); - RegisterComponent(19, "minecraft:enchantment_glint_override"); - RegisterComponent(20, "minecraft:intangible_projectile"); - RegisterComponent(21, "minecraft:food"); - RegisterComponent(22, "minecraft:consumable"); - RegisterComponent(23, "minecraft:use_remainder"); - RegisterComponent(24, "minecraft:use_cooldown"); - RegisterComponent(25, "minecraft:damage_resistant"); - RegisterComponent(26, "minecraft:tool"); - RegisterComponent(27, "minecraft:enchantable"); - RegisterComponent(28, "minecraft:equippable"); - RegisterComponent(29, "minecraft:repairable"); - RegisterComponent(30, "minecraft:glider"); - RegisterComponent(31, "minecraft:tooltip_style"); - RegisterComponent(32, "minecraft:death_protection"); - RegisterComponent(33, "minecraft:stored_enchantments"); - RegisterComponent(34, "minecraft:dyed_color"); - RegisterComponent(35, "minecraft:map_color"); - RegisterComponent(36, "minecraft:map_id"); - RegisterComponent(37, "minecraft:map_decorations"); - RegisterComponent(38, "minecraft:map_post_processing"); - RegisterComponent(39, "minecraft:charged_projectiles"); - RegisterComponent(40, "minecraft:bundle_contents"); - RegisterComponent(41, "minecraft:potion_contents"); - RegisterComponent(42, "minecraft:suspicious_stew_effects"); - RegisterComponent(43, "minecraft:writable_book_content"); - RegisterComponent(44, "minecraft:written_book_content"); - RegisterComponent(45, "minecraft:trim"); - RegisterComponent(46, "minecraft:debug_stick_state"); - RegisterComponent(47, "minecraft:entity_data"); - RegisterComponent(48, "minecraft:bucket_entity_data"); - RegisterComponent(49, "minecraft:block_entity_data"); - RegisterComponent(50, "minecraft:instrument"); - RegisterComponent(51, "minecraft:ominous_bottle_amplifier"); - RegisterComponent(52, "minecraft:jukebox_playable"); - RegisterComponent(53, "minecraft:recipes"); - RegisterComponent(54, "minecraft:lodestone_tracker"); - RegisterComponent(55, "minecraft:firework_explosion"); - RegisterComponent(56, "minecraft:fireworks"); - RegisterComponent(57, "minecraft:profile"); - RegisterComponent(58, "minecraft:note_block_sound"); - RegisterComponent(59, "minecraft:banner_patterns"); - RegisterComponent(60, "minecraft:base_color"); - RegisterComponent(61, "minecraft:pot_decorations"); - RegisterComponent(62, "minecraft:container"); - RegisterComponent(63, "minecraft:block_state"); - RegisterComponent(64, "minecraft:bees"); - RegisterComponent(65, "minecraft:lock"); - RegisterComponent(66, "minecraft:container_loot"); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry1215.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry1215.cs deleted file mode 100644 index d78d87b950..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry1215.cs +++ /dev/null @@ -1,138 +0,0 @@ -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_2; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_8; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_9; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_11; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Registries; - -public class StructuredComponentsRegistry1215 : StructuredComponentRegistry -{ - public StructuredComponentsRegistry1215(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : base(dataTypes, itemPalette, subComponentRegistry) - { - var uses1216AttributeAndEquippableFormats = dataTypes.ProtocolVersion >= Protocol18Handler.MC_1_21_6_Version; - var usesTypedBeesFormat = dataTypes.ProtocolVersion >= Protocol18Handler.MC_1_21_9_Version; - var usesTypedEntityDataFormat = dataTypes.ProtocolVersion >= Protocol18Handler.MC_1_21_9_Version; - - RegisterComponent(0, "minecraft:custom_data"); - RegisterComponent(1, "minecraft:max_stack_size"); - RegisterComponent(2, "minecraft:max_damage"); - RegisterComponent(3, "minecraft:damage"); - RegisterComponent(4, "minecraft:unbreakable"); // Changed from Unbreakable (Bool) to Unit (empty) in 1.21.5 - RegisterComponent(5, "minecraft:custom_name"); - RegisterComponent(6, "minecraft:item_name"); - RegisterComponent(7, "minecraft:item_model"); - RegisterComponent(8, "minecraft:lore"); - RegisterComponent(9, "minecraft:rarity"); - RegisterComponent(10, "minecraft:enchantments"); - RegisterComponent(11, "minecraft:can_place_on"); - RegisterComponent(12, "minecraft:can_break"); - if (uses1216AttributeAndEquippableFormats) - RegisterComponent(13, "minecraft:attribute_modifiers"); - else - RegisterComponent(13, "minecraft:attribute_modifiers"); - RegisterComponent(14, "minecraft:custom_model_data"); - // 15: tooltip_display (NEW, replaces hide_additional_tooltip + hide_tooltip) - RegisterComponent(15, "minecraft:tooltip_display"); - RegisterComponent(16, "minecraft:repair_cost"); - RegisterComponent(17, "minecraft:creative_slot_lock"); - RegisterComponent(18, "minecraft:enchantment_glint_override"); - RegisterComponent(19, "minecraft:intangible_projectile"); - RegisterComponent(20, "minecraft:food"); - RegisterComponent(21, "minecraft:consumable"); - RegisterComponent(22, "minecraft:use_remainder"); - RegisterComponent(23, "minecraft:use_cooldown"); - RegisterComponent(24, "minecraft:damage_resistant"); - RegisterComponent(25, "minecraft:tool"); - RegisterComponent(26, "minecraft:weapon"); // NEW - RegisterComponent(27, "minecraft:enchantable"); - if (uses1216AttributeAndEquippableFormats) - RegisterComponent(28, "minecraft:equippable"); - else - RegisterComponent(28, "minecraft:equippable"); - RegisterComponent(29, "minecraft:repairable"); - RegisterComponent(30, "minecraft:glider"); - RegisterComponent(31, "minecraft:tooltip_style"); - RegisterComponent(32, "minecraft:death_protection"); - RegisterComponent(33, "minecraft:blocks_attacks"); // NEW - RegisterComponent(34, "minecraft:stored_enchantments"); - RegisterComponent(35, "minecraft:dyed_color"); - RegisterComponent(36, "minecraft:map_color"); - RegisterComponent(37, "minecraft:map_id"); - RegisterComponent(38, "minecraft:map_decorations"); - RegisterComponent(39, "minecraft:map_post_processing"); - RegisterComponent(40, "minecraft:charged_projectiles"); - RegisterComponent(41, "minecraft:bundle_contents"); - RegisterComponent(42, "minecraft:potion_contents"); - RegisterComponent(43, "minecraft:potion_duration_scale"); // NEW - RegisterComponent(44, "minecraft:suspicious_stew_effects"); - RegisterComponent(45, "minecraft:writable_book_content"); - RegisterComponent(46, "minecraft:written_book_content"); - RegisterComponent(47, "minecraft:trim"); - RegisterComponent(48, "minecraft:debug_stick_state"); - if (usesTypedEntityDataFormat) - RegisterComponent(49, "minecraft:entity_data"); - else - RegisterComponent(49, "minecraft:entity_data"); - RegisterComponent(50, "minecraft:bucket_entity_data"); - if (usesTypedEntityDataFormat) - RegisterComponent(51, "minecraft:block_entity_data"); - else - RegisterComponent(51, "minecraft:block_entity_data"); - RegisterComponent(52, "minecraft:instrument"); // Changed to EitherHolder in 1.21.5 - RegisterComponent(53, "minecraft:provides_trim_material"); // NEW - RegisterComponent(54, "minecraft:ominous_bottle_amplifier"); - RegisterComponent(55, "minecraft:jukebox_playable"); - RegisterComponent(56, "minecraft:provides_banner_patterns"); // NEW - RegisterComponent(57, "minecraft:recipes"); - RegisterComponent(58, "minecraft:lodestone_tracker"); - RegisterComponent(59, "minecraft:firework_explosion"); - RegisterComponent(60, "minecraft:fireworks"); - RegisterComponent(61, "minecraft:profile"); - RegisterComponent(62, "minecraft:note_block_sound"); - RegisterComponent(63, "minecraft:banner_patterns"); - RegisterComponent(64, "minecraft:base_color"); - RegisterComponent(65, "minecraft:pot_decorations"); - RegisterComponent(66, "minecraft:container"); - RegisterComponent(67, "minecraft:block_state"); - if (usesTypedBeesFormat) - RegisterComponent(68, "minecraft:bees"); - else - RegisterComponent(68, "minecraft:bees"); - RegisterComponent(69, "minecraft:lock"); - RegisterComponent(70, "minecraft:container_loot"); - - // Entity variant components (NEW in 1.21.5) - RegisterComponent(71, "minecraft:break_sound"); - RegisterComponent(72, "minecraft:villager/variant"); - RegisterComponent(73, "minecraft:wolf/variant"); - RegisterComponent(74, "minecraft:wolf/sound_variant"); - RegisterComponent(75, "minecraft:wolf/collar"); // DyeColor as VarInt - RegisterComponent(76, "minecraft:fox/variant"); - RegisterComponent(77, "minecraft:salmon/size"); - RegisterComponent(78, "minecraft:parrot/variant"); - RegisterComponent(79, "minecraft:tropical_fish/pattern"); - RegisterComponent(80, "minecraft:tropical_fish/base_color"); // DyeColor - RegisterComponent(81, "minecraft:tropical_fish/pattern_color"); // DyeColor - RegisterComponent(82, "minecraft:mooshroom/variant"); - RegisterComponent(83, "minecraft:rabbit/variant"); - RegisterComponent(84, "minecraft:pig/variant"); - RegisterComponent(85, "minecraft:cow/variant"); - RegisterComponent(86, "minecraft:chicken/variant"); // EitherHolder - RegisterComponent(87, "minecraft:frog/variant"); - RegisterComponent(88, "minecraft:horse/variant"); - RegisterComponent(89, "minecraft:painting/variant"); // Holder - RegisterComponent(90, "minecraft:llama/variant"); - RegisterComponent(91, "minecraft:axolotl/variant"); - RegisterComponent(92, "minecraft:cat/variant"); - RegisterComponent(93, "minecraft:cat/collar"); // DyeColor - RegisterComponent(94, "minecraft:sheep/color"); // DyeColor - RegisterComponent(95, "minecraft:shulker/color"); // DyeColor - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry261.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry261.cs deleted file mode 100644 index c0b4281d1f..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry261.cs +++ /dev/null @@ -1,132 +0,0 @@ -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_2; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_8; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_9; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_11; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._26_1; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Registries; - -public class StructuredComponentsRegistry261 : StructuredComponentRegistry -{ - public StructuredComponentsRegistry261(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : base(dataTypes, itemPalette, subComponentRegistry) - { - RegisterComponent(0, "minecraft:custom_data"); - RegisterComponent(1, "minecraft:max_stack_size"); - RegisterComponent(2, "minecraft:max_damage"); - RegisterComponent(3, "minecraft:damage"); - RegisterComponent(4, "minecraft:unbreakable"); - RegisterComponent(5, "minecraft:use_effects"); - RegisterComponent(6, "minecraft:custom_name"); - RegisterComponent(7, "minecraft:minimum_attack_charge"); - RegisterComponent(8, "minecraft:damage_type"); - RegisterComponent(9, "minecraft:item_name"); - RegisterComponent(10, "minecraft:item_model"); - RegisterComponent(11, "minecraft:lore"); - RegisterComponent(12, "minecraft:rarity"); - RegisterComponent(13, "minecraft:enchantments"); - RegisterComponent(14, "minecraft:can_place_on"); - RegisterComponent(15, "minecraft:can_break"); - RegisterComponent(16, "minecraft:attribute_modifiers"); - RegisterComponent(17, "minecraft:custom_model_data"); - RegisterComponent(18, "minecraft:tooltip_display"); - RegisterComponent(19, "minecraft:repair_cost"); - RegisterComponent(20, "minecraft:creative_slot_lock"); - RegisterComponent(21, "minecraft:enchantment_glint_override"); - RegisterComponent(22, "minecraft:intangible_projectile"); - RegisterComponent(23, "minecraft:food"); - RegisterComponent(24, "minecraft:consumable"); - RegisterComponent(25, "minecraft:use_remainder"); - RegisterComponent(26, "minecraft:use_cooldown"); - RegisterComponent(27, "minecraft:damage_resistant"); - RegisterComponent(28, "minecraft:tool"); - RegisterComponent(29, "minecraft:weapon"); - RegisterComponent(30, "minecraft:attack_range"); - RegisterComponent(31, "minecraft:enchantable"); - RegisterComponent(32, "minecraft:equippable"); - RegisterComponent(33, "minecraft:repairable"); - RegisterComponent(34, "minecraft:glider"); - RegisterComponent(35, "minecraft:tooltip_style"); - RegisterComponent(36, "minecraft:death_protection"); - RegisterComponent(37, "minecraft:blocks_attacks"); - RegisterComponent(38, "minecraft:piercing_weapon"); - RegisterComponent(39, "minecraft:kinetic_weapon"); - RegisterComponent(40, "minecraft:swing_animation"); - RegisterComponent(41, "minecraft:additional_trade_cost"); // New in 26.1 - RegisterComponent(42, "minecraft:stored_enchantments"); - RegisterComponent(43, "minecraft:dye"); // New in 26.1 - RegisterComponent(44, "minecraft:dyed_color"); - RegisterComponent(45, "minecraft:map_color"); - RegisterComponent(46, "minecraft:map_id"); - RegisterComponent(47, "minecraft:map_decorations"); - RegisterComponent(48, "minecraft:map_post_processing"); - RegisterComponent(49, "minecraft:charged_projectiles"); - RegisterComponent(50, "minecraft:bundle_contents"); - RegisterComponent(51, "minecraft:potion_contents"); - RegisterComponent(52, "minecraft:potion_duration_scale"); - RegisterComponent(53, "minecraft:suspicious_stew_effects"); - RegisterComponent(54, "minecraft:writable_book_content"); - RegisterComponent(55, "minecraft:written_book_content"); - RegisterComponent(56, "minecraft:trim"); - RegisterComponent(57, "minecraft:debug_stick_state"); - RegisterComponent(58, "minecraft:entity_data"); - RegisterComponent(59, "minecraft:bucket_entity_data"); - RegisterComponent(60, "minecraft:block_entity_data"); - RegisterComponent(61, "minecraft:instrument"); - RegisterComponent(62, "minecraft:provides_trim_material"); - RegisterComponent(63, "minecraft:ominous_bottle_amplifier"); - RegisterComponent(64, "minecraft:jukebox_playable"); - RegisterComponent(65, "minecraft:provides_banner_patterns"); - RegisterComponent(66, "minecraft:recipes"); - RegisterComponent(67, "minecraft:lodestone_tracker"); - RegisterComponent(68, "minecraft:firework_explosion"); - RegisterComponent(69, "minecraft:fireworks"); - RegisterComponent(70, "minecraft:profile"); - RegisterComponent(71, "minecraft:note_block_sound"); - RegisterComponent(72, "minecraft:banner_patterns"); - RegisterComponent(73, "minecraft:base_color"); - RegisterComponent(74, "minecraft:pot_decorations"); - RegisterComponent(75, "minecraft:container"); - RegisterComponent(76, "minecraft:block_state"); - RegisterComponent(77, "minecraft:bees"); - RegisterComponent(78, "minecraft:lock"); - RegisterComponent(79, "minecraft:container_loot"); - - RegisterComponent(80, "minecraft:break_sound"); - RegisterComponent(81, "minecraft:villager/variant"); - RegisterComponent(82, "minecraft:wolf/variant"); - RegisterComponent(83, "minecraft:wolf/sound_variant"); - RegisterComponent(84, "minecraft:wolf/collar"); - RegisterComponent(85, "minecraft:fox/variant"); - RegisterComponent(86, "minecraft:salmon/size"); - RegisterComponent(87, "minecraft:parrot/variant"); - RegisterComponent(88, "minecraft:tropical_fish/pattern"); - RegisterComponent(89, "minecraft:tropical_fish/base_color"); - RegisterComponent(90, "minecraft:tropical_fish/pattern_color"); - RegisterComponent(91, "minecraft:mooshroom/variant"); - RegisterComponent(92, "minecraft:rabbit/variant"); - RegisterComponent(93, "minecraft:pig/variant"); - RegisterComponent(94, "minecraft:pig/sound_variant"); // New in 26.1 - RegisterComponent(95, "minecraft:cow/variant"); - RegisterComponent(96, "minecraft:cow/sound_variant"); // New in 26.1 - RegisterComponent(97, "minecraft:chicken/variant"); - RegisterComponent(98, "minecraft:chicken/sound_variant"); // New in 26.1 - RegisterComponent(99, "minecraft:zombie_nautilus/variant"); - RegisterComponent(100, "minecraft:frog/variant"); - RegisterComponent(101, "minecraft:horse/variant"); - RegisterComponent(102, "minecraft:painting/variant"); - RegisterComponent(103, "minecraft:llama/variant"); - RegisterComponent(104, "minecraft:axolotl/variant"); - RegisterComponent(105, "minecraft:cat/variant"); - RegisterComponent(106, "minecraft:cat/sound_variant"); // New in 26.1 - RegisterComponent(107, "minecraft:cat/collar"); - RegisterComponent(108, "minecraft:sheep/color"); - RegisterComponent(109, "minecraft:shulker/color"); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry262.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry262.cs deleted file mode 100644 index 85d04ee913..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry262.cs +++ /dev/null @@ -1,134 +0,0 @@ -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_2; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_8; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_9; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_11; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._26_1; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._26_2; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Registries; - -public class StructuredComponentsRegistry262 : StructuredComponentRegistry -{ - public StructuredComponentsRegistry262(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) - : base(dataTypes, itemPalette, subComponentRegistry) - { - RegisterComponent(0, "minecraft:custom_data"); - RegisterComponent(1, "minecraft:max_stack_size"); - RegisterComponent(2, "minecraft:max_damage"); - RegisterComponent(3, "minecraft:damage"); - RegisterComponent(4, "minecraft:unbreakable"); - RegisterComponent(5, "minecraft:use_effects"); - RegisterComponent(6, "minecraft:custom_name"); - RegisterComponent(7, "minecraft:minimum_attack_charge"); - RegisterComponent(8, "minecraft:damage_type"); - RegisterComponent(9, "minecraft:item_name"); - RegisterComponent(10, "minecraft:item_model"); - RegisterComponent(11, "minecraft:lore"); - RegisterComponent(12, "minecraft:rarity"); - RegisterComponent(13, "minecraft:enchantments"); - RegisterComponent(14, "minecraft:can_place_on"); - RegisterComponent(15, "minecraft:can_break"); - RegisterComponent(16, "minecraft:attribute_modifiers"); - RegisterComponent(17, "minecraft:custom_model_data"); - RegisterComponent(18, "minecraft:tooltip_display"); - RegisterComponent(19, "minecraft:repair_cost"); - RegisterComponent(20, "minecraft:creative_slot_lock"); - RegisterComponent(21, "minecraft:enchantment_glint_override"); - RegisterComponent(22, "minecraft:intangible_projectile"); - RegisterComponent(23, "minecraft:food"); - RegisterComponent(24, "minecraft:consumable"); - RegisterComponent(25, "minecraft:use_remainder"); - RegisterComponent(26, "minecraft:use_cooldown"); - RegisterComponent(27, "minecraft:damage_resistant"); - RegisterComponent(28, "minecraft:tool"); - RegisterComponent(29, "minecraft:weapon"); - RegisterComponent(30, "minecraft:attack_range"); - RegisterComponent(31, "minecraft:enchantable"); - RegisterComponent(32, "minecraft:equippable"); - RegisterComponent(33, "minecraft:repairable"); - RegisterComponent(34, "minecraft:glider"); - RegisterComponent(35, "minecraft:tooltip_style"); - RegisterComponent(36, "minecraft:death_protection"); - RegisterComponent(37, "minecraft:blocks_attacks"); - RegisterComponent(38, "minecraft:piercing_weapon"); - RegisterComponent(39, "minecraft:kinetic_weapon"); - RegisterComponent(40, "minecraft:swing_animation"); - RegisterComponent(41, "minecraft:additional_trade_cost"); // New in 26.1 - RegisterComponent(42, "minecraft:stored_enchantments"); - RegisterComponent(43, "minecraft:dye"); // New in 26.1 - RegisterComponent(44, "minecraft:dyed_color"); - RegisterComponent(45, "minecraft:map_color"); - RegisterComponent(46, "minecraft:map_id"); - RegisterComponent(47, "minecraft:map_decorations"); - RegisterComponent(48, "minecraft:map_post_processing"); - RegisterComponent(49, "minecraft:charged_projectiles"); - RegisterComponent(50, "minecraft:bundle_contents"); - RegisterComponent(51, "minecraft:potion_contents"); - RegisterComponent(52, "minecraft:potion_duration_scale"); - RegisterComponent(53, "minecraft:suspicious_stew_effects"); - RegisterComponent(54, "minecraft:writable_book_content"); - RegisterComponent(55, "minecraft:written_book_content"); - RegisterComponent(56, "minecraft:trim"); - RegisterComponent(57, "minecraft:debug_stick_state"); - RegisterComponent(58, "minecraft:entity_data"); - RegisterComponent(59, "minecraft:bucket_entity_data"); - RegisterComponent(60, "minecraft:block_entity_data"); - RegisterComponent(61, "minecraft:instrument"); - RegisterComponent(62, "minecraft:provides_trim_material"); - RegisterComponent(63, "minecraft:ominous_bottle_amplifier"); - RegisterComponent(64, "minecraft:jukebox_playable"); - RegisterComponent(65, "minecraft:provides_banner_patterns"); - RegisterComponent(66, "minecraft:recipes"); - RegisterComponent(67, "minecraft:lodestone_tracker"); - RegisterComponent(68, "minecraft:firework_explosion"); - RegisterComponent(69, "minecraft:fireworks"); - RegisterComponent(70, "minecraft:profile"); - RegisterComponent(71, "minecraft:note_block_sound"); - RegisterComponent(72, "minecraft:banner_patterns"); - RegisterComponent(73, "minecraft:base_color"); - RegisterComponent(74, "minecraft:pot_decorations"); - RegisterComponent(75, "minecraft:container"); - RegisterComponent(76, "minecraft:block_state"); - RegisterComponent(77, "minecraft:bees"); - RegisterComponent(78, "minecraft:sulfur_cube_content"); // New in 26.2 - RegisterComponent(79, "minecraft:lock"); - RegisterComponent(80, "minecraft:container_loot"); - - RegisterComponent(81, "minecraft:break_sound"); - RegisterComponent(82, "minecraft:villager/variant"); - RegisterComponent(83, "minecraft:wolf/variant"); - RegisterComponent(84, "minecraft:wolf/sound_variant"); - RegisterComponent(85, "minecraft:wolf/collar"); - RegisterComponent(86, "minecraft:fox/variant"); - RegisterComponent(87, "minecraft:salmon/size"); - RegisterComponent(88, "minecraft:parrot/variant"); - RegisterComponent(89, "minecraft:tropical_fish/pattern"); - RegisterComponent(90, "minecraft:tropical_fish/base_color"); - RegisterComponent(91, "minecraft:tropical_fish/pattern_color"); - RegisterComponent(92, "minecraft:mooshroom/variant"); - RegisterComponent(93, "minecraft:rabbit/variant"); - RegisterComponent(94, "minecraft:pig/variant"); - RegisterComponent(95, "minecraft:pig/sound_variant"); // New in 26.1 - RegisterComponent(96, "minecraft:cow/variant"); - RegisterComponent(97, "minecraft:cow/sound_variant"); // New in 26.1 - RegisterComponent(98, "minecraft:chicken/variant"); - RegisterComponent(99, "minecraft:chicken/sound_variant"); // New in 26.1 - RegisterComponent(100, "minecraft:zombie_nautilus/variant"); - RegisterComponent(101, "minecraft:frog/variant"); - RegisterComponent(102, "minecraft:horse/variant"); - RegisterComponent(103, "minecraft:painting/variant"); - RegisterComponent(104, "minecraft:llama/variant"); - RegisterComponent(105, "minecraft:axolotl/variant"); - RegisterComponent(106, "minecraft:cat/variant"); - RegisterComponent(107, "minecraft:cat/sound_variant"); // New in 26.1 - RegisterComponent(108, "minecraft:cat/collar"); - RegisterComponent(109, "minecraft:sheep/color"); - RegisterComponent(110, "minecraft:shulker/color"); - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/Subcomponents/SubComponentRegistry1206.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/Subcomponents/SubComponentRegistry1206.cs deleted file mode 100644 index 2e270842be..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/Subcomponents/SubComponentRegistry1206.cs +++ /dev/null @@ -1,22 +0,0 @@ -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Registries.Subcomponents; - -public class SubComponentRegistry1206 : SubComponentRegistry -{ - public SubComponentRegistry1206(DataTypes dataTypes) : base(dataTypes) - { - RegisterSubComponent(SubComponents.BlockPredicate); - RegisterSubComponent(SubComponents.BlockSet); - RegisterSubComponent(SubComponents.Property); - RegisterSubComponent(SubComponents.Attribute); - RegisterSubComponent(SubComponents.Effect); - RegisterSubComponent(SubComponents.PotionEffect); - RegisterSubComponent(SubComponents.Details); - RegisterSubComponent(SubComponents.Rule); - RegisterSubComponent(SubComponents.FireworkExplosion); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/Subcomponents/SubComponentRegistry121.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/Subcomponents/SubComponentRegistry121.cs deleted file mode 100644 index 2afd285295..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/Subcomponents/SubComponentRegistry121.cs +++ /dev/null @@ -1,16 +0,0 @@ -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_20_6; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_21; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Registries.Subcomponents; - -public class SubComponentRegistry121 : SubComponentRegistry1206 -{ - public SubComponentRegistry121(DataTypes dataTypes) : base(dataTypes) - { - ReplaceSubComponent(SubComponents.Attribute); - RegisterSubComponent(SubComponents.SoundEvent); - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/Subcomponents/SubComponentRegistry1212.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/Subcomponents/SubComponentRegistry1212.cs deleted file mode 100644 index ba5df82180..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/Subcomponents/SubComponentRegistry1212.cs +++ /dev/null @@ -1,11 +0,0 @@ -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_21; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Registries.Subcomponents; - -public class SubComponentRegistry1212 : SubComponentRegistry121 -{ - public SubComponentRegistry1212(DataTypes dataTypes) : base(dataTypes) - { - } -} diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/StructuredComponentsHandler.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/StructuredComponentsHandler.cs deleted file mode 100644 index 6214b2f537..0000000000 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/StructuredComponentsHandler.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory.ItemPalettes; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Registries; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Registries.Subcomponents; - -namespace MinecraftClient.Protocol.Handlers.StructuredComponents; - -public class StructuredComponentsHandler -{ - private StructuredComponentRegistry ComponentRegistry { get; } - - public StructuredComponentsHandler( - int protocolVersion, - DataTypes dataTypes, - ItemPalette itemPalette) - { - // Get the appropriate subcomponent registry type based on the protocol version and then instantiate it - var subcomponentRegistryType = protocolVersion switch - { - Protocol18Handler.MC_1_20_6_Version => typeof(SubComponentRegistry1206), - Protocol18Handler.MC_1_21_Version => typeof(SubComponentRegistry121), - >= Protocol18Handler.MC_1_21_2_Version => typeof(SubComponentRegistry1212), - _ => throw new NotSupportedException($"Protocol version {protocolVersion} is not supported for subcomponent registries!") - }; - - var subcomponentRegistry = Activator.CreateInstance(subcomponentRegistryType, dataTypes) as SubComponentRegistry - ?? throw new InvalidOperationException($"Failed to instantiate a component registry for type {nameof(subcomponentRegistryType)}"); - - // Get the appropriate component registry type based on the protocol version and then instantiate it - var registryType = protocolVersion switch - { - Protocol18Handler.MC_1_20_6_Version => typeof(StructuredComponentsRegistry1206), - Protocol18Handler.MC_1_21_Version => typeof(StructuredComponentsRegistry121), - >= Protocol18Handler.MC_26_2_Version => typeof(StructuredComponentsRegistry262), - >= Protocol18Handler.MC_26_1_Version => typeof(StructuredComponentsRegistry261), - >= Protocol18Handler.MC_1_21_11_Version => typeof(StructuredComponentsRegistry12111), - >= Protocol18Handler.MC_1_21_5_Version => typeof(StructuredComponentsRegistry1215), - >= Protocol18Handler.MC_1_21_2_Version => typeof(StructuredComponentsRegistry1212), - _ => throw new NotSupportedException($"Protocol version {protocolVersion} is not supported for structured component registries!") - }; - - ComponentRegistry = Activator.CreateInstance(registryType, dataTypes, itemPalette, subcomponentRegistry) as StructuredComponentRegistry - ?? throw new InvalidOperationException($"Failed to instantiate a component registry for type {nameof(registryType)}"); - } - - public StructuredComponent Parse(int componentId, Queue data) - { - return ComponentRegistry.ParseComponent(componentId, data); - } - - public string GetComponentName(int componentId) - { - try - { - return ComponentRegistry.GetComponentNameById(componentId); - } - catch - { - return ""; - } - } -} diff --git a/MinecraftClient/Protocol/Handlers/ZlibUtils.cs b/MinecraftClient/Protocol/Handlers/ZlibUtils.cs deleted file mode 100644 index bff4131d5d..0000000000 --- a/MinecraftClient/Protocol/Handlers/ZlibUtils.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System.IO; -using System.IO.Compression; - -namespace MinecraftClient.Protocol.Handlers -{ - /// - /// Quick Zlib compression handling for network packet compression. - /// - public static class ZlibUtils - { - /// - /// Compress a byte array into another bytes array using Zlib compression - /// - /// Data to compress - /// Compressed data as a byte array - public static byte[] Compress(byte[] to_compress) - { - using MemoryStream memstream = new(); - using (ZLibStream stream = new(memstream, CompressionMode.Compress, leaveOpen: true)) - { - stream.Write(to_compress, 0, to_compress.Length); - } - - return memstream.ToArray(); - } - - /// - /// Decompress a byte array into another byte array of the specified size - /// - /// Data to decompress - /// Size of the data once decompressed - /// Decompressed data as a byte array - public static byte[] Decompress(byte[] to_decompress, int size_uncompressed) - { - using MemoryStream compressedStream = new(to_decompress, writable: false); - using ZLibStream stream = new(compressedStream, CompressionMode.Decompress); - - byte[] packetData_decompressed = new byte[size_uncompressed]; - int totalRead = 0; - while (totalRead < size_uncompressed) - { - int read = stream.Read(packetData_decompressed, totalRead, size_uncompressed - totalRead); - if (read <= 0) - break; - - totalRead += read; - } - - return packetData_decompressed; - } - - /// - /// Decompress a byte array into another byte array of a potentially unlimited size (!) - /// - /// Data to decompress - /// Decompressed data as byte array - public static byte[] Decompress(byte[] to_decompress) - { - using MemoryStream compressedStream = new(to_decompress, writable: false); - using ZLibStream stream = new(compressedStream, CompressionMode.Decompress); - byte[] buffer = new byte[16 * 1024]; - using MemoryStream decompressedBuffer = new(); - int read; - while ((read = stream.Read(buffer, 0, buffer.Length)) > 0) - decompressedBuffer.Write(buffer, 0, read); - - return decompressedBuffer.ToArray(); - } - } -} diff --git a/MinecraftClient/Protocol/IMinecraftCom.cs b/MinecraftClient/Protocol/IMinecraftCom.cs deleted file mode 100644 index ee604ceb06..0000000000 --- a/MinecraftClient/Protocol/IMinecraftCom.cs +++ /dev/null @@ -1,319 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Inventory; -using MinecraftClient.Mapping; -using MinecraftClient.Protocol.ProfileKey; - -namespace MinecraftClient.Protocol -{ - /// - /// Interface for the Minecraft protocol handler. - /// A protocol handler is used to communicate with the Minecraft server. - /// This interface allows to abstract from the underlying minecraft version in other parts of the program. - /// The protocol handler will take care of parsing and building the appropriate network packets. - /// - - public interface IMinecraftCom : IDisposable, IAutoComplete - { - /// - /// Start the login procedure once connected to the server - /// - /// True if login was successful - bool Login(PlayerKeyPair? playerKeyPair, Session.SessionToken session, bool isTransfer = false); - - /// - /// Disconnect from the server - /// - void Disconnect(); - - /// - /// Get max length for chat messages - /// - /// Max length, in characters - int GetMaxChatMessageLength(); - - /// - /// Get the current protocol version. - /// - /// - /// Version-specific operations should be handled inside the Protocol handled whenever possible. - /// - /// Minecraft Protocol version number - int GetProtocolVersion(); - - /// - /// Send a chat message or command to the server - /// - /// Text to send - /// True if successfully sent - bool SendChatMessage(string message, PlayerKeyPair? playerKeyPair = null); - - /// - /// Send a custom click action packet introduced for dialogs in Minecraft 1.21.6. - /// - /// Custom action resource location - /// Optional NBT payload - /// True if successfully sent - bool SendCustomClickAction(string id, Dictionary? payload); - - /// - /// Allow to respawn after death - /// - /// True if packet successfully sent - bool SendRespawnPacket(); - - /// - /// Inform the server of the client being used to connect - /// - /// Client string describing the client - /// True if brand info was successfully sent - bool SendBrandInfo(string brandInfo); - - /// - /// Inform the server of the client's Minecraft settings - /// - /// Client language eg en_US - /// View distance, in chunks - /// Game difficulty (client-side...) - /// Chat mode (allows muting yourself) - /// Show chat colors - /// Show skin layers - /// 1.9+ main hand - /// True if client settings were successfully sent - bool SendClientSettings(string language, byte viewDistance, byte difficulty, byte chatMode, bool chatColors, byte skinParts, byte mainHand); - - /// - /// Send a location update telling that we moved to that location - /// - /// The new location - /// True if the player is on the ground - /// True if the player is colliding horizontally - /// The new yaw (optional) - /// The new pitch (optional) - /// True if packet was successfully sent - bool SendLocationUpdate(Location location, bool onGround, bool horizontalCollision, float? yaw, float? pitch); - - /// - /// Send a plugin channel packet to the server. - /// - /// - /// Channel to send packet on - /// packet Data - /// True if message was successfully sent - bool SendPluginChannelPacket(string channel, byte[] data); - - /// - /// Send Entity Action packet to the server. - /// - /// PlayerID - /// Type of packet to send - /// True if packet was successfully sent - bool SendEntityAction(int EntityID, int type); - - /// - /// Send a held item change packet to the server. - /// - /// New active slot in the inventory hotbar - /// True if packet was successfully sent - bool SendHeldItemChange(short slot); - - /// - /// Send an entity interaction packet to the server. - /// - /// Entity ID to interact with - /// Type of interaction (0: interact, 1: attack, 2: interact at) - /// True if packet was successfully sent - bool SendInteractEntity(int EntityID, int type); - - /// - /// Send an entity interaction packet to the server. - /// - /// Entity ID to interact with - /// Type of interaction (0: interact, 1: attack, 2: interact at) - /// X coordinate for "interact at" - /// Y coordinate for "interact at" - /// Z coordinate for "interact at" - /// Player hand (0: main hand, 1: off hand) - /// True if packet was successfully sent - bool SendInteractEntity(int EntityID, int type, float X, float Y, float Z, int hand); - - /// - /// Send an entity interaction packet to the server. - /// - /// Entity ID to interact with - /// Type of interaction (0: interact, 1: attack, 2: interact at) - /// X coordinate for "interact at" - /// Y coordinate for "interact at" - /// Z coordinate for "interact at" - /// True if packet was successfully sent - bool SendInteractEntity(int EntityID, int type, float X, float Y, float Z); - - /// - /// Send an entity interaction packet to the server. - /// - /// Entity ID to interact with - /// Type of interaction (0: interact, 1: attack, 2: interact at) - /// Only if Type is interact or interact at; 0: main hand, 1: off hand - /// True if packet was successfully sent - bool SendInteractEntity(int EntityID, int type, int hand); - - /// - /// Send a use item packet to the server - /// - /// 0: main hand, 1: off hand - /// Sequence ID used for synchronization - /// True if packet was successfully sent - bool SendUseItem(int hand, int sequenceId); - - /// - /// Send a click window slot packet to the server - /// - /// Id of the window being clicked - /// Id of the clicked slot - /// Action to perform - /// Item in the clicked slot - /// Slots that have been changed in this event: List - /// Inventory's stateId - /// True if packet was successfully sent - bool SendWindowAction(int windowId, int slotId, WindowActionType action, Item? item, List> changedSlots, int stateId); - - /// - /// Request Creative Mode item creation into regular/survival Player Inventory - /// - /// (obviously) requires to be in creative mode - /// Destination inventory slot - /// Item type - /// Item count - /// Optional item NBT - /// TRUE if item given successfully - bool SendCreativeInventoryAction(int slot, ItemType itemType, int count, Dictionary? nbt); - - /// - /// Send a click container button packet to the server. - /// Used for Enchanting table, Lectern, stone cutter and loom - /// - /// Id of the window being clicked - /// Id of the clicked button - /// True if packet was successfully sent - - bool ClickContainerButton(int windowId, int buttonId); - - /// - /// Send a place recipe packet to the server for the active recipe book container. - /// - /// Id of the window being clicked - /// Recipe identifier to craft - /// True to craft as many items as possible - /// True if packet was successfully sent - bool SendPlaceRecipe(int windowId, string recipeId, bool makeAll); - - /// - /// Send a book edit/sign packet for the currently held writable book. - /// - /// Current held writable book - /// Book pages - /// Title when signing, otherwise null - /// Current player name when signing - /// Selected hotbar slot, 0-8 - /// True if packet was successfully sent - bool SendEditBook(Item currentBook, IReadOnlyList pages, string? title, string author, int selectedHotbarSlot); - - /// - /// Plays animation - /// - /// 0 for left arm, 1 for right arm - /// Player Entity ID - /// TRUE if item given successfully - bool SendAnimation(int animation, int playerid); - - /// - /// Send a close window packet to the server - /// - /// Id of the window being closed - bool SendCloseWindow(int windowId); - - /// - /// Send player block placement packet to the server - /// - /// 0: main hand, 1: off hand - /// Location to place block at - /// Block face - /// Sequence ID (use for synchronization) - /// True if packet was successfully sent - bool SendPlayerBlockPlacement(int hand, Location location, Direction face, int sequenceId); - - /// - /// Send player blog digging packet to the server. This packet needs to be called at least twice: Once to begin digging, then a second time to finish digging - /// - /// 0 to start digging, 1 to cancel, 2 to finish ( https://wiki.vg/Protocol#Player_Digging ) - /// Location - /// Block face - /// Sequence ID (use for synchronization) - /// True if packet was successfully sent - bool SendPlayerDigging(int status, Location location, Direction face, int sequenceId); - - /// - /// Change text on a sign - /// - /// Location of Sign block - /// New line 1 - /// New line 2 - /// New line 3 - /// New line 4 - /// Are we editing the front or the back of the sign. 1.20 + - /// True if packet was successfully sent - bool SendUpdateSign(Location location, string line1, string line2, string line3, string line4, bool isFrontText = true); - - /// - /// Update command block - /// - /// command block location - /// command - /// command block mode - /// command block flags - bool UpdateCommandBlock(Location location, string command, CommandBlockMode mode, CommandBlockFlags flags); - - /// - /// Select villager trade - /// - /// The slot of the trade, starts at 0. - bool SelectTrade(int selectedSlot); - - /// - /// Spectate a player/entity - /// - /// The uuid of the player/entity to spectate/teleport to. - bool SendSpectate(Guid uuid); - - /// - /// Send player session - /// - /// - bool SendPlayerSession(PlayerKeyPair? playerKeyPair); - - /// - /// Send the server a command to type in the item name in the Anvil inventory when it's open. - /// - /// The new item name - bool SendRenameItem(string itemName); - - /// - /// Get net read thread (main thread) ID - /// - /// Net read thread ID - int GetNetMainThreadId(); - - /// - /// Send the server a requested cookie - /// - /// The cookie identifier/name - /// The cookie data byte array - bool SendCookieResponse(string name, byte[]? data); - - /// - /// Send the server known data packs - /// - /// The clist of tuples containing info about the kown data packs (namespace, id, version) - bool SendKnownDataPacks(List<(string, string, string)> knownDataPacks); - } -} diff --git a/MinecraftClient/Protocol/IMinecraftComHandler.cs b/MinecraftClient/Protocol/IMinecraftComHandler.cs deleted file mode 100644 index 856f222ad3..0000000000 --- a/MinecraftClient/Protocol/IMinecraftComHandler.cs +++ /dev/null @@ -1,643 +0,0 @@ -using System; -using System.Collections.Generic; -using MinecraftClient.Dialogs; -using MinecraftClient.Inventory; -using MinecraftClient.Logger; -using MinecraftClient.Mapping; -using MinecraftClient.Protocol.Message; -using MinecraftClient.Protocol.ProfileKey; -using MinecraftClient.Scripting; - -namespace MinecraftClient.Protocol -{ - /// - /// Interface for the MinecraftCom Handler. - /// It defines some callbacks that the MinecraftCom handler must have. - /// It allows the protocol handler to abstract from the other parts of the program. - /// - - public interface IMinecraftComHandler - { - /* The MinecraftCom Handler must - * provide these getters */ - - int GetServerPort(); - string GetServerHost(); - string GetUsername(); - Guid GetUserUuid(); - string GetUserUuidStr(); - string GetSessionID(); - string[] GetOnlinePlayers(); - Dictionary GetOnlinePlayersWithUUID(); - PlayerInfo? GetPlayerInfo(Guid uuid); - PlayerKeyPair? GetPlayerKeyPair(); - Location GetCurrentLocation(); - World GetWorld(); - bool GetIsSupportPreviewsChat(); - bool GetTerrainEnabled(); - bool SetTerrainEnabled(bool enabled); - bool GetInventoryEnabled(); - bool SetInventoryEnabled(bool enabled); - bool GetEntityHandlingEnabled(); - bool SetEntityHandlingEnabled(bool enabled); - bool GetNetworkPacketCaptureEnabled(); - void SetNetworkPacketCaptureEnabled(bool enabled); - int GetProtocolVersion(); - Container? GetInventory(int inventoryID); - ILogger GetLogger(); - void GetCookie(string key, out byte[]? data); - void SetCookie(string key, byte[] data); - void DeleteCookie(string key); - void DeleteAllCookies(); - - void Transfer(string newHost, int newPort); - - /// - /// Invoke a task on the main thread, wait for completion and retrieve return value. - /// - /// Task to run with any type or return value - /// Any result returned from task, result type is inferred from the task - /// bool result = InvokeOnMainThread(methodThatReturnsAbool); - /// bool result = InvokeOnMainThread(() => methodThatReturnsAbool(argument)); - /// int result = InvokeOnMainThread(() => { yourCode(); return 42; }); - /// Type of the return value - T InvokeOnMainThread(Func task); - - /// - /// Invoke a task on the main thread and wait for completion - /// - /// Task to run without return value - /// InvokeOnMainThread(methodThatReturnsNothing); - /// InvokeOnMainThread(() => methodThatReturnsNothing(argument)); - /// InvokeOnMainThread(() => { yourCode(); }); - void InvokeOnMainThread(Action task); - - /// - /// Called when a network packet received or sent - /// - /// - /// Only called if is set to True - /// - /// Packet ID - /// A copy of Packet Data - /// The packet is login phase or playing phase - /// The packet is received from server or sent by client - void OnNetworkPacket(int packetID, List packetData, bool isLogin, bool isInbound); - - /// - /// Called when a server was successfully joined - /// - void OnGameJoined(bool isOnlineMode); - - /// - /// Received chat/system message from the server - /// - /// Message received - public void OnTextReceived(ChatMessage message); - - /// - /// Called when the server synchronizes a dialog registry entry. - /// - void OnDialogRegistryData(int protocolId, string resourceId, DialogDefinition dialog); - - /// - /// Called when the server shows a custom dialog. - /// - void OnDialogShown(DialogDefinition dialog, DialogPhase phase); - - /// - /// Called when the server shows a custom dialog by registry protocol ID. - /// - void OnDialogRegistryReferenceShown(int protocolId, DialogPhase phase); - - /// - /// Called when the server clears the current custom dialog. - /// - void OnDialogCleared(); - - /// - /// Called when the server sends updated server links. - /// - void OnServerLinksUpdated(IReadOnlyList links); - - /// - /// Will be called every animations of the hit and place block - /// - /// Player ID - /// 0 = LMB, 1 = RMB (RMB Corrent not work) - void OnEntityAnimation(int entityID, byte animation); - - /// - /// Will be called when a Synchronization sequence is recevied, this sequence need to be sent when breaking or placing blocks - /// - /// Sequence ID - void OnBlockChangeAck(int sequenceId); - - /// - /// Will be called every player break block in gamemode 0 - /// - /// Player ID - /// Block location - /// Destroy stage, maximum 255 - void OnBlockBreakAnimation(int entityID, Location location, byte stage); - - /// - /// This method is called when the protocol handler receives a title - /// - void OnTitle(int action, string titletext, string subtitletext, string actionbartext, int fadein, int stay, int fadeout, string json); - - /// - /// Called when receiving a connection keep-alive from the server - /// - void OnServerKeepAlive(); - - /// - /// This method is called when the protocol handler receives server data - /// - /// Indicates if the server has a motd message - /// Server MOTD message - /// Indicates if the server has a an icon - /// Server icon in Base 64 format - /// Indicates if the server previews chat - void OnServerDataRecived(bool hasMotd, string motd, bool hasIcon, string iconBase64, bool previewsChat); - - /// - /// This method is called when the protocol handler receives "Set Display Chat Preview" packet - /// - /// Indicates if the server previews chat - public void OnChatPreviewSettingUpdate(bool previewsChat); - - /// - /// Called when an inventory is opened - /// - void OnInventoryOpen(int inventoryID, Container inventory); - - /// - /// Called when an inventory is closed - /// - void OnInventoryClose(int inventoryID); - - /// - /// Called when the player respawns, which happens on login, respawn and world change. - /// - void OnRespawn(); - - /// - /// Triggered when a new player joins the game - /// - /// player info - public void OnPlayerJoin(PlayerInfo player); - - /// - /// This method is called when a player has left the game - /// - /// UUID of the player - void OnPlayerLeave(Guid uuid); - - /// - /// This method is called when a player has been killed by another entity - /// - /// Killer's entity if - /// message sent in chat when player is killed - void OnPlayerKilled(int killerEntityId, string chatMessage); - - /// - /// Called when the server sets the new location for the player - /// - /// New location of the player - /// New yaw - /// New pitch - void UpdateLocation(Location location, float yaw, float pitch); - - /// - /// This method is called when the connection has been lost - /// - void OnConnectionLost(ChatBot.DisconnectReason reason, string message); - - /// - /// Called 20 times per second (20 ticks per second) - /// Useful for updating bots in other parts of the program - /// - void OnUpdate(); - - /// - /// Registers the given plugin channel for the given bot. - /// - /// The channel to register. - /// The bot to register the channel for. - void RegisterPluginChannel(string channel, ChatBot bot); - - /// - /// Unregisters the given plugin channel for the given bot. - /// - /// The channel to unregister. - /// The bot to unregister the channel for. - void UnregisterPluginChannel(string channel, ChatBot bot); - - /// - /// Sends a plugin channel packet to the server. - /// See http://wiki.vg/Plugin_channel for more information about plugin channels. - /// - /// The channel to send the packet on. - /// The payload for the packet. - /// Whether the packet should be sent even if the server or the client hasn't registered it yet. - /// Whether the packet was sent: true if it was sent, false if there was a connection error or it wasn't registered. - bool SendPluginChannelMessage(string channel, byte[] data, bool sendEvenIfNotRegistered = false); - - /// - /// Called when a plugin channel message was sent from the server. - /// - /// The channel the message was sent on - /// The data from the channel - void OnPluginChannelMessage(string channel, byte[] data); - - /// - /// Called when the server asks the client to open a book UI. - /// - /// Book hand, 0 main hand, 1 off hand. - void OnBookOpen(int hand); - - /// - /// Called when an entity has spawned - /// - /// Spawned entity - void OnSpawnEntity(Entity entity); - - /// - /// Called when an entity has spawned - /// - /// Entity id - /// Equipment slot. 0: main hand, 1: off hand, 2–5: armor slot (2: boots, 3: leggings, 4: chestplate, 5: helmet)/param> - /// Item/param> - void OnEntityEquipment(int entityid, int slot, Item? item); - - /// - /// Called when a player spawns or enters the client's render distance - /// - /// Entity ID - /// Entity UUID - /// Entity location - /// Player head yaw - /// Player head pitch - void OnSpawnPlayer(int entityID, Guid uuid, Location location, byte yaw, byte pitch); - - /// - /// Called when entities have despawned - /// - /// List of Entity ID that have despawned - void OnDestroyEntities(int[] EntityID); - - /// - /// Called when an entity moved by coordinate offset - /// - /// Entity ID - /// X offset - /// Y offset - /// Z offset - /// TRUE if on ground - void OnEntityPosition(int entityID, Double dx, Double dy, Double dz, bool onGround); - - /// - /// Called when an entity moved and rotated - /// - /// Entity ID - /// X offset - /// Y offset - /// Z offset - /// Yaw - /// Pitch - /// TRUE if on ground - void OnEntityPosition(int entityID, Double dx, Double dy, Double dz, float yaw, float pitch, bool onGround); - - /// - /// Called when an entity rotated - /// - /// Entity ID - /// Yaw - /// Pitch - /// TRUE if on ground - void OnEntityRotation(int entityID, float yaw, float pitch, bool onGround); - - /// - /// Called when an entity moved to fixed coordinates - /// - /// Entity ID - /// X - /// Y - /// Z - /// TRUE if on ground - void OnEntityTeleport(int entityID, Double x, Double y, Double z, bool onGround); - - /// - /// Called when an entity velocity update packet is received. - /// Velocity values are in blocks per tick. - /// - /// Entity ID - /// Velocity X - /// Velocity Y - /// Velocity Z - void OnEntityVelocity(int entityID, double velocityX, double velocityY, double velocityZ); - - /// - /// Called when additional properties have been received for an entity - /// - /// Entity ID - /// Dictionary of properties - void OnEntityProperties(int entityID, Dictionary prop); - - /// - /// Called when the status of an entity have been changed - /// - /// Entity ID - /// Status ID - void OnEntityStatus(int entityID, byte status); - - /// - /// Called when the world age has been updated - /// - /// World age - /// Time of Day - void OnTimeUpdate(long worldAge, long timeOfDay); - - /// - /// When received window properties from server. - /// - /// - /// Inventory ID - /// Property ID - /// Property Value - public void OnWindowProperties(byte inventoryID, short propertyId, short propertyValue); - - /// - /// Called when inventory items have been received - /// - /// Inventory ID - /// Item list - /// State ID - void OnWindowItems(byte inventoryID, Dictionary itemList, int stateId); - - /// - /// Called when a single slot has been updated inside an inventory - /// - /// Window ID - /// Slot ID - /// Item (may be null for empty slot) - /// State ID - void OnSetSlot(byte inventoryID, short slotID, Item? item, int stateId); - - /// - /// Called when player health or hunger changed. - /// - /// - /// - void OnUpdateHealth(float health, int food); - - /// - /// Called when the health of an entity changed - /// - /// Entity ID - /// The health of the entity - void OnEntityHealth(int entityID, float health); - - /// - /// Called when entity metadata or metadata changed. - /// - /// Entity ID - /// Entity metadata - void OnEntityMetadata(int EntityID, Dictionary metadata); - - /// - /// Called when and explosion occurs on the server - /// - /// Explosion location - /// Explosion strength - /// Amount of affected blocks - void OnExplosion(Location location, float strength, int affectedBlocks); - - /// - /// Called when a sound packet is received. - /// - /// Sound key if available, otherwise null - /// Sound location for world sounds, or null if unavailable - /// Sound category id - /// Sound volume - /// Sound pitch - /// Source entity id for entity-sound packets, if any - void OnSoundEffect(string? soundName, Location? location, int category, float volume, float pitch, int? entityID); - - /// - /// Called when a player's game mode has changed - /// - /// Affected player's UUID - /// New game mode - void OnGamemodeUpdate(Guid uuid, int gamemode); - - /// - /// Called when a player's latency has changed - /// - /// Affected player's UUID - /// latency - void OnLatencyUpdate(Guid uuid, int latency); - - /// - /// Called when Experience bar is updated - /// - /// Experience bar level - /// Player Level - /// Total experience - void OnSetExperience(float Experiencebar, int Level, int TotalExperience); - - /// - /// Called when client need to change slot. - /// - /// Used for setting player slot after joining game - /// - void OnHeldItemChange(byte slot); - - /// - /// Called when an update of the map is sent by the server, take a look at https://wiki.vg/Protocol#Map_Data for more info on the fields - /// Map format and colors: https://minecraft.wiki/w/Map_item_format - /// - /// Map ID of the map being modified - /// A scale of the Map, from 0 for a fully zoomed-in map (1 block per pixel) to 4 for a fully zoomed-out map (16 blocks per pixel) - /// Specifies whether player and item frame icons are shown - /// True if the map has been locked in a cartography table - /// A list of MapIcon objects of map icons, send only if trackingPosition is true - /// Numbs of columns that were updated (map width) (NOTE: If it is 0, the next fields are not used/are set to default values of 0 and null respectively) - /// Map height - /// x offset of the westernmost column - /// z offset of the northernmost row - /// a byte array of colors on the map - void OnMapData(int mapid, byte scale, bool trackingPosition, bool locked, List icons, byte columnsUpdated, byte rowsUpdated, byte mapCoulmnX, byte mapRowZ, byte[]? colors); - - /// - /// Called when the Player entity ID has been received from the server - /// - /// Player entity ID - void OnReceivePlayerEntityID(int EntityID); - - /// - /// Called when the Entity use effects - /// - /// entity ID - /// effect id - /// effect amplifier - /// effect duration - /// effect flags - /// has factor data - /// factorCodec - void OnEntityEffect(int entityid, Effects effect, int amplifier, int duration, byte flags, bool hasFactorData, Dictionary? factorCodec); - - /// - /// Called when an entity has an effect removed - /// - /// Entity ID - /// Effect that was removed - void OnRemoveEntityEffect(int entityid, Effects effect); - - /// - /// Get the player's active effects - /// - /// Dictionary of active effects - Dictionary GetPlayerEffects(); - - /// - /// Called when Soreboard Objective - /// - /// objective name - /// 0 to create the scoreboard. 1 to remove the scoreboard. 2 to update the display text. - /// Only if mode is 0 or 2. The text to be displayed for the score - /// Only if mode is 0 or 2. 0 = "integer", 1 = "hearts". - /// Number format: 0 - blank, 1 - styled, 2 - fixed - void OnScoreboardObjective(string objectiveName, byte mode, string objectiveValue, int type, int numberFormat); - - /// - /// Called when DisplayScoreboard - /// - /// The entity whose score this is. For players, this is their username; for other entities, it is their UUID. - /// 0 to create/update an item. 1 to remove an item. - /// The name of the objective the score belongs to - /// The name of the objective the score belongs to, but with chat formatting - /// The score to be displayed next to the entry. Only sent when Action does not equal 1. - /// Number format: 0 - blank, 1 - styled, 2 - fixed - void OnUpdateScore(string entityName, int action, string objectiveName, string objectiveDisplayName, int objectiveValue, int numberFormat); - - /// - /// Called when a Teams packet is received from the server. - /// - /// Internal team name (up to 16 chars) - /// 0=create, 1=remove, 2=update, 3=add players, 4=remove players - /// Display name (formatted). Present when method is 0 or 2. - /// Bit 0=allowFriendlyFire, bit 1=seeFriendlyInvisibles. Present when method is 0 or 2. - /// Nametag visibility rule string. Present when method is 0 or 2. - /// Collision rule string. Present when method is 0 or 2. - /// ChatFormatting color value (-1=none). Present when method is 0 or 2. - /// Member name prefix (formatted). Present when method is 0 or 2. - /// Member name suffix (formatted). Present when method is 0 or 2. - /// Player/entity names. Present when method is 0, 3, or 4. - void OnTeam(string teamName, byte method, string displayName, byte friendlyFlags, - string nameTagVisibility, string collisionRule, int color, - string prefix, string suffix, List players); - - /// - /// Called when the client received the Tab Header and Footer - /// - /// Header - /// Footer - void OnTabListHeaderAndFooter(string header, string footer); - - /// - /// Called when tradeList is received from server - /// - /// Window ID - /// List of trades. - /// The level the villager is. - /// The amount of experience the villager has. - /// True if regular villagers and false if the wandering trader. - /// If the villager can restock his trades at a workstation, True for regular villagers and false for the wandering trader. - void OnTradeList(int windowID, List trades, VillagerInfo villagerInfo); - - /// - /// This method is called when the protocol handler receives "Login Success" packet - /// - /// The player's UUID received from the server - /// The player's username received from the server - /// Tuple - public void OnLoginSuccess(Guid uuid, string userName, Tuple[]? playerProperty); - - /// - /// Used for a wide variety of game events, from weather to bed use to gamemode to demo messages. - /// - /// Event type - /// Depends on Reason - public void OnGameEvent(byte reason, float value); - - /// - /// Called when a block is changed. - /// - /// The location of the block. - /// The block - public void OnBlockChange(Location location, Block block); - - /// - /// Called when block entity update data is received for a loaded block. - /// - /// The block location. - /// The block entity NBT payload. - public void OnBlockEntityData(Location location, Dictionary? nbt); - - /// - /// Called when "AutoComplete" completes. - /// - /// The number of this result. - /// All commands. - public void OnAutoCompleteDone(int transactionId, string[] result); - - public void SetCanSendMessage(bool canSendMessage); - - /// - /// Called when recipe book recipes are added or replaced. - /// - /// Recipe entries to add - /// True to replace the currently tracked recipe book entries - public void OnRecipeBookAdd(RecipeBookRecipeEntry[] recipes, bool replace); - - /// - /// Called when recipe book recipes are removed. - /// - /// Recipe identifiers to remove - public void OnRecipeBookRemove(string[] recipeIds); - - /// - /// Called when achievement/advancement data is received from the server. - /// - /// Achievements that were added or updated - /// IDs of achievements that were removed - /// True if all existing state should be cleared before applying - public void OnAchievementsUpdate(IReadOnlyList added, IReadOnlyList removedIds, bool reset); - - /// - /// Called when the server selects an advancement tab. - /// - /// The tab identifier, or null if no tab is selected - public void OnSelectAdvancementTab(string? tabId); - - /// - /// Send a click container button packet to the server. - /// Used for Enchanting table, Lectern, stone cutter and loom - /// - /// Id of the window being clicked - /// Id of the clicked button - /// True if packet was successfully sent - - bool ClickContainerButton(int windowId, int buttonId); - - /// - /// Send a rename item packet when the anvil inventory is open and there is an item in the first slot - /// - /// New name (max 50 characters) - /// True if packet was successfully sent - - bool SendRenameItem(string itemName); - } -} diff --git a/MinecraftClient/Protocol/JwtPayloadDecode.cs b/MinecraftClient/Protocol/JwtPayloadDecode.cs deleted file mode 100644 index a103a4b83f..0000000000 --- a/MinecraftClient/Protocol/JwtPayloadDecode.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Text; - -namespace MinecraftClient.Protocol -{ - // Thanks to https://stackoverflow.com/questions/60404612/parse-jwt-token-to-get-the-payload-content-only-without-external-library-in-c-sh - public static class JwtPayloadDecode - { - public static string GetPayload(string token) - { - var content = token.Split('.')[1]; - var jsonPayload = Encoding.UTF8.GetString(Decode(content)); - return jsonPayload; - } - - private static byte[] Decode(string input) - { - var output = input; - output = output.Replace('-', '+'); // 62nd char of encoding - output = output.Replace('_', '/'); // 63rd char of encoding - switch (output.Length % 4) // Pad with trailing '='s - { - case 0: break; // No pad chars in this case - case 2: output += "=="; break; // Two pad chars - case 3: output += "="; break; // One pad char - default: throw new System.ArgumentOutOfRangeException(nameof(input), "Illegal base64url string!"); - } - var converted = Convert.FromBase64String(output); // Standard base64 decoder - return converted; - } - } -} diff --git a/MinecraftClient/Protocol/Message/ChatMessage.cs b/MinecraftClient/Protocol/Message/ChatMessage.cs deleted file mode 100644 index 762bab5fb5..0000000000 --- a/MinecraftClient/Protocol/Message/ChatMessage.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; - -namespace MinecraftClient.Protocol.Message -{ - public class ChatMessage - { - /// - /// In 1.19 and above, isSignedChat = true - /// - public bool isSignedChat; - - public string content; - - public bool isJson, isSenderJson; - - /// - /// 0: chat (chat box), 1: system message (chat box), 2: game info (above hotbar), 3: say command, - /// 4: msg command, 5: team msg command, 6: emote command, 7: tellraw command - /// - public int chatTypeId; - - public Guid senderUUID; - - public bool isSystemChat; - - public string? unsignedContent; - - public string? displayName; - - public string? teamName; - - public DateTime? timestamp; - - public byte[]? signature; - - public bool? isSignatureLegal; - - internal ChatParser.ChatTypeDecoration? chatTypeDecoration; - - public ChatMessage(string content, bool isJson, int chatType, Guid senderUUID, string? unsignedContent, string displayName, string? teamName, long timestamp, byte[]? signature, bool isSignatureLegal) - { - isSignedChat = true; - isSystemChat = false; - this.content = content; - this.isJson = isJson; - chatTypeId = chatType; - this.senderUUID = senderUUID; - this.unsignedContent = unsignedContent; - this.displayName = displayName; - this.teamName = teamName; - this.timestamp = DateTimeOffset.FromUnixTimeMilliseconds(timestamp).DateTime; - this.signature = signature; - this.isSignatureLegal = isSignatureLegal; - } - - public ChatMessage(string content, string? displayName, bool isJson, int chatType, Guid senderUUID, bool isSystemChat = false) - { - isSignedChat = isSystemChat; - this.isSystemChat = isSystemChat; - this.content = content; - this.displayName = displayName; - this.isJson = isJson; - chatTypeId = chatType; - this.senderUUID = senderUUID; - } - - public LastSeenMessageList.AcknowledgedMessage? ToLastSeenMessageEntry() - { - return signature is not null ? new LastSeenMessageList.AcknowledgedMessage(senderUUID, signature, true) : null; - } - - public bool LacksSender() - { - return senderUUID == Guid.Empty; - } - } -} diff --git a/MinecraftClient/Protocol/Message/ChatParser.cs b/MinecraftClient/Protocol/Message/ChatParser.cs deleted file mode 100644 index 269340ce63..0000000000 --- a/MinecraftClient/Protocol/Message/ChatParser.cs +++ /dev/null @@ -1,1456 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.Compression; -using System.Linq; -using System.Net.Http; -using System.Net.Http.Json; -using System.Diagnostics.CodeAnalysis; -using System.Security.Cryptography; -using System.Text; -using System.Text.Json; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using MinecraftClient.Protocol.Handlers; -using Tomlet; -using Tomlet.Models; -using static MinecraftClient.Settings; - -namespace MinecraftClient.Protocol.Message -{ - /// - /// This class parses JSON chat data from MC 1.6+ and returns the appropriate string to be printed. - /// - static class ChatParser - { - public enum MessageType - { - CHAT, - SAY_COMMAND, - MSG_COMMAND_INCOMING, - MSG_COMMAND_OUTGOING, - TEAM_MSG_COMMAND_INCOMING, - TEAM_MSG_COMMAND_OUTGOING, - EMOTE_COMMAND, - RAW_MSG - }; - - public static Dictionary? ChatId2Type; - - internal enum ChatTypeParameter - { - Sender, - Target, - Content - } - - internal sealed record ChatTypeDecoration(string TranslationKey, ChatTypeParameter[] Parameters); - - private static readonly Dictionary ChatId2Decoration = new(); - - internal static void ClearChatTypeDecorations() - { - ChatId2Decoration.Clear(); - } - - // Used to store Chat Types in 1.20.6+ - public static void ReadChatType(int chatId, string chatName, Dictionary? chatTypeData) - { - var chatTypeDictionary = ChatId2Type ?? new Dictionary(); - - chatTypeDictionary[chatId] = chatName switch - { - "minecraft:chat" => MessageType.CHAT, - "minecraft:emote_command" => MessageType.EMOTE_COMMAND, - "minecraft:msg_command_incoming" => MessageType.MSG_COMMAND_INCOMING, - "minecraft:msg_command_outgoing" => MessageType.MSG_COMMAND_OUTGOING, - "minecraft:say_command" => MessageType.SAY_COMMAND, - "minecraft:team_msg_command_incoming" => MessageType.TEAM_MSG_COMMAND_INCOMING, - "minecraft:team_msg_command_outgoing" => MessageType.TEAM_MSG_COMMAND_OUTGOING, - _ => MessageType.CHAT, - }; - - ChatId2Type = chatTypeDictionary; - - if (TryReadChatTypeDecoration(chatTypeData, out var decoration)) - ChatId2Decoration[chatId] = decoration; - else - ChatId2Decoration.Remove(chatId); - } - - public static void ReadChatType(Dictionary registryCodec) - { - // Check if the chat type registry is in the correct format - if (!registryCodec.ContainsKey("minecraft:chat_type")) - { - - // If not, then we force the registry to be in the correct format - if (registryCodec.ContainsKey("chat_type")) - { - - foreach (var key in registryCodec.Keys.ToArray()) - { - // Skip entries with a namespace already - if (key.Contains(':', StringComparison.OrdinalIgnoreCase)) continue; - - // Assume all other entries are in the minecraft namespace - registryCodec["minecraft:" + key] = registryCodec[key]; - registryCodec.Remove(key); - } - } - } - - var chatTypeListNbt = (object[])(((Dictionary)registryCodec["minecraft:chat_type"])["value"]); - foreach (Dictionary chatTypeNbt in chatTypeListNbt) - { - string chatName = (string)chatTypeNbt["name"]; - int chatId = (int)chatTypeNbt["id"]; - var chatTypeData = chatTypeNbt.TryGetValue("element", out var element) - ? element as Dictionary - : null; - ReadChatType(chatId, chatName, chatTypeData); - } - } - - internal static int ReadChatTypeHolder( - DataTypes dataTypes, - Queue packetData, - int protocolVersion, - out ChatTypeDecoration? directDecoration) - { - int encodedId = dataTypes.ReadNextVarInt(packetData); - directDecoration = null; - - if (protocolVersion < Protocol18Handler.MC_1_21_Version) - return encodedId; - - if (encodedId > 0) - return encodedId - 1; - - directDecoration = ReadNetworkChatTypeDecoration(dataTypes, packetData); - _ = ReadNetworkChatTypeDecoration(dataTypes, packetData); // Narration decoration - return -1; - } - - private static ChatTypeDecoration ReadNetworkChatTypeDecoration( - DataTypes dataTypes, - Queue packetData) - { - string translationKey = dataTypes.ReadNextString(packetData); - int parameterCount = dataTypes.ReadNextVarInt(packetData); - var parameters = new ChatTypeParameter[parameterCount]; - - for (int i = 0; i < parameterCount; i++) - parameters[i] = (ChatTypeParameter)dataTypes.ReadNextVarInt(packetData); - - _ = dataTypes.ReadNextNbtTag(packetData); // Style - return new ChatTypeDecoration(translationKey, parameters); - } - - private static bool TryReadChatTypeDecoration( - Dictionary? chatTypeData, - [NotNullWhen(true)] out ChatTypeDecoration? decoration) - { - decoration = null; - if (chatTypeData is null - || !chatTypeData.TryGetValue("chat", out var chat) - || chat is not Dictionary chatDecoration - || !chatDecoration.TryGetValue("translation_key", out var translationKey) - || translationKey is not string translationKeyText - || !chatDecoration.TryGetValue("parameters", out var parameters) - || parameters is not object[] parameterList) - return false; - - var parsedParameters = new ChatTypeParameter[parameterList.Length]; - for (int i = 0; i < parameterList.Length; i++) - { - parsedParameters[i] = parameterList[i] switch - { - "sender" => ChatTypeParameter.Sender, - "target" => ChatTypeParameter.Target, - "content" => ChatTypeParameter.Content, - _ => ChatTypeParameter.Sender - }; - } - - decoration = new ChatTypeDecoration(translationKeyText, parsedParameters); - return true; - } - - /// - /// The main function to convert text from MC 1.6+ JSON to MC 1.5.2 formatted text - /// - /// JSON serialized text - /// Optional container for links from JSON serialized text - /// Returns the translated text - public static string ParseText(string json, List? links = null) - { - return JSONData2String(Json.ParseJson(json), "", links); - } - - public static string ParseText(Dictionary nbt) - { - return NbtToString(nbt); - } - - /// - /// The main function to convert text from MC 1.9+ JSON to MC 1.5.2 formatted text - /// - /// Message received - /// Optional container for links from JSON serialized text - /// Returns the translated text - public static string ParseSignedChat(ChatMessage message, List? links = null) - { - string sender = message.isSenderJson ? ParseText(message.displayName!) : message.displayName!; - string content; - if (Config.Signature.ShowModifiedChat && message.unsignedContent is not null) - { - content = ParseText(message.unsignedContent!); - if (string.IsNullOrEmpty(content)) - content = message.unsignedContent!; - } - else - { - content = message.isJson ? ParseText(message.content) : message.content; - if (string.IsNullOrEmpty(content)) - content = message.content!; - } - - string text; - List usingData = new(); - - ChatTypeDecoration? decoration = message.chatTypeDecoration; - if (decoration is null) - ChatId2Decoration.TryGetValue(message.chatTypeId, out decoration); - - if (decoration is not null) - { - foreach (var parameter in decoration.Parameters) - { - usingData.Add(parameter switch - { - ChatTypeParameter.Sender => sender, - ChatTypeParameter.Target => message.teamName ?? string.Empty, - ChatTypeParameter.Content => content, - _ => string.Empty - }); - } - - return TranslateString(decoration.TranslationKey, usingData); - } - - MessageType chatType; - if (message.chatTypeId == -1) - chatType = MessageType.RAW_MSG; - else if (!ChatId2Type!.TryGetValue(message.chatTypeId, out chatType)) - chatType = MessageType.CHAT; - switch (chatType) - { - case MessageType.CHAT: - usingData.Add(sender); - usingData.Add(content); - text = TranslateString("chat.type.text", usingData); - break; - case MessageType.SAY_COMMAND: - usingData.Add(sender); - usingData.Add(content); - text = TranslateString("chat.type.announcement", usingData); - break; - case MessageType.MSG_COMMAND_INCOMING: - usingData.Add(sender); - usingData.Add(content); - text = TranslateString("commands.message.display.incoming", usingData); - break; - case MessageType.MSG_COMMAND_OUTGOING: - usingData.Add(sender); - usingData.Add(content); - text = TranslateString("commands.message.display.outgoing", usingData); - break; - case MessageType.TEAM_MSG_COMMAND_INCOMING: - usingData.Add(message.teamName!); - usingData.Add(sender); - usingData.Add(content); - text = TranslateString("chat.type.team.text", usingData); - break; - case MessageType.TEAM_MSG_COMMAND_OUTGOING: - usingData.Add(message.teamName!); - usingData.Add(sender); - usingData.Add(content); - text = TranslateString("chat.type.team.sent", usingData); - break; - case MessageType.EMOTE_COMMAND: - usingData.Add(sender); - usingData.Add(content); - text = TranslateString("chat.type.emote", usingData); - break; - case MessageType.RAW_MSG: - text = content; - break; - default: - goto case MessageType.CHAT; - } - - return text; - } - - /// - /// Get the classic color tag corresponding to a color name - /// - /// Color Name - /// Color code - private static string Color2tag(string colorname) - { - string lower = colorname.ToLower(); - - if (lower.Length == 7 && lower[0] == '#' && IsHexColor(lower)) - return "§" + lower; - - return lower switch - { -#pragma warning disable format // @formatter:off - - /* MC 1.7+ Name || MC 1.6 Name || Classic tag */ - "black" => "§0", - "dark_blue" => "§1", - "dark_green" => "§2", - "dark_aqua" or "dark_cyan" => "§3", - "dark_red" => "§4", - "dark_purple" or "dark_magenta" => "§5", - "gold" or "dark_yellow" => "§6", - "gray" => "§7", - "dark_gray" => "§8", - "blue" => "§9", - "green" => "§a", - "aqua" or "cyan" => "§b", - "red" => "§c", - "light_purple" or "magenta" => "§d", - "yellow" => "§e", - "white" => "§f", - _ => "" , - -#pragma warning restore format // @formatter:on - }; - } - - private static bool IsHexColor(string s) - { - for (int i = 1; i < s.Length; i++) - { - char c = s[i]; - if (!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f'))) - return false; - } - return true; - } - - /// - /// Specify whether translation rules have been loaded - /// - private static bool RulesInitialized = false; - - /// - /// Set of translation rules for formatting text - /// - private static Dictionary TranslationRules = new(); - - private sealed class TranslationLayer(string identifier, Dictionary translations) - { - public string Identifier { get; } = identifier; - public Dictionary Translations { get; } = translations; - } - - private sealed class ResourcePackTranslationCacheEntry - { - public string CacheVersion { get; init; } = string.Empty; - public string Language { get; init; } = string.Empty; - public string SourceUrl { get; init; } = string.Empty; - public string SourceHash { get; init; } = string.Empty; - public Dictionary Translations { get; init; } = []; - } - - private sealed class ForgeModTranslationCacheEntry - { - public string CacheVersion { get; init; } = string.Empty; - public string Language { get; init; } = string.Empty; - public string SourceHash { get; init; } = string.Empty; - public Dictionary> TranslationsByModId { get; init; } = []; - } - - private const long MaxResourcePackDownloadBytes = 256L * 1024 * 1024; - private const int ResourcePackDownloadBufferSize = 81920; - private const string ResourcePackTranslationCacheVersion = "1"; - private const string ForgeModTranslationCacheVersion = "1"; - private const string LocalForgeModTranslationDirectory = "mods"; - - private static readonly List ForgeModTranslationLayers = []; - private static readonly List ResourcePackTranslationLayers = []; - private static readonly HttpClient ResourcePackHttpClient = new(); - - /// - /// Initialize translation rules. - /// Necessary for properly printing some chat messages. - /// - public static void InitTranslations() - { - ForgeModTranslationLayers.Clear(); - ResourcePackTranslationLayers.Clear(); - - if (!RulesInitialized) - { - InitRules(); - RulesInitialized = true; - } - } - - /// - /// Internal rule initialization method. Looks for local rule file or download it from Mojang asset servers. - /// - private static void InitRules() - { - if (Config.Main.Advanced.Language == "en_us") - { - TranslationRules = - JsonSerializer.Deserialize>( - (byte[])MinecraftAssets.ResourceManager.GetObject("en_us.json")!)!; - return; - } - - //Language file in a subfolder, depending on the language setting - if (!Directory.Exists("lang")) - Directory.CreateDirectory("lang"); - - string languageFilePath = "lang" + Path.DirectorySeparatorChar + Config.Main.Advanced.Language + ".json"; - - // Load the external dictionary of translation rules or display an error message - if (File.Exists(languageFilePath)) - { - try - { - TranslationRules = - JsonSerializer.Deserialize>(File.OpenRead(languageFilePath))!; - } - catch (IOException) - { - } - catch (JsonException) - { - } - } - - if (TranslationRules.TryGetValue("Version", out string? version) && - version == Settings.TranslationsFile_Version) - { - if (Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted(Translations.chat_loaded, acceptnewlines: true); - return; - } - - // Try downloading language file from Mojang's servers? - ConsoleIO.WriteLineFormatted( - "§8" + string.Format(Translations.chat_download, Config.Main.Advanced.Language)); - HttpClient httpClient = new(); - try - { - Task fetch_index = httpClient.GetStringAsync(TranslationsFile_Website_Index); - fetch_index.Wait(); - Match match = Regex.Match(fetch_index.Result, - $"minecraft/lang/{Config.Main.Advanced.Language}.json" + @""":\s\{""hash"":\s""([\d\w]{40})"""); - fetch_index.Dispose(); - if (match.Success && match.Groups.Count == 2) - { - string hash = match.Groups[1].Value; - string translation_file_location = TranslationsFile_Website_Download + '/' + hash[..2] + '/' + hash; - if (Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted( - string.Format(Translations.chat_request, translation_file_location)); - - Task?> fetckFileTask = - httpClient.GetFromJsonAsync>(translation_file_location); - fetckFileTask.Wait(); - if (fetckFileTask.Result is not null && fetckFileTask.Result.Count > 0) - { - TranslationRules = fetckFileTask.Result; - TranslationRules["Version"] = TranslationsFile_Version; - File.WriteAllText(languageFilePath, - JsonSerializer.Serialize(TranslationRules, typeof(Dictionary)), - Encoding.UTF8); - - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.chat_done, languageFilePath)); - return; - } - - fetckFileTask.Dispose(); - } - else - { - ConsoleIO.WriteLineFormatted("§8" + Translations.chat_fail, acceptnewlines: true); - } - } - catch (HttpRequestException) - { - ConsoleIO.WriteLineFormatted("§8" + Translations.chat_fail, acceptnewlines: true); - } - catch (IOException) - { - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.chat_save_fail, languageFilePath), - acceptnewlines: true); - } - catch (Exception e) - { - ConsoleIO.WriteLineFormatted("§8" + Translations.chat_fail, acceptnewlines: true); - ConsoleIO.WriteLine(e.Message); - if (Config.Logging.DebugMessages && !string.IsNullOrEmpty(e.StackTrace)) - ConsoleIO.WriteLine(e.StackTrace); - } - finally - { - httpClient.Dispose(); - } - - TranslationRules = - JsonSerializer.Deserialize>( - (byte[])MinecraftAssets.ResourceManager.GetObject("en_us.json")!)!; - ConsoleIO.WriteLine(Translations.chat_use_default); - } - - public static string? TranslateString(string rulename) - { - return TryGetTranslationRule(rulename, out string? result) ? result : null; - } - - public static void LoadResourcePackTranslations(string packIdentifier, string url, string hash) - { - ArgumentException.ThrowIfNullOrEmpty(packIdentifier); - ArgumentException.ThrowIfNullOrEmpty(url); - - if (!Config.Main.Advanced.LoadResourcePackTranslations) - return; - - if (!Uri.TryCreate(url, UriKind.Absolute, out Uri? resourcePackUri) - || resourcePackUri.Scheme is not "http" and not "https") - { - return; - } - - string cacheFilePath = GetResourcePackTranslationCacheFilePath(resourcePackUri, hash); - if (TryLoadCachedResourcePackTranslations(cacheFilePath, resourcePackUri, hash, out Dictionary? cachedTranslations)) - { - ReplaceResourcePackTranslations(packIdentifier, cachedTranslations); - return; - } - - string temporaryFilePath = Path.GetTempFileName(); - try - { - DownloadResourcePack(resourcePackUri, hash, temporaryFilePath); - using FileStream resourcePackFile = File.OpenRead(temporaryFilePath); - Dictionary resourcePackTranslations = ExtractResourcePackTranslations(resourcePackFile); - ReplaceResourcePackTranslations(packIdentifier, resourcePackTranslations); - SaveCachedResourcePackTranslations(cacheFilePath, resourcePackUri, hash, resourcePackTranslations); - } - catch (HttpRequestException) - { - } - catch (IOException) - { - } - catch (InvalidDataException) - { - } - catch (JsonException) - { - } - finally - { - try - { - File.Delete(temporaryFilePath); - } - catch (IOException) - { - } - } - } - - public static void RemoveResourcePackTranslations(string packIdentifier) - { - ResourcePackTranslationLayers.RemoveAll(layer => - layer.Identifier.Equals(packIdentifier, StringComparison.Ordinal)); - } - - public static void ClearResourcePackTranslations() - { - ResourcePackTranslationLayers.Clear(); - } - - public static void LoadForgeModTranslations(IEnumerable modIds) - { - ArgumentNullException.ThrowIfNull(modIds); - - ForgeModTranslationLayers.Clear(); - - if (!Config.Main.Advanced.LoadForgeModTranslations) - return; - - HashSet requestedModIds = new( - modIds - .Where(static modId => !string.IsNullOrWhiteSpace(modId)) - .Select(static modId => NormalizeForgeModId(modId)), - StringComparer.OrdinalIgnoreCase); - - if (requestedModIds.Count == 0) - return; - - Dictionary> translationsByModId = - new(StringComparer.OrdinalIgnoreCase); - - foreach (string modDirectory in GetForgeModTranslationDirectories()) - { - foreach (string modJarPath in Directory.EnumerateFiles(modDirectory, "*.jar")) - { - try - { - MergeForgeModTranslations(modJarPath, requestedModIds, translationsByModId); - } - catch (IOException) - { - } - catch (InvalidDataException) - { - } - catch (JsonException) - { - } - } - } - - foreach (string modId in requestedModIds) - { - if (translationsByModId.TryGetValue(modId, out Dictionary? translations) - && translations.Count > 0) - { - ForgeModTranslationLayers.Add(new TranslationLayer(modId, translations)); - } - } - } - - /// - /// Format text using a specific formatting rule. - /// Example : * %s %s + ["ORelio", "is doing something"] = * ORelio is doing something - /// - /// Name of the rule, chosen by the server - /// Data to be used in the rule - /// Returns the formatted text according to the given data - private static string TranslateString(string rulename, List using_data) - { - if (!RulesInitialized) - { - InitRules(); - RulesInitialized = true; - } - - if (!TryGetTranslationRule(rulename, out string? rule)) - rule = rulename; - - int using_idx = 0; - StringBuilder result = new(); - for (int i = 0; i < rule.Length; i++) - { - if (rule[i] == '%' && i + 1 < rule.Length) - { - //Using string or int with %s or %d - if (rule[i + 1] == 's' || rule[i + 1] == 'd') - { - if (using_data.Count > using_idx) - { - result.Append(using_data[using_idx]); - using_idx++; - i += 1; - continue; - } - } - - //Using specified string or int with %1$s, %2$s... - else if (char.IsDigit(rule[i + 1]) - && i + 3 < rule.Length && rule[i + 2] == '$' - && (rule[i + 3] == 's' || rule[i + 3] == 'd')) - { - int specified_idx = rule[i + 1] - '1'; - if (using_data.Count > specified_idx) - { - result.Append(using_data[specified_idx]); - using_idx++; - i += 3; - continue; - } - } - } - - result.Append(rule[i]); - } - - return result.ToString(); - } - - private static bool TryGetTranslationRule(string rulename, [NotNullWhen(true)] out string? result) - { - for (int i = ResourcePackTranslationLayers.Count - 1; i >= 0; i--) - { - if (ResourcePackTranslationLayers[i].Translations.TryGetValue(rulename, out result)) - return true; - } - - for (int i = ForgeModTranslationLayers.Count - 1; i >= 0; i--) - { - if (ForgeModTranslationLayers[i].Translations.TryGetValue(rulename, out result)) - return true; - } - - return TranslationRules.TryGetValue(rulename, out result); - } - - private static void DownloadResourcePack(Uri resourcePackUri, string hash, string temporaryFilePath) - { - using HttpResponseMessage response = - ResourcePackHttpClient.GetAsync(resourcePackUri, HttpCompletionOption.ResponseHeadersRead).GetAwaiter().GetResult(); - response.EnsureSuccessStatusCode(); - - using Stream resourcePackStream = response.Content.ReadAsStream(); - using FileStream temporaryFile = File.Create(temporaryFilePath); - using IncrementalHash incrementalHash = IncrementalHash.CreateHash(HashAlgorithmName.SHA1); - - byte[] buffer = new byte[ResourcePackDownloadBufferSize]; - long totalBytes = 0; - - while (true) - { - int bytesRead = resourcePackStream.Read(buffer, 0, buffer.Length); - if (bytesRead <= 0) - break; - - totalBytes += bytesRead; - if (totalBytes > MaxResourcePackDownloadBytes) - throw new InvalidDataException(); - - temporaryFile.Write(buffer, 0, bytesRead); - - if (hash.Length == 40) - incrementalHash.AppendData(buffer, 0, bytesRead); - } - - if (hash.Length == 40) - { - string downloadedHash = Convert.ToHexString(incrementalHash.GetHashAndReset()); - if (!downloadedHash.Equals(hash, StringComparison.OrdinalIgnoreCase)) - throw new InvalidDataException($"Resource pack hash mismatch for {resourcePackUri}. Expected {hash}, got {downloadedHash}."); - } - } - - private static Dictionary ExtractResourcePackTranslations(Stream resourcePackStream) - { - var mergedTranslations = new Dictionary(StringComparer.Ordinal); - var selectedLanguageTranslations = new Dictionary(StringComparer.Ordinal); - string selectedLanguage = Config.Main.Advanced.Language; - - using ZipArchive archive = new(resourcePackStream, ZipArchiveMode.Read, leaveOpen: true); - - foreach (ZipArchiveEntry entry in archive.Entries) - { - if (!TryGetResourcePackLanguage(entry.FullName, out string? language)) - continue; - - if (language.Equals("en_us", StringComparison.OrdinalIgnoreCase)) - { - MergeTranslationsFromZipEntry(entry, mergedTranslations); - } - else if (language.Equals(selectedLanguage, StringComparison.OrdinalIgnoreCase)) - { - MergeTranslationsFromZipEntry(entry, selectedLanguageTranslations); - } - } - - foreach (var entry in selectedLanguageTranslations) - mergedTranslations[entry.Key] = entry.Value; - - return mergedTranslations; - } - - private static bool TryGetResourcePackLanguage(string entryPath, [NotNullWhen(true)] out string? language) - { - language = null; - - string[] pathParts = entryPath - .Replace('\\', '/') - .Split('/', StringSplitOptions.RemoveEmptyEntries); - - if (pathParts.Length != 4 - || !pathParts[0].Equals("assets", StringComparison.OrdinalIgnoreCase) - || !pathParts[2].Equals("lang", StringComparison.OrdinalIgnoreCase) - || !pathParts[3].EndsWith(".json", StringComparison.OrdinalIgnoreCase)) - { - return false; - } - - language = Path.GetFileNameWithoutExtension(pathParts[3]); - return !string.IsNullOrEmpty(language); - } - - private static void MergeTranslationsFromZipEntry(ZipArchiveEntry entry, Dictionary translations) - { - using Stream entryStream = entry.Open(); - Dictionary? entryTranslations = - JsonSerializer.Deserialize>(entryStream); - - if (entryTranslations is null) - return; - - foreach (var (key, value) in entryTranslations) - translations[key] = value; - } - - private static void ReplaceResourcePackTranslations(string packIdentifier, Dictionary translations) - { - RemoveResourcePackTranslations(packIdentifier); - - if (translations.Count > 0) - ResourcePackTranslationLayers.Add(new TranslationLayer(packIdentifier, translations)); - } - - private static void MergeForgeModTranslations(string modJarPath, HashSet requestedModIds, - Dictionary> translationsByModId) - { - string sourceHash = ComputeFileSha256(modJarPath); - string cacheFilePath = GetForgeModTranslationCacheFilePath(sourceHash); - if (!TryLoadCachedForgeModTranslations(cacheFilePath, sourceHash, - out Dictionary>? cachedTranslations)) - { - using FileStream modJarStream = File.OpenRead(modJarPath); - cachedTranslations = ExtractForgeModTranslations(modJarStream); - SaveCachedForgeModTranslations(cacheFilePath, sourceHash, cachedTranslations); - } - - Dictionary> archiveTranslations = cachedTranslations - .Where(static entry => entry.Value.Count > 0) - .Where(entry => requestedModIds.Contains(entry.Key)) - .ToDictionary(static entry => entry.Key, static entry => entry.Value, StringComparer.OrdinalIgnoreCase); - - foreach (var (modId, translations) in archiveTranslations) - translationsByModId[modId] = translations; - } - - private static Dictionary> ExtractForgeModTranslations(Stream modJarStream) - { - using ZipArchive archive = new(modJarStream, ZipArchiveMode.Read, leaveOpen: true); - HashSet archiveModIds = GetForgeModIds(archive); - if (archiveModIds.Count == 0) - return new Dictionary>(StringComparer.OrdinalIgnoreCase); - - return ExtractForgeModTranslations(archive, archiveModIds); - } - - private static HashSet GetForgeModIds(ZipArchive archive) - { - ZipArchiveEntry? modsTomlEntry = archive.GetEntry("META-INF/mods.toml") - ?? archive.GetEntry("META-INF/MODS.TOML"); - - if (modsTomlEntry is null) - return []; - - using StreamReader reader = new(modsTomlEntry.Open(), Encoding.UTF8, detectEncodingFromByteOrderMarks: true); - TomlDocument document = new TomlParser().Parse(reader.ReadToEnd()); - if (!document.TryGetValue("mods", out TomlValue? modsValue) || modsValue is not TomlArray modsArray) - return []; - - HashSet modIds = new(StringComparer.OrdinalIgnoreCase); - foreach (TomlValue modValue in modsArray) - { - if (modValue is not TomlTable modTable || !modTable.ContainsKey("modId")) - continue; - - string modId = modTable.GetString("modId"); - if (!string.IsNullOrWhiteSpace(modId)) - modIds.Add(NormalizeForgeModId(modId)); - } - - return modIds; - } - - private static Dictionary> ExtractForgeModTranslations(ZipArchive archive, HashSet requestedModIds) - { - string selectedLanguage = NormalizeLanguageCode(Config.Main.Advanced.Language); - Dictionary> fallbackTranslations = - new(StringComparer.OrdinalIgnoreCase); - Dictionary> selectedTranslations = - new(StringComparer.OrdinalIgnoreCase); - - foreach (ZipArchiveEntry entry in archive.Entries) - { - if (!TryGetForgeModLanguage(entry.FullName, out string? modId, out string? language)) - continue; - - if (!requestedModIds.Contains(modId)) - continue; - - if (language.Equals("en_us", StringComparison.OrdinalIgnoreCase)) - { - if (!fallbackTranslations.TryGetValue(modId, out Dictionary? translations)) - { - translations = new Dictionary(StringComparer.Ordinal); - fallbackTranslations[modId] = translations; - } - - MergeTranslationsFromZipEntry(entry, translations); - } - else if (language.Equals(selectedLanguage, StringComparison.OrdinalIgnoreCase)) - { - if (!selectedTranslations.TryGetValue(modId, out Dictionary? translations)) - { - translations = new Dictionary(StringComparer.Ordinal); - selectedTranslations[modId] = translations; - } - - MergeTranslationsFromZipEntry(entry, translations); - } - } - - Dictionary> mergedTranslations = - new(StringComparer.OrdinalIgnoreCase); - - foreach (string modId in requestedModIds) - { - Dictionary modTranslations = new(StringComparer.Ordinal); - - if (fallbackTranslations.TryGetValue(modId, out Dictionary? fallback)) - { - foreach (var (key, value) in fallback) - modTranslations[key] = value; - } - - if (selectedTranslations.TryGetValue(modId, out Dictionary? selected)) - { - foreach (var (key, value) in selected) - modTranslations[key] = value; - } - - if (modTranslations.Count > 0) - mergedTranslations[modId] = modTranslations; - } - - return mergedTranslations; - } - - private static bool TryGetForgeModLanguage(string entryPath, [NotNullWhen(true)] out string? modId, - [NotNullWhen(true)] out string? language) - { - modId = null; - language = null; - - string[] pathParts = entryPath - .Replace('\\', '/') - .Split('/', StringSplitOptions.RemoveEmptyEntries); - - if (pathParts.Length != 4 - || !pathParts[0].Equals("assets", StringComparison.OrdinalIgnoreCase) - || !pathParts[2].Equals("lang", StringComparison.OrdinalIgnoreCase) - || !pathParts[3].EndsWith(".json", StringComparison.OrdinalIgnoreCase)) - { - return false; - } - - modId = NormalizeForgeModId(pathParts[1]); - language = NormalizeLanguageCode(Path.GetFileNameWithoutExtension(pathParts[3])); - return !string.IsNullOrEmpty(modId) && !string.IsNullOrEmpty(language); - } - - private static string NormalizeForgeModId(string modId) - { - return modId.Trim().ToLowerInvariant(); - } - - private static string NormalizeLanguageCode(string language) - { - return language.Trim().ToLowerInvariant().Replace('-', '_'); - } - - private static IEnumerable GetForgeModTranslationDirectories() - { - string? configuredPath = Config.Main.Advanced.ForgeModTranslationPath?.Trim(); - if (!string.IsNullOrWhiteSpace(configuredPath)) - { - string overridePath = Path.GetFullPath(configuredPath); - if (Directory.Exists(overridePath)) - yield return overridePath; - - yield break; - } - - HashSet yieldedPaths = new(PathComparer); - - foreach (string candidate in GetDefaultForgeModTranslationDirectories()) - { - string fullPath = Path.GetFullPath(candidate); - if (Directory.Exists(fullPath) && yieldedPaths.Add(fullPath)) - yield return fullPath; - } - - if (!Config.Main.Advanced.AutoDiscoverForgeModTranslationSources) - yield break; - - foreach (string candidate in DiscoverLauncherForgeModTranslationDirectories()) - { - string fullPath = Path.GetFullPath(candidate); - if (Directory.Exists(fullPath) && yieldedPaths.Add(fullPath)) - yield return fullPath; - } - } - - private static IEnumerable GetDefaultForgeModTranslationDirectories() - { - yield return LocalForgeModTranslationDirectory; - } - - private static IEnumerable DiscoverLauncherForgeModTranslationDirectories() - { - if (TryGetOfficialMinecraftModsDirectory(out string? officialModsDirectory)) - yield return officialModsDirectory; - - foreach (string prismModsDirectory in EnumerateInstanceModsDirectories(GetPrismLauncherInstancesDirectory())) - yield return prismModsDirectory; - - foreach (string curseForgeModsDirectory in EnumerateInstanceModsDirectories(GetCurseForgeInstancesDirectory(), "mods")) - yield return curseForgeModsDirectory; - } - - private static IEnumerable EnumerateInstanceModsDirectories(string? instancesDirectory, params string[] relativeModsPaths) - { - if (string.IsNullOrWhiteSpace(instancesDirectory) || !Directory.Exists(instancesDirectory)) - yield break; - - string[] instanceDirectories; - try - { - instanceDirectories = Directory.GetDirectories(instancesDirectory); - } - catch (IOException) - { - yield break; - } - catch (UnauthorizedAccessException) - { - yield break; - } - - foreach (string instanceDirectory in instanceDirectories) - { - foreach (string relativeModsPath in relativeModsPaths.Length > 0 - ? relativeModsPaths - : [Path.Combine(".minecraft", "mods"), Path.Combine("minecraft", "mods"), "mods"]) - { - string modsDirectory = Path.Combine(instanceDirectory, relativeModsPath); - if (Directory.Exists(modsDirectory)) - yield return modsDirectory; - } - } - } - - private static bool TryGetOfficialMinecraftModsDirectory([NotNullWhen(true)] out string? modsDirectory) - { - modsDirectory = null; - string? userProfile = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); - if (string.IsNullOrWhiteSpace(userProfile)) - return false; - - string baseMinecraftDirectory = OperatingSystem.IsWindows() - ? Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), ".minecraft") - : Path.Combine(userProfile, ".minecraft"); - - modsDirectory = Path.Combine(baseMinecraftDirectory, "mods"); - return true; - } - - private static string? GetPrismLauncherInstancesDirectory() - { - string? userProfile = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); - if (string.IsNullOrWhiteSpace(userProfile)) - return null; - - if (OperatingSystem.IsWindows()) - return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "PrismLauncher", "instances"); - - if (OperatingSystem.IsMacOS()) - return Path.Combine(userProfile, "Library", "Application Support", "PrismLauncher", "instances"); - - return Path.Combine(userProfile, ".local", "share", "PrismLauncher", "instances"); - } - - private static string? GetCurseForgeInstancesDirectory() - { - string? userProfile = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); - if (string.IsNullOrWhiteSpace(userProfile)) - return null; - - return Path.Combine(userProfile, "curseforge", "minecraft", "Instances"); - } - - private static readonly StringComparer PathComparer = - OperatingSystem.IsWindows() ? StringComparer.OrdinalIgnoreCase : StringComparer.Ordinal; - - private static string ComputeFileSha256(string filePath) - { - using FileStream stream = File.OpenRead(filePath); - using SHA256 sha256 = SHA256.Create(); - return Convert.ToHexString(sha256.ComputeHash(stream)).ToLowerInvariant(); - } - - private static bool TryLoadCachedForgeModTranslations(string cacheFilePath, string sourceHash, - [NotNullWhen(true)] out Dictionary>? translationsByModId) - { - translationsByModId = null; - - if (!File.Exists(cacheFilePath)) - return false; - - try - { - using FileStream cacheFile = File.OpenRead(cacheFilePath); - ForgeModTranslationCacheEntry? cacheEntry = - JsonSerializer.Deserialize(cacheFile); - - if (cacheEntry is not null - && cacheEntry.CacheVersion == ForgeModTranslationCacheVersion - && cacheEntry.Language.Equals(Config.Main.Advanced.Language, StringComparison.OrdinalIgnoreCase) - && cacheEntry.SourceHash.Equals(sourceHash, StringComparison.OrdinalIgnoreCase) - && cacheEntry.TranslationsByModId.Count > 0) - { - translationsByModId = cacheEntry.TranslationsByModId.ToDictionary( - static entry => entry.Key, - static entry => new Dictionary(entry.Value, StringComparer.Ordinal), - StringComparer.OrdinalIgnoreCase); - return true; - } - } - catch (IOException) - { - } - catch (JsonException) - { - } - - try - { - File.Delete(cacheFilePath); - } - catch (IOException) - { - } - - return false; - } - - private static void SaveCachedForgeModTranslations(string cacheFilePath, string sourceHash, - Dictionary> translationsByModId) - { - if (translationsByModId.Count == 0) - return; - - string? cacheDirectory = Path.GetDirectoryName(cacheFilePath); - if (string.IsNullOrEmpty(cacheDirectory)) - return; - - Directory.CreateDirectory(cacheDirectory); - - ForgeModTranslationCacheEntry cacheEntry = new() - { - CacheVersion = ForgeModTranslationCacheVersion, - Language = Config.Main.Advanced.Language, - SourceHash = sourceHash, - TranslationsByModId = translationsByModId.ToDictionary( - static entry => entry.Key, - static entry => new Dictionary(entry.Value, StringComparer.Ordinal), - StringComparer.OrdinalIgnoreCase) - }; - - File.WriteAllText(cacheFilePath, JsonSerializer.Serialize(cacheEntry), Encoding.UTF8); - } - - private static string GetForgeModTranslationCacheFilePath(string sourceHash) - { - return Path.Combine("lang", "forgemods", $"{sourceHash}.{NormalizeLanguageCode(Config.Main.Advanced.Language)}.json"); - } - - private static bool TryLoadCachedResourcePackTranslations(string cacheFilePath, Uri resourcePackUri, string hash, - [NotNullWhen(true)] out Dictionary? translations) - { - translations = null; - - if (!File.Exists(cacheFilePath)) - return false; - - try - { - using FileStream cacheFile = File.OpenRead(cacheFilePath); - ResourcePackTranslationCacheEntry? cacheEntry = - JsonSerializer.Deserialize(cacheFile); - - if (cacheEntry is not null - && cacheEntry.CacheVersion == ResourcePackTranslationCacheVersion - && cacheEntry.Language.Equals(Config.Main.Advanced.Language, StringComparison.OrdinalIgnoreCase) - && cacheEntry.SourceUrl.Equals(resourcePackUri.AbsoluteUri, StringComparison.Ordinal) - && cacheEntry.SourceHash.Equals(hash, StringComparison.OrdinalIgnoreCase) - && cacheEntry.Translations.Count > 0) - { - translations = new Dictionary(cacheEntry.Translations, StringComparer.Ordinal); - return true; - } - } - catch (IOException) - { - } - catch (JsonException) - { - } - - try - { - File.Delete(cacheFilePath); - } - catch (IOException) - { - } - - return false; - } - - private static void SaveCachedResourcePackTranslations(string cacheFilePath, Uri resourcePackUri, string hash, - Dictionary translations) - { - if (translations.Count == 0) - return; - - string? cacheDirectory = Path.GetDirectoryName(cacheFilePath); - if (string.IsNullOrEmpty(cacheDirectory)) - return; - - Directory.CreateDirectory(cacheDirectory); - - ResourcePackTranslationCacheEntry cacheEntry = new() - { - CacheVersion = ResourcePackTranslationCacheVersion, - Language = Config.Main.Advanced.Language, - SourceUrl = resourcePackUri.AbsoluteUri, - SourceHash = hash, - Translations = new Dictionary(translations, StringComparer.Ordinal) - }; - - File.WriteAllText(cacheFilePath, JsonSerializer.Serialize(cacheEntry), Encoding.UTF8); - } - - private static string GetResourcePackTranslationCacheFilePath(Uri resourcePackUri, string hash) - { - string cacheKey = GetResourcePackTranslationCacheKey(resourcePackUri, hash); - return Path.Combine("lang", "resourcepacks", $"{cacheKey}.{Config.Main.Advanced.Language}.json"); - } - - private static string GetResourcePackTranslationCacheKey(Uri resourcePackUri, string hash) - { - if (IsValidSha1(hash)) - return hash.ToLowerInvariant(); - - byte[] urlHash = SHA256.HashData(Encoding.UTF8.GetBytes(resourcePackUri.AbsoluteUri)); - return "url-" + Convert.ToHexString(urlHash).ToLowerInvariant(); - } - - private static bool IsValidSha1(string hash) - { - return hash.Length == 40 && hash.All(Uri.IsHexDigit); - } - - /// - /// Mapping from JSON/NBT property names to Minecraft formatting codes (without §). - /// Both "underlined" (canonical Minecraft name) and "underline" (alias) are supported. - /// - private static readonly Dictionary FormattingCodes = new() - { - { "obfuscated", "k" }, - { "bold", "l" }, - { "strikethrough", "m" }, - { "underlined", "n" }, - { "underline", "n" }, - { "italic", "o" }, - }; - - /// Matches a single color code (§0-§9, §a-§f) or a hex color (§#rrggbb). Used to strip color when replacing. - private static readonly Regex ColorCodeRegex = new(@"§(?:[0-9a-f]|#[0-9a-f]{6})", RegexOptions.Compiled); - - /// - /// Use a JSON Object to build the corresponding string - /// - /// JSON object to convert - /// Inherited formatting codes from parent elements (set to "" for function init) - /// Container for links from JSON serialized text - /// returns the Minecraft-formatted string - private static string JSONData2String(System.Text.Json.Nodes.JsonNode? data, string formatting, List? links) - { - string extra_result = ""; - switch (data) - { - case System.Text.Json.Nodes.JsonObject obj: - if (obj.ContainsKey("color")) - { - formatting = ColorCodeRegex.Replace(formatting, ""); - formatting += Color2tag(JSONData2String(obj["color"], "", links)); - } - - foreach (var (key, code) in FormattingCodes) - { - if (obj.ContainsKey(key)) - { - string val = obj[key]!.GetStringValue(); - if (val == "true") - formatting += "§" + code; - else if (val == "false") - formatting = formatting.Replace("§" + code, ""); - } - } - - if (obj.ContainsKey("clickEvent") && links is not null) - { - var clickEvent = obj["clickEvent"]!.AsObject(); - if (clickEvent.ContainsKey("action") - && clickEvent.ContainsKey("value") - && clickEvent["action"]!.GetStringValue() == "open_url" - && !string.IsNullOrEmpty(clickEvent["value"]!.GetStringValue())) - { - links.Add(clickEvent["value"]!.GetStringValue()); - } - } - - if (obj.ContainsKey("extra")) - { - foreach (var item in obj["extra"]!.AsArray()) - extra_result += JSONData2String(item, "§r" + formatting, links); - } - - // Strip any formatting codes that appear before the last §r, since §r resets all - // prior formatting. The greedy .* matches up to the last §r in the string. - formatting = Regex.Replace(formatting, ".*(§r.*)", "$1"); - - if (obj.ContainsKey("text")) - { - // Pass "" to the leaf text node: formatting is already prepended here, - // and the default: case would add it a second time if we passed formatting. - return formatting + JSONData2String(obj["text"], "", links) + extra_result; - } - else if (obj.ContainsKey("translate")) - { - List using_data = new(); - if (obj.ContainsKey("using") && !obj.ContainsKey("with")) - obj["with"] = obj["using"]!.DeepClone(); - if (obj.ContainsKey("with")) - { - foreach (var item in obj["with"]!.AsArray()) - { - using_data.Add(JSONData2String(item, formatting, links)); - } - } - - return formatting + - TranslateString(JSONData2String(obj["translate"], "", links), using_data) + - extra_result; - } - else return extra_result; - - case System.Text.Json.Nodes.JsonArray arr: - string result = ""; - foreach (var item in arr) - { - result += JSONData2String(item, formatting, links); - } - - return result; - - default: - return formatting + data.GetStringValue(); - } - } - - private static string NbtToString(Dictionary nbt, string formatting = "") - { - if (nbt.Count == 1 && nbt.TryGetValue("", out object? rootMessage)) - { - return formatting + (rootMessage?.ToString() ?? string.Empty); - } - - string message = string.Empty; - StringBuilder extraBuilder = new(); - - // Build formatting from color and formatting flags first - if (nbt.TryGetValue("color", out object? color)) - { - formatting = ColorCodeRegex.Replace(formatting, ""); - formatting += Color2tag((string)color); - } - - foreach (var (key, code) in FormattingCodes) - { - if (nbt.TryGetValue(key, out object? flagValue)) - { - bool isActive = flagValue switch - { - byte b => b > 0, - bool b => b, - _ => flagValue?.ToString()?.ToLower() == "true" - }; - if (isActive) - formatting += "§" + code; - else - formatting = formatting.Replace("§" + code, ""); - } - } - - // Process text - if (nbt.TryGetValue("text", out object? textValue)) - message = textValue?.ToString() ?? string.Empty; - - // Process translate - if (nbt.TryGetValue("translate", out object? translate)) - { - var translateKey = (string)translate; - List translateString = new(); - if (nbt.TryGetValue("with", out object? withComponent)) - { - var withs = (object[])withComponent; - for (var i = 0; i < withs.Length; i++) - { - var withDict = withs[i] switch - { - int => new Dictionary { { "text", $"{withs[i]}" } }, - string => new Dictionary { { "text", (string)withs[i] } }, - _ => (Dictionary)withs[i] - }; - translateString.Add(NbtToString(withDict, formatting)); - } - } - message = TranslateString(translateKey, translateString); - } - - // Process extras, each starting with a reset then inheriting the current formatting - if (nbt.TryGetValue("extra", out object? extraValue)) - { - object[] extras = (object[])extraValue; - for (var i = 0; i < extras.Length; i++) - { - var extraDict = extras[i] switch - { - int => new Dictionary { { "text", $"{extras[i]}" } }, - string => new Dictionary { { "text", (string)extras[i] } }, - _ => (Dictionary)extras[i] - }; - extraBuilder.Append(NbtToString(extraDict, "§r" + formatting)); - } - } - - return formatting + message + extraBuilder.ToString(); - } - } -} diff --git a/MinecraftClient/Protocol/Message/LastSeenMessageList.cs b/MinecraftClient/Protocol/Message/LastSeenMessageList.cs deleted file mode 100644 index f66038454c..0000000000 --- a/MinecraftClient/Protocol/Message/LastSeenMessageList.cs +++ /dev/null @@ -1,157 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using static MinecraftClient.Protocol.Message.LastSeenMessageList; - -namespace MinecraftClient.Protocol.Message -{ - /// - /// A list of messages a client has seen. - /// - public class LastSeenMessageList(AcknowledgedMessage[] list) - { - public static readonly LastSeenMessageList EMPTY = new(Array.Empty()); - public static readonly int MAX_ENTRIES = 5; - - public AcknowledgedMessage[] entries = list; - - public void WriteForSign(List data) - { - foreach (AcknowledgedMessage entry in entries) - { - data.Add(70); - data.AddRange(entry.profileId.ToBigEndianBytes()); - data.AddRange(entry.signature); - } - } - - /// - /// A pair of a player's UUID and the signature of the last message they saw, used as an entry of LastSeenMessageList. - /// - public record AcknowledgedMessage - { - public bool pending; - public Guid profileId; - public byte[] signature; - - public AcknowledgedMessage(Guid profileId, byte[] lastSignature, bool pending) - { - this.profileId = profileId; - this.signature = lastSignature; - this.pending = pending; - } - - public AcknowledgedMessage UnmarkAsPending() - { - return this.pending ? new AcknowledgedMessage(profileId, signature, false) : this; - } - } - - /// - /// A record of messages acknowledged by a client. - /// This holds the messages the client has recently seen, as well as the last message they received, if any. - /// - public class Acknowledgment(LastSeenMessageList lastSeenMessageList, AcknowledgedMessage? lastReceivedMessage) - { - public LastSeenMessageList lastSeen = lastSeenMessageList; - public AcknowledgedMessage? lastReceived = lastReceivedMessage; - } - } - - /// - /// Collects the message that are last seen by a client. - /// The message, along with the "last received" message, forms an "acknowledgment" of received messages. - /// They are sent to the server when the client has enough messages received or when they send a message. - /// The maximum amount of message entries are specified in the constructor.The vanilla clients collect 5 entries. - /// Calling add adds the message to the beginning of the entries list, and evicts the oldest message. - /// If there are entries with the same sender profile ID, the older entry will be replaced with null instead of filling the hole. - /// - public class LastSeenMessagesCollector - { - private readonly LastSeenMessageList.AcknowledgedMessage?[] acknowledgedMessages; - private int nextIndex = 0; - internal int messageCount { private set; get; } = 0; - private LastSeenMessageList.AcknowledgedMessage? lastEntry = null; - private LastSeenMessageList lastSeenMessages; - - public LastSeenMessagesCollector(int size) - { - lastSeenMessages = LastSeenMessageList.EMPTY; - acknowledgedMessages = new LastSeenMessageList.AcknowledgedMessage[size]; - } - - public void Add_1_19_2(LastSeenMessageList.AcknowledgedMessage entry) - { - LastSeenMessageList.AcknowledgedMessage? lastEntry = entry; - - for (int i = 0; i < messageCount; ++i) - { - LastSeenMessageList.AcknowledgedMessage curEntry = acknowledgedMessages[i]!; - acknowledgedMessages[i] = lastEntry; - lastEntry = curEntry; - if (curEntry.profileId == entry.profileId) - { - lastEntry = null; - break; - } - } - - if (lastEntry is not null && messageCount < acknowledgedMessages.Length) - acknowledgedMessages[messageCount++] = lastEntry; - - LastSeenMessageList.AcknowledgedMessage[] msgList = new LastSeenMessageList.AcknowledgedMessage[messageCount]; - for (int i = 0; i < messageCount; ++i) - msgList[i] = acknowledgedMessages[i]!; - lastSeenMessages = new LastSeenMessageList(msgList); - } - - public bool Add_1_19_3(LastSeenMessageList.AcknowledgedMessage entry, bool displayed) - { - // net.minecraft.network.message.LastSeenMessagesCollector#add(net.minecraft.network.message.MessageSignatureData, boolean) - // net.minecraft.network.message.LastSeenMessagesCollector#add(net.minecraft.network.message.AcknowledgedMessage) - if (lastEntry is not null && entry.signature.SequenceEqual(lastEntry.signature)) - return false; - lastEntry = entry; - - int index = nextIndex; - nextIndex = (index + 1) % acknowledgedMessages.Length; - - ++messageCount; - acknowledgedMessages[index] = displayed ? entry : null; - - return true; - } - - public Tuple Collect_1_19_3() - { - // net.minecraft.network.message.LastSeenMessagesCollector#collect - int count = ResetMessageCount(); - byte[] bitset = new byte[3]; // new Bitset(20); Todo: Use a complete bitset implementation. - List objectList = new(acknowledgedMessages.Length); - for (int j = 0; j < acknowledgedMessages.Length; ++j) - { - int k = (nextIndex + j) % acknowledgedMessages.Length; - AcknowledgedMessage? acknowledgedMessage = acknowledgedMessages[k]; - if (acknowledgedMessage is null) - continue; - bitset[j / 8] |= (byte)(1 << (j % 8)); // bitSet.set(j, true); - objectList.Add(acknowledgedMessage); - acknowledgedMessages[k] = acknowledgedMessage.UnmarkAsPending(); - } - return new(objectList.ToArray(), bitset, count); - } - - public LastSeenMessageList GetLastSeenMessages() - { - return lastSeenMessages; - } - - public int ResetMessageCount() - { - // net.minecraft.network.message.LastSeenMessagesCollector#resetMessageCount - int cnt = messageCount; - messageCount = 0; - return cnt; - } - } -} diff --git a/MinecraftClient/Protocol/MicrosoftAuthentication.cs b/MinecraftClient/Protocol/MicrosoftAuthentication.cs deleted file mode 100644 index e91806bae5..0000000000 --- a/MinecraftClient/Protocol/MicrosoftAuthentication.cs +++ /dev/null @@ -1,487 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Diagnostics; -using System.Globalization; -using System.Linq; -using System.Runtime.InteropServices; -using System.Threading; - -namespace MinecraftClient.Protocol -{ - static class Microsoft - { - private static readonly string clientId = "54473e32-df8f-42e9-a649-9419b0dab9d3"; - private static readonly string signinUrl = string.Format("https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize?client_id={0}&response_type=code&redirect_uri=https%3A%2F%2Fmccteam.github.io%2Fredirect.html&scope=XboxLive.signin%20offline_access%20openid%20email&prompt=select_account&response_mode=fragment", clientId); - private static readonly string tokenUrl = "https://login.microsoftonline.com/consumers/oauth2/v2.0/token"; - private static readonly string deviceCodeUrl = "https://login.microsoftonline.com/consumers/oauth2/v2.0/devicecode"; - - public static string SignInUrl { get { return signinUrl; } } - - /// - /// Get a sign-in URL with email field pre-filled - /// - /// Login Email - /// Sign-in URL with email pre-filled - public static string GetSignInUrlWithHint(string loginHint) - { - return SignInUrl + "&login_hint=" + Uri.EscapeDataString(loginHint); - } - - /// - /// Request access token by auth code - /// - /// Auth code obtained after user signing in - /// Access token and refresh token - public static LoginResponse RequestAccessToken(string code) - { - string postData = "client_id={0}&grant_type=authorization_code&redirect_uri=https%3A%2F%2Fmccteam.github.io%2Fredirect.html&code={1}"; - postData = string.Format(postData, clientId, code); - return RequestToken(postData); - } - - /// - /// Request access token by refresh token - /// - /// Refresh token - /// Access token and new refresh token - public static LoginResponse RefreshAccessToken(string refreshToken) - { - string postData = "client_id={0}&grant_type=refresh_token&redirect_uri=https%3A%2F%2Fmccteam.github.io%2Fredirect.html&refresh_token={1}"; - postData = string.Format(postData, clientId, refreshToken); - return RequestToken(postData); - } - - /// - /// Initiate the OAuth 2.0 device code flow. - /// Returns a device code response containing the user code and verification URI. - /// - /// Device code response for user to complete authentication - public static DeviceCodeResponse RequestDeviceCode() - { - string postData = string.Format("client_id={0}&scope=XboxLive.signin%20offline_access%20openid%20email", clientId); - - var request = new ProxiedWebRequest(deviceCodeUrl) - { - UserAgent = "MCC/" + Program.Version - }; - var response = request.Post("application/x-www-form-urlencoded", postData); - var jsonData = Json.ParseJson(response.Body); - - if (jsonData?["error"] is not null) - { - throw new Exception(jsonData["error_description"]!.GetStringValue()); - } - - return new DeviceCodeResponse() - { - DeviceCode = jsonData!["device_code"]!.GetStringValue(), - UserCode = jsonData["user_code"]!.GetStringValue(), - VerificationUri = jsonData["verification_uri"]!.GetStringValue(), - ExpiresIn = int.Parse(jsonData["expires_in"]!.GetStringValue(), NumberStyles.Any, CultureInfo.CurrentCulture), - Interval = int.Parse(jsonData["interval"]!.GetStringValue(), NumberStyles.Any, CultureInfo.CurrentCulture), - Message = jsonData["message"]!.GetStringValue() - }; - } - - /// - /// Poll the token endpoint until the user completes device code authentication. - /// Handles authorization_pending, slow_down, and expiration. - /// - /// Device code from - /// Expiration time in seconds - /// Polling interval in seconds - /// Login response with access token and refresh token - public static LoginResponse PollDeviceCodeToken(string deviceCode, int expiresIn, int interval) - { - // Per OAuth 2.0 device code spec, server may respond with "slow_down" requiring - // the client to increase its polling interval by this amount - const int SlowDownIncrementSeconds = 5; - - string postData = string.Format( - "client_id={0}&grant_type=urn:ietf:params:oauth:grant-type:device_code&device_code={1}", - clientId, deviceCode); - - var stopwatch = Stopwatch.StartNew(); - int pollInterval = interval; - - while (stopwatch.Elapsed.TotalSeconds < expiresIn) - { - Thread.Sleep(pollInterval * 1000); - - var request = new ProxiedWebRequest(tokenUrl) - { - UserAgent = "MCC/" + Program.Version - }; - var response = request.Post("application/x-www-form-urlencoded", postData); - var jsonData = Json.ParseJson(response.Body); - - if (jsonData?["error"] is not null) - { - string error = jsonData["error"]!.GetStringValue(); - - if (error == "authorization_pending") - { - // User hasn't completed auth yet, keep polling - continue; - } - else if (error == "slow_down") - { - // Server asked us to slow down - pollInterval += SlowDownIncrementSeconds; - continue; - } - else if (error == "expired_token") - { - throw new Exception("Device code expired. Please try again."); - } - else if (error == "authorization_declined") - { - throw new Exception("Authorization was declined by the user."); - } - else - { - throw new Exception(jsonData["error_description"]!.GetStringValue()); - } - } - - // Success - parse the token response - string accessToken = jsonData!["access_token"]!.GetStringValue(); - string refreshToken = jsonData["refresh_token"]!.GetStringValue(); - int tokenExpiresIn = int.Parse(jsonData["expires_in"]!.GetStringValue(), NumberStyles.Any, CultureInfo.CurrentCulture); - - // Extract email from JWT id_token - string payload = JwtPayloadDecode.GetPayload(jsonData["id_token"]!.GetStringValue()); - var jsonPayload = Json.ParseJson(payload); - string email = jsonPayload?["email"]?.GetStringValue() ?? string.Empty; - - return new LoginResponse() - { - Email = email, - AccessToken = accessToken, - RefreshToken = refreshToken, - ExpiresIn = tokenExpiresIn - }; - } - - throw new Exception("Device code authentication timed out."); - } - - /// - /// Perform request to obtain access token by code or by refresh token - /// - /// Complete POST data for the request - /// - private static LoginResponse RequestToken(string postData) - { - var request = new ProxiedWebRequest(tokenUrl) - { - UserAgent = "MCC/" + Program.Version - }; - var response = request.Post("application/x-www-form-urlencoded", postData); - var jsonData = Json.ParseJson(response.Body); - - // Error handling - if (jsonData?["error"] is not null) - { - throw new Exception(jsonData["error_description"]!.GetStringValue()); - } - else - { - string accessToken = jsonData!["access_token"]!.GetStringValue(); - string refreshToken = jsonData["refresh_token"]!.GetStringValue(); - int expiresIn = int.Parse(jsonData["expires_in"]!.GetStringValue(), NumberStyles.Any, CultureInfo.CurrentCulture); - - // Extract email from JWT - string payload = JwtPayloadDecode.GetPayload(jsonData["id_token"]!.GetStringValue()); - var jsonPayload = Json.ParseJson(payload); - string email = jsonPayload?["email"]?.GetStringValue() ?? string.Empty; - return new LoginResponse() - { - Email = email, - AccessToken = accessToken, - RefreshToken = refreshToken, - ExpiresIn = expiresIn - }; - } - } - - public static void OpenBrowser(string link) - { - try - { - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - var ps = new ProcessStartInfo(link) - { - UseShellExecute = true, - Verb = "open" - }; - - Process.Start(ps); - } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - { - Process.Start("xdg-open", link); - } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - Process.Start("open", link); - } - else - { - ConsoleIO.WriteLine("Platform not supported, open up the link manually: " + link); - } - } - catch (Exception e) - { - ConsoleIO.WriteLine("Cannot open browser\n" + e.Message + "\n" + e.StackTrace); - } - } - - public struct LoginResponse - { - public string Email; - public string AccessToken; - public string RefreshToken; - public int ExpiresIn; - } - - public struct DeviceCodeResponse - { - public string DeviceCode; - public string UserCode; - public string VerificationUri; - public int ExpiresIn; - public int Interval; - public string Message; - } - } - - static class XboxLive - { - private static readonly string xbl = "https://user.auth.xboxlive.com/user/authenticate"; - private static readonly string xsts = "https://xsts.auth.xboxlive.com/xsts/authorize"; - - private static readonly string userAgent = "Mozilla/5.0 (XboxReplay; XboxLiveAuth/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"; - - /// - /// Xbox Live Authenticate - /// - /// - /// - public static XblAuthenticateResponse XblAuthenticate(Microsoft.LoginResponse loginResponse) - { - var request = new ProxiedWebRequest(xbl) - { - UserAgent = userAgent, - Accept = "application/json" - }; - request.Headers.Add("x-xbl-contract-version", "0"); - - // OAuth tokens from our own client ID require "d=" prefix for XBL authentication - var accessToken = "d=" + loginResponse.AccessToken; - - string payload = "{" - + "\"Properties\": {" - + "\"AuthMethod\": \"RPS\"," - + "\"SiteName\": \"user.auth.xboxlive.com\"," - + "\"RpsTicket\": \"" + accessToken + "\"" - + "}," - + "\"RelyingParty\": \"http://auth.xboxlive.com\"," - + "\"TokenType\": \"JWT\"" - + "}"; - var response = request.Post("application/json", payload); - if (Settings.Config.Logging.DebugMessages) - { - ConsoleIO.WriteLine(response.ToString()); - } - if (response.StatusCode == 200) - { - string jsonString = response.Body; - var json = Json.ParseJson(jsonString); - string token = json!["Token"]!.GetStringValue(); - string userHash = json["DisplayClaims"]!["xui"]![0]!["uhs"]!.GetStringValue(); - return new XblAuthenticateResponse() - { - Token = token, - UserHash = userHash - }; - } - else - { - throw new Exception("XBL Authentication failed"); - } - } - - /// - /// XSTS Authenticate - /// - /// Xbox Secure Token Service - exchanges XBL token for a service-specific XSTS token - /// - /// - public static XSTSAuthenticateResponse XSTSAuthenticate(XblAuthenticateResponse xblResponse) - { - var request = new ProxiedWebRequest(xsts) - { - UserAgent = userAgent, - Accept = "application/json" - }; - request.Headers.Add("x-xbl-contract-version", "1"); - - string payload = "{" - + "\"Properties\": {" - + "\"SandboxId\": \"RETAIL\"," - + "\"UserTokens\": [" - + "\"" + xblResponse.Token + "\"" - + "]" - + "}," - + "\"RelyingParty\": \"rp://api.minecraftservices.com/\"," - + "\"TokenType\": \"JWT\"" - + "}"; - var response = request.Post("application/json", payload); - if (Settings.Config.Logging.DebugMessages) - { - ConsoleIO.WriteLine(response.ToString()); - } - if (response.StatusCode == 200) - { - string jsonString = response.Body; - var json = Json.ParseJson(jsonString); - string token = json!["Token"]!.GetStringValue(); - string userHash = json["DisplayClaims"]!["xui"]![0]!["uhs"]!.GetStringValue(); - return new XSTSAuthenticateResponse() - { - Token = token, - UserHash = userHash - }; - } - else - { - if (response.StatusCode == 401) - { - var json = Json.ParseJson(response.Body); - if (json!["XErr"]!.GetStringValue() == "2148916233") - { - throw new Exception("The account doesn't have an Xbox account"); - } - else if (json["XErr"]!.GetStringValue() == "2148916238") - { - throw new Exception("The account is a child (under 18) and cannot proceed unless the account is added to a Family by an adult"); - } - else throw new Exception("Unknown XSTS error code: " + json["XErr"]!.GetStringValue()); - } - else - { - throw new Exception("XSTS Authentication failed"); - } - } - } - - public struct XblAuthenticateResponse - { - public string Token; - public string UserHash; - } - - public struct XSTSAuthenticateResponse - { - public string Token; - public string UserHash; - } - } - - static class MinecraftWithXbox - { - private static readonly string loginWithXbox = "https://api.minecraftservices.com/authentication/login_with_xbox"; - private static readonly string ownership = "https://api.minecraftservices.com/entitlements/mcstore"; - private static readonly string profile = "https://api.minecraftservices.com/minecraft/profile"; - - /// - /// Login to Minecraft using the XSTS token and user hash obtained before - /// - /// - /// - /// - public static string LoginWithXbox(string userHash, string xstsToken) - { - var request = new ProxiedWebRequest(loginWithXbox) - { - Accept = "application/json" - }; - - string payload = "{\"identityToken\": \"XBL3.0 x=" + userHash + ";" + xstsToken + "\"}"; - var response = request.Post("application/json", payload); - - if (Settings.Config.Logging.DebugMessages) - { - ConsoleIO.WriteLine(response.ToString()); - } - - string jsonString = response.Body; - var json = Json.ParseJson(jsonString); - - return json!["access_token"]!.GetStringValue(); - } - - /// - /// Check if user own Minecraft by access token - /// - /// - /// True if the user own the game - public static bool UserHasGame(string accessToken) - { - var request = new ProxiedWebRequest(ownership); - request.Headers.Add("Authorization", string.Format("Bearer {0}", accessToken)); - var response = request.Get(); - - if (Settings.Config.Logging.DebugMessages) - { - ConsoleIO.WriteLine(response.ToString()); - } - - string jsonString = response.Body; - var json = Json.ParseJson(jsonString); - return json!["items"]!.AsArray().Count > 0; - } - - public static UserProfile GetUserProfile(string accessToken) - { - var request = new ProxiedWebRequest(profile); - request.Headers.Add("Authorization", string.Format("Bearer {0}", accessToken)); - var response = request.Get(); - - if (Settings.Config.Logging.DebugMessages) - { - ConsoleIO.WriteLine(response.ToString()); - } - - string jsonString = response.Body; - var json = Json.ParseJson(jsonString); - return new UserProfile() - { - UUID = json!["id"]!.GetStringValue(), - UserName = json["name"]!.GetStringValue() - }; - } - - public struct UserProfile - { - public string UUID; - public string UserName; - } - } - - /// - /// Helper class - /// - static class Request - { - static public Dictionary ParseQueryString(string query) - { - return query.Split('&') - .ToDictionary(c => c.Split('=')[0], - c => Uri.UnescapeDataString(c.Split('=')[1])); - } - } -} diff --git a/MinecraftClient/Protocol/MojangAPI.cs b/MinecraftClient/Protocol/MojangAPI.cs deleted file mode 100644 index b05e6a7144..0000000000 --- a/MinecraftClient/Protocol/MojangAPI.cs +++ /dev/null @@ -1,287 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Net.Http; -using System.Threading.Tasks; - -/// !!! ATTENTION !!! -/// By using these functions you agree to the ToS of the Mojang API. -/// You should note that all public APIs are rate limited so you are expected to cache the results. -/// This is currently set at 600 requests per 10 minutes but this may change. -/// Source: https://wiki.vg/Mojang_API -/// !!! ATTENTION !!! - -namespace MinecraftClient.Protocol -{ - // Enum to display the status of different services - public enum ServiceStatus { red, yellow, green }; - - /// - /// Information about a players Skin. - /// Empty string if not available. - /// - public record SkinInfo(string SkinUrl = "", string CapeUrl = "", string SkinModel = ""); - - /// - /// Status of the single Mojang services - /// - public class MojangServiceStatus - { - public readonly ServiceStatus MinecraftNet; - public readonly ServiceStatus SessionMinecraftNet; - public readonly ServiceStatus AccountMojangCom; - public readonly ServiceStatus AuthserverMojangCom; - public readonly ServiceStatus SessionserverMojangCom; - public readonly ServiceStatus ApiMojangCom; - public readonly ServiceStatus TexturesMinecraftNet; - public readonly ServiceStatus MojangCom; - - public MojangServiceStatus(ServiceStatus minecraftNet = ServiceStatus.red, - ServiceStatus sessionMinecraftNet = ServiceStatus.red, - ServiceStatus accountMojangCom = ServiceStatus.red, - ServiceStatus authserverMojangCom = ServiceStatus.red, - ServiceStatus sessionserverMojangCom = ServiceStatus.red, - ServiceStatus apiMojangCom = ServiceStatus.red, - ServiceStatus texturesMinecraftNet = ServiceStatus.red, - ServiceStatus mojangCom = ServiceStatus.red) - { - MinecraftNet = minecraftNet; - SessionMinecraftNet = sessionMinecraftNet; - AccountMojangCom = accountMojangCom; - AuthserverMojangCom = authserverMojangCom; - SessionserverMojangCom = sessionserverMojangCom; - ApiMojangCom = apiMojangCom; - TexturesMinecraftNet = texturesMinecraftNet; - MojangCom = mojangCom; - } - } - - /// - /// Provides methods to easily interact with the Mojang API. - /// - public static class MojangAPI - { - // Initialize webclient for all functions - private static readonly HttpClient httpClient = new(); - - // Can be removed in newer C# versions. - // Replace with DateTimeOffset.FromUnixTimeMilliseconds() - /// - /// Converts a Unix time to a normal Datetime - /// - /// A unix timestamp as double - /// Datetime of unix timestamp - private static DateTime UnixTimeStampToDateTime(double unixTimeStamp) - { - // Unix timestamp is seconds past epoch - DateTime dateTime = new(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); - dateTime = dateTime.AddMilliseconds(unixTimeStamp).ToLocalTime(); - return dateTime; - } - // Can be removed in newer C# versions. - - /// - /// Converts a string to a ServiceStatus enum. - /// - /// string to convert - /// ServiceStatus enum, red as default. - private static ServiceStatus StringToServiceStatus(string s) - { - - if (Enum.TryParse(s, out ServiceStatus servStat)) - { - return servStat; - } - else - { - // return red as standard value. - return ServiceStatus.red; - } - } - - /// - /// Obtain the UUID of a Player through its name - /// - /// Playername - /// UUID as string - public static string NameToUuid(string name) - { - try - { - Task fetchTask = httpClient.GetStringAsync("https://api.mojang.com/users/profiles/minecraft/" + name); - fetchTask.Wait(); - string result = Json.ParseJson(fetchTask.Result)!["id"]!.GetStringValue(); - fetchTask.Dispose(); - return result; - } - catch (Exception) { return string.Empty; } - } - - /// - /// Obtain the Name of a player through its UUID - /// - /// UUID of a player - /// Players UUID - public static string UuidToCurrentName(string uuid) - { - // Perform web request - try - { - Task fetchTask = httpClient.GetStringAsync("https://api.mojang.com/user/profiles/" + uuid + "/names"); - fetchTask.Wait(); - var nameChanges = Json.ParseJson(fetchTask.Result)!.AsArray(); - fetchTask.Dispose(); - - // Names are sorted from past to most recent. We need to get the last name in the list - return nameChanges[^1]!["name"]!.GetStringValue(); - } - catch (Exception) { return string.Empty; } - } - - /// - /// Get the name history from a UUID - /// - /// UUID of a player - /// Name history, as a dictionary - public static Dictionary UuidToNameHistory(string uuid) - { - Dictionary tempDict = new(); - System.Text.Json.Nodes.JsonArray jsonDataList; - - // Perform web request - try - { - Task fetchTask = httpClient.GetStringAsync("https://api.mojang.com/user/profiles/" + uuid + "/names"); - fetchTask.Wait(); - jsonDataList = Json.ParseJson(fetchTask.Result)!.AsArray(); - fetchTask.Dispose(); - } - catch (Exception) { return tempDict; } - - foreach (var jsonData in jsonDataList) - { - var obj = jsonData!.AsObject(); - if (obj.Count > 1) - { - DateTimeOffset creationDate = UnixTimeStampToDateTime(Convert.ToDouble(jsonData["changedToAt"].GetStringValue())); - - tempDict.Add(jsonData["name"]!.GetStringValue(), creationDate.DateTime); - } - // The first entry does not contain a change date. - else if (obj.Count > 0) - { - // Add an undefined time to it. - tempDict.Add(jsonData["name"]!.GetStringValue(), new DateTime()); - } - } - - return tempDict; - } - - /// - /// Get the Mojang API status - /// - /// Dictionary of the Mojang services - public static MojangServiceStatus GetMojangServiceStatus() - { - System.Text.Json.Nodes.JsonArray jsonDataList; - - // Perform web request - try - { - Task fetchTask = httpClient.GetStringAsync("https://status.mojang.com/check"); - fetchTask.Wait(); - jsonDataList = Json.ParseJson(fetchTask.Result)!.AsArray(); - fetchTask.Dispose(); - } - catch (Exception) - { - return new MojangServiceStatus(); - } - - // Convert string to enum values and store them inside a MojangeServiceStatus object. - return new MojangServiceStatus(minecraftNet: StringToServiceStatus(jsonDataList[0]!["minecraft.net"]!.GetStringValue()), - sessionMinecraftNet: StringToServiceStatus(jsonDataList[1]!["session.minecraft.net"]!.GetStringValue()), - accountMojangCom: StringToServiceStatus(jsonDataList[2]!["account.mojang.com"]!.GetStringValue()), - authserverMojangCom: StringToServiceStatus(jsonDataList[3]!["authserver.mojang.com"]!.GetStringValue()), - sessionserverMojangCom: StringToServiceStatus(jsonDataList[4]!["sessionserver.mojang.com"]!.GetStringValue()), - apiMojangCom: StringToServiceStatus(jsonDataList[5]!["api.mojang.com"]!.GetStringValue()), - texturesMinecraftNet: StringToServiceStatus(jsonDataList[6]!["textures.minecraft.net"]!.GetStringValue()), - mojangCom: StringToServiceStatus(jsonDataList[7]!["mojang.com"]!.GetStringValue()) - ); - } - - /// - /// Obtain links to skin, skinmodel and cape of a player. - /// - /// UUID of a player - /// Dictionary with a link to the skin and cape of a player. - public static SkinInfo GetSkinInfo(string uuid) - { - System.Text.Json.Nodes.JsonObject textureObj; - string base64SkinInfo; - System.Text.Json.Nodes.JsonNode? decodedJsonSkinInfo; - - // Perform web request - try - { - Task fetchTask = httpClient.GetStringAsync("https://sessionserver.mojang.com/session/minecraft/profile/" + uuid); - fetchTask.Wait(); - // Obtain the Base64 encoded skin information from the API. Discard the rest, since it can be obtained easier through other requests. - base64SkinInfo = Json.ParseJson(fetchTask.Result)!["properties"]![0]!["value"]!.GetStringValue(); - fetchTask.Dispose(); - } - catch (Exception) { return new SkinInfo(); } - - // Parse the decoded string to the JSON format. - decodedJsonSkinInfo = Json.ParseJson(System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(base64SkinInfo))); - - // Assert temporary variable for readablity. - // Contains skin and cape information. - textureObj = decodedJsonSkinInfo!["textures"]!.AsObject(); - - // Can apparently be missing, if no custom skin is set. - if (textureObj.ContainsKey("SKIN")) - { - return new SkinInfo(SkinUrl: textureObj["SKIN"]!["url"] is not null ? textureObj["SKIN"]!["url"]!.GetStringValue() : string.Empty, - CapeUrl: textureObj.ContainsKey("CAPE") ? textureObj["CAPE"]!["url"]!.GetStringValue() : string.Empty, - SkinModel: textureObj["SKIN"]!["metadata"] is not null ? "Alex" : "Steve"); - } - else - { - return new SkinInfo(CapeUrl: textureObj.ContainsKey("CAPE") ? textureObj["CAPE"]!["url"]!.GetStringValue() : string.Empty, - SkinModel: DefaultModelAlex(uuid) ? "Alex" : "Steve"); - } - } - - /// - /// Gets the playermodel that is assigned to the account by default. - /// (Before the skin is changed for the first time.) - /// - /// UUID of a Player - /// True if the default model for this UUID is Alex - public static bool DefaultModelAlex(string uuid) - { - return HashCode(uuid) % 2 == 1; - } - - /// - /// Creates the hash of an UUID - /// - /// UUID of a player. - /// - private static int HashCode(string hash) - { - byte[] data = GuidExtensions.ToLittleEndian(new Guid(hash)).ToByteArray(); - - ulong msb = 0; - ulong lsb = 0; - for (int i = 0; i < 8; i++) - msb = (msb << 8) | (uint)(data[i] & 0xff); - for (int i = 8; i < 16; i++) - lsb = (lsb << 8) | (uint)(data[i] & 0xff); - var hilo = msb ^ lsb; - - return ((int)(hilo >> 32)) ^ (int)hilo; - } - } -} diff --git a/MinecraftClient/Protocol/PlayerInfo.cs b/MinecraftClient/Protocol/PlayerInfo.cs deleted file mode 100644 index c0e211d6ef..0000000000 --- a/MinecraftClient/Protocol/PlayerInfo.cs +++ /dev/null @@ -1,225 +0,0 @@ -using System; -using System.Linq; -using MinecraftClient.Protocol.Message; -using MinecraftClient.Protocol.ProfileKey; - -namespace MinecraftClient.Protocol -{ - public class PlayerInfo - { - public readonly Guid Uuid; - - public readonly string Name; - - // Tuple[]? Property; - - public int Gamemode; - - public int Ping; - - public string? DisplayName; - - public bool Listed = true; - - public int TabListOrder; - - // Entity info - - public Mapping.Entity? entity; - - // For message signature - - public int MessageIndex = -1; - - public Guid ChatUuid = Guid.Empty; - - private PublicKey? PublicKey; - - private DateTime? KeyExpiresAt; - - private bool lastMessageVerified; - - private byte[]? precedingSignature; - - public PlayerInfo(Guid uuid, string name, Tuple[]? property, int gamemode, int ping, string? displayName, long? timeStamp, byte[]? publicKey, byte[]? signature) - { - Uuid = uuid; - Name = name; - if (property is not null) - Property = property; - Gamemode = gamemode; - Ping = ping; - DisplayName = displayName; - lastMessageVerified = false; - if (timeStamp is not null && publicKey is not null && signature is not null) - { - DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds((long)timeStamp); - KeyExpiresAt = dateTimeOffset.UtcDateTime; - try - { - PublicKey = new PublicKey(publicKey, signature); - lastMessageVerified = true; - } - catch (System.Security.Cryptography.CryptographicException) - { - PublicKey = null; - } - } - precedingSignature = null; - } - - public PlayerInfo(string name, Guid uuid) - { - Name = name; - Uuid = uuid; - Gamemode = -1; - Ping = 0; - TabListOrder = 0; - lastMessageVerified = true; - precedingSignature = null; - } - - public void ClearPublicKey() - { - ChatUuid = Guid.Empty; - PublicKey = null; - KeyExpiresAt = null; - } - - public void SetPublicKey(Guid chatUuid, long publicKeyExpiryTime, byte[] encodedPublicKey, byte[] publicKeySignature) - { - ChatUuid = chatUuid; - KeyExpiresAt = DateTimeOffset.FromUnixTimeMilliseconds(publicKeyExpiryTime).UtcDateTime; - try - { - PublicKey = new PublicKey(encodedPublicKey, publicKeySignature); - lastMessageVerified = true; - } - catch (System.Security.Cryptography.CryptographicException) - { - PublicKey = null; - } - } - - public bool IsMessageChainLegal() - { - return lastMessageVerified; - } - - public bool IsKeyExpired() - { - return DateTime.Now.ToUniversalTime() > KeyExpiresAt; - } - - /// - /// Verify message - 1.19 - /// - /// Message content - /// Timestamp - /// Salt - /// Message signature - /// Is this message vaild - public bool VerifyMessage(string message, long timestamp, long salt, ref byte[] signature) - { - if (PublicKey is null || IsKeyExpired()) - return false; - else - { - DateTimeOffset timeOffset = DateTimeOffset.FromUnixTimeMilliseconds(timestamp); - - byte[] saltByte = BitConverter.GetBytes(salt); - Array.Reverse(saltByte); - - return PublicKey.VerifyMessage(message, Uuid, timeOffset, ref saltByte, ref signature); - } - } - - /// - /// Verify message - 1.19.1 and 1.19.2 - /// - /// Message content - /// Timestamp - /// Salt - /// Message signature - /// Preceding message signature - /// LastSeenMessages - /// Is this message chain vaild - public bool VerifyMessage(string message, long timestamp, long salt, ref byte[] signature, ref byte[]? precedingSignature, LastSeenMessageList lastSeenMessages) - { - if (lastMessageVerified == false) - return false; - if (PublicKey is null || IsKeyExpired() || (this.precedingSignature is not null && precedingSignature is null)) - { - lastMessageVerified = false; - return false; - } - if (this.precedingSignature is not null && !this.precedingSignature.SequenceEqual(precedingSignature!)) - { - lastMessageVerified = false; - return false; - } - - DateTimeOffset timeOffset = DateTimeOffset.FromUnixTimeMilliseconds(timestamp); - - byte[] saltByte = BitConverter.GetBytes(salt); - Array.Reverse(saltByte); - - bool res = PublicKey.VerifyMessage(message, Uuid, timeOffset, ref saltByte, ref signature, ref precedingSignature, lastSeenMessages); - - lastMessageVerified = res; - this.precedingSignature = signature; - - return res; - } - - /// - /// Verify message head - 1.19.1 and 1.19.2 - /// - /// Preceding message signature - /// Message signature - /// Message body hash - /// Is this message chain vaild - public bool VerifyMessageHead(ref byte[]? precedingSignature, ref byte[] headerSignature, ref byte[] bodyDigest) - { - if (lastMessageVerified == false) - return false; - if (PublicKey is null || IsKeyExpired() || (this.precedingSignature is not null && precedingSignature is null)) - { - lastMessageVerified = false; - return false; - } - if (this.precedingSignature is not null && !this.precedingSignature.SequenceEqual(precedingSignature!)) - { - lastMessageVerified = false; - return false; - } - - bool res = PublicKey.VerifyHeader(Uuid, ref bodyDigest, ref headerSignature, ref precedingSignature); - - lastMessageVerified = res; - this.precedingSignature = headerSignature; - - return res; - } - - /// - /// Verify message - 1.19.3 and above - /// - /// Message content - /// Timestamp - /// Salt - /// Message signature - /// Preceding message signature - /// LastSeenMessages - /// Is this message chain vaild - public bool VerifyMessage(string message, Guid playerUuid, Guid chatUuid, int messageIndex, long timestamp, long salt, ref byte[] signature, Tuple[] previousMessageSignatures) - { - if (PublicKey is null || IsKeyExpired()) - return false; - - // net.minecraft.server.network.ServerPlayNetworkHandler#validateMessage - return true; - } - } -} diff --git a/MinecraftClient/Protocol/ProfileKey/KeyUtils.cs b/MinecraftClient/Protocol/ProfileKey/KeyUtils.cs deleted file mode 100644 index ca19e24310..0000000000 --- a/MinecraftClient/Protocol/ProfileKey/KeyUtils.cs +++ /dev/null @@ -1,261 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Security.Cryptography; -using System.Text; -using MinecraftClient.Protocol.Handlers; -using MinecraftClient.Protocol.Message; -using static MinecraftClient.Protocol.Message.LastSeenMessageList; - -namespace MinecraftClient.Protocol.ProfileKey -{ - static class KeyUtils - { - private static readonly SHA256 sha256Hash = SHA256.Create(); - - /// - /// Check whether the authentication server supports player profile keys. - /// For Yggdrasil servers, this fetches the authlib-injector metadata and checks the - /// feature.enable_profile_key flag documented at - /// https://github.com/yushijinhun/authlib-injector/wiki/Yggdrasil-%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%8A%80%E6%9C%AF%E8%A7%84%E8%8C%83 - /// - public static bool AuthServerSupportsProfileKeys(bool isYggdrasil) - { - if (!isYggdrasil) - return true; - - ProxiedWebRequest.Response? response = null; - try - { - if (!Settings.Config.Main.General.TryGetAuthServerUri(out Uri? authServerUri)) - return false; - - var request = new ProxiedWebRequest(authServerUri.AbsoluteUri) - { - Accept = "application/json" - }; - - response = request.Get(); - if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLine(response.Body.ToString()); - - var json = Json.ParseJson(response.Body); - bool enableProfileKey = json?["meta"]?["feature.enable_profile_key"]?.GetStringValue() == "true"; - return enableProfileKey; - } - catch (Exception e) - { - int code = response is null ? 0 : response.StatusCode; - ConsoleIO.WriteLineFormatted("§cFetch authlib-injector metadata failed: HttpCode = " + code + ", Error = " + e.Message); - if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted("§c" + e.StackTrace); - } - return false; - } - - public static PlayerKeyPair? GetNewProfileKeys(string accessToken, bool isYggdrasil) - { - if (string.IsNullOrWhiteSpace(accessToken)) - return null; - - if (!AuthServerSupportsProfileKeys(isYggdrasil)) - { - if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLine("AuthServer does not support profile keys, will not attempt to fetch them."); - return null; - } - - string certificatesURL = "https://api.minecraftservices.com/player/certificates"; - if (isYggdrasil) - { - if (!Settings.Config.Main.General.TryGetAuthServerUri(out Uri? authServerUri)) - return null; - - certificatesURL = new Uri(authServerUri, "minecraftservices/player/certificates").AbsoluteUri; - } - - ProxiedWebRequest.Response? response = null; - try - { - var request = new ProxiedWebRequest(certificatesURL) - { - Accept = "application/json" - }; - request.Headers.Add("Authorization", string.Format("Bearer {0}", accessToken)); - - response = request.Post("application/json", ""); - - if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLine(response.Body.ToString()); - - if (response.StatusCode < 200 || response.StatusCode >= 300) - { - throw new InvalidOperationException(string.IsNullOrWhiteSpace(response.Body) - ? "Certificate endpoint returned an error response." - : response.Body); - } - - var json = Json.ParseJson(response.Body); - if (json?["keyPair"]?["publicKey"] is null - || json["keyPair"]?["privateKey"] is null - || json["publicKeySignature"] is null - || json["publicKeySignatureV2"] is null - || json["expiresAt"] is null - || json["refreshedAfter"] is null) - { - throw new InvalidOperationException("Certificate endpoint returned an unexpected payload."); - } - - PublicKey publicKey = new(pemKey: json!["keyPair"]!["publicKey"]!.GetStringValue(), - sig: json["publicKeySignature"]!.GetStringValue(), - sigV2: json["publicKeySignatureV2"]!.GetStringValue()); - - PrivateKey privateKey = new(pemKey: json["keyPair"]!["privateKey"]!.GetStringValue()); - - return new PlayerKeyPair(publicKey, privateKey, - expiresAt: json["expiresAt"]!.GetStringValue(), - refreshedAfter: json["refreshedAfter"]!.GetStringValue()); - } - catch (Exception e) - { - int code = response is null ? 0 : response.StatusCode; - ConsoleIO.WriteLineFormatted("§cFetch profile key failed: HttpCode = " + code + ", Error = " + e.Message); - if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted("§c" + e.StackTrace); - return null; - } - } - - public static byte[] DecodePemKey(string key, string prefix, string suffix) - { - int i = key.IndexOf(prefix); - if (i != -1) - { - i += prefix.Length; - int j = key.IndexOf(suffix, i); - key = key[i..j]; - } - key = key.Replace("\r", string.Empty); - key = key.Replace("\n", string.Empty); - return Convert.FromBase64String(key); - } - - public static byte[] ComputeHash(byte[] data) - { - return sha256Hash.ComputeHash(data); - } - - public static byte[] GetSignatureData(string message, Guid uuid, DateTimeOffset timestamp, ref byte[] salt) - { - List data = new(); - - data.AddRange(salt); - - data.AddRange(uuid.ToBigEndianBytes()); - - byte[] timestampByte = BitConverter.GetBytes(timestamp.ToUnixTimeSeconds()); - Array.Reverse(timestampByte); - data.AddRange(timestampByte); - - data.AddRange(Encoding.UTF8.GetBytes(message)); - - return data.ToArray(); - } - - public static byte[] GetSignatureData(string message, DateTimeOffset timestamp, ref byte[] salt, LastSeenMessageList lastSeenMessages) - { - List data = new(); - - data.AddRange(salt); - - byte[] timestampByte = BitConverter.GetBytes(timestamp.ToUnixTimeSeconds()); - Array.Reverse(timestampByte); - data.AddRange(timestampByte); - - data.AddRange(Encoding.UTF8.GetBytes(message)); - - data.Add(70); - - lastSeenMessages.WriteForSign(data); - - return data.ToArray(); - } - - public static byte[] GetSignatureData_1_19_3(string message, Guid playerUuid, Guid chatUuid, int messageIndex, DateTimeOffset timestamp, ref byte[] salt, AcknowledgedMessage[] lastSeenMessages) - { - List data = new(); - - // net.minecraft.network.message.SignedMessage#update - data.AddRange(DataTypes.GetInt(1)); - - // message link - // net.minecraft.network.message.MessageLink#update - data.AddRange(DataTypes.GetUUID(playerUuid)); - data.AddRange(DataTypes.GetUUID(chatUuid)); - data.AddRange(DataTypes.GetInt(messageIndex)); - - // message body - // net.minecraft.network.message.MessageBody#update - data.AddRange(salt); - data.AddRange(DataTypes.GetLong(timestamp.ToUnixTimeSeconds())); - byte[] messageBytes = Encoding.UTF8.GetBytes(message); - data.AddRange(DataTypes.GetInt(messageBytes.Length)); - data.AddRange(messageBytes); - data.AddRange(DataTypes.GetInt(lastSeenMessages.Length)); - foreach (AcknowledgedMessage ack in lastSeenMessages) - data.AddRange(ack.signature); - - return data.ToArray(); - } - - public static byte[] GetSignatureData(byte[]? precedingSignature, Guid sender, byte[] bodySign) - { - List data = new(); - - if (precedingSignature is not null) - data.AddRange(precedingSignature); - - data.AddRange(sender.ToBigEndianBytes()); - - data.AddRange(bodySign); - - return data.ToArray(); - } - - public static byte[] GetSignatureData(string message, DateTimeOffset timestamp, ref byte[] salt, int messageCount, Guid sender, Guid sessionUuid) - { - List data = new(); - - // TODO! - byte[] unknownInt1 = BitConverter.GetBytes(1); - Array.Reverse(unknownInt1); - data.AddRange(unknownInt1); - - data.AddRange(sender.ToBigEndianBytes()); - data.AddRange(sessionUuid.ToBigEndianBytes()); - - byte[] msgCountByte = BitConverter.GetBytes(messageCount); - Array.Reverse(msgCountByte); - data.AddRange(msgCountByte); - data.AddRange(salt); - - byte[] timestampByte = BitConverter.GetBytes(timestamp.ToUnixTimeSeconds()); - Array.Reverse(timestampByte); - data.AddRange(timestampByte); - - byte[] msgByte = Encoding.UTF8.GetBytes(message); - byte[] msgLengthByte = BitConverter.GetBytes(msgByte.Length); - Array.Reverse(msgLengthByte); - data.AddRange(msgLengthByte); - data.AddRange(msgByte); - - byte[] unknownInt2 = BitConverter.GetBytes(0); - Array.Reverse(unknownInt2); - data.AddRange(unknownInt2); - - return data.ToArray(); - } - - // Delegate to the shared Json.EscapeString backed by System.Text.Json - public static string EscapeString(string src) => Json.EscapeString(src); - } -} diff --git a/MinecraftClient/Protocol/ProfileKey/KeysCache.cs b/MinecraftClient/Protocol/ProfileKey/KeysCache.cs deleted file mode 100644 index 9af643c7e6..0000000000 --- a/MinecraftClient/Protocol/ProfileKey/KeysCache.cs +++ /dev/null @@ -1,197 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Timers; -using static MinecraftClient.Settings; -using static MinecraftClient.Settings.MainConfigHelper.MainConfig.AdvancedConfig; - -namespace MinecraftClient.Protocol.ProfileKey -{ - /// - /// Handle keys caching and storage. - /// - public static class KeysCache - { - private const string KeysCacheFilePlaintext = "ProfileKeyCache.ini"; - - private static FileMonitor? cachemonitor; - private static readonly Dictionary keys = new(); - private static readonly Timer updatetimer = new(100); - private static readonly List> pendingadds = new(); - - /// - /// Retrieve whether KeysCache contains a keys for the given login. - /// - /// User login used with Minecraft.net - /// TRUE if keys are available - public static bool Contains(string login) - { - return keys.ContainsKey(login); - } - - /// - /// Store keys and save it to disk if required. - /// - /// User login used with Minecraft.net - /// User keys - public static void Store(string login, PlayerKeyPair playerKeyPair) - { - if (Contains(login)) - { - keys[login] = playerKeyPair; - } - else - { - keys.Add(login, playerKeyPair); - } - - if (Config.Main.Advanced.ProfileKeyCache == CacheType.disk && updatetimer.Enabled == true) - { - pendingadds.Add(new KeyValuePair(login, playerKeyPair)); - } - else if (Config.Main.Advanced.ProfileKeyCache == CacheType.disk) - { - SaveToDisk(); - } - } - - /// - /// Retrieve keys for the given login. - /// - /// User login used with Minecraft.net - /// PlayerKeyPair for given login - public static PlayerKeyPair Get(string login) - { - return keys[login]; - } - - /// - /// Initialize cache monitoring to keep cache updated with external changes. - /// - /// TRUE if keys are seeded from file - public static bool InitializeDiskCache() - { - cachemonitor = new FileMonitor(AppDomain.CurrentDomain.BaseDirectory, KeysCacheFilePlaintext, new FileSystemEventHandler(OnChanged)); - updatetimer.Elapsed += HandlePending; - return LoadFromDisk(); - } - - /// - /// Reloads cache on external cache file change. - /// - /// Sender - /// Event data - private static void OnChanged(object sender, FileSystemEventArgs e) - { - updatetimer.Stop(); - updatetimer.Start(); - } - - /// - /// Called after timer elapsed. Reads disk cache and adds new/modified keys back. - /// - /// Sender - /// Event data - private static void HandlePending(object? sender, ElapsedEventArgs e) - { - updatetimer.Stop(); - LoadFromDisk(); - - foreach (KeyValuePair pending in pendingadds.ToArray()) - { - Store(pending.Key, pending.Value); - pendingadds.Remove(pending); - } - } - - /// - /// Reads cache file and loads KeysInfos into KeysCache. - /// - /// True if data is successfully loaded - private static bool LoadFromDisk() - { - //User-editable keys cache file in text format - if (File.Exists(KeysCacheFilePlaintext)) - { - if (Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted(string.Format(Translations.cache_loading_keys, KeysCacheFilePlaintext)); - - try - { - foreach (string line in FileMonitor.ReadAllLinesWithRetries(KeysCacheFilePlaintext)) - { - if (!line.TrimStart().StartsWith("#")) - { - - int separatorIdx = line.IndexOf('='); - if (separatorIdx >= 1 && line.Length > separatorIdx + 1) - { - string login = line[..separatorIdx]; - string value = line[(separatorIdx + 1)..]; - try - { - PlayerKeyPair playerKeyPair = PlayerKeyPair.FromString(value); - keys[login] = playerKeyPair; - if (Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted(string.Format(Translations.cache_loaded_keys, playerKeyPair.ExpiresAt.ToString())); - } - catch (InvalidDataException e) - { - if (Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted(string.Format(Translations.cache_ignore_string_keys, value, e.Message)); - } - catch (FormatException e) - { - if (Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted(string.Format(Translations.cache_ignore_string_keys, value, e.Message)); - } - catch (ArgumentNullException e) - { - if (Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted(string.Format(Translations.cache_ignore_string_keys, value, e.Message)); - - } - } - else if (Config.Logging.DebugMessages) - { - ConsoleIO.WriteLineFormatted(string.Format(Translations.cache_ignore_line_keys, line)); - } - } - } - } - catch (IOException e) - { - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.cache_read_fail_plain_keys, e.Message)); - } - } - - return keys.Count > 0; - } - - /// - /// Saves player's keypair from KeysCache into cache file. - /// - private static void SaveToDisk() - { - if (Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted("§8" + Translations.cache_saving_keys, acceptnewlines: true); - - List KeysCacheLines = new() - { - "# Generated by MCC v" + Program.Version + " - Keep it secret & Edit at own risk!", - "# ProfileKey=PublicKey(base64),PublicKeySignature(base64),PublicKeySignatureV2(base64),PrivateKey(base64),ExpiresAt,RefreshAfter" - }; - foreach (KeyValuePair entry in keys) - KeysCacheLines.Add(entry.Key + '=' + entry.Value.ToString()); - - try - { - FileMonitor.WriteAllLinesWithRetries(KeysCacheFilePlaintext, KeysCacheLines); - } - catch (IOException e) - { - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.cache_save_fail_keys, e.Message)); - } - } - } -} diff --git a/MinecraftClient/Protocol/ProfileKey/PlayerKeyPair.cs b/MinecraftClient/Protocol/ProfileKey/PlayerKeyPair.cs deleted file mode 100644 index 2c1fc58965..0000000000 --- a/MinecraftClient/Protocol/ProfileKey/PlayerKeyPair.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; - -namespace MinecraftClient.Protocol.ProfileKey -{ - public class PlayerKeyPair - { - public PublicKey PublicKey; - - public PrivateKey PrivateKey; - - public DateTime ExpiresAt; - - public DateTime RefreshedAfter; // Todo: add a timer - - private const string DataTimeFormat = "yyyy-MM-ddTHH:mm:ss.ffffffZ"; - - public PlayerKeyPair(PublicKey keyPublic, PrivateKey keyPrivate, string expiresAt, string refreshedAfter) - { - PublicKey = keyPublic; - PrivateKey = keyPrivate; - try - { - ExpiresAt = DateTime.ParseExact(expiresAt, DataTimeFormat, System.Globalization.CultureInfo.InvariantCulture).ToUniversalTime(); - RefreshedAfter = DateTime.ParseExact(refreshedAfter, DataTimeFormat, System.Globalization.CultureInfo.InvariantCulture).ToUniversalTime(); - } - catch - { - ExpiresAt = DateTime.Parse(expiresAt).ToUniversalTime(); - RefreshedAfter = DateTime.Parse(refreshedAfter).ToUniversalTime(); - } - } - - public bool NeedRefresh() - { - return DateTime.Now.ToUniversalTime() > RefreshedAfter; - } - - public bool IsExpired() - { - return DateTime.Now.ToUniversalTime() > ExpiresAt; - } - - public long GetExpirationMilliseconds() - { - DateTimeOffset timeOffset = new(ExpiresAt); - return timeOffset.ToUnixTimeMilliseconds(); - } - - public long GetExpirationSeconds() - { - DateTimeOffset timeOffset = new(ExpiresAt); - return timeOffset.ToUnixTimeSeconds(); - } - - public static PlayerKeyPair FromString(string tokenString) - { - string[] fields = tokenString.Split(','); - - if (fields.Length < 6) - throw new InvalidDataException("Invalid string format"); - - PublicKey publicKey = new(pemKey: fields[0].Trim(), - sig: fields[1].Trim(), sigV2: fields[2].Trim()); - - PrivateKey privateKey = new(pemKey: fields[3].Trim()); - - return new PlayerKeyPair(publicKey, privateKey, fields[4].Trim(), fields[5].Trim()); - } - - public override string ToString() - { - List datas = new(); - datas.Add(Convert.ToBase64String(PublicKey.Key)); - if (PublicKey.Signature is null) - datas.Add(string.Empty); - else - datas.Add(Convert.ToBase64String(PublicKey.Signature)); - if (PublicKey.SignatureV2 is null) - datas.Add(string.Empty); - else - datas.Add(Convert.ToBase64String(PublicKey.SignatureV2)); - datas.Add(Convert.ToBase64String(PrivateKey.Key)); - datas.Add(ExpiresAt.ToString(DataTimeFormat)); - datas.Add(RefreshedAfter.ToString(DataTimeFormat)); - return string.Join(",", datas.ToArray()); - } - } -} diff --git a/MinecraftClient/Protocol/ProfileKey/PrivateKey.cs b/MinecraftClient/Protocol/ProfileKey/PrivateKey.cs deleted file mode 100644 index c471a1033e..0000000000 --- a/MinecraftClient/Protocol/ProfileKey/PrivateKey.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System; -using System.Security.Cryptography; -using MinecraftClient.Protocol.Message; -using static MinecraftClient.Protocol.Message.LastSeenMessageList; - -namespace MinecraftClient.Protocol.ProfileKey -{ - public class PrivateKey - { - public byte[] Key { get; set; } - - private readonly RSA rsa; - - private byte[]? precedingSignature = null; - - public PrivateKey(string pemKey) - { - Key = KeyUtils.DecodePemKey(pemKey, "-----BEGIN RSA PRIVATE KEY-----", "-----END RSA PRIVATE KEY-----"); - - rsa = RSA.Create(); - rsa.ImportPkcs8PrivateKey(Key, out _); - } - - public byte[] SignData(byte[] data) - { - return rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); - } - - /// - /// Sign message - 1.19 - /// - /// Message content - /// Sender uuid - /// Timestamp - /// Salt - /// Signature data - public byte[] SignMessage(string message, Guid uuid, DateTimeOffset timestamp, ref byte[] salt) - { - string messageJson = "{\"text\":\"" + KeyUtils.EscapeString(message) + "\"}"; - - byte[] data = KeyUtils.GetSignatureData(messageJson, uuid, timestamp, ref salt); - - return SignData(data); - } - - /// - /// Sign message - 1.19.1 and 1.19.2 - /// - /// Message content - /// Sender uuid - /// Timestamp - /// Salt - /// LastSeenMessageList - /// Signature data - public byte[] SignMessage(string message, Guid uuid, DateTimeOffset timestamp, ref byte[] salt, LastSeenMessageList lastSeenMessages) - { - byte[] bodySignData = KeyUtils.GetSignatureData(message, timestamp, ref salt, lastSeenMessages); - byte[] bodyDigest = KeyUtils.ComputeHash(bodySignData); - - byte[] msgSignData = KeyUtils.GetSignatureData(precedingSignature, uuid, bodyDigest); - byte[] msgSign = SignData(msgSignData); - - precedingSignature = msgSign; - - return msgSign; - } - - /// - /// Sign message - 1.19.3 and above - /// - /// Message content - /// Sender uuid - /// Timestamp - /// Salt - /// LastSeenMessageList - /// Signature data - public byte[] SignMessage(string message, Guid playerUuid, Guid chatUuid, int messageIndex, DateTimeOffset timestamp, ref byte[] salt, AcknowledgedMessage[] lastSeenMessages) - { - byte[] bodySignData = KeyUtils.GetSignatureData_1_19_3(message, playerUuid, chatUuid, messageIndex, timestamp, ref salt, lastSeenMessages); - - return SignData(bodySignData); - } - - } -} diff --git a/MinecraftClient/Protocol/ProfileKey/PublicKey.cs b/MinecraftClient/Protocol/ProfileKey/PublicKey.cs deleted file mode 100644 index faa8ba33e5..0000000000 --- a/MinecraftClient/Protocol/ProfileKey/PublicKey.cs +++ /dev/null @@ -1,102 +0,0 @@ -using System; -using System.Security.Cryptography; -using MinecraftClient.Protocol.Message; - -namespace MinecraftClient.Protocol.ProfileKey -{ - public class PublicKey - { - public byte[] Key { get; set; } - public byte[]? Signature { get; set; } - public byte[]? SignatureV2 { get; set; } - - private readonly RSA rsa; - - public PublicKey(string pemKey, string? sig = null, string? sigV2 = null) - { - Key = KeyUtils.DecodePemKey(pemKey, "-----BEGIN RSA PUBLIC KEY-----", "-----END RSA PUBLIC KEY-----"); - - rsa = RSA.Create(); - rsa.ImportSubjectPublicKeyInfo(Key, out _); - - if (!string.IsNullOrEmpty(sig)) - Signature = Convert.FromBase64String(sig); - - if (!string.IsNullOrEmpty(sigV2)) - SignatureV2 = Convert.FromBase64String(sigV2!); - - if (SignatureV2 is null || SignatureV2.Length == 0) - SignatureV2 = Signature; - - if (Signature is null || Signature.Length == 0) - Signature = SignatureV2; - } - - public PublicKey(byte[] key, byte[] signature) - { - Key = key; - - rsa = RSA.Create(); - rsa.ImportSubjectPublicKeyInfo(Key, out _); - - Signature = signature; - } - - public bool VerifyData(byte[] data, byte[] signature) - { - return rsa.VerifyData(data, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); - } - - /// - /// Verify message - 1.19 - /// - /// Message content - /// Sender uuid - /// Timestamp - /// Salt - /// Message signature - /// Is this message vaild - public bool VerifyMessage(string message, Guid uuid, DateTimeOffset timestamp, ref byte[] salt, ref byte[] signature) - { - byte[] data = KeyUtils.GetSignatureData(message, uuid, timestamp, ref salt); - - return VerifyData(data, signature); - } - - /// - /// Verify message - 1.19.1 and 1.19.2 - /// - /// Message content - /// Sender uuid - /// Timestamp - /// Salt - /// Message signature - /// Preceding message signature - /// LastSeenMessages - /// Is this message vaild - public bool VerifyMessage(string message, Guid uuid, DateTimeOffset timestamp, ref byte[] salt, ref byte[] signature, ref byte[]? precedingSignature, LastSeenMessageList lastSeenMessages) - { - byte[] bodySignData = KeyUtils.GetSignatureData(message, timestamp, ref salt, lastSeenMessages); - byte[] bodyDigest = KeyUtils.ComputeHash(bodySignData); - - byte[] msgSignData = KeyUtils.GetSignatureData(precedingSignature, uuid, bodyDigest); - - return VerifyData(msgSignData, signature); - } - - /// - /// Verify message head - 1.19.1 and 1.19.2 - /// - /// Message body hash - /// Message signature - /// Is this message header vaild - public bool VerifyHeader(Guid uuid, ref byte[] bodyDigest, ref byte[] signature, ref byte[]? precedingSignature) - { - - byte[] msgSignData = KeyUtils.GetSignatureData(precedingSignature, uuid, bodyDigest); - - return VerifyData(msgSignData, signature); - } - - } -} diff --git a/MinecraftClient/Protocol/ProtocolHandler.cs b/MinecraftClient/Protocol/ProtocolHandler.cs deleted file mode 100644 index 2ebf3ad7e8..0000000000 --- a/MinecraftClient/Protocol/ProtocolHandler.cs +++ /dev/null @@ -1,1455 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Data.Odbc; -using System.Globalization; -using System.Linq; -using System.Net.Http; -using System.Net.Sockets; -using System.Text; -using System.Text.RegularExpressions; -using DnsClient; -using MinecraftClient.Protocol.Handlers; -using MinecraftClient.Protocol.Handlers.Forge; -using MinecraftClient.Protocol.Session; -using MinecraftClient.Proxy; -using static MinecraftClient.Settings; -using static MinecraftClient.Settings.MainConfigHelper.MainConfig.GeneralConfig; - -namespace MinecraftClient.Protocol -{ - /// - /// Handle login, session, server ping and provide a protocol handler for interacting with a minecraft server. - /// - /// - /// Typical update steps for marking a new Minecraft version as supported: - /// - Add protocol ID in GetProtocolHandler() - /// - Add 1.X.X case in MCVer2ProtocolVersion() - /// - public static class ProtocolHandler - { - public enum AuthlibServerValidationResult - { - Valid, - Unreachable, - InvalidResponse - } - - /// - /// Perform a DNS lookup for a Minecraft Service using the specified domain name - /// - /// Input domain name, updated with target host if any, else left untouched - /// Updated with target port if any, else left untouched - /// TRUE if a Minecraft Service was found. - public static bool MinecraftServiceLookup(ref string domain, ref ushort port) - { - bool foundService = false; - string domainVal = domain; - ushort portVal = port; - - if (!String.IsNullOrEmpty(domain) && domain.Any(c => char.IsLetter(c))) - { - AutoTimeout.Perform(() => - { - try - { - ConsoleIO.WriteLine(string.Format(Translations.mcc_resolve, domainVal)); - var lookupClient = new LookupClient(); - var response = - lookupClient.Query(new DnsQuestion($"_minecraft._tcp.{domainVal}", QueryType.SRV)); - if (response.HasError != true && response.Answers.SrvRecords().Any()) - { - //Order SRV records by priority and weight, then randomly - var result = response.Answers.SrvRecords() - .OrderBy(record => record.Priority) - .ThenByDescending(record => record.Weight) - .ThenBy(record => Guid.NewGuid()) - .First(); - string target = result.Target.Value.Trim('.'); - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.mcc_found, target, - result.Port, domainVal)); - domainVal = target; - portVal = result.Port; - foundService = true; - } - } - catch (Exception e) - { - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.mcc_not_found, domainVal, - e.GetType().FullName, e.Message)); - } - }, - TimeSpan.FromSeconds(Config.Main.Advanced.ResolveSrvRecords == - MainConfigHelper.MainConfig.AdvancedConfig.ResolveSrvRecordType.fast - ? 10 - : 30)); - } - - domain = domainVal; - port = portVal; - return foundService; - } - - /// - /// Retrieve information about a Minecraft server - /// - /// Server IP to ping - /// Server Port to ping - /// Will contain protocol version, if ping successful - /// TRUE if ping was successful - public static bool GetServerInfo(string serverIP, ushort serverPort, ref int protocolversion, - ref ForgeInfo? forgeInfo) - { - bool success = false; - int protocolversionTmp = 0; - ForgeInfo? forgeInfoTmp = null; - if (AutoTimeout.Perform(() => - { - try - { - if (Protocol18Handler.DoPing(serverIP, serverPort, ref protocolversionTmp, ref forgeInfoTmp) - || Protocol16Handler.DoPing(serverIP, serverPort, ref protocolversionTmp)) - { - success = true; - } - else - ConsoleIO.WriteLineFormatted("§8" + Translations.error_unexpect_response, - acceptnewlines: true); - } - catch (Exception e) - { - ConsoleIO.WriteLineFormatted(string.Format("§8{0}: {1}", e.GetType().FullName, e.Message)); - } - }, - TimeSpan.FromSeconds(Config.Main.Advanced.ResolveSrvRecords == - MainConfigHelper.MainConfig.AdvancedConfig.ResolveSrvRecordType.fast - ? 10 - : 30))) - { - if (protocolversion != 0 && protocolversion != protocolversionTmp) - ConsoleIO.WriteLineFormatted("§8" + Translations.error_version_different, acceptnewlines: true); - if (protocolversion == 0 && protocolversionTmp <= 1) - ConsoleIO.WriteLineFormatted("§8" + Translations.error_no_version_report, acceptnewlines: true); - if (protocolversion == 0) - protocolversion = protocolversionTmp; - forgeInfo = forgeInfoTmp; - return success; - } - else - { - ConsoleIO.WriteLineFormatted("§8" + Translations.error_connection_timeout, acceptnewlines: true); - return false; - } - } - - /// - /// Verifies that an authlib-injector URL is reachable and returns its metadata document. - /// - public static AuthlibServerValidationResult ValidateAuthlibServer(Uri authServerUri) - { - string result = string.Empty; - int statusCode; - try - { - statusCode = DoHTTPSGet(authServerUri, ref result); - } - catch - { - return AuthlibServerValidationResult.Unreachable; - } - - if (statusCode != 200) - return AuthlibServerValidationResult.InvalidResponse; - - try - { - return Json.ParseJson(result)?["meta"]?["implementationName"]?.GetStringValue() is { Length: > 0 } - ? AuthlibServerValidationResult.Valid - : AuthlibServerValidationResult.InvalidResponse; - } - catch - { - return AuthlibServerValidationResult.InvalidResponse; - } - } - - /// - /// Get a protocol handler for the specified Minecraft version - /// - /// Tcp Client connected to the server - /// Protocol version to handle - /// Forge info - /// Handler with the appropriate callbacks - /// - public static IMinecraftCom GetProtocolHandler(TcpClient client, int protocolVersion, ForgeInfo? forgeInfo, - IMinecraftComHandler handler) - { - int normalizedVersion = NormalizeSnapshotProtocol(protocolVersion); - - int[] suppoertedVersionsProtocol16 = { 51, 60, 61, 72, 73, 74, 78 }; - - if (Array.IndexOf(suppoertedVersionsProtocol16, normalizedVersion) > -1) - return new Protocol16Handler(client, normalizedVersion, handler); - - int[] suppoertedVersionsProtocol18 = - { - 4, 5, 47, 107, 108, 109, 110, 210, 315, 316, 335, 338, 340, 393, 401, 404, 477, 480, 485, 490, 498, 573, - 575, 578, 735, 736, 751, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, - 769, 770, 771, 772, 773, 774, 775, 776 - }; - - if (Array.IndexOf(suppoertedVersionsProtocol18, normalizedVersion) > -1) - return new Protocol18Handler(client, normalizedVersion, handler, forgeInfo, protocolVersion); - - throw new NotSupportedException(string.Format(Translations.exception_version_unsupport, protocolVersion)); - } - - /// - /// Convert a human-readable Minecraft version number to network protocol version number - /// - /// The Minecraft version number - /// The protocol version number or 0 if could not determine protocol version: error, unknown, not supported - public static int MCVer2ProtocolVersion(string mcVersion) - { - if (mcVersion.Contains('.')) - { - switch (mcVersion.Split(' ')[0].Trim()) - { - case "1.0": - case "1.0.0": - case "1.0.1": - return 22; - case "1.1": - case "1.1.0": - return 23; - case "1.2": - case "1.2.0": - case "1.2.1": - case "1.2.2": - case "1.2.3": - return 28; - case "1.2.4": - case "1.2.5": - return 29; - case "1.3": - case "1.3.0": - case "1.3.1": - case "1.3.2": - return 39; - case "1.4": - case "1.4.0": - case "1.4.1": - case "1.4.2": - return 48; // 47 conflicts with 1.8 - case "1.4.3": - return 48; - case "1.4.4": - case "1.4.5": - return 49; - case "1.4.6": - case "1.4.7": - return 51; - case "1.5": - case "1.5.0": - case "1.5.1": - return 60; - case "1.5.2": - return 61; - case "1.6": - case "1.6.0": - return 72; - case "1.6.1": - return 73; - case "1.6.2": - return 74; - case "1.6.3": - return 77; - case "1.6.4": - return 78; - case "1.7": - case "1.7.0": - case "1.7.1": - return 3; - case "1.7.2": - case "1.7.3": - case "1.7.4": - case "1.7.5": - return 4; - case "1.7.6": - case "1.7.7": - case "1.7.8": - case "1.7.9": - case "1.7.10": - return 5; - case "1.8": - case "1.8.0": - case "1.8.1": - case "1.8.2": - case "1.8.3": - case "1.8.4": - case "1.8.5": - case "1.8.6": - case "1.8.7": - case "1.8.8": - case "1.8.9": - return 47; - case "1.9": - case "1.9.0": - return 107; - case "1.9.1": - return 108; - case "1.9.2": - return 109; - case "1.9.3": - case "1.9.4": - return 110; - case "1.10": - case "1.10.0": - case "1.10.1": - case "1.10.2": - return 210; - case "1.11": - case "1.11.0": - return 315; - case "1.11.1": - case "1.11.2": - return 316; - case "1.12": - case "1.12.0": - return 335; - case "1.12.1": - return 338; - case "1.12.2": - return 340; - case "1.13": - case "1.13.0": - return 393; - case "1.13.1": - return 401; - case "1.13.2": - return 404; - case "1.14": - case "1.14.0": - return 477; - case "1.14.1": - return 480; - case "1.14.2": - return 485; - case "1.14.3": - return 490; - case "1.14.4": - return 498; - case "1.15": - case "1.15.0": - return 573; - case "1.15.1": - return 575; - case "1.15.2": - return 578; - case "1.16": - case "1.16.0": - return 735; - case "1.16.1": - return 736; - case "1.16.2": - return 751; - case "1.16.3": - return 753; - case "1.16.4": - case "1.16.5": - return 754; - case "1.17": - case "1.17.0": - return 755; - case "1.17.1": - return 756; - case "1.18": - case "1.18.0": - case "1.18.1": - return 757; - case "1.18.2": - return 758; - case "1.19": - case "1.19.0": - return 759; - case "1.19.1": - case "1.19.2": - return 760; - case "1.19.3": - return 761; - case "1.19.4": - return 762; - case "1.20": - case "1.20.1": - return 763; - case "1.20.2": - return 764; - case "1.20.3": - case "1.20.4": - return 765; - case "1.20.5": - case "1.20.6": - return 766; - case "1.21": - case "1.21.1": - return 767; - case "1.21.2": - return 768; - case "1.21.3": - return 768; - case "1.21.4": - return 769; - case "1.21.5": - return 770; - case "1.21.6": - return 771; - case "1.21.7": - case "1.21.8": - return 772; - case "1.21.9": - case "1.21.10": - return 773; - case "1.21.11": - return 774; - case "26.1": - return 775; - case "26.2": - return 776; - default: - return 0; - } - } - - try - { - return int.Parse(mcVersion, NumberStyles.Any, CultureInfo.CurrentCulture); - } - catch - { - return 0; - } - } - - private static readonly Regex VersionTokenRegex = new(@"\d+\.\d+(?:\.\d+)?", RegexOptions.Compiled); - - private static readonly int[] SupportedProtocols18 = - [ - 4, 5, 47, 107, 108, 109, 110, 210, 315, 316, 335, 338, 340, 393, 401, 404, - 477, 480, 485, 490, 498, 573, 575, 578, 735, 736, 751, 753, 754, 755, 756, - 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, - 772, 773, 774, 775, 776 - ]; - - /// - /// For multi-version servers (e.g. "Requires MC 1.8 / 1.21"), try to find the - /// highest protocol version that both the server and MCC support. - /// Returns true if the protocol was upgraded, with the new value in - /// . - /// - public static bool TryUpgradeProtocolVersion(string versionName, ref int protocolVersion) - { - if (string.IsNullOrEmpty(versionName)) - return false; - - var matches = VersionTokenRegex.Matches(versionName); - if (matches.Count < 2) - return false; - - int bestProtocol = protocolVersion; - string bestVersion = ""; - - foreach (Match m in matches) - { - int proto = MCVer2ProtocolVersion(m.Value); - if (proto <= 0) - continue; - if (Array.IndexOf(SupportedProtocols18, proto) < 0) - continue; - if (proto > bestProtocol) - { - bestProtocol = proto; - bestVersion = m.Value; - } - } - - if (bestProtocol > protocolVersion && bestVersion.Length > 0) - { - ConsoleIO.WriteLineFormatted("§8" + string.Format( - Translations.mcc_server_info_version_upgrade, - ProtocolVersion2MCVer(protocolVersion), protocolVersion, - "§a" + bestVersion + "§8", bestProtocol)); - protocolVersion = bestProtocol; - return true; - } - - return false; - } - - /// - /// Convert a network protocol version number to human-readable Minecraft version number - /// - /// Some Minecraft versions share the same protocol number. In that case, the lowest version for that protocol is returned. - /// The Minecraft protocol version number - /// The 1.X.X version number, or 0.0 if could not determine protocol version - public static string ProtocolVersion2MCVer(int protocol) - { - return protocol switch - { - 22 => "1.0", - 23 => "1.1", - 28 => "1.2.3", - 29 => "1.2.5", - 39 => "1.3.2", - // case 47: return "1.4.2"; - 48 => "1.4.3", - 49 => "1.4.5", - 51 => "1.4.6", - 60 => "1.5.1", - 62 => "1.5.2", - 72 => "1.6", - 73 => "1.6.1", - 3 => "1.7.1", - 4 => "1.7.2", - 5 => "1.7.6", - 47 => "1.8", - 107 => "1.9", - 108 => "1.9.1", - 109 => "1.9.2", - 110 => "1.9.3", - 210 => "1.10", - 315 => "1.11", - 316 => "1.11.1", - 335 => "1.12", - 338 => "1.12.1", - 340 => "1.12.2", - 393 => "1.13", - 401 => "1.13.1", - 404 => "1.13.2", - 477 => "1.14", - 480 => "1.14.1", - 485 => "1.14.2", - 490 => "1.14.3", - 498 => "1.14.4", - 573 => "1.15", - 575 => "1.15.1", - 578 => "1.15.2", - 735 => "1.16", - 736 => "1.16.1", - 751 => "1.16.2", - 753 => "1.16.3", - 754 => "1.16.5", - 755 => "1.17", - 756 => "1.17.1", - 757 => "1.18.1", - 758 => "1.18.2", - 759 => "1.19", - 760 => "1.19.2", - 761 => "1.19.3", - 762 => "1.19.4", - 763 => "1.20", - 764 => "1.20.2", - 765 => "1.20.4", - 766 => "1.20.6", - 767 => "1.21", - 768 => "1.21.2", - 769 => "1.21.4", - 770 => "1.21.5", - 771 => "1.21.6", - 772 => "1.21.7", - 773 => "1.21.9", - 774 => "1.21.11", - 775 => "26.1", - 776 => "26.2", - _ => "0.0" - }; - } - - /// - /// Normalize snapshot/pre-release protocol numbers (0x40000000 | data_version) to the - /// corresponding release protocol number. Unknown snapshot versions pass through unchanged. - /// - public static int NormalizeSnapshotProtocol(int protocol) - { - if ((protocol & 0x40000000) == 0) - return protocol; - - return protocol switch - { - 0x4000012E => 775, // 26.1-rc-2 → 26.1 - _ => protocol - }; - } - - /// - /// Check if we can force-enable Forge support for a Minecraft version without using server Ping - /// - /// Minecraft protocol version - /// TRUE if we can force-enable Forge support without using server Ping - public static bool ProtocolMayForceForge(int protocol) - { - return Protocol18Forge.ServerMayForceForge(protocol); - } - - /// - /// Server Info: Consider Forge to be enabled regardless of server Ping - /// - /// Minecraft protocol version - /// ForgeInfo item stating that Forge is enabled - public static ForgeInfo ProtocolForceForge(int protocol) - { - return Protocol18Forge.ServerForceForge(protocol); - } - - public enum LoginResult - { - OtherError, - ServiceUnavailable, - SSLError, - Success, - WrongPassword, - AccountMigrated, - NotPremium, - LoginRequired, - InvalidToken, - InvalidResponse, - NullError, - UserCancel, - WrongSelection - }; - - public enum AccountType - { - Mojang, - Microsoft - }; - - /// - /// Allows to login to a premium Minecraft account using the Yggdrasil authentication scheme. - /// - /// Login - /// Password - /// In case of successful login, will contain session information for multiplayer - /// Returns the status of the login (Success, Failure, etc.) - public static LoginResult GetLogin(string user, string pass, LoginType type, out SessionToken session) - { - if (type == LoginType.microsoft) - { - if (Config.Main.General.Method == LoginMethod.mcc) - return MicrosoftMCCLogin(user, pass, out session); - else - return MicrosoftBrowserLogin(out session, user); - } - else if (type == LoginType.mojang) - { - return MojangLogin(user, pass, out session); - } - else if (type == LoginType.yggdrasil) - { - return YggdrasiLogin(user, pass, out session); - } - else - throw new InvalidOperationException( - "Account type must be Mojang or Microsoft or valid authlib 3rd Servers!"); - } - - /// - /// Login using Mojang account. Will be outdated after account migration - /// - /// - /// - /// - /// - private static LoginResult MojangLogin(string user, string pass, out SessionToken session) - { - session = new SessionToken() { ClientID = Guid.NewGuid().ToString().Replace("-", "") }; - - try - { - string result = ""; - string json_request = "{\"agent\": { \"name\": \"Minecraft\", \"version\": 1 }, \"username\": \"" + - JsonEncode(user) + "\", \"password\": \"" + JsonEncode(pass) + - "\", \"clientToken\": \"" + JsonEncode(session.ClientID) + "\" }"; - int code = DoHTTPSPost("authserver.mojang.com", 443, "/authenticate", json_request, ref result); - if (code == 200) - { - if (result.Contains("availableProfiles\":[]}")) - { - return LoginResult.NotPremium; - } - else - { - var loginResponse = Json.ParseJson(result); - if (loginResponse?["accessToken"] is not null - && loginResponse["selectedProfile"]?["id"] is not null - && loginResponse["selectedProfile"]?["name"] is not null) - { - session.ID = loginResponse["accessToken"]!.GetStringValue(); - session.PlayerID = loginResponse["selectedProfile"]!["id"]!.GetStringValue(); - session.PlayerName = loginResponse["selectedProfile"]!["name"]! - .GetStringValue(); - return LoginResult.Success; - } - else return LoginResult.InvalidResponse; - } - } - else if (code == 403) - { - if (result.Contains("UserMigratedException")) - { - return LoginResult.AccountMigrated; - } - else return LoginResult.WrongPassword; - } - else if (code == 503) - { - return LoginResult.ServiceUnavailable; - } - else - { - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.error_http_code, code)); - return LoginResult.OtherError; - } - } - catch (System.Security.Authentication.AuthenticationException e) - { - if (Settings.Config.Logging.DebugMessages) - { - ConsoleIO.WriteLineFormatted("§8" + e.ToString()); - } - - return LoginResult.SSLError; - } - catch (System.IO.IOException e) - { - if (Settings.Config.Logging.DebugMessages) - { - ConsoleIO.WriteLineFormatted("§8" + e.ToString()); - } - - if (e.Message.Contains("authentication")) - { - return LoginResult.SSLError; - } - else return LoginResult.OtherError; - } - catch (Exception e) - { - if (Settings.Config.Logging.DebugMessages) - { - ConsoleIO.WriteLineFormatted("§8" + e.ToString()); - } - - return LoginResult.OtherError; - } - } - - private static LoginResult YggdrasiLogin(string user, string pass, out SessionToken session) - { - session = new SessionToken() { ClientID = Guid.NewGuid().ToString().Replace("-", "") }; - - try - { - string result = ""; - string json_request = "{\"agent\": { \"name\": \"Minecraft\", \"version\": 1 }, \"username\": \"" + - JsonEncode(user) + "\", \"password\": \"" + JsonEncode(pass) + - "\", \"clientToken\": \"" + JsonEncode(session.ClientID) + "\" }"; - if (!Config.Main.General.TryGetAuthServerUri(out Uri? authServerUri)) - return LoginResult.OtherError; - - int code = DoHTTPSPost(authServerUri, "authserver/authenticate", json_request, ref result); - if (code == 200) - { - if (result.Contains("availableProfiles\":[]}")) - { - return LoginResult.NotPremium; - } - else - { - var loginResponse = Json.ParseJson(result); - if (loginResponse?["accessToken"] is not null) - { - session.ID = loginResponse["accessToken"]!.GetStringValue(); - if (loginResponse["selectedProfile"]?["id"] is not null - && loginResponse["selectedProfile"]?["name"] is not null) - { - session.PlayerID = loginResponse["selectedProfile"]!["id"]! - .GetStringValue(); - session.PlayerName = loginResponse["selectedProfile"]!["name"]! - .GetStringValue(); - return LoginResult.Success; - } - else - { - string availableProfiles = ""; - foreach (var profile in loginResponse["availableProfiles"]!.AsArray()) - { - availableProfiles += " " + profile!["name"]!.GetStringValue(); - } - - ConsoleIO.WriteLine(Translations.mcc_avaliable_profiles + availableProfiles); - - string selectedProfileName; - - if (String.IsNullOrEmpty(Config.Main.General.AuthUser) || String.IsNullOrWhiteSpace(Config.Main.General.AuthUser)) - { - ConsoleIO.WriteLine(Translations.mcc_select_profile); - selectedProfileName = ConsoleIO.ReadLine(); - } - else selectedProfileName = Config.Main.General.AuthUser; - - ConsoleIO.WriteLine(Translations.mcc_selected_profile + " " + selectedProfileName); - - System.Text.Json.Nodes.JsonNode? selectedProfile = null; - foreach (var profile in loginResponse["availableProfiles"]!.AsArray()) - { - selectedProfile = profile!["name"]!.GetStringValue() == selectedProfileName - ? profile - : selectedProfile; - } - - if (selectedProfile is not null) - { - session.PlayerID = selectedProfile["id"]!.GetStringValue(); - session.PlayerName = selectedProfile["name"]!.GetStringValue(); - SessionToken currentsession = session; - return GetNewYggdrasilToken(currentsession, out session); - } - else - { - return LoginResult.WrongSelection; - } - } - } - else return LoginResult.InvalidResponse; - } - } - else if (code == 403) - { - if (result.Contains("UserMigratedException")) - { - return LoginResult.AccountMigrated; - } - else return LoginResult.WrongPassword; - } - else if (code == 503) - { - return LoginResult.ServiceUnavailable; - } - else - { - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.error_http_code, code)); - return LoginResult.OtherError; - } - } - catch (System.Security.Authentication.AuthenticationException e) - { - if (Settings.Config.Logging.DebugMessages) - { - ConsoleIO.WriteLineFormatted("§8" + e.ToString()); - } - - return LoginResult.SSLError; - } - catch (System.IO.IOException e) - { - if (Settings.Config.Logging.DebugMessages) - { - ConsoleIO.WriteLineFormatted("§8" + e.ToString()); - } - - if (e.Message.Contains("authentication")) - { - return LoginResult.SSLError; - } - else return LoginResult.OtherError; - } - catch (Exception e) - { - if (Settings.Config.Logging.DebugMessages) - { - ConsoleIO.WriteLineFormatted("§8" + e.ToString()); - } - - return LoginResult.OtherError; - } - } - - /// - /// Sign-in to Microsoft Account using OAuth 2.0 device code flow. - /// Supports accounts with 2FA enabled. - /// - /// Email hint (unused in device code flow, kept for API compatibility) - /// Password (unused in device code flow, kept for API compatibility) - /// - /// - private static LoginResult MicrosoftMCCLogin(string email, string password, out SessionToken session) - { - try - { - var deviceCode = Microsoft.RequestDeviceCode(); - - ConsoleIO.WriteLineFormatted(string.Format(Translations.mcc_device_code_prompt, deviceCode.VerificationUri, deviceCode.UserCode)); - - // Try to open the verification URL in the user's browser - Microsoft.OpenBrowser(deviceCode.VerificationUri); - - ConsoleIO.WriteLineFormatted(Translations.mcc_device_code_waiting); - - var msaResponse = Microsoft.PollDeviceCodeToken(deviceCode.DeviceCode, deviceCode.ExpiresIn, deviceCode.Interval); - return MicrosoftLogin(msaResponse, out session); - } - catch (Exception e) - { - session = new SessionToken() { ClientID = Guid.NewGuid().ToString().Replace("-", "") }; - ConsoleIO.WriteLineFormatted("§cMicrosoft authenticate failed: " + e.Message); - if (Settings.Config.Logging.DebugMessages) - { - ConsoleIO.WriteLineFormatted("§c" + e.StackTrace); - } - - return LoginResult.OtherError; - } - } - - /// - /// Sign-in to Microsoft Account by asking user to open sign-in page using browser. - /// - /// - /// The downside is this require user to copy and paste lengthy content from and to console. - /// Sign-in page: 218 chars - /// Response URL: around 1500 chars - /// - /// - /// - public static LoginResult MicrosoftBrowserLogin(out SessionToken session, string loginHint = "") - { - if (string.IsNullOrEmpty(loginHint)) - Microsoft.OpenBrowser(Microsoft.SignInUrl); - else - Microsoft.OpenBrowser(Microsoft.GetSignInUrlWithHint(loginHint)); - ConsoleIO.WriteLine(Translations.mcc_browser_open); - ConsoleIO.WriteLine("\n" + Microsoft.SignInUrl + "\n"); - - ConsoleIO.WriteLine(Translations.mcc_browser_login_code); - string code = ConsoleIO.ReadLine(); - ConsoleIO.WriteLine(string.Format(Translations.mcc_connecting, "Microsoft")); - - var msaResponse = Microsoft.RequestAccessToken(code); - return MicrosoftLogin(msaResponse, out session); - } - - public static LoginResult MicrosoftLoginRefresh(string refreshToken, out SessionToken session) - { - var msaResponse = Microsoft.RefreshAccessToken(refreshToken); - return MicrosoftLogin(msaResponse, out session); - } - - private static LoginResult MicrosoftLogin(Microsoft.LoginResponse msaResponse, out SessionToken session) - { - session = new SessionToken() { ClientID = Guid.NewGuid().ToString().Replace("-", "") }; - - try - { - var xblResponse = XboxLive.XblAuthenticate(msaResponse); - var xsts = XboxLive.XSTSAuthenticate(xblResponse); // Might throw even password correct - - string accessToken = MinecraftWithXbox.LoginWithXbox(xsts.UserHash, xsts.Token); - bool hasGame = MinecraftWithXbox.UserHasGame(accessToken); - if (hasGame) - { - var profile = MinecraftWithXbox.GetUserProfile(accessToken); - session.PlayerName = profile.UserName; - session.PlayerID = profile.UUID; - session.ID = accessToken; - session.RefreshToken = msaResponse.RefreshToken; - if (!string.IsNullOrWhiteSpace(msaResponse.Email)) - InternalConfig.Account.Login = msaResponse.Email; - return LoginResult.Success; - } - else - { - return LoginResult.NotPremium; - } - } - catch (Exception e) - { - ConsoleIO.WriteLineFormatted("§cMicrosoft authenticate failed: " + e.Message); - if (Settings.Config.Logging.DebugMessages) - { - ConsoleIO.WriteLineFormatted("§c" + e.StackTrace); - } - - return LoginResult.WrongPassword; // Might not always be wrong password - } - } - - /// - /// Validates whether accessToken must be refreshed - /// - /// Session token to validate - /// Returns the status of the token (Valid, Invalid, etc.) - public static LoginResult GetTokenValidation(SessionToken session) - { - var payload = JwtPayloadDecode.GetPayload(session.ID); - var json = Json.ParseJson(payload); - var expTimestamp = long.Parse(json!["exp"]!.GetStringValue(), NumberStyles.Any, - CultureInfo.CurrentCulture); - var now = DateTime.Now; - var tokenExp = UnixTimeStampToDateTime(expTimestamp); - if (Settings.Config.Logging.DebugMessages) - { - ConsoleIO.WriteLine("Access token expiration time is " + tokenExp.ToString()); - } - - if (now < tokenExp) - { - // Still valid - return LoginResult.Success; - } - else - { - // Token expired - return LoginResult.LoginRequired; - } - } - - /// - /// Refreshes invalid token - /// - /// Login - /// In case of successful token refresh, will contain session information for multiplayer - /// Returns the status of the new token request (Success, Failure, etc.) - public static LoginResult GetNewToken(SessionToken currentsession, out SessionToken session) - { - session = new SessionToken(); - try - { - string result = ""; - string json_request = "{ \"accessToken\": \"" + JsonEncode(currentsession.ID) + - "\", \"clientToken\": \"" + JsonEncode(currentsession.ClientID) + - "\", \"selectedProfile\": { \"id\": \"" + JsonEncode(currentsession.PlayerID) + - "\", \"name\": \"" + JsonEncode(currentsession.PlayerName) + "\" } }"; - int code = DoHTTPSPost("authserver.mojang.com", 443, "/refresh", json_request, ref result); - if (code == 200) - { - if (result is null) - { - return LoginResult.NullError; - } - else - { - var loginResponse = Json.ParseJson(result); - if (loginResponse?["accessToken"] is not null - && loginResponse["selectedProfile"]?["id"] is not null - && loginResponse["selectedProfile"]?["name"] is not null) - { - session.ID = loginResponse["accessToken"]!.GetStringValue(); - session.PlayerID = loginResponse["selectedProfile"]!["id"]!.GetStringValue(); - session.PlayerName = loginResponse["selectedProfile"]!["name"]! - .GetStringValue(); - return LoginResult.Success; - } - else return LoginResult.InvalidResponse; - } - } - else if (code == 403 && result.Contains("InvalidToken")) - { - return LoginResult.InvalidToken; - } - else - { - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.error_auth, code)); - return LoginResult.OtherError; - } - } - catch - { - return LoginResult.OtherError; - } - } - - public static LoginResult GetNewYggdrasilToken(SessionToken currentsession, out SessionToken session) - { - session = new SessionToken(); - try - { - string result = ""; - string json_request = "{ \"accessToken\": \"" + JsonEncode(currentsession.ID) + - "\", \"clientToken\": \"" + JsonEncode(currentsession.ClientID) + - "\", \"selectedProfile\": { \"id\": \"" + JsonEncode(currentsession.PlayerID) + - "\", \"name\": \"" + JsonEncode(currentsession.PlayerName) + "\" } }"; - if (!Config.Main.General.TryGetAuthServerUri(out Uri? authServerUri)) - return LoginResult.OtherError; - - int code = DoHTTPSPost(authServerUri, "authserver/refresh", json_request, ref result); - if (code == 200) - { - if (result is null) - { - return LoginResult.NullError; - } - else - { - var loginResponse = Json.ParseJson(result); - if (loginResponse?["accessToken"] is not null - && loginResponse["selectedProfile"]?["id"] is not null - && loginResponse["selectedProfile"]?["name"] is not null) - { - session.ID = loginResponse["accessToken"]!.GetStringValue(); - session.PlayerID = loginResponse["selectedProfile"]!["id"]!.GetStringValue(); - session.PlayerName = loginResponse["selectedProfile"]!["name"]! - .GetStringValue(); - return LoginResult.Success; - } - else return LoginResult.InvalidResponse; - } - } - else if (code == 403 && result.Contains("InvalidToken")) - { - return LoginResult.InvalidToken; - } - else - { - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.error_auth, code)); - return LoginResult.OtherError; - } - } - catch - { - return LoginResult.OtherError; - } - } - - /// - /// Check session using Mojang's Yggdrasil authentication scheme. Allows to join an online-mode server - /// - /// Username - /// Session ID - /// Server ID - /// LoginType - /// TRUE if session was successfully checked - public static bool SessionCheck(string uuid, string accesstoken, string serverhash, LoginType type) - { - try - { - string result = ""; - string json_request = "{\"accessToken\":\"" + accesstoken + "\",\"selectedProfile\":\"" + uuid + - "\",\"serverId\":\"" + serverhash + "\"}"; - int code; - if (type == LoginType.yggdrasil) - { - if (!Config.Main.General.TryGetAuthServerUri(out Uri? authServerUri)) - return false; - - code = DoHTTPSPost(authServerUri, "sessionserver/session/minecraft/join", json_request, ref result); - } - else - { - code = DoHTTPSPost("sessionserver.mojang.com", 443, "/session/minecraft/join", json_request, ref result); - } - return (code >= 200 && code < 300); - } - catch - { - return false; - } - } - - /// - /// Retrieve available Realms worlds of a player and display them - /// - /// Player Minecraft username - /// Player UUID - /// Access token - /// List of ID of available Realms worlds - public static List RealmsListWorlds(string username, string uuid, string accesstoken) - { - List realmsWorldsResult = new(); // Store world ID - try - { - string result = ""; - string cookies = String.Format("sid=token:{0}:{1};user={2};version={3}", accesstoken, uuid, username, - Program.MCHighestVersion); - DoHTTPSGet("pc.realms.minecraft.net", 443, "/worlds", cookies, ref result); - var realmsWorlds = Json.ParseJson(result); - if (realmsWorlds?["servers"] is System.Text.Json.Nodes.JsonArray serversArray - && serversArray.Count > 0) - { - List availableWorlds = new(); // Store string to print - int index = 0; - foreach (var realmsServer in serversArray) - { - if (realmsServer?["name"] is not null - && realmsServer["owner"] is not null - && realmsServer["id"] is not null - && realmsServer["expired"] is not null) - { - if (realmsServer["expired"].GetStringValue() == "false") - { - availableWorlds.Add(String.Format("[{0}] {2} ({3}) - {1}", - index++, - realmsServer["id"]!.GetStringValue(), - realmsServer["name"]!.GetStringValue(), - realmsServer["owner"]!.GetStringValue())); - realmsWorldsResult.Add(realmsServer["id"]!.GetStringValue()); - } - } - } - - if (availableWorlds.Count > 0) - { - ConsoleIO.WriteLine(Translations.mcc_realms_available); - foreach (var world in availableWorlds) - ConsoleIO.WriteLine(world); - ConsoleIO.WriteLine(Translations.mcc_realms_join); - } - } - } - catch (Exception e) - { - ConsoleIO.WriteLineFormatted("§8" + e.GetType().ToString() + ": " + e.Message); - if (Settings.Config.Logging.DebugMessages) - { - ConsoleIO.WriteLineFormatted("§8" + e.StackTrace); - } - } - - return realmsWorldsResult; - } - - /// - /// Get the server address of a Realms world by world ID - /// - /// The world ID of the Realms world - /// Player Minecraft username - /// Player UUID - /// Access token - /// Server address (host:port) or empty string if failure - public static string GetRealmsWorldServerAddress(string worldId, string username, string uuid, - string accesstoken) - { - try - { - string result = ""; - string cookies = String.Format("sid=token:{0}:{1};user={2};version={3}", accesstoken, uuid, username, - Program.MCHighestVersion); - int statusCode = DoHTTPSGet("pc.realms.minecraft.net", 443, "/worlds/v1/" + worldId + "/join/pc", - cookies, ref result); - if (statusCode == 200) - { - var serverAddress = Json.ParseJson(result); - if (serverAddress?["address"] is not null) - return serverAddress["address"]!.GetStringValue(); - else - { - ConsoleIO.WriteLine(Translations.error_realms_ip_error); - return ""; - } - } - else - { - ConsoleIO.WriteLine(Translations.error_realms_access_denied); - return ""; - } - } - catch (Exception e) - { - ConsoleIO.WriteLineFormatted("§8" + e.GetType().ToString() + ": " + e.Message); - if (Settings.Config.Logging.DebugMessages) - { - ConsoleIO.WriteLineFormatted("§8" + e.StackTrace); - } - - return ""; - } - } - - /// - /// Make a HTTPS GET request to the specified endpoint of the Mojang API - /// - /// Host to connect to - /// Port to connect on - /// Path for making the request - /// Cookies for making the request - /// Request result - /// HTTP Status code - private static int DoHTTPSGet(string host, int port, string path, string cookies, ref string result) - { - Dictionary headers = new() - { - { "Cookie", cookies }, - { "Cache-Control", "no-cache" }, - { "Pragma", "no-cache" }, - { "User-Agent", "Java/1.6.0_27" } - }; - return DoHTTPSRequest(HttpMethod.Get, host, port, path, headers, null, useHttps: true, ref result); - } - - private static int DoHTTPSGet(Uri requestUri, ref string result) - { - Dictionary headers = new() - { - { "User-Agent", "MCC/" + Program.Version } - }; - return DoHTTPSRequest(HttpMethod.Get, requestUri.Host, requestUri.Port, requestUri.PathAndQuery, headers, - null, requestUri.Scheme == Uri.UriSchemeHttps, ref result); - } - - /// - /// Make a POST request to the specified endpoint of the Mojang API - /// - /// Host to connect to - /// Port to connect on - /// Path for making the request - /// Request payload - /// Request result - /// HTTP Status code - private static int DoHTTPSPost(string host, int port, string path, string body, ref string result) - => DoHTTPSPost(host, port, path, body, useHttps: true, ref result); - - private static int DoHTTPSPost(Uri baseUri, string relativePath, string body, ref string result) - { - Uri requestUri = new(baseUri, relativePath); - return DoHTTPSPost(requestUri.Host, requestUri.Port, requestUri.PathAndQuery, body, - requestUri.Scheme == Uri.UriSchemeHttps, ref result); - } - - /// - /// Make a POST request to the specified endpoint of the Mojang API - /// - /// Host to connect to - /// Port to connect on - /// Path for making the request - /// Request payload - /// Whether to use HTTPS (true) or plain HTTP (false) - /// Request result - /// HTTP Status code - private static int DoHTTPSPost(string host, int port, string path, string body, bool useHttps, ref string result) - { - Dictionary headers = new() - { - { "User-Agent", "MCC/" + Program.Version }, - { "Content-Type", "application/json" } - }; - return DoHTTPSRequest(HttpMethod.Post, host, port, path, headers, body, useHttps, ref result); - } - - /// - /// This method connects to the server and performs an HTTP or HTTPS request via proxy if configured. - /// - /// HTTP method - /// Host to connect to - /// Port to connect on - /// Request path - /// Request headers - /// Optional request body (POST) - /// Whether to use HTTPS (true) or plain HTTP (false) - /// Request result - /// HTTP Status code - private static int DoHTTPSRequest(HttpMethod method, string host, int port, string path, Dictionary headers, string? body, bool useHttps, ref string result) - { - string? postResult = null; - int statusCode = 520; - Exception? exception = null; - AutoTimeout.Perform(() => - { - try - { - if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.debug_request, host)); - - using SocketsHttpHandler handler = new SocketsHttpHandler(); - handler.ConnectCallback = async (ctx, ct) => - { - TcpClient client = ProxyHandler.NewTcpClient(host, port, true); - return client.GetStream(); - }; - - using HttpClient client = new HttpClient(handler); - - string scheme = useHttps ? "https" : "http"; - var request = new HttpRequestMessage(method, scheme + "://" + host + ":" + port + path); - - var contentType = "text/plain"; - foreach (var header in headers) - { - request.Headers.TryAddWithoutValidation(header.Key, header.Value); - if (header.Key.Equals("Content-Type", StringComparison.OrdinalIgnoreCase)) - contentType = header.Value; - } - - if (body is not null) - request.Content = new StringContent(body, Encoding.UTF8, contentType); - - if (Settings.Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted("§8> " + request); - - HttpResponseMessage response = client.SendAsync(request).GetAwaiter().GetResult(); - statusCode = (int)response.StatusCode; - - postResult = statusCode == 204 - ? "No Content" - : response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); - - if (Settings.Config.Logging.DebugMessages) - { - ConsoleIO.WriteLine(""); - foreach (string line in postResult.Split('\n')) - ConsoleIO.WriteLineFormatted("§8< " + line); - } - } - catch (Exception e) - { - if (e is not System.Threading.ThreadAbortException) - { - exception = e; - } - } - }, TimeSpan.FromSeconds(30)); - if (postResult is not null) - result = postResult; - if (exception is not null) - throw exception; - return statusCode; - } - - /// - /// Encode a string to a json string. - /// Will convert special chars to \u0000 unicode escape sequences. - /// - /// Source text - /// Encoded text - private static string JsonEncode(string text) - { - StringBuilder result = new(); - - foreach (char c in text) - { - if ((c >= '0' && c <= '9') || - (c >= 'a' && c <= 'z') || - (c >= 'A' && c <= 'Z')) - { - result.Append(c); - } - else - { - result.AppendFormat(@"\u{0:x4}", (int)c); - } - } - - return result.ToString(); - } - - /// - /// Convert a TimeStamp (in second) to DateTime object - /// - /// TimeStamp in second - /// DateTime object of the TimeStamp - public static DateTime UnixTimeStampToDateTime(long unixTimeStamp) - { - // Unix timestamp is seconds past epoch - DateTime dateTime = new(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); - dateTime = dateTime.AddSeconds(unixTimeStamp).ToLocalTime(); - return dateTime; - } - } -} diff --git a/MinecraftClient/Protocol/ProxiedWebRequest.cs b/MinecraftClient/Protocol/ProxiedWebRequest.cs deleted file mode 100644 index 220ac3191a..0000000000 --- a/MinecraftClient/Protocol/ProxiedWebRequest.cs +++ /dev/null @@ -1,234 +0,0 @@ -using System; -using System.Collections.Specialized; -using System.Net; -using System.Net.Http; -using System.Text; -using MinecraftClient.Proxy; - -namespace MinecraftClient.Protocol -{ - /// - /// HTTP client with automatic proxy support based on application settings. - /// Backed by System.Net.Http.HttpClient with SocketsHttpHandler. - /// - public class ProxiedWebRequest - { - private const int DefaultConnectTimeoutSeconds = 30; - - private readonly Uri _uri; - - public NameValueCollection Headers { get; } = new(); - - public string UserAgent - { - get => Headers.Get("User-Agent") ?? string.Empty; - set => Headers.Set("User-Agent", value); - } - - public string Accept - { - get => Headers.Get("Accept") ?? string.Empty; - set => Headers.Set("Accept", value); - } - - public string Cookie - { - set => Headers.Set("Cookie", value); - } - - public bool Debug => Settings.Config.Logging.DebugMessages; - - /// - /// Create a new HTTP request - /// - /// Target URL - public ProxiedWebRequest(string url) - { - _uri = new Uri(url); - SetupBasicHeaders(); - } - - /// - /// Create a new HTTP request with cookies - /// - /// Target URL - /// Cookies to include in the request - public ProxiedWebRequest(string url, NameValueCollection cookies) - { - _uri = new Uri(url); - Headers.Add("Cookie", GetCookieString(cookies)); - SetupBasicHeaders(); - } - - private void SetupBasicHeaders() - { - Headers.Add("Host", _uri.Host); - Headers.Add("User-Agent", "MCC/1.0"); - Headers.Add("Accept", "*/*"); - } - - /// - /// Perform GET request. Proxy is handled automatically. - /// - public Response Get() => Send(HttpMethod.Get); - - /// - /// Perform POST request. Proxy is handled automatically. - /// - /// The content type of request body - /// Request body - public Response Post(string contentType, string body) => Send(HttpMethod.Post, contentType, body); - - /// - /// Send an HTTP request. Proxy is configured automatically from Settings. - /// - private Response Send(HttpMethod method, string? contentType = null, string? body = null) - { - using var handler = CreateHandler(); - using var client = new HttpClient(handler); - - using var request = new HttpRequestMessage(method, _uri); - - // Apply custom headers (skip content-level headers) - foreach (string key in Headers) - { - if (key.Equals("Content-Type", StringComparison.OrdinalIgnoreCase) || - key.Equals("Content-Length", StringComparison.OrdinalIgnoreCase) || - key.Equals("Host", StringComparison.OrdinalIgnoreCase)) - continue; - - request.Headers.TryAddWithoutValidation(key, Headers[key]); - } - - if (body is not null) - { - request.Content = new StringContent(body, Encoding.UTF8, contentType ?? "text/plain"); - } - - if (Debug) - { - ConsoleIO.WriteLine($"< {method} {_uri}"); - foreach (string key in Headers) - ConsoleIO.WriteLine($"< {key}: {Headers[key]}"); - } - - try - { - using var httpResponse = client.Send(request); - using var stream = httpResponse.Content.ReadAsStream(); - using var reader = new System.IO.StreamReader(stream); - string responseBody = reader.ReadToEnd(); - - var responseHeaders = new NameValueCollection(); - foreach (var header in httpResponse.Headers) - foreach (var val in header.Value) - responseHeaders.Add(header.Key.ToLowerInvariant(), val); - foreach (var header in httpResponse.Content.Headers) - foreach (var val in header.Value) - responseHeaders.Add(header.Key.ToLowerInvariant(), val); - - var cookies = new NameValueCollection(); - foreach (System.Net.Cookie cookie in handler.CookieContainer.GetCookies(_uri)) - { - if (!cookie.Expired) - cookies.Add(cookie.Name, cookie.Value); - } - - return new Response((int)httpResponse.StatusCode, responseBody, responseHeaders, cookies); - } - catch (HttpRequestException ex) - { - if (Debug) - ConsoleIO.WriteLine("HTTP error: " + ex.Message); - return Response.Empty(); - } - } - - /// - /// Create a SocketsHttpHandler with proxy support from ProxyHandler settings. - /// - private static SocketsHttpHandler CreateHandler() - { - var handler = new SocketsHttpHandler - { - UseCookies = true, - CookieContainer = new CookieContainer(), - AllowAutoRedirect = false, - ConnectTimeout = TimeSpan.FromSeconds(DefaultConnectTimeoutSeconds), - }; - - if (ProxyHandler.Config.Enabled_Login) - { - string proxyScheme = ProxyHandler.Config.Proxy_Type switch - { - ProxyHandler.Configs.ProxyType.SOCKS4 => "socks4", - ProxyHandler.Configs.ProxyType.SOCKS4a => "socks4a", - ProxyHandler.Configs.ProxyType.SOCKS5 => "socks5", - _ => "http" - }; - - var proxyUri = new Uri($"{proxyScheme}://{ProxyHandler.Config.Server.Host}:{ProxyHandler.Config.Server.Port}"); - var proxy = new WebProxy(proxyUri); - - if (!string.IsNullOrWhiteSpace(ProxyHandler.Config.Username) && - !string.IsNullOrWhiteSpace(ProxyHandler.Config.Password)) - { - proxy.Credentials = new NetworkCredential( - ProxyHandler.Config.Username, - ProxyHandler.Config.Password); - } - - handler.Proxy = proxy; - handler.UseProxy = true; - } - - return handler; - } - - /// - /// Build a cookie header value from a NameValueCollection. - /// - private static string GetCookieString(NameValueCollection cookies) - { - var sb = new StringBuilder(); - foreach (string key in cookies) - { - sb.Append($"{key}={cookies[key]}; "); - } - string result = sb.ToString(); - return result.Length >= 2 ? result[..^2] : result; - } - - /// - /// Basic HTTP response object. - /// - public record Response(int StatusCode, string Body, NameValueCollection Headers, NameValueCollection Cookies) - { - public static Response Empty() => - new(204, "", new NameValueCollection(), new NameValueCollection()); - - public override string ToString() - { - var sb = new StringBuilder(); - sb.AppendLine("Status code: " + StatusCode); - sb.AppendLine("Headers:"); - foreach (string key in Headers) - sb.AppendLine($" {key}: {Headers[key]}"); - if (Cookies.Count > 0) - { - sb.AppendLine(); - sb.AppendLine("Cookies: "); - foreach (string key in Cookies) - sb.AppendLine($" {key}={Cookies[key]}"); - } - if (Body != "") - { - sb.AppendLine(); - sb.AppendLine(Body.Length > 200 ? "Body: (Truncated to 200 characters)" : "Body: "); - sb.AppendLine(Body.Length > 200 ? Body[..200] + "..." : Body); - } - return sb.ToString(); - } - } - } -} \ No newline at end of file diff --git a/MinecraftClient/Protocol/ReplayHandler.cs b/MinecraftClient/Protocol/ReplayHandler.cs deleted file mode 100644 index 818626384a..0000000000 --- a/MinecraftClient/Protocol/ReplayHandler.cs +++ /dev/null @@ -1,560 +0,0 @@ -using System; -using System.Buffers.Binary; -using System.Collections.Generic; -using System.IO; -using System.IO.Compression; -using System.Text.Json; -using System.Text.Json.Serialization; -using System.Threading; -using MinecraftClient.Mapping; -using MinecraftClient.Protocol.Handlers; -using MinecraftClient.Protocol.Handlers.PacketPalettes; - -namespace MinecraftClient.Protocol -{ - /// - /// Record and save replay files that can be used by Replay Mod. - /// - public class ReplayHandler : IDisposable - { - private const string DefaultReplayDirectory = "replay_recordings"; - private const string WorkingRootDirectory = "recording_cache"; - private const string RecordingEntryName = "recording.tmcpr"; - private const string BackupFileName = "REPLAY_BACKUP.mcpr"; - - private static readonly bool logOutput = true; - - private readonly Lock _sync = new(); - private readonly DataTypes _dataTypes; - private readonly PacketTypePalette _packetType; - private readonly int _protocolVersion; - private readonly string _instanceToken; - private readonly string _workingDirectory; - private readonly string _recordingFilePath; - private readonly string _backupReplayPath; - private readonly EventHandler _processExitHandler; - private readonly FileStream _recordStream; - private readonly DateTime _recordStartTime; - - private ReplayRecordingState _state = ReplayRecordingState.Recording; - private bool _recordStreamClosed; - private bool _disposed; - private DateTime _lastPacketTime; - - private int _playerEntityId = -1; - private Guid _playerUuid; - private Location _playerLastPosition; - private float _playerLastYaw; - private float _playerLastPitch; - - public string ReplayFileName { get; private set; } = string.Empty; - public string ReplayFileDirectory { get; } - public MetaDataHandler MetaData { get; } - - public bool RecordRunning - { - get - { - lock (_sync) - return _state == ReplayRecordingState.Recording; - } - } - - public ReplayHandler(int protocolVersion) - : this(protocolVersion, null, DefaultReplayDirectory) - { - } - - public ReplayHandler(int protocolVersion, string? serverName, string recordingDirectory = DefaultReplayDirectory) - { - ArgumentException.ThrowIfNullOrWhiteSpace(recordingDirectory); - - _dataTypes = new DataTypes(protocolVersion); - _packetType = new PacketTypeHandler().GetTypeHandler(protocolVersion); - _protocolVersion = protocolVersion; - ReplayFileDirectory = recordingDirectory; - Directory.CreateDirectory(ReplayFileDirectory); - - _instanceToken = Path.GetRandomFileName().Replace(".", string.Empty, StringComparison.Ordinal); - _workingDirectory = Path.Combine(WorkingRootDirectory, $"{DateTime.UtcNow:yyyyMMdd_HHmmss_fff}_{Environment.ProcessId}_{_instanceToken}"); - Directory.CreateDirectory(_workingDirectory); - - _recordingFilePath = Path.Combine(_workingDirectory, RecordingEntryName); - _backupReplayPath = Path.Combine(_workingDirectory, BackupFileName); - _recordStream = new FileStream(_recordingFilePath, FileMode.Create, FileAccess.ReadWrite, FileShare.Read); - _processExitHandler = (_, _) => FinalizeOnProcessExit(); - - _recordStartTime = DateTime.UtcNow; - _lastPacketTime = _recordStartTime; - - MetaData = new MetaDataHandler(_workingDirectory) - { - serverName = serverName, - date = new DateTimeOffset(_recordStartTime).ToUnixTimeMilliseconds(), - protocol = protocolVersion, - mcversion = ProtocolHandler.ProtocolVersion2MCVer(protocolVersion) - }; - MetaData.SaveToFile(); - - _playerLastPosition = new Location(0, 0, 0); - AppDomain.CurrentDomain.ProcessExit += _processExitHandler; - - WriteLog("Start recording."); - } - - public void Dispose() - { - if (_disposed) - return; - - try - { - OnShutDown(); - } - finally - { - AppDomain.CurrentDomain.ProcessExit -= _processExitHandler; - _disposed = true; - GC.SuppressFinalize(this); - } - } - - public void SetClientEntityID(int entityID) - { - lock (_sync) - { - _playerEntityId = entityID; - if (entityID >= 0) - MetaData.selfId = entityID; - } - } - - public void SetClientPlayerUUID(Guid uuid) - { - lock (_sync) - { - _playerUuid = uuid; - MetaData.AddPlayerUUID(uuid); - } - } - - public string GetBackupReplayPath() => _backupReplayPath; - - /// - /// Stop recording and save the replay file. - /// - public void OnShutDown() - { - lock (_sync) - { - EnsureNotDisposed(); - - if (_state != ReplayRecordingState.Recording) - return; - - string replayFileName = GetReplayDefaultName(); - string replayFilePath = ResolveReplayPath(replayFileName); - - WriteLog("Creating replay file."); - _state = ReplayRecordingState.Finalizing; - try - { - CloseRecordStreamUnsafe(); - WriteReplayArchiveUnsafe(replayFilePath, readFromActiveStream: false); - ReplayFileName = replayFileName; - _state = ReplayRecordingState.Stopped; - CleanupWorkingFilesUnsafe(); - WriteLog("Replay file created."); - } - catch - { - _state = ReplayRecordingState.Stopped; - throw; - } - } - } - - /// - /// Create a snapshot replay file while the recording is still running. - /// - public void CreateBackupReplay(string replayFileName) - { - lock (_sync) - { - EnsureNotDisposed(); - - if (_state != ReplayRecordingState.Recording) - return; - - WriteDebugLog("Creating backup replay file."); - WriteReplayArchiveUnsafe(ResolveReplayPath(replayFileName), readFromActiveStream: true); - WriteDebugLog("Backup replay file created."); - } - } - - /// - /// Get a default unique replay file name for the current recording. - /// - public string GetReplayDefaultName() - { - string version = ProtocolHandler.ProtocolVersion2MCVer(_protocolVersion).Replace('.', '_'); - return $"{DateTime.UtcNow:yyyy_MM_dd_HH_mm_ss_fff}_{version}_{Environment.ProcessId}_{_instanceToken}.mcpr"; - } - - /// - /// Add a packet from network capture. - /// - public void AddPacket(int packetID, IEnumerable packetData, bool isLogin, bool isInbound) - { - byte[] packetBytes = packetData as byte[] ?? [.. packetData]; - - lock (_sync) - { - if (_disposed || _state != ReplayRecordingState.Recording) - return; - - try - { - if (!isInbound) - return; - - HandleInBoundPacket(packetID, packetBytes, isLogin); - - if (PacketShouldSave(packetID, isLogin, isInbound)) - AddPacketUnsafe(packetID, packetBytes); - } - catch (Exception e) - { - WriteDebugLog("Exception while adding packet: " + e.Message + "\n" + e.StackTrace); - } - } - } - - /// - /// Add a player's UUID to the metadata. - /// - public void OnPlayerSpawn(Guid uuid) - { - lock (_sync) - { - MetaData.AddPlayerUUID(uuid); - } - } - - private void AddPacketUnsafe(int packetID, byte[] packetData) - { - _lastPacketTime = DateTime.UtcNow; - - byte[] packetId = [.. DataTypes.GetVarInt(packetID)]; - byte[] rawPacket = new byte[packetId.Length + packetData.Length]; - packetId.CopyTo(rawPacket, 0); - packetData.CopyTo(rawPacket, packetId.Length); - - int elapsedMilliseconds = Math.Max(0, Convert.ToInt32((_lastPacketTime - _recordStartTime).TotalMilliseconds)); - Span header = stackalloc byte[8]; - BinaryPrimitives.WriteInt32BigEndian(header, elapsedMilliseconds); - BinaryPrimitives.WriteInt32BigEndian(header[4..], rawPacket.Length); - - _recordStream.Write(header); - _recordStream.Write(rawPacket); - } - - private bool PacketShouldSave(int packetID, bool isLogin, bool isInbound) - { - if (!isInbound) - return false; - - if (!isLogin) - return true; - - return packetID == 0x02; - } - - private void HandleInBoundPacket(int packetID, byte[] packetData, bool isLogin) - { - Queue p = new(packetData); - PacketTypesIn pType = _packetType.GetIncomingTypeById(packetID); - - if (isLogin && packetID == 0x02) - { - if (_protocolVersion < Protocol18Handler.MC_1_16_Version) - { - if (Guid.TryParse(_dataTypes.ReadNextString(p), out Guid uuid)) - { - SetClientPlayerUUID(uuid); - WriteDebugLog("User UUID: " + uuid); - } - } - else - { - Guid uuid = _dataTypes.ReadNextUUID(p); - SetClientPlayerUUID(uuid); - WriteDebugLog("User UUID: " + uuid); - } - return; - } - - if (!isLogin && pType == PacketTypesIn.JoinGame) - { - SetClientEntityID(_dataTypes.ReadNextInt(p)); - return; - } - - if (!isLogin && pType == PacketTypesIn.SpawnPlayer) - { - _dataTypes.ReadNextVarInt(p); - OnPlayerSpawn(_dataTypes.ReadNextUUID(p)); - return; - } - - if (pType == PacketTypesIn.PlayerPositionAndLook) - { - double x = _dataTypes.ReadNextDouble(p); - double y = _dataTypes.ReadNextDouble(p); - double z = _dataTypes.ReadNextDouble(p); - float yaw = _dataTypes.ReadNextFloat(p); - float pitch = _dataTypes.ReadNextFloat(p); - byte locMask = _dataTypes.ReadNextByte(p); - - _playerLastPitch = pitch; - _playerLastYaw = yaw; - if (_protocolVersion >= Protocol18Handler.MC_1_8_Version) - { - _playerLastPosition.X = (locMask & 1 << 0) != 0 ? _playerLastPosition.X + x : x; - _playerLastPosition.Y = (locMask & 1 << 1) != 0 ? _playerLastPosition.Y + y : y; - _playerLastPosition.Z = (locMask & 1 << 2) != 0 ? _playerLastPosition.Z + z : z; - } - else - { - _playerLastPosition.X = x; - _playerLastPosition.Y = y; - _playerLastPosition.Z = z; - } - } - } - - private void WriteReplayArchiveUnsafe(string replayFilePath, bool readFromActiveStream) - { - Directory.CreateDirectory(Path.GetDirectoryName(replayFilePath) ?? "."); - - MetaData.duration = GetCurrentDurationMillisecondsUnsafe(); - if (_playerEntityId >= 0) - MetaData.selfId = _playerEntityId; - if (_playerUuid != Guid.Empty) - MetaData.AddPlayerUUID(_playerUuid); - - MetaData.SaveToFile(); - - using FileStream replayArchiveFile = new(replayFilePath, FileMode.Create, FileAccess.Write); - using ZipArchive replayArchive = new(replayArchiveFile, ZipArchiveMode.Create); - - ZipArchiveEntry recordingEntry = replayArchive.CreateEntry(RecordingEntryName); - using (Stream recordingEntryStream = recordingEntry.Open()) - { - if (readFromActiveStream) - CopyActiveRecordingUnsafe(recordingEntryStream); - else - using (FileStream recordingFile = new(_recordingFilePath, FileMode.Open, FileAccess.Read, FileShare.Read)) - recordingFile.CopyTo(recordingEntryStream); - } - - ZipArchiveEntry metadataEntry = replayArchive.CreateEntry(MetaData.MetaDataFileName); - using Stream metadataEntryStream = metadataEntry.Open(); - using FileStream metadataFile = new(Path.Combine(_workingDirectory, MetaData.MetaDataFileName), FileMode.Open, FileAccess.Read, FileShare.Read); - metadataFile.CopyTo(metadataEntryStream); - } - - private void CopyActiveRecordingUnsafe(Stream destination) - { - _recordStream.Flush(); - long position = _recordStream.Position; - try - { - _recordStream.Position = 0; - _recordStream.CopyTo(destination); - } - finally - { - _recordStream.Position = position; - } - } - - private int GetCurrentDurationMillisecondsUnsafe() => - Math.Max(0, Convert.ToInt32((_lastPacketTime - _recordStartTime).TotalMilliseconds)); - - private bool HasCapturedPacketsUnsafe() => _lastPacketTime > _recordStartTime; - - private void CloseRecordStreamUnsafe() - { - if (_recordStreamClosed) - return; - - _recordStream.Flush(); - _recordStream.Dispose(); - _recordStreamClosed = true; - } - - private void CleanupWorkingFilesUnsafe() - { - DeleteFileIfExists(_backupReplayPath); - DeleteFileIfExists(_recordingFilePath); - DeleteFileIfExists(Path.Combine(_workingDirectory, MetaData.MetaDataFileName)); - - if (Directory.Exists(_workingDirectory) && Directory.GetFileSystemEntries(_workingDirectory).Length == 0) - Directory.Delete(_workingDirectory); - } - - private void FinalizeOnProcessExit() - { - lock (_sync) - { - if (_disposed || _state != ReplayRecordingState.Recording) - return; - - try - { - _state = ReplayRecordingState.Finalizing; - CloseRecordStreamUnsafe(); - - if (HasCapturedPacketsUnsafe()) - { - string replayFileName = GetReplayDefaultName(); - WriteDebugLog("Process exit detected, finalizing replay file."); - WriteReplayArchiveUnsafe(ResolveReplayPath(replayFileName), readFromActiveStream: false); - ReplayFileName = replayFileName; - } - - _state = ReplayRecordingState.Stopped; - CleanupWorkingFilesUnsafe(); - } - catch (Exception e) - { - _state = ReplayRecordingState.Stopped; - WriteDebugLog("Exception while finalizing replay on process exit: " + e.Message + "\n" + e.StackTrace); - } - } - } - - private string ResolveReplayPath(string replayFileName) - { - ArgumentException.ThrowIfNullOrWhiteSpace(replayFileName); - - if (Path.IsPathRooted(replayFileName) || !string.IsNullOrEmpty(Path.GetDirectoryName(replayFileName))) - return replayFileName; - - return Path.Combine(ReplayFileDirectory, replayFileName); - } - - private void EnsureNotDisposed() => ObjectDisposedException.ThrowIf(_disposed, this); - - private static void DeleteFileIfExists(string path) - { - if (File.Exists(path)) - File.Delete(path); - } - - private static void WriteLog(string t) - { - if (logOutput) - ConsoleIO.WriteLogLine("[Replay] " + t); - } - - private static void WriteDebugLog(string t) - { - if (Settings.Config.Logging.DebugMessages && logOutput) - WriteLog(t); - } - - private enum ReplayRecordingState - { - Recording, - Finalizing, - Stopped - } - } - - /// - /// Metadata used by Replay Mod. - /// - public class MetaDataHandler - { - private static readonly JsonSerializerOptions s_jsonOptions = new() - { - PropertyNamingPolicy = JsonNamingPolicy.CamelCase, - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull - }; - - private readonly HashSet _players = new(StringComparer.OrdinalIgnoreCase); - - public string MetaDataFileName { get; } = "metaData.json"; - public string temporaryCache { get; } - - public bool singlePlayer = false; - public string? serverName; - public string? customServerName; - public int duration; - public long date; - public string mcversion = "0.0"; - public string fileFormat = "MCPR"; - public int fileFormatVersion = 14; - public int protocol; - public string generator = "MCC"; - public int selfId = -1; - - public MetaDataHandler(string temporaryCache) - { - this.temporaryCache = temporaryCache; - } - - public void AddPlayerUUID(Guid uuid) - { - _players.Add(uuid.ToString()); - } - - public string ToJson() - { - ReplayMetaDataModel metaData = new() - { - Singleplayer = singlePlayer, - ServerName = serverName, - CustomServerName = customServerName, - Duration = duration, - Date = date, - Mcversion = mcversion, - FileFormat = fileFormat, - FileFormatVersion = fileFormatVersion, - Protocol = protocol, - Generator = generator, - SelfId = selfId, - Players = [.. _players] - }; - - return JsonSerializer.Serialize(metaData, s_jsonOptions); - } - - public void SaveToFile() - { - Directory.CreateDirectory(temporaryCache); - File.WriteAllText(Path.Combine(temporaryCache, MetaDataFileName), ToJson()); - } - - private sealed class ReplayMetaDataModel - { - public bool Singleplayer { get; init; } - public string? ServerName { get; init; } - public string? CustomServerName { get; init; } - public int Duration { get; init; } - public long Date { get; init; } - - [JsonPropertyName("mcversion")] - public string Mcversion { get; init; } = "0.0"; - - public string FileFormat { get; init; } = "MCPR"; - public int FileFormatVersion { get; init; } - public int Protocol { get; init; } - public string Generator { get; init; } = "MCC"; - public int SelfId { get; init; } = -1; - public string[] Players { get; init; } = []; - } - } -} diff --git a/MinecraftClient/Protocol/ServerStatusDisplay.cs b/MinecraftClient/Protocol/ServerStatusDisplay.cs deleted file mode 100644 index 291745e508..0000000000 --- a/MinecraftClient/Protocol/ServerStatusDisplay.cs +++ /dev/null @@ -1,119 +0,0 @@ -using System; -using System.Text; -using MinecraftClient.Protocol.Message; -using MinecraftClient.Scripting; - -namespace MinecraftClient.Protocol -{ - internal static class ServerStatusDisplay - { - private const int MaxSamplePlayers = 10; - - internal static void Show(ServerStatusInfo info) - { - if (ConsoleIO.Backend is Tui.TuiConsoleBackend tuiBackend) - ShowTui(info, tuiBackend); - else - ShowClassic(info); - } - - private static void ShowClassic(ServerStatusInfo info) - { - var sb = new StringBuilder(); - - sb.AppendLine(); - sb.Append("§8§m"); - sb.Append(new string('-', 50)); - sb.AppendLine("§r"); - - if (!string.IsNullOrEmpty(info.MotdRaw)) - { - try - { - sb.AppendLine(ChatParser.ParseText(info.MotdRaw)); - } - catch - { - sb.AppendLine(info.MotdRaw); - } - } - - sb.Append("§f"); - sb.Append(Translations.mcc_server_info_label_server); - sb.Append(" §b"); - sb.Append(info.Host); - sb.Append("§7:§b"); - sb.AppendLine(info.Port.ToString()); - - sb.Append("§f"); - sb.Append(Translations.mcc_server_info_label_version); - sb.Append(" §b"); - sb.Append(ChatBot.GetVerbatim(info.VersionName)); - sb.Append(" §7("); - sb.Append(string.Format(Translations.mcc_server_info_label_protocol, "§e" + info.ProtocolVersion + "§7")); - sb.AppendLine(")"); - - if (info.ResolvedProtocol != 0) - { - string resolvedMcVer = ProtocolHandler.ProtocolVersion2MCVer(info.ResolvedProtocol); - sb.Append("§f"); - sb.Append(Translations.mcc_server_info_label_connecting_as); - sb.Append(" §a"); - sb.Append(resolvedMcVer); - sb.Append(" §7("); - sb.Append(string.Format(Translations.mcc_server_info_label_protocol, "§a" + info.ResolvedProtocol + "§7")); - sb.AppendLine(")"); - } - - if (info.PingMs >= 0) - { - sb.Append("§f"); - sb.Append(Translations.mcc_server_info_label_ping); - sb.Append(" §a"); - sb.AppendLine(string.Format(Translations.mcc_server_info_label_ping_ms, info.PingMs)); - } - - sb.Append("§f"); - sb.Append(Translations.mcc_server_info_label_players); - sb.Append(" §a"); - sb.Append(info.OnlinePlayers); - sb.Append("§7/§c"); - sb.AppendLine(info.MaxPlayers.ToString()); - - if (info.SamplePlayers.Count > 0) - { - sb.Append("§f"); - sb.AppendLine(Translations.mcc_server_info_label_online); - - int shown = Math.Min(info.SamplePlayers.Count, MaxSamplePlayers); - for (int i = 0; i < shown; i++) - sb.AppendLine($" §a{info.SamplePlayers[i].Name}"); - - if (info.SamplePlayers.Count > shown) - sb.AppendLine($" §7{string.Format(Translations.mcc_server_info_sample_more, info.SamplePlayers.Count - shown)}"); - } - - sb.Append("§8§m"); - sb.Append(new string('-', 50)); - sb.Append("§r"); - - ConsoleIO.WriteLineFormatted(sb.ToString(), acceptnewlines: true); - } - - private static void ShowTui(ServerStatusInfo info, Tui.TuiConsoleBackend backend) - { - var view = backend.GetView(); - if (view is null) - { - ShowClassic(info); - return; - } - - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - var panel = Tui.ServerStatusPanelBuilder.Build(info); - view.AppendControlToLog(panel); - }); - } - } -} diff --git a/MinecraftClient/Protocol/ServerStatusInfo.cs b/MinecraftClient/Protocol/ServerStatusInfo.cs deleted file mode 100644 index b864e64d0d..0000000000 --- a/MinecraftClient/Protocol/ServerStatusInfo.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace MinecraftClient.Protocol -{ - /// - /// Holds the structured result of a Minecraft server status (SLP) ping, - /// including MOTD, player counts, sample player list, version, and favicon. - /// - public sealed class ServerStatusInfo - { - public string Host { get; init; } = string.Empty; - public int Port { get; init; } - public string VersionName { get; init; } = string.Empty; - public int ProtocolVersion { get; init; } - public int ResolvedProtocol { get; set; } - public int OnlinePlayers { get; init; } - public int MaxPlayers { get; init; } - public List SamplePlayers { get; init; } = []; - public string MotdRaw { get; init; } = string.Empty; - public string? FaviconBase64 { get; init; } - public long PingMs { get; init; } - - public sealed class SamplePlayer - { - public string Name { get; init; } = string.Empty; - public string Id { get; init; } = string.Empty; - } - } -} diff --git a/MinecraftClient/Protocol/Session/SessionCache.cs b/MinecraftClient/Protocol/Session/SessionCache.cs deleted file mode 100644 index f3d00df977..0000000000 --- a/MinecraftClient/Protocol/Session/SessionCache.cs +++ /dev/null @@ -1,220 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Timers; -using MessagePack; -using static MinecraftClient.Settings; -using static MinecraftClient.Settings.MainConfigHelper.MainConfig.AdvancedConfig; - -namespace MinecraftClient.Protocol.Session -{ - /// - /// Handle sessions caching and storage. - /// - public static class SessionCache - { - private const string SessionCacheFileSerialized = "SessionCache.db"; - private static readonly string SessionCacheFileMinecraft = String.Concat( - Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), - Path.DirectorySeparatorChar, - ".minecraft", - Path.DirectorySeparatorChar, - "launcher_profiles.json" - ); - - private static FileMonitor? cachemonitor; - private static readonly Dictionary sessions = new(); - private static readonly Timer updatetimer = new(100); - private static readonly List> pendingadds = new(); - - /// - /// Retrieve whether SessionCache contains a session for the given login. - /// - /// User login used with Minecraft.net - /// TRUE if session is available - public static bool Contains(string login) - { - return sessions.ContainsKey(login); - } - - /// - /// Store a session and save it to disk if required. - /// - /// User login used with Minecraft.net - /// User session token used with Minecraft.net - public static void Store(string login, SessionToken session) - { - if (Contains(login)) - { - sessions[login] = session; - } - else - { - sessions.Add(login, session); - } - - if (Config.Main.Advanced.SessionCache == CacheType.disk && updatetimer.Enabled == true) - { - pendingadds.Add(new KeyValuePair(login, session)); - } - else if (Config.Main.Advanced.SessionCache == CacheType.disk) - { - SaveToDisk(); - } - } - - /// - /// Retrieve a session token for the given login. - /// - /// User login used with Minecraft.net - /// SessionToken for given login - public static SessionToken Get(string login) - { - return sessions[login]; - } - - /// - /// Initialize cache monitoring to keep cache updated with external changes. - /// - /// TRUE if session tokens are seeded from file - public static bool InitializeDiskCache() - { - cachemonitor = new FileMonitor(AppDomain.CurrentDomain.BaseDirectory, SessionCacheFileSerialized, new FileSystemEventHandler(OnChanged)); - updatetimer.Elapsed += HandlePending; - return LoadFromDisk(); - } - - /// - /// Reloads cache on external cache file change. - /// - /// Sender - /// Event data - private static void OnChanged(object sender, FileSystemEventArgs e) - { - updatetimer.Stop(); - updatetimer.Start(); - } - - /// - /// Called after timer elapsed. Reads disk cache and adds new/modified sessions back. - /// - /// Sender - /// Event data - private static void HandlePending(object? sender, ElapsedEventArgs e) - { - updatetimer.Stop(); - LoadFromDisk(); - - foreach (KeyValuePair pending in pendingadds.ToArray()) - { - Store(pending.Key, pending.Value); - pendingadds.Remove(pending); - } - } - - /// - /// Reads cache file and loads SessionTokens into SessionCache. - /// - /// True if data is successfully loaded - private static bool LoadFromDisk() - { - // Grab sessions in the Minecraft directory - if (File.Exists(SessionCacheFileMinecraft)) - { - if (Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted(string.Format(Translations.cache_loading, Path.GetFileName(SessionCacheFileMinecraft))); - System.Text.Json.Nodes.JsonNode? mcSession = null; - try - { - mcSession = Json.ParseJson(File.ReadAllText(SessionCacheFileMinecraft)); - } - catch (IOException) { /* Failed to read file from disk -- ignoring */ } - if (mcSession is System.Text.Json.Nodes.JsonObject mcSessionObj - && mcSessionObj.ContainsKey("clientToken") - && mcSessionObj.ContainsKey("authenticationDatabase")) - { - string clientID = mcSession["clientToken"]!.GetStringValue().Replace("-", ""); - var sessionItems = mcSession["authenticationDatabase"]!.AsObject(); - foreach (var kvp in sessionItems) - { - string key = kvp.Key; - if (Guid.TryParseExact(key, "N", out Guid temp)) - { - var sessionItem = kvp.Value!.AsObject(); - if (sessionItem.ContainsKey("displayName") - && sessionItem.ContainsKey("accessToken") - && sessionItem.ContainsKey("username") - && sessionItem.ContainsKey("uuid")) - { - string login = Settings.ToLowerIfNeed(sessionItem["username"]!.GetStringValue()); - try - { - SessionToken session = SessionToken.FromString(String.Join(",", - sessionItem["accessToken"]!.GetStringValue(), - sessionItem["displayName"]!.GetStringValue(), - sessionItem["uuid"]!.GetStringValue().Replace("-", ""), - clientID - )); - if (Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted(string.Format(Translations.cache_loaded, login, session.ID)); - sessions[login] = session; - } - catch (InvalidDataException) { /* Not a valid session */ } - } - } - } - } - } - - // Serialized session cache file in binary format - if (File.Exists(SessionCacheFileSerialized)) - { - if (Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted(string.Format(Translations.cache_converting, SessionCacheFileSerialized)); - - try - { - using FileStream fs = new(SessionCacheFileSerialized, FileMode.Open, FileAccess.Read, FileShare.Read); - // Deserialize using MessagePack - Dictionary sessionsTemp = MessagePackSerializer.Deserialize>(fs); - foreach (KeyValuePair item in sessionsTemp) - { - if (Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted(string.Format(Translations.cache_loaded, item.Key, item.Value.ID)); - sessions[item.Key] = item.Value; - } - } - catch (IOException ex) - { - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.cache_read_fail, ex.Message)); - } - catch (MessagePackSerializationException ex2) - { - ConsoleIO.WriteLineFormatted(string.Format(Translations.cache_malformed, ex2.Message)); - } - } - - return sessions.Count > 0; - } - - /// - /// Saves SessionToken's from SessionCache into cache file. - /// - private static void SaveToDisk() - { - if (Config.Logging.DebugMessages) - ConsoleIO.WriteLineFormatted("§8" + Translations.cache_saving, acceptnewlines: true); - - try - { - using FileStream fs = new(SessionCacheFileSerialized, FileMode.Create, FileAccess.Write, FileShare.None); - // Serialize using MessagePack - MessagePackSerializer.Serialize(fs, sessions); - } - catch (IOException e) - { - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.cache_save_fail, e.Message)); - } - } - } -} diff --git a/MinecraftClient/Protocol/Session/SessionToken.cs b/MinecraftClient/Protocol/Session/SessionToken.cs deleted file mode 100644 index a5d9f35c82..0000000000 --- a/MinecraftClient/Protocol/Session/SessionToken.cs +++ /dev/null @@ -1,111 +0,0 @@ -using System; -using System.IO; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using MessagePack; -using MinecraftClient.Scripting; -using static MinecraftClient.Settings.MainConfigHelper.MainConfig.GeneralConfig; - -namespace MinecraftClient.Protocol.Session -{ - [Serializable] - [MessagePackObject] - public class SessionToken - { - private static readonly Regex JwtRegex = new("^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+$"); - - [Key(0)] - public string ID { get; set; } - [Key(1)] - public string PlayerName { get; set; } - [Key(2)] - public string PlayerID { get; set; } - [Key(3)] - public string ClientID { get; set; } - [Key(4)] - public string RefreshToken { get; set; } - [Key(5)] - public string ServerIDhash { get; set; } - [Key(6)] - public byte[]? ServerPublicKey { get; set; } - - [IgnoreMember] - public Task? SessionPreCheckTask = null; - - public SessionToken() - { - ID = String.Empty; - PlayerName = String.Empty; - PlayerID = String.Empty; - ClientID = String.Empty; - RefreshToken = String.Empty; - ServerIDhash = String.Empty; - ServerPublicKey = null; - } - - public bool SessionPreCheck(LoginType type) - { - if (ID == string.Empty || PlayerID == String.Empty || ServerPublicKey is null) - return false; - Crypto.CryptoHandler.ClientAESPrivateKey ??= Crypto.CryptoHandler.GenerateAESPrivateKey(); - string serverHash = Crypto.CryptoHandler.GetServerHash(ServerIDhash, ServerPublicKey, Crypto.CryptoHandler.ClientAESPrivateKey); - if (ProtocolHandler.SessionCheck(PlayerID, ID, serverHash, type)) - return true; - return false; - } - - public override string ToString() - { - return String.Join(",", ID, PlayerName, PlayerID, ClientID, RefreshToken, ServerIDhash, - (ServerPublicKey is null) ? String.Empty : Convert.ToBase64String(ServerPublicKey)); - } - - public static SessionToken FromString(string tokenString) - { - string[] fields = tokenString.Split(','); - if (fields.Length < 4) - throw new InvalidDataException("Invalid string format"); - - SessionToken session = new() - { - ID = fields[0], - PlayerName = fields[1], - PlayerID = fields[2], - ClientID = fields[3] - }; - // Backward compatible with old session file without refresh token field - if (fields.Length > 4) - session.RefreshToken = fields[4]; - else - session.RefreshToken = String.Empty; - if (fields.Length > 5) - session.ServerIDhash = fields[5]; - else - session.ServerIDhash = String.Empty; - if (fields.Length > 6) - { - try - { - session.ServerPublicKey = Convert.FromBase64String(fields[6]); - } - catch - { - session.ServerPublicKey = null; - } - } - else - session.ServerPublicKey = null; - if (!JwtRegex.IsMatch(session.ID)) - throw new InvalidDataException("Invalid session ID"); - if (!ChatBot.IsValidName(session.PlayerName)) - throw new InvalidDataException("Invalid player name"); - if (!Guid.TryParseExact(session.PlayerID, "N", out _)) - throw new InvalidDataException("Invalid player ID"); - if (!Guid.TryParseExact(session.ClientID, "N", out _)) - throw new InvalidDataException("Invalid client ID"); - // No validation on refresh token because it is custom format token (not Jwt) - - return session; - } - } -} diff --git a/MinecraftClient/Proxy/ProxyHandler.cs b/MinecraftClient/Proxy/ProxyHandler.cs deleted file mode 100644 index 1cd55e403e..0000000000 --- a/MinecraftClient/Proxy/ProxyHandler.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System.Net.Sockets; -using Starksoft.Aspen.Proxy; -using Tomlet.Attributes; - -namespace MinecraftClient.Proxy -{ - /// - /// Automatically handle proxies according to the app Settings. - /// Note: Underlying proxy handling is taken from Starksoft, LLC's Biko Library. - /// This library is open source and provided under the MIT license. More info at biko.codeplex.com. - /// - - public static class ProxyHandler - { - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [TomlInlineComment("$Proxy.Enabled_Update$")] - public bool Enabled_Update = false; - - [TomlInlineComment("$Proxy.Enabled_Login$")] - public bool Enabled_Login = false; - - [TomlInlineComment("$Proxy.Enabled_Ingame$")] - public bool Enabled_Ingame = false; - - [TomlInlineComment("$Proxy.Server$")] - public ProxyInfoConfig Server = new("0.0.0.0", 8080); - - [TomlInlineComment("$Proxy.Proxy_Type$")] - public ProxyType Proxy_Type = ProxyType.HTTP; - - [TomlInlineComment("$Proxy.Username$")] - public string Username = ""; - - [TomlInlineComment("$Proxy.Password$")] - public string Password = ""; - - public void OnSettingUpdate() { } - - public struct ProxyInfoConfig - { - public string Host; - public ushort Port; - - public ProxyInfoConfig(string host, ushort port) - { - Host = host; - Port = port; - } - } - - public enum ProxyType { HTTP, SOCKS4, SOCKS4a, SOCKS5 }; - } - - private static readonly ProxyClientFactory factory = new(); - private static IProxyClient? proxy; - private static bool proxy_ok = false; - - /// - /// Create a regular TcpClient or a proxied TcpClient according to the app Settings. - /// - /// Target host - /// Target port - /// True if the purpose is logging in to a Minecraft account - - public static TcpClient NewTcpClient(string host, int port, bool login = false) - { - try - { - if (login ? Config.Enabled_Login : Config.Enabled_Ingame) - { - ProxyType innerProxytype = ProxyType.Http; - - switch (Config.Proxy_Type) - { - case Configs.ProxyType.HTTP: innerProxytype = ProxyType.Http; break; - case Configs.ProxyType.SOCKS4: innerProxytype = ProxyType.Socks4; break; - case Configs.ProxyType.SOCKS4a: innerProxytype = ProxyType.Socks4a; break; - case Configs.ProxyType.SOCKS5: innerProxytype = ProxyType.Socks5; break; - } - - if (!string.IsNullOrWhiteSpace(Config.Username) && !string.IsNullOrWhiteSpace(Config.Password)) - proxy = factory.CreateProxyClient(innerProxytype, Config.Server.Host, Config.Server.Port, Config.Username, Config.Password); - else - proxy = factory.CreateProxyClient(innerProxytype, Config.Server.Host, Config.Server.Port); - - if (!proxy_ok) - { - ConsoleIO.WriteLineFormatted("§8" + string.Format(Translations.proxy_connected, Config.Server.Host, Config.Server.Port)); - proxy_ok = true; - } - - return proxy.CreateConnection(host, port); - } - else return new TcpClient(host, port); - } - catch (ProxyException e) - { - ConsoleIO.WriteLineFormatted("§8" + e.Message); - proxy = null; - throw new SocketException((int)SocketError.HostUnreachable); - } - } - } -} diff --git a/MinecraftClient/RecipeBookRecipeEntry.cs b/MinecraftClient/RecipeBookRecipeEntry.cs deleted file mode 100644 index a5648ba74e..0000000000 --- a/MinecraftClient/RecipeBookRecipeEntry.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace MinecraftClient -{ - public readonly record struct RecipeBookRecipeEntry(string CommandId, string DisplayText); -} diff --git a/MinecraftClient/Resources/AppIcon.ico b/MinecraftClient/Resources/AppIcon.ico deleted file mode 100644 index 4ba74058b6..0000000000 Binary files a/MinecraftClient/Resources/AppIcon.ico and /dev/null differ diff --git a/MinecraftClient/Resources/AsciiArt/AsciiArt.Designer.cs b/MinecraftClient/Resources/AsciiArt/AsciiArt.Designer.cs deleted file mode 100644 index 142a0f2696..0000000000 --- a/MinecraftClient/Resources/AsciiArt/AsciiArt.Designer.cs +++ /dev/null @@ -1,273 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace MinecraftClient { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class AsciiArt { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal AsciiArt() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MinecraftClient.Resources.AsciiArt.AsciiArt", typeof(AsciiArt).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to ╔═════════════════════════════════════╗ - ///║ Brewing Stand ║ - ///║ ╔═══╗ ⡈ ⠄╔═══╗ ║ - ///║ ║ 4 ╟───╮ ⢠⡐⢈║ 3 ║ ┃ ║ - ///║ ╚═══╝ ╭─╯ ⠂⡠⢂╚╦╦╦╝ ┃ ║ - ///║ ╰───■■■■ ║║║ ▼ ║ - ///║ ╔═══╦═╝║╚═╦═══╗ ║ - ///║ ║ 0 ║╔═╩═╗║ 2 ║ ║ - ///║ ╚═══╝║ 1 ║╚═══╝ ║ - ///║ Inventory ╚═══╝ ║ - ///║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ - ///║║ 5 ║ 6 ║ 7 ║ 8 ║ 9 ║10 ║11 ║12 ║13 ║║ - ///║╠═══╬═══╬═══╬═══╬══ [rest of string was truncated]";. - /// - internal static string Container_BrewingStand { - get { - return ResourceManager.GetString("Container.BrewingStand", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ╔═════════════════════════════════════╗ - ///║ Crafting ║ - ///║ ╔═══╦═══╦═══╗ ║ - ///║ ║ 1 ║ 2 ║ 3 ║ ║ - ///║ ╠═══╬═══╬═══╣ ╔═══╗ ║ - ///║ ║ 4 ║ 5 ║ 6 ║ ━━▶ ║ 0 ║ ║ - ///║ ╠═══╬═══╬═══╣ ╚═══╝ ║ - ///║ ║ 7 ║ 8 ║ 9 ║ ║ - ///║ ╚═══╩═══╩═══╝ ║ - ///║ Inventory ║ - ///║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ - ///║║10 ║11 ║12 ║13 ║14 ║15 ║16 ║17 ║18 ║║ - ///║╠═══╬═══╬═══╬═══╬══ [rest of string was truncated]";. - /// - internal static string Container_Crafting { - get { - return ResourceManager.GetString("Container.Crafting", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ╔═════════════════════════════════════╗ - ///║ Enchant ║ - ///║ ╔════════════════════╗ ║ - ///║ ║ Top ║ ║ - ///║ ╔═══╦═══╗ ╠════════════════════╣ ║ - ///║ ║ 0 ║ 1 ║ ║ Middle ║ ║ - ///║ ╚═══╩═══╝ ╠════════════════════╣ ║ - ///║ ║ Bottom ║ ║ - ///║ ╚════════════════════╝ ║ - ///║ Inventory ║ - ///║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ - ///║║ 2 ║ 3 ║ 4 ║ 5 ║ 6 ║ 7 ║ 8 ║ 9 ║10 ║║ - ///║╠═══╬═══╬═══╬═══╬══ [rest of string was truncated]";. - /// - internal static string Container_EnchantingTable { - get { - return ResourceManager.GetString("Container.EnchantingTable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ╔═════════════════════════════════════╗ - ///║ Container ║ - ///║ ╔═══╗ ║ - ///║ ║ 0 ║ ║ - ///║ ╚═══╝ ╔═══╗ ║ - ///║ ⠂⡠⢂ ━━▶ ║ 2 ║ ║ - ///║ ⠂⡠⢂ ╚═══╝ ║ - ///║ ╔═══╗ ║ - ///║ ║ 1 ║ ║ - ///║ ╚═══╝ ║ - ///║ Inventory ║ - ///║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ - ///║║ 3 ║ 4 ║ 5 ║ 6 ║ 7 [rest of string was truncated]";. - /// - internal static string Container_Furnace { - get { - return ResourceManager.GetString("Container.Furnace", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ╔═════════════════════════════════════╗ - ///║ Container ║ - ///║ ╔═══╦═══╦═══╗ ║ - ///║ ║ 0 ║ 1 ║ 2 ║ ║ - ///║ ╠═══╬═══╬═══╣ ║ - ///║ ║ 3 ║ 4 ║ 5 ║ ║ - ///║ ╠═══╬═══╬═══╣ ║ - ///║ ║ 6 ║ 7 ║ 8 ║ ║ - ///║ ╚═══╩═══╩═══╝ ║ - ///║ Inventory ║ - ///║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ - ///║║ 9 ║10 ║11 ║12 ║13 ║14 ║15 ║16 ║17 ║║ - ///║╠═══╬═══╬═══╬═══╬══ [rest of string was truncated]";. - /// - internal static string Container_Generic_3x3 { - get { - return ResourceManager.GetString("Container.Generic_3x3", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ╔═════════════════════════════════════╗ - ///║ Container ║ - ///║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ - ///║║ 0 ║ 1 ║ 2 ║ 3 ║ 4 ║ 5 ║ 6 ║ 7 ║ 8 ║║ - ///║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ - ///║║ 9 ║10 ║11 ║12 ║13 ║14 ║15 ║16 ║17 ║║ - ///║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ - ///║║18 ║19 ║20 ║21 ║22 ║23 ║24 ║25 ║26 ║║ - ///║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ - ///║ Inventory ║ - ///║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ - ///║║27 ║28 ║29 ║30 ║31 ║32 ║33 ║34 ║35 ║║ - ///║╠═══╬═══╬═══╬═══╬══ [rest of string was truncated]";. - /// - internal static string Container_Generic_9x3 { - get { - return ResourceManager.GetString("Container.Generic_9x3", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ╔═════════════════════════════════════╗ - ///║ Container ║ - ///║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ - ///║║ 0 ║ 1 ║ 2 ║ 3 ║ 4 ║ 5 ║ 6 ║ 7 ║ 8 ║║ - ///║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ - ///║║ 9 ║10 ║11 ║12 ║13 ║14 ║15 ║16 ║17 ║║ - ///║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ - ///║║18 ║19 ║20 ║21 ║22 ║23 ║24 ║25 ║26 ║║ - ///║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ - ///║║27 ║28 ║29 ║30 ║31 ║32 ║33 ║34 ║35 ║║ - ///║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ - ///║║36 ║37 ║38 ║39 ║40 ║41 ║42 ║43 ║44 ║║ - ///║╠═══╬═══╬═══╬═══╬══ [rest of string was truncated]";. - /// - internal static string Container_Generic_9x6 { - get { - return ResourceManager.GetString("Container.Generic_9x6", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ╔═════════════════════════════════════╗ - ///║ Repair & Disenchant ║ - ///║ ╔═════════╗ ║ - ///║ ║ ╔═══╗ ║ ║ - ///║ ╔══║ ║ 0 ║ ║══╗ ║ - ///║ ║ ║ ╚═══╝ ║ ║ ║ - ///║ ║ ║ ╔═══╗ ║ ║ ╔═══╗ ║ - ///║ ║ ║ ║ 1 ║ ║ ║ ━━▶ ║ 2 ║ ║ - ///║ ║ ║ ╚═══╝ ║ ║ ╚═══╝ ║ - ///║ ║ ╠═════════╣ ║ ║ - ///║ ║ ║ ║ ║ ║ - ///║ ╚══╝ ╚══╝ ║ - ///║ [rest of string was truncated]";. - /// - internal static string Container_Grindstone { - get { - return ResourceManager.GetString("Container.Grindstone", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ╔═════════════════════════════════════╗ - ///║ Container ║ - ///║ ╔═══╦═══╦═══╦═══╦═══╗ ║ - ///║ ║ 0 ║ 1 ║ 2 ║ 3 ║ 4 ║ ║ - ///║ ╚═══╩═══╩═══╩═══╩═══╝ ║ - ///║ Inventory ║ - ///║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ - ///║║ 5 ║ 6 ║ 7 ║ 8 ║ 9 ║10 ║11 ║12 ║13 ║║ - ///║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ - ///║║14 ║15 ║16 ║17 ║18 ║19 ║20 ║21 ║22 ║║ - ///║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ - ///║║23 ║24 ║25 ║26 ║27 ║28 ║29 ║30 ║31 ║║ - ///║╚═══╩═══╩═══╩═══╩══ [rest of string was truncated]";. - /// - internal static string Container_Hopper { - get { - return ResourceManager.GetString("Container.Hopper", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ╔═════════════════════════════════════╗ - ///║╔═══╦═══════════╗ ║ - ///║║ 5 ║ ███ ║ ╔═══╦═══╗ ║ - ///║╠═══╣ ███ ║ ║ 1 ║ 2 ║ ╔═══╗║ - ///║║ 6 ║ ███████ ║ ╠═══╬═══╣━━▶║ 0 ║║ - ///║╠═══╣ ███████ ║ ║ 3 ║ 4 ║ ╚═══╝║ - ///║║ 7 ║ ███████ ║ ╚═══╩═══╝ ║ - ///║╠═══╣ ███ ╠═══╗ ║ - ///║║ 8 ║ ███ ║45 ║ ║ - ///║╚═══╩═══════════╩═══╝ ║ - ///║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ - ///║║ 9 ║10 ║11 ║12 ║13 ║14 ║15 ║16 ║17 ║║ - ///║╠═══╬═══╬═══╬═══╬══ [rest of string was truncated]";. - /// - internal static string Container_PlayerInventory { - get { - return ResourceManager.GetString("Container_PlayerInventory", resourceCulture); - } - } - } -} diff --git a/MinecraftClient/Resources/AsciiArt/AsciiArt.resx b/MinecraftClient/Resources/AsciiArt/AsciiArt.resx deleted file mode 100644 index 186536303e..0000000000 --- a/MinecraftClient/Resources/AsciiArt/AsciiArt.resx +++ /dev/null @@ -1,367 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ╔═════════════════════════════════════╗ -║ Brewing Stand ║ -║ ╔═══╗ ⡈ ⠄╔═══╗ ║ -║ ║ 4 ╟───╮ ⢠⡐⢈║ 3 ║ ┃ ║ -║ ╚═══╝ ╭─╯ ⠂⡠⢂╚╦╦╦╝ ┃ ║ -║ ╰───■■■■ ║║║ ▼ ║ -║ ╔═══╦═╝║╚═╦═══╗ ║ -║ ║ 0 ║╔═╩═╗║ 2 ║ ║ -║ ╚═══╝║ 1 ║╚═══╝ ║ -║ Inventory ╚═══╝ ║ -║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ -║║ 5 ║ 6 ║ 7 ║ 8 ║ 9 ║10 ║11 ║12 ║13 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║14 ║15 ║16 ║17 ║18 ║19 ║20 ║21 ║22 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║23 ║24 ║25 ║26 ║27 ║28 ║29 ║30 ║31 ║║ -║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ -║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ -║║32 ║33 ║34 ║35 ║36 ║37 ║38 ║39 ║40 ║║ -║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ -║ 1 2 3 4 5 6 7 8 9 ║ -╚═════════════════════════════════════╝ - - - ╔═════════════════════════════════════╗ -║ Crafting ║ -║ ╔═══╦═══╦═══╗ ║ -║ ║ 1 ║ 2 ║ 3 ║ ║ -║ ╠═══╬═══╬═══╣ ╔═══╗ ║ -║ ║ 4 ║ 5 ║ 6 ║ ━━▶ ║ 0 ║ ║ -║ ╠═══╬═══╬═══╣ ╚═══╝ ║ -║ ║ 7 ║ 8 ║ 9 ║ ║ -║ ╚═══╩═══╩═══╝ ║ -║ Inventory ║ -║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ -║║10 ║11 ║12 ║13 ║14 ║15 ║16 ║17 ║18 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║19 ║20 ║21 ║22 ║23 ║24 ║25 ║26 ║27 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║28 ║29 ║30 ║31 ║32 ║33 ║34 ║35 ║36 ║║ -║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ -║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ -║║37 ║38 ║39 ║40 ║41 ║42 ║43 ║44 ║45 ║║ -║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ -║ 1 2 3 4 5 6 7 8 9 ║ -╚═════════════════════════════════════╝ - - - ╔═════════════════════════════════════╗ -║ Enchant ║ -║ ╔════════════════════╗ ║ -║ ║ Top ║ ║ -║ ╔═══╦═══╗ ╠════════════════════╣ ║ -║ ║ 0 ║ 1 ║ ║ Middle ║ ║ -║ ╚═══╩═══╝ ╠════════════════════╣ ║ -║ ║ Bottom ║ ║ -║ ╚════════════════════╝ ║ -║ Inventory ║ -║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ -║║ 2 ║ 3 ║ 4 ║ 5 ║ 6 ║ 7 ║ 8 ║ 9 ║10 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║11 ║12 ║13 ║14 ║15 ║16 ║17 ║18 ║19 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║20 ║21 ║22 ║23 ║24 ║25 ║26 ║27 ║28 ║║ -║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ -║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ -║║29 ║30 ║31 ║32 ║33 ║34 ║35 ║36 ║37 ║║ -║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ -║ 1 2 3 4 5 6 7 8 9 ║ -╚═════════════════════════════════════╝ - - - ╔═════════════════════════════════════╗ -║ Container ║ -║ ╔═══╗ ║ -║ ║ 0 ║ ║ -║ ╚═══╝ ╔═══╗ ║ -║ ⠂⡠⢂ ━━▶ ║ 2 ║ ║ -║ ⠂⡠⢂ ╚═══╝ ║ -║ ╔═══╗ ║ -║ ║ 1 ║ ║ -║ ╚═══╝ ║ -║ Inventory ║ -║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ -║║ 3 ║ 4 ║ 5 ║ 6 ║ 7 ║ 8 ║ 9 ║10 ║11 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║12 ║13 ║14 ║15 ║16 ║17 ║18 ║19 ║20 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║21 ║22 ║23 ║24 ║25 ║26 ║27 ║38 ║29 ║║ -║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ -║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ -║║30 ║31 ║32 ║33 ║34 ║35 ║36 ║37 ║38 ║║ -║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ -║ 1 2 3 4 5 6 7 8 9 ║ -╚═════════════════════════════════════╝ - - - ╔═════════════════════════════════════╗ -║ Container ║ -║ ╔═══╦═══╦═══╗ ║ -║ ║ 0 ║ 1 ║ 2 ║ ║ -║ ╠═══╬═══╬═══╣ ║ -║ ║ 3 ║ 4 ║ 5 ║ ║ -║ ╠═══╬═══╬═══╣ ║ -║ ║ 6 ║ 7 ║ 8 ║ ║ -║ ╚═══╩═══╩═══╝ ║ -║ Inventory ║ -║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ -║║ 9 ║10 ║11 ║12 ║13 ║14 ║15 ║16 ║17 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║18 ║19 ║20 ║21 ║22 ║23 ║24 ║25 ║26 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║27 ║28 ║29 ║30 ║31 ║32 ║33 ║34 ║35 ║║ -║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ -║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ -║║36 ║37 ║38 ║39 ║40 ║41 ║42 ║43 ║44 ║║ -║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ -║ 1 2 3 4 5 6 7 8 9 ║ -╚═════════════════════════════════════╝ - - - ╔═════════════════════════════════════╗ -║ Container ║ -║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ -║║ 0 ║ 1 ║ 2 ║ 3 ║ 4 ║ 5 ║ 6 ║ 7 ║ 8 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║ 9 ║10 ║11 ║12 ║13 ║14 ║15 ║16 ║17 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║18 ║19 ║20 ║21 ║22 ║23 ║24 ║25 ║26 ║║ -║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ -║ Inventory ║ -║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ -║║27 ║28 ║29 ║30 ║31 ║32 ║33 ║34 ║35 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║36 ║37 ║38 ║39 ║40 ║41 ║42 ║43 ║44 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║45 ║46 ║47 ║48 ║49 ║50 ║51 ║52 ║53 ║║ -║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ -║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ -║║54 ║55 ║56 ║57 ║58 ║59 ║60 ║61 ║62 ║║ -║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ -║ 1 2 3 4 5 6 7 8 9 ║ -╚═════════════════════════════════════╝ - - - ╔═════════════════════════════════════╗ -║ Container ║ -║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ -║║ 0 ║ 1 ║ 2 ║ 3 ║ 4 ║ 5 ║ 6 ║ 7 ║ 8 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║ 9 ║10 ║11 ║12 ║13 ║14 ║15 ║16 ║17 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║18 ║19 ║20 ║21 ║22 ║23 ║24 ║25 ║26 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║27 ║28 ║29 ║30 ║31 ║32 ║33 ║34 ║35 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║36 ║37 ║38 ║39 ║40 ║41 ║42 ║43 ║44 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║45 ║46 ║47 ║48 ║49 ║50 ║51 ║52 ║53 ║║ -║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ -║ Inventory ║ -║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ -║║54 ║55 ║56 ║57 ║58 ║59 ║60 ║61 ║62 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║63 ║64 ║65 ║66 ║67 ║68 ║69 ║70 ║71 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║72 ║73 ║74 ║75 ║76 ║77 ║78 ║79 ║80 ║║ -║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ -║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ -║║81 ║82 ║83 ║84 ║85 ║86 ║87 ║88 ║89 ║║ -║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ -║ 1 2 3 4 5 6 7 8 9 ║ -╚═════════════════════════════════════╝ - - - ╔═════════════════════════════════════╗ -║ Repair & Disenchant ║ -║ ╔═════════╗ ║ -║ ║ ╔═══╗ ║ ║ -║ ╔══║ ║ 0 ║ ║══╗ ║ -║ ║ ║ ╚═══╝ ║ ║ ║ -║ ║ ║ ╔═══╗ ║ ║ ╔═══╗ ║ -║ ║ ║ ║ 1 ║ ║ ║ ━━▶ ║ 2 ║ ║ -║ ║ ║ ╚═══╝ ║ ║ ╚═══╝ ║ -║ ║ ╠═════════╣ ║ ║ -║ ║ ║ ║ ║ ║ -║ ╚══╝ ╚══╝ ║ -║ ║ -║ Inventory ║ -║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ -║║ 3 ║ 4 ║ 5 ║ 6 ║ 7 ║ 8 ║ 9 ║10 ║11 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║12 ║13 ║14 ║15 ║16 ║17 ║18 ║19 ║20 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║21 ║22 ║23 ║24 ║25 ║26 ║27 ║38 ║29 ║║ -║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ -║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ -║║30 ║31 ║32 ║33 ║34 ║35 ║36 ║37 ║38 ║║ -║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ -║ 1 2 3 4 5 6 7 8 9 ║ -╚═════════════════════════════════════╝ - - - ╔═════════════════════════════════════╗ -║ Container ║ -║ ╔═══╦═══╦═══╦═══╦═══╗ ║ -║ ║ 0 ║ 1 ║ 2 ║ 3 ║ 4 ║ ║ -║ ╚═══╩═══╩═══╩═══╩═══╝ ║ -║ Inventory ║ -║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ -║║ 5 ║ 6 ║ 7 ║ 8 ║ 9 ║10 ║11 ║12 ║13 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║14 ║15 ║16 ║17 ║18 ║19 ║20 ║21 ║22 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║23 ║24 ║25 ║26 ║27 ║28 ║29 ║30 ║31 ║║ -║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ -║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ -║║32 ║33 ║34 ║35 ║36 ║37 ║38 ║39 ║40 ║║ -║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ -║ 1 2 3 4 5 6 7 8 9 ║ -╚═════════════════════════════════════╝ - - - ╔═════════════════════════════════════╗ -║╔═══╦═══════════╗ ║ -║║ 5 ║ ███ ║ ╔═══╦═══╗ ║ -║╠═══╣ ███ ║ ║ 1 ║ 2 ║ ╔═══╗║ -║║ 6 ║ ███████ ║ ╠═══╬═══╣━━▶║ 0 ║║ -║╠═══╣ ███████ ║ ║ 3 ║ 4 ║ ╚═══╝║ -║║ 7 ║ ███████ ║ ╚═══╩═══╝ ║ -║╠═══╣ ███ ╠═══╗ ║ -║║ 8 ║ ███ ║45 ║ ║ -║╚═══╩═══════════╩═══╝ ║ -║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ -║║ 9 ║10 ║11 ║12 ║13 ║14 ║15 ║16 ║17 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║18 ║19 ║20 ║21 ║22 ║23 ║24 ║25 ║26 ║║ -║╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣║ -║║27 ║28 ║29 ║30 ║31 ║32 ║33 ║34 ║35 ║║ -║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ -║╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗║ -║║36 ║37 ║38 ║39 ║40 ║41 ║42 ║43 ║44 ║║ -║╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝║ -║ 1 2 3 4 5 6 7 8 9 ║ -╚═════════════════════════════════════╝ - - \ No newline at end of file diff --git a/MinecraftClient/Resources/ConfigComments/ConfigComments.Designer.cs b/MinecraftClient/Resources/ConfigComments/ConfigComments.Designer.cs deleted file mode 100644 index 5c86e6b0fe..0000000000 --- a/MinecraftClient/Resources/ConfigComments/ConfigComments.Designer.cs +++ /dev/null @@ -1,2297 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace MinecraftClient { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class ConfigComments { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal ConfigComments() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MinecraftClient.Resources.ConfigComments.ConfigComments", typeof(ConfigComments).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to can be used in some other fields as %yourvar% - ///%username% and %serverip% are reserved variables.. - /// - internal static string AppVars_Variables { - get { - return ResourceManager.GetString("AppVars.Variables", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to =============================== # - /// Minecraft Console Client Bots # - ///=============================== #. - /// - internal static string ChatBot { - get { - return ResourceManager.GetString("ChatBot", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Get alerted when specified words are detected in chat - ///Useful for moderating your server or detecting when someone is talking to you. - /// - internal static string ChatBot_Alerts { - get { - return ResourceManager.GetString("ChatBot.Alerts", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Play a beep sound when a word is detected in addition to highlighting.. - /// - internal static string ChatBot_Alerts_Beep_Enabled { - get { - return ResourceManager.GetString("ChatBot.Alerts.Beep_Enabled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to List of words/strings to NOT alert you on.. - /// - internal static string ChatBot_Alerts_Excludes { - get { - return ResourceManager.GetString("ChatBot.Alerts.Excludes", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The name of a file where alers logs will be written.. - /// - internal static string ChatBot_Alerts_Log_File { - get { - return ResourceManager.GetString("ChatBot.Alerts.Log_File", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Log alerts info a file.. - /// - internal static string ChatBot_Alerts_Log_To_File { - get { - return ResourceManager.GetString("ChatBot.Alerts.Log_To_File", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to List of words/strings to alert you on.. - /// - internal static string ChatBot_Alerts_Matches { - get { - return ResourceManager.GetString("ChatBot.Alerts.Matches", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Trigger alerts when it rains and when it stops.. - /// - internal static string ChatBot_Alerts_Trigger_By_Rain { - get { - return ResourceManager.GetString("ChatBot.Alerts.Trigger_By_Rain", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Triggers alerts at the beginning and end of thunderstorms.. - /// - internal static string ChatBot_Alerts_Trigger_By_Thunderstorm { - get { - return ResourceManager.GetString("ChatBot.Alerts.Trigger_By_Thunderstorm", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Triggers an alert after receiving a specified keyword.. - /// - internal static string ChatBot_Alerts_Trigger_By_Words { - get { - return ResourceManager.GetString("ChatBot.Alerts.Trigger_By_Words", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Send a command on a regular or random basis or make the bot walk around randomly to avoid automatic AFK disconnection - /// /!\ Make sure your server rules do not forbid anti-AFK mechanisms! - /// /!\ Make sure you keep the bot in an enclosure to prevent it wandering off if you're using terrain handling! (Recommended size 5x5x5). - /// - internal static string ChatBot_AntiAfk { - get { - return ResourceManager.GetString("ChatBot.AntiAfk", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Command to send to the server.. - /// - internal static string ChatBot_AntiAfk_Command { - get { - return ResourceManager.GetString("ChatBot.AntiAfk.Command", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The time interval for execution. (in seconds). - /// - internal static string ChatBot_AntiAfk_Delay { - get { - return ResourceManager.GetString("ChatBot.AntiAfk.Delay", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Whether to sneak when sending the command.. - /// - internal static string ChatBot_AntiAfk_Use_Sneak { - get { - return ResourceManager.GetString("ChatBot.AntiAfk.Use_Sneak", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use terrain handling to enable the bot to move around.. - /// - internal static string ChatBot_AntiAfk_Use_Terrain_Handling { - get { - return ResourceManager.GetString("ChatBot.AntiAfk.Use_Terrain_Handling", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The range the bot can move around randomly (Note: the bigger the range, the slower the bot will be). - /// - internal static string ChatBot_AntiAfk_Walk_Range { - get { - return ResourceManager.GetString("ChatBot.AntiAfk.Walk_Range", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to How many times can the bot fail trying to move before using the command method.. - /// - internal static string ChatBot_AntiAfk_Walk_Retries { - get { - return ResourceManager.GetString("ChatBot.AntiAfk.Walk_Retries", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Automatically attack hostile mobs around you - ///You need to enable Entity Handling to use this bot - /// /!\ Make sure server rules allow your planned use of AutoAttack - /// /!\ SERVER PLUGINS may consider AutoAttack to be a CHEAT MOD and TAKE ACTION AGAINST YOUR ACCOUNT so DOUBLE CHECK WITH SERVER RULES!. - /// - internal static string ChatBot_AutoAttack { - get { - return ResourceManager.GetString("ChatBot.AutoAttack", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Allow attacking hostile mobs.. - /// - internal static string ChatBot_AutoAttack_Attack_Hostile { - get { - return ResourceManager.GetString("ChatBot.AutoAttack.Attack_Hostile", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Allow attacking passive mobs.. - /// - internal static string ChatBot_AutoAttack_Attack_Passive { - get { - return ResourceManager.GetString("ChatBot.AutoAttack.Attack_Passive", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Capped between 1 to 4. - /// - internal static string ChatBot_AutoAttack_Attack_Range { - get { - return ResourceManager.GetString("ChatBot.AutoAttack.Attack_Range", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to How long to wait between each attack. Set "Custom = false" to let MCC calculate it.. - /// - internal static string ChatBot_AutoAttack_Cooldown_Time { - get { - return ResourceManager.GetString("ChatBot.AutoAttack.Cooldown_Time", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to All entity types can be found here: https://mccteam.github.io/r/entity/#L15. - /// - internal static string ChatBot_AutoAttack_Entites_List { - get { - return ResourceManager.GetString("ChatBot.AutoAttack.Entites_List", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Possible values: "Interact", "Attack" (default), "InteractAt" (Interact and Attack).. - /// - internal static string ChatBot_AutoAttack_Interaction { - get { - return ResourceManager.GetString("ChatBot.AutoAttack.Interaction", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Wether to treat the entities list as a "whitelist" or as a "blacklist".. - /// - internal static string ChatBot_AutoAttack_List_Mode { - get { - return ResourceManager.GetString("ChatBot.AutoAttack.List_Mode", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to "single" or "multi". single target one mob per attack. multi target all mobs in range per attack. - /// - internal static string ChatBot_AutoAttack_Mode { - get { - return ResourceManager.GetString("ChatBot.AutoAttack.Mode", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to "health" or "distance". Only needed when using single mode. - /// - internal static string ChatBot_AutoAttack_Priority { - get { - return ResourceManager.GetString("ChatBot.AutoAttack.Priority", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Automatically craft items in your inventory - ///See https://mccteam.github.io/g/bots/#auto-craft for how to use - ///You need to enable Inventory Handling to use this bot - ///You should also enable Terrain and Movements if you need to use a crafting table. - /// - internal static string ChatBot_AutoCraft { - get { - return ResourceManager.GetString("ChatBot.AutoCraft", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Location of the crafting table if you intended to use it. Terrain and movements must be enabled.. - /// - internal static string ChatBot_AutoCraft_CraftingTable { - get { - return ResourceManager.GetString("ChatBot.AutoCraft.CraftingTable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to What to do on crafting failure, "abort" or "wait".. - /// - internal static string ChatBot_AutoCraft_OnFailure { - get { - return ResourceManager.GetString("ChatBot.AutoCraft.OnFailure", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Recipes.Name: The name can be whatever you like and it is used to represent the recipe. - ///Recipes.Type: crafting table type: "player" or "table" - ///Recipes.Result: the resulting item - ///Recipes.Slots: All slots, counting from left to right, top to bottom. Please fill in "Null" for empty slots. - ///For the naming of the items, please see: https://mccteam.github.io/r/item/#L12. - /// - internal static string ChatBot_AutoCraft_Recipes { - get { - return ResourceManager.GetString("ChatBot.AutoCraft.Recipes", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Auto-digging blocks. - ///You need to enable Terrain Handling to use this bot - ///You can use "/digbot start" and "/digbot stop" to control the start and stop of AutoDig. - ///Since MCC does not yet support accurate calculation of the collision volume of blocks, all blocks are considered as complete cubes when obtaining the position of the lookahead. - ///For the naming of the block, please see https://mccteam.github.io/r/block/#L15. - /// - internal static string ChatBot_AutoDig { - get { - return ResourceManager.GetString("ChatBot.AutoDig", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to How many seconds to wait after entering the game to start digging automatically, set to -1 to disable automatic start.. - /// - internal static string ChatBot_AutoDig_Auto_Start_Delay { - get { - return ResourceManager.GetString("ChatBot.AutoDig.Auto_Start_Delay", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Automatically switch to the appropriate tool.. - /// - internal static string ChatBot_AutoDig_Auto_Tool_Switch { - get { - return ResourceManager.GetString("ChatBot.AutoDig.Auto_Tool_Switch", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Apply Efficiency enchantment speed when AutoDig computes mining time. Disable this for strict anti-cheat compatibility.. - /// - internal static string ChatBot_AutoDig_Apply_Efficiency_Enchantments { - get { - return ResourceManager.GetString("ChatBot.AutoDig.Apply_Efficiency_Enchantments", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Apply Haste and Conduit Power speed effects when AutoDig computes mining time. Disable this for strict anti-cheat compatibility.. - /// - internal static string ChatBot_AutoDig_Apply_Haste_Effects { - get { - return ResourceManager.GetString("ChatBot.AutoDig.Apply_Haste_Effects", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Mining a block for more than "Dig_Timeout" seconds will be considered a timeout.. - /// - internal static string ChatBot_AutoDig_Dig_Timeout { - get { - return ResourceManager.GetString("ChatBot.AutoDig.Dig_Timeout", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Whether to drop the current tool when its durability is too low.. - /// - internal static string ChatBot_AutoDig_Drop_Low_Durability_Tools { - get { - return ResourceManager.GetString("ChatBot.AutoDig.Drop_Low_Durability_Tools", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Will not use tools with less durability than this. Set to zero to disable this feature.. - /// - internal static string ChatBot_AutoDig_Durability_Limit { - get { - return ResourceManager.GetString("ChatBot.AutoDig.Durability_Limit", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Wether to treat the blocks list as a "whitelist" or as a "blacklist".. - /// - internal static string ChatBot_AutoDig_List_Type { - get { - return ResourceManager.GetString("ChatBot.AutoDig.List_Type", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to "distance" or "index", When using the "fixedpos" mode, the blocks are determined by distance to the player, or by the order in the list.. - /// - internal static string ChatBot_AutoDig_Location_Order { - get { - return ResourceManager.GetString("ChatBot.AutoDig.Location_Order", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The position of the blocks when using "fixedpos" or "both" mode.. - /// - internal static string ChatBot_AutoDig_Locations { - get { - return ResourceManager.GetString("ChatBot.AutoDig.Locations", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Whether to output logs when digging blocks.. - /// - internal static string ChatBot_AutoDig_Log_Block_Dig { - get { - return ResourceManager.GetString("ChatBot.AutoDig.Log_Block_Dig", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to "lookat", "fixedpos" or "both". Digging the block being looked at, the block in a fixed position, or the block that needs to be all met.. - /// - internal static string ChatBot_AutoDig_Mode { - get { - return ResourceManager.GetString("ChatBot.AutoDig.Mode", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Automatically drop items in inventory - ///You need to enable Inventory Handling to use this bot - ///See this file for an up-to-date list of item types you can use with this bot: https://mccteam.github.io/r/item/#L12. - /// - internal static string ChatBot_AutoDrop { - get { - return ResourceManager.GetString("ChatBot.AutoDrop", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to "include", "exclude" or "everything". Include: drop item IN the list. Exclude: drop item NOT IN the list. - /// - internal static string ChatBot_AutoDrop_Mode { - get { - return ResourceManager.GetString("ChatBot.AutoDrop.Mode", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Automatically eat food when your Hunger value is low - ///You need to enable Inventory Handling to use this bot. - /// - internal static string ChatBot_AutoEat { - get { - return ResourceManager.GetString("ChatBot.AutoEat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Automatically catch fish using a fishing rod - ///Guide: https://mccteam.github.io/g/bots/#auto-fishing - ///You can use "/fish" to control the bot manually. - /// /!\ Make sure server rules allow automated farming before using this bot. - /// - internal static string ChatBot_AutoFishing { - get { - return ResourceManager.GetString("ChatBot.AutoFishing", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Keep it as false if you have not changed it before.. - /// - internal static string ChatBot_AutoFishing_Antidespawn { - get { - return ResourceManager.GetString("ChatBot.AutoFishing.Antidespawn", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Switch to a new rod from inventory after the current rod is unavailable.. - /// - internal static string ChatBot_AutoFishing_Auto_Rod_Switch { - get { - return ResourceManager.GetString("ChatBot.AutoFishing.Auto_Rod_Switch", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Whether to start fishing automatically after entering a world.. - /// - internal static string ChatBot_AutoFishing_Auto_Start { - get { - return ResourceManager.GetString("ChatBot.AutoFishing.Auto_Start", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to How soon to re-cast after successful fishing.. - /// - internal static string ChatBot_AutoFishing_Cast_Delay { - get { - return ResourceManager.GetString("ChatBot.AutoFishing.Cast_Delay", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Will not use rods with less durability than this (full durability is 64). Set to zero to disable this feature.. - /// - internal static string ChatBot_AutoFishing_Durability_Limit { - get { - return ResourceManager.GetString("ChatBot.AutoFishing.Durability_Limit", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This allows the player to change position/facing after each fish caught.. - /// - internal static string ChatBot_AutoFishing_Enable_Move { - get { - return ResourceManager.GetString("ChatBot.AutoFishing.Enable_Move", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to How long after entering the game to start fishing (seconds).. - /// - internal static string ChatBot_AutoFishing_Fishing_Delay { - get { - return ResourceManager.GetString("ChatBot.AutoFishing.Fishing_Delay", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Fishing timeout (seconds). Timeout will trigger a re-cast.. - /// - internal static string ChatBot_AutoFishing_Fishing_Timeout { - get { - return ResourceManager.GetString("ChatBot.AutoFishing.Fishing_Timeout", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to A "stationary" hook that moves above this threshold in the Y-axis will be considered to have caught a fish.. - /// - internal static string ChatBot_AutoFishing_Hook_Threshold { - get { - return ResourceManager.GetString("ChatBot.AutoFishing.Hook_Threshold", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Used to adjust the above two thresholds, which when enabled will print the change in the position of the fishhook entity upon receipt of its movement packet.. - /// - internal static string ChatBot_AutoFishing_Log_Fish_Bobber { - get { - return ResourceManager.GetString("ChatBot.AutoFishing.Log_Fish_Bobber", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use the mainhand or the offhand to hold the rod.. - /// - internal static string ChatBot_AutoFishing_Mainhand { - get { - return ResourceManager.GetString("ChatBot.AutoFishing.Mainhand", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to It will move in order "1->2->3->4->3->2->1->2->..." and can change position or facing or both each time. It is recommended to change the facing only.. - /// - internal static string ChatBot_AutoFishing_Movements { - get { - return ResourceManager.GetString("ChatBot.AutoFishing.Movements", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Hook movement in the X and Z axis less than this value will be considered stationary.. - /// - internal static string ChatBot_AutoFishing_Stationary_Threshold { - get { - return ResourceManager.GetString("ChatBot.AutoFishing.Stationary_Threshold", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Automatically relog when disconnected by server, for example because the server is restating - /// /!\ Use Ignore_Kick_Message=true at own risk! Server staff might not appreciate if you auto-relog on manual kicks. - /// - internal static string ChatBot_AutoRelog { - get { - return ResourceManager.GetString("ChatBot.AutoRelog", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The delay time before joining the server. (in seconds). - /// - internal static string ChatBot_AutoRelog_Delay { - get { - return ResourceManager.GetString("ChatBot.AutoRelog.Delay", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Reconnect after any server kick or login rejection. Network interruptions always trigger Auto Relog.. - /// - internal static string ChatBot_AutoRelog_Ignore_Kick_Message { - get { - return ResourceManager.GetString("ChatBot.AutoRelog.Ignore_Kick_Message", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Case-insensitive text fragments that trigger Auto Relog for server kicks and login rejections.. - /// - internal static string ChatBot_AutoRelog_Kick_Messages { - get { - return ResourceManager.GetString("ChatBot.AutoRelog.Kick_Messages", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Exact retry limit. Use 0 to disable retries or -1 for unlimited retries. The count resets after 60 seconds online.. - /// - internal static string ChatBot_AutoRelog_Retries { - get { - return ResourceManager.GetString("ChatBot.AutoRelog.Retries", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Run commands or send messages automatically when a specified pattern is detected in chat - ///Server admins can spoof chat messages (/nick, /tellraw) so keep this in mind when implementing AutoRespond rules - /// /!\ This bot may get spammy depending on your rules, although the global messagecooldown setting can help you avoiding accidental spam. - /// - internal static string ChatBot_AutoRespond { - get { - return ResourceManager.GetString("ChatBot.AutoRespond", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Do not remove colors from text (Note: Your matches will have to include color codes (ones using the § character) in order to work). - /// - internal static string ChatBot_AutoRespond_Match_Colors { - get { - return ResourceManager.GetString("ChatBot.AutoRespond.Match_Colors", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Logs chat messages in a file on disk.. - /// - internal static string ChatBot_ChatLog { - get { - return ResourceManager.GetString("ChatBot.ChatLog", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This bot allows you to send and recieve messages and commands via a Discord channel. - ///For Setup you can either use the documentation or read here (Documentation has images). - ///Documentation: https://mccteam.github.io/g/bots/#discord-bridge - ///Setup: - ///First you need to create a Bot on the Discord Developers Portal, here is a video tutorial: https://www.youtube.com/watch?v=2FgMnZViNPA . - /// /!\ IMPORTANT /!\: When creating a bot, you MUST ENABLE "Message Content Intent", "Server Members Intent" and "Presence Intent [rest of string was truncated]";. - /// - internal static string ChatBot_DiscordBridge { - get { - return ResourceManager.GetString("ChatBot.DiscordBridge", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The ID of a channel where you want to interact with the MCC using the bot.. - /// - internal static string ChatBot_DiscordBridge_ChannelId { - get { - return ResourceManager.GetString("ChatBot.DiscordBridge.ChannelId", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Message formats - ///Words wrapped with { and } are going to be replaced during the code execution, do not change them! - ///For example. {message} is going to be replace with an actual message, {username} will be replaced with an username, {timestamp} with the current time. - ///For Discord message formatting, check the following: https://mccteam.github.io/r/dc-fmt.html. - /// - internal static string ChatBot_DiscordBridge_Formats { - get { - return ResourceManager.GetString("ChatBot.DiscordBridge.Formats", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The ID of a server/guild where you have invited the bot to.. - /// - internal static string ChatBot_DiscordBridge_GuildId { - get { - return ResourceManager.GetString("ChatBot.DiscordBridge.GuildId", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to How long to wait (in seconds) if a message can not be sent to discord before canceling the task (minimum 1 second).. - /// - internal static string ChatBot_DiscordBridge_MessageSendTimeout { - get { - return ResourceManager.GetString("ChatBot.DiscordBridge.MessageSendTimeout", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to A list of IDs of people you want to be able to interact with the MCC using the bot.. - /// - internal static string ChatBot_DiscordBridge_OwnersIds { - get { - return ResourceManager.GetString("ChatBot.DiscordBridge.OwnersIds", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Your Discord Bot token.. - /// - internal static string ChatBot_DiscordBridge_Token { - get { - return ResourceManager.GetString("ChatBot.DiscordBridge.Token", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to When enabled, messages from other Discord bots in the channel will be relayed to Minecraft chat.. - /// - internal static string ChatBot_DiscordBridge_AllowOtherBotMessages { - get { - return ResourceManager.GetString("ChatBot.DiscordBridge.AllowOtherBotMessages", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Automatically farms cropsfor you (plants, breaks and bonemeals them). - ///Crop types available: Beetroot, Carrot, Melon, Netherwart, Pumpkin, Potato, Wheat. - ///Usage: "/farmer start" command and "/farmer stop" command. - ///NOTE: This a newly added bot, it is not perfect and was only tested in 1.19.2, there are some minor issues like not being able to bonemeal carrots/potatoes sometimes. - ///or bot jumps onto the farm land and breaks it (this happens rarely but still happens). We are looking forward at improving this. [rest of string was truncated]";. - /// - internal static string ChatBot_Farmer { - get { - return ResourceManager.GetString("ChatBot.Farmer", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Delay between tasks in seconds (Minimum 1 second). - /// - internal static string ChatBot_Farmer_Delay_Between_Tasks { - get { - return ResourceManager.GetString("ChatBot.Farmer.Delay_Between_Tasks", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Enabled you to make the bot follow you - ///NOTE: This is an experimental feature, the bot can be slow at times, you need to walk with a normal speed and to sometimes stop for it to be able to keep up with you - ///It's similar to making animals follow you when you're holding food in your hand. - ///This is due to a slow pathfinding algorithm, we're working on getting a better one - ///You can tweak the update limit and find what works best for you. (NOTE: Do not but a very low one, because you might achieve the opposite, - /// [rest of string was truncated]";. - /// - internal static string ChatBot_FollowPlayer { - get { - return ResourceManager.GetString("ChatBot.FollowPlayer", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Do not follow the player if he is in the range of 3 blocks (prevents the bot from pushing a player in an infinite loop). - /// - internal static string ChatBot_FollowPlayer_Stop_At_Distance { - get { - return ResourceManager.GetString("ChatBot.FollowPlayer.Stop_At_Distance", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The rate at which the bot does calculations (in seconds) (You can tweak this if you feel the bot is too slow). - /// - internal static string ChatBot_FollowPlayer_Update_Limit { - get { - return ResourceManager.GetString("ChatBot.FollowPlayer.Update_Limit", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to A small game to demonstrate chat interactions. Players can guess mystery words one letter at a time. - ///You need to have ChatFormat working correctly and add yourself in botowners to start the game with /tell <bot username> start - /// /!\ This bot may get a bit spammy if many players are interacting with it. - /// - internal static string ChatBot_HangmanGame { - get { - return ResourceManager.GetString("ChatBot.HangmanGame", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to A Chat Bot that collects items on the ground. - /// - internal static string ChatBot_ItemsCollector { - get { - return ResourceManager.GetString("ChatBot.ItemsCollector", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to If set to true, the bot will return to it's starting position after there are no items to collect. - /// - internal static string ChatBot_ItemsCollector_Always_Return_To_Start { - get { - return ResourceManager.GetString("ChatBot.ItemsCollector.Always_Return_To_Start", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to If set to true, the bot will collect all items, regardless of their type. If you want to use the whitelisted item types, disable this by setting it to false. - /// - internal static string ChatBot_ItemsCollector_Collect_All_Item_Types { - get { - return ResourceManager.GetString("ChatBot.ItemsCollector.Collect_All_Item_Types", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The radius in which bot will look for items to collect (Default: 30). - /// - internal static string ChatBot_ItemsCollector_Collection_Radius { - get { - return ResourceManager.GetString("ChatBot.ItemsCollector.Collection_Radius", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Delay in milliseconds between bot scanning items (Recommended: 300-500). - /// - internal static string ChatBot_ItemsCollector_Delay_Between_Tasks { - get { - return ResourceManager.GetString("ChatBot.ItemsCollector.Delay_Between_Tasks", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to In this list you can specify which items the bot will collect. To enable this, set the Collect_All_Item_Types to false. (NOTE: This does not prevent the bot from accidentally picking up other items, it only goes to positions where it finds the whitelisted items)\nYou can see the list of item types here: https://raw.githubusercontent.com/MCCTeam/Minecraft-Console-Client/master/MinecraftClient/Inventory/ItemType.cs. - /// - internal static string ChatBot_ItemsCollector_Items_Whitelist { - get { - return ResourceManager.GetString("ChatBot.ItemsCollector.Items_Whitelist", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to If set to true, the bot will go after clustered items instead for the closest ones. - /// - internal static string ChatBot_ItemsCollector_Prioritize_Clusters { - get { - return ResourceManager.GetString("ChatBot.ItemsCollector.Prioritize_Clusters", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Show a Discord Rich Presence status with your current Minecraft session info. - ///Setup: - ///1. Go to https://discord.com/developers/applications and log in with your Discord account. [rest of string was truncated]";. - /// - internal static string ChatBot_DiscordRpc { - get { - return ResourceManager.GetString("ChatBot.DiscordRpc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Your Discord Application ID.. - /// - internal static string ChatBot_DiscordRpc_ApplicationId { - get { - return ResourceManager.GetString("ChatBot.DiscordRpc.ApplicationId", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The top line of the Rich Presence display. Supports placeholders.. - /// - internal static string ChatBot_DiscordRpc_PresenceDetails { - get { - return ResourceManager.GetString("ChatBot.DiscordRpc.PresenceDetails", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The second line of the Rich Presence display. Supports placeholders.. - /// - internal static string ChatBot_DiscordRpc_PresenceState { - get { - return ResourceManager.GetString("ChatBot.DiscordRpc.PresenceState", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The key of the large image asset uploaded to your Discord application.. - /// - internal static string ChatBot_DiscordRpc_LargeImageKey { - get { - return ResourceManager.GetString("ChatBot.DiscordRpc.LargeImageKey", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Tooltip text for the large image. Supports placeholders.. - /// - internal static string ChatBot_DiscordRpc_LargeImageText { - get { - return ResourceManager.GetString("ChatBot.DiscordRpc.LargeImageText", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The key of the small image asset uploaded to your Discord application (leave empty to hide).. - /// - internal static string ChatBot_DiscordRpc_SmallImageKey { - get { - return ResourceManager.GetString("ChatBot.DiscordRpc.SmallImageKey", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Tooltip text for the small image. Supports placeholders.. - /// - internal static string ChatBot_DiscordRpc_SmallImageText { - get { - return ResourceManager.GetString("ChatBot.DiscordRpc.SmallImageText", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Show the server address (host and port) in the Discord presence.. - /// - internal static string ChatBot_DiscordRpc_ShowServerAddress { - get { - return ResourceManager.GetString("ChatBot.DiscordRpc.ShowServerAddress", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Show the player coordinates in the Discord presence.. - /// - internal static string ChatBot_DiscordRpc_ShowCoordinates { - get { - return ResourceManager.GetString("ChatBot.DiscordRpc.ShowCoordinates", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Show health and food level in the Discord presence.. - /// - internal static string ChatBot_DiscordRpc_ShowHealth { - get { - return ResourceManager.GetString("ChatBot.DiscordRpc.ShowHealth", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Show the current dimension in the Discord presence.. - /// - internal static string ChatBot_DiscordRpc_ShowDimension { - get { - return ResourceManager.GetString("ChatBot.DiscordRpc.ShowDimension", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Show the current gamemode in the Discord presence.. - /// - internal static string ChatBot_DiscordRpc_ShowGamemode { - get { - return ResourceManager.GetString("ChatBot.DiscordRpc.ShowGamemode", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Show elapsed session time in the Discord presence.. - /// - internal static string ChatBot_DiscordRpc_ShowElapsedTime { - get { - return ResourceManager.GetString("ChatBot.DiscordRpc.ShowElapsedTime", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Show the online player count as a party size in the Discord presence.. - /// - internal static string ChatBot_DiscordRpc_ShowPlayerCount { - get { - return ResourceManager.GetString("ChatBot.DiscordRpc.ShowPlayerCount", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to How often (in seconds) to refresh the Discord presence. Minimum: 1. - /// - internal static string ChatBot_DiscordRpc_UpdateIntervalSeconds { - get { - return ResourceManager.GetString("ChatBot.DiscordRpc.UpdateIntervalSeconds", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Relay messages between players and servers, like a mail plugin - ///This bot can store messages when the recipients are offline, and send them when they join the server - /// /!\ Server admins can spoof PMs (/tellraw, /nick) so enable this bot only if you trust server admins. - /// - internal static string ChatBot_Mailer { - get { - return ResourceManager.GetString("ChatBot.Mailer", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Allows you to render maps in the console and into images (which can be then sent to Discord using Discord Bridge Chat Bot) - ///This is useful for solving captchas which use maps - ///The maps are rendered into Rendered_Maps folder if the Save_To_File is enabled. - ///NOTE: - ///If some servers have a very short time for solving captchas, enabe Auto_Render_On_Update to see them immediatelly in the console. - /// /!\ Make sure server rules allow bots to be used on the server, or you risk being punished.. - /// - internal static string ChatBot_Map { - get { - return ResourceManager.GetString("ChatBot.Map", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Automatically render the map once it is received or updated from/by the server. - /// - internal static string ChatBot_Map_Auto_Render_On_Update { - get { - return ResourceManager.GetString("ChatBot.Map.Auto_Render_On_Update", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Delete all rendered maps on unload/reload or when you launch the MCC again.. - /// - internal static string ChatBot_Map_Delete_All_On_Unload { - get { - return ResourceManager.GetString("ChatBot.Map.Delete_All_On_Unload", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Get a notification when you have gotten a map from the server for the first time. - /// - internal static string ChatBot_Map_Notify_On_First_Update { - get { - return ResourceManager.GetString("ChatBot.Map.Notify_On_First_Update", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Resize an rendered image, this is useful when images that are rendered are small and when are being sent to Discord.. - /// - internal static string ChatBot_Map_Rasize_Rendered_Image { - get { - return ResourceManager.GetString("ChatBot.Map.Rasize_Rendered_Image", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Whether to render the map in the console.. - /// - internal static string ChatBot_Map_Render_In_Console { - get { - return ResourceManager.GetString("ChatBot.Map.Render_In_Console", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The size that a rendered image should be resized to, in pixels (eg. 512).. - /// - internal static string ChatBot_Map_Resize_To { - get { - return ResourceManager.GetString("ChatBot.Map.Resize_To", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Whether to store the rendered map as a file (You need this setting if you want to get a map on Discord using Discord Bridge).. - /// - internal static string ChatBot_Map_Save_To_File { - get { - return ResourceManager.GetString("ChatBot.Map.Save_To_File", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Send a rendered map (saved to a file) to a Discord or a Telegram channel via the Discord or Telegram Bride chat bot (The Discord/Telegram Bridge chat bot must be enabled and configured!) - ///You need to enable Save_To_File in order for this to work. - ///We also recommend turning on resizing.. - /// - internal static string ChatBot_Map_Send_Rendered_To_Bridges { - get { - return ResourceManager.GetString("ChatBot.Map.Send_Rendered_To_Bridges", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Log the list of players periodically into a textual file.. - /// - internal static string ChatBot_PlayerListLogger { - get { - return ResourceManager.GetString("ChatBot.PlayerListLogger", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to (In seconds). - /// - internal static string ChatBot_PlayerListLogger_Delay { - get { - return ResourceManager.GetString("ChatBot.PlayerListLogger.Delay", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Send MCC console commands to your bot through server PMs (/tell) - ///You need to have ChatFormat working correctly and add yourself in botowners to use the bot - /// /!\ Server admins can spoof PMs (/tellraw, /nick) so enable RemoteControl only if you trust server admins. - /// - internal static string ChatBot_RemoteControl { - get { - return ResourceManager.GetString("ChatBot.RemoteControl", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Enable recording of the game (/replay start) and replay it later using the Replay Mod (https://www.replaymod.com/) - ///Please note that due to technical limitations, the client player (you) will not be shown in the replay file - /// /!\ You SHOULD use /replay stop or exit the program gracefully with /quit OR THE REPLAY FILE MAY GET CORRUPT!. - /// - internal static string ChatBot_ReplayCapture { - get { - return ResourceManager.GetString("ChatBot.ReplayCapture", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to How long should replay file be auto-saved, in seconds. Use -1 to disable.. - /// - internal static string ChatBot_ReplayCapture_Backup_Interval { - get { - return ResourceManager.GetString("ChatBot.ReplayCapture.Backup_Interval", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Schedule commands and scripts to launch on various events such as server join, date/time or time interval - ///See https://mccteam.github.io/g/bots/#script-scheduler for more info. - /// - internal static string ChatBot_ScriptScheduler { - get { - return ResourceManager.GetString("ChatBot.ScriptScheduler", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This bot allows you to send and receive messages and commands via a Telegram Bot DM or to receive messages in a Telegram channel. - /// /!\ NOTE: You can't send messages and commands from a group channel, you can only send them in the bot DM, but you can get the messages from the client in a group channel. - ///----------------------------------------------------------- - ///Setup: - ///First you need to create a Telegram bot and obtain an API key, to do so, go to Telegram and find @botfather - ///Click on "Start" button and re [rest of string was truncated]";. - /// - internal static string ChatBot_TelegramBridge { - get { - return ResourceManager.GetString("ChatBot.TelegramBridge", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to A list of Chat IDs that are allowed to send messages and execute commands. To get an id of your chat DM with the bot use ".chatid" bot command in Telegram.. - /// - internal static string ChatBot_TelegramBridge_Authorized_Chat_Ids { - get { - return ResourceManager.GetString("ChatBot.TelegramBridge.Authorized_Chat_Ids", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to An ID of a channel where you want to interact with the MCC using the bot.. - /// - internal static string ChatBot_TelegramBridge_ChannelId { - get { - return ResourceManager.GetString("ChatBot.TelegramBridge.ChannelId", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Message formats - ///Words wrapped with { and } are going to be replaced during the code execution, do not change them! - ///For example. {message} is going to be replace with an actual message, {username} will be replaced with an username, {timestamp} with the current time. - ///For Telegram message formatting, check the following: https://mccteam.github.io/r/tg-fmt.html. - /// - internal static string ChatBot_TelegramBridge_Formats { - get { - return ResourceManager.GetString("ChatBot.TelegramBridge.Formats", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to How long to wait (in seconds) if a message can not be sent to Telegram before canceling the task (minimum 1 second).. - /// - internal static string ChatBot_TelegramBridge_MessageSendTimeout { - get { - return ResourceManager.GetString("ChatBot.TelegramBridge.MessageSendTimeout", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Your Telegram Bot token.. - /// - internal static string ChatBot_TelegramBridge_Token { - get { - return ResourceManager.GetString("ChatBot.TelegramBridge.Token", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Remotely control the client using Web Sockets.\n# This is useful if you want to implement an application that can remotely and asynchronously execute procedures in MCC.\n# Example implementation written in JavaScript: https://github.com/milutinke/MCC.js.git\n# The protocol specification will be available in the documentation soon.. - /// - internal static string ChatBot_WebSocketBot { - get { - return ResourceManager.GetString("ChatBot.WebSocketBot", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Allow IP aliases, such as "localhost" or if using containers then the container name can be used.... - /// - internal static string ChatBot_WebSocketBot_AllowIpAlias { - get { - return ResourceManager.GetString("ChatBot.WebSocketBot.AllowIpAlias", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This setting is for developers who are developing a library that uses this chat bot to remotely execute procedures/commands/functions.. - /// - internal static string ChatBot_WebSocketBot_DebugMode { - get { - return ResourceManager.GetString("ChatBot.WebSocketBot.DebugMode", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The IP address that Websocket server will be bound to.. - /// - internal static string ChatBot_WebSocketBot_Ip { - get { - return ResourceManager.GetString("ChatBot.WebSocketBot.Ip", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to A password that will be used to authenticate on thw Websocket server (It is recommended to change the default password and to set a strong one).. - /// - internal static string ChatBot_WebSocketBot_Password { - get { - return ResourceManager.GetString("ChatBot.WebSocketBot.Password", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The Port that Websocket server will be bounded to.. - /// - internal static string ChatBot_WebSocketBot_Port { - get { - return ResourceManager.GetString("ChatBot.WebSocketBot.Port", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to MCC does it best to detect chat messages, but some server have unusual chat formats - ///When this happens, you'll need to configure chat format below, see https://mccteam.github.io/g/conf/#chat-format-section. - /// - internal static string ChatFormat { - get { - return ResourceManager.GetString("ChatFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to MCC support for common message formats. Set "false" to avoid conflicts with custom formats.. - /// - internal static string ChatFormat_Builtins { - get { - return ResourceManager.GetString("ChatFormat.Builtins", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Whether to use the custom regular expressions below for detection.. - /// - internal static string ChatFormat_UserDefined { - get { - return ResourceManager.GetString("ChatFormat.UserDefined", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Console-related settings.. - /// - internal static string Console { - get { - return ResourceManager.GetString("Console", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The settings for command completion suggestions. - ///Custom colors are only available when using "vt100_24bit" color mode.. - /// - internal static string Console_CommandSuggestion { - get { - return ResourceManager.GetString("Console.CommandSuggestion", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Whether to display command suggestions in the console.. - /// - internal static string Console_CommandSuggestion_Enable { - get { - return ResourceManager.GetString("Console.CommandSuggestion.Enable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Enable this option if the arrows in the command suggestions are not displayed properly in your terminal.. - /// - internal static string Console_CommandSuggestion_Use_Basic_Arrow { - get { - return ResourceManager.GetString("Console.CommandSuggestion.Use_Basic_Arrow", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Console mode: "classic" for the standard terminal, "tui" for a pseudo-graphical full-screen interface.. - /// - internal static string Console_General_ConsoleMode { - get { - return ResourceManager.GetString("Console.General.ConsoleMode", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use "disable", "legacy_4bit", "vt100_4bit", "vt100_8bit" or "vt100_24bit". If a garbled code like "←[0m" appears on the terminal, you can try switching to "legacy_4bit" mode, or just disable it.. - /// - internal static string Console_General_ConsoleColorMode { - get { - return ResourceManager.GetString("Console.General.ConsoleColorMode", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Whether to display the MCC startup banner with version info and icon.. - /// - internal static string Console_General_Display_Icon_Banner { - get { - return ResourceManager.GetString("Console.General.Display_Icon_Banner", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You can use "Ctrl+P" to print out the current input and cursor position.. - /// - internal static string Console_General_Display_Input { - get { - return ResourceManager.GetString("Console.General.Display_Input", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Whether to display received chat messages in the console. This does not affect chat bots or chat log files.. - /// - internal static string Console_General_Display_Chat { - get { - return ResourceManager.GetString("Console.General.Display_Chat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Maximum number of input history records to keep.. - /// - internal static string Console_General_History_Input_Records { - get { - return ResourceManager.GetString("Console.General.History_Input_Records", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Maximum log lines kept in TUI mode scrollback. Set to 0 for automatic (3000 on x86/x64, 500 on ARM).. - /// - internal static string Console_General_TUI_Log_Scrollback { - get { - return ResourceManager.GetString("Console.General.TUI_Log_Scrollback", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Startup Config File - ///Please do not record extraneous data in this file as it will be overwritten by MCC. - /// - ///New to Minecraft Console Client? Check out this document: https://mccteam.github.io/g/conf.html - ///Want to upgrade to a newer version? See https://github.com/MCCTeam/Minecraft-Console-Client/#download. - /// - internal static string Head { - get { - return ResourceManager.GetString("Head", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This setting affects only the messages in the console.. - /// - internal static string Logging { - get { - return ResourceManager.GetString("Logging", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Regex for filtering chat message.. - /// - internal static string Logging_ChatFilter { - get { - return ResourceManager.GetString("Logging.ChatFilter", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Show server chat messages.. - /// - internal static string Logging_ChatMessages { - get { - return ResourceManager.GetString("Logging.ChatMessages", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Regex for filtering debug message.. - /// - internal static string Logging_DebugFilter { - get { - return ResourceManager.GetString("Logging.DebugFilter", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Please enable this before submitting bug reports. Thanks!. - /// - internal static string Logging_DebugMessages { - get { - return ResourceManager.GetString("Logging.DebugMessages", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Show low-level packet debug logs.. - /// - internal static string Logging_PacketDebugMessages { - get { - return ResourceManager.GetString("Logging.PacketDebugMessages", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Packet types to exclude from packet debug logs, e.g. ["KeepAlive", "Ping"].. - /// - internal static string Logging_PacketDebugExclusions { - get { - return ResourceManager.GetString("Logging.PacketDebugExclusions", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Show error messages.. - /// - internal static string Logging_ErrorMessages { - get { - return ResourceManager.GetString("Logging.ErrorMessages", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to "disable" or "blacklist" OR "whitelist". Blacklist hide message match regex. Whitelist show message match regex.. - /// - internal static string Logging_FilterMode { - get { - return ResourceManager.GetString("Logging.FilterMode", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Informative messages. (i.e Most of the message from MCC). - /// - internal static string Logging_InfoMessages { - get { - return ResourceManager.GetString("Logging.InfoMessages", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Log file name.. - /// - internal static string Logging_LogFile { - get { - return ResourceManager.GetString("Logging.LogFile", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Write log messages to file.. - /// - internal static string Logging_LogToFile { - get { - return ResourceManager.GetString("Logging.LogToFile", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Prepend timestamp to messages in log file.. - /// - internal static string Logging_PrependTimestamp { - get { - return ResourceManager.GetString("Logging.PrependTimestamp", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Keep color codes in the saved text.(look like "§b"). - /// - internal static string Logging_SaveColorCodes { - get { - return ResourceManager.GetString("Logging.SaveColorCodes", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Show warning messages.. - /// - internal static string Logging_WarningMessages { - get { - return ResourceManager.GetString("Logging.WarningMessages", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Make sure you understand what each setting does before changing anything!. - /// - internal static string Main_Advanced { - get { - return ResourceManager.GetString("Main.Advanced", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to AccountList: It allows a fast account switching without directly using the credentials - ///Usage examples: "/tell <mybot> reco Player2", "/connect <serverip> Player1". - /// - internal static string Main_Advanced_account_list { - get { - return ResourceManager.GetString("Main.Advanced.account_list", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Toggle auto respawn if client player was dead (make sure your spawn point is safe).. - /// - internal static string Main_Advanced_auto_respawn { - get { - return ResourceManager.GetString("Main.Advanced.auto_respawn", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Set the owner of the bot. /!\ Server admins can impersonate owners!. - /// - internal static string Main_Advanced_bot_owners { - get { - return ResourceManager.GetString("Main.Advanced.bot_owners", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use "mcc", "vanilla" or "none". This is how MCC identifies itself to the server.. - /// - internal static string Main_Advanced_brand_info { - get { - return ResourceManager.GetString("Main.Advanced.brand_info", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Leave empty for no logfile.. - /// - internal static string Main_Advanced_chatbot_log_file { - get { - return ResourceManager.GetString("Main.Advanced.chatbot_log_file", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to If turned off, the emoji will be replaced with a simpler character (for /chunk status).. - /// - internal static string Main_Advanced_enable_emoji { - get { - return ResourceManager.GetString("Main.Advanced.enable_emoji", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Set to false to opt-out of Sentry error logging.. - /// - internal static string Main_Advanced_enable_sentry { - get { - return ResourceManager.GetString("Main.Advanced.enable_sentry", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Toggle entity handling.. - /// - internal static string Main_Advanced_entity_handling { - get { - return ResourceManager.GetString("Main.Advanced.entity_handling", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Whether to exit directly when an error occurs, for using MCC in non-interactive scripts.. - /// - internal static string Main_Advanced_exit_on_failure { - get { - return ResourceManager.GetString("Main.Advanced.exit_on_failure", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Ignore invalid player name. - /// - internal static string Main_Advanced_ignore_invalid_playername { - get { - return ResourceManager.GetString("Main.Advanced.ignore_invalid_playername", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use "none", "slash"(/) or "backslash"(\).. - /// - internal static string Main_Advanced_internal_cmd_char { - get { - return ResourceManager.GetString("Main.Advanced.internal_cmd_char", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Toggle inventory handling.. - /// - internal static string Main_Advanced_inventory_handling { - get { - return ResourceManager.GetString("Main.Advanced.inventory_handling", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Fill in with in-game locale code, check https://mccteam.github.io/r/l-code.html. - /// - internal static string Main_Advanced_language { - get { - return ResourceManager.GetString("Main.Advanced.language", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Load translations applied to MCC when available, turn it off to use English only.. - /// - internal static string Main_Advanced_LoadMccTrans { - get { - return ResourceManager.GetString("Main.Advanced.LoadMccTrans", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use "auto", "no" or "force". Force-enabling only works for MC 1.13+.. - /// - internal static string Main_Advanced_mc_forge { - get { - return ResourceManager.GetString("Main.Advanced.mc_forge", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use "auto" or "1.X.X" values. Allows to skip server info retrieval.. - /// - internal static string Main_Advanced_mc_version { - get { - return ResourceManager.GetString("Main.Advanced.mc_version", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Controls the minimum interval (in seconds) between sending each message to the server.. - /// - internal static string Main_Advanced_message_cooldown { - get { - return ResourceManager.GetString("Main.Advanced.message_cooldown", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Override the maximum chat message length. Set to 0 to use the default (100 for 1.10 and below, 256 for 1.11+). WARNING: Setting this incorrectly may cause you to be kicked from the server.. - /// - internal static string Main_Advanced_max_chat_message_length { - get { - return ResourceManager.GetString("Main.Advanced.max_chat_message_length", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Enable support for joining Minecraft Realms worlds.. - /// - internal static string Main_Advanced_minecraft_realms { - get { - return ResourceManager.GetString("Main.Advanced.minecraft_realms", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The minimum height to use when calculating the image size from the height of the terminal.. - /// - internal static string Main_Advanced_MinTerminalHeight { - get { - return ResourceManager.GetString("Main.Advanced.MinTerminalHeight", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The minimum width used when calculating the image size from the width of the terminal.. - /// - internal static string Main_Advanced_MinTerminalWidth { - get { - return ResourceManager.GetString("Main.Advanced.MinTerminalWidth", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Enable head movement while walking to avoid anti-cheat triggers.. - /// - internal static string Main_Advanced_move_head_while_walking { - get { - return ResourceManager.GetString("Main.Advanced.move_head_while_walking", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to A movement speed higher than 2 may be considered cheating.. - /// - internal static string Main_Advanced_movement_speed { - get { - return ResourceManager.GetString("Main.Advanced.movement_speed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Only works on Windows XP-8 or Windows 10 with old console.. - /// - internal static string Main_Advanced_player_head_icon { - get { - return ResourceManager.GetString("Main.Advanced.player_head_icon", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to For remote control of the bot.. - /// - internal static string Main_Advanced_private_msgs_cmd_name { - get { - return ResourceManager.GetString("Main.Advanced.private_msgs_cmd_name", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to How to retain profile key. Use "none", "memory" or "disk".. - /// - internal static string Main_Advanced_profilekey_cache { - get { - return ResourceManager.GetString("Main.Advanced.profilekey_cache", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use "no", "fast" (5s timeout), or "yes". Required for joining some servers.. - /// - internal static string Main_Advanced_resolve_srv_records { - get { - return ResourceManager.GetString("Main.Advanced.resolve_srv_records", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cache compiled scripts for faster load on low-end devices.. - /// - internal static string Main_Advanced_script_cache { - get { - return ResourceManager.GetString("Main.Advanced.script_cache", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ServerList: It allows an easier and faster server switching with short aliases instead of full server IP - ///Aliases cannot contain dots or spaces, and the name "localhost" cannot be used as an alias. - ///Usage examples: "/tell <mybot> connect Server1", "/connect Server2". - /// - internal static string Main_Advanced_server_list { - get { - return ResourceManager.GetString("Main.Advanced.server_list", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to How to retain session tokens. Use "none", "memory" or "disk".. - /// - internal static string Main_Advanced_session_cache { - get { - return ResourceManager.GetString("Main.Advanced.session_cache", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Decode links embedded in chat messages and show them in console.. - /// - internal static string Main_Advanced_show_chat_links { - get { - return ResourceManager.GetString("Main.Advanced.show_chat_links", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Show inventory layout as ASCII art in inventory command.. - /// - internal static string Main_Advanced_show_inventory_layout { - get { - return ResourceManager.GetString("Main.Advanced.show_inventory_layout", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Show a GitHub star reminder on startup. Set to false to hide it.. - /// - internal static string Main_Advanced_show_github_star_reminder { - get { - return ResourceManager.GetString("Main.Advanced.show_github_star_reminder", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Show full effect names and levels in the TUI status bar instead of compact effect icons only.. - /// - internal static string Main_Advanced_show_effect_names_in_tui { - get { - return ResourceManager.GetString("Main.Advanced.show_effect_names_in_tui", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to System messages for server ops.. - /// - internal static string Main_Advanced_show_system_messages { - get { - return ResourceManager.GetString("Main.Advanced.show_system_messages", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Messages displayed above xp bar, set this to false in case of xp bar spam.. - /// - internal static string Main_Advanced_show_xpbar_messages { - get { - return ResourceManager.GetString("Main.Advanced.show_xpbar_messages", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Temporary fix for Badpacket issue on some servers. Need to enable "TerrainAndMovements" first.. - /// - internal static string Main_Advanced_temporary_fix_badpacket { - get { - return ResourceManager.GetString("Main.Advanced.temporary_fix_badpacket", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Uses more ram, cpu, bandwidth but allows you to move around.. - /// - internal static string Main_Advanced_terrain_and_movements { - get { - return ResourceManager.GetString("Main.Advanced.terrain_and_movements", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Customize the TCP connection timeout with the server. (in seconds). - /// - internal static string Main_Advanced_timeout { - get { - return ResourceManager.GetString("Main.Advanced.timeout", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Prepend timestamps to chat messages.. - /// - internal static string Main_Advanced_timestamps { - get { - return ResourceManager.GetString("Main.Advanced.timestamps", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Login=Email or Name. Use "-" as password for offline mode. Leave blank to prompt user on startup.. - /// - internal static string Main_General_account { - get { - return ResourceManager.GetString("Main.General.account", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Yggdrasil authlib server domain name and port.. - /// - internal static string Main_General_AuthlibServer { - get { - return ResourceManager.GetString("Main.General.AuthlibServer", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Authlib-injector URL to use for Yggdrasil accounts. It must use http or https and include any required path.. - /// - internal static string Main_General_AuthServerUrl { - get { - return ResourceManager.GetString("Main.General.AuthServerUrl", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Yggdrasil authlib multi-user selection.. - /// - internal static string Main_General_AuthlibUser { - get { - return ResourceManager.GetString("Main.General.AuthlibUser", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The address of the game server, "Host" can be filled in with domain name or IP address. (The "Port" field can be deleted, it will be resolved automatically). - /// - internal static string Main_General_login { - get { - return ResourceManager.GetString("Main.General.login", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Microsoft Account sign-in method: "mcc" (device code, supports 2FA) OR "browser" (manual browser login).. - /// - internal static string Main_General_method { - get { - return ResourceManager.GetString("Main.General.method", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Account type: "mojang" OR "microsoft" OR "yggdrasil". Also affects interactive login in console.. - /// - internal static string Main_General_server_info { - get { - return ResourceManager.GetString("Main.General.server_info", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Settings below are sent to the server and only affect server-side things like your skin.. - /// - internal static string MCSettings { - get { - return ResourceManager.GetString("MCSettings", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Allows disabling chat colors server-side.. - /// - internal static string MCSettings_ChatColors { - get { - return ResourceManager.GetString("MCSettings.ChatColors", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use "enabled", "commands", or "disabled". Allows to mute yourself.... - /// - internal static string MCSettings_ChatMode { - get { - return ResourceManager.GetString("MCSettings.ChatMode", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to MC 1.7- difficulty. "peaceful", "easy", "normal", "difficult".. - /// - internal static string MCSettings_Difficulty { - get { - return ResourceManager.GetString("MCSettings.Difficulty", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to If disabled, settings below are not sent to the server.. - /// - internal static string MCSettings_Enabled { - get { - return ResourceManager.GetString("MCSettings.Enabled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use any language implemented in Minecraft.. - /// - internal static string MCSettings_Locale { - get { - return ResourceManager.GetString("MCSettings.Locale", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to MC 1.9+ main hand. "left" or "right".. - /// - internal static string MCSettings_MainHand { - get { - return ResourceManager.GetString("MCSettings.MainHand", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value range: [0 - 255].. - /// - internal static string MCSettings_RenderDistance { - get { - return ResourceManager.GetString("MCSettings.RenderDistance", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Connect to a server via a proxy instead of connecting directly - ///If Mojang session services are blocked on your network, set Enabled_Login=true to login using proxy. - ///If the connection to the Minecraft game server is blocked by the firewall, set Enabled_Ingame=true to use a proxy to connect to the game server. - /// /!\ Make sure your server rules allow Proxies or VPNs before setting enabled=true, or you may face consequences!. - /// - internal static string Proxy { - get { - return ResourceManager.GetString("Proxy", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Whether to connect to the game server through a proxy.. - /// - internal static string Proxy_Enabled_Ingame { - get { - return ResourceManager.GetString("Proxy.Enabled_Ingame", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Whether to connect to the login server through a proxy.. - /// - internal static string Proxy_Enabled_Login { - get { - return ResourceManager.GetString("Proxy.Enabled_Login", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Whether to download MCC updates via proxy.. - /// - internal static string Proxy_Enabled_Update { - get { - return ResourceManager.GetString("Proxy.Enabled_Update", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Only required for password-protected proxies.. - /// - internal static string Proxy_Password { - get { - return ResourceManager.GetString("Proxy.Password", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Supported types: "HTTP", "SOCKS4", "SOCKS4a", "SOCKS5".. - /// - internal static string Proxy_Proxy_Type { - get { - return ResourceManager.GetString("Proxy.Proxy_Type", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Proxy server must allow HTTPS for login, and non-443 ports for playing.. - /// - internal static string Proxy_Server { - get { - return ResourceManager.GetString("Proxy.Server", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Only required for password-protected proxies.. - /// - internal static string Proxy_Username { - get { - return ResourceManager.GetString("Proxy.Username", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Chat signature related settings (affects minecraft 1.19+). - /// - internal static string Signature { - get { - return ResourceManager.GetString("Signature", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Microsoft accounts only. If disabled, will not be able to sign chat and join servers configured with "enforce-secure-profile=true". - /// - internal static string Signature_LoginWithSecureProfile { - get { - return ResourceManager.GetString("Signature.LoginWithSecureProfile", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use red    color block to mark chat without legitimate signature. - /// - internal static string Signature_MarkIllegallySignedMsg { - get { - return ResourceManager.GetString("Signature.MarkIllegallySignedMsg", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use green  color block to mark chat with legitimate signatures. - /// - internal static string Signature_MarkLegallySignedMsg { - get { - return ResourceManager.GetString("Signature.MarkLegallySignedMsg", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use yellow color block to mark chat that have been modified by the server.. - /// - internal static string Signature_MarkModifiedMsg { - get { - return ResourceManager.GetString("Signature.MarkModifiedMsg", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use gray   color block to mark system message (always without signature). - /// - internal static string Signature_MarkSystemMessage { - get { - return ResourceManager.GetString("Signature.MarkSystemMessage", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Whether to display chat and messages in commands without legal signatures. - /// - internal static string Signature_ShowIllegalSignedChat { - get { - return ResourceManager.GetString("Signature.ShowIllegalSignedChat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Set to true to display messages modified by the server, false to display the original signed messages. - /// - internal static string Signature_ShowModifiedChat { - get { - return ResourceManager.GetString("Signature.ShowModifiedChat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Whether to sign the chat send from MCC. - /// - internal static string Signature_SignChat { - get { - return ResourceManager.GetString("Signature.SignChat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Whether to sign the messages contained in the commands sent by MCC. For example, the message in "/msg" and "/me". - /// - internal static string Signature_SignMessageInCommand { - get { - return ResourceManager.GetString("Signature.SignMessageInCommand", resourceCulture); - } - } - } -} diff --git a/MinecraftClient/Resources/ConfigComments/ConfigComments.resx b/MinecraftClient/Resources/ConfigComments/ConfigComments.resx deleted file mode 100644 index f109fd03c9..0000000000 --- a/MinecraftClient/Resources/ConfigComments/ConfigComments.resx +++ /dev/null @@ -1,1091 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - can be used in some other fields as %yourvar% -%username%, %login%, %serverip%, %serverport%, %datetime% and %players% are reserved read-only variables. - - - =============================== # - Minecraft Console Client Bots # -=============================== # - - - Get alerted when specified words are detected in chat -Useful for moderating your server or detecting when someone is talking to you - - - Play a beep sound when a word is detected in addition to highlighting. - - - List of words/strings to NOT alert you on. - - - The name of a file where alers logs will be written. - - - Log alerts info a file. - - - List of words/strings to alert you on. - - - Trigger alerts when it rains and when it stops. - - - Triggers alerts at the beginning and end of thunderstorms. - - - Triggers an alert after receiving a specified keyword. - - - Send a command on a regular or random basis or make the bot walk around randomly to avoid automatic AFK disconnection -/!\ Make sure your server rules do not forbid anti-AFK mechanisms! -/!\ Make sure you keep the bot in an enclosure to prevent it wandering off if you're using terrain handling! (Recommended size 5x5x5) - - - Command to send to the server. - - - The time interval for execution. (in seconds) - - - Whether to sneak when sending the command. - - - Use terrain handling to enable the bot to move around. - - - The range the bot can move around randomly (Note: the bigger the range, the slower the bot will be) - - - How many times can the bot fail trying to move before using the command method. - - - Automatically attack hostile mobs around you -You need to enable Entity Handling to use this bot -/!\ Make sure server rules allow your planned use of AutoAttack -/!\ SERVER PLUGINS may consider AutoAttack to be a CHEAT MOD and TAKE ACTION AGAINST YOUR ACCOUNT so DOUBLE CHECK WITH SERVER RULES! - - - Allow attacking hostile mobs. - - - Allow attacking passive mobs. - - - Capped between 1 to 4 - - - Delay between attacks. Set "Custom = false" to let MCC calculate it. When Custom = true, set Min/Max for the cooldown range. If RandomMode = true, a random value between Min and Max is used for each attack. - - - All entity types can be found here: https://mccteam.github.io/r/entity/#L15 - - - Possible values: "Interact", "Attack" (default), "InteractAt" (Interact and Attack). - - - Wether to treat the entities list as a "whitelist" or as a "blacklist". - - - "single" or "multi". single target one mob per attack. multi target all mobs in range per attack - - - "health" or "distance". Only needed when using single mode - - - Automatically craft items in your inventory -See https://mccteam.github.io/g/bots/#auto-craft for how to use -You need to enable Inventory Handling to use this bot -You should also enable Terrain and Movements if you need to use a crafting table - - - Location of the crafting table if you intended to use it. Terrain and movements must be enabled. - - - What to do on crafting failure, "abort" or "wait". - - - Recipes.Name: The name can be whatever you like and it is used to represent the recipe. -Recipes.Type: crafting table type: "player" or "table" -Recipes.Result: the resulting item -Recipes.Slots: All slots, counting from left to right, top to bottom. Please fill in "Null" for empty slots. -For the naming of the items, please see: https://mccteam.github.io/r/item/#L12 - - - Auto-digging blocks. -You need to enable Terrain Handling to use this bot -You can use "/digbot start" and "/digbot stop" to control the start and stop of AutoDig. -Since MCC does not yet support accurate calculation of the collision volume of blocks, all blocks are considered as complete cubes when obtaining the position of the lookahead. -For the naming of the block, please see https://mccteam.github.io/r/block/#L15 - - - How many seconds to wait after entering the game to start digging automatically, set to -1 to disable automatic start. - - - Automatically switch to the appropriate tool. - - - Apply Efficiency enchantment speed when AutoDig computes mining time. Disable this for strict anti-cheat compatibility. - - - Apply Haste and Conduit Power speed effects when AutoDig computes mining time. Disable this for strict anti-cheat compatibility. - - - Mining a block for more than "Dig_Timeout" seconds will be considered a timeout. - - - Whether to drop the current tool when its durability is too low. - - - Will not use tools with less durability than this. Set to zero to disable this feature. - - - Wether to treat the blocks list as a "whitelist" or as a "blacklist". - - - The position of the blocks when using "fixedpos" or "both" mode. - - - "distance" or "index", When using the "fixedpos" mode, the blocks are determined by distance to the player, or by the order in the list. - - - Whether to output logs when digging blocks. - - - "lookat", "fixedpos" or "both". Digging the block being looked at, the block in a fixed position, or the block that needs to be all met. - - - Automatically drop items in inventory -You need to enable Inventory Handling to use this bot -See this file for an up-to-date list of item types you can use with this bot: https://mccteam.github.io/r/item/#L12 - - - "include", "exclude" or "everything". Include: drop item IN the list. Exclude: drop item NOT IN the list - - - Automatically eat food when your Hunger value is low -You need to enable Inventory Handling to use this bot - - - Automatically catch fish using a fishing rod -Guide: https://mccteam.github.io/g/bots/#auto-fishing -You can use "/fish" to control the bot manually. -/!\ Make sure server rules allow automated farming before using this bot - - - Keep it as false if you have not changed it before. - - - Switch to a new rod from inventory after the current rod is unavailable. - - - Whether to start fishing automatically after entering a world. - - - How soon to re-cast after successful fishing. - - - Will not use rods with less durability than this (full durability is 64). Set to zero to disable this feature. - - - This allows the player to change position/facing after each fish caught. - - - How long after entering the game to start fishing (seconds). - - - Fishing timeout (seconds). Timeout will trigger a re-cast. - - - A "stationary" hook that moves above this threshold in the Y-axis will be considered to have caught a fish. - - - Enable fish bite detection using fishing bobber velocity packets. - - - Velocity Y threshold (blocks/tick). Values below this are treated as a bite. Keep this value negative. - - - Enable fish bite detection using splash sounds near the fishing bobber. - - - Maximum distance (blocks) between splash sound and bobber to treat it as a bite. - - - Delay (seconds) after bobber spawn before bite detection starts. Helps ignore cast-entry splash/motion. - - - Used to adjust the above two thresholds, which when enabled will print the change in the position of the fishhook entity upon receipt of its movement packet. - - - Use the mainhand or the offhand to hold the rod. - - - It will move in order "1->2->3->4->3->2->1->2->..." and can change position or facing or both each time. It is recommended to change the facing only. - - - Hook movement in the X and Z axis less than this value will be considered stationary. - - - Automatically relog when disconnected by server, for example because the server is restating -/!\ Use Ignore_Kick_Message=true at own risk! Server staff might not appreciate if you auto-relog on manual kicks - - - The delay time before joining the server. (in seconds) - - - Reconnect after any server kick or login rejection. Network interruptions always trigger Auto Relog. - - - Case-insensitive text fragments that trigger Auto Relog for server kicks and login rejections. - - - Exact retry limit. Use 0 to disable retries or -1 for unlimited retries. The count resets after 60 seconds online. - - - Run commands or send messages automatically when a specified pattern is detected in chat -Server admins can spoof chat messages (/nick, /tellraw) so keep this in mind when implementing AutoRespond rules -/!\ This bot may get spammy depending on your rules, although the global messagecooldown setting can help you avoiding accidental spam - - - Do not remove colors from text (Note: Your matches will have to include color codes (ones using the § character) in order to work) - - - Logs chat messages in a file on disk. - - - This bot allows you to send and recieve messages and commands via a Discord channel. -For Setup you can either use the documentation or read here (Documentation has images). -Documentation: https://mccteam.github.io/g/bots/#discord-bridge -Setup: -First you need to create a Bot on the Discord Developers Portal, here is a video tutorial: https://www.youtube.com/watch?v=2FgMnZViNPA . -/!\ IMPORTANT /!\: When creating a bot, you MUST ENABLE "Message Content Intent", "Server Members Intent" and "Presence Intent" in order for bot to work! Also follow along carefully do not miss any steps! -When making a bot, copy the generated token and paste it here in "Token" field (tokens are important, keep them safe). -Copy the "Application ID" and go to: https://discordapi.com/permissions.html . -Paste the id you have copied and check the "Administrator" field in permissions, then click on the link at the bottom. -This will open an invitation menu with your servers, choose the server you want to invite the bot on and invite him. -Once you've invited the bot, go to your Discord client and go to Settings -> Advanced and Enable "Developer Mode". -Exit the settings and right click on a server you have invited the bot to in the server list, then click "Copy ID", and paste the id here in "GuildId". -Then right click on a channel where you want to interact with the bot and again right click -> "Copy ID", pase the copied id here in "ChannelId". -And for the end, send a message in the channel, right click on your nick and again right click -> "Copy ID", then paste the id here in "OwnersIds". -How to use: -To execute an MCC command, prefix it with a dot ".", example: ".move 143 64 735" . -To send a message, simply type it out and hit enter. - - - The ID of a channel where you want to interact with the MCC using the bot. - - - Message formats -Words wrapped with { and } are going to be replaced during the code execution, do not change them! -For example. {message} is going to be replace with an actual message, {username} will be replaced with an username, {timestamp} with the current time. -For Discord message formatting, check the following: https://mccteam.github.io/r/dc-fmt.html - - - The ID of a server/guild where you have invited the bot to. - - - How long to wait (in seconds) if a message can not be sent to discord before canceling the task (minimum 1 second). - - - A list of IDs of people you want to be able to interact with the MCC using the bot. - - - Your Discord Bot token. - - - When enabled, messages from other Discord bots in the channel will be relayed to Minecraft chat. The bridge always ignores its own messages to prevent loops. - - - When enabled, all text received from the Minecraft server (including system messages, join/leave notifications, etc.) will be relayed to Discord, not just player chat and private messages. - - - Interval in seconds to aggregate messages before sending them to Discord. When set to 0, messages are sent immediately one by one. When set to a value like 1.0, messages received within that interval are batched into a single Discord message. Useful for reducing Discord API rate limits. - - - Automatically farms crops for you (plants, breaks and bonemeals them). -Crop types available: Beetroot, Carrot, Melon, Netherwart, Pumpkin, Potato, Wheat. -Usage: "/farmer start" command and "/farmer stop" command. -NOTE: This a newly added bot, it is not perfect and was only tested in 1.19.2, there are some minor issues like not being able to bonemeal carrots/potatoes sometimes. -or bot jumps onto the farm land and breaks it (this happens rarely but still happens). We are looking forward at improving this. -It is recommended to keep the farming area walled off and flat to avoid the bot jumping. -Also, if you have your farmland that is one block high, make it 2 or more blocks high so the bot does not fall through, as it can happen sometimes when the bot reconnects. -The bot also does not pickup all items if they fly off to the side, we have a plan to implement this option in the future as well as drop off and bonemeal refill chest(s). - - - Delay between tasks in seconds (Minimum 1 second) - - - Enabled you to make the bot follow you -NOTE: This is an experimental feature, the bot can be slow at times, you need to walk with a normal speed and to sometimes stop for it to be able to keep up with you -It's similar to making animals follow you when you're holding food in your hand. -This is due to a slow pathfinding algorithm, we're working on getting a better one -You can tweak the update limit and find what works best for you. (NOTE: Do not but a very low one, because you might achieve the opposite, -this might clog the thread for terain handling) and thus slow the bot even more. -/!\ Make sure server rules allow an option like this in the rules of the server before using this bot - - - Do not follow the player if he is in the range of 3 blocks (prevents the bot from pushing a player in an infinite loop) - - - The rate at which the bot does calculations (in seconds) (You can tweak this if you feel the bot is too slow) - - - A small game to demonstrate chat interactions. Players can guess mystery words one letter at a time. -You need to have ChatFormat working correctly and add yourself in botowners to start the game with /tell <bot username> start -/!\ This bot may get a bit spammy if many players are interacting with it - - - Relay messages between players and servers, like a mail plugin -This bot can store messages when the recipients are offline, and send them when they join the server -/!\ Server admins can spoof PMs (/tellraw, /nick) so enable this bot only if you trust server admins - - - Allows you to render maps in the console and into images (which can be then sent to Discord using Discord Bridge Chat Bot) -This is useful for solving captchas which use maps -The maps are rendered into Rendered_Maps folder if the Save_To_File is enabled. -NOTE: -If some servers have a very short time for solving captchas, enabe Auto_Render_On_Update to see them immediatelly in the console. -/!\ Make sure server rules allow bots to be used on the server, or you risk being punished. - - - Automatically render the map once it is received or updated from/by the server - - - Delete all rendered maps on unload/reload or when you launch the MCC again. - - - Get a notification when you have gotten a map from the server for the first time - - - Resize an rendered image, this is useful when images that are rendered are small and when are being sent to Discord. - - - Whether to render the map in the console. - - - The size that a rendered image should be resized to, in pixels (eg. 512). - - - Whether to store the rendered map as a file (You need this setting if you want to get a map on Discord using Discord Bridge). - - - Send a rendered map (saved to a file) to a Discord or a Telegram channel via the Discord or Telegram Bride chat bot (The Discord/Telegram Bridge chat bot must be enabled and configured!) -You need to enable Save_To_File in order for this to work. -We also recommend turning on resizing. - - - Log the list of players periodically into a textual file. - - - (In seconds) - - - Send MCC console commands to your bot through server PMs (/tell) -You need to have ChatFormat working correctly and add yourself in botowners to use the bot -/!\ Server admins can spoof PMs (/tellraw, /nick) so enable RemoteControl only if you trust server admins - - - Enable automatic recording of the game and replay it later using the Replay Mod (https://www.replaymod.com/) -Use /replay save to create a snapshot replay file while still recording. -Please note that due to technical limitations, the client player (you) will not be shown in the replay file -Each MCC instance uses its own temporary replay cache so multiple clients can record from the same folder without colliding. -/!\ You SHOULD use /replay stop or exit the program gracefully with /quit OR THE REPLAY FILE MAY GET CORRUPT! - - - How long should replay file be auto-saved, in seconds. Use -1 to disable. - - - Schedule commands and scripts to launch on various events such as server join, date/time or time interval -See https://mccteam.github.io/g/bots/#script-scheduler for more info - - - This bot allows you to send and receive messages and commands via a Telegram Bot DM or to receive messages in a Telegram channel. -/!\ NOTE: You can't send messages and commands from a group channel, you can only send them in the bot DM, but you can get the messages from the client in a group channel. ------------------------------------------------------------ -Setup: -First you need to create a Telegram bot and obtain an API key, to do so, go to Telegram and find @botfather -Click on "Start" button and read the bot reply, then type "/newbot", the Botfather will guide you through the bot creation. -Once you create the bot, copy the API key that you have gotten, and put it into the "Token" field of "ChatBot.TelegramBridge" section (this section). -/!\ Do not share this token with anyone else as it will give them the control over your bot. Save it securely. -Then launch the client and go to Telegram, find your newly created bot by searching for it with its username, and open a DM with it. -Click on "Start" button and type and send the following command ".chatid" to obtain the chat id. -Copy the chat id number (eg. 2627844670) and paste it in the "ChannelId" field and add it to the "Authorized_Chat_Ids" field (in this section) (an id in "Authorized_Chat_Ids" field is a number/long, not a string!), then save the file. -Now you can use the bot using it's DM. -/!\ If you do not add the id of your chat DM with the bot to the "Authorized_Chat_Ids" field, ayone who finds your bot via search will be able to execute commands and send messages! -/!\ An id pasted in to the "Authorized_Chat_Ids" should be a number/long, not a string! ------------------------------------------------------------ -NOTE: If you want to recieve messages to a group channel instead, make the channel temporarely public, invite the bot to it and make it an administrator, then set the channel to private if you want. -Then set the "ChannelId" field to the @ of your channel (you must include the @ in the settings, eg. "@mysupersecretchannel"), this is the username you can see in the invite link of the channel. -/!\ Only include the username with @ prefix, do not include the rest of the link. Example if you have "https://t.me/mysupersecretchannel", the "ChannelId" will be "@mysupersecretchannel". -/!\ Note that you will not be able to send messages to the client from a group channel! ------------------------------------------------------------ -How to use the bot: -To execute an MCC command, prefix it with a dot ".", example: ".move 143 64 735" . -To send a message, simply type it out and hit enter. - - - A list of Chat IDs that are allowed to send messages and execute commands. To get an id of your chat DM with the bot use ".chatid" bot command in Telegram. - - - An ID of a channel where you want to interact with the MCC using the bot. - - - Message formats -Words wrapped with { and } are going to be replaced during the code execution, do not change them! -For example. {message} is going to be replace with an actual message, {username} will be replaced with an username, {timestamp} with the current time. -For Telegram message formatting, check the following: https://mccteam.github.io/r/tg-fmt.html - - - How long to wait (in seconds) if a message can not be sent to Telegram before canceling the task (minimum 1 second). - - - Your Telegram Bot token. - - - MCC does it best to detect chat messages, but some server have unusual chat formats -When this happens, you'll need to configure chat format below, see https://mccteam.github.io/g/conf/#chat-format-section - - - MCC support for common message formats. Set "false" to avoid conflicts with custom formats. - - - Whether to use the custom regular expressions below for detection. - - - Console-related settings. - - - The settings for command completion suggestions. -Custom colors are only available when using "vt100_24bit" color mode. - - - Whether to display command suggestions in the console. - - - Enable this option if the arrows in the command suggestions are not displayed properly in your terminal. - - - Console mode: "classic" for the standard terminal, "tui" for a pseudo-graphical full-screen interface. - - - Use "disable", "legacy_4bit", "vt100_4bit", "vt100_8bit" or "vt100_24bit". If a garbled code like "←[0m" appears on the terminal, you can try switching to "legacy_4bit" mode, or just disable it. - - - Whether to display the MCC startup icon banner. - - - You can use "Ctrl+P" to print out the current input and cursor position. - - - Whether to display received chat messages in the console. This does not affect chat bots or chat log files. - - - Maximum number of input history records to keep. - - - Maximum log lines kept in TUI mode scrollback. Set to 0 for automatic. - - - Startup Config File -Please do not record extraneous data in this file as it will be overwritten by MCC. - -New to Minecraft Console Client? Check out this document: https://mccteam.github.io/g/conf.html -Want to upgrade to a newer version? See https://github.com/MCCTeam/Minecraft-Console-Client/#download - - - This setting affects only the messages in the console. - - - Regex for filtering chat message. - - - Show server chat messages. - - - Regex for filtering debug message. - - - Please enable this before submitting bug reports. Thanks! - - - Show low-level packet debug logs. - - - Packet types to exclude from packet debug logs, e.g. ["KeepAlive", "Ping"]. - - - Show error messages. - - - "disable" or "blacklist" OR "whitelist". Blacklist hide message match regex. Whitelist show message match regex. - - - Informative messages. (i.e Most of the message from MCC) - - - Log file name. - - - Write log messages to file. - - - Prepend timestamp to messages in log file. - - - Keep color codes in the saved text.(look like "§b") - - - Show warning messages. - - - Make sure you understand what each setting does before changing anything! - - - AccountList: It allows a fast account switching without directly using the credentials -Usage examples: "/tell <mybot> reco Player2", "/connect <serverip> Player1" - - - Toggle auto respawn if client player was dead (make sure your spawn point is safe). - - - Set the owner of the bot. /!\ Server admins can impersonate owners! - - - Use "mcc", "vanilla" or "none". This is how MCC identifies itself to the server. - - - Leave empty for no logfile. - - - If turned off, the emoji will be replaced with a simpler character (for /chunk status). - - - Toggle entity handling. - - - Whether to exit directly when an error occurs, for using MCC in non-interactive scripts. - - - Use "none", "slash"(/) or "backslash"(\). - - - Toggle inventory handling. - - - Fill in with in-game locale code, check https://mccteam.github.io/r/l-code.html - - - Load translations applied to MCC when available, turn it off to use English only. - - - Load translations from server resource packs and cache extracted language entries locally for faster reuse. - - - Load translations from local Forge mod jars when their mod IDs are announced by the server. Disabled by default. - - - Also scan standard Minecraft, Prism Launcher, and CurseForge instance mod folders for translation jars when available. - - - Optional path to a mods folder. When set, MCC loads Forge mod translations from this folder instead of automatic discovery. - - - Use "auto", "no" or "force". Force-enabling only works for MC 1.13+. - - - Use "auto" or "1.X.X" values. Allows to skip server info retrieval. - - - Controls the minimum interval (in seconds) between sending each message to the server. - - - Override the maximum chat message length. Set to 0 to use the default (100 for 1.10 and below, 256 for 1.11+). WARNING: Setting this incorrectly may cause you to be kicked from the server. - - - Enable support for joining Minecraft Realms worlds. - - - The minimum height to use when calculating the image size from the height of the terminal. - - - The minimum width used when calculating the image size from the width of the terminal. - - - A movement speed higher than 2 may be considered cheating. - - - Enable head movement while walking to avoid anti-cheat triggers. - - - Only works on Windows XP-8 or Windows 10 with old console. - - - For remote control of the bot. - - - How to retain profile key. Use "none", "memory" or "disk". - - - Use "no", "fast" (5s timeout), or "yes". Required for joining some servers. - - - Cache compiled scripts for faster load on low-end devices. - - - ServerList: It allows an easier and faster server switching with short aliases instead of full server IP -Aliases cannot contain dots or spaces, and the name "localhost" cannot be used as an alias. -Usage examples: "/tell <mybot> connect Server1", "/connect Server2" - - - How to retain session tokens. Use "none", "memory" or "disk". - - - Decode links embedded in chat messages and show them in console. - - - Show inventory layout as ASCII art in inventory command. - - - Show chat notifications when your active effects are gained or expire. Set to false to disable these messages entirely. - - - Show full effect names and levels in the TUI status bar instead of compact effect icons only. - - - Show a GitHub star reminder on startup. Set to false to hide it. - - - System messages for server ops. - - - Messages displayed above xp bar, set this to false in case of xp bar spam. - - - Temporary fix for Badpacket issue on some servers. Need to enable "TerrainAndMovements" first. - - - Uses more ram, cpu, bandwidth but allows you to move around. - - - Customize the TCP connection timeout with the server. (in seconds) - - - Prepend timestamps to chat messages. - - - Login=Email or Name. Use "-" as password for offline mode. Leave blank to prompt user on startup. - - - The address of the game server, "Host" can be filled in with domain name or IP address. (The "Port" field can be deleted, it will be resolved automatically) - - - Microsoft Account sign-in method: "mcc" (device code, supports 2FA) OR "browser" (manual browser login). - - - Account type: "mojang" OR "microsoft" OR "yggdrasil". Also affects interactive login in console. - - - Settings below are sent to the server and only affect server-side things like your skin. - - - Allows disabling chat colors server-side. - - - Use "enabled", "commands", or "disabled". Allows to mute yourself... - - - MC 1.7- difficulty. "peaceful", "easy", "normal", "difficult". - - - If disabled, settings below are not sent to the server. - - - Use any language implemented in Minecraft. - - - MC 1.9+ main hand. "left" or "right". - - - Value range: [0 - 255]. - - - Connect to a server via a proxy instead of connecting directly -If Mojang session services are blocked on your network, set Enabled_Login=true to login using proxy. -If the connection to the Minecraft game server is blocked by the firewall, set Enabled_Ingame=true to use a proxy to connect to the game server. -/!\ Make sure your server rules allow Proxies or VPNs before setting enabled=true, or you may face consequences! - - - Whether to connect to the game server through a proxy. - - - Whether to connect to the login server through a proxy. - - - Whether to download MCC updates via proxy. - - - Only required for password-protected proxies. - - - Supported types: "HTTP", "SOCKS4", "SOCKS4a", "SOCKS5". - - - Proxy server must allow HTTPS for login, and non-443 ports for playing. - - - Only required for password-protected proxies. - - - Chat signature related settings (affects minecraft 1.19+) - - - Microsoft accounts only. If disabled, will not be able to sign chat and join servers configured with "enforce-secure-profile=true" - - - Use red    color block to mark chat without legitimate signature - - - Use green  color block to mark chat with legitimate signatures - - - Use yellow color block to mark chat that have been modified by the server. - - - Use gray   color block to mark system message (always without signature) - - - Whether to display chat and messages in commands without legal signatures - - - Set to true to display messages modified by the server, false to display the original signed messages - - - Whether to sign the chat send from MCC - - - Whether to sign the messages contained in the commands sent by MCC. For example, the message in "/msg" and "/me" - - - If set to true, the bot will collect all items, regardless of their type. If you want to use the whitelisted item types, disable this by setting it to false - - - In this list you can specify which items the bot will collect. To enable this, set the Collect_All_Item_Types to false. (NOTE: This does not prevent the bot from accidentally picking up other items, it only goes to positions where it finds the whitelisted items)\nYou can see the list of item types here: https://raw.githubusercontent.com/MCCTeam/Minecraft-Console-Client/master/MinecraftClient/Inventory/ItemType.cs - - - Delay in milliseconds between bot scanning items (Recommended: 300-500) - - - The radius in which bot will look for items to collect (Default: 30) - - - If set to true, the bot will return to it's starting position after there are no items to collect - - - If set to true, the bot will go after clustered items instead for the closest ones - - - A Chat Bot that collects items on the ground - - - Show a Discord Rich Presence status with your current Minecraft session info. -Setup: -1. Go to https://discord.com/developers/applications and log in with your Discord account. -2. Click "New Application", give it a name (e.g. "MCC") and confirm. -3. On the application page, copy the "Application ID" and paste it in the "ApplicationId" field below. -4. (Optional) Go to "Rich Presence" -> "Art Assets" to upload custom images for LargeImageKey/SmallImageKey. -Note: This does NOT require a Bot Token, only an Application ID. Discord must be running on the same machine as MCC. - - - Your Discord Application ID. Create one at https://discord.com/developers/applications - - - The top line of the Rich Presence display. Supports placeholders. - - - The second line of the Rich Presence display. Supports placeholders. - - - The key of the large image asset uploaded to your Discord application. - - - Tooltip text for the large image. Supports placeholders. - - - The key of the small image asset uploaded to your Discord application (leave empty to hide). - - - Tooltip text for the small image. Supports placeholders. - - - Show the server address (host and port) in the Discord presence. When disabled, {server_host} and {server_port} are masked. - - - Show the player coordinates in the Discord presence. When disabled, {x}, {y}, {z} are masked. - - - Show health and food level in the Discord presence. When disabled, {health}, {max_health}, {food} are masked. - - - Show the current dimension in the Discord presence. When disabled, {dimension} is masked. - - - Show the current gamemode in the Discord presence. When disabled, {gamemode} is masked. - - - Show elapsed session time in the Discord presence. - - - Show the online player count as a party size in the Discord presence. - - - How often (in seconds) to refresh the Discord presence. Minimum: 1 - - - Remotely control the client using Web Sockets.\n# This is useful if you want to implement an application that can remotely and asynchronously execute procedures in MCC.\n# Example implementation written in JavaScript: https://github.com/milutinke/MCC.js.git\n# The protocol specification will be available in the documentation soon. - - - The IP address that Websocket server will be bound to. - - - The Port that Websocket server will be bounded to. - - - A password that will be used to authenticate on thw Websocket server (It is recommended to change the default password and to set a strong one). - - - This setting is for developers who are developing a library that uses this chat bot to remotely execute procedures/commands/functions. - - - Allow IP aliases, such as "localhost" or if using containers then the container name can be used... - - - Ignore invalid player name - - - authlib-injector authentication server to use for Yggdrasil accounts - - - Authlib-injector URL to use for Yggdrasil accounts. It must use http or https and include any required path. - - - Domain name or IP address - - - Port to connect on - - - Path component of the authlib-injector API location. Refer to the authlib-injector documentation for more info. - - - Set to false if your authlib-injector server uses plain HTTP (e.g. for local testing without TLS). - - - Set to false to opt-out of Sentry error logging. - - - Settings for the TUI minimap overlay that shows terrain and entities. - - - Whether the minimap is visible on startup in TUI mode. - - - Blocks per pixel, 1-16. 1 = closest (1:1), 16 = farthest (16 blocks per pixel). - - - Map width in pixels (characters). Range 10-120, default 40. - - - Map height in pixels (must be even, uses half-block chars). Range 4-80, default 40. - - - Minimap position: "top_left", "top_right", "center", "bottom_left", or "bottom_right". - - - Show player names on the minimap. - - - Show hostile mob names on the minimap. - - - Show neutral mob names on the minimap. - - - Show passive mob names on the minimap. - - - Minimap refresh interval in milliseconds (100-5000). - - - Cave rendering mode: "auto" (detect ceiling), "on" (always cave view), "off" (always surface view). - - - Settings for the /tab command and live TUI tab overlay. - - - Show a separate team column in /tab output. Disabled by default for a more vanilla-like player list. - - - Yggdrasil authlib multi-user selection. - - - Host an embedded MCP server while connected to Minecraft. Disabled by default. - - - Embedded MCP HTTP transport settings. - - - Enable or disable MCP tool categories. - - - Enable the built-in embedded MCP server bot. Server starts only after game join and stops on disconnect. - - - IP/host to bind the embedded MCP HTTP listener to. Default is loopback only. - - - TCP port for the embedded MCP HTTP listener. - - - Route prefix where MCP endpoints are exposed. - - - Require Bearer token authentication for MCP endpoint requests. - - - Environment variable name containing the MCP auth token when auth is required. - - - Allow session and status inspection tools. - - - Allow chat and internal command tools. - - - Allow movement and view-control tools. - - - Allow inventory read and action tools. - - - Allow entity and world inspection tools. - - diff --git a/MinecraftClient/Resources/MinecraftAssets.Designer.cs b/MinecraftClient/Resources/MinecraftAssets.Designer.cs deleted file mode 100644 index 052c11b7be..0000000000 --- a/MinecraftClient/Resources/MinecraftAssets.Designer.cs +++ /dev/null @@ -1,73 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace MinecraftClient { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class MinecraftAssets { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal MinecraftAssets() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MinecraftClient.Resources.MinecraftAssets", typeof(MinecraftAssets).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized resource of type System.Byte[]. - /// - internal static byte[] en_us_json { - get { - object obj = ResourceManager.GetObject("en_us.json", resourceCulture); - return ((byte[])(obj)); - } - } - } -} diff --git a/MinecraftClient/Resources/MinecraftAssets.resx b/MinecraftClient/Resources/MinecraftAssets.resx deleted file mode 100644 index 0e01945f14..0000000000 --- a/MinecraftClient/Resources/MinecraftAssets.resx +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - en_us.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/MinecraftClient/Resources/Translations/Translations.Designer.cs b/MinecraftClient/Resources/Translations/Translations.Designer.cs deleted file mode 100644 index 4568ebd927..0000000000 --- a/MinecraftClient/Resources/Translations/Translations.Designer.cs +++ /dev/null @@ -1,8304 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace MinecraftClient { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Translations { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Translations() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MinecraftClient.Resources.Translations.Translations", typeof(Translations).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to Weather change: It is no longer raining.. - /// - internal static string bot_alerts_end_rain { - get { - return ResourceManager.GetString("bot.alerts.end_rain", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Weather change: It is no longer a thunderstorm.. - /// - internal static string bot_alerts_end_thunderstorm { - get { - return ResourceManager.GetString("bot.alerts.end_thunderstorm", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Weather change: It is raining now.. - /// - internal static string bot_alerts_start_rain { - get { - return ResourceManager.GetString("bot.alerts.start_rain", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Weather change: It is a thunderstorm.. - /// - internal static string bot_alerts_start_thunderstorm { - get { - return ResourceManager.GetString("bot.alerts.start_thunderstorm", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid walk range provided, must be a positive integer greater than 0, using default value of 5!. - /// - internal static string bot_antiafk_invalid_walk_range { - get { - return ResourceManager.GetString("bot.antiafk.invalid_walk_range", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Bot movement lock is held by bot {0}, so the Anti AFK bot might not move!. - /// - internal static string bot_antiafk_may_not_move { - get { - return ResourceManager.GetString("bot.antiafk.may.not.move", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The terrain handling is not enabled in the settings of the client, enable it if you want to use it with this bot. Using alternative (command) method.. - /// - internal static string bot_antiafk_not_using_terrain_handling { - get { - return ResourceManager.GetString("bot.antiafk.not_using_terrain_handling", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The time range begins with a bigger value, swapped them around.. - /// - internal static string bot_antiafk_swapping { - get { - return ResourceManager.GetString("bot.antiafk.swapping", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Attack cooldown value cannot be smaller than 0.. - /// - internal static string bot_autoAttack_invalidcooldown { - get { - return ResourceManager.GetString("bot.autoAttack.invalidcooldown", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Crafting aborted! Check your available materials.. - /// - internal static string bot_autoCraft_aborted { - get { - return ResourceManager.GetString("bot.autoCraft.aborted", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Auto-crafting ChatBot command alias. - /// - internal static string bot_autoCraft_alias { - get { - return ResourceManager.GetString("bot.autoCraft.alias", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Available commands: {0}. Use /autocraft help <cmd name> for more information.. - /// - internal static string bot_autoCraft_available_cmd { - get { - return ResourceManager.GetString("bot.autoCraft.available_cmd", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Inventory #{0} was closed by AutoCraft. - /// - internal static string bot_autoCraft_close_inventory { - get { - return ResourceManager.GetString("bot.autoCraft.close_inventory", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Auto-crafting ChatBot command. - /// - internal static string bot_autoCraft_cmd { - get { - return ResourceManager.GetString("bot.autoCraft.cmd", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Total {0} recipes loaded: {1}. - /// - internal static string bot_autoCraft_cmd_list { - get { - return ResourceManager.GetString("bot.autoCraft.cmd.list", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Crafting failed! Waiting for more materials. - /// - internal static string bot_autoCraft_craft_fail { - get { - return ResourceManager.GetString("bot.autoCraft.craft_fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Duplicate recipe name specified: {0}. - /// - internal static string bot_autoCraft_exception_duplicate { - get { - return ResourceManager.GetString("bot.autoCraft.exception.duplicate", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Missing recipe name while parsing a recipe. - /// - internal static string bot_autoCraft_exception_name_miss { - get { - return ResourceManager.GetString("bot.autoCraft.exception.name_miss", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Get the command description. Usage: /autocraft help <command name>. - /// - internal static string bot_autoCraft_help_help { - get { - return ResourceManager.GetString("bot.autoCraft.help.help", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to List available recipes.. - /// - internal static string bot_autoCraft_help_list { - get { - return ResourceManager.GetString("bot.autoCraft.help.list", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Load the config file.. - /// - internal static string bot_autoCraft_help_load { - get { - return ResourceManager.GetString("bot.autoCraft.help.load", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Reload the config file.. - /// - internal static string bot_autoCraft_help_reload { - get { - return ResourceManager.GetString("bot.autoCraft.help.reload", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Write the default example config to default location.. - /// - internal static string bot_autoCraft_help_resetcfg { - get { - return ResourceManager.GetString("bot.autoCraft.help.resetcfg", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Start the crafting. Usage: /autocraft start <recipe name>. - /// - internal static string bot_autoCraft_help_start { - get { - return ResourceManager.GetString("bot.autoCraft.help.start", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Stop the current running crafting process. - /// - internal static string bot_autoCraft_help_stop { - get { - return ResourceManager.GetString("bot.autoCraft.help.stop", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid result item!. - /// - internal static string bot_autocraft_invaild_result { - get { - return ResourceManager.GetString("bot.autocraft.invaild_result", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The number of slots does not match and has been adjusted automatically.. - /// - internal static string bot_autocraft_invaild_slots { - get { - return ResourceManager.GetString("bot.autocraft.invaild_slots", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Missing material: {0}. - /// - internal static string bot_autoCraft_missing_material { - get { - return ResourceManager.GetString("bot.autoCraft.missing_material", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Please specify the recipe name you want to craft.. - /// - internal static string bot_autoCraft_no_recipe_name { - get { - return ResourceManager.GetString("bot.autoCraft.no_recipe_name", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Specified recipe name does not exist. Check your config file.. - /// - internal static string bot_autoCraft_recipe_not_exist { - get { - return ResourceManager.GetString("bot.autoCraft.recipe_not_exist", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Starting AutoCraft: {0}. - /// - internal static string bot_autoCraft_start { - get { - return ResourceManager.GetString("bot.autoCraft.start", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to AutoCraft cannot be started. Check your available materials for crafting {0}. - /// - internal static string bot_autoCraft_start_fail { - get { - return ResourceManager.GetString("bot.autoCraft.start_fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to AutoCraft stopped. - /// - internal static string bot_autoCraft_stop { - get { - return ResourceManager.GetString("bot.autoCraft.stop", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to table not found. - /// - internal static string bot_autoCraft_table_not_found { - get { - return ResourceManager.GetString("bot.autoCraft.table_not_found", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Action timeout! Reason: {0}. - /// - internal static string bot_autoCraft_timeout { - get { - return ResourceManager.GetString("bot.autoCraft.timeout", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Available commands: {0}. Use /autodig help <cmd name> for more information.. - /// - internal static string bot_autodig_available_cmd { - get { - return ResourceManager.GetString("bot.autodig.available_cmd", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Auto-digging ChatBot command. - /// - internal static string bot_autodig_cmd { - get { - return ResourceManager.GetString("bot.autodig.cmd", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Digging block timeout, retry.. - /// - internal static string bot_autodig_dig_timeout { - get { - return ResourceManager.GetString("bot.autodig.dig_timeout", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Get the command description. Usage: /autodig help <command name>. - /// - internal static string bot_autodig_help_help { - get { - return ResourceManager.GetString("bot.autodig.help.help", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Start the automatic digging bot.. - /// - internal static string bot_autodig_help_start { - get { - return ResourceManager.GetString("bot.autodig.help.start", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Deactivate the automatic digging bot.. - /// - internal static string bot_autodig_help_stop { - get { - return ResourceManager.GetString("bot.autodig.help.stop", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Inventory handling is not enabled. Unable to switch tools automatically.. - /// - internal static string bot_autodig_no_inv_handle { - get { - return ResourceManager.GetString("bot.autodig.no_inv_handle", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Dropped low durability {0} from slot {1}.. - /// - internal static string bot_autodig_drop_low_durability { - get { - return ResourceManager.GetString("bot.autodig.drop_low_durability", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The block currently pointed to is not in the allowed list.. - /// - internal static string bot_autodig_not_allow { - get { - return ResourceManager.GetString("bot.autodig.not_allow", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Automatic digging has started.. - /// - internal static string bot_autodig_start { - get { - return ResourceManager.GetString("bot.autodig.start", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Digging will start in {0:0.0} second(s).. - /// - internal static string bot_autodig_start_delay { - get { - return ResourceManager.GetString("bot.autodig.start_delay", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Auto-digging has been stopped.. - /// - internal static string bot_autodig_stop { - get { - return ResourceManager.GetString("bot.autodig.stop", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Switch to {0} from slot {1}.. - /// - internal static string bot_autodig_switch { - get { - return ResourceManager.GetString("bot.autodig.switch", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Added item {0}. - /// - internal static string bot_autoDrop_added { - get { - return ResourceManager.GetString("bot.autoDrop.added", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to AutoDrop ChatBot command alias. - /// - internal static string bot_autoDrop_alias { - get { - return ResourceManager.GetString("bot.autoDrop.alias", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to AutoDrop ChatBot command. - /// - internal static string bot_autoDrop_cmd { - get { - return ResourceManager.GetString("bot.autoDrop.cmd", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Incorrect item name {0}. Please try again.. - /// - internal static string bot_autoDrop_incorrect_name { - get { - return ResourceManager.GetString("bot.autoDrop.incorrect_name", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Total {0} in the list: - /// {1}. - /// - internal static string bot_autoDrop_list { - get { - return ResourceManager.GetString("bot.autoDrop.list", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot find inventory {0}!. - /// - internal static string bot_autoDrop_no_inventory { - get { - return ResourceManager.GetString("bot.autoDrop.no_inventory", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No item in the list. - /// - internal static string bot_autoDrop_no_item { - get { - return ResourceManager.GetString("bot.autoDrop.no_item", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot read drop mode from config. Using include mode.. - /// - internal static string bot_autoDrop_no_mode { - get { - return ResourceManager.GetString("bot.autoDrop.no_mode", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Item not in the list. - /// - internal static string bot_autoDrop_not_in_list { - get { - return ResourceManager.GetString("bot.autoDrop.not_in_list", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to AutoDrop disabled. - /// - internal static string bot_autoDrop_off { - get { - return ResourceManager.GetString("bot.autoDrop.off", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to AutoDrop enabled. - /// - internal static string bot_autoDrop_on { - get { - return ResourceManager.GetString("bot.autoDrop.on", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Removed item {0}. - /// - internal static string bot_autoDrop_removed { - get { - return ResourceManager.GetString("bot.autoDrop.removed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Switched to {0} mode.. - /// - internal static string bot_autoDrop_switched { - get { - return ResourceManager.GetString("bot.autoDrop.switched", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unknwon mode. Available modes: Include, Exclude, Everything. - /// - internal static string bot_autoDrop_unknown_mode { - get { - return ResourceManager.GetString("bot.autoDrop.unknown_mode", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Available commands: {0}. Use /fish help <cmd name> for more information.. - /// - internal static string bot_autoFish_available_cmd { - get { - return ResourceManager.GetString("bot.autoFish.available_cmd", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Casting timeout and will soon retry. (Timeout increased to {0:0.0} sec).. - /// - internal static string bot_autoFish_cast_timeout { - get { - return ResourceManager.GetString("bot.autoFish.cast_timeout", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Retract the fishing rod. (Count: {0}). - /// - internal static string bot_autoFish_caught { - get { - return ResourceManager.GetString("bot.autoFish.caught", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Retract the fishing rod at ({0:0.0},{1:0.0},{2:0.0})! (Count: {3}). - /// - internal static string bot_autoFish_caught_at { - get { - return ResourceManager.GetString("bot.autoFish.caught_at", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Auto-Fishing ChatBot command. - /// - internal static string bot_autoFish_cmd { - get { - return ResourceManager.GetString("bot.autoFish.cmd", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Fish floating despawn, will re-cast.. - /// - internal static string bot_autoFish_despawn { - get { - return ResourceManager.GetString("bot.autoFish.despawn", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Fishing timeout, will soon re-cast.. - /// - internal static string bot_autoFish_fishing_timeout { - get { - return ResourceManager.GetString("bot.autoFish.fishing_timeout", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Fishing got {0}. - /// - internal static string bot_autoFish_got { - get { - return ResourceManager.GetString("bot.autoFish.got", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Get the command description. Usage: /fish help <command name>. - /// - internal static string bot_autoFish_help_help { - get { - return ResourceManager.GetString("bot.autoFish.help.help", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Start auto-fishing.. - /// - internal static string bot_autoFish_help_start { - get { - return ResourceManager.GetString("bot.autoFish.help.start", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to List all obtained items. Or use "/fish status clear" to clear the list.. - /// - internal static string bot_autoFish_help_status { - get { - return ResourceManager.GetString("bot.autoFish.help.status", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Stop auto-fishing.. - /// - internal static string bot_autoFish_help_stop { - get { - return ResourceManager.GetString("bot.autoFish.help.stop", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Inventory handling is not enabled. Cannot check rod durability and switch rods.. - /// - internal static string bot_autoFish_no_inv_handle { - get { - return ResourceManager.GetString("bot.autoFish.no_inv_handle", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Current fishing rod is not available. Maybe broken or low durability?. - /// - internal static string bot_autoFish_no_rod { - get { - return ResourceManager.GetString("bot.autoFish.no_rod", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Start auto-fishing.. - /// - internal static string bot_autoFish_start { - get { - return ResourceManager.GetString("bot.autoFish.start", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Fishing will start in {0:0.0} second(s).. - /// - internal static string bot_autoFish_start_at { - get { - return ResourceManager.GetString("bot.autoFish.start_at", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The record of the obtained items has been cleared.. - /// - internal static string bot_autoFish_status_clear { - get { - return ResourceManager.GetString("bot.autoFish.status_clear", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to All items obtained from fishing (not entirely accurate):. - /// - internal static string bot_autoFish_status_info { - get { - return ResourceManager.GetString("bot.autoFish.status_info", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Stop auto-fishing.. - /// - internal static string bot_autoFish_stop { - get { - return ResourceManager.GetString("bot.autoFish.stop", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Switch to the rod in slot {0}, durability {1}/64.. - /// - internal static string bot_autoFish_switch { - get { - return ResourceManager.GetString("bot.autoFish.switch", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Casting successfully.. - /// - internal static string bot_autoFish_throw { - get { - return ResourceManager.GetString("bot.autoFish.throw", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Update yaw = {0:0.00}, pitch = {1:0.00}.. - /// - internal static string bot_autoFish_update_lookat { - get { - return ResourceManager.GetString("bot.autoFish.update_lookat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Current directory was: {0}. - /// - internal static string bot_autoRelog_curr_dir { - get { - return ResourceManager.GetString("bot.autoRelog.curr_dir", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Got disconnected with message: {0}. - /// - internal static string bot_autoRelog_disconnect_msg { - get { - return ResourceManager.GetString("bot.autoRelog.disconnect_msg", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Disconnection initiated by User or MCC bot. Ignoring.. - /// - internal static string bot_autoRelog_ignore_user_logout { - get { - return ResourceManager.GetString("bot.autoRelog.ignore_user_logout", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Launching with {0} reconnection attempts. - /// - internal static string bot_autoRelog_launch { - get { - return ResourceManager.GetString("bot.autoRelog.launch", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Initializing without a kick message file. - /// - internal static string bot_autoRelog_no_kick_msg { - get { - return ResourceManager.GetString("bot.autoRelog.no_kick_msg", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Message contains '{0}'. Reconnecting.. - /// - internal static string bot_autoRelog_reconnect { - get { - return ResourceManager.GetString("bot.autoRelog.reconnect", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Ignoring kick message, reconnecting anyway.. - /// - internal static string bot_autoRelog_reconnect_always { - get { - return ResourceManager.GetString("bot.autoRelog.reconnect_always", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Message not containing any defined keywords. Ignoring.. - /// - internal static string bot_autoRelog_reconnect_ignore { - get { - return ResourceManager.GetString("bot.autoRelog.reconnect_ignore", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Waiting {0:0.000} seconds before reconnecting.... - /// - internal static string bot_autoRelog_wait { - get { - return ResourceManager.GetString("bot.autoRelog.wait", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Waiting {0:0.000} seconds before reconnecting... ({1} retries left). - /// - internal static string bot_autoRelog_wait_with_retries { - get { - return ResourceManager.GetString("bot.autoRelog.wait_with_retries", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to unlimited. - /// - internal static string bot_autoRelog_retries_unlimited { - get { - return ResourceManager.GetString("bot.autoRelog.retries_unlimited", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to File not found: '{0}'. - /// - internal static string bot_autoRespond_file_not_found { - get { - return ResourceManager.GetString("bot.autoRespond.file_not_found", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Loaded match: - ///{0}. - /// - internal static string bot_autoRespond_loaded_match { - get { - return ResourceManager.GetString("bot.autoRespond.loaded_match", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Loading matches from '{0}'. - /// - internal static string bot_autoRespond_loading { - get { - return ResourceManager.GetString("bot.autoRespond.loading", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to match: {0} - ///regex: {1} - ///action: {2} - ///actionPrivate: {3} - ///actionOther: {4} - ///ownersOnly: {5} - ///cooldown: {6}. - /// - internal static string bot_autoRespond_match { - get { - return ResourceManager.GetString("bot.autoRespond.match", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Running action: {0}. - /// - internal static string bot_autoRespond_match_run { - get { - return ResourceManager.GetString("bot.autoRespond.match_run", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No action for match: - ///{0}. - /// - internal static string bot_autoRespond_no_action { - get { - return ResourceManager.GetString("bot.autoRespond.no_action", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This match will never trigger: - ///{0}. - /// - internal static string bot_autoRespond_no_trigger { - get { - return ResourceManager.GetString("bot.autoRespond.no_trigger", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Path '{0}' contains invalid characters.. - /// - internal static string bot_chatLog_invalid_file { - get { - return ResourceManager.GetString("bot.chatLog.invalid_file", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You can not start/run/use the '{0}' bot because it requires movement, the movement is currently utilized by the '{1}' bot, stop it if you want to use this one.. - /// - internal static string bot_common_movement_lock_held { - get { - return ResourceManager.GetString("bot.common.movement.lock.held", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Sending message to Discord was canceled due an error occuring. For more info enable Debug.. - /// - internal static string bot_DiscordBridge_canceled_sending { - get { - return ResourceManager.GetString("bot.DiscordBridge.canceled_sending", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The provided channel with an id '{0}' has not been found!. - /// - internal static string bot_DiscordBridge_channel_not_found { - get { - return ResourceManager.GetString("bot.DiscordBridge.channel_not_found", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The command was executed with the result. - /// - internal static string bot_DiscordBridge_command_executed { - get { - return ResourceManager.GetString("bot.DiscordBridge.command_executed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Succesfully connected with MCC!. - /// - internal static string bot_DiscordBridge_connected { - get { - return ResourceManager.GetString("bot.DiscordBridge.connected", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This command allows you to specify in the which direction the messages will be relayed via the Discord Bridge chat bot.. - /// - internal static string bot_DiscordBridge_desc { - get { - return ResourceManager.GetString("bot.DiscordBridge.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Direction of the Discord Brdige has been switched to '{0}'!. - /// - internal static string bot_DiscordBridge_direction { - get { - return ResourceManager.GetString("bot.DiscordBridge.direction", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Both. - /// - internal static string bot_DiscordBridge_direction_both { - get { - return ResourceManager.GetString("bot.DiscordBridge.direction.both", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Discord. - /// - internal static string bot_DiscordBridge_direction_discord { - get { - return ResourceManager.GetString("bot.DiscordBridge.direction.discord", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Minecraft. - /// - internal static string bot_DiscordBridge_direction_minecraft { - get { - return ResourceManager.GetString("bot.DiscordBridge.direction.minecraft", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Successfully disconnected with MCC!. - /// - internal static string bot_DiscordBridge_disconnected { - get { - return ResourceManager.GetString("bot.DiscordBridge.disconnected", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The provided guild/server with an id '{0}' has not been found!. - /// - internal static string bot_DiscordBridge_guild_not_found { - get { - return ResourceManager.GetString("bot.DiscordBridge.guild_not_found", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid direction provided! Available directions: both|b, minecraft|mc, discord|dsc. Example: "dscbridge direction mc". - /// - internal static string bot_DiscordBridge_invalid_direction { - get { - return ResourceManager.GetString("bot.DiscordBridge.invalid_direction", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Please provide a valid token!. - /// - internal static string bot_DiscordBridge_missing_token { - get { - return ResourceManager.GetString("bot.DiscordBridge.missing_token", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to An unknown error has occured!. - /// - internal static string bot_DiscordBridge_unknown_error { - get { - return ResourceManager.GetString("bot.DiscordBridge.unknown_error", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Please provide a valid Discord Application ID!. - /// - internal static string bot_DiscordRpc_missing_app_id { - get { - return ResourceManager.GetString("bot.DiscordRpc.missing_app_id", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Connected to Discord as {0}. - /// - internal static string bot_DiscordRpc_connected { - get { - return ResourceManager.GetString("bot.DiscordRpc.connected", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to connect to Discord (pipe {0}). Is Discord running?. - /// - internal static string bot_DiscordRpc_connection_failed { - get { - return ResourceManager.GetString("bot.DiscordRpc.connection_failed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Discord Rich Presence initialized successfully.. - /// - internal static string bot_DiscordRpc_initialized { - get { - return ResourceManager.GetString("bot.DiscordRpc.initialized", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to initialize Discord Rich Presence: {0}. - /// - internal static string bot_DiscordRpc_init_error { - get { - return ResourceManager.GetString("bot.DiscordRpc.init_error", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Error updating Discord presence: {0}. - /// - internal static string bot_DiscordRpc_update_error { - get { - return ResourceManager.GetString("bot.DiscordRpc.update_error", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid update interval, must be at least 1 second. Using default of 10 seconds.. - /// - internal static string bot_DiscordRpc_invalid_interval { - get { - return ResourceManager.GetString("bot.DiscordRpc.invalid_interval", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The bot is already farming!. - /// - internal static string bot_farmer_already_running { - get { - return ResourceManager.GetString("bot.farmer.already_running", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The bot has already stopped farming!. - /// - internal static string bot_farmer_already_stopped { - get { - return ResourceManager.GetString("bot.farmer.already_stopped", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Crop type. - /// - internal static string bot_farmer_crop_type { - get { - return ResourceManager.GetString("bot.farmer.crop_type", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} is only available in Minecraft {1} and newer!. - /// - internal static string bot_farmer_crop_unavailable { - get { - return ResourceManager.GetString("bot.farmer.crop_unavailable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Farming bot. - /// - internal static string bot_farmer_desc { - get { - return ResourceManager.GetString("bot.farmer.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid crop type provided (Types which you can use: Beetroot, Carrot, Melon, Netherwart, Pumpkin, Potato, Wheat)!. - /// - internal static string bot_farmer_invalid_crop_type { - get { - return ResourceManager.GetString("bot.farmer.invalid_crop_type", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid radius provided, you must provide a valid integer number greater than 0!. - /// - internal static string bot_farmer_invalid_radius { - get { - return ResourceManager.GetString("bot.farmer.invalid_radius", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The Farmer bot needs Inventory Handling in order to work, please enable it!. - /// - internal static string bot_farmer_needs_inventory { - get { - return ResourceManager.GetString("bot.farmer.needs_inventory", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The Farmer bot needs Terrain Handling in order to work, please enable it!. - /// - internal static string bot_farmer_needs_terrain { - get { - return ResourceManager.GetString("bot.farmer.needs_terrain", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Not implemented below 1.8!. - /// - internal static string bot_farmer_not_implemented { - get { - return ResourceManager.GetString("bot.farmer.not_implemented", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Radius. - /// - internal static string bot_farmer_radius { - get { - return ResourceManager.GetString("bot.farmer.radius", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Started farming!. - /// - internal static string bot_farmer_started { - get { - return ResourceManager.GetString("bot.farmer.started", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Stopped farming!. - /// - internal static string bot_farmer_stopped { - get { - return ResourceManager.GetString("bot.farmer.stopped", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Stoping farming, this might take a second.... - /// - internal static string bot_farmer_stopping { - get { - return ResourceManager.GetString("bot.farmer.stopping", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You have enabled teleporting, this might get your bot account kicked and in the worst case scenario banned! Use with caution!. - /// - internal static string bot_farmer_warining_allow_teleport { - get { - return ResourceManager.GetString("bot.farmer.warining_allow_teleport", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You have enabled un-safe movement, the bot might get hurt!. - /// - internal static string bot_farmer_warining_force_unsafe { - get { - return ResourceManager.GetString("bot.farmer.warining_force_unsafe", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid parameter "{0}" provided (Use format: "key:value")!. - /// - internal static string bot_farmer_warining_invalid_parameter { - get { - return ResourceManager.GetString("bot.farmer.warining_invalid_parameter", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to mailer command. - /// - internal static string bot_mailer_cmd { - get { - return ResourceManager.GetString("bot.mailer.cmd", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to --- Ignore list --- - ///{0}. - /// - internal static string bot_mailer_cmd_getignored { - get { - return ResourceManager.GetString("bot.mailer.cmd.getignored", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to --- Mails in database --- - ///{0}. - /// - internal static string bot_mailer_cmd_getmails { - get { - return ResourceManager.GetString("bot.mailer.cmd.getmails", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to See usage. - /// - internal static string bot_mailer_cmd_help { - get { - return ResourceManager.GetString("bot.mailer.cmd.help", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Added {0} to the ignore list!. - /// - internal static string bot_mailer_cmd_ignore_added { - get { - return ResourceManager.GetString("bot.mailer.cmd.ignore.added", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Missing or invalid name. Usage: {0} <username>. - /// - internal static string bot_mailer_cmd_ignore_invalid { - get { - return ResourceManager.GetString("bot.mailer.cmd.ignore.invalid", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Removed {0} from the ignore list!. - /// - internal static string bot_mailer_cmd_ignore_removed { - get { - return ResourceManager.GetString("bot.mailer.cmd.ignore.removed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Creating new database file: {0}. - /// - internal static string bot_mailer_create_db { - get { - return ResourceManager.GetString("bot.mailer.create.db", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Creating new ignore list: {0}. - /// - internal static string bot_mailer_create_ignore { - get { - return ResourceManager.GetString("bot.mailer.create.ignore", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Delivered: {0}. - /// - internal static string bot_mailer_delivered { - get { - return ResourceManager.GetString("bot.mailer.delivered", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Initializing Mailer with settings:. - /// - internal static string bot_mailer_init { - get { - return ResourceManager.GetString("bot.mailer.init", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to  - Database File: {0}. - /// - internal static string bot_mailer_init_db { - get { - return ResourceManager.GetString("bot.mailer.init.db", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to  - Max Database Size: {0}. - /// - internal static string bot_mailer_init_db_size { - get { - return ResourceManager.GetString("bot.mailer.init.db_size", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot enable Mailer: Max Database Size must be greater than zero. Please review the settings.. - /// - internal static string bot_mailer_init_fail_db_size { - get { - return ResourceManager.GetString("bot.mailer.init_fail.db_size", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot enable Mailer: Mail Retention must be greater than zero. Please review the settings.. - /// - internal static string bot_mailer_init_fail_mail_retention { - get { - return ResourceManager.GetString("bot.mailer.init_fail.mail_retention", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot enable Mailer: Max Mails per Player must be greater than zero. Please review the settings.. - /// - internal static string bot_mailer_init_fail_max_mails { - get { - return ResourceManager.GetString("bot.mailer.init_fail.max_mails", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to  - Ignore List: {0}. - /// - internal static string bot_mailer_init_ignore { - get { - return ResourceManager.GetString("bot.mailer.init.ignore", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to  - Mail Retention: {0}. - /// - internal static string bot_mailer_init_mail_retention { - get { - return ResourceManager.GetString("bot.mailer.init.mail_retention", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to  - Max Mails per Player: {0}. - /// - internal static string bot_mailer_init_max_mails { - get { - return ResourceManager.GetString("bot.mailer.init.max_mails", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to  - Public Interactions: {0}. - /// - internal static string bot_mailer_init_public { - get { - return ResourceManager.GetString("bot.mailer.init.public", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Loading database file: {0}. - /// - internal static string bot_mailer_load_db { - get { - return ResourceManager.GetString("bot.mailer.load.db", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Loading ignore list: . - /// - internal static string bot_mailer_load_ignore { - get { - return ResourceManager.GetString("bot.mailer.load.ignore", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Looking for mails to send @ {0}. - /// - internal static string bot_mailer_process_mails { - get { - return ResourceManager.GetString("bot.mailer.process_mails", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Saving message: {0}. - /// - internal static string bot_mailer_saving { - get { - return ResourceManager.GetString("bot.mailer.saving", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} is ignored!. - /// - internal static string bot_mailer_user_ignored { - get { - return ResourceManager.GetString("bot.mailer.user_ignored", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Render maps (item maps). - /// - internal static string bot_map_cmd_desc { - get { - return ResourceManager.GetString("bot.map.cmd.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid ID provided, must be a number!. - /// - internal static string bot_map_cmd_invalid_id { - get { - return ResourceManager.GetString("bot.map.cmd.invalid_id", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to A map with id '{0}' does not exists!. - /// - internal static string bot_map_cmd_not_found { - get { - return ResourceManager.GetString("bot.map.cmd.not_found", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to render the map with id: '{0}'. - /// - internal static string bot_map_failed_to_render { - get { - return ResourceManager.GetString("bot.map.failed_to_render", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to - Map id: {0} (Last Updated: {1}). - /// - internal static string bot_map_list_item { - get { - return ResourceManager.GetString("bot.map.list_item", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No maps received!. - /// - internal static string bot_map_no_maps { - get { - return ResourceManager.GetString("bot.map.no_maps", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The list of received maps from the server:. - /// - internal static string bot_map_received { - get { - return ResourceManager.GetString("bot.map.received", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Received a new Map, with Id: {0}. - /// - internal static string bot_map_received_map { - get { - return ResourceManager.GetString("bot.map.received_map", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Succesfully rendered a map with id '{0}' to: '{1}'. - /// - internal static string bot_map_rendered { - get { - return ResourceManager.GetString("bot.map.rendered", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Resized the rendered image of the map with id: '{0}' to {1}x{1}.. - /// - internal static string bot_map_resized_rendered_image { - get { - return ResourceManager.GetString("bot.map.resized_rendered_image", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The size of the map is reduced from ({0}x{1}) to ({2}x{3}) due to the size limitation of the current terminal.. - /// - internal static string bot_map_scale { - get { - return ResourceManager.GetString("bot.map.scale", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Sent a rendered image of a map with an id '{0}' to the Discord via Discord Brdige chat bot!. - /// - internal static string bot_map_sent_to_discord { - get { - return ResourceManager.GetString("bot.map.sent_to_discord", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Sent a rendered image of a map with an id '{0}' to the Telegram via Telegram Bridge chat bot!. - /// - internal static string bot_map_sent_to_telegram { - get { - return ResourceManager.GetString("bot.map.sent_to_telegram", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Map #{0} ({1}x{2}) [{3}%]. - /// - internal static string bot_map_tui_header { - get { - return ResourceManager.GetString("bot.map.tui_header", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Scroll=Zoom Drag=Pan +/-=Zoom Arrows=Pan Esc/E=Close. - /// - internal static string bot_map_tui_controls { - get { - return ResourceManager.GetString("bot.map.tui_controls", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to replay command. - /// - internal static string bot_replayCapture_cmd { - get { - return ResourceManager.GetString("bot.replayCapture.cmd", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Replay file created.. - /// - internal static string bot_replayCapture_created { - get { - return ResourceManager.GetString("bot.replayCapture.created", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Record was stopped. Restart the program to start another record.. - /// - internal static string bot_replayCapture_restart { - get { - return ResourceManager.GetString("bot.replayCapture.restart", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Record stopped.. - /// - internal static string bot_replayCapture_stopped { - get { - return ResourceManager.GetString("bot.replayCapture.stopped", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Script '{0}' failed to run ({1}).. - /// - internal static string bot_script_fail { - get { - return ResourceManager.GetString("bot.script.fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to File not found: '{0}'. - /// - internal static string bot_script_file_not_found { - get { - return ResourceManager.GetString("bot.script.file_not_found", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to [MCC] [{0}] Cannot find script file: {1}. - /// - internal static string bot_script_not_found { - get { - return ResourceManager.GetString("bot.script.not_found", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Script '{0}' loaded.. - /// - internal static string bot_script_pm_loaded { - get { - return ResourceManager.GetString("bot.script.pm.loaded", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Error in {0} at line {1}, column {2}: [{3}] {4}. - /// - internal static string script_compile_error { - get { - return ResourceManager.GetString("script.compile.error", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Error in {0}: [{1}] {2}. - /// - internal static string script_compile_error_no_location { - get { - return ResourceManager.GetString("script.compile.error_no_location", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to [Script] Compilation failed with error(s):. - /// - internal static string script_compile_failed { - get { - return ResourceManager.GetString("script.compile.failed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to [Script] Starting compilation for {0}.... - /// - internal static string script_compile_started { - get { - return ResourceManager.GetString("script.compile.started", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to [Script] Compilation done with no errors.. - /// - internal static string script_compile_succeeded { - get { - return ResourceManager.GetString("script.compile.succeeded", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Loaded task: - ///{0}. - /// - internal static string bot_scriptScheduler_loaded_task { - get { - return ResourceManager.GetString("bot.scriptScheduler.loaded_task", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No action for task: - ///{0}. - /// - internal static string bot_scriptScheduler_no_action { - get { - return ResourceManager.GetString("bot.scriptScheduler.no_action", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This task will never trigger: - ///{0}. - /// - internal static string bot_scriptScheduler_no_trigger { - get { - return ResourceManager.GetString("bot.scriptScheduler.no_trigger", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Interval / Running action: {0}. - /// - internal static string bot_scriptScheduler_running_inverval { - get { - return ResourceManager.GetString("bot.scriptScheduler.running_inverval", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Login / Running action: {0}. - /// - internal static string bot_scriptScheduler_running_login { - get { - return ResourceManager.GetString("bot.scriptScheduler.running_login", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Time / Running action: {0}. - /// - internal static string bot_scriptScheduler_running_time { - get { - return ResourceManager.GetString("bot.scriptScheduler.running_time", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to triggeronfirstlogin: {0} - /// triggeronlogin: {1} - /// triggerontime: {2} - /// triggeroninterval: {3} - /// timevalue: {4} - /// timeinterval: {5} - /// action: {6}. - /// - internal static string bot_scriptScheduler_task { - get { - return ResourceManager.GetString("bot.scriptScheduler.task", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Sending message to Telegram was canceled due an error occuring. For more info enable Debug.. - /// - internal static string bot_TelegramBridge_canceled_sending { - get { - return ResourceManager.GetString("bot.TelegramBridge.canceled_sending", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The command was executed with the result. - /// - internal static string bot_TelegramBridge_command_executed { - get { - return ResourceManager.GetString("bot.TelegramBridge.command_executed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Succesfully connected with the MCC!. - /// - internal static string bot_TelegramBridge_connected { - get { - return ResourceManager.GetString("bot.TelegramBridge.connected", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This command allows you to specify in the which direction the messages will be relayed via the Telegram Bridge chat bot.. - /// - internal static string bot_TelegramBridge_desc { - get { - return ResourceManager.GetString("bot.TelegramBridge.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Direction of the Telegram Brdige has been switched to '{0}'!. - /// - internal static string bot_TelegramBridge_direction { - get { - return ResourceManager.GetString("bot.TelegramBridge.direction", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Both. - /// - internal static string bot_TelegramBridge_direction_both { - get { - return ResourceManager.GetString("bot.TelegramBridge.direction.both", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Minecraft. - /// - internal static string bot_TelegramBridge_direction_minecraft { - get { - return ResourceManager.GetString("bot.TelegramBridge.direction.minecraft", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Telegram. - /// - internal static string bot_TelegramBridge_direction_Telegram { - get { - return ResourceManager.GetString("bot.TelegramBridge.direction.Telegram", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Disconnected from from the MCC!. - /// - internal static string bot_TelegramBridge_disconnected { - get { - return ResourceManager.GetString("bot.TelegramBridge.disconnected", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid direction provided! Available directions: both|b, minecraft|mc, telegram|tg|t. Example: "tgbridge direction mc". - /// - internal static string bot_TelegramBridge_invalid_direction { - get { - return ResourceManager.GetString("bot.TelegramBridge.invalid_direction", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to [WARNING] You have not provided any Channel IDs, for "Authorized_Chat_Ids" field, anyone who finds your bot will be able to send messages and commands to it!. - /// - internal static string bot_TelegramBridge_missing_authorized_channels { - get { - return ResourceManager.GetString("bot.TelegramBridge.missing_authorized_channels", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to [WARNING] You have not provided a Channel ID, you will ONLY get replies to commands sent from Telegram!. - /// - internal static string bot_TelegramBridge_missing_channel_id { - get { - return ResourceManager.GetString("bot.TelegramBridge.missing_channel_id", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Please provide a valid bot token!. - /// - internal static string bot_TelegramBridge_missing_token { - get { - return ResourceManager.GetString("bot.TelegramBridge.missing_token", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This command has been disabled due to Telegram caching causing issues, please stop your client manually.. - /// - internal static string bot_TelegramBridge_quit_disabled { - get { - return ResourceManager.GetString("bot.TelegramBridge.quit_disabled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to **🛑 Unauthorized access! 🛑 - /// - ///Add the ID of this chat to "Authorized_Chat_Ids" field in the configuration file to gain access!**. - /// - internal static string bot_TelegramBridge_unauthorized { - get { - return ResourceManager.GetString("bot.TelegramBridge.unauthorized", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to An unknown error has occured!. - /// - internal static string bot_TelegramBridge_unknown_error { - get { - return ResourceManager.GetString("bot.TelegramBridge.unknown_error", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Bot: {0} said : {1}. - /// - internal static string bot_testBot_said { - get { - return ResourceManager.GetString("bot.testBot.said", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Bot: {0} told me : {1}. - /// - internal static string bot_testBot_told { - get { - return ResourceManager.GetString("bot.testBot.told", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to §cFailed to start a server:\n\n{0}\n\n. - /// - internal static string bot_WebSocketBot_failed_to_start_custom { - get { - return ResourceManager.GetString("bot.WebSocketBot.failed_to_start.custom", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to §cFailed to start a server! The provided IP address is not a valid one!. - /// - internal static string bot_WebSocketBot_failed_to_start_ip { - get { - return ResourceManager.GetString("bot.WebSocketBot.failed_to_start.ip", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to §cFailed to start a server! The provided port number {0} is out of the range, it must be 65535 or bellow it!. - /// - internal static string bot_WebSocketBot_failed_to_start_port { - get { - return ResourceManager.GetString("bot.WebSocketBot.failed_to_start.port", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to §bNew session connected: §a{0}. - /// - internal static string bot_WebSocketBot_new_session { - get { - return ResourceManager.GetString("bot.WebSocketBot.new_session", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to §bSession with an id §a{0}§b has been successfully authenticated!. - /// - internal static string bot_WebSocketBot_session_authenticated { - get { - return ResourceManager.GetString("bot.WebSocketBot.session_authenticated", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to §bSession with an id §a{0}§b has disconnected!. - /// - internal static string bot_WebSocketBot_session_disconnected { - get { - return ResourceManager.GetString("bot.WebSocketBot.session_disconnected", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to §bSession with an id §a{0}§b has been renamed to: §a{1}§b!. - /// - internal static string bot_WebSocketBot_session_id_changed { - get { - return ResourceManager.GetString("bot.WebSocketBot.session_id_changed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to §cSession with an id §a{0}§b failed to change the ID to: §c{1}§b!. - /// - internal static string bot_WebSocketBot_session_id_failed_to_change { - get { - return ResourceManager.GetString("bot.WebSocketBot.session_id_failed_to_change", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to §bServer started on ip §a{0}§b port: §a{1}. - /// - internal static string bot_WebSocketBot_started { - get { - return ResourceManager.GetString("bot.WebSocketBot.started", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Starting the Websocket server.... - /// - internal static string bot_WebSocketBot_starting { - get { - return ResourceManager.GetString("bot.WebSocketBot.starting", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Alerts. - /// - internal static string botname_Alerts { - get { - return ResourceManager.GetString("botname.Alerts", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to AntiAFK. - /// - internal static string botname_AntiAFK { - get { - return ResourceManager.GetString("botname.AntiAFK", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to AutoAttack. - /// - internal static string botname_AutoAttack { - get { - return ResourceManager.GetString("botname.AutoAttack", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to AutoCraft. - /// - internal static string botname_AutoCraft { - get { - return ResourceManager.GetString("botname.AutoCraft", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to AutoDig. - /// - internal static string botname_AutoDig { - get { - return ResourceManager.GetString("botname.AutoDig", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to AutoDrop. - /// - internal static string botname_AutoDrop { - get { - return ResourceManager.GetString("botname.AutoDrop", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to AutoEat. - /// - internal static string botname_AutoEat { - get { - return ResourceManager.GetString("botname.AutoEat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to AutoFishing. - /// - internal static string botname_AutoFishing { - get { - return ResourceManager.GetString("botname.AutoFishing", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to AutoRelog. - /// - internal static string botname_AutoRelog { - get { - return ResourceManager.GetString("botname.AutoRelog", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to AutoRespond. - /// - internal static string botname_AutoRespond { - get { - return ResourceManager.GetString("botname.AutoRespond", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ChatLog. - /// - internal static string botname_ChatLog { - get { - return ResourceManager.GetString("botname.ChatLog", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to DiscordBridge. - /// - internal static string botname_DiscordBridge { - get { - return ResourceManager.GetString("botname.DiscordBridge", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to DiscordRpc. - /// - internal static string botname_DiscordRpc { - get { - return ResourceManager.GetString("botname.DiscordRpc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Farmer. - /// - internal static string botname_Farmer { - get { - return ResourceManager.GetString("botname.Farmer", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to FollowPlayer. - /// - internal static string botname_FollowPlayer { - get { - return ResourceManager.GetString("botname.FollowPlayer", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to HangmanGame. - /// - internal static string botname_HangmanGame { - get { - return ResourceManager.GetString("botname.HangmanGame", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Mailer. - /// - internal static string botname_Mailer { - get { - return ResourceManager.GetString("botname.Mailer", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Map. - /// - internal static string botname_Map { - get { - return ResourceManager.GetString("botname.Map", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to PlayerListLogger. - /// - internal static string botname_PlayerListLogger { - get { - return ResourceManager.GetString("botname.PlayerListLogger", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to RemoteControl. - /// - internal static string botname_RemoteControl { - get { - return ResourceManager.GetString("botname.RemoteControl", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ReplayCapture. - /// - internal static string botname_ReplayCapture { - get { - return ResourceManager.GetString("botname.ReplayCapture", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Script. - /// - internal static string botname_Script { - get { - return ResourceManager.GetString("botname.Script", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ScriptScheduler. - /// - internal static string botname_ScriptScheduler { - get { - return ResourceManager.GetString("botname.ScriptScheduler", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to TelegramBridge. - /// - internal static string botname_TelegramBridge { - get { - return ResourceManager.GetString("botname.TelegramBridge", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to TestBot. - /// - internal static string botname_TestBot { - get { - return ResourceManager.GetString("botname.TestBot", resourceCulture); - } - } - - internal static string mcc_banner_classic { - get { - return ResourceManager.GetString("mcc.banner.classic", resourceCulture); - } - } - - internal static string mcc_banner_star_reminder { - get { - return ResourceManager.GetString("mcc.banner.star_reminder", resourceCulture); - } - } - - internal static string mcc_banner_label_mc_versions { - get { - return ResourceManager.GetString("mcc.banner.label_mc_versions", resourceCulture); - } - } - - internal static string mcc_server_info_label_server { - get { - return ResourceManager.GetString("mcc.server_info.label_server", resourceCulture); - } - } - - internal static string mcc_server_info_label_version { - get { - return ResourceManager.GetString("mcc.server_info.label_version", resourceCulture); - } - } - - internal static string mcc_server_info_label_protocol { - get { - return ResourceManager.GetString("mcc.server_info.label_protocol", resourceCulture); - } - } - - internal static string mcc_server_info_label_players { - get { - return ResourceManager.GetString("mcc.server_info.label_players", resourceCulture); - } - } - - internal static string mcc_server_info_label_ping { - get { - return ResourceManager.GetString("mcc.server_info.label_ping", resourceCulture); - } - } - - internal static string mcc_server_info_label_ping_ms { - get { - return ResourceManager.GetString("mcc.server_info.label_ping_ms", resourceCulture); - } - } - - internal static string mcc_server_info_label_connecting_as { - get { - return ResourceManager.GetString("mcc.server_info.label_connecting_as", resourceCulture); - } - } - - internal static string mcc_server_info_label_online { - get { - return ResourceManager.GetString("mcc.server_info.label_online", resourceCulture); - } - } - - internal static string mcc_server_info_sample_more { - get { - return ResourceManager.GetString("mcc.server_info.sample_more", resourceCulture); - } - } - - internal static string mcc_server_info_version_upgrade { - get { - return ResourceManager.GetString("mcc.server_info.version_upgrade", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Converting session cache from disk: {0}. - /// - internal static string cache_converting { - get { - return ResourceManager.GetString("cache.converting", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Ignoring invalid session token line: {0}. - /// - internal static string cache_ignore_line { - get { - return ResourceManager.GetString("cache.ignore_line", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Ignoring invalid profile key token line: {0}. - /// - internal static string cache_ignore_line_keys { - get { - return ResourceManager.GetString("cache.ignore_line_keys", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Ignoring session token string '{0}': {1}. - /// - internal static string cache_ignore_string { - get { - return ResourceManager.GetString("cache.ignore_string", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Ignoring profile key token string '{0}': {1}. - /// - internal static string cache_ignore_string_keys { - get { - return ResourceManager.GetString("cache.ignore_string_keys", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Loaded session: {0}:{1}. - /// - internal static string cache_loaded { - get { - return ResourceManager.GetString("cache.loaded", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Loaded profile key, it will be refresh at {0}. - /// - internal static string cache_loaded_keys { - get { - return ResourceManager.GetString("cache.loaded_keys", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Loading Minecraft profiles: {0}. - /// - internal static string cache_loading { - get { - return ResourceManager.GetString("cache.loading", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Loading profile key cache from disk: {0}. - /// - internal static string cache_loading_keys { - get { - return ResourceManager.GetString("cache.loading_keys", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Loading session cache from disk: {0}. - /// - internal static string cache_loading_session { - get { - return ResourceManager.GetString("cache.loading_session", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Got malformed data while reading serialized session cache from disk: {0}. - /// - internal static string cache_malformed { - get { - return ResourceManager.GetString("cache.malformed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to read serialized session cache from disk: {0}. - /// - internal static string cache_read_fail { - get { - return ResourceManager.GetString("cache.read_fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to read session cache from disk: {0}. - /// - internal static string cache_read_fail_plain { - get { - return ResourceManager.GetString("cache.read_fail_plain", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to read profile key cache from disk: {0}. - /// - internal static string cache_read_fail_plain_keys { - get { - return ResourceManager.GetString("cache.read_fail_plain_keys", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to write session cache to disk: {0}. - /// - internal static string cache_save_fail { - get { - return ResourceManager.GetString("cache.save_fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to write profile key cache to disk: {0}. - /// - internal static string cache_save_fail_keys { - get { - return ResourceManager.GetString("cache.save_fail_keys", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Saving session cache to disk. - /// - internal static string cache_saving { - get { - return ResourceManager.GetString("cache.saving", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Saving profile key cache to disk. - /// - internal static string cache_saving_keys { - get { - return ResourceManager.GetString("cache.saving_keys", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Done. File saved as '{0}'. - /// - internal static string chat_done { - get { - return ResourceManager.GetString("chat.done", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Downloading '{0}.json' from Mojang servers.... - /// - internal static string chat_download { - get { - return ResourceManager.GetString("chat.download", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to download the file.. - /// - internal static string chat_fail { - get { - return ResourceManager.GetString("chat.fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Translations file loaded.. - /// - internal static string chat_loaded { - get { - return ResourceManager.GetString("chat.loaded", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Player {0}'s message chain is broken!. - /// - internal static string chat_message_chain_broken { - get { - return ResourceManager.GetString("chat.message_chain_broken", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Translations file not found: '{0}' - ///Some messages won't be properly printed without this file.. - /// - internal static string chat_not_found { - get { - return ResourceManager.GetString("chat.not_found", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Performing request to {0}. - /// - internal static string chat_request { - get { - return ResourceManager.GetString("chat.request", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to save the file {0}.. - /// - internal static string chat_save_fail { - get { - return ResourceManager.GetString("chat.save_fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Switch to use Minecraft's default language resource "en_us.json".. - /// - internal static string chat_use_default { - get { - return ResourceManager.GetString("chat.use_default", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to [{0}] Disconnecting and Reconnecting to the Server. - /// - internal static string chatbot_reconnect { - get { - return ResourceManager.GetString("chatbot.reconnect", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to . - /// - internal static string ChatBot_WebSocketBot_AllowIpAlias { - get { - return ResourceManager.GetString("ChatBot.WebSocketBot.AllowIpAlias", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to . - /// - internal static string ChatBot_WebSocketBot_DebugMode { - get { - return ResourceManager.GetString("ChatBot.WebSocketBot.DebugMode", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Swing your arm.. - /// - internal static string cmd_animation_desc { - get { - return ResourceManager.GetString("cmd.animation.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Could not find a bed!. - /// - internal static string cmd_bed_bed_not_found { - get { - return ResourceManager.GetString("cmd.bed.bed_not_found", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can not reach the bed safely!. - /// - internal static string cmd_bed_cant_reach_safely { - get { - return ResourceManager.GetString("cmd.bed.cant_reach_safely", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Used to sleep in or leave a bed.. - /// - internal static string cmd_bed_desc { - get { - return ResourceManager.GetString("cmd.bed.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to reach the bed position (X: {0:0.0}, Y: {1:0.0}, Z: {2:0.0}) in time (30 seconds). Giving up!. - /// - internal static string cmd_bed_failed_to_reach_in_time { - get { - return ResourceManager.GetString("cmd.bed.failed_to_reach_in_time", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Found a bed at (X: {0:0.0}, Y: {1:0.0}, Z: {2:0.0}).. - /// - internal static string cmd_bed_found_a_bed_at { - get { - return ResourceManager.GetString("cmd.bed.found_a_bed_at", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Succesfully laid in bed!. - /// - internal static string cmd_bed_in { - get { - return ResourceManager.GetString("cmd.bed.in", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Sending a command to leave a bed to the server.. - /// - internal static string cmd_bed_leaving { - get { - return ResourceManager.GetString("cmd.bed.leaving", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Moving to (X: {0:0.0}, Y: {1:0.0}, Z: {2:0.0}) where the bed is located.. - /// - internal static string cmd_bed_moving { - get { - return ResourceManager.GetString("cmd.bed.moving", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The block on (X: {0:0.0}, Y: {1:0.0}, Z: {2:0.0}) is not a bed!. - /// - internal static string cmd_bed_not_a_bed { - get { - return ResourceManager.GetString("cmd.bed.not_a_bed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Could not lay in bed. Are you trying to sleep in a bed? (PS: You must use the head block coordinates of the bed). - /// - internal static string cmd_bed_not_in { - get { - return ResourceManager.GetString("cmd.bed.not_in", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Searching for a bed in radius of {0:0.00}.... - /// - internal static string cmd_bed_searching { - get { - return ResourceManager.GetString("cmd.bed.searching", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Trying to sleep in a bed on location (X: {0:0.0}, Y: {1:0.0}, Z: {2:0.0}). Result: {3}. - /// - internal static string cmd_bed_trying_to_use { - get { - return ResourceManager.GetString("cmd.bed.trying_to_use", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Blocks around. - /// - internal static string cmd_blockinfo_BlocksAround { - get { - return ResourceManager.GetString("cmd.blockinfo.BlocksAround", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Block type. - /// - internal static string cmd_blockinfo_BlockType { - get { - return ResourceManager.GetString("cmd.blockinfo.BlockType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Reports the type of the block on the provided coordinates. (Use -s to report blocks around the target block).. - /// - internal static string cmd_blockinfo_desc { - get { - return ResourceManager.GetString("cmd.blockinfo.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Negative. - /// - internal static string cmd_blockinfo_Negative { - get { - return ResourceManager.GetString("cmd.blockinfo.Negative", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Positive. - /// - internal static string cmd_blockinfo_Positive { - get { - return ResourceManager.GetString("cmd.blockinfo.Positive", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to List bots, unload a bot or all bots.. - /// - internal static string cmd_bots_desc { - get { - return ResourceManager.GetString("cmd.bots.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Loaded bots. - /// - internal static string cmd_bots_list { - get { - return ResourceManager.GetString("cmd.bots.list", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No bots loaded!. - /// - internal static string cmd_bots_noloaded { - get { - return ResourceManager.GetString("cmd.bots.noloaded", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Bot {0} is not loaded, check if you have made a typo!. - /// - internal static string cmd_bots_notfound { - get { - return ResourceManager.GetString("cmd.bots.notfound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Successfully unloaded bot: {0}. - /// - internal static string cmd_bots_unloaded { - get { - return ResourceManager.GetString("cmd.bots.unloaded", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Successfully unloaded all bots!. - /// - internal static string cmd_bots_unloaded_all { - get { - return ResourceManager.GetString("cmd.bots.unloaded_all", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Changed to slot {0}. - /// - internal static string cmd_changeSlot_changed { - get { - return ResourceManager.GetString("cmd.changeSlot.changed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Change slot in hotbar. - /// - internal static string cmd_changeSlot_desc { - get { - return ResourceManager.GetString("cmd.changeSlot.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Could not change slot. - /// - internal static string cmd_changeSlot_fail { - get { - return ResourceManager.GetString("cmd.changeSlot.fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Could not change slot: Not a Number. - /// - internal static string cmd_changeSlot_nan { - get { - return ResourceManager.GetString("cmd.changeSlot.nan", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to chunk: ({0}, {1}).. - /// - internal static string cmd_chunk_chunk_pos { - get { - return ResourceManager.GetString("cmd.chunk.chunk_pos", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Current location:{0}, chunk: ({1}, {2}).. - /// - internal static string cmd_chunk_current { - get { - return ResourceManager.GetString("cmd.chunk.current", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Displays the chunk loading status. - ///Change EnableEmoji=false in the settings if the display is confusing.. - /// - internal static string cmd_chunk_desc { - get { - return ResourceManager.GetString("cmd.chunk.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This command is used for debugging, make sure you know what you are doing.. - /// - internal static string cmd_chunk_for_debug { - get { - return ResourceManager.GetString("cmd.chunk.for_debug", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Player:{0}, MarkedChunk:{1}, NotReceived:{2}, Loading:{3}, Loaded:{4}. - /// - internal static string cmd_chunk_icon { - get { - return ResourceManager.GetString("cmd.chunk.icon", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Marked location: . - /// - internal static string cmd_chunk_marked { - get { - return ResourceManager.GetString("cmd.chunk.marked", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Since the marked chunk is outside the graph, it will not be displayed!. - /// - internal static string cmd_chunk_outside { - get { - return ResourceManager.GetString("cmd.chunk.outside", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to connect to the specified server.. - /// - internal static string cmd_connect_desc { - get { - return ResourceManager.GetString("cmd.connect.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid server IP '{0}'.. - /// - internal static string cmd_connect_invalid_ip { - get { - return ResourceManager.GetString("cmd.connect.invalid_ip", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unknown account '{0}'.. - /// - internal static string cmd_connect_unknown { - get { - return ResourceManager.GetString("cmd.connect.unknown", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to clear the console output.. - /// - internal static string cmd_clear_console_desc { - get { - return ResourceManager.GetString("cmd.clear_console.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to toggle chat visibility in the console.. - /// - internal static string cmd_console_chat_desc { - get { - return ResourceManager.GetString("cmd.console_chat.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Console chat output is now hidden.. - /// - internal static string cmd_console_chat_state_off { - get { - return ResourceManager.GetString("cmd.console_chat.state_off", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Console chat output is now visible.. - /// - internal static string cmd_console_chat_state_on { - get { - return ResourceManager.GetString("cmd.console_chat.state_on", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to toggle debug messages.. - /// - internal static string cmd_debug_desc { - get { - return ResourceManager.GetString("cmd.debug.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Debug messages are now OFF. - /// - internal static string cmd_debug_state_off { - get { - return ResourceManager.GetString("cmd.debug.state_off", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Debug messages are now ON. - /// - internal static string cmd_debug_state_on { - get { - return ResourceManager.GetString("cmd.debug.state_on", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cancel mining the block located at {0}.. - /// - internal static string cmd_dig_cancel { - get { - return ResourceManager.GetString("cmd.dig.cancel", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Attempt to break a block. - /// - internal static string cmd_dig_desc { - get { - return ResourceManager.GetString("cmd.dig.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Attempting to dig block at {0} {1} {2} ({3}). - /// - internal static string cmd_dig_dig { - get { - return ResourceManager.GetString("cmd.dig.dig", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Mining of the block located at {0} ends.. - /// - internal static string cmd_dig_end { - get { - return ResourceManager.GetString("cmd.dig.end", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to start digging block.. - /// - internal static string cmd_dig_fail { - get { - return ResourceManager.GetString("cmd.dig.fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No block at this location (Air). - /// - internal static string cmd_dig_no_block { - get { - return ResourceManager.GetString("cmd.dig.no_block", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You are too far away from this block.. - /// - internal static string cmd_dig_too_far { - get { - return ResourceManager.GetString("cmd.dig.too_far", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Drop specified type of items from player inventory or opened container. - /// - internal static string cmd_dropItem_desc { - get { - return ResourceManager.GetString("cmd.dropItem.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Dropped all {0} from inventory #{1}. - /// - internal static string cmd_dropItem_dropped { - get { - return ResourceManager.GetString("cmd.dropItem.dropped", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unknown item {0}. - /// - internal static string cmd_dropItem_unknown_item { - get { - return ResourceManager.GetString("cmd.dropItem.unknown_item", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Sent a click to the server, if you have enough levels and if you have placed the items in the correct slots it should enchant!. - /// - internal static string cmd_enchant_clicked { - get { - return ResourceManager.GetString("cmd.enchant.clicked", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Enchant an item when you have the Enchantment table opened and the list of enchants recieved.. - /// - internal static string cmd_enchant_desc { - get { - return ResourceManager.GetString("cmd.enchant.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You must put an item inside the enchanting table in slot 0!. - /// - internal static string cmd_enchant_enchanting_no_item { - get { - return ResourceManager.GetString("cmd.enchant.enchanting_no_item", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You must put at least 3 lapis lazuli inside the enchanting table in slot 1!. - /// - internal static string cmd_enchant_enchanting_no_lapis { - get { - return ResourceManager.GetString("cmd.enchant.enchanting_no_lapis", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You must open a an enchanting table in order to use this option!. - /// - internal static string cmd_enchant_enchanting_table_not_opened { - get { - return ResourceManager.GetString("cmd.enchant.enchanting_table_not_opened", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid slot provided (Available: top, middle, bottom)!. - /// - internal static string cmd_enchant_invalid_slot { - get { - return ResourceManager.GetString("cmd.enchant.invalid_slot", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You must first put an item to enchant to the enchanting table in order to get enchantments from the server, then you can execute this command!. - /// - internal static string cmd_enchant_no_enchantments { - get { - return ResourceManager.GetString("cmd.enchant.no_enchantments", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You do not have enouhg levels to enchant! (Your current level is {0}, you need to be level {1}).. - /// - internal static string cmd_enchant_no_levels { - get { - return ResourceManager.GetString("cmd.enchant.no_levels", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Could not click!. - /// - internal static string cmd_enchant_not_clicked { - get { - return ResourceManager.GetString("cmd.enchant.not_clicked", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Entity attacked. - /// - internal static string cmd_entityCmd_attacked { - get { - return ResourceManager.GetString("cmd.entityCmd.attacked", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Boots. - /// - internal static string cmd_entityCmd_boots { - get { - return ResourceManager.GetString("cmd.entityCmd.boots", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Chestplate. - /// - internal static string cmd_entityCmd_chestplate { - get { - return ResourceManager.GetString("cmd.entityCmd.chestplate", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Custom Name. - /// - internal static string cmd_entityCmd_customname { - get { - return ResourceManager.GetString("cmd.entityCmd.customname", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Distance. - /// - internal static string cmd_entityCmd_distance { - get { - return ResourceManager.GetString("cmd.entityCmd.distance", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Entities. - /// - internal static string cmd_entityCmd_entities { - get { - return ResourceManager.GetString("cmd.entityCmd.entities", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Entity. - /// - internal static string cmd_entityCmd_entity { - get { - return ResourceManager.GetString("cmd.entityCmd.entity", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Equipment. - /// - internal static string cmd_entityCmd_equipment { - get { - return ResourceManager.GetString("cmd.entityCmd.equipment", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Health. - /// - internal static string cmd_entityCmd_health { - get { - return ResourceManager.GetString("cmd.entityCmd.health", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Helmet. - /// - internal static string cmd_entityCmd_helmet { - get { - return ResourceManager.GetString("cmd.entityCmd.helmet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Item. - /// - internal static string cmd_entityCmd_item { - get { - return ResourceManager.GetString("cmd.entityCmd.item", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Latency. - /// - internal static string cmd_entityCmd_latency { - get { - return ResourceManager.GetString("cmd.entityCmd.latency", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Leggings. - /// - internal static string cmd_entityCmd_leggings { - get { - return ResourceManager.GetString("cmd.entityCmd.leggings", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Location. - /// - internal static string cmd_entityCmd_location { - get { - return ResourceManager.GetString("cmd.entityCmd.location", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Main Hand. - /// - internal static string cmd_entityCmd_mainhand { - get { - return ResourceManager.GetString("cmd.entityCmd.mainhand", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Nickname. - /// - internal static string cmd_entityCmd_nickname { - get { - return ResourceManager.GetString("cmd.entityCmd.nickname", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Entity not found. - /// - internal static string cmd_entityCmd_not_found { - get { - return ResourceManager.GetString("cmd.entityCmd.not_found", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Off Hand. - /// - internal static string cmd_entityCmd_offhand { - get { - return ResourceManager.GetString("cmd.entityCmd.offhand", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Pose. - /// - internal static string cmd_entityCmd_pose { - get { - return ResourceManager.GetString("cmd.entityCmd.pose", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type. - /// - internal static string cmd_entityCmd_type { - get { - return ResourceManager.GetString("cmd.entityCmd.type", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Entity used. - /// - internal static string cmd_entityCmd_used { - get { - return ResourceManager.GetString("cmd.entityCmd.used", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Allows you to execute a command if a condition is met. (You can use variables from MinecraftClient.ini and /set command, as well as CSharp expressions). - /// - internal static string cmd_execif_desc { - get { - return ResourceManager.GetString("cmd.execif.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Error: {0}. - /// - internal static string cmd_execif_error { - get { - return ResourceManager.GetString("cmd.execif.error", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to An error has occured while executing the command: {0}. - /// - internal static string cmd_execif_error_occured { - get { - return ResourceManager.GetString("cmd.execif.error_occured", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The condition '{0}' was met, executed command '{1}' with result '{2}'.. - /// - internal static string cmd_execif_executed { - get { - return ResourceManager.GetString("cmd.execif.executed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The condition '{0}' was met, executed command '{1}', no result was returned.. - /// - internal static string cmd_execif_executed_no_output { - get { - return ResourceManager.GetString("cmd.execif.executed_no_output", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Execute multiple commands one after another. - /// - internal static string cmd_execmulti_desc { - get { - return ResourceManager.GetString("cmd.execmulti.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Executed the command '{0}' with {1}. - /// - internal static string cmd_execmulti_executed { - get { - return ResourceManager.GetString("cmd.execmulti.executed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to no result!. - /// - internal static string cmd_execmulti_no_result { - get { - return ResourceManager.GetString("cmd.execmulti.no_result", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You can not use execmulti or execif within execmulti command!. - /// - internal static string cmd_execmulti_prevent { - get { - return ResourceManager.GetString("cmd.execmulti.prevent", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to result '{0}'!. - /// - internal static string cmd_execmulti_result { - get { - return ResourceManager.GetString("cmd.execmulti.result", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to disconnect from the server.. - /// - internal static string cmd_exit_desc { - get { - return ResourceManager.GetString("cmd.exit.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Already following {0}!. - /// - internal static string cmd_follow_already_following { - get { - return ResourceManager.GetString("cmd.follow.already_following", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Already stopped. - /// - internal static string cmd_follow_already_stopped { - get { - return ResourceManager.GetString("cmd.follow.already_stopped", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Can not reach the player, he is either in chunks that are not loaded, too far away or not reachable by a bot due to obstacles like gaps or water bodies!. - /// - internal static string cmd_follow_cant_reach_player { - get { - return ResourceManager.GetString("cmd.follow.cant_reach_player", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Makes the bot follow a specified player. - /// - internal static string cmd_follow_desc { - get { - return ResourceManager.GetString("cmd.follow.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid or empty player name provided!. - /// - internal static string cmd_follow_invalid_name { - get { - return ResourceManager.GetString("cmd.follow.invalid_name", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The specified player is either not connected out out of the range!. - /// - internal static string cmd_follow_invalid_player { - get { - return ResourceManager.GetString("cmd.follow.invalid_player", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to NOTE: The bot is quite slow, you need to walk slowly and at a close distance for it to be able to keep up, kinda like when you make animals follow you by holding food in your hand. This is a limitation due to a pathfinding algorithm, we are working to get a better one.. - /// - internal static string cmd_follow_note { - get { - return ResourceManager.GetString("cmd.follow.note", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Pausing!. - /// - internal static string cmd_follow_pausing { - get { - return ResourceManager.GetString("cmd.follow.pausing", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The player {0} came back to the range!. - /// - internal static string cmd_follow_player_came_to_the_range { - get { - return ResourceManager.GetString("cmd.follow.player_came_to_the_range", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The player {0} left the server!. - /// - internal static string cmd_follow_player_left { - get { - return ResourceManager.GetString("cmd.follow.player_left", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The player {0} has left the range!. - /// - internal static string cmd_follow_player_left_the_range { - get { - return ResourceManager.GetString("cmd.follow.player_left_the_range", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Resuming to follow!. - /// - internal static string cmd_follow_resuming { - get { - return ResourceManager.GetString("cmd.follow.resuming", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Started following {0}!. - /// - internal static string cmd_follow_started { - get { - return ResourceManager.GetString("cmd.follow.started", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Stopped following!. - /// - internal static string cmd_follow_stopping { - get { - return ResourceManager.GetString("cmd.follow.stopping", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Switched to following {0}!. - /// - internal static string cmd_follow_switched { - get { - return ResourceManager.GetString("cmd.follow.switched", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Enabled us-safe walking (NOTE: The bot might die or get hurt!). - /// - internal static string cmd_follow_unsafe_enabled { - get { - return ResourceManager.GetString("cmd.follow.unsafe_enabled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to follow <player name|stop> [-f] (Use -f to enable un-safe walking). - /// - internal static string cmd_follow_usage { - get { - return ResourceManager.GetString("cmd.follow.usage", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to list your currently active effects.. - /// - internal static string cmd_effects_desc { - get { - return ResourceManager.GetString("cmd.effects.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to - {0} ({1}). - /// - internal static string cmd_effects_entry { - get { - return ResourceManager.GetString("cmd.effects.entry", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Active effects:. - /// - internal static string cmd_effects_header { - get { - return ResourceManager.GetString("cmd.effects.header", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No active effects.. - /// - internal static string cmd_effects_none { - get { - return ResourceManager.GetString("cmd.effects.none", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to quickly enable recommended features.. - /// - internal static string cmd_tryout_desc { - get { - return ResourceManager.GetString("cmd.tryout.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Available quick actions:. - /// - internal static string cmd_tryout_list_header { - get { - return ResourceManager.GetString("cmd.tryout.list.header", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to tui: set [Console.General] ConsoleMode = "tui" for the next restart.. - /// - internal static string cmd_tryout_list_tui { - get { - return ResourceManager.GetString("cmd.tryout.list.tui", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to [Console.General] ConsoleMode is already "tui" in the config. To switch back, set [Console.General] ConsoleMode = "classic". Restart MCC after changing it for the new mode to take effect.. - /// - internal static string cmd_tryout_tui_already_enabled { - get { - return ResourceManager.GetString("cmd.tryout.tui.already_enabled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Updated [Console.General] ConsoleMode from "{0}" to "{1}" in the config. To switch back, set [Console.General] ConsoleMode = "classic". Restart MCC to apply the change.. - /// - internal static string cmd_tryout_tui_enabled { - get { - return ResourceManager.GetString("cmd.tryout.tui.enabled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Display Health and Food saturation.. - /// - internal static string cmd_health_desc { - get { - return ResourceManager.GetString("cmd.health.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Health: {0}, Saturation: {1}, Level: {2}, TotalExperience: {3}. - /// - internal static string cmd_health_response { - get { - return ResourceManager.GetString("cmd.health.response", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} clicking slot {1} in window #{2}. - /// - internal static string cmd_inventory_clicking { - get { - return ResourceManager.GetString("cmd.inventory.clicking", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Closing Inventoy #{0}. - /// - internal static string cmd_inventory_close { - get { - return ResourceManager.GetString("cmd.inventory.close", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to close Inventory #{0}. - /// - internal static string cmd_inventory_close_fail { - get { - return ResourceManager.GetString("cmd.inventory.close_fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot find container, please retry with explicit ID. - /// - internal static string cmd_inventory_container_not_found { - get { - return ResourceManager.GetString("cmd.inventory.container_not_found", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Requested to clear slot #{0}. - /// - internal static string cmd_inventory_creative_delete { - get { - return ResourceManager.GetString("cmd.inventory.creative_delete", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Requested {0} x{1} in slot #{2}. - /// - internal static string cmd_inventory_creative_done { - get { - return ResourceManager.GetString("cmd.inventory.creative_done", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to request Creative action. - /// - internal static string cmd_inventory_creative_fail { - get { - return ResourceManager.GetString("cmd.inventory.creative_fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Damage. - /// - internal static string cmd_inventory_damage { - get { - return ResourceManager.GetString("cmd.inventory.damage", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Inventory command. - /// - internal static string cmd_inventory_desc { - get { - return ResourceManager.GetString("cmd.inventory.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Dropped 1 item from slot #{0}. - /// - internal static string cmd_inventory_drop { - get { - return ResourceManager.GetString("cmd.inventory.drop", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Dropped whole item stack from slot #{0}. - /// - internal static string cmd_inventory_drop_stack { - get { - return ResourceManager.GetString("cmd.inventory.drop_stack", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Found items. - /// - internal static string cmd_inventory_found_items { - get { - return ResourceManager.GetString("cmd.inventory.found_items", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Available actions. - /// - internal static string cmd_inventory_help_available { - get { - return ResourceManager.GetString("cmd.inventory.help.available", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Basic usage. - /// - internal static string cmd_inventory_help_basic { - get { - return ResourceManager.GetString("cmd.inventory.help.basic", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Click on an item.. - /// - internal static string cmd_inventory_help_click { - get { - return ResourceManager.GetString("cmd.inventory.help.click", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Close an opened container.. - /// - internal static string cmd_inventory_help_close { - get { - return ResourceManager.GetString("cmd.inventory.help.close", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Clear slot in creative mode.. - /// - internal static string cmd_inventory_help_creativedelete { - get { - return ResourceManager.GetString("cmd.inventory.help.creativedelete", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Give item in creative mode.. - /// - internal static string cmd_inventory_help_creativegive { - get { - return ResourceManager.GetString("cmd.inventory.help.creativegive", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Drop an item from inventory.. - /// - internal static string cmd_inventory_help_drop { - get { - return ResourceManager.GetString("cmd.inventory.help.drop", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} - ///Use '/inventory help <action>' for action help. - ///'player' and 'container' can be simplified to 'p' and 'c'. - ///Note that parameters in '[]' are optional.. - /// - internal static string cmd_inventory_help_help { - get { - return ResourceManager.GetString("cmd.inventory.help.help", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to List avaliable inventories. - /// - internal static string cmd_inventory_help_inventories { - get { - return ResourceManager.GetString("cmd.inventory.help.inventories", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to List your inventory.. - /// - internal static string cmd_inventory_help_list { - get { - return ResourceManager.GetString("cmd.inventory.help.list", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Search for an item in avaliable Inventories. - /// - internal static string cmd_inventory_help_search { - get { - return ResourceManager.GetString("cmd.inventory.help.search", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Shift click an item.. - /// - internal static string cmd_inventory_help_shiftclick { - get { - return ResourceManager.GetString("cmd.inventory.help.shiftclick", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unknown action.. - /// - internal static string cmd_inventory_help_unknown { - get { - return ResourceManager.GetString("cmd.inventory.help.unknown", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Usage. - /// - internal static string cmd_inventory_help_usage { - get { - return ResourceManager.GetString("cmd.inventory.help.usage", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Your selected hotbar is {0}. - /// - internal static string cmd_inventory_hotbar { - get { - return ResourceManager.GetString("cmd.inventory.hotbar", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Inventories. - /// - internal static string cmd_inventory_inventories { - get { - return ResourceManager.GetString("cmd.inventory.inventories", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Available Inventories. - /// - internal static string cmd_inventory_inventories_available { - get { - return ResourceManager.GetString("cmd.inventory.inventories_available", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Inventory. - /// - internal static string cmd_inventory_inventory { - get { - return ResourceManager.GetString("cmd.inventory.inventory", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Left. - /// - internal static string cmd_inventory_left { - get { - return ResourceManager.GetString("cmd.inventory.left", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Middle. - /// - internal static string cmd_inventory_middle { - get { - return ResourceManager.GetString("cmd.inventory.middle", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You must be in Creative gamemode. - /// - internal static string cmd_inventory_need_creative { - get { - return ResourceManager.GetString("cmd.inventory.need_creative", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Could not find the specified item in any of avaliable Inventories!. - /// - internal static string cmd_inventory_no_found_items { - get { - return ResourceManager.GetString("cmd.inventory.no_found_items", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No item in slot #{0}. - /// - internal static string cmd_inventory_no_item { - get { - return ResourceManager.GetString("cmd.inventory.no_item", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Inventory #{0} do not exist. - /// - internal static string cmd_inventory_not_exist { - get { - return ResourceManager.GetString("cmd.inventory.not_exist", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Right. - /// - internal static string cmd_inventory_right { - get { - return ResourceManager.GetString("cmd.inventory.right", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Shift. - /// - internal static string cmd_inventory_shiftclick { - get { - return ResourceManager.GetString("cmd.inventory.shiftclick", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Shift click failed, this may be because this container type is not supported. - /// - internal static string cmd_inventory_shiftclick_fail { - get { - return ResourceManager.GetString("cmd.inventory.shiftclick_fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Shift right. - /// - internal static string cmd_inventory_shiftrightclick { - get { - return ResourceManager.GetString("cmd.inventory.shiftrightclick", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Already collecting items!. - /// - internal static string cmd_items_collector_already_collecting { - get { - return ResourceManager.GetString("cmd.items.collector.already.collecting", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Already not collecting items!. - /// - internal static string cmd_items_collector_already_not_collecting { - get { - return ResourceManager.GetString("cmd.items.collector.already.not.collecting", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Collect items on the ground. - /// - internal static string cmd_items_collector_desc { - get { - return ResourceManager.GetString("cmd.items.collector.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Started collecting items!. - /// - internal static string cmd_items_collector_started { - get { - return ResourceManager.GetString("cmd.items.collector.started", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Stopped collecting items.. - /// - internal static string cmd_items_collector_stopped { - get { - return ResourceManager.GetString("cmd.items.collector.stopped", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Stopping item collection.... - /// - internal static string cmd_items_collector_stopping { - get { - return ResourceManager.GetString("cmd.items.collector.stopping", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to itemscollector <start/stop>. - /// - internal static string cmd_items_collector_usage { - get { - return ResourceManager.GetString("cmd.items.collector.usage", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to get the player list.. - /// - internal static string cmd_list_desc { - get { - return ResourceManager.GetString("cmd.list.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to PlayerList: {0}. - /// - internal static string cmd_list_players { - get { - return ResourceManager.GetString("cmd.list.players", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to show a vanilla-like tab list. In TUI mode, opens a live overlay.. - /// - internal static string cmd_tab_desc { - get { - return ResourceManager.GetString("cmd.tab.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No listed players are currently tracked.. - /// - internal static string cmd_tab_no_players { - get { - return ResourceManager.GetString("cmd.tab.no_players", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Tab list ({0} players). - /// - internal static string cmd_tab_title { - get { - return ResourceManager.GetString("cmd.tab.title", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Ping. - /// - internal static string cmd_tab_column_ping { - get { - return ResourceManager.GetString("cmd.tab.column_ping", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Team. - /// - internal static string cmd_tab_column_team { - get { - return ResourceManager.GetString("cmd.tab.column_team", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Player. - /// - internal static string cmd_tab_column_player { - get { - return ResourceManager.GetString("cmd.tab.column_player", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Live tab overlay opened.. - /// - internal static string cmd_tab_tui_opened { - get { - return ResourceManager.GetString("cmd.tab.tui_opened", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The tab overlay is not available right now.. - /// - internal static string cmd_tab_tui_unavailable { - get { - return ResourceManager.GetString("cmd.tab.tui_unavailable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to log some text to the console.. - /// - internal static string cmd_log_desc { - get { - return ResourceManager.GetString("cmd.log.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Looking at yaw: {0} pitch: {1}. - /// - internal static string cmd_look_at { - get { - return ResourceManager.GetString("cmd.look.at", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Looking at {0}. - /// - internal static string cmd_look_block { - get { - return ResourceManager.GetString("cmd.look.block", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to look at direction or coordinates.. - /// - internal static string cmd_look_desc { - get { - return ResourceManager.GetString("cmd.look.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The block currently intersecting the line of sight is {0} ({1:0}, {2:0}, {3:0}), distance is {4:0.0}({5:0.0}).. - /// - internal static string cmd_look_inspection { - get { - return ResourceManager.GetString("cmd.look.inspection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to There is no block within {0} meters that intersects with the line of sight.. - /// - internal static string cmd_look_noinspection { - get { - return ResourceManager.GetString("cmd.look.noinspection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unknown direction '{0}'. - /// - internal static string cmd_look_unknown { - get { - return ResourceManager.GetString("cmd.look.unknown", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Chunk loading status: {0:P} - {1} out of {2} load completed.. - /// - internal static string cmd_move_chunk_loading_status { - get { - return ResourceManager.GetString("cmd.move.chunk_loading_status", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The chunk where the target location resides has not yet been loaded. - ///You can use "/chunk status {0:0.0} {1:0.0} {2:0.0}" to check the chunk loading status.. - /// - internal static string cmd_move_chunk_not_loaded { - get { - return ResourceManager.GetString("cmd.move.chunk_not_loaded", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to walk or start walking.. - /// - internal static string cmd_move_desc { - get { - return ResourceManager.GetString("cmd.move.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to force unsafe movements like falling or touching fire. - /// - internal static string cmd_move_desc_force { - get { - return ResourceManager.GetString("cmd.move.desc_force", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot move in that direction.. - /// - internal static string cmd_move_dir_fail { - get { - return ResourceManager.GetString("cmd.move.dir_fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Disabling Terrain and Movements.. - /// - internal static string cmd_move_disable { - get { - return ResourceManager.GetString("cmd.move.disable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Enabling Terrain and Movements on next server login, respawn or world change.. - /// - internal static string cmd_move_enable { - get { - return ResourceManager.GetString("cmd.move.enable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to compute path to {0}. - /// - internal static string cmd_move_fail { - get { - return ResourceManager.GetString("cmd.move.fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Gravity is disabled.. - /// - internal static string cmd_move_gravity_disabled { - get { - return ResourceManager.GetString("cmd.move.gravity.disabled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Gravity is enabled.. - /// - internal static string cmd_move_gravity_enabled { - get { - return ResourceManager.GetString("cmd.move.gravity.enabled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Moving {0}. - /// - internal static string cmd_move_moving { - get { - return ResourceManager.GetString("cmd.move.moving", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to compute a safe path to {0}. Try -f parameter to allow unsafe movements.. - /// - internal static string cmd_move_suggestforce { - get { - return ResourceManager.GetString("cmd.move.suggestforce", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Walking from {1} to {0}. - /// - internal static string cmd_move_walk { - get { - return ResourceManager.GetString("cmd.move.walk", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Set an item name when an Anvil inventory is active and the item is in the first slot.. - /// - internal static string cmd_nameitem_desc { - get { - return ResourceManager.GetString("cmd.nameitem.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to send the packet for naming an item, try again!. - /// - internal static string cmd_nameitem_failed { - get { - return ResourceManager.GetString("cmd.nameitem.failed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You need to place an item in the first slot (slot id: 0) of the Anvil inventory!. - /// - internal static string cmd_nameitem_first_slot_empty { - get { - return ResourceManager.GetString("cmd.nameitem.first.slot.empty", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The item name cannot be empty!. - /// - internal static string cmd_nameitem_item_name_empty { - get { - return ResourceManager.GetString("cmd.nameitem.item.name.empty", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You need to have an Anvil inventory opened and active in order to use this command!. - /// - internal static string cmd_nameitem_no_anvil_inventory_open { - get { - return ResourceManager.GetString("cmd.nameitem.no.anvil.inventory.open", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Successfully sent the item name to the server, you can now click on the slot number 2 in the Anvil inventory to rename the item.. - /// - internal static string cmd_nameitem_successful { - get { - return ResourceManager.GetString("cmd.nameitem.successful", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to send recipe book craft request for {0}.. - /// - internal static string cmd_recipebook_craft_failed { - get { - return ResourceManager.GetString("cmd.recipebook.craft.failed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Requested recipe {0}.. - /// - internal static string cmd_recipebook_craft_sent { - get { - return ResourceManager.GetString("cmd.recipebook.craft.sent", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Requested recipe {0} with craft-all.. - /// - internal static string cmd_recipebook_craftall_sent { - get { - return ResourceManager.GetString("cmd.recipebook.craftall.sent", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to List unlocked recipe book recipes and craft them through the active recipe book inventory.. - /// - internal static string cmd_recipebook_desc { - get { - return ResourceManager.GetString("cmd.recipebook.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unlocked recipe book recipes. - /// - internal static string cmd_recipebook_list { - get { - return ResourceManager.GetString("cmd.recipebook.list", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You need an active player crafting grid, crafting table, furnace, blast furnace, smoker, or stonecutter inventory.. - /// - internal static string cmd_recipebook_no_active_inventory { - get { - return ResourceManager.GetString("cmd.recipebook.no.active.inventory", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No unlocked recipe book recipes are currently tracked.. - /// - internal static string cmd_recipebook_no_recipes { - get { - return ResourceManager.GetString("cmd.recipebook.no.recipes", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The recipe identifier cannot be empty.. - /// - internal static string cmd_recipebook_recipe_id_empty { - get { - return ResourceManager.GetString("cmd.recipebook.recipe.id.empty", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Recipe book crafting is only supported on Minecraft 1.13 and newer.. - /// - internal static string cmd_recipebook_unsupported { - get { - return ResourceManager.GetString("cmd.recipebook.unsupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to restart and reconnect to the server.. - /// - internal static string cmd_reco_desc { - get { - return ResourceManager.GetString("cmd.reco.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Reloads MCC settings.. - /// - internal static string cmd_reload_desc { - get { - return ResourceManager.GetString("cmd.reload.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Reloaded Settings!. - /// - internal static string cmd_reload_finished { - get { - return ResourceManager.GetString("cmd.reload.finished", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Reloading settings.... - /// - internal static string cmd_reload_started { - get { - return ResourceManager.GetString("cmd.reload.started", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This command will NOT affect certain settings which are used before connecting to a server!. - /// - internal static string cmd_reload_warning1 { - get { - return ResourceManager.GetString("cmd.reload.warning1", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Some settings passed through the command line parameters might get overriden!. - /// - internal static string cmd_reload_warning2 { - get { - return ResourceManager.GetString("cmd.reload.warning2", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You also might need to reconnect for some settings to take effect.. - /// - internal static string cmd_reload_warning3 { - get { - return ResourceManager.GetString("cmd.reload.warning3", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Replay Chat Bot will not be hard reloaded due to technical limitations!. - /// - internal static string cmd_reload_warning4 { - get { - return ResourceManager.GetString("cmd.reload.warning4", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use this to respawn if you are dead.. - /// - internal static string cmd_respawn_desc { - get { - return ResourceManager.GetString("cmd.respawn.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You have respawned.. - /// - internal static string cmd_respawn_done { - get { - return ResourceManager.GetString("cmd.respawn.done", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to run a script file.. - /// - internal static string cmd_script_desc { - get { - return ResourceManager.GetString("cmd.script.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to send a chat message or command.. - /// - internal static string cmd_send_desc { - get { - return ResourceManager.GetString("cmd.send.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to set a custom %variable%.. - /// - internal static string cmd_set_desc { - get { - return ResourceManager.GetString("cmd.set.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to variable name must be A-Za-z0-9.. - /// - internal static string cmd_set_format { - get { - return ResourceManager.GetString("cmd.set.format", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to set a custom %variable% randomly to a given value.. - /// - internal static string cmd_setrnd_desc { - get { - return ResourceManager.GetString("cmd.setrnd.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to setrnd variable -7 to 17 OR setrnd variable string1 "\"string2\" string3". - /// - internal static string cmd_setrnd_format { - get { - return ResourceManager.GetString("cmd.setrnd.format", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to setrnd variable -7 to 17. - /// - internal static string cmd_setrndnum_format { - get { - return ResourceManager.GetString("cmd.setrndnum.format", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to setrnd variable string1 "\"string2\" string3". - /// - internal static string cmd_setrndstr_format { - get { - return ResourceManager.GetString("cmd.setrndstr.format", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Toggles sneaking. - /// - internal static string cmd_sneak_desc { - get { - return ResourceManager.GetString("cmd.sneak.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You are not sneaking anymore. - /// - internal static string cmd_sneak_off { - get { - return ResourceManager.GetString("cmd.sneak.off", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You are sneaking now. - /// - internal static string cmd_sneak_on { - get { - return ResourceManager.GetString("cmd.sneak.on", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Current tps. - /// - internal static string cmd_tps_current { - get { - return ResourceManager.GetString("cmd.tps.current", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Display server current tps (tick per second). May not be accurate. - /// - internal static string cmd_tps_desc { - get { - return ResourceManager.GetString("cmd.tps.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to List all scoreboard teams and their members. - /// - internal static string cmd_teams_desc { - get { - return ResourceManager.GetString("cmd.teams.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No teams are currently tracked. - /// - internal static string cmd_teams_no_teams { - get { - return ResourceManager.GetString("cmd.teams.no_teams", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Team '{0}' (display: {1}, ...). - /// - internal static string cmd_teams_team_header { - get { - return ResourceManager.GetString("cmd.teams.team_header", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Members ({0}): {1}. - /// - internal static string cmd_teams_team_members { - get { - return ResourceManager.GetString("cmd.teams.team_members", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No members. - /// - internal static string cmd_teams_team_no_members { - get { - return ResourceManager.GetString("cmd.teams.team_no_members", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Place a block or open chest. - /// - internal static string cmd_useblock_desc { - get { - return ResourceManager.GetString("cmd.useblock.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Useblock at ({0:0.0}, {1:0.0}, {2:0.0}) {3}.. - /// - internal static string cmd_useblock_use { - get { - return ResourceManager.GetString("cmd.useblock.use", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use the item in your hand, optionally on a specific block. - /// - internal static string cmd_useitem_desc { - get { - return ResourceManager.GetString("cmd.useitem.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Used an item. - /// - internal static string cmd_useitem_use { - get { - return ResourceManager.GetString("cmd.useitem.use", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Minimum number that you have provided is bigger than the maximum, swapping them around!. - /// - internal static string cmd_wait_random_min_bigger { - get { - return ResourceManager.GetString("cmd.wait.random.min.bigger", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to write to backup file {0}. - /// - internal static string config_backup_fail { - get { - return ResourceManager.GetString("config.backup.fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The color code {1} in {0} is in illegal format and the default value has been restored.. - /// - internal static string config_commandsuggestion_illegal_color { - get { - return ResourceManager.GetString("config.commandsuggestion.illegal_color", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Settings have been loaded from {0}. - /// - internal static string config_load { - get { - return ResourceManager.GetString("config.load", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to load settings:. - /// - internal static string config_load_fail { - get { - return ResourceManager.GetString("config.load.fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The language code is invalid!. - /// - internal static string config_Main_Advanced_language_invaild { - get { - return ResourceManager.GetString("config.Main.Advanced.language.invaild", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The current setting is saved as {0}. - /// - internal static string config_saving { - get { - return ResourceManager.GetString("config.saving", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to write to settings file {0}. - /// - internal static string config_write_fail { - get { - return ResourceManager.GetString("config.write.fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Color test: Your terminal should display {0}. - /// - internal static string debug_color_test { - get { - return ResourceManager.GetString("debug.color_test", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Crypto keys & hash generated.. - /// - internal static string debug_crypto { - get { - return ResourceManager.GetString("debug.crypto", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No profile keys could be loaded from disk. - /// - internal static string debug_keys_cache_fail { - get { - return ResourceManager.GetString("debug.keys_cache_fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Profile keys has been successfully loaded from disk.. - /// - internal static string debug_keys_cache_ok { - get { - return ResourceManager.GetString("debug.keys_cache_ok", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Performing request to {0}. - /// - internal static string debug_request { - get { - return ResourceManager.GetString("debug.request", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No sessions could be loaded from disk. - /// - internal static string debug_session_cache_fail { - get { - return ResourceManager.GetString("debug.session_cache_fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Session data has been successfully loaded from disk.. - /// - internal static string debug_session_cache_ok { - get { - return ResourceManager.GetString("debug.session_cache_ok", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Success. (session ID: {0}). - /// - internal static string debug_session_id { - get { - return ResourceManager.GetString("debug.session_id", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Bottom slot. - /// - internal static string Enchantment_bottom_slot { - get { - return ResourceManager.GetString("Enchantment.bottom_slot", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Enchantments available. - /// - internal static string Enchantment_enchantments_available { - get { - return ResourceManager.GetString("Enchantment.enchantments_available", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Levels. - /// - internal static string Enchantment_levels { - get { - return ResourceManager.GetString("Enchantment.levels", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Middle slot. - /// - internal static string Enchantment_middle_slot { - get { - return ResourceManager.GetString("Enchantment.middle_slot", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Top slot. - /// - internal static string Enchantment_tops_slot { - get { - return ResourceManager.GetString("Enchantment.tops_slot", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Got error code from server while refreshing authentication: {0}. - /// - internal static string error_auth { - get { - return ResourceManager.GetString("error.auth", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to connect to this IP.. - /// - internal static string error_connect { - get { - return ResourceManager.GetString("error.connect", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to A timeout occured while attempting to connect to this IP.. - /// - internal static string error_connection_timeout { - get { - return ResourceManager.GetString("error.connection_timeout", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to determine server version.. - /// - internal static string error_determine { - get { - return ResourceManager.GetString("error.determine", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Forge Login Handshake did not complete successfully. - /// - internal static string error_forge { - get { - return ResourceManager.GetString("error.forge", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Forge StartEncryption Handshake did not complete successfully. - /// - internal static string error_forge_encrypt { - get { - return ResourceManager.GetString("error.forge_encrypt", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot force Forge support for this Minecraft version!. - /// - internal static string error_forgeforce { - get { - return ResourceManager.GetString("error.forgeforce", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid usage of the generator command!. - /// - internal static string error_generator_invalid { - get { - return ResourceManager.GetString("error.generator.invalid", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The provided path must be a path to a file that is in .json format!. - /// - internal static string error_generator_json { - get { - return ResourceManager.GetString("error.generator.json", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid data path provided! (The path either does not exists or you have made a typo). - /// - internal static string error_generator_path { - get { - return ResourceManager.GetString("error.generator.path", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Got error code from server: {0}. - /// - internal static string error_http_code { - get { - return ResourceManager.GetString("error.http_code", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid response to StartEncryption packet. - /// - internal static string error_invalid_encrypt { - get { - return ResourceManager.GetString("error.invalid_encrypt", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid response to Handshake packet. - /// - internal static string error_invalid_response { - get { - return ResourceManager.GetString("error.invalid_response", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This feature requires Inventory Handling to be enabled in order to work!. - /// - internal static string error_inventoryhandling_not_enabled { - get { - return ResourceManager.GetString("error.inventoryhandling_not_enabled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to An error occured when attempting to join this server.. - /// - internal static string error_join { - get { - return ResourceManager.GetString("error.join", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Login failed : . - /// - internal static string error_login { - get { - return ResourceManager.GetString("error.login", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Incorrect username/password, blacklisted IP or too many logins.. - /// - internal static string error_login_blocked { - get { - return ResourceManager.GetString("error.login.blocked", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to User cancelled.. - /// - internal static string error_login_cancel { - get { - return ResourceManager.GetString("error.login.cancel", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to login to this server.. - /// - internal static string error_login_failed { - get { - return ResourceManager.GetString("error.login_failed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Account migrated, use e-mail as username.. - /// - internal static string error_login_migrated { - get { - return ResourceManager.GetString("error.login.migrated", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Network error.. - /// - internal static string error_login_network { - get { - return ResourceManager.GetString("error.login.network", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to User not premium.. - /// - internal static string error_login_premium { - get { - return ResourceManager.GetString("error.login.premium", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid server response.. - /// - internal static string error_login_response { - get { - return ResourceManager.GetString("error.login.response", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Login servers are unavailable. Please try again later.. - /// - internal static string error_login_server { - get { - return ResourceManager.GetString("error.login.server", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SSL Error.. - /// - internal static string error_login_ssl { - get { - return ResourceManager.GetString("error.login.ssl", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unknown Error.. - /// - internal static string error_login_unknown { - get { - return ResourceManager.GetString("error.login.unknown", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You are missing argument {0}. - /// - internal static string error_missing_argument { - get { - return ResourceManager.GetString("error.missing.argument", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Server does not report its protocol version, autodetection will not work.. - /// - internal static string error_no_version_report { - get { - return ResourceManager.GetString("error.no_version_report", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to ping this IP.. - /// - internal static string error_ping { - get { - return ResourceManager.GetString("error.ping", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This Realms world does not exist or access was denied. - /// - internal static string error_realms_access_denied { - get { - return ResourceManager.GetString("error.realms.access_denied", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Trying to join a Realms world but Realms support is disabled in config. - /// - internal static string error_realms_disabled { - get { - return ResourceManager.GetString("error.realms.disabled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot retrieve the server IP of your Realms world. - /// - internal static string error_realms_ip_error { - get { - return ResourceManager.GetString("error.realms.ip_error", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid or unknown Realms server ID.. - /// - internal static string error_realms_server_id { - get { - return ResourceManager.GetString("error.realms.server_id", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Realms server may require some time to start up. Please retry again later.. - /// - internal static string error_realms_server_unavailable { - get { - return ResourceManager.GetString("error.realms.server_unavailable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: Invalid syntax, expecting --argname=value or --section.argname=value. - /// - internal static string error_setting_argument_syntax { - get { - return ResourceManager.GetString("error.setting.argument_syntax", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This feature requires Terrain And Movements to be enabled in order to work!. - /// - internal static string error_terrain_not_enabled { - get { - return ResourceManager.GetString("error.terrain_not_enabled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Connection Timeout. - /// - internal static string error_timeout { - get { - return ResourceManager.GetString("error.timeout", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unexpected response from the server (is that a Minecraft server?). - /// - internal static string error_unexpect_response { - get { - return ResourceManager.GetString("error.unexpect_response", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot connect to the server : This version is not supported !. - /// - internal static string error_unsupported { - get { - return ResourceManager.GetString("error.unsupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Usage:. - /// - internal static string error_usage { - get { - return ResourceManager.GetString("error.usage", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Server reports a different version than manually set. Login may not work.. - /// - internal static string error_version_different { - get { - return ResourceManager.GetString("error.version_different", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ChatBot methods should NOT be called in the constructor as API handler is not initialized yet. Override Initialize() or AfterGameJoined() instead to perform initialization tasks.. - /// - internal static string exception_chatbot_init { - get { - return ResourceManager.GetString("exception.chatbot.init", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The provided script does not have a valid MCCScript header. - /// - internal static string exception_csrunner_invalid_head { - get { - return ResourceManager.GetString("exception.csrunner.invalid_head", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to process incoming packet of type {0}. (PacketID: {1}, Protocol: {2}, LoginPhase: {3}, InnerException: {4}).. - /// - internal static string exception_packet_process { - get { - return ResourceManager.GetString("exception.packet_process", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Please update block types handling for this Minecraft version. See Material.cs. - /// - internal static string exception_palette_block { - get { - return ResourceManager.GetString("exception.palette.block", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Please update entity types handling for this Minecraft version. See EntityType.cs. - /// - internal static string exception_palette_entity { - get { - return ResourceManager.GetString("exception.palette.entity", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Please update health field handling for this Minecraft version.. - /// - internal static string exception_palette_healthfield { - get { - return ResourceManager.GetString("exception.palette.healthfield", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Please update item types handling for this Minecraft version. See ItemType.cs. - /// - internal static string exception_palette_item { - get { - return ResourceManager.GetString("exception.palette.item", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Please update packet type palette for this Minecraft version. See PacketTypePalette.cs. - /// - internal static string exception_palette_packet { - get { - return ResourceManager.GetString("exception.palette.packet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unknown direction. - /// - internal static string exception_unknown_direction { - get { - return ResourceManager.GetString("exception.unknown_direction", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to User-initiated logout should be done by calling Disconnect(). - /// - internal static string exception_user_logout { - get { - return ResourceManager.GetString("exception.user_logout", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The protocol version no.{0} is not supported.. - /// - internal static string exception_version_unsupport { - get { - return ResourceManager.GetString("exception.version_unsupport", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Entities are currently not handled for that MC version.. - /// - internal static string extra_entity_disabled { - get { - return ResourceManager.GetString("extra.entity_disabled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Please enable EntityHandling in the config file first.. - /// - internal static string extra_entity_required { - get { - return ResourceManager.GetString("extra.entity_required", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Inventory # {0} closed.. - /// - internal static string extra_inventory_close { - get { - return ResourceManager.GetString("extra.inventory_close", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Inventories are currently not handled for that MC version.. - /// - internal static string extra_inventory_disabled { - get { - return ResourceManager.GetString("extra.inventory_disabled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Inventory handling is now enabled.. - /// - internal static string extra_inventory_enabled { - get { - return ResourceManager.GetString("extra.inventory_enabled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use /inventory to interact with it.. - /// - internal static string extra_inventory_interact { - get { - return ResourceManager.GetString("extra.inventory_interact", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Inventory # {0} opened: {1}. - /// - internal static string extra_inventory_open { - get { - return ResourceManager.GetString("extra.inventory_open", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Please enable InventoryHandling in the config file first.. - /// - internal static string extra_inventory_required { - get { - return ResourceManager.GetString("extra.inventory_required", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Terrain & Movements currently not handled for that MC version.. - /// - internal static string extra_terrainandmovement_disabled { - get { - return ResourceManager.GetString("extra.terrainandmovement_disabled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Terrain and Movements is now enabled.. - /// - internal static string extra_terrainandmovement_enabled { - get { - return ResourceManager.GetString("extra.terrainandmovement_enabled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Please enable Terrain and Movements in the config file first.. - /// - internal static string extra_terrainandmovement_required { - get { - return ResourceManager.GetString("extra.terrainandmovement_required", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to [{0}] Failed to initialize FileSystemWatcher, retrying using Polling. - /// - internal static string filemonitor_fail { - get { - return ResourceManager.GetString("filemonitor.fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to [{0}] Initializing FileSystemWatcher for file: {1}. - /// - internal static string filemonitor_init { - get { - return ResourceManager.GetString("filemonitor.init", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Accepting server mod list.... - /// - internal static string forge_accept { - get { - return ResourceManager.GetString("forge.accept", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Accepting server registries.... - /// - internal static string forge_accept_registry { - get { - return ResourceManager.GetString("forge.accept_registry", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Forge server connection complete!. - /// - internal static string forge_complete { - get { - return ResourceManager.GetString("forge.complete", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Acknowledging FML2 Server Config: {0}. - /// - internal static string forge_fml2_config { - get { - return ResourceManager.GetString("forge.fml2.config", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Received FML2 Server Mod List. - /// - internal static string forge_fml2_mod { - get { - return ResourceManager.GetString("forge.fml2.mod", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Sending back FML2 Client Mod List. - /// - internal static string forge_fml2_mod_send { - get { - return ResourceManager.GetString("forge.fml2.mod_send", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Acknowledging FML2 Server Registry: {0}. - /// - internal static string forge_fml2_registry { - get { - return ResourceManager.GetString("forge.fml2.registry", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Got Unknown FML2 Handshake message no. {0}. - /// - internal static string forge_fml2_unknown { - get { - return ResourceManager.GetString("forge.fml2.unknown", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Ignoring Unknown FML2 LoginMessage channel: {0}. - /// - internal static string forge_fml2_unknown_channel { - get { - return ResourceManager.GetString("forge.fml2.unknown_channel", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Mod list:. - /// - internal static string forge_mod_list { - get { - return ResourceManager.GetString("forge.mod_list", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Server is running Forge without mods.. - /// - internal static string forge_no_mod { - get { - return ResourceManager.GetString("forge.no_mod", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Received registry with {0} entries. - /// - internal static string forge_registry { - get { - return ResourceManager.GetString("forge.registry", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Received registry {0} with {1} entries. - /// - internal static string forge_registry_2 { - get { - return ResourceManager.GetString("forge.registry_2", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Sending falsified mod list to server.... - /// - internal static string forge_send_mod { - get { - return ResourceManager.GetString("forge.send_mod", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Forge protocol version : {0}. - /// - internal static string forge_version { - get { - return ResourceManager.GetString("forge.version", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Server is running Forge with {0} mods.. - /// - internal static string forge_with_mod { - get { - return ResourceManager.GetString("forge.with_mod", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Available commands: {0}. - /// - internal static string general_available_cmd { - get { - return ResourceManager.GetString("general.available_cmd", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This bot will be unloaded.. - /// - internal static string general_bot_unload { - get { - return ResourceManager.GetString("general.bot_unload", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Done. - /// - internal static string general_done { - get { - return ResourceManager.GetString("general.done", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Fail. - /// - internal static string general_fail { - get { - return ResourceManager.GetString("general.fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to OnInternalCommand: Got error from {0}: {1}. - /// - internal static string icmd_error { - get { - return ResourceManager.GetString("icmd.error", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to help <cmdname>: show brief help about a command.. - /// - internal static string icmd_help { - get { - return ResourceManager.GetString("icmd.help", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to help <cmdname>. Available commands: - ///{0}For server help, use '{1}send /help' instead.. - /// - internal static string icmd_list { - get { - return ResourceManager.GetString("icmd.list", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unknown command '{0}'. Use 'help' for command list.. - /// - internal static string icmd_unknown { - get { - return ResourceManager.GetString("icmd.unknown", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Avaliable profiles:. - /// - internal static string mcc_avaliable_profiles { - get { - return ResourceManager.GetString("mcc.avaliable_profiles", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The old MinecraftClient.ini has been backed up as {0}. - /// - internal static string mcc_backup_old_config { - get { - return ResourceManager.GetString("mcc.backup_old_config", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Paste your code here:. - /// - internal static string mcc_browser_login_code { - get { - return ResourceManager.GetString("mcc.browser_login_code", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Your browser should open automatically. If not, open the link below in your browser.. - /// - internal static string mcc_browser_open { - get { - return ResourceManager.GetString("mcc.browser_open", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Connecting to {0}.... - /// - internal static string mcc_connecting { - get { - return ResourceManager.GetString("mcc.connecting", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Select a login method: [1] Offline, [2] Online (Microsoft), [3] Yggdrasil. - /// - internal static string mcc_auth_method_prompt { - get { - return ResourceManager.GetString("mcc.auth_method_prompt", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Please choose 1, 2, or 3.. - /// - internal static string mcc_auth_method_invalid { - get { - return ResourceManager.GetString("mcc.auth_method_invalid", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Tip: try TUI mode for a cleaner interface, mouse-friendly container actions, and a nicer layout. Run {0}feature tui§8 to switch [Console.General] ConsoleMode to "tui" for the next restart.. - /// - internal static string mcc_console_mode_tui_recommendation { - get { - return ResourceManager.GetString("mcc.console_mode_tui_recommendation", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to MCC encountered a problem while starting TUI mode.. - /// - internal static string mcc_tui_startup_failed { - get { - return ResourceManager.GetString("mcc.tui_startup_failed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to As a fallback, MCC has automatically switched [Console.General] ConsoleMode to "classic". This will take effect after you restart MCC.. - /// - internal static string mcc_tui_startup_fallback_classic { - get { - return ResourceManager.GetString("mcc.tui_startup_fallback_classic", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Please report this issue to the MCC Team.. - /// - internal static string mcc_report_issue { - get { - return ResourceManager.GetString("mcc.report_issue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to To sign in, open {0} in your browser and enter the code: {1}. - /// - internal static string mcc_device_code_prompt { - get { - return ResourceManager.GetString("mcc.device_code_prompt", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Waiting for authentication to complete.... - /// - internal static string mcc_device_code_waiting { - get { - return ResourceManager.GetString("mcc.device_code_waiting", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Login failed :. - /// - internal static string mcc_disconnect_login { - get { - return ResourceManager.GetString("mcc.disconnect.login", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Connection has been lost.. - /// - internal static string mcc_disconnect_lost { - get { - return ResourceManager.GetString("mcc.disconnect.lost", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Disconnected by Server :. - /// - internal static string mcc_disconnect_server { - get { - return ResourceManager.GetString("mcc.disconnect.server", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Not connected to any server. Use '{0}help' for help.. - /// - internal static string mcc_disconnected { - get { - return ResourceManager.GetString("mcc.disconnected", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Fetching profile key from Microsoft.. - /// - internal static string mcc_fetching_key { - get { - return ResourceManager.GetString("mcc.fetching_key", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Checking if server is running Forge.... - /// - internal static string mcc_forge { - get { - return ResourceManager.GetString("mcc.forge", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Force-enabling Forge support.. - /// - internal static string mcc_forgeforce { - get { - return ResourceManager.GetString("mcc.forgeforce", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Found server {0}:{1} for domain {2}. - /// - internal static string mcc_found { - get { - return ResourceManager.GetString("mcc.found", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to New configuration file "{0}" is generated.. - /// - internal static string mcc_gen_new_config { - get { - return ResourceManager.GetString("mcc.gen_new_config", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Succesfully generated {0} palette using the dataset: {1}. - /// - internal static string mcc_generator_done { - get { - return ResourceManager.GetString("mcc.generator.done", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Generating {0} palette using the dataset: {1}. - /// - internal static string mcc_generator_generating { - get { - return ResourceManager.GetString("mcc.generator.generating", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Handshake successful. (Server ID: {0}). - /// - internal static string mcc_handshake { - get { - return ResourceManager.GetString("mcc.handshake", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to A new version of MCC is available and you can download it via /upgrade - ///Or download it manually: {0}. - /// - internal static string mcc_has_update { - get { - return ResourceManager.GetString("mcc.has_update", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Help us translate MCC: {0}. - /// - internal static string mcc_help_us_translate { - get { - return ResourceManager.GetString("mcc.help_us_translate", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to parse the settings file, enter "{0}new" to generate a new configuration.. - /// - internal static string mcc_invaild_config { - get { - return ResourceManager.GetString("mcc.invaild_config", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Server IP : . - /// - internal static string mcc_ip { - get { - return ResourceManager.GetString("mcc.ip", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Server was successfully joined. - ///Type '{0}quit' to leave the server.. - /// - internal static string mcc_joined { - get { - return ResourceManager.GetString("mcc.joined", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Link: {0}. - /// - internal static string mcc_link { - get { - return ResourceManager.GetString("mcc.link", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Login :. - /// - internal static string mcc_login { - get { - return ResourceManager.GetString("mcc.login", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Please type the username or email of your choice.. - /// - internal static string mcc_login_basic_io { - get { - return ResourceManager.GetString("mcc.login_basic_io", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to perform SRV lookup for {0} - ///{1}: {2}. - /// - internal static string mcc_not_found { - get { - return ResourceManager.GetString("mcc.not_found", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You chose to run in offline mode.. - /// - internal static string mcc_offline { - get { - return ResourceManager.GetString("mcc.offline", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Please type the password for {0}.. - /// - internal static string mcc_password_basic_io { - get { - return ResourceManager.GetString("mcc.password_basic_io", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Password(invisible): . - /// - internal static string mcc_password_hidden { - get { - return ResourceManager.GetString("mcc.password_hidden", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Authlib server host:. - /// - internal static string mcc_yggdrasil_host { - get { - return ResourceManager.GetString("mcc.yggdrasil_host", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Authlib server port [{0}]:. - /// - internal static string mcc_yggdrasil_port { - get { - return ResourceManager.GetString("mcc.yggdrasil_port", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Authlib-Injector API path [{0}]:. - /// - internal static string mcc_yggdrasil_api_path { - get { - return ResourceManager.GetString("mcc.yggdrasil_api_path", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use HTTPS? [Y/n]. - /// - internal static string mcc_yggdrasil_use_https { - get { - return ResourceManager.GetString("mcc.yggdrasil_use_https", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The authlib server host cannot be empty.. - /// - internal static string mcc_yggdrasil_invalid_host { - get { - return ResourceManager.GetString("mcc.yggdrasil_invalid_host", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The authlib server port must be between 1 and 65535.. - /// - internal static string mcc_yggdrasil_invalid_port { - get { - return ResourceManager.GetString("mcc.yggdrasil_invalid_port", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Please answer yes or no.. - /// - internal static string mcc_yggdrasil_invalid_yes_no { - get { - return ResourceManager.GetString("mcc.yggdrasil_invalid_yes_no", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Authlib-injector URL:. - /// - internal static string mcc_yggdrasil_url { - get { - return ResourceManager.GetString("mcc.yggdrasil_url", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The authlib-injector URL must be an absolute HTTP or HTTPS URL.. - /// - internal static string mcc_yggdrasil_invalid_url { - get { - return ResourceManager.GetString("mcc.yggdrasil_invalid_url", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Could not reach the authlib-injector server. Check the URL and try again.. - /// - internal static string mcc_yggdrasil_server_unreachable { - get { - return ResourceManager.GetString("mcc.yggdrasil_server_unreachable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The server did not return valid authlib-injector metadata. Check the URL and try again.. - /// - internal static string mcc_yggdrasil_server_invalid { - get { - return ResourceManager.GetString("mcc.yggdrasil_server_invalid", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The configured authlib-injector URL must be an absolute HTTP or HTTPS URL.. - /// - internal static string config_auth_server_url_invalid { - get { - return ResourceManager.GetString("config.auth_server_url_invalid", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You are dead. Type '{0}respawn' to respawn.. - /// - internal static string mcc_player_dead { - get { - return ResourceManager.GetString("mcc.player_dead", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You are dead. Automatically respawning after 1 second.. - /// - internal static string mcc_player_dead_respawn { - get { - return ResourceManager.GetString("mcc.player_dead_respawn", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Or press Enter to exit Minecraft Console Client.. - /// - internal static string mcc_press_exit { - get { - return ResourceManager.GetString("mcc.press_exit", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cached profile key needs to be refreshed.. - /// - internal static string mcc_profile_key_invalid { - get { - return ResourceManager.GetString("mcc.profile_key_invalid", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cached profile key is still valid for {0}.. - /// - internal static string mcc_profile_key_valid { - get { - return ResourceManager.GetString("mcc.profile_key_valid", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You have access to the following Realms worlds. - /// - internal static string mcc_realms_available { - get { - return ResourceManager.GetString("mcc.realms_available", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use realms:<index> as server IP to join a Realms world. - /// - internal static string mcc_realms_join { - get { - return ResourceManager.GetString("mcc.realms_join", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Waiting 5 seconds ({0} attempts left).... - /// - internal static string mcc_reconnect { - get { - return ResourceManager.GetString("mcc.reconnect", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Resolving {0}.... - /// - internal static string mcc_resolve { - get { - return ResourceManager.GetString("mcc.resolve", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Restarting Minecraft Console Client.... - /// - internal static string mcc_restart { - get { - return ResourceManager.GetString("mcc.restart", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot send text: not connected to a server.. - /// - internal static string mcc_send_text_not_connected { - get { - return ResourceManager.GetString("mcc.send_text_not_connected", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Waiting {0} seconds before restarting.... - /// - internal static string mcc_restart_delay { - get { - return ResourceManager.GetString("mcc.restart_delay", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Retrieving Server Info.... - /// - internal static string mcc_retrieve { - get { - return ResourceManager.GetString("mcc.retrieve", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to - ///MCC is running with default settings.. - /// - internal static string mcc_run_with_default_settings { - get { - return ResourceManager.GetString("mcc.run_with_default_settings", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Select a profile from available profiles:. - /// - internal static string mcc_select_profile { - get { - return ResourceManager.GetString("mcc.select_profile", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Selected profile:. - /// - internal static string mcc_selected_profile { - get { - return ResourceManager.GetString("mcc.selected_profile", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to MCC uses Sentry to log errors. You can opt-out by setting the EnableSentry option in the configuration file to false.. - /// - internal static string mcc_sentry_logging { - get { - return ResourceManager.GetString("mcc.sentry_logging", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Server is in offline mode.. - /// - internal static string mcc_server_offline { - get { - return ResourceManager.GetString("mcc.server_offline", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Server version : {0} (protocol v{1}). - /// - internal static string mcc_server_protocol { - get { - return ResourceManager.GetString("mcc.server_protocol", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Server version : . - /// - internal static string mcc_server_version { - get { - return ResourceManager.GetString("mcc.server_version", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Checking Session.... - /// - internal static string mcc_session { - get { - return ResourceManager.GetString("mcc.session", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to check session.. - /// - internal static string mcc_session_fail { - get { - return ResourceManager.GetString("mcc.session_fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cached session is invalid or expired.. - /// - internal static string mcc_session_invalid { - get { - return ResourceManager.GetString("mcc.session_invalid", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cached session is still valid for {0}.. - /// - internal static string mcc_session_valid { - get { - return ResourceManager.GetString("mcc.session_valid", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Settings file MinecraftClient.ini has been generated.. - /// - internal static string mcc_settings_generated { - get { - return ResourceManager.GetString("mcc.settings_generated", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unknown or not supported MC version {0}. - ///Switching to autodetection mode.. - /// - internal static string mcc_unknown_version { - get { - return ResourceManager.GetString("mcc.unknown_version", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The current version is already up to date or is a development build.. - /// - internal static string mcc_update_already_latest { - get { - return ResourceManager.GetString("mcc.update.already_latest", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Checking for updates has already started.. - /// - internal static string mcc_update_already_running { - get { - return ResourceManager.GetString("mcc.update.already_running", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The download has been cancelled.. - /// - internal static string mcc_update_cancel { - get { - return ResourceManager.GetString("mcc.update.cancel", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to check for updates from Github, please check your internet connection or enable proxy.. - /// - internal static string mcc_update_check_fail { - get { - return ResourceManager.GetString("mcc.update.check_fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Self-updating: Download is complete, decompressing.. - /// - internal static string mcc_update_download_complete { - get { - return ResourceManager.GetString("mcc.update.download_complete", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Self-updating: An error occurred while downloading or saving the file:. - /// - internal static string mcc_update_download_fail { - get { - return ResourceManager.GetString("mcc.update.download_fail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Self-updating: New version detected: "{0}", download will start soon (platform: {1}).. - /// - internal static string mcc_update_exist_update { - get { - return ResourceManager.GetString("mcc.update.exist_update", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The latest release does not contain a build that matches your operating system and CPU architecture.. - /// - internal static string mcc_update_platform_not_support { - get { - return ResourceManager.GetString("mcc.update.platform_not_support", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Self-updating: {0:00.00}%, ETA {4}, Downloaded {1:00.0}MB of {2:00.0}MB, Avg {3:0.0}KB/s. - /// - internal static string mcc_update_progress { - get { - return ResourceManager.GetString("mcc.update.progress", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Self-updating: Downloaded {0:00.0}MB, Avg {1:0.0}KB/s. - /// - internal static string mcc_update_progress_type2 { - get { - return ResourceManager.GetString("mcc.update.progress_type2", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Add "-f" to force the download.. - /// - internal static string mcc_update_promote_force { - get { - return ResourceManager.GetString("mcc.update.promote_force", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use "--force-upgrade" to force the download.. - /// - internal static string mcc_update_promote_force_cmd { - get { - return ResourceManager.GetString("mcc.update.promote_force_cmd", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Self-updating: File saved as: {0}. - /// - internal static string mcc_update_save_as { - get { - return ResourceManager.GetString("mcc.update.save_as", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Start checking for updates.. - /// - internal static string mcc_update_start { - get { - return ResourceManager.GetString("mcc.update.start", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Please use the newly generated MinecraftClient.ini. - /// - internal static string mcc_use_new_config { - get { - return ResourceManager.GetString("mcc.use_new_config", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Using Minecraft version {0} (protocol v{1}). - /// - internal static string mcc_use_version { - get { - return ResourceManager.GetString("mcc.use_version", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Version is supported. - ///Logging in.... - /// - internal static string mcc_version_supported { - get { - return ResourceManager.GetString("mcc.version_supported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to , with Forge. - /// - internal static string mcc_with_forge { - get { - return ResourceManager.GetString("mcc.with_forge", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Connected to proxy {0}:{1}. - /// - internal static string proxy_connected { - get { - return ResourceManager.GetString("proxy.connected", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use '{0}quit' to exit Minecraft Console Client.. - /// - internal static string mcc_use_quit_to_exit { - get { - return ResourceManager.GetString("mcc.use_quit_to_exit", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to MCC Debug State. - /// - internal static string cmd_debug_state_header { - get { - return ResourceManager.GetString("cmd.debug.state_header", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Server. - /// - internal static string cmd_debug_state_server { - get { - return ResourceManager.GetString("cmd.debug.state_server", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Username. - /// - internal static string cmd_debug_state_username { - get { - return ResourceManager.GetString("cmd.debug.state_username", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Protocol. - /// - internal static string cmd_debug_state_protocol { - get { - return ResourceManager.GetString("cmd.debug.state_protocol", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to GameMode. - /// - internal static string cmd_debug_state_gamemode { - get { - return ResourceManager.GetString("cmd.debug.state_gamemode", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Health. - /// - internal static string cmd_debug_state_health { - get { - return ResourceManager.GetString("cmd.debug.state_health", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Food. - /// - internal static string cmd_debug_state_food { - get { - return ResourceManager.GetString("cmd.debug.state_food", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Location. - /// - internal static string cmd_debug_state_location { - get { - return ResourceManager.GetString("cmd.debug.state_location", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to TPS. - /// - internal static string cmd_debug_state_tps { - get { - return ResourceManager.GetString("cmd.debug.state_tps", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Console. - /// - internal static string cmd_debug_state_console { - get { - return ResourceManager.GetString("cmd.debug.state_console", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Features. - /// - internal static string cmd_debug_state_features { - get { - return ResourceManager.GetString("cmd.debug.state_features", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Debug. - /// - internal static string cmd_debug_state_debug { - get { - return ResourceManager.GetString("cmd.debug.state_debug", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Bots. - /// - internal static string cmd_debug_state_bots { - get { - return ResourceManager.GetString("cmd.debug.state_bots", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Players. - /// - internal static string cmd_debug_state_players { - get { - return ResourceManager.GetString("cmd.debug.state_players", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} online. - /// - internal static string cmd_debug_state_online { - get { - return ResourceManager.GetString("cmd.debug.state_online", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Open interactive TUI inventory viewer (TUI mode only).. - /// - internal static string cmd_inventory_help_open { - get { - return ResourceManager.GetString("cmd.inventory.help.open", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Interactive TUI is only available in TUI console mode. Use '/inventory <id> list' instead.. - /// - internal static string cmd_inventory_tui_only { - get { - return ResourceManager.GetString("cmd.inventory.tui_only", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to TUI inventory viewer is already running.. - /// - internal static string cmd_inventory_tui_already_running { - get { - return ResourceManager.GetString("cmd.inventory.tui_already_running", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Opening TUI for Inventory #{0}.... - /// - internal static string cmd_inventory_tui_opening { - get { - return ResourceManager.GetString("cmd.inventory.tui_opening", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Inventory dialog opened.. - /// - internal static string cmd_inventory_tui_opened { - get { - return ResourceManager.GetString("cmd.inventory.tui_opened", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to launch TUI inventory viewer.. - /// - internal static string cmd_inventory_tui_launch_failed { - get { - return ResourceManager.GetString("cmd.inventory.tui_launch_failed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to TUI viewer does not support this container type (Inventory #{0}). Use '/inventory {0} list' to view its contents.. - /// - internal static string cmd_inventory_tui_unsupported_container { - get { - return ResourceManager.GetString("cmd.inventory.tui_unsupported_container", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Hold Shift + Left-click to select and copy text.. - /// - internal static string tui_select_copy_hint { - get { - return ResourceManager.GetString("tui.select_copy_hint", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Input cleared. Press Ctrl+C again to quit.. - /// - internal static string tui_ctrlc_input_cleared { - get { - return ResourceManager.GetString("tui.ctrlc_input_cleared", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Press Ctrl+C again to quit MCC.. - /// - internal static string tui_ctrlc_quit_hint { - get { - return ResourceManager.GetString("tui.ctrlc_quit_hint", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to [ Item Info ]. - /// - internal static string tui_inventory_item_info { - get { - return ResourceManager.GetString("tui.inventory.item_info", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to [ Held Item ]. - /// - internal static string tui_inventory_held_item { - get { - return ResourceManager.GetString("tui.inventory.held_item", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to [ Controls ]. - /// - internal static string tui_inventory_controls { - get { - return ResourceManager.GetString("tui.inventory.controls", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to LClick Pick/Place.... - /// - internal static string tui_inventory_controls_help { - get { - return ResourceManager.GetString("tui.inventory.controls_help", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to (empty). - /// - internal static string tui_inventory_cursor_empty { - get { - return ResourceManager.GetString("tui.inventory.cursor_empty", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Off. - /// - internal static string tui_inventory_offhand { - get { - return ResourceManager.GetString("tui.inventory.offhand", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Out. - /// - internal static string tui_inventory_output { - get { - return ResourceManager.GetString("tui.inventory.output", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Hd. - /// - internal static string tui_inventory_equip_head { - get { - return ResourceManager.GetString("tui.inventory.equip_head", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Bd. - /// - internal static string tui_inventory_equip_body { - get { - return ResourceManager.GetString("tui.inventory.equip_body", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Lg. - /// - internal static string tui_inventory_equip_legs { - get { - return ResourceManager.GetString("tui.inventory.equip_legs", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Ft. - /// - internal static string tui_inventory_equip_feet { - get { - return ResourceManager.GetString("tui.inventory.equip_feet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Hover over a slot to see item details.. - /// - internal static string tui_inventory_hover_hint { - get { - return ResourceManager.GetString("tui.inventory.hover_hint", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to (Empty). - /// - internal static string tui_inventory_slot_empty { - get { - return ResourceManager.GetString("tui.inventory.slot_empty", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Slot #{0} Count: {1}. - /// - internal static string tui_inventory_slot_detail { - get { - return ResourceManager.GetString("tui.inventory.slot_detail", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Durability. - /// - internal static string tui_inventory_durability { - get { - return ResourceManager.GetString("tui.inventory.durability", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Container not found. - /// - internal static string tui_inventory_container_not_found { - get { - return ResourceManager.GetString("tui.inventory.container_not_found", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Inventory #{0} - {1}. - /// - internal static string tui_inventory_title { - get { - return ResourceManager.GetString("tui.inventory.title", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} items. - /// - internal static string tui_inventory_item_count { - get { - return ResourceManager.GetString("tui.inventory.item_count", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Press Esc to close. Refreshes automatically.. - /// - internal static string tui_tab_hint { - get { - return ResourceManager.GetString("tui.tab.hint", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You're now under {0} effect (Duration: {1}).. - /// - internal static string bot_effect_gained { - get { - return ResourceManager.GetString("bot.effect.gained", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Effect {0} has expired. - /// - internal static string bot_effect_expired { - get { - return ResourceManager.GetString("bot.effect.expired", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unlimited. - /// - internal static string effect_duration_unlimited { - get { - return ResourceManager.GetString("effect.duration.unlimited", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to a. - /// - internal static string effect_article_a { - get { - return ResourceManager.GetString("effect.article.a", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to an. - /// - internal static string effect_article_an { - get { - return ResourceManager.GetString("effect.article.an", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}h. - /// - internal static string effect_duration_short_hours { - get { - return ResourceManager.GetString("effect.duration.short.hours", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}h {1}m. - /// - internal static string effect_duration_short_hours_minutes { - get { - return ResourceManager.GetString("effect.duration.short.hours_minutes", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}m. - /// - internal static string effect_duration_short_minutes { - get { - return ResourceManager.GetString("effect.duration.short.minutes", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}m {1}s. - /// - internal static string effect_duration_short_minutes_seconds { - get { - return ResourceManager.GetString("effect.duration.short.minutes_seconds", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}s. - /// - internal static string effect_duration_short_seconds { - get { - return ResourceManager.GetString("effect.duration.short.seconds", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ∞. - /// - internal static string effect_duration_short_unlimited { - get { - return ResourceManager.GetString("effect.duration.short.unlimited", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} {1}. - /// - internal static string effect_name_with_amplifier { - get { - return ResourceManager.GetString("effect.name.with_amplifier", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Container. - /// - internal static string tui_container_label { - get { - return ResourceManager.GetString("tui.container.label", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Input. - /// - internal static string tui_furnace_input { - get { - return ResourceManager.GetString("tui.furnace.input", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Fuel. - /// - internal static string tui_furnace_fuel { - get { - return ResourceManager.GetString("tui.furnace.fuel", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Output. - /// - internal static string tui_furnace_output { - get { - return ResourceManager.GetString("tui.furnace.output", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Item. - /// - internal static string tui_enchanting_item { - get { - return ResourceManager.GetString("tui.enchanting.item", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Lapis. - /// - internal static string tui_enchanting_lapis { - get { - return ResourceManager.GetString("tui.enchanting.lapis", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Enchant Options. - /// - internal static string tui_enchanting_options { - get { - return ResourceManager.GetString("tui.enchanting.options", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Option {0}. - /// - internal static string tui_enchanting_option_slot { - get { - return ResourceManager.GetString("tui.enchanting.option_slot", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Fuel. - /// - internal static string tui_brewing_fuel { - get { - return ResourceManager.GetString("tui.brewing.fuel", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Ingredient. - /// - internal static string tui_brewing_ingredient { - get { - return ResourceManager.GetString("tui.brewing.ingredient", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Bottle {0}. - /// - internal static string tui_brewing_bottle { - get { - return ResourceManager.GetString("tui.brewing.bottle", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Input 1. - /// - internal static string tui_grindstone_input1 { - get { - return ResourceManager.GetString("tui.grindstone.input1", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Input 2. - /// - internal static string tui_grindstone_input2 { - get { - return ResourceManager.GetString("tui.grindstone.input2", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Crafting. - /// - internal static string tui_crafting_grid { - get { - return ResourceManager.GetString("tui.crafting.grid", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Starting embedded MCP server.... - /// - internal static string bot_mcpserver_starting { - get { - return ResourceManager.GetString("bot.mcpserver.starting", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Embedded MCP server started on {0}. - /// - internal static string bot_mcpserver_started { - get { - return ResourceManager.GetString("bot.mcpserver.started", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to start embedded MCP server: {0}. - /// - internal static string bot_mcpserver_start_failed { - get { - return ResourceManager.GetString("bot.mcpserver.start_failed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Embedded MCP auth token is required but environment variable {0} is empty.. - /// - internal static string bot_mcpserver_missing_auth_token { - get { - return ResourceManager.GetString("bot.mcpserver.missing_auth_token", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Embedded MCP server stopped.. - /// - internal static string bot_mcpserver_stopped { - get { - return ResourceManager.GetString("bot.mcpserver.stopped", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to stop embedded MCP server cleanly: {0}. - /// - internal static string bot_mcpserver_stop_failed { - get { - return ResourceManager.GetString("bot.mcpserver.stop_failed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Toggle the TUI minimap overlay, or adjust its zoom level.. - /// - internal static string cmd_minimap_desc { - get { - return ResourceManager.GetString("cmd.minimap.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Minimap enabled.. - /// - internal static string cmd_minimap_enabled { - get { - return ResourceManager.GetString("cmd.minimap.enabled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Minimap disabled.. - /// - internal static string cmd_minimap_disabled { - get { - return ResourceManager.GetString("cmd.minimap.disabled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Minimap zoom set to {0}:1 (blocks per pixel).. - /// - internal static string cmd_minimap_zoom_set { - get { - return ResourceManager.GetString("cmd.minimap.zoom_set", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Current minimap zoom: {0}:1 blocks/px (range 1-{1}).. - /// - internal static string cmd_minimap_zoom_current { - get { - return ResourceManager.GetString("cmd.minimap.zoom_current", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The minimap command is only available in TUI mode.. - /// - internal static string cmd_minimap_tui_only { - get { - return ResourceManager.GetString("cmd.minimap.tui_only", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Hostile. - /// - internal static string tui_minimap_legend_hostile { - get { - return ResourceManager.GetString("tui.minimap.legend.hostile", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Passive. - /// - internal static string tui_minimap_legend_passive { - get { - return ResourceManager.GetString("tui.minimap.legend.passive", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Neutral. - /// - internal static string tui_minimap_legend_neutral { - get { - return ResourceManager.GetString("tui.minimap.legend.neutral", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Player. - /// - internal static string tui_minimap_legend_player { - get { - return ResourceManager.GetString("tui.minimap.legend.player", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Name display -- Players: {0}, Hostile: {1}, Neutral: {2}, Passive: {3}. - /// - internal static string cmd_minimap_names_status { - get { - return ResourceManager.GetString("cmd.minimap.names_status", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to All entity name labels enabled.. - /// - internal static string cmd_minimap_names_all_on { - get { - return ResourceManager.GetString("cmd.minimap.names_all_on", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to All entity name labels disabled.. - /// - internal static string cmd_minimap_names_all_off { - get { - return ResourceManager.GetString("cmd.minimap.names_all_off", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} name display: {1}. - /// - internal static string cmd_minimap_names_cat { - get { - return ResourceManager.GetString("cmd.minimap.names_cat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} name display set to {1}.. - /// - internal static string cmd_minimap_names_cat_set { - get { - return ResourceManager.GetString("cmd.minimap.names_cat_set", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Current minimap position: {0}. - /// - internal static string cmd_minimap_position_current { - get { - return ResourceManager.GetString("cmd.minimap.position_current", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Minimap position set to: {0}. - /// - internal static string cmd_minimap_position_set { - get { - return ResourceManager.GetString("cmd.minimap.position_set", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Current cave mode: {0}. - /// - internal static string cmd_minimap_cave_current { - get { - return ResourceManager.GetString("cmd.minimap.cave_current", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cave mode set to: {0}. - /// - internal static string cmd_minimap_cave_set { - get { - return ResourceManager.GetString("cmd.minimap.cave_set", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to list achievements/advancements from the server.. - /// - internal static string cmd_achievement_desc { - get { - return ResourceManager.GetString("cmd.achievement.desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No achievements/advancements received yet.. - /// - internal static string cmd_achievement_none { - get { - return ResourceManager.GetString("cmd.achievement.none", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No completed achievements/advancements.. - /// - internal static string cmd_achievement_none_unlocked { - get { - return ResourceManager.GetString("cmd.achievement.none_unlocked", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No incomplete achievements/advancements.. - /// - internal static string cmd_achievement_none_locked { - get { - return ResourceManager.GetString("cmd.achievement.none_locked", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Achievements/Advancements:. - /// - internal static string cmd_achievement_header { - get { - return ResourceManager.GetString("cmd.achievement.header", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Completed achievements/advancements:. - /// - internal static string cmd_achievement_header_unlocked { - get { - return ResourceManager.GetString("cmd.achievement.header_unlocked", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Incomplete achievements/advancements:. - /// - internal static string cmd_achievement_header_locked { - get { - return ResourceManager.GetString("cmd.achievement.header_locked", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to [DONE]. - /// - internal static string cmd_achievement_done { - get { - return ResourceManager.GetString("cmd.achievement.done", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to [TODO]. - /// - internal static string cmd_achievement_todo { - get { - return ResourceManager.GetString("cmd.achievement.todo", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} {1} ({2}) [{3}]. - /// - internal static string cmd_achievement_entry_titled { - get { - return ResourceManager.GetString("cmd.achievement.entry_titled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} {1} [{2}]. - /// - internal static string cmd_achievement_entry { - get { - return ResourceManager.GetString("cmd.achievement.entry", resourceCulture); - } - } - internal static string cmd_book_usage { - get { return ResourceManager.GetString("cmd.book.usage", resourceCulture); } - } - - internal static string cmd_book_desc { - get { return ResourceManager.GetString("cmd.book.desc", resourceCulture); } - } - - internal static string cmd_book_help_read { - get { return ResourceManager.GetString("cmd.book.help_read", resourceCulture); } - } - - internal static string cmd_book_help_write { - get { return ResourceManager.GetString("cmd.book.help_write", resourceCulture); } - } - - internal static string cmd_book_help_edit { - get { return ResourceManager.GetString("cmd.book.help_edit", resourceCulture); } - } - - internal static string cmd_book_help_sign { - get { return ResourceManager.GetString("cmd.book.help_sign", resourceCulture); } - } - - internal static string cmd_book_not_holding_book { - get { return ResourceManager.GetString("cmd.book.not_holding_book", resourceCulture); } - } - - internal static string cmd_book_not_holding_writable { - get { return ResourceManager.GetString("cmd.book.not_holding_writable", resourceCulture); } - } - - internal static string cmd_book_already_signed { - get { return ResourceManager.GetString("cmd.book.already_signed", resourceCulture); } - } - - internal static string cmd_book_cannot_edit_signed { - get { return ResourceManager.GetString("cmd.book.cannot_edit_signed", resourceCulture); } - } - - internal static string cmd_book_tui_opened { - get { return ResourceManager.GetString("cmd.book.tui_opened", resourceCulture); } - } - - internal static string cmd_book_tui_required { - get { return ResourceManager.GetString("cmd.book.tui_required", resourceCulture); } - } - - internal static string cmd_book_write_sent { - get { return ResourceManager.GetString("cmd.book.write_sent", resourceCulture); } - } - - internal static string cmd_book_edit_sent { - get { return ResourceManager.GetString("cmd.book.edit_sent", resourceCulture); } - } - - internal static string cmd_book_sign_sent { - get { return ResourceManager.GetString("cmd.book.sign_sent", resourceCulture); } - } - - internal static string cmd_book_write_failed { - get { return ResourceManager.GetString("cmd.book.write_failed", resourceCulture); } - } - - internal static string cmd_book_file_not_found { - get { return ResourceManager.GetString("cmd.book.file_not_found", resourceCulture); } - } - - internal static string cmd_book_page_out_of_range { - get { return ResourceManager.GetString("cmd.book.page_out_of_range", resourceCulture); } - } - - internal static string cmd_book_too_many_pages { - get { return ResourceManager.GetString("cmd.book.too_many_pages", resourceCulture); } - } - - internal static string cmd_book_page_too_long { - get { return ResourceManager.GetString("cmd.book.page_too_long", resourceCulture); } - } - - internal static string cmd_book_title_invalid { - get { return ResourceManager.GetString("cmd.book.title_invalid", resourceCulture); } - } - - internal static string cmd_book_header_signed { - get { return ResourceManager.GetString("cmd.book.header_signed", resourceCulture); } - } - - internal static string cmd_book_header_writable { - get { return ResourceManager.GetString("cmd.book.header_writable", resourceCulture); } - } - - internal static string cmd_book_page_header { - get { return ResourceManager.GetString("cmd.book.page_header", resourceCulture); } - } - - internal static string tui_book_title_watermark { - get { return ResourceManager.GetString("tui.book.title_watermark", resourceCulture); } - } - - internal static string tui_book_prev { - get { return ResourceManager.GetString("tui.book.prev", resourceCulture); } - } - - internal static string tui_book_next { - get { return ResourceManager.GetString("tui.book.next", resourceCulture); } - } - - internal static string tui_book_insert { - get { return ResourceManager.GetString("tui.book.insert", resourceCulture); } - } - - internal static string tui_book_delete { - get { return ResourceManager.GetString("tui.book.delete", resourceCulture); } - } - - internal static string tui_book_save { - get { return ResourceManager.GetString("tui.book.save", resourceCulture); } - } - - internal static string tui_book_sign { - get { return ResourceManager.GetString("tui.book.sign", resourceCulture); } - } - - internal static string tui_book_close { - get { return ResourceManager.GetString("tui.book.close", resourceCulture); } - } - - internal static string tui_book_saved { - get { return ResourceManager.GetString("tui.book.saved", resourceCulture); } - } - - internal static string tui_book_save_failed { - get { return ResourceManager.GetString("tui.book.save_failed", resourceCulture); } - } - - internal static string tui_book_signed { - get { return ResourceManager.GetString("tui.book.signed", resourceCulture); } - } - - internal static string tui_book_page_header { - get { return ResourceManager.GetString("tui.book.page_header", resourceCulture); } - } - - internal static string tui_book_editing { - get { return ResourceManager.GetString("tui.book.editing", resourceCulture); } - } - - internal static string tui_book_reading { - get { return ResourceManager.GetString("tui.book.reading", resourceCulture); } - } - - internal static string tui_book_edit_shortcut_tip { - get { return ResourceManager.GetString("tui.book.edit_shortcut_tip", resourceCulture); } - } - - internal static string tui_book_page_shortcut_tip { - get { return ResourceManager.GetString("tui.book.page_shortcut_tip", resourceCulture); } - } - - internal static string debug_packet_incoming { - get { return ResourceManager.GetString("debug.packet.incoming", resourceCulture); } - } - - internal static string debug_packet_outgoing { - get { return ResourceManager.GetString("debug.packet.outgoing", resourceCulture); } - } - - internal static string debug_packet_state_change { - get { return ResourceManager.GetString("debug.packet.state_change", resourceCulture); } - } - - internal static string debug_packet_unknown_type { - get { return ResourceManager.GetString("debug.packet.unknown_type", resourceCulture); } - } - - internal static string debug_packet_compression_disabled { - get { return ResourceManager.GetString("debug.packet.compression.disabled", resourceCulture); } - } - - internal static string debug_packet_compression_uncompressed { - get { return ResourceManager.GetString("debug.packet.compression.uncompressed", resourceCulture); } - } - - internal static string debug_packet_compression_compressed { - get { return ResourceManager.GetString("debug.packet.compression.compressed", resourceCulture); } - } - - internal static string debug_packet_loop_exit { - get { return ResourceManager.GetString("debug.packet.loop_exit", resourceCulture); } - } - - internal static string debug_packet_loop_reason_queue_completed { - get { return ResourceManager.GetString("debug.packet.loop_reason.queue_completed", resourceCulture); } - } - - internal static string debug_packet_loop_reason_socket_closed { - get { return ResourceManager.GetString("debug.packet.loop_reason.socket_closed", resourceCulture); } - } - - internal static string debug_packet_loop_reason_cancelled { - get { return ResourceManager.GetString("debug.packet.loop_reason.cancelled", resourceCulture); } - } - - internal static string cmd_dialog_usage { - get { return ResourceManager.GetString("cmd.dialog.usage", resourceCulture); } - } - - internal static string cmd_dialog_desc { - get { return ResourceManager.GetString("cmd.dialog.desc", resourceCulture); } - } - - internal static string dialog_received { - get { return ResourceManager.GetString("dialog.received", resourceCulture); } - } - - internal static string dialog_cleared { - get { return ResourceManager.GetString("dialog.cleared", resourceCulture); } - } - - internal static string dialog_none { - get { return ResourceManager.GetString("dialog.none", resourceCulture); } - } - - internal static string dialog_dismissed { - get { return ResourceManager.GetString("dialog.dismissed", resourceCulture); } - } - - internal static string dialog_unresolved_title { - get { return ResourceManager.GetString("dialog.unresolved_title", resourceCulture); } - } - - internal static string dialog_unresolved_body { - get { return ResourceManager.GetString("dialog.unresolved_body", resourceCulture); } - } - - internal static string dialog_unresolved_action_disabled { - get { return ResourceManager.GetString("dialog.unresolved_action_disabled", resourceCulture); } - } - - internal static string dialog_input_unknown { - get { return ResourceManager.GetString("dialog.input_unknown", resourceCulture); } - } - - internal static string dialog_input_set { - get { return ResourceManager.GetString("dialog.input_set", resourceCulture); } - } - - internal static string dialog_input_too_long { - get { return ResourceManager.GetString("dialog.input_too_long", resourceCulture); } - } - - internal static string dialog_input_boolean_invalid { - get { return ResourceManager.GetString("dialog.input_boolean_invalid", resourceCulture); } - } - - internal static string dialog_input_option_invalid { - get { return ResourceManager.GetString("dialog.input_option_invalid", resourceCulture); } - } - - internal static string dialog_input_number_invalid { - get { return ResourceManager.GetString("dialog.input_number_invalid", resourceCulture); } - } - - internal static string dialog_input_number_range_invalid { - get { return ResourceManager.GetString("dialog.input_number_range_invalid", resourceCulture); } - } - - internal static string dialog_action_unknown { - get { return ResourceManager.GetString("dialog.action_unknown", resourceCulture); } - } - - internal static string dialog_action_label_unknown { - get { return ResourceManager.GetString("dialog.action_label_unknown", resourceCulture); } - } - - internal static string dialog_action_label_ambiguous { - get { return ResourceManager.GetString("dialog.action_label_ambiguous", resourceCulture); } - } - - internal static string dialog_cannot_cancel { - get { return ResourceManager.GetString("dialog.cannot_cancel", resourceCulture); } - } - - internal static string dialog_action_closed { - get { return ResourceManager.GetString("dialog.action_closed", resourceCulture); } - } - - internal static string dialog_action_command_not_in_play { - get { return ResourceManager.GetString("dialog.action_command_not_in_play", resourceCulture); } - } - - internal static string dialog_action_invalid { - get { return ResourceManager.GetString("dialog.action_invalid", resourceCulture); } - } - - internal static string dialog_action_custom_failed { - get { return ResourceManager.GetString("dialog.action_custom_failed", resourceCulture); } - } - - internal static string dialog_action_command_sent { - get { return ResourceManager.GetString("dialog.action_command_sent", resourceCulture); } - } - - internal static string dialog_action_custom_sent { - get { return ResourceManager.GetString("dialog.action_custom_sent", resourceCulture); } - } - - internal static string dialog_action_nested_opened { - get { return ResourceManager.GetString("dialog.action_nested_opened", resourceCulture); } - } - - internal static string dialog_action_open_url { - get { return ResourceManager.GetString("dialog.action_open_url", resourceCulture); } - } - - internal static string dialog_action_suggest_command { - get { return ResourceManager.GetString("dialog.action_suggest_command", resourceCulture); } - } - - internal static string dialog_action_copy { - get { return ResourceManager.GetString("dialog.action_copy", resourceCulture); } - } - - internal static string dialog_action_unsupported { - get { return ResourceManager.GetString("dialog.action_unsupported", resourceCulture); } - } - - internal static string dialog_tui_pending { - get { return ResourceManager.GetString("dialog.tui_pending", resourceCulture); } - } - - internal static string dialog_tui_unavailable { - get { return ResourceManager.GetString("dialog.tui_unavailable", resourceCulture); } - } - - internal static string dialog_tui_opened { - get { return ResourceManager.GetString("dialog.tui_opened", resourceCulture); } - } - - internal static string dialog_action_unnamed { - get { return ResourceManager.GetString("dialog.action_unnamed", resourceCulture); } - } - - internal static string dialog_action_ok { - get { return ResourceManager.GetString("dialog.action_ok", resourceCulture); } - } - - internal static string dialog_item_body { - get { return ResourceManager.GetString("dialog.item_body", resourceCulture); } - } - - internal static string dialog_server_link_report_bug { - get { return ResourceManager.GetString("dialog.server_link.report_bug", resourceCulture); } - } - - internal static string dialog_server_link_community_guidelines { - get { return ResourceManager.GetString("dialog.server_link.community_guidelines", resourceCulture); } - } - - internal static string dialog_server_link_support { - get { return ResourceManager.GetString("dialog.server_link.support", resourceCulture); } - } - - internal static string dialog_server_link_status { - get { return ResourceManager.GetString("dialog.server_link.status", resourceCulture); } - } - - internal static string dialog_server_link_feedback { - get { return ResourceManager.GetString("dialog.server_link.feedback", resourceCulture); } - } - - internal static string dialog_server_link_community { - get { return ResourceManager.GetString("dialog.server_link.community", resourceCulture); } - } - - internal static string dialog_server_link_website { - get { return ResourceManager.GetString("dialog.server_link.website", resourceCulture); } - } - - internal static string dialog_server_link_forums { - get { return ResourceManager.GetString("dialog.server_link.forums", resourceCulture); } - } - - internal static string dialog_server_link_news { - get { return ResourceManager.GetString("dialog.server_link.news", resourceCulture); } - } - - internal static string dialog_server_link_announcements { - get { return ResourceManager.GetString("dialog.server_link.announcements", resourceCulture); } - } - - internal static string tui_dialog_cancel { - get { return ResourceManager.GetString("tui.dialog.cancel", resourceCulture); } - } - - internal static string dialog_render_header { - get { return ResourceManager.GetString("dialog.render.header", resourceCulture); } - } - - internal static string dialog_render_type { - get { return ResourceManager.GetString("dialog.render.type", resourceCulture); } - } - - internal static string dialog_render_body { - get { return ResourceManager.GetString("dialog.render.body", resourceCulture); } - } - - internal static string dialog_render_inputs { - get { return ResourceManager.GetString("dialog.render.inputs", resourceCulture); } - } - - internal static string dialog_render_input { - get { return ResourceManager.GetString("dialog.render.input", resourceCulture); } - } - - internal static string dialog_render_actions { - get { return ResourceManager.GetString("dialog.render.actions", resourceCulture); } - } - - internal static string dialog_render_action { - get { return ResourceManager.GetString("dialog.render.action", resourceCulture); } - } - - internal static string dialog_render_cancel_hint { - get { return ResourceManager.GetString("dialog.render.cancel_hint", resourceCulture); } - } - - internal static string dialog_input_desc_text { - get { return ResourceManager.GetString("dialog.input_desc_text", resourceCulture); } - } - - internal static string dialog_input_desc_boolean { - get { return ResourceManager.GetString("dialog.input_desc_boolean", resourceCulture); } - } - - internal static string dialog_input_desc_options { - get { return ResourceManager.GetString("dialog.input_desc_options", resourceCulture); } - } - - internal static string dialog_input_desc_number { - get { return ResourceManager.GetString("dialog.input_desc_number", resourceCulture); } - } - - internal static string dialog_input_desc_unknown { - get { return ResourceManager.GetString("dialog.input_desc_unknown", resourceCulture); } - } - - internal static string dialog_action_desc_close { - get { return ResourceManager.GetString("dialog.action_desc_close", resourceCulture); } - } - - internal static string dialog_action_desc_command { - get { return ResourceManager.GetString("dialog.action_desc_command", resourceCulture); } - } - - internal static string dialog_action_desc_custom { - get { return ResourceManager.GetString("dialog.action_desc_custom", resourceCulture); } - } - - internal static string dialog_action_desc_show_dialog { - get { return ResourceManager.GetString("dialog.action_desc_show_dialog", resourceCulture); } - } - - internal static string dialog_action_desc_open_url { - get { return ResourceManager.GetString("dialog.action_desc_open_url", resourceCulture); } - } - - internal static string dialog_action_desc_suggest { - get { return ResourceManager.GetString("dialog.action_desc_suggest", resourceCulture); } - } - - internal static string dialog_action_desc_copy { - get { return ResourceManager.GetString("dialog.action_desc_copy", resourceCulture); } - } - - internal static string dialog_action_desc_unknown { - get { return ResourceManager.GetString("dialog.action_desc_unknown", resourceCulture); } - } - - internal static string dialog_type_notice { - get { return ResourceManager.GetString("dialog.type.notice", resourceCulture); } - } - - internal static string dialog_type_confirmation { - get { return ResourceManager.GetString("dialog.type.confirmation", resourceCulture); } - } - - internal static string dialog_type_multi_action { - get { return ResourceManager.GetString("dialog.type.multi_action", resourceCulture); } - } - - internal static string dialog_type_dialog_list { - get { return ResourceManager.GetString("dialog.type.dialog_list", resourceCulture); } - } - - internal static string dialog_type_server_links { - get { return ResourceManager.GetString("dialog.type.server_links", resourceCulture); } - } - - internal static string dialog_type_unknown { - get { return ResourceManager.GetString("dialog.type.unknown", resourceCulture); } - } - - internal static string dialog_input_kind_text { - get { return ResourceManager.GetString("dialog.input_kind.text", resourceCulture); } - } - - internal static string dialog_input_kind_boolean { - get { return ResourceManager.GetString("dialog.input_kind.boolean", resourceCulture); } - } - - internal static string dialog_input_kind_options { - get { return ResourceManager.GetString("dialog.input_kind.options", resourceCulture); } - } - - internal static string dialog_input_kind_number { - get { return ResourceManager.GetString("dialog.input_kind.number", resourceCulture); } - } - - internal static string dialog_input_kind_unknown { - get { return ResourceManager.GetString("dialog.input_kind.unknown", resourceCulture); } - } - - internal static string dialog_render_help_hint { - get { return ResourceManager.GetString("dialog.render.help_hint", resourceCulture); } - } - - internal static string protocol_chat_raw_message { - get { return ResourceManager.GetString("protocol.chat.raw_message", resourceCulture); } - } - - } -} diff --git a/MinecraftClient/Resources/Translations/Translations.resx b/MinecraftClient/Resources/Translations/Translations.resx deleted file mode 100644 index 117e58067a..0000000000 --- a/MinecraftClient/Resources/Translations/Translations.resx +++ /dev/null @@ -1,3133 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Weather change: It is no longer raining. - - - Weather change: It is no longer a thunderstorm. - - - Weather change: It is raining now. - - - Weather change: It is a thunderstorm. - - - Invalid walk range provided, must be a positive integer greater than 0, using default value of 5! - - - The terrain handling is not enabled in the settings of the client, enable it if you want to use it with this bot. Using alternative (command) method. - - - The time range begins with a bigger value, swapped them around. - - - Attack cooldown value cannot be smaller than 0. - - - Crafting aborted! Check your available materials. - - - Auto-crafting ChatBot command alias - - - Available commands: {0}. Use /autocraft help <cmd name> for more information. - - - Inventory #{0} was closed by AutoCraft - - - Auto-crafting ChatBot command - - - Total {0} recipes loaded: {1} - - - Crafting failed! Waiting for more materials - - - Duplicate recipe name specified: {0} - - - Missing recipe name while parsing a recipe - - - Get the command description. Usage: /autocraft help <command name> - - - List available recipes. - - - Load the config file. - - - Reload the config file. - - - Write the default example config to default location. - - - Start the crafting. Usage: /autocraft start <recipe name> - - - Stop the current running crafting process - - - Invalid result item! - - - The number of slots does not match and has been adjusted automatically. - - - Missing material: {0} - - - Please specify the recipe name you want to craft. - - - Specified recipe name does not exist. Check your config file. - - - Starting AutoCraft: {0} - - - AutoCraft cannot be started. Check your available materials for crafting {0} - - - AutoCraft stopped - - - table not found - - - Action timeout! Reason: {0} - - - Available commands: {0}. Use /autodig help <cmd name> for more information. - - - Auto-digging ChatBot command - - - Digging block timeout, retry. - - - Get the command description. Usage: /autodig help <command name> - - - Start the automatic digging bot. - - - Deactivate the automatic digging bot. - - - The block currently pointed to is not in the allowed list. - - - Inventory handling is not enabled. Unable to switch tools automatically. - - - Dropped low durability {0} from slot {1}. - - - Automatic digging has started. - - - Digging will start in {0:0.0} second(s). - - - Auto-digging has been stopped. - - - Switch to {0} from slot {1}. - - - Added item {0} - - - AutoDrop ChatBot command alias - - - AutoDrop ChatBot command - - - Incorrect item name {0}. Please try again. - - - Total {0} in the list: - {1} - - - Item not in the list - - - Cannot find inventory {0}! - - - No item in the list - - - Cannot read drop mode from config. Using include mode. - - - AutoDrop disabled - - - AutoDrop enabled - - - Removed item {0} - - - Switched to {0} mode. - - - Unknwon mode. Available modes: Include, Exclude, Everything - - - Available commands: {0}. Use /fish help <cmd name> for more information. - - - Casting timeout and will soon retry. (Timeout increased to {0:0.0} sec). - - - Retract the fishing rod. (Count: {0}) - - - Retract the fishing rod at ({0:0.0},{1:0.0},{2:0.0})! (Count: {3}) - - - Auto-Fishing ChatBot command - - - Fish floating despawn, will re-cast. - - - Fishing timeout, will soon re-cast. - - - Fishing got {0} - - - Get the command description. Usage: /fish help <command name> - - - Start auto-fishing. - - - List all obtained items. Or use "/fish status clear" to clear the list. - - - Stop auto-fishing. - - - Inventory handling is not enabled. Cannot check rod durability and switch rods. - - - Current fishing rod is not available. Maybe broken or low durability? - - - Start auto-fishing. - - - Fishing will start in {0:0.0} second(s). - - - The record of the obtained items has been cleared. - - - All items obtained from fishing (not entirely accurate): - - - Stop auto-fishing. - - - Switch to the rod in slot {0}, durability {1}/64. - - - Casting successfully. - - - Update yaw = {0:0.00}, pitch = {1:0.00}. - - - Current directory was: {0} - - - Got disconnected with message: {0} - - - Disconnection initiated by User or MCC bot. Ignoring. - - - Launching with {0} reconnection attempts - - - Initializing without a kick message file - - - Message contains '{0}'. Reconnecting. - - - Ignoring kick message, reconnecting anyway. - - - Message not containing any defined keywords. Ignoring. - - - Waiting {0:0.000} seconds before reconnecting... - - - Waiting {0:0.000} seconds before reconnecting... ({1} retries left) - - - unlimited - - - File not found: '{0}' - - - Loaded match: -{0} - - - Loading matches from '{0}' - - - match: {0} -regex: {1} -action: {2} -actionPrivate: {3} -actionOther: {4} -ownersOnly: {5} -cooldown: {6} - - - Running action: {0} - - - No action for match: -{0} - - - This match will never trigger: -{0} - - - Path '{0}' contains invalid characters. - - - Sending message to Discord was canceled due an error occuring. For more info enable Debug. - - - The provided channel with an id '{0}' has not been found! - - - The command was executed with the result - - - Succesfully connected with MCC! - - - This command allows you to specify in the which direction the messages will be relayed via the Discord Bridge chat bot. - - - Direction of the Discord Brdige has been switched to '{0}'! - - - Both - - - Discord - - - Minecraft - - - Successfully disconnected with MCC! - - - The provided guild/server with an id '{0}' has not been found! - - - Invalid direction provided! Available directions: both|b, minecraft|mc, discord|dsc. Example: "dscbridge direction mc" - - - Please provide a valid token! - - - An unknown error has occured! - - - Please provide a valid Discord Application ID! Get one at https://discord.com/developers/applications - - - Connected to Discord as {0} - - - Failed to connect to Discord (pipe {0}). Is Discord running? - - - Discord Rich Presence initialized successfully. - - - Failed to initialize Discord Rich Presence: {0} - - - Error updating Discord presence: {0} - - - Invalid update interval, must be at least 1 second. Using default of 10 seconds. - - - The bot is already farming! - - - The bot has already stopped farming! - - - Crop type - - - {0} is only available in Minecraft {1} and newer! - - - Farming bot - - - Invalid crop type provided (Types which you can use: Beetroot, Carrot, Melon, Netherwart, Pumpkin, Potato, Wheat)! - - - Invalid radius provided, you must provide a valid integer number greater than 0! - - - The Farmer bot needs Inventory Handling in order to work, please enable it! - - - The Farmer bot needs Terrain Handling in order to work, please enable it! - - - Not implemented below 1.8! - - - Radius - - - Started farming! - - - Stopped farming! - - - Stoping farming, this might take a second... - - - You have enabled teleporting, this might get your bot account kicked and in the worst case scenario banned! Use with caution! - - - You have enabled un-safe movement, the bot might get hurt! - - - Invalid parameter "{0}" provided (Use format: "key:value")! - - - mailer command - - - --- Ignore list --- -{0} - - - --- Mails in database --- -{0} - - - See usage - - - Added {0} to the ignore list! - - - Missing or invalid name. Usage: {0} <username> - - - Removed {0} from the ignore list! - - - Creating new database file: {0} - - - Creating new ignore list: {0} - - - Delivered: {0} - - - Initializing Mailer with settings: - - -  - Database File: {0} - - -  - Max Database Size: {0} - - -  - Ignore List: {0} - - -  - Mail Retention: {0} - - -  - Max Mails per Player: {0} - - -  - Public Interactions: {0} - - - Cannot enable Mailer: Max Database Size must be greater than zero. Please review the settings. - - - Cannot enable Mailer: Mail Retention must be greater than zero. Please review the settings. - - - Cannot enable Mailer: Max Mails per Player must be greater than zero. Please review the settings. - - - Loading database file: {0} - - - Loading ignore list: - - - Looking for mails to send @ {0} - - - Saving message: {0} - - - {0} is ignored! - - - Render maps (item maps) - - - Invalid ID provided, must be a number! - - - A map with id '{0}' does not exists! - - - Failed to render the map with id: '{0}' - - - - Map id: {0} (Last Updated: {1}) - - - No maps received! - - - The list of received maps from the server: - - - Received a new Map, with Id: {0} - - - Succesfully rendered a map with id '{0}' to: '{1}' - - - Resized the rendered image of the map with id: '{0}' to {1}x{1}. - - - The size of the map is reduced from ({0}x{1}) to ({2}x{3}) due to the size limitation of the current terminal. - - - Sent a rendered image of a map with an id '{0}' to the Discord via Discord Brdige chat bot! - - - Sent a rendered image of a map with an id '{0}' to the Telegram via Telegram Bridge chat bot! - - - Map #{0} ({1}x{2}) [{3}%] - - - Scroll=Zoom Drag=Pan +/-=Zoom Arrows=Pan Esc/E=Close - - - replay command - - - Replay file created. - - - Record was stopped. Restart the program to start another record. - - - Record stopped. - - - Script '{0}' failed to run ({1}). - - - File not found: '{0}' - - - [MCC] [{0}] Cannot find script file: {1} - - - Script '{0}' loaded. - - - Error in {0} at line {1}, column {2}: [{3}] {4} - - - Error in {0}: [{1}] {2} - - - [Script] Compilation failed with error(s): - - - [Script] Starting compilation for {0}... - - - [Script] Compilation done with no errors. - - - Loaded task: -{0} - - - No action for task: -{0} - - - This task will never trigger: -{0} - - - Interval / Running action: {0} - - - Login / Running action: {0} - - - Time / Running action: {0} - - - triggeronfirstlogin: {0} - triggeronlogin: {1} - triggerontime: {2} - triggeroninterval: {3} - timevalue: {4} - timeinterval: {5} - action: {6} - - - Sending message to Telegram was canceled due an error occuring. For more info enable Debug. - - - The command was executed with the result - - - Succesfully connected with the MCC! - - - This command allows you to specify in the which direction the messages will be relayed via the Telegram Bridge chat bot. - - - Direction of the Telegram Brdige has been switched to '{0}'! - - - Both - - - Minecraft - - - Telegram - - - Disconnected from from the MCC! - - - Invalid direction provided! Available directions: both|b, minecraft|mc, telegram|tg|t. Example: "tgbridge direction mc" - - - [WARNING] You have not provided any Channel IDs, for "Authorized_Chat_Ids" field, anyone who finds your bot will be able to send messages and commands to it! - - - [WARNING] You have not provided a Channel ID, you will ONLY get replies to commands sent from Telegram! - - - Please provide a valid bot token! - - - **🛑 Unauthorized access! 🛑 - -Add the ID of this chat to "Authorized_Chat_Ids" field in the configuration file to gain access!** - - - An unknown error has occured! - - - Bot: {0} said : {1} - - - Bot: {0} told me : {1} - - - Alerts - - - AntiAFK - - - AutoAttack - - - AutoCraft - - - AutoDig - - - AutoDrop - - - AutoEat - - - AutoFishing - - - AutoRelog - - - AutoRespond - - - ChatLog - - - DiscordBridge - - - DiscordRpc - - - Farmer - - - FollowPlayer - - - HangmanGame - - - Mailer - - - Map - - - PlayerListLogger - - - RemoteControl - - - ReplayCapture - - - Script - - - ScriptScheduler - - - TelegramBridge - - - TestBot - - - Minecraft Console Client v{0} - for MC {1} to {2} - {3} - - - ⭐ Like MCC? Star us on GitHub: https://github.com/MCCTeam/Minecraft-Console-Client - - - Supported MC Versions: - - - Server: - - - Version: - - - Protocol: {0} - - - Players: - - - Ping: - - - {0} ms - - - Connecting as: - - - Online Players: - - - ... +{0} - - - Server reported protocol {0} ({1}), upgraded to {2} ({3}) for best compatibility - - - Converting session cache from disk: {0} - - - Ignoring invalid session token line: {0} - - - Ignoring invalid profile key token line: {0} - - - Ignoring session token string '{0}': {1} - - - Ignoring profile key token string '{0}': {1} - - - Loaded session: {0}:{1} - - - Loaded profile key, it will be refresh at {0} - - - Loading Minecraft profiles: {0} - - - Loading profile key cache from disk: {0} - - - Loading session cache from disk: {0} - - - Got malformed data while reading serialized session cache from disk: {0} - - - Failed to read serialized session cache from disk: {0} - - - Failed to read session cache from disk: {0} - - - Failed to read profile key cache from disk: {0} - - - Failed to write session cache to disk: {0} - - - Failed to write profile key cache to disk: {0} - - - Saving session cache to disk - - - Saving profile key cache to disk - - - Done. File saved as '{0}' - - - Downloading '{0}.json' from Mojang servers... - - - Failed to download the file. - - - Translations file loaded. - - - Player {0}'s message chain is broken! - - - Translations file not found: '{0}' -Some messages won't be properly printed without this file. - - - Performing request to {0} - - - Failed to save the file {0}. - - - Switch to use Minecraft's default language resource "en_us.json". - - - [{0}] Disconnecting and Reconnecting to the Server - - - Swing your arm. - - - Could not find a bed! - - - Can not reach the bed safely! - - - Used to sleep in or leave a bed. - - - Failed to reach the bed position (X: {0:0.0}, Y: {1:0.0}, Z: {2:0.0}) in time (30 seconds). Giving up! - - - Found a bed at (X: {0:0.0}, Y: {1:0.0}, Z: {2:0.0}). - - - Succesfully laid in bed! - - - Sending a command to leave a bed to the server. - - - Moving to (X: {0:0.0}, Y: {1:0.0}, Z: {2:0.0}) where the bed is located. - - - The block on (X: {0:0.0}, Y: {1:0.0}, Z: {2:0.0}) is not a bed! - - - Could not lay in bed. Are you trying to sleep in a bed? (PS: You must use the head block coordinates of the bed) - - - Searching for a bed in radius of {0:0.00}... - - - Trying to sleep in a bed on location (X: {0:0.0}, Y: {1:0.0}, Z: {2:0.0}). Result: {3} - - - Blocks around - - - Block type - - - Reports the type of the block on the provided coordinates. (Use -s to report blocks around the target block). - - - Negative - - - Positive - - - List bots, unload a bot or all bots. - - - Loaded bots - - - No bots loaded! - - - Bot {0} is not loaded, check if you have made a typo! - - - Successfully unloaded bot: {0} - - - Successfully unloaded all bots! - - - Changed to slot {0} - - - Change slot in hotbar - - - Could not change slot - - - Could not change slot: Not a Number - - - chunk: ({0}, {1}). - - - Current location:{0}, chunk: ({1}, {2}). - - - Displays the chunk loading status. -Change EnableEmoji=false in the settings if the display is confusing. - - - This command is used for debugging, make sure you know what you are doing. - - - Player:{0}, MarkedChunk:{1}, NotReceived:{2}, Loading:{3}, Loaded:{4} - - - Marked location: - - - Since the marked chunk is outside the graph, it will not be displayed! - - - connect to the specified server. - - - Invalid server IP '{0}'. - - - Unknown account '{0}'. - - - toggle chat visibility in the console. - - - Console chat output is now hidden. - - - Console chat output is now visible. - - - clear the console output. - - - toggle debug messages. - - - Debug messages are now OFF - - - Debug messages are now ON - - - Attempt to break a block - - - Attempting to dig block at {0} {1} {2} ({3}) - - - Failed to start digging block. - - - No block at this location (Air) - - - You are too far away from this block. - - - Drop specified type of items from player inventory or opened container - - - Dropped all {0} from inventory #{1} - - - Unknown item {0} - - - Sent a click to the server, if you have enough levels and if you have placed the items in the correct slots it should enchant! - - - Enchant an item when you have the Enchantment table opened and the list of enchants recieved. - - - You must put an item inside the enchanting table in slot 0! - - - You must put at least 3 lapis lazuli inside the enchanting table in slot 1! - - - You must open a an enchanting table in order to use this option! - - - Invalid slot provided (Available: top, middle, bottom)! - - - Could not click! - - - You must first put an item to enchant to the enchanting table in order to get enchantments from the server, then you can execute this command! - - - You do not have enouhg levels to enchant! (Your current level is {0}, you need to be level {1}). - - - Entity attacked - - - Boots - - - Chestplate - - - Custom Name - - - Distance - - - Entities - - - Entity - - - Equipment - - - Health - - - Helmet - - - Item - - - Latency - - - Leggings - - - Location - - - Main Hand - - - Nickname - - - Entity not found - - - Off Hand - - - Pose - - - Type - - - Entity used - - - Allows you to execute a command if a condition is met. (You can use variables from MinecraftClient.ini and /set command, as well as CSharp expressions) - - - Error: {0} - - - An error has occured while executing the command: {0} - - - The condition '{0}' was met, executed command '{1}' with result '{2}'. - - - The condition '{0}' was met, executed command '{1}', no result was returned. - - - Execute multiple commands one after another - - - Executed the command '{0}' with {1} - - - no result! - - - You can not use execmulti or execif within execmulti command! - - - result '{0}'! - - - disconnect from the server. - - - Already following {0}! - - - Already stopped - - - Can not reach the player, he is either in chunks that are not loaded, too far away or not reachable by a bot due to obstacles like gaps or water bodies! - - - Makes the bot follow a specified player - - - Invalid or empty player name provided! - - - The specified player is either not connected out out of the range! - - - NOTE: The bot is quite slow, you need to walk slowly and at a close distance for it to be able to keep up, kinda like when you make animals follow you by holding food in your hand. This is a limitation due to a pathfinding algorithm, we are working to get a better one. - - - Pausing! - - - The player {0} came back to the range! - - - The player {0} left the server! - - - The player {0} has left the range! - - - Resuming to follow! - - - Started following {0}! - - - Stopped following! - - - Switched to following {0}! - - - Enabled us-safe walking (NOTE: The bot might die or get hurt!) - - - follow <player name|stop> [-f] (Use -f to enable un-safe walking) - - - list your currently active effects. - - - - {0} ({1}) - - - Active effects: - - - No active effects. - - - try a recommended feature. - - - Available tryouts: - - - tui: set [Console.General] ConsoleMode = "tui" for the next restart. - - - [Console.General] ConsoleMode is already "tui" in the config. To switch back, set [Console.General] ConsoleMode = "classic". Restart MCC after changing it for the new mode to take effect. - - - Updated [Console.General] ConsoleMode from "{0}" to "{1}" in the config. To switch back, set [Console.General] ConsoleMode = "classic". Restart MCC to apply the change. - - - Display Health and Food saturation. - - - Health: {0}, Saturation: {1}, Level: {2}, TotalExperience: {3} - - - {0} clicking slot {1} in window #{2} - - - Closing Inventoy #{0} - - - Failed to close Inventory #{0} - - - Cannot find container, please retry with explicit ID - - - Requested to clear slot #{0} - - - Requested {0} x{1} in slot #{2} - - - Failed to request Creative action - - - Damage - - - Inventory command - - - Dropped 1 item from slot #{0} - - - Dropped whole item stack from slot #{0} - - - Found items - - - Available actions - - - Basic usage - - - Click on an item. - - - Close an opened container. - - - Clear slot in creative mode. - - - Give item in creative mode. - - - Drop an item from inventory. - - - {0} -Use '/inventory help <action>' for action help. -'player' and 'container' can be simplified to 'p' and 'c'. -Note that parameters in '[]' are optional. - - - List avaliable inventories - - - List your inventory. - - - Search for an item in avaliable Inventories - - - Shift click an item. - - - Unknown action. - - - Usage - - - Your selected hotbar is {0} - - - Inventories - - - Available Inventories - - - Inventory - - - Left - - - Middle - - - You must be in Creative gamemode - - - Inventory #{0} do not exist - - - Could not find the specified item in any of avaliable Inventories! - - - No item in slot #{0} - - - Right - - - Shift - - - Shift click failed, this may be because this container type is not supported - - - get the player list. - - - PlayerList: {0} - - - show a vanilla-like tab list. In TUI mode, opens a live overlay. - - - No listed players are currently tracked. - - - Tab list ({0} players) - - - Ping - - - Team - - - Player - - - Live tab overlay opened. - - - The tab overlay is not available right now. - - - log some text to the console. - - - Looking at yaw: {0} pitch: {1} - - - Looking at {0} - - - look at direction or coordinates. - - - The block currently intersecting the line of sight is {0} ({1:0}, {2:0}, {3:0}), distance is {4:0.0}({5:0.0}). - - - There is no block within {0} meters that intersects with the line of sight. - - - Unknown direction '{0}' - - - Chunk loading status: {0:P} - {1} out of {2} load completed. - - - The chunk where the target location resides has not yet been loaded. -You can use "/chunk status {0:0.0} {1:0.0} {2:0.0}" to check the chunk loading status. - - - walk or start walking. - - - force unsafe movements like falling or touching fire - - - Cannot move in that direction. - - - Disabling Terrain and Movements. - - - Enabling Terrain and Movements on next server login, respawn or world change. - - - Failed to compute path to {0} - - - Gravity is disabled. - - - Gravity is enabled. - - - Moving {0} - - - Failed to compute a safe path to {0}. Try -f parameter to allow unsafe movements. - - - Walking from {1} to {0} - - - restart and reconnect to the server. - - - Reloads MCC settings. - - - Reloaded Settings! - - - Reloading settings... - - - This command will NOT affect certain settings which are used before connecting to a server! - - - Some settings passed through the command line parameters might get overriden! - - - You also might need to reconnect for some settings to take effect. - - - Replay Chat Bot will not be hard reloaded due to technical limitations! - - - Use this to respawn if you are dead. - - - You have respawned. - - - run a script file. - - - send a chat message or command. - - - set a custom %variable%. - - - variable name must be A-Za-z0-9. - - - set a custom %variable% randomly to a given value. - - - setrnd variable -7 to 17 OR setrnd variable string1 "\"string2\" string3" - - - setrnd variable -7 to 17 - - - setrnd variable string1 "\"string2\" string3" - - - Toggles sneaking - - - You are not sneaking anymore - - - You are sneaking now - - - Current tps - - - Display server current tps (tick per second). May not be accurate - - - List all scoreboard teams and their members. - - - No teams are currently tracked. - - - Team '{0}' (display: {1}, color: {2}, prefix: '{3}', suffix: '{4}', nameTagVisibility: {5}, collisionRule: {6}, friendlyFire: {7}, seeInvisibles: {8}) - - - Members ({0}): {1} - - - No members. - - - Place a block or open chest - - - Useblock at ({0:0.0}, {1:0.0}, {2:0.0}) {3}. - - - Use the item in your hand, optionally on a specific block - - - Used an item - - - Failed to write to backup file {0} - - - The color code {1} in {0} is in illegal format and the default value has been restored. - - - Settings have been loaded from {0} - - - Failed to load settings: - - - The language code is invalid! - - - The current setting is saved as {0} - - - Failed to write to settings file {0} - - - Color test: Your terminal should display {0} - - - Crypto keys & hash generated. - - - No profile keys could be loaded from disk - - - Profile keys has been successfully loaded from disk. - - - Performing request to {0} - - - No sessions could be loaded from disk - - - Session data has been successfully loaded from disk. - - - Success. (session ID: {0}) - - - Bottom slot - - - Enchantments available - - - Levels - - - Middle slot - - - Top slot - - - Got error code from server while refreshing authentication: {0} - - - Failed to connect to this IP. - - - A timeout occured while attempting to connect to this IP. - - - Failed to determine server version. - - - Forge Login Handshake did not complete successfully - - - Cannot force Forge support for this Minecraft version! - - - Forge StartEncryption Handshake did not complete successfully - - - Invalid usage of the generator command! - - - The provided path must be a path to a file that is in .json format! - - - Invalid data path provided! (The path either does not exists or you have made a typo) - - - Got error code from server: {0} - - - Invalid response to StartEncryption packet - - - Invalid response to Handshake packet - - - This feature requires Inventory Handling to be enabled in order to work! - - - An error occured when attempting to join this server. - - - Login failed : - - - Incorrect username/password, blacklisted IP or too many logins. - - - User cancelled. - - - Account migrated, use e-mail as username. - - - Network error. - - - User not premium. - - - Invalid server response. - - - Login servers are unavailable. Please try again later. - - - SSL Error. - - - Unknown Error. - - - Failed to login to this server. - - - You are missing argument {0} - - - Server does not report its protocol version, autodetection will not work. - - - Failed to ping this IP. - - - This Realms world does not exist or access was denied - - - Trying to join a Realms world but Realms support is disabled in config - - - Cannot retrieve the server IP of your Realms world - - - Invalid or unknown Realms server ID. - - - Realms server may require some time to start up. Please retry again later. - - - {0}: Invalid syntax, expecting --argname=value or --section.argname=value - - - This feature requires Terrain And Movements to be enabled in order to work! - - - Connection Timeout - - - Unexpected response from the server (is that a Minecraft server?) - - - Cannot connect to the server : This version is not supported ! - - - Usage: - - - Server reports a different version than manually set. Login may not work. - - - ChatBot methods should NOT be called in the constructor as API handler is not initialized yet. Override Initialize() or AfterGameJoined() instead to perform initialization tasks. - - - The provided script does not have a valid MCCScript header - - - Failed to process incoming packet of type {0}. (PacketID: {1}, Protocol: {2}, LoginPhase: {3}, InnerException: {4}). - - - Please update block types handling for this Minecraft version. See Material.cs - - - Please update entity types handling for this Minecraft version. See EntityType.cs - - - Please update health field handling for this Minecraft version. - - - Please update item types handling for this Minecraft version. See ItemType.cs - - - Please update packet type palette for this Minecraft version. See PacketTypePalette.cs - - - Unknown direction - - - User-initiated logout should be done by calling Disconnect() - - - The protocol version no.{0} is not supported. - - - Entities are currently not handled for that MC version. - - - Please enable EntityHandling in the config file first. - - - Inventory # {0} closed. - - - Inventories are currently not handled for that MC version. - - - Inventory handling is now enabled. - - - Use /inventory to interact with it. - - - Inventory # {0} opened: {1} - - - Please enable InventoryHandling in the config file first. - - - Terrain & Movements currently not handled for that MC version. - - - Terrain and Movements is now enabled. - - - Please enable Terrain and Movements in the config file first. - - - [{0}] Failed to initialize FileSystemWatcher, retrying using Polling - - - [{0}] Initializing FileSystemWatcher for file: {1} - - - Accepting server mod list... - - - Accepting server registries... - - - Forge server connection complete! - - - Acknowledging FML2 Server Config: {0} - - - Received FML2 Server Mod List - - - Sending back FML2 Client Mod List - - - Acknowledging FML2 Server Registry: {0} - - - Got Unknown FML2 Handshake message no. {0} - - - Ignoring Unknown FML2 LoginMessage channel: {0} - - - Mod list: - - - Server is running Forge without mods. - - - Received registry with {0} entries - - - Received registry {0} with {1} entries - - - Sending falsified mod list to server... - - - Forge protocol version : {0} - - - Server is running Forge with {0} mods. - - - Available commands: {0} - - - This bot will be unloaded. - - - Done - - - Fail - - - OnInternalCommand: Got error from {0}: {1} - - - help <cmdname>: show brief help about a command. - - - help <cmdname>. Available commands: -{0}For server help, use '{1}send /help' instead. - - - Unknown command '{0}'. Use 'help' for command list. - - - The old MinecraftClient.ini has been backed up as {0} - - - Paste your code here: - - - Your browser should open automatically. If not, open the link below in your browser. - - - Connecting to {0}... - - - Select a login method: [1] Offline, [2] Online (Microsoft), [3] Yggdrasil - - - Please choose 1, 2, or 3. - - - Authlib-injector URL: - - - The authlib-injector URL must be an absolute HTTP or HTTPS URL. - - - Could not reach the authlib-injector server. Check the URL and try again. - - - The server did not return valid authlib-injector metadata. Check the URL and try again. - - - The configured authlib-injector URL must be an absolute HTTP or HTTPS URL. - - - Tip: try TUI mode for a cleaner interface, mouse-friendly inventory actions, and a nicer layout. Run {0}tryout tui§8 to switch [Console.General] ConsoleMode to "tui" for the next restart. - - - MCC encountered a problem while starting TUI mode. - - - As a fallback, MCC has automatically switched [Console.General] ConsoleMode to "classic". This will take effect after you restart MCC. - - - Please report this issue to the MCC Team. - - - To sign in, open {0} in your browser and enter the code: §e{1} - - - Waiting for authentication to complete... - - - Login failed : - - - Connection has been lost. - - - Disconnected by Server : - - - Not connected to any server. Use '{0}help' for help. - - - Fetching profile key from Microsoft. - - - Checking if server is running Forge... - - - Force-enabling Forge support. - - - Found server {0}:{1} for domain {2} - - - Succesfully generated {0} palette using the dataset: {1} - - - Generating {0} palette using the dataset: {1} - - - New configuration file "{0}" is generated. - - - Handshake successful. (Server ID: {0}) - - - A new version of MCC is available and you can download it via /upgrade -Or download it manually: {0} - - - Help us translate MCC: {0} - - - Failed to parse the settings file, enter "{0}new" to generate a new configuration. - - - Server IP : - - - Server was successfully joined. -Type '{0}quit' to leave the server. - - - Link: {0} - - - Login : - - - Please type the username or email of your choice. - - - Failed to perform SRV lookup for {0} -{1}: {2} - - - You chose to run in offline mode. - - - Please type the password for {0}. - - - Password(invisible): - - - Authlib server host: - - - Authlib server port [{0}]: - - - Authlib-Injector API path [{0}]: - - - Use HTTPS? [Y/n] - - - The authlib server host cannot be empty. - - - The authlib server port must be between 1 and 65535. - - - Please answer yes or no. - - - You are dead. Type '{0}respawn' to respawn. - - - You are dead. Automatically respawning after 1 second. - - - Or press Enter to exit Minecraft Console Client. - - - Cached profile key needs to be refreshed. - - - Cached profile key is still valid for {0}. - - - You have access to the following Realms worlds - - - Use realms:<index> as server IP to join a Realms world - - - Waiting 5 seconds ({0} attempts left)... - - - Resolving {0}... - - - Restarting Minecraft Console Client... - - - Cannot send text: not connected to a server. - - - Waiting {0} seconds before restarting... - - - Retrieving Server Info... - - - -MCC is running with default settings. - - - Server is in offline mode. - - - Server version: {0} (protocol v{1}) - - - Server version: - - - Checking Session... - - - Failed to check session. - - - Cached session is invalid or expired. - - - Cached session is still valid for {0}. - - - Settings file MinecraftClient.ini has been generated. - - - Unknown or not supported MC version {0}. -Switching to autodetection mode. - - - The current version is already up to date or is a development build. - - - Checking for updates has already started. - - - The download has been cancelled. - - - Unable to check for updates from Github, please check your internet connection or enable proxy. - - - Self-updating: Download is complete, decompressing. - - - Self-updating: An error occurred while downloading or saving the file: - - - Self-updating: New version detected: "{0}", download will start soon (platform: {1}). - - - The latest release does not contain a build that matches your operating system and CPU architecture. - - - Self-updating: {0:00.00}%, ETA {4}, Downloaded {1:00.0}MB of {2:00.0}MB, Avg {3:0.0}KB/s - - - Self-updating: Downloaded {0:00.0}MB, Avg {1:0.0}KB/s - - - Add "-f" to force the download. - - - Use "--force-upgrade" to force the download. - - - Self-updating: File saved as: {0} - - - Start checking for updates. - - - Please use the newly generated MinecraftClient.ini - - - Using Minecraft version {0} (protocol v{1}) - - - Version is supported. -Logging in... - - - , with Forge - - - Connected to proxy {0}:{1} - - - Mining of the block located at {0} ends. - - - Cancel mining the block located at {0}. - - - This command has been disabled due to Telegram caching causing issues, please stop your client manually. - - - Collect items on the ground - - - itemscollector <start/stop> - - - Already collecting items! - - - Started collecting items! - - - Already not collecting items! - - - Stopping item collection... - - - Stopped collecting items. - - - §cFailed to start a server! The provided IP address is not a valid one! - - - §cFailed to start a server! The provided port number {0} is out of the range, it must be 65535 or bellow it! - - - - - - Starting the Websocket server... - - - §bServer started on ip §a{0}§b port: §a{1} - - - §cFailed to start a server:\n\n{0}\n\n - - - §bNew session connected: §a{0} - - - §bSession with an id §a{0}§b has disconnected! - - - §bSession with an id §a{0}§b has been renamed to: §a{1}§b! - - - §cSession with an id §a{0}§b failed to change the ID to: §c{1}§b! - - - §bSession with an id §a{0}§b has been successfully authenticated! - - - The item name cannot be empty! - - - You need to have an Anvil inventory opened and active in order to use this command! - - - You need to place an item in the first slot (slot id: 0) of the Anvil inventory! - - - Failed to send the packet for naming an item, try again! - - - Successfully sent the item name to the server, you can now click on the slot number 2 in the Anvil inventory to rename the item. - - - Set an item name when an Anvil inventory is active and the item is in the first slot. - - - Failed to send recipe book craft request for {0}. - - - Requested recipe {0}. - - - Requested recipe {0} with craft-all. - - - List unlocked recipe book recipes and craft them through the active recipe book inventory. - - - Unlocked recipe book recipes - - - You need an active player crafting grid, crafting table, furnace, blast furnace, smoker, or stonecutter inventory. - - - No unlocked recipe book recipes are currently tracked. - - - The recipe identifier cannot be empty. - - - Recipe book crafting is only supported on Minecraft 1.13 and newer. - - - Bot movement lock is held by bot {0}, so the Anti AFK bot might not move! - - - You can not start/run/use the '{0}' bot because it requires movement, the movement is currently utilized by the '{1}' bot, stop it if you want to use this one. - - - Minimum number that you have provided is bigger than the maximum, swapping them around! - - - Shift right - - - Avaliable profiles: - - - Selected profile: - - - Select a profile from available profiles: - - - MCC uses Sentry to log errors. You can opt-out by setting the EnableSentry option in the configuration file to false. - - - Use '{0}quit' to exit Minecraft Console Client. - - - MCC Debug State - - - Server - - - Username - - - Protocol - - - GameMode - - - Health - - - Food - - - Location - - - TPS - - - Console - - - Features - - - Debug - - - Bots - - - Players - - - {0} online - - - Open interactive TUI inventory viewer (TUI mode only). - - - Interactive TUI is only available in TUI console mode. Use '/inventory <id> list' instead. - - - TUI inventory viewer is already running. - - - Opening TUI for Inventory #{0}... - - - Inventory dialog opened. - - - Failed to launch TUI inventory viewer. - - - TUI viewer does not support this container type (Inventory #{0}). Use '/inventory {0} list' to view its contents. - - - Hold Shift + Left-click to select and copy text. - - - Input cleared. Press Ctrl+C again to quit. - - - Press Ctrl+C again to quit MCC. - - - [ Item Info ] - - - [ Held Item ] - - - [ Controls ] - - - LClick Pick/Place -RClick Half/Place1 -Shift+C QuickMove -Q Drop x1 -Ctrl+Q Drop Stack -R Refresh -E/ESC Exit - - - (empty) - - - Off - - - Out - - - Hd - - - Bd - - - Lg - - - Ft - - - Hover over a slot to -see item details. - - - (Empty) - - - Slot #{0} Count: {1} - - - Durability - - - Container not found - - - Inventory #{0} - {1} - - - {0} items - - - Press Esc to close. Refreshes automatically. - - - You're now under {0} effect (Duration: {1}). - - - Effect {0} has expired - - - Unlimited - - - a - - - an - - - {0}h - - - {0}h {1}m - - - {0}m - - - {0}m {1}s - - - {0}s - - - ∞ - - - {0} {1} - - - Container - - - Input - - - Fuel - - - Output - - - Item - - - Lapis - - - Enchant Options - - - Option {0} - - - Fuel - - - Ingredient - - - Bottle {0} - - - Input 1 - - - Input 2 - - - Crafting - - - McpServer - - - Starting embedded MCP server... - - - Embedded MCP server started on {0} - - - Failed to start embedded MCP server: {0} - - - Embedded MCP auth token is required but environment variable {0} is empty. - - - Embedded MCP server stopped. - - - Failed to stop embedded MCP server cleanly: {0} - - - Toggle the TUI minimap overlay, or adjust its zoom level. - - - Minimap enabled. - - - Minimap disabled. - - - Minimap zoom set to {0}:1 (blocks per pixel). - - - Current minimap zoom: {0}:1 blocks/px (range 1-{1}). - - - The minimap command is only available in TUI mode. - - - Hostile - - - Passive - - - Neutral - - - Player - - - Name display -- Players: {0}, Hostile: {1}, Neutral: {2}, Passive: {3} - - - All entity name labels enabled. - - - All entity name labels disabled. - - - {0} name display: {1} - - - {0} name display set to {1}. - - - Current minimap position: {0} - - - Minimap position set to: {0} - - - Current cave mode: {0} - - - Cave mode set to: {0} - - - list achievements/advancements from the server. - - - No achievements/advancements received yet. - - - No completed achievements/advancements. - - - No incomplete achievements/advancements. - - - Achievements/Advancements: - - - Completed achievements/advancements: - - - Incomplete achievements/advancements: - - - [DONE] - - - [TODO] - - - {0} {1} ({2}) [{3}] - - - {0} {1} [{2}] - - - book <read|write|edit|sign> - - - read, write, edit, and sign the book held in your main hand. - - - /book read [page] - - - /book write text <text> or /book write file <path>. Use \n for line breaks and \f for page breaks. - - - /book edit, /book edit page <page> <text>, /book edit insert <page> <text>, or /book edit delete <page>. - - - /book sign <title> - - - You are not holding a book. - - - You must hold a writable book in your main hand. - - - Book already signed. - - - You cannot edit a signed book. - - - Book TUI opened. - - - The book editor is only available in TUI mode. - - - Book write packet sent. - - - Book edit packet sent. - - - Book sign packet sent. - - - Book packet could not be sent. - - - Book file not found: {0} - - - Page {0} is outside the current page range 1-{1}. - - - Book has {0} pages, but this version supports at most {1} pages. - - - Page {0} has {1} characters, but this version supports at most {2} characters per page. - - - Book title must be 1-{0} characters. - - - Written book: {0} by {1} - - - Writable book - - - Page {0}/{1} - - - Title - - - Prev - - - Next - - - Insert - - - Delete - - - Save - - - Sign - - - Close - - - Saved. - - - Book packet could not be sent. - - - Signed. - - - Book page {0}/{1} - - - Editing writable book. - - - Reading book. - - - PageUp/PageDown: previous/next page - - - PageUp/PageDown: previous/next page - - - [S -> C] state={0} id=0x{1:X2} type={2} payload={3} frame={4} compression={5} - - - [C -> S] state={0} id=0x{1:X2} type={2} payload={3} compression_threshold={4} - - - Protocol state changed: {0} -> {1} - - - Unknown(0x{0:X2}) - - - disabled - - - uncompressed - - - compressed, uncompressed={0} - - - {0} exited: reason={1}, state={2}, socket_connected={3} - - - packet queue completed - - - socket closed - - - cancelled - - - dialog [show|open|set|click|click-label|cancel|dismiss] - - - View and interact with the current server custom dialog. - - - Server showed custom dialog: {0}. Use /dialog show. - - - Server cleared the custom dialog. - - - No custom dialog is active. - - - Dialog dismissed locally. - - - Unresolved dialog {0} - - - The server referenced dialog registry entry {0}, but MCC has no data for it. - - - This dialog could not be resolved, so actions are disabled. - - - Unknown dialog input: {0} - - - Dialog input {0} set to {1}. - - - Input {0} is longer than {1} characters. - - - Input {0} expects true or false. - - - Input {0} expects one of the listed option IDs. - - - Input {0} expects a number. - - - Input {0} must be between {1} and {2}. - - - Unknown dialog action index: {0} - - - Unknown dialog action label: {0} - - - Dialog action label is ambiguous: {0} - - - This dialog cannot be closed with cancel. - - - Dialog action closed locally. - - - This dialog command action is only available in play state. - - - Dialog action is invalid. - - - Custom dialog action packet could not be sent. - - - Dialog command sent: {0} - - - Dialog custom action sent: {0} - - - Nested dialog opened. - - - Dialog URL action: {0} - - - Dialog suggested command: {0} - - - Dialog copy action: {0} - - - Unsupported dialog action: {0} - - - Custom dialog is pending. Use dialog open after closing the current overlay. - - - Dialog TUI is unavailable. - - - Dialog TUI opened. - - - Action - - - OK - - - Item preview - - - Report bug - - - Community guidelines - - - Support - - - Status - - - Feedback - - - Community - - - Website - - - Forums - - - News - - - Announcements - - - Cancel - - - Dialog #{0} [{1}]: {2} - - - Type: {0} - - - Body: {0} - - - Inputs: - - - {0} ({1}) {2} = {3} [{4}] - - - Actions: - - - [{0}] {1} ({2}) - - - Use /dialog cancel to close or run the cancel action. - - - max {0} chars - - - Yes={0}, No={1} - - - options: {0} - - - range {0}..{1} - - - unknown input - - - close - - - command - - - custom - - - show dialog - - - open URL - - - suggest command - - - copy - - - unknown - - - Notice - - - Confirmation - - - Multi Action - - - Dialog list - - - Server links - - - Unknown - - - Text - - - Check box - - - Options - - - Number - - - Unknown - - - Use /dialog help for a list of commands. - - - Raw server chat message: {0} - - diff --git a/MinecraftClient/Resources/appicon_creeper1.ico b/MinecraftClient/Resources/appicon_creeper1.ico deleted file mode 100644 index d3009de9e4..0000000000 Binary files a/MinecraftClient/Resources/appicon_creeper1.ico and /dev/null differ diff --git a/MinecraftClient/Resources/appicon_grassblock.ico b/MinecraftClient/Resources/appicon_grassblock.ico deleted file mode 100644 index 90e3c90ad6..0000000000 Binary files a/MinecraftClient/Resources/appicon_grassblock.ico and /dev/null differ diff --git a/MinecraftClient/Resources/appicon_terminal.ico b/MinecraftClient/Resources/appicon_terminal.ico deleted file mode 100644 index 6012511207..0000000000 Binary files a/MinecraftClient/Resources/appicon_terminal.ico and /dev/null differ diff --git a/MinecraftClient/Resources/en_us.json b/MinecraftClient/Resources/en_us.json deleted file mode 100644 index 911c141e25..0000000000 --- a/MinecraftClient/Resources/en_us.json +++ /dev/null @@ -1,6546 +0,0 @@ -{ - "accessibility.onboarding.accessibility.button": "Accessibility Settings...", - "accessibility.onboarding.screen.narrator": "Press enter to enable the narrator", - "accessibility.onboarding.screen.title": "Welcome to Minecraft!\n\nWould you like to enable the Narrator or visit the Accessibility Settings?", - "addServer.add": "Done", - "addServer.enterIp": "Server Address", - "addServer.enterName": "Server Name", - "addServer.hideAddress": "Hide Address", - "addServer.resourcePack": "Server Resource Packs", - "addServer.resourcePack.disabled": "Disabled", - "addServer.resourcePack.enabled": "Enabled", - "addServer.resourcePack.prompt": "Prompt", - "addServer.title": "Edit Server Info", - "advancement.advancementNotFound": "Unknown advancement: %s", - "advancements.adventure.adventuring_time.description": "Discover every biome", - "advancements.adventure.adventuring_time.title": "Adventuring Time", - "advancements.adventure.arbalistic.description": "Kill five unique mobs with one crossbow shot", - "advancements.adventure.arbalistic.title": "Arbalistic", - "advancements.adventure.avoid_vibration.description": "Sneak near a Sculk Sensor or Warden to prevent it from detecting you", - "advancements.adventure.avoid_vibration.title": "Sneak 100", - "advancements.adventure.bullseye.description": "Hit the bullseye of a Target block from at least 30 meters away", - "advancements.adventure.bullseye.title": "Bullseye", - "advancements.adventure.craft_decorated_pot_using_only_sherds.description": "Make a Decorated Pot out of 4 Pottery Sherds", - "advancements.adventure.craft_decorated_pot_using_only_sherds.title": "Careful Restoration", - "advancements.adventure.fall_from_world_height.description": "Free fall from the top of the world (build limit) to the bottom of the world and survive", - "advancements.adventure.fall_from_world_height.title": "Caves & Cliffs", - "advancements.adventure.hero_of_the_village.description": "Successfully defend a village from a raid", - "advancements.adventure.hero_of_the_village.title": "Hero of the Village", - "advancements.adventure.honey_block_slide.description": "Jump into a Honey Block to break your fall", - "advancements.adventure.honey_block_slide.title": "Sticky Situation", - "advancements.adventure.kill_a_mob.description": "Kill any hostile monster", - "advancements.adventure.kill_a_mob.title": "Monster Hunter", - "advancements.adventure.kill_all_mobs.description": "Kill one of every hostile monster", - "advancements.adventure.kill_all_mobs.title": "Monsters Hunted", - "advancements.adventure.kill_mob_near_sculk_catalyst.description": "Kill a mob near a Sculk Catalyst", - "advancements.adventure.kill_mob_near_sculk_catalyst.title": "It Spreads", - "advancements.adventure.lightning_rod_with_villager_no_fire.description": "Protect a Villager from an undesired shock without starting a fire", - "advancements.adventure.lightning_rod_with_villager_no_fire.title": "Surge Protector", - "advancements.adventure.ol_betsy.description": "Shoot a Crossbow", - "advancements.adventure.ol_betsy.title": "Ol' Betsy", - "advancements.adventure.play_jukebox_in_meadows.description": "Make the Meadows come alive with the sound of music from a Jukebox", - "advancements.adventure.play_jukebox_in_meadows.title": "Sound of Music", - "advancements.adventure.read_power_from_chiseled_bookshelf.description": "Read the power signal of a Chiseled Bookshelf using a Comparator", - "advancements.adventure.read_power_from_chiseled_bookshelf.title": "The Power of Books", - "advancements.adventure.root.description": "Adventure, exploration and combat", - "advancements.adventure.root.title": "Adventure", - "advancements.adventure.salvage_sherd.description": "Brush a Suspicious block to obtain a Pottery Sherd", - "advancements.adventure.salvage_sherd.title": "Respecting the Remnants", - "advancements.adventure.shoot_arrow.description": "Shoot something with an Arrow", - "advancements.adventure.shoot_arrow.title": "Take Aim", - "advancements.adventure.sleep_in_bed.description": "Sleep in a Bed to change your respawn point", - "advancements.adventure.sleep_in_bed.title": "Sweet Dreams", - "advancements.adventure.sniper_duel.description": "Kill a Skeleton from at least 50 meters away", - "advancements.adventure.sniper_duel.title": "Sniper Duel", - "advancements.adventure.spyglass_at_dragon.description": "Look at the Ender Dragon through a Spyglass", - "advancements.adventure.spyglass_at_dragon.title": "Is It a Plane?", - "advancements.adventure.spyglass_at_ghast.description": "Look at a Ghast through a Spyglass", - "advancements.adventure.spyglass_at_ghast.title": "Is It a Balloon?", - "advancements.adventure.spyglass_at_parrot.description": "Look at a Parrot through a Spyglass", - "advancements.adventure.spyglass_at_parrot.title": "Is It a Bird?", - "advancements.adventure.summon_iron_golem.description": "Summon an Iron Golem to help defend a village", - "advancements.adventure.summon_iron_golem.title": "Hired Help", - "advancements.adventure.throw_trident.description": "Throw a Trident at something.\nNote: Throwing away your only weapon is not a good idea.", - "advancements.adventure.throw_trident.title": "A Throwaway Joke", - "advancements.adventure.totem_of_undying.description": "Use a Totem of Undying to cheat death", - "advancements.adventure.totem_of_undying.title": "Postmortal", - "advancements.adventure.trade_at_world_height.description": "Trade with a Villager at the build height limit", - "advancements.adventure.trade_at_world_height.title": "Star Trader", - "advancements.adventure.trade.description": "Successfully trade with a Villager", - "advancements.adventure.trade.title": "What a Deal!", - "advancements.adventure.trim_with_all_exclusive_armor_patterns.description": "Apply these smithing templates at least once: Spire, Snout, Rib, Ward, Silence, Vex, Tide, Wayfinder", - "advancements.adventure.trim_with_all_exclusive_armor_patterns.title": "Smithing with Style", - "advancements.adventure.trim_with_any_armor_pattern.description": "Craft a trimmed armor at a Smithing Table", - "advancements.adventure.trim_with_any_armor_pattern.title": "Crafting a New Look", - "advancements.adventure.two_birds_one_arrow.description": "Kill two Phantoms with a piercing Arrow", - "advancements.adventure.two_birds_one_arrow.title": "Two Birds, One Arrow", - "advancements.adventure.very_very_frightening.description": "Strike a Villager with lightning", - "advancements.adventure.very_very_frightening.title": "Very Very Frightening", - "advancements.adventure.voluntary_exile.description": "Kill a raid captain.\nMaybe consider staying away from villages for the time being...", - "advancements.adventure.voluntary_exile.title": "Voluntary Exile", - "advancements.adventure.walk_on_powder_snow_with_leather_boots.description": "Walk on Powder Snow... without sinking in it", - "advancements.adventure.walk_on_powder_snow_with_leather_boots.title": "Light as a Rabbit", - "advancements.adventure.whos_the_pillager_now.description": "Give a Pillager a taste of their own medicine", - "advancements.adventure.whos_the_pillager_now.title": "Who's the Pillager Now?", - "advancements.empty": "There doesn't seem to be anything here...", - "advancements.end.dragon_breath.description": "Collect Dragon's Breath in a Glass Bottle", - "advancements.end.dragon_breath.title": "You Need a Mint", - "advancements.end.dragon_egg.description": "Hold the Dragon Egg", - "advancements.end.dragon_egg.title": "The Next Generation", - "advancements.end.elytra.description": "Find Elytra", - "advancements.end.elytra.title": "Sky's the Limit", - "advancements.end.enter_end_gateway.description": "Escape the island", - "advancements.end.enter_end_gateway.title": "Remote Getaway", - "advancements.end.find_end_city.description": "Go on in, what could happen?", - "advancements.end.find_end_city.title": "The City at the End of the Game", - "advancements.end.kill_dragon.description": "Good luck", - "advancements.end.kill_dragon.title": "Free the End", - "advancements.end.levitate.description": "Levitate up 50 blocks from the attacks of a Shulker", - "advancements.end.levitate.title": "Great View From Up Here", - "advancements.end.respawn_dragon.description": "Respawn the Ender Dragon", - "advancements.end.respawn_dragon.title": "The End... Again...", - "advancements.end.root.description": "Or the beginning?", - "advancements.end.root.title": "The End", - "advancements.husbandry.allay_deliver_cake_to_note_block.description": "Have an Allay drop a Cake at a Note Block", - "advancements.husbandry.allay_deliver_cake_to_note_block.title": "Birthday Song", - "advancements.husbandry.allay_deliver_item_to_player.description": "Have an Allay deliver items to you", - "advancements.husbandry.allay_deliver_item_to_player.title": "You've Got a Friend in Me", - "advancements.husbandry.axolotl_in_a_bucket.description": "Catch an Axolotl in a Bucket", - "advancements.husbandry.axolotl_in_a_bucket.title": "The Cutest Predator", - "advancements.husbandry.balanced_diet.description": "Eat everything that is edible, even if it's not good for you", - "advancements.husbandry.balanced_diet.title": "A Balanced Diet", - "advancements.husbandry.breed_all_animals.description": "Breed all the animals!", - "advancements.husbandry.breed_all_animals.title": "Two by Two", - "advancements.husbandry.breed_an_animal.description": "Breed two animals together", - "advancements.husbandry.breed_an_animal.title": "The Parrots and the Bats", - "advancements.husbandry.complete_catalogue.description": "Tame all Cat variants!", - "advancements.husbandry.complete_catalogue.title": "A Complete Catalogue", - "advancements.husbandry.feed_snifflet.description": "Feed a Snifflet", - "advancements.husbandry.feed_snifflet.title": "Little Sniffs", - "advancements.husbandry.fishy_business.description": "Catch a fish", - "advancements.husbandry.fishy_business.title": "Fishy Business", - "advancements.husbandry.froglights.description": "Have all Froglights in your inventory", - "advancements.husbandry.froglights.title": "With Our Powers Combined!", - "advancements.husbandry.kill_axolotl_target.description": "Team up with an Axolotl and win a fight", - "advancements.husbandry.kill_axolotl_target.title": "The Healing Power of Friendship!", - "advancements.husbandry.leash_all_frog_variants.description": "Get each Frog variant on a Lead", - "advancements.husbandry.leash_all_frog_variants.title": "When the Squad Hops into Town", - "advancements.husbandry.make_a_sign_glow.description": "Make the text of any kind of sign glow", - "advancements.husbandry.make_a_sign_glow.title": "Glow and Behold!", - "advancements.husbandry.netherite_hoe.description": "Use a Netherite Ingot to upgrade a Hoe, and then reevaluate your life choices", - "advancements.husbandry.netherite_hoe.title": "Serious Dedication", - "advancements.husbandry.obtain_sniffer_egg.description": "Obtain a Sniffer Egg", - "advancements.husbandry.obtain_sniffer_egg.title": "Smells Interesting", - "advancements.husbandry.plant_any_sniffer_seed.description": "Plant any Sniffer seed", - "advancements.husbandry.plant_any_sniffer_seed.title": "Planting the Past", - "advancements.husbandry.plant_seed.description": "Plant a seed and watch it grow", - "advancements.husbandry.plant_seed.title": "A Seedy Place", - "advancements.husbandry.ride_a_boat_with_a_goat.description": "Get in a Boat and float with a Goat", - "advancements.husbandry.ride_a_boat_with_a_goat.title": "Whatever Floats Your Goat!", - "advancements.husbandry.root.description": "The world is full of friends and food", - "advancements.husbandry.root.title": "Husbandry", - "advancements.husbandry.safely_harvest_honey.description": "Use a Campfire to collect Honey from a Beehive using a Glass Bottle without aggravating the Bees", - "advancements.husbandry.safely_harvest_honey.title": "Bee Our Guest", - "advancements.husbandry.silk_touch_nest.description": "Move a Bee Nest, with 3 Bees inside, using Silk Touch", - "advancements.husbandry.silk_touch_nest.title": "Total Beelocation", - "advancements.husbandry.tactical_fishing.description": "Catch a Fish... without a Fishing Rod!", - "advancements.husbandry.tactical_fishing.title": "Tactical Fishing", - "advancements.husbandry.tadpole_in_a_bucket.description": "Catch a Tadpole in a Bucket", - "advancements.husbandry.tadpole_in_a_bucket.title": "Bukkit Bukkit", - "advancements.husbandry.tame_an_animal.description": "Tame an animal", - "advancements.husbandry.tame_an_animal.title": "Best Friends Forever", - "advancements.husbandry.wax_off.description": "Scrape Wax off of a Copper block!", - "advancements.husbandry.wax_off.title": "Wax Off", - "advancements.husbandry.wax_on.description": "Apply Honeycomb to a Copper block!", - "advancements.husbandry.wax_on.title": "Wax On", - "advancements.nether.all_effects.description": "Have every effect applied at the same time", - "advancements.nether.all_effects.title": "How Did We Get Here?", - "advancements.nether.all_potions.description": "Have every potion effect applied at the same time", - "advancements.nether.all_potions.title": "A Furious Cocktail", - "advancements.nether.brew_potion.description": "Brew a Potion", - "advancements.nether.brew_potion.title": "Local Brewery", - "advancements.nether.charge_respawn_anchor.description": "Charge a Respawn Anchor to the maximum", - "advancements.nether.charge_respawn_anchor.title": "Not Quite \"Nine\" Lives", - "advancements.nether.create_beacon.description": "Construct and place a Beacon", - "advancements.nether.create_beacon.title": "Bring Home the Beacon", - "advancements.nether.create_full_beacon.description": "Bring a Beacon to full power", - "advancements.nether.create_full_beacon.title": "Beaconator", - "advancements.nether.distract_piglin.description": "Distract Piglins with gold", - "advancements.nether.distract_piglin.title": "Oh Shiny", - "advancements.nether.explore_nether.description": "Explore all Nether biomes", - "advancements.nether.explore_nether.title": "Hot Tourist Destinations", - "advancements.nether.fast_travel.description": "Use the Nether to travel 7 km in the Overworld", - "advancements.nether.fast_travel.title": "Subspace Bubble", - "advancements.nether.find_bastion.description": "Enter a Bastion Remnant", - "advancements.nether.find_bastion.title": "Those Were the Days", - "advancements.nether.find_fortress.description": "Break your way into a Nether Fortress", - "advancements.nether.find_fortress.title": "A Terrible Fortress", - "advancements.nether.get_wither_skull.description": "Obtain a Wither Skeleton's skull", - "advancements.nether.get_wither_skull.title": "Spooky Scary Skeleton", - "advancements.nether.loot_bastion.description": "Loot a Chest in a Bastion Remnant", - "advancements.nether.loot_bastion.title": "War Pigs", - "advancements.nether.netherite_armor.description": "Get a full suit of Netherite armor", - "advancements.nether.netherite_armor.title": "Cover Me in Debris", - "advancements.nether.obtain_ancient_debris.description": "Obtain Ancient Debris", - "advancements.nether.obtain_ancient_debris.title": "Hidden in the Depths", - "advancements.nether.obtain_blaze_rod.description": "Relieve a Blaze of its rod", - "advancements.nether.obtain_blaze_rod.title": "Into Fire", - "advancements.nether.obtain_crying_obsidian.description": "Obtain Crying Obsidian", - "advancements.nether.obtain_crying_obsidian.title": "Who is Cutting Onions?", - "advancements.nether.return_to_sender.description": "Destroy a Ghast with a fireball", - "advancements.nether.return_to_sender.title": "Return to Sender", - "advancements.nether.ride_strider_in_overworld_lava.description": "Take a Strider for a loooong ride on a lava lake in the Overworld", - "advancements.nether.ride_strider_in_overworld_lava.title": "Feels Like Home", - "advancements.nether.ride_strider.description": "Ride a Strider with a Warped Fungus on a Stick", - "advancements.nether.ride_strider.title": "This Boat Has Legs", - "advancements.nether.root.description": "Bring summer clothes", - "advancements.nether.root.title": "Nether", - "advancements.nether.summon_wither.description": "Summon the Wither", - "advancements.nether.summon_wither.title": "Withering Heights", - "advancements.nether.uneasy_alliance.description": "Rescue a Ghast from the Nether, bring it safely home to the Overworld... and then kill it", - "advancements.nether.uneasy_alliance.title": "Uneasy Alliance", - "advancements.nether.use_lodestone.description": "Use a Compass on a Lodestone", - "advancements.nether.use_lodestone.title": "Country Lode, Take Me Home", - "advancements.progress": "%s/%s", - "advancements.sad_label": ":(", - "advancements.story.cure_zombie_villager.description": "Weaken and then cure a Zombie Villager", - "advancements.story.cure_zombie_villager.title": "Zombie Doctor", - "advancements.story.deflect_arrow.description": "Deflect a projectile with a Shield", - "advancements.story.deflect_arrow.title": "Not Today, Thank You", - "advancements.story.enchant_item.description": "Enchant an item at an Enchanting Table", - "advancements.story.enchant_item.title": "Enchanter", - "advancements.story.enter_the_end.description": "Enter the End Portal", - "advancements.story.enter_the_end.title": "The End?", - "advancements.story.enter_the_nether.description": "Build, light and enter a Nether Portal", - "advancements.story.enter_the_nether.title": "We Need to Go Deeper", - "advancements.story.follow_ender_eye.description": "Follow an Eye of Ender", - "advancements.story.follow_ender_eye.title": "Eye Spy", - "advancements.story.form_obsidian.description": "Obtain a block of Obsidian", - "advancements.story.form_obsidian.title": "Ice Bucket Challenge", - "advancements.story.iron_tools.description": "Upgrade your Pickaxe", - "advancements.story.iron_tools.title": "Isn't It Iron Pick", - "advancements.story.lava_bucket.description": "Fill a Bucket with lava", - "advancements.story.lava_bucket.title": "Hot Stuff", - "advancements.story.mine_diamond.description": "Acquire diamonds", - "advancements.story.mine_diamond.title": "Diamonds!", - "advancements.story.mine_stone.description": "Mine Stone with your new Pickaxe", - "advancements.story.mine_stone.title": "Stone Age", - "advancements.story.obtain_armor.description": "Protect yourself with a piece of iron armor", - "advancements.story.obtain_armor.title": "Suit Up", - "advancements.story.root.description": "The heart and story of the game", - "advancements.story.root.title": "Minecraft", - "advancements.story.shiny_gear.description": "Diamond armor saves lives", - "advancements.story.shiny_gear.title": "Cover Me with Diamonds", - "advancements.story.smelt_iron.description": "Smelt an Iron Ingot", - "advancements.story.smelt_iron.title": "Acquire Hardware", - "advancements.story.upgrade_tools.description": "Construct a better Pickaxe", - "advancements.story.upgrade_tools.title": "Getting an Upgrade", - "advancements.toast.challenge": "Challenge Complete!", - "advancements.toast.goal": "Goal Reached!", - "advancements.toast.task": "Advancement Made!", - "advMode.allEntities": "Use \"@e\" to target all entities", - "advMode.allPlayers": "Use \"@a\" to target all players", - "advMode.command": "Console Command", - "advMode.mode": "Mode", - "advMode.mode.auto": "Repeat", - "advMode.mode.autoexec.bat": "Always Active", - "advMode.mode.conditional": "Conditional", - "advMode.mode.redstone": "Impulse", - "advMode.mode.redstoneTriggered": "Needs Redstone", - "advMode.mode.sequence": "Chain", - "advMode.mode.unconditional": "Unconditional", - "advMode.nearestPlayer": "Use \"@p\" to target nearest player", - "advMode.notAllowed": "Must be an opped player in creative mode", - "advMode.notEnabled": "Command blocks are not enabled on this server", - "advMode.previousOutput": "Previous Output", - "advMode.randomPlayer": "Use \"@r\" to target random player", - "advMode.self": "Use \"@s\" to target the executing entity", - "advMode.setCommand": "Set Console Command for Block", - "advMode.setCommand.success": "Command set: %s", - "advMode.trackOutput": "Track output", - "advMode.triggering": "Triggering", - "advMode.type": "Type", - "argument.anchor.invalid": "Invalid entity anchor position %s", - "argument.angle.incomplete": "Incomplete (expected 1 angle)", - "argument.angle.invalid": "Invalid angle", - "argument.block.id.invalid": "Unknown block type '%s'", - "argument.block.property.duplicate": "Property '%s' can only be set once for block %s", - "argument.block.property.invalid": "Block %s does not accept '%s' for %s property", - "argument.block.property.novalue": "Expected value for property '%s' on block %s", - "argument.block.property.unclosed": "Expected closing ] for block state properties", - "argument.block.property.unknown": "Block %s does not have property '%s'", - "argument.block.tag.disallowed": "Tags aren't allowed here, only actual blocks", - "argument.color.invalid": "Unknown color '%s'", - "argument.component.invalid": "Invalid chat component: %s", - "argument.criteria.invalid": "Unknown criterion '%s'", - "argument.dimension.invalid": "Unknown dimension '%s'", - "argument.double.big": "Double must not be more than %s, found %s", - "argument.double.low": "Double must not be less than %s, found %s", - "argument.entity.invalid": "Invalid name or UUID", - "argument.entity.notfound.entity": "No entity was found", - "argument.entity.notfound.player": "No player was found", - "argument.entity.options.advancements.description": "Players with advancements", - "argument.entity.options.distance.description": "Distance to entity", - "argument.entity.options.distance.negative": "Distance cannot be negative", - "argument.entity.options.dx.description": "Entities between x and x + dx", - "argument.entity.options.dy.description": "Entities between y and y + dy", - "argument.entity.options.dz.description": "Entities between z and z + dz", - "argument.entity.options.gamemode.description": "Players with game mode", - "argument.entity.options.inapplicable": "Option '%s' isn't applicable here", - "argument.entity.options.level.description": "Experience level", - "argument.entity.options.level.negative": "Level shouldn't be negative", - "argument.entity.options.limit.description": "Maximum number of entities to return", - "argument.entity.options.limit.toosmall": "Limit must be at least 1", - "argument.entity.options.mode.invalid": "Invalid or unknown game mode '%s'", - "argument.entity.options.name.description": "Entity name", - "argument.entity.options.nbt.description": "Entities with NBT", - "argument.entity.options.predicate.description": "Custom predicate", - "argument.entity.options.scores.description": "Entities with scores", - "argument.entity.options.sort.description": "Sort the entities", - "argument.entity.options.sort.irreversible": "Invalid or unknown sort type '%s'", - "argument.entity.options.tag.description": "Entities with tag", - "argument.entity.options.team.description": "Entities on team", - "argument.entity.options.type.description": "Entities of type", - "argument.entity.options.type.invalid": "Invalid or unknown entity type '%s'", - "argument.entity.options.unknown": "Unknown option '%s'", - "argument.entity.options.unterminated": "Expected end of options", - "argument.entity.options.valueless": "Expected value for option '%s'", - "argument.entity.options.x_rotation.description": "Entity's x rotation", - "argument.entity.options.x.description": "x position", - "argument.entity.options.y_rotation.description": "Entity's y rotation", - "argument.entity.options.y.description": "y position", - "argument.entity.options.z.description": "z position", - "argument.entity.selector.allEntities": "All entities", - "argument.entity.selector.allPlayers": "All players", - "argument.entity.selector.missing": "Missing selector type", - "argument.entity.selector.nearestPlayer": "Nearest player", - "argument.entity.selector.not_allowed": "Selector not allowed", - "argument.entity.selector.randomPlayer": "Random player", - "argument.entity.selector.self": "Current entity", - "argument.entity.selector.unknown": "Unknown selector type '%s'", - "argument.entity.toomany": "Only one entity is allowed, but the provided selector allows more than one", - "argument.enum.invalid": "Invalid value \"%s\"", - "argument.float.big": "Float must not be more than %s, found %s", - "argument.float.low": "Float must not be less than %s, found %s", - "argument.gamemode.invalid": "Unknown game mode: %s", - "argument.id.invalid": "Invalid ID", - "argument.id.unknown": "Unknown ID: %s", - "argument.integer.big": "Integer must not be more than %s, found %s", - "argument.integer.low": "Integer must not be less than %s, found %s", - "argument.item.id.invalid": "Unknown item '%s'", - "argument.item.tag.disallowed": "Tags aren't allowed here, only actual items", - "argument.literal.incorrect": "Expected literal %s", - "argument.long.big": "Long must not be more than %s, found %s", - "argument.long.low": "Long must not be less than %s, found %s", - "argument.nbt.array.invalid": "Invalid array type '%s'", - "argument.nbt.array.mixed": "Can't insert %s into %s", - "argument.nbt.expected.key": "Expected key", - "argument.nbt.expected.value": "Expected value", - "argument.nbt.list.mixed": "Can't insert %s into list of %s", - "argument.nbt.trailing": "Unexpected trailing data", - "argument.player.entities": "Only players may be affected by this command, but the provided selector includes entities", - "argument.player.toomany": "Only one player is allowed, but the provided selector allows more than one", - "argument.player.unknown": "That player does not exist", - "argument.pos.missing.double": "Expected a coordinate", - "argument.pos.missing.int": "Expected a block position", - "argument.pos.mixed": "Cannot mix world & local coordinates (everything must either use ^ or not)", - "argument.pos.outofbounds": "That position is outside the allowed boundaries.", - "argument.pos.outofworld": "That position is out of this world!", - "argument.pos.unloaded": "That position is not loaded", - "argument.pos2d.incomplete": "Incomplete (expected 2 coordinates)", - "argument.pos3d.incomplete": "Incomplete (expected 3 coordinates)", - "argument.range.empty": "Expected value or range of values", - "argument.range.ints": "Only whole numbers allowed, not decimals", - "argument.range.swapped": "Min cannot be bigger than max", - "argument.resource_tag.invalid_type": "Tag '%s' has wrong type '%s' (expected '%s')", - "argument.resource_tag.not_found": "Can't find tag '%s' of type '%s'", - "argument.resource.invalid_type": "Element '%s' has wrong type '%s' (expected '%s')", - "argument.resource.not_found": "Can't find element '%s' of type '%s'", - "argument.rotation.incomplete": "Incomplete (expected 2 coordinates)", - "argument.scoreboardDisplaySlot.invalid": "Unknown display slot '%s'", - "argument.scoreHolder.empty": "No relevant score holders could be found", - "argument.style.invalid": "Invalid style: %s", - "argument.time.invalid_tick_count": "Tick count must be non-negative", - "argument.time.invalid_unit": "Invalid unit", - "argument.time.tick_count_too_low": "Tick count must not be less than %s, found %s", - "argument.uuid.invalid": "Invalid UUID", - "arguments.block.tag.unknown": "Unknown block tag '%s'", - "arguments.function.tag.unknown": "Unknown function tag '%s'", - "arguments.function.unknown": "Unknown function %s", - "arguments.item.overstacked": "%s can only stack up to %s", - "arguments.item.tag.unknown": "Unknown item tag '%s'", - "arguments.nbtpath.node.invalid": "Invalid NBT path element", - "arguments.nbtpath.nothing_found": "Found no elements matching %s", - "arguments.nbtpath.too_deep": "Resulting NBT too deeply nested", - "arguments.nbtpath.too_large": "Resulting NBT too large", - "arguments.objective.notFound": "Unknown scoreboard objective '%s'", - "arguments.objective.readonly": "Scoreboard objective '%s' is read-only", - "arguments.operation.div0": "Cannot divide by zero", - "arguments.operation.invalid": "Invalid operation", - "arguments.swizzle.invalid": "Invalid swizzle, expected combination of 'x', 'y' and 'z'", - "attribute.modifier.equals.0": "%s %s", - "attribute.modifier.equals.1": "%s%% %s", - "attribute.modifier.equals.2": "%s%% %s", - "attribute.modifier.plus.0": "+%s %s", - "attribute.modifier.plus.1": "+%s%% %s", - "attribute.modifier.plus.2": "+%s%% %s", - "attribute.modifier.take.0": "-%s %s", - "attribute.modifier.take.1": "-%s%% %s", - "attribute.modifier.take.2": "-%s%% %s", - "attribute.name.generic.armor": "Armor", - "attribute.name.generic.armor_toughness": "Armor Toughness", - "attribute.name.generic.attack_damage": "Attack Damage", - "attribute.name.generic.attack_knockback": "Attack Knockback", - "attribute.name.generic.attack_speed": "Attack Speed", - "attribute.name.generic.flying_speed": "Flying Speed", - "attribute.name.generic.follow_range": "Mob Follow Range", - "attribute.name.generic.knockback_resistance": "Knockback Resistance", - "attribute.name.generic.luck": "Luck", - "attribute.name.generic.max_absorption": "Max Absorption", - "attribute.name.generic.max_health": "Max Health", - "attribute.name.generic.movement_speed": "Speed", - "attribute.name.horse.jump_strength": "Horse Jump Strength", - "attribute.name.zombie.spawn_reinforcements": "Zombie Reinforcements", - "biome.minecraft.badlands": "Badlands", - "biome.minecraft.bamboo_jungle": "Bamboo Jungle", - "biome.minecraft.basalt_deltas": "Basalt Deltas", - "biome.minecraft.beach": "Beach", - "biome.minecraft.birch_forest": "Birch Forest", - "biome.minecraft.cherry_grove": "Cherry Grove", - "biome.minecraft.cold_ocean": "Cold Ocean", - "biome.minecraft.crimson_forest": "Crimson Forest", - "biome.minecraft.dark_forest": "Dark Forest", - "biome.minecraft.deep_cold_ocean": "Deep Cold Ocean", - "biome.minecraft.deep_dark": "Deep Dark", - "biome.minecraft.deep_frozen_ocean": "Deep Frozen Ocean", - "biome.minecraft.deep_lukewarm_ocean": "Deep Lukewarm Ocean", - "biome.minecraft.deep_ocean": "Deep Ocean", - "biome.minecraft.desert": "Desert", - "biome.minecraft.dripstone_caves": "Dripstone Caves", - "biome.minecraft.end_barrens": "End Barrens", - "biome.minecraft.end_highlands": "End Highlands", - "biome.minecraft.end_midlands": "End Midlands", - "biome.minecraft.eroded_badlands": "Eroded Badlands", - "biome.minecraft.flower_forest": "Flower Forest", - "biome.minecraft.forest": "Forest", - "biome.minecraft.frozen_ocean": "Frozen Ocean", - "biome.minecraft.frozen_peaks": "Frozen Peaks", - "biome.minecraft.frozen_river": "Frozen River", - "biome.minecraft.grove": "Grove", - "biome.minecraft.ice_spikes": "Ice Spikes", - "biome.minecraft.jagged_peaks": "Jagged Peaks", - "biome.minecraft.jungle": "Jungle", - "biome.minecraft.lukewarm_ocean": "Lukewarm Ocean", - "biome.minecraft.lush_caves": "Lush Caves", - "biome.minecraft.mangrove_swamp": "Mangrove Swamp", - "biome.minecraft.meadow": "Meadow", - "biome.minecraft.mushroom_fields": "Mushroom Fields", - "biome.minecraft.nether_wastes": "Nether Wastes", - "biome.minecraft.ocean": "Ocean", - "biome.minecraft.old_growth_birch_forest": "Old Growth Birch Forest", - "biome.minecraft.old_growth_pine_taiga": "Old Growth Pine Taiga", - "biome.minecraft.old_growth_spruce_taiga": "Old Growth Spruce Taiga", - "biome.minecraft.plains": "Plains", - "biome.minecraft.river": "River", - "biome.minecraft.savanna": "Savanna", - "biome.minecraft.savanna_plateau": "Savanna Plateau", - "biome.minecraft.small_end_islands": "Small End Islands", - "biome.minecraft.snowy_beach": "Snowy Beach", - "biome.minecraft.snowy_plains": "Snowy Plains", - "biome.minecraft.snowy_slopes": "Snowy Slopes", - "biome.minecraft.snowy_taiga": "Snowy Taiga", - "biome.minecraft.soul_sand_valley": "Soul Sand Valley", - "biome.minecraft.sparse_jungle": "Sparse Jungle", - "biome.minecraft.stony_peaks": "Stony Peaks", - "biome.minecraft.stony_shore": "Stony Shore", - "biome.minecraft.sunflower_plains": "Sunflower Plains", - "biome.minecraft.swamp": "Swamp", - "biome.minecraft.taiga": "Taiga", - "biome.minecraft.the_end": "The End", - "biome.minecraft.the_void": "The Void", - "biome.minecraft.warm_ocean": "Warm Ocean", - "biome.minecraft.warped_forest": "Warped Forest", - "biome.minecraft.windswept_forest": "Windswept Forest", - "biome.minecraft.windswept_gravelly_hills": "Windswept Gravelly Hills", - "biome.minecraft.windswept_hills": "Windswept Hills", - "biome.minecraft.windswept_savanna": "Windswept Savanna", - "biome.minecraft.wooded_badlands": "Wooded Badlands", - "block.minecraft.acacia_button": "Acacia Button", - "block.minecraft.acacia_door": "Acacia Door", - "block.minecraft.acacia_fence": "Acacia Fence", - "block.minecraft.acacia_fence_gate": "Acacia Fence Gate", - "block.minecraft.acacia_hanging_sign": "Acacia Hanging Sign", - "block.minecraft.acacia_leaves": "Acacia Leaves", - "block.minecraft.acacia_log": "Acacia Log", - "block.minecraft.acacia_planks": "Acacia Planks", - "block.minecraft.acacia_pressure_plate": "Acacia Pressure Plate", - "block.minecraft.acacia_sapling": "Acacia Sapling", - "block.minecraft.acacia_sign": "Acacia Sign", - "block.minecraft.acacia_slab": "Acacia Slab", - "block.minecraft.acacia_stairs": "Acacia Stairs", - "block.minecraft.acacia_trapdoor": "Acacia Trapdoor", - "block.minecraft.acacia_wall_hanging_sign": "Acacia Wall Hanging Sign", - "block.minecraft.acacia_wall_sign": "Acacia Wall Sign", - "block.minecraft.acacia_wood": "Acacia Wood", - "block.minecraft.activator_rail": "Activator Rail", - "block.minecraft.air": "Air", - "block.minecraft.allium": "Allium", - "block.minecraft.amethyst_block": "Block of Amethyst", - "block.minecraft.amethyst_cluster": "Amethyst Cluster", - "block.minecraft.ancient_debris": "Ancient Debris", - "block.minecraft.andesite": "Andesite", - "block.minecraft.andesite_slab": "Andesite Slab", - "block.minecraft.andesite_stairs": "Andesite Stairs", - "block.minecraft.andesite_wall": "Andesite Wall", - "block.minecraft.anvil": "Anvil", - "block.minecraft.attached_melon_stem": "Attached Melon Stem", - "block.minecraft.attached_pumpkin_stem": "Attached Pumpkin Stem", - "block.minecraft.azalea": "Azalea", - "block.minecraft.azalea_leaves": "Azalea Leaves", - "block.minecraft.azure_bluet": "Azure Bluet", - "block.minecraft.bamboo": "Bamboo", - "block.minecraft.bamboo_block": "Block of Bamboo", - "block.minecraft.bamboo_button": "Bamboo Button", - "block.minecraft.bamboo_door": "Bamboo Door", - "block.minecraft.bamboo_fence": "Bamboo Fence", - "block.minecraft.bamboo_fence_gate": "Bamboo Fence Gate", - "block.minecraft.bamboo_hanging_sign": "Bamboo Hanging Sign", - "block.minecraft.bamboo_mosaic": "Bamboo Mosaic", - "block.minecraft.bamboo_mosaic_slab": "Bamboo Mosaic Slab", - "block.minecraft.bamboo_mosaic_stairs": "Bamboo Mosaic Stairs", - "block.minecraft.bamboo_planks": "Bamboo Planks", - "block.minecraft.bamboo_pressure_plate": "Bamboo Pressure Plate", - "block.minecraft.bamboo_sapling": "Bamboo Shoot", - "block.minecraft.bamboo_sign": "Bamboo Sign", - "block.minecraft.bamboo_slab": "Bamboo Slab", - "block.minecraft.bamboo_stairs": "Bamboo Stairs", - "block.minecraft.bamboo_trapdoor": "Bamboo Trapdoor", - "block.minecraft.bamboo_wall_hanging_sign": "Bamboo Wall Hanging Sign", - "block.minecraft.bamboo_wall_sign": "Bamboo Wall Sign", - "block.minecraft.banner.base.black": "Fully Black Field", - "block.minecraft.banner.base.blue": "Fully Blue Field", - "block.minecraft.banner.base.brown": "Fully Brown Field", - "block.minecraft.banner.base.cyan": "Fully Cyan Field", - "block.minecraft.banner.base.gray": "Fully Gray Field", - "block.minecraft.banner.base.green": "Fully Green Field", - "block.minecraft.banner.base.light_blue": "Fully Light Blue Field", - "block.minecraft.banner.base.light_gray": "Fully Light Gray Field", - "block.minecraft.banner.base.lime": "Fully Lime Field", - "block.minecraft.banner.base.magenta": "Fully Magenta Field", - "block.minecraft.banner.base.orange": "Fully Orange Field", - "block.minecraft.banner.base.pink": "Fully Pink Field", - "block.minecraft.banner.base.purple": "Fully Purple Field", - "block.minecraft.banner.base.red": "Fully Red Field", - "block.minecraft.banner.base.white": "Fully White Field", - "block.minecraft.banner.base.yellow": "Fully Yellow Field", - "block.minecraft.banner.border.black": "Black Bordure", - "block.minecraft.banner.border.blue": "Blue Bordure", - "block.minecraft.banner.border.brown": "Brown Bordure", - "block.minecraft.banner.border.cyan": "Cyan Bordure", - "block.minecraft.banner.border.gray": "Gray Bordure", - "block.minecraft.banner.border.green": "Green Bordure", - "block.minecraft.banner.border.light_blue": "Light Blue Bordure", - "block.minecraft.banner.border.light_gray": "Light Gray Bordure", - "block.minecraft.banner.border.lime": "Lime Bordure", - "block.minecraft.banner.border.magenta": "Magenta Bordure", - "block.minecraft.banner.border.orange": "Orange Bordure", - "block.minecraft.banner.border.pink": "Pink Bordure", - "block.minecraft.banner.border.purple": "Purple Bordure", - "block.minecraft.banner.border.red": "Red Bordure", - "block.minecraft.banner.border.white": "White Bordure", - "block.minecraft.banner.border.yellow": "Yellow Bordure", - "block.minecraft.banner.bricks.black": "Black Field Masoned", - "block.minecraft.banner.bricks.blue": "Blue Field Masoned", - "block.minecraft.banner.bricks.brown": "Brown Field Masoned", - "block.minecraft.banner.bricks.cyan": "Cyan Field Masoned", - "block.minecraft.banner.bricks.gray": "Gray Field Masoned", - "block.minecraft.banner.bricks.green": "Green Field Masoned", - "block.minecraft.banner.bricks.light_blue": "Light Blue Field Masoned", - "block.minecraft.banner.bricks.light_gray": "Light Gray Field Masoned", - "block.minecraft.banner.bricks.lime": "Lime Field Masoned", - "block.minecraft.banner.bricks.magenta": "Magenta Field Masoned", - "block.minecraft.banner.bricks.orange": "Orange Field Masoned", - "block.minecraft.banner.bricks.pink": "Pink Field Masoned", - "block.minecraft.banner.bricks.purple": "Purple Field Masoned", - "block.minecraft.banner.bricks.red": "Red Field Masoned", - "block.minecraft.banner.bricks.white": "White Field Masoned", - "block.minecraft.banner.bricks.yellow": "Yellow Field Masoned", - "block.minecraft.banner.circle.black": "Black Roundel", - "block.minecraft.banner.circle.blue": "Blue Roundel", - "block.minecraft.banner.circle.brown": "Brown Roundel", - "block.minecraft.banner.circle.cyan": "Cyan Roundel", - "block.minecraft.banner.circle.gray": "Gray Roundel", - "block.minecraft.banner.circle.green": "Green Roundel", - "block.minecraft.banner.circle.light_blue": "Light Blue Roundel", - "block.minecraft.banner.circle.light_gray": "Light Gray Roundel", - "block.minecraft.banner.circle.lime": "Lime Roundel", - "block.minecraft.banner.circle.magenta": "Magenta Roundel", - "block.minecraft.banner.circle.orange": "Orange Roundel", - "block.minecraft.banner.circle.pink": "Pink Roundel", - "block.minecraft.banner.circle.purple": "Purple Roundel", - "block.minecraft.banner.circle.red": "Red Roundel", - "block.minecraft.banner.circle.white": "White Roundel", - "block.minecraft.banner.circle.yellow": "Yellow Roundel", - "block.minecraft.banner.creeper.black": "Black Creeper Charge", - "block.minecraft.banner.creeper.blue": "Blue Creeper Charge", - "block.minecraft.banner.creeper.brown": "Brown Creeper Charge", - "block.minecraft.banner.creeper.cyan": "Cyan Creeper Charge", - "block.minecraft.banner.creeper.gray": "Gray Creeper Charge", - "block.minecraft.banner.creeper.green": "Green Creeper Charge", - "block.minecraft.banner.creeper.light_blue": "Light Blue Creeper Charge", - "block.minecraft.banner.creeper.light_gray": "Light Gray Creeper Charge", - "block.minecraft.banner.creeper.lime": "Lime Creeper Charge", - "block.minecraft.banner.creeper.magenta": "Magenta Creeper Charge", - "block.minecraft.banner.creeper.orange": "Orange Creeper Charge", - "block.minecraft.banner.creeper.pink": "Pink Creeper Charge", - "block.minecraft.banner.creeper.purple": "Purple Creeper Charge", - "block.minecraft.banner.creeper.red": "Red Creeper Charge", - "block.minecraft.banner.creeper.white": "White Creeper Charge", - "block.minecraft.banner.creeper.yellow": "Yellow Creeper Charge", - "block.minecraft.banner.cross.black": "Black Saltire", - "block.minecraft.banner.cross.blue": "Blue Saltire", - "block.minecraft.banner.cross.brown": "Brown Saltire", - "block.minecraft.banner.cross.cyan": "Cyan Saltire", - "block.minecraft.banner.cross.gray": "Gray Saltire", - "block.minecraft.banner.cross.green": "Green Saltire", - "block.minecraft.banner.cross.light_blue": "Light Blue Saltire", - "block.minecraft.banner.cross.light_gray": "Light Gray Saltire", - "block.minecraft.banner.cross.lime": "Lime Saltire", - "block.minecraft.banner.cross.magenta": "Magenta Saltire", - "block.minecraft.banner.cross.orange": "Orange Saltire", - "block.minecraft.banner.cross.pink": "Pink Saltire", - "block.minecraft.banner.cross.purple": "Purple Saltire", - "block.minecraft.banner.cross.red": "Red Saltire", - "block.minecraft.banner.cross.white": "White Saltire", - "block.minecraft.banner.cross.yellow": "Yellow Saltire", - "block.minecraft.banner.curly_border.black": "Black Bordure Indented", - "block.minecraft.banner.curly_border.blue": "Blue Bordure Indented", - "block.minecraft.banner.curly_border.brown": "Brown Bordure Indented", - "block.minecraft.banner.curly_border.cyan": "Cyan Bordure Indented", - "block.minecraft.banner.curly_border.gray": "Gray Bordure Indented", - "block.minecraft.banner.curly_border.green": "Green Bordure Indented", - "block.minecraft.banner.curly_border.light_blue": "Light Blue Bordure Indented", - "block.minecraft.banner.curly_border.light_gray": "Light Gray Bordure Indented", - "block.minecraft.banner.curly_border.lime": "Lime Bordure Indented", - "block.minecraft.banner.curly_border.magenta": "Magenta Bordure Indented", - "block.minecraft.banner.curly_border.orange": "Orange Bordure Indented", - "block.minecraft.banner.curly_border.pink": "Pink Bordure Indented", - "block.minecraft.banner.curly_border.purple": "Purple Bordure Indented", - "block.minecraft.banner.curly_border.red": "Red Bordure Indented", - "block.minecraft.banner.curly_border.white": "White Bordure Indented", - "block.minecraft.banner.curly_border.yellow": "Yellow Bordure Indented", - "block.minecraft.banner.diagonal_left.black": "Black Per Bend Sinister", - "block.minecraft.banner.diagonal_left.blue": "Blue Per Bend Sinister", - "block.minecraft.banner.diagonal_left.brown": "Brown Per Bend Sinister", - "block.minecraft.banner.diagonal_left.cyan": "Cyan Per Bend Sinister", - "block.minecraft.banner.diagonal_left.gray": "Gray Per Bend Sinister", - "block.minecraft.banner.diagonal_left.green": "Green Per Bend Sinister", - "block.minecraft.banner.diagonal_left.light_blue": "Light Blue Per Bend Sinister", - "block.minecraft.banner.diagonal_left.light_gray": "Light Gray Per Bend Sinister", - "block.minecraft.banner.diagonal_left.lime": "Lime Per Bend Sinister", - "block.minecraft.banner.diagonal_left.magenta": "Magenta Per Bend Sinister", - "block.minecraft.banner.diagonal_left.orange": "Orange Per Bend Sinister", - "block.minecraft.banner.diagonal_left.pink": "Pink Per Bend Sinister", - "block.minecraft.banner.diagonal_left.purple": "Purple Per Bend Sinister", - "block.minecraft.banner.diagonal_left.red": "Red Per Bend Sinister", - "block.minecraft.banner.diagonal_left.white": "White Per Bend Sinister", - "block.minecraft.banner.diagonal_left.yellow": "Yellow Per Bend Sinister", - "block.minecraft.banner.diagonal_right.black": "Black Per Bend", - "block.minecraft.banner.diagonal_right.blue": "Blue Per Bend", - "block.minecraft.banner.diagonal_right.brown": "Brown Per Bend", - "block.minecraft.banner.diagonal_right.cyan": "Cyan Per Bend", - "block.minecraft.banner.diagonal_right.gray": "Gray Per Bend", - "block.minecraft.banner.diagonal_right.green": "Green Per Bend", - "block.minecraft.banner.diagonal_right.light_blue": "Light Blue Per Bend", - "block.minecraft.banner.diagonal_right.light_gray": "Light Gray Per Bend", - "block.minecraft.banner.diagonal_right.lime": "Lime Per Bend", - "block.minecraft.banner.diagonal_right.magenta": "Magenta Per Bend", - "block.minecraft.banner.diagonal_right.orange": "Orange Per Bend", - "block.minecraft.banner.diagonal_right.pink": "Pink Per Bend", - "block.minecraft.banner.diagonal_right.purple": "Purple Per Bend", - "block.minecraft.banner.diagonal_right.red": "Red Per Bend", - "block.minecraft.banner.diagonal_right.white": "White Per Bend", - "block.minecraft.banner.diagonal_right.yellow": "Yellow Per Bend", - "block.minecraft.banner.diagonal_up_left.black": "Black Per Bend Inverted", - "block.minecraft.banner.diagonal_up_left.blue": "Blue Per Bend Inverted", - "block.minecraft.banner.diagonal_up_left.brown": "Brown Per Bend Inverted", - "block.minecraft.banner.diagonal_up_left.cyan": "Cyan Per Bend Inverted", - "block.minecraft.banner.diagonal_up_left.gray": "Gray Per Bend Inverted", - "block.minecraft.banner.diagonal_up_left.green": "Green Per Bend Inverted", - "block.minecraft.banner.diagonal_up_left.light_blue": "Light Blue Per Bend Inverted", - "block.minecraft.banner.diagonal_up_left.light_gray": "Light Gray Per Bend Inverted", - "block.minecraft.banner.diagonal_up_left.lime": "Lime Per Bend Inverted", - "block.minecraft.banner.diagonal_up_left.magenta": "Magenta Per Bend Inverted", - "block.minecraft.banner.diagonal_up_left.orange": "Orange Per Bend Inverted", - "block.minecraft.banner.diagonal_up_left.pink": "Pink Per Bend Inverted", - "block.minecraft.banner.diagonal_up_left.purple": "Purple Per Bend Inverted", - "block.minecraft.banner.diagonal_up_left.red": "Red Per Bend Inverted", - "block.minecraft.banner.diagonal_up_left.white": "White Per Bend Inverted", - "block.minecraft.banner.diagonal_up_left.yellow": "Yellow Per Bend Inverted", - "block.minecraft.banner.diagonal_up_right.black": "Black Per Bend Sinister Inverted", - "block.minecraft.banner.diagonal_up_right.blue": "Blue Per Bend Sinister Inverted", - "block.minecraft.banner.diagonal_up_right.brown": "Brown Per Bend Sinister Inverted", - "block.minecraft.banner.diagonal_up_right.cyan": "Cyan Per Bend Sinister Inverted", - "block.minecraft.banner.diagonal_up_right.gray": "Gray Per Bend Sinister Inverted", - "block.minecraft.banner.diagonal_up_right.green": "Green Per Bend Sinister Inverted", - "block.minecraft.banner.diagonal_up_right.light_blue": "Light Blue Per Bend Sinister Inverted", - "block.minecraft.banner.diagonal_up_right.light_gray": "Light Gray Per Bend Sinister Inverted", - "block.minecraft.banner.diagonal_up_right.lime": "Lime Per Bend Sinister Inverted", - "block.minecraft.banner.diagonal_up_right.magenta": "Magenta Per Bend Sinister Inverted", - "block.minecraft.banner.diagonal_up_right.orange": "Orange Per Bend Sinister Inverted", - "block.minecraft.banner.diagonal_up_right.pink": "Pink Per Bend Sinister Inverted", - "block.minecraft.banner.diagonal_up_right.purple": "Purple Per Bend Sinister Inverted", - "block.minecraft.banner.diagonal_up_right.red": "Red Per Bend Sinister Inverted", - "block.minecraft.banner.diagonal_up_right.white": "White Per Bend Sinister Inverted", - "block.minecraft.banner.diagonal_up_right.yellow": "Yellow Per Bend Sinister Inverted", - "block.minecraft.banner.flower.black": "Black Flower Charge", - "block.minecraft.banner.flower.blue": "Blue Flower Charge", - "block.minecraft.banner.flower.brown": "Brown Flower Charge", - "block.minecraft.banner.flower.cyan": "Cyan Flower Charge", - "block.minecraft.banner.flower.gray": "Gray Flower Charge", - "block.minecraft.banner.flower.green": "Green Flower Charge", - "block.minecraft.banner.flower.light_blue": "Light Blue Flower Charge", - "block.minecraft.banner.flower.light_gray": "Light Gray Flower Charge", - "block.minecraft.banner.flower.lime": "Lime Flower Charge", - "block.minecraft.banner.flower.magenta": "Magenta Flower Charge", - "block.minecraft.banner.flower.orange": "Orange Flower Charge", - "block.minecraft.banner.flower.pink": "Pink Flower Charge", - "block.minecraft.banner.flower.purple": "Purple Flower Charge", - "block.minecraft.banner.flower.red": "Red Flower Charge", - "block.minecraft.banner.flower.white": "White Flower Charge", - "block.minecraft.banner.flower.yellow": "Yellow Flower Charge", - "block.minecraft.banner.globe.black": "Black Globe", - "block.minecraft.banner.globe.blue": "Blue Globe", - "block.minecraft.banner.globe.brown": "Brown Globe", - "block.minecraft.banner.globe.cyan": "Cyan Globe", - "block.minecraft.banner.globe.gray": "Gray Globe", - "block.minecraft.banner.globe.green": "Green Globe", - "block.minecraft.banner.globe.light_blue": "Light Blue Globe", - "block.minecraft.banner.globe.light_gray": "Light Gray Globe", - "block.minecraft.banner.globe.lime": "Lime Globe", - "block.minecraft.banner.globe.magenta": "Magenta Globe", - "block.minecraft.banner.globe.orange": "Orange Globe", - "block.minecraft.banner.globe.pink": "Pink Globe", - "block.minecraft.banner.globe.purple": "Purple Globe", - "block.minecraft.banner.globe.red": "Red Globe", - "block.minecraft.banner.globe.white": "White Globe", - "block.minecraft.banner.globe.yellow": "Yellow Globe", - "block.minecraft.banner.gradient_up.black": "Black Base Gradient", - "block.minecraft.banner.gradient_up.blue": "Blue Base Gradient", - "block.minecraft.banner.gradient_up.brown": "Brown Base Gradient", - "block.minecraft.banner.gradient_up.cyan": "Cyan Base Gradient", - "block.minecraft.banner.gradient_up.gray": "Gray Base Gradient", - "block.minecraft.banner.gradient_up.green": "Green Base Gradient", - "block.minecraft.banner.gradient_up.light_blue": "Light Blue Base Gradient", - "block.minecraft.banner.gradient_up.light_gray": "Light Gray Base Gradient", - "block.minecraft.banner.gradient_up.lime": "Lime Base Gradient", - "block.minecraft.banner.gradient_up.magenta": "Magenta Base Gradient", - "block.minecraft.banner.gradient_up.orange": "Orange Base Gradient", - "block.minecraft.banner.gradient_up.pink": "Pink Base Gradient", - "block.minecraft.banner.gradient_up.purple": "Purple Base Gradient", - "block.minecraft.banner.gradient_up.red": "Red Base Gradient", - "block.minecraft.banner.gradient_up.white": "White Base Gradient", - "block.minecraft.banner.gradient_up.yellow": "Yellow Base Gradient", - "block.minecraft.banner.gradient.black": "Black Gradient", - "block.minecraft.banner.gradient.blue": "Blue Gradient", - "block.minecraft.banner.gradient.brown": "Brown Gradient", - "block.minecraft.banner.gradient.cyan": "Cyan Gradient", - "block.minecraft.banner.gradient.gray": "Gray Gradient", - "block.minecraft.banner.gradient.green": "Green Gradient", - "block.minecraft.banner.gradient.light_blue": "Light Blue Gradient", - "block.minecraft.banner.gradient.light_gray": "Light Gray Gradient", - "block.minecraft.banner.gradient.lime": "Lime Gradient", - "block.minecraft.banner.gradient.magenta": "Magenta Gradient", - "block.minecraft.banner.gradient.orange": "Orange Gradient", - "block.minecraft.banner.gradient.pink": "Pink Gradient", - "block.minecraft.banner.gradient.purple": "Purple Gradient", - "block.minecraft.banner.gradient.red": "Red Gradient", - "block.minecraft.banner.gradient.white": "White Gradient", - "block.minecraft.banner.gradient.yellow": "Yellow Gradient", - "block.minecraft.banner.half_horizontal_bottom.black": "Black Per Fess Inverted", - "block.minecraft.banner.half_horizontal_bottom.blue": "Blue Per Fess Inverted", - "block.minecraft.banner.half_horizontal_bottom.brown": "Brown Per Fess Inverted", - "block.minecraft.banner.half_horizontal_bottom.cyan": "Cyan Per Fess Inverted", - "block.minecraft.banner.half_horizontal_bottom.gray": "Gray Per Fess Inverted", - "block.minecraft.banner.half_horizontal_bottom.green": "Green Per Fess Inverted", - "block.minecraft.banner.half_horizontal_bottom.light_blue": "Light Blue Per Fess Inverted", - "block.minecraft.banner.half_horizontal_bottom.light_gray": "Light Gray Per Fess Inverted", - "block.minecraft.banner.half_horizontal_bottom.lime": "Lime Per Fess Inverted", - "block.minecraft.banner.half_horizontal_bottom.magenta": "Magenta Per Fess Inverted", - "block.minecraft.banner.half_horizontal_bottom.orange": "Orange Per Fess Inverted", - "block.minecraft.banner.half_horizontal_bottom.pink": "Pink Per Fess Inverted", - "block.minecraft.banner.half_horizontal_bottom.purple": "Purple Per Fess Inverted", - "block.minecraft.banner.half_horizontal_bottom.red": "Red Per Fess Inverted", - "block.minecraft.banner.half_horizontal_bottom.white": "White Per Fess Inverted", - "block.minecraft.banner.half_horizontal_bottom.yellow": "Yellow Per Fess Inverted", - "block.minecraft.banner.half_horizontal.black": "Black Per Fess", - "block.minecraft.banner.half_horizontal.blue": "Blue Per Fess", - "block.minecraft.banner.half_horizontal.brown": "Brown Per Fess", - "block.minecraft.banner.half_horizontal.cyan": "Cyan Per Fess", - "block.minecraft.banner.half_horizontal.gray": "Gray Per Fess", - "block.minecraft.banner.half_horizontal.green": "Green Per Fess", - "block.minecraft.banner.half_horizontal.light_blue": "Light Blue Per Fess", - "block.minecraft.banner.half_horizontal.light_gray": "Light Gray Per Fess", - "block.minecraft.banner.half_horizontal.lime": "Lime Per Fess", - "block.minecraft.banner.half_horizontal.magenta": "Magenta Per Fess", - "block.minecraft.banner.half_horizontal.orange": "Orange Per Fess", - "block.minecraft.banner.half_horizontal.pink": "Pink Per Fess", - "block.minecraft.banner.half_horizontal.purple": "Purple Per Fess", - "block.minecraft.banner.half_horizontal.red": "Red Per Fess", - "block.minecraft.banner.half_horizontal.white": "White Per Fess", - "block.minecraft.banner.half_horizontal.yellow": "Yellow Per Fess", - "block.minecraft.banner.half_vertical_right.black": "Black Per Pale Inverted", - "block.minecraft.banner.half_vertical_right.blue": "Blue Per Pale Inverted", - "block.minecraft.banner.half_vertical_right.brown": "Brown Per Pale Inverted", - "block.minecraft.banner.half_vertical_right.cyan": "Cyan Per Pale Inverted", - "block.minecraft.banner.half_vertical_right.gray": "Gray Per Pale Inverted", - "block.minecraft.banner.half_vertical_right.green": "Green Per Pale Inverted", - "block.minecraft.banner.half_vertical_right.light_blue": "Light Blue Per Pale Inverted", - "block.minecraft.banner.half_vertical_right.light_gray": "Light Gray Per Pale Inverted", - "block.minecraft.banner.half_vertical_right.lime": "Lime Per Pale Inverted", - "block.minecraft.banner.half_vertical_right.magenta": "Magenta Per Pale Inverted", - "block.minecraft.banner.half_vertical_right.orange": "Orange Per Pale Inverted", - "block.minecraft.banner.half_vertical_right.pink": "Pink Per Pale Inverted", - "block.minecraft.banner.half_vertical_right.purple": "Purple Per Pale Inverted", - "block.minecraft.banner.half_vertical_right.red": "Red Per Pale Inverted", - "block.minecraft.banner.half_vertical_right.white": "White Per Pale Inverted", - "block.minecraft.banner.half_vertical_right.yellow": "Yellow Per Pale Inverted", - "block.minecraft.banner.half_vertical.black": "Black Per Pale", - "block.minecraft.banner.half_vertical.blue": "Blue Per Pale", - "block.minecraft.banner.half_vertical.brown": "Brown Per Pale", - "block.minecraft.banner.half_vertical.cyan": "Cyan Per Pale", - "block.minecraft.banner.half_vertical.gray": "Gray Per Pale", - "block.minecraft.banner.half_vertical.green": "Green Per Pale", - "block.minecraft.banner.half_vertical.light_blue": "Light Blue Per Pale", - "block.minecraft.banner.half_vertical.light_gray": "Light Gray Per Pale", - "block.minecraft.banner.half_vertical.lime": "Lime Per Pale", - "block.minecraft.banner.half_vertical.magenta": "Magenta Per Pale", - "block.minecraft.banner.half_vertical.orange": "Orange Per Pale", - "block.minecraft.banner.half_vertical.pink": "Pink Per Pale", - "block.minecraft.banner.half_vertical.purple": "Purple Per Pale", - "block.minecraft.banner.half_vertical.red": "Red Per Pale", - "block.minecraft.banner.half_vertical.white": "White Per Pale", - "block.minecraft.banner.half_vertical.yellow": "Yellow Per Pale", - "block.minecraft.banner.mojang.black": "Black Thing", - "block.minecraft.banner.mojang.blue": "Blue Thing", - "block.minecraft.banner.mojang.brown": "Brown Thing", - "block.minecraft.banner.mojang.cyan": "Cyan Thing", - "block.minecraft.banner.mojang.gray": "Gray Thing", - "block.minecraft.banner.mojang.green": "Green Thing", - "block.minecraft.banner.mojang.light_blue": "Light Blue Thing", - "block.minecraft.banner.mojang.light_gray": "Light Gray Thing", - "block.minecraft.banner.mojang.lime": "Lime Thing", - "block.minecraft.banner.mojang.magenta": "Magenta Thing", - "block.minecraft.banner.mojang.orange": "Orange Thing", - "block.minecraft.banner.mojang.pink": "Pink Thing", - "block.minecraft.banner.mojang.purple": "Purple Thing", - "block.minecraft.banner.mojang.red": "Red Thing", - "block.minecraft.banner.mojang.white": "White Thing", - "block.minecraft.banner.mojang.yellow": "Yellow Thing", - "block.minecraft.banner.piglin.black": "Black Snout", - "block.minecraft.banner.piglin.blue": "Blue Snout", - "block.minecraft.banner.piglin.brown": "Brown Snout", - "block.minecraft.banner.piglin.cyan": "Cyan Snout", - "block.minecraft.banner.piglin.gray": "Gray Snout", - "block.minecraft.banner.piglin.green": "Green Snout", - "block.minecraft.banner.piglin.light_blue": "Light Blue Snout", - "block.minecraft.banner.piglin.light_gray": "Light Gray Snout", - "block.minecraft.banner.piglin.lime": "Lime Snout", - "block.minecraft.banner.piglin.magenta": "Magenta Snout", - "block.minecraft.banner.piglin.orange": "Orange Snout", - "block.minecraft.banner.piglin.pink": "Pink Snout", - "block.minecraft.banner.piglin.purple": "Purple Snout", - "block.minecraft.banner.piglin.red": "Red Snout", - "block.minecraft.banner.piglin.white": "White Snout", - "block.minecraft.banner.piglin.yellow": "Yellow Snout", - "block.minecraft.banner.rhombus.black": "Black Lozenge", - "block.minecraft.banner.rhombus.blue": "Blue Lozenge", - "block.minecraft.banner.rhombus.brown": "Brown Lozenge", - "block.minecraft.banner.rhombus.cyan": "Cyan Lozenge", - "block.minecraft.banner.rhombus.gray": "Gray Lozenge", - "block.minecraft.banner.rhombus.green": "Green Lozenge", - "block.minecraft.banner.rhombus.light_blue": "Light Blue Lozenge", - "block.minecraft.banner.rhombus.light_gray": "Light Gray Lozenge", - "block.minecraft.banner.rhombus.lime": "Lime Lozenge", - "block.minecraft.banner.rhombus.magenta": "Magenta Lozenge", - "block.minecraft.banner.rhombus.orange": "Orange Lozenge", - "block.minecraft.banner.rhombus.pink": "Pink Lozenge", - "block.minecraft.banner.rhombus.purple": "Purple Lozenge", - "block.minecraft.banner.rhombus.red": "Red Lozenge", - "block.minecraft.banner.rhombus.white": "White Lozenge", - "block.minecraft.banner.rhombus.yellow": "Yellow Lozenge", - "block.minecraft.banner.skull.black": "Black Skull Charge", - "block.minecraft.banner.skull.blue": "Blue Skull Charge", - "block.minecraft.banner.skull.brown": "Brown Skull Charge", - "block.minecraft.banner.skull.cyan": "Cyan Skull Charge", - "block.minecraft.banner.skull.gray": "Gray Skull Charge", - "block.minecraft.banner.skull.green": "Green Skull Charge", - "block.minecraft.banner.skull.light_blue": "Light Blue Skull Charge", - "block.minecraft.banner.skull.light_gray": "Light Gray Skull Charge", - "block.minecraft.banner.skull.lime": "Lime Skull Charge", - "block.minecraft.banner.skull.magenta": "Magenta Skull Charge", - "block.minecraft.banner.skull.orange": "Orange Skull Charge", - "block.minecraft.banner.skull.pink": "Pink Skull Charge", - "block.minecraft.banner.skull.purple": "Purple Skull Charge", - "block.minecraft.banner.skull.red": "Red Skull Charge", - "block.minecraft.banner.skull.white": "White Skull Charge", - "block.minecraft.banner.skull.yellow": "Yellow Skull Charge", - "block.minecraft.banner.small_stripes.black": "Black Paly", - "block.minecraft.banner.small_stripes.blue": "Blue Paly", - "block.minecraft.banner.small_stripes.brown": "Brown Paly", - "block.minecraft.banner.small_stripes.cyan": "Cyan Paly", - "block.minecraft.banner.small_stripes.gray": "Gray Paly", - "block.minecraft.banner.small_stripes.green": "Green Paly", - "block.minecraft.banner.small_stripes.light_blue": "Light Blue Paly", - "block.minecraft.banner.small_stripes.light_gray": "Light Gray Paly", - "block.minecraft.banner.small_stripes.lime": "Lime Paly", - "block.minecraft.banner.small_stripes.magenta": "Magenta Paly", - "block.minecraft.banner.small_stripes.orange": "Orange Paly", - "block.minecraft.banner.small_stripes.pink": "Pink Paly", - "block.minecraft.banner.small_stripes.purple": "Purple Paly", - "block.minecraft.banner.small_stripes.red": "Red Paly", - "block.minecraft.banner.small_stripes.white": "White Paly", - "block.minecraft.banner.small_stripes.yellow": "Yellow Paly", - "block.minecraft.banner.square_bottom_left.black": "Black Base Dexter Canton", - "block.minecraft.banner.square_bottom_left.blue": "Blue Base Dexter Canton", - "block.minecraft.banner.square_bottom_left.brown": "Brown Base Dexter Canton", - "block.minecraft.banner.square_bottom_left.cyan": "Cyan Base Dexter Canton", - "block.minecraft.banner.square_bottom_left.gray": "Gray Base Dexter Canton", - "block.minecraft.banner.square_bottom_left.green": "Green Base Dexter Canton", - "block.minecraft.banner.square_bottom_left.light_blue": "Light Blue Base Dexter Canton", - "block.minecraft.banner.square_bottom_left.light_gray": "Light Gray Base Dexter Canton", - "block.minecraft.banner.square_bottom_left.lime": "Lime Base Dexter Canton", - "block.minecraft.banner.square_bottom_left.magenta": "Magenta Base Dexter Canton", - "block.minecraft.banner.square_bottom_left.orange": "Orange Base Dexter Canton", - "block.minecraft.banner.square_bottom_left.pink": "Pink Base Dexter Canton", - "block.minecraft.banner.square_bottom_left.purple": "Purple Base Dexter Canton", - "block.minecraft.banner.square_bottom_left.red": "Red Base Dexter Canton", - "block.minecraft.banner.square_bottom_left.white": "White Base Dexter Canton", - "block.minecraft.banner.square_bottom_left.yellow": "Yellow Base Dexter Canton", - "block.minecraft.banner.square_bottom_right.black": "Black Base Sinister Canton", - "block.minecraft.banner.square_bottom_right.blue": "Blue Base Sinister Canton", - "block.minecraft.banner.square_bottom_right.brown": "Brown Base Sinister Canton", - "block.minecraft.banner.square_bottom_right.cyan": "Cyan Base Sinister Canton", - "block.minecraft.banner.square_bottom_right.gray": "Gray Base Sinister Canton", - "block.minecraft.banner.square_bottom_right.green": "Green Base Sinister Canton", - "block.minecraft.banner.square_bottom_right.light_blue": "Light Blue Base Sinister Canton", - "block.minecraft.banner.square_bottom_right.light_gray": "Light Gray Base Sinister Canton", - "block.minecraft.banner.square_bottom_right.lime": "Lime Base Sinister Canton", - "block.minecraft.banner.square_bottom_right.magenta": "Magenta Base Sinister Canton", - "block.minecraft.banner.square_bottom_right.orange": "Orange Base Sinister Canton", - "block.minecraft.banner.square_bottom_right.pink": "Pink Base Sinister Canton", - "block.minecraft.banner.square_bottom_right.purple": "Purple Base Sinister Canton", - "block.minecraft.banner.square_bottom_right.red": "Red Base Sinister Canton", - "block.minecraft.banner.square_bottom_right.white": "White Base Sinister Canton", - "block.minecraft.banner.square_bottom_right.yellow": "Yellow Base Sinister Canton", - "block.minecraft.banner.square_top_left.black": "Black Chief Dexter Canton", - "block.minecraft.banner.square_top_left.blue": "Blue Chief Dexter Canton", - "block.minecraft.banner.square_top_left.brown": "Brown Chief Dexter Canton", - "block.minecraft.banner.square_top_left.cyan": "Cyan Chief Dexter Canton", - "block.minecraft.banner.square_top_left.gray": "Gray Chief Dexter Canton", - "block.minecraft.banner.square_top_left.green": "Green Chief Dexter Canton", - "block.minecraft.banner.square_top_left.light_blue": "Light Blue Chief Dexter Canton", - "block.minecraft.banner.square_top_left.light_gray": "Light Gray Chief Dexter Canton", - "block.minecraft.banner.square_top_left.lime": "Lime Chief Dexter Canton", - "block.minecraft.banner.square_top_left.magenta": "Magenta Chief Dexter Canton", - "block.minecraft.banner.square_top_left.orange": "Orange Chief Dexter Canton", - "block.minecraft.banner.square_top_left.pink": "Pink Chief Dexter Canton", - "block.minecraft.banner.square_top_left.purple": "Purple Chief Dexter Canton", - "block.minecraft.banner.square_top_left.red": "Red Chief Dexter Canton", - "block.minecraft.banner.square_top_left.white": "White Chief Dexter Canton", - "block.minecraft.banner.square_top_left.yellow": "Yellow Chief Dexter Canton", - "block.minecraft.banner.square_top_right.black": "Black Chief Sinister Canton", - "block.minecraft.banner.square_top_right.blue": "Blue Chief Sinister Canton", - "block.minecraft.banner.square_top_right.brown": "Brown Chief Sinister Canton", - "block.minecraft.banner.square_top_right.cyan": "Cyan Chief Sinister Canton", - "block.minecraft.banner.square_top_right.gray": "Gray Chief Sinister Canton", - "block.minecraft.banner.square_top_right.green": "Green Chief Sinister Canton", - "block.minecraft.banner.square_top_right.light_blue": "Light Blue Chief Sinister Canton", - "block.minecraft.banner.square_top_right.light_gray": "Light Gray Chief Sinister Canton", - "block.minecraft.banner.square_top_right.lime": "Lime Chief Sinister Canton", - "block.minecraft.banner.square_top_right.magenta": "Magenta Chief Sinister Canton", - "block.minecraft.banner.square_top_right.orange": "Orange Chief Sinister Canton", - "block.minecraft.banner.square_top_right.pink": "Pink Chief Sinister Canton", - "block.minecraft.banner.square_top_right.purple": "Purple Chief Sinister Canton", - "block.minecraft.banner.square_top_right.red": "Red Chief Sinister Canton", - "block.minecraft.banner.square_top_right.white": "White Chief Sinister Canton", - "block.minecraft.banner.square_top_right.yellow": "Yellow Chief Sinister Canton", - "block.minecraft.banner.straight_cross.black": "Black Cross", - "block.minecraft.banner.straight_cross.blue": "Blue Cross", - "block.minecraft.banner.straight_cross.brown": "Brown Cross", - "block.minecraft.banner.straight_cross.cyan": "Cyan Cross", - "block.minecraft.banner.straight_cross.gray": "Gray Cross", - "block.minecraft.banner.straight_cross.green": "Green Cross", - "block.minecraft.banner.straight_cross.light_blue": "Light Blue Cross", - "block.minecraft.banner.straight_cross.light_gray": "Light Gray Cross", - "block.minecraft.banner.straight_cross.lime": "Lime Cross", - "block.minecraft.banner.straight_cross.magenta": "Magenta Cross", - "block.minecraft.banner.straight_cross.orange": "Orange Cross", - "block.minecraft.banner.straight_cross.pink": "Pink Cross", - "block.minecraft.banner.straight_cross.purple": "Purple Cross", - "block.minecraft.banner.straight_cross.red": "Red Cross", - "block.minecraft.banner.straight_cross.white": "White Cross", - "block.minecraft.banner.straight_cross.yellow": "Yellow Cross", - "block.minecraft.banner.stripe_bottom.black": "Black Base", - "block.minecraft.banner.stripe_bottom.blue": "Blue Base", - "block.minecraft.banner.stripe_bottom.brown": "Brown Base", - "block.minecraft.banner.stripe_bottom.cyan": "Cyan Base", - "block.minecraft.banner.stripe_bottom.gray": "Gray Base", - "block.minecraft.banner.stripe_bottom.green": "Green Base", - "block.minecraft.banner.stripe_bottom.light_blue": "Light Blue Base", - "block.minecraft.banner.stripe_bottom.light_gray": "Light Gray Base", - "block.minecraft.banner.stripe_bottom.lime": "Lime Base", - "block.minecraft.banner.stripe_bottom.magenta": "Magenta Base", - "block.minecraft.banner.stripe_bottom.orange": "Orange Base", - "block.minecraft.banner.stripe_bottom.pink": "Pink Base", - "block.minecraft.banner.stripe_bottom.purple": "Purple Base", - "block.minecraft.banner.stripe_bottom.red": "Red Base", - "block.minecraft.banner.stripe_bottom.white": "White Base", - "block.minecraft.banner.stripe_bottom.yellow": "Yellow Base", - "block.minecraft.banner.stripe_center.black": "Black Pale", - "block.minecraft.banner.stripe_center.blue": "Blue Pale", - "block.minecraft.banner.stripe_center.brown": "Brown Pale", - "block.minecraft.banner.stripe_center.cyan": "Cyan Pale", - "block.minecraft.banner.stripe_center.gray": "Gray Pale", - "block.minecraft.banner.stripe_center.green": "Green Pale", - "block.minecraft.banner.stripe_center.light_blue": "Light Blue Pale", - "block.minecraft.banner.stripe_center.light_gray": "Light Gray Pale", - "block.minecraft.banner.stripe_center.lime": "Lime Pale", - "block.minecraft.banner.stripe_center.magenta": "Magenta Pale", - "block.minecraft.banner.stripe_center.orange": "Orange Pale", - "block.minecraft.banner.stripe_center.pink": "Pink Pale", - "block.minecraft.banner.stripe_center.purple": "Purple Pale", - "block.minecraft.banner.stripe_center.red": "Red Pale", - "block.minecraft.banner.stripe_center.white": "White Pale", - "block.minecraft.banner.stripe_center.yellow": "Yellow Pale", - "block.minecraft.banner.stripe_downleft.black": "Black Bend Sinister", - "block.minecraft.banner.stripe_downleft.blue": "Blue Bend Sinister", - "block.minecraft.banner.stripe_downleft.brown": "Brown Bend Sinister", - "block.minecraft.banner.stripe_downleft.cyan": "Cyan Bend Sinister", - "block.minecraft.banner.stripe_downleft.gray": "Gray Bend Sinister", - "block.minecraft.banner.stripe_downleft.green": "Green Bend Sinister", - "block.minecraft.banner.stripe_downleft.light_blue": "Light Blue Bend Sinister", - "block.minecraft.banner.stripe_downleft.light_gray": "Light Gray Bend Sinister", - "block.minecraft.banner.stripe_downleft.lime": "Lime Bend Sinister", - "block.minecraft.banner.stripe_downleft.magenta": "Magenta Bend Sinister", - "block.minecraft.banner.stripe_downleft.orange": "Orange Bend Sinister", - "block.minecraft.banner.stripe_downleft.pink": "Pink Bend Sinister", - "block.minecraft.banner.stripe_downleft.purple": "Purple Bend Sinister", - "block.minecraft.banner.stripe_downleft.red": "Red Bend Sinister", - "block.minecraft.banner.stripe_downleft.white": "White Bend Sinister", - "block.minecraft.banner.stripe_downleft.yellow": "Yellow Bend Sinister", - "block.minecraft.banner.stripe_downright.black": "Black Bend", - "block.minecraft.banner.stripe_downright.blue": "Blue Bend", - "block.minecraft.banner.stripe_downright.brown": "Brown Bend", - "block.minecraft.banner.stripe_downright.cyan": "Cyan Bend", - "block.minecraft.banner.stripe_downright.gray": "Gray Bend", - "block.minecraft.banner.stripe_downright.green": "Green Bend", - "block.minecraft.banner.stripe_downright.light_blue": "Light Blue Bend", - "block.minecraft.banner.stripe_downright.light_gray": "Light Gray Bend", - "block.minecraft.banner.stripe_downright.lime": "Lime Bend", - "block.minecraft.banner.stripe_downright.magenta": "Magenta Bend", - "block.minecraft.banner.stripe_downright.orange": "Orange Bend", - "block.minecraft.banner.stripe_downright.pink": "Pink Bend", - "block.minecraft.banner.stripe_downright.purple": "Purple Bend", - "block.minecraft.banner.stripe_downright.red": "Red Bend", - "block.minecraft.banner.stripe_downright.white": "White Bend", - "block.minecraft.banner.stripe_downright.yellow": "Yellow Bend", - "block.minecraft.banner.stripe_left.black": "Black Pale Dexter", - "block.minecraft.banner.stripe_left.blue": "Blue Pale Dexter", - "block.minecraft.banner.stripe_left.brown": "Brown Pale Dexter", - "block.minecraft.banner.stripe_left.cyan": "Cyan Pale Dexter", - "block.minecraft.banner.stripe_left.gray": "Gray Pale Dexter", - "block.minecraft.banner.stripe_left.green": "Green Pale Dexter", - "block.minecraft.banner.stripe_left.light_blue": "Light Blue Pale Dexter", - "block.minecraft.banner.stripe_left.light_gray": "Light Gray Pale Dexter", - "block.minecraft.banner.stripe_left.lime": "Lime Pale Dexter", - "block.minecraft.banner.stripe_left.magenta": "Magenta Pale Dexter", - "block.minecraft.banner.stripe_left.orange": "Orange Pale Dexter", - "block.minecraft.banner.stripe_left.pink": "Pink Pale Dexter", - "block.minecraft.banner.stripe_left.purple": "Purple Pale Dexter", - "block.minecraft.banner.stripe_left.red": "Red Pale Dexter", - "block.minecraft.banner.stripe_left.white": "White Pale Dexter", - "block.minecraft.banner.stripe_left.yellow": "Yellow Pale Dexter", - "block.minecraft.banner.stripe_middle.black": "Black Fess", - "block.minecraft.banner.stripe_middle.blue": "Blue Fess", - "block.minecraft.banner.stripe_middle.brown": "Brown Fess", - "block.minecraft.banner.stripe_middle.cyan": "Cyan Fess", - "block.minecraft.banner.stripe_middle.gray": "Gray Fess", - "block.minecraft.banner.stripe_middle.green": "Green Fess", - "block.minecraft.banner.stripe_middle.light_blue": "Light Blue Fess", - "block.minecraft.banner.stripe_middle.light_gray": "Light Gray Fess", - "block.minecraft.banner.stripe_middle.lime": "Lime Fess", - "block.minecraft.banner.stripe_middle.magenta": "Magenta Fess", - "block.minecraft.banner.stripe_middle.orange": "Orange Fess", - "block.minecraft.banner.stripe_middle.pink": "Pink Fess", - "block.minecraft.banner.stripe_middle.purple": "Purple Fess", - "block.minecraft.banner.stripe_middle.red": "Red Fess", - "block.minecraft.banner.stripe_middle.white": "White Fess", - "block.minecraft.banner.stripe_middle.yellow": "Yellow Fess", - "block.minecraft.banner.stripe_right.black": "Black Pale Sinister", - "block.minecraft.banner.stripe_right.blue": "Blue Pale Sinister", - "block.minecraft.banner.stripe_right.brown": "Brown Pale Sinister", - "block.minecraft.banner.stripe_right.cyan": "Cyan Pale Sinister", - "block.minecraft.banner.stripe_right.gray": "Gray Pale Sinister", - "block.minecraft.banner.stripe_right.green": "Green Pale Sinister", - "block.minecraft.banner.stripe_right.light_blue": "Light Blue Pale Sinister", - "block.minecraft.banner.stripe_right.light_gray": "Light Gray Pale Sinister", - "block.minecraft.banner.stripe_right.lime": "Lime Pale Sinister", - "block.minecraft.banner.stripe_right.magenta": "Magenta Pale Sinister", - "block.minecraft.banner.stripe_right.orange": "Orange Pale Sinister", - "block.minecraft.banner.stripe_right.pink": "Pink Pale Sinister", - "block.minecraft.banner.stripe_right.purple": "Purple Pale Sinister", - "block.minecraft.banner.stripe_right.red": "Red Pale Sinister", - "block.minecraft.banner.stripe_right.white": "White Pale Sinister", - "block.minecraft.banner.stripe_right.yellow": "Yellow Pale Sinister", - "block.minecraft.banner.stripe_top.black": "Black Chief", - "block.minecraft.banner.stripe_top.blue": "Blue Chief", - "block.minecraft.banner.stripe_top.brown": "Brown Chief", - "block.minecraft.banner.stripe_top.cyan": "Cyan Chief", - "block.minecraft.banner.stripe_top.gray": "Gray Chief", - "block.minecraft.banner.stripe_top.green": "Green Chief", - "block.minecraft.banner.stripe_top.light_blue": "Light Blue Chief", - "block.minecraft.banner.stripe_top.light_gray": "Light Gray Chief", - "block.minecraft.banner.stripe_top.lime": "Lime Chief", - "block.minecraft.banner.stripe_top.magenta": "Magenta Chief", - "block.minecraft.banner.stripe_top.orange": "Orange Chief", - "block.minecraft.banner.stripe_top.pink": "Pink Chief", - "block.minecraft.banner.stripe_top.purple": "Purple Chief", - "block.minecraft.banner.stripe_top.red": "Red Chief", - "block.minecraft.banner.stripe_top.white": "White Chief", - "block.minecraft.banner.stripe_top.yellow": "Yellow Chief", - "block.minecraft.banner.triangle_bottom.black": "Black Chevron", - "block.minecraft.banner.triangle_bottom.blue": "Blue Chevron", - "block.minecraft.banner.triangle_bottom.brown": "Brown Chevron", - "block.minecraft.banner.triangle_bottom.cyan": "Cyan Chevron", - "block.minecraft.banner.triangle_bottom.gray": "Gray Chevron", - "block.minecraft.banner.triangle_bottom.green": "Green Chevron", - "block.minecraft.banner.triangle_bottom.light_blue": "Light Blue Chevron", - "block.minecraft.banner.triangle_bottom.light_gray": "Light Gray Chevron", - "block.minecraft.banner.triangle_bottom.lime": "Lime Chevron", - "block.minecraft.banner.triangle_bottom.magenta": "Magenta Chevron", - "block.minecraft.banner.triangle_bottom.orange": "Orange Chevron", - "block.minecraft.banner.triangle_bottom.pink": "Pink Chevron", - "block.minecraft.banner.triangle_bottom.purple": "Purple Chevron", - "block.minecraft.banner.triangle_bottom.red": "Red Chevron", - "block.minecraft.banner.triangle_bottom.white": "White Chevron", - "block.minecraft.banner.triangle_bottom.yellow": "Yellow Chevron", - "block.minecraft.banner.triangle_top.black": "Black Inverted Chevron", - "block.minecraft.banner.triangle_top.blue": "Blue Inverted Chevron", - "block.minecraft.banner.triangle_top.brown": "Brown Inverted Chevron", - "block.minecraft.banner.triangle_top.cyan": "Cyan Inverted Chevron", - "block.minecraft.banner.triangle_top.gray": "Gray Inverted Chevron", - "block.minecraft.banner.triangle_top.green": "Green Inverted Chevron", - "block.minecraft.banner.triangle_top.light_blue": "Light Blue Inverted Chevron", - "block.minecraft.banner.triangle_top.light_gray": "Light Gray Inverted Chevron", - "block.minecraft.banner.triangle_top.lime": "Lime Inverted Chevron", - "block.minecraft.banner.triangle_top.magenta": "Magenta Inverted Chevron", - "block.minecraft.banner.triangle_top.orange": "Orange Inverted Chevron", - "block.minecraft.banner.triangle_top.pink": "Pink Inverted Chevron", - "block.minecraft.banner.triangle_top.purple": "Purple Inverted Chevron", - "block.minecraft.banner.triangle_top.red": "Red Inverted Chevron", - "block.minecraft.banner.triangle_top.white": "White Inverted Chevron", - "block.minecraft.banner.triangle_top.yellow": "Yellow Inverted Chevron", - "block.minecraft.banner.triangles_bottom.black": "Black Base Indented", - "block.minecraft.banner.triangles_bottom.blue": "Blue Base Indented", - "block.minecraft.banner.triangles_bottom.brown": "Brown Base Indented", - "block.minecraft.banner.triangles_bottom.cyan": "Cyan Base Indented", - "block.minecraft.banner.triangles_bottom.gray": "Gray Base Indented", - "block.minecraft.banner.triangles_bottom.green": "Green Base Indented", - "block.minecraft.banner.triangles_bottom.light_blue": "Light Blue Base Indented", - "block.minecraft.banner.triangles_bottom.light_gray": "Light Gray Base Indented", - "block.minecraft.banner.triangles_bottom.lime": "Lime Base Indented", - "block.minecraft.banner.triangles_bottom.magenta": "Magenta Base Indented", - "block.minecraft.banner.triangles_bottom.orange": "Orange Base Indented", - "block.minecraft.banner.triangles_bottom.pink": "Pink Base Indented", - "block.minecraft.banner.triangles_bottom.purple": "Purple Base Indented", - "block.minecraft.banner.triangles_bottom.red": "Red Base Indented", - "block.minecraft.banner.triangles_bottom.white": "White Base Indented", - "block.minecraft.banner.triangles_bottom.yellow": "Yellow Base Indented", - "block.minecraft.banner.triangles_top.black": "Black Chief Indented", - "block.minecraft.banner.triangles_top.blue": "Blue Chief Indented", - "block.minecraft.banner.triangles_top.brown": "Brown Chief Indented", - "block.minecraft.banner.triangles_top.cyan": "Cyan Chief Indented", - "block.minecraft.banner.triangles_top.gray": "Gray Chief Indented", - "block.minecraft.banner.triangles_top.green": "Green Chief Indented", - "block.minecraft.banner.triangles_top.light_blue": "Light Blue Chief Indented", - "block.minecraft.banner.triangles_top.light_gray": "Light Gray Chief Indented", - "block.minecraft.banner.triangles_top.lime": "Lime Chief Indented", - "block.minecraft.banner.triangles_top.magenta": "Magenta Chief Indented", - "block.minecraft.banner.triangles_top.orange": "Orange Chief Indented", - "block.minecraft.banner.triangles_top.pink": "Pink Chief Indented", - "block.minecraft.banner.triangles_top.purple": "Purple Chief Indented", - "block.minecraft.banner.triangles_top.red": "Red Chief Indented", - "block.minecraft.banner.triangles_top.white": "White Chief Indented", - "block.minecraft.banner.triangles_top.yellow": "Yellow Chief Indented", - "block.minecraft.barrel": "Barrel", - "block.minecraft.barrier": "Barrier", - "block.minecraft.basalt": "Basalt", - "block.minecraft.beacon": "Beacon", - "block.minecraft.beacon.primary": "Primary Power", - "block.minecraft.beacon.secondary": "Secondary Power", - "block.minecraft.bed.no_sleep": "You can sleep only at night or during thunderstorms", - "block.minecraft.bed.not_safe": "You may not rest now; there are monsters nearby", - "block.minecraft.bed.obstructed": "This bed is obstructed", - "block.minecraft.bed.occupied": "This bed is occupied", - "block.minecraft.bed.too_far_away": "You may not rest now; the bed is too far away", - "block.minecraft.bedrock": "Bedrock", - "block.minecraft.bee_nest": "Bee Nest", - "block.minecraft.beehive": "Beehive", - "block.minecraft.beetroots": "Beetroots", - "block.minecraft.bell": "Bell", - "block.minecraft.big_dripleaf": "Big Dripleaf", - "block.minecraft.big_dripleaf_stem": "Big Dripleaf Stem", - "block.minecraft.birch_button": "Birch Button", - "block.minecraft.birch_door": "Birch Door", - "block.minecraft.birch_fence": "Birch Fence", - "block.minecraft.birch_fence_gate": "Birch Fence Gate", - "block.minecraft.birch_hanging_sign": "Birch Hanging Sign", - "block.minecraft.birch_leaves": "Birch Leaves", - "block.minecraft.birch_log": "Birch Log", - "block.minecraft.birch_planks": "Birch Planks", - "block.minecraft.birch_pressure_plate": "Birch Pressure Plate", - "block.minecraft.birch_sapling": "Birch Sapling", - "block.minecraft.birch_sign": "Birch Sign", - "block.minecraft.birch_slab": "Birch Slab", - "block.minecraft.birch_stairs": "Birch Stairs", - "block.minecraft.birch_trapdoor": "Birch Trapdoor", - "block.minecraft.birch_wall_hanging_sign": "Birch Wall Hanging Sign", - "block.minecraft.birch_wall_sign": "Birch Wall Sign", - "block.minecraft.birch_wood": "Birch Wood", - "block.minecraft.black_banner": "Black Banner", - "block.minecraft.black_bed": "Black Bed", - "block.minecraft.black_candle": "Black Candle", - "block.minecraft.black_candle_cake": "Cake with Black Candle", - "block.minecraft.black_carpet": "Black Carpet", - "block.minecraft.black_concrete": "Black Concrete", - "block.minecraft.black_concrete_powder": "Black Concrete Powder", - "block.minecraft.black_glazed_terracotta": "Black Glazed Terracotta", - "block.minecraft.black_shulker_box": "Black Shulker Box", - "block.minecraft.black_stained_glass": "Black Stained Glass", - "block.minecraft.black_stained_glass_pane": "Black Stained Glass Pane", - "block.minecraft.black_terracotta": "Black Terracotta", - "block.minecraft.black_wool": "Black Wool", - "block.minecraft.blackstone": "Blackstone", - "block.minecraft.blackstone_slab": "Blackstone Slab", - "block.minecraft.blackstone_stairs": "Blackstone Stairs", - "block.minecraft.blackstone_wall": "Blackstone Wall", - "block.minecraft.blast_furnace": "Blast Furnace", - "block.minecraft.blue_banner": "Blue Banner", - "block.minecraft.blue_bed": "Blue Bed", - "block.minecraft.blue_candle": "Blue Candle", - "block.minecraft.blue_candle_cake": "Cake with Blue Candle", - "block.minecraft.blue_carpet": "Blue Carpet", - "block.minecraft.blue_concrete": "Blue Concrete", - "block.minecraft.blue_concrete_powder": "Blue Concrete Powder", - "block.minecraft.blue_glazed_terracotta": "Blue Glazed Terracotta", - "block.minecraft.blue_ice": "Blue Ice", - "block.minecraft.blue_orchid": "Blue Orchid", - "block.minecraft.blue_shulker_box": "Blue Shulker Box", - "block.minecraft.blue_stained_glass": "Blue Stained Glass", - "block.minecraft.blue_stained_glass_pane": "Blue Stained Glass Pane", - "block.minecraft.blue_terracotta": "Blue Terracotta", - "block.minecraft.blue_wool": "Blue Wool", - "block.minecraft.bone_block": "Bone Block", - "block.minecraft.bookshelf": "Bookshelf", - "block.minecraft.brain_coral": "Brain Coral", - "block.minecraft.brain_coral_block": "Brain Coral Block", - "block.minecraft.brain_coral_fan": "Brain Coral Fan", - "block.minecraft.brain_coral_wall_fan": "Brain Coral Wall Fan", - "block.minecraft.brewing_stand": "Brewing Stand", - "block.minecraft.brick_slab": "Brick Slab", - "block.minecraft.brick_stairs": "Brick Stairs", - "block.minecraft.brick_wall": "Brick Wall", - "block.minecraft.bricks": "Bricks", - "block.minecraft.brown_banner": "Brown Banner", - "block.minecraft.brown_bed": "Brown Bed", - "block.minecraft.brown_candle": "Brown Candle", - "block.minecraft.brown_candle_cake": "Cake with Brown Candle", - "block.minecraft.brown_carpet": "Brown Carpet", - "block.minecraft.brown_concrete": "Brown Concrete", - "block.minecraft.brown_concrete_powder": "Brown Concrete Powder", - "block.minecraft.brown_glazed_terracotta": "Brown Glazed Terracotta", - "block.minecraft.brown_mushroom": "Brown Mushroom", - "block.minecraft.brown_mushroom_block": "Brown Mushroom Block", - "block.minecraft.brown_shulker_box": "Brown Shulker Box", - "block.minecraft.brown_stained_glass": "Brown Stained Glass", - "block.minecraft.brown_stained_glass_pane": "Brown Stained Glass Pane", - "block.minecraft.brown_terracotta": "Brown Terracotta", - "block.minecraft.brown_wool": "Brown Wool", - "block.minecraft.bubble_column": "Bubble Column", - "block.minecraft.bubble_coral": "Bubble Coral", - "block.minecraft.bubble_coral_block": "Bubble Coral Block", - "block.minecraft.bubble_coral_fan": "Bubble Coral Fan", - "block.minecraft.bubble_coral_wall_fan": "Bubble Coral Wall Fan", - "block.minecraft.budding_amethyst": "Budding Amethyst", - "block.minecraft.cactus": "Cactus", - "block.minecraft.cake": "Cake", - "block.minecraft.calcite": "Calcite", - "block.minecraft.calibrated_sculk_sensor": "Calibrated Sculk Sensor", - "block.minecraft.campfire": "Campfire", - "block.minecraft.candle": "Candle", - "block.minecraft.candle_cake": "Cake with Candle", - "block.minecraft.carrots": "Carrots", - "block.minecraft.cartography_table": "Cartography Table", - "block.minecraft.carved_pumpkin": "Carved Pumpkin", - "block.minecraft.cauldron": "Cauldron", - "block.minecraft.cave_air": "Cave Air", - "block.minecraft.cave_vines": "Cave Vines", - "block.minecraft.cave_vines_plant": "Cave Vines Plant", - "block.minecraft.chain": "Chain", - "block.minecraft.chain_command_block": "Chain Command Block", - "block.minecraft.cherry_button": "Cherry Button", - "block.minecraft.cherry_door": "Cherry Door", - "block.minecraft.cherry_fence": "Cherry Fence", - "block.minecraft.cherry_fence_gate": "Cherry Fence Gate", - "block.minecraft.cherry_hanging_sign": "Cherry Hanging Sign", - "block.minecraft.cherry_leaves": "Cherry Leaves", - "block.minecraft.cherry_log": "Cherry Log", - "block.minecraft.cherry_planks": "Cherry Planks", - "block.minecraft.cherry_pressure_plate": "Cherry Pressure Plate", - "block.minecraft.cherry_sapling": "Cherry Sapling", - "block.minecraft.cherry_sign": "Cherry Sign", - "block.minecraft.cherry_slab": "Cherry Slab", - "block.minecraft.cherry_stairs": "Cherry Stairs", - "block.minecraft.cherry_trapdoor": "Cherry Trapdoor", - "block.minecraft.cherry_wall_hanging_sign": "Cherry Wall Hanging Sign", - "block.minecraft.cherry_wall_sign": "Cherry Wall Sign", - "block.minecraft.cherry_wood": "Cherry Wood", - "block.minecraft.chest": "Chest", - "block.minecraft.chipped_anvil": "Chipped Anvil", - "block.minecraft.chiseled_bookshelf": "Chiseled Bookshelf", - "block.minecraft.chiseled_copper": "Chiseled Copper", - "block.minecraft.chiseled_deepslate": "Chiseled Deepslate", - "block.minecraft.chiseled_nether_bricks": "Chiseled Nether Bricks", - "block.minecraft.chiseled_polished_blackstone": "Chiseled Polished Blackstone", - "block.minecraft.chiseled_quartz_block": "Chiseled Quartz Block", - "block.minecraft.chiseled_red_sandstone": "Chiseled Red Sandstone", - "block.minecraft.chiseled_sandstone": "Chiseled Sandstone", - "block.minecraft.chiseled_stone_bricks": "Chiseled Stone Bricks", - "block.minecraft.chiseled_tuff": "Chiseled Tuff", - "block.minecraft.chiseled_tuff_bricks": "Chiseled Tuff Bricks", - "block.minecraft.chorus_flower": "Chorus Flower", - "block.minecraft.chorus_plant": "Chorus Plant", - "block.minecraft.clay": "Clay", - "block.minecraft.coal_block": "Block of Coal", - "block.minecraft.coal_ore": "Coal Ore", - "block.minecraft.coarse_dirt": "Coarse Dirt", - "block.minecraft.cobbled_deepslate": "Cobbled Deepslate", - "block.minecraft.cobbled_deepslate_slab": "Cobbled Deepslate Slab", - "block.minecraft.cobbled_deepslate_stairs": "Cobbled Deepslate Stairs", - "block.minecraft.cobbled_deepslate_wall": "Cobbled Deepslate Wall", - "block.minecraft.cobblestone": "Cobblestone", - "block.minecraft.cobblestone_slab": "Cobblestone Slab", - "block.minecraft.cobblestone_stairs": "Cobblestone Stairs", - "block.minecraft.cobblestone_wall": "Cobblestone Wall", - "block.minecraft.cobweb": "Cobweb", - "block.minecraft.cocoa": "Cocoa", - "block.minecraft.command_block": "Command Block", - "block.minecraft.comparator": "Redstone Comparator", - "block.minecraft.composter": "Composter", - "block.minecraft.conduit": "Conduit", - "block.minecraft.copper_block": "Block of Copper", - "block.minecraft.copper_bulb": "Copper Bulb", - "block.minecraft.copper_door": "Copper Door", - "block.minecraft.copper_grate": "Copper Grate", - "block.minecraft.copper_ore": "Copper Ore", - "block.minecraft.copper_trapdoor": "Copper Trapdoor", - "block.minecraft.cornflower": "Cornflower", - "block.minecraft.cracked_deepslate_bricks": "Cracked Deepslate Bricks", - "block.minecraft.cracked_deepslate_tiles": "Cracked Deepslate Tiles", - "block.minecraft.cracked_nether_bricks": "Cracked Nether Bricks", - "block.minecraft.cracked_polished_blackstone_bricks": "Cracked Polished Blackstone Bricks", - "block.minecraft.cracked_stone_bricks": "Cracked Stone Bricks", - "block.minecraft.crafter": "Crafter", - "block.minecraft.crafting_table": "Crafting Table", - "block.minecraft.creeper_head": "Creeper Head", - "block.minecraft.creeper_wall_head": "Creeper Wall Head", - "block.minecraft.crimson_button": "Crimson Button", - "block.minecraft.crimson_door": "Crimson Door", - "block.minecraft.crimson_fence": "Crimson Fence", - "block.minecraft.crimson_fence_gate": "Crimson Fence Gate", - "block.minecraft.crimson_fungus": "Crimson Fungus", - "block.minecraft.crimson_hanging_sign": "Crimson Hanging Sign", - "block.minecraft.crimson_hyphae": "Crimson Hyphae", - "block.minecraft.crimson_nylium": "Crimson Nylium", - "block.minecraft.crimson_planks": "Crimson Planks", - "block.minecraft.crimson_pressure_plate": "Crimson Pressure Plate", - "block.minecraft.crimson_roots": "Crimson Roots", - "block.minecraft.crimson_sign": "Crimson Sign", - "block.minecraft.crimson_slab": "Crimson Slab", - "block.minecraft.crimson_stairs": "Crimson Stairs", - "block.minecraft.crimson_stem": "Crimson Stem", - "block.minecraft.crimson_trapdoor": "Crimson Trapdoor", - "block.minecraft.crimson_wall_hanging_sign": "Crimson Wall Hanging Sign", - "block.minecraft.crimson_wall_sign": "Crimson Wall Sign", - "block.minecraft.crying_obsidian": "Crying Obsidian", - "block.minecraft.cut_copper": "Cut Copper", - "block.minecraft.cut_copper_slab": "Cut Copper Slab", - "block.minecraft.cut_copper_stairs": "Cut Copper Stairs", - "block.minecraft.cut_red_sandstone": "Cut Red Sandstone", - "block.minecraft.cut_red_sandstone_slab": "Cut Red Sandstone Slab", - "block.minecraft.cut_sandstone": "Cut Sandstone", - "block.minecraft.cut_sandstone_slab": "Cut Sandstone Slab", - "block.minecraft.cyan_banner": "Cyan Banner", - "block.minecraft.cyan_bed": "Cyan Bed", - "block.minecraft.cyan_candle": "Cyan Candle", - "block.minecraft.cyan_candle_cake": "Cake with Cyan Candle", - "block.minecraft.cyan_carpet": "Cyan Carpet", - "block.minecraft.cyan_concrete": "Cyan Concrete", - "block.minecraft.cyan_concrete_powder": "Cyan Concrete Powder", - "block.minecraft.cyan_glazed_terracotta": "Cyan Glazed Terracotta", - "block.minecraft.cyan_shulker_box": "Cyan Shulker Box", - "block.minecraft.cyan_stained_glass": "Cyan Stained Glass", - "block.minecraft.cyan_stained_glass_pane": "Cyan Stained Glass Pane", - "block.minecraft.cyan_terracotta": "Cyan Terracotta", - "block.minecraft.cyan_wool": "Cyan Wool", - "block.minecraft.damaged_anvil": "Damaged Anvil", - "block.minecraft.dandelion": "Dandelion", - "block.minecraft.dark_oak_button": "Dark Oak Button", - "block.minecraft.dark_oak_door": "Dark Oak Door", - "block.minecraft.dark_oak_fence": "Dark Oak Fence", - "block.minecraft.dark_oak_fence_gate": "Dark Oak Fence Gate", - "block.minecraft.dark_oak_hanging_sign": "Dark Oak Hanging Sign", - "block.minecraft.dark_oak_leaves": "Dark Oak Leaves", - "block.minecraft.dark_oak_log": "Dark Oak Log", - "block.minecraft.dark_oak_planks": "Dark Oak Planks", - "block.minecraft.dark_oak_pressure_plate": "Dark Oak Pressure Plate", - "block.minecraft.dark_oak_sapling": "Dark Oak Sapling", - "block.minecraft.dark_oak_sign": "Dark Oak Sign", - "block.minecraft.dark_oak_slab": "Dark Oak Slab", - "block.minecraft.dark_oak_stairs": "Dark Oak Stairs", - "block.minecraft.dark_oak_trapdoor": "Dark Oak Trapdoor", - "block.minecraft.dark_oak_wall_hanging_sign": "Dark Oak Wall Hanging Sign", - "block.minecraft.dark_oak_wall_sign": "Dark Oak Wall Sign", - "block.minecraft.dark_oak_wood": "Dark Oak Wood", - "block.minecraft.dark_prismarine": "Dark Prismarine", - "block.minecraft.dark_prismarine_slab": "Dark Prismarine Slab", - "block.minecraft.dark_prismarine_stairs": "Dark Prismarine Stairs", - "block.minecraft.daylight_detector": "Daylight Detector", - "block.minecraft.dead_brain_coral": "Dead Brain Coral", - "block.minecraft.dead_brain_coral_block": "Dead Brain Coral Block", - "block.minecraft.dead_brain_coral_fan": "Dead Brain Coral Fan", - "block.minecraft.dead_brain_coral_wall_fan": "Dead Brain Coral Wall Fan", - "block.minecraft.dead_bubble_coral": "Dead Bubble Coral", - "block.minecraft.dead_bubble_coral_block": "Dead Bubble Coral Block", - "block.minecraft.dead_bubble_coral_fan": "Dead Bubble Coral Fan", - "block.minecraft.dead_bubble_coral_wall_fan": "Dead Bubble Coral Wall Fan", - "block.minecraft.dead_bush": "Dead Bush", - "block.minecraft.dead_fire_coral": "Dead Fire Coral", - "block.minecraft.dead_fire_coral_block": "Dead Fire Coral Block", - "block.minecraft.dead_fire_coral_fan": "Dead Fire Coral Fan", - "block.minecraft.dead_fire_coral_wall_fan": "Dead Fire Coral Wall Fan", - "block.minecraft.dead_horn_coral": "Dead Horn Coral", - "block.minecraft.dead_horn_coral_block": "Dead Horn Coral Block", - "block.minecraft.dead_horn_coral_fan": "Dead Horn Coral Fan", - "block.minecraft.dead_horn_coral_wall_fan": "Dead Horn Coral Wall Fan", - "block.minecraft.dead_tube_coral": "Dead Tube Coral", - "block.minecraft.dead_tube_coral_block": "Dead Tube Coral Block", - "block.minecraft.dead_tube_coral_fan": "Dead Tube Coral Fan", - "block.minecraft.dead_tube_coral_wall_fan": "Dead Tube Coral Wall Fan", - "block.minecraft.decorated_pot": "Decorated Pot", - "block.minecraft.deepslate": "Deepslate", - "block.minecraft.deepslate_brick_slab": "Deepslate Brick Slab", - "block.minecraft.deepslate_brick_stairs": "Deepslate Brick Stairs", - "block.minecraft.deepslate_brick_wall": "Deepslate Brick Wall", - "block.minecraft.deepslate_bricks": "Deepslate Bricks", - "block.minecraft.deepslate_coal_ore": "Deepslate Coal Ore", - "block.minecraft.deepslate_copper_ore": "Deepslate Copper Ore", - "block.minecraft.deepslate_diamond_ore": "Deepslate Diamond Ore", - "block.minecraft.deepslate_emerald_ore": "Deepslate Emerald Ore", - "block.minecraft.deepslate_gold_ore": "Deepslate Gold Ore", - "block.minecraft.deepslate_iron_ore": "Deepslate Iron Ore", - "block.minecraft.deepslate_lapis_ore": "Deepslate Lapis Lazuli Ore", - "block.minecraft.deepslate_redstone_ore": "Deepslate Redstone Ore", - "block.minecraft.deepslate_tile_slab": "Deepslate Tile Slab", - "block.minecraft.deepslate_tile_stairs": "Deepslate Tile Stairs", - "block.minecraft.deepslate_tile_wall": "Deepslate Tile Wall", - "block.minecraft.deepslate_tiles": "Deepslate Tiles", - "block.minecraft.detector_rail": "Detector Rail", - "block.minecraft.diamond_block": "Block of Diamond", - "block.minecraft.diamond_ore": "Diamond Ore", - "block.minecraft.diorite": "Diorite", - "block.minecraft.diorite_slab": "Diorite Slab", - "block.minecraft.diorite_stairs": "Diorite Stairs", - "block.minecraft.diorite_wall": "Diorite Wall", - "block.minecraft.dirt": "Dirt", - "block.minecraft.dirt_path": "Dirt Path", - "block.minecraft.dispenser": "Dispenser", - "block.minecraft.dragon_egg": "Dragon Egg", - "block.minecraft.dragon_head": "Dragon Head", - "block.minecraft.dragon_wall_head": "Dragon Wall Head", - "block.minecraft.dried_kelp_block": "Dried Kelp Block", - "block.minecraft.dripstone_block": "Dripstone Block", - "block.minecraft.dropper": "Dropper", - "block.minecraft.emerald_block": "Block of Emerald", - "block.minecraft.emerald_ore": "Emerald Ore", - "block.minecraft.enchanting_table": "Enchanting Table", - "block.minecraft.end_gateway": "End Gateway", - "block.minecraft.end_portal": "End Portal", - "block.minecraft.end_portal_frame": "End Portal Frame", - "block.minecraft.end_rod": "End Rod", - "block.minecraft.end_stone": "End Stone", - "block.minecraft.end_stone_brick_slab": "End Stone Brick Slab", - "block.minecraft.end_stone_brick_stairs": "End Stone Brick Stairs", - "block.minecraft.end_stone_brick_wall": "End Stone Brick Wall", - "block.minecraft.end_stone_bricks": "End Stone Bricks", - "block.minecraft.ender_chest": "Ender Chest", - "block.minecraft.exposed_chiseled_copper": "Exposed Chiseled Copper", - "block.minecraft.exposed_copper": "Exposed Copper", - "block.minecraft.exposed_copper_bulb": "Exposed Copper Bulb", - "block.minecraft.exposed_copper_door": "Exposed Copper Door", - "block.minecraft.exposed_copper_grate": "Exposed Copper Grate", - "block.minecraft.exposed_copper_trapdoor": "Exposed Copper Trapdoor", - "block.minecraft.exposed_cut_copper": "Exposed Cut Copper", - "block.minecraft.exposed_cut_copper_slab": "Exposed Cut Copper Slab", - "block.minecraft.exposed_cut_copper_stairs": "Exposed Cut Copper Stairs", - "block.minecraft.farmland": "Farmland", - "block.minecraft.fern": "Fern", - "block.minecraft.fire": "Fire", - "block.minecraft.fire_coral": "Fire Coral", - "block.minecraft.fire_coral_block": "Fire Coral Block", - "block.minecraft.fire_coral_fan": "Fire Coral Fan", - "block.minecraft.fire_coral_wall_fan": "Fire Coral Wall Fan", - "block.minecraft.fletching_table": "Fletching Table", - "block.minecraft.flower_pot": "Flower Pot", - "block.minecraft.flowering_azalea": "Flowering Azalea", - "block.minecraft.flowering_azalea_leaves": "Flowering Azalea Leaves", - "block.minecraft.frogspawn": "Frogspawn", - "block.minecraft.frosted_ice": "Frosted Ice", - "block.minecraft.furnace": "Furnace", - "block.minecraft.gilded_blackstone": "Gilded Blackstone", - "block.minecraft.glass": "Glass", - "block.minecraft.glass_pane": "Glass Pane", - "block.minecraft.glow_lichen": "Glow Lichen", - "block.minecraft.glowstone": "Glowstone", - "block.minecraft.gold_block": "Block of Gold", - "block.minecraft.gold_ore": "Gold Ore", - "block.minecraft.granite": "Granite", - "block.minecraft.granite_slab": "Granite Slab", - "block.minecraft.granite_stairs": "Granite Stairs", - "block.minecraft.granite_wall": "Granite Wall", - "block.minecraft.grass": "Grass", - "block.minecraft.grass_block": "Grass Block", - "block.minecraft.gravel": "Gravel", - "block.minecraft.gray_banner": "Gray Banner", - "block.minecraft.gray_bed": "Gray Bed", - "block.minecraft.gray_candle": "Gray Candle", - "block.minecraft.gray_candle_cake": "Cake with Gray Candle", - "block.minecraft.gray_carpet": "Gray Carpet", - "block.minecraft.gray_concrete": "Gray Concrete", - "block.minecraft.gray_concrete_powder": "Gray Concrete Powder", - "block.minecraft.gray_glazed_terracotta": "Gray Glazed Terracotta", - "block.minecraft.gray_shulker_box": "Gray Shulker Box", - "block.minecraft.gray_stained_glass": "Gray Stained Glass", - "block.minecraft.gray_stained_glass_pane": "Gray Stained Glass Pane", - "block.minecraft.gray_terracotta": "Gray Terracotta", - "block.minecraft.gray_wool": "Gray Wool", - "block.minecraft.green_banner": "Green Banner", - "block.minecraft.green_bed": "Green Bed", - "block.minecraft.green_candle": "Green Candle", - "block.minecraft.green_candle_cake": "Cake with Green Candle", - "block.minecraft.green_carpet": "Green Carpet", - "block.minecraft.green_concrete": "Green Concrete", - "block.minecraft.green_concrete_powder": "Green Concrete Powder", - "block.minecraft.green_glazed_terracotta": "Green Glazed Terracotta", - "block.minecraft.green_shulker_box": "Green Shulker Box", - "block.minecraft.green_stained_glass": "Green Stained Glass", - "block.minecraft.green_stained_glass_pane": "Green Stained Glass Pane", - "block.minecraft.green_terracotta": "Green Terracotta", - "block.minecraft.green_wool": "Green Wool", - "block.minecraft.grindstone": "Grindstone", - "block.minecraft.hanging_roots": "Hanging Roots", - "block.minecraft.hay_block": "Hay Bale", - "block.minecraft.heavy_weighted_pressure_plate": "Heavy Weighted Pressure Plate", - "block.minecraft.honey_block": "Honey Block", - "block.minecraft.honeycomb_block": "Honeycomb Block", - "block.minecraft.hopper": "Hopper", - "block.minecraft.horn_coral": "Horn Coral", - "block.minecraft.horn_coral_block": "Horn Coral Block", - "block.minecraft.horn_coral_fan": "Horn Coral Fan", - "block.minecraft.horn_coral_wall_fan": "Horn Coral Wall Fan", - "block.minecraft.ice": "Ice", - "block.minecraft.infested_chiseled_stone_bricks": "Infested Chiseled Stone Bricks", - "block.minecraft.infested_cobblestone": "Infested Cobblestone", - "block.minecraft.infested_cracked_stone_bricks": "Infested Cracked Stone Bricks", - "block.minecraft.infested_deepslate": "Infested Deepslate", - "block.minecraft.infested_mossy_stone_bricks": "Infested Mossy Stone Bricks", - "block.minecraft.infested_stone": "Infested Stone", - "block.minecraft.infested_stone_bricks": "Infested Stone Bricks", - "block.minecraft.iron_bars": "Iron Bars", - "block.minecraft.iron_block": "Block of Iron", - "block.minecraft.iron_door": "Iron Door", - "block.minecraft.iron_ore": "Iron Ore", - "block.minecraft.iron_trapdoor": "Iron Trapdoor", - "block.minecraft.jack_o_lantern": "Jack o'Lantern", - "block.minecraft.jigsaw": "Jigsaw Block", - "block.minecraft.jukebox": "Jukebox", - "block.minecraft.jungle_button": "Jungle Button", - "block.minecraft.jungle_door": "Jungle Door", - "block.minecraft.jungle_fence": "Jungle Fence", - "block.minecraft.jungle_fence_gate": "Jungle Fence Gate", - "block.minecraft.jungle_hanging_sign": "Jungle Hanging Sign", - "block.minecraft.jungle_leaves": "Jungle Leaves", - "block.minecraft.jungle_log": "Jungle Log", - "block.minecraft.jungle_planks": "Jungle Planks", - "block.minecraft.jungle_pressure_plate": "Jungle Pressure Plate", - "block.minecraft.jungle_sapling": "Jungle Sapling", - "block.minecraft.jungle_sign": "Jungle Sign", - "block.minecraft.jungle_slab": "Jungle Slab", - "block.minecraft.jungle_stairs": "Jungle Stairs", - "block.minecraft.jungle_trapdoor": "Jungle Trapdoor", - "block.minecraft.jungle_wall_hanging_sign": "Jungle Wall Hanging Sign", - "block.minecraft.jungle_wall_sign": "Jungle Wall Sign", - "block.minecraft.jungle_wood": "Jungle Wood", - "block.minecraft.kelp": "Kelp", - "block.minecraft.kelp_plant": "Kelp Plant", - "block.minecraft.ladder": "Ladder", - "block.minecraft.lantern": "Lantern", - "block.minecraft.lapis_block": "Block of Lapis Lazuli", - "block.minecraft.lapis_ore": "Lapis Lazuli Ore", - "block.minecraft.large_amethyst_bud": "Large Amethyst Bud", - "block.minecraft.large_fern": "Large Fern", - "block.minecraft.lava": "Lava", - "block.minecraft.lava_cauldron": "Lava Cauldron", - "block.minecraft.lectern": "Lectern", - "block.minecraft.lever": "Lever", - "block.minecraft.light": "Light", - "block.minecraft.light_blue_banner": "Light Blue Banner", - "block.minecraft.light_blue_bed": "Light Blue Bed", - "block.minecraft.light_blue_candle": "Light Blue Candle", - "block.minecraft.light_blue_candle_cake": "Cake with Light Blue Candle", - "block.minecraft.light_blue_carpet": "Light Blue Carpet", - "block.minecraft.light_blue_concrete": "Light Blue Concrete", - "block.minecraft.light_blue_concrete_powder": "Light Blue Concrete Powder", - "block.minecraft.light_blue_glazed_terracotta": "Light Blue Glazed Terracotta", - "block.minecraft.light_blue_shulker_box": "Light Blue Shulker Box", - "block.minecraft.light_blue_stained_glass": "Light Blue Stained Glass", - "block.minecraft.light_blue_stained_glass_pane": "Light Blue Stained Glass Pane", - "block.minecraft.light_blue_terracotta": "Light Blue Terracotta", - "block.minecraft.light_blue_wool": "Light Blue Wool", - "block.minecraft.light_gray_banner": "Light Gray Banner", - "block.minecraft.light_gray_bed": "Light Gray Bed", - "block.minecraft.light_gray_candle": "Light Gray Candle", - "block.minecraft.light_gray_candle_cake": "Cake with Light Gray Candle", - "block.minecraft.light_gray_carpet": "Light Gray Carpet", - "block.minecraft.light_gray_concrete": "Light Gray Concrete", - "block.minecraft.light_gray_concrete_powder": "Light Gray Concrete Powder", - "block.minecraft.light_gray_glazed_terracotta": "Light Gray Glazed Terracotta", - "block.minecraft.light_gray_shulker_box": "Light Gray Shulker Box", - "block.minecraft.light_gray_stained_glass": "Light Gray Stained Glass", - "block.minecraft.light_gray_stained_glass_pane": "Light Gray Stained Glass Pane", - "block.minecraft.light_gray_terracotta": "Light Gray Terracotta", - "block.minecraft.light_gray_wool": "Light Gray Wool", - "block.minecraft.light_weighted_pressure_plate": "Light Weighted Pressure Plate", - "block.minecraft.lightning_rod": "Lightning Rod", - "block.minecraft.lilac": "Lilac", - "block.minecraft.lily_of_the_valley": "Lily of the Valley", - "block.minecraft.lily_pad": "Lily Pad", - "block.minecraft.lime_banner": "Lime Banner", - "block.minecraft.lime_bed": "Lime Bed", - "block.minecraft.lime_candle": "Lime Candle", - "block.minecraft.lime_candle_cake": "Cake with Lime Candle", - "block.minecraft.lime_carpet": "Lime Carpet", - "block.minecraft.lime_concrete": "Lime Concrete", - "block.minecraft.lime_concrete_powder": "Lime Concrete Powder", - "block.minecraft.lime_glazed_terracotta": "Lime Glazed Terracotta", - "block.minecraft.lime_shulker_box": "Lime Shulker Box", - "block.minecraft.lime_stained_glass": "Lime Stained Glass", - "block.minecraft.lime_stained_glass_pane": "Lime Stained Glass Pane", - "block.minecraft.lime_terracotta": "Lime Terracotta", - "block.minecraft.lime_wool": "Lime Wool", - "block.minecraft.lodestone": "Lodestone", - "block.minecraft.loom": "Loom", - "block.minecraft.magenta_banner": "Magenta Banner", - "block.minecraft.magenta_bed": "Magenta Bed", - "block.minecraft.magenta_candle": "Magenta Candle", - "block.minecraft.magenta_candle_cake": "Cake with Magenta Candle", - "block.minecraft.magenta_carpet": "Magenta Carpet", - "block.minecraft.magenta_concrete": "Magenta Concrete", - "block.minecraft.magenta_concrete_powder": "Magenta Concrete Powder", - "block.minecraft.magenta_glazed_terracotta": "Magenta Glazed Terracotta", - "block.minecraft.magenta_shulker_box": "Magenta Shulker Box", - "block.minecraft.magenta_stained_glass": "Magenta Stained Glass", - "block.minecraft.magenta_stained_glass_pane": "Magenta Stained Glass Pane", - "block.minecraft.magenta_terracotta": "Magenta Terracotta", - "block.minecraft.magenta_wool": "Magenta Wool", - "block.minecraft.magma_block": "Magma Block", - "block.minecraft.mangrove_button": "Mangrove Button", - "block.minecraft.mangrove_door": "Mangrove Door", - "block.minecraft.mangrove_fence": "Mangrove Fence", - "block.minecraft.mangrove_fence_gate": "Mangrove Fence Gate", - "block.minecraft.mangrove_hanging_sign": "Mangrove Hanging Sign", - "block.minecraft.mangrove_leaves": "Mangrove Leaves", - "block.minecraft.mangrove_log": "Mangrove Log", - "block.minecraft.mangrove_planks": "Mangrove Planks", - "block.minecraft.mangrove_pressure_plate": "Mangrove Pressure Plate", - "block.minecraft.mangrove_propagule": "Mangrove Propagule", - "block.minecraft.mangrove_roots": "Mangrove Roots", - "block.minecraft.mangrove_sign": "Mangrove Sign", - "block.minecraft.mangrove_slab": "Mangrove Slab", - "block.minecraft.mangrove_stairs": "Mangrove Stairs", - "block.minecraft.mangrove_trapdoor": "Mangrove Trapdoor", - "block.minecraft.mangrove_wall_hanging_sign": "Mangrove Wall Hanging Sign", - "block.minecraft.mangrove_wall_sign": "Mangrove Wall Sign", - "block.minecraft.mangrove_wood": "Mangrove Wood", - "block.minecraft.medium_amethyst_bud": "Medium Amethyst Bud", - "block.minecraft.melon": "Melon", - "block.minecraft.melon_stem": "Melon Stem", - "block.minecraft.moss_block": "Moss Block", - "block.minecraft.moss_carpet": "Moss Carpet", - "block.minecraft.mossy_cobblestone": "Mossy Cobblestone", - "block.minecraft.mossy_cobblestone_slab": "Mossy Cobblestone Slab", - "block.minecraft.mossy_cobblestone_stairs": "Mossy Cobblestone Stairs", - "block.minecraft.mossy_cobblestone_wall": "Mossy Cobblestone Wall", - "block.minecraft.mossy_stone_brick_slab": "Mossy Stone Brick Slab", - "block.minecraft.mossy_stone_brick_stairs": "Mossy Stone Brick Stairs", - "block.minecraft.mossy_stone_brick_wall": "Mossy Stone Brick Wall", - "block.minecraft.mossy_stone_bricks": "Mossy Stone Bricks", - "block.minecraft.moving_piston": "Moving Piston", - "block.minecraft.mud": "Mud", - "block.minecraft.mud_brick_slab": "Mud Brick Slab", - "block.minecraft.mud_brick_stairs": "Mud Brick Stairs", - "block.minecraft.mud_brick_wall": "Mud Brick Wall", - "block.minecraft.mud_bricks": "Mud Bricks", - "block.minecraft.muddy_mangrove_roots": "Muddy Mangrove Roots", - "block.minecraft.mushroom_stem": "Mushroom Stem", - "block.minecraft.mycelium": "Mycelium", - "block.minecraft.nether_brick_fence": "Nether Brick Fence", - "block.minecraft.nether_brick_slab": "Nether Brick Slab", - "block.minecraft.nether_brick_stairs": "Nether Brick Stairs", - "block.minecraft.nether_brick_wall": "Nether Brick Wall", - "block.minecraft.nether_bricks": "Nether Bricks", - "block.minecraft.nether_gold_ore": "Nether Gold Ore", - "block.minecraft.nether_portal": "Nether Portal", - "block.minecraft.nether_quartz_ore": "Nether Quartz Ore", - "block.minecraft.nether_sprouts": "Nether Sprouts", - "block.minecraft.nether_wart": "Nether Wart", - "block.minecraft.nether_wart_block": "Nether Wart Block", - "block.minecraft.netherite_block": "Block of Netherite", - "block.minecraft.netherrack": "Netherrack", - "block.minecraft.note_block": "Note Block", - "block.minecraft.oak_button": "Oak Button", - "block.minecraft.oak_door": "Oak Door", - "block.minecraft.oak_fence": "Oak Fence", - "block.minecraft.oak_fence_gate": "Oak Fence Gate", - "block.minecraft.oak_hanging_sign": "Oak Hanging Sign", - "block.minecraft.oak_leaves": "Oak Leaves", - "block.minecraft.oak_log": "Oak Log", - "block.minecraft.oak_planks": "Oak Planks", - "block.minecraft.oak_pressure_plate": "Oak Pressure Plate", - "block.minecraft.oak_sapling": "Oak Sapling", - "block.minecraft.oak_sign": "Oak Sign", - "block.minecraft.oak_slab": "Oak Slab", - "block.minecraft.oak_stairs": "Oak Stairs", - "block.minecraft.oak_trapdoor": "Oak Trapdoor", - "block.minecraft.oak_wall_hanging_sign": "Oak Wall Hanging Sign", - "block.minecraft.oak_wall_sign": "Oak Wall Sign", - "block.minecraft.oak_wood": "Oak Wood", - "block.minecraft.observer": "Observer", - "block.minecraft.obsidian": "Obsidian", - "block.minecraft.ochre_froglight": "Ochre Froglight", - "block.minecraft.ominous_banner": "Ominous Banner", - "block.minecraft.orange_banner": "Orange Banner", - "block.minecraft.orange_bed": "Orange Bed", - "block.minecraft.orange_candle": "Orange Candle", - "block.minecraft.orange_candle_cake": "Cake with Orange Candle", - "block.minecraft.orange_carpet": "Orange Carpet", - "block.minecraft.orange_concrete": "Orange Concrete", - "block.minecraft.orange_concrete_powder": "Orange Concrete Powder", - "block.minecraft.orange_glazed_terracotta": "Orange Glazed Terracotta", - "block.minecraft.orange_shulker_box": "Orange Shulker Box", - "block.minecraft.orange_stained_glass": "Orange Stained Glass", - "block.minecraft.orange_stained_glass_pane": "Orange Stained Glass Pane", - "block.minecraft.orange_terracotta": "Orange Terracotta", - "block.minecraft.orange_tulip": "Orange Tulip", - "block.minecraft.orange_wool": "Orange Wool", - "block.minecraft.oxeye_daisy": "Oxeye Daisy", - "block.minecraft.oxidized_chiseled_copper": "Oxidized Chiseled Copper", - "block.minecraft.oxidized_copper": "Oxidized Copper", - "block.minecraft.oxidized_copper_bulb": "Oxidized Copper Bulb", - "block.minecraft.oxidized_copper_door": "Oxidized Copper Door", - "block.minecraft.oxidized_copper_grate": "Oxidized Copper Grate", - "block.minecraft.oxidized_copper_trapdoor": "Oxidized Copper Trapdoor", - "block.minecraft.oxidized_cut_copper": "Oxidized Cut Copper", - "block.minecraft.oxidized_cut_copper_slab": "Oxidized Cut Copper Slab", - "block.minecraft.oxidized_cut_copper_stairs": "Oxidized Cut Copper Stairs", - "block.minecraft.packed_ice": "Packed Ice", - "block.minecraft.packed_mud": "Packed Mud", - "block.minecraft.pearlescent_froglight": "Pearlescent Froglight", - "block.minecraft.peony": "Peony", - "block.minecraft.petrified_oak_slab": "Petrified Oak Slab", - "block.minecraft.piglin_head": "Piglin Head", - "block.minecraft.piglin_wall_head": "Piglin Wall Head", - "block.minecraft.pink_banner": "Pink Banner", - "block.minecraft.pink_bed": "Pink Bed", - "block.minecraft.pink_candle": "Pink Candle", - "block.minecraft.pink_candle_cake": "Cake with Pink Candle", - "block.minecraft.pink_carpet": "Pink Carpet", - "block.minecraft.pink_concrete": "Pink Concrete", - "block.minecraft.pink_concrete_powder": "Pink Concrete Powder", - "block.minecraft.pink_glazed_terracotta": "Pink Glazed Terracotta", - "block.minecraft.pink_petals": "Pink Petals", - "block.minecraft.pink_shulker_box": "Pink Shulker Box", - "block.minecraft.pink_stained_glass": "Pink Stained Glass", - "block.minecraft.pink_stained_glass_pane": "Pink Stained Glass Pane", - "block.minecraft.pink_terracotta": "Pink Terracotta", - "block.minecraft.pink_tulip": "Pink Tulip", - "block.minecraft.pink_wool": "Pink Wool", - "block.minecraft.piston": "Piston", - "block.minecraft.piston_head": "Piston Head", - "block.minecraft.pitcher_crop": "Pitcher Crop", - "block.minecraft.pitcher_plant": "Pitcher Plant", - "block.minecraft.player_head": "Player Head", - "block.minecraft.player_head.named": "%s's Head", - "block.minecraft.player_wall_head": "Player Wall Head", - "block.minecraft.podzol": "Podzol", - "block.minecraft.pointed_dripstone": "Pointed Dripstone", - "block.minecraft.polished_andesite": "Polished Andesite", - "block.minecraft.polished_andesite_slab": "Polished Andesite Slab", - "block.minecraft.polished_andesite_stairs": "Polished Andesite Stairs", - "block.minecraft.polished_basalt": "Polished Basalt", - "block.minecraft.polished_blackstone": "Polished Blackstone", - "block.minecraft.polished_blackstone_brick_slab": "Polished Blackstone Brick Slab", - "block.minecraft.polished_blackstone_brick_stairs": "Polished Blackstone Brick Stairs", - "block.minecraft.polished_blackstone_brick_wall": "Polished Blackstone Brick Wall", - "block.minecraft.polished_blackstone_bricks": "Polished Blackstone Bricks", - "block.minecraft.polished_blackstone_button": "Polished Blackstone Button", - "block.minecraft.polished_blackstone_pressure_plate": "Polished Blackstone Pressure Plate", - "block.minecraft.polished_blackstone_slab": "Polished Blackstone Slab", - "block.minecraft.polished_blackstone_stairs": "Polished Blackstone Stairs", - "block.minecraft.polished_blackstone_wall": "Polished Blackstone Wall", - "block.minecraft.polished_deepslate": "Polished Deepslate", - "block.minecraft.polished_deepslate_slab": "Polished Deepslate Slab", - "block.minecraft.polished_deepslate_stairs": "Polished Deepslate Stairs", - "block.minecraft.polished_deepslate_wall": "Polished Deepslate Wall", - "block.minecraft.polished_diorite": "Polished Diorite", - "block.minecraft.polished_diorite_slab": "Polished Diorite Slab", - "block.minecraft.polished_diorite_stairs": "Polished Diorite Stairs", - "block.minecraft.polished_granite": "Polished Granite", - "block.minecraft.polished_granite_slab": "Polished Granite Slab", - "block.minecraft.polished_granite_stairs": "Polished Granite Stairs", - "block.minecraft.polished_tuff": "Polished Tuff", - "block.minecraft.polished_tuff_slab": "Polished Tuff Slab", - "block.minecraft.polished_tuff_stairs": "Polished Tuff Stairs", - "block.minecraft.polished_tuff_wall": "Polished Tuff Wall", - "block.minecraft.poppy": "Poppy", - "block.minecraft.potatoes": "Potatoes", - "block.minecraft.potted_acacia_sapling": "Potted Acacia Sapling", - "block.minecraft.potted_allium": "Potted Allium", - "block.minecraft.potted_azalea_bush": "Potted Azalea", - "block.minecraft.potted_azure_bluet": "Potted Azure Bluet", - "block.minecraft.potted_bamboo": "Potted Bamboo", - "block.minecraft.potted_birch_sapling": "Potted Birch Sapling", - "block.minecraft.potted_blue_orchid": "Potted Blue Orchid", - "block.minecraft.potted_brown_mushroom": "Potted Brown Mushroom", - "block.minecraft.potted_cactus": "Potted Cactus", - "block.minecraft.potted_cherry_sapling": "Potted Cherry Sapling", - "block.minecraft.potted_cornflower": "Potted Cornflower", - "block.minecraft.potted_crimson_fungus": "Potted Crimson Fungus", - "block.minecraft.potted_crimson_roots": "Potted Crimson Roots", - "block.minecraft.potted_dandelion": "Potted Dandelion", - "block.minecraft.potted_dark_oak_sapling": "Potted Dark Oak Sapling", - "block.minecraft.potted_dead_bush": "Potted Dead Bush", - "block.minecraft.potted_fern": "Potted Fern", - "block.minecraft.potted_flowering_azalea_bush": "Potted Flowering Azalea", - "block.minecraft.potted_jungle_sapling": "Potted Jungle Sapling", - "block.minecraft.potted_lily_of_the_valley": "Potted Lily of the Valley", - "block.minecraft.potted_mangrove_propagule": "Potted Mangrove Propagule", - "block.minecraft.potted_oak_sapling": "Potted Oak Sapling", - "block.minecraft.potted_orange_tulip": "Potted Orange Tulip", - "block.minecraft.potted_oxeye_daisy": "Potted Oxeye Daisy", - "block.minecraft.potted_pink_tulip": "Potted Pink Tulip", - "block.minecraft.potted_poppy": "Potted Poppy", - "block.minecraft.potted_red_mushroom": "Potted Red Mushroom", - "block.minecraft.potted_red_tulip": "Potted Red Tulip", - "block.minecraft.potted_spruce_sapling": "Potted Spruce Sapling", - "block.minecraft.potted_torchflower": "Potted Torchflower", - "block.minecraft.potted_warped_fungus": "Potted Warped Fungus", - "block.minecraft.potted_warped_roots": "Potted Warped Roots", - "block.minecraft.potted_white_tulip": "Potted White Tulip", - "block.minecraft.potted_wither_rose": "Potted Wither Rose", - "block.minecraft.powder_snow": "Powder Snow", - "block.minecraft.powder_snow_cauldron": "Powder Snow Cauldron", - "block.minecraft.powered_rail": "Powered Rail", - "block.minecraft.prismarine": "Prismarine", - "block.minecraft.prismarine_brick_slab": "Prismarine Brick Slab", - "block.minecraft.prismarine_brick_stairs": "Prismarine Brick Stairs", - "block.minecraft.prismarine_bricks": "Prismarine Bricks", - "block.minecraft.prismarine_slab": "Prismarine Slab", - "block.minecraft.prismarine_stairs": "Prismarine Stairs", - "block.minecraft.prismarine_wall": "Prismarine Wall", - "block.minecraft.pumpkin": "Pumpkin", - "block.minecraft.pumpkin_stem": "Pumpkin Stem", - "block.minecraft.purple_banner": "Purple Banner", - "block.minecraft.purple_bed": "Purple Bed", - "block.minecraft.purple_candle": "Purple Candle", - "block.minecraft.purple_candle_cake": "Cake with Purple Candle", - "block.minecraft.purple_carpet": "Purple Carpet", - "block.minecraft.purple_concrete": "Purple Concrete", - "block.minecraft.purple_concrete_powder": "Purple Concrete Powder", - "block.minecraft.purple_glazed_terracotta": "Purple Glazed Terracotta", - "block.minecraft.purple_shulker_box": "Purple Shulker Box", - "block.minecraft.purple_stained_glass": "Purple Stained Glass", - "block.minecraft.purple_stained_glass_pane": "Purple Stained Glass Pane", - "block.minecraft.purple_terracotta": "Purple Terracotta", - "block.minecraft.purple_wool": "Purple Wool", - "block.minecraft.purpur_block": "Purpur Block", - "block.minecraft.purpur_pillar": "Purpur Pillar", - "block.minecraft.purpur_slab": "Purpur Slab", - "block.minecraft.purpur_stairs": "Purpur Stairs", - "block.minecraft.quartz_block": "Block of Quartz", - "block.minecraft.quartz_bricks": "Quartz Bricks", - "block.minecraft.quartz_pillar": "Quartz Pillar", - "block.minecraft.quartz_slab": "Quartz Slab", - "block.minecraft.quartz_stairs": "Quartz Stairs", - "block.minecraft.rail": "Rail", - "block.minecraft.raw_copper_block": "Block of Raw Copper", - "block.minecraft.raw_gold_block": "Block of Raw Gold", - "block.minecraft.raw_iron_block": "Block of Raw Iron", - "block.minecraft.red_banner": "Red Banner", - "block.minecraft.red_bed": "Red Bed", - "block.minecraft.red_candle": "Red Candle", - "block.minecraft.red_candle_cake": "Cake with Red Candle", - "block.minecraft.red_carpet": "Red Carpet", - "block.minecraft.red_concrete": "Red Concrete", - "block.minecraft.red_concrete_powder": "Red Concrete Powder", - "block.minecraft.red_glazed_terracotta": "Red Glazed Terracotta", - "block.minecraft.red_mushroom": "Red Mushroom", - "block.minecraft.red_mushroom_block": "Red Mushroom Block", - "block.minecraft.red_nether_brick_slab": "Red Nether Brick Slab", - "block.minecraft.red_nether_brick_stairs": "Red Nether Brick Stairs", - "block.minecraft.red_nether_brick_wall": "Red Nether Brick Wall", - "block.minecraft.red_nether_bricks": "Red Nether Bricks", - "block.minecraft.red_sand": "Red Sand", - "block.minecraft.red_sandstone": "Red Sandstone", - "block.minecraft.red_sandstone_slab": "Red Sandstone Slab", - "block.minecraft.red_sandstone_stairs": "Red Sandstone Stairs", - "block.minecraft.red_sandstone_wall": "Red Sandstone Wall", - "block.minecraft.red_shulker_box": "Red Shulker Box", - "block.minecraft.red_stained_glass": "Red Stained Glass", - "block.minecraft.red_stained_glass_pane": "Red Stained Glass Pane", - "block.minecraft.red_terracotta": "Red Terracotta", - "block.minecraft.red_tulip": "Red Tulip", - "block.minecraft.red_wool": "Red Wool", - "block.minecraft.redstone_block": "Block of Redstone", - "block.minecraft.redstone_lamp": "Redstone Lamp", - "block.minecraft.redstone_ore": "Redstone Ore", - "block.minecraft.redstone_torch": "Redstone Torch", - "block.minecraft.redstone_wall_torch": "Redstone Wall Torch", - "block.minecraft.redstone_wire": "Redstone Wire", - "block.minecraft.reinforced_deepslate": "Reinforced Deepslate", - "block.minecraft.repeater": "Redstone Repeater", - "block.minecraft.repeating_command_block": "Repeating Command Block", - "block.minecraft.respawn_anchor": "Respawn Anchor", - "block.minecraft.rooted_dirt": "Rooted Dirt", - "block.minecraft.rose_bush": "Rose Bush", - "block.minecraft.sand": "Sand", - "block.minecraft.sandstone": "Sandstone", - "block.minecraft.sandstone_slab": "Sandstone Slab", - "block.minecraft.sandstone_stairs": "Sandstone Stairs", - "block.minecraft.sandstone_wall": "Sandstone Wall", - "block.minecraft.scaffolding": "Scaffolding", - "block.minecraft.sculk": "Sculk", - "block.minecraft.sculk_catalyst": "Sculk Catalyst", - "block.minecraft.sculk_sensor": "Sculk Sensor", - "block.minecraft.sculk_shrieker": "Sculk Shrieker", - "block.minecraft.sculk_vein": "Sculk Vein", - "block.minecraft.sea_lantern": "Sea Lantern", - "block.minecraft.sea_pickle": "Sea Pickle", - "block.minecraft.seagrass": "Seagrass", - "block.minecraft.set_spawn": "Respawn point set", - "block.minecraft.short_grass": "Short Grass", - "block.minecraft.shroomlight": "Shroomlight", - "block.minecraft.shulker_box": "Shulker Box", - "block.minecraft.skeleton_skull": "Skeleton Skull", - "block.minecraft.skeleton_wall_skull": "Skeleton Wall Skull", - "block.minecraft.slime_block": "Slime Block", - "block.minecraft.small_amethyst_bud": "Small Amethyst Bud", - "block.minecraft.small_dripleaf": "Small Dripleaf", - "block.minecraft.smithing_table": "Smithing Table", - "block.minecraft.smoker": "Smoker", - "block.minecraft.smooth_basalt": "Smooth Basalt", - "block.minecraft.smooth_quartz": "Smooth Quartz Block", - "block.minecraft.smooth_quartz_slab": "Smooth Quartz Slab", - "block.minecraft.smooth_quartz_stairs": "Smooth Quartz Stairs", - "block.minecraft.smooth_red_sandstone": "Smooth Red Sandstone", - "block.minecraft.smooth_red_sandstone_slab": "Smooth Red Sandstone Slab", - "block.minecraft.smooth_red_sandstone_stairs": "Smooth Red Sandstone Stairs", - "block.minecraft.smooth_sandstone": "Smooth Sandstone", - "block.minecraft.smooth_sandstone_slab": "Smooth Sandstone Slab", - "block.minecraft.smooth_sandstone_stairs": "Smooth Sandstone Stairs", - "block.minecraft.smooth_stone": "Smooth Stone", - "block.minecraft.smooth_stone_slab": "Smooth Stone Slab", - "block.minecraft.sniffer_egg": "Sniffer Egg", - "block.minecraft.snow": "Snow", - "block.minecraft.snow_block": "Snow Block", - "block.minecraft.soul_campfire": "Soul Campfire", - "block.minecraft.soul_fire": "Soul Fire", - "block.minecraft.soul_lantern": "Soul Lantern", - "block.minecraft.soul_sand": "Soul Sand", - "block.minecraft.soul_soil": "Soul Soil", - "block.minecraft.soul_torch": "Soul Torch", - "block.minecraft.soul_wall_torch": "Soul Wall Torch", - "block.minecraft.spawn.not_valid": "You have no home bed or charged respawn anchor, or it was obstructed", - "block.minecraft.spawner": "Monster Spawner", - "block.minecraft.spawner.desc1": "Interact with Spawn Egg:", - "block.minecraft.spawner.desc2": "Sets Mob Type", - "block.minecraft.sponge": "Sponge", - "block.minecraft.spore_blossom": "Spore Blossom", - "block.minecraft.spruce_button": "Spruce Button", - "block.minecraft.spruce_door": "Spruce Door", - "block.minecraft.spruce_fence": "Spruce Fence", - "block.minecraft.spruce_fence_gate": "Spruce Fence Gate", - "block.minecraft.spruce_hanging_sign": "Spruce Hanging Sign", - "block.minecraft.spruce_leaves": "Spruce Leaves", - "block.minecraft.spruce_log": "Spruce Log", - "block.minecraft.spruce_planks": "Spruce Planks", - "block.minecraft.spruce_pressure_plate": "Spruce Pressure Plate", - "block.minecraft.spruce_sapling": "Spruce Sapling", - "block.minecraft.spruce_sign": "Spruce Sign", - "block.minecraft.spruce_slab": "Spruce Slab", - "block.minecraft.spruce_stairs": "Spruce Stairs", - "block.minecraft.spruce_trapdoor": "Spruce Trapdoor", - "block.minecraft.spruce_wall_hanging_sign": "Spruce Wall Hanging Sign", - "block.minecraft.spruce_wall_sign": "Spruce Wall Sign", - "block.minecraft.spruce_wood": "Spruce Wood", - "block.minecraft.sticky_piston": "Sticky Piston", - "block.minecraft.stone": "Stone", - "block.minecraft.stone_brick_slab": "Stone Brick Slab", - "block.minecraft.stone_brick_stairs": "Stone Brick Stairs", - "block.minecraft.stone_brick_wall": "Stone Brick Wall", - "block.minecraft.stone_bricks": "Stone Bricks", - "block.minecraft.stone_button": "Stone Button", - "block.minecraft.stone_pressure_plate": "Stone Pressure Plate", - "block.minecraft.stone_slab": "Stone Slab", - "block.minecraft.stone_stairs": "Stone Stairs", - "block.minecraft.stonecutter": "Stonecutter", - "block.minecraft.stripped_acacia_log": "Stripped Acacia Log", - "block.minecraft.stripped_acacia_wood": "Stripped Acacia Wood", - "block.minecraft.stripped_bamboo_block": "Block of Stripped Bamboo", - "block.minecraft.stripped_birch_log": "Stripped Birch Log", - "block.minecraft.stripped_birch_wood": "Stripped Birch Wood", - "block.minecraft.stripped_cherry_log": "Stripped Cherry Log", - "block.minecraft.stripped_cherry_wood": "Stripped Cherry Wood", - "block.minecraft.stripped_crimson_hyphae": "Stripped Crimson Hyphae", - "block.minecraft.stripped_crimson_stem": "Stripped Crimson Stem", - "block.minecraft.stripped_dark_oak_log": "Stripped Dark Oak Log", - "block.minecraft.stripped_dark_oak_wood": "Stripped Dark Oak Wood", - "block.minecraft.stripped_jungle_log": "Stripped Jungle Log", - "block.minecraft.stripped_jungle_wood": "Stripped Jungle Wood", - "block.minecraft.stripped_mangrove_log": "Stripped Mangrove Log", - "block.minecraft.stripped_mangrove_wood": "Stripped Mangrove Wood", - "block.minecraft.stripped_oak_log": "Stripped Oak Log", - "block.minecraft.stripped_oak_wood": "Stripped Oak Wood", - "block.minecraft.stripped_spruce_log": "Stripped Spruce Log", - "block.minecraft.stripped_spruce_wood": "Stripped Spruce Wood", - "block.minecraft.stripped_warped_hyphae": "Stripped Warped Hyphae", - "block.minecraft.stripped_warped_stem": "Stripped Warped Stem", - "block.minecraft.structure_block": "Structure Block", - "block.minecraft.structure_void": "Structure Void", - "block.minecraft.sugar_cane": "Sugar Cane", - "block.minecraft.sunflower": "Sunflower", - "block.minecraft.suspicious_gravel": "Suspicious Gravel", - "block.minecraft.suspicious_sand": "Suspicious Sand", - "block.minecraft.sweet_berry_bush": "Sweet Berry Bush", - "block.minecraft.tall_grass": "Tall Grass", - "block.minecraft.tall_seagrass": "Tall Seagrass", - "block.minecraft.target": "Target", - "block.minecraft.terracotta": "Terracotta", - "block.minecraft.tinted_glass": "Tinted Glass", - "block.minecraft.tnt": "TNT", - "block.minecraft.torch": "Torch", - "block.minecraft.torchflower": "Torchflower", - "block.minecraft.torchflower_crop": "Torchflower Crop", - "block.minecraft.trapped_chest": "Trapped Chest", - "block.minecraft.trial_spawner": "Trial Spawner", - "block.minecraft.tripwire": "Tripwire", - "block.minecraft.tripwire_hook": "Tripwire Hook", - "block.minecraft.tube_coral": "Tube Coral", - "block.minecraft.tube_coral_block": "Tube Coral Block", - "block.minecraft.tube_coral_fan": "Tube Coral Fan", - "block.minecraft.tube_coral_wall_fan": "Tube Coral Wall Fan", - "block.minecraft.tuff": "Tuff", - "block.minecraft.tuff_brick_slab": "Tuff Brick Slab", - "block.minecraft.tuff_brick_stairs": "Tuff Brick Stairs", - "block.minecraft.tuff_brick_wall": "Tuff Brick Wall", - "block.minecraft.tuff_bricks": "Tuff Bricks", - "block.minecraft.tuff_slab": "Tuff Slab", - "block.minecraft.tuff_stairs": "Tuff Stairs", - "block.minecraft.tuff_wall": "Tuff Wall", - "block.minecraft.turtle_egg": "Turtle Egg", - "block.minecraft.twisting_vines": "Twisting Vines", - "block.minecraft.twisting_vines_plant": "Twisting Vines Plant", - "block.minecraft.verdant_froglight": "Verdant Froglight", - "block.minecraft.vine": "Vines", - "block.minecraft.void_air": "Void Air", - "block.minecraft.wall_torch": "Wall Torch", - "block.minecraft.warped_button": "Warped Button", - "block.minecraft.warped_door": "Warped Door", - "block.minecraft.warped_fence": "Warped Fence", - "block.minecraft.warped_fence_gate": "Warped Fence Gate", - "block.minecraft.warped_fungus": "Warped Fungus", - "block.minecraft.warped_hanging_sign": "Warped Hanging Sign", - "block.minecraft.warped_hyphae": "Warped Hyphae", - "block.minecraft.warped_nylium": "Warped Nylium", - "block.minecraft.warped_planks": "Warped Planks", - "block.minecraft.warped_pressure_plate": "Warped Pressure Plate", - "block.minecraft.warped_roots": "Warped Roots", - "block.minecraft.warped_sign": "Warped Sign", - "block.minecraft.warped_slab": "Warped Slab", - "block.minecraft.warped_stairs": "Warped Stairs", - "block.minecraft.warped_stem": "Warped Stem", - "block.minecraft.warped_trapdoor": "Warped Trapdoor", - "block.minecraft.warped_wall_hanging_sign": "Warped Wall Hanging Sign", - "block.minecraft.warped_wall_sign": "Warped Wall Sign", - "block.minecraft.warped_wart_block": "Warped Wart Block", - "block.minecraft.water": "Water", - "block.minecraft.water_cauldron": "Water Cauldron", - "block.minecraft.waxed_chiseled_copper": "Waxed Chiseled Copper", - "block.minecraft.waxed_copper_block": "Waxed Block of Copper", - "block.minecraft.waxed_copper_bulb": "Waxed Copper Bulb", - "block.minecraft.waxed_copper_door": "Waxed Copper Door", - "block.minecraft.waxed_copper_grate": "Waxed Copper Grate", - "block.minecraft.waxed_copper_trapdoor": "Waxed Copper Trapdoor", - "block.minecraft.waxed_cut_copper": "Waxed Cut Copper", - "block.minecraft.waxed_cut_copper_slab": "Waxed Cut Copper Slab", - "block.minecraft.waxed_cut_copper_stairs": "Waxed Cut Copper Stairs", - "block.minecraft.waxed_exposed_chiseled_copper": "Waxed Exposed Chiseled Copper", - "block.minecraft.waxed_exposed_copper": "Waxed Exposed Copper", - "block.minecraft.waxed_exposed_copper_bulb": "Waxed Exposed Copper Bulb", - "block.minecraft.waxed_exposed_copper_door": "Waxed Exposed Copper Door", - "block.minecraft.waxed_exposed_copper_grate": "Waxed Exposed Copper Grate", - "block.minecraft.waxed_exposed_copper_trapdoor": "Waxed Exposed Copper Trapdoor", - "block.minecraft.waxed_exposed_cut_copper": "Waxed Exposed Cut Copper", - "block.minecraft.waxed_exposed_cut_copper_slab": "Waxed Exposed Cut Copper Slab", - "block.minecraft.waxed_exposed_cut_copper_stairs": "Waxed Exposed Cut Copper Stairs", - "block.minecraft.waxed_oxidized_chiseled_copper": "Waxed Oxidized Chiseled Copper", - "block.minecraft.waxed_oxidized_copper": "Waxed Oxidized Copper", - "block.minecraft.waxed_oxidized_copper_bulb": "Waxed Oxidized Copper Bulb", - "block.minecraft.waxed_oxidized_copper_door": "Waxed Oxidized Copper Door", - "block.minecraft.waxed_oxidized_copper_grate": "Waxed Oxidized Copper Grate", - "block.minecraft.waxed_oxidized_copper_trapdoor": "Waxed Oxidized Copper Trapdoor", - "block.minecraft.waxed_oxidized_cut_copper": "Waxed Oxidized Cut Copper", - "block.minecraft.waxed_oxidized_cut_copper_slab": "Waxed Oxidized Cut Copper Slab", - "block.minecraft.waxed_oxidized_cut_copper_stairs": "Waxed Oxidized Cut Copper Stairs", - "block.minecraft.waxed_weathered_chiseled_copper": "Waxed Weathered Chiseled Copper", - "block.minecraft.waxed_weathered_copper": "Waxed Weathered Copper", - "block.minecraft.waxed_weathered_copper_bulb": "Waxed Weathered Copper Bulb", - "block.minecraft.waxed_weathered_copper_door": "Waxed Weathered Copper Door", - "block.minecraft.waxed_weathered_copper_grate": "Waxed Weathered Copper Grate", - "block.minecraft.waxed_weathered_copper_trapdoor": "Waxed Weathered Copper Trapdoor", - "block.minecraft.waxed_weathered_cut_copper": "Waxed Weathered Cut Copper", - "block.minecraft.waxed_weathered_cut_copper_slab": "Waxed Weathered Cut Copper Slab", - "block.minecraft.waxed_weathered_cut_copper_stairs": "Waxed Weathered Cut Copper Stairs", - "block.minecraft.weathered_chiseled_copper": "Weathered Chiseled Copper", - "block.minecraft.weathered_copper": "Weathered Copper", - "block.minecraft.weathered_copper_bulb": "Weathered Copper Bulb", - "block.minecraft.weathered_copper_door": "Weathered Copper Door", - "block.minecraft.weathered_copper_grate": "Weathered Copper Grate", - "block.minecraft.weathered_copper_trapdoor": "Weathered Copper Trapdoor", - "block.minecraft.weathered_cut_copper": "Weathered Cut Copper", - "block.minecraft.weathered_cut_copper_slab": "Weathered Cut Copper Slab", - "block.minecraft.weathered_cut_copper_stairs": "Weathered Cut Copper Stairs", - "block.minecraft.weeping_vines": "Weeping Vines", - "block.minecraft.weeping_vines_plant": "Weeping Vines Plant", - "block.minecraft.wet_sponge": "Wet Sponge", - "block.minecraft.wheat": "Wheat Crops", - "block.minecraft.white_banner": "White Banner", - "block.minecraft.white_bed": "White Bed", - "block.minecraft.white_candle": "White Candle", - "block.minecraft.white_candle_cake": "Cake with White Candle", - "block.minecraft.white_carpet": "White Carpet", - "block.minecraft.white_concrete": "White Concrete", - "block.minecraft.white_concrete_powder": "White Concrete Powder", - "block.minecraft.white_glazed_terracotta": "White Glazed Terracotta", - "block.minecraft.white_shulker_box": "White Shulker Box", - "block.minecraft.white_stained_glass": "White Stained Glass", - "block.minecraft.white_stained_glass_pane": "White Stained Glass Pane", - "block.minecraft.white_terracotta": "White Terracotta", - "block.minecraft.white_tulip": "White Tulip", - "block.minecraft.white_wool": "White Wool", - "block.minecraft.wither_rose": "Wither Rose", - "block.minecraft.wither_skeleton_skull": "Wither Skeleton Skull", - "block.minecraft.wither_skeleton_wall_skull": "Wither Skeleton Wall Skull", - "block.minecraft.yellow_banner": "Yellow Banner", - "block.minecraft.yellow_bed": "Yellow Bed", - "block.minecraft.yellow_candle": "Yellow Candle", - "block.minecraft.yellow_candle_cake": "Cake with Yellow Candle", - "block.minecraft.yellow_carpet": "Yellow Carpet", - "block.minecraft.yellow_concrete": "Yellow Concrete", - "block.minecraft.yellow_concrete_powder": "Yellow Concrete Powder", - "block.minecraft.yellow_glazed_terracotta": "Yellow Glazed Terracotta", - "block.minecraft.yellow_shulker_box": "Yellow Shulker Box", - "block.minecraft.yellow_stained_glass": "Yellow Stained Glass", - "block.minecraft.yellow_stained_glass_pane": "Yellow Stained Glass Pane", - "block.minecraft.yellow_terracotta": "Yellow Terracotta", - "block.minecraft.yellow_wool": "Yellow Wool", - "block.minecraft.zombie_head": "Zombie Head", - "block.minecraft.zombie_wall_head": "Zombie Wall Head", - "book.byAuthor": "by %1$s", - "book.editTitle": "Enter Book Title:", - "book.finalizeButton": "Sign and Close", - "book.finalizeWarning": "Note! When you sign the book, it will no longer be editable.", - "book.generation.0": "Original", - "book.generation.1": "Copy of original", - "book.generation.2": "Copy of a copy", - "book.generation.3": "Tattered", - "book.invalid.tag": "* Invalid book tag *", - "book.pageIndicator": "Page %1$s of %2$s", - "book.signButton": "Sign", - "build.tooHigh": "Height limit for building is %s", - "chat_screen.message": "Message to send: %s", - "chat_screen.title": "Chat screen", - "chat_screen.usage": "Input message and press Enter to send", - "chat.cannotSend": "Cannot send chat message", - "chat.coordinates": "%s, %s, %s", - "chat.coordinates.tooltip": "Click to teleport", - "chat.copy": "Copy to Clipboard", - "chat.copy.click": "Click to Copy to Clipboard", - "chat.deleted_marker": "This chat message has been deleted by the server.", - "chat.disabled.chain_broken": "Chat disabled due to broken chain. Please try reconnecting.", - "chat.disabled.expiredProfileKey": "Chat disabled due to expired profile public key. Please try reconnecting.", - "chat.disabled.launcher": "Chat disabled by launcher option. Cannot send message.", - "chat.disabled.missingProfileKey": "Chat disabled due to missing profile public key. Please try reconnecting.", - "chat.disabled.options": "Chat disabled in client options.", - "chat.disabled.profile": "Chat not allowed by account settings. Press '%s' again for more information.", - "chat.disabled.profile.moreInfo": "Chat not allowed by account settings. Cannot send or view messages.", - "chat.editBox": "chat", - "chat.filtered": "Filtered by the server.", - "chat.filtered_full": "The server has hidden your message for some players.", - "chat.link.confirm": "Are you sure you want to open the following website?", - "chat.link.confirmTrusted": "Do you want to open this link or copy it to your clipboard?", - "chat.link.open": "Open in Browser", - "chat.link.warning": "Never open links from people that you don't trust!", - "chat.queue": "[+%s pending lines]", - "chat.square_brackets": "[%s]", - "chat.tag.error": "Server sent invalid message.", - "chat.tag.modified": "Message modified by the server. Original:", - "chat.tag.not_secure": "Unverified message. Cannot be reported.", - "chat.tag.system": "Server message. Cannot be reported.", - "chat.tag.system_single_player": "Server message.", - "chat.type.admin": "[%s: %s]", - "chat.type.advancement.challenge": "%s has completed the challenge %s", - "chat.type.advancement.goal": "%s has reached the goal %s", - "chat.type.advancement.task": "%s has made the advancement %s", - "chat.type.announcement": "[%s] %s", - "chat.type.emote": "* %s %s", - "chat.type.team.hover": "Message Team", - "chat.type.team.sent": "-> %s <%s> %s", - "chat.type.team.text": "%s <%s> %s", - "chat.type.text": "<%s> %s", - "chat.type.text.narrate": "%s says %s", - "chat.validation_error": "Chat validation error", - "clear.failed.multiple": "No items were found on %s players", - "clear.failed.single": "No items were found on player %s", - "color.minecraft.black": "Black", - "color.minecraft.blue": "Blue", - "color.minecraft.brown": "Brown", - "color.minecraft.cyan": "Cyan", - "color.minecraft.gray": "Gray", - "color.minecraft.green": "Green", - "color.minecraft.light_blue": "Light Blue", - "color.minecraft.light_gray": "Light Gray", - "color.minecraft.lime": "Lime", - "color.minecraft.magenta": "Magenta", - "color.minecraft.orange": "Orange", - "color.minecraft.pink": "Pink", - "color.minecraft.purple": "Purple", - "color.minecraft.red": "Red", - "color.minecraft.white": "White", - "color.minecraft.yellow": "Yellow", - "command.context.here": "<--[HERE]", - "command.context.parse_error": "%s at position %s: %s", - "command.exception": "Could not parse command: %s", - "command.expected.separator": "Expected whitespace to end one argument, but found trailing data", - "command.failed": "An unexpected error occurred trying to execute that command", - "command.forkLimit": "Maximum number of contexts (%s) reached", - "command.unknown.argument": "Incorrect argument for command", - "command.unknown.command": "Unknown or incomplete command, see below for error", - "commands.advancement.advancementNotFound": "No advancement was found by the name '%1$s'", - "commands.advancement.criterionNotFound": "The advancement %1$s does not contain the criterion '%2$s'", - "commands.advancement.grant.criterion.to.many.failure": "Couldn't grant criterion '%s' of advancement %s to %s players as they already have it", - "commands.advancement.grant.criterion.to.many.success": "Granted criterion '%s' of advancement %s to %s players", - "commands.advancement.grant.criterion.to.one.failure": "Couldn't grant criterion '%s' of advancement %s to %s as they already have it", - "commands.advancement.grant.criterion.to.one.success": "Granted criterion '%s' of advancement %s to %s", - "commands.advancement.grant.many.to.many.failure": "Couldn't grant %s advancements to %s players as they already have them", - "commands.advancement.grant.many.to.many.success": "Granted %s advancements to %s players", - "commands.advancement.grant.many.to.one.failure": "Couldn't grant %s advancements to %s as they already have them", - "commands.advancement.grant.many.to.one.success": "Granted %s advancements to %s", - "commands.advancement.grant.one.to.many.failure": "Couldn't grant advancement %s to %s players as they already have it", - "commands.advancement.grant.one.to.many.success": "Granted the advancement %s to %s players", - "commands.advancement.grant.one.to.one.failure": "Couldn't grant advancement %s to %s as they already have it", - "commands.advancement.grant.one.to.one.success": "Granted the advancement %s to %s", - "commands.advancement.revoke.criterion.to.many.failure": "Couldn't revoke criterion '%s' of advancement %s from %s players as they don't have it", - "commands.advancement.revoke.criterion.to.many.success": "Revoked criterion '%s' of advancement %s from %s players", - "commands.advancement.revoke.criterion.to.one.failure": "Couldn't revoke criterion '%s' of advancement %s from %s as they don't have it", - "commands.advancement.revoke.criterion.to.one.success": "Revoked criterion '%s' of advancement %s from %s", - "commands.advancement.revoke.many.to.many.failure": "Couldn't revoke %s advancements from %s players as they don't have them", - "commands.advancement.revoke.many.to.many.success": "Revoked %s advancements from %s players", - "commands.advancement.revoke.many.to.one.failure": "Couldn't revoke %s advancements from %s as they don't have them", - "commands.advancement.revoke.many.to.one.success": "Revoked %s advancements from %s", - "commands.advancement.revoke.one.to.many.failure": "Couldn't revoke advancement %s from %s players as they don't have it", - "commands.advancement.revoke.one.to.many.success": "Revoked the advancement %s from %s players", - "commands.advancement.revoke.one.to.one.failure": "Couldn't revoke advancement %s from %s as they don't have it", - "commands.advancement.revoke.one.to.one.success": "Revoked the advancement %s from %s", - "commands.attribute.base_value.get.success": "Base value of attribute %s for entity %s is %s", - "commands.attribute.base_value.set.success": "Base value for attribute %s for entity %s set to %s", - "commands.attribute.failed.entity": "%s is not a valid entity for this command", - "commands.attribute.failed.modifier_already_present": "Modifier %s is already present on attribute %s for entity %s", - "commands.attribute.failed.no_attribute": "Entity %s has no attribute %s", - "commands.attribute.failed.no_modifier": "Attribute %s for entity %s has no modifier %s", - "commands.attribute.modifier.add.success": "Added modifier %s to attribute %s for entity %s", - "commands.attribute.modifier.remove.success": "Removed modifier %s from attribute %s for entity %s", - "commands.attribute.modifier.value.get.success": "Value of modifier %s on attribute %s for entity %s is %s", - "commands.attribute.value.get.success": "Value of attribute %s for entity %s is %s", - "commands.ban.failed": "Nothing changed. The player is already banned", - "commands.ban.success": "Banned %s: %s", - "commands.banip.failed": "Nothing changed. That IP is already banned", - "commands.banip.info": "This ban affects %s player(s): %s", - "commands.banip.invalid": "Invalid IP address or unknown player", - "commands.banip.success": "Banned IP %s: %s", - "commands.banlist.entry": "%s was banned by %s: %s", - "commands.banlist.entry.unknown": "(Unknown)", - "commands.banlist.list": "There are %s ban(s):", - "commands.banlist.none": "There are no bans", - "commands.bossbar.create.failed": "A bossbar already exists with the ID '%s'", - "commands.bossbar.create.success": "Created custom bossbar %s", - "commands.bossbar.get.max": "Custom bossbar %s has a maximum of %s", - "commands.bossbar.get.players.none": "Custom bossbar %s has no players currently online", - "commands.bossbar.get.players.some": "Custom bossbar %s has %s player(s) currently online: %s", - "commands.bossbar.get.value": "Custom bossbar %s has a value of %s", - "commands.bossbar.get.visible.hidden": "Custom bossbar %s is currently hidden", - "commands.bossbar.get.visible.visible": "Custom bossbar %s is currently shown", - "commands.bossbar.list.bars.none": "There are no custom bossbars active", - "commands.bossbar.list.bars.some": "There are %s custom bossbar(s) active: %s", - "commands.bossbar.remove.success": "Removed custom bossbar %s", - "commands.bossbar.set.color.success": "Custom bossbar %s has changed color", - "commands.bossbar.set.color.unchanged": "Nothing changed. That's already the color of this bossbar", - "commands.bossbar.set.max.success": "Custom bossbar %s has changed maximum to %s", - "commands.bossbar.set.max.unchanged": "Nothing changed. That's already the max of this bossbar", - "commands.bossbar.set.name.success": "Custom bossbar %s has been renamed", - "commands.bossbar.set.name.unchanged": "Nothing changed. That's already the name of this bossbar", - "commands.bossbar.set.players.success.none": "Custom bossbar %s no longer has any players", - "commands.bossbar.set.players.success.some": "Custom bossbar %s now has %s player(s): %s", - "commands.bossbar.set.players.unchanged": "Nothing changed. Those players are already on the bossbar with nobody to add or remove", - "commands.bossbar.set.style.success": "Custom bossbar %s has changed style", - "commands.bossbar.set.style.unchanged": "Nothing changed. That's already the style of this bossbar", - "commands.bossbar.set.value.success": "Custom bossbar %s has changed value to %s", - "commands.bossbar.set.value.unchanged": "Nothing changed. That's already the value of this bossbar", - "commands.bossbar.set.visibility.unchanged.hidden": "Nothing changed. The bossbar is already hidden", - "commands.bossbar.set.visibility.unchanged.visible": "Nothing changed. The bossbar is already visible", - "commands.bossbar.set.visible.success.hidden": "Custom bossbar %s is now hidden", - "commands.bossbar.set.visible.success.visible": "Custom bossbar %s is now visible", - "commands.bossbar.unknown": "No bossbar exists with the ID '%s'", - "commands.clear.success.multiple": "Removed %s item(s) from %s players", - "commands.clear.success.single": "Removed %s item(s) from player %s", - "commands.clear.test.multiple": "Found %s matching item(s) on %s players", - "commands.clear.test.single": "Found %s matching item(s) on player %s", - "commands.clone.failed": "No blocks were cloned", - "commands.clone.overlap": "The source and destination areas cannot overlap", - "commands.clone.success": "Successfully cloned %s block(s)", - "commands.clone.toobig": "Too many blocks in the specified area (maximum %s, specified %s)", - "commands.damage.invulnerable": "Target is invulnerable to the given damage type", - "commands.damage.success": "Applied %s damage to %s", - "commands.data.block.get": "%s on block %s, %s, %s after scale factor of %s is %s", - "commands.data.block.invalid": "The target block is not a block entity", - "commands.data.block.modified": "Modified block data of %s, %s, %s", - "commands.data.block.query": "%s, %s, %s has the following block data: %s", - "commands.data.entity.get": "%s on %s after scale factor of %s is %s", - "commands.data.entity.invalid": "Unable to modify player data", - "commands.data.entity.modified": "Modified entity data of %s", - "commands.data.entity.query": "%s has the following entity data: %s", - "commands.data.get.invalid": "Can't get %s; only numeric tags are allowed", - "commands.data.get.multiple": "This argument accepts a single NBT value", - "commands.data.get.unknown": "Can't get %s; tag doesn't exist", - "commands.data.merge.failed": "Nothing changed. The specified properties already have these values", - "commands.data.modify.expected_list": "Expected list, got: %s", - "commands.data.modify.expected_object": "Expected object, got: %s", - "commands.data.modify.expected_value": "Expected value, got: %s", - "commands.data.modify.invalid_index": "Invalid list index: %s", - "commands.data.modify.invalid_substring": "Invalid substring indices: %s to %s", - "commands.data.storage.get": "%s in storage %s after scale factor of %s is %s", - "commands.data.storage.modified": "Modified storage %s", - "commands.data.storage.query": "Storage %s has the following contents: %s", - "commands.datapack.disable.failed": "Pack '%s' is not enabled!", - "commands.datapack.enable.failed": "Pack '%s' is already enabled!", - "commands.datapack.enable.failed.no_flags": "Pack '%s' cannot be enabled, since required flags are not enabled in this world: %s!", - "commands.datapack.list.available.none": "There are no more data packs available", - "commands.datapack.list.available.success": "There are %s data pack(s) available: %s", - "commands.datapack.list.enabled.none": "There are no data packs enabled", - "commands.datapack.list.enabled.success": "There are %s data pack(s) enabled: %s", - "commands.datapack.modify.disable": "Disabling data pack %s", - "commands.datapack.modify.enable": "Enabling data pack %s", - "commands.datapack.unknown": "Unknown data pack '%s'", - "commands.debug.alreadyRunning": "The tick profiler is already started", - "commands.debug.function.noRecursion": "Can't trace from inside of function", - "commands.debug.function.noReturnRun": "Tracing can't be used with return run", - "commands.debug.function.success.multiple": "Traced %s command(s) from %s functions to output file %s", - "commands.debug.function.success.single": "Traced %s command(s) from function '%s' to output file %s", - "commands.debug.function.traceFailed": "Failed to trace function", - "commands.debug.notRunning": "The tick profiler hasn't started", - "commands.debug.started": "Started tick profiling", - "commands.debug.stopped": "Stopped tick profiling after %s seconds and %s ticks (%s ticks per second)", - "commands.defaultgamemode.success": "The default game mode is now %s", - "commands.deop.failed": "Nothing changed. The player is not an operator", - "commands.deop.success": "Made %s no longer a server operator", - "commands.difficulty.failure": "The difficulty did not change; it is already set to %s", - "commands.difficulty.query": "The difficulty is %s", - "commands.difficulty.success": "The difficulty has been set to %s", - "commands.drop.no_held_items": "Entity can't hold any items", - "commands.drop.no_loot_table": "Entity %s has no loot table", - "commands.drop.success.multiple": "Dropped %s items", - "commands.drop.success.multiple_with_table": "Dropped %s items from loot table %s", - "commands.drop.success.single": "Dropped %s %s", - "commands.drop.success.single_with_table": "Dropped %s %s from loot table %s", - "commands.effect.clear.everything.failed": "Target has no effects to remove", - "commands.effect.clear.everything.success.multiple": "Removed every effect from %s targets", - "commands.effect.clear.everything.success.single": "Removed every effect from %s", - "commands.effect.clear.specific.failed": "Target doesn't have the requested effect", - "commands.effect.clear.specific.success.multiple": "Removed effect %s from %s targets", - "commands.effect.clear.specific.success.single": "Removed effect %s from %s", - "commands.effect.give.failed": "Unable to apply this effect (target is either immune to effects, or has something stronger)", - "commands.effect.give.success.multiple": "Applied effect %s to %s targets", - "commands.effect.give.success.single": "Applied effect %s to %s", - "commands.enchant.failed": "Nothing changed. Targets either have no item in their hands or the enchantment could not be applied", - "commands.enchant.failed.entity": "%s is not a valid entity for this command", - "commands.enchant.failed.incompatible": "%s cannot support that enchantment", - "commands.enchant.failed.itemless": "%s is not holding any item", - "commands.enchant.failed.level": "%s is higher than the maximum level of %s supported by that enchantment", - "commands.enchant.success.multiple": "Applied enchantment %s to %s entities", - "commands.enchant.success.single": "Applied enchantment %s to %s's item", - "commands.execute.blocks.toobig": "Too many blocks in the specified area (maximum %s, specified %s)", - "commands.execute.conditional.fail": "Test failed", - "commands.execute.conditional.fail_count": "Test failed, count: %s", - "commands.execute.conditional.pass": "Test passed", - "commands.execute.conditional.pass_count": "Test passed, count: %s", - "commands.execute.function.instantiationFailure": "Failed to instantiate function %s: %s", - "commands.experience.add.levels.success.multiple": "Gave %s experience levels to %s players", - "commands.experience.add.levels.success.single": "Gave %s experience levels to %s", - "commands.experience.add.points.success.multiple": "Gave %s experience points to %s players", - "commands.experience.add.points.success.single": "Gave %s experience points to %s", - "commands.experience.query.levels": "%s has %s experience levels", - "commands.experience.query.points": "%s has %s experience points", - "commands.experience.set.levels.success.multiple": "Set %s experience levels on %s players", - "commands.experience.set.levels.success.single": "Set %s experience levels on %s", - "commands.experience.set.points.invalid": "Cannot set experience points above the maximum points for the player's current level", - "commands.experience.set.points.success.multiple": "Set %s experience points on %s players", - "commands.experience.set.points.success.single": "Set %s experience points on %s", - "commands.fill.failed": "No blocks were filled", - "commands.fill.success": "Successfully filled %s block(s)", - "commands.fill.toobig": "Too many blocks in the specified area (maximum %s, specified %s)", - "commands.fillbiome.success": "Biomes set between %s, %s, %s and %s, %s, %s", - "commands.fillbiome.success.count": "%s biome entry/entries set between %s, %s, %s and %s, %s, %s", - "commands.fillbiome.toobig": "Too many blocks in the specified volume (maximum %s, specified %s)", - "commands.forceload.added.failure": "No chunks were marked for force loading", - "commands.forceload.added.multiple": "Marked %s chunks in %s from %s to %s to be force loaded", - "commands.forceload.added.none": "No force loaded chunks were found in %s", - "commands.forceload.added.single": "Marked chunk %s in %s to be force loaded", - "commands.forceload.list.multiple": "%s force loaded chunks were found in %s at: %s", - "commands.forceload.list.single": "A force loaded chunk was found in %s at: %s", - "commands.forceload.query.failure": "Chunk at %s in %s is not marked for force loading", - "commands.forceload.query.success": "Chunk at %s in %s is marked for force loading", - "commands.forceload.removed.all": "Unmarked all force loaded chunks in %s", - "commands.forceload.removed.failure": "No chunks were removed from force loading", - "commands.forceload.removed.multiple": "Unmarked %s chunks in %s from %s to %s for force loading", - "commands.forceload.removed.single": "Unmarked chunk %s in %s for force loading", - "commands.forceload.toobig": "Too many chunks in the specified area (maximum %s, specified %s)", - "commands.function.error.argument_not_compound": "Invalid argument type: %s, expected Compound", - "commands.function.error.missing_argument": "Missing argument %2$s to function %1$s", - "commands.function.error.missing_arguments": "Missing arguments to function %s", - "commands.function.error.parse": "While instantiating macro %s: Command '%s' caused error: %s", - "commands.function.instantiationFailure": "Failed to instantiate function %s: %s", - "commands.function.result": "Function %s returned %s", - "commands.function.scheduled.multiple": "Running functions %s", - "commands.function.scheduled.no_functions": "Can't find any functions for name %s", - "commands.function.scheduled.single": "Running function %s", - "commands.function.success.multiple": "Executed %s command(s) from %s functions", - "commands.function.success.multiple.result": "Executed %s functions", - "commands.function.success.single": "Executed %s command(s) from function '%s'", - "commands.function.success.single.result": "Function '%2$s' returned %1$s", - "commands.gamemode.success.other": "Set %s's game mode to %s", - "commands.gamemode.success.self": "Set own game mode to %s", - "commands.gamerule.query": "Gamerule %s is currently set to: %s", - "commands.gamerule.set": "Gamerule %s is now set to: %s", - "commands.give.failed.toomanyitems": "Can't give more than %s of %s", - "commands.give.success.multiple": "Gave %s %s to %s players", - "commands.give.success.single": "Gave %s %s to %s", - "commands.help.failed": "Unknown command or insufficient permissions", - "commands.item.block.set.success": "Replaced a slot at %s, %s, %s with %s", - "commands.item.entity.set.success.multiple": "Replaced a slot on %s entities with %s", - "commands.item.entity.set.success.single": "Replaced a slot on %s with %s", - "commands.item.source.no_such_slot": "The source does not have slot %s", - "commands.item.source.not_a_container": "Source position %s, %s, %s is not a container", - "commands.item.target.no_changed.known_item": "No targets accepted item %s into slot %s", - "commands.item.target.no_changes": "No targets accepted item into slot %s", - "commands.item.target.no_such_slot": "The target does not have slot %s", - "commands.item.target.not_a_container": "Target position %s, %s, %s is not a container", - "commands.jfr.dump.failed": "Failed to dump JFR recording: %s", - "commands.jfr.start.failed": "Failed to start JFR profiling", - "commands.jfr.started": "JFR profiling started", - "commands.jfr.stopped": "JFR profiling stopped and dumped to %s", - "commands.kick.owner.failed": "Cannot kick server owner in LAN game", - "commands.kick.singleplayer.failed": "Cannot kick in an offline singleplayer game", - "commands.kick.success": "Kicked %s: %s", - "commands.kill.success.multiple": "Killed %s entities", - "commands.kill.success.single": "Killed %s", - "commands.list.nameAndId": "%s (%s)", - "commands.list.players": "There are %s of a max of %s players online: %s", - "commands.locate.biome.not_found": "Could not find a biome of type \"%s\" within reasonable distance", - "commands.locate.biome.success": "The nearest %s is at %s (%s blocks away)", - "commands.locate.poi.not_found": "Could not find a point of interest of type \"%s\" within reasonable distance", - "commands.locate.poi.success": "The nearest %s is at %s (%s blocks away)", - "commands.locate.structure.invalid": "There is no structure with type \"%s\"", - "commands.locate.structure.not_found": "Could not find a structure of type \"%s\" nearby", - "commands.locate.structure.success": "The nearest %s is at %s (%s blocks away)", - "commands.message.display.incoming": "%s whispers to you: %s", - "commands.message.display.outgoing": "You whisper to %s: %s", - "commands.op.failed": "Nothing changed. The player already is an operator", - "commands.op.success": "Made %s a server operator", - "commands.pardon.failed": "Nothing changed. The player isn't banned", - "commands.pardon.success": "Unbanned %s", - "commands.pardonip.failed": "Nothing changed. That IP isn't banned", - "commands.pardonip.invalid": "Invalid IP address", - "commands.pardonip.success": "Unbanned IP %s", - "commands.particle.failed": "The particle was not visible for anybody", - "commands.particle.success": "Displaying particle %s", - "commands.perf.alreadyRunning": "The performance profiler is already started", - "commands.perf.notRunning": "The performance profiler hasn't started", - "commands.perf.reportFailed": "Failed to create debug report", - "commands.perf.reportSaved": "Created debug report in %s", - "commands.perf.started": "Started 10 second performance profiling run (use '/perf stop' to stop early)", - "commands.perf.stopped": "Stopped performance profiling after %s second(s) and %s tick(s) (%s tick(s) per second)", - "commands.place.feature.failed": "Failed to place feature", - "commands.place.feature.invalid": "There is no feature with type \"%s\"", - "commands.place.feature.success": "Placed \"%s\" at %s, %s, %s", - "commands.place.jigsaw.failed": "Failed to generate jigsaw", - "commands.place.jigsaw.invalid": "There is no template pool with type \"%s\"", - "commands.place.jigsaw.success": "Generated jigsaw at %s, %s, %s", - "commands.place.structure.failed": "Failed to place structure", - "commands.place.structure.invalid": "There is no structure with type \"%s\"", - "commands.place.structure.success": "Generated structure \"%s\" at %s, %s, %s", - "commands.place.template.failed": "Failed to place template", - "commands.place.template.invalid": "There is no template with id \"%s\"", - "commands.place.template.success": "Loaded template \"%s\" at %s, %s, %s", - "commands.playsound.failed": "The sound is too far away to be heard", - "commands.playsound.success.multiple": "Played sound %s to %s players", - "commands.playsound.success.single": "Played sound %s to %s", - "commands.publish.alreadyPublished": "Multiplayer game is already hosted on port %s", - "commands.publish.failed": "Unable to host local game", - "commands.publish.started": "Local game hosted on port %s", - "commands.publish.success": "Multiplayer game is now hosted on port %s", - "commands.random.error.range_too_large": "The range of the random value must be at most 2147483646", - "commands.random.error.range_too_small": "The range of the random value must be at least 2", - "commands.random.reset.all.success": "Reset %s random sequence(s)", - "commands.random.reset.success": "Reset random sequence %s", - "commands.random.roll": "%s rolled %s (from %s to %s)", - "commands.random.sample.success": "Randomized value: %s", - "commands.recipe.give.failed": "No new recipes were learned", - "commands.recipe.give.success.multiple": "Unlocked %s recipes for %s players", - "commands.recipe.give.success.single": "Unlocked %s recipes for %s", - "commands.recipe.take.failed": "No recipes could be forgotten", - "commands.recipe.take.success.multiple": "Took %s recipes from %s players", - "commands.recipe.take.success.single": "Took %s recipes from %s", - "commands.reload.failure": "Reload failed; keeping old data", - "commands.reload.success": "Reloading!", - "commands.ride.already_riding": "%s is already riding %s", - "commands.ride.dismount.success": "%s stopped riding %s", - "commands.ride.mount.failure.cant_ride_players": "Players can't be ridden", - "commands.ride.mount.failure.generic": "%s couldn't start riding %s", - "commands.ride.mount.failure.loop": "Can't mount entity on itself or any of its passengers", - "commands.ride.mount.failure.wrong_dimension": "Can't mount entity in different dimension", - "commands.ride.mount.success": "%s started riding %s", - "commands.ride.not_riding": "%s is not riding any vehicle", - "commands.save.alreadyOff": "Saving is already turned off", - "commands.save.alreadyOn": "Saving is already turned on", - "commands.save.disabled": "Automatic saving is now disabled", - "commands.save.enabled": "Automatic saving is now enabled", - "commands.save.failed": "Unable to save the game (is there enough disk space?)", - "commands.save.saving": "Saving the game (this may take a moment!)", - "commands.save.success": "Saved the game", - "commands.schedule.cleared.failure": "No schedules with id %s", - "commands.schedule.cleared.success": "Removed %s schedule(s) with id %s", - "commands.schedule.created.function": "Scheduled function '%s' in %s tick(s) at gametime %s", - "commands.schedule.created.tag": "Scheduled tag '%s' in %s ticks at gametime %s", - "commands.schedule.same_tick": "Can't schedule for current tick", - "commands.scoreboard.objectives.add.duplicate": "An objective already exists by that name", - "commands.scoreboard.objectives.add.success": "Created new objective %s", - "commands.scoreboard.objectives.display.alreadyEmpty": "Nothing changed. That display slot is already empty", - "commands.scoreboard.objectives.display.alreadySet": "Nothing changed. That display slot is already showing that objective", - "commands.scoreboard.objectives.display.cleared": "Cleared any objectives in display slot %s", - "commands.scoreboard.objectives.display.set": "Set display slot %s to show objective %s", - "commands.scoreboard.objectives.list.empty": "There are no objectives", - "commands.scoreboard.objectives.list.success": "There are %s objective(s): %s", - "commands.scoreboard.objectives.modify.displayAutoUpdate.disable": "Disabled display auto-update for objective %s", - "commands.scoreboard.objectives.modify.displayAutoUpdate.enable": "Enabled display auto-update for objective %s", - "commands.scoreboard.objectives.modify.displayname": "Changed the display name of %s to %s", - "commands.scoreboard.objectives.modify.objectiveFormat.clear": "Cleared default number format of objective %s", - "commands.scoreboard.objectives.modify.objectiveFormat.set": "Changed default number format of objective %s", - "commands.scoreboard.objectives.modify.rendertype": "Changed the render type of objective %s", - "commands.scoreboard.objectives.remove.success": "Removed objective %s", - "commands.scoreboard.players.add.success.multiple": "Added %s to %s for %s entities", - "commands.scoreboard.players.add.success.single": "Added %s to %s for %s (now %s)", - "commands.scoreboard.players.display.name.clear.success.multiple": "Cleared display name for %s entities in %s", - "commands.scoreboard.players.display.name.clear.success.single": "Cleared display name for %s in %s", - "commands.scoreboard.players.display.name.set.success.multiple": "Changed display name to %s for %s entities in %s", - "commands.scoreboard.players.display.name.set.success.single": "Changed display name to %s for %s in %s", - "commands.scoreboard.players.display.numberFormat.clear.success.multiple": "Cleared number format for %s entities in %s", - "commands.scoreboard.players.display.numberFormat.clear.success.single": "Cleared number format for %s in %s", - "commands.scoreboard.players.display.numberFormat.set.success.multiple": "Changed number format for %s entities in %s", - "commands.scoreboard.players.display.numberFormat.set.success.single": "Changed number format for %s in %s", - "commands.scoreboard.players.enable.failed": "Nothing changed. That trigger is already enabled", - "commands.scoreboard.players.enable.invalid": "Enable only works on trigger-objectives", - "commands.scoreboard.players.enable.success.multiple": "Enabled trigger %s for %s entities", - "commands.scoreboard.players.enable.success.single": "Enabled trigger %s for %s", - "commands.scoreboard.players.get.null": "Can't get value of %s for %s; none is set", - "commands.scoreboard.players.get.success": "%s has %s %s", - "commands.scoreboard.players.list.empty": "There are no tracked entities", - "commands.scoreboard.players.list.entity.empty": "%s has no scores to show", - "commands.scoreboard.players.list.entity.entry": "%s: %s", - "commands.scoreboard.players.list.entity.success": "%s has %s score(s):", - "commands.scoreboard.players.list.success": "There are %s tracked entity/entities: %s", - "commands.scoreboard.players.operation.success.multiple": "Updated %s for %s entities", - "commands.scoreboard.players.operation.success.single": "Set %s for %s to %s", - "commands.scoreboard.players.remove.success.multiple": "Removed %s from %s for %s entities", - "commands.scoreboard.players.remove.success.single": "Removed %s from %s for %s (now %s)", - "commands.scoreboard.players.reset.all.multiple": "Reset all scores for %s entities", - "commands.scoreboard.players.reset.all.single": "Reset all scores for %s", - "commands.scoreboard.players.reset.specific.multiple": "Reset %s for %s entities", - "commands.scoreboard.players.reset.specific.single": "Reset %s for %s", - "commands.scoreboard.players.set.success.multiple": "Set %s for %s entities to %s", - "commands.scoreboard.players.set.success.single": "Set %s for %s to %s", - "commands.seed.success": "Seed: %s", - "commands.setblock.failed": "Could not set the block", - "commands.setblock.success": "Changed the block at %s, %s, %s", - "commands.setidletimeout.success": "The player idle timeout is now %s minute(s)", - "commands.setworldspawn.success": "Set the world spawn point to %s, %s, %s [%s]", - "commands.spawnpoint.success.multiple": "Set spawn point to %s, %s, %s [%s] in %s for %s players", - "commands.spawnpoint.success.single": "Set spawn point to %s, %s, %s [%s] in %s for %s", - "commands.spectate.not_spectator": "%s is not in spectator mode", - "commands.spectate.self": "Cannot spectate yourself", - "commands.spectate.success.started": "Now spectating %s", - "commands.spectate.success.stopped": "No longer spectating an entity", - "commands.spreadplayers.failed.entities": "Could not spread %s entity/entities around %s, %s (too many entities for space - try using spread of at most %s)", - "commands.spreadplayers.failed.invalid.height": "Invalid maxHeight %s; expected higher than world minimum %s", - "commands.spreadplayers.failed.teams": "Could not spread %s team(s) around %s, %s (too many entities for space - try using spread of at most %s)", - "commands.spreadplayers.success.entities": "Spread %s player(s) around %s, %s with an average distance of %s blocks apart", - "commands.spreadplayers.success.teams": "Spread %s team(s) around %s, %s with an average distance of %s blocks apart", - "commands.stop.stopping": "Stopping the server", - "commands.stopsound.success.source.any": "Stopped all '%s' sounds", - "commands.stopsound.success.source.sound": "Stopped sound '%s' on source '%s'", - "commands.stopsound.success.sourceless.any": "Stopped all sounds", - "commands.stopsound.success.sourceless.sound": "Stopped sound '%s'", - "commands.summon.failed": "Unable to summon entity", - "commands.summon.failed.uuid": "Unable to summon entity due to duplicate UUIDs", - "commands.summon.invalidPosition": "Invalid position for summon", - "commands.summon.success": "Summoned new %s", - "commands.tag.add.failed": "Target either already has the tag or has too many tags", - "commands.tag.add.success.multiple": "Added tag '%s' to %s entities", - "commands.tag.add.success.single": "Added tag '%s' to %s", - "commands.tag.list.multiple.empty": "There are no tags on the %s entities", - "commands.tag.list.multiple.success": "The %s entities have %s total tags: %s", - "commands.tag.list.single.empty": "%s has no tags", - "commands.tag.list.single.success": "%s has %s tags: %s", - "commands.tag.remove.failed": "Target does not have this tag", - "commands.tag.remove.success.multiple": "Removed tag '%s' from %s entities", - "commands.tag.remove.success.single": "Removed tag '%s' from %s", - "commands.team.add.duplicate": "A team already exists by that name", - "commands.team.add.success": "Created team %s", - "commands.team.empty.success": "Removed %s member(s) from team %s", - "commands.team.empty.unchanged": "Nothing changed. That team is already empty", - "commands.team.join.success.multiple": "Added %s members to team %s", - "commands.team.join.success.single": "Added %s to team %s", - "commands.team.leave.success.multiple": "Removed %s members from any team", - "commands.team.leave.success.single": "Removed %s from any team", - "commands.team.list.members.empty": "There are no members on team %s", - "commands.team.list.members.success": "Team %s has %s member(s): %s", - "commands.team.list.teams.empty": "There are no teams", - "commands.team.list.teams.success": "There are %s team(s): %s", - "commands.team.option.collisionRule.success": "Collision rule for team %s is now \"%s\"", - "commands.team.option.collisionRule.unchanged": "Nothing changed. Collision rule is already that value", - "commands.team.option.color.success": "Updated the color for team %s to %s", - "commands.team.option.color.unchanged": "Nothing changed. That team already has that color", - "commands.team.option.deathMessageVisibility.success": "Death message visibility for team %s is now \"%s\"", - "commands.team.option.deathMessageVisibility.unchanged": "Nothing changed. Death message visibility is already that value", - "commands.team.option.friendlyfire.alreadyDisabled": "Nothing changed. Friendly fire is already disabled for that team", - "commands.team.option.friendlyfire.alreadyEnabled": "Nothing changed. Friendly fire is already enabled for that team", - "commands.team.option.friendlyfire.disabled": "Disabled friendly fire for team %s", - "commands.team.option.friendlyfire.enabled": "Enabled friendly fire for team %s", - "commands.team.option.name.success": "Updated the name of team %s", - "commands.team.option.name.unchanged": "Nothing changed. That team already has that name", - "commands.team.option.nametagVisibility.success": "Nametag visibility for team %s is now \"%s\"", - "commands.team.option.nametagVisibility.unchanged": "Nothing changed. Nametag visibility is already that value", - "commands.team.option.prefix.success": "Team prefix set to %s", - "commands.team.option.seeFriendlyInvisibles.alreadyDisabled": "Nothing changed. That team already can't see invisible teammates", - "commands.team.option.seeFriendlyInvisibles.alreadyEnabled": "Nothing changed. That team can already see invisible teammates", - "commands.team.option.seeFriendlyInvisibles.disabled": "Team %s can no longer see invisible teammates", - "commands.team.option.seeFriendlyInvisibles.enabled": "Team %s can now see invisible teammates", - "commands.team.option.suffix.success": "Team suffix set to %s", - "commands.team.remove.success": "Removed team %s", - "commands.teammsg.failed.noteam": "You must be on a team to message your team", - "commands.teleport.invalidPosition": "Invalid position for teleport", - "commands.teleport.success.entity.multiple": "Teleported %s entities to %s", - "commands.teleport.success.entity.single": "Teleported %s to %s", - "commands.teleport.success.location.multiple": "Teleported %s entities to %s, %s, %s", - "commands.teleport.success.location.single": "Teleported %s to %s, %s, %s", - "commands.tick.query.percentiles": "Percentiles: P50: %sms P95: %sms P99: %sms, sample: %s", - "commands.tick.query.rate.running": "Target tick rate: %s per second.\nAverage time per tick: %sms (Target: %sms)", - "commands.tick.query.rate.sprinting": "Target tick rate: %s per second (ignored, reference only).\nAverage time per tick: %sms", - "commands.tick.rate.success": "Set the target tick rate to %s per second", - "commands.tick.sprint.report": "Sprint completed with %s ticks per second, or %s ms per tick", - "commands.tick.sprint.stop.fail": "No tick sprint in progress", - "commands.tick.sprint.stop.success": "A tick sprint interrupted", - "commands.tick.status.frozen": "The game is frozen", - "commands.tick.status.lagging": "The game is running, but can't keep up with the target tick rate", - "commands.tick.status.running": "The game runs normally", - "commands.tick.status.sprinting": "The game is sprinting", - "commands.tick.step.fail": "Unable to step the game - the game must be frozen first", - "commands.tick.step.stop.fail": "No tick step in progress", - "commands.tick.step.stop.success": "A tick step interrupted", - "commands.tick.step.success": "Stepping %s tick(s)", - "commands.time.query": "The time is %s", - "commands.time.set": "Set the time to %s", - "commands.title.cleared.multiple": "Cleared titles for %s players", - "commands.title.cleared.single": "Cleared titles for %s", - "commands.title.reset.multiple": "Reset title options for %s players", - "commands.title.reset.single": "Reset title options for %s", - "commands.title.show.actionbar.multiple": "Showing new actionbar title for %s players", - "commands.title.show.actionbar.single": "Showing new actionbar title for %s", - "commands.title.show.subtitle.multiple": "Showing new subtitle for %s players", - "commands.title.show.subtitle.single": "Showing new subtitle for %s", - "commands.title.show.title.multiple": "Showing new title for %s players", - "commands.title.show.title.single": "Showing new title for %s", - "commands.title.times.multiple": "Changed title display times for %s players", - "commands.title.times.single": "Changed title display times for %s", - "commands.trigger.add.success": "Triggered %s (added %s to value)", - "commands.trigger.failed.invalid": "You can only trigger objectives that are 'trigger' type", - "commands.trigger.failed.unprimed": "You cannot trigger this objective yet", - "commands.trigger.set.success": "Triggered %s (set value to %s)", - "commands.trigger.simple.success": "Triggered %s", - "commands.weather.set.clear": "Set the weather to clear", - "commands.weather.set.rain": "Set the weather to rain", - "commands.weather.set.thunder": "Set the weather to rain & thunder", - "commands.whitelist.add.failed": "Player is already whitelisted", - "commands.whitelist.add.success": "Added %s to the whitelist", - "commands.whitelist.alreadyOff": "Whitelist is already turned off", - "commands.whitelist.alreadyOn": "Whitelist is already turned on", - "commands.whitelist.disabled": "Whitelist is now turned off", - "commands.whitelist.enabled": "Whitelist is now turned on", - "commands.whitelist.list": "There are %s whitelisted player(s): %s", - "commands.whitelist.none": "There are no whitelisted players", - "commands.whitelist.reloaded": "Reloaded the whitelist", - "commands.whitelist.remove.failed": "Player is not whitelisted", - "commands.whitelist.remove.success": "Removed %s from the whitelist", - "commands.worldborder.center.failed": "Nothing changed. The world border is already centered there", - "commands.worldborder.center.success": "Set the center of the world border to %s, %s", - "commands.worldborder.damage.amount.failed": "Nothing changed. The world border damage is already that amount", - "commands.worldborder.damage.amount.success": "Set the world border damage to %s per block each second", - "commands.worldborder.damage.buffer.failed": "Nothing changed. The world border damage buffer is already that distance", - "commands.worldborder.damage.buffer.success": "Set the world border damage buffer to %s block(s)", - "commands.worldborder.get": "The world border is currently %s block(s) wide", - "commands.worldborder.set.failed.big": "World border cannot be bigger than %s blocks wide", - "commands.worldborder.set.failed.far": "World border cannot be further out than %s blocks", - "commands.worldborder.set.failed.nochange": "Nothing changed. The world border is already that size", - "commands.worldborder.set.failed.small": "World border cannot be smaller than 1 block wide", - "commands.worldborder.set.grow": "Growing the world border to %s blocks wide over %s seconds", - "commands.worldborder.set.immediate": "Set the world border to %s block(s) wide", - "commands.worldborder.set.shrink": "Shrinking the world border to %s block(s) wide over %s second(s)", - "commands.worldborder.warning.distance.failed": "Nothing changed. The world border warning is already that distance", - "commands.worldborder.warning.distance.success": "Set the world border warning distance to %s block(s)", - "commands.worldborder.warning.time.failed": "Nothing changed. The world border warning is already that amount of time", - "commands.worldborder.warning.time.success": "Set the world border warning time to %s second(s)", - "compliance.playtime.greaterThan24Hours": "You've been playing for greater than 24 hours", - "compliance.playtime.hours": "You've been playing for %s hour(s)", - "compliance.playtime.message": "Excessive gaming may interfere with normal daily life", - "connect.aborted": "Aborted", - "connect.authorizing": "Logging in...", - "connect.connecting": "Connecting to the server...", - "connect.encrypting": "Encrypting...", - "connect.failed": "Failed to connect to the server", - "connect.joining": "Joining world...", - "connect.negotiating": "Negotiating...", - "connect.reconfiging": "Reconfiguring...", - "connect.reconfiguring": "Reconfiguring...", - "container.barrel": "Barrel", - "container.beacon": "Beacon", - "container.blast_furnace": "Blast Furnace", - "container.brewing": "Brewing Stand", - "container.cartography_table": "Cartography Table", - "container.chest": "Chest", - "container.chestDouble": "Large Chest", - "container.crafter": "Crafter", - "container.crafting": "Crafting", - "container.creative": "Item Selection", - "container.dispenser": "Dispenser", - "container.dropper": "Dropper", - "container.enchant": "Enchant", - "container.enchant.clue": "%s . . . ?", - "container.enchant.lapis.many": "%s Lapis Lazuli", - "container.enchant.lapis.one": "1 Lapis Lazuli", - "container.enchant.level.many": "%s Enchantment Levels", - "container.enchant.level.one": "1 Enchantment Level", - "container.enchant.level.requirement": "Level Requirement: %s", - "container.enderchest": "Ender Chest", - "container.furnace": "Furnace", - "container.grindstone_title": "Repair & Disenchant", - "container.hopper": "Item Hopper", - "container.inventory": "Inventory", - "container.isLocked": "%s is locked!", - "container.lectern": "Lectern", - "container.loom": "Loom", - "container.repair": "Repair & Name", - "container.repair.cost": "Enchantment Cost: %1$s", - "container.repair.expensive": "Too Expensive!", - "container.shulkerBox": "Shulker Box", - "container.shulkerBox.itemCount": "%s x%s", - "container.shulkerBox.more": "and %s more...", - "container.shulkerBox.unknownContents": "???????", - "container.smoker": "Smoker", - "container.spectatorCantOpen": "Unable to open. Loot not generated yet.", - "container.stonecutter": "Stonecutter", - "container.upgrade": "Upgrade Gear", - "container.upgrade.error_tooltip": "Item can't be upgraded this way", - "container.upgrade.missing_template_tooltip": "Add Smithing Template", - "controls.keybinds": "Key Binds...", - "controls.keybinds.duplicateKeybinds": "This key is also used for:\n%s", - "controls.keybinds.title": "Key Binds", - "controls.reset": "Reset", - "controls.resetAll": "Reset Keys", - "controls.title": "Controls", - "createWorld.customize.buffet.biome": "Please select a biome", - "createWorld.customize.buffet.title": "Buffet world customization", - "createWorld.customize.custom.baseSize": "Depth Base Size", - "createWorld.customize.custom.biomeDepthOffset": "Biome Depth Offset", - "createWorld.customize.custom.biomeDepthWeight": "Biome Depth Weight", - "createWorld.customize.custom.biomeScaleOffset": "Biome Scale Offset", - "createWorld.customize.custom.biomeScaleWeight": "Biome Scale Weight", - "createWorld.customize.custom.biomeSize": "Biome Size", - "createWorld.customize.custom.center": "Center Height", - "createWorld.customize.custom.confirm1": "This will overwrite your current", - "createWorld.customize.custom.confirm2": "settings and cannot be undone.", - "createWorld.customize.custom.confirmTitle": "Warning!", - "createWorld.customize.custom.coordinateScale": "Coordinate Scale", - "createWorld.customize.custom.count": "Spawn Tries", - "createWorld.customize.custom.defaults": "Defaults", - "createWorld.customize.custom.depthNoiseScaleExponent": "Depth Noise Exponent", - "createWorld.customize.custom.depthNoiseScaleX": "Depth Noise Scale X", - "createWorld.customize.custom.depthNoiseScaleZ": "Depth Noise Scale Z", - "createWorld.customize.custom.dungeonChance": "Dungeon Count", - "createWorld.customize.custom.fixedBiome": "Biome", - "createWorld.customize.custom.heightScale": "Height Scale", - "createWorld.customize.custom.lavaLakeChance": "Lava Lake Rarity", - "createWorld.customize.custom.lowerLimitScale": "Lower Limit Scale", - "createWorld.customize.custom.mainNoiseScaleX": "Main Noise Scale X", - "createWorld.customize.custom.mainNoiseScaleY": "Main Noise Scale Y", - "createWorld.customize.custom.mainNoiseScaleZ": "Main Noise Scale Z", - "createWorld.customize.custom.maxHeight": "Max. Height", - "createWorld.customize.custom.minHeight": "Min. Height", - "createWorld.customize.custom.next": "Next Page", - "createWorld.customize.custom.page0": "Basic Settings", - "createWorld.customize.custom.page1": "Ore Settings", - "createWorld.customize.custom.page2": "Advanced Settings (Expert Users Only!)", - "createWorld.customize.custom.page3": "Extra Advanced Settings (Expert Users Only!)", - "createWorld.customize.custom.preset.caveChaos": "Caves of Chaos", - "createWorld.customize.custom.preset.caveDelight": "Caver's Delight", - "createWorld.customize.custom.preset.drought": "Drought", - "createWorld.customize.custom.preset.goodLuck": "Good Luck", - "createWorld.customize.custom.preset.isleLand": "Isle Land", - "createWorld.customize.custom.preset.mountains": "Mountain Madness", - "createWorld.customize.custom.preset.waterWorld": "Water World", - "createWorld.customize.custom.presets": "Presets", - "createWorld.customize.custom.presets.title": "Customize World Presets", - "createWorld.customize.custom.prev": "Previous Page", - "createWorld.customize.custom.randomize": "Randomize", - "createWorld.customize.custom.riverSize": "River Size", - "createWorld.customize.custom.seaLevel": "Sea Level", - "createWorld.customize.custom.size": "Spawn Size", - "createWorld.customize.custom.spread": "Spread Height", - "createWorld.customize.custom.stretchY": "Height Stretch", - "createWorld.customize.custom.upperLimitScale": "Upper Limit Scale", - "createWorld.customize.custom.useCaves": "Caves", - "createWorld.customize.custom.useDungeons": "Dungeons", - "createWorld.customize.custom.useLavaLakes": "Lava Lakes", - "createWorld.customize.custom.useLavaOceans": "Lava Oceans", - "createWorld.customize.custom.useMansions": "Woodland Mansions", - "createWorld.customize.custom.useMineShafts": "Mineshafts", - "createWorld.customize.custom.useMonuments": "Ocean Monuments", - "createWorld.customize.custom.useOceanRuins": "Ocean Ruins", - "createWorld.customize.custom.useRavines": "Ravines", - "createWorld.customize.custom.useStrongholds": "Strongholds", - "createWorld.customize.custom.useTemples": "Temples", - "createWorld.customize.custom.useVillages": "Villages", - "createWorld.customize.custom.useWaterLakes": "Water Lakes", - "createWorld.customize.custom.waterLakeChance": "Water Lake Rarity", - "createWorld.customize.flat.height": "Height", - "createWorld.customize.flat.layer": "%s", - "createWorld.customize.flat.layer.bottom": "Bottom - %s", - "createWorld.customize.flat.layer.top": "Top - %s", - "createWorld.customize.flat.removeLayer": "Remove Layer", - "createWorld.customize.flat.tile": "Layer Material", - "createWorld.customize.flat.title": "Superflat Customization", - "createWorld.customize.presets": "Presets", - "createWorld.customize.presets.list": "Alternatively, here's some we made earlier!", - "createWorld.customize.presets.select": "Use Preset", - "createWorld.customize.presets.share": "Want to share your preset with someone? Use the box below!", - "createWorld.customize.presets.title": "Select a Preset", - "createWorld.preparing": "Preparing for world creation...", - "createWorld.tab.game.title": "Game", - "createWorld.tab.more.title": "More", - "createWorld.tab.world.title": "World", - "credits_and_attribution.button.attribution": "Attribution", - "credits_and_attribution.button.credits": "Credits", - "credits_and_attribution.button.licenses": "Licenses", - "credits_and_attribution.screen.title": "Credits and Attribution", - "dataPack.bundle.description": "Enables experimental Bundle item", - "dataPack.bundle.name": "Bundles", - "dataPack.title": "Select Data Packs", - "dataPack.trade_rebalance.description": "Updated trades for Villagers", - "dataPack.trade_rebalance.name": "Villager Trade Rebalance", - "dataPack.update_1_20.description": "New features and content for Minecraft 1.20", - "dataPack.update_1_20.name": "Update 1.20", - "dataPack.update_1_21.description": "New features and content for Minecraft 1.21", - "dataPack.update_1_21.name": "Update 1.21", - "dataPack.validation.back": "Go Back", - "dataPack.validation.failed": "Data pack validation failed!", - "dataPack.validation.reset": "Reset to Default", - "dataPack.validation.working": "Validating selected data packs...", - "dataPack.vanilla.description": "The default data for Minecraft", - "dataPack.vanilla.name": "Default", - "datapackFailure.safeMode": "Safe Mode", - "datapackFailure.safeMode.failed.description": "This world contains invalid or corrupted save data.", - "datapackFailure.safeMode.failed.title": "Failed to load world in Safe Mode.", - "datapackFailure.title": "Errors in currently selected data packs prevented the world from loading.\nYou can either try to load it with only the vanilla data pack (\"safe mode\"), or go back to the title screen and fix it manually.", - "death.attack.anvil": "%1$s was squashed by a falling anvil", - "death.attack.anvil.player": "%1$s was squashed by a falling anvil while fighting %2$s", - "death.attack.arrow": "%1$s was shot by %2$s", - "death.attack.arrow.item": "%1$s was shot by %2$s using %3$s", - "death.attack.badRespawnPoint.link": "Intentional Game Design", - "death.attack.badRespawnPoint.message": "%1$s was killed by %2$s", - "death.attack.cactus": "%1$s was pricked to death", - "death.attack.cactus.player": "%1$s walked into a cactus while trying to escape %2$s", - "death.attack.cramming": "%1$s was squished too much", - "death.attack.cramming.player": "%1$s was squashed by %2$s", - "death.attack.dragonBreath": "%1$s was roasted in dragon's breath", - "death.attack.dragonBreath.player": "%1$s was roasted in dragon's breath by %2$s", - "death.attack.drown": "%1$s drowned", - "death.attack.drown.player": "%1$s drowned while trying to escape %2$s", - "death.attack.dryout": "%1$s died from dehydration", - "death.attack.dryout.player": "%1$s died from dehydration while trying to escape %2$s", - "death.attack.even_more_magic": "%1$s was killed by even more magic", - "death.attack.explosion": "%1$s blew up", - "death.attack.explosion.player": "%1$s was blown up by %2$s", - "death.attack.explosion.player.item": "%1$s was blown up by %2$s using %3$s", - "death.attack.fall": "%1$s hit the ground too hard", - "death.attack.fall.player": "%1$s hit the ground too hard while trying to escape %2$s", - "death.attack.fallingBlock": "%1$s was squashed by a falling block", - "death.attack.fallingBlock.player": "%1$s was squashed by a falling block while fighting %2$s", - "death.attack.fallingStalactite": "%1$s was skewered by a falling stalactite", - "death.attack.fallingStalactite.player": "%1$s was skewered by a falling stalactite while fighting %2$s", - "death.attack.fireball": "%1$s was fireballed by %2$s", - "death.attack.fireball.item": "%1$s was fireballed by %2$s using %3$s", - "death.attack.fireworks": "%1$s went off with a bang", - "death.attack.fireworks.item": "%1$s went off with a bang due to a firework fired from %3$s by %2$s", - "death.attack.fireworks.player": "%1$s went off with a bang while fighting %2$s", - "death.attack.flyIntoWall": "%1$s experienced kinetic energy", - "death.attack.flyIntoWall.player": "%1$s experienced kinetic energy while trying to escape %2$s", - "death.attack.freeze": "%1$s froze to death", - "death.attack.freeze.player": "%1$s was frozen to death by %2$s", - "death.attack.generic": "%1$s died", - "death.attack.generic.player": "%1$s died because of %2$s", - "death.attack.genericKill": "%1$s was killed", - "death.attack.genericKill.player": "%1$s was killed while fighting %2$s", - "death.attack.hotFloor": "%1$s discovered the floor was lava", - "death.attack.hotFloor.player": "%1$s walked into the danger zone due to %2$s", - "death.attack.indirectMagic": "%1$s was killed by %2$s using magic", - "death.attack.indirectMagic.item": "%1$s was killed by %2$s using %3$s", - "death.attack.inFire": "%1$s went up in flames", - "death.attack.inFire.player": "%1$s walked into fire while fighting %2$s", - "death.attack.inWall": "%1$s suffocated in a wall", - "death.attack.inWall.player": "%1$s suffocated in a wall while fighting %2$s", - "death.attack.lava": "%1$s tried to swim in lava", - "death.attack.lava.player": "%1$s tried to swim in lava to escape %2$s", - "death.attack.lightningBolt": "%1$s was struck by lightning", - "death.attack.lightningBolt.player": "%1$s was struck by lightning while fighting %2$s", - "death.attack.magic": "%1$s was killed by magic", - "death.attack.magic.player": "%1$s was killed by magic while trying to escape %2$s", - "death.attack.message_too_long": "Actually, the message was too long to deliver fully. Sorry! Here's a stripped version: %s", - "death.attack.mob": "%1$s was slain by %2$s", - "death.attack.mob.item": "%1$s was slain by %2$s using %3$s", - "death.attack.onFire": "%1$s burned to death", - "death.attack.onFire.item": "%1$s was burned to a crisp while fighting %2$s wielding %3$s", - "death.attack.onFire.player": "%1$s was burned to a crisp while fighting %2$s", - "death.attack.outOfWorld": "%1$s fell out of the world", - "death.attack.outOfWorld.player": "%1$s didn't want to live in the same world as %2$s", - "death.attack.outsideBorder": "%1$s left the confines of this world", - "death.attack.outsideBorder.player": "%1$s left the confines of this world while fighting %2$s", - "death.attack.player": "%1$s was slain by %2$s", - "death.attack.player.item": "%1$s was slain by %2$s using %3$s", - "death.attack.sonic_boom": "%1$s was obliterated by a sonically-charged shriek", - "death.attack.sonic_boom.item": "%1$s was obliterated by a sonically-charged shriek while trying to escape %2$s wielding %3$s", - "death.attack.sonic_boom.player": "%1$s was obliterated by a sonically-charged shriek while trying to escape %2$s", - "death.attack.stalagmite": "%1$s was impaled on a stalagmite", - "death.attack.stalagmite.player": "%1$s was impaled on a stalagmite while fighting %2$s", - "death.attack.starve": "%1$s starved to death", - "death.attack.starve.player": "%1$s starved to death while fighting %2$s", - "death.attack.sting": "%1$s was stung to death", - "death.attack.sting.item": "%1$s was stung to death by %2$s using %3$s", - "death.attack.sting.player": "%1$s was stung to death by %2$s", - "death.attack.sweetBerryBush": "%1$s was poked to death by a sweet berry bush", - "death.attack.sweetBerryBush.player": "%1$s was poked to death by a sweet berry bush while trying to escape %2$s", - "death.attack.thorns": "%1$s was killed while trying to hurt %2$s", - "death.attack.thorns.item": "%1$s was killed by %3$s while trying to hurt %2$s", - "death.attack.thrown": "%1$s was pummeled by %2$s", - "death.attack.thrown.item": "%1$s was pummeled by %2$s using %3$s", - "death.attack.trident": "%1$s was impaled by %2$s", - "death.attack.trident.item": "%1$s was impaled by %2$s with %3$s", - "death.attack.wither": "%1$s withered away", - "death.attack.wither.player": "%1$s withered away while fighting %2$s", - "death.attack.witherSkull": "%1$s was shot by a skull from %2$s", - "death.attack.witherSkull.item": "%1$s was shot by a skull from %2$s using %3$s", - "death.fell.accident.generic": "%1$s fell from a high place", - "death.fell.accident.ladder": "%1$s fell off a ladder", - "death.fell.accident.other_climbable": "%1$s fell while climbing", - "death.fell.accident.scaffolding": "%1$s fell off scaffolding", - "death.fell.accident.twisting_vines": "%1$s fell off some twisting vines", - "death.fell.accident.vines": "%1$s fell off some vines", - "death.fell.accident.weeping_vines": "%1$s fell off some weeping vines", - "death.fell.assist": "%1$s was doomed to fall by %2$s", - "death.fell.assist.item": "%1$s was doomed to fall by %2$s using %3$s", - "death.fell.finish": "%1$s fell too far and was finished by %2$s", - "death.fell.finish.item": "%1$s fell too far and was finished by %2$s using %3$s", - "death.fell.killer": "%1$s was doomed to fall", - "deathScreen.quit.confirm": "Are you sure you want to quit?", - "deathScreen.respawn": "Respawn", - "deathScreen.score": "Score", - "deathScreen.score.value": "Score: %s", - "deathScreen.spectate": "Spectate World", - "deathScreen.title": "You Died!", - "deathScreen.title.hardcore": "Game Over!", - "deathScreen.titleScreen": "Title Screen", - "debug.advanced_tooltips.help": "F3 + H = Advanced tooltips", - "debug.advanced_tooltips.off": "Advanced tooltips: hidden", - "debug.advanced_tooltips.on": "Advanced tooltips: shown", - "debug.chunk_boundaries.help": "F3 + G = Show chunk boundaries", - "debug.chunk_boundaries.off": "Chunk borders: hidden", - "debug.chunk_boundaries.on": "Chunk borders: shown", - "debug.clear_chat.help": "F3 + D = Clear chat", - "debug.copy_location.help": "F3 + C = Copy location as /tp command, hold F3 + C to crash the game", - "debug.copy_location.message": "Copied location to clipboard", - "debug.crash.message": "F3 + C is held down. This will crash the game unless released.", - "debug.crash.warning": "Crashing in %s...", - "debug.creative_spectator.error": "Unable to switch game mode; no permission", - "debug.creative_spectator.help": "F3 + N = Cycle previous game mode <-> spectator", - "debug.dump_dynamic_textures": "Saved dynamic textures to %s", - "debug.dump_dynamic_textures.help": "F3 + S = Dump dynamic textures", - "debug.gamemodes.error": "Unable to open game mode switcher; no permission", - "debug.gamemodes.help": "F3 + F4 = Open game mode switcher", - "debug.gamemodes.press_f4": "[ F4 ]", - "debug.gamemodes.select_next": "%s Next", - "debug.help.help": "F3 + Q = Show this list", - "debug.help.message": "Key bindings:", - "debug.inspect.client.block": "Copied client-side block data to clipboard", - "debug.inspect.client.entity": "Copied client-side entity data to clipboard", - "debug.inspect.help": "F3 + I = Copy entity or block data to clipboard", - "debug.inspect.server.block": "Copied server-side block data to clipboard", - "debug.inspect.server.entity": "Copied server-side entity data to clipboard", - "debug.pause_focus.help": "F3 + P = Pause on lost focus", - "debug.pause_focus.off": "Pause on lost focus: disabled", - "debug.pause_focus.on": "Pause on lost focus: enabled", - "debug.pause.help": "F3 + Esc = Pause without pause menu (if pausing is possible)", - "debug.prefix": "[Debug]:", - "debug.profiling.help": "F3 + L = Start/stop profiling", - "debug.profiling.start": "Profiling started for %s seconds. Use F3 + L to stop early", - "debug.profiling.stop": "Profiling ended. Saved results to %s", - "debug.reload_chunks.help": "F3 + A = Reload chunks", - "debug.reload_chunks.message": "Reloading all chunks", - "debug.reload_resourcepacks.help": "F3 + T = Reload resource packs", - "debug.reload_resourcepacks.message": "Reloaded resource packs", - "debug.show_hitboxes.help": "F3 + B = Show hitboxes", - "debug.show_hitboxes.off": "Hitboxes: hidden", - "debug.show_hitboxes.on": "Hitboxes: shown", - "demo.day.1": "This demo will last five game days. Do your best!", - "demo.day.2": "Day Two", - "demo.day.3": "Day Three", - "demo.day.4": "Day Four", - "demo.day.5": "This is your last day!", - "demo.day.6": "You have passed your fifth day. Use %s to save a screenshot of your creation.", - "demo.day.warning": "Your time is almost up!", - "demo.demoExpired": "Demo time's up!", - "demo.help.buy": "Purchase Now!", - "demo.help.fullWrapped": "This demo will last 5 in-game days (about 1 hour and 40 minutes of real time). Check the advancements for hints! Have fun!", - "demo.help.inventory": "Use the %1$s key to open your inventory", - "demo.help.jump": "Jump by pressing the %1$s key", - "demo.help.later": "Continue Playing!", - "demo.help.movement": "Use the %1$s, %2$s, %3$s, %4$s keys and the mouse to move around", - "demo.help.movementMouse": "Look around using the mouse", - "demo.help.movementShort": "Move by pressing the %1$s, %2$s, %3$s, %4$s keys", - "demo.help.title": "Minecraft Demo Mode", - "demo.remainingTime": "Remaining time: %s", - "demo.reminder": "The demo time has expired. Buy the game to continue or start a new world!", - "difficulty.lock.question": "Are you sure you want to lock the difficulty of this world? This will set this world to always be %1$s, and you will never be able to change that again.", - "difficulty.lock.title": "Lock World Difficulty", - "disconnect.closed": "Connection closed", - "disconnect.disconnected": "Disconnected by Server", - "disconnect.endOfStream": "End of stream", - "disconnect.exceeded_packet_rate": "Kicked for exceeding packet rate limit", - "disconnect.genericReason": "%s", - "disconnect.ignoring_status_request": "Ignoring status request", - "disconnect.kicked": "Was kicked from the game", - "disconnect.loginFailed": "Failed to log in", - "disconnect.loginFailedInfo": "Failed to log in: %s", - "disconnect.loginFailedInfo.insufficientPrivileges": "Multiplayer is disabled. Please check your Microsoft account settings.", - "disconnect.loginFailedInfo.invalidSession": "Invalid session (Try restarting your game and the launcher)", - "disconnect.loginFailedInfo.serversUnavailable": "The authentication servers are currently not reachable. Please try again.", - "disconnect.loginFailedInfo.userBanned": "You are banned from playing online", - "disconnect.lost": "Connection Lost", - "disconnect.overflow": "Buffer overflow", - "disconnect.quitting": "Quitting", - "disconnect.spam": "Kicked for spamming", - "disconnect.timeout": "Timed out", - "disconnect.unknownHost": "Unknown host", - "download.pack.failed": "%s out of %s packs failed to download", - "download.pack.progress.bytes": "Progress: %s (total size unknown)", - "download.pack.progress.percent": "Progress: %s%%", - "download.pack.title": "Downloading resource pack %s/%s", - "editGamerule.default": "Default: %s", - "editGamerule.title": "Edit Game Rules", - "effect.duration.infinite": "∞", - "effect.minecraft.absorption": "Absorption", - "effect.minecraft.bad_omen": "Bad Omen", - "effect.minecraft.blindness": "Blindness", - "effect.minecraft.conduit_power": "Conduit Power", - "effect.minecraft.darkness": "Darkness", - "effect.minecraft.dolphins_grace": "Dolphin's Grace", - "effect.minecraft.fire_resistance": "Fire Resistance", - "effect.minecraft.glowing": "Glowing", - "effect.minecraft.haste": "Haste", - "effect.minecraft.health_boost": "Health Boost", - "effect.minecraft.hero_of_the_village": "Hero of the Village", - "effect.minecraft.hunger": "Hunger", - "effect.minecraft.instant_damage": "Instant Damage", - "effect.minecraft.instant_health": "Instant Health", - "effect.minecraft.invisibility": "Invisibility", - "effect.minecraft.jump_boost": "Jump Boost", - "effect.minecraft.levitation": "Levitation", - "effect.minecraft.luck": "Luck", - "effect.minecraft.mining_fatigue": "Mining Fatigue", - "effect.minecraft.nausea": "Nausea", - "effect.minecraft.night_vision": "Night Vision", - "effect.minecraft.poison": "Poison", - "effect.minecraft.regeneration": "Regeneration", - "effect.minecraft.resistance": "Resistance", - "effect.minecraft.saturation": "Saturation", - "effect.minecraft.slow_falling": "Slow Falling", - "effect.minecraft.slowness": "Slowness", - "effect.minecraft.speed": "Speed", - "effect.minecraft.strength": "Strength", - "effect.minecraft.unluck": "Bad Luck", - "effect.minecraft.water_breathing": "Water Breathing", - "effect.minecraft.weakness": "Weakness", - "effect.minecraft.wither": "Wither", - "effect.none": "No Effects", - "enchantment.level.1": "I", - "enchantment.level.2": "II", - "enchantment.level.3": "III", - "enchantment.level.4": "IV", - "enchantment.level.5": "V", - "enchantment.level.6": "VI", - "enchantment.level.7": "VII", - "enchantment.level.8": "VIII", - "enchantment.level.9": "IX", - "enchantment.level.10": "X", - "enchantment.minecraft.aqua_affinity": "Aqua Affinity", - "enchantment.minecraft.bane_of_arthropods": "Bane of Arthropods", - "enchantment.minecraft.binding_curse": "Curse of Binding", - "enchantment.minecraft.blast_protection": "Blast Protection", - "enchantment.minecraft.breach": "Breach", - "enchantment.minecraft.channeling": "Channeling", - "enchantment.minecraft.depth_strider": "Depth Strider", - "enchantment.minecraft.density": "Density", - "enchantment.minecraft.efficiency": "Efficiency", - "enchantment.minecraft.feather_falling": "Feather Falling", - "enchantment.minecraft.fire_aspect": "Fire Aspect", - "enchantment.minecraft.fire_protection": "Fire Protection", - "enchantment.minecraft.flame": "Flame", - "enchantment.minecraft.fortune": "Fortune", - "enchantment.minecraft.frost_walker": "Frost Walker", - "enchantment.minecraft.impaling": "Impaling", - "enchantment.minecraft.infinity": "Infinity", - "enchantment.minecraft.knockback": "Knockback", - "enchantment.minecraft.looting": "Looting", - "enchantment.minecraft.loyalty": "Loyalty", - "enchantment.minecraft.luck_of_the_sea": "Luck of the Sea", - "enchantment.minecraft.lunge": "Lunge", - "enchantment.minecraft.lure": "Lure", - "enchantment.minecraft.mending": "Mending", - "enchantment.minecraft.multishot": "Multishot", - "enchantment.minecraft.piercing": "Piercing", - "enchantment.minecraft.power": "Power", - "enchantment.minecraft.projectile_protection": "Projectile Protection", - "enchantment.minecraft.protection": "Protection", - "enchantment.minecraft.punch": "Punch", - "enchantment.minecraft.quick_charge": "Quick Charge", - "enchantment.minecraft.respiration": "Respiration", - "enchantment.minecraft.riptide": "Riptide", - "enchantment.minecraft.sharpness": "Sharpness", - "enchantment.minecraft.silk_touch": "Silk Touch", - "enchantment.minecraft.smite": "Smite", - "enchantment.minecraft.soul_speed": "Soul Speed", - "enchantment.minecraft.sweeping": "Sweeping Edge", - "enchantment.minecraft.swift_sneak": "Swift Sneak", - "enchantment.minecraft.thorns": "Thorns", - "enchantment.minecraft.unbreaking": "Unbreaking", - "enchantment.minecraft.vanishing_curse": "Curse of Vanishing", - "enchantment.minecraft.wind_burst": "Wind Burst", - "entity.minecraft.allay": "Allay", - "entity.minecraft.area_effect_cloud": "Area Effect Cloud", - "entity.minecraft.armor_stand": "Armor Stand", - "entity.minecraft.arrow": "Arrow", - "entity.minecraft.axolotl": "Axolotl", - "entity.minecraft.bat": "Bat", - "entity.minecraft.bee": "Bee", - "entity.minecraft.blaze": "Blaze", - "entity.minecraft.block_display": "Block Display", - "entity.minecraft.boat": "Boat", - "entity.minecraft.breeze": "Breeze", - "entity.minecraft.camel": "Camel", - "entity.minecraft.cat": "Cat", - "entity.minecraft.cave_spider": "Cave Spider", - "entity.minecraft.chest_boat": "Boat with Chest", - "entity.minecraft.chest_minecart": "Minecart with Chest", - "entity.minecraft.chicken": "Chicken", - "entity.minecraft.cod": "Cod", - "entity.minecraft.command_block_minecart": "Minecart with Command Block", - "entity.minecraft.cow": "Cow", - "entity.minecraft.creeper": "Creeper", - "entity.minecraft.dolphin": "Dolphin", - "entity.minecraft.donkey": "Donkey", - "entity.minecraft.dragon_fireball": "Dragon Fireball", - "entity.minecraft.drowned": "Drowned", - "entity.minecraft.egg": "Thrown Egg", - "entity.minecraft.elder_guardian": "Elder Guardian", - "entity.minecraft.end_crystal": "End Crystal", - "entity.minecraft.ender_dragon": "Ender Dragon", - "entity.minecraft.ender_pearl": "Thrown Ender Pearl", - "entity.minecraft.enderman": "Enderman", - "entity.minecraft.endermite": "Endermite", - "entity.minecraft.evoker": "Evoker", - "entity.minecraft.evoker_fangs": "Evoker Fangs", - "entity.minecraft.experience_bottle": "Thrown Bottle o' Enchanting", - "entity.minecraft.experience_orb": "Experience Orb", - "entity.minecraft.eye_of_ender": "Eye of Ender", - "entity.minecraft.falling_block": "Falling Block", - "entity.minecraft.falling_block_type": "Falling %s", - "entity.minecraft.fireball": "Fireball", - "entity.minecraft.firework_rocket": "Firework Rocket", - "entity.minecraft.fishing_bobber": "Fishing Bobber", - "entity.minecraft.fox": "Fox", - "entity.minecraft.frog": "Frog", - "entity.minecraft.furnace_minecart": "Minecart with Furnace", - "entity.minecraft.ghast": "Ghast", - "entity.minecraft.giant": "Giant", - "entity.minecraft.glow_item_frame": "Glow Item Frame", - "entity.minecraft.glow_squid": "Glow Squid", - "entity.minecraft.goat": "Goat", - "entity.minecraft.guardian": "Guardian", - "entity.minecraft.hoglin": "Hoglin", - "entity.minecraft.hopper_minecart": "Minecart with Hopper", - "entity.minecraft.horse": "Horse", - "entity.minecraft.husk": "Husk", - "entity.minecraft.illusioner": "Illusioner", - "entity.minecraft.interaction": "Interaction", - "entity.minecraft.iron_golem": "Iron Golem", - "entity.minecraft.item": "Item", - "entity.minecraft.item_display": "Item Display", - "entity.minecraft.item_frame": "Item Frame", - "entity.minecraft.killer_bunny": "The Killer Bunny", - "entity.minecraft.leash_knot": "Leash Knot", - "entity.minecraft.lightning_bolt": "Lightning Bolt", - "entity.minecraft.llama": "Llama", - "entity.minecraft.llama_spit": "Llama Spit", - "entity.minecraft.magma_cube": "Magma Cube", - "entity.minecraft.marker": "Marker", - "entity.minecraft.minecart": "Minecart", - "entity.minecraft.mooshroom": "Mooshroom", - "entity.minecraft.mule": "Mule", - "entity.minecraft.ocelot": "Ocelot", - "entity.minecraft.painting": "Painting", - "entity.minecraft.panda": "Panda", - "entity.minecraft.parrot": "Parrot", - "entity.minecraft.phantom": "Phantom", - "entity.minecraft.pig": "Pig", - "entity.minecraft.piglin": "Piglin", - "entity.minecraft.piglin_brute": "Piglin Brute", - "entity.minecraft.pillager": "Pillager", - "entity.minecraft.player": "Player", - "entity.minecraft.polar_bear": "Polar Bear", - "entity.minecraft.potion": "Potion", - "entity.minecraft.pufferfish": "Pufferfish", - "entity.minecraft.rabbit": "Rabbit", - "entity.minecraft.ravager": "Ravager", - "entity.minecraft.salmon": "Salmon", - "entity.minecraft.sheep": "Sheep", - "entity.minecraft.shulker": "Shulker", - "entity.minecraft.shulker_bullet": "Shulker Bullet", - "entity.minecraft.silverfish": "Silverfish", - "entity.minecraft.skeleton": "Skeleton", - "entity.minecraft.skeleton_horse": "Skeleton Horse", - "entity.minecraft.slime": "Slime", - "entity.minecraft.small_fireball": "Small Fireball", - "entity.minecraft.sniffer": "Sniffer", - "entity.minecraft.snow_golem": "Snow Golem", - "entity.minecraft.snowball": "Snowball", - "entity.minecraft.spawner_minecart": "Minecart with Monster Spawner", - "entity.minecraft.spectral_arrow": "Spectral Arrow", - "entity.minecraft.spider": "Spider", - "entity.minecraft.squid": "Squid", - "entity.minecraft.stray": "Stray", - "entity.minecraft.strider": "Strider", - "entity.minecraft.tadpole": "Tadpole", - "entity.minecraft.text_display": "Text Display", - "entity.minecraft.tnt": "Primed TNT", - "entity.minecraft.tnt_minecart": "Minecart with TNT", - "entity.minecraft.trader_llama": "Trader Llama", - "entity.minecraft.trident": "Trident", - "entity.minecraft.tropical_fish": "Tropical Fish", - "entity.minecraft.tropical_fish.predefined.0": "Anemone", - "entity.minecraft.tropical_fish.predefined.1": "Black Tang", - "entity.minecraft.tropical_fish.predefined.2": "Blue Tang", - "entity.minecraft.tropical_fish.predefined.3": "Butterflyfish", - "entity.minecraft.tropical_fish.predefined.4": "Cichlid", - "entity.minecraft.tropical_fish.predefined.5": "Clownfish", - "entity.minecraft.tropical_fish.predefined.6": "Cotton Candy Betta", - "entity.minecraft.tropical_fish.predefined.7": "Dottyback", - "entity.minecraft.tropical_fish.predefined.8": "Emperor Red Snapper", - "entity.minecraft.tropical_fish.predefined.9": "Goatfish", - "entity.minecraft.tropical_fish.predefined.10": "Moorish Idol", - "entity.minecraft.tropical_fish.predefined.11": "Ornate Butterflyfish", - "entity.minecraft.tropical_fish.predefined.12": "Parrotfish", - "entity.minecraft.tropical_fish.predefined.13": "Queen Angelfish", - "entity.minecraft.tropical_fish.predefined.14": "Red Cichlid", - "entity.minecraft.tropical_fish.predefined.15": "Red Lipped Blenny", - "entity.minecraft.tropical_fish.predefined.16": "Red Snapper", - "entity.minecraft.tropical_fish.predefined.17": "Threadfin", - "entity.minecraft.tropical_fish.predefined.18": "Tomato Clownfish", - "entity.minecraft.tropical_fish.predefined.19": "Triggerfish", - "entity.minecraft.tropical_fish.predefined.20": "Yellowtail Parrotfish", - "entity.minecraft.tropical_fish.predefined.21": "Yellow Tang", - "entity.minecraft.tropical_fish.type.betty": "Betty", - "entity.minecraft.tropical_fish.type.blockfish": "Blockfish", - "entity.minecraft.tropical_fish.type.brinely": "Brinely", - "entity.minecraft.tropical_fish.type.clayfish": "Clayfish", - "entity.minecraft.tropical_fish.type.dasher": "Dasher", - "entity.minecraft.tropical_fish.type.flopper": "Flopper", - "entity.minecraft.tropical_fish.type.glitter": "Glitter", - "entity.minecraft.tropical_fish.type.kob": "Kob", - "entity.minecraft.tropical_fish.type.snooper": "Snooper", - "entity.minecraft.tropical_fish.type.spotty": "Spotty", - "entity.minecraft.tropical_fish.type.stripey": "Stripey", - "entity.minecraft.tropical_fish.type.sunstreak": "Sunstreak", - "entity.minecraft.turtle": "Turtle", - "entity.minecraft.vex": "Vex", - "entity.minecraft.villager": "Villager", - "entity.minecraft.villager.armorer": "Armorer", - "entity.minecraft.villager.butcher": "Butcher", - "entity.minecraft.villager.cartographer": "Cartographer", - "entity.minecraft.villager.cleric": "Cleric", - "entity.minecraft.villager.farmer": "Farmer", - "entity.minecraft.villager.fisherman": "Fisherman", - "entity.minecraft.villager.fletcher": "Fletcher", - "entity.minecraft.villager.leatherworker": "Leatherworker", - "entity.minecraft.villager.librarian": "Librarian", - "entity.minecraft.villager.mason": "Mason", - "entity.minecraft.villager.nitwit": "Nitwit", - "entity.minecraft.villager.none": "Villager", - "entity.minecraft.villager.shepherd": "Shepherd", - "entity.minecraft.villager.toolsmith": "Toolsmith", - "entity.minecraft.villager.weaponsmith": "Weaponsmith", - "entity.minecraft.vindicator": "Vindicator", - "entity.minecraft.wandering_trader": "Wandering Trader", - "entity.minecraft.warden": "Warden", - "entity.minecraft.wind_charge": "Wind Charge", - "entity.minecraft.witch": "Witch", - "entity.minecraft.wither": "Wither", - "entity.minecraft.wither_skeleton": "Wither Skeleton", - "entity.minecraft.wither_skull": "Wither Skull", - "entity.minecraft.wolf": "Wolf", - "entity.minecraft.zoglin": "Zoglin", - "entity.minecraft.zombie": "Zombie", - "entity.minecraft.zombie_horse": "Zombie Horse", - "entity.minecraft.zombie_villager": "Zombie Villager", - "entity.minecraft.zombified_piglin": "Zombified Piglin", - "entity.not_summonable": "Can't summon entity of type %s", - "event.minecraft.raid": "Raid", - "event.minecraft.raid.defeat": "Defeat", - "event.minecraft.raid.defeat.full": "Raid - Defeat", - "event.minecraft.raid.raiders_remaining": "Raiders Remaining: %s", - "event.minecraft.raid.victory": "Victory", - "event.minecraft.raid.victory.full": "Raid - Victory", - "filled_map.buried_treasure": "Buried Treasure Map", - "filled_map.explorer_jungle": "Jungle Explorer Map", - "filled_map.explorer_swamp": "Swamp Explorer Map", - "filled_map.id": "Id #%s", - "filled_map.level": "(Level %s/%s)", - "filled_map.locked": "Locked", - "filled_map.mansion": "Woodland Explorer Map", - "filled_map.monument": "Ocean Explorer Map", - "filled_map.scale": "Scaling at 1:%s", - "filled_map.unknown": "Unknown Map", - "filled_map.village_desert": "Desert Village Map", - "filled_map.village_plains": "Plains Village Map", - "filled_map.village_savanna": "Savanna Village Map", - "filled_map.village_snowy": "Snowy Village Map", - "filled_map.village_taiga": "Taiga Village Map", - "flat_world_preset.minecraft.bottomless_pit": "Bottomless Pit", - "flat_world_preset.minecraft.classic_flat": "Classic Flat", - "flat_world_preset.minecraft.desert": "Desert", - "flat_world_preset.minecraft.overworld": "Overworld", - "flat_world_preset.minecraft.redstone_ready": "Redstone Ready", - "flat_world_preset.minecraft.snowy_kingdom": "Snowy Kingdom", - "flat_world_preset.minecraft.the_void": "The Void", - "flat_world_preset.minecraft.tunnelers_dream": "Tunnelers' Dream", - "flat_world_preset.minecraft.water_world": "Water World", - "flat_world_preset.unknown": "???", - "gameMode.adventure": "Adventure Mode", - "gameMode.changed": "Your game mode has been updated to %s", - "gameMode.creative": "Creative Mode", - "gameMode.hardcore": "Hardcore Mode!", - "gameMode.spectator": "Spectator Mode", - "gameMode.survival": "Survival Mode", - "gamerule.announceAdvancements": "Announce advancements", - "gamerule.blockExplosionDropDecay": "In block interaction explosions, some blocks won't drop their loot", - "gamerule.blockExplosionDropDecay.description": "Some of the drops from blocks destroyed by explosions caused by block interactions are lost in the explosion.", - "gamerule.category.chat": "Chat", - "gamerule.category.drops": "Drops", - "gamerule.category.misc": "Miscellaneous", - "gamerule.category.mobs": "Mobs", - "gamerule.category.player": "Player", - "gamerule.category.spawning": "Spawning", - "gamerule.category.updates": "World Updates", - "gamerule.commandBlockOutput": "Broadcast command block output", - "gamerule.commandModificationBlockLimit": "Command modification block limit", - "gamerule.commandModificationBlockLimit.description": "Number of blocks that can be changed at once by one command, such as fill or clone.", - "gamerule.disableElytraMovementCheck": "Disable elytra movement check", - "gamerule.disableRaids": "Disable raids", - "gamerule.doDaylightCycle": "Advance time of day", - "gamerule.doEntityDrops": "Drop entity equipment", - "gamerule.doEntityDrops.description": "Controls drops from minecarts (including inventories), item frames, boats, etc.", - "gamerule.doFireTick": "Update fire", - "gamerule.doImmediateRespawn": "Respawn immediately", - "gamerule.doInsomnia": "Spawn phantoms", - "gamerule.doLimitedCrafting": "Require recipe for crafting", - "gamerule.doLimitedCrafting.description": "If enabled, players will be able to craft only unlocked recipes.", - "gamerule.doMobLoot": "Drop mob loot", - "gamerule.doMobLoot.description": "Controls resource drops from mobs, including experience orbs.", - "gamerule.doMobSpawning": "Spawn mobs", - "gamerule.doMobSpawning.description": "Some entities might have separate rules.", - "gamerule.doPatrolSpawning": "Spawn pillager patrols", - "gamerule.doTileDrops": "Drop blocks", - "gamerule.doTileDrops.description": "Controls resource drops from blocks, including experience orbs.", - "gamerule.doTraderSpawning": "Spawn Wandering Traders", - "gamerule.doVinesSpread": "Vines spread", - "gamerule.doVinesSpread.description": "Controls whether or not the Vines block spreads randomly to adjacent blocks. Does not affect other type of vine blocks such as Weeping Vines, Twisting Vines, etc.", - "gamerule.doWardenSpawning": "Spawn Wardens", - "gamerule.doWeatherCycle": "Update weather", - "gamerule.drowningDamage": "Deal drowning damage", - "gamerule.enderPearlsVanishOnDeath": "Thrown ender pearls vanish on death", - "gamerule.enderPearlsVanishOnDeath.description": "Whether ender pearls thrown by a player vanish when that player dies.", - "gamerule.fallDamage": "Deal fall damage", - "gamerule.fireDamage": "Deal fire damage", - "gamerule.forgiveDeadPlayers": "Forgive dead players", - "gamerule.forgiveDeadPlayers.description": "Angered neutral mobs stop being angry when the targeted player dies nearby.", - "gamerule.freezeDamage": "Deal freeze damage", - "gamerule.globalSoundEvents": "Global sound events", - "gamerule.globalSoundEvents.description": "When certain game events happen, like a boss spawning, the sound is heard everywhere.", - "gamerule.keepInventory": "Keep inventory after death", - "gamerule.lavaSourceConversion": "Lava converts to source", - "gamerule.lavaSourceConversion.description": "When flowing lava is surrounded on two sides by lava sources it converts into a source.", - "gamerule.logAdminCommands": "Broadcast admin commands", - "gamerule.maxCommandChainLength": "Command chain size limit", - "gamerule.maxCommandChainLength.description": "Applies to command block chains and functions.", - "gamerule.maxCommandForkCount": "Command context limit", - "gamerule.maxCommandForkCount.description": "Maximum number of contexts that can be used by commands like 'execute as'.", - "gamerule.maxEntityCramming": "Entity cramming threshold", - "gamerule.mobExplosionDropDecay": "In mob explosions, some blocks won't drop their loot", - "gamerule.mobExplosionDropDecay.description": "Some of the drops from blocks destroyed by explosions caused by mobs are lost in the explosion.", - "gamerule.mobGriefing": "Allow destructive mob actions", - "gamerule.naturalRegeneration": "Regenerate health", - "gamerule.playersNetherPortalCreativeDelay": "Player's Nether portal delay in creative mode", - "gamerule.playersNetherPortalCreativeDelay.description": "Time (in ticks) that a creative mode player needs to stand in a Nether portal before changing dimensions.", - "gamerule.playersNetherPortalDefaultDelay": "Player's Nether portal delay in non-creative mode", - "gamerule.playersNetherPortalDefaultDelay.description": "Time (in ticks) that a non-creative mode player needs to stand in a Nether portal before changing dimensions.", - "gamerule.playersSleepingPercentage": "Sleep percentage", - "gamerule.playersSleepingPercentage.description": "The percentage of players who must be sleeping to skip the night.", - "gamerule.projectilesCanBreakBlocks": "Projectiles can break blocks", - "gamerule.projectilesCanBreakBlocks.description": "Controls whether impact projectiles will destroy blocks that are destructible by them.", - "gamerule.randomTickSpeed": "Random tick speed rate", - "gamerule.reducedDebugInfo": "Reduce debug info", - "gamerule.reducedDebugInfo.description": "Limits contents of debug screen.", - "gamerule.sendCommandFeedback": "Send command feedback", - "gamerule.showDeathMessages": "Show death messages", - "gamerule.snowAccumulationHeight": "Snow accumulation height", - "gamerule.snowAccumulationHeight.description": "When it snows, layers of snow form on the ground up to at most this number of layers.", - "gamerule.spawnRadius": "Respawn location radius", - "gamerule.spectatorsGenerateChunks": "Allow spectators to generate terrain", - "gamerule.tntExplosionDropDecay": "In TNT explosions, some blocks won't drop their loot", - "gamerule.tntExplosionDropDecay.description": "Some of the drops from blocks destroyed by explosions caused by TNT are lost in the explosion.", - "gamerule.universalAnger": "Universal anger", - "gamerule.universalAnger.description": "Angered neutral mobs attack any nearby player, not just the player that angered them. Works best if forgiveDeadPlayers is disabled.", - "gamerule.waterSourceConversion": "Water converts to source", - "gamerule.waterSourceConversion.description": "When flowing water is surrounded on two sides by water sources it converts into a source.", - "generator.custom": "Custom", - "generator.customized": "Old Customized", - "generator.minecraft.amplified": "AMPLIFIED", - "generator.minecraft.amplified.info": "Notice: Just for fun! Requires a beefy computer.", - "generator.minecraft.debug_all_block_states": "Debug Mode", - "generator.minecraft.flat": "Superflat", - "generator.minecraft.large_biomes": "Large Biomes", - "generator.minecraft.normal": "Default", - "generator.minecraft.single_biome_surface": "Single Biome", - "generator.single_biome_caves": "Caves", - "generator.single_biome_floating_islands": "Floating Islands", - "gui.abuseReport.comments": "Comments", - "gui.abuseReport.describe": "Sharing details will help us make a well-informed decision.", - "gui.abuseReport.discard.content": "If you leave, you'll lose this report and your comments.\nAre you sure you want to leave?", - "gui.abuseReport.discard.discard": "Leave and Discard Report", - "gui.abuseReport.discard.draft": "Save as Draft", - "gui.abuseReport.discard.return": "Continue Editing", - "gui.abuseReport.discard.title": "Discard report and comments?", - "gui.abuseReport.draft.content": "Would you like to continue editing the existing report or discard it and create a new one?", - "gui.abuseReport.draft.discard": "Discard", - "gui.abuseReport.draft.edit": "Continue Editing", - "gui.abuseReport.draft.quittotitle.content": "Would you like to continue editing it or discard it?", - "gui.abuseReport.draft.quittotitle.title": "You have a draft chat report that will be lost if you quit", - "gui.abuseReport.draft.title": "Edit draft chat report?", - "gui.abuseReport.error.title": "Problem sending your report", - "gui.abuseReport.message": "Where did you observe the bad behavior?\nThis will help us in researching your case.", - "gui.abuseReport.more_comments": "Please describe what happened:", - "gui.abuseReport.name.reporting": "You are reporting \"%s\".", - "gui.abuseReport.name.title": "Report Player Name", - "gui.abuseReport.observed_what": "Why are you reporting this?", - "gui.abuseReport.read_info": "Learn About Reporting", - "gui.abuseReport.reason.alcohol_tobacco_drugs": "Drugs or alcohol", - "gui.abuseReport.reason.alcohol_tobacco_drugs.description": "Someone is encouraging others to partake in illegal drug related activities or encouraging underage drinking.", - "gui.abuseReport.reason.child_sexual_exploitation_or_abuse": "Child sexual exploitation or abuse", - "gui.abuseReport.reason.child_sexual_exploitation_or_abuse.description": "Someone is talking about or otherwise promoting indecent behavior involving children.", - "gui.abuseReport.reason.defamation_impersonation_false_information": "Defamation", - "gui.abuseReport.reason.defamation_impersonation_false_information.description": "Someone is damaging your or someone else's reputation, for example sharing false information with the aim to exploit or mislead others.", - "gui.abuseReport.reason.description": "Description:", - "gui.abuseReport.reason.false_reporting": "False Reporting", - "gui.abuseReport.reason.generic": "I want to report them", - "gui.abuseReport.reason.generic.description": "I'm annoyed with them / they have done something I do not like.", - "gui.abuseReport.reason.harassment_or_bullying": "Harassment or bullying", - "gui.abuseReport.reason.harassment_or_bullying.description": "Someone is shaming, attacking, or bullying you or someone else. This includes when someone is repeatedly trying to contact you or someone else without consent or posting private personal information about you or someone else without consent (\"doxing\").", - "gui.abuseReport.reason.hate_speech": "Hate speech", - "gui.abuseReport.reason.hate_speech.description": "Someone is attacking you or another player based on characteristics of their identity, like religion, race, or sexuality.", - "gui.abuseReport.reason.imminent_harm": "Threat of harm to others", - "gui.abuseReport.reason.imminent_harm.description": "Someone is threatening to harm you or someone else in real life.", - "gui.abuseReport.reason.narration": "%s: %s", - "gui.abuseReport.reason.non_consensual_intimate_imagery": "Non-consensual intimate imagery", - "gui.abuseReport.reason.non_consensual_intimate_imagery.description": "Someone is talking about, sharing, or otherwise promoting private and intimate images.", - "gui.abuseReport.reason.self_harm_or_suicide": "Self-harm or suicide", - "gui.abuseReport.reason.self_harm_or_suicide.description": "Someone is threatening to harm themselves in real life or talking about harming themselves in real life.", - "gui.abuseReport.reason.terrorism_or_violent_extremism": "Terrorism or violent extremism", - "gui.abuseReport.reason.terrorism_or_violent_extremism.description": "Someone is talking about, promoting, or threatening to commit acts of terrorism or violent extremism for political, religious, ideological, or other reasons.", - "gui.abuseReport.reason.title": "Select Report Category", - "gui.abuseReport.report_sent_msg": "We’ve successfully received your report. Thank you!\n\nOur team will review it as soon as possible.", - "gui.abuseReport.select_reason": "Select Report Category", - "gui.abuseReport.send": "Send Report", - "gui.abuseReport.send.comment_too_long": "Please shorten the comment", - "gui.abuseReport.send.error_message": "An error was returned while sending your report:\n'%s'", - "gui.abuseReport.send.generic_error": "Encountered an unexpected error while sending your report.", - "gui.abuseReport.send.http_error": "An unexpected HTTP error occurred while sending your report.", - "gui.abuseReport.send.json_error": "Encountered malformed payload while sending your report.", - "gui.abuseReport.send.no_reason": "Please select a report category", - "gui.abuseReport.send.service_unavailable": "Unable to reach the Abuse Reporting service. Please make sure you are connected to the internet and try again.", - "gui.abuseReport.sending.title": "Sending your report...", - "gui.abuseReport.sent.title": "Report sent", - "gui.abuseReport.skin.title": "Report Player Skin", - "gui.abuseReport.title": "Report Player", - "gui.abuseReport.type.chat": "Chat Messages", - "gui.abuseReport.type.name": "Player Name", - "gui.abuseReport.type.skin": "Player Skin", - "gui.acknowledge": "Acknowledge", - "gui.advancements": "Advancements", - "gui.all": "All", - "gui.back": "Back", - "gui.banned.description": "%s\n\n%s\n\nLearn more at the following link: %s", - "gui.banned.description.permanent": "Your account is permanently banned, which means you can’t play online or join Realms.", - "gui.banned.description.reason": "We recently received a report for bad behavior by your account. Our moderators have now reviewed your case and identified it as %s, which goes against the Minecraft Community Standards.", - "gui.banned.description.reason_id": "Code: %s", - "gui.banned.description.reason_id_message": "Code: %s - %s", - "gui.banned.description.temporary": "%s Until then, you can’t play online or join Realms.", - "gui.banned.description.temporary.duration": "Your account is temporarily suspended and will be reactivated in %s.", - "gui.banned.description.unknownreason": "We recently received a report for bad behavior by your account. Our moderators have now reviewed your case and identified that it goes against the Minecraft Community Standards.", - "gui.banned.name.description": "Your current name - \"%s\" - violates our Community Standards. You can play singleplayer, but will need to change your name to play online.\n\nLearn more or submit a case review at the following link: %s", - "gui.banned.name.title": "Name Not Allowed in Multiplayer", - "gui.banned.reason.defamation_impersonation_false_information": "Impersonation or sharing information to exploit or mislead others", - "gui.banned.reason.drugs": "References to illegal drugs", - "gui.banned.reason.extreme_violence_or_gore": "Depictions of real-life excessive violence or gore", - "gui.banned.reason.false_reporting": "Excessive false or inaccurate reports", - "gui.banned.reason.fraud": "Fraudulent acquisition or use of content", - "gui.banned.reason.generic_violation": "Violating Community Standards", - "gui.banned.reason.harassment_or_bullying": "Abusive language used in a directed, harmful manner", - "gui.banned.reason.hate_speech": "Hate speech or discrimination", - "gui.banned.reason.hate_terrorism_notorious_figure": "References to hate groups, terrorist organizations, or notorious figures", - "gui.banned.reason.imminent_harm_to_person_or_property": "Intent to cause real-life harm to persons or property", - "gui.banned.reason.nudity_or_pornography": "Displaying lewd or pornographic material", - "gui.banned.reason.sexually_inappropriate": "Topics or content of a sexual nature", - "gui.banned.reason.spam_or_advertising": "Spam or advertising", - "gui.banned.skin.description": "Your current skin violates our Community Standards. You can still play with a default skin, or select a new one.\n\nLearn more or submit a case review at the following link: %s", - "gui.banned.skin.title": "Skin Not Allowed", - "gui.banned.title.permanent": "Account permanently banned", - "gui.banned.title.temporary": "Account temporarily suspended", - "gui.cancel": "Cancel", - "gui.chatReport.comments": "Comments", - "gui.chatReport.describe": "Sharing details will help us make a well-informed decision.", - "gui.chatReport.discard.content": "If you leave, you'll lose this report and your comments.\nAre you sure you want to leave?", - "gui.chatReport.discard.discard": "Leave and Discard Report", - "gui.chatReport.discard.draft": "Save as Draft", - "gui.chatReport.discard.return": "Continue Editing", - "gui.chatReport.discard.title": "Discard report and comments?", - "gui.chatReport.draft.content": "Would you like to continue editing the existing report or discard it and create a new one?", - "gui.chatReport.draft.discard": "Discard", - "gui.chatReport.draft.edit": "Continue Editing", - "gui.chatReport.draft.quittotitle.content": "Would you like to continue editing it or discard it?", - "gui.chatReport.draft.quittotitle.title": "You have a draft chat report that will be lost if you quit", - "gui.chatReport.draft.title": "Edit draft chat report?", - "gui.chatReport.more_comments": "Please describe what happened:", - "gui.chatReport.observed_what": "Why are you reporting this?", - "gui.chatReport.read_info": "Learn About Reporting", - "gui.chatReport.report_sent_msg": "We’ve successfully received your report. Thank you!\n\nOur team will review it as soon as possible.", - "gui.chatReport.select_chat": "Select Chat Messages to Report", - "gui.chatReport.select_reason": "Select Report Category", - "gui.chatReport.selected_chat": "%s Chat Message(s) Selected to Report", - "gui.chatReport.send": "Send Report", - "gui.chatReport.send.comments_too_long": "Please shorten the comment", - "gui.chatReport.send.no_reason": "Please select a report category", - "gui.chatReport.send.no_reported_messages": "Please select at least one chat message to report", - "gui.chatReport.send.too_many_messages": "Trying to include too many messages in the report", - "gui.chatReport.title": "Report Player Chat", - "gui.chatSelection.context": "Messages surrounding this selection will be included to provide additional context", - "gui.chatSelection.fold": "%s message(s) hidden", - "gui.chatSelection.heading": "%s %s", - "gui.chatSelection.join": "%s joined the chat", - "gui.chatSelection.message.narrate": "%s said: %s at %s", - "gui.chatSelection.selected": "%s/%s message(s) selected", - "gui.chatSelection.title": "Select Chat Messages to Report", - "gui.continue": "Continue", - "gui.copy_link_to_clipboard": "Copy Link to Clipboard", - "gui.days": "%s day(s)", - "gui.done": "Done", - "gui.down": "Down", - "gui.entity_tooltip.type": "Type: %s", - "gui.hours": "%s hour(s)", - "gui.loadingMinecraft": "Loading Minecraft", - "gui.minutes": "%s minute(s)", - "gui.multiLineEditBox.character_limit": "%s/%s", - "gui.narrate.button": "%s button", - "gui.narrate.editBox": "%s edit box: %s", - "gui.narrate.slider": "%s slider", - "gui.narrate.tab": "%s tab", - "gui.no": "No", - "gui.none": "None", - "gui.ok": "Ok", - "gui.proceed": "Proceed", - "gui.recipebook.moreRecipes": "Right Click for More", - "gui.recipebook.page": "%s/%s", - "gui.recipebook.search_hint": "Search...", - "gui.recipebook.toggleRecipes.all": "Showing All", - "gui.recipebook.toggleRecipes.blastable": "Showing Blastable", - "gui.recipebook.toggleRecipes.craftable": "Showing Craftable", - "gui.recipebook.toggleRecipes.smeltable": "Showing Smeltable", - "gui.recipebook.toggleRecipes.smokable": "Showing Smokable", - "gui.socialInteractions.blocking_hint": "Manage with Microsoft account", - "gui.socialInteractions.empty_blocked": "No blocked players in chat", - "gui.socialInteractions.empty_hidden": "No players hidden in chat", - "gui.socialInteractions.hidden_in_chat": "Chat messages from %s will be hidden", - "gui.socialInteractions.hide": "Hide in Chat", - "gui.socialInteractions.narration.hide": "Hide messages from %s", - "gui.socialInteractions.narration.report": "Report player %s", - "gui.socialInteractions.narration.show": "Show messages from %s", - "gui.socialInteractions.report": "Report", - "gui.socialInteractions.search_empty": "Couldn't find any players with that name", - "gui.socialInteractions.search_hint": "Search...", - "gui.socialInteractions.server_label.multiple": "%s - %s players", - "gui.socialInteractions.server_label.single": "%s - %s player", - "gui.socialInteractions.show": "Show in Chat", - "gui.socialInteractions.shown_in_chat": "Chat messages from %s will be shown", - "gui.socialInteractions.status_blocked": "Blocked", - "gui.socialInteractions.status_blocked_offline": "Blocked - Offline", - "gui.socialInteractions.status_hidden": "Hidden", - "gui.socialInteractions.status_hidden_offline": "Hidden - Offline", - "gui.socialInteractions.status_offline": "Offline", - "gui.socialInteractions.tab_all": "All", - "gui.socialInteractions.tab_blocked": "Blocked", - "gui.socialInteractions.tab_hidden": "Hidden", - "gui.socialInteractions.title": "Social Interactions", - "gui.socialInteractions.tooltip.hide": "Hide messages", - "gui.socialInteractions.tooltip.report": "Report player", - "gui.socialInteractions.tooltip.report.disabled": "The reporting service is unavailable", - "gui.socialInteractions.tooltip.report.no_messages": "No reportable messages from player %s", - "gui.socialInteractions.tooltip.report.not_reportable": "This player can't be reported, because their chat messages can't be verified on this server", - "gui.socialInteractions.tooltip.show": "Show messages", - "gui.stats": "Statistics", - "gui.togglable_slot": "Click to disable slot", - "gui.toMenu": "Back to Server List", - "gui.toRealms": "Back to Realms List", - "gui.toTitle": "Back to Title Screen", - "gui.toWorld": "Back to World List", - "gui.up": "Up", - "gui.yes": "Yes", - "hanging_sign.edit": "Edit Hanging Sign Message", - "instrument.minecraft.admire_goat_horn": "Admire", - "instrument.minecraft.call_goat_horn": "Call", - "instrument.minecraft.dream_goat_horn": "Dream", - "instrument.minecraft.feel_goat_horn": "Feel", - "instrument.minecraft.ponder_goat_horn": "Ponder", - "instrument.minecraft.seek_goat_horn": "Seek", - "instrument.minecraft.sing_goat_horn": "Sing", - "instrument.minecraft.yearn_goat_horn": "Yearn", - "inventory.binSlot": "Destroy Item", - "inventory.hotbarInfo": "Save hotbar with %1$s+%2$s", - "inventory.hotbarSaved": "Item hotbar saved (restore with %1$s+%2$s)", - "item_modifier.unknown": "Unknown item modifier: %s", - "item.canBreak": "Can break:", - "item.canPlace": "Can be placed on:", - "item.color": "Color: %s", - "item.disabled": "Disabled item", - "item.durability": "Durability: %s / %s", - "item.dyed": "Dyed", - "item.minecraft.acacia_boat": "Acacia Boat", - "item.minecraft.acacia_chest_boat": "Acacia Boat with Chest", - "item.minecraft.allay_spawn_egg": "Allay Spawn Egg", - "item.minecraft.amethyst_shard": "Amethyst Shard", - "item.minecraft.angler_pottery_shard": "Angler Pottery Shard", - "item.minecraft.angler_pottery_sherd": "Angler Pottery Sherd", - "item.minecraft.apple": "Apple", - "item.minecraft.archer_pottery_shard": "Archer Pottery Shard", - "item.minecraft.archer_pottery_sherd": "Archer Pottery Sherd", - "item.minecraft.armor_stand": "Armor Stand", - "item.minecraft.arms_up_pottery_shard": "Arms Up Pottery Shard", - "item.minecraft.arms_up_pottery_sherd": "Arms Up Pottery Sherd", - "item.minecraft.arrow": "Arrow", - "item.minecraft.axolotl_bucket": "Bucket of Axolotl", - "item.minecraft.axolotl_spawn_egg": "Axolotl Spawn Egg", - "item.minecraft.baked_potato": "Baked Potato", - "item.minecraft.bamboo_chest_raft": "Bamboo Raft with Chest", - "item.minecraft.bamboo_raft": "Bamboo Raft", - "item.minecraft.bat_spawn_egg": "Bat Spawn Egg", - "item.minecraft.bee_spawn_egg": "Bee Spawn Egg", - "item.minecraft.beef": "Raw Beef", - "item.minecraft.beetroot": "Beetroot", - "item.minecraft.beetroot_seeds": "Beetroot Seeds", - "item.minecraft.beetroot_soup": "Beetroot Soup", - "item.minecraft.birch_boat": "Birch Boat", - "item.minecraft.birch_chest_boat": "Birch Boat with Chest", - "item.minecraft.black_dye": "Black Dye", - "item.minecraft.blade_pottery_shard": "Blade Pottery Shard", - "item.minecraft.blade_pottery_sherd": "Blade Pottery Sherd", - "item.minecraft.blaze_powder": "Blaze Powder", - "item.minecraft.blaze_rod": "Blaze Rod", - "item.minecraft.blaze_spawn_egg": "Blaze Spawn Egg", - "item.minecraft.blue_dye": "Blue Dye", - "item.minecraft.bone": "Bone", - "item.minecraft.bone_meal": "Bone Meal", - "item.minecraft.book": "Book", - "item.minecraft.bow": "Bow", - "item.minecraft.bowl": "Bowl", - "item.minecraft.bread": "Bread", - "item.minecraft.breeze_spawn_egg": "Breeze Spawn Egg", - "item.minecraft.brewer_pottery_shard": "Brewer Pottery Shard", - "item.minecraft.brewer_pottery_sherd": "Brewer Pottery Sherd", - "item.minecraft.brewing_stand": "Brewing Stand", - "item.minecraft.brick": "Brick", - "item.minecraft.brown_dye": "Brown Dye", - "item.minecraft.brush": "Brush", - "item.minecraft.bucket": "Bucket", - "item.minecraft.bundle": "Bundle", - "item.minecraft.bundle.fullness": "%s/%s", - "item.minecraft.burn_pottery_shard": "Burn Pottery Shard", - "item.minecraft.burn_pottery_sherd": "Burn Pottery Sherd", - "item.minecraft.camel_spawn_egg": "Camel Spawn Egg", - "item.minecraft.carrot": "Carrot", - "item.minecraft.carrot_on_a_stick": "Carrot on a Stick", - "item.minecraft.cat_spawn_egg": "Cat Spawn Egg", - "item.minecraft.cauldron": "Cauldron", - "item.minecraft.cave_spider_spawn_egg": "Cave Spider Spawn Egg", - "item.minecraft.chainmail_boots": "Chainmail Boots", - "item.minecraft.chainmail_chestplate": "Chainmail Chestplate", - "item.minecraft.chainmail_helmet": "Chainmail Helmet", - "item.minecraft.chainmail_leggings": "Chainmail Leggings", - "item.minecraft.charcoal": "Charcoal", - "item.minecraft.cherry_boat": "Cherry Boat", - "item.minecraft.cherry_chest_boat": "Cherry Boat with Chest", - "item.minecraft.chest_minecart": "Minecart with Chest", - "item.minecraft.chicken": "Raw Chicken", - "item.minecraft.chicken_spawn_egg": "Chicken Spawn Egg", - "item.minecraft.chorus_fruit": "Chorus Fruit", - "item.minecraft.clay_ball": "Clay Ball", - "item.minecraft.clock": "Clock", - "item.minecraft.coal": "Coal", - "item.minecraft.coast_armor_trim_smithing_template": "Smithing Template", - "item.minecraft.cocoa_beans": "Cocoa Beans", - "item.minecraft.cod": "Raw Cod", - "item.minecraft.cod_bucket": "Bucket of Cod", - "item.minecraft.cod_spawn_egg": "Cod Spawn Egg", - "item.minecraft.command_block_minecart": "Minecart with Command Block", - "item.minecraft.compass": "Compass", - "item.minecraft.cooked_beef": "Steak", - "item.minecraft.cooked_chicken": "Cooked Chicken", - "item.minecraft.cooked_cod": "Cooked Cod", - "item.minecraft.cooked_mutton": "Cooked Mutton", - "item.minecraft.cooked_porkchop": "Cooked Porkchop", - "item.minecraft.cooked_rabbit": "Cooked Rabbit", - "item.minecraft.cooked_salmon": "Cooked Salmon", - "item.minecraft.cookie": "Cookie", - "item.minecraft.copper_ingot": "Copper Ingot", - "item.minecraft.cow_spawn_egg": "Cow Spawn Egg", - "item.minecraft.creeper_banner_pattern": "Banner Pattern", - "item.minecraft.creeper_banner_pattern.desc": "Creeper Charge", - "item.minecraft.creeper_spawn_egg": "Creeper Spawn Egg", - "item.minecraft.crossbow": "Crossbow", - "item.minecraft.crossbow.projectile": "Projectile:", - "item.minecraft.cyan_dye": "Cyan Dye", - "item.minecraft.danger_pottery_shard": "Danger Pottery Shard", - "item.minecraft.danger_pottery_sherd": "Danger Pottery Sherd", - "item.minecraft.dark_oak_boat": "Dark Oak Boat", - "item.minecraft.dark_oak_chest_boat": "Dark Oak Boat with Chest", - "item.minecraft.debug_stick": "Debug Stick", - "item.minecraft.debug_stick.empty": "%s has no properties", - "item.minecraft.debug_stick.select": "selected \"%s\" (%s)", - "item.minecraft.debug_stick.update": "\"%s\" to %s", - "item.minecraft.diamond": "Diamond", - "item.minecraft.diamond_axe": "Diamond Axe", - "item.minecraft.diamond_boots": "Diamond Boots", - "item.minecraft.diamond_chestplate": "Diamond Chestplate", - "item.minecraft.diamond_helmet": "Diamond Helmet", - "item.minecraft.diamond_hoe": "Diamond Hoe", - "item.minecraft.diamond_horse_armor": "Diamond Horse Armor", - "item.minecraft.diamond_leggings": "Diamond Leggings", - "item.minecraft.diamond_pickaxe": "Diamond Pickaxe", - "item.minecraft.diamond_shovel": "Diamond Shovel", - "item.minecraft.diamond_sword": "Diamond Sword", - "item.minecraft.disc_fragment_5": "Disc Fragment", - "item.minecraft.disc_fragment_5.desc": "Music Disc - 5", - "item.minecraft.dolphin_spawn_egg": "Dolphin Spawn Egg", - "item.minecraft.donkey_spawn_egg": "Donkey Spawn Egg", - "item.minecraft.dragon_breath": "Dragon's Breath", - "item.minecraft.dried_kelp": "Dried Kelp", - "item.minecraft.drowned_spawn_egg": "Drowned Spawn Egg", - "item.minecraft.dune_armor_trim_smithing_template": "Smithing Template", - "item.minecraft.echo_shard": "Echo Shard", - "item.minecraft.egg": "Egg", - "item.minecraft.elder_guardian_spawn_egg": "Elder Guardian Spawn Egg", - "item.minecraft.elytra": "Elytra", - "item.minecraft.emerald": "Emerald", - "item.minecraft.enchanted_book": "Enchanted Book", - "item.minecraft.enchanted_golden_apple": "Enchanted Golden Apple", - "item.minecraft.end_crystal": "End Crystal", - "item.minecraft.ender_dragon_spawn_egg": "Ender Dragon Spawn Egg", - "item.minecraft.ender_eye": "Eye of Ender", - "item.minecraft.ender_pearl": "Ender Pearl", - "item.minecraft.enderman_spawn_egg": "Enderman Spawn Egg", - "item.minecraft.endermite_spawn_egg": "Endermite Spawn Egg", - "item.minecraft.evoker_spawn_egg": "Evoker Spawn Egg", - "item.minecraft.experience_bottle": "Bottle o' Enchanting", - "item.minecraft.explorer_pottery_shard": "Explorer Pottery Shard", - "item.minecraft.explorer_pottery_sherd": "Explorer Pottery Sherd", - "item.minecraft.eye_armor_trim_smithing_template": "Smithing Template", - "item.minecraft.feather": "Feather", - "item.minecraft.fermented_spider_eye": "Fermented Spider Eye", - "item.minecraft.filled_map": "Map", - "item.minecraft.fire_charge": "Fire Charge", - "item.minecraft.firework_rocket": "Firework Rocket", - "item.minecraft.firework_rocket.flight": "Flight Duration:", - "item.minecraft.firework_star": "Firework Star", - "item.minecraft.firework_star.black": "Black", - "item.minecraft.firework_star.blue": "Blue", - "item.minecraft.firework_star.brown": "Brown", - "item.minecraft.firework_star.custom_color": "Custom", - "item.minecraft.firework_star.cyan": "Cyan", - "item.minecraft.firework_star.fade_to": "Fade to", - "item.minecraft.firework_star.flicker": "Twinkle", - "item.minecraft.firework_star.gray": "Gray", - "item.minecraft.firework_star.green": "Green", - "item.minecraft.firework_star.light_blue": "Light Blue", - "item.minecraft.firework_star.light_gray": "Light Gray", - "item.minecraft.firework_star.lime": "Lime", - "item.minecraft.firework_star.magenta": "Magenta", - "item.minecraft.firework_star.orange": "Orange", - "item.minecraft.firework_star.pink": "Pink", - "item.minecraft.firework_star.purple": "Purple", - "item.minecraft.firework_star.red": "Red", - "item.minecraft.firework_star.shape": "Unknown Shape", - "item.minecraft.firework_star.shape.burst": "Burst", - "item.minecraft.firework_star.shape.creeper": "Creeper-shaped", - "item.minecraft.firework_star.shape.large_ball": "Large Ball", - "item.minecraft.firework_star.shape.small_ball": "Small Ball", - "item.minecraft.firework_star.shape.star": "Star-shaped", - "item.minecraft.firework_star.trail": "Trail", - "item.minecraft.firework_star.white": "White", - "item.minecraft.firework_star.yellow": "Yellow", - "item.minecraft.fishing_rod": "Fishing Rod", - "item.minecraft.flint": "Flint", - "item.minecraft.flint_and_steel": "Flint and Steel", - "item.minecraft.flower_banner_pattern": "Banner Pattern", - "item.minecraft.flower_banner_pattern.desc": "Flower Charge", - "item.minecraft.flower_pot": "Flower Pot", - "item.minecraft.fox_spawn_egg": "Fox Spawn Egg", - "item.minecraft.friend_pottery_shard": "Friend Pottery Shard", - "item.minecraft.friend_pottery_sherd": "Friend Pottery Sherd", - "item.minecraft.frog_spawn_egg": "Frog Spawn Egg", - "item.minecraft.furnace_minecart": "Minecart with Furnace", - "item.minecraft.ghast_spawn_egg": "Ghast Spawn Egg", - "item.minecraft.ghast_tear": "Ghast Tear", - "item.minecraft.glass_bottle": "Glass Bottle", - "item.minecraft.glistering_melon_slice": "Glistering Melon Slice", - "item.minecraft.globe_banner_pattern": "Banner Pattern", - "item.minecraft.globe_banner_pattern.desc": "Globe", - "item.minecraft.glow_berries": "Glow Berries", - "item.minecraft.glow_ink_sac": "Glow Ink Sac", - "item.minecraft.glow_item_frame": "Glow Item Frame", - "item.minecraft.glow_squid_spawn_egg": "Glow Squid Spawn Egg", - "item.minecraft.glowstone_dust": "Glowstone Dust", - "item.minecraft.goat_horn": "Goat Horn", - "item.minecraft.goat_spawn_egg": "Goat Spawn Egg", - "item.minecraft.gold_ingot": "Gold Ingot", - "item.minecraft.gold_nugget": "Gold Nugget", - "item.minecraft.golden_apple": "Golden Apple", - "item.minecraft.golden_axe": "Golden Axe", - "item.minecraft.golden_boots": "Golden Boots", - "item.minecraft.golden_carrot": "Golden Carrot", - "item.minecraft.golden_chestplate": "Golden Chestplate", - "item.minecraft.golden_helmet": "Golden Helmet", - "item.minecraft.golden_hoe": "Golden Hoe", - "item.minecraft.golden_horse_armor": "Golden Horse Armor", - "item.minecraft.golden_leggings": "Golden Leggings", - "item.minecraft.golden_pickaxe": "Golden Pickaxe", - "item.minecraft.golden_shovel": "Golden Shovel", - "item.minecraft.golden_sword": "Golden Sword", - "item.minecraft.gray_dye": "Gray Dye", - "item.minecraft.green_dye": "Green Dye", - "item.minecraft.guardian_spawn_egg": "Guardian Spawn Egg", - "item.minecraft.gunpowder": "Gunpowder", - "item.minecraft.heart_of_the_sea": "Heart of the Sea", - "item.minecraft.heart_pottery_shard": "Heart Pottery Shard", - "item.minecraft.heart_pottery_sherd": "Heart Pottery Sherd", - "item.minecraft.heartbreak_pottery_shard": "Heartbreak Pottery Shard", - "item.minecraft.heartbreak_pottery_sherd": "Heartbreak Pottery Sherd", - "item.minecraft.hoglin_spawn_egg": "Hoglin Spawn Egg", - "item.minecraft.honey_bottle": "Honey Bottle", - "item.minecraft.honeycomb": "Honeycomb", - "item.minecraft.hopper_minecart": "Minecart with Hopper", - "item.minecraft.horse_spawn_egg": "Horse Spawn Egg", - "item.minecraft.host_armor_trim_smithing_template": "Smithing Template", - "item.minecraft.howl_pottery_shard": "Howl Pottery Shard", - "item.minecraft.howl_pottery_sherd": "Howl Pottery Sherd", - "item.minecraft.husk_spawn_egg": "Husk Spawn Egg", - "item.minecraft.ink_sac": "Ink Sac", - "item.minecraft.iron_axe": "Iron Axe", - "item.minecraft.iron_boots": "Iron Boots", - "item.minecraft.iron_chestplate": "Iron Chestplate", - "item.minecraft.iron_golem_spawn_egg": "Iron Golem Spawn Egg", - "item.minecraft.iron_helmet": "Iron Helmet", - "item.minecraft.iron_hoe": "Iron Hoe", - "item.minecraft.iron_horse_armor": "Iron Horse Armor", - "item.minecraft.iron_ingot": "Iron Ingot", - "item.minecraft.iron_leggings": "Iron Leggings", - "item.minecraft.iron_nugget": "Iron Nugget", - "item.minecraft.iron_pickaxe": "Iron Pickaxe", - "item.minecraft.iron_shovel": "Iron Shovel", - "item.minecraft.iron_sword": "Iron Sword", - "item.minecraft.item_frame": "Item Frame", - "item.minecraft.jungle_boat": "Jungle Boat", - "item.minecraft.jungle_chest_boat": "Jungle Boat with Chest", - "item.minecraft.knowledge_book": "Knowledge Book", - "item.minecraft.lapis_lazuli": "Lapis Lazuli", - "item.minecraft.lava_bucket": "Lava Bucket", - "item.minecraft.lead": "Lead", - "item.minecraft.leather": "Leather", - "item.minecraft.leather_boots": "Leather Boots", - "item.minecraft.leather_chestplate": "Leather Tunic", - "item.minecraft.leather_helmet": "Leather Cap", - "item.minecraft.leather_horse_armor": "Leather Horse Armor", - "item.minecraft.leather_leggings": "Leather Pants", - "item.minecraft.light_blue_dye": "Light Blue Dye", - "item.minecraft.light_gray_dye": "Light Gray Dye", - "item.minecraft.lime_dye": "Lime Dye", - "item.minecraft.lingering_potion": "Lingering Potion", - "item.minecraft.lingering_potion.effect.awkward": "Awkward Lingering Potion", - "item.minecraft.lingering_potion.effect.empty": "Lingering Uncraftable Potion", - "item.minecraft.lingering_potion.effect.fire_resistance": "Lingering Potion of Fire Resistance", - "item.minecraft.lingering_potion.effect.harming": "Lingering Potion of Harming", - "item.minecraft.lingering_potion.effect.healing": "Lingering Potion of Healing", - "item.minecraft.lingering_potion.effect.invisibility": "Lingering Potion of Invisibility", - "item.minecraft.lingering_potion.effect.leaping": "Lingering Potion of Leaping", - "item.minecraft.lingering_potion.effect.levitation": "Lingering Potion of Levitation", - "item.minecraft.lingering_potion.effect.luck": "Lingering Potion of Luck", - "item.minecraft.lingering_potion.effect.mundane": "Mundane Lingering Potion", - "item.minecraft.lingering_potion.effect.night_vision": "Lingering Potion of Night Vision", - "item.minecraft.lingering_potion.effect.poison": "Lingering Potion of Poison", - "item.minecraft.lingering_potion.effect.regeneration": "Lingering Potion of Regeneration", - "item.minecraft.lingering_potion.effect.slow_falling": "Lingering Potion of Slow Falling", - "item.minecraft.lingering_potion.effect.slowness": "Lingering Potion of Slowness", - "item.minecraft.lingering_potion.effect.strength": "Lingering Potion of Strength", - "item.minecraft.lingering_potion.effect.swiftness": "Lingering Potion of Swiftness", - "item.minecraft.lingering_potion.effect.thick": "Thick Lingering Potion", - "item.minecraft.lingering_potion.effect.turtle_master": "Lingering Potion of the Turtle Master", - "item.minecraft.lingering_potion.effect.water": "Lingering Water Bottle", - "item.minecraft.lingering_potion.effect.water_breathing": "Lingering Potion of Water Breathing", - "item.minecraft.lingering_potion.effect.weakness": "Lingering Potion of Weakness", - "item.minecraft.llama_spawn_egg": "Llama Spawn Egg", - "item.minecraft.lodestone_compass": "Lodestone Compass", - "item.minecraft.magenta_dye": "Magenta Dye", - "item.minecraft.magma_cream": "Magma Cream", - "item.minecraft.magma_cube_spawn_egg": "Magma Cube Spawn Egg", - "item.minecraft.mangrove_boat": "Mangrove Boat", - "item.minecraft.mangrove_chest_boat": "Mangrove Boat with Chest", - "item.minecraft.map": "Empty Map", - "item.minecraft.melon_seeds": "Melon Seeds", - "item.minecraft.melon_slice": "Melon Slice", - "item.minecraft.milk_bucket": "Milk Bucket", - "item.minecraft.minecart": "Minecart", - "item.minecraft.miner_pottery_shard": "Miner Pottery Shard", - "item.minecraft.miner_pottery_sherd": "Miner Pottery Sherd", - "item.minecraft.mojang_banner_pattern": "Banner Pattern", - "item.minecraft.mojang_banner_pattern.desc": "Thing", - "item.minecraft.mooshroom_spawn_egg": "Mooshroom Spawn Egg", - "item.minecraft.mourner_pottery_shard": "Mourner Pottery Shard", - "item.minecraft.mourner_pottery_sherd": "Mourner Pottery Sherd", - "item.minecraft.mule_spawn_egg": "Mule Spawn Egg", - "item.minecraft.mushroom_stew": "Mushroom Stew", - "item.minecraft.music_disc_5": "Music Disc", - "item.minecraft.music_disc_5.desc": "Samuel Åberg - 5", - "item.minecraft.music_disc_11": "Music Disc", - "item.minecraft.music_disc_11.desc": "C418 - 11", - "item.minecraft.music_disc_13": "Music Disc", - "item.minecraft.music_disc_13.desc": "C418 - 13", - "item.minecraft.music_disc_blocks": "Music Disc", - "item.minecraft.music_disc_blocks.desc": "C418 - blocks", - "item.minecraft.music_disc_cat": "Music Disc", - "item.minecraft.music_disc_cat.desc": "C418 - cat", - "item.minecraft.music_disc_chirp": "Music Disc", - "item.minecraft.music_disc_chirp.desc": "C418 - chirp", - "item.minecraft.music_disc_far": "Music Disc", - "item.minecraft.music_disc_far.desc": "C418 - far", - "item.minecraft.music_disc_mall": "Music Disc", - "item.minecraft.music_disc_mall.desc": "C418 - mall", - "item.minecraft.music_disc_mellohi": "Music Disc", - "item.minecraft.music_disc_mellohi.desc": "C418 - mellohi", - "item.minecraft.music_disc_otherside": "Music Disc", - "item.minecraft.music_disc_otherside.desc": "Lena Raine - otherside", - "item.minecraft.music_disc_pigstep": "Music Disc", - "item.minecraft.music_disc_pigstep.desc": "Lena Raine - Pigstep", - "item.minecraft.music_disc_relic": "Music Disc", - "item.minecraft.music_disc_relic.desc": "Aaron Cherof - Relic", - "item.minecraft.music_disc_stal": "Music Disc", - "item.minecraft.music_disc_stal.desc": "C418 - stal", - "item.minecraft.music_disc_strad": "Music Disc", - "item.minecraft.music_disc_strad.desc": "C418 - strad", - "item.minecraft.music_disc_wait": "Music Disc", - "item.minecraft.music_disc_wait.desc": "C418 - wait", - "item.minecraft.music_disc_ward": "Music Disc", - "item.minecraft.music_disc_ward.desc": "C418 - ward", - "item.minecraft.mutton": "Raw Mutton", - "item.minecraft.name_tag": "Name Tag", - "item.minecraft.nautilus_shell": "Nautilus Shell", - "item.minecraft.nether_brick": "Nether Brick", - "item.minecraft.nether_star": "Nether Star", - "item.minecraft.nether_wart": "Nether Wart", - "item.minecraft.netherite_axe": "Netherite Axe", - "item.minecraft.netherite_boots": "Netherite Boots", - "item.minecraft.netherite_chestplate": "Netherite Chestplate", - "item.minecraft.netherite_helmet": "Netherite Helmet", - "item.minecraft.netherite_hoe": "Netherite Hoe", - "item.minecraft.netherite_ingot": "Netherite Ingot", - "item.minecraft.netherite_leggings": "Netherite Leggings", - "item.minecraft.netherite_pickaxe": "Netherite Pickaxe", - "item.minecraft.netherite_scrap": "Netherite Scrap", - "item.minecraft.netherite_shovel": "Netherite Shovel", - "item.minecraft.netherite_sword": "Netherite Sword", - "item.minecraft.netherite_upgrade_smithing_template": "Smithing Template", - "item.minecraft.oak_boat": "Oak Boat", - "item.minecraft.oak_chest_boat": "Oak Boat with Chest", - "item.minecraft.ocelot_spawn_egg": "Ocelot Spawn Egg", - "item.minecraft.orange_dye": "Orange Dye", - "item.minecraft.painting": "Painting", - "item.minecraft.panda_spawn_egg": "Panda Spawn Egg", - "item.minecraft.paper": "Paper", - "item.minecraft.parrot_spawn_egg": "Parrot Spawn Egg", - "item.minecraft.phantom_membrane": "Phantom Membrane", - "item.minecraft.phantom_spawn_egg": "Phantom Spawn Egg", - "item.minecraft.pig_spawn_egg": "Pig Spawn Egg", - "item.minecraft.piglin_banner_pattern": "Banner Pattern", - "item.minecraft.piglin_banner_pattern.desc": "Snout", - "item.minecraft.piglin_brute_spawn_egg": "Piglin Brute Spawn Egg", - "item.minecraft.piglin_spawn_egg": "Piglin Spawn Egg", - "item.minecraft.pillager_spawn_egg": "Pillager Spawn Egg", - "item.minecraft.pink_dye": "Pink Dye", - "item.minecraft.pitcher_plant": "Pitcher Plant", - "item.minecraft.pitcher_pod": "Pitcher Pod", - "item.minecraft.plenty_pottery_shard": "Plenty Pottery Shard", - "item.minecraft.plenty_pottery_sherd": "Plenty Pottery Sherd", - "item.minecraft.poisonous_potato": "Poisonous Potato", - "item.minecraft.polar_bear_spawn_egg": "Polar Bear Spawn Egg", - "item.minecraft.popped_chorus_fruit": "Popped Chorus Fruit", - "item.minecraft.porkchop": "Raw Porkchop", - "item.minecraft.potato": "Potato", - "item.minecraft.potion": "Potion", - "item.minecraft.potion.effect.awkward": "Awkward Potion", - "item.minecraft.potion.effect.empty": "Uncraftable Potion", - "item.minecraft.potion.effect.fire_resistance": "Potion of Fire Resistance", - "item.minecraft.potion.effect.harming": "Potion of Harming", - "item.minecraft.potion.effect.healing": "Potion of Healing", - "item.minecraft.potion.effect.invisibility": "Potion of Invisibility", - "item.minecraft.potion.effect.leaping": "Potion of Leaping", - "item.minecraft.potion.effect.levitation": "Potion of Levitation", - "item.minecraft.potion.effect.luck": "Potion of Luck", - "item.minecraft.potion.effect.mundane": "Mundane Potion", - "item.minecraft.potion.effect.night_vision": "Potion of Night Vision", - "item.minecraft.potion.effect.poison": "Potion of Poison", - "item.minecraft.potion.effect.regeneration": "Potion of Regeneration", - "item.minecraft.potion.effect.slow_falling": "Potion of Slow Falling", - "item.minecraft.potion.effect.slowness": "Potion of Slowness", - "item.minecraft.potion.effect.strength": "Potion of Strength", - "item.minecraft.potion.effect.swiftness": "Potion of Swiftness", - "item.minecraft.potion.effect.thick": "Thick Potion", - "item.minecraft.potion.effect.turtle_master": "Potion of the Turtle Master", - "item.minecraft.potion.effect.water": "Water Bottle", - "item.minecraft.potion.effect.water_breathing": "Potion of Water Breathing", - "item.minecraft.potion.effect.weakness": "Potion of Weakness", - "item.minecraft.pottery_shard_archer": "Archer Pottery Shard", - "item.minecraft.pottery_shard_arms_up": "Arms Up Pottery Shard", - "item.minecraft.pottery_shard_prize": "Prize Pottery Shard", - "item.minecraft.pottery_shard_skull": "Skull Pottery Shard", - "item.minecraft.powder_snow_bucket": "Powder Snow Bucket", - "item.minecraft.prismarine_crystals": "Prismarine Crystals", - "item.minecraft.prismarine_shard": "Prismarine Shard", - "item.minecraft.prize_pottery_shard": "Prize Pottery Shard", - "item.minecraft.prize_pottery_sherd": "Prize Pottery Sherd", - "item.minecraft.pufferfish": "Pufferfish", - "item.minecraft.pufferfish_bucket": "Bucket of Pufferfish", - "item.minecraft.pufferfish_spawn_egg": "Pufferfish Spawn Egg", - "item.minecraft.pumpkin_pie": "Pumpkin Pie", - "item.minecraft.pumpkin_seeds": "Pumpkin Seeds", - "item.minecraft.purple_dye": "Purple Dye", - "item.minecraft.quartz": "Nether Quartz", - "item.minecraft.rabbit": "Raw Rabbit", - "item.minecraft.rabbit_foot": "Rabbit's Foot", - "item.minecraft.rabbit_hide": "Rabbit Hide", - "item.minecraft.rabbit_spawn_egg": "Rabbit Spawn Egg", - "item.minecraft.rabbit_stew": "Rabbit Stew", - "item.minecraft.raiser_armor_trim_smithing_template": "Smithing Template", - "item.minecraft.ravager_spawn_egg": "Ravager Spawn Egg", - "item.minecraft.raw_copper": "Raw Copper", - "item.minecraft.raw_gold": "Raw Gold", - "item.minecraft.raw_iron": "Raw Iron", - "item.minecraft.recovery_compass": "Recovery Compass", - "item.minecraft.red_dye": "Red Dye", - "item.minecraft.redstone": "Redstone Dust", - "item.minecraft.rib_armor_trim_smithing_template": "Smithing Template", - "item.minecraft.rotten_flesh": "Rotten Flesh", - "item.minecraft.saddle": "Saddle", - "item.minecraft.salmon": "Raw Salmon", - "item.minecraft.salmon_bucket": "Bucket of Salmon", - "item.minecraft.salmon_spawn_egg": "Salmon Spawn Egg", - "item.minecraft.scute": "Scute", - "item.minecraft.sentry_armor_trim_smithing_template": "Smithing Template", - "item.minecraft.shaper_armor_trim_smithing_template": "Smithing Template", - "item.minecraft.sheaf_pottery_shard": "Sheaf Pottery Shard", - "item.minecraft.sheaf_pottery_sherd": "Sheaf Pottery Sherd", - "item.minecraft.shears": "Shears", - "item.minecraft.sheep_spawn_egg": "Sheep Spawn Egg", - "item.minecraft.shelter_pottery_shard": "Shelter Pottery Shard", - "item.minecraft.shelter_pottery_sherd": "Shelter Pottery Sherd", - "item.minecraft.shield": "Shield", - "item.minecraft.shield.black": "Black Shield", - "item.minecraft.shield.blue": "Blue Shield", - "item.minecraft.shield.brown": "Brown Shield", - "item.minecraft.shield.cyan": "Cyan Shield", - "item.minecraft.shield.gray": "Gray Shield", - "item.minecraft.shield.green": "Green Shield", - "item.minecraft.shield.light_blue": "Light Blue Shield", - "item.minecraft.shield.light_gray": "Light Gray Shield", - "item.minecraft.shield.lime": "Lime Shield", - "item.minecraft.shield.magenta": "Magenta Shield", - "item.minecraft.shield.orange": "Orange Shield", - "item.minecraft.shield.pink": "Pink Shield", - "item.minecraft.shield.purple": "Purple Shield", - "item.minecraft.shield.red": "Red Shield", - "item.minecraft.shield.white": "White Shield", - "item.minecraft.shield.yellow": "Yellow Shield", - "item.minecraft.shulker_shell": "Shulker Shell", - "item.minecraft.shulker_spawn_egg": "Shulker Spawn Egg", - "item.minecraft.sign": "Sign", - "item.minecraft.silence_armor_trim_smithing_template": "Smithing Template", - "item.minecraft.silverfish_spawn_egg": "Silverfish Spawn Egg", - "item.minecraft.skeleton_horse_spawn_egg": "Skeleton Horse Spawn Egg", - "item.minecraft.skeleton_spawn_egg": "Skeleton Spawn Egg", - "item.minecraft.skull_banner_pattern": "Banner Pattern", - "item.minecraft.skull_banner_pattern.desc": "Skull Charge", - "item.minecraft.skull_pottery_shard": "Skull Pottery Shard", - "item.minecraft.skull_pottery_sherd": "Skull Pottery Sherd", - "item.minecraft.slime_ball": "Slimeball", - "item.minecraft.slime_spawn_egg": "Slime Spawn Egg", - "item.minecraft.smithing_template": "Smithing Template", - "item.minecraft.smithing_template.applies_to": "Applies to:", - "item.minecraft.smithing_template.armor_trim.additions_slot_description": "Add ingot or crystal", - "item.minecraft.smithing_template.armor_trim.applies_to": "Armor", - "item.minecraft.smithing_template.armor_trim.base_slot_description": "Add a piece of armor", - "item.minecraft.smithing_template.armor_trim.ingredients": "Ingots & Crystals", - "item.minecraft.smithing_template.ingredients": "Ingredients:", - "item.minecraft.smithing_template.netherite_upgrade.additions_slot_description": "Add Netherite Ingot", - "item.minecraft.smithing_template.netherite_upgrade.applies_to": "Diamond Equipment", - "item.minecraft.smithing_template.netherite_upgrade.base_slot_description": "Add diamond armor, weapon, or tool", - "item.minecraft.smithing_template.netherite_upgrade.ingredients": "Netherite Ingot", - "item.minecraft.smithing_template.upgrade": "Upgrade: ", - "item.minecraft.sniffer_spawn_egg": "Sniffer Spawn Egg", - "item.minecraft.snort_pottery_shard": "Snort Pottery Shard", - "item.minecraft.snort_pottery_sherd": "Snort Pottery Sherd", - "item.minecraft.snout_armor_trim_smithing_template": "Smithing Template", - "item.minecraft.snow_golem_spawn_egg": "Snow Golem Spawn Egg", - "item.minecraft.snowball": "Snowball", - "item.minecraft.spectral_arrow": "Spectral Arrow", - "item.minecraft.spider_eye": "Spider Eye", - "item.minecraft.spider_spawn_egg": "Spider Spawn Egg", - "item.minecraft.spire_armor_trim_smithing_template": "Smithing Template", - "item.minecraft.splash_potion": "Splash Potion", - "item.minecraft.splash_potion.effect.awkward": "Awkward Splash Potion", - "item.minecraft.splash_potion.effect.empty": "Splash Uncraftable Potion", - "item.minecraft.splash_potion.effect.fire_resistance": "Splash Potion of Fire Resistance", - "item.minecraft.splash_potion.effect.harming": "Splash Potion of Harming", - "item.minecraft.splash_potion.effect.healing": "Splash Potion of Healing", - "item.minecraft.splash_potion.effect.invisibility": "Splash Potion of Invisibility", - "item.minecraft.splash_potion.effect.leaping": "Splash Potion of Leaping", - "item.minecraft.splash_potion.effect.levitation": "Splash Potion of Levitation", - "item.minecraft.splash_potion.effect.luck": "Splash Potion of Luck", - "item.minecraft.splash_potion.effect.mundane": "Mundane Splash Potion", - "item.minecraft.splash_potion.effect.night_vision": "Splash Potion of Night Vision", - "item.minecraft.splash_potion.effect.poison": "Splash Potion of Poison", - "item.minecraft.splash_potion.effect.regeneration": "Splash Potion of Regeneration", - "item.minecraft.splash_potion.effect.slow_falling": "Splash Potion of Slow Falling", - "item.minecraft.splash_potion.effect.slowness": "Splash Potion of Slowness", - "item.minecraft.splash_potion.effect.strength": "Splash Potion of Strength", - "item.minecraft.splash_potion.effect.swiftness": "Splash Potion of Swiftness", - "item.minecraft.splash_potion.effect.thick": "Thick Splash Potion", - "item.minecraft.splash_potion.effect.turtle_master": "Splash Potion of the Turtle Master", - "item.minecraft.splash_potion.effect.water": "Splash Water Bottle", - "item.minecraft.splash_potion.effect.water_breathing": "Splash Potion of Water Breathing", - "item.minecraft.splash_potion.effect.weakness": "Splash Potion of Weakness", - "item.minecraft.spruce_boat": "Spruce Boat", - "item.minecraft.spruce_chest_boat": "Spruce Boat with Chest", - "item.minecraft.spyglass": "Spyglass", - "item.minecraft.squid_spawn_egg": "Squid Spawn Egg", - "item.minecraft.stick": "Stick", - "item.minecraft.stone_axe": "Stone Axe", - "item.minecraft.stone_hoe": "Stone Hoe", - "item.minecraft.stone_pickaxe": "Stone Pickaxe", - "item.minecraft.stone_shovel": "Stone Shovel", - "item.minecraft.stone_sword": "Stone Sword", - "item.minecraft.stray_spawn_egg": "Stray Spawn Egg", - "item.minecraft.strider_spawn_egg": "Strider Spawn Egg", - "item.minecraft.string": "String", - "item.minecraft.sugar": "Sugar", - "item.minecraft.suspicious_stew": "Suspicious Stew", - "item.minecraft.sweet_berries": "Sweet Berries", - "item.minecraft.tadpole_bucket": "Bucket of Tadpole", - "item.minecraft.tadpole_spawn_egg": "Tadpole Spawn Egg", - "item.minecraft.tide_armor_trim_smithing_template": "Smithing Template", - "item.minecraft.tipped_arrow": "Tipped Arrow", - "item.minecraft.tipped_arrow.effect.awkward": "Tipped Arrow", - "item.minecraft.tipped_arrow.effect.empty": "Uncraftable Tipped Arrow", - "item.minecraft.tipped_arrow.effect.fire_resistance": "Arrow of Fire Resistance", - "item.minecraft.tipped_arrow.effect.harming": "Arrow of Harming", - "item.minecraft.tipped_arrow.effect.healing": "Arrow of Healing", - "item.minecraft.tipped_arrow.effect.invisibility": "Arrow of Invisibility", - "item.minecraft.tipped_arrow.effect.leaping": "Arrow of Leaping", - "item.minecraft.tipped_arrow.effect.levitation": "Arrow of Levitation", - "item.minecraft.tipped_arrow.effect.luck": "Arrow of Luck", - "item.minecraft.tipped_arrow.effect.mundane": "Tipped Arrow", - "item.minecraft.tipped_arrow.effect.night_vision": "Arrow of Night Vision", - "item.minecraft.tipped_arrow.effect.poison": "Arrow of Poison", - "item.minecraft.tipped_arrow.effect.regeneration": "Arrow of Regeneration", - "item.minecraft.tipped_arrow.effect.slow_falling": "Arrow of Slow Falling", - "item.minecraft.tipped_arrow.effect.slowness": "Arrow of Slowness", - "item.minecraft.tipped_arrow.effect.strength": "Arrow of Strength", - "item.minecraft.tipped_arrow.effect.swiftness": "Arrow of Swiftness", - "item.minecraft.tipped_arrow.effect.thick": "Tipped Arrow", - "item.minecraft.tipped_arrow.effect.turtle_master": "Arrow of the Turtle Master", - "item.minecraft.tipped_arrow.effect.water": "Arrow of Splashing", - "item.minecraft.tipped_arrow.effect.water_breathing": "Arrow of Water Breathing", - "item.minecraft.tipped_arrow.effect.weakness": "Arrow of Weakness", - "item.minecraft.tnt_minecart": "Minecart with TNT", - "item.minecraft.torchflower_seeds": "Torchflower Seeds", - "item.minecraft.totem_of_undying": "Totem of Undying", - "item.minecraft.trader_llama_spawn_egg": "Trader Llama Spawn Egg", - "item.minecraft.trial_key": "Trial Key", - "item.minecraft.trident": "Trident", - "item.minecraft.tropical_fish": "Tropical Fish", - "item.minecraft.tropical_fish_bucket": "Bucket of Tropical Fish", - "item.minecraft.tropical_fish_spawn_egg": "Tropical Fish Spawn Egg", - "item.minecraft.turtle_helmet": "Turtle Shell", - "item.minecraft.turtle_spawn_egg": "Turtle Spawn Egg", - "item.minecraft.vex_armor_trim_smithing_template": "Smithing Template", - "item.minecraft.vex_spawn_egg": "Vex Spawn Egg", - "item.minecraft.villager_spawn_egg": "Villager Spawn Egg", - "item.minecraft.vindicator_spawn_egg": "Vindicator Spawn Egg", - "item.minecraft.wandering_trader_spawn_egg": "Wandering Trader Spawn Egg", - "item.minecraft.ward_armor_trim_smithing_template": "Smithing Template", - "item.minecraft.warden_spawn_egg": "Warden Spawn Egg", - "item.minecraft.warped_fungus_on_a_stick": "Warped Fungus on a Stick", - "item.minecraft.water_bucket": "Water Bucket", - "item.minecraft.wayfinder_armor_trim_smithing_template": "Smithing Template", - "item.minecraft.wheat": "Wheat", - "item.minecraft.wheat_seeds": "Wheat Seeds", - "item.minecraft.white_dye": "White Dye", - "item.minecraft.wild_armor_trim_smithing_template": "Smithing Template", - "item.minecraft.witch_spawn_egg": "Witch Spawn Egg", - "item.minecraft.wither_skeleton_spawn_egg": "Wither Skeleton Spawn Egg", - "item.minecraft.wither_spawn_egg": "Wither Spawn Egg", - "item.minecraft.wolf_spawn_egg": "Wolf Spawn Egg", - "item.minecraft.wooden_axe": "Wooden Axe", - "item.minecraft.wooden_hoe": "Wooden Hoe", - "item.minecraft.wooden_pickaxe": "Wooden Pickaxe", - "item.minecraft.wooden_shovel": "Wooden Shovel", - "item.minecraft.wooden_sword": "Wooden Sword", - "item.minecraft.writable_book": "Book and Quill", - "item.minecraft.written_book": "Written Book", - "item.minecraft.yellow_dye": "Yellow Dye", - "item.minecraft.zoglin_spawn_egg": "Zoglin Spawn Egg", - "item.minecraft.zombie_horse_spawn_egg": "Zombie Horse Spawn Egg", - "item.minecraft.zombie_spawn_egg": "Zombie Spawn Egg", - "item.minecraft.zombie_villager_spawn_egg": "Zombie Villager Spawn Egg", - "item.minecraft.zombified_piglin_spawn_egg": "Zombified Piglin Spawn Egg", - "item.modifiers.chest": "When on Body:", - "item.modifiers.feet": "When on Feet:", - "item.modifiers.head": "When on Head:", - "item.modifiers.legs": "When on Legs:", - "item.modifiers.mainhand": "When in Main Hand:", - "item.modifiers.offhand": "When in Off Hand:", - "item.nbt_tags": "NBT: %s tag(s)", - "item.unbreakable": "Unbreakable", - "itemGroup.buildingBlocks": "Building Blocks", - "itemGroup.coloredBlocks": "Colored Blocks", - "itemGroup.combat": "Combat", - "itemGroup.consumables": "Consumables", - "itemGroup.crafting": "Crafting", - "itemGroup.foodAndDrink": "Food & Drinks", - "itemGroup.functional": "Functional Blocks", - "itemGroup.hotbar": "Saved Hotbars", - "itemGroup.ingredients": "Ingredients", - "itemGroup.inventory": "Survival Inventory", - "itemGroup.natural": "Natural Blocks", - "itemGroup.op": "Operator Utilities", - "itemGroup.redstone": "Redstone Blocks", - "itemGroup.search": "Search Items", - "itemGroup.spawnEggs": "Spawn Eggs", - "itemGroup.tools": "Tools & Utilities", - "jigsaw_block.final_state": "Turns into:", - "jigsaw_block.generate": "Generate", - "jigsaw_block.joint_label": "Joint Type:", - "jigsaw_block.joint.aligned": "Aligned", - "jigsaw_block.joint.rollable": "Rollable", - "jigsaw_block.keep_jigsaws": "Keep Jigsaws", - "jigsaw_block.levels": "Levels: %s", - "jigsaw_block.name": "Name:", - "jigsaw_block.placement_priority": "Placement Priority:", - "jigsaw_block.placement_priority.tooltip": "When this Jigsaw block connects to a piece, this is the order in which that piece is processed for connections in the wider structure.\n\nPieces will be processed in descending priority with insertion order breaking ties.", - "jigsaw_block.pool": "Target Pool:", - "jigsaw_block.selection_priority": "Selection Priority:", - "jigsaw_block.selection_priority.tooltip": "When the parent piece is being processed for connections, this is the order in which this Jigsaw block attempts to connect to its target piece.\n\nJigsaws will be processed in descending priority with random ordering breaking ties.", - "jigsaw_block.target": "Target Name:", - "key.advancements": "Advancements", - "key.attack": "Attack/Destroy", - "key.back": "Walk Backwards", - "key.categories.creative": "Creative Mode", - "key.categories.gameplay": "Gameplay", - "key.categories.inventory": "Inventory", - "key.categories.misc": "Miscellaneous", - "key.categories.movement": "Movement", - "key.categories.multiplayer": "Multiplayer", - "key.categories.ui": "Game Interface", - "key.chat": "Open Chat", - "key.command": "Open Command", - "key.drop": "Drop Selected Item", - "key.forward": "Walk Forwards", - "key.fullscreen": "Toggle Fullscreen", - "key.hotbar.1": "Hotbar Slot 1", - "key.hotbar.2": "Hotbar Slot 2", - "key.hotbar.3": "Hotbar Slot 3", - "key.hotbar.4": "Hotbar Slot 4", - "key.hotbar.5": "Hotbar Slot 5", - "key.hotbar.6": "Hotbar Slot 6", - "key.hotbar.7": "Hotbar Slot 7", - "key.hotbar.8": "Hotbar Slot 8", - "key.hotbar.9": "Hotbar Slot 9", - "key.inventory": "Open/Close Inventory", - "key.jump": "Jump", - "key.keyboard.apostrophe": "'", - "key.keyboard.backslash": "\\", - "key.keyboard.backspace": "Backspace", - "key.keyboard.caps.lock": "Caps Lock", - "key.keyboard.comma": ",", - "key.keyboard.delete": "Delete", - "key.keyboard.down": "Down Arrow", - "key.keyboard.end": "End", - "key.keyboard.enter": "Enter", - "key.keyboard.equal": "=", - "key.keyboard.escape": "Escape", - "key.keyboard.f1": "F1", - "key.keyboard.f2": "F2", - "key.keyboard.f3": "F3", - "key.keyboard.f4": "F4", - "key.keyboard.f5": "F5", - "key.keyboard.f6": "F6", - "key.keyboard.f7": "F7", - "key.keyboard.f8": "F8", - "key.keyboard.f9": "F9", - "key.keyboard.f10": "F10", - "key.keyboard.f11": "F11", - "key.keyboard.f12": "F12", - "key.keyboard.f13": "F13", - "key.keyboard.f14": "F14", - "key.keyboard.f15": "F15", - "key.keyboard.f16": "F16", - "key.keyboard.f17": "F17", - "key.keyboard.f18": "F18", - "key.keyboard.f19": "F19", - "key.keyboard.f20": "F20", - "key.keyboard.f21": "F21", - "key.keyboard.f22": "F22", - "key.keyboard.f23": "F23", - "key.keyboard.f24": "F24", - "key.keyboard.f25": "F25", - "key.keyboard.grave.accent": "`", - "key.keyboard.home": "Home", - "key.keyboard.insert": "Insert", - "key.keyboard.keypad.0": "Keypad 0", - "key.keyboard.keypad.1": "Keypad 1", - "key.keyboard.keypad.2": "Keypad 2", - "key.keyboard.keypad.3": "Keypad 3", - "key.keyboard.keypad.4": "Keypad 4", - "key.keyboard.keypad.5": "Keypad 5", - "key.keyboard.keypad.6": "Keypad 6", - "key.keyboard.keypad.7": "Keypad 7", - "key.keyboard.keypad.8": "Keypad 8", - "key.keyboard.keypad.9": "Keypad 9", - "key.keyboard.keypad.add": "Keypad +", - "key.keyboard.keypad.decimal": "Keypad Decimal", - "key.keyboard.keypad.divide": "Keypad /", - "key.keyboard.keypad.enter": "Keypad Enter", - "key.keyboard.keypad.equal": "Keypad =", - "key.keyboard.keypad.multiply": "Keypad *", - "key.keyboard.keypad.subtract": "Keypad -", - "key.keyboard.left": "Left Arrow", - "key.keyboard.left.alt": "Left Alt", - "key.keyboard.left.bracket": "[", - "key.keyboard.left.control": "Left Control", - "key.keyboard.left.shift": "Left Shift", - "key.keyboard.left.win": "Left Win", - "key.keyboard.menu": "Menu", - "key.keyboard.minus": "-", - "key.keyboard.num.lock": "Num Lock", - "key.keyboard.page.down": "Page Down", - "key.keyboard.page.up": "Page Up", - "key.keyboard.pause": "Pause", - "key.keyboard.period": ".", - "key.keyboard.print.screen": "Print Screen", - "key.keyboard.right": "Right Arrow", - "key.keyboard.right.alt": "Right Alt", - "key.keyboard.right.bracket": "]", - "key.keyboard.right.control": "Right Control", - "key.keyboard.right.shift": "Right Shift", - "key.keyboard.right.win": "Right Win", - "key.keyboard.scroll.lock": "Scroll Lock", - "key.keyboard.semicolon": ";", - "key.keyboard.slash": "/", - "key.keyboard.space": "Space", - "key.keyboard.tab": "Tab", - "key.keyboard.unknown": "Not Bound", - "key.keyboard.up": "Up Arrow", - "key.keyboard.world.1": "World 1", - "key.keyboard.world.2": "World 2", - "key.left": "Strafe Left", - "key.loadToolbarActivator": "Load Hotbar Activator", - "key.mouse": "Button %1$s", - "key.mouse.left": "Left Button", - "key.mouse.middle": "Middle Button", - "key.mouse.right": "Right Button", - "key.pickItem": "Pick Block", - "key.playerlist": "List Players", - "key.right": "Strafe Right", - "key.saveToolbarActivator": "Save Hotbar Activator", - "key.screenshot": "Take Screenshot", - "key.smoothCamera": "Toggle Cinematic Camera", - "key.sneak": "Sneak", - "key.socialInteractions": "Social Interactions Screen", - "key.spectatorOutlines": "Highlight Players (Spectators)", - "key.sprint": "Sprint", - "key.swapOffhand": "Swap Item With Offhand", - "key.togglePerspective": "Toggle Perspective", - "key.use": "Use Item/Place Block", - "language.code": "en_us", - "language.name": "English", - "language.region": "United States", - "lanServer.otherPlayers": "Settings for Other Players", - "lanServer.port": "Port Number", - "lanServer.port.invalid": "Not a valid port.\nLeave the edit box empty or enter a number between 1024 and 65535.", - "lanServer.port.invalid.new": "Not a valid port.\nLeave the edit box empty or enter a number between %s and %s.", - "lanServer.port.unavailable": "Port not available.\nLeave the edit box empty or enter a different number between 1024 and 65535.", - "lanServer.port.unavailable.new": "Port not available.\nLeave the edit box empty or enter a different number between %s and %s.", - "lanServer.scanning": "Scanning for games on your local network", - "lanServer.start": "Start LAN World", - "lanServer.title": "LAN World", - "lectern.take_book": "Take Book", - "loading.progress": "%s%%", - "mco.account.privacy.info": "Read more about Mojang and privacy laws", - "mco.account.privacy.info.button": "Read more about GDPR", - "mco.account.privacy.information": "Mojang implements certain procedures to help protect children and their privacy including complying with the Children’s Online Privacy Protection Act (COPPA) and General Data Protection Regulation (GDPR).\n\nYou may need to obtain parental consent before accessing your Realms account.", - "mco.account.privacyinfo": "Mojang implements certain procedures to help protect children and their privacy including complying with the Children’s Online Privacy Protection Act (COPPA) and General Data Protection Regulation (GDPR).\n\nYou may need to obtain parental consent before accessing your Realms account.\n\nIf you have an older Minecraft account (you log in with your username), you need to migrate the account to a Mojang account in order to access Realms.", - "mco.account.update": "Update account", - "mco.activity.noactivity": "No activity for the past %s day(s)", - "mco.activity.title": "Player activity", - "mco.backup.button.download": "Download Latest", - "mco.backup.button.reset": "Reset World", - "mco.backup.button.restore": "Restore", - "mco.backup.button.upload": "Upload World", - "mco.backup.changes.tooltip": "Changes", - "mco.backup.entry": "Backup (%s)", - "mco.backup.entry.description": "Description", - "mco.backup.entry.enabledPack": "Enabled Pack(s)", - "mco.backup.entry.gameDifficulty": "Game Difficulty", - "mco.backup.entry.gameMode": "Game Mode", - "mco.backup.entry.gameServerVersion": "Game Server Version", - "mco.backup.entry.name": "Name", - "mco.backup.entry.seed": "Seed", - "mco.backup.entry.templateName": "Template Name", - "mco.backup.entry.undefined": "Undefined Change", - "mco.backup.entry.uploaded": "Uploaded", - "mco.backup.entry.worldType": "World Type", - "mco.backup.generate.world": "Generate world", - "mco.backup.info.title": "Changes From Last Backup", - "mco.backup.nobackups": "This realm doesn't have any backups currently.", - "mco.backup.restoring": "Restoring your realm", - "mco.backup.unknown": "UNKNOWN", - "mco.brokenworld.download": "Download", - "mco.brokenworld.downloaded": "Downloaded", - "mco.brokenworld.message.line1": "Please reset or select another world.", - "mco.brokenworld.message.line2": "You can also choose to download the world to singleplayer.", - "mco.brokenworld.minigame.title": "This minigame is no longer supported", - "mco.brokenworld.nonowner.error": "Please wait for the realm owner to reset the world", - "mco.brokenworld.nonowner.title": "World is out of date", - "mco.brokenworld.play": "Play", - "mco.brokenworld.reset": "Reset", - "mco.brokenworld.title": "Your current world is no longer supported", - "mco.client.incompatible.msg.line1": "Your client is not compatible with Realms.", - "mco.client.incompatible.msg.line2": "Please use the most recent version of Minecraft.", - "mco.client.incompatible.msg.line3": "Realms is not compatible with snapshot versions.", - "mco.client.incompatible.title": "Client incompatible!", - "mco.compatibility.downgrade": "Downgrade", - "mco.compatibility.downgrade.description": "This world was last played in version %s; you are on version %s. Downgrading a world could cause corruption - we cannot guarantee that it will load or work.\n\nA backup of your world will be saved under \"World backups\". Please restore your world if needed.", - "mco.compatibility.unverifiable.message": "The version this world was last played in could not be verified. If the world gets upgraded or downgraded, a backup will be automatically created and saved under \"World backups\".", - "mco.compatibility.unverifiable.title": "Compatibility not verifiable", - "mco.compatibility.upgrade": "Upgrade", - "mco.compatibility.upgrade.description": "This world was last played in version %s; you are on version %s.\n\nA backup of your world will be saved under \"World backups\". Please restore your world if needed.", - "mco.compatibility.upgrade.title": "Do you really want to upgrade your world?", - "mco.configure.current.minigame": "Current", - "mco.configure.world.activityfeed.disabled": "Player feed temporarily disabled", - "mco.configure.world.backup": "World Backups", - "mco.configure.world.buttons.activity": "Player activity", - "mco.configure.world.buttons.close": "Close Realm", - "mco.configure.world.buttons.delete": "Delete", - "mco.configure.world.buttons.done": "Done", - "mco.configure.world.buttons.edit": "Settings", - "mco.configure.world.buttons.invite": "Invite Player", - "mco.configure.world.buttons.moreoptions": "More options", - "mco.configure.world.buttons.open": "Open Realm", - "mco.configure.world.buttons.options": "World Options", - "mco.configure.world.buttons.players": "Players", - "mco.configure.world.buttons.resetworld": "Reset World", - "mco.configure.world.buttons.settings": "Settings", - "mco.configure.world.buttons.subscription": "Subscription", - "mco.configure.world.buttons.switchminigame": "Switch minigame", - "mco.configure.world.close.question.line1": "Your realm will become unavailable.", - "mco.configure.world.close.question.line2": "Are you sure you want to continue?", - "mco.configure.world.closing": "Closing the realm...", - "mco.configure.world.commandBlocks": "Command Blocks", - "mco.configure.world.delete.button": "Delete Realm", - "mco.configure.world.delete.question.line1": "Your realm will be permanently deleted", - "mco.configure.world.delete.question.line2": "Are you sure you want to continue?", - "mco.configure.world.description": "Realm Description", - "mco.configure.world.edit.slot.name": "World Name", - "mco.configure.world.edit.subscreen.adventuremap": "Some settings are disabled since your current world is an adventure", - "mco.configure.world.edit.subscreen.experience": "Some settings are disabled since your current world is an experience", - "mco.configure.world.edit.subscreen.inspiration": "Some settings are disabled since your current world is an inspiration", - "mco.configure.world.forceGameMode": "Force Game Mode", - "mco.configure.world.invite.narration": "You have %s new invite(s)", - "mco.configure.world.invite.profile.name": "Name", - "mco.configure.world.invited": "Invited", - "mco.configure.world.invited.number": "Invited (%s)", - "mco.configure.world.invites.normal.tooltip": "Normal user", - "mco.configure.world.invites.ops.tooltip": "Operator", - "mco.configure.world.invites.remove.tooltip": "Remove", - "mco.configure.world.leave.question.line1": "If you leave this realm you won't see it unless you are invited again", - "mco.configure.world.leave.question.line2": "Are you sure you want to continue?", - "mco.configure.world.location": "Location", - "mco.configure.world.minigame": "Current: %s", - "mco.configure.world.name": "Realm Name", - "mco.configure.world.opening": "Opening the realm...", - "mco.configure.world.players.error": "A player with the provided name does not exist", - "mco.configure.world.players.inviting": "Inviting player...", - "mco.configure.world.players.title": "Players", - "mco.configure.world.pvp": "PVP", - "mco.configure.world.reset.question.line1": "Your world will be regenerated and your current world will be lost", - "mco.configure.world.reset.question.line2": "Are you sure you want to continue?", - "mco.configure.world.resourcepack.question.line1": "You need a custom resource pack to play on this realm", - "mco.configure.world.resourcepack.question.line2": "Do you want to download it and play?", - "mco.configure.world.restore.download.question.line1": "The world will be downloaded and added to your single player worlds.", - "mco.configure.world.restore.download.question.line2": "Do you want to continue?", - "mco.configure.world.restore.question.line1": "Your world will be restored to date '%s' (%s)", - "mco.configure.world.restore.question.line2": "Are you sure you want to continue?", - "mco.configure.world.settings.title": "Settings", - "mco.configure.world.slot": "World %s", - "mco.configure.world.slot.empty": "Empty", - "mco.configure.world.slot.switch.question.line1": "Your realm will be switched to another world", - "mco.configure.world.slot.switch.question.line2": "Are you sure you want to continue?", - "mco.configure.world.slot.tooltip": "Switch to world", - "mco.configure.world.slot.tooltip.active": "Join", - "mco.configure.world.slot.tooltip.minigame": "Switch to minigame", - "mco.configure.world.spawn_toggle.message": "Turning this option off will REMOVE ALL existing entities of that type", - "mco.configure.world.spawn_toggle.message.npc": "Turning this option off will REMOVE ALL existing entities of that type, like Villagers", - "mco.configure.world.spawn_toggle.title": "Warning!", - "mco.configure.world.spawnAnimals": "Spawn Animals", - "mco.configure.world.spawnMonsters": "Spawn Monsters", - "mco.configure.world.spawnNPCs": "Spawn NPCs", - "mco.configure.world.spawnProtection": "Spawn Protection", - "mco.configure.world.status": "Status", - "mco.configure.world.subscription.day": "day", - "mco.configure.world.subscription.days": "days", - "mco.configure.world.subscription.expired": "Expired", - "mco.configure.world.subscription.extend": "Extend Subscription", - "mco.configure.world.subscription.less_than_a_day": "Less than a day", - "mco.configure.world.subscription.month": "month", - "mco.configure.world.subscription.months": "months", - "mco.configure.world.subscription.recurring.daysleft": "Renewed automatically in", - "mco.configure.world.subscription.recurring.info": "Changes made to your Realms subscription such as stacking time or turning off recurring billing will not be reflected until your next bill date.", - "mco.configure.world.subscription.remaining.days": "%1$s day(s)", - "mco.configure.world.subscription.remaining.months": "%1$s month(s)", - "mco.configure.world.subscription.remaining.months.days": "%1$s month(s), %2$s day(s)", - "mco.configure.world.subscription.start": "Start Date", - "mco.configure.world.subscription.timeleft": "Time Left", - "mco.configure.world.subscription.title": "Your Subscription", - "mco.configure.world.subscription.unknown": "Unknown", - "mco.configure.world.switch.slot": "Create World", - "mco.configure.world.switch.slot.subtitle": "This world is empty, choose how to create your world", - "mco.configure.world.title": "Configure Realm:", - "mco.configure.world.uninvite.player": "Are you sure that you want to uninvite '%s'?", - "mco.configure.world.uninvite.question": "Are you sure that you want to uninvite", - "mco.configure.worlds.title": "Worlds", - "mco.connect.authorizing": "Logging in...", - "mco.connect.connecting": "Connecting to the realm...", - "mco.connect.failed": "Failed to connect to the realm", - "mco.connect.success": "Done", - "mco.create.world": "Create", - "mco.create.world.error": "You must enter a name!", - "mco.create.world.reset.title": "Creating world...", - "mco.create.world.skip": "Skip", - "mco.create.world.subtitle": "Optionally, select what world to put on your new realm", - "mco.create.world.wait": "Creating the realm...", - "mco.download.cancelled": "Download cancelled", - "mco.download.confirmation.line1": "The world you are going to download is larger than %s", - "mco.download.confirmation.line2": "You won't be able to upload this world to your realm again", - "mco.download.done": "Download done", - "mco.download.downloading": "Downloading", - "mco.download.extracting": "Extracting", - "mco.download.failed": "Download failed", - "mco.download.percent": "%s %%", - "mco.download.preparing": "Preparing download", - "mco.download.resourcePack.fail": "Failed to download resource pack!", - "mco.download.speed": "(%s/s)", - "mco.download.speed.narration": "%s/s", - "mco.download.title": "Downloading Latest World", - "mco.error.invalid.session.message": "Please try restarting Minecraft", - "mco.error.invalid.session.title": "Invalid Session", - "mco.errorMessage.6001": "Client outdated", - "mco.errorMessage.6002": "Terms of service not accepted", - "mco.errorMessage.6003": "Download limit reached", - "mco.errorMessage.6004": "Upload limit reached", - "mco.errorMessage.6005": "World locked", - "mco.errorMessage.6006": "World is out of date", - "mco.errorMessage.6007": "User in too many Realms", - "mco.errorMessage.6008": "Invalid Realm name", - "mco.errorMessage.6009": "Invalid Realm description", - "mco.errorMessage.connectionFailure": "An error occurred, please try again later.", - "mco.errorMessage.generic": "An error occurred: ", - "mco.errorMessage.noDetails": "No error details provided", - "mco.errorMessage.realmsService": "An error occurred (%s):", - "mco.errorMessage.realmsService.connectivity": "Could not connect to Realms: %s", - "mco.errorMessage.realmsService.realmsError": "Realms (%s):", - "mco.errorMessage.realmsService.unknownCompatibility": "Could not check compatible version, got response: %s", - "mco.errorMessage.retry": "Retry operation", - "mco.errorMessage.serviceBusy": "Realms is busy at the moment.\nPlease try connecting to your Realm again in a couple of minutes.", - "mco.gui.button": "Button", - "mco.gui.ok": "Ok", - "mco.info": "Info!", - "mco.invites.button.accept": "Accept", - "mco.invites.button.reject": "Reject", - "mco.invites.nopending": "No pending invites!", - "mco.invites.pending": "New invite(s)!", - "mco.invites.title": "Pending Invites", - "mco.minigame.world.changeButton": "Select another minigame", - "mco.minigame.world.info.line1": "This will temporarily replace your world with a minigame!", - "mco.minigame.world.info.line2": "You can later return to your original world without losing anything.", - "mco.minigame.world.noSelection": "Please make a selection", - "mco.minigame.world.restore": "Ending minigame...", - "mco.minigame.world.restore.question.line1": "The minigame will end and your realm will be restored.", - "mco.minigame.world.restore.question.line2": "Are you sure you want to continue?", - "mco.minigame.world.selected": "Selected minigame:", - "mco.minigame.world.slot.screen.title": "Switching world...", - "mco.minigame.world.startButton": "Switch", - "mco.minigame.world.starting.screen.title": "Starting minigame...", - "mco.minigame.world.stopButton": "End minigame", - "mco.minigame.world.switch.new": "Select another minigame?", - "mco.minigame.world.switch.title": "Switch minigame", - "mco.minigame.world.title": "Switch realm to minigame", - "mco.news": "Realms news", - "mco.notification.dismiss": "Dismiss", - "mco.notification.transferSubscription.buttonText": "Transfer Now", - "mco.notification.transferSubscription.message": "Java Realms subscriptions are moving to the Microsoft Store. Do not let your subscription expire!\nTransfer now and get 30 days of Realms for free.\nGo to Profile on minecraft.net to transfer your subscription.", - "mco.notification.visitUrl.buttonText.default": "Open link", - "mco.notification.visitUrl.message.default": "Please visit the link below", - "mco.question": "Question", - "mco.reset.world.adventure": "Adventures", - "mco.reset.world.experience": "Experiences", - "mco.reset.world.generate": "New World", - "mco.reset.world.inspiration": "Inspiration", - "mco.reset.world.resetting.screen.title": "Resetting world...", - "mco.reset.world.seed": "Seed (Optional)", - "mco.reset.world.template": "World Templates", - "mco.reset.world.title": "Reset World", - "mco.reset.world.upload": "Upload world", - "mco.reset.world.warning": "This will replace the current world of your realm", - "mco.selectServer.buy": "Buy a Realm!", - "mco.selectServer.close": "Close", - "mco.selectServer.closed": "Closed realm", - "mco.selectServer.closeserver": "Close realm", - "mco.selectServer.configure": "Configure", - "mco.selectServer.configureRealm": "Configure realm", - "mco.selectServer.create": "Create Realm", - "mco.selectServer.create.subtitle": "Select what world to put on your new realm", - "mco.selectServer.expired": "Expired realm", - "mco.selectServer.expiredList": "Your subscription has expired", - "mco.selectServer.expiredRenew": "Renew", - "mco.selectServer.expiredSubscribe": "Subscribe", - "mco.selectServer.expiredTrial": "Your trial has ended", - "mco.selectServer.expires.day": "Expires in a day", - "mco.selectServer.expires.days": "Expires in %s days", - "mco.selectServer.expires.soon": "Expires soon", - "mco.selectServer.leave": "Leave Realm", - "mco.selectServer.loading": "Loading Realms List", - "mco.selectServer.mapOnlySupportedForVersion": "This map is unsupported in %s", - "mco.selectServer.minigame": "Minigame:", - "mco.selectServer.minigameName": "Minigame: %s", - "mco.selectServer.minigameNotSupportedInVersion": "Can't play this minigame in %s", - "mco.selectServer.noRealms": "You don't seem to have a Realm. Add a Realm to play together with your friends.", - "mco.selectServer.note": "Note:", - "mco.selectServer.open": "Open realm", - "mco.selectServer.openserver": "Open realm", - "mco.selectServer.play": "Play", - "mco.selectServer.popup": "Realms is a safe, simple way to enjoy an online Minecraft world with up to ten friends at a time. It supports loads of minigames and plenty of custom worlds! Only the owner of the realm needs to pay.", - "mco.selectServer.purchase": "Add Realm", - "mco.selectServer.trial": "Get a Trial!", - "mco.selectServer.uninitialized": "Click to start your new realm!", - "mco.snapshot.createSnapshotPopup.text": "You are about to create a free Snapshot Realm that will be paired with your paid Realms subscription. This new Snapshot Realm will be accessible for as long as the paid subscription is active. Your paid Realm will not be affected.", - "mco.snapshot.createSnapshotPopup.title": "Create Snapshot Realm?", - "mco.snapshot.creating": "Creating Snapshot Realm...", - "mco.snapshot.description": "Paired with \"%s\"", - "mco.snapshot.friendsRealm.downgrade": "You need to be on version %s to join this Realm", - "mco.snapshot.friendsRealm.upgrade": "%s needs to upgrade their Realm before you can play from this version", - "mco.snapshot.paired": "This Snapshot Realm is paired with \"%s\"", - "mco.snapshot.parent.tooltip": "Use the latest release of Minecraft to play on this Realm", - "mco.snapshot.start": "Start free Snapshot Realm", - "mco.snapshot.subscription.info": "This is a Snapshot Realm that is paired to the subscription of your Realm '%s'. It will stay active for as long as its paired Realm is.", - "mco.snapshot.tooltip": "Use Snapshot Realms to get a sneak peek at upcoming versions of Minecraft, which might include new features and other changes.\n\nYou can find your normal Realms in the release version of the game.", - "mco.snapshotRealmsPopup.message": "Realms are now available in Snapshots starting with Snapshot 23w41a. Every Realms subscription comes with a free Snapshot Realm that is separate from your normal Java Realm!", - "mco.snapshotRealmsPopup.title": "Realms now available in Snapshots", - "mco.snapshotRealmsPopup.urlText": "Learn More", - "mco.template.button.publisher": "Publisher", - "mco.template.button.select": "Select", - "mco.template.button.trailer": "Trailer", - "mco.template.default.name": "World template", - "mco.template.info.tooltip": "Publisher website", - "mco.template.name": "Template", - "mco.template.select.failure": "We couldn't retrieve the list of content for this category.\nPlease check your internet connection, or try again later.", - "mco.template.select.narrate.authors": "Authors: %s", - "mco.template.select.narrate.version": "version %s", - "mco.template.select.none": "Oops, it looks like this content category is currently empty.\nPlease check back later for new content, or if you're a creator,\n%s.", - "mco.template.select.none.linkTitle": "consider submitting something yourself", - "mco.template.title": "World templates", - "mco.template.title.minigame": "Minigames", - "mco.template.trailer.tooltip": "Map trailer", - "mco.terms.buttons.agree": "Agree", - "mco.terms.buttons.disagree": "Don't agree", - "mco.terms.sentence.1": "I agree to the Minecraft Realms", - "mco.terms.sentence.2": "Terms of Service", - "mco.terms.title": "Realms Terms of Service", - "mco.time.daysAgo": "%1$s day(s) ago", - "mco.time.hoursAgo": "%1$s hour(s) ago", - "mco.time.minutesAgo": "%1$s minute(s) ago", - "mco.time.now": "right now", - "mco.time.secondsAgo": "%1$s second(s) ago", - "mco.trial.message.line1": "Want to get your own realm?", - "mco.trial.message.line2": "Click here for more info!", - "mco.upload.button.name": "Upload", - "mco.upload.cancelled": "Upload cancelled", - "mco.upload.close.failure": "Could not close your realm, please try again later", - "mco.upload.done": "Upload done", - "mco.upload.entry.cheats": "%1$s, %2$s", - "mco.upload.entry.id": "%1$s (%2$s)", - "mco.upload.failed": "Upload failed! (%s)", - "mco.upload.hardcore": "Hardcore worlds can't be uploaded!", - "mco.upload.percent": "%s %%", - "mco.upload.preparing": "Preparing your world", - "mco.upload.select.world.none": "No singleplayer worlds found!", - "mco.upload.select.world.subtitle": "Please select a singleplayer world to upload", - "mco.upload.select.world.title": "Upload World", - "mco.upload.size.failure.line1": "'%s' is too big!", - "mco.upload.size.failure.line2": "It is %s. The maximum allowed size is %s.", - "mco.upload.uploading": "Uploading '%s'", - "mco.upload.verifying": "Verifying your world", - "mco.version": "Version: %s", - "mco.warning": "Warning!", - "mco.worldSlot.minigame": "Minigame", - "menu.convertingLevel": "Converting world", - "menu.disconnect": "Disconnect", - "menu.game": "Game Menu", - "menu.generatingLevel": "Generating world", - "menu.generatingTerrain": "Building terrain", - "menu.loadingForcedChunks": "Loading forced chunks for dimension %s", - "menu.loadingLevel": "Loading world", - "menu.modded": " (Modded)", - "menu.multiplayer": "Multiplayer", - "menu.online": "Minecraft Realms", - "menu.options": "Options...", - "menu.paused": "Game Paused", - "menu.playdemo": "Play Demo World", - "menu.playerReporting": "Player Reporting", - "menu.preparingSpawn": "Preparing spawn area: %s%%", - "menu.quit": "Quit Game", - "menu.reportBugs": "Report Bugs", - "menu.resetdemo": "Reset Demo World", - "menu.respawning": "Respawning", - "menu.returnToGame": "Back to Game", - "menu.returnToMenu": "Save and Quit to Title", - "menu.savingChunks": "Saving chunks", - "menu.savingLevel": "Saving world", - "menu.sendFeedback": "Give Feedback", - "menu.shareToLan": "Open to LAN", - "menu.singleplayer": "Singleplayer", - "menu.working": "Working...", - "merchant.current_level": "Trader's current level", - "merchant.deprecated": "Villagers restock up to two times per day.", - "merchant.level.1": "Novice", - "merchant.level.2": "Apprentice", - "merchant.level.3": "Journeyman", - "merchant.level.4": "Expert", - "merchant.level.5": "Master", - "merchant.next_level": "Trader's next level", - "merchant.title": "%s - %s", - "merchant.trades": "Trades", - "mirror.front_back": "↑ ↓", - "mirror.left_right": "← →", - "mirror.none": "|", - "mount.onboard": "Press %1$s to Dismount", - "multiplayer.applyingPack": "Applying resource pack", - "multiplayer.disconnect.authservers_down": "Authentication servers are down. Please try again later, sorry!", - "multiplayer.disconnect.banned": "You are banned from this server", - "multiplayer.disconnect.banned_ip.expiration": "\nYour ban will be removed on %s", - "multiplayer.disconnect.banned_ip.reason": "Your IP address is banned from this server.\nReason: %s", - "multiplayer.disconnect.banned.expiration": "\nYour ban will be removed on %s", - "multiplayer.disconnect.banned.reason": "You are banned from this server.\nReason: %s", - "multiplayer.disconnect.chat_validation_failed": "Chat message validation failure", - "multiplayer.disconnect.duplicate_login": "You logged in from another location", - "multiplayer.disconnect.expired_public_key": "Expired profile public key. Check that your system time is synchronized, and try restarting your game.", - "multiplayer.disconnect.flying": "Flying is not enabled on this server", - "multiplayer.disconnect.generic": "Disconnected", - "multiplayer.disconnect.idling": "You have been idle for too long!", - "multiplayer.disconnect.illegal_characters": "Illegal characters in chat", - "multiplayer.disconnect.incompatible": "Incompatible client! Please use %s", - "multiplayer.disconnect.invalid_entity_attacked": "Attempting to attack an invalid entity", - "multiplayer.disconnect.invalid_packet": "Server sent an invalid packet", - "multiplayer.disconnect.invalid_player_data": "Invalid player data", - "multiplayer.disconnect.invalid_player_movement": "Invalid move player packet received", - "multiplayer.disconnect.invalid_public_key_signature": "Invalid signature for profile public key.\nTry restarting your game.", - "multiplayer.disconnect.invalid_public_key_signature.new": "Invalid signature for profile public key.\nTry restarting your game.", - "multiplayer.disconnect.invalid_vehicle_movement": "Invalid move vehicle packet received", - "multiplayer.disconnect.ip_banned": "You have been IP banned from this server", - "multiplayer.disconnect.kicked": "Kicked by an operator", - "multiplayer.disconnect.missing_tags": "Incomplete set of tags received from server.\nPlease contact server operator.", - "multiplayer.disconnect.name_taken": "That name is already taken", - "multiplayer.disconnect.not_whitelisted": "You are not white-listed on this server!", - "multiplayer.disconnect.out_of_order_chat": "Out-of-order chat packet received. Did your system time change?", - "multiplayer.disconnect.outdated_client": "Incompatible client! Please use %s", - "multiplayer.disconnect.outdated_server": "Incompatible client! Please use %s", - "multiplayer.disconnect.server_full": "The server is full!", - "multiplayer.disconnect.server_shutdown": "Server closed", - "multiplayer.disconnect.slow_login": "Took too long to log in", - "multiplayer.disconnect.too_many_pending_chats": "Too many unacknowledged chat messages", - "multiplayer.disconnect.unexpected_query_response": "Unexpected custom data from client", - "multiplayer.disconnect.unsigned_chat": "Received chat packet with missing or invalid signature.", - "multiplayer.disconnect.unverified_username": "Failed to verify username!", - "multiplayer.downloadingStats": "Retrieving statistics...", - "multiplayer.downloadingTerrain": "Loading terrain...", - "multiplayer.lan.server_found": "New server found: %s", - "multiplayer.message_not_delivered": "Can't deliver chat message, check server logs: %s", - "multiplayer.player.joined": "%s joined the game", - "multiplayer.player.joined.renamed": "%s (formerly known as %s) joined the game", - "multiplayer.player.left": "%s left the game", - "multiplayer.player.list.hp": "%shp", - "multiplayer.player.list.narration": "Online players: %s", - "multiplayer.requiredTexturePrompt.disconnect": "Server requires a custom resource pack", - "multiplayer.requiredTexturePrompt.line1": "This server requires the use of a custom resource pack.", - "multiplayer.requiredTexturePrompt.line2": "Rejecting this custom resource pack will disconnect you from this server.", - "multiplayer.socialInteractions.not_available": "Social Interactions are only available in Multiplayer worlds", - "multiplayer.status.and_more": "... and %s more ...", - "multiplayer.status.cancelled": "Cancelled", - "multiplayer.status.cannot_connect": "Can't connect to server", - "multiplayer.status.cannot_resolve": "Can't resolve hostname", - "multiplayer.status.finished": "Finished", - "multiplayer.status.incompatible": "Incompatible version!", - "multiplayer.status.motd.narration": "Message of the day: %s", - "multiplayer.status.no_connection": "(no connection)", - "multiplayer.status.old": "Old", - "multiplayer.status.online": "Online", - "multiplayer.status.ping": "%s ms", - "multiplayer.status.ping.narration": "Ping %s milliseconds", - "multiplayer.status.pinging": "Pinging...", - "multiplayer.status.player_count": "%s/%s", - "multiplayer.status.player_count.narration": "%s out of %s players online", - "multiplayer.status.quitting": "Quitting", - "multiplayer.status.request_handled": "Status request has been handled", - "multiplayer.status.unknown": "???", - "multiplayer.status.unrequested": "Received unrequested status", - "multiplayer.status.version.narration": "Server version: %s", - "multiplayer.stopSleeping": "Leave Bed", - "multiplayer.texturePrompt.failure.line1": "Server resource pack couldn't be applied", - "multiplayer.texturePrompt.failure.line2": "Any functionality that requires custom resources might not work as expected", - "multiplayer.texturePrompt.line1": "This server recommends the use of a custom resource pack.", - "multiplayer.texturePrompt.line2": "Would you like to download and install it automagically?", - "multiplayer.texturePrompt.serverPrompt": "%s\n\nMessage from server:\n%s", - "multiplayer.title": "Play Multiplayer", - "multiplayer.unsecureserver.toast": "Messages sent on this server may be modified and might not reflect the original message", - "multiplayer.unsecureserver.toast.title": "Chat messages can't be verified", - "multiplayerWarning.check": "Do not show this screen again", - "multiplayerWarning.header": "Caution: Third-Party Online Play", - "multiplayerWarning.message": "Caution: Online play is offered by third-party servers that are not owned, operated, or supervised by Mojang Studios or Microsoft. During online play, you may be exposed to unmoderated chat messages or other types of user-generated content that may not be suitable for everyone.", - "narration.button": "Button: %s", - "narration.button.usage.focused": "Press Enter to activate", - "narration.button.usage.hovered": "Left click to activate", - "narration.checkbox": "Checkbox: %s", - "narration.checkbox.usage.focused": "Press Enter to toggle", - "narration.checkbox.usage.hovered": "Left click to toggle", - "narration.component_list.usage": "Press Tab to navigate to next element", - "narration.cycle_button.usage.focused": "Press Enter to switch to %s", - "narration.cycle_button.usage.hovered": "Left click to switch to %s", - "narration.edit_box": "Edit box: %s", - "narration.recipe": "Recipe for %s", - "narration.recipe.usage": "Left click to select", - "narration.recipe.usage.more": "Right click to show more recipes", - "narration.selection.usage": "Press up and down buttons to move to another entry", - "narration.slider.usage.focused": "Press left or right keyboard buttons to change value", - "narration.slider.usage.hovered": "Drag slider to change value", - "narration.suggestion": "Selected suggestion %d out of %d: %s", - "narration.suggestion.tooltip": "Selected suggestion %d out of %d: %s (%s)", - "narration.suggestion.usage.cycle.fixed": "Press Tab to cycle to the next suggestion", - "narration.suggestion.usage.cycle.hidable": "Press Tab to cycle to the next suggestion, or Escape to leave suggestions", - "narration.suggestion.usage.fill.fixed": "Press Tab to use suggestion", - "narration.suggestion.usage.fill.hidable": "Press Tab to use suggestion, or Escape to leave suggestions", - "narration.tab_navigation.usage": "Press Ctrl and Tab to switch between tabs", - "narrator.button.accessibility": "Accessibility", - "narrator.button.difficulty_lock": "Difficulty lock", - "narrator.button.difficulty_lock.locked": "Locked", - "narrator.button.difficulty_lock.unlocked": "Unlocked", - "narrator.button.language": "Language", - "narrator.controls.bound": "%s is bound to %s", - "narrator.controls.reset": "Reset %s button", - "narrator.controls.unbound": "%s is not bound", - "narrator.joining": "Joining", - "narrator.loading": "Loading: %s", - "narrator.loading.done": "Done", - "narrator.position.list": "Selected list row %s out of %s", - "narrator.position.object_list": "Selected row element %s out of %s", - "narrator.position.screen": "Screen element %s out of %s", - "narrator.position.tab": "Selected tab %s out of %s", - "narrator.ready_to_play": "Ready to play", - "narrator.screen.title": "Title Screen", - "narrator.screen.usage": "Use mouse cursor or Tab button to select element", - "narrator.select": "Selected: %s", - "narrator.select.world": "Selected %s, last played: %s, %s, %s, version: %s", - "narrator.select.world_info": "Selected %s, last played: %s, %s", - "narrator.toast.disabled": "Narrator Disabled", - "narrator.toast.enabled": "Narrator Enabled", - "optimizeWorld.confirm.description": "This will attempt to optimize your world by making sure all data is stored in the most recent game format. This can take a very long time, depending on your world. Once done, your world may play faster but will no longer be compatible with older versions of the game. Are you sure you wish to proceed?", - "optimizeWorld.confirm.title": "Optimize World", - "optimizeWorld.info.converted": "Upgraded chunks: %s", - "optimizeWorld.info.skipped": "Skipped chunks: %s", - "optimizeWorld.info.total": "Total chunks: %s", - "optimizeWorld.progress.counter": "%s / %s", - "optimizeWorld.progress.percentage": "%s%%", - "optimizeWorld.stage.counting": "Counting chunks...", - "optimizeWorld.stage.failed": "Failed! :(", - "optimizeWorld.stage.finished": "Finishing up...", - "optimizeWorld.stage.upgrading": "Upgrading all chunks...", - "optimizeWorld.title": "Optimizing World '%s'", - "options.accessibility": "Accessibility Settings...", - "options.accessibility.high_contrast": "High Contrast", - "options.accessibility.high_contrast.error.tooltip": "High Contrast resource pack is not available", - "options.accessibility.high_contrast.tooltip": "Enhances the contrast of UI elements", - "options.accessibility.link": "Accessibility Guide", - "options.accessibility.narrator_hotkey": "Narrator Hotkey", - "options.accessibility.narrator_hotkey.mac.tooltip": "Allows the Narrator to be toggled on and off with 'Cmd+B'", - "options.accessibility.narrator_hotkey.tooltip": "Allows the Narrator to be toggled on and off with 'Ctrl+B'", - "options.accessibility.panorama_speed": "Panorama Scroll Speed", - "options.accessibility.text_background": "Text Background", - "options.accessibility.text_background_opacity": "Text Background Opacity", - "options.accessibility.text_background.chat": "Chat", - "options.accessibility.text_background.everywhere": "Everywhere", - "options.accessibility.title": "Accessibility Settings", - "options.allowServerListing": "Allow Server Listings", - "options.allowServerListing.tooltip": "Servers may list online players as part of their public status.\nWith this option off your name will not show up in such lists.", - "options.ao": "Smooth Lighting", - "options.ao.max": "Maximum", - "options.ao.min": "Minimum", - "options.ao.off": "OFF", - "options.attack.crosshair": "Crosshair", - "options.attack.hotbar": "Hotbar", - "options.attackIndicator": "Attack Indicator", - "options.audioDevice": "Device", - "options.audioDevice.default": "System Default", - "options.autoJump": "Auto-Jump", - "options.autosaveIndicator": "Autosave Indicator", - "options.autoSuggestCommands": "Command Suggestions", - "options.biomeBlendRadius": "Biome Blend", - "options.biomeBlendRadius.1": "OFF (Fastest)", - "options.biomeBlendRadius.3": "3x3 (Fast)", - "options.biomeBlendRadius.5": "5x5 (Normal)", - "options.biomeBlendRadius.7": "7x7 (High)", - "options.biomeBlendRadius.9": "9x9 (Very High)", - "options.biomeBlendRadius.11": "11x11 (Extreme)", - "options.biomeBlendRadius.13": "13x13 (Showoff)", - "options.biomeBlendRadius.15": "15x15 (Maximum)", - "options.chat": "Chat Settings...", - "options.chat.color": "Colors", - "options.chat.delay": "Chat Delay: %s seconds", - "options.chat.delay_none": "Chat Delay: None", - "options.chat.height.focused": "Focused Height", - "options.chat.height.unfocused": "Unfocused Height", - "options.chat.line_spacing": "Line Spacing", - "options.chat.links": "Web Links", - "options.chat.links.prompt": "Prompt on Links", - "options.chat.opacity": "Chat Text Opacity", - "options.chat.scale": "Chat Text Size", - "options.chat.title": "Chat Settings", - "options.chat.visibility": "Chat", - "options.chat.visibility.full": "Shown", - "options.chat.visibility.hidden": "Hidden", - "options.chat.visibility.system": "Commands Only", - "options.chat.width": "Width", - "options.chunks": "%s chunks", - "options.clouds.fancy": "Fancy", - "options.clouds.fast": "Fast", - "options.controls": "Controls...", - "options.credits_and_attribution": "Credits & Attribution...", - "options.customizeTitle": "Customize World Settings", - "options.damageTiltStrength": "Damage Tilt", - "options.damageTiltStrength.tooltip": "The amount of camera shake caused by being hurt.", - "options.darkMojangStudiosBackgroundColor": "Monochrome Logo", - "options.darkMojangStudiosBackgroundColor.tooltip": "Changes the Mojang Studios loading screen background color to black.", - "options.darknessEffectScale": "Darkness Pulsing", - "options.darknessEffectScale.tooltip": "Controls how much the Darkness effect pulses when a Warden or Sculk Shrieker gives it to you.", - "options.difficulty": "Difficulty", - "options.difficulty.easy": "Easy", - "options.difficulty.easy.info": "Hostile mobs spawn but deal less damage. Hunger bar depletes and drains health down to 5 hearts.", - "options.difficulty.hard": "Hard", - "options.difficulty.hard.info": "Hostile mobs spawn and deal more damage. Hunger bar depletes and drains all health.", - "options.difficulty.hardcore": "Hardcore", - "options.difficulty.normal": "Normal", - "options.difficulty.normal.info": "Hostile mobs spawn and deal standard damage. Hunger bar depletes and drains health down to half a heart.", - "options.difficulty.online": "Server Difficulty", - "options.difficulty.peaceful": "Peaceful", - "options.difficulty.peaceful.info": "No hostile mobs and only some neutral mobs spawn. Hunger bar doesn't deplete and health replenishes over time.", - "options.directionalAudio": "Directional Audio", - "options.directionalAudio.off.tooltip": "Classic Stereo sound", - "options.directionalAudio.on.tooltip": "Uses HRTF-based directional audio to improve the simulation of 3D sound. Requires HRTF compatible audio hardware, and is best experienced with headphones.", - "options.discrete_mouse_scroll": "Discrete Scrolling", - "options.entityDistanceScaling": "Entity Distance", - "options.entityShadows": "Entity Shadows", - "options.forceUnicodeFont": "Force Unicode Font", - "options.fov": "FOV", - "options.fov.max": "Quake Pro", - "options.fov.min": "Normal", - "options.fovEffectScale": "FOV Effects", - "options.fovEffectScale.tooltip": "Controls how much the field of view can change with gameplay effects.", - "options.framerate": "%s fps", - "options.framerateLimit": "Max Framerate", - "options.framerateLimit.max": "Unlimited", - "options.fullscreen": "Fullscreen", - "options.fullscreen.current": "Current", - "options.fullscreen.entry": "%sx%s@%s (%sbit)", - "options.fullscreen.resolution": "Fullscreen Resolution", - "options.fullscreen.unavailable": "Setting unavailable", - "options.gamma": "Brightness", - "options.gamma.default": "Default", - "options.gamma.max": "Bright", - "options.gamma.min": "Moody", - "options.generic_value": "%s: %s", - "options.glintSpeed": "Glint Speed", - "options.glintSpeed.tooltip": "Controls how fast the visual glint shimmers across enchanted items.", - "options.glintStrength": "Glint Strength", - "options.glintStrength.tooltip": "Controls how transparent the visual glint is on enchanted items.", - "options.graphics": "Graphics", - "options.graphics.fabulous": "Fabulous!", - "options.graphics.fabulous.tooltip": "%s graphics uses screen shaders for drawing weather, clouds, and particles behind translucent blocks and water.\nThis may severely impact performance for portable devices and 4K displays.", - "options.graphics.fancy": "Fancy", - "options.graphics.fancy.tooltip": "Fancy graphics balances performance and quality for the majority of machines.\nWeather, clouds, and particles may not appear behind translucent blocks or water.", - "options.graphics.fast": "Fast", - "options.graphics.fast.tooltip": "Fast graphics reduces the amount of visible rain and snow.\nTransparency effects are disabled for various blocks such as leaves.", - "options.graphics.warning.accept": "Continue Without Support", - "options.graphics.warning.cancel": "Take Me Back", - "options.graphics.warning.message": "Your graphics device is detected as unsupported for the %s graphics option.\n\nYou may ignore this and continue, however support will not be provided for your device if you choose to use %s graphics.", - "options.graphics.warning.renderer": "Renderer detected: [%s]", - "options.graphics.warning.title": "Graphics Device Unsupported", - "options.graphics.warning.vendor": "Vendor detected: [%s]", - "options.graphics.warning.version": "OpenGL Version detected: [%s]", - "options.guiScale": "GUI Scale", - "options.guiScale.auto": "Auto", - "options.hidden": "Hidden", - "options.hideLightningFlashes": "Hide Lightning Flashes", - "options.hideLightningFlashes.tooltip": "Prevents Lightning Bolts from making the sky flash. The bolts themselves will still be visible.", - "options.hideMatchedNames": "Hide Matched Names", - "options.hideMatchedNames.tooltip": "3rd-party Servers may send chat messages in non-standard formats.\nWith this option on, hidden players will be matched based on chat sender names.", - "options.hideSplashTexts": "Hide Splash Texts", - "options.hideSplashTexts.tooltip": "Hides the yellow splash text in the main menu.", - "options.invertMouse": "Invert Mouse", - "options.key.hold": "Hold", - "options.key.toggle": "Toggle", - "options.language": "Language...", - "options.language.title": "Language", - "options.languageAccuracyWarning": "(Language translations may not be 100%% accurate)", - "options.languageWarning": "Language translations may not be 100%% accurate", - "options.mainHand": "Main Hand", - "options.mainHand.left": "Left", - "options.mainHand.right": "Right", - "options.mipmapLevels": "Mipmap Levels", - "options.modelPart.cape": "Cape", - "options.modelPart.hat": "Hat", - "options.modelPart.jacket": "Jacket", - "options.modelPart.left_pants_leg": "Left Pants Leg", - "options.modelPart.left_sleeve": "Left Sleeve", - "options.modelPart.right_pants_leg": "Right Pants Leg", - "options.modelPart.right_sleeve": "Right Sleeve", - "options.mouse_settings": "Mouse Settings...", - "options.mouse_settings.title": "Mouse Settings", - "options.mouseWheelSensitivity": "Scroll Sensitivity", - "options.multiplayer.title": "Multiplayer Settings...", - "options.multiplier": "%sx", - "options.narrator": "Narrator", - "options.narrator.all": "Narrates All", - "options.narrator.chat": "Narrates Chat", - "options.narrator.notavailable": "Not Available", - "options.narrator.off": "OFF", - "options.narrator.system": "Narrates System", - "options.notifications.display_time": "Notification Time", - "options.notifications.display_time.tooltip": "Affects the length of time that all notifications stay visible on the screen.", - "options.off": "OFF", - "options.off.composed": "%s: OFF", - "options.on": "ON", - "options.on.composed": "%s: ON", - "options.online": "Online...", - "options.online.title": "Online Options", - "options.onlyShowSecureChat": "Only Show Secure Chat", - "options.onlyShowSecureChat.tooltip": "Only display messages from other players that can be verified to have been sent by that player, and have not been modified.", - "options.operatorItemsTab": "Operator Items Tab", - "options.particles": "Particles", - "options.particles.all": "All", - "options.particles.decreased": "Decreased", - "options.particles.minimal": "Minimal", - "options.percent_add_value": "%s: +%s%%", - "options.percent_value": "%s: %s%%", - "options.pixel_value": "%s: %spx", - "options.prioritizeChunkUpdates": "Chunk Builder", - "options.prioritizeChunkUpdates.byPlayer": "Semi Blocking", - "options.prioritizeChunkUpdates.byPlayer.tooltip": "Some actions within a chunk will recompile the chunk immediately. This includes block placing & destroying.", - "options.prioritizeChunkUpdates.nearby": "Fully Blocking", - "options.prioritizeChunkUpdates.nearby.tooltip": "Nearby chunks are always compiled immediately. This may impact game performance when blocks are placed or destroyed.", - "options.prioritizeChunkUpdates.none": "Threaded", - "options.prioritizeChunkUpdates.none.tooltip": "Nearby chunks are compiled in parallel threads. This may result in brief visual holes when blocks are destroyed.", - "options.rawMouseInput": "Raw Input", - "options.realmsNotifications": "Realms News & Invites", - "options.reducedDebugInfo": "Reduced Debug Info", - "options.renderClouds": "Clouds", - "options.renderDistance": "Render Distance", - "options.resourcepack": "Resource Packs...", - "options.screenEffectScale": "Distortion Effects", - "options.screenEffectScale.tooltip": "Strength of nausea and Nether portal screen distortion effects.\nAt lower values, the nausea effect is replaced with a green overlay.", - "options.sensitivity": "Sensitivity", - "options.sensitivity.max": "HYPERSPEED!!!", - "options.sensitivity.min": "*yawn*", - "options.showSubtitles": "Show Subtitles", - "options.simulationDistance": "Simulation Distance", - "options.skinCustomisation": "Skin Customization...", - "options.skinCustomisation.title": "Skin Customization", - "options.sounds": "Music & Sounds...", - "options.sounds.title": "Music & Sound Options", - "options.telemetry": "Telemetry Data...", - "options.telemetry.button": "Data Collection", - "options.telemetry.button.tooltip": "\"%s\" includes only the required data.\n\"%s\" includes optional, as well as the required data.", - "options.telemetry.state.all": "All", - "options.telemetry.state.minimal": "Minimal", - "options.telemetry.state.none": "None", - "options.title": "Options", - "options.touchscreen": "Touchscreen Mode", - "options.video": "Video Settings...", - "options.videoTitle": "Video Settings", - "options.viewBobbing": "View Bobbing", - "options.visible": "Shown", - "options.vsync": "VSync", - "outOfMemory.message": "Minecraft has run out of memory.\n\nThis could be caused by a bug in the game or by the Java Virtual Machine not being allocated enough memory.\n\nTo prevent world corruption, the current game has quit. We've tried to free up enough memory to let you go back to the main menu and back to playing, but this may not have worked.\n\nPlease restart the game if you see this message again.", - "outOfMemory.title": "Out of memory!", - "pack.available.title": "Available", - "pack.copyFailure": "Failed to copy packs", - "pack.dropConfirm": "Do you want to add the following packs to Minecraft?", - "pack.dropInfo": "Drag and drop files into this window to add packs", - "pack.dropRejected.message": "The following entries were not valid packs and were not copied:\n %s", - "pack.dropRejected.title": "Non-pack entries", - "pack.folderInfo": "(Place pack files here)", - "pack.incompatible": "Incompatible", - "pack.incompatible.confirm.new": "This pack was made for a newer version of Minecraft and may not work correctly.", - "pack.incompatible.confirm.old": "This pack was made for an older version of Minecraft and may no longer work correctly.", - "pack.incompatible.confirm.title": "Are you sure you want to load this pack?", - "pack.incompatible.new": "(Made for a newer version of Minecraft)", - "pack.incompatible.old": "(Made for an older version of Minecraft)", - "pack.nameAndSource": "%s (%s)", - "pack.openFolder": "Open Pack Folder", - "pack.selected.title": "Selected", - "pack.source.builtin": "built-in", - "pack.source.feature": "feature", - "pack.source.local": "local", - "pack.source.server": "server", - "pack.source.world": "world", - "painting.dimensions": "%sx%s", - "painting.minecraft.alban.author": "Kristoffer Zetterstrand", - "painting.minecraft.alban.title": "Albanian", - "painting.minecraft.aztec.author": "Kristoffer Zetterstrand", - "painting.minecraft.aztec.title": "de_aztec", - "painting.minecraft.aztec2.author": "Kristoffer Zetterstrand", - "painting.minecraft.aztec2.title": "de_aztec", - "painting.minecraft.bomb.author": "Kristoffer Zetterstrand", - "painting.minecraft.bomb.title": "Target Successfully Bombed", - "painting.minecraft.burning_skull.author": "Kristoffer Zetterstrand", - "painting.minecraft.burning_skull.title": "Skull On Fire", - "painting.minecraft.bust.author": "Kristoffer Zetterstrand", - "painting.minecraft.bust.title": "Bust", - "painting.minecraft.courbet.author": "Kristoffer Zetterstrand", - "painting.minecraft.courbet.title": "Bonjour Monsieur Courbet", - "painting.minecraft.creebet.author": "Kristoffer Zetterstrand", - "painting.minecraft.creebet.title": "Creebet", - "painting.minecraft.donkey_kong.author": "Kristoffer Zetterstrand", - "painting.minecraft.donkey_kong.title": "Kong", - "painting.minecraft.earth.author": "Mojang", - "painting.minecraft.earth.title": "Earth", - "painting.minecraft.fighters.author": "Kristoffer Zetterstrand", - "painting.minecraft.fighters.title": "Fighters", - "painting.minecraft.fire.author": "Mojang", - "painting.minecraft.fire.title": "Fire", - "painting.minecraft.graham.author": "Kristoffer Zetterstrand", - "painting.minecraft.graham.title": "Graham", - "painting.minecraft.kebab.author": "Kristoffer Zetterstrand", - "painting.minecraft.kebab.title": "Kebab med tre pepperoni", - "painting.minecraft.match.author": "Kristoffer Zetterstrand", - "painting.minecraft.match.title": "Match", - "painting.minecraft.pigscene.author": "Kristoffer Zetterstrand", - "painting.minecraft.pigscene.title": "Pigscene", - "painting.minecraft.plant.author": "Kristoffer Zetterstrand", - "painting.minecraft.plant.title": "Paradisträd", - "painting.minecraft.pointer.author": "Kristoffer Zetterstrand", - "painting.minecraft.pointer.title": "Pointer", - "painting.minecraft.pool.author": "Kristoffer Zetterstrand", - "painting.minecraft.pool.title": "The Pool", - "painting.minecraft.sea.author": "Kristoffer Zetterstrand", - "painting.minecraft.sea.title": "Seaside", - "painting.minecraft.skeleton.author": "Kristoffer Zetterstrand", - "painting.minecraft.skeleton.title": "Mortal Coil", - "painting.minecraft.skull_and_roses.author": "Kristoffer Zetterstrand", - "painting.minecraft.skull_and_roses.title": "Skull and Roses", - "painting.minecraft.stage.author": "Kristoffer Zetterstrand", - "painting.minecraft.stage.title": "The Stage Is Set", - "painting.minecraft.sunset.author": "Kristoffer Zetterstrand", - "painting.minecraft.sunset.title": "sunset_dense", - "painting.minecraft.void.author": "Kristoffer Zetterstrand", - "painting.minecraft.void.title": "The void", - "painting.minecraft.wanderer.author": "Kristoffer Zetterstrand", - "painting.minecraft.wanderer.title": "Wanderer", - "painting.minecraft.wasteland.author": "Kristoffer Zetterstrand", - "painting.minecraft.wasteland.title": "Wasteland", - "painting.minecraft.water.author": "Mojang", - "painting.minecraft.water.title": "Water", - "painting.minecraft.wind.author": "Mojang", - "painting.minecraft.wind.title": "Wind", - "painting.minecraft.wither.author": "Mojang", - "painting.minecraft.wither.title": "Wither", - "painting.random": "Random variant", - "parsing.bool.expected": "Expected boolean", - "parsing.bool.invalid": "Invalid boolean, expected 'true' or 'false' but found '%s'", - "parsing.double.expected": "Expected double", - "parsing.double.invalid": "Invalid double '%s'", - "parsing.expected": "Expected '%s'", - "parsing.float.expected": "Expected float", - "parsing.float.invalid": "Invalid float '%s'", - "parsing.int.expected": "Expected integer", - "parsing.int.invalid": "Invalid integer '%s'", - "parsing.long.expected": "Expected long", - "parsing.long.invalid": "Invalid long '%s'", - "parsing.quote.escape": "Invalid escape sequence '\\%s' in quoted string", - "parsing.quote.expected.end": "Unclosed quoted string", - "parsing.quote.expected.start": "Expected quote to start a string", - "particle.notFound": "Unknown particle: %s", - "permissions.requires.entity": "An entity is required to run this command here", - "permissions.requires.player": "A player is required to run this command here", - "potion.potency.0": "", - "potion.potency.1": "II", - "potion.potency.2": "III", - "potion.potency.3": "IV", - "potion.potency.4": "V", - "potion.potency.5": "VI", - "potion.whenDrank": "When Applied:", - "potion.withAmplifier": "%s %s", - "potion.withDuration": "%s (%s)", - "predicate.unknown": "Unknown predicate: %s", - "quickplay.error.invalid_identifier": "Could not find world with the provided identifier", - "quickplay.error.realm_connect": "Could not connect to Realm", - "quickplay.error.realm_permission": "Lacking permission to connect to this Realm", - "quickplay.error.title": "Failed to Quick Play", - "realms.missing.module.error.text": "Realms could not be opened right now, please try again later", - "realms.missing.snapshot.error.text": "Realms is currently not supported in snapshots", - "recipe.notFound": "Unknown recipe: %s", - "recipe.toast.description": "Check your recipe book", - "recipe.toast.title": "New Recipes Unlocked!", - "record.nowPlaying": "Now Playing: %s", - "recover_world.bug_tracker": "Report a Bug", - "recover_world.button": "Attempt to Recover", - "recover_world.done.failed": "Failed to recover from previous state.", - "recover_world.done.success": "Recovery was successful!", - "recover_world.done.title": "Recovery done", - "recover_world.issue.missing_file": "Missing file", - "recover_world.issue.none": "No issues", - "recover_world.message": "The following issues occurred while trying to read world folder \"%s\".\nIt might be possible to restore the world from an older state or you can report this issue on the bug tracker.", - "recover_world.no_fallback": "No state to recover from available", - "recover_world.restore": "Attempt to Restore", - "recover_world.restoring": "Attempting to restore world...", - "recover_world.state_entry": "State from %s: ", - "recover_world.state_entry.unknown": "unknown", - "recover_world.title": "Failed to load world", - "recover_world.warning": "Failed to load world summary", - "resourcePack.broken_assets": "BROKEN ASSETS DETECTED", - "resourcepack.downloading": "Downloading Resource Pack", - "resourcePack.high_contrast.name": "High Contrast", - "resourcePack.load_fail": "Resource reload failed", - "resourcePack.programmer_art.name": "Programmer Art", - "resourcepack.progress": "Downloading file (%s MB)...", - "resourcepack.requesting": "Making Request...", - "resourcePack.server.name": "World Specific Resources", - "resourcePack.title": "Select Resource Packs", - "resourcePack.vanilla.description": "The default look and feel of Minecraft", - "resourcePack.vanilla.name": "Default", - "screenshot.failure": "Couldn't save screenshot: %s", - "screenshot.success": "Saved screenshot as %s", - "selectServer.add": "Add Server", - "selectServer.defaultName": "Minecraft Server", - "selectServer.delete": "Delete", - "selectServer.deleteButton": "Delete", - "selectServer.deleteQuestion": "Are you sure you want to remove this server?", - "selectServer.deleteWarning": "'%s' will be lost forever! (A long time!)", - "selectServer.direct": "Direct Connection", - "selectServer.edit": "Edit", - "selectServer.hiddenAddress": "(Hidden)", - "selectServer.refresh": "Refresh", - "selectServer.select": "Join Server", - "selectServer.title": "Select Server", - "selectWorld.access_failure": "Failed to access world", - "selectWorld.allowCommands": "Allow Cheats", - "selectWorld.allowCommands.info": "Commands like /gamemode, /experience", - "selectWorld.backupEraseCache": "Erase Cached Data", - "selectWorld.backupJoinConfirmButton": "Create Backup and Load", - "selectWorld.backupJoinSkipButton": "I know what I'm doing!", - "selectWorld.backupQuestion.customized": "Customized worlds are no longer supported", - "selectWorld.backupQuestion.downgrade": "Downgrading a world is not supported", - "selectWorld.backupQuestion.experimental": "Worlds using Experimental Settings are not supported", - "selectWorld.backupQuestion.snapshot": "Do you really want to load this world?", - "selectWorld.backupWarning.customized": "Unfortunately, we do not support customized worlds in this version of Minecraft. We can still load this world and keep everything the way it was, but any newly generated terrain will no longer be customized. We're sorry for the inconvenience!", - "selectWorld.backupWarning.downgrade": "This world was last played in version %s; you are on version %s. Downgrading a world could cause corruption - we cannot guarantee that it will load or work. If you still want to continue, please make a backup.", - "selectWorld.backupWarning.experimental": "This world uses experimental settings that could stop working at any time. We cannot guarantee it will load or work. Here be dragons!", - "selectWorld.backupWarning.snapshot": "This world was last played in version %s; you are on version %s. Please make a backup in case you experience world corruptions.", - "selectWorld.bonusItems": "Bonus Chest", - "selectWorld.cheats": "Cheats", - "selectWorld.conversion": "Must be converted!", - "selectWorld.conversion.tooltip": "This world must be opened in an older version (like 1.6.4) to be safely converted", - "selectWorld.create": "Create New World", - "selectWorld.createDemo": "Play New Demo World", - "selectWorld.customizeType": "Customize", - "selectWorld.data_read": "Reading world data...", - "selectWorld.dataPacks": "Data Packs", - "selectWorld.delete": "Delete", - "selectWorld.delete_failure": "Failed to delete world", - "selectWorld.deleteButton": "Delete", - "selectWorld.deleteQuestion": "Are you sure you want to delete this world?", - "selectWorld.deleteWarning": "'%s' will be lost forever! (A long time!)", - "selectWorld.edit": "Edit", - "selectWorld.edit.backup": "Make Backup", - "selectWorld.edit.backupCreated": "Backed up: %s", - "selectWorld.edit.backupFailed": "Backup failed", - "selectWorld.edit.backupFolder": "Open Backups Folder", - "selectWorld.edit.backupSize": "size: %s MB", - "selectWorld.edit.export_worldgen_settings": "Export World Generation Settings", - "selectWorld.edit.export_worldgen_settings.failure": "Export failed", - "selectWorld.edit.export_worldgen_settings.success": "Exported", - "selectWorld.edit.openFolder": "Open World Folder", - "selectWorld.edit.optimize": "Optimize World", - "selectWorld.edit.resetIcon": "Reset Icon", - "selectWorld.edit.save": "Save", - "selectWorld.edit.title": "Edit World", - "selectWorld.enterName": "World Name", - "selectWorld.enterSeed": "Seed for the world generator", - "selectWorld.experimental": "Experimental", - "selectWorld.experimental.details": "Details", - "selectWorld.experimental.details.entry": "Required experimental features: %s", - "selectWorld.experimental.details.title": "Experimental feature requirements", - "selectWorld.experimental.message": "Be careful!\nThis configuration requires features that are still under development. Your world might crash, break, or not work with future updates.", - "selectWorld.experimental.title": "Experimental Features Warning", - "selectWorld.experiments": "Experiments", - "selectWorld.experiments.info": "Experiments are potential new features. Be careful as things might break. Experiments can't be turned off after world creation.", - "selectWorld.futureworld.error.text": "Something went wrong while trying to load a world from a future version. This was a risky operation to begin with; sorry it didn't work.", - "selectWorld.futureworld.error.title": "An error occurred!", - "selectWorld.gameMode": "Game Mode", - "selectWorld.gameMode.adventure": "Adventure", - "selectWorld.gameMode.adventure.info": "Same as Survival Mode, but blocks can't be added or removed.", - "selectWorld.gameMode.adventure.line1": "Same as Survival Mode, but blocks can't", - "selectWorld.gameMode.adventure.line2": "be added or removed", - "selectWorld.gameMode.creative": "Creative", - "selectWorld.gameMode.creative.info": "Create, build, and explore without limits. You can fly, have endless materials, and can't be hurt by monsters.", - "selectWorld.gameMode.creative.line1": "Unlimited resources, free flying and", - "selectWorld.gameMode.creative.line2": "destroy blocks instantly", - "selectWorld.gameMode.hardcore": "Hardcore", - "selectWorld.gameMode.hardcore.info": "Survival Mode locked to 'Hard' difficulty. You can't respawn if you die.", - "selectWorld.gameMode.hardcore.line1": "Same as Survival Mode, locked at hardest", - "selectWorld.gameMode.hardcore.line2": "difficulty, and one life only", - "selectWorld.gameMode.spectator": "Spectator", - "selectWorld.gameMode.spectator.info": "You can look but don't touch.", - "selectWorld.gameMode.spectator.line1": "You can look but don't touch", - "selectWorld.gameMode.spectator.line2": "", - "selectWorld.gameMode.survival": "Survival", - "selectWorld.gameMode.survival.info": "Explore a mysterious world where you build, collect, craft, and fight monsters.", - "selectWorld.gameMode.survival.line1": "Search for resources, craft, gain", - "selectWorld.gameMode.survival.line2": "levels, health and hunger", - "selectWorld.gameRules": "Game Rules", - "selectWorld.import_worldgen_settings": "Import Settings", - "selectWorld.import_worldgen_settings.failure": "Error importing settings", - "selectWorld.import_worldgen_settings.select_file": "Select settings file (.json)", - "selectWorld.incompatible_series": "Created by an incompatible version", - "selectWorld.incompatible.description": "This world cannot be opened in this version.\nIt was last played in version %s.", - "selectWorld.incompatible.info": "Incompatible version: %s", - "selectWorld.incompatible.title": "Incompatible version", - "selectWorld.incompatible.tooltip": "This world cannot be opened because it was created by an incompatible version.", - "selectWorld.load_folder_access": "Unable to read or access folder where game worlds are saved!", - "selectWorld.loading_list": "Loading World List", - "selectWorld.locked": "Locked by another running instance of Minecraft", - "selectWorld.mapFeatures": "Generate Structures", - "selectWorld.mapFeatures.info": "Villages, Shipwrecks, etc.", - "selectWorld.mapType": "World Type", - "selectWorld.mapType.normal": "Normal", - "selectWorld.moreWorldOptions": "More World Options...", - "selectWorld.newWorld": "New World", - "selectWorld.recreate": "Re-Create", - "selectWorld.recreate.customized.text": "Customized worlds are no longer supported in this version of Minecraft. We can try to recreate it with the same seed and properties, but any terrain customizations will be lost. We're sorry for the inconvenience!", - "selectWorld.recreate.customized.title": "Customized worlds are no longer supported", - "selectWorld.recreate.error.text": "Something went wrong while trying to recreate a world.", - "selectWorld.recreate.error.title": "An error occurred!", - "selectWorld.resource_load": "Preparing Resources...", - "selectWorld.resultFolder": "Will be saved in:", - "selectWorld.search": "search for worlds", - "selectWorld.seedInfo": "Leave blank for a random seed", - "selectWorld.select": "Play Selected World", - "selectWorld.targetFolder": "Save folder: %s", - "selectWorld.title": "Select World", - "selectWorld.tooltip.fromNewerVersion1": "World was saved in a newer version,", - "selectWorld.tooltip.fromNewerVersion2": "loading this world could cause problems!", - "selectWorld.tooltip.snapshot1": "Don't forget to back up this world", - "selectWorld.tooltip.snapshot2": "before you load it in this snapshot.", - "selectWorld.unable_to_load": "Unable to load worlds", - "selectWorld.version": "Version:", - "selectWorld.versionJoinButton": "Load Anyway", - "selectWorld.versionQuestion": "Do you really want to load this world?", - "selectWorld.versionUnknown": "unknown", - "selectWorld.versionWarning": "This world was last played in version %s and loading it in this version could cause corruption!", - "selectWorld.warning.deprecated.question": "Some features used are deprecated and will stop working in the future. Do you wish to proceed?", - "selectWorld.warning.deprecated.title": "Warning! These settings are using deprecated features", - "selectWorld.warning.experimental.question": "These settings are experimental and could one day stop working. Do you wish to proceed?", - "selectWorld.warning.experimental.title": "Warning! These settings are using experimental features", - "selectWorld.world": "World", - "sign.edit": "Edit Sign Message", - "sleep.not_possible": "No amount of rest can pass this night", - "sleep.players_sleeping": "%s/%s players sleeping", - "sleep.skipping_night": "Sleeping through this night", - "slot.unknown": "Unknown slot '%s'", - "soundCategory.ambient": "Ambient/Environment", - "soundCategory.block": "Blocks", - "soundCategory.hostile": "Hostile Creatures", - "soundCategory.master": "Master Volume", - "soundCategory.music": "Music", - "soundCategory.neutral": "Friendly Creatures", - "soundCategory.player": "Players", - "soundCategory.record": "Jukebox/Note Blocks", - "soundCategory.voice": "Voice/Speech", - "soundCategory.weather": "Weather", - "spectatorMenu.close": "Close Menu", - "spectatorMenu.next_page": "Next Page", - "spectatorMenu.previous_page": "Previous Page", - "spectatorMenu.root.prompt": "Press a key to select a command, and again to use it.", - "spectatorMenu.team_teleport": "Teleport to Team Member", - "spectatorMenu.team_teleport.prompt": "Select a team to teleport to", - "spectatorMenu.teleport": "Teleport to Player", - "spectatorMenu.teleport.prompt": "Select a player to teleport to", - "stat_type.minecraft.broken": "Times Broken", - "stat_type.minecraft.crafted": "Times Crafted", - "stat_type.minecraft.dropped": "Dropped", - "stat_type.minecraft.killed": "You killed %s %s", - "stat_type.minecraft.killed_by": "%s killed you %s time(s)", - "stat_type.minecraft.killed_by.none": "You have never been killed by %s", - "stat_type.minecraft.killed.none": "You have never killed %s", - "stat_type.minecraft.mined": "Times Mined", - "stat_type.minecraft.picked_up": "Picked Up", - "stat_type.minecraft.used": "Times Used", - "stat.generalButton": "General", - "stat.itemsButton": "Items", - "stat.minecraft.animals_bred": "Animals Bred", - "stat.minecraft.aviate_one_cm": "Distance by Elytra", - "stat.minecraft.bell_ring": "Bells Rung", - "stat.minecraft.boat_one_cm": "Distance by Boat", - "stat.minecraft.clean_armor": "Armor Pieces Cleaned", - "stat.minecraft.clean_banner": "Banners Cleaned", - "stat.minecraft.clean_shulker_box": "Shulker Boxes Cleaned", - "stat.minecraft.climb_one_cm": "Distance Climbed", - "stat.minecraft.crouch_one_cm": "Distance Crouched", - "stat.minecraft.damage_absorbed": "Damage Absorbed", - "stat.minecraft.damage_blocked_by_shield": "Damage Blocked by Shield", - "stat.minecraft.damage_dealt": "Damage Dealt", - "stat.minecraft.damage_dealt_absorbed": "Damage Dealt (Absorbed)", - "stat.minecraft.damage_dealt_resisted": "Damage Dealt (Resisted)", - "stat.minecraft.damage_resisted": "Damage Resisted", - "stat.minecraft.damage_taken": "Damage Taken", - "stat.minecraft.deaths": "Number of Deaths", - "stat.minecraft.drop": "Items Dropped", - "stat.minecraft.eat_cake_slice": "Cake Slices Eaten", - "stat.minecraft.enchant_item": "Items Enchanted", - "stat.minecraft.fall_one_cm": "Distance Fallen", - "stat.minecraft.fill_cauldron": "Cauldrons Filled", - "stat.minecraft.fish_caught": "Fish Caught", - "stat.minecraft.fly_one_cm": "Distance Flown", - "stat.minecraft.horse_one_cm": "Distance by Horse", - "stat.minecraft.inspect_dispenser": "Dispensers Searched", - "stat.minecraft.inspect_dropper": "Droppers Searched", - "stat.minecraft.inspect_hopper": "Hoppers Searched", - "stat.minecraft.interact_with_anvil": "Interactions with Anvil", - "stat.minecraft.interact_with_beacon": "Interactions with Beacon", - "stat.minecraft.interact_with_blast_furnace": "Interactions with Blast Furnace", - "stat.minecraft.interact_with_brewingstand": "Interactions with Brewing Stand", - "stat.minecraft.interact_with_campfire": "Interactions with Campfire", - "stat.minecraft.interact_with_cartography_table": "Interactions with Cartography Table", - "stat.minecraft.interact_with_crafting_table": "Interactions with Crafting Table", - "stat.minecraft.interact_with_furnace": "Interactions with Furnace", - "stat.minecraft.interact_with_grindstone": "Interactions with Grindstone", - "stat.minecraft.interact_with_lectern": "Interactions with Lectern", - "stat.minecraft.interact_with_loom": "Interactions with Loom", - "stat.minecraft.interact_with_smithing_table": "Interactions with Smithing Table", - "stat.minecraft.interact_with_smoker": "Interactions with Smoker", - "stat.minecraft.interact_with_stonecutter": "Interactions with Stonecutter", - "stat.minecraft.jump": "Jumps", - "stat.minecraft.junk_fished": "Junk Fished", - "stat.minecraft.leave_game": "Games Quit", - "stat.minecraft.minecart_one_cm": "Distance by Minecart", - "stat.minecraft.mob_kills": "Mob Kills", - "stat.minecraft.open_barrel": "Barrels Opened", - "stat.minecraft.open_chest": "Chests Opened", - "stat.minecraft.open_enderchest": "Ender Chests Opened", - "stat.minecraft.open_shulker_box": "Shulker Boxes Opened", - "stat.minecraft.pig_one_cm": "Distance by Pig", - "stat.minecraft.play_noteblock": "Note Blocks Played", - "stat.minecraft.play_record": "Music Discs Played", - "stat.minecraft.play_time": "Time Played", - "stat.minecraft.player_kills": "Player Kills", - "stat.minecraft.pot_flower": "Plants Potted", - "stat.minecraft.raid_trigger": "Raids Triggered", - "stat.minecraft.raid_win": "Raids Won", - "stat.minecraft.ring_bell": "Bells Rung", - "stat.minecraft.sleep_in_bed": "Times Slept in a Bed", - "stat.minecraft.sneak_time": "Sneak Time", - "stat.minecraft.sprint_one_cm": "Distance Sprinted", - "stat.minecraft.strider_one_cm": "Distance by Strider", - "stat.minecraft.swim_one_cm": "Distance Swum", - "stat.minecraft.talked_to_villager": "Talked to Villagers", - "stat.minecraft.target_hit": "Targets Hit", - "stat.minecraft.time_since_death": "Time Since Last Death", - "stat.minecraft.time_since_rest": "Time Since Last Rest", - "stat.minecraft.total_world_time": "Time with World Open", - "stat.minecraft.traded_with_villager": "Traded with Villagers", - "stat.minecraft.treasure_fished": "Treasure Fished", - "stat.minecraft.trigger_trapped_chest": "Trapped Chests Triggered", - "stat.minecraft.tune_noteblock": "Note Blocks Tuned", - "stat.minecraft.use_cauldron": "Water Taken from Cauldron", - "stat.minecraft.walk_on_water_one_cm": "Distance Walked on Water", - "stat.minecraft.walk_one_cm": "Distance Walked", - "stat.minecraft.walk_under_water_one_cm": "Distance Walked under Water", - "stat.mobsButton": "Mobs", - "stats.none": "-", - "stats.tooltip.type.statistic": "Statistic", - "structure_block.button.detect_size": "DETECT", - "structure_block.button.load": "LOAD", - "structure_block.button.save": "SAVE", - "structure_block.custom_data": "Custom Data Tag Name", - "structure_block.detect_size": "Detect Structure Size and Position:", - "structure_block.hover.corner": "Corner: %s", - "structure_block.hover.data": "Data: %s", - "structure_block.hover.load": "Load: %s", - "structure_block.hover.save": "Save: %s", - "structure_block.include_entities": "Include Entities:", - "structure_block.integrity": "Structure Integrity and Seed", - "structure_block.integrity.integrity": "Structure Integrity", - "structure_block.integrity.seed": "Structure Seed", - "structure_block.invalid_structure_name": "Invalid structure name '%s'", - "structure_block.load_not_found": "Structure '%s' is not available", - "structure_block.load_prepare": "Structure '%s' position prepared", - "structure_block.load_success": "Structure loaded from '%s'", - "structure_block.mode_info.corner": "Corner Mode - Placement and Size Marker", - "structure_block.mode_info.data": "Data Mode - Game Logic Marker", - "structure_block.mode_info.load": "Load Mode - Load from File", - "structure_block.mode_info.save": "Save Mode - Write to File", - "structure_block.mode.corner": "Corner", - "structure_block.mode.data": "Data", - "structure_block.mode.load": "Load", - "structure_block.mode.save": "Save", - "structure_block.position": "Relative Position", - "structure_block.position.x": "relative Position x", - "structure_block.position.y": "relative position y", - "structure_block.position.z": "relative position z", - "structure_block.save_failure": "Unable to save structure '%s'", - "structure_block.save_success": "Structure saved as '%s'", - "structure_block.show_air": "Show Invisible Blocks:", - "structure_block.show_boundingbox": "Show Bounding Box:", - "structure_block.size": "Structure Size", - "structure_block.size_failure": "Unable to detect structure size. Add corners with matching structure names", - "structure_block.size_success": "Size successfully detected for '%s'", - "structure_block.size.x": "structure size x", - "structure_block.size.y": "structure size y", - "structure_block.size.z": "structure size z", - "structure_block.structure_name": "Structure Name", - "subtitles.ambient.cave": "Eerie noise", - "subtitles.block.amethyst_block.chime": "Amethyst chimes", - "subtitles.block.amethyst_block.resonate": "Amethyst resonates", - "subtitles.block.anvil.destroy": "Anvil destroyed", - "subtitles.block.anvil.land": "Anvil landed", - "subtitles.block.anvil.use": "Anvil used", - "subtitles.block.barrel.close": "Barrel closes", - "subtitles.block.barrel.open": "Barrel opens", - "subtitles.block.beacon.activate": "Beacon activates", - "subtitles.block.beacon.ambient": "Beacon hums", - "subtitles.block.beacon.deactivate": "Beacon deactivates", - "subtitles.block.beacon.power_select": "Beacon power selected", - "subtitles.block.beehive.drip": "Honey drips", - "subtitles.block.beehive.enter": "Bee enters hive", - "subtitles.block.beehive.exit": "Bee leaves hive", - "subtitles.block.beehive.shear": "Shears scrape", - "subtitles.block.beehive.work": "Bees work", - "subtitles.block.bell.resonate": "Bell resonates", - "subtitles.block.bell.use": "Bell rings", - "subtitles.block.big_dripleaf.tilt_down": "Dripleaf tilts down", - "subtitles.block.big_dripleaf.tilt_up": "Dripleaf tilts up", - "subtitles.block.blastfurnace.fire_crackle": "Blast Furnace crackles", - "subtitles.block.brewing_stand.brew": "Brewing Stand bubbles", - "subtitles.block.bubble_column.bubble_pop": "Bubbles pop", - "subtitles.block.bubble_column.upwards_ambient": "Bubbles flow", - "subtitles.block.bubble_column.upwards_inside": "Bubbles woosh", - "subtitles.block.bubble_column.whirlpool_ambient": "Bubbles whirl", - "subtitles.block.bubble_column.whirlpool_inside": "Bubbles zoom", - "subtitles.block.button.click": "Button clicks", - "subtitles.block.cake.add_candle": "Cake squishes", - "subtitles.block.campfire.crackle": "Campfire crackles", - "subtitles.block.candle.crackle": "Candle crackles", - "subtitles.block.chest.close": "Chest closes", - "subtitles.block.chest.locked": "Chest locked", - "subtitles.block.chest.open": "Chest opens", - "subtitles.block.chorus_flower.death": "Chorus Flower withers", - "subtitles.block.chorus_flower.grow": "Chorus Flower grows", - "subtitles.block.comparator.click": "Comparator clicks", - "subtitles.block.composter.empty": "Composter emptied", - "subtitles.block.composter.fill": "Composter filled", - "subtitles.block.composter.ready": "Composter composts", - "subtitles.block.conduit.activate": "Conduit activates", - "subtitles.block.conduit.ambient": "Conduit pulses", - "subtitles.block.conduit.attack.target": "Conduit attacks", - "subtitles.block.conduit.deactivate": "Conduit deactivates", - "subtitles.block.copper_bulb.turn_off": "Copper Bulb turns off", - "subtitles.block.copper_bulb.turn_on": "Copper Bulb turns on", - "subtitles.block.copper_trapdoor.close": "Trapdoor closes", - "subtitles.block.copper_trapdoor.open": "Trapdoor opens", - "subtitles.block.crafter.craft": "Crafter crafts", - "subtitles.block.crafter.fail": "Crafter fails crafting", - "subtitles.block.decorated_pot.insert": "Decorated Pot fills", - "subtitles.block.decorated_pot.insert_fail": "Decorated Pot wobbles", - "subtitles.block.decorated_pot.shatter": "Decorated Pot shatters", - "subtitles.block.dispenser.dispense": "Dispensed item", - "subtitles.block.dispenser.fail": "Dispenser failed", - "subtitles.block.door.toggle": "Door creaks", - "subtitles.block.enchantment_table.use": "Enchanting Table used", - "subtitles.block.end_portal_frame.fill": "Eye of Ender attaches", - "subtitles.block.end_portal.spawn": "End Portal opens", - "subtitles.block.fence_gate.toggle": "Fence Gate creaks", - "subtitles.block.fire.ambient": "Fire crackles", - "subtitles.block.fire.extinguish": "Fire extinguished", - "subtitles.block.frogspawn.hatch": "Tadpole hatches", - "subtitles.block.furnace.fire_crackle": "Furnace crackles", - "subtitles.block.generic.break": "Block broken", - "subtitles.block.generic.footsteps": "Footsteps", - "subtitles.block.generic.hit": "Block breaking", - "subtitles.block.generic.place": "Block placed", - "subtitles.block.grindstone.use": "Grindstone used", - "subtitles.block.growing_plant.crop": "Plant cropped", - "subtitles.block.hanging_sign.waxed_interact_fail": "Sign wobbles", - "subtitles.block.honey_block.slide": "Sliding down a honey block", - "subtitles.block.iron_trapdoor.close": "Trapdoor closes", - "subtitles.block.iron_trapdoor.open": "Trapdoor opens", - "subtitles.block.lava.ambient": "Lava pops", - "subtitles.block.lava.extinguish": "Lava hisses", - "subtitles.block.lever.click": "Lever clicks", - "subtitles.block.note_block.note": "Note Block plays", - "subtitles.block.piston.move": "Piston moves", - "subtitles.block.pointed_dripstone.drip_lava": "Lava drips", - "subtitles.block.pointed_dripstone.drip_lava_into_cauldron": "Lava drips into Cauldron", - "subtitles.block.pointed_dripstone.drip_water": "Water drips", - "subtitles.block.pointed_dripstone.drip_water_into_cauldron": "Water drips into Cauldron", - "subtitles.block.pointed_dripstone.land": "Stalactite crashes down", - "subtitles.block.portal.ambient": "Portal whooshes", - "subtitles.block.portal.travel": "Portal noise fades", - "subtitles.block.portal.trigger": "Portal noise intensifies", - "subtitles.block.pressure_plate.click": "Pressure Plate clicks", - "subtitles.block.pumpkin.carve": "Shears carve", - "subtitles.block.redstone_torch.burnout": "Torch fizzes", - "subtitles.block.respawn_anchor.ambient": "Portal whooshes", - "subtitles.block.respawn_anchor.charge": "Respawn Anchor is charged", - "subtitles.block.respawn_anchor.deplete": "Respawn Anchor depletes", - "subtitles.block.respawn_anchor.set_spawn": "Respawn Anchor sets spawn", - "subtitles.block.sculk_catalyst.bloom": "Sculk Catalyst blooms", - "subtitles.block.sculk_sensor.clicking": "Sculk Sensor starts clicking", - "subtitles.block.sculk_sensor.clicking_stop": "Sculk Sensor stops clicking", - "subtitles.block.sculk_shrieker.shriek": "Sculk Shrieker shrieks", - "subtitles.block.sculk.charge": "Sculk bubbles", - "subtitles.block.sculk.spread": "Sculk spreads", - "subtitles.block.shulker_box.close": "Shulker closes", - "subtitles.block.shulker_box.open": "Shulker opens", - "subtitles.block.sign.waxed_interact_fail": "Sign wobbles", - "subtitles.block.smithing_table.use": "Smithing Table used", - "subtitles.block.smoker.smoke": "Smoker smokes", - "subtitles.block.sniffer_egg.crack": "Sniffer Egg cracks", - "subtitles.block.sniffer_egg.hatch": "Sniffer Egg hatches", - "subtitles.block.sniffer_egg.plop": "Sniffer plops", - "subtitles.block.sponge.absorb": "Sponge sucks", - "subtitles.block.sweet_berry_bush.pick_berries": "Berries pop", - "subtitles.block.trapdoor.toggle": "Trapdoor creaks", - "subtitles.block.trial_spawner.ambient": "Trial Spawner crackles", - "subtitles.block.trial_spawner.close_shutter": "Trial Spawner closes", - "subtitles.block.trial_spawner.detect_player": "Trial Spawner charges up", - "subtitles.block.trial_spawner.eject_item": "Trial Spawner ejects items", - "subtitles.block.trial_spawner.open_shutter": "Trial Spawner opens", - "subtitles.block.trial_spawner.spawn_mob": "Mob spawns", - "subtitles.block.tripwire.attach": "Tripwire attaches", - "subtitles.block.tripwire.click": "Tripwire clicks", - "subtitles.block.tripwire.detach": "Tripwire detaches", - "subtitles.block.water.ambient": "Water flows", - "subtitles.chiseled_bookshelf.insert": "Book placed", - "subtitles.chiseled_bookshelf.insert_enchanted": "Enchanted Book placed", - "subtitles.chiseled_bookshelf.take": "Book taken", - "subtitles.chiseled_bookshelf.take_enchanted": "Enchanted Book taken", - "subtitles.enchant.thorns.hit": "Thorns prick", - "subtitles.entity.allay.ambient_with_item": "Allay seeks", - "subtitles.entity.allay.ambient_without_item": "Allay yearns", - "subtitles.entity.allay.death": "Allay dies", - "subtitles.entity.allay.hurt": "Allay hurts", - "subtitles.entity.allay.item_given": "Allay chortles", - "subtitles.entity.allay.item_taken": "Allay allays", - "subtitles.entity.allay.item_thrown": "Allay tosses", - "subtitles.entity.armor_stand.fall": "Something fell", - "subtitles.entity.arrow.hit": "Arrow hits", - "subtitles.entity.arrow.hit_player": "Player hit", - "subtitles.entity.arrow.shoot": "Arrow fired", - "subtitles.entity.axolotl.attack": "Axolotl attacks", - "subtitles.entity.axolotl.death": "Axolotl dies", - "subtitles.entity.axolotl.hurt": "Axolotl hurts", - "subtitles.entity.axolotl.idle_air": "Axolotl chirps", - "subtitles.entity.axolotl.idle_water": "Axolotl chirps", - "subtitles.entity.axolotl.splash": "Axolotl splashes", - "subtitles.entity.axolotl.swim": "Axolotl swims", - "subtitles.entity.bat.ambient": "Bat screeches", - "subtitles.entity.bat.death": "Bat dies", - "subtitles.entity.bat.hurt": "Bat hurts", - "subtitles.entity.bat.takeoff": "Bat takes off", - "subtitles.entity.bee.ambient": "Bee buzzes", - "subtitles.entity.bee.death": "Bee dies", - "subtitles.entity.bee.hurt": "Bee hurts", - "subtitles.entity.bee.loop": "Bee buzzes", - "subtitles.entity.bee.loop_aggressive": "Bee buzzes angrily", - "subtitles.entity.bee.pollinate": "Bee buzzes happily", - "subtitles.entity.bee.sting": "Bee stings", - "subtitles.entity.blaze.ambient": "Blaze breathes", - "subtitles.entity.blaze.burn": "Blaze crackles", - "subtitles.entity.blaze.death": "Blaze dies", - "subtitles.entity.blaze.hurt": "Blaze hurts", - "subtitles.entity.blaze.shoot": "Blaze shoots", - "subtitles.entity.boat.paddle_land": "Rowing", - "subtitles.entity.boat.paddle_water": "Rowing", - "subtitles.entity.breeze.death": "Breeze dies", - "subtitles.entity.breeze.hurt": "Breeze hurts", - "subtitles.entity.breeze.idle_air": "Breeze flies", - "subtitles.entity.breeze.idle_ground": "Breeze whirs", - "subtitles.entity.breeze.inhale": "Breeze inhales", - "subtitles.entity.breeze.jump": "Breeze jumps", - "subtitles.entity.breeze.land": "Breeze lands", - "subtitles.entity.breeze.shoot": "Breeze shoots", - "subtitles.entity.breeze.slide": "Breeze slides", - "subtitles.entity.camel.ambient": "Camel grunts", - "subtitles.entity.camel.dash": "Camel yeets", - "subtitles.entity.camel.dash_ready": "Camel recovers", - "subtitles.entity.camel.death": "Camel dies", - "subtitles.entity.camel.eat": "Camel eats", - "subtitles.entity.camel.hurt": "Camel hurts", - "subtitles.entity.camel.saddle": "Saddle equips", - "subtitles.entity.camel.sit": "Camel sits down", - "subtitles.entity.camel.stand": "Camel stands up", - "subtitles.entity.camel.step": "Camel steps", - "subtitles.entity.camel.step_sand": "Camel sands", - "subtitles.entity.cat.ambient": "Cat meows", - "subtitles.entity.cat.beg_for_food": "Cat begs", - "subtitles.entity.cat.death": "Cat dies", - "subtitles.entity.cat.eat": "Cat eats", - "subtitles.entity.cat.hiss": "Cat hisses", - "subtitles.entity.cat.hurt": "Cat hurts", - "subtitles.entity.cat.purr": "Cat purrs", - "subtitles.entity.chicken.ambient": "Chicken clucks", - "subtitles.entity.chicken.death": "Chicken dies", - "subtitles.entity.chicken.egg": "Chicken plops", - "subtitles.entity.chicken.hurt": "Chicken hurts", - "subtitles.entity.cod.death": "Cod dies", - "subtitles.entity.cod.flop": "Cod flops", - "subtitles.entity.cod.hurt": "Cod hurts", - "subtitles.entity.cow.ambient": "Cow moos", - "subtitles.entity.cow.death": "Cow dies", - "subtitles.entity.cow.hurt": "Cow hurts", - "subtitles.entity.cow.milk": "Cow gets milked", - "subtitles.entity.creeper.death": "Creeper dies", - "subtitles.entity.creeper.hurt": "Creeper hurts", - "subtitles.entity.creeper.primed": "Creeper hisses", - "subtitles.entity.dolphin.ambient": "Dolphin chirps", - "subtitles.entity.dolphin.ambient_water": "Dolphin whistles", - "subtitles.entity.dolphin.attack": "Dolphin attacks", - "subtitles.entity.dolphin.death": "Dolphin dies", - "subtitles.entity.dolphin.eat": "Dolphin eats", - "subtitles.entity.dolphin.hurt": "Dolphin hurts", - "subtitles.entity.dolphin.jump": "Dolphin jumps", - "subtitles.entity.dolphin.play": "Dolphin plays", - "subtitles.entity.dolphin.splash": "Dolphin splashes", - "subtitles.entity.dolphin.swim": "Dolphin swims", - "subtitles.entity.donkey.ambient": "Donkey hee-haws", - "subtitles.entity.donkey.angry": "Donkey neighs", - "subtitles.entity.donkey.chest": "Donkey Chest equips", - "subtitles.entity.donkey.death": "Donkey dies", - "subtitles.entity.donkey.eat": "Donkey eats", - "subtitles.entity.donkey.hurt": "Donkey hurts", - "subtitles.entity.drowned.ambient": "Drowned gurgles", - "subtitles.entity.drowned.ambient_water": "Drowned gurgles", - "subtitles.entity.drowned.death": "Drowned dies", - "subtitles.entity.drowned.hurt": "Drowned hurts", - "subtitles.entity.drowned.shoot": "Drowned throws Trident", - "subtitles.entity.drowned.step": "Drowned steps", - "subtitles.entity.drowned.swim": "Drowned swims", - "subtitles.entity.egg.throw": "Egg flies", - "subtitles.entity.elder_guardian.ambient": "Elder Guardian moans", - "subtitles.entity.elder_guardian.ambient_land": "Elder Guardian flaps", - "subtitles.entity.elder_guardian.curse": "Elder Guardian curses", - "subtitles.entity.elder_guardian.death": "Elder Guardian dies", - "subtitles.entity.elder_guardian.flop": "Elder Guardian flops", - "subtitles.entity.elder_guardian.hurt": "Elder Guardian hurts", - "subtitles.entity.ender_dragon.ambient": "Dragon roars", - "subtitles.entity.ender_dragon.death": "Dragon dies", - "subtitles.entity.ender_dragon.flap": "Dragon flaps", - "subtitles.entity.ender_dragon.growl": "Dragon growls", - "subtitles.entity.ender_dragon.hurt": "Dragon hurts", - "subtitles.entity.ender_dragon.shoot": "Dragon shoots", - "subtitles.entity.ender_eye.death": "Eye of Ender falls", - "subtitles.entity.ender_eye.launch": "Eye of Ender shoots", - "subtitles.entity.ender_pearl.throw": "Ender Pearl flies", - "subtitles.entity.enderman.ambient": "Enderman vwoops", - "subtitles.entity.enderman.death": "Enderman dies", - "subtitles.entity.enderman.hurt": "Enderman hurts", - "subtitles.entity.enderman.scream": "Enderman screams", - "subtitles.entity.enderman.stare": "Enderman cries out", - "subtitles.entity.enderman.teleport": "Enderman teleports", - "subtitles.entity.endermite.ambient": "Endermite scuttles", - "subtitles.entity.endermite.death": "Endermite dies", - "subtitles.entity.endermite.hurt": "Endermite hurts", - "subtitles.entity.evoker_fangs.attack": "Fangs snap", - "subtitles.entity.evoker.ambient": "Evoker murmurs", - "subtitles.entity.evoker.cast_spell": "Evoker casts spell", - "subtitles.entity.evoker.celebrate": "Evoker cheers", - "subtitles.entity.evoker.death": "Evoker dies", - "subtitles.entity.evoker.hurt": "Evoker hurts", - "subtitles.entity.evoker.prepare_attack": "Evoker prepares attack", - "subtitles.entity.evoker.prepare_summon": "Evoker prepares summoning", - "subtitles.entity.evoker.prepare_wololo": "Evoker prepares charming", - "subtitles.entity.experience_orb.pickup": "Experience gained", - "subtitles.entity.firework_rocket.blast": "Firework blasts", - "subtitles.entity.firework_rocket.launch": "Firework launches", - "subtitles.entity.firework_rocket.twinkle": "Firework twinkles", - "subtitles.entity.fishing_bobber.retrieve": "Bobber retrieved", - "subtitles.entity.fishing_bobber.splash": "Fishing Bobber splashes", - "subtitles.entity.fishing_bobber.throw": "Bobber thrown", - "subtitles.entity.fox.aggro": "Fox angers", - "subtitles.entity.fox.ambient": "Fox squeaks", - "subtitles.entity.fox.bite": "Fox bites", - "subtitles.entity.fox.death": "Fox dies", - "subtitles.entity.fox.eat": "Fox eats", - "subtitles.entity.fox.hurt": "Fox hurts", - "subtitles.entity.fox.screech": "Fox screeches", - "subtitles.entity.fox.sleep": "Fox snores", - "subtitles.entity.fox.sniff": "Fox sniffs", - "subtitles.entity.fox.spit": "Fox spits", - "subtitles.entity.fox.teleport": "Fox teleports", - "subtitles.entity.frog.ambient": "Frog croaks", - "subtitles.entity.frog.death": "Frog dies", - "subtitles.entity.frog.eat": "Frog eats", - "subtitles.entity.frog.hurt": "Frog hurts", - "subtitles.entity.frog.lay_spawn": "Frog lays spawn", - "subtitles.entity.frog.long_jump": "Frog jumps", - "subtitles.entity.generic.big_fall": "Something fell", - "subtitles.entity.generic.burn": "Burning", - "subtitles.entity.generic.death": "Dying", - "subtitles.entity.generic.drink": "Sipping", - "subtitles.entity.generic.eat": "Eating", - "subtitles.entity.generic.explode": "Explosion", - "subtitles.entity.generic.extinguish_fire": "Fire extinguishes", - "subtitles.entity.generic.hurt": "Something hurts", - "subtitles.entity.generic.small_fall": "Something trips", - "subtitles.entity.generic.splash": "Splashing", - "subtitles.entity.generic.swim": "Swimming", - "subtitles.entity.generic.wind_burst": "Wind Charge bursts", - "subtitles.entity.ghast.ambient": "Ghast cries", - "subtitles.entity.ghast.death": "Ghast dies", - "subtitles.entity.ghast.hurt": "Ghast hurts", - "subtitles.entity.ghast.shoot": "Ghast shoots", - "subtitles.entity.glow_item_frame.add_item": "Glow Item Frame fills", - "subtitles.entity.glow_item_frame.break": "Glow Item Frame breaks", - "subtitles.entity.glow_item_frame.place": "Glow Item Frame placed", - "subtitles.entity.glow_item_frame.remove_item": "Glow Item Frame empties", - "subtitles.entity.glow_item_frame.rotate_item": "Glow Item Frame clicks", - "subtitles.entity.glow_squid.ambient": "Glow Squid swims", - "subtitles.entity.glow_squid.death": "Glow Squid dies", - "subtitles.entity.glow_squid.hurt": "Glow Squid hurts", - "subtitles.entity.glow_squid.squirt": "Glow Squid shoots ink", - "subtitles.entity.goat.ambient": "Goat bleats", - "subtitles.entity.goat.death": "Goat dies", - "subtitles.entity.goat.eat": "Goat eats", - "subtitles.entity.goat.horn_break": "Goat Horn breaks off", - "subtitles.entity.goat.hurt": "Goat hurts", - "subtitles.entity.goat.long_jump": "Goat leaps", - "subtitles.entity.goat.milk": "Goat gets milked", - "subtitles.entity.goat.prepare_ram": "Goat stomps", - "subtitles.entity.goat.ram_impact": "Goat rams", - "subtitles.entity.goat.screaming.ambient": "Goat bellows", - "subtitles.entity.goat.step": "Goat steps", - "subtitles.entity.guardian.ambient": "Guardian moans", - "subtitles.entity.guardian.ambient_land": "Guardian flaps", - "subtitles.entity.guardian.attack": "Guardian shoots", - "subtitles.entity.guardian.death": "Guardian dies", - "subtitles.entity.guardian.flop": "Guardian flops", - "subtitles.entity.guardian.hurt": "Guardian hurts", - "subtitles.entity.hoglin.ambient": "Hoglin growls", - "subtitles.entity.hoglin.angry": "Hoglin growls angrily", - "subtitles.entity.hoglin.attack": "Hoglin attacks", - "subtitles.entity.hoglin.converted_to_zombified": "Hoglin converts to Zoglin", - "subtitles.entity.hoglin.death": "Hoglin dies", - "subtitles.entity.hoglin.hurt": "Hoglin hurts", - "subtitles.entity.hoglin.retreat": "Hoglin retreats", - "subtitles.entity.hoglin.step": "Hoglin steps", - "subtitles.entity.horse.ambient": "Horse neighs", - "subtitles.entity.horse.angry": "Horse neighs", - "subtitles.entity.horse.armor": "Horse armor equips", - "subtitles.entity.horse.breathe": "Horse breathes", - "subtitles.entity.horse.death": "Horse dies", - "subtitles.entity.horse.eat": "Horse eats", - "subtitles.entity.horse.gallop": "Horse gallops", - "subtitles.entity.horse.hurt": "Horse hurts", - "subtitles.entity.horse.jump": "Horse jumps", - "subtitles.entity.horse.saddle": "Saddle equips", - "subtitles.entity.husk.ambient": "Husk groans", - "subtitles.entity.husk.converted_to_zombie": "Husk converts to Zombie", - "subtitles.entity.husk.death": "Husk dies", - "subtitles.entity.husk.hurt": "Husk hurts", - "subtitles.entity.illusioner.ambient": "Illusioner murmurs", - "subtitles.entity.illusioner.cast_spell": "Illusioner casts spell", - "subtitles.entity.illusioner.death": "Illusioner dies", - "subtitles.entity.illusioner.hurt": "Illusioner hurts", - "subtitles.entity.illusioner.mirror_move": "Illusioner displaces", - "subtitles.entity.illusioner.prepare_blindness": "Illusioner prepares blindness", - "subtitles.entity.illusioner.prepare_mirror": "Illusioner prepares mirror image", - "subtitles.entity.iron_golem.attack": "Iron Golem attacks", - "subtitles.entity.iron_golem.damage": "Iron Golem breaks", - "subtitles.entity.iron_golem.death": "Iron Golem dies", - "subtitles.entity.iron_golem.hurt": "Iron Golem hurts", - "subtitles.entity.iron_golem.repair": "Iron Golem repaired", - "subtitles.entity.item_frame.add_item": "Item Frame fills", - "subtitles.entity.item_frame.break": "Item Frame breaks", - "subtitles.entity.item_frame.place": "Item Frame placed", - "subtitles.entity.item_frame.remove_item": "Item Frame empties", - "subtitles.entity.item_frame.rotate_item": "Item Frame clicks", - "subtitles.entity.item.break": "Item breaks", - "subtitles.entity.item.pickup": "Item plops", - "subtitles.entity.leash_knot.break": "Leash Knot breaks", - "subtitles.entity.leash_knot.place": "Leash Knot tied", - "subtitles.entity.lightning_bolt.impact": "Lightning strikes", - "subtitles.entity.lightning_bolt.thunder": "Thunder roars", - "subtitles.entity.llama.ambient": "Llama bleats", - "subtitles.entity.llama.angry": "Llama bleats angrily", - "subtitles.entity.llama.chest": "Llama Chest equips", - "subtitles.entity.llama.death": "Llama dies", - "subtitles.entity.llama.eat": "Llama eats", - "subtitles.entity.llama.hurt": "Llama hurts", - "subtitles.entity.llama.spit": "Llama spits", - "subtitles.entity.llama.step": "Llama steps", - "subtitles.entity.llama.swag": "Llama is decorated", - "subtitles.entity.magma_cube.death": "Magma Cube dies", - "subtitles.entity.magma_cube.hurt": "Magma Cube hurts", - "subtitles.entity.magma_cube.squish": "Magma Cube squishes", - "subtitles.entity.minecart.riding": "Minecart rolls", - "subtitles.entity.mooshroom.convert": "Mooshroom transforms", - "subtitles.entity.mooshroom.eat": "Mooshroom eats", - "subtitles.entity.mooshroom.milk": "Mooshroom gets milked", - "subtitles.entity.mooshroom.suspicious_milk": "Mooshroom gets milked suspiciously", - "subtitles.entity.mule.ambient": "Mule hee-haws", - "subtitles.entity.mule.angry": "Mule neighs", - "subtitles.entity.mule.chest": "Mule Chest equips", - "subtitles.entity.mule.death": "Mule dies", - "subtitles.entity.mule.eat": "Mule eats", - "subtitles.entity.mule.hurt": "Mule hurts", - "subtitles.entity.painting.break": "Painting breaks", - "subtitles.entity.painting.place": "Painting placed", - "subtitles.entity.panda.aggressive_ambient": "Panda huffs", - "subtitles.entity.panda.ambient": "Panda pants", - "subtitles.entity.panda.bite": "Panda bites", - "subtitles.entity.panda.cant_breed": "Panda bleats", - "subtitles.entity.panda.death": "Panda dies", - "subtitles.entity.panda.eat": "Panda eats", - "subtitles.entity.panda.hurt": "Panda hurts", - "subtitles.entity.panda.pre_sneeze": "Panda's nose tickles", - "subtitles.entity.panda.sneeze": "Panda sneezes", - "subtitles.entity.panda.step": "Panda steps", - "subtitles.entity.panda.worried_ambient": "Panda whimpers", - "subtitles.entity.parrot.ambient": "Parrot talks", - "subtitles.entity.parrot.death": "Parrot dies", - "subtitles.entity.parrot.eats": "Parrot eats", - "subtitles.entity.parrot.fly": "Parrot flutters", - "subtitles.entity.parrot.hurts": "Parrot hurts", - "subtitles.entity.parrot.imitate.blaze": "Parrot breathes", - "subtitles.entity.parrot.imitate.breeze": "Parrot whirs", - "subtitles.entity.parrot.imitate.creeper": "Parrot hisses", - "subtitles.entity.parrot.imitate.drowned": "Parrot gurgles", - "subtitles.entity.parrot.imitate.elder_guardian": "Parrot moans", - "subtitles.entity.parrot.imitate.ender_dragon": "Parrot roars", - "subtitles.entity.parrot.imitate.endermite": "Parrot scuttles", - "subtitles.entity.parrot.imitate.evoker": "Parrot murmurs", - "subtitles.entity.parrot.imitate.ghast": "Parrot cries", - "subtitles.entity.parrot.imitate.guardian": "Parrot moans", - "subtitles.entity.parrot.imitate.hoglin": "Parrot growls", - "subtitles.entity.parrot.imitate.husk": "Parrot groans", - "subtitles.entity.parrot.imitate.illusioner": "Parrot murmurs", - "subtitles.entity.parrot.imitate.magma_cube": "Parrot squishes", - "subtitles.entity.parrot.imitate.phantom": "Parrot screeches", - "subtitles.entity.parrot.imitate.piglin": "Parrot snorts", - "subtitles.entity.parrot.imitate.piglin_brute": "Parrot snorts", - "subtitles.entity.parrot.imitate.pillager": "Parrot murmurs", - "subtitles.entity.parrot.imitate.ravager": "Parrot grunts", - "subtitles.entity.parrot.imitate.shulker": "Parrot lurks", - "subtitles.entity.parrot.imitate.silverfish": "Parrot hisses", - "subtitles.entity.parrot.imitate.skeleton": "Parrot rattles", - "subtitles.entity.parrot.imitate.slime": "Parrot squishes", - "subtitles.entity.parrot.imitate.spider": "Parrot hisses", - "subtitles.entity.parrot.imitate.stray": "Parrot rattles", - "subtitles.entity.parrot.imitate.vex": "Parrot vexes", - "subtitles.entity.parrot.imitate.vindicator": "Parrot mutters", - "subtitles.entity.parrot.imitate.warden": "Parrot whines", - "subtitles.entity.parrot.imitate.witch": "Parrot giggles", - "subtitles.entity.parrot.imitate.wither": "Parrot angers", - "subtitles.entity.parrot.imitate.wither_skeleton": "Parrot rattles", - "subtitles.entity.parrot.imitate.zoglin": "Parrot growls", - "subtitles.entity.parrot.imitate.zombie": "Parrot groans", - "subtitles.entity.parrot.imitate.zombie_villager": "Parrot groans", - "subtitles.entity.phantom.ambient": "Phantom screeches", - "subtitles.entity.phantom.bite": "Phantom bites", - "subtitles.entity.phantom.death": "Phantom dies", - "subtitles.entity.phantom.flap": "Phantom flaps", - "subtitles.entity.phantom.hurt": "Phantom hurts", - "subtitles.entity.phantom.swoop": "Phantom swoops", - "subtitles.entity.pig.ambient": "Pig oinks", - "subtitles.entity.pig.death": "Pig dies", - "subtitles.entity.pig.hurt": "Pig hurts", - "subtitles.entity.pig.saddle": "Saddle equips", - "subtitles.entity.piglin_brute.ambient": "Piglin Brute snorts", - "subtitles.entity.piglin_brute.angry": "Piglin Brute snorts angrily", - "subtitles.entity.piglin_brute.converted_to_zombified": "Piglin Brute converts to Zombified Piglin", - "subtitles.entity.piglin_brute.death": "Piglin Brute dies", - "subtitles.entity.piglin_brute.hurt": "Piglin Brute hurts", - "subtitles.entity.piglin_brute.step": "Piglin Brute steps", - "subtitles.entity.piglin.admiring_item": "Piglin admires item", - "subtitles.entity.piglin.ambient": "Piglin snorts", - "subtitles.entity.piglin.angry": "Piglin snorts angrily", - "subtitles.entity.piglin.celebrate": "Piglin celebrates", - "subtitles.entity.piglin.converted_to_zombified": "Piglin converts to Zombified Piglin", - "subtitles.entity.piglin.death": "Piglin dies", - "subtitles.entity.piglin.hurt": "Piglin hurts", - "subtitles.entity.piglin.jealous": "Piglin snorts enviously", - "subtitles.entity.piglin.retreat": "Piglin retreats", - "subtitles.entity.piglin.step": "Piglin steps", - "subtitles.entity.pillager.ambient": "Pillager murmurs", - "subtitles.entity.pillager.celebrate": "Pillager cheers", - "subtitles.entity.pillager.death": "Pillager dies", - "subtitles.entity.pillager.hurt": "Pillager hurts", - "subtitles.entity.player.attack.crit": "Critical attack", - "subtitles.entity.player.attack.knockback": "Knockback attack", - "subtitles.entity.player.attack.strong": "Strong attack", - "subtitles.entity.player.attack.sweep": "Sweeping attack", - "subtitles.entity.player.attack.weak": "Weak attack", - "subtitles.entity.player.burp": "Burp", - "subtitles.entity.player.death": "Player dies", - "subtitles.entity.player.freeze_hurt": "Player freezes", - "subtitles.entity.player.hurt": "Player hurts", - "subtitles.entity.player.hurt_drown": "Player drowning", - "subtitles.entity.player.hurt_on_fire": "Player burns", - "subtitles.entity.player.levelup": "Player dings", - "subtitles.entity.player.teleport": "Player teleports", - "subtitles.entity.polar_bear.ambient": "Polar Bear groans", - "subtitles.entity.polar_bear.ambient_baby": "Polar Bear hums", - "subtitles.entity.polar_bear.death": "Polar Bear dies", - "subtitles.entity.polar_bear.hurt": "Polar Bear hurts", - "subtitles.entity.polar_bear.warning": "Polar Bear roars", - "subtitles.entity.potion.splash": "Bottle smashes", - "subtitles.entity.potion.throw": "Bottle thrown", - "subtitles.entity.puffer_fish.blow_out": "Pufferfish deflates", - "subtitles.entity.puffer_fish.blow_up": "Pufferfish inflates", - "subtitles.entity.puffer_fish.death": "Pufferfish dies", - "subtitles.entity.puffer_fish.flop": "Pufferfish flops", - "subtitles.entity.puffer_fish.hurt": "Pufferfish hurts", - "subtitles.entity.puffer_fish.sting": "Pufferfish stings", - "subtitles.entity.rabbit.ambient": "Rabbit squeaks", - "subtitles.entity.rabbit.attack": "Rabbit attacks", - "subtitles.entity.rabbit.death": "Rabbit dies", - "subtitles.entity.rabbit.hurt": "Rabbit hurts", - "subtitles.entity.rabbit.jump": "Rabbit hops", - "subtitles.entity.ravager.ambient": "Ravager grunts", - "subtitles.entity.ravager.attack": "Ravager bites", - "subtitles.entity.ravager.celebrate": "Ravager cheers", - "subtitles.entity.ravager.death": "Ravager dies", - "subtitles.entity.ravager.hurt": "Ravager hurts", - "subtitles.entity.ravager.roar": "Ravager roars", - "subtitles.entity.ravager.step": "Ravager steps", - "subtitles.entity.ravager.stunned": "Ravager stunned", - "subtitles.entity.salmon.death": "Salmon dies", - "subtitles.entity.salmon.flop": "Salmon flops", - "subtitles.entity.salmon.hurt": "Salmon hurts", - "subtitles.entity.sheep.ambient": "Sheep baahs", - "subtitles.entity.sheep.death": "Sheep dies", - "subtitles.entity.sheep.hurt": "Sheep hurts", - "subtitles.entity.shulker_bullet.hit": "Shulker Bullet explodes", - "subtitles.entity.shulker_bullet.hurt": "Shulker Bullet breaks", - "subtitles.entity.shulker.ambient": "Shulker lurks", - "subtitles.entity.shulker.close": "Shulker closes", - "subtitles.entity.shulker.death": "Shulker dies", - "subtitles.entity.shulker.hurt": "Shulker hurts", - "subtitles.entity.shulker.open": "Shulker opens", - "subtitles.entity.shulker.shoot": "Shulker shoots", - "subtitles.entity.shulker.teleport": "Shulker teleports", - "subtitles.entity.silverfish.ambient": "Silverfish hisses", - "subtitles.entity.silverfish.death": "Silverfish dies", - "subtitles.entity.silverfish.hurt": "Silverfish hurts", - "subtitles.entity.skeleton_horse.ambient": "Skeleton Horse cries", - "subtitles.entity.skeleton_horse.death": "Skeleton Horse dies", - "subtitles.entity.skeleton_horse.hurt": "Skeleton Horse hurts", - "subtitles.entity.skeleton_horse.swim": "Skeleton Horse swims", - "subtitles.entity.skeleton.ambient": "Skeleton rattles", - "subtitles.entity.skeleton.converted_to_stray": "Skeleton converts to Stray", - "subtitles.entity.skeleton.death": "Skeleton dies", - "subtitles.entity.skeleton.hurt": "Skeleton hurts", - "subtitles.entity.skeleton.shoot": "Skeleton shoots", - "subtitles.entity.slime.attack": "Slime attacks", - "subtitles.entity.slime.death": "Slime dies", - "subtitles.entity.slime.hurt": "Slime hurts", - "subtitles.entity.slime.squish": "Slime squishes", - "subtitles.entity.sniffer.death": "Sniffer dies", - "subtitles.entity.sniffer.digging": "Sniffer digs", - "subtitles.entity.sniffer.digging_stop": "Sniffer stands up", - "subtitles.entity.sniffer.drop_seed": "Sniffer drops seed", - "subtitles.entity.sniffer.eat": "Sniffer eats", - "subtitles.entity.sniffer.egg_crack": "Sniffer Egg cracks", - "subtitles.entity.sniffer.egg_hatch": "Sniffer Egg hatches", - "subtitles.entity.sniffer.happy": "Sniffer delights", - "subtitles.entity.sniffer.hurt": "Sniffer hurts", - "subtitles.entity.sniffer.idle": "Sniffer grunts", - "subtitles.entity.sniffer.scenting": "Sniffer scents", - "subtitles.entity.sniffer.searching": "Sniffer searches", - "subtitles.entity.sniffer.sniffing": "Sniffer sniffs", - "subtitles.entity.sniffer.step": "Sniffer steps", - "subtitles.entity.snow_golem.death": "Snow Golem dies", - "subtitles.entity.snow_golem.hurt": "Snow Golem hurts", - "subtitles.entity.snowball.throw": "Snowball flies", - "subtitles.entity.spider.ambient": "Spider hisses", - "subtitles.entity.spider.death": "Spider dies", - "subtitles.entity.spider.hurt": "Spider hurts", - "subtitles.entity.squid.ambient": "Squid swims", - "subtitles.entity.squid.death": "Squid dies", - "subtitles.entity.squid.hurt": "Squid hurts", - "subtitles.entity.squid.squirt": "Squid shoots ink", - "subtitles.entity.stray.ambient": "Stray rattles", - "subtitles.entity.stray.death": "Stray dies", - "subtitles.entity.stray.hurt": "Stray hurts", - "subtitles.entity.strider.death": "Strider dies", - "subtitles.entity.strider.eat": "Strider eats", - "subtitles.entity.strider.happy": "Strider warbles", - "subtitles.entity.strider.hurt": "Strider hurts", - "subtitles.entity.strider.idle": "Strider chirps", - "subtitles.entity.strider.retreat": "Strider retreats", - "subtitles.entity.tadpole.death": "Tadpole dies", - "subtitles.entity.tadpole.flop": "Tadpole flops", - "subtitles.entity.tadpole.grow_up": "Tadpole grows up", - "subtitles.entity.tadpole.hurt": "Tadpole hurts", - "subtitles.entity.tnt.primed": "TNT fizzes", - "subtitles.entity.tropical_fish.death": "Tropical Fish dies", - "subtitles.entity.tropical_fish.flop": "Tropical Fish flops", - "subtitles.entity.tropical_fish.hurt": "Tropical Fish hurts", - "subtitles.entity.turtle.ambient_land": "Turtle chirps", - "subtitles.entity.turtle.death": "Turtle dies", - "subtitles.entity.turtle.death_baby": "Turtle baby dies", - "subtitles.entity.turtle.egg_break": "Turtle Egg breaks", - "subtitles.entity.turtle.egg_crack": "Turtle Egg cracks", - "subtitles.entity.turtle.egg_hatch": "Turtle Egg hatches", - "subtitles.entity.turtle.hurt": "Turtle hurts", - "subtitles.entity.turtle.hurt_baby": "Turtle baby hurts", - "subtitles.entity.turtle.lay_egg": "Turtle lays egg", - "subtitles.entity.turtle.shamble": "Turtle shambles", - "subtitles.entity.turtle.shamble_baby": "Turtle baby shambles", - "subtitles.entity.turtle.swim": "Turtle swims", - "subtitles.entity.vex.ambient": "Vex vexes", - "subtitles.entity.vex.charge": "Vex shrieks", - "subtitles.entity.vex.death": "Vex dies", - "subtitles.entity.vex.hurt": "Vex hurts", - "subtitles.entity.villager.ambient": "Villager mumbles", - "subtitles.entity.villager.celebrate": "Villager cheers", - "subtitles.entity.villager.death": "Villager dies", - "subtitles.entity.villager.hurt": "Villager hurts", - "subtitles.entity.villager.no": "Villager disagrees", - "subtitles.entity.villager.trade": "Villager trades", - "subtitles.entity.villager.work_armorer": "Armorer works", - "subtitles.entity.villager.work_butcher": "Butcher works", - "subtitles.entity.villager.work_cartographer": "Cartographer works", - "subtitles.entity.villager.work_cleric": "Cleric works", - "subtitles.entity.villager.work_farmer": "Farmer works", - "subtitles.entity.villager.work_fisherman": "Fisherman works", - "subtitles.entity.villager.work_fletcher": "Fletcher works", - "subtitles.entity.villager.work_leatherworker": "Leatherworker works", - "subtitles.entity.villager.work_librarian": "Librarian works", - "subtitles.entity.villager.work_mason": "Mason works", - "subtitles.entity.villager.work_shepherd": "Shepherd works", - "subtitles.entity.villager.work_toolsmith": "Toolsmith works", - "subtitles.entity.villager.work_weaponsmith": "Weaponsmith works", - "subtitles.entity.villager.yes": "Villager agrees", - "subtitles.entity.vindicator.ambient": "Vindicator mutters", - "subtitles.entity.vindicator.celebrate": "Vindicator cheers", - "subtitles.entity.vindicator.death": "Vindicator dies", - "subtitles.entity.vindicator.hurt": "Vindicator hurts", - "subtitles.entity.wandering_trader.ambient": "Wandering Trader mumbles", - "subtitles.entity.wandering_trader.death": "Wandering Trader dies", - "subtitles.entity.wandering_trader.disappeared": "Wandering Trader disappears", - "subtitles.entity.wandering_trader.drink_milk": "Wandering Trader drinks milk", - "subtitles.entity.wandering_trader.drink_potion": "Wandering Trader drinks potion", - "subtitles.entity.wandering_trader.hurt": "Wandering Trader hurts", - "subtitles.entity.wandering_trader.no": "Wandering Trader disagrees", - "subtitles.entity.wandering_trader.reappeared": "Wandering Trader appears", - "subtitles.entity.wandering_trader.trade": "Wandering Trader trades", - "subtitles.entity.wandering_trader.yes": "Wandering Trader agrees", - "subtitles.entity.warden.agitated": "Warden groans angrily", - "subtitles.entity.warden.ambient": "Warden whines", - "subtitles.entity.warden.angry": "Warden rages", - "subtitles.entity.warden.attack_impact": "Warden lands hit", - "subtitles.entity.warden.death": "Warden dies", - "subtitles.entity.warden.dig": "Warden digs", - "subtitles.entity.warden.emerge": "Warden emerges", - "subtitles.entity.warden.heartbeat": "Warden's heart beats", - "subtitles.entity.warden.hurt": "Warden hurts", - "subtitles.entity.warden.listening": "Warden takes notice", - "subtitles.entity.warden.listening_angry": "Warden takes notice angrily", - "subtitles.entity.warden.nearby_close": "Warden approaches", - "subtitles.entity.warden.nearby_closer": "Warden advances", - "subtitles.entity.warden.nearby_closest": "Warden draws close", - "subtitles.entity.warden.roar": "Warden roars", - "subtitles.entity.warden.sniff": "Warden sniffs", - "subtitles.entity.warden.sonic_boom": "Warden booms", - "subtitles.entity.warden.sonic_charge": "Warden charges", - "subtitles.entity.warden.step": "Warden steps", - "subtitles.entity.warden.tendril_clicks": "Warden's tendrils click", - "subtitles.entity.witch.ambient": "Witch giggles", - "subtitles.entity.witch.celebrate": "Witch cheers", - "subtitles.entity.witch.death": "Witch dies", - "subtitles.entity.witch.drink": "Witch drinks", - "subtitles.entity.witch.hurt": "Witch hurts", - "subtitles.entity.witch.throw": "Witch throws", - "subtitles.entity.wither_skeleton.ambient": "Wither Skeleton rattles", - "subtitles.entity.wither_skeleton.death": "Wither Skeleton dies", - "subtitles.entity.wither_skeleton.hurt": "Wither Skeleton hurts", - "subtitles.entity.wither.ambient": "Wither angers", - "subtitles.entity.wither.death": "Wither dies", - "subtitles.entity.wither.hurt": "Wither hurts", - "subtitles.entity.wither.shoot": "Wither attacks", - "subtitles.entity.wither.spawn": "Wither released", - "subtitles.entity.wolf.ambient": "Wolf pants", - "subtitles.entity.wolf.death": "Wolf dies", - "subtitles.entity.wolf.growl": "Wolf growls", - "subtitles.entity.wolf.hurt": "Wolf hurts", - "subtitles.entity.wolf.shake": "Wolf shakes", - "subtitles.entity.zoglin.ambient": "Zoglin growls", - "subtitles.entity.zoglin.angry": "Zoglin growls angrily", - "subtitles.entity.zoglin.attack": "Zoglin attacks", - "subtitles.entity.zoglin.death": "Zoglin dies", - "subtitles.entity.zoglin.hurt": "Zoglin hurts", - "subtitles.entity.zoglin.step": "Zoglin steps", - "subtitles.entity.zombie_horse.ambient": "Zombie Horse cries", - "subtitles.entity.zombie_horse.death": "Zombie Horse dies", - "subtitles.entity.zombie_horse.hurt": "Zombie Horse hurts", - "subtitles.entity.zombie_villager.ambient": "Zombie Villager groans", - "subtitles.entity.zombie_villager.converted": "Zombie Villager vociferates", - "subtitles.entity.zombie_villager.cure": "Zombie Villager snuffles", - "subtitles.entity.zombie_villager.death": "Zombie Villager dies", - "subtitles.entity.zombie_villager.hurt": "Zombie Villager hurts", - "subtitles.entity.zombie.ambient": "Zombie groans", - "subtitles.entity.zombie.attack_wooden_door": "Door shakes", - "subtitles.entity.zombie.break_wooden_door": "Door breaks", - "subtitles.entity.zombie.converted_to_drowned": "Zombie converts to Drowned", - "subtitles.entity.zombie.death": "Zombie dies", - "subtitles.entity.zombie.destroy_egg": "Turtle Egg stomped", - "subtitles.entity.zombie.hurt": "Zombie hurts", - "subtitles.entity.zombie.infect": "Zombie infects", - "subtitles.entity.zombified_piglin.ambient": "Zombified Piglin grunts", - "subtitles.entity.zombified_piglin.angry": "Zombified Piglin grunts angrily", - "subtitles.entity.zombified_piglin.death": "Zombified Piglin dies", - "subtitles.entity.zombified_piglin.hurt": "Zombified Piglin hurts", - "subtitles.event.raid.horn": "Ominous horn blares", - "subtitles.item.armor.equip": "Gear equips", - "subtitles.item.armor.equip_chain": "Chain armor jingles", - "subtitles.item.armor.equip_diamond": "Diamond armor clangs", - "subtitles.item.armor.equip_elytra": "Elytra rustle", - "subtitles.item.armor.equip_gold": "Gold armor clinks", - "subtitles.item.armor.equip_iron": "Iron armor clanks", - "subtitles.item.armor.equip_leather": "Leather armor rustles", - "subtitles.item.armor.equip_netherite": "Netherite armor clanks", - "subtitles.item.armor.equip_turtle": "Turtle Shell thunks", - "subtitles.item.axe.scrape": "Axe scrapes", - "subtitles.item.axe.strip": "Axe strips", - "subtitles.item.axe.wax_off": "Wax off", - "subtitles.item.bone_meal.use": "Bone Meal crinkles", - "subtitles.item.book.page_turn": "Page rustles", - "subtitles.item.book.put": "Book thumps", - "subtitles.item.bottle.empty": "Bottle empties", - "subtitles.item.bottle.fill": "Bottle fills", - "subtitles.item.brush.brushing.generic": "Brushing", - "subtitles.item.brush.brushing.gravel": "Brushing Gravel", - "subtitles.item.brush.brushing.gravel.complete": "Brushing Gravel completed", - "subtitles.item.brush.brushing.sand": "Brushing Sand", - "subtitles.item.brush.brushing.sand.complete": "Brushing Sand completed", - "subtitles.item.bucket.empty": "Bucket empties", - "subtitles.item.bucket.fill": "Bucket fills", - "subtitles.item.bucket.fill_axolotl": "Axolotl scooped", - "subtitles.item.bucket.fill_fish": "Fish captured", - "subtitles.item.bucket.fill_tadpole": "Tadpole captured", - "subtitles.item.bundle.drop_contents": "Bundle empties", - "subtitles.item.bundle.insert": "Item packed", - "subtitles.item.bundle.remove_one": "Item unpacked", - "subtitles.item.chorus_fruit.teleport": "Player teleports", - "subtitles.item.crop.plant": "Crop planted", - "subtitles.item.crossbow.charge": "Crossbow charges up", - "subtitles.item.crossbow.hit": "Arrow hits", - "subtitles.item.crossbow.load": "Crossbow loads", - "subtitles.item.crossbow.shoot": "Crossbow fires", - "subtitles.item.dye.use": "Dye stains", - "subtitles.item.firecharge.use": "Fireball whooshes", - "subtitles.item.flintandsteel.use": "Flint and Steel click", - "subtitles.item.glow_ink_sac.use": "Glow Ink Sac splotches", - "subtitles.item.goat_horn.play": "Goat Horn plays", - "subtitles.item.hoe.till": "Hoe tills", - "subtitles.item.honey_bottle.drink": "Gulping", - "subtitles.item.honeycomb.wax_on": "Wax on", - "subtitles.item.ink_sac.use": "Ink Sac splotches", - "subtitles.item.lodestone_compass.lock": "Lodestone Compass locks onto Lodestone", - "subtitles.item.nether_wart.plant": "Crop planted", - "subtitles.item.shears.shear": "Shears click", - "subtitles.item.shield.block": "Shield blocks", - "subtitles.item.shovel.flatten": "Shovel flattens", - "subtitles.item.spyglass.stop_using": "Spyglass retracts", - "subtitles.item.spyglass.use": "Spyglass expands", - "subtitles.item.totem.use": "Totem activates", - "subtitles.item.trident.hit": "Trident stabs", - "subtitles.item.trident.hit_ground": "Trident vibrates", - "subtitles.item.trident.return": "Trident returns", - "subtitles.item.trident.riptide": "Trident zooms", - "subtitles.item.trident.throw": "Trident clangs", - "subtitles.item.trident.thunder": "Trident thunder cracks", - "subtitles.particle.soul_escape": "Soul escapes", - "subtitles.ui.cartography_table.take_result": "Map drawn", - "subtitles.ui.loom.take_result": "Loom used", - "subtitles.ui.stonecutter.take_result": "Stonecutter used", - "subtitles.weather.rain": "Rain falls", - "symlink_warning.message": "Loading worlds from folders with symbolic links can be unsafe if you don't know exactly what you are doing. Please visit %s to learn more.", - "symlink_warning.message.pack": "Loading packs with symbolic links can be unsafe if you don't know exactly what you are doing. Please visit %s to learn more.", - "symlink_warning.message.world": "Loading worlds from folders with symbolic links can be unsafe if you don't know exactly what you are doing. Please visit %s to learn more.", - "symlink_warning.more_info": "More Information", - "symlink_warning.title": "World folder contains symbolic links", - "symlink_warning.title.pack": "Added pack(s) contain(s) symbolic links", - "symlink_warning.title.world": "The world folder contains symbolic links", - "team.collision.always": "Always", - "team.collision.never": "Never", - "team.collision.pushOtherTeams": "Push other teams", - "team.collision.pushOwnTeam": "Push own team", - "team.notFound": "Unknown team '%s'", - "team.visibility.always": "Always", - "team.visibility.hideForOtherTeams": "Hide for other teams", - "team.visibility.hideForOwnTeam": "Hide for own team", - "team.visibility.never": "Never", - "telemetry_info.button.give_feedback": "Give Feedback", - "telemetry_info.button.privacy_statement": "Privacy Statement", - "telemetry_info.button.show_data": "View My Data", - "telemetry_info.opt_in.description": "I consent to sending optional telemetry data", - "telemetry_info.property_title": "Included Data", - "telemetry_info.screen.description": "Collecting this data helps us improve Minecraft by guiding us in directions that are relevant to our players.\nYou can also send in additional feedback to help us keep improving Minecraft.", - "telemetry_info.screen.title": "Telemetry Data Collection", - "telemetry.event.advancement_made.description": "Understanding the context behind receiving an advancement can help us better understand and improve the progression of the game.", - "telemetry.event.advancement_made.title": "Advancement Made", - "telemetry.event.game_load_times.description": "This event can help us figure out where startup performance improvements are needed by measuring the execution times of the startup phases.", - "telemetry.event.game_load_times.title": "Game Load Times", - "telemetry.event.optional": "%s (Optional)", - "telemetry.event.optional.disabled": "%s (Optional) - Disabled", - "telemetry.event.performance_metrics.description": "Knowing the overall performance profile of Minecraft helps us tune and optimize the game for a wide range of machine specifications and operating systems. \nGame version is included to help us compare the performance profile for new versions of Minecraft.", - "telemetry.event.performance_metrics.title": "Performance Metrics", - "telemetry.event.required": "%s (Required)", - "telemetry.event.world_load_times.description": "It’s important for us to understand how long it takes to join a world, and how that changes over time. For example, when we add new features or do larger technical changes, we need to see what impact that had on load times.", - "telemetry.event.world_load_times.title": "World Load Times", - "telemetry.event.world_loaded.description": "Knowing how players play Minecraft (such as Game Mode, client or server modded, and game version) allows us to focus game updates to improve the areas that players care about most.\nThe World Loaded event is paired with the World Unloaded event to calculate how long the play session has lasted.", - "telemetry.event.world_loaded.title": "World Loaded", - "telemetry.event.world_unloaded.description": "This event is paired with the World Loaded event to calculate how long the world session has lasted.\nThe duration (in seconds and ticks) is measured when a world session has ended (quitting to title, disconnecting from a server).", - "telemetry.event.world_unloaded.title": "World Unloaded", - "telemetry.property.advancement_game_time.title": "Game Time (Ticks)", - "telemetry.property.advancement_id.title": "Advancement ID", - "telemetry.property.client_id.title": "Client ID", - "telemetry.property.client_modded.title": "Client Modded", - "telemetry.property.dedicated_memory_kb.title": "Dedicated Memory (kB)", - "telemetry.property.event_timestamp_utc.title": "Event Timestamp (UTC)", - "telemetry.property.frame_rate_samples.title": "Frame Rate Samples (FPS)", - "telemetry.property.game_mode.title": "Game Mode", - "telemetry.property.game_version.title": "Game Version", - "telemetry.property.launcher_name.title": "Launcher Name", - "telemetry.property.load_time_bootstrap_ms.title": "Bootstrap Time (Milliseconds)", - "telemetry.property.load_time_loading_overlay_ms.title": "Time in Loading Screen (Milliseconds)", - "telemetry.property.load_time_pre_window_ms.title": "Time Before Window Opens (Milliseconds)", - "telemetry.property.load_time_total_time_ms.title": "Total Load Time (Milliseconds)", - "telemetry.property.minecraft_session_id.title": "Minecraft Session ID", - "telemetry.property.new_world.title": "New World", - "telemetry.property.number_of_samples.title": "Sample Count", - "telemetry.property.operating_system.title": "Operating System", - "telemetry.property.opt_in.title": "Opt-In", - "telemetry.property.platform.title": "Platform", - "telemetry.property.realms_map_content.title": "Realms Map Content (Minigame Name)", - "telemetry.property.render_distance.title": "Render Distance", - "telemetry.property.render_time_samples.title": "Render Time Samples", - "telemetry.property.seconds_since_load.title": "Time Since Load (Seconds)", - "telemetry.property.server_modded.title": "Server Modded", - "telemetry.property.server_type.title": "Server Type", - "telemetry.property.ticks_since_load.title": "Time Since Load (Ticks)", - "telemetry.property.used_memory_samples.title": "Used Random Access Memory", - "telemetry.property.user_id.title": "User ID", - "telemetry.property.world_load_time_ms.title": "World Load Time (Milliseconds)", - "telemetry.property.world_session_id.title": "World Session ID", - "title.32bit.deprecation": "32-bit system detected: this may prevent you from playing in the future as a 64-bit system will be required!", - "title.32bit.deprecation.realms": "Minecraft will soon require a 64-bit system, which will prevent you from playing or using Realms on this device. You will need to manually cancel any Realms subscription.", - "title.32bit.deprecation.realms.check": "Do not show this screen again", - "title.32bit.deprecation.realms.header": "32-bit system detected", - "title.credits": "Copyright Mojang AB. Do not distribute!", - "title.multiplayer.disabled": "Multiplayer is disabled. Please check your Microsoft account settings.", - "title.multiplayer.disabled.banned.name": "You must change your name before you can play online", - "title.multiplayer.disabled.banned.permanent": "Your account is permanently suspended from online play", - "title.multiplayer.disabled.banned.temporary": "Your account is temporarily suspended from online play", - "title.multiplayer.lan": "Multiplayer (LAN)", - "title.multiplayer.other": "Multiplayer (3rd-party Server)", - "title.multiplayer.realms": "Multiplayer (Realms)", - "title.singleplayer": "Singleplayer", - "translation.test.args": "%s %s", - "translation.test.complex": "Prefix, %s%2$s again %s and %1$s lastly %s and also %1$s again!", - "translation.test.escape": "%%s %%%s %%%%s %%%%%s", - "translation.test.invalid": "hi %", - "translation.test.invalid2": "hi % s", - "translation.test.none": "Hello, world!", - "translation.test.world": "world", - "trim_material.minecraft.amethyst": "Amethyst Material", - "trim_material.minecraft.copper": "Copper Material", - "trim_material.minecraft.diamond": "Diamond Material", - "trim_material.minecraft.emerald": "Emerald Material", - "trim_material.minecraft.gold": "Gold Material", - "trim_material.minecraft.iron": "Iron Material", - "trim_material.minecraft.lapis": "Lapis Material", - "trim_material.minecraft.netherite": "Netherite Material", - "trim_material.minecraft.quartz": "Quartz Material", - "trim_material.minecraft.redstone": "Redstone Material", - "trim_pattern.minecraft.coast": "Coast Armor Trim", - "trim_pattern.minecraft.dune": "Dune Armor Trim", - "trim_pattern.minecraft.eye": "Eye Armor Trim", - "trim_pattern.minecraft.host": "Host Armor Trim", - "trim_pattern.minecraft.raiser": "Raiser Armor Trim", - "trim_pattern.minecraft.rib": "Rib Armor Trim", - "trim_pattern.minecraft.sentry": "Sentry Armor Trim", - "trim_pattern.minecraft.shaper": "Shaper Armor Trim", - "trim_pattern.minecraft.silence": "Silence Armor Trim", - "trim_pattern.minecraft.snout": "Snout Armor Trim", - "trim_pattern.minecraft.spire": "Spire Armor Trim", - "trim_pattern.minecraft.tide": "Tide Armor Trim", - "trim_pattern.minecraft.vex": "Vex Armor Trim", - "trim_pattern.minecraft.ward": "Ward Armor Trim", - "trim_pattern.minecraft.wayfinder": "Wayfinder Armor Trim", - "trim_pattern.minecraft.wild": "Wild Armor Trim", - "tutorial.bundleInsert.description": "Right Click to add items", - "tutorial.bundleInsert.title": "Use a Bundle", - "tutorial.craft_planks.description": "The recipe book can help", - "tutorial.craft_planks.title": "Craft wooden planks", - "tutorial.find_tree.description": "Punch it to collect wood", - "tutorial.find_tree.title": "Find a tree", - "tutorial.look.description": "Use your mouse to turn", - "tutorial.look.title": "Look around", - "tutorial.move.description": "Jump with %s", - "tutorial.move.title": "Move with %s, %s, %s and %s", - "tutorial.open_inventory.description": "Press %s", - "tutorial.open_inventory.title": "Open your inventory", - "tutorial.punch_tree.description": "Hold down %s", - "tutorial.punch_tree.title": "Destroy the tree", - "tutorial.socialInteractions.description": "Press %s to open", - "tutorial.socialInteractions.title": "Social Interactions", - "upgrade.minecraft.netherite_upgrade": "Netherite Upgrade" -} diff --git a/MinecraftClient/RestartCoordinator.cs b/MinecraftClient/RestartCoordinator.cs deleted file mode 100644 index 00a759943f..0000000000 --- a/MinecraftClient/RestartCoordinator.cs +++ /dev/null @@ -1,213 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Channels; -using System.Threading.Tasks; - -namespace MinecraftClient -{ - internal readonly record struct RestartRequest( - long ConnectionAttempt, - TimeSpan Delay, - bool KeepAccountAndServerSettings, - RestartSettingsSnapshot? SettingsSnapshot = null, - bool ReplaceUntilCommit = false, - Task? SourceCleanupCompletion = null, - long RequestId = 0); - - internal readonly record struct RestartSettingsSnapshot( - Settings.MainConfigHelper.MainConfig.AccountInfoConfig Account, - string ServerIP, - ushort ServerPort); - - internal enum RestartRequestState - { - Replaceable, - Committing, - } - - internal readonly record struct PendingRestart( - long RequestId, - RestartRequest Request, - RestartRequestState State); - - internal sealed class RestartCoordinator : IDisposable - { - private readonly Lock stateLock = new(); - private readonly Channel requests; - private readonly CancellationTokenSource shutdown = new(); - private readonly Func restart; - private readonly Action reportFailure; - private readonly Task worker; - private readonly Dictionary pendingAttempts = []; - private long highestScheduledAttempt = -1; - private long nextRequestId; - private bool stopped; - - internal RestartCoordinator( - Func restart, - Action reportFailure) - { - ArgumentNullException.ThrowIfNull(restart); - ArgumentNullException.ThrowIfNull(reportFailure); - - this.restart = restart; - this.reportFailure = reportFailure; - requests = Channel.CreateUnbounded(new UnboundedChannelOptions - { - SingleReader = true, - SingleWriter = false, - AllowSynchronousContinuations = false, - }); - worker = ProcessRequestsAsync(); - } - - internal bool HasScheduledRestart(long connectionAttempt) - { - lock (stateLock) - return !stopped && pendingAttempts.ContainsKey(connectionAttempt); - } - - internal bool TrySchedule(RestartRequest request, Func? beforePublish = null) - { - lock (stateLock) - { - if (stopped) - return false; - - if (pendingAttempts.TryGetValue(request.ConnectionAttempt, out PendingRestart pendingRequest)) - { - if (pendingRequest.State != RestartRequestState.Replaceable || !request.ReplaceUntilCommit) - return false; - - request = request with - { - RequestId = pendingRequest.RequestId, - SourceCleanupCompletion = pendingRequest.Request.SourceCleanupCompletion, - }; - pendingAttempts[request.ConnectionAttempt] = pendingRequest with { Request = request }; - return true; - } - - if (request.ConnectionAttempt <= highestScheduledAttempt) - return false; - - request = request with { RequestId = ++nextRequestId }; - pendingAttempts[request.ConnectionAttempt] = new PendingRestart( - request.RequestId, - request, - RestartRequestState.Replaceable); - try - { - if (beforePublish is not null && !beforePublish()) - { - pendingAttempts.Remove(request.ConnectionAttempt); - return false; - } - - if (requests.Writer.TryWrite(request)) - { - highestScheduledAttempt = Math.Max(highestScheduledAttempt, request.ConnectionAttempt); - return true; - } - } - catch - { - pendingAttempts.Remove(request.ConnectionAttempt); - throw; - } - - pendingAttempts.Remove(request.ConnectionAttempt); - return false; - } - } - - internal bool TryBeginCommit(RestartRequest scheduledRequest, out RestartRequest latestRequest) - { - lock (stateLock) - { - if (stopped - || !pendingAttempts.TryGetValue(scheduledRequest.ConnectionAttempt, out PendingRestart pendingRequest) - || pendingRequest.RequestId != scheduledRequest.RequestId - || pendingRequest.State != RestartRequestState.Replaceable) - { - latestRequest = default; - return false; - } - - latestRequest = pendingRequest.Request; - pendingAttempts[scheduledRequest.ConnectionAttempt] = pendingRequest with - { - State = RestartRequestState.Committing, - }; - return true; - } - } - - internal void Stop() - { - lock (stateLock) - { - if (stopped) - return; - - stopped = true; - pendingAttempts.Clear(); - requests.Writer.TryComplete(); - shutdown.Cancel(); - } - } - - private async Task ProcessRequestsAsync() - { - try - { - await foreach (RestartRequest request in requests.Reader.ReadAllAsync(shutdown.Token).ConfigureAwait(false)) - { - lock (stateLock) - { - if (!pendingAttempts.TryGetValue(request.ConnectionAttempt, out PendingRestart pendingRequest) - || pendingRequest.RequestId != request.RequestId) - continue; - } - - try - { - if (request.SourceCleanupCompletion is Task sourceCleanupCompletion) - await sourceCleanupCompletion.WaitAsync(shutdown.Token).ConfigureAwait(false); - - await restart(request, shutdown.Token).ConfigureAwait(false); - } - catch (OperationCanceledException) when (shutdown.IsCancellationRequested) - { - return; - } - catch (Exception exception) - { - reportFailure(exception); - } - finally - { - lock (stateLock) - { - if (pendingAttempts.TryGetValue(request.ConnectionAttempt, out PendingRestart pendingRequest) - && pendingRequest.RequestId == request.RequestId) - pendingAttempts.Remove(request.ConnectionAttempt); - } - } - } - } - catch (OperationCanceledException) when (shutdown.IsCancellationRequested) - { - } - } - - public void Dispose() - { - Stop(); - worker.GetAwaiter().GetResult(); - shutdown.Dispose(); - GC.SuppressFinalize(this); - } - } -} diff --git a/MinecraftClient/Scripting/AssemblyResolver.cs b/MinecraftClient/Scripting/AssemblyResolver.cs deleted file mode 100644 index 85b16405a7..0000000000 --- a/MinecraftClient/Scripting/AssemblyResolver.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Reflection; - -namespace MinecraftClient.Scripting; - -public static class AssemblyResolver -{ - private static Dictionary ScriptAssemblies = new(); - static AssemblyResolver() - { - // Manually resolve assemblies that .NET can't resolve automatically. - AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => - { - var asmReqName = new AssemblyName(args.Name); - - // Check the script-referenced assemblies if we have the DLL that is required. - foreach (var dll in ScriptAssemblies) - { - // If we have the assembly, load it. - if (asmReqName.FullName == dll.Key) - { - return Assembly.LoadFile(dll.Value); - } - } - - ConsoleIO.WriteLogLine($"[Script Error] Failed to resolve assembly {args.Name} (are you missing a DLL file?)"); - return null; - }; - } - - internal static void AddAssembly(string AssemblyFullName, string AssemblyPath) - { - if (ScriptAssemblies.ContainsKey(AssemblyFullName)) - return; - - ScriptAssemblies.Add(AssemblyFullName, AssemblyPath); - } -} \ No newline at end of file diff --git a/MinecraftClient/Scripting/BotMovementLock.cs b/MinecraftClient/Scripting/BotMovementLock.cs deleted file mode 100644 index 2c29b6e8e7..0000000000 --- a/MinecraftClient/Scripting/BotMovementLock.cs +++ /dev/null @@ -1,35 +0,0 @@ -namespace MinecraftClient.Scripting; - -public class BotMovementLock -{ - private static BotMovementLock? InstancePrivate; - private string _heldBy = string.Empty; - - private BotMovementLock() - { - InstancePrivate = this; - } - - public static BotMovementLock? Instance => InstancePrivate ??= new BotMovementLock(); - - public bool Lock(string owner) - { - if (owner.Trim().Length == 0 || _heldBy.Length > 0) - return false; - - _heldBy = owner.Trim(); - return true; - } - - public bool UnLock(string owner) - { - if (owner.Trim().Length == 0 || _heldBy.Length == 0 || !_heldBy.ToLower().Equals(owner.ToLower().Trim())) - return false; - - _heldBy = string.Empty; - return true; - } - - public bool IsLocked => _heldBy.Length > 0; - public string LockedBy => _heldBy; -} \ No newline at end of file diff --git a/MinecraftClient/Scripting/CSharpRunner.cs b/MinecraftClient/Scripting/CSharpRunner.cs deleted file mode 100644 index 880d6a3986..0000000000 --- a/MinecraftClient/Scripting/CSharpRunner.cs +++ /dev/null @@ -1,466 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.IO; -using System.Linq; -using System.Text; -using Microsoft.CodeAnalysis; -using MinecraftClient.Scripting.DynamicRun.Builder; -using static MinecraftClient.Settings; - -namespace MinecraftClient.Scripting -{ - /// - /// C# Script runner - Compile on-the-fly and run C# scripts - /// - class CSharpRunner - { - private static readonly Dictionary CompileCache = new(); - - private readonly record struct ScriptSourceLine(int LineNumber, string Text); - - /// - /// Run the specified C# script file - /// - /// ChatBot handler for accessing ChatBot API - /// Lines of the script file to run - /// Arguments to pass to the script - /// Local variables passed along with the script - /// Set to false to compile and cache the script without launching it - /// Thrown if an error occured - /// Result of the execution, returned by the script - public static object? Run(ChatBot apiHandler, string[] lines, string[] args, Dictionary? localVars, bool run = true, string scriptName = "Unknown Script", string? scriptOwnerKey = null) - { - //Script compatibility check for handling future versions differently - if (lines.Length < 1 || lines[0] != "//MCCScript 1.0") - throw new CSharpException(CSErrorType.InvalidScript, - new InvalidDataException(Translations.exception_csrunner_invalid_head)); - - //Script hash for determining if it was previously compiled - ulong scriptHash = QuickHash(lines); - byte[]? assembly = null; - - Compiler compiler = new(); - CompileRunner runner = new(); - - //No need to compile two scripts at the same time - lock (CompileCache) - { - ///Process and compile script only if not already compiled - if (!Config.Main.Advanced.CacheScript || !CompileCache.ContainsKey(scriptHash)) - { - //Process different sections of the script file - bool scriptMain = true; - List script = new(); - List extensions = new(); - List libs = new(); - List dlls = new(); - for (int i = 0; i < lines.Length; i++) - { - string line = lines[i]; - if (line.StartsWith("//using")) - { - libs.Add(NormalizeUsingDirective(line)); - } - else if (line.StartsWith("//dll")) - { - dlls.Add(line.Replace("//dll ", "").Trim()); - } - else if (line.StartsWith("//MCCScript")) - { - if (line.EndsWith("Extensions")) - scriptMain = false; - } - - (scriptMain ? script : extensions).Add(new(i + 1, line)); - } - - //Add return statement if missing - bool hasImplicitReturn = script.All(line => !line.Text.StartsWith("return ", StringComparison.Ordinal) - && !line.Text.Contains(" return ", StringComparison.Ordinal)); - - //Generate a class from the given script - string code = BuildScriptCode(scriptName, script, extensions, libs, hasImplicitReturn); - - ConsoleIO.WriteLogLine(string.Format(Translations.script_compile_started, scriptName)); - - //Compile the C# class in memory using all the currently loaded assemblies - var result = compiler.Compile(code, Guid.NewGuid().ToString(), dlls); - - //Process compile warnings and errors - if (result.Failures is not null) - { - - ConsoleIO.WriteLogLine(Translations.script_compile_failed); - - foreach (var failure in result.Failures) - { - ConsoleIO.WriteLogLine(FormatCompilationFailure(failure, scriptName)); - } - - throw new CSharpException(CSErrorType.InvalidScript, new InvalidProgramException("Compilation failed due to error(s).")); - } - - ConsoleIO.WriteLogLine(Translations.script_compile_succeeded); - - //Retrieve compiled assembly - assembly = result.Assembly; - if (Config.Main.Advanced.CacheScript) - CompileCache[scriptHash] = assembly!; - } - else if (Config.Main.Advanced.CacheScript) - assembly = CompileCache[scriptHash]; - } - - //Run the compiled assembly with exception handling - if (run) - { - try - { - var compiled = runner.Execute(assembly!, args, localVars, apiHandler, scriptOwnerKey); - return compiled; - } - catch (Exception e) { throw new CSharpException(CSErrorType.RuntimeError, e); } - } - else return null; - } - - internal static string NormalizeUsingDirective(string line) - { - string directive = line[2..].Trim(); - return directive.EndsWith(';') ? directive : $"{directive};"; - } - - private static string BuildScriptCode(string scriptName, IEnumerable script, IEnumerable extensions, IEnumerable libs, bool hasImplicitReturn) - { - StringBuilder codeBuilder = new(); - codeBuilder.AppendLine("using System;"); - codeBuilder.AppendLine("using System.Collections.Generic;"); - codeBuilder.AppendLine("using System.Text.RegularExpressions;"); - codeBuilder.AppendLine("using System.Linq;"); - codeBuilder.AppendLine("using System.Text;"); - codeBuilder.AppendLine("using System.IO;"); - codeBuilder.AppendLine("using System.Net;"); - codeBuilder.AppendLine("using System.Threading;"); - codeBuilder.AppendLine("using MinecraftClient;"); - codeBuilder.AppendLine("using MinecraftClient.Scripting;"); - codeBuilder.AppendLine("using MinecraftClient.Mapping;"); - codeBuilder.AppendLine("using MinecraftClient.Inventory;"); - - foreach (string lib in libs) - codeBuilder.AppendLine(lib); - - codeBuilder.AppendLine("namespace ScriptLoader {"); - codeBuilder.AppendLine("public class Script {"); - codeBuilder.AppendLine("public CSharpAPI MCC;"); - codeBuilder.AppendLine("public object __run(CSharpAPI __apiHandler, string[] args) {"); - codeBuilder.AppendLine("this.MCC = __apiHandler;"); - AppendMappedSection(codeBuilder, scriptName, script); - - if (hasImplicitReturn) - codeBuilder.AppendLine("return null;"); - - codeBuilder.AppendLine("}"); - AppendMappedSection(codeBuilder, scriptName, extensions); - codeBuilder.AppendLine("}}"); - return codeBuilder.ToString(); - } - - private static void AppendMappedSection(StringBuilder codeBuilder, string scriptName, IEnumerable lines) - { - ScriptSourceLine[] sourceLines = lines.ToArray(); - if (sourceLines.Length == 0) - return; - - codeBuilder.AppendLine($@"#line {sourceLines[0].LineNumber} ""{EscapeLineDirectivePath(scriptName)}"""); - - foreach (ScriptSourceLine line in sourceLines) - codeBuilder.AppendLine(line.Text); - - codeBuilder.AppendLine("#line default"); - } - - private static string EscapeLineDirectivePath(string path) - { - return path.Replace("\\", "\\\\").Replace("\"", "\\\""); - } - - private static string FormatCompilationFailure(Diagnostic failure, string scriptName) - { - if (failure.Location.IsInSource) - { - var location = failure.Location.GetMappedLineSpan(); - string sourcePath = string.IsNullOrWhiteSpace(location.Path) ? scriptName : location.Path; - return string.Format(Translations.script_compile_error, - sourcePath, - location.StartLinePosition.Line + 1, - location.StartLinePosition.Character + 1, - failure.Id, - failure.GetMessage()); - } - - return string.Format(Translations.script_compile_error_no_location, scriptName, failure.Id, failure.GetMessage()); - } - - /// - /// Quickly calculate a hash for the given script - /// - /// script lines - /// Quick hash as unsigned long - private static ulong QuickHash(string[] lines) - { - ulong hashedValue = 3074457345618258791ul; - for (int i = 0; i < lines.Length; i++) - { - for (int j = 0; j < lines[i].Length; j++) - { - hashedValue += lines[i][j]; - hashedValue *= 3074457345618258799ul; - } - hashedValue += '\n'; - hashedValue *= 3074457345618258799ul; - } - return hashedValue; - } - } - - /// - /// Describe a C# script error type - /// - public enum CSErrorType { FileReadError, InvalidScript, LoadError, RuntimeError }; - - /// - /// Describe a C# script error with associated error type - /// - public class CSharpException : Exception - { - private readonly CSErrorType _type; - public CSErrorType ExceptionType { get { return _type; } } - public override string Message { get { return InnerException!.Message; } } - public override string ToString() { return InnerException!.ToString(); } - public CSharpException(CSErrorType type, Exception inner) : base(inner.Message, inner) - { - _type = type; - } - } - - /// - /// Represents the C# API object accessible from C# Scripts - /// - public class CSharpAPI : ChatBot - { - /// - /// Holds local variables passed along with the script - /// - private readonly Dictionary? localVars; - - /// - /// Create a new C# API Wrapper - /// - /// ChatBot API Handler - /// ChatBot tick handler - /// Local variables passed along with the script - public CSharpAPI(ChatBot apiHandler, Dictionary? localVars, string? scriptOwnerKey = null) - { - SetMaster(apiHandler); - this.localVars = localVars; - SetScriptOwnerKey(scriptOwnerKey); - } - - /// - /// Access the shared MCC gameplay API used by bots and the embedded MCP server. - /// - new public MccGameApi Game => base.Game; - - /* == Wrappers for ChatBot API with public visibility and call limit to one per tick for safety == */ - - /// - /// Write some text in the console. Nothing will be sent to the server. - /// - /// Log text to write - new public void LogToConsole(object text) - { - base.LogToConsole(text); - } - - /// - /// Send text to the server. Can be anything such as chat messages or commands - /// - /// Text to send to the server - /// TRUE if successfully sent (Deprectated, always returns TRUE for compatibility purposes with existing scripts) - public bool SendText(object text) - { - return base.SendText(text is string str ? str : text.ToString() ?? string.Empty); - } - - /// - /// Perform an internal MCC command (not a server command, use SendText() instead for that!) - /// - /// The command to process - /// Local variables passed along with the internal command - /// TRUE if the command was indeed an internal MCC command - new public bool PerformInternalCommand(string command, Dictionary? localVars = null) - { - localVars ??= this.localVars; - return base.PerformInternalCommand(command, localVars); - } - - /// - /// Disconnect from the server and restart the program - /// It will unload and reload all the bots and then reconnect to the server - /// - /// If connection fails, the client will make X extra attempts - /// Optional delay, in seconds, before restarting - new public void ReconnectToTheServer(int extraAttempts = -999999, int delaySeconds = 0, bool keepAccountAndServerSettings = false) - { - if (extraAttempts == -999999) - base.ReconnectToTheServer(delaySeconds: delaySeconds, keepAccountAndServerSettings: keepAccountAndServerSettings); - else - base.ReconnectToTheServer(extraAttempts, delaySeconds, keepAccountAndServerSettings); - } - - /// - /// Disconnect from the server and exit the program - /// - new public void DisconnectAndExit() - { - base.DisconnectAndExit(); - } - - /// - /// Load the provided ChatBot object - /// - /// Bot to load - new public void LoadBot(ChatBot bot) - { - base.LoadBot(bot); - } - - /// - /// Return the list of currently online players - /// - /// List of online players - new public string[] GetOnlinePlayers() - { - return base.GetOnlinePlayers(); - } - - /// - /// Get a dictionary of online player names and their corresponding UUID - /// - /// - /// dictionary of online player whereby - /// UUID represents the key - /// playername represents the value - new public Dictionary GetOnlinePlayersWithUUID() - { - return base.GetOnlinePlayersWithUUID(); - } - - /* == Additional Methods useful for Script API == */ - - /// - /// Get a global variable by name - /// - /// Name of the variable - /// Value of the variable or null if no variable - public object? GetVar(string varName) - { - if (localVars is not null && localVars.ContainsKey(varName)) - return localVars[varName]; - else - return Config.AppVar.GetVar(varName); - } - - /// - /// Set a global variable for further use in any other script - /// - /// Name of the variable - /// Value of the variable - public bool SetVar(string varName, object varValue) - { - if (localVars is not null && localVars.ContainsKey(varName)) - localVars.Remove(varName); - return Config.AppVar.SetVar(varName, varValue); - } - - /// - /// Get a global variable by name, as the specified type, and try converting it if possible. - /// If you know what you are doing and just want a cast, use (T)MCC.GetVar("name") instead. - /// - /// Variable type - /// Variable name - /// Variable as specified type or default value for this type - public T? GetVar(string varName) - { - object? value = GetVar(varName); - if (value is T Tval) - return Tval; - if (value is not null) - { - try - { - TypeConverter converter = TypeDescriptor.GetConverter(typeof(T)); - if (converter is not null) - return (T?)converter.ConvertFromString(value.ToString() ?? string.Empty); - } - catch (NotSupportedException) { /* Was worth trying */ } - } - return default; - } - - //Named shortcuts for GetVar(varname) - public string? GetVarAsString(string varName) { return GetVar(varName); } - public int GetVarAsInt(string varName) { return GetVar(varName); } - public double GetVarAsDouble(string varName) { return GetVar(varName); } - public bool GetVarAsBool(string varName) { return GetVar(varName); } - - /// - /// Load login/password using an account alias and optionally reconnect to the server - /// - /// Account alias - /// Set to true to reconnecto to the server afterwards - /// True if the account was found and loaded - public bool SetAccount(string accountAlias, bool andReconnect = false) - { - bool result = Config.Main.Advanced.SetAccount(accountAlias); - if (result && andReconnect) - ReconnectToTheServer(keepAccountAndServerSettings: true); - return result; - } - - /// - /// Load new server information and optionally reconnect to the server - /// - /// "serverip:port" couple or server alias - /// True if the server IP was valid and loaded, false otherwise - public bool SetServer(string server, bool andReconnect = false) - { - bool result = Config.Main.SetServerIP(new MainConfigHelper.MainConfig.ServerInfoConfig(server), true); - if (result && andReconnect) - ReconnectToTheServer(keepAccountAndServerSettings: true); - return result; - } - - /// - /// Synchronously call another script and retrieve the result - /// - /// Script to call - /// Arguments to pass to the script - /// An object returned by the script, or null - public object? CallScript(string script, string[] args) - { - ChatBots.Script.LookForScript(ref script); - string[] lines; - try - { - lines = File.ReadAllLines(script, Encoding.UTF8); - } - catch (Exception e) - { - throw new CSharpException(CSErrorType.FileReadError, e); - } - return CSharpRunner.Run(this, lines, args, localVars, scriptName: script); - } - } -} diff --git a/MinecraftClient/Scripting/ChatBot.cs b/MinecraftClient/Scripting/ChatBot.cs deleted file mode 100644 index b8f21e35e3..0000000000 --- a/MinecraftClient/Scripting/ChatBot.cs +++ /dev/null @@ -1,1911 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading; -using Brigadier.NET; -using Brigadier.NET.Builder; -using MinecraftClient.CommandHandler; -using MinecraftClient.CommandHandler.Patch; -using MinecraftClient.Inventory; -using MinecraftClient.Mapping; -using static MinecraftClient.Settings; - -namespace MinecraftClient.Scripting -{ - /// - /// Welcome to the Bot API file ! - /// The virtual class "ChatBot" contains anything you need for creating chat bots - /// Inherit from this class while adding your bot class to the "ChatBots" folder. - /// Override the methods you want for handling events: Initialize, Update, GetText. - /// - /// For testing your bot you can add it in McClient.cs (see comment at line ~199). - /// Your bot will be loaded everytime MCC is started so that you can test/debug. - /// - /// Once your bot is fully written and tested, you can export it a standalone script. - /// This way it can be loaded in newer MCC builds, without modifying MCC itself. - /// See config/sample-script-with-chatbot.cs for a ChatBot script example. - /// - - /// - /// The virtual class containing anything you need for creating chat bots. - /// - public abstract class ChatBot - { - public enum DisconnectReason { InGameKick, LoginRejected, ConnectionLost, UserLogout }; - - //Handler will be automatically set on bot loading, don't worry about this - public void SetHandler(McClient handler) { _handler = handler; } - protected void SetMaster(ChatBot master) { this.master = master; } - protected void LoadBot(ChatBot bot) - { - if (ScriptOwnerKey is not null) - bot.SetScriptOwnerKey(ScriptOwnerKey); - - if (Handler.GetLoadedChatBots().Any(loadedBot => ReferenceEquals(loadedBot, bot))) - Handler.BotUnLoad(bot); - - Handler.BotLoad(bot); - } - protected List GetLoadedChatBots() { return Handler.GetLoadedChatBots(); } - protected void UnLoadBot(ChatBot bot) { Handler.BotUnLoad(bot); } - internal string? ScriptOwnerKey { get; private set; } - internal void SetScriptOwnerKey(string? scriptOwnerKey) { ScriptOwnerKey = scriptOwnerKey; } - private McClient? _handler = null; - private ChatBot? master = null; - private readonly List registeredPluginChannels = new(); - private readonly List registeredChatBotCommands = new(); - private readonly Lock delayTasksLock = new(); - private readonly List delayedTasks = new(); - private MccGameApi? _game; - protected McClient Handler - { - get - { - if (master is not null) - return master.Handler; - if (_handler is not null) - return _handler; - throw new InvalidOperationException(Translations.exception_chatbot_init); - } - } - - /// - /// Shared gameplay and observed-state API used by MCP and available to built-in bots and scripts. - /// - protected MccGameApi Game => _game ??= new MccGameApi(() => Handler); - - /// - /// Will be called every client tick (~50ms at 20 TPS). - /// - /// - /// method can be overridden by child class so need an extra update method - /// - public void UpdateInternal() - { - lock (delayTasksLock) - { - if (delayedTasks.Count > 0) - { - List tasksToRemove = new(); - for (int i = 0; i < delayedTasks.Count; i++) - { - if (delayedTasks[i].Tick()) - { - delayedTasks[i].Task(); - tasksToRemove.Add(i); - } - } - if (tasksToRemove.Count > 0) - { - tasksToRemove.Sort((a, b) => b.CompareTo(a)); // descending sort - foreach (int index in tasksToRemove) - { - delayedTasks.RemoveAt(index); - } - } - } - } - } - - /* ================================================== */ - /* Main methods to override for creating your bot */ - /* ================================================== */ - - /// - /// Anything you want to initialize your bot, will be called on load by MinecraftCom - /// This method is called only once, whereas AfterGameJoined() is called once per server join. - /// - /// NOTE: Chat messages cannot be sent at this point in the login process. - /// If you want to send a message when the bot is loaded, use AfterGameJoined. - /// - public virtual void Initialize() { } - - /// - /// This method is called when the bot is being unloaded, you can use it to free up resources like DB connections - /// - public virtual void OnUnload() { } - - /// - /// Called after the server has been joined successfully and chat messages are able to be sent. - /// This method is called again after reconnecting to the server, whereas Initialize() is called only once. - /// - /// NOTE: This is not always right after joining the server - if the bot was loaded after logging - /// in this is still called. - /// - public virtual void AfterGameJoined() { } - - /// - /// Will be called every client tick (~50ms, 20 TPS) if loaded in MinecraftCom - /// - public virtual void Update() { } - - /// - /// Will be called every player break block in gamemode 0 - /// - /// Player - /// Block location - /// Destroy stage, maximum 255 - public virtual void OnBlockBreakAnimation(Entity entity, Location location, byte stage) { } - - /// - /// Will be called every animations of the hit and place block - /// - /// Player - /// 0 = LMB, 1 = RMB (RMB Corrent not work) - public virtual void OnEntityAnimation(Entity entity, byte animation) { } - - /// - /// Any text sent by the server will be sent here by MinecraftCom - /// - /// Text from the server - public virtual void GetText(string text) { } - - /// - /// Any text sent by the server will be sent here by MinecraftCom (extended variant) - /// - /// - /// You can use Json.ParseJson() to obtain a System.Text.Json.Nodes.JsonNode for processing. - /// - /// Text from the server - /// Raw JSON from the server. This parameter will be NULL on MC 1.5 or lower! - public virtual void GetText(string text, string? json) { } - - /// - /// Is called when the client has been disconnected fom the server - /// - /// Disconnect Reason - /// Kick message, if any - /// Return TRUE if the client is about to restart - public virtual bool OnDisconnect(DisconnectReason reason, string message) { return false; } - - /// - /// Called when a plugin channel message is received. - /// The given channel must have previously been registered with RegisterPluginChannel. - /// This can be used to communicate with server mods or plugins. See wiki.vg for more - /// information about plugin channels: http://wiki.vg/Plugin_channel - /// - /// The name of the channel - /// The payload for the message - public virtual void OnPluginMessage(string channel, byte[] data) { } - - /// - /// Called when properties for the Player entity are received from the server - /// - /// Dictionary of player properties - public virtual void OnPlayerProperty(Dictionary prop) { } - - /// - /// Called when server TPS are recalculated by MCC based on world time updates - /// - /// New estimated server TPS (between 0 and 20) - public virtual void OnServerTpsUpdate(double tps) { } - - /// - /// Called when a time changed - /// - /// World age - /// Time - public virtual void OnTimeUpdate(long WorldAge, long TimeOfDay) { } - - /// - /// Called when an entity moved nearby - /// - /// Entity with updated location - public virtual void OnEntityMove(Entity entity) { } - - /// - /// Called when a tracked entity receives a velocity update packet. - /// Velocity is expressed in blocks per tick. - /// - /// Entity with updated velocity - /// Velocity on X axis (blocks/tick) - /// Velocity on Y axis (blocks/tick) - /// Velocity on Z axis (blocks/tick) - public virtual void OnEntityVelocity(Entity entity, double velocityX, double velocityY, double velocityZ) { } - - /// - /// Called when a sound packet is received. - /// The sound name is null when the protocol provides only a registry id. - /// - /// Sound key when available, otherwise null - /// Sound position when available - /// Sound category id from packet - /// Sound volume - /// Sound pitch - /// Source entity for entity-sound packets when tracked - public virtual void OnSoundEffect(string? soundName, Location? location, int category, float volume, float pitch, - Entity? sourceEntity) - { } - - /// - /// Called when an entity rotates - /// - /// Entity with updated rotation - public virtual void OnEntityRotate(Entity entity) { } - - /// - /// Called after an internal MCC command has been performed - /// - /// MCC Command Name - /// MCC Command Parameters - /// MCC command result - public virtual void OnInternalCommand(string commandName, string commandParams, CmdResult Result) { } - - /// - /// Called when an entity spawned nearby - /// - /// New Entity - public virtual void OnEntitySpawn(Entity entity) { } - - /// - /// Called when an entity despawns/dies nearby - /// - /// Entity wich has just disappeared - public virtual void OnEntityDespawn(Entity entity) { } - - /// - /// Called when the player held item has changed - /// - /// New slot ID - public virtual void OnHeldItemChange(byte slot) { } - - /// - /// Called when the player health has been updated - /// - /// New player health - /// New food level - public virtual void OnHealthUpdate(float health, int food) { } - - /// - /// Called when an explosion occurs on the server - /// - /// Explosion location - /// Explosion strength - /// Amount of blocks blown up - public virtual void OnExplosion(Location explode, float strength, int recordcount) { } - - /// - /// Called when experience updates - /// - /// Between 0 and 1 - /// Level - /// Total Experience - public virtual void OnSetExperience(float Experiencebar, int Level, int TotalExperience) { } - - /// - /// Called when the Game Mode has been updated for a player - /// - /// Player Name - /// Player UUID - /// New Game Mode (0: Survival, 1: Creative, 2: Adventure, 3: Spectator). - public virtual void OnGamemodeUpdate(string playername, Guid uuid, int gamemode) { } - - /// - /// Called when the Latency has been updated for a player - /// - /// Player Name - /// Player UUID - /// Latency. - public virtual void OnLatencyUpdate(string playername, Guid uuid, int latency) { } - - /// - /// Called when the Latency has been updated for a player - /// - /// Entity - /// Player Name - /// Player UUID - /// Latency. - public virtual void OnLatencyUpdate(Entity entity, string playername, Guid uuid, int latency) { } - - /// - /// Called when an update of the map is sent by the server, take a look at https://wiki.vg/Protocol#Map_Data for more info on the fields - /// Map format and colors: https://minecraft.wiki/w/Map_item_format - /// - /// Map ID of the map being modified - /// A scale of the Map, from 0 for a fully zoomed-in map (1 block per pixel) to 4 for a fully zoomed-out map (16 blocks per pixel) - /// Specifies whether player and item frame icons are shown - /// True if the map has been locked in a cartography table - /// A list of MapIcon objects of map icons, send only if trackingPosition is true - /// Numbs of columns that were updated (map width) (NOTE: If it is 0, the next fields are not used/are set to default values of 0 and null respectively) - /// Map height - /// x offset of the westernmost column - /// z offset of the northernmost row - /// a byte array of colors on the map - public virtual void OnMapData(int mapid, byte scale, bool trackingPosition, bool locked, List icons, byte columnsUpdated, byte rowsUpdated, byte mapCoulmnX, byte mapRowZ, byte[]? colors) { } - - /// - /// Called when tradeList is received from server - /// - /// Window ID - /// List of trades. - /// Contains Level, Experience, IsRegularVillager and CanRestock . - public virtual void OnTradeList(int windowID, List trades, VillagerInfo villagerInfo) { } - - /// - /// Called when received a title from the server - /// 0 = set title, 1 = set subtitle, 3 = set action bar, 4 = set times and display, 4 = hide, 5 = reset - /// title text - /// suntitle text - /// action bar text - /// Fade In - /// Stay - /// Fade Out - /// json text - public virtual void OnTitle(int action, string titletext, string subtitletext, string actionbartext, int fadein, int stay, int fadeout, string json) { } - - /// - /// Called when an entity equipped - /// - /// Entity - /// Equipment slot. 0: main hand, 1: off hand, 2–5: armor slot (2: boots, 3: leggings, 4: chestplate, 5: helmet) - /// Item) - public virtual void OnEntityEquipment(Entity entity, int slot, Item? item) { } - - /// - /// Called when an entity has effect applied - /// - /// entity - /// effect id - /// effect amplifier - /// effect duration - /// effect flags - public virtual void OnEntityEffect(Entity entity, Effects effect, int amplifier, int duration, byte flags) { } - - /// - /// Called when an entity has an effect removed (expired or cleared) - /// - /// Entity - /// Effect that was removed - public virtual void OnRemoveEntityEffect(Entity entity, Effects effect) { } - - /// - /// Called when a scoreboard objective updated - /// - /// objective name - /// 0 to create the scoreboard. 1 to remove the scoreboard. 2 to update the display text. - /// Only if mode is 0 or 2. The text to be displayed for the score - /// Only if mode is 0 or 2. 0 = "integer", 1 = "hearts". - /// Number format: 0 - blank, 1 - styled, 2 - fixed - public virtual void OnScoreboardObjective(string objectiveName, byte mode, string objectiveValue, int type, string json, int numberFormat) { } - - /// - /// Called when a scoreboard updated - /// - /// The entity whose score this is. For players, this is their username; for other entities, it is their UUID. - /// 0 to create/update an item. 1 to remove an item. - /// The name of the objective the score belongs to - /// The name of the objective the score belongs to, but with chat formatting - /// The score to be displayed next to the entry. Only sent when Action does not equal 1. - /// Number format: 0 - blank, 1 - styled, 2 - fixed - public virtual void OnUpdateScore(string entityName, int action, string objectiveName, string objectiveDisplayName, int value, int numberFormat) { } - - /// - /// Called when a Teams packet is received from the server. - /// - /// Internal team name (up to 16 chars) - /// 0=create, 1=remove, 2=update, 3=add players, 4=remove players - /// Display name (formatted). Present when method is 0 or 2. - /// Bit 0=allowFriendlyFire, bit 1=seeFriendlyInvisibles. Present when method is 0 or 2. - /// Nametag visibility rule. Present when method is 0 or 2. - /// Collision rule. Present when method is 0 or 2. - /// ChatFormatting color value (-1=none). Present when method is 0 or 2. - /// Member name prefix (formatted). Present when method is 0 or 2. - /// Member name suffix (formatted). Present when method is 0 or 2. - /// Player/entity names. Present when method is 0, 3, or 4. - public virtual void OnTeam(string teamName, byte method, string displayName, byte friendlyFlags, - string nameTagVisibility, string collisionRule, int color, - string prefix, string suffix, List players) - { } - - /// - /// Called when the client received the Tab Header and Footer - /// - /// Header - /// Footer - public virtual void OnTabListHeaderAndFooter(string header, string footer) { } - - /// - /// Called when an inventory/container was updated by server - /// - /// - public virtual void OnInventoryUpdate(int inventoryId) { } - - /// - /// Called when a container was opened - /// - /// - public virtual void OnInventoryOpen(int inventoryId) { } - - /// - /// Called when a container was closed - /// - /// - public virtual void OnInventoryClose(int inventoryId) { } - - /// - /// When received inventory/container/window properties from the server. - /// Used for Frunaces, Enchanting Table, Beacon, Brewing stand, Stone cutter, Loom and Lectern - /// More info about: https://wiki.vg/Protocol#Set_Container_Property - /// - /// Inventory ID - /// Property ID - /// Property Value - public virtual void OnInventoryProperties(byte inventoryID, short propertyId, short propertyValue) { } - - /// - /// When received enchantments from the server this method is called - /// Enchantment levels are the levels of enchantment (eg. I, II, III, IV, V) (eg. Smite IV, Power III, Knockback II ..) - /// Enchantment level requirements are the levels that player needs to have in order to enchant the item - /// - /// Enchantment in the top most slot - /// Enchantment in the middle slot - /// Enchantment in the bottom slot - /// Enchantment level for the enchantment in the top most slot - /// Enchantment level for the enchantment in the middle slot - /// Enchantment level for the enchantment in the bottom slot - /// Levels required by player for the enchantment in the top most slot - /// Levels required by player for the enchantment in the middle slot - /// Levels required by player for the enchantment in the bottom slot - public virtual void OnEnchantments( - Enchantments topEnchantment, - Enchantments middleEnchantment, - Enchantments bottomEnchantment, - short topEnchantmentLevel, - short middleEnchantmentLevel, - short bottomEnchantmentLevel, - short topEnchantmentLevelRequirement, - short middleEnchantmentLevelRequirement, - short bottomEnchantmentLevelRequirement) - { } - - /// - /// When received enchantments from the server this method is called - /// Enchantment levels are the levels of enchantment (eg. I, II, III, IV, V) (eg. Smite IV, Power III, Knockback II ..) - /// Enchantment level requirements are the levels that player needs to have in order to enchant the item - /// - /// Enchantment data/info - public virtual void OnEnchantments(EnchantmentData enchantment) { } - - /// - /// Called when a player joined the game - /// - /// UUID of the player - /// Name of the player - public virtual void OnPlayerJoin(Guid uuid, string name) { } - - /// - /// Called when a player left the game - /// - /// UUID of the player - /// Name of the player - public virtual void OnPlayerLeave(Guid uuid, string? name) { } - - /// - /// This method is called when a player has been killed by another entity - /// - /// Killer's entity - /// message sent in chat when player is killed - public virtual void OnKilled(Entity killerEntity, string chatMessage) { } - - /// - /// Called when the player dies - /// For getting the info about the player/entity who killed the player use OnPlayerKilled - /// - public virtual void OnDeath() { } - - /// - /// Called when the player respawns - /// - public virtual void OnRespawn() { } - - /// - /// Called when the health of an entity changed - /// - /// Entity - /// The health of the entity - public virtual void OnEntityHealth(Entity entity, float health) { } - - /// - /// Called when the metadata of an entity changed - /// - /// Entity - /// The metadata of the entity - public virtual void OnEntityMetadata(Entity entity, Dictionary metadata) { } - - /// - /// Called when the status of client player have been changed - /// - /// - public virtual void OnPlayerStatus(byte statusId) { } - - /// - /// Called when a network packet received or sent - /// - /// - /// You need to enable this event by calling with True before you can use this event - /// - /// Packet ID - /// A copy of Packet Data - /// The packet is login phase or playing phase - /// The packet is received from server or sent by client - public virtual void OnNetworkPacket(int packetID, List packetData, bool isLogin, bool isInbound) { } - - /// - /// Called when the rain level have been changed - /// - /// - public virtual void OnRainLevelChange(float level) { } - - /// - /// Called when the thunder level have been changed - /// - /// - public virtual void OnThunderLevelChange(float level) { } - - - /// - /// Called when a block is changed. - /// - /// The location of the block. - /// The block - public virtual void OnBlockChange(Location location, Block block) { } - - /// - /// Called when achievement/advancement data is updated. - /// - /// Achievements that were added or updated - /// IDs of achievements that were removed - /// Whether the achievement state was fully reset before this update - public virtual void OnAchievementUpdate(IReadOnlyList updated, IReadOnlyList removedIds, bool reset) { } - - /* =================================================================== */ - /* ToolBox - Methods below might be useful while creating your bot. */ - /* You should not need to interact with other classes of the program. */ - /* All the methods in this ChatBot class should do the job for you. */ - /* =================================================================== */ - - /// - /// Send text to the server. Can be anything such as chat messages or commands - /// - /// Text to send to the server - /// Bypass send queue (Deprecated, still there for compatibility purposes but ignored) - /// TRUE if successfully sent (Deprectated, always returns TRUE for compatibility purposes with existing scripts) - protected bool SendText(string text, bool sendImmediately = false) - { - LogToConsole("Sending '" + text + "'"); - Handler.SendText(text); - return true; - } - - /// - /// Perform an internal MCC command (not a server command, use SendText() instead for that!) - /// - /// The command to process - /// Local variables passed along with the command - /// TRUE if the command was indeed an internal MCC command - protected bool PerformInternalCommand(string command, Dictionary? localVars = null) - { - CmdResult temp = new(); - return Handler.PerformInternalCommand(command, ref temp, localVars); - } - - /// - /// Perform an internal MCC command (not a server command, use SendText() instead for that!) - /// - /// The command to process - /// May contain a confirmation or error message after processing the command, or "" otherwise. - /// Local variables passed along with the command - /// TRUE if the command was indeed an internal MCC command - protected bool PerformInternalCommand(string command, ref CmdResult result, Dictionary? localVars = null) - { - return Handler.PerformInternalCommand(command, ref result, localVars); - } - - /// - /// Remove color codes ("§c" and "§#rrggbb") from a text message received from the server - /// - public static string GetVerbatim(string? text) - { - if (string.IsNullOrEmpty(text)) - return string.Empty; - - int idx = 0; - var data = new char[text.Length]; - - for (int i = 0; i < text.Length; i++) - { - if (text[i] != '§') - { - data[idx++] = text[i]; - } - else if (i + 1 < text.Length && text[i + 1] == '#' && i + 7 < text.Length) - { - i += 7; // skip §#rrggbb (8 chars total, loop increments once) - } - else - { - i++; // skip §x (2 chars total) - } - } - - return new string(data, 0, idx); - } - - /// - /// Verify that a string contains only a-z A-Z 0-9 and _ characters. - /// - public static bool IsValidName(string username) - { - if (string.IsNullOrEmpty(username)) - return false; - - foreach (char c in username) - if (!(c >= 'a' && c <= 'z' - || c >= 'A' && c <= 'Z' - || c >= '0' && c <= '9' - || c == '_')) - return false; - - return true; - } - - /// - /// Returns true if the text passed is a private message sent to the bot - /// - /// text to test - /// if it's a private message, this will contain the message - /// if it's a private message, this will contain the player name that sends the message - /// Returns true if the text is a private message - protected static bool IsPrivateMessage(string text, ref string message, ref string sender) - { - if (string.IsNullOrEmpty(text)) - return false; - - text = GetVerbatim(text); - - //User-defined regex for private chat messages - if (Config.ChatFormat.UserDefined && !string.IsNullOrWhiteSpace(Config.ChatFormat.Private)) - { - Match regexMatch = Regex.Match(text, Config.ChatFormat.Private); - if (regexMatch.Success && regexMatch.Groups.Count >= 3) - { - sender = regexMatch.Groups[1].Value; - message = regexMatch.Groups[2].Value; - return IsValidName(sender); - } - } - - //Built-in detection routine for private messages - if (Config.ChatFormat.Builtins) - { - string[] tmp = text.Split(' '); - try - { - //Detect vanilla /tell messages - //Someone whispers message (MC 1.5) - //Someone whispers to you: message (MC 1.7) - if (tmp.Length > 2 && tmp[1] == "whispers") - { - if (tmp.Length > 4 && tmp[2] == "to" && tmp[3] == "you:") - { - message = text[(tmp[0].Length + 18)..]; //MC 1.7 - } - else message = text[(tmp[0].Length + 10)..]; //MC 1.5 - sender = tmp[0]; - return IsValidName(sender); - } - - //Detect Essentials (Bukkit) /m messages - //[Someone -> me] message - //[~Someone -> me] message - else if (text[0] == '[' && tmp.Length > 3 && tmp[1] == "->" - && (tmp[2].ToLower() == "me]" || tmp[2].ToLower() == "moi]")) //'me' is replaced by 'moi' in french servers - { - message = text[(tmp[0].Length + 4 + tmp[2].Length + 1)..]; - sender = tmp[0][1..]; - if (sender[0] == '~') { sender = sender[1..]; } - return IsValidName(sender); - } - - //Detect Modified server messages. /m - //[Someone @ me] message - else if (text[0] == '[' && tmp.Length > 3 && tmp[1] == "@" - && (tmp[2].ToLower() == "me]" || tmp[2].ToLower() == "moi]")) //'me' is replaced by 'moi' in french servers - { - message = text[(tmp[0].Length + 4 + tmp[2].Length + 0)..]; - sender = tmp[0][1..]; - if (sender[0] == '~') { sender = sender[1..]; } - return IsValidName(sender); - } - - //Detect Essentials (Bukkit) /me messages with some custom prefix - //[Prefix] [Someone -> me] message - //[Prefix] [~Someone -> me] message - else if (text[0] == '[' && tmp[0][^1] == ']' - && tmp[1][0] == '[' && tmp.Length > 4 && tmp[2] == "->" - && (tmp[3].ToLower() == "me]" || tmp[3].ToLower() == "moi]")) - { - message = text[(tmp[0].Length + 1 + tmp[1].Length + 4 + tmp[3].Length + 1)..]; - sender = tmp[1][1..]; - if (sender[0] == '~') { sender = sender[1..]; } - return IsValidName(sender); - } - - //Detect Essentials (Bukkit) /me messages with some custom rank - //[Someone [rank] -> me] message - //[~Someone [rank] -> me] message - else if (text[0] == '[' && tmp.Length > 3 && tmp[2] == "->" - && (tmp[3].ToLower() == "me]" || tmp[3].ToLower() == "moi]")) - { - message = text[(tmp[0].Length + 1 + tmp[1].Length + 4 + tmp[2].Length + 1)..]; - sender = tmp[0][1..]; - if (sender[0] == '~') { sender = sender[1..]; } - return IsValidName(sender); - } - - //Detect HeroChat PMsend - //From Someone: message - else if (text.StartsWith("From ")) - { - sender = text[5..].Split(':')[0]; - message = text[(text.IndexOf(':') + 2)..]; - return IsValidName(sender); - } - else return false; - } - catch (IndexOutOfRangeException) { /* Not an expected chat format */ } - catch (ArgumentOutOfRangeException) { /* Same here */ } - } - - return false; - } - - /// - /// Returns true if the text passed is a public message written by a player on the chat - /// - /// text to test - /// if it's message, this will contain the message - /// if it's message, this will contain the player name that sends the message - /// Returns true if the text is a chat message - protected static bool IsChatMessage(string text, ref string message, ref string sender) - { - if (string.IsNullOrEmpty(text)) - return false; - - text = GetVerbatim(text); - - //User-defined regex for public chat messages - if (Config.ChatFormat.UserDefined && !string.IsNullOrWhiteSpace(Config.ChatFormat.Public)) - { - Match regexMatch = Regex.Match(text, Config.ChatFormat.Public); - if (regexMatch.Success && regexMatch.Groups.Count >= 3) - { - sender = regexMatch.Groups[1].Value; - message = regexMatch.Groups[2].Value; - return IsValidName(sender); - } - } - - //Built-in detection routine for public messages - if (Config.ChatFormat.Builtins) - { - string[] tmp = text.Split(' '); - - //Detect vanilla/factions Messages - // message - //<*Faction Someone> message - //<*Faction Someone>: message - //<*Faction ~Nicknamed>: message - if (text[0] == '<') - { - try - { - text = text[1..]; - string[] tmp2 = text.Split('>'); - sender = tmp2[0]; - message = text[(sender.Length + 2)..]; - if (message.Length > 1 && message[0] == ' ') - { message = message[1..]; } - tmp2 = sender.Split(' '); - sender = tmp2[^1]; - if (sender[0] == '~') { sender = sender[1..]; } - return IsValidName(sender); - } - catch (IndexOutOfRangeException) { /* Not a vanilla/faction message */ } - catch (ArgumentOutOfRangeException) { /* Same here */ } - } - - //Detect HeroChat Messages - //Public chat messages - //[Channel] [Rank] User: Message - else if (text[0] == '[' && text.Contains(':') && tmp.Length > 2) - { - try - { - int name_end = text.IndexOf(':'); - int name_start = text[..name_end].LastIndexOf(']') + 2; - sender = text[name_start..name_end]; - message = text[(name_end + 2)..]; - return IsValidName(sender); - } - catch (IndexOutOfRangeException) { /* Not a herochat message */ } - catch (ArgumentOutOfRangeException) { /* Same here */ } - } - - //Detect (Unknown Plugin) Messages - //**Faction User : Message - else if (text[0] == '*' - && text.Length > 1 - && text[1] != ' ' - && text.Contains('<') && text.Contains('>') - && text.Contains(' ') && text.Contains(':') - && text.IndexOf('*') < text.IndexOf('<') - && text.IndexOf('<') < text.IndexOf('>') - && text.IndexOf('>') < text.IndexOf(' ') - && text.IndexOf(' ') < text.IndexOf(':')) - { - try - { - string prefix = tmp[0]; - string user = tmp[1]; - string semicolon = tmp[2]; - if (prefix.All(c => char.IsLetterOrDigit(c) || new[] { '*', '<', '>', '_' }.Contains(c)) - && semicolon == ":") - { - message = text[(prefix.Length + user.Length + 4)..]; - return IsValidName(user); - } - } - catch (IndexOutOfRangeException) { /* Not a message */ } - catch (ArgumentOutOfRangeException) { /* Same here */ } - } - } - - return false; - } - - /// - /// Returns true if the text passed is a teleport request (Essentials) - /// - /// Text to parse - /// Will contain the sender's username, if it's a teleport request - /// Returns true if the text is a teleport request - protected static bool IsTeleportRequest(string text, ref string sender) - { - if (string.IsNullOrEmpty(text)) - return false; - - text = GetVerbatim(text); - - //User-defined regex for teleport requests - if (Config.ChatFormat.UserDefined && !string.IsNullOrWhiteSpace(Config.ChatFormat.TeleportRequest)) - { - Match regexMatch = Regex.Match(text, Config.ChatFormat.TeleportRequest); - if (regexMatch.Success && regexMatch.Groups.Count >= 2) - { - sender = regexMatch.Groups[1].Value; - return IsValidName(sender); - } - } - - //Built-in detection routine for teleport requests - if (Config.ChatFormat.Builtins) - { - string[] tmp = text.Split(' '); - - //Detect Essentials teleport requests, prossibly with - //nicknamed names or other modifications such as HeroChat - if (text.EndsWith("has requested to teleport to you.") - || text.EndsWith("has requested that you teleport to them.")) - { - // Username has requested... - //[Rank] Username has requested... - if ((tmp[0].StartsWith("<") && tmp[0].EndsWith(">") - || tmp[0].StartsWith("[") && tmp[0].EndsWith("]")) - && tmp.Length > 1) - sender = tmp[1]; - else //Username has requested.. - sender = tmp[0]; - - //~Username has requested... - if (sender.Length > 1 && sender[0] == '~') - sender = sender[1..]; - - //Final check on username validity - return IsValidName(sender); - } - } - - return false; - } - - /// - /// Write some text in the console. Nothing will be sent to the server. - /// - /// Log text to write - protected void LogToConsole(object? text) - { - string botName = Translations.ResourceManager.GetString("botname." + GetType().Name) ?? GetType().Name; - if (_handler is null || master is null) - ConsoleIO.WriteLogLine(string.Format("[{0}] {1}", botName, text)); - else - Handler.Log.Info(string.Format("[{0}] {1}", botName, text)); - string logfile = Config.AppVar.ExpandVars(Config.Main.Advanced.ChatbotLogFile); - - if (!string.IsNullOrEmpty(logfile)) - { - if (!File.Exists(logfile)) - { - try { Directory.CreateDirectory(Path.GetDirectoryName(logfile)!); } - catch { return; /* Invalid path or access denied */ } - try { File.WriteAllText(logfile, ""); } - catch { return; /* Invalid file name or access denied */ } - } - - File.AppendAllLines(logfile, [GetTimestamp() + ' ' + text]); - } - } - - protected static void LogToConsole(string originBotName, object? text) - { - string botName = Translations.ResourceManager.GetString(originBotName) ?? originBotName; - ConsoleIO.WriteLogLine(string.Format("[{0}] {1}", botName, text)); - string logfile = Config.AppVar.ExpandVars(Config.Main.Advanced.ChatbotLogFile); - - if (!string.IsNullOrEmpty(logfile)) - { - if (!File.Exists(logfile)) - { - try { Directory.CreateDirectory(Path.GetDirectoryName(logfile)!); } - catch { return; /* Invalid path or access denied */ } - try { File.WriteAllText(logfile, ""); } - catch { return; /* Invalid file name or access denied */ } - } - - File.AppendAllLines(logfile, [GetTimestamp() + ' ' + text]); - } - } - - /// - /// Write some text in the console, but only if DebugMessages is enabled in INI file. Nothing will be sent to the server. - /// - /// Debug log text to write - protected void LogDebugToConsole(object text) - { - if (Config.Logging.DebugMessages) - LogToConsole(text); - } - - /// - /// Write the translated text in the console by giving a translation key. Nothing will be sent to the server. - /// - /// Translation key - /// - protected void LogToConsoleTranslated(string key, params object[] args) - { - LogToConsole(string.Format(Translations.ResourceManager.GetString(key) ?? key, args)); - } - - /// - /// Write the translated text in the console by giving a translation key, but only if DebugMessages is enabled in INI file. Nothing will be sent to the server. - /// - /// Translation key - /// - protected void LogDebugToConsoleTranslated(string key, params object?[] args) - { - LogDebugToConsole(string.Format(Translations.ResourceManager.GetString(key) ?? key, args)); - } - - /// - /// Disconnect from the server and restart the program - /// It will unload and reload all the bots and then reconnect to the server - /// - /// In case of failure, maximum extra attempts before aborting - /// Optional delay, in seconds, before restarting - protected void ReconnectToTheServer(int ExtraAttempts = 3, int delaySeconds = 0, bool keepAccountAndServerSettings = false) - { - if (Config.Logging.DebugMessages) - { - string botName = Translations.ResourceManager.GetString("botname." + GetType().Name) ?? GetType().Name; - ConsoleIO.WriteLogLine(string.Format(Translations.chatbot_reconnect, botName)); - } - McClient.ReconnectionAttemptsLeft = ExtraAttempts; - Program.Restart(delaySeconds, keepAccountAndServerSettings); - } - - /// - /// Disconnect from the server and exit the program - /// - protected void DisconnectAndExit() - { - Program.Exit(); - } - - /// - /// Unload the chatbot, and release associated memory. - /// - protected void UnloadBot() - { - Handler.BotUnLoad(this); - } - - /// - /// Send a private message to a player - /// - /// Player name - /// Message - protected void SendPrivateMessage(string player, string message) - { - SendText(string.Format("/{0} {1} {2}", Config.Main.Advanced.PrivateMsgsCmdName, player, message)); - } - - /// - /// Run a script from a file using a Scripting bot - /// - /// File name - /// Player name to send error messages, if applicable - /// Local variables for use in the Script - protected void RunScript(string filename, string? playername = null, Dictionary? localVars = null) - { - Handler.BotLoad(new ChatBots.Script(filename, playername, localVars)); - } - - /// - /// Load an additional ChatBot - /// - /// ChatBot to load - protected void BotLoad(ChatBot chatBot) - { - Handler.BotLoad(chatBot); - } - - /// - /// Set an App Variable - /// - /// App variable name - /// App variable value - /// void - protected void SetAppVar(string name, object value) - { - Config.AppVar.SetVar(name, value); - } - - /// - /// Get a value from an App Variable - /// - /// App variable name - /// App Variable value - protected object? GetAppVar(string name) - { - return Config.AppVar.GetVar(name); - } - - /// - /// Replaces variables in text with their values from the App Var registry - /// - /// Your text with variables - /// text with variables replaced with their values - protected string ExpandAppVars(string text) - { - return Config.AppVar.ExpandVars(text); - } - - /// - /// Check whether Terrain and Movements is enabled. - /// - /// Enable status. - public bool GetTerrainEnabled() - { - return Handler.GetTerrainEnabled(); - } - - /// - /// Enable or disable Terrain and Movements. - /// Please note that Enabling will be deferred until next relog, respawn or world change. - /// - /// Enabled - /// TRUE if the setting was applied immediately, FALSE if delayed. - public bool SetTerrainEnabled(bool enabled) - { - return Handler.SetTerrainEnabled(enabled); - } - - /// - /// Get entity handling status - /// - /// - /// Entity Handling cannot be enabled in runtime (or after joining server) - public bool GetEntityHandlingEnabled() - { - return Handler.GetEntityHandlingEnabled(); - } - - /// - /// start Sneaking - /// - protected bool Sneak(bool on) - { - return SendEntityAction(on ? Protocol.EntityActionType.StartSneaking : Protocol.EntityActionType.StopSneaking); - } - - /// - /// Send Entity Action - /// - protected bool SendEntityAction(Protocol.EntityActionType entityAction) - { - return Handler.SendEntityAction(entityAction); - } - - /// - /// Attempt to dig a block at the specified location - /// - /// Location of block to dig - /// Example: if your player is under a block that is being destroyed, use Down - /// Also perform the "arm swing" animation - /// Also look at the block before digging - /// Dig duration in seconds. 0 = auto-compute for survival, or instant for creative - protected bool DigBlock(Location location, Direction direction, bool swingArms = true, bool lookAtBlock = true, - double duration = 0, MiningCalculator.MiningOptions? miningOptions = null) - { - return Handler.DigBlock(location, direction, swingArms, lookAtBlock, duration, miningOptions); - } - - /// - /// SetSlot - /// - protected void SetSlot(int slotNum) - { - Handler.ChangeSlot((short)slotNum); - } - - /// - /// Get the current Minecraft World - /// - /// Minecraft world or null if associated setting is disabled - protected World GetWorld() - { - return Handler.GetWorld(); - } - - /// - /// Get all Entities - /// - /// All Entities - protected Dictionary GetEntities() - { - return Handler.GetEntities(); - } - - /// - /// Get all achievements/advancements. - /// - /// Snapshot of all achievements - protected Achievement[] GetAchievements() - { - return Handler.GetAchievements(); - } - - /// - /// Get only completed achievements/advancements. - /// - /// Snapshot of unlocked achievements - protected Achievement[] GetUnlockedAchievements() - { - return Handler.GetUnlockedAchievements(); - } - - /// - /// Get only incomplete achievements/advancements. - /// - /// Snapshot of locked achievements - protected Achievement[] GetLockedAchievements() - { - return Handler.GetLockedAchievements(); - } - - /// - /// Get all players Latency - /// - /// All players latency - protected Dictionary GetPlayersLatency() - { - return Handler.GetPlayersLatency(); - } - - /// - /// Get the current location of the player (Feet location) - /// - /// Minecraft world or null if associated setting is disabled - protected Location GetCurrentLocation() - { - return Handler.GetCurrentLocation(); - } - - /// - /// Move to the specified location - /// - /// Location to reach - /// Allow possible but unsafe locations thay may hurt the player: lava, cactus... - /// Allow non-vanilla direct teleport instead of computing path, but may cause invalid moves and/or trigger anti-cheat plugins - /// If no valid path can be found, also allow locations within specified distance of destination - /// Do not get closer of destination than specified distance - /// How long to wait before stopping computation (default: 5 seconds) - /// When location is unreachable, computation will reach timeout, then optionally fallback to a close location within maxOffset - /// True if a path has been found - protected bool MoveToLocation(Location location, bool allowUnsafe = false, bool allowDirectTeleport = false, int maxOffset = 0, int minOffset = 0, TimeSpan? timeout = null) - { - return Handler.MoveTo(location, allowUnsafe, allowDirectTeleport, maxOffset, minOffset, timeout); - } - - /// - /// Check if the client is currently processing a Movement. - /// - /// true if a movement is currently handled - protected bool ClientIsMoving() - { - return Handler.ClientIsMoving(); - } - - /// - /// Look at the specified location - /// - /// Location to look at - protected void LookAtLocation(Location location) - { - Handler.UpdateLocation(Handler.GetCurrentLocation(), location); - Handler.SendLocationUpdate(); - } - - /// - /// Look at the specified location - /// - /// Yaw to look at - /// Pitch to look at - protected void LookAtLocation(float yaw, float pitch) - { - Handler.UpdateLocation(Handler.GetCurrentLocation(), yaw, pitch); - Handler.SendLocationUpdate(); - } - - /// - /// Find the block on the line of sight. - /// - /// Maximum distance from sight - /// Whether to detect fluid - /// Position of the block - protected Tuple GetLookingBlock(double maxDistance = 4.5, bool includeFluids = false) - { - return RaycastHelper.RaycastBlock(Handler, maxDistance, includeFluids); - } - - /// - /// Get a Y-M-D h:m:s timestamp representing the current system date and time - /// - protected static string GetTimestamp() - { - return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - } - - /// - /// Get a h:m:s timestamp representing the current system time - /// - protected static string GetShortTimestamp() - { - return DateTime.Now.ToString("HH:mm:ss"); - } - - /// - /// Load entries from a file as a string array, removing duplicates and empty lines - /// - /// File to load - /// The string array or an empty array if failed to load the file - protected string[] LoadDistinctEntriesFromFile(string file) - { - if (File.Exists(file)) - { - //Read all lines from file, remove lines with no text, convert to lowercase, - //remove duplicate entries, convert to a string array, and return the result. - return File.ReadAllLines(file, Encoding.UTF8) - .Where(line => !string.IsNullOrWhiteSpace(line)) - .Select(line => line.ToLower()) - .Distinct().ToArray(); - } - else - { - LogToConsole("File not found: " + Path.GetFullPath(file)); - return []; - } - } - - /// - /// Return the Server Port where the client is connected to - /// - /// Server Port where the client is connected to - protected int GetServerPort() - { - return Handler.GetServerPort(); - } - - /// - /// Return the Server Host where the client is connected to - /// - /// Server Host where the client is connected to - protected string GetServerHost() - { - return Handler.GetServerHost(); - } - - /// - /// Return the Username of the current account - /// - /// Username of the current account - protected string GetUsername() - { - return Handler.GetUsername(); - } - - /// - /// Return the Gamemode of the current account - /// - /// Username of the current account - protected int GetGamemode() - { - return Handler.GetGamemode(); - } - - /// - /// Return the head yaw of the client player - /// - /// Yaw of the client player - protected float GetYaw() - { - return Handler.GetYaw(); - } - - /// - /// Return the head pitch of the client player - /// - /// Pitch of the client player - protected float GetPitch() - { - return Handler.GetPitch(); - } - - /// - /// Return the UserUUID of the current account - /// - /// UserUUID of the current account - protected string GetUserUUID() - { - return Handler.GetUserUuidStr(); - } - - /// - /// Return the EntityID of the current player - /// - /// EntityID of the current player - protected int GetPlayerEntityID() - { - return Handler.GetPlayerEntityID(); - } - - /// - /// Return the list of currently online players - /// - /// List of online players - protected string[] GetOnlinePlayers() - { - return Handler.GetOnlinePlayers(); - } - - /// - /// Get a dictionary of online player names and their corresponding UUID - /// - /// - /// dictionary of online player whereby - /// UUID represents the key - /// playername represents the value - protected Dictionary GetOnlinePlayersWithUUID() - { - return Handler.GetOnlinePlayersWithUUID(); - } - - /// - /// Registers the given plugin channel for use by this chatbot. - /// - /// The name of the channel to register - protected void RegisterPluginChannel(string channel) - { - registeredPluginChannels.Add(channel); - Handler.RegisterPluginChannel(channel, this); - } - - /// - /// Unregisters the given plugin channel, meaning this chatbot can no longer use it. - /// - /// The name of the channel to unregister - protected void UnregisterPluginChannel(string channel) - { - registeredPluginChannels.RemoveAll(chan => chan == channel); - Handler.UnregisterPluginChannel(channel, this); - } - - /// - /// Sends the given plugin channel message to the server, if the channel has been registered. - /// See http://wiki.vg/Plugin_channel for more information about plugin channels. - /// - /// The channel to send the message on. - /// The data to send. - /// Should the message be sent even if it hasn't been registered by the server or this bot? (Some Minecraft channels aren't registered) - /// Whether the message was successfully sent. False if there was a network error or if the channel wasn't registered. - protected bool SendPluginChannelMessage(string channel, byte[] data, bool sendEvenIfNotRegistered = false) - { - if (!sendEvenIfNotRegistered) - { - if (!registeredPluginChannels.Contains(channel)) - { - return false; - } - } - return Handler.SendPluginChannelMessage(channel, data, sendEvenIfNotRegistered); - } - - /// - /// Get server current TPS (tick per second) - /// - /// tps - protected double GetServerTPS() - { - return Handler.GetServerTPS(); - } - - /// - /// Interact with an entity - /// - /// - /// 0: interact, 1: attack, 2: interact at - /// Hand.MainHand or Hand.OffHand - /// TRUE in case of success - [Obsolete("Prefer using InteractType enum instead of int for interaction type")] - protected bool InteractEntity(int EntityID, int type, Hand hand = Hand.MainHand) - { - return Handler.InteractEntity(EntityID, (InteractType)type, hand); - } - - /// - /// Interact with an entity - /// - /// - /// Interaction type (InteractType.Interact, Attack or AttackAt) - /// Hand.MainHand or Hand.OffHand - /// TRUE in case of success - protected bool InteractEntity(int EntityID, InteractType type, Hand hand = Hand.MainHand) - { - return Handler.InteractEntity(EntityID, type, hand); - } - - /// - /// Give Creative Mode items into regular/survival Player Inventory - /// - /// (obviously) requires to be in creative mode - /// - /// Destination inventory slot - /// Item type - /// Item count - /// TRUE if item given successfully - protected bool CreativeGive(int slot, ItemType itemType, int count, Dictionary? nbt = null) - { - return Handler.DoCreativeGive(slot, itemType, count, nbt); - } - - /// - /// Use Creative Mode to delete items from the regular/survival Player Inventory - /// - /// (obviously) requires to be in creative mode - /// - /// Inventory slot to clear - /// TRUE if item cleared successfully - protected bool CreativeDelete(int slot) - { - return CreativeGive(slot, ItemType.Null, 0, null); - } - - /// - /// Plays animation (Player arm swing) - /// - /// Hand.MainHand or Hand.OffHand - /// TRUE if animation successfully done - public bool SendAnimation(Hand hand = Hand.MainHand) - { - return Handler.DoAnimation((int)hand); - } - - /// - /// Use item currently in the player's hand (active inventory bar slot) - /// - /// TRUE if successful - protected bool UseItemInHand() - { - return Handler.UseItemOnHand(); - } - - /// - /// Use item currently in the player's hand (active inventory bar slot) - /// - /// TRUE if successful - protected bool UseItemInLeftHand() - { - return Handler.UseItemOnLeftHand(); - } - - /// - /// Check inventory handling enable status - /// - /// TRUE if inventory handling is enabled - public bool GetInventoryEnabled() - { - return Handler.GetInventoryEnabled(); - } - - /// - /// Place the block at hand in the Minecraft world - /// - /// Location to place block to - /// Block face (e.g. Direction.Down when clicking on the block below to place this block) - /// Hand.MainHand or Hand.OffHand - /// Also look at the block before interacting - /// TRUE if successfully placed - public bool SendPlaceBlock(Location location, Direction blockFace, Hand hand = Hand.MainHand, bool lookAtBlock = false) - { - return Handler.PlaceBlock(location, blockFace, hand, lookAtBlock); - } - - /// - /// Get the player's inventory. Do not write to it, will not have any effect server-side. - /// - /// Player inventory - protected Container GetPlayerInventory() - { - Container container = Handler.GetPlayerInventory(); - return new Container(container.ID, container.Type, container.Title, container.Items); - } - - /// - /// Get all inventories, player and container(s). Do not write to them. Will not have any effect server-side. - /// - /// All inventories - public Dictionary GetInventories() - { - return Handler.GetInventories(); - } - - /// - /// Perform inventory action - /// - /// Inventory ID - /// Slot ID - /// Action Type - /// TRUE in case of success - protected bool WindowAction(int inventoryId, int slot, WindowActionType actionType) - { - return Handler.DoWindowAction(inventoryId, slot, actionType); - } - - /// - /// Get inventory action helper - /// - /// Inventory Container - /// ItemMovingHelper instance - protected ItemMovingHelper GetItemMovingHelper(Container container) - { - return new ItemMovingHelper(container, Handler); - } - - /// - /// Change player selected hotbar slot - /// - /// 0-8 - /// True if success - protected bool ChangeSlot(short slot) - { - return Handler.ChangeSlot(slot); - } - - /// - /// Get current player selected hotbar slot - /// - /// 0-8 - protected byte GetCurrentSlot() - { - return Handler.GetCurrentSlot(); - } - - /// - /// Clean all inventory - /// - /// TRUE if the uccessfully clear - protected bool ClearInventories() - { - return Handler.ClearInventories(); - } - - /// - /// Update sign text - /// - /// sign location - /// text one - /// text two - /// text three - /// text1 four - protected bool UpdateSign(Location location, string line1, string line2, string line3, string line4) - { - return Handler.UpdateSign(location, line1, line2, line3, line4); - } - - /// - /// Selects villager trade - /// - /// Trade slot to select, starts at 0. - protected bool SelectTrade(int selectedSlot) - { - return Handler.SelectTrade(selectedSlot); - } - - /// - /// Teleport to player in spectator mode - /// - /// player to teleport to - protected bool SpectatorTeleport(Entity entity) - { - return Handler.Spectate(entity); - } - - /// - /// Teleport to player/entity in spectator mode - /// - /// uuid of entity to teleport to - protected bool SpectatorTeleport(Guid UUID) - { - return Handler.SpectateByUUID(UUID); - } - - /// - /// Update command block - /// - /// command block location - /// command - /// command block mode - /// command block flags - protected bool UpdateCommandBlock(Location location, string command, CommandBlockMode mode, CommandBlockFlags flags) - { - return Handler.UpdateCommandBlock(location, command, mode, flags); - } - - /// - /// Close a opened inventory - /// - /// - /// True if success - protected bool CloseInventory(int inventoryID) - { - return Handler.CloseInventory(inventoryID); - } - - /// - /// Get max length for chat messages - /// - /// Max length, in characters - protected int GetMaxChatMessageLength() - { - return Handler.GetMaxChatMessageLength(); - } - - /// - /// Respawn player - /// - protected bool Respawn() - { - if (Handler.GetHealth() <= 0) - return Handler.SendRespawnPacket(); - else return false; - } - - /// - /// Enable or disable network packet event calling. If you want to capture every packet including login phase, please enable this in - /// - /// - /// Enable this may increase memory usage. - /// - /// - protected void SetNetworkPacketEventEnabled(bool enabled) - { - Handler.SetNetworkPacketCaptureEnabled(enabled); - } - - /// - /// Get the minecraft protcol number currently in use - /// - /// Protcol number - protected int GetProtocolVersion() - { - return Handler.GetProtocolVersion(); - } - - /// - /// Gets the horizontal direction of the takeoff. - /// - /// Return direction of view - protected Direction GetHorizontalFacing() - { - return Handler.GetHorizontalFacing(); - } - - /// - /// Invoke a task on the main thread, wait for completion and retrieve return value. - /// - /// Task to run with any type or return value - /// Any result returned from task, result type is inferred from the task - /// bool result = InvokeOnMainThread(methodThatReturnsAbool); - /// bool result = InvokeOnMainThread(() => methodThatReturnsAbool(argument)); - /// int result = InvokeOnMainThread(() => { yourCode(); return 42; }); - /// Type of the return value - protected T InvokeOnMainThread(Func task) - { - return Handler.InvokeOnMainThread(task); - } - - /// - /// Invoke a task on the main thread and wait for completion - /// - /// Task to run without return value - /// InvokeOnMainThread(methodThatReturnsNothing); - /// InvokeOnMainThread(() => methodThatReturnsNothing(argument)); - /// InvokeOnMainThread(() => { yourCode(); }); - protected void InvokeOnMainThread(Action task) - { - Handler.InvokeOnMainThread(task); - } - - /// - /// Schedule a task to run on the main thread, and do not wait for completion - /// - /// Task to run - /// Run the task after X ticks (1 tick delay = ~50ms at 20 TPS). 0 for no delay - /// - /// InvokeOnMainThread(methodThatReturnsNothing, 20); - /// InvokeOnMainThread(() => methodThatReturnsNothing(argument), 20); - /// InvokeOnMainThread(() => { yourCode(); }, 20); - /// - protected void ScheduleOnMainThread(Action task, int delayTicks = 0) - { - lock (delayTasksLock) - { - delayedTasks.Add(new TaskWithDelay(task, delayTicks)); - } - } - - /// - /// Schedule a task to run on the main thread, and do not wait for completion - /// - /// Task to run - /// Run the task after the specified delay - protected void ScheduleOnMainThread(Action task, TimeSpan delay) - { - lock (delayTasksLock) - { - delayedTasks.Add(new TaskWithDelay(task, delay)); - } - } - - /// - /// Command runner definition. - /// Returned string will be the output of the command - /// - /// Full command - /// Arguments in the command - /// Command result to display to the user - public delegate string CommandRunner(string command, string[] args); - - /// - /// Register a simple ChatBot command with the Brigadier dispatcher. - /// The command is automatically unregistered when the bot is unloaded. - /// - /// Name of the command (used as the literal command name) - /// Description of the command - /// Usage string for the command - /// Method to handle the command execution - protected void RegisterChatBotCommand(string cmdName, string cmdDesc, string cmdUsage, CommandRunner callback) - { - var command = new ChatBotCommand(cmdName, cmdDesc, cmdUsage, callback); - command.RegisterCommand(McClient.dispatcher); - registeredChatBotCommands.Add(cmdName); - } - - /// - /// Unregisters all commands that were registered via RegisterChatBotCommand. - /// Called automatically by McClient.BotUnLoad() during bot unload - do not call manually. - /// - internal void UnregisterChatBotCommands() - { - foreach (var cmdName in registeredChatBotCommands) - { - McClient.dispatcher.Unregister(cmdName); - } - registeredChatBotCommands.Clear(); - } - - /// - /// Command class with constructor for creating command for ChatBots. - /// - public class ChatBotCommand : Command - { - public CommandRunner Runner; - - private readonly string _cmdName; - private readonly string _cmdDesc; - private readonly string _cmdUsage; - - public override string CmdName { get { return _cmdName; } } - public override string CmdUsage { get { return _cmdUsage; } } - public override string CmdDesc { get { return _cmdDesc; } } - - public override void RegisterCommand(CommandDispatcher dispatcher) - { - dispatcher.Register(l => l.Literal(_cmdName) - .Then(l => l.Argument("args", Arguments.GreedyString()) - .Executes(r => - { - string fullArgs = Arguments.GetString(r, "args"); - string result = Runner( - $"{_cmdName} {fullArgs}", - fullArgs.Split(' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)); - return r.Source.SetAndReturn(CmdResult.Status.Done, result); - })) - .Executes(r => - { - string result = Runner(_cmdName, Array.Empty()); - return r.Source.SetAndReturn(CmdResult.Status.Done, result); - }) - ); - } - - /// - /// ChatBotCommand Constructor - /// - /// Name of the command - /// Description of the command. Support tranlation. - /// Usage of the command - /// Method for handling the command - public ChatBotCommand(string cmdName, string cmdDesc, string cmdUsage, CommandRunner callback) - { - _cmdName = cmdName; - _cmdDesc = cmdDesc; - _cmdUsage = cmdUsage; - Runner = callback; - } - } - } -} diff --git a/MinecraftClient/Scripting/DataPath.cs b/MinecraftClient/Scripting/DataPath.cs deleted file mode 100644 index fdefae5a5f..0000000000 --- a/MinecraftClient/Scripting/DataPath.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.IO; - -namespace MinecraftClient.Scripting -{ - public static class DataPath - { - private static string? relativePath; - private static string? absolutePath; - - public enum PathType - { - Relative, - Absolute - } - - /// - /// 初始化数据目录(修正版) - /// Initialize the data directory (Revised version) - /// 需要手动传入脚本文件名(不含.cs扩展名) - /// Requires manually passing the script file name (without the .cs extension) - /// - /// 脚本文件名(不含扩展名)Script file name (without extension) - public static void Init(string scriptName) - { - if (string.IsNullOrEmpty(scriptName)) - throw new ArgumentNullException(nameof(scriptName), "Script name cannot be null or empty(脚本名称不能为空)"); - - // 计算路径 Calculate the path - relativePath = scriptName; - absolutePath = Path.Combine(AppContext.BaseDirectory, scriptName); - - // 创建目录 Create the directory - if (!Directory.Exists(absolutePath)) - Directory.CreateDirectory(absolutePath); - } - - /// - /// 获取路径 - /// Get the path - /// - public static string Get(PathType pathType = PathType.Relative) - { - if (string.IsNullOrEmpty(relativePath) || string.IsNullOrEmpty(absolutePath)) - throw new InvalidOperationException("Please call DataPath.Init() first to initialize(请先调用DataPath.Init()初始化)"); - - return pathType switch - { - PathType.Relative => relativePath, - PathType.Absolute => absolutePath, - _ => throw new ArgumentOutOfRangeException(nameof(pathType)) - }; - } - } -} diff --git a/MinecraftClient/Scripting/DynamicRun/Builder/CompileRunner.cs b/MinecraftClient/Scripting/DynamicRun/Builder/CompileRunner.cs deleted file mode 100644 index cdd102a1eb..0000000000 --- a/MinecraftClient/Scripting/DynamicRun/Builder/CompileRunner.cs +++ /dev/null @@ -1,45 +0,0 @@ -/* -MIT License -Copyright (c) 2019 Laurent Kempé -https://github.com/laurentkempe/DynamicRun/blob/master/LICENSE -*/ - -using System; -using System.Collections.Generic; -using System.IO; -using System.Runtime.CompilerServices; - -namespace MinecraftClient.Scripting.DynamicRun.Builder -{ - internal class CompileRunner - { - public object? Execute(byte[] compiledAssembly, string[] args, Dictionary? localVars, ChatBot apiHandler, string? scriptOwnerKey = null) - { - var assemblyLoadContextWeakRef = LoadAndExecute(compiledAssembly, args, localVars, apiHandler, scriptOwnerKey); - - for (var i = 0; i < 8 && assemblyLoadContextWeakRef.Item1.IsAlive; i++) - { - GC.Collect(); - GC.WaitForPendingFinalizers(); - } - - ConsoleIO.WriteLogLine(assemblyLoadContextWeakRef.Item1.IsAlive ? "[Script] Script continues to run." : "[Script] Script finished!"); - return assemblyLoadContextWeakRef.Item2; - } - - [MethodImpl(MethodImplOptions.NoInlining)] - private static Tuple LoadAndExecute(byte[] compiledAssembly, string[] args, Dictionary? localVars, ChatBot apiHandler, string? scriptOwnerKey) - { - using var asm = new MemoryStream(compiledAssembly); - var assemblyLoadContext = new SimpleUnloadableAssemblyLoadContext(); - - var assembly = assemblyLoadContext.LoadFromStream(asm); - var compiledScript = assembly.CreateInstance("ScriptLoader.Script")!; - var execResult = compiledScript.GetType().GetMethod("__run")!.Invoke(compiledScript, new object[] { new CSharpAPI(apiHandler, localVars, scriptOwnerKey), args }); - - assemblyLoadContext.Unload(); - - return new(new WeakReference(assemblyLoadContext), execResult); - } - } -} diff --git a/MinecraftClient/Scripting/DynamicRun/Builder/Compiler.cs b/MinecraftClient/Scripting/DynamicRun/Builder/Compiler.cs deleted file mode 100644 index 163f603822..0000000000 --- a/MinecraftClient/Scripting/DynamicRun/Builder/Compiler.cs +++ /dev/null @@ -1,227 +0,0 @@ -/* -MIT License -Copyright (c) 2019 Laurent Kempé -https://github.com/laurentkempe/DynamicRun/blob/master/LICENSE -*/ - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Runtime.InteropServices; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.Text; -using SingleFileExtractor.Core; - -namespace MinecraftClient.Scripting.DynamicRun.Builder -{ - internal class Compiler - { - public CompileResult Compile(string filepath, string fileName, List additionalAssemblies) - { - using var peStream = new MemoryStream(); - var result = GenerateCode(filepath, fileName, additionalAssemblies).Emit(peStream); - - if (!result.Success) - { - var failures = result.Diagnostics.Where(diagnostic => diagnostic.IsWarningAsError || diagnostic.Severity == DiagnosticSeverity.Error); - - return new CompileResult() - { - Assembly = null, - HasCompiledSucecssfully = false, - Failures = failures.ToList() - }; - } - - peStream.Seek(0, SeekOrigin.Begin); - - return new CompileResult() - { - Assembly = peStream.ToArray(), - HasCompiledSucecssfully = true, - Failures = null - }; - } - - private static CSharpCompilation GenerateCode(string sourceCode, string fileName, List additionalAssemblies) - { - var codeString = SourceText.From(sourceCode); - var options = CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.Latest); - - var parsedSyntaxTree = SyntaxFactory.ParseSyntaxTree(codeString, options); - - var references = new List(); - - // Find if any additional assembly DLL exists in the base directory where the .exe exists. - foreach (var assembly in additionalAssemblies) - { - var dllPath = Path.Combine(AppContext.BaseDirectory, assembly); - if (File.Exists(dllPath)) - { - references.Add(MetadataReference.CreateFromFile(dllPath)); - // Store the reference in our Assembly Resolver for future reference. - AssemblyResolver.AddAssembly(Assembly.LoadFile(dllPath).FullName!, dllPath); - } - else - { - ConsoleIO.WriteLogLine($"[Script Error] {assembly} is defined in script, but cannot find DLL! Script may not run."); - } - } - -#pragma warning disable IL3000 // We determine if we are in a self-contained binary by checking specifically if the Assembly file path is null. - - var SystemPrivateCoreLib = typeof(object).Assembly.Location; // System.Private.CoreLib - var SystemConsole = typeof(Console).Assembly.Location; // System.Console - var MinecraftClientDll = typeof(Program).Assembly.Location; // The path to MinecraftClient.dll - - // We're on a self-contained binary, so we need to extract the executable to get the assemblies. - if (string.IsNullOrEmpty(MinecraftClientDll)) - { - // Create a temporary file to copy the executable to. - var executablePath = Environment.ProcessPath; - if (executablePath is null) - throw new InvalidOperationException("Cannot determine the process path for self-contained scripting extraction."); - var tempPath = Path.Combine(Path.GetTempPath(), "mcc-scripting"); - Directory.CreateDirectory(tempPath); - - var tempFile = Path.Combine(tempPath, "mcc-executable"); - var useExisting = false; - - // Check if we already have the executable in the temporary path. - foreach (var file in Directory.EnumerateFiles(tempPath)) - { - if (file.EndsWith("mcc-executable")) - { - // Check if the file is the same as the current executable. - if (File.ReadAllBytes(file).SequenceEqual(File.ReadAllBytes(executablePath))) - { - useExisting = true; - break; - } - - // If not, refresh the cache. - File.Delete(file); - break; - } - } - - if (!File.Exists(executablePath)) - { - throw new FileNotFoundException("[Script Error] Could not locate the current folder of MCC for scripting."); - } - - // Copy the executable to a temporary path. - if (!useExisting) - File.Copy(executablePath, tempFile); - - // Access the contents of the executable. - using ExecutableReader executableReader = new(tempFile); - if (!executableReader.IsSingleFile) - throw new InvalidOperationException("[Script Error] The executable is not a single-file bundle."); - - var files = executableReader.Bundle.Files; - - Stream? assemblyStream; - - var assemblyrefs = Assembly.GetEntryAssembly()?.GetReferencedAssemblies().ToList()!; - assemblyrefs.Add(new("MinecraftClient")); - assemblyrefs.Add(new("System.Private.CoreLib")); - // Facade assemblies needed for compiling scripts that reference netstandard libraries (e.g. Brigadier.NET) - assemblyrefs.Add(new("netstandard")); - assemblyrefs.Add(new("System.Runtime")); - assemblyrefs.Add(new("System.Private.Uri")); - assemblyrefs.Add(new("System.Net.Requests")); - assemblyrefs.Add(new("System.Net.WebSockets")); - assemblyrefs.Add(new("System.Net.HttpListener")); - assemblyrefs.Add(new("System.Net.Primitives")); - assemblyrefs.Add(new("System.Net.Sockets")); - assemblyrefs.Add(new("Microsoft.Win32.Primitives")); - assemblyrefs.Add(new("System.Collections.Concurrent")); - - foreach (var refs in assemblyrefs) - { - Assembly? loadedAssembly; - try - { - loadedAssembly = Assembly.Load(refs); - } - catch (FileNotFoundException) - { - // Facade assemblies like netstandard may not be loadable in all environments - continue; - } - - if (string.IsNullOrEmpty(loadedAssembly.Location)) - { - // Check if we can access the file from the executable. - var reference = files.FirstOrDefault(x => - Path.GetFileNameWithoutExtension(x.RelativePath) == refs.Name); - var refCount = files.Count(x => Path.GetFileNameWithoutExtension(x.RelativePath) == refs.Name); - if (refCount > 1) - { - // Safety net for the case where the assembly is referenced multiple times. - // Should not happen normally, but we can make exceptions when it does happen. - throw new InvalidOperationException( - "[Script Error] Too many references to the same assembly. Assembly name: " + refs.Name); - } - - if (reference is null) - { - // Facade assemblies may not be in the bundle - skip them silently - continue; - } - - assemblyStream = reference.AsStream(); - references.Add(MetadataReference.CreateFromStream(assemblyStream!)); - continue; - } - - references.Add(MetadataReference.CreateFromFile(loadedAssembly.Location)); - } - } - else - { - references.Add(MetadataReference.CreateFromFile(SystemPrivateCoreLib)); - references.Add(MetadataReference.CreateFromFile(SystemConsole)); - references.Add(MetadataReference.CreateFromFile(MinecraftClientDll)); - Assembly.GetEntryAssembly()?.GetReferencedAssemblies().ToList().ForEach(a => references.Add(MetadataReference.CreateFromFile(Assembly.Load(a).Location))); - - // Add facade assemblies needed for Roslyn compilation when referencing - // libraries that target netstandard (e.g. Brigadier.NET). - var runtimeDir = Path.GetDirectoryName(SystemPrivateCoreLib)!; - foreach (var facadeName in new[] { "netstandard.dll", "System.Runtime.dll", "System.Private.Uri.dll", "System.Net.Requests.dll", - "System.Net.WebSockets.dll", "System.Net.HttpListener.dll", "System.Net.Primitives.dll", "System.Net.Sockets.dll", - "Microsoft.Win32.Primitives.dll", "System.Collections.Concurrent.dll" }) - { - var facadePath = Path.Combine(runtimeDir, facadeName); - if (File.Exists(facadePath)) - references.Add(MetadataReference.CreateFromFile(facadePath)); - } - } -#pragma warning restore IL3000 - - return CSharpCompilation.Create($"{fileName}.dll", - new[] { parsedSyntaxTree }, - references: references, - options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary, - optimizationLevel: OptimizationLevel.Release, - assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default)); - } - - internal struct CompileResult - { - internal byte[]? Assembly; - internal bool HasCompiledSucecssfully; - internal List? Failures; - public CompileResult(bool hasCompiledSucecssfully, List? failures, byte[]? assembly) - { - HasCompiledSucecssfully = hasCompiledSucecssfully; - Failures = failures; - Assembly = assembly; - } - } - } -} diff --git a/MinecraftClient/Scripting/DynamicRun/Builder/SimpleUnloadableAssemblyLoadContext.cs b/MinecraftClient/Scripting/DynamicRun/Builder/SimpleUnloadableAssemblyLoadContext.cs deleted file mode 100644 index e210bcacd6..0000000000 --- a/MinecraftClient/Scripting/DynamicRun/Builder/SimpleUnloadableAssemblyLoadContext.cs +++ /dev/null @@ -1,24 +0,0 @@ -/* -MIT License -Copyright (c) 2019 Laurent Kempé -https://github.com/laurentkempe/DynamicRun/blob/master/LICENSE -*/ - -using System.Reflection; -using System.Runtime.Loader; - -namespace MinecraftClient.Scripting.DynamicRun.Builder -{ - internal class SimpleUnloadableAssemblyLoadContext : AssemblyLoadContext - { - public SimpleUnloadableAssemblyLoadContext() - : base(true) - { - } - - protected override Assembly? Load(AssemblyName assemblyName) - { - return null; - } - } -} \ No newline at end of file diff --git a/MinecraftClient/Scripting/MccGameApi.cs b/MinecraftClient/Scripting/MccGameApi.cs deleted file mode 100644 index 9588691bf1..0000000000 --- a/MinecraftClient/Scripting/MccGameApi.cs +++ /dev/null @@ -1,1333 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using MinecraftClient.Inventory; -using MinecraftClient.Mapping; -using MinecraftClient.Protocol; - -namespace MinecraftClient.Scripting; - -/// -/// Transport-neutral shared gameplay and observed-state API used by MCP and bots/scripts. -/// -public sealed class MccGameApi -{ - private static readonly StringComparer NameComparer = StringComparer.OrdinalIgnoreCase; - - private const double SelfEntityDistanceThreshold = 0.2; - private const int MaxPathPreviewWaypoints = 1000; - private const int DefaultPathQueryTimeoutMs = 5000; - private const int MinPathQueryTimeoutMs = 250; - private const int MaxPathQueryTimeoutMs = 15000; - private const int DefaultArrivalWaitMs = 3500; - private const int MinArrivalWaitMs = 250; - private const int MaxArrivalWaitMs = 15000; - private const double DefaultArrivalTolerance = 1.5; - private const int ArrivalPollIntervalMs = 125; - - private readonly Func clientProvider; - - private sealed class NearbyPlayerSnapshot - { - public required int EntityId { get; init; } - public required Guid Uuid { get; init; } - public string? Name { get; set; } - public string? CustomName { get; init; } - public required double X { get; init; } - public required double Y { get; init; } - public required double Z { get; init; } - public required double Distance { get; init; } - public required int Latency { get; init; } - } - - private sealed class NearbyItemSnapshot - { - public required int EntityId { get; init; } - public required ItemType ItemType { get; init; } - public required string TypeLabel { get; init; } - public required int Count { get; init; } - public required double X { get; init; } - public required double Y { get; init; } - public required double Z { get; init; } - public required double Distance { get; init; } - } - - public MccGameApi(Func clientProvider) - { - ArgumentNullException.ThrowIfNull(clientProvider); - this.clientProvider = clientProvider; - } - - /// - /// Get the latest shared world time and weather snapshot. - /// - public MccRuntimeStateSnapshot GetRuntimeState() - { - return MccObservedStateStore.GetRuntimeStateSnapshot(); - } - - /// - /// Get recent high-signal runtime events recorded by MCC. - /// - public MccRecentEventsResult GetRecentEvents(long afterId = 0, int maxCount = 50, string? typeFilter = null) - { - MccRecentEventEntry[] events = MccObservedStateStore.GetRecentEventsAfter(afterId, maxCount, typeFilter); - return new MccRecentEventsResult - { - AfterId = afterId, - LatestId = MccObservedStateStore.GetLatestRecentEventId(), - Count = events.Length, - Events = events - }; - } - - /// - /// Get recent chat and system lines observed by MCC. - /// - public MccChatHistoryResult GetChatHistory(int maxCount = 50, bool includeJson = false) - { - MccChatHistoryEntry[] entries = MccObservedStateStore.GetLatestChatHistory(maxCount); - if (!includeJson) - { - entries = entries - .Select(entry => new MccChatHistoryEntry - { - TimestampUtc = entry.TimestampUtc, - Kind = entry.Kind, - Text = entry.Text, - Sender = entry.Sender, - Message = entry.Message - }) - .ToArray(); - } - - return new MccChatHistoryResult - { - Count = entries.Length, - Entries = entries - }; - } - - /// - /// Compute a path preview to a location without moving there. - /// - public MccGameResult PreviewPath(double x, double y, double z, bool allowUnsafe = false, int maxOffset = 0, int minOffset = 0, int timeoutMs = 0, int maxWaypoints = 128) - { - if (!AreValidPathOffsets(maxOffset, minOffset) || timeoutMs < 0 || maxWaypoints <= 0) - { - return MccGameResult.Fail("invalid_args"); - } - - McClient? client = clientProvider(); - if (client is null) - return NotConnected(); - - if (!client.GetTerrainEnabled()) - return MccGameResult.Fail("feature_disabled"); - - Location goal = new(x, y, z); - Location startLocation = client.InvokeOnMainThread(client.GetCurrentLocation); - World world = client.InvokeOnMainThread(client.GetWorld); - int effectiveTimeoutMs = GetPathQueryTimeoutMs(timeoutMs); - int waypointLimit = Math.Clamp(maxWaypoints, 1, MaxPathPreviewWaypoints); - Queue? path = Movement.CalculatePath( - world, - startLocation, - goal, - allowUnsafe, - maxOffset, - minOffset, - TimeSpan.FromMilliseconds(effectiveTimeoutMs)); - Location[] waypoints = path?.Take(waypointLimit).ToArray() ?? []; - Location? finalWaypoint = path is not null && path.Count > 0 ? path.Last() : null; - - return MccGameResult.Ok(new MccPathPreviewResult - { - PathFound = path is not null, - ExactReachable = finalWaypoint is Location location && location.ToFloor() == goal.ToFloor(), - Target = MccGameCommon.ToCoordinate(goal), - StartLocation = MccGameCommon.ToCoordinate(startLocation), - FinalWaypoint = finalWaypoint is Location waypoint ? MccGameCommon.ToCoordinate(waypoint) : null, - FinalDistance = finalWaypoint is Location endWaypoint ? MccGameCommon.GetDistance(endWaypoint, goal) : null, - WaypointCount = path?.Count ?? 0, - Truncated = path is not null && path.Count > waypointLimit, - Waypoints = waypoints.Select(MccGameCommon.ToCoordinate).ToArray(), - AllowUnsafe = allowUnsafe, - MaxOffset = maxOffset, - MinOffset = minOffset, - TimeoutMs = effectiveTimeoutMs - }); - } - - /// - /// Check whether MCC can currently path to a location without moving there. - /// - public MccGameResult CanReachPosition(double x, double y, double z, bool allowUnsafe = false, int maxOffset = 0, int minOffset = 0, int timeoutMs = 0) - { - if (!AreValidPathOffsets(maxOffset, minOffset) || timeoutMs < 0) - return MccGameResult.Fail("invalid_args"); - - McClient? client = clientProvider(); - if (client is null) - return NotConnected(); - - if (!client.GetTerrainEnabled()) - return MccGameResult.Fail("feature_disabled"); - - Location goal = new(x, y, z); - Location startLocation = client.InvokeOnMainThread(client.GetCurrentLocation); - World world = client.InvokeOnMainThread(client.GetWorld); - int effectiveTimeoutMs = GetPathQueryTimeoutMs(timeoutMs); - Queue? path = Movement.CalculatePath( - world, - startLocation, - goal, - allowUnsafe, - maxOffset, - minOffset, - TimeSpan.FromMilliseconds(effectiveTimeoutMs)); - Location? finalWaypoint = path?.LastOrDefault(); - double? finalDistance = finalWaypoint is Location waypoint - ? MccGameCommon.GetDistance(waypoint, goal) - : null; - - return MccGameResult.Ok(new MccReachabilityResult - { - Reachable = path is not null, - ExactReachable = finalWaypoint is Location location && location.ToFloor() == goal.ToFloor(), - Target = MccGameCommon.ToCoordinate(goal), - StartLocation = MccGameCommon.ToCoordinate(startLocation), - FinalWaypoint = finalWaypoint is Location finalLocation ? MccGameCommon.ToCoordinate(finalLocation) : null, - FinalDistance = finalDistance, - WaypointCount = path?.Count ?? 0, - AllowUnsafe = allowUnsafe, - MaxOffset = maxOffset, - MinOffset = minOffset, - TimeoutMs = effectiveTimeoutMs - }); - } - - /// - /// Get online players with tracked coordinates and latency when available. - /// - public MccGameResult GetPlayersDetailed(bool includeSelf = false, bool includeCoordinates = true) - { - McClient? client = clientProvider(); - if (client is null) - return NotConnected(); - - return client.InvokeOnMainThread(() => - { - Dictionary onlinePlayers = client.GetOnlinePlayersWithUUID(); - Dictionary? trackedPlayers = client.GetEntityHandlingEnabled() - ? BuildTrackedPlayerSnapshots(client, includeSelf: true).ToDictionary(player => player.Uuid) - : null; - Guid selfUuid = client.GetUserUuid(); - string selfName = client.GetUsername(); - - MccPlayersDetailedEntry[] players = onlinePlayers - .Select(pair => - { - if (!Guid.TryParse(pair.Key, out Guid uuid)) - return null; - - bool isSelf = uuid == selfUuid || NameComparer.Equals(pair.Value, selfName); - if (!includeSelf && isSelf) - return null; - - PlayerInfo? playerInfo = client.GetPlayerInfo(uuid); - NearbyPlayerSnapshot? trackedPlayer = trackedPlayers is not null - && trackedPlayers.TryGetValue(uuid, out NearbyPlayerSnapshot? resolvedTrackedPlayer) - ? resolvedTrackedPlayer - : null; - Location? selfLocation = isSelf ? client.GetCurrentLocation() : null; - int? entityId = trackedPlayer?.EntityId ?? (isSelf ? client.GetPlayerEntityID() : null); - double? x = includeCoordinates - ? trackedPlayer?.X is double trackedX ? MccGameCommon.RoundCoordinate(trackedX) - : selfLocation.HasValue ? MccGameCommon.RoundCoordinate(selfLocation.Value.X) - : null - : null; - double? y = includeCoordinates - ? trackedPlayer?.Y is double trackedY ? MccGameCommon.RoundCoordinate(trackedY) - : selfLocation.HasValue ? MccGameCommon.RoundCoordinate(selfLocation.Value.Y) - : null - : null; - double? z = includeCoordinates - ? trackedPlayer?.Z is double trackedZ ? MccGameCommon.RoundCoordinate(trackedZ) - : selfLocation.HasValue ? MccGameCommon.RoundCoordinate(selfLocation.Value.Z) - : null - : null; - - return new MccPlayersDetailedEntry - { - Name = playerInfo?.Name ?? pair.Value, - Uuid = uuid, - Ping = playerInfo?.Ping ?? trackedPlayer?.Latency ?? 0, - Gamemode = playerInfo?.Gamemode ?? -1, - Listed = playerInfo?.Listed ?? true, - DisplayName = playerInfo?.DisplayName, - EntityId = entityId, - X = x, - Y = y, - Z = z - }; - }) - .Where(player => player is not null) - .Select(player => player!) - .OrderBy(player => player.Name, NameComparer) - .ToArray(); - - return MccGameResult.Ok(new MccPlayersDetailedResult - { - IncludeSelf = includeSelf, - IncludeCoordinates = includeCoordinates, - Count = players.Length, - Players = players - }); - }); - } - - /// - /// Check whether any player, or a specific player, is nearby. - /// - public MccGameResult IsPlayerNearby(string? playerName = null, double radius = 32, bool includeSelf = false) - { - if (radius <= 0 || radius > 1024) - return MccGameResult.Fail("invalid_args"); - - McClient? client = clientProvider(); - if (client is null) - return NotConnected(); - - if (!client.GetEntityHandlingEnabled()) - return MccGameResult.Fail("feature_disabled"); - - string? nameFilter = string.IsNullOrWhiteSpace(playerName) ? null : playerName.Trim(); - return client.InvokeOnMainThread(() => - { - double radiusValue = radius; - MccNearbyPlayerEntry[] players = BuildTrackedPlayerSnapshots(client, includeSelf) - .Where(player => player.Distance <= radiusValue) - .Where(player => nameFilter is null || PlayerNameMatches(player, nameFilter)) - .OrderBy(player => player.Distance) - .Select(player => new MccNearbyPlayerEntry - { - EntityId = player.EntityId, - Uuid = player.Uuid, - Name = player.Name, - CustomName = player.CustomName, - X = MccGameCommon.RoundCoordinate(player.X), - Y = MccGameCommon.RoundCoordinate(player.Y), - Z = MccGameCommon.RoundCoordinate(player.Z), - Distance = player.Distance, - Latency = player.Latency - }) - .ToArray(); - - return MccGameResult.Ok(new MccPlayerNearbyResult - { - Radius = radiusValue, - PlayerName = nameFilter, - IncludeSelf = includeSelf, - AnyNearby = players.Length > 0, - Count = players.Length, - Players = players - }); - }); - } - - /// - /// Locate a tracked player by name. - /// - public MccGameResult LocatePlayer(string playerName, bool includeSelf = false) - { - if (string.IsNullOrWhiteSpace(playerName)) - return MccGameResult.Fail("invalid_args"); - - McClient? client = clientProvider(); - if (client is null) - return NotConnected(); - - if (!client.GetEntityHandlingEnabled()) - return MccGameResult.Fail("feature_disabled"); - - string nameFilter = playerName.Trim(); - return client.InvokeOnMainThread(() => - { - NearbyPlayerSnapshot[] matches = BuildTrackedPlayerSnapshots(client, includeSelf) - .Where(player => PlayerNameMatches(player, nameFilter)) - .OrderBy(player => player.Distance) - .ToArray(); - - if (matches.Length == 0) - { - string[] trackedPlayers = BuildTrackedPlayerSnapshots(client, includeSelf) - .Select(player => player.Name) - .OfType() - .Distinct(NameComparer) - .ToArray(); - return MccGameResult.Fail("invalid_state", data: new MccLocatedPlayerResult - { - PlayerName = nameFilter, - MatchedName = trackedPlayers.Length > 0 ? string.Join(", ", trackedPlayers) : null, - EntityId = 0, - Uuid = Guid.Empty, - X = 0, - Y = 0, - Z = 0, - Distance = 0 - }); - } - - NearbyPlayerSnapshot selected = matches[0]; - return MccGameResult.Ok(new MccLocatedPlayerResult - { - PlayerName = nameFilter, - MatchedName = selected.Name, - EntityId = selected.EntityId, - Uuid = selected.Uuid, - X = MccGameCommon.RoundCoordinate(selected.X), - Y = MccGameCommon.RoundCoordinate(selected.Y), - Z = MccGameCommon.RoundCoordinate(selected.Z), - Distance = selected.Distance - }); - }); - } - - /// - /// Return tracked entities without distance filtering. - /// - public MccGameResult QueryEntities(int maxCount = 200) - { - McClient? client = clientProvider(); - if (client is null) - return NotConnected(); - - if (!client.GetEntityHandlingEnabled()) - return MccGameResult.Fail("feature_disabled"); - - int count = Math.Clamp(maxCount, 1, 1000); - return client.InvokeOnMainThread(() => - { - Dictionary playerNamesByEntityId = BuildTrackedPlayerSnapshots(client, includeSelf: true) - .ToDictionary(player => player.EntityId, player => player.Name); - MccEntitySummary[] data = client.GetEntities() - .Take(count) - .Select(pair => - { - string? resolvedName = pair.Value.Type == EntityType.Player - && playerNamesByEntityId.TryGetValue(pair.Key, out string? mappedName) - ? mappedName - : pair.Value.Name; - return BuildEntitySummary(pair.Value, resolvedName); - }) - .ToArray(); - - return MccGameResult.Ok(new MccQueryEntitiesResult - { - Count = client.GetEntities().Count, - Entities = data - }); - }); - } - - /// - /// List tracked entities with optional filtering. - /// - public MccGameResult ListEntities(int maxCount = 200, string? typeFilter = null, double radius = 0) - { - McClient? client = clientProvider(); - if (client is null) - return NotConnected(); - - if (!client.GetEntityHandlingEnabled()) - return MccGameResult.Fail("feature_disabled"); - - int count = Math.Clamp(maxCount, 1, 1000); - string? filter = string.IsNullOrWhiteSpace(typeFilter) ? null : typeFilter.Trim(); - double radiusValue = Math.Max(radius, 0); - - return client.InvokeOnMainThread(() => - { - Dictionary entities = client.GetEntities(); - Location playerLocation = client.GetCurrentLocation(); - Dictionary playerNamesByEntityId = BuildTrackedPlayerSnapshots(client, includeSelf: true) - .ToDictionary(player => player.EntityId, player => player.Name); - - MccEntitySummary[] data = entities.Values - .Select(entity => - { - double dx = entity.Location.X - playerLocation.X; - double dy = entity.Location.Y - playerLocation.Y; - double dz = entity.Location.Z - playerLocation.Z; - string? resolvedName = entity.Type == EntityType.Player - && playerNamesByEntityId.TryGetValue(entity.ID, out string? mappedName) - ? mappedName - : entity.Name; - return new - { - entity, - resolvedName, - distance = Math.Sqrt(dx * dx + dy * dy + dz * dz) - }; - }) - .Where(item => radiusValue <= 0 || item.distance <= radiusValue) - .Where(item => filter is null - || item.entity.Type.ToString().Contains(filter, StringComparison.OrdinalIgnoreCase) - || item.entity.GetTypeString().Contains(filter, StringComparison.OrdinalIgnoreCase)) - .OrderBy(item => item.distance) - .Take(count) - .Select(item => BuildEntitySummary(item.entity, item.resolvedName, item.distance)) - .ToArray(); - - return MccGameResult.Ok(new MccListEntitiesResult - { - TotalTracked = entities.Count, - Count = data.Length, - Entities = data - }); - }); - } - - /// - /// Get detailed information for a tracked entity. - /// - public MccGameResult GetEntityInfo(int entityId, bool includeMetadata = false, bool includeEquipment = false, bool includeEffects = false) - { - McClient? client = clientProvider(); - if (client is null) - return NotConnected(); - - if (!client.GetEntityHandlingEnabled()) - return MccGameResult.Fail("feature_disabled"); - - return client.InvokeOnMainThread(() => - { - Dictionary entities = client.GetEntities(); - if (!entities.TryGetValue(entityId, out Entity? entity)) - return MccGameResult.Fail("invalid_state"); - - string? resolvedName = entity.Name; - if (entity.Type == EntityType.Player) - { - Dictionary playerNamesByEntityId = BuildTrackedPlayerSnapshots(client, includeSelf: true) - .ToDictionary(player => player.EntityId, player => player.Name); - if (playerNamesByEntityId.TryGetValue(entityId, out string? mappedName)) - resolvedName = mappedName; - } - - Dictionary? metadata = includeMetadata - ? entity.Metadata?.ToDictionary( - pair => pair.Key.ToString(), - pair => MccGameCommon.DescribeMetadataValue(pair.Value)) - : null; - MccEntityEquipmentEntry[]? equipment = includeEquipment - ? entity.Equipment - .Select(pair => new MccEntityEquipmentEntry - { - Slot = pair.Key, - Type = pair.Value.Type.ToString(), - Count = pair.Value.Count - }) - .ToArray() - : null; - MccEffectSnapshot[]? activeEffects = includeEffects - ? entity.ActiveEffects.Values - .Select(effect => new MccEffectSnapshot - { - Id = effect.Effect.ToString(), - Amplifier = effect.Amplifier, - RemainingSeconds = effect.RemainingSeconds, - IsInfinite = effect.IsInfinite - }) - .ToArray() - : null; - - return MccGameResult.Ok(new MccEntityInfoResult - { - Id = entity.ID, - Type = entity.Type.ToString(), - TypeLabel = entity.GetTypeString(), - Uuid = entity.UUID, - Name = resolvedName, - CustomName = entity.CustomName, - CustomNameVisible = entity.IsCustomNameVisible, - X = MccGameCommon.RoundCoordinate(entity.Location.X), - Y = MccGameCommon.RoundCoordinate(entity.Location.Y), - Z = MccGameCommon.RoundCoordinate(entity.Location.Z), - Yaw = entity.Yaw, - Pitch = entity.Pitch, - Health = entity.Health, - Pose = entity.Pose.ToString(), - Latency = entity.Latency, - ObjectData = entity.ObjectData, - Metadata = metadata, - Equipment = equipment, - ActiveEffects = activeEffects - }); - }); - } - - /// - /// Return the nearest tracked entity matching the requested filters. - /// - public MccGameResult FindNearestEntity(string? typeFilter = null, string? nameFilter = null, double radius = 64.0, bool includePlayers = true) - { - if (radius <= 0 || radius > 1024) - return MccGameResult.Fail("invalid_args"); - - McClient? client = clientProvider(); - if (client is null) - return NotConnected(); - - if (!client.GetEntityHandlingEnabled()) - return MccGameResult.Fail("feature_disabled"); - - string? normalizedTypeFilter = string.IsNullOrWhiteSpace(typeFilter) ? null : typeFilter.Trim(); - string? normalizedNameFilter = string.IsNullOrWhiteSpace(nameFilter) ? null : nameFilter.Trim(); - - return client.InvokeOnMainThread(() => - { - Location playerLocation = client.GetCurrentLocation(); - Dictionary playerNamesByEntityId = BuildTrackedPlayerSnapshots(client, includeSelf: true) - .ToDictionary(player => player.EntityId, player => player.Name); - - var nearest = client.GetEntities().Values - .Where(entity => includePlayers || entity.Type != EntityType.Player) - .Select(entity => - { - double dx = entity.Location.X - playerLocation.X; - double dy = entity.Location.Y - playerLocation.Y; - double dz = entity.Location.Z - playerLocation.Z; - string? resolvedName = entity.Type == EntityType.Player - && playerNamesByEntityId.TryGetValue(entity.ID, out string? mappedName) - ? mappedName - : entity.Name; - return new - { - entity, - resolvedName, - distance = Math.Sqrt(dx * dx + dy * dy + dz * dz) - }; - }) - .Where(item => item.distance <= radius) - .Where(item => normalizedTypeFilter is null - || MccGameCommon.TextMatchesFilter(item.entity.Type.ToString(), normalizedTypeFilter) - || MccGameCommon.TextMatchesFilter(item.entity.GetTypeString(), normalizedTypeFilter)) - .Where(item => normalizedNameFilter is null - || EntityNameMatches(item.resolvedName, item.entity.CustomName, normalizedNameFilter)) - .OrderBy(item => item.distance) - .FirstOrDefault(); - - if (nearest is null) - return MccGameResult.Fail("invalid_state"); - - return MccGameResult.Ok(BuildEntitySummary(nearest.entity, nearest.resolvedName, nearest.distance)); - }); - } - - /// - /// Move to a tracked player by name and verify arrival. - /// Callers running on ChatBot update callbacks should prefer - /// so the main MCC updater thread is not blocked while pathfinding completes. - /// - public MccGameResult MoveToPlayer(string playerName, bool allowUnsafe = false, bool allowDirectTeleport = false, int maxOffset = 0, int minOffset = 0, int timeoutMs = 0) - { - if (string.IsNullOrWhiteSpace(playerName)) - return MccGameResult.Fail("invalid_args"); - - if (!AreValidPathOffsets(maxOffset, minOffset) || timeoutMs < 0) - return MccGameResult.Fail("invalid_args"); - - McClient? client = clientProvider(); - if (client is null) - return NotConnected(); - - if (!client.GetTerrainEnabled() || !client.GetEntityHandlingEnabled()) - return MccGameResult.Fail("feature_disabled"); - - string nameFilter = playerName.Trim(); - NearbyPlayerSnapshot? target = client.InvokeOnMainThread(() => - { - return BuildTrackedPlayerSnapshots(client, includeSelf: false) - .Where(player => PlayerNameMatches(player, nameFilter)) - .OrderBy(player => player.Distance) - .FirstOrDefault(); - }); - - if (target is null) - return MccGameResult.Fail("invalid_state"); - - Location goal = new(target.X, target.Y, target.Z); - Location startLocation = client.InvokeOnMainThread(client.GetCurrentLocation); - TimeSpan? timeout = timeoutMs > 0 ? TimeSpan.FromMilliseconds(timeoutMs) : null; - bool pathFound = client.InvokeOnMainThread(() => client.MoveTo(goal, allowUnsafe, allowDirectTeleport, maxOffset, minOffset, timeout)); - - int verifyWaitMs = GetArrivalWaitMs(timeoutMs); - double tolerance = GetArrivalTolerance(maxOffset, minOffset); - Location? finalLocation = null; - bool arrived = pathFound && WaitForArrival(client, goal, verifyWaitMs, tolerance, out finalLocation); - finalLocation ??= client.InvokeOnMainThread(client.GetCurrentLocation); - - MccMoveToPlayerResult resultData = new() - { - PathFound = pathFound, - Arrived = arrived, - Tolerance = tolerance, - VerifyWaitMs = verifyWaitMs, - Target = new MccMoveToPlayerTarget - { - PlayerName = target.Name, - EntityId = target.EntityId, - X = MccGameCommon.RoundCoordinate(target.X), - Y = MccGameCommon.RoundCoordinate(target.Y), - Z = MccGameCommon.RoundCoordinate(target.Z) - }, - StartLocation = MccGameCommon.ToCoordinate(startLocation), - FinalLocation = MccGameCommon.ToCoordinate(finalLocation.Value), - FinalDistance = MccGameCommon.GetDistance(finalLocation.Value, goal), - DistanceMoved = MccGameCommon.GetDistance(startLocation, finalLocation.Value), - AllowUnsafe = allowUnsafe, - AllowDirectTeleport = allowDirectTeleport, - MaxOffset = maxOffset, - MinOffset = minOffset, - TimeoutMs = timeoutMs - }; - - return pathFound && arrived - ? MccGameResult.Ok(resultData) - : MccGameResult.Fail("action_incomplete", data: resultData); - } - - /// - /// Run on a worker thread so ChatBot callbacks can poll the result without blocking MCC updates. - /// - public Task> MoveToPlayerAsync(string playerName, bool allowUnsafe = false, bool allowDirectTeleport = false, int maxOffset = 0, int minOffset = 0, int timeoutMs = 0) - { - return Task.Run(() => MoveToPlayer(playerName, allowUnsafe, allowDirectTeleport, maxOffset, minOffset, timeoutMs)); - } - - /// - /// Select a hotbar item by item type without moving items around. - /// - public MccGameResult SelectHotbarItem(string itemType, bool preferLowestSlot = true) - { - if (string.IsNullOrWhiteSpace(itemType)) - return MccGameResult.Fail("invalid_args"); - - McClient? client = clientProvider(); - if (client is null) - return NotConnected(); - - if (!client.GetInventoryEnabled()) - return MccGameResult.Fail("feature_disabled"); - - if (!MccGameCommon.TryParseItemType(itemType, out ItemType parsedItemType)) - return MccGameResult.Fail("invalid_args"); - - return client.InvokeOnMainThread(() => - { - Container? inventory = client.GetInventory(0); - if (inventory is null) - return MccGameResult.Fail("invalid_state"); - - var matches = inventory.Items - .Where(pair => pair.Value.Type == parsedItemType && pair.Value.Count > 0) - .Select(pair => - { - bool isHotbar = inventory.IsHotbar(pair.Key, out int hotbar); - return new - { - InventorySlot = pair.Key, - Hotbar = hotbar, - IsHotbar = isHotbar, - Count = pair.Value.Count - }; - }) - .Where(match => match.IsHotbar) - .OrderBy(match => preferLowestSlot ? match.Hotbar : -match.Hotbar) - .ToArray(); - - if (matches.Length == 0) - return MccGameResult.Fail("invalid_state"); - - var selected = matches[0]; - bool ok = client.ChangeSlot((short)selected.Hotbar); - MccHotbarSelectionResult resultData = new() - { - Success = ok, - ItemType = parsedItemType.ToString(), - InventorySlot = selected.InventorySlot, - SelectedSlot = selected.Hotbar + 1, - Count = selected.Count - }; - - return ok - ? MccGameResult.Ok(resultData) - : MccGameResult.Fail("action_failed", data: resultData); - }); - } - - /// - /// Get a snapshot of an inventory. - /// - public MccGameResult GetInventorySnapshot(int inventoryId) - { - McClient? client = clientProvider(); - if (client is null) - return NotConnected(); - - if (!client.GetInventoryEnabled()) - return MccGameResult.Fail("feature_disabled"); - - return client.InvokeOnMainThread(() => - { - Dictionary inventories = client.GetInventories(); - if (!inventories.TryGetValue(inventoryId, out Container? inventory)) - return MccGameResult.Fail("invalid_state"); - - MccInventorySnapshotSlot[] slots = inventory.Items - .Where(item => IsSnapshotInventorySlot(inventory, item.Key)) - .OrderBy(item => item.Key) - .Select(item => new MccInventorySnapshotSlot - { - Slot = item.Key, - Type = item.Value.Type.ToString(), - Count = item.Value.Count, - Nbt = MccGameCommon.BuildNbt(item.Value) - }) - .ToArray(); - - return MccGameResult.Ok(new MccInventorySnapshotResult - { - Id = inventory.ID, - Type = inventory.Type.ToString(), - Title = inventory.Title ?? string.Empty, - SlotCount = inventory.Type.SlotCount(), - Slots = slots, - Cursor = TryBuildCursorSnapshot(inventory) - }); - }); - } - - /// - /// Search player and container inventories for matching items. - /// - public MccGameResult SearchInventories(string query, int maxCount = 100, bool exactMatch = false, bool includeContainers = false) - { - if (string.IsNullOrWhiteSpace(query)) - return MccGameResult.Fail("invalid_args"); - - McClient? client = clientProvider(); - if (client is null) - return NotConnected(); - - if (!client.GetInventoryEnabled()) - return MccGameResult.Fail("feature_disabled"); - - string normalizedQuery = query.Trim(); - ItemType? parsedItemType = exactMatch && MccGameCommon.TryParseItemType(normalizedQuery, out ItemType exactItemType) - ? exactItemType - : null; - int limit = Math.Clamp(maxCount, 1, 1000); - - return client.InvokeOnMainThread(() => - { - MccInventorySearchMatch[] matches = client.GetInventories() - .Where(entry => includeContainers || entry.Key == 0) - .OrderBy(entry => entry.Key) - .SelectMany(entry => - { - Container inventory = entry.Value; - return inventory.Items - .Where(pair => pair.Key >= 0 && pair.Value.Count > 0) - .Where(pair => ItemMatches(pair.Value, normalizedQuery, exactMatch, parsedItemType)) - .Select(pair => - { - bool isHotbar = inventory.IsHotbar(pair.Key, out int hotbar); - return new MccInventorySearchMatch - { - InventoryId = entry.Key, - InventoryType = inventory.Type.ToString(), - InventoryTitle = inventory.Title ?? string.Empty, - Slot = pair.Key, - ItemType = pair.Value.Type.ToString(), - TypeLabel = pair.Value.GetTypeString(), - Count = pair.Value.Count, - IsPlayerInventory = entry.Key == 0, - HotbarSlot = isHotbar ? hotbar + 1 : null, - Nbt = MccGameCommon.BuildNbt(pair.Value) - }; - }); - }) - .Take(limit) - .ToArray(); - - return MccGameResult.Ok(new MccInventorySearchResult - { - Query = normalizedQuery, - ExactMatch = exactMatch, - IncludeContainers = includeContainers, - Count = matches.Length, - Matches = matches - }); - }); - } - - /// - /// List active inventories. - /// - public MccGameResult ListInventories() - { - McClient? client = clientProvider(); - if (client is null) - return NotConnected(); - - if (!client.GetInventoryEnabled()) - return MccGameResult.Fail("feature_disabled"); - - return client.InvokeOnMainThread(() => - { - MccInventoryListEntry[] inventories = client.GetInventories() - .OrderBy(entry => entry.Key) - .Select(entry => new MccInventoryListEntry - { - Id = entry.Key, - Type = entry.Value.Type.ToString(), - Title = entry.Value.Title ?? string.Empty, - SlotCount = entry.Value.Type.SlotCount(), - NonEmptySlots = entry.Value.Items.Count(item => IsSnapshotInventorySlot(entry.Value, item.Key)), - Active = entry.Key > 0 && entry.Key == GetActiveContainerId(client) - }) - .ToArray(); - - return MccGameResult.Ok(new MccInventoryListResult - { - Count = inventories.Length, - Inventories = inventories - }); - }); - } - - /// - /// List nearby item entities. - /// - public MccGameResult ListItemEntities(string? itemType = null, double radius = 32, int maxCount = 50) - { - if (radius <= 0 || radius > 1024) - return MccGameResult.Fail("invalid_args"); - - McClient? client = clientProvider(); - if (client is null) - return NotConnected(); - - if (!client.GetEntityHandlingEnabled()) - return MccGameResult.Fail("feature_disabled"); - - ItemType? parsedItemType = null; - string? itemTypeFilter = null; - if (!string.IsNullOrWhiteSpace(itemType)) - { - itemTypeFilter = itemType.Trim(); - if (!MccGameCommon.TryParseItemType(itemTypeFilter, out ItemType resolvedType)) - return MccGameResult.Fail("invalid_args"); - - parsedItemType = resolvedType; - } - - int limit = Math.Clamp(maxCount, 1, 500); - return client.InvokeOnMainThread(() => - { - MccItemEntityEntry[] items = BuildNearbyItemSnapshots(client, parsedItemType, radius, limit) - .Select(item => new MccItemEntityEntry - { - EntityId = item.EntityId, - ItemType = item.ItemType.ToString(), - TypeLabel = item.TypeLabel, - Count = item.Count, - X = MccGameCommon.RoundCoordinate(item.X), - Y = MccGameCommon.RoundCoordinate(item.Y), - Z = MccGameCommon.RoundCoordinate(item.Z), - Distance = item.Distance - }) - .ToArray(); - - return MccGameResult.Ok(new MccItemEntitiesResult - { - ItemType = parsedItemType?.ToString() ?? itemTypeFilter, - Radius = radius, - Count = items.Length, - Items = items - }); - }); - } - - /// - /// Move to nearby dropped items and verify pickup completion. - /// Callers running on ChatBot update callbacks should prefer - /// so the main MCC updater thread is not blocked while movement and pickup verification complete. - /// - public MccGameResult PickupItems(string itemType, double radius = 16, int maxItems = 10, bool allowUnsafe = false, int timeoutMs = 0) - { - if (string.IsNullOrWhiteSpace(itemType) || radius <= 0 || radius > 1024 || maxItems < 1 || timeoutMs < 0) - return MccGameResult.Fail("invalid_args"); - - if (!MccGameCommon.TryParseItemType(itemType.Trim(), out ItemType parsedItemType)) - return MccGameResult.Fail("invalid_args"); - - McClient? client = clientProvider(); - if (client is null) - return NotConnected(); - - if (!client.GetTerrainEnabled() || !client.GetEntityHandlingEnabled()) - return MccGameResult.Fail("feature_disabled"); - - int limit = Math.Clamp(maxItems, 1, 50); - NearbyItemSnapshot[] targets = client.InvokeOnMainThread(() => BuildNearbyItemSnapshots(client, parsedItemType, radius, limit)); - if (targets.Length == 0) - return MccGameResult.Fail("invalid_state"); - - bool inventoryEnabled = client.GetInventoryEnabled(); - int beforeCount = inventoryEnabled ? client.InvokeOnMainThread(() => GetInventoryItemCount(client, parsedItemType)) : 0; - int initialCount = beforeCount; - int verifyWaitMs = timeoutMs > 0 ? Math.Clamp(timeoutMs, MinArrivalWaitMs, MaxArrivalWaitMs) : 2500; - List attempts = new(targets.Length); - int successfulPickups = 0; - - foreach (NearbyItemSnapshot target in targets) - { - Location targetLocation = new(target.X, target.Y, target.Z); - Location startLocation = client.InvokeOnMainThread(client.GetCurrentLocation); - TimeSpan? moveTimeout = timeoutMs > 0 ? TimeSpan.FromMilliseconds(timeoutMs) : null; - bool pathFound = client.InvokeOnMainThread(() => client.MoveTo(targetLocation, allowUnsafe, false, 0, 0, moveTimeout)); - Location? finalLocation = null; - bool arrived = pathFound && WaitForArrival(client, targetLocation, verifyWaitMs, 2.0, out finalLocation); - finalLocation ??= client.InvokeOnMainThread(client.GetCurrentLocation); - bool entityGone = WaitForEntityRemoval(client, target.EntityId, verifyWaitMs); - int afterCount = inventoryEnabled ? client.InvokeOnMainThread(() => GetInventoryItemCount(client, parsedItemType)) : beforeCount; - int inventoryDelta = inventoryEnabled ? Math.Max(0, afterCount - beforeCount) : 0; - bool pickedUp = entityGone || inventoryDelta > 0; - if (pickedUp) - successfulPickups++; - - attempts.Add(new MccPickupAttempt - { - EntityId = target.EntityId, - ItemType = target.ItemType.ToString(), - TypeLabel = target.TypeLabel, - ExpectedCount = target.Count, - Target = MccGameCommon.ToCoordinate(target.X, target.Y, target.Z), - PathFound = pathFound, - Arrived = arrived, - EntityGone = entityGone, - InventoryDelta = inventoryDelta, - StartLocation = MccGameCommon.ToCoordinate(startLocation), - FinalLocation = MccGameCommon.ToCoordinate(finalLocation.Value), - FinalDistance = MccGameCommon.GetDistance(finalLocation.Value, targetLocation) - }); - - beforeCount = afterCount; - } - - int remainingNearby = client.InvokeOnMainThread(() => BuildNearbyItemSnapshots(client, parsedItemType, radius, 1000).Length); - int collectedCount = inventoryEnabled ? Math.Max(0, beforeCount - initialCount) : successfulPickups; - MccPickupItemsResult resultData = new() - { - ItemType = parsedItemType.ToString(), - Radius = radius, - MaxItems = limit, - AllowUnsafe = allowUnsafe, - TimeoutMs = verifyWaitMs, - Attempted = attempts.Count, - SuccessfulPickups = successfulPickups, - CollectedCount = collectedCount, - InitialInventoryCount = inventoryEnabled ? initialCount : null, - FinalInventoryCount = inventoryEnabled ? beforeCount : null, - RemainingNearby = remainingNearby, - Attempts = attempts.ToArray() - }; - - return successfulPickups > 0 || collectedCount > 0 - ? MccGameResult.Ok(resultData) - : MccGameResult.Fail("action_incomplete", data: resultData); - } - - /// - /// Run on a worker thread so ChatBot callbacks can poll the result without blocking MCC updates. - /// - public Task> PickupItemsAsync(string itemType, double radius = 16, int maxItems = 10, bool allowUnsafe = false, int timeoutMs = 0) - { - return Task.Run(() => PickupItems(itemType, radius, maxItems, allowUnsafe, timeoutMs)); - } - - private static MccGameResult NotConnected() - { - return MccGameResult.Fail("disconnected"); - } - - private static MccEntitySummary BuildEntitySummary(Entity entity, string? resolvedName, double? distance = null) - { - return new MccEntitySummary - { - Id = entity.ID, - Type = entity.Type.ToString(), - TypeLabel = entity.GetTypeString(), - Uuid = entity.UUID, - Name = resolvedName, - CustomName = entity.CustomName, - X = MccGameCommon.RoundCoordinate(entity.Location.X), - Y = MccGameCommon.RoundCoordinate(entity.Location.Y), - Z = MccGameCommon.RoundCoordinate(entity.Location.Z), - Distance = distance, - Health = entity.Health, - Pose = entity.Pose.ToString(), - Latency = entity.Latency - }; - } - - private static bool IsSnapshotInventorySlot(Container inventory, int slotId) - { - return slotId >= 0 && slotId < inventory.Type.SlotCount(); - } - - private static MccItemStackSnapshot? TryBuildCursorSnapshot(Container inventory) - { - return inventory.Items.TryGetValue(-1, out Item? cursorItem) && cursorItem.Count > 0 - ? MccGameCommon.ToItemStack(cursorItem) - : null; - } - - private static int GetActiveContainerId(McClient client) - { - return client.GetInventories().Keys.Where(id => id > 0).DefaultIfEmpty(0).Max(); - } - - private static bool ItemMatches(Item item, string query, bool exactMatch, ItemType? exactItemType) - { - if (exactItemType.HasValue) - return item.Type == exactItemType.Value; - - string typeName = item.Type.ToString(); - string typeLabel = item.GetTypeString(); - return exactMatch - ? MccGameCommon.TextEqualsFilter(typeName, query) || MccGameCommon.TextEqualsFilter(typeLabel, query) - : MccGameCommon.TextMatchesFilter(typeName, query) || MccGameCommon.TextMatchesFilter(typeLabel, query); - } - - private static bool WaitForArrival(McClient client, Location goal, int waitMs, double tolerance, out Location? finalLocation) - { - finalLocation = null; - DateTime deadline = DateTime.UtcNow.AddMilliseconds(waitMs); - while (true) - { - Location location = client.InvokeOnMainThread(client.GetCurrentLocation); - finalLocation = location; - if (MccGameCommon.GetDistance(location, goal) <= tolerance) - return true; - - if (DateTime.UtcNow >= deadline) - return false; - - Thread.Sleep(ArrivalPollIntervalMs); - } - } - - private static bool WaitForEntityRemoval(McClient client, int entityId, int waitMs) - { - DateTime deadline = DateTime.UtcNow.AddMilliseconds(waitMs); - while (true) - { - bool exists = client.InvokeOnMainThread(() => client.GetEntities().ContainsKey(entityId)); - if (!exists) - return true; - - if (DateTime.UtcNow >= deadline) - return false; - - Thread.Sleep(ArrivalPollIntervalMs); - } - } - - private static int GetInventoryItemCount(McClient client, ItemType itemType) - { - Container? inventory = client.GetInventory(0); - if (inventory is null) - return 0; - - return inventory.Items.Values - .Where(item => item.Type == itemType) - .Sum(item => item.Count); - } - - private static int GetPathQueryTimeoutMs(int timeoutMs) - { - if (timeoutMs <= 0) - return DefaultPathQueryTimeoutMs; - return Math.Clamp(timeoutMs, MinPathQueryTimeoutMs, MaxPathQueryTimeoutMs); - } - - private static int GetArrivalWaitMs(int timeoutMs) - { - if (timeoutMs <= 0) - return DefaultArrivalWaitMs; - return Math.Clamp(timeoutMs, MinArrivalWaitMs, MaxArrivalWaitMs); - } - - private static double GetArrivalTolerance(int maxOffset, int minOffset) - { - double toleranceFromOffset = Math.Max(maxOffset, minOffset) + 1.0; - return Math.Max(DefaultArrivalTolerance, toleranceFromOffset); - } - - private static bool AreValidPathOffsets(int maxOffset, int minOffset) - { - return maxOffset >= 0 && minOffset >= 0 && minOffset <= maxOffset; - } - - private static bool EntityNameMatches(string? name, string? customName, string filter) - { - return (!string.IsNullOrWhiteSpace(name) && MccGameCommon.TextMatchesFilter(name, filter)) - || (!string.IsNullOrWhiteSpace(customName) && MccGameCommon.TextMatchesFilter(customName, filter)); - } - - private static bool PlayerNameMatches(NearbyPlayerSnapshot player, string filter) - { - if (string.IsNullOrWhiteSpace(filter)) - return true; - - string trimmed = filter.Trim(); - if (!string.IsNullOrWhiteSpace(player.Name) && player.Name.Contains(trimmed, StringComparison.OrdinalIgnoreCase)) - return true; - - if (!string.IsNullOrWhiteSpace(player.CustomName) && player.CustomName.Contains(trimmed, StringComparison.OrdinalIgnoreCase)) - return true; - - return false; - } - - private static NearbyItemSnapshot[] BuildNearbyItemSnapshots(McClient client, ItemType? itemType, double radius, int maxCount) - { - Location playerLocation = client.GetCurrentLocation(); - return client.GetEntities().Values - .Where(entity => entity.Type == EntityType.Item && !entity.Item.IsEmpty) - .Where(entity => !itemType.HasValue || entity.Item.Type == itemType.Value) - .Select(entity => - { - double dx = entity.Location.X - playerLocation.X; - double dy = entity.Location.Y - playerLocation.Y; - double dz = entity.Location.Z - playerLocation.Z; - return new NearbyItemSnapshot - { - EntityId = entity.ID, - ItemType = entity.Item.Type, - TypeLabel = entity.Item.GetTypeString(), - Count = entity.Item.Count, - X = entity.Location.X, - Y = entity.Location.Y, - Z = entity.Location.Z, - Distance = Math.Sqrt(dx * dx + dy * dy + dz * dz) - }; - }) - .Where(item => item.Distance <= radius) - .OrderBy(item => item.Distance) - .Take(maxCount) - .ToArray(); - } - - private static List BuildTrackedPlayerSnapshots(McClient client, bool includeSelf) - { - Location playerLocation = client.GetCurrentLocation(); - string username = client.GetUsername(); - Dictionary uuidToName = client.GetOnlinePlayersWithUUID(); - string[] onlinePlayers = client.GetOnlinePlayers(); - - List trackedPlayers = client.GetEntities().Values - .Where(entity => entity.Type == EntityType.Player) - .Select(entity => - { - double dx = entity.Location.X - playerLocation.X; - double dy = entity.Location.Y - playerLocation.Y; - double dz = entity.Location.Z - playerLocation.Z; - double distance = Math.Sqrt(dx * dx + dy * dy + dz * dz); - string? rawName = ResolvePlayerEntityName(entity, uuidToName); - return new NearbyPlayerSnapshot - { - EntityId = entity.ID, - Uuid = entity.UUID, - Name = rawName, - CustomName = entity.CustomName, - X = entity.Location.X, - Y = entity.Location.Y, - Z = entity.Location.Z, - Distance = distance, - Latency = entity.Latency - }; - }) - .ToList(); - - if (!includeSelf) - { - trackedPlayers = trackedPlayers - .Where(player => !string.Equals(player.Name, username, StringComparison.OrdinalIgnoreCase)) - .Where(player => player.Distance > SelfEntityDistanceThreshold) - .ToList(); - } - - List unnamedTracked = trackedPlayers - .Where(player => string.IsNullOrWhiteSpace(player.Name)) - .OrderBy(player => player.Distance) - .ToList(); - if (unnamedTracked.Count == 0) - return trackedPlayers; - - HashSet assignedNames = trackedPlayers - .Select(player => player.Name) - .OfType() - .ToHashSet(NameComparer); - - string[] unmatchedOnline = onlinePlayers - .Where(name => includeSelf || !string.Equals(name, username, StringComparison.OrdinalIgnoreCase)) - .Where(name => !string.IsNullOrWhiteSpace(name)) - .Where(name => !assignedNames.Contains(name)) - .Distinct(NameComparer) - .ToArray(); - - if (unmatchedOnline.Length == 0) - return trackedPlayers; - - if (unnamedTracked.Count == 1 && unmatchedOnline.Length == 1) - { - unnamedTracked[0].Name = unmatchedOnline[0]; - return trackedPlayers; - } - - int pairCount = Math.Min(unnamedTracked.Count, unmatchedOnline.Length); - string[] sortedNames = unmatchedOnline - .OrderBy(name => name, NameComparer) - .ToArray(); - for (int i = 0; i < pairCount; i++) - unnamedTracked[i].Name = sortedNames[i]; - - return trackedPlayers; - } - - private static string? ResolvePlayerEntityName(Entity entity, IReadOnlyDictionary uuidToName) - { - if (!string.IsNullOrWhiteSpace(entity.Name)) - return entity.Name; - - if (entity.UUID != Guid.Empty - && uuidToName.TryGetValue(entity.UUID.ToString(), out string? mappedName) - && !string.IsNullOrWhiteSpace(mappedName)) - { - return mappedName; - } - - if (!string.IsNullOrWhiteSpace(entity.CustomName)) - return entity.CustomName; - - return null; - } -} diff --git a/MinecraftClient/Scripting/MccGameCommon.cs b/MinecraftClient/Scripting/MccGameCommon.cs deleted file mode 100644 index 042d94531a..0000000000 --- a/MinecraftClient/Scripting/MccGameCommon.cs +++ /dev/null @@ -1,237 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using MinecraftClient.Inventory; -using MinecraftClient.Mapping; - -namespace MinecraftClient.Scripting; - -/// -/// Represents a world coordinate rounded for tool and script consumption. -/// -public sealed class MccCoordinate -{ - public required double X { get; init; } - public required double Y { get; init; } - public required double Z { get; init; } -} - -/// -/// Represents a block state snapshot. -/// -public sealed class MccBlockStateSnapshot -{ - public required string Material { get; init; } - public required string TypeLabel { get; init; } - public required int BlockId { get; init; } - public required int BlockMeta { get; init; } - public required int StateId { get; init; } - public required IReadOnlyDictionary Properties { get; init; } -} - -/// -/// Represents a simple item stack snapshot. -/// -public sealed class MccItemStackSnapshot -{ - public required string Type { get; init; } - public required int Count { get; init; } - public Dictionary? Nbt { get; init; } -} - -/// -/// Shared normalization and formatting helpers for gameplay operations. -/// -public static class MccGameCommon -{ - private const int CoordinateRoundingPrecision = 2; - - public static bool TryParseItemType(string rawItemType, out ItemType itemType) - { - if (Enum.TryParse(rawItemType, true, out itemType) && itemType is not (ItemType.Unknown or ItemType.Null)) - return true; - - string normalized = NormalizeToken(rawItemType); - if (normalized.Length == 0) - { - itemType = ItemType.Unknown; - return false; - } - - foreach (ItemType candidate in Enum.GetValues()) - { - if (candidate is ItemType.Unknown or ItemType.Null) - continue; - - if (NormalizeToken(candidate.ToString()) == normalized) - { - itemType = candidate; - return true; - } - } - - itemType = ItemType.Unknown; - return false; - } - - public static string NormalizeToken(string value) - { - if (string.IsNullOrWhiteSpace(value)) - return string.Empty; - - char[] buffer = value - .Where(char.IsLetterOrDigit) - .Select(char.ToLowerInvariant) - .ToArray(); - return new string(buffer); - } - - public static bool TextEqualsFilter(string text, string filter) - { - return text.Equals(filter, StringComparison.OrdinalIgnoreCase) - || NormalizeToken(text) == NormalizeToken(filter); - } - - public static bool TextMatchesFilter(string text, string filter) - { - if (text.Contains(filter, StringComparison.OrdinalIgnoreCase)) - return true; - - string normalizedFilter = NormalizeToken(filter); - if (normalizedFilter.Length == 0) - return false; - - return NormalizeToken(text).Contains(normalizedFilter, StringComparison.Ordinal); - } - - public static double GetDistance(Location from, Location to) - { - double dx = from.X - to.X; - double dy = from.Y - to.Y; - double dz = from.Z - to.Z; - return Math.Sqrt(dx * dx + dy * dy + dz * dz); - } - - public static double RoundCoordinate(double value) - { - return Math.Round(value, CoordinateRoundingPrecision, MidpointRounding.AwayFromZero); - } - - public static MccCoordinate ToCoordinate(Location location) - { - return ToCoordinate(location.X, location.Y, location.Z); - } - - public static MccCoordinate ToCoordinate(double x, double y, double z) - { - return new MccCoordinate - { - X = RoundCoordinate(x), - Y = RoundCoordinate(y), - Z = RoundCoordinate(z) - }; - } - - public static Location ToBlockLocation(double x, double y, double z) - { - return new Location(Math.Floor(x), Math.Floor(y), Math.Floor(z)); - } - - public static MccBlockStateSnapshot ToBlockState(Block block) - { - return new MccBlockStateSnapshot - { - Material = block.Type.ToString(), - TypeLabel = block.GetTypeString(), - BlockId = block.BlockId, - BlockMeta = block.BlockMeta, - StateId = block.StateId, - Properties = block.GetStateProperties() - }; - } - - public static object? DescribeMetadataValue(object? value) - { - return value switch - { - null => null, - string s => s, - bool b => b, - byte b => b, - sbyte b => b, - short s => s, - ushort s => s, - int i => i, - uint i => i, - long l => l, - ulong l => l, - float f => f, - double d => d, - decimal d => d, - Enum e => e.ToString(), - Location location => ToCoordinate(location), - Item item => ToItemStack(item), - byte[] data => new { bytes = data.Length }, - _ => value.ToString() - }; - } - - public static MccItemStackSnapshot ToItemStack(Item item) - { - return new MccItemStackSnapshot - { - Type = item.Type.ToString(), - Count = item.Count, - Nbt = BuildNbt(item) - }; - } - - public static Dictionary? BuildNbt(Item item) - { - if (item.Components is { Count: > 0 }) - { - return item.Components - .Where(c => !string.IsNullOrEmpty(c.ComponentName)) - .ToDictionary( - c => c.ComponentName, - c => (object)System.Text.Json.JsonSerializer.SerializeToElement(c, c.GetType()) - ); - } - - return item.NBT is { Count: > 0 } ? item.NBT : null; - } - - public static bool TryParseBlockQuery(string? query, out int? blockId, out int? blockMeta) - { - blockId = null; - blockMeta = null; - if (string.IsNullOrWhiteSpace(query)) - return false; - - string trimmed = query.Trim(); - int separator = trimmed.IndexOf(':'); - if (separator >= 0) - { - string idPart = trimmed[..separator].Trim(); - string metaPart = trimmed[(separator + 1)..].Trim(); - if (int.TryParse(idPart, NumberStyles.Integer, CultureInfo.InvariantCulture, out int parsedId)) - { - blockId = parsedId; - if (int.TryParse(metaPart, NumberStyles.Integer, CultureInfo.InvariantCulture, out int parsedMeta)) - blockMeta = parsedMeta; - return true; - } - - return false; - } - - if (int.TryParse(trimmed, NumberStyles.Integer, CultureInfo.InvariantCulture, out int blockStateId)) - { - blockId = blockStateId; - return true; - } - - return false; - } -} diff --git a/MinecraftClient/Scripting/MccGameModels.cs b/MinecraftClient/Scripting/MccGameModels.cs deleted file mode 100644 index 1eef647637..0000000000 --- a/MinecraftClient/Scripting/MccGameModels.cs +++ /dev/null @@ -1,321 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace MinecraftClient.Scripting; - -public sealed class MccRecentEventsResult -{ - public required long AfterId { get; init; } - public required long LatestId { get; init; } - public required int Count { get; init; } - public required MccRecentEventEntry[] Events { get; init; } -} - -public sealed class MccChatHistoryResult -{ - public required int Count { get; init; } - public required MccChatHistoryEntry[] Entries { get; init; } -} - -public sealed class MccPathPreviewResult -{ - public required bool PathFound { get; init; } - public required bool ExactReachable { get; init; } - public required MccCoordinate Target { get; init; } - public required MccCoordinate StartLocation { get; init; } - public MccCoordinate? FinalWaypoint { get; init; } - public double? FinalDistance { get; init; } - public required int WaypointCount { get; init; } - public required bool Truncated { get; init; } - public required MccCoordinate[] Waypoints { get; init; } - public required bool AllowUnsafe { get; init; } - public required int MaxOffset { get; init; } - public required int MinOffset { get; init; } - public required int TimeoutMs { get; init; } -} - -public sealed class MccReachabilityResult -{ - public required bool Reachable { get; init; } - public required bool ExactReachable { get; init; } - public required MccCoordinate Target { get; init; } - public required MccCoordinate StartLocation { get; init; } - public MccCoordinate? FinalWaypoint { get; init; } - public double? FinalDistance { get; init; } - public required int WaypointCount { get; init; } - public required bool AllowUnsafe { get; init; } - public required int MaxOffset { get; init; } - public required int MinOffset { get; init; } - public required int TimeoutMs { get; init; } -} - -public sealed class MccPlayersDetailedEntry -{ - public string? Name { get; init; } - public required Guid Uuid { get; init; } - public required int Ping { get; init; } - public required int Gamemode { get; init; } - public required bool Listed { get; init; } - public string? DisplayName { get; init; } - public int? EntityId { get; init; } - public double? X { get; init; } - public double? Y { get; init; } - public double? Z { get; init; } -} - -public sealed class MccPlayersDetailedResult -{ - public required bool IncludeSelf { get; init; } - public required bool IncludeCoordinates { get; init; } - public required int Count { get; init; } - public required MccPlayersDetailedEntry[] Players { get; init; } -} - -public sealed class MccNearbyPlayerEntry -{ - public required int EntityId { get; init; } - public required Guid Uuid { get; init; } - public string? Name { get; init; } - public string? CustomName { get; init; } - public required double X { get; init; } - public required double Y { get; init; } - public required double Z { get; init; } - public required double Distance { get; init; } - public required int Latency { get; init; } -} - -public sealed class MccPlayerNearbyResult -{ - public required double Radius { get; init; } - public string? PlayerName { get; init; } - public required bool IncludeSelf { get; init; } - public required bool AnyNearby { get; init; } - public required int Count { get; init; } - public required MccNearbyPlayerEntry[] Players { get; init; } -} - -public sealed class MccLocatedPlayerResult -{ - public required string PlayerName { get; init; } - public string? MatchedName { get; init; } - public required int EntityId { get; init; } - public required Guid Uuid { get; init; } - public required double X { get; init; } - public required double Y { get; init; } - public required double Z { get; init; } - public required double Distance { get; init; } -} - -public sealed class MccEntitySummary -{ - public required int Id { get; init; } - public required string Type { get; init; } - public required string TypeLabel { get; init; } - public required Guid Uuid { get; init; } - public string? Name { get; init; } - public string? CustomName { get; init; } - public required double X { get; init; } - public required double Y { get; init; } - public required double Z { get; init; } - public double? Distance { get; init; } - public float? Health { get; init; } - public string? Pose { get; init; } - public int? Latency { get; init; } -} - -public sealed class MccQueryEntitiesResult -{ - public required int Count { get; init; } - public required MccEntitySummary[] Entities { get; init; } -} - -public sealed class MccListEntitiesResult -{ - public required int TotalTracked { get; init; } - public required int Count { get; init; } - public required MccEntitySummary[] Entities { get; init; } -} - -public sealed class MccEntityEquipmentEntry -{ - public required int Slot { get; init; } - public required string Type { get; init; } - public required int Count { get; init; } -} - -public sealed class MccEffectSnapshot -{ - public required string Id { get; init; } - public string? Name { get; init; } - public required int Amplifier { get; init; } - public required int RemainingSeconds { get; init; } - public required bool IsInfinite { get; init; } -} - -public sealed class MccEntityInfoResult -{ - public required int Id { get; init; } - public required string Type { get; init; } - public required string TypeLabel { get; init; } - public required Guid Uuid { get; init; } - public string? Name { get; init; } - public string? CustomName { get; init; } - public required bool CustomNameVisible { get; init; } - public required double X { get; init; } - public required double Y { get; init; } - public required double Z { get; init; } - public required float Yaw { get; init; } - public required float Pitch { get; init; } - public required float Health { get; init; } - public string? Pose { get; init; } - public int? Latency { get; init; } - public int? ObjectData { get; init; } - public Dictionary? Metadata { get; init; } - public MccEntityEquipmentEntry[]? Equipment { get; init; } - public MccEffectSnapshot[]? ActiveEffects { get; init; } -} - -public sealed class MccMoveToPlayerTarget -{ - public string? PlayerName { get; init; } - public required int EntityId { get; init; } - public required double X { get; init; } - public required double Y { get; init; } - public required double Z { get; init; } -} - -public sealed class MccMoveToPlayerResult -{ - public required bool PathFound { get; init; } - public required bool Arrived { get; init; } - public required double Tolerance { get; init; } - public required int VerifyWaitMs { get; init; } - public required MccMoveToPlayerTarget Target { get; init; } - public required MccCoordinate StartLocation { get; init; } - public required MccCoordinate FinalLocation { get; init; } - public required double FinalDistance { get; init; } - public required double DistanceMoved { get; init; } - public required bool AllowUnsafe { get; init; } - public required bool AllowDirectTeleport { get; init; } - public required int MaxOffset { get; init; } - public required int MinOffset { get; init; } - public required int TimeoutMs { get; init; } -} - -public sealed class MccHotbarSelectionResult -{ - public required bool Success { get; init; } - public required string ItemType { get; init; } - public required int InventorySlot { get; init; } - public required int SelectedSlot { get; init; } - public required int Count { get; init; } -} - -public sealed class MccInventorySnapshotSlot -{ - public required int Slot { get; init; } - public required string Type { get; init; } - public required int Count { get; init; } - public Dictionary? Nbt { get; init; } -} - -public sealed class MccInventorySnapshotResult -{ - public required int Id { get; init; } - public required string Type { get; init; } - public required string Title { get; init; } - public required int SlotCount { get; init; } - public required MccInventorySnapshotSlot[] Slots { get; init; } - public MccItemStackSnapshot? Cursor { get; init; } -} - -public sealed class MccInventorySearchMatch -{ - public required int InventoryId { get; init; } - public required string InventoryType { get; init; } - public required string InventoryTitle { get; init; } - public required int Slot { get; init; } - public required string ItemType { get; init; } - public required string TypeLabel { get; init; } - public required int Count { get; init; } - public required bool IsPlayerInventory { get; init; } - public int? HotbarSlot { get; init; } - public Dictionary? Nbt { get; init; } -} - -public sealed class MccInventorySearchResult -{ - public required string Query { get; init; } - public required bool ExactMatch { get; init; } - public required bool IncludeContainers { get; init; } - public required int Count { get; init; } - public required MccInventorySearchMatch[] Matches { get; init; } -} - -public sealed class MccInventoryListEntry -{ - public required int Id { get; init; } - public required string Type { get; init; } - public required string Title { get; init; } - public required int SlotCount { get; init; } - public required int NonEmptySlots { get; init; } - public required bool Active { get; init; } -} - -public sealed class MccInventoryListResult -{ - public required int Count { get; init; } - public required MccInventoryListEntry[] Inventories { get; init; } -} - -public sealed class MccItemEntityEntry -{ - public required int EntityId { get; init; } - public required string ItemType { get; init; } - public required string TypeLabel { get; init; } - public required int Count { get; init; } - public required double X { get; init; } - public required double Y { get; init; } - public required double Z { get; init; } - public required double Distance { get; init; } -} - -public sealed class MccItemEntitiesResult -{ - public string? ItemType { get; init; } - public required double Radius { get; init; } - public required int Count { get; init; } - public required MccItemEntityEntry[] Items { get; init; } -} - -public sealed class MccPickupAttempt -{ - public required int EntityId { get; init; } - public required string ItemType { get; init; } - public required string TypeLabel { get; init; } - public required int ExpectedCount { get; init; } - public required MccCoordinate Target { get; init; } - public required bool PathFound { get; init; } - public required bool Arrived { get; init; } - public required bool EntityGone { get; init; } - public required int InventoryDelta { get; init; } - public required MccCoordinate StartLocation { get; init; } - public required MccCoordinate FinalLocation { get; init; } - public required double FinalDistance { get; init; } -} - -public sealed class MccPickupItemsResult -{ - public required string ItemType { get; init; } - public required double Radius { get; init; } - public required int MaxItems { get; init; } - public required bool AllowUnsafe { get; init; } - public required int TimeoutMs { get; init; } - public required int Attempted { get; init; } - public required int SuccessfulPickups { get; init; } - public required int CollectedCount { get; init; } - public int? InitialInventoryCount { get; init; } - public int? FinalInventoryCount { get; init; } - public required int RemainingNearby { get; init; } - public required MccPickupAttempt[] Attempts { get; init; } -} diff --git a/MinecraftClient/Scripting/MccGameResult.cs b/MinecraftClient/Scripting/MccGameResult.cs deleted file mode 100644 index 5639dfc0b4..0000000000 --- a/MinecraftClient/Scripting/MccGameResult.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; - -namespace MinecraftClient.Scripting; - -/// -/// Represents the outcome of a shared MCC game operation. -/// -public class MccGameResult -{ - public bool Success { get; init; } - public string? ErrorCode { get; init; } - public string? Message { get; init; } - - public static MccGameResult Ok(string? message = null) - { - return new MccGameResult - { - Success = true, - Message = message - }; - } - - public static MccGameResult Fail(string errorCode, string? message = null) - { - ArgumentException.ThrowIfNullOrEmpty(errorCode); - return new MccGameResult - { - Success = false, - ErrorCode = errorCode, - Message = message - }; - } -} - -/// -/// Represents the outcome of a shared MCC game operation with typed payload data. -/// -public sealed class MccGameResult : MccGameResult -{ - public T? Data { get; init; } - - public static MccGameResult Ok(T? data, string? message = null) - { - return new MccGameResult - { - Success = true, - Data = data, - Message = message - }; - } - - public static MccGameResult Fail(string errorCode, string? message = null, T? data = default) - { - ArgumentException.ThrowIfNullOrEmpty(errorCode); - return new MccGameResult - { - Success = false, - ErrorCode = errorCode, - Message = message, - Data = data - }; - } -} diff --git a/MinecraftClient/Scripting/MccObservedState.cs b/MinecraftClient/Scripting/MccObservedState.cs deleted file mode 100644 index 5386e3a3ac..0000000000 --- a/MinecraftClient/Scripting/MccObservedState.cs +++ /dev/null @@ -1,205 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; - -namespace MinecraftClient.Scripting; - -/// -/// Represents a recent high-signal runtime event observed by MCC. -/// -public sealed class MccRecentEventEntry -{ - public required long Id { get; init; } - public required DateTimeOffset TimestampUtc { get; init; } - public required string Type { get; init; } - public object? Data { get; init; } -} - -/// -/// Represents a recent chat or system line observed by MCC. -/// -public sealed class MccChatHistoryEntry -{ - public required DateTimeOffset TimestampUtc { get; init; } - public required string Kind { get; init; } - public required string Text { get; init; } - public string? Sender { get; init; } - public string? Message { get; init; } - public string? Json { get; init; } -} - -/// -/// Represents the latest observed world time and weather values. -/// -public sealed class MccRuntimeStateSnapshot -{ - public long? WorldAge { get; init; } - public long? TimeOfDay { get; init; } - public float? RainLevel { get; init; } - public float? ThunderLevel { get; init; } -} - -/// -/// Shared observed-state store populated from ChatBot callbacks and consumed by MCP and bots/scripts. -/// -public static class MccObservedStateStore -{ - private const int MaxEntries = 500; - - private static readonly Lock s_recentEventsLock = new(); - private static readonly Lock s_chatHistoryLock = new(); - private static readonly Lock s_runtimeStateLock = new(); - - private static readonly List s_recentEvents = []; - private static readonly List s_chatHistory = []; - - private static long s_nextRecentEventId = 1; - private static long? s_worldAge; - private static long? s_timeOfDay; - private static float? s_rainLevel; - private static float? s_thunderLevel; - - public static long AddRecentEvent(string type, object? data = null) - { - ArgumentException.ThrowIfNullOrEmpty(type); - - lock (s_recentEventsLock) - { - long id = s_nextRecentEventId++; - s_recentEvents.Add(new MccRecentEventEntry - { - Id = id, - TimestampUtc = DateTimeOffset.UtcNow, - Type = type, - Data = data - }); - - TrimToMaxEntries(s_recentEvents); - return id; - } - } - - public static long GetLatestRecentEventId() - { - lock (s_recentEventsLock) - { - return s_recentEvents.Count > 0 ? s_recentEvents[^1].Id : 0; - } - } - - public static MccRecentEventEntry[] GetRecentEventsAfter(long afterId, int maxCount, string? typeFilter = null) - { - int count = Math.Clamp(maxCount, 1, MaxEntries); - string? normalizedFilter = string.IsNullOrWhiteSpace(typeFilter) ? null : typeFilter.Trim(); - - lock (s_recentEventsLock) - { - return s_recentEvents - .Where(entry => entry.Id > afterId) - .Where(entry => normalizedFilter is null - || entry.Type.Contains(normalizedFilter, StringComparison.OrdinalIgnoreCase)) - .Take(count) - .ToArray(); - } - } - - public static void AddChatHistoryEntry(MccChatHistoryEntry entry) - { - ArgumentNullException.ThrowIfNull(entry); - - lock (s_chatHistoryLock) - { - s_chatHistory.Add(entry); - TrimToMaxEntries(s_chatHistory); - } - } - - public static MccChatHistoryEntry[] GetLatestChatHistory(int maxCount) - { - int count = Math.Clamp(maxCount, 1, MaxEntries); - lock (s_chatHistoryLock) - { - return s_chatHistory.TakeLast(count).ToArray(); - } - } - - public static void SetTime(long worldAge, long timeOfDay) - { - lock (s_runtimeStateLock) - { - s_worldAge = worldAge; - s_timeOfDay = timeOfDay; - } - } - - public static void SetRainLevel(float level) - { - lock (s_runtimeStateLock) - { - s_rainLevel = level; - } - } - - public static void SetThunderLevel(float level) - { - lock (s_runtimeStateLock) - { - s_thunderLevel = level; - } - } - - public static MccRuntimeStateSnapshot GetRuntimeStateSnapshot() - { - lock (s_runtimeStateLock) - { - return new MccRuntimeStateSnapshot - { - WorldAge = s_worldAge, - TimeOfDay = s_timeOfDay, - RainLevel = s_rainLevel, - ThunderLevel = s_thunderLevel - }; - } - } - - public static void ClearRecentEvents() - { - lock (s_recentEventsLock) - { - s_recentEvents.Clear(); - } - } - - public static void ClearChatHistory() - { - lock (s_chatHistoryLock) - { - s_chatHistory.Clear(); - } - } - - public static void ClearRuntimeState() - { - lock (s_runtimeStateLock) - { - s_worldAge = null; - s_timeOfDay = null; - s_rainLevel = null; - s_thunderLevel = null; - } - } - - public static void ClearAll() - { - ClearChatHistory(); - ClearRuntimeState(); - ClearRecentEvents(); - } - - private static void TrimToMaxEntries(List entries) - { - if (entries.Count > MaxEntries) - entries.RemoveRange(0, entries.Count - MaxEntries); - } -} diff --git a/MinecraftClient/Settings.cs b/MinecraftClient/Settings.cs deleted file mode 100644 index c594a33632..0000000000 --- a/MinecraftClient/Settings.cs +++ /dev/null @@ -1,2472 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading; -using MinecraftClient.Protocol; -using MinecraftClient.Proxy; -using Tomlet; -using Tomlet.Attributes; -using Tomlet.Models; -using static MinecraftClient.Settings.AppVarConfigHelper; -using static MinecraftClient.Settings.ChatBotConfigHealper; -using static MinecraftClient.Settings.ChatFormatConfigHelper; -using static MinecraftClient.Settings.ConsoleConfigHealper; -using static MinecraftClient.Settings.HeadCommentHealper; -using static MinecraftClient.Settings.LoggingConfigHealper; -using static MinecraftClient.Settings.MainConfigHelper; -using static MinecraftClient.Settings.MainConfigHelper.MainConfig; -using static MinecraftClient.Settings.MainConfigHelper.MainConfig.AdvancedConfig; -using static MinecraftClient.Settings.MCSettingsConfigHealper; -using static MinecraftClient.Settings.SignatureConfigHelper; - -namespace MinecraftClient -{ - public static class Settings - { - private const int CommentsAlignPosition = 45; - private readonly static Regex CommentRegex = new(@"^(.*)\s?#\s\$([\w\.]+)\$\s*$$", RegexOptions.Compiled); - - // Other Settings - public const string TranslationsFile_Version = "1.19.3"; - public const string TranslationsFile_Website_Index = "https://piston-meta.mojang.com/v1/packages/c492375ded5da34b646b8c5c0842a0028bc69cec/2.json"; - public const string TranslationsFile_Website_Download = "https://resources.download.minecraft.net"; - - public const string TranslationProjectUrl = "https://crowdin.com/project/minecraft-console-client"; - public const int ClientTicksPerSecond = 20; - public const int ClientTickIntervalMilliseconds = 1000 / ClientTicksPerSecond; - - public static GlobalConfig Config = new(); - - public static class InternalConfig - { - public static string ServerIP = String.Empty; - - public static ushort ServerPort = 25565; - - public static AccountInfoConfig Account = new(); - - public static string Username = string.Empty; - - public static string MinecraftVersion = string.Empty; - - public static bool InteractiveMode = true; - - public static bool GravityEnabled = true; - - public static bool KeepAccountSettings = false; - - public static bool KeepServerSettings = false; - } - - public class GlobalConfig - { - [TomlPrecedingComment("$Head$")] - public HeadComment Head - { - get { return HeadCommentHealper.Config; } - set { HeadCommentHealper.Config = value; HeadCommentHealper.Config.OnSettingUpdate(); } - } - - public MainConfig Main - { - get { return MainConfigHelper.Config; } - set { MainConfigHelper.Config = value; MainConfigHelper.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$Signature$")] - public SignatureConfig Signature - { - get { return SignatureConfigHelper.Config; } - set { SignatureConfigHelper.Config = value; SignatureConfigHelper.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$Logging$")] - public LoggingConfig Logging - { - get { return LoggingConfigHealper.Config; } - set { LoggingConfigHealper.Config = value; LoggingConfigHealper.Config.OnSettingUpdate(); } - } - - public ConsoleConfig Console - { - get { return ConsoleConfigHealper.Config; } - set { ConsoleConfigHealper.Config = value; ConsoleConfigHealper.Config.OnSettingUpdate(); } - } - - public AppVarConfig AppVar - { - get { return AppVarConfigHelper.Config; } - set { AppVarConfigHelper.Config = value; AppVarConfigHelper.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$Proxy$")] - public ProxyHandler.Configs Proxy - { - get { return ProxyHandler.Config; } - set { ProxyHandler.Config = value; ProxyHandler.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$MCSettings$")] - public MCSettingsConfig MCSettings - { - get { return MCSettingsConfigHealper.Config; } - set { MCSettingsConfigHealper.Config = value; MCSettingsConfigHealper.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatFormat$")] - public ChatFormatConfig ChatFormat - { - get { return ChatFormatConfigHelper.Config; } - set { ChatFormatConfigHelper.Config = value; ChatFormatConfigHelper.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot$")] - public ChatBotConfig ChatBot - { - get { return ChatBotConfigHealper.Config; } - set { ChatBotConfigHealper.Config = value; } - } - - } - - /// - /// Structured result returned by . - /// - public readonly struct ConfigLoadResult - { - public bool Success { get; init; } - public bool NeedWriteDefault { get; init; } - /// True when a pre-TOML legacy config was detected, backed up, and a fresh default is needed. - public bool IsLegacyUpgrade { get; init; } - /// Non-null when the load failed due to a parse/IO error (not a legacy upgrade). - public string? ErrorMessage { get; init; } - /// Path where the old config was backed up (legacy upgrade case). - public string? LegacyBackupPath { get; init; } - } - - public static ConfigLoadResult LoadFromFile(string filepath, bool keepAccountAndServerSettings = false) - { - bool keepAccountSettings = InternalConfig.KeepAccountSettings; - bool keepServerSettings = InternalConfig.KeepServerSettings; - if (keepAccountAndServerSettings) - InternalConfig.KeepAccountSettings = InternalConfig.KeepServerSettings = true; - - Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; - TomlDocument document; - try - { - document = TomlParser.ParseFile(filepath); - Thread.CurrentThread.CurrentCulture = Program.ActualCulture; - - Config = TomletMain.To(document); - } - catch (Exception ex) - { - Thread.CurrentThread.CurrentCulture = Program.ActualCulture; - try - { - string configString = File.ReadAllText(filepath); - if (configString.Contains("Some settings missing here after an upgrade?")) - { - string newFilePath = Path.ChangeExtension(filepath, ".old.ini"); - File.Copy(filepath, newFilePath, true); - return new ConfigLoadResult - { - Success = false, - NeedWriteDefault = true, - IsLegacyUpgrade = true, - LegacyBackupPath = newFilePath - }; - } - } - catch { } - return new ConfigLoadResult - { - Success = false, - NeedWriteDefault = false, - ErrorMessage = ex.GetFullMessage() - }; - } - finally - { - if (!keepAccountSettings) - InternalConfig.KeepAccountSettings = false; - if (!keepServerSettings) - InternalConfig.KeepServerSettings = false; - } - return new ConfigLoadResult { Success = true, NeedWriteDefault = false }; - } - - public static void WriteToFile(string filepath, bool backupOldFile) - { - Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; - string tomlString = TomletMain.TomlStringFrom(Config); - Thread.CurrentThread.CurrentCulture = Program.ActualCulture; - tomlString = RemoveLegacyAuthServerSection(tomlString); - - string[] tomlList = tomlString.Split('\n'); - StringBuilder newConfig = new(); - foreach (string line in tomlList) - { - Match matchComment = CommentRegex.Match(line); - if (matchComment.Success && matchComment.Groups.Count == 3) - { - string config = matchComment.Groups[1].Value, comment = matchComment.Groups[2].Value; - if (config.Length > 0) - newConfig.Append(config).Append(' ', Math.Max(1, CommentsAlignPosition - config.Length) - 1); - string? comment_trans = ConfigComments.ResourceManager.GetString(comment); - if (string.IsNullOrEmpty(comment_trans)) - newConfig.Append("# ").AppendLine(comment.ReplaceLineEndings()); - else - newConfig.Append("# ").AppendLine(comment_trans.Replace("\n", "\n# ").ReplaceLineEndings()); - } - else - { - newConfig.AppendLine(line); - } - } - - bool needUpdate = true; - byte[] newConfigByte = Encoding.UTF8.GetBytes(newConfig.ToString()); - if (File.Exists(filepath)) - { - try - { - if (new FileInfo(filepath).Length == newConfigByte.Length) - if (File.ReadAllBytes(filepath).SequenceEqual(newConfigByte)) - needUpdate = false; - } - catch { } - } - - if (needUpdate) - { - bool backupSuccessed = true; - if (backupOldFile && File.Exists(filepath)) - { - string backupFilePath = Path.ChangeExtension(filepath, ".backup.ini"); - try { File.Copy(filepath, backupFilePath, true); } - catch (Exception ex) - { - backupSuccessed = false; - ConsoleIO.WriteLineFormatted("§c" + string.Format(Translations.config_backup_fail, backupFilePath)); - ConsoleIO.WriteLine(ex.Message); - } - } - - if (backupSuccessed) - { - try { File.WriteAllBytes(filepath, newConfigByte); } - catch (Exception ex) - { - ConsoleIO.WriteLineFormatted("§c" + string.Format(Translations.config_write_fail, filepath)); - ConsoleIO.WriteLine(ex.Message); - } - } - } - } - - private static string RemoveLegacyAuthServerSection(string tomlString) - { - const string legacySection = "[Main.General.AuthServer]"; - int sectionStart = tomlString.IndexOf(legacySection, StringComparison.Ordinal); - if (sectionStart < 0) - return tomlString; - - int nextSection = tomlString.IndexOf("\n[", sectionStart + legacySection.Length, StringComparison.Ordinal); - return nextSection < 0 - ? tomlString[..sectionStart] - : tomlString.Remove(sectionStart, nextSection - sectionStart + 1); - } - - /// - /// Load settings from the command line - /// - /// Command-line arguments - /// Thrown on invalid arguments - public static void LoadArguments(string[] args) - { - int positionalIndex = 0; - bool skipPassword = false; - - foreach (string argument in args) - { - if (argument.StartsWith("--")) - { - //Load settings as --setting=value and --section.setting=value - if (!argument.Contains('=')) - throw new ArgumentException(string.Format(Translations.error_setting_argument_syntax, argument)); - - string argumentBody = argument[2..]; - int separatorIndex = argumentBody.IndexOf('='); - if (separatorIndex < 1) - throw new ArgumentException(string.Format(Translations.error_setting_argument_syntax, argument)); - - string settingName = argumentBody[..separatorIndex].Trim(); - string settingValue = argumentBody[(separatorIndex + 1)..].Trim(); - - if (!TryApplyArgumentSetting(settingName, settingValue)) - throw new ArgumentException(string.Format(Translations.error_setting_argument_syntax, argument)); - } - else if (argument.StartsWith("-") && argument.Length > 1) - { - //Keep single dash arguments as unsupported for now (future use) - throw new ArgumentException(string.Format(Translations.error_setting_argument_syntax, argument)); - } - else - { - switch (positionalIndex) - { - case 0: - if (Config.Main.Advanced.AccountList.TryGetValue(argument, out AccountInfoConfig accountInfo)) - { - InternalConfig.Account = accountInfo; - skipPassword = true; - } - else - { - InternalConfig.Account.Login = argument; - } - InternalConfig.KeepAccountSettings = true; - break; - case 1: - if (!skipPassword) - InternalConfig.Account.Password = argument; - break; - case 2: - Config.Main.SetServerIP(new MainConfig.ServerInfoConfig(argument), true); - InternalConfig.KeepServerSettings = true; - break; - case 3: - // SingleCommand = argument; - break; - } - positionalIndex++; - } - } - } - - private static readonly string[][] s_argumentSettingSearchPrefixes = - [ - [], - ["Main", "Advanced"], - ["Main", "General"], - ["Main"], - ["Logging"], - ["Console", "General"], - ["Console", "CommandSuggestion"], - ["Console"], - ["MCSettings"], - ["ChatFormat"], - ["ChatBot"], - ["Signature"], - ["Proxy"], - ["AppVar"] - ]; - - private static bool TryApplyArgumentSetting(string settingPath, string settingValue) - { - if (string.IsNullOrWhiteSpace(settingPath)) - return false; - - string[] settingParts = settingPath - .Split('.', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); - - if (settingParts.Length == 0) - return false; - - HashSet triedPaths = new(StringComparer.Ordinal); - foreach (string[] prefix in s_argumentSettingSearchPrefixes) - { - string[] fullPath = [.. prefix, .. settingParts]; - string pathKey = string.Join('.', fullPath.Select(NormalizeArgumentToken)); - if (!triedPaths.Add(pathKey)) - continue; - - if (!TryResolveArgumentSettingPath(fullPath, out object owner, out MemberInfo member, out List objectPath)) - continue; - - if (!TryConvertArgumentValue(settingValue, GetMemberType(member), out object? convertedValue)) - return false; - - if (!TrySetMemberValue(owner, member, convertedValue)) - return false; - - ApplyOnSettingUpdate(objectPath); - return true; - } - - return false; - } - - private static bool TryResolveArgumentSettingPath(string[] fullPath, out object owner, out MemberInfo member, out List objectPath) - { - owner = Config; - objectPath = [owner]; - member = null!; - - for (int i = 0; i < fullPath.Length; i++) - { - if (!TryGetArgumentMember(owner.GetType(), fullPath[i], out MemberInfo currentMember)) - return false; - - if (i == fullPath.Length - 1) - { - member = currentMember; - return true; - } - - object? nextObject = GetMemberValue(owner, currentMember); - if (nextObject is null) - return false; - - owner = nextObject; - objectPath.Add(owner); - } - - return false; - } - - private static bool TryGetArgumentMember(Type ownerType, string token, out MemberInfo member) - { - ArgumentNullException.ThrowIfNull(ownerType); - - string normalizedToken = NormalizeArgumentToken(token); - BindingFlags flags = BindingFlags.Instance | BindingFlags.Public; - - foreach (PropertyInfo property in ownerType.GetProperties(flags)) - { - if (!property.CanRead || !property.CanWrite || property.GetIndexParameters().Length > 0) - continue; - - if (NormalizeArgumentToken(property.Name) == normalizedToken) - { - member = property; - return true; - } - } - - foreach (FieldInfo field in ownerType.GetFields(flags)) - { - if (NormalizeArgumentToken(field.Name) == normalizedToken) - { - member = field; - return true; - } - } - - member = null!; - return false; - } - - private static string NormalizeArgumentToken(string token) - { - return ToLowerIfNeed(token.Replace("_", string.Empty, StringComparison.Ordinal) - .Replace("-", string.Empty, StringComparison.Ordinal)); - } - - private static Type GetMemberType(MemberInfo member) - { - return member switch - { - PropertyInfo property => property.PropertyType, - FieldInfo field => field.FieldType, - _ => throw new ArgumentException($"Unsupported member type: {member.MemberType}", nameof(member)) - }; - } - - private static object? GetMemberValue(object owner, MemberInfo member) - { - return member switch - { - PropertyInfo property => property.GetValue(owner), - FieldInfo field => field.GetValue(owner), - _ => null - }; - } - - private static bool TrySetMemberValue(object owner, MemberInfo member, object? value) - { - switch (member) - { - case PropertyInfo property: - property.SetValue(owner, value); - return true; - case FieldInfo field: - field.SetValue(owner, value); - return true; - default: - return false; - } - } - - private static bool TryConvertArgumentValue(string input, Type targetType, out object? converted) - { - Type effectiveType = Nullable.GetUnderlyingType(targetType) ?? targetType; - - if (effectiveType == typeof(string)) - { - converted = input; - return true; - } - - if (effectiveType == typeof(bool)) - { - bool success = bool.TryParse(input, out bool value); - converted = value; - return success; - } - - if (effectiveType.IsEnum) - { - bool success = Enum.TryParse(effectiveType, input, true, out object? value); - converted = value; - return success; - } - - try - { - converted = Convert.ChangeType(input, effectiveType, CultureInfo.InvariantCulture); - return true; - } - catch (InvalidCastException) - { - converted = null; - return false; - } - catch (FormatException) - { - converted = null; - return false; - } - catch (OverflowException) - { - converted = null; - return false; - } - } - - private static void ApplyOnSettingUpdate(List objectPath) - { - HashSet calledObjects = new(ReferenceEqualityComparer.Instance); - - for (int i = objectPath.Count - 1; i >= 0; i--) - { - object target = objectPath[i]; - if (!calledObjects.Add(target)) - continue; - - MethodInfo? onSettingUpdate = target.GetType().GetMethod(nameof(MainConfig.OnSettingUpdate), BindingFlags.Instance | BindingFlags.Public, []); - onSettingUpdate?.Invoke(target, null); - } - } - - public static class HeadCommentHealper - { - public static HeadComment Config = new(); - - [TomlDoNotInlineObject] - public class HeadComment - { - [TomlProperty("Current Version")] - public string CurrentVersion { get; set; } = Program.BuildInfo ?? "Development Build"; - - [TomlProperty("Latest Version")] - public string LatestVersion { get; set; } = "Unknown"; - - public void OnSettingUpdate() - { - CurrentVersion = Program.BuildInfo ?? "Development Build"; - LatestVersion ??= "Unknown"; - } - } - } - - public static class MainConfigHelper - { - public static MainConfig Config = new(); - - [TomlDoNotInlineObject] - public class MainConfig - { - public GeneralConfig General = new(); - - [TomlPrecedingComment("$Main.Advanced$")] - public AdvancedConfig Advanced = new(); - - - [NonSerialized] - public static readonly string[] AvailableLang = - { - "af_za", "ar_sa", "ast_es", "az_az", "ba_ru", "bar", "be_by", "bg_bg", - "br_fr", "brb", "bs_ba", "ca_es", "cs_cz", "cy_gb", "da_dk", "de_at", - "de_ch", "de_de", "el_gr", "en_au", "en_ca", "en_gb", "en_nz", "en_pt", - "en_ud", "en_us", "enp", "enws", "eo_uy", "es_ar", "es_cl", "es_ec", - "es_es", "es_mx", "es_uy", "es_ve", "esan", "et_ee", "eu_es", "fa_ir", - "fi_fi", "fil_ph", "fo_fo", "fr_ca", "fr_fr", "fra_de", "fur_it", "fy_nl", - "ga_ie", "gd_gb", "gl_es", "haw_us", "he_il", "hi_in", "hr_hr", "hu_hu", - "hy_am", "id_id", "ig_ng", "io_en", "is_is", "isv", "it_it", "ja_jp", - "jbo_en", "ka_ge", "kk_kz", "kn_in", "ko_kr", "ksh", "kw_gb", "la_la", - "lb_lu", "li_li", "lmo", "lol_us", "lt_lt", "lv_lv", "lzh", "mk_mk", - "mn_mn", "ms_my", "mt_mt", "nah", "nds_de", "nl_be", "nl_nl", "nn_no", - "no_no", "oc_fr", "ovd", "pl_pl", "pt_br", "pt_pt", "qya_aa", "ro_ro", - "rpr", "ru_ru", "ry_ua", "se_no", "sk_sk", "sl_si", "so_so", "sq_al", - "sr_sp", "sv_se", "sxu", "szl", "ta_in", "th_th", "tl_ph", "tlh_aa", - "tok", "tr_tr", "tt_ru", "uk_ua", "val_es", "vec_it", "vi_vn", "yi_de", - "yo_ng", "zh_cn", "zh_hk", "zh_tw", "zlm_arab" - }; - - /// - /// Load server information in ServerIP and ServerPort variables from a "serverip:port" couple or server alias - /// - /// True if the server IP was valid and loaded, false otherwise - public bool SetServerIP(ServerInfoConfig serverInfo, bool checkAlias) - { - string[] sip = serverInfo.Host.Split(new[] { ":", ":" }, StringSplitOptions.None); - string host = ToLowerIfNeed(sip[0]); - ushort port = 25565; - - if (serverInfo.Port.HasValue) - { - port = serverInfo.Port.Value; - } - else if (sip.Length > 1) - { - try { port = Convert.ToUInt16(sip[1]); } - catch (FormatException) { return false; } - } - - if (host == "localhost" || host.Contains('.')) - { - //Server IP (IP or domain names contains at least a dot) - if (sip.Length == 1 && !serverInfo.Port.HasValue && host.Contains('.') && host.Any(c => char.IsLetter(c)) && - Settings.Config.Main.Advanced.ResolveSrvRecords != ResolveSrvRecordType.no) - //Domain name without port may need Minecraft SRV Record lookup - ProtocolHandler.MinecraftServiceLookup(ref host, ref port); - InternalConfig.ServerIP = host; - InternalConfig.ServerPort = port; - return true; - } - else if (checkAlias && Advanced.ServerList.TryGetValue(sip[0], out ServerInfoConfig serverStr2)) - { - return SetServerIP(serverStr2, false); - } - - return false; - } - - public void OnSettingUpdate() - { - ConsoleIO.EnableTimestamps = Advanced.Timestamps; - - InternalConfig.InteractiveMode = !Advanced.ExitOnFailure; - - General.Account.Login ??= string.Empty; - General.Account.Password ??= string.Empty; - if (!General.MigrateLegacyAuthServer()) - ConsoleIO.WriteLogLine(Translations.config_auth_server_url_invalid); - if (!InternalConfig.KeepAccountSettings) - { - if (Advanced.AccountList.TryGetValue(General.Account.Login, out AccountInfoConfig account)) - InternalConfig.Account = account; - else - InternalConfig.Account = General.Account; - } - - General.Server.Host ??= string.Empty; - - if (Advanced.MessageCooldown < 0) - Advanced.MessageCooldown = 0; - - if (Advanced.MaxChatMessageLength < 0) - Advanced.MaxChatMessageLength = 0; - else if (Advanced.MaxChatMessageLength > 32767) - Advanced.MaxChatMessageLength = 32767; - - if (Advanced.MaxChatMessageLength > 0) - ConsoleIO.WriteLineFormatted("§e[Settings] MaxChatMessageLength is set to " + Advanced.MaxChatMessageLength + ". Setting this incorrectly may cause you to be kicked from the server."); - - if (Advanced.TcpTimeout < 1) - Advanced.TcpTimeout = 1; - - Advanced.ForgeModTranslationPath = Advanced.ForgeModTranslationPath.Trim(); - - if (Advanced.MovementSpeed < 1) - Advanced.MovementSpeed = 1; - - if (!Advanced.LoadMccTranslation) - { - CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US"); - CultureInfo.DefaultThreadCurrentCulture = culture; - CultureInfo.DefaultThreadCurrentUICulture = culture; - Program.ActualCulture = culture; - Thread.CurrentThread.CurrentCulture = culture; - Thread.CurrentThread.CurrentUICulture = culture; - } - - Advanced.Language = Regex.Replace(Advanced.Language, @"[^-^_^\w^*\d]", string.Empty).Replace('-', '_'); - Advanced.Language = ToLowerIfNeed(Advanced.Language); - if (!AvailableLang.Contains(Advanced.Language)) - { - Advanced.Language = GetDefaultGameLanguage(); - ConsoleIO.WriteLogLine("[Settings] " + Translations.config_Main_Advanced_language_invaild); - } - - if (!InternalConfig.KeepServerSettings) - { - if (!string.IsNullOrWhiteSpace(General.Server.Host)) - { - string[] sip = General.Server.Host.Split(new[] { ":", ":" }, StringSplitOptions.None); - General.Server.Host = sip[0]; - InternalConfig.ServerIP = General.Server.Host; - - if (sip.Length > 1) - { - try { General.Server.Port = Convert.ToUInt16(sip[1]); } - catch (FormatException) { } - } - } - - if (General.Server.Port.HasValue) - InternalConfig.ServerPort = General.Server.Port.Value; - else - SetServerIP(General.Server, true); - } - - for (int i = 0; i < Advanced.BotOwners.Count; ++i) - Advanced.BotOwners[i] = ToLowerIfNeed(Advanced.BotOwners[i]); - - if (Advanced.MinTerminalWidth < 1) - Advanced.MinTerminalWidth = 1; - if (Advanced.MinTerminalHeight < 1) - Advanced.MinTerminalHeight = 1; - - if (Advanced.TemporaryFixBadpacket && !Advanced.TerrainAndMovements) - { - Advanced.TerrainAndMovements = true; - ConsoleIO.WriteLineFormatted("§c[Settings]You need to enable TerrainAndMovements before enabling TemporaryFixBadpacket."); - } - } - - [TomlDoNotInlineObject] - public class GeneralConfig - { - [TomlInlineComment("$Main.General.account$")] - public AccountInfoConfig Account = new(string.Empty, string.Empty); - - [TomlInlineComment("$Main.General.login$")] - public ServerInfoConfig Server = new(string.Empty); - - [TomlInlineComment("$Main.General.server_info$")] - public LoginType AccountType = LoginType.microsoft; - - [TomlInlineComment("$Main.General.method$")] - public LoginMethod Method = LoginMethod.mcc; - - [TomlInlineComment("$Main.General.AuthServerUrl$")] - public string AuthServerUrl = string.Empty; - - // Retained only to deserialize pre-URL configs. WriteToFile() removes this legacy section. - [TomlInlineComment("$Main.General.AuthlibServer$")] - public AuthlibServer AuthServer = new(); - - [TomlInlineComment("$Main.General.AuthlibUser$")] - public string AuthUser = ""; - - public bool MigrateLegacyAuthServer() - { - AuthServerUrl ??= string.Empty; - if (TrySetAuthServerUrl(AuthServerUrl)) - return true; - - if (!string.IsNullOrWhiteSpace(AuthServerUrl)) - return false; - - if (!string.IsNullOrWhiteSpace(AuthServer.Host)) - { - string path = AuthServer.AuthlibInjectorAPIPath ?? string.Empty; - if (!path.StartsWith('/')) - path = '/' + path; - - string legacyUrl = $"{(AuthServer.UseHttps ? "https" : "http")}://{AuthServer.Host}:{AuthServer.Port}{path}"; - return TrySetAuthServerUrl(legacyUrl); - } - - return true; - } - - public bool TrySetAuthServerUrl(string url) - { - if (!TryGetNormalizedAuthServerUri(url, out Uri? authServerUri)) - return false; - - AuthServerUrl = authServerUri.AbsoluteUri; - return true; - } - - public bool TryGetAuthServerUri([NotNullWhen(true)] out Uri? authServerUri) - => TryGetNormalizedAuthServerUri(AuthServerUrl, out authServerUri); - - private static bool TryGetNormalizedAuthServerUri(string? url, [NotNullWhen(true)] out Uri? authServerUri) - { - authServerUri = null; - if (!Uri.TryCreate(url?.Trim(), UriKind.Absolute, out Uri? parsedUri) - || (!parsedUri.Scheme.Equals(Uri.UriSchemeHttp, StringComparison.OrdinalIgnoreCase) - && !parsedUri.Scheme.Equals(Uri.UriSchemeHttps, StringComparison.OrdinalIgnoreCase)) - || string.IsNullOrWhiteSpace(parsedUri.Host) - || !string.IsNullOrEmpty(parsedUri.UserInfo) - || !string.IsNullOrEmpty(parsedUri.Query) - || !string.IsNullOrEmpty(parsedUri.Fragment)) - { - return false; - } - - var builder = new UriBuilder(parsedUri) - { - Path = parsedUri.AbsolutePath.TrimEnd('/') + "/" - }; - authServerUri = builder.Uri; - return true; - } - - public enum LoginType { mojang, microsoft, yggdrasil }; - - public enum LoginMethod { mcc, browser }; - } - - [TomlDoNotInlineObject] - public class AdvancedConfig - { - [TomlInlineComment("$Main.Advanced.enable_sentry$")] - public bool EnableSentry = true; - - [TomlInlineComment("$Main.Advanced.language$")] - public string Language = "en_us"; - - [TomlInlineComment("$Main.Advanced.LoadMccTrans$")] - public bool LoadMccTranslation = true; - - [TomlInlineComment("$Main.Advanced.load_resourcepack_translations$")] - public bool LoadResourcePackTranslations = true; - - [TomlInlineComment("$Main.Advanced.load_forge_mod_translations$")] - public bool LoadForgeModTranslations = false; - - [TomlInlineComment("$Main.Advanced.auto_discover_forge_mod_translation_sources$")] - public bool AutoDiscoverForgeModTranslationSources = true; - - [TomlInlineComment("$Main.Advanced.forge_mod_translation_path$")] - public string ForgeModTranslationPath = ""; - - // [TomlInlineComment("$Main.Advanced.console_title$")] - public string ConsoleTitle = "%username%@%serverip% - Minecraft Console Client"; - - [TomlInlineComment("$Main.Advanced.internal_cmd_char$")] - public InternalCmdCharType InternalCmdChar = InternalCmdCharType.slash; - - [TomlInlineComment("$Main.Advanced.message_cooldown$")] - public double MessageCooldown = 1.0; - - [TomlInlineComment("$Main.Advanced.max_chat_message_length$")] - public int MaxChatMessageLength = 0; - - [TomlInlineComment("$Main.Advanced.bot_owners$")] - public List BotOwners = new() { "Player1", "Player2" }; - - [TomlInlineComment("$Main.Advanced.mc_version$")] - public string MinecraftVersion = "auto"; - - [TomlInlineComment("$Main.Advanced.mc_forge$")] - public ForgeConfigType EnableForge = ForgeConfigType.no; - - [TomlInlineComment("$Main.Advanced.brand_info$")] - public BrandInfoType BrandInfo = BrandInfoType.mcc; - - [TomlInlineComment("$Main.Advanced.chatbot_log_file$")] - public string ChatbotLogFile = ""; - - [TomlInlineComment("$Main.Advanced.private_msgs_cmd_name$")] - public string PrivateMsgsCmdName = "tell"; - - [TomlInlineComment("$Main.Advanced.show_system_messages$")] - public bool ShowSystemMessages = true; - - [TomlInlineComment("$Main.Advanced.show_xpbar_messages$")] - public bool ShowXPBarMessages = true; - - [TomlInlineComment("$Main.Advanced.show_chat_links$")] - public bool ShowChatLinks = true; - - [TomlInlineComment("$Main.Advanced.show_inventory_layout$")] - public bool ShowInventoryLayout = true; - - [TomlInlineComment("$Main.Advanced.show_effect_messages$")] - public bool ShowEffectMessages = true; - - [TomlInlineComment("$Main.Advanced.show_effect_names_in_tui$")] - public bool ShowEffectNamesInTUI = false; - - [TomlInlineComment("$Main.Advanced.show_github_star_reminder$")] - public bool ShowGithubStarReminder = true; - - [TomlInlineComment("$Main.Advanced.terrain_and_movements$")] - public bool TerrainAndMovements = false; - - [TomlInlineComment("$Main.Advanced.move_head_while_walking$")] - public bool MoveHeadWhileWalking = true; - - [TomlInlineComment("$Main.Advanced.movement_speed$")] - public int MovementSpeed = 2; - - [TomlInlineComment("$Main.Advanced.temporary_fix_badpacket$")] - public bool TemporaryFixBadpacket = false; - - [TomlInlineComment("$Main.Advanced.inventory_handling$")] - public bool InventoryHandling = false; - - [TomlInlineComment("$Main.Advanced.entity_handling$")] - public bool EntityHandling = false; - - [TomlInlineComment("$Main.Advanced.session_cache$")] - public CacheType SessionCache = CacheType.disk; - - [TomlInlineComment("$Main.Advanced.profilekey_cache$")] - public CacheType ProfileKeyCache = CacheType.disk; - - [TomlInlineComment("$Main.Advanced.resolve_srv_records$")] - public ResolveSrvRecordType ResolveSrvRecords = ResolveSrvRecordType.fast; - - [TomlPrecedingComment("$Main.Advanced.account_list$")] - public Dictionary AccountList = new() { - { "AccountNikename1", new AccountInfoConfig("playerone@email.com", "thepassword") }, - { "AccountNikename2", new AccountInfoConfig("TestBot", "-") }, - }; - - [TomlPrecedingComment("$Main.Advanced.server_list$")] - public Dictionary ServerList = new() { - { "ServerAlias1", new ServerInfoConfig("mc.awesomeserver.com") }, - { "ServerAlias2", new ServerInfoConfig("192.168.1.27", 12345) }, - }; - - [TomlInlineComment("$Main.Advanced.player_head_icon$")] - public bool PlayerHeadAsIcon = true; - - [TomlInlineComment("$Main.Advanced.exit_on_failure$")] - public bool ExitOnFailure = false; - - [TomlInlineComment("$Main.Advanced.script_cache$")] - public bool CacheScript = true; - - [TomlInlineComment("$Main.Advanced.timestamps$")] - public bool Timestamps = false; - - [TomlInlineComment("$Main.Advanced.auto_respawn$")] - public bool AutoRespawn = false; - - [TomlInlineComment("$Main.Advanced.minecraft_realms$")] - public bool MinecraftRealms = false; - - [TomlInlineComment("$Main.Advanced.timeout$")] - public int TcpTimeout = 30; - - [TomlInlineComment("$Main.Advanced.enable_emoji$")] - public bool EnableEmoji = true; - - [TomlInlineComment("$Main.Advanced.MinTerminalWidth$")] - public int MinTerminalWidth = 16; - - [TomlInlineComment("$Main.Advanced.MinTerminalHeight$")] - public int MinTerminalHeight = 10; - - [TomlInlineComment("$Main.Advanced.ignore_invalid_playername$")] - public bool IgnoreInvalidPlayerName = true; - - /// - /// Load login/password using an account alias - /// - /// True if the account was found and loaded - public bool SetAccount(string accountAlias) - { - if (AccountList.TryGetValue(accountAlias, out AccountInfoConfig accountInfo)) - { - InternalConfig.Account = accountInfo; - return true; - } - else - { - return false; - } - } - - public enum InternalCmdCharType { none, slash, backslash }; - - public enum BrandInfoType { mcc, vanilla, empty }; - - public enum CacheType { none, memory, disk }; - - public enum ResolveSrvRecordType { no, fast, yes }; - - public enum ForgeConfigType { no, auto, force }; - } - - public struct AccountInfoConfig - { - public string Login = string.Empty, Password = string.Empty; - - public AccountInfoConfig() - { - Login = string.Empty; - Password = string.Empty; - } - - public AccountInfoConfig(string Login) - { - this.Login = Login; - this.Password = "-"; - } - - public AccountInfoConfig(string Login, string Password) - { - this.Login = Login; - this.Password = Password; - } - } - - public struct ServerInfoConfig - { - public string Host = string.Empty; - public ushort? Port = null; - - public ServerInfoConfig() - { - Host = string.Empty; - Port = null; - } - - public ServerInfoConfig(string Host) - { - string[] sip = Host.Split(new[] { ":", ":" }, StringSplitOptions.None); - this.Host = sip[0]; - - if (sip.Length > 1) - { - try { this.Port = Convert.ToUInt16(sip[1]); } - catch (FormatException) { } - } - } - - public ServerInfoConfig(string Host, ushort Port) - { - this.Host = Host.Split(new[] { ":", ":" }, StringSplitOptions.None)[0]; - this.Port = Port; - } - } - [TomlDoNotInlineObject] - public class AuthlibServer - { - [NonSerialized] - private string _host = string.Empty; - - [TomlInlineComment("$AuthlibServer.Host$")] - public string Host - { - get => _host; - set - { - string[] split = value.Split(new[] { ":", ":" }, StringSplitOptions.None); - if (split.Length >= 1) - _host = split[0]; - if (split.Length >= 2) - { - try { Port = Convert.ToUInt16(split[1]); } - catch (FormatException) { } - } - } - } - - [TomlInlineComment("$AuthlibServer.Port$")] - public int Port = 443; - - [TomlInlineComment("$AuthlibServer.AuthlibInjectorAPIPath$")] - public string AuthlibInjectorAPIPath = "/api/yggdrasil"; - - [TomlInlineComment("$AuthlibServer.UseHttps$")] - public bool UseHttps = true; - - - } - } - } - - public static class SignatureConfigHelper - { - public static SignatureConfig Config = new(); - - [TomlDoNotInlineObject] - public class SignatureConfig - { - [TomlInlineComment("$Signature.LoginWithSecureProfile$")] - public bool LoginWithSecureProfile = true; - - [TomlInlineComment("$Signature.SignChat$")] - public bool SignChat = true; - - [TomlInlineComment("$Signature.SignMessageInCommand$")] - public bool SignMessageInCommand = true; - - [TomlInlineComment("$Signature.MarkLegallySignedMsg$")] - public bool MarkLegallySignedMsg = true; - - [TomlInlineComment("$Signature.MarkModifiedMsg$")] - public bool MarkModifiedMsg = true; - - [TomlInlineComment("$Signature.MarkIllegallySignedMsg$")] - public bool MarkIllegallySignedMsg = true; - - [TomlInlineComment("$Signature.MarkSystemMessage$")] - public bool MarkSystemMessage = true; - - [TomlInlineComment("$Signature.ShowModifiedChat$")] - public bool ShowModifiedChat = true; - - [TomlInlineComment("$Signature.ShowIllegalSignedChat$")] - public bool ShowIllegalSignedChat = true; - - public void OnSettingUpdate() { } - } - } - - public static class LoggingConfigHealper - { - public static LoggingConfig Config = new(); - - [TomlDoNotInlineObject] - public class LoggingConfig - { - [TomlInlineComment("$Logging.DebugMessages$")] - public bool DebugMessages = false; - - [TomlInlineComment("$Logging.PacketDebugMessages$")] - public bool PacketDebugMessages = false; - - [TomlInlineComment("$Logging.PacketDebugExclusions$")] - public List PacketDebugExclusions = new(); - - [TomlInlineComment("$Logging.ChatMessages$")] - public bool ChatMessages = true; - - [TomlInlineComment("$Logging.InfoMessages$")] - public bool InfoMessages = true; - - [TomlInlineComment("$Logging.WarningMessages$")] - public bool WarningMessages = true; - - [TomlInlineComment("$Logging.ErrorMessages$")] - public bool ErrorMessages = true; - - [TomlInlineComment("$Logging.ChatFilter$")] - public string ChatFilterRegex = @".*"; - - [TomlInlineComment("$Logging.DebugFilter$")] - public string DebugFilterRegex = @".*"; - - [TomlInlineComment("$Logging.FilterMode$")] - public FilterModeEnum FilterMode = FilterModeEnum.disable; - - [TomlInlineComment("$Logging.LogToFile$")] - public bool LogToFile = false; - - [TomlInlineComment("$Logging.LogFile$")] - public string LogFile = @"console-log.txt"; - - [TomlInlineComment("$Logging.PrependTimestamp$")] - public bool PrependTimestamp = false; - - [TomlInlineComment("$Logging.SaveColorCodes$")] - public bool SaveColorCodes = false; - - public void OnSettingUpdate() { } - - public enum FilterModeEnum { disable, blacklist, whitelist } - } - } - - public static class ConsoleConfigHealper - { - public static ConsoleConfig Config = new(); - - [TomlDoNotInlineObject] - public class ConsoleConfig - { - public MainConfig General = new(); - - [TomlPrecedingComment("$Console.CommandSuggestion$")] - public CommandSuggestionConfig CommandSuggestion = new(); - - [TomlPrecedingComment("$Console.Minimap$")] - public MinimapConfig Minimap = new(); - - [TomlPrecedingComment("$Console.TabList$")] - public TabListConfig TabList = new(); - - public void OnSettingUpdate() - { - ConsoleIO.ChatVisible = General.Display_Chat; - - var backend = ConsoleIO.Backend; - if (backend == null) return; - - backend.DisplayUserInput = General.Display_Input; - backend.SetBackreadBufferLimit(General.History_Input_Records); - - if (backend is ClassicConsoleBackend classic) - { - classic.EnableWriterColor = General.ConsoleColorMode != ConsoleColorModeType.disable; - classic.UseVT100ColorCode = General.ConsoleColorMode != ConsoleColorModeType.legacy_4bit; - - if (General.ConsoleColorMode == ConsoleColorModeType.disable) - CommandSuggestion.Enable_Color = false; - - classic.EnableSuggestionColor = CommandSuggestion.Enable_Color; - classic.Enable24bitColor = General.ConsoleColorMode == ConsoleColorModeType.vt100_24bit; - classic.UseBasicArrow = CommandSuggestion.Use_Basic_Arrow; - - CommandSuggestion.Max_Suggestion_Width = - classic.SetMaxSuggestionLength(CommandSuggestion.Max_Suggestion_Width); - CommandSuggestion.Max_Displayed_Suggestions = - classic.SetMaxSuggestionCount(CommandSuggestion.Max_Displayed_Suggestions); - - if (!CheckColorCode(CommandSuggestion.Text_Color)) - { - ConsoleIO.WriteLine(string.Format(Translations.config_commandsuggestion_illegal_color, "CommandSuggestion.TextColor", CommandSuggestion.Text_Color)); - CommandSuggestion.Text_Color = "#f8fafc"; - } - if (!CheckColorCode(CommandSuggestion.Text_Background_Color)) - { - ConsoleIO.WriteLine(string.Format(Translations.config_commandsuggestion_illegal_color, "CommandSuggestion.TextBackgroundColor", CommandSuggestion.Text_Background_Color)); - CommandSuggestion.Text_Background_Color = "#64748b"; - } - if (!CheckColorCode(CommandSuggestion.Highlight_Text_Color)) - { - ConsoleIO.WriteLine(string.Format(Translations.config_commandsuggestion_illegal_color, "CommandSuggestion.HighlightTextColor", CommandSuggestion.Highlight_Text_Color)); - CommandSuggestion.Highlight_Text_Color = "#334155"; - } - if (!CheckColorCode(CommandSuggestion.Highlight_Text_Background_Color)) - { - ConsoleIO.WriteLine(string.Format(Translations.config_commandsuggestion_illegal_color, "CommandSuggestion.HighlightTextBackgroundColor", CommandSuggestion.Highlight_Text_Background_Color)); - CommandSuggestion.Highlight_Text_Background_Color = "#fde047"; - } - if (!CheckColorCode(CommandSuggestion.Tooltip_Color)) - { - ConsoleIO.WriteLine(string.Format(Translations.config_commandsuggestion_illegal_color, "CommandSuggestion.TooltipColor", CommandSuggestion.Tooltip_Color)); - CommandSuggestion.Tooltip_Color = "#7dd3fc"; - } - if (!CheckColorCode(CommandSuggestion.Highlight_Tooltip_Color)) - { - ConsoleIO.WriteLine(string.Format(Translations.config_commandsuggestion_illegal_color, "CommandSuggestion.HighlightTooltipColor", CommandSuggestion.Highlight_Tooltip_Color)); - CommandSuggestion.Highlight_Tooltip_Color = "#3b82f6"; - } - if (!CheckColorCode(CommandSuggestion.Arrow_Symbol_Color)) - { - ConsoleIO.WriteLine(string.Format(Translations.config_commandsuggestion_illegal_color, "CommandSuggestion.ArrowSymbolColor", CommandSuggestion.Arrow_Symbol_Color)); - CommandSuggestion.Arrow_Symbol_Color = "#d1d5db"; - } - - classic.SetSuggestionColors( - CommandSuggestion.Text_Color, CommandSuggestion.Text_Background_Color, - CommandSuggestion.Highlight_Text_Color, CommandSuggestion.Highlight_Text_Background_Color, - CommandSuggestion.Tooltip_Color, CommandSuggestion.Highlight_Tooltip_Color, - CommandSuggestion.Arrow_Symbol_Color); - } - } - - private static bool CheckColorCode(string? input) - { - if (string.IsNullOrWhiteSpace(input)) - return false; - if (input.Length < 6 || input.Length > 7) - return false; - if (input.Length == 6 && input[0] == '#') - return false; - if (input.Length == 7 && input[0] != '#') - return false; - try - { - Convert.ToInt32(input.Length == 7 ? input[1..] : input, 16); - return true; - } - catch - { - return false; - } - } - - [TomlDoNotInlineObject] - public class MainConfig - { - [TomlInlineComment("$Console.General.ConsoleMode$")] - public ConsoleModeType ConsoleMode = ConsoleModeType.classic; - - [TomlInlineComment("$Console.General.ConsoleColorMode$")] - public ConsoleColorModeType ConsoleColorMode = ConsoleColorModeType.vt100_24bit; - - [TomlInlineComment("$Console.General.Display_Icon_Banner$")] - public bool Display_Icon_Banner = true; - - [TomlInlineComment("$Console.General.Display_Input$")] - public bool Display_Input = true; - - [TomlInlineComment("$Console.General.Display_Chat$")] - public bool Display_Chat = true; - - [TomlInlineComment("$Console.General.History_Input_Records$")] - public int History_Input_Records = 32; - - [TomlInlineComment("$Console.General.TUI_Log_Scrollback$")] - public int TUI_Log_Scrollback = 0; - } - - [TomlDoNotInlineObject] - public class CommandSuggestionConfig - { - [TomlInlineComment("$Console.CommandSuggestion.Enable$")] - public bool Enable = true; - - public bool Enable_Color = true; - - [TomlInlineComment("$Console.CommandSuggestion.Use_Basic_Arrow$")] - public bool Use_Basic_Arrow = false; - - public int Max_Suggestion_Width = 30; - - public int Max_Displayed_Suggestions = 10; - - public string Text_Color = "#f8fafc"; - - public string Text_Background_Color = "#64748b"; - - public string Highlight_Text_Color = "#334155"; - - public string Highlight_Text_Background_Color = "#fde047"; - - public string Tooltip_Color = "#7dd3fc"; - - public string Highlight_Tooltip_Color = "#3b82f6"; - - public string Arrow_Symbol_Color = "#d1d5db"; - } - - public enum ConsoleModeType { classic, tui }; - public enum ConsoleColorModeType { disable, legacy_4bit, vt100_4bit, vt100_8bit, vt100_24bit }; - - [TomlDoNotInlineObject] - public class MinimapConfig - { - [TomlInlineComment("$Console.Minimap.Enabled$")] - public bool Enabled = false; - - [TomlInlineComment("$Console.Minimap.Zoom$")] - public int Zoom = Tui.MinimapControl.DefaultZoom; - - [TomlInlineComment("$Console.Minimap.Width$")] - public int Width = Tui.MinimapControl.DefaultWidth; - - [TomlInlineComment("$Console.Minimap.Height$")] - public int Height = Tui.MinimapControl.DefaultHeight; - - [TomlInlineComment("$Console.Minimap.Position$")] - public Tui.MinimapPosition Position = Tui.MinimapPosition.top_right; - - [TomlInlineComment("$Console.Minimap.ShowPlayerNames$")] - public bool ShowPlayerNames = false; - - [TomlInlineComment("$Console.Minimap.ShowHostileNames$")] - public bool ShowHostileNames = false; - - [TomlInlineComment("$Console.Minimap.ShowNeutralNames$")] - public bool ShowNeutralNames = false; - - [TomlInlineComment("$Console.Minimap.ShowPassiveNames$")] - public bool ShowPassiveNames = false; - - [TomlInlineComment("$Console.Minimap.RefreshInterval$")] - public int RefreshInterval = Tui.MinimapControl.DefaultRefreshMs; - - [TomlInlineComment("$Console.Minimap.CaveMode$")] - public Tui.CaveModeOption CaveMode = Tui.CaveModeOption.auto; - - public void OnSettingUpdate() - { - Zoom = Math.Clamp(Zoom, Tui.MinimapControl.MinZoom, Tui.MinimapControl.MaxZoom); - Width = Math.Clamp(Width, 10, 120); - Height = Math.Clamp(Height, 4, 80); - if (Height % 2 != 0) Height++; - RefreshInterval = Math.Clamp(RefreshInterval, - Tui.MinimapControl.MinRefreshMs, Tui.MinimapControl.MaxRefreshMs); - } - } - - [TomlDoNotInlineObject] - public class TabListConfig - { - [TomlInlineComment("$Console.TabList.ShowTeams$")] - public bool ShowTeams = false; - } - } - } - - public static class AppVarConfigHelper - { - public static AppVarConfig Config = new(); - - [TomlDoNotInlineObject] - public class AppVarConfig - { - [TomlPrecedingComment("$AppVars.Variables$")] - private readonly Dictionary VarStirng = new() { - { "your_var", "your_value" }, - { "your var 2", "your value 2" }, - }; - - public void OnSettingUpdate() { } - - - [NonSerialized] - private readonly Dictionary VarObject = new(); - - [NonSerialized] - readonly Lock varLock = new(); - - private static bool TryGetReadOnlyVar(string varName, [NotNullWhen(true)] out object? varData) - { - switch (Settings.ToLowerIfNeed(varName)) - { - case "username": - varData = InternalConfig.Username; - return true; - case "login": - varData = InternalConfig.Account.Login; - return true; - case "serverip": - varData = InternalConfig.ServerIP; - return true; - case "serverport": - varData = InternalConfig.ServerPort; - return true; - case "datetime": - varData = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - return true; - case "date": - varData = DateTime.Now.ToString("yyyy-MM-dd"); - return true; - case "players": - varData = string.Join(", ", McClient.Instance?.GetOnlinePlayers() ?? []); - return true; - default: - varData = null; - return false; - } - } - - /// - /// Set a custom %variable% which will be available through expandVars() - /// - /// Name of the variable - /// Value of the variable - /// True if the parameters were valid - public bool SetVar(string varName, object varData) - { - varName = Settings.ToLowerIfNeed(new string(varName.TakeWhile(char.IsLetterOrDigit).ToArray())); - if (varName.Length > 0) - { - bool isString = varData.GetType() == typeof(string); - lock (varLock) - { - if (isString) - { - if (VarObject.ContainsKey(varName)) - VarObject.Remove(varName); - VarStirng[varName] = (string)varData; - } - else - { - if (VarStirng.ContainsKey(varName)) - VarStirng.Remove(varName); - VarObject[varName] = varData; - } - } - return true; - } - else - { - return false; - } - } - - /// - /// Get a custom %variable% or null if the variable does not exist - /// - /// Variable name - /// The value or null if the variable does not exists - public object? GetVar(string varName) - { - if (TryGetReadOnlyVar(varName, out object? readOnlyVar)) - return readOnlyVar; - if (VarStirng.TryGetValue(varName, out string? valueString)) - return valueString; - else if (VarObject.TryGetValue(varName, out object? valueObject)) - return valueObject; - else - return null; - } - - /// - /// Get a custom %variable% or null if the variable does not exist - /// - /// Variable name - /// The value or null if the variable does not exists - public bool TryGetVar(string varName, [NotNullWhen(true)] out object? varData) - { - if (TryGetReadOnlyVar(varName, out varData)) - return true; - if (VarStirng.TryGetValue(varName, out string? valueString)) - { - varData = valueString; - return true; - } - else if (VarObject.TryGetValue(varName, out object? valueObject)) - { - varData = valueObject; - return true; - } - else - { - varData = null; - return false; - } - } - - /// - /// Get a dictionary containing variables (names and value) - /// - /// A IDictionary containing a name and a vlaue key pairs of variables - public Dictionary GetVariables() - { - Dictionary res = new(VarObject); - foreach ((string varName, string varData) in VarStirng) - res.Add(varName, varData); - return res; - } - - /// - /// Replace %variables% with their value from global AppVars - /// - /// String to parse - /// Optional local variables overriding global variables - /// Modifier string - public string ExpandVars(string str, Dictionary? localVars = null) - { - StringBuilder result = new(); - for (int i = 0; i < str.Length; i++) - { - if (str[i] == '%') - { - bool varname_ok = false; - StringBuilder var_name = new(); - - for (int j = i + 1; j < str.Length; j++) - { - if (!char.IsLetterOrDigit(str[j]) && str[j] != '_') - { - if (str[j] == '%') - varname_ok = var_name.Length > 0; - break; - } - else var_name.Append(str[j]); - } - - if (varname_ok) - { - string varname = var_name.ToString(); - string varname_lower = Settings.ToLowerIfNeed(varname); - i = i + varname.Length + 1; - - if (TryGetReadOnlyVar(varname_lower, out object? readOnlyVar)) - { - result.Append(readOnlyVar.ToString()); - } - else if (localVars is not null && localVars.ContainsKey(varname_lower)) - { - result.Append(localVars[varname_lower].ToString()); - } - else if (TryGetVar(varname_lower, out object? var_value)) - { - result.Append(var_value.ToString()); - } - else - { - result.Append("%" + varname + '%'); - } - } - else result.Append(str[i]); - } - else result.Append(str[i]); - } - return result.ToString(); - } - } - } - - public static class MCSettingsConfigHealper - { - public static MCSettingsConfig Config = new(); - - [TomlDoNotInlineObject] - public class MCSettingsConfig - { - [TomlInlineComment("$MCSettings.Enabled$")] - public bool Enabled = true; - - [TomlInlineComment("$MCSettings.Locale$")] - public string Locale = "en_US"; - - [TomlInlineComment("$MCSettings.RenderDistance$")] - public byte RenderDistance = 8; - - [TomlInlineComment("$MCSettings.Difficulty$")] - public DifficultyType Difficulty = DifficultyType.peaceful; - - [TomlInlineComment("$MCSettings.ChatMode$")] - public ChatModeType ChatMode = ChatModeType.enabled; - - [TomlInlineComment("$MCSettings.ChatColors$")] - public bool ChatColors = true; - - [TomlInlineComment("$MCSettings.MainHand$")] - public MainHandType MainHand = MainHandType.left; - - public SkinInfo Skin = new(); - - public void OnSettingUpdate() { } - - public enum DifficultyType { peaceful, easy, normal, difficult }; - - public enum ChatModeType { enabled, commands, disabled }; - - public enum MainHandType { left, right }; - - public struct SkinInfo - { - public bool Cape = true, Hat = true, Jacket = false; - public bool Sleeve_Left = false, Sleeve_Right = false; - public bool Pants_Left = false, Pants_Right = false; - - public SkinInfo() { } - - public SkinInfo(bool Cape, bool Hat, bool Jacket, bool Sleeve_Left, bool Sleeve_Right, bool Pants_Left, bool Pants_Right) - { - this.Cape = Cape; - this.Hat = Hat; - this.Jacket = Jacket; - this.Sleeve_Left = Sleeve_Left; - this.Sleeve_Right = Sleeve_Right; - this.Pants_Left = Pants_Left; - this.Pants_Right = Pants_Right; - } - - public byte GetByte() - { - return (byte)( - ((Cape ? 1 : 0) << 0) - | ((Jacket ? 1 : 0) << 1) - | ((Sleeve_Left ? 1 : 0) << 2) - | ((Sleeve_Right ? 1 : 0) << 3) - | ((Pants_Left ? 1 : 0) << 4) - | ((Pants_Right ? 1 : 0) << 5) - | ((Hat ? 1 : 0) << 6) - ); - } - } - } - } - - public static class ChatFormatConfigHelper - { - public static ChatFormatConfig Config = new(); - - [TomlDoNotInlineObject] - public class ChatFormatConfig - { - [TomlInlineComment("$ChatFormat.Builtins$")] - public bool Builtins = true; - - [TomlInlineComment("$ChatFormat.UserDefined$")] - public bool UserDefined = false; - - public string Public = @"^<([a-zA-Z0-9_]+)> (.+)$"; - - public string Private = @"^([a-zA-Z0-9_]+) whispers to you: (.+)$"; - - public string TeleportRequest = @"^([a-zA-Z0-9_]+) has requested (?:to|that you) teleport to (?:you|them)\.$"; - - public void OnSettingUpdate() - { - if (UserDefined) - { - bool checkResult = true; - - try { _ = new Regex(Public); } - catch (ArgumentException) - { - checkResult = false; - ConsoleIO.WriteLineFormatted("§c[Settings]Illegal regular expression: ChatFormat.Public = " + Public); - } - - try { _ = new Regex(Private); } - catch (ArgumentException) - { - checkResult = false; - ConsoleIO.WriteLineFormatted("§c[Settings]Illegal regular expression: ChatFormat.Private = " + Private); - } - - try { _ = new Regex(TeleportRequest); } - catch (ArgumentException) - { - checkResult = false; - ConsoleIO.WriteLineFormatted("§c[Settings]Illegal regular expression: ChatFormat.TeleportRequest = " + TeleportRequest); - } - - if (!checkResult) - { - UserDefined = false; - ConsoleIO.WriteLineFormatted("§c[Settings]ChatFormat: User-defined regular expressions are disabled."); - } - } - } - } - } - - public static class ChatBotConfigHealper - { - public static ChatBotConfig Config = new(); - - [TomlDoNotInlineObject] - public class ChatBotConfig - { - [TomlPrecedingComment("$ChatBot.Alerts$")] - public ChatBots.Alerts.Configs Alerts - { - get { return ChatBots.Alerts.Config; } - set { ChatBots.Alerts.Config = value; ChatBots.Alerts.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.AntiAfk$")] - public ChatBots.AntiAFK.Configs AntiAFK - { - get { return ChatBots.AntiAFK.Config; } - set { ChatBots.AntiAFK.Config = value; ChatBots.AntiAFK.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.AutoAttack$")] - public ChatBots.AutoAttack.Configs AutoAttack - { - get { return ChatBots.AutoAttack.Config; } - set { ChatBots.AutoAttack.Config = value; ChatBots.AutoAttack.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.AutoCraft$")] - public ChatBots.AutoCraft.Configs AutoCraft - { - get { return ChatBots.AutoCraft.Config; } - set { ChatBots.AutoCraft.Config = value; ChatBots.AutoCraft.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.AutoDig$")] - public ChatBots.AutoDig.Configs AutoDig - { - get { return ChatBots.AutoDig.Config; } - set { ChatBots.AutoDig.Config = value; ChatBots.AutoDig.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.AutoDrop$")] - public ChatBots.AutoDrop.Configs AutoDrop - { - get { return ChatBots.AutoDrop.Config; } - set { ChatBots.AutoDrop.Config = value; ChatBots.AutoDrop.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.AutoEat$")] - public ChatBots.AutoEat.Configs AutoEat - { - get { return ChatBots.AutoEat.Config; } - set { ChatBots.AutoEat.Config = value; ChatBots.AutoEat.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.AutoFishing$")] - public ChatBots.AutoFishing.Configs AutoFishing - { - get { return ChatBots.AutoFishing.Config; } - set { ChatBots.AutoFishing.Config = value; ChatBots.AutoFishing.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.AutoRelog$")] - public ChatBots.AutoRelog.Configs AutoRelog - { - get { return ChatBots.AutoRelog.Config; } - set { ChatBots.AutoRelog.Config = value; ChatBots.AutoRelog.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.AutoRespond$")] - public ChatBots.AutoRespond.Configs AutoRespond - { - get { return ChatBots.AutoRespond.Config; } - set { ChatBots.AutoRespond.Config = value; ChatBots.AutoRespond.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.ChatLog$")] - public ChatBots.ChatLog.Configs ChatLog - { - get { return ChatBots.ChatLog.Config; } - set { ChatBots.ChatLog.Config = value; ChatBots.ChatLog.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.DiscordBridge$")] - public ChatBots.DiscordBridge.Configs DiscordBridge - { - get { return ChatBots.DiscordBridge.Config; } - set { ChatBots.DiscordBridge.Config = value; ChatBots.DiscordBridge.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.Farmer$")] - public ChatBots.Farmer.Configs Farmer - { - get { return ChatBots.Farmer.Config; } - set { ChatBots.Farmer.Config = value; ChatBots.Farmer.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.FollowPlayer$")] - public ChatBots.FollowPlayer.Configs FollowPlayer - { - get { return ChatBots.FollowPlayer.Config; } - set { ChatBots.FollowPlayer.Config = value; ChatBots.FollowPlayer.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.HangmanGame$")] - public ChatBots.HangmanGame.Configs HangmanGame - { - get { return ChatBots.HangmanGame.Config; } - set { ChatBots.HangmanGame.Config = value; ChatBots.HangmanGame.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.Mailer$")] - public ChatBots.Mailer.Configs Mailer - { - get { return ChatBots.Mailer.Config; } - set { ChatBots.Mailer.Config = value; ChatBots.Mailer.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.Map$")] - public ChatBots.Map.Configs Map - { - get { return ChatBots.Map.Config; } - set { ChatBots.Map.Config = value; ChatBots.Map.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.PlayerListLogger$")] - public ChatBots.PlayerListLogger.Configs PlayerListLogger - { - get { return ChatBots.PlayerListLogger.Config; } - set { ChatBots.PlayerListLogger.Config = value; ChatBots.PlayerListLogger.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.RemoteControl$")] - public ChatBots.RemoteControl.Configs RemoteControl - { - get { return ChatBots.RemoteControl.Config; } - set { ChatBots.RemoteControl.Config = value; ChatBots.RemoteControl.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.ReplayCapture$")] - public ChatBots.ReplayCapture.Configs ReplayCapture - { - get { return ChatBots.ReplayCapture.Config; } - set { ChatBots.ReplayCapture.Config = value; ChatBots.ReplayCapture.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.ScriptScheduler$")] - public ChatBots.ScriptScheduler.Configs ScriptScheduler - { - get { return ChatBots.ScriptScheduler.Config; } - set { ChatBots.ScriptScheduler.Config = value; ChatBots.ScriptScheduler.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.TelegramBridge$")] - public ChatBots.TelegramBridge.Configs TelegramBridge - { - get { return ChatBots.TelegramBridge.Config; } - set { ChatBots.TelegramBridge.Config = value; ChatBots.TelegramBridge.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.ItemsCollector$")] - public ChatBots.ItemsCollector.Configs ItemsCollector - { - get { return ChatBots.ItemsCollector.Config; } - set - { - ChatBots.ItemsCollector.Config = value; - ChatBots.ItemsCollector.Config.OnSettingUpdate(); - } - } - - [TomlPrecedingComment("$ChatBot.DiscordRpc$")] - public ChatBots.DiscordRpc.Configs DiscordRpc - { - get { return ChatBots.DiscordRpc.Config; } - set { ChatBots.DiscordRpc.Config = value; ChatBots.DiscordRpc.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.McpServer$")] - public ChatBots.McpServer.Configs McpServer - { - get { return ChatBots.McpServer.Config; } - set - { - ChatBots.McpServer.Config = value ?? new ChatBots.McpServer.Configs(); - ChatBots.McpServer.Config.OnSettingUpdate(); - } - } - } - } - - /// - /// Map the system CultureInfo name to a Minecraft game language code. - /// - /// - /// Culture name reference (language-COUNTRY): - /// https://learn.microsoft.com/en-us/previous-versions/commerce-server/ee797784(v=cs.20) - /// Full LCID / language-tag spec (MS-LCID, includes fil-PH, nb-NO, etc.): - /// https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/70feba9f-294e-491e-b6eb-56532684c37f - /// - public static string GetDefaultGameLanguage() - { - string gameLanguage = "en_us"; - string systemLanguage = string.IsNullOrWhiteSpace(Program.ActualCulture.Name) - ? Program.ActualCulture.Parent.Name - : Program.ActualCulture.Name; - switch (systemLanguage) - { - case "af": - case "af-ZA": - gameLanguage = "af_za"; - break; - case "ar": - case "ar-AE": - case "ar-BH": - case "ar-DZ": - case "ar-EG": - case "ar-IQ": - case "ar-JO": - case "ar-KW": - case "ar-LB": - case "ar-LY": - case "ar-MA": - case "ar-OM": - case "ar-QA": - case "ar-SA": - case "ar-SY": - case "ar-TN": - case "ar-YE": - gameLanguage = "ar_sa"; - break; - case "az": - case "az-Cyrl-AZ": - case "az-Latn-AZ": - gameLanguage = "az_az"; - break; - case "be": - case "be-BY": - gameLanguage = "be_by"; - break; - case "bg": - case "bg-BG": - gameLanguage = "bg_bg"; - break; - case "bs-Latn-BA": - gameLanguage = "bs_ba"; - break; - case "ca": - case "ca-ES": - gameLanguage = "ca_es"; - break; - case "cs": - case "cs-CZ": - gameLanguage = "cs_cz"; - break; - case "cy-GB": - gameLanguage = "cy_gb"; - break; - case "da": - case "da-DK": - gameLanguage = "da_dk"; - break; - case "de": - case "de-DE": - case "de-LI": - case "de-LU": - gameLanguage = "de_de"; - break; - case "de-AT": - gameLanguage = "de_at"; - break; - case "de-CH": - gameLanguage = "de_ch"; - break; - case "dv": - case "dv-MV": - break; - case "el": - case "el-GR": - gameLanguage = "el_gr"; - break; - case "en": - case "en-029": - case "en-BZ": - case "en-IE": - case "en-JM": - case "en-PH": - case "en-TT": - case "en-ZA": - case "en-ZW": - case "en-US": - gameLanguage = "en_us"; - break; - case "en-GB": - gameLanguage = "en_gb"; - break; - case "en-AU": - gameLanguage = "en_au"; - break; - case "en-CA": - gameLanguage = "en_ca"; - break; - case "en-NZ": - gameLanguage = "en_nz"; - break; - case "es": - case "es-BO": - case "es-CO": - case "es-CR": - case "es-DO": - case "es-ES": - case "es-GT": - case "es-HN": - case "es-NI": - case "es-PA": - case "es-PE": - case "es-PR": - case "es-PY": - case "es-SV": - gameLanguage = "es_es"; - break; - case "es-AR": - gameLanguage = "es_ar"; - break; - case "es-CL": - gameLanguage = "es_cl"; - break; - case "es-EC": - gameLanguage = "es_ec"; - break; - case "es-MX": - gameLanguage = "es_mx"; - break; - case "es-UY": - gameLanguage = "es_uy"; - break; - case "es-VE": - gameLanguage = "es_ve"; - break; - case "et": - case "et-EE": - gameLanguage = "et_ee"; - break; - case "eu": - case "eu-ES": - gameLanguage = "eu_es"; - break; - case "fa": - case "fa-IR": - gameLanguage = "fa_ir"; - break; - case "fi": - case "fi-FI": - gameLanguage = "fi_fi"; - break; - case "fil": - case "fil-PH": - gameLanguage = "fil_ph"; - break; - case "tl": - case "tl-PH": - gameLanguage = "tl_ph"; - break; - case "fo": - case "fo-FO": - gameLanguage = "fo_fo"; - break; - case "fr": - case "fr-BE": - case "fr-FR": - case "fr-CH": - case "fr-LU": - case "fr-MC": - gameLanguage = "fr_fr"; - break; - case "fr-CA": - gameLanguage = "fr_ca"; - break; - case "gl": - case "gl-ES": - gameLanguage = "gl_es"; - break; - case "gu": - case "gu-IN": - break; - case "he": - case "he-IL": - gameLanguage = "he_il"; - break; - case "hi": - case "hi-IN": - gameLanguage = "hi_in"; - break; - case "hr": - case "hr-BA": - case "hr-HR": - gameLanguage = "hr_hr"; - break; - case "hu": - case "hu-HU": - gameLanguage = "hu_hu"; - break; - case "hy": - case "hy-AM": - gameLanguage = "hy_am"; - break; - case "id": - case "id-ID": - gameLanguage = "id_id"; - break; - case "is": - case "is-IS": - gameLanguage = "is_is"; - break; - case "it": - case "it-CH": - case "it-IT": - gameLanguage = "it_it"; - break; - case "ja": - case "ja-JP": - gameLanguage = "ja_jp"; - break; - case "ka": - case "ka-GE": - gameLanguage = "ka_ge"; - break; - case "kk": - case "kk-KZ": - gameLanguage = "kk_kz"; - break; - case "kn": - case "kn-IN": - gameLanguage = "kn_in"; - break; - case "kok": - case "kok-IN": - break; - case "ko": - case "ko-KR": - gameLanguage = "ko_kr"; - break; - case "ky": - case "ky-KG": - break; - case "lt": - case "lt-LT": - gameLanguage = "lt_lt"; - break; - case "lv": - case "lv-LV": - gameLanguage = "lv_lv"; - break; - case "mi-NZ": - break; - case "mk": - case "mk-MK": - gameLanguage = "mk_mk"; - break; - case "mn": - case "mn-MN": - gameLanguage = "mn_mn"; - break; - case "mr": - case "mr-IN": - break; - case "ms": - case "ms-BN": - case "ms-MY": - gameLanguage = "ms_my"; - break; - case "mt-MT": - gameLanguage = "mt_mt"; - break; - case "nb-NO": - gameLanguage = "no_no"; - break; - case "nl": - case "nl-NL": - gameLanguage = "nl_nl"; - break; - case "nl-BE": - gameLanguage = "nl_be"; - break; - case "nn-NO": - gameLanguage = "nn_no"; - break; - case "no": - gameLanguage = "no_no"; - break; - case "ns-ZA": - break; - case "pa": - case "pa-IN": - break; - case "pl": - case "pl-PL": - gameLanguage = "pl_pl"; - break; - case "pt": - case "pt-PT": - gameLanguage = "pt_pt"; - break; - case "pt-BR": - gameLanguage = "pt_br"; - break; - case "quz-BO": - break; - case "quz-EC": - break; - case "quz-PE": - break; - case "ro": - case "ro-RO": - gameLanguage = "ro_ro"; - break; - case "ru": - case "ru-RU": - gameLanguage = "ru_ru"; - break; - case "sa": - case "sa-IN": - break; - case "se-FI": - case "se-NO": - case "se-SE": - gameLanguage = "se_no"; - break; - case "sk": - case "sk-SK": - gameLanguage = "sk_sk"; - break; - case "sl": - case "sl-SI": - gameLanguage = "sl_si"; - break; - case "sma-NO": - break; - case "sma-SE": - break; - case "smj-NO": - break; - case "smj-SE": - break; - case "smn-FI": - break; - case "sms-FI": - break; - case "sq": - case "sq-AL": - gameLanguage = "sq_al"; - break; - case "sr": - case "sr-Cyrl-BA": - case "sr-Cyrl-CS": - case "sr-Latn-BA": - case "sr-Latn-CS": - gameLanguage = "sr_sp"; - break; - case "sv": - case "sv-FI": - case "sv-SE": - gameLanguage = "sv_se"; - break; - case "sw": - case "sw-KE": - break; - case "syr": - case "syr-SY": - break; - case "ta": - case "ta-IN": - gameLanguage = "ta_in"; - break; - case "te": - case "te-IN": - break; - case "th": - case "th-TH": - gameLanguage = "th_th"; - break; - case "tn-ZA": - break; - case "tr": - case "tr-TR": - gameLanguage = "tr_tr"; - break; - case "tt": - case "tt-RU": - gameLanguage = "tt_ru"; - break; - case "uk": - case "uk-UA": - gameLanguage = "uk_ua"; - break; - case "ur": - case "ur-PK": - break; - case "uz": - case "uz-Cyrl-UZ": - case "uz-Latn-UZ": - break; - case "vi": - case "vi-VN": - gameLanguage = "vi_vn"; - break; - case "xh-ZA": - break; - case "zh-Hans": /* CurrentCulture.Parent.Name */ - case "zh": - case "zh-CN": - case "zh-CHS": - case "zh-SG": - gameLanguage = "zh_cn"; - break; - case "zh-Hant": /* CurrentCulture.Parent.Name */ - case "zh-HK": - case "zh-CHT": - case "zh-MO": - gameLanguage = "zh_hk"; - break; - case "zh-TW": - gameLanguage = "zh_tw"; - break; - case "zu-ZA": - break; - } - return gameLanguage; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public static string ToLowerIfNeed(string str) - { - const string lookupStringL = "---------------------------------!-#$%&-()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[-]^_`abcdefghijklmnopqrstuvwxyz{|}~-"; - - bool needLower = false; - foreach (Char c in str) - { - if (Char.IsUpper(c)) - { - needLower = true; - break; - } - } - - if (needLower) - { - StringBuilder sb = new(str); - for (int i = 0; i < str.Length; ++i) - if (char.IsUpper(sb[i])) - sb[i] = lookupStringL[sb[i]]; - return sb.ToString(); - } - else - { - return str; - } - } - - public static int DoubleToTick(double time) - { - time = Math.Min(int.MaxValue / (double)ClientTicksPerSecond, time); - return (int)Math.Round(time * ClientTicksPerSecond); - } - } - - public static class InternalCmdCharTypeExtensions - { - public static char ToChar(this InternalCmdCharType type) - { - return type switch - { - InternalCmdCharType.none => ' ', - InternalCmdCharType.slash => '/', - InternalCmdCharType.backslash => '\\', - _ => '/', - }; - } - - public static string ToLogString(this InternalCmdCharType type) - { - return type switch - { - InternalCmdCharType.none => string.Empty, - InternalCmdCharType.slash => @"/", - InternalCmdCharType.backslash => @"\", - _ => @"/", - }; - } - } - - public static class BrandInfoTypeExtensions - { - public static string? ToBrandString(this BrandInfoType info) - { - return info switch - { - BrandInfoType.mcc => "Minecraft-Console-Client/" + Program.Version, - BrandInfoType.vanilla => "vanilla", - BrandInfoType.empty => null, - _ => null, - }; - } - } - - public static class ExceptionExtensions - { - public static string GetFullMessage(this Exception ex) - { - string msg = ex.Message.Replace("+", "->"); - return ex.InnerException is null - ? msg - : msg + "\n --> " + ex.InnerException.GetFullMessage(); - } - } -} diff --git a/MinecraftClient/TabList/TabListFormatter.cs b/MinecraftClient/TabList/TabListFormatter.cs deleted file mode 100644 index 633cc46f62..0000000000 --- a/MinecraftClient/TabList/TabListFormatter.cs +++ /dev/null @@ -1,310 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using MinecraftClient.Mapping; -using MinecraftClient.Scripting; - -namespace MinecraftClient -{ - internal sealed record TabListSnapshot(string Header, string Footer, IReadOnlyList Entries); - - internal sealed record TabListEntry( - Guid Uuid, - string Name, - string DisplayName, - string TeamName, - string TeamDisplayName, - int Gamemode, - int Ping, - int TabListOrder, - bool Listed); - - internal static class TabListFormatter - { - private const int MaxRowsPerColumn = 20; - private const int PingColumnWidth = 11; - private const int ColumnGapWidth = 4; - - public static string FormatTeamMemberName(string playerName, PlayerTeam? team) - { - ArgumentException.ThrowIfNullOrWhiteSpace(playerName); - - if (team is null) - return playerName; - - var sb = new StringBuilder(); - sb.Append(team.Prefix); - - string colorCode = TeamColorToTag(team.Color); - if (!string.IsNullOrEmpty(colorCode)) - sb.Append(colorCode); - - sb.Append(playerName); - sb.Append(team.Suffix); - return sb.ToString(); - } - - public static string Render(TabListSnapshot snapshot, bool includeOverlayHint = false) - { - ArgumentNullException.ThrowIfNull(snapshot); - bool showTeams = Settings.Config.Console.TabList.ShowTeams; - - var lines = new List - { - $"§e{string.Format(Translations.cmd_tab_title, snapshot.Entries.Count)}§r" - }; - - AppendSection(lines, snapshot.Header); - - var listedEntries = snapshot.Entries - .Where(static entry => entry.Listed && !string.IsNullOrWhiteSpace(entry.Name)) - .OrderBy(static entry => entry.TabListOrder) - .ThenBy(static entry => entry.Gamemode == 3 ? 1 : 0) - .ThenBy(static entry => entry.TeamName, StringComparer.OrdinalIgnoreCase) - .ThenBy(static entry => entry.Name, StringComparer.OrdinalIgnoreCase) - .ToList(); - - if (listedEntries.Count == 0) - { - lines.Add($"§7{Translations.cmd_tab_no_players}§r"); - } - else - { - lines.AddRange(BuildTableLines(listedEntries, showTeams)); - } - - AppendSection(lines, snapshot.Footer); - - if (includeOverlayHint) - { - lines.Add(string.Empty); - lines.Add($"§8{Translations.tui_tab_hint}§r"); - } - - return string.Join('\n', lines); - } - - private static void AppendSection(List lines, string text) - { - if (string.IsNullOrWhiteSpace(text)) - return; - - foreach (string line in text.Replace("\r\n", "\n", StringComparison.Ordinal).Replace('\r', '\n').Split('\n')) - { - if (!string.IsNullOrWhiteSpace(line)) - lines.Add(line); - } - } - - private static List BuildTableLines(IReadOnlyList entries, bool showTeams) - { - int columns = 1; - int rows = entries.Count; - while (rows > MaxRowsPerColumn) - { - columns++; - rows = (entries.Count + columns - 1) / columns; - } - - int teamColumnWidth = showTeams - ? Math.Max( - GetVisibleLength(Translations.cmd_tab_column_team), - entries.Max(static entry => GetVisibleLength(GetTeamLabel(entry)))) - : 0; - - string headerRow = BuildRow( - $"§8{Translations.cmd_tab_column_ping}§r", - showTeams ? $"§8{Translations.cmd_tab_column_team}§r" : null, - $"§8{Translations.cmd_tab_column_player}§r", - teamColumnWidth); - - List renderedRows = entries - .Select(entry => BuildRow( - GetPingCell(entry.Ping), - showTeams ? GetTeamLabel(entry) : null, - GetPlayerLabel(entry), - teamColumnWidth)) - .ToList(); - - int[] columnWidths = new int[columns]; - for (int column = 0; column < columns; column++) - { - int width = GetVisibleLength(headerRow); - for (int row = 0; row < rows; row++) - { - int index = row + (column * rows); - if (index >= renderedRows.Count) - break; - - width = Math.Max(width, GetVisibleLength(renderedRows[index])); - } - columnWidths[column] = width; - } - - var lines = new List { CombineColumns(headerRow, rows, columns, columnWidths) }; - for (int row = 0; row < rows; row++) - lines.Add(CombineColumns(renderedRows, row, rows, columns, columnWidths)); - - return lines; - } - - private static string CombineColumns(string headerRow, int rows, int columns, IReadOnlyList columnWidths) - { - var perColumnValues = new string[columns]; - for (int column = 0; column < columns; column++) - perColumnValues[column] = headerRow; - - return CombineColumns(perColumnValues, columnWidths); - } - - private static string CombineColumns(IReadOnlyList renderedRows, int row, int rows, int columns, IReadOnlyList columnWidths) - { - var perColumnValues = new string[columns]; - for (int column = 0; column < columns; column++) - { - int index = row + (column * rows); - perColumnValues[column] = index < renderedRows.Count ? renderedRows[index] : string.Empty; - } - - return CombineColumns(perColumnValues, columnWidths); - } - - private static string CombineColumns(IReadOnlyList parts, IReadOnlyList widths) - { - var sb = new StringBuilder(); - for (int index = 0; index < parts.Count; index++) - { - if (index > 0) - sb.Append(' ', ColumnGapWidth); - - sb.Append(PadFormattedRight(parts[index], widths[index])); - } - return sb.ToString().TrimEnd(); - } - - private static string BuildRow(string pingCell, string? teamCell, string playerCell, int teamColumnWidth) - { - var sb = new StringBuilder(); - sb.Append(PadFormattedRight(pingCell, PingColumnWidth)); - sb.Append(" "); - if (!string.IsNullOrEmpty(teamCell)) - { - sb.Append(PadFormattedRight(teamCell, teamColumnWidth)); - sb.Append(" "); - } - sb.Append(playerCell); - return sb.ToString(); - } - - private static string GetPingCell(int ping) - { - string barColor; - int filledBars; - - if (ping < 0) - { - barColor = "§8"; - filledBars = 0; - } - else if (ping < 150) - { - barColor = "§a"; - filledBars = 5; - } - else if (ping < 300) - { - barColor = "§e"; - filledBars = 4; - } - else if (ping < 600) - { - barColor = "§6"; - filledBars = 3; - } - else if (ping < 1000) - { - barColor = "§c"; - filledBars = 2; - } - else - { - barColor = "§4"; - filledBars = 1; - } - - string numericPing = ping >= 0 ? $"{Math.Min(ping, 9999),4}ms" : " ???ms"; - return $"{barColor}{new string('|', filledBars)}§8{new string('.', 5 - filledBars)}§r {numericPing}"; - } - - private static string GetTeamLabel(TabListEntry entry) - { - if (string.IsNullOrWhiteSpace(entry.TeamName)) - return "§8-§r"; - - if (!string.IsNullOrWhiteSpace(entry.TeamDisplayName)) - return entry.TeamDisplayName; - - if (LooksLikeOpaqueTeamName(entry.TeamName)) - return "§8-§r"; - - return entry.TeamName; - } - - private static string GetPlayerLabel(TabListEntry entry) - { - string label = string.IsNullOrWhiteSpace(entry.DisplayName) - ? entry.Name - : entry.DisplayName; - - if (entry.Gamemode == 3) - return $"§7§o{label}§r"; - - return label; - } - - private static string PadFormattedRight(string text, int totalWidth) - { - int visibleLength = GetVisibleLength(text); - if (visibleLength >= totalWidth) - return text; - - return text + new string(' ', totalWidth - visibleLength); - } - - private static int GetVisibleLength(string text) => ChatBot.GetVerbatim(text).Length; - - private static bool LooksLikeOpaqueTeamName(string text) - { - if (Guid.TryParse(text, out _)) - return true; - - int hyphenCount = text.Count(static ch => ch == '-'); - if (text.Length >= 24 && hyphenCount >= 3) - return true; - - return false; - } - - private static string TeamColorToTag(int color) => color switch - { - 0 => "§0", - 1 => "§1", - 2 => "§2", - 3 => "§3", - 4 => "§4", - 5 => "§5", - 6 => "§6", - 7 => "§7", - 8 => "§8", - 9 => "§9", - 10 => "§a", - 11 => "§b", - 12 => "§c", - 13 => "§d", - 14 => "§e", - 15 => "§f", - _ => string.Empty - }; - } -} diff --git a/MinecraftClient/TaskWithDelay.cs b/MinecraftClient/TaskWithDelay.cs deleted file mode 100644 index 662c317848..0000000000 --- a/MinecraftClient/TaskWithDelay.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; - -namespace MinecraftClient -{ - /// - /// Holds a task with delay - /// - class TaskWithDelay - { - private readonly Action _task; - private int tickCounter; - private readonly DateTime dateToLaunch; - - public Action Task { get { return _task; } } - - public TaskWithDelay(Action task, int delayTicks) - { - _task = task; - tickCounter = delayTicks; - dateToLaunch = DateTime.MaxValue; - } - - public TaskWithDelay(Action task, TimeSpan delay) - { - _task = task; - tickCounter = int.MaxValue; - dateToLaunch = DateTime.Now + delay; - } - - /// - /// Tick the counter - /// - /// Return true if the task should run now - public bool Tick() - { - tickCounter--; - if (tickCounter <= 0 || dateToLaunch < DateTime.Now) - return true; - return false; - } - } -} diff --git a/MinecraftClient/TaskWithResult.cs b/MinecraftClient/TaskWithResult.cs deleted file mode 100644 index 53aec3aa4f..0000000000 --- a/MinecraftClient/TaskWithResult.cs +++ /dev/null @@ -1,122 +0,0 @@ -using System; -using System.Threading; - -namespace MinecraftClient -{ - /// - /// Holds an asynchronous task with return value - /// - /// Type of the return value - public class TaskWithResult - { - private readonly AutoResetEvent resultEvent = new(false); - private readonly Func task; - private T? result = default; - private Exception? exception = null; - private bool taskRun = false; - private readonly Lock taskRunLock = new(); - - /// - /// Create a new asynchronous task with return value - /// - /// Delegate with return value - public TaskWithResult(Func task) - { - this.task = task; - } - - /// - /// Check whether the task has finished running - /// - public bool HasRun - { - get - { - return taskRun; - } - } - - /// - /// Get the task result (return value of the inner delegate) - /// - /// Thrown if the task is not finished yet - public T Result - { - get - { - if (taskRun) - return result!; - else - throw new InvalidOperationException("Attempting to retrieve the result of an unfinished task"); - } - } - - /// - /// Get the exception thrown by the inner delegate, if any - /// - public Exception? Exception - { - get - { - return exception; - } - } - - /// - /// Execute the task in the current thread and set the property or to the returned value - /// - public void ExecuteSynchronously() - { - // Make sur the task will not run twice - lock (taskRunLock) - { - if (taskRun) - { - throw new InvalidOperationException("Attempting to run a task twice"); - } - } - - // Run the task - try - { - result = task(); - } - catch (Exception e) - { - exception = e; - } - - // Mark task as complete and release wait event - lock (taskRunLock) - { - taskRun = true; - } - resultEvent.Set(); - } - - /// - /// Wait until the task has run from another thread and get the returned value or exception thrown by the task - /// - /// Task result once available - /// Any exception thrown by the task - public T WaitGetResult() - { - // Wait only if the result is not available yet - bool mustWait = false; - lock (taskRunLock) - { - mustWait = !taskRun; - } - if (mustWait) - { - resultEvent.WaitOne(); - } - - // Receive exception from task - if (exception is not null) - throw exception; - - return result!; - } - } -} diff --git a/MinecraftClient/Tui/BookTuiHost.cs b/MinecraftClient/Tui/BookTuiHost.cs deleted file mode 100644 index 5d20b13f2e..0000000000 --- a/MinecraftClient/Tui/BookTuiHost.cs +++ /dev/null @@ -1,383 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Input; -using Avalonia.Interactivity; -using Avalonia.Layout; -using Avalonia.Media; -using Avalonia.Threading; -using MinecraftClient.Inventory; - -namespace MinecraftClient.Tui; - -public static class BookTuiHost -{ - private static volatile bool isRunning; - - public static bool TryOpen(McClient handler, BookHand hand, bool editable) - { - if (ConsoleIO.Backend is not TuiConsoleBackend) - return false; - - Open(handler, hand, editable); - return true; - } - - public static void OpenFromServer(McClient handler, BookHand hand) - { - if (ConsoleIO.Backend is TuiConsoleBackend) - Open(handler, hand, editable: BookContentHelper.IsWritableBook(handler.GetHeldBook(hand))); - } - - private static void Open(McClient handler, BookHand hand, bool editable) - { - Dispatcher.UIThread.Post(() => - { - if (isRunning) - return; - - MainTuiView? view = TuiConsoleBackend.Instance?.GetView(); - if (view is null) - return; - - if (!handler.TryGetHeldBookContent(out BookContent content, hand)) - return; - - isRunning = true; - var bookView = new BookView(handler, content, editable && !content.IsSigned); - view.ShowOverlay(bookView, () => isRunning = false); - }); - } -} - -internal sealed class BookView : UserControl -{ - private readonly McClient handler; - private readonly bool editable; - private readonly List pages; - private readonly TextBlock header; - private readonly TextBlock status; - private readonly TextBlock shortcutTip; - private readonly TextBox pageText; - private readonly TextBox titleText; - private readonly Button previousButton; - private readonly Button nextButton; - private readonly Button insertButton; - private readonly Button deleteButton; - private readonly Button saveButton; - private readonly Button signButton; - private bool bookSigned; - private int pageIndex; - - public BookView(McClient handler, BookContent content, bool editable) - { - this.handler = handler; - this.editable = editable; - bookSigned = content.IsSigned; - pages = content.Pages.ToList(); - if (pages.Count == 0) - pages.Add(string.Empty); - - Focusable = true; - Background = Brushes.Black; - - header = new TextBlock - { - Foreground = Brushes.Yellow, - Margin = new Thickness(1, 0), - TextWrapping = TextWrapping.Wrap - }; - - status = new TextBlock - { - Foreground = Brushes.Gray, - Margin = new Thickness(1, 0), - TextWrapping = TextWrapping.Wrap - }; - - shortcutTip = new TextBlock - { - Foreground = Brushes.DarkGray, - Margin = new Thickness(1, 0), - Text = Translations.tui_book_page_shortcut_tip, - TextWrapping = TextWrapping.Wrap - }; - - pageText = new TextBox - { - AcceptsReturn = true, - TextWrapping = TextWrapping.Wrap, - IsReadOnly = !CanEdit, - Foreground = Brushes.White, - Background = Brushes.Black, - BorderBrush = Brushes.Gray, - MinHeight = 12, - Margin = new Thickness(1) - }; - pageText.TextChanged += (_, _) => - { - if (CanEdit && pageIndex >= 0 && pageIndex < pages.Count) - pages[pageIndex] = pageText.Text ?? string.Empty; - }; - - titleText = new TextBox - { - Watermark = Translations.tui_book_title_watermark, - IsVisible = CanEdit, - Foreground = Brushes.White, - Background = Brushes.Black, - BorderBrush = Brushes.Gray, - Margin = new Thickness(1) - }; - - previousButton = Button(Translations.tui_book_prev, (_, _) => TryMovePage(-1)); - nextButton = Button(Translations.tui_book_next, (_, _) => TryMovePage(1)); - insertButton = Button(Translations.tui_book_insert, (_, _) => InsertPage(), editable); - deleteButton = Button(Translations.tui_book_delete, (_, _) => DeletePage(), editable); - saveButton = Button(Translations.tui_book_save, (_, _) => Save(), editable); - signButton = Button(Translations.tui_book_sign, (_, _) => Sign(), editable); - - var controls = new StackPanel - { - Orientation = Orientation.Horizontal, - Spacing = 1, - Margin = new Thickness(1), - Children = - { - previousButton, - nextButton, - insertButton, - deleteButton, - saveButton, - signButton, - Button(Translations.tui_book_close, (_, _) => Close()) - } - }; - - var panel = new DockPanel - { - Background = Brushes.Black, - Children = - { - DockTo(header, Dock.Top), - DockTo(status, Dock.Bottom), - DockTo(shortcutTip, Dock.Bottom), - DockTo(controls, Dock.Bottom), - DockTo(titleText, Dock.Bottom), - pageText - } - }; - - Content = panel; - AttachedToVisualTree += (_, _) => - { - AddHandler(KeyDownEvent, OnTunnelKeyDown, RoutingStrategies.Tunnel, handledEventsToo: true); - FocusPageText(); - }; - DetachedFromVisualTree += (_, _) => RemoveHandler(KeyDownEvent, OnTunnelKeyDown); - Refresh(); - } - - private bool CanEdit => editable && !bookSigned; - - private void OnTunnelKeyDown(object? sender, KeyEventArgs e) - { - if (e.Key == Key.PageUp) - { - TryMovePage(-1); - e.Handled = true; - return; - } - - if (e.Key == Key.PageDown) - { - TryMovePage(1); - e.Handled = true; - } - } - - private static Control DockTo(Control control, Dock dock) - { - DockPanel.SetDock(control, dock); - return control; - } - - private static Button Button(string text, EventHandler handler, bool enabled = true) - { - var button = new Button - { - Content = text, - IsEnabled = enabled, - Padding = new Thickness(1, 0), - Margin = new Thickness(0) - }; - button.Click += handler; - return button; - } - - private bool TryMovePage(int delta) - { - int targetPageIndex = Math.Clamp(pageIndex + delta, 0, pages.Count - 1); - if (targetPageIndex == pageIndex) - return false; - - pageIndex = targetPageIndex; - Refresh(); - return true; - } - - private void InsertPage() - { - if (!CanEdit) - return; - - pages.Insert(pageIndex + 1, string.Empty); - pageIndex++; - Refresh(); - } - - private void DeletePage() - { - if (!CanEdit) - return; - - if (pages.Count == 1) - pages[0] = string.Empty; - else - { - pages.RemoveAt(pageIndex); - pageIndex = Math.Clamp(pageIndex, 0, pages.Count - 1); - } - Refresh(); - } - - private void Save() - { - if (bookSigned || IsHeldBookSigned()) - { - bookSigned = true; - status.Text = Translations.cmd_book_cannot_edit_signed; - RefreshEditability(); - return; - } - - if (!Validate(out string error)) - { - status.Text = error; - return; - } - - status.Text = handler.SendBookEdit(pages) - ? Translations.tui_book_saved - : Translations.tui_book_save_failed; - } - - private void Sign() - { - if (bookSigned || IsHeldBookSigned()) - { - bookSigned = true; - status.Text = Translations.cmd_book_already_signed; - RefreshEditability(); - return; - } - - string title = (titleText.Text ?? string.Empty).Trim(); - if (!Validate(out string error, title)) - { - status.Text = error; - return; - } - - if (handler.SendBookEdit(pages, title)) - { - bookSigned = true; - status.Text = Translations.tui_book_signed; - RefreshEditability(); - return; - } - - status.Text = IsHeldBookSigned() - ? Translations.cmd_book_already_signed - : Translations.tui_book_save_failed; - } - - private bool Validate(out string error, string? title = null) - { - BookLimits limits = BookLimits.ForProtocol(handler.GetProtocolVersion()); - error = string.Empty; - - if (pages.Count > limits.MaxPages) - { - error = string.Format(Translations.cmd_book_too_many_pages, pages.Count, limits.MaxPages); - return false; - } - - for (int i = 0; i < pages.Count; i++) - { - if (pages[i].Length > limits.MaxPageLength) - { - error = string.Format(Translations.cmd_book_page_too_long, i + 1, pages[i].Length, limits.MaxPageLength); - return false; - } - } - - if (title is not null && (title.Length == 0 || title.Length > limits.MaxTitleLength)) - { - error = string.Format(Translations.cmd_book_title_invalid, limits.MaxTitleLength); - return false; - } - - return true; - } - - private void Close() - { - TuiConsoleBackend.Instance?.GetView()?.HideOverlay(); - } - - private void Refresh() - { - string currentPageText = pages[pageIndex]; - if (!string.Equals(pageText.Text, currentPageText, StringComparison.Ordinal)) - pageText.Text = currentPageText; - - header.Text = string.Format(Translations.tui_book_page_header, pageIndex + 1, pages.Count); - status.Text = CanEdit ? Translations.tui_book_editing : Translations.tui_book_reading; - RefreshEditability(); - FocusPageText(); - } - - private void RefreshEditability() - { - previousButton.IsEnabled = pageIndex > 0; - nextButton.IsEnabled = pageIndex < pages.Count - 1; - insertButton.IsEnabled = CanEdit; - deleteButton.IsEnabled = CanEdit; - saveButton.IsEnabled = CanEdit; - signButton.IsEnabled = CanEdit; - pageText.IsReadOnly = !CanEdit; - titleText.IsEnabled = CanEdit; - titleText.IsVisible = CanEdit; - shortcutTip.Text = CanEdit - ? Translations.tui_book_edit_shortcut_tip - : Translations.tui_book_page_shortcut_tip; - } - - private void FocusPageText() - { - Dispatcher.UIThread.Post(() => - { - pageText.Focus(); - if (CanEdit) - pageText.CaretIndex = pageText.Text?.Length ?? 0; - }, DispatcherPriority.Input); - } - - private bool IsHeldBookSigned() - { - return BookContentHelper.TryRead(handler.GetHeldBook(BookHand.Main), out BookContent content) && content.IsSigned; - } -} diff --git a/MinecraftClient/Tui/BrewingStandView.cs b/MinecraftClient/Tui/BrewingStandView.cs deleted file mode 100644 index 6a00071be0..0000000000 --- a/MinecraftClient/Tui/BrewingStandView.cs +++ /dev/null @@ -1,152 +0,0 @@ -using System.Collections.ObjectModel; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Layout; -using Avalonia.Media; -using MinecraftClient.Inventory; - -namespace MinecraftClient.Tui -{ - public class BrewingStandView : ContainerViewBase - { - private readonly BrewingViewModel _brewVm; - - public BrewingStandView(McClient handler, int windowId) - : base(new BrewingViewModel(handler, windowId)) - { - _brewVm = (BrewingViewModel)_vm; - Initialize(); - } - - protected override int GetTotalSlotRows() - { - return 3 + 3 + 1; - } - - protected override Control BuildContainerSpecificArea() - { - var panel = new StackPanel - { - Spacing = 0, - HorizontalAlignment = HorizontalAlignment.Center, - }; - - var topRow = new StackPanel - { - Orientation = Orientation.Horizontal, - HorizontalAlignment = HorizontalAlignment.Center, - Spacing = 0, - }; - - var fuelCol = new StackPanel - { - VerticalAlignment = VerticalAlignment.Center, - }; - fuelCol.Children.Add(new TextBlock - { - Text = Translations.tui_brewing_fuel, - Foreground = BrEquipLbl, - FontWeight = FontWeight.Bold, - HorizontalAlignment = HorizontalAlignment.Center, - }); - fuelCol.Children.Add(CreateSlotCell(_brewVm.FuelSlot, 0, 0)); - topRow.Children.Add(fuelCol); - - topRow.Children.Add(new Border { Width = 2 }); - - var ingredientCol = new StackPanel - { - VerticalAlignment = VerticalAlignment.Center, - }; - ingredientCol.Children.Add(new TextBlock - { - Text = Translations.tui_brewing_ingredient, - Foreground = BrEquipLbl, - FontWeight = FontWeight.Bold, - HorizontalAlignment = HorizontalAlignment.Center, - }); - ingredientCol.Children.Add(CreateSlotCell(_brewVm.IngredientSlot, 0, 1)); - topRow.Children.Add(ingredientCol); - - panel.Children.Add(topRow); - - panel.Children.Add(new TextBlock - { - Text = "\u25bc", - Foreground = new SolidColorBrush(Color.FromRgb(140, 140, 140)), - HorizontalAlignment = HorizontalAlignment.Center, - }); - - var bottleRow = new StackPanel - { - Orientation = Orientation.Horizontal, - HorizontalAlignment = HorizontalAlignment.Center, - Spacing = 0, - }; - for (int i = 0; i < 3; i++) - { - var bottlePanel = new StackPanel - { - VerticalAlignment = VerticalAlignment.Center, - }; - bottlePanel.Children.Add(new TextBlock - { - Text = string.Format(Translations.tui_brewing_bottle, i + 1), - Foreground = BrEquipLbl, - FontWeight = FontWeight.Bold, - HorizontalAlignment = HorizontalAlignment.Center, - }); - bottlePanel.Children.Add(CreateSlotCell(_brewVm.BottleSlots[i], 1, i)); - bottleRow.Children.Add(bottlePanel); - } - - panel.Children.Add(bottleRow); - - return panel; - } - } - - public class BrewingViewModel : ContainerViewModel - { - public ObservableCollection BottleSlots { get; } = new(); - public SlotViewModel IngredientSlot { get; private set; } = null!; - public SlotViewModel FuelSlot { get; private set; } = null!; - - public BrewingViewModel(McClient handler, int windowId) - : base(handler, windowId, ContainerType.BrewingStand) - { - IngredientSlot = SlotMap[3]; - FuelSlot = SlotMap[4]; - } - - protected override void InitializeSlots() - { - SlotMap.Clear(); - - for (int i = 0; i <= 2; i++) - { - var slot = new SlotViewModel(i); - BottleSlots.Add(slot); - SlotMap[i] = slot; - } - - SlotMap[3] = new SlotViewModel(3); - SlotMap[4] = new SlotViewModel(4); - - for (int i = 5; i <= 31; i++) - { - var slot = new SlotViewModel(i); - MainInventorySlots.Add(slot); - SlotMap[i] = slot; - } - - for (int i = 32; i <= 40; i++) - { - int hotbarIdx = i - 32; - var slot = new SlotViewModel(i, isHotbar: true, hotbarIndex: hotbarIdx); - HotbarSlots.Add(slot); - SlotMap[i] = slot; - } - } - } -} diff --git a/MinecraftClient/Tui/ContainerViewBase.cs b/MinecraftClient/Tui/ContainerViewBase.cs deleted file mode 100644 index 92787f464c..0000000000 --- a/MinecraftClient/Tui/ContainerViewBase.cs +++ /dev/null @@ -1,723 +0,0 @@ -using System; -using System.Collections.ObjectModel; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Controls.ApplicationLifetimes; -using Avalonia.Controls.Primitives; -using Avalonia.Controls.Templates; -using Avalonia.Input; -using Avalonia.Layout; -using Avalonia.Media; -using MinecraftClient.Inventory; - -namespace MinecraftClient.Tui -{ - public abstract class ContainerViewBase : UserControl - { - protected static readonly IBrush BrSlotEmptyA = new SolidColorBrush(Color.FromRgb(40, 40, 40)); - protected static readonly IBrush BrSlotEmptyB = new SolidColorBrush(Color.FromRgb(55, 55, 55)); - protected static readonly IBrush BrSlotFillA = new SolidColorBrush(Color.FromRgb(60, 60, 75)); - protected static readonly IBrush BrSlotFillB = new SolidColorBrush(Color.FromRgb(75, 75, 90)); - protected static readonly IBrush BrSlotHover = new SolidColorBrush(Color.FromRgb(100, 100, 140)); - protected static readonly IBrush BrName = Brushes.White; - protected static readonly IBrush BrCount = Brushes.Yellow; - protected static readonly IBrush BrDim = new SolidColorBrush(Color.FromRgb(80, 80, 80)); - protected static readonly IBrush BrEquipLbl = Brushes.DarkCyan; - protected static readonly IBrush BrInfoHighlight = new SolidColorBrush(Color.FromRgb(40, 40, 60)); - protected static readonly IBrush BrHeldItemBg = new SolidColorBrush(Color.FromRgb(60, 50, 80)); - protected static readonly IBrush BrHeldItemBorder = Brushes.Yellow; - - protected int _slotW; - protected int _slotH; - protected int _nameMaxLen; - protected int _nameLines; - protected int _termW; - - protected readonly ContainerViewModel _vm; - protected TextBlock _titleText = null!; - protected Border _infoDetailBorder = null!; - protected TextBlock _infoDetailText = null!; - protected TextBlock _cursorItemText = null!; - protected TextBlock _helpText = null!; - - protected TextBlock[] _hotbarIndicators = new TextBlock[9]; - protected int _currentHotbarSlot = -1; - - protected Border? _lastHoveredSlotBorder; - - protected Canvas _overlayCanvas = null!; - protected Border _heldItemFloater = null!; - protected TextBlock _heldItemFloaterName = null!; - protected TextBlock _heldItemFloaterCount = null!; - - protected ScrollViewer _chatScrollViewer = null!; - protected ObservableCollection? _chatLines; - protected int _lastTermW; - protected int _lastTermH; - protected bool _chatScrollToBottom = true; - - protected ContainerViewBase(ContainerViewModel vm) - { - _vm = vm; - _currentHotbarSlot = vm.Handler.GetCurrentSlot(); - - _chatLines = TuiConsoleBackend.Instance?.GetView()?.GetRecentLogLines(50) - ?? new ObservableCollection(); - } - - protected void Initialize() - { - RebuildUi(); - } - - protected abstract int GetTotalSlotRows(); - - protected abstract Control BuildContainerSpecificArea(); - - protected virtual void OnContainerDataChanged() { } - - protected virtual void RebuildUi() - { - int termH; - try - { - _termW = System.Console.WindowWidth; - termH = System.Console.WindowHeight; - } - catch - { - _termW = 120; - termH = 40; - } - - _lastTermW = _termW; - _lastTermH = termH; - - int availW = _termW - 26; - _slotW = Math.Clamp(availW / 9, 8, 18); - _nameMaxLen = _slotW; - - int totalRows = GetTotalSlotRows(); - int overhead = 4; - int chatMinH = 1; - _slotH = Math.Clamp((termH - overhead - chatMinH) / totalRows, 2, 5); - _nameLines = _slotH; - - _vm.SetSlotDisplayParams(_nameMaxLen, _nameLines); - - _lastHoveredSlotBorder = null; - - _titleText = new TextBlock - { - FontWeight = FontWeight.Bold, - Foreground = Brushes.Cyan, - HorizontalAlignment = HorizontalAlignment.Center, - }; - - _infoDetailText = new TextBlock - { - TextWrapping = TextWrapping.Wrap, - Foreground = Brushes.White, - }; - - _infoDetailBorder = new Border - { - Background = Brushes.Transparent, - Padding = new Thickness(0), - Child = _infoDetailText, - }; - - _cursorItemText = new TextBlock - { - Foreground = Brushes.Yellow, - FontWeight = FontWeight.Bold, - TextWrapping = TextWrapping.Wrap, - }; - - _helpText = new TextBlock - { - TextWrapping = TextWrapping.Wrap, - Foreground = new SolidColorBrush(Color.FromRgb(140, 140, 140)), - Text = Translations.tui_inventory_controls_help, - }; - - _heldItemFloaterName = new TextBlock - { - Foreground = Brushes.White, - FontWeight = FontWeight.Bold, - TextWrapping = TextWrapping.Wrap, - }; - _heldItemFloaterCount = new TextBlock - { - Foreground = BrCount, - FontWeight = FontWeight.Bold, - }; - _heldItemFloater = new Border - { - Background = BrHeldItemBg, - BorderBrush = BrHeldItemBorder, - BorderThickness = new Thickness(1), - Padding = new Thickness(1, 0), - IsVisible = false, - MaxWidth = 24, - Child = new StackPanel - { - Children = { _heldItemFloaterName, _heldItemFloaterCount }, - }, - }; - - _overlayCanvas = new Canvas { IsHitTestVisible = false }; - _overlayCanvas.Children.Add(_heldItemFloater); - - var chatLines = _chatLines!; - chatLines.CollectionChanged += (_, _) => - { - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - var sv = _chatScrollViewer; - if (sv.Extent.Height > sv.Viewport.Height) - sv.Offset = new Vector(0, sv.Extent.Height - sv.Viewport.Height); - }, Avalonia.Threading.DispatcherPriority.Background); - }; - var chatItemsControl = new ItemsControl - { - ItemsSource = chatLines, - Focusable = false, - ItemTemplate = new FuncDataTemplate((s, _) => - McColorParser.CreateColoredTextBlock(s ?? "", TextWrapping.Wrap)), - }; - _chatScrollViewer = new ScrollViewer - { - Content = chatItemsControl, - Background = Brushes.Black, - HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled, - VerticalScrollBarVisibility = ScrollBarVisibility.Hidden, - Padding = new Thickness(0), - }; - - _hotbarIndicators = new TextBlock[9]; - - Content = BuildRootLayout(); - UpdateTitle(); - UpdateInfoPanel(); - - _chatScrollToBottom = true; - _chatScrollViewer.ScrollChanged += OnChatScrollChanged; - } - - private void OnChatScrollChanged(object? sender, ScrollChangedEventArgs e) - { - if (!_chatScrollToBottom) return; - var sv = _chatScrollViewer; - if (sv.Extent.Height > sv.Viewport.Height) - { - sv.Offset = new Vector(0, sv.Extent.Height - sv.Viewport.Height); - _chatScrollToBottom = false; - } - } - - protected virtual Control BuildRootLayout() - { - var inventoryArea = BuildMainArea(); - DockPanel.SetDock(_titleText, Dock.Top); - DockPanel.SetDock(inventoryArea, Dock.Top); - - var mainContent = new DockPanel - { - Children = { _titleText, inventoryArea, _chatScrollViewer } - }; - - return new Panel - { - Background = Brushes.Black, - Children = { mainContent, _overlayCanvas } - }; - } - - protected virtual Control BuildMainArea() - { - var infoPanel = BuildInfoPanel(); - DockPanel.SetDock(infoPanel, Dock.Right); - - return new DockPanel - { - Children = { infoPanel, BuildInventoryPanel() } - }; - } - - protected virtual Control BuildInventoryPanel() - { - var root = new StackPanel - { - Spacing = 0, - HorizontalAlignment = HorizontalAlignment.Center, - }; - - root.Children.Add(BuildContainerSpecificArea()); - root.Children.Add(BuildSeparator()); - root.Children.Add(BuildSlotGrid(_vm.MainInventorySlots, 9)); - root.Children.Add(BuildHotbarSection()); - - return new Border - { - BorderThickness = new Thickness(1), - BorderBrush = Brushes.Gray, - Child = root, - }; - } - - protected Control BuildSeparator() - { - return new Border - { - Height = 1, - Background = Brushes.Transparent, - Margin = new Thickness(0, 0, 0, 0), - }; - } - - protected Control BuildInfoPanel() - { - return new Border - { - BorderThickness = new Thickness(1), - BorderBrush = Brushes.Gray, - Padding = new Thickness(1), - Width = 24, - Child = new StackPanel - { - Children = - { - new TextBlock { Text = Translations.tui_inventory_item_info, FontWeight = FontWeight.Bold, Foreground = Brushes.Cyan }, - _infoDetailBorder, - new TextBlock { Text = Translations.tui_inventory_held_item, FontWeight = FontWeight.Bold, Foreground = Brushes.Yellow, Margin = new Thickness(0, 1, 0, 0) }, - _cursorItemText, - new TextBlock { Text = Translations.tui_inventory_controls, FontWeight = FontWeight.Bold, Foreground = Brushes.Green, Margin = new Thickness(0, 1, 0, 0) }, - _helpText, - } - } - }; - } - - protected Control BuildHotbarSection() - { - var panel = new StackPanel { Spacing = 0 }; - - var numberRow = new StackPanel - { - Orientation = Orientation.Horizontal, - HorizontalAlignment = HorizontalAlignment.Center, - }; - for (int i = 0; i < 9; i++) - { - bool active = i == _currentHotbarSlot; - string label = active ? $"{i + 1} \u25bc" : $" {i + 1} "; - - var tb = new TextBlock - { - Text = label, - Width = _slotW, - TextAlignment = TextAlignment.Center, - Foreground = active ? Brushes.LightGreen : Brushes.DarkCyan, - FontWeight = FontWeight.Bold, - }; - _hotbarIndicators[i] = tb; - numberRow.Children.Add(tb); - } - panel.Children.Add(numberRow); - panel.Children.Add(BuildSlotGrid(_vm.HotbarSlots, 9)); - return panel; - } - - protected Control BuildSlotGrid(ObservableCollection slots, int columns) - { - var grid = new Grid(); - int rows = (slots.Count + columns - 1) / columns; - - for (int r = 0; r < rows; r++) - grid.RowDefinitions.Add(new RowDefinition(GridLength.Auto)); - for (int c = 0; c < columns; c++) - grid.ColumnDefinitions.Add(new ColumnDefinition(GridLength.Auto)); - - for (int i = 0; i < slots.Count; i++) - { - int row = i / columns; - int col = i % columns; - var cell = CreateSlotCell(slots[i], row, col); - Grid.SetRow(cell, row); - Grid.SetColumn(cell, col); - grid.Children.Add(cell); - } - - return grid; - } - - protected static IBrush GetSlotBg(bool isEmpty, int row, int col) - { - bool isA = (row + col) % 2 == 0; - return isEmpty - ? (isA ? BrSlotEmptyA : BrSlotEmptyB) - : (isA ? BrSlotFillA : BrSlotFillB); - } - - protected Border CreateSlotCell(SlotViewModel slot, int row = 0, int col = 0) - { - var nameTb = new TextBlock - { - TextWrapping = TextWrapping.Wrap, - Padding = new Thickness(0), - Margin = new Thickness(0), - VerticalAlignment = VerticalAlignment.Top, - }; - - var countTb = new TextBlock - { - Foreground = BrCount, - FontWeight = FontWeight.Bold, - Padding = new Thickness(0), - Margin = new Thickness(0), - HorizontalAlignment = HorizontalAlignment.Right, - VerticalAlignment = VerticalAlignment.Bottom, - }; - - ApplySlotVisual(slot, nameTb, countTb); - - int r = row, c = col; - var border = new Border - { - Width = _slotW, - Height = _slotH, - Background = GetSlotBg(slot.IsEmpty, r, c), - Child = new Panel - { - Children = { nameTb, countTb }, - }, - Tag = (slot, r, c), - }; - - border.PointerPressed += OnSlotPointerPressed; - border.PointerEntered += OnSlotPointerEnter; - border.PointerExited += OnSlotPointerExit; - border.PointerMoved += OnSlotPointerMoved; - - slot.PropertyChanged += (_, _) => - { - ApplySlotVisual(slot, nameTb, countTb); - border.Background = GetSlotBg(slot.IsEmpty, r, c); - }; - - return border; - } - - protected static void ApplySlotVisual(SlotViewModel slot, TextBlock nameTb, TextBlock countTb) - { - if (slot.IsEmpty) - { - nameTb.Text = ""; - nameTb.Foreground = BrDim; - countTb.Text = ""; - } - else - { - nameTb.Text = slot.ItemDisplayText; - nameTb.Foreground = BrName; - countTb.Text = slot.CountDisplay; - } - } - - protected TextBlock MakeLabel(string text) - { - return new TextBlock - { - Text = text, - Foreground = BrEquipLbl, - VerticalAlignment = VerticalAlignment.Center, - Margin = new Thickness(1, 0, 0, 0), - FontWeight = FontWeight.Bold, - }; - } - - #region Pointer / Keyboard interaction - - private void OnSlotPointerPressed(object? sender, PointerPressedEventArgs e) - { - if (sender is not Border border || border.Tag is not (SlotViewModel slot, int, int)) - return; - - SetHover(border, slot); - - var point = e.GetCurrentPoint(border); - bool isShift = (e.KeyModifiers & KeyModifiers.Shift) != 0; - - WindowActionType action; - if (point.Properties.IsRightButtonPressed) - action = isShift ? WindowActionType.ShiftRightClick : WindowActionType.RightClick; - else - action = isShift ? WindowActionType.ShiftClick : WindowActionType.LeftClick; - - _vm.PerformAction(slot.SlotId, action); - UpdateInfoPanel(); - UpdateHeldItemFloater(e); - OnContainerDataChanged(); - e.Handled = true; - } - - private void OnSlotPointerEnter(object? sender, PointerEventArgs e) - { - if (sender is Border b && b.Tag is (SlotViewModel slot, int, int)) - { - SetHover(b, slot); - UpdateHeldItemFloater(e); - } - } - - private void OnSlotPointerMoved(object? sender, PointerEventArgs e) - { - if (sender is Border b && b.Tag is (SlotViewModel slot, int, int)) - { - SetHover(b, slot); - UpdateHeldItemFloater(e); - } - } - - private void OnSlotPointerExit(object? sender, PointerEventArgs e) - { - if (sender is Border b && b.Tag is (SlotViewModel slot, int row, int col)) - b.Background = GetSlotBg(slot.IsEmpty, row, col); - } - - protected void SetHover(Border border, SlotViewModel slot) - { - if (_lastHoveredSlotBorder != null && _lastHoveredSlotBorder != border) - { - if (_lastHoveredSlotBorder.Tag is (SlotViewModel oldSlot, int or, int oc)) - _lastHoveredSlotBorder.Background = GetSlotBg(oldSlot.IsEmpty, or, oc); - } - - _lastHoveredSlotBorder = border; - border.Background = BrSlotHover; - _vm.HoveredSlot = slot; - UpdateInfoPanel(); - } - - protected void UpdateHeldItemFloater(PointerEventArgs e) - { - if (!_vm.HasCursorItem) - { - _heldItemFloater.IsVisible = false; - return; - } - - _heldItemFloaterName.Text = _vm.CursorItemInfo; - _heldItemFloaterCount.Text = ""; - - try - { - var pos = e.GetPosition(_overlayCanvas); - double left = pos.X + 2; - double remainingW = _termW - left - 2; - int maxW = Math.Max(8, (int)remainingW); - _heldItemFloater.MaxWidth = maxW; - Canvas.SetLeft(_heldItemFloater, left); - Canvas.SetTop(_heldItemFloater, pos.Y); - } - catch - { - _heldItemFloater.MaxWidth = 24; - Canvas.SetLeft(_heldItemFloater, 0); - Canvas.SetTop(_heldItemFloater, 0); - } - - _heldItemFloater.IsVisible = true; - } - - protected void UpdateInfoPanel() - { - _infoDetailText.Text = _vm.HoveredSlotDetailText; - - bool hasHoveredItem = _vm.HoveredSlot != null && !_vm.HoveredSlot.IsEmpty; - _infoDetailBorder.Background = hasHoveredItem ? BrInfoHighlight : Brushes.Transparent; - - if (_vm.HasCursorItem) - { - _cursorItemText.Text = _vm.CursorItemInfo; - _cursorItemText.Foreground = Brushes.Yellow; - } - else - { - _cursorItemText.Text = Translations.tui_inventory_cursor_empty; - _cursorItemText.Foreground = BrDim; - _heldItemFloater.IsVisible = false; - } - } - - protected void UpdateTitle() - { - _titleText.Text = _vm.Title; - } - - protected void CloseInventory() - { - if (_vm.WindowId != 0) - _vm.Handler.CloseInventory(_vm.WindowId); - - if (ConsoleIO.Backend is TuiConsoleBackend tuiBackend) - tuiBackend.GetView()?.HideOverlay(); - else - (Application.Current?.ApplicationLifetime as IControlledApplicationLifetime)?.Shutdown(); - } - - protected override void OnKeyDown(KeyEventArgs e) - { - base.OnKeyDown(e); - - switch (e.Key) - { - case Key.Escape: - case Key.E: - CloseInventory(); - e.Handled = true; - break; - - case Key.C: - if ((e.KeyModifiers & KeyModifiers.Shift) != 0 && - _vm.HoveredSlot != null && !_vm.HoveredSlot.IsEmpty) - { - _vm.PerformAction(_vm.HoveredSlot.SlotId, WindowActionType.ShiftClick); - UpdateInfoPanel(); - } - e.Handled = true; - break; - - case Key.Q: - if (_vm.HoveredSlot != null && !_vm.HoveredSlot.IsEmpty) - { - var action = (e.KeyModifiers & KeyModifiers.Control) != 0 - ? WindowActionType.DropItemStack - : WindowActionType.DropItem; - _vm.PerformAction(_vm.HoveredSlot.SlotId, action); - UpdateInfoPanel(); - } - e.Handled = true; - break; - - case Key.R: - _vm.RefreshFromContainer(); - _currentHotbarSlot = _vm.Handler.GetCurrentSlot(); - UpdateHotbarIndicators(); - UpdateInfoPanel(); - OnContainerDataChanged(); - e.Handled = true; - break; - } - } - - protected void UpdateHotbarIndicators() - { - for (int i = 0; i < 9; i++) - { - bool active = i == _currentHotbarSlot; - _hotbarIndicators[i].Text = active ? $"{i + 1} \u25bc" : $" {i + 1} "; - _hotbarIndicators[i].Foreground = active ? Brushes.LightGreen : Brushes.DarkCyan; - } - } - - #endregion - - #region Lifecycle - - protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) - { - base.OnAttachedToVisualTree(e); - Focusable = true; - Focus(); - AddHandler(KeyDownEvent, OnTunnelKeyDown, Avalonia.Interactivity.RoutingStrategies.Tunnel); - SizeChanged += OnViewSizeChanged; - } - - private void OnTunnelKeyDown(object? sender, KeyEventArgs e) - { - if (e.Key == Key.Escape) - { - CloseInventory(); - e.Handled = true; - } - } - - private void OnViewSizeChanged(object? sender, SizeChangedEventArgs e) - { - int newW, newH; - try - { - newW = System.Console.WindowWidth; - newH = System.Console.WindowHeight; - } - catch { return; } - - if (newW == _lastTermW && newH == _lastTermH) return; - - _vm.RefreshFromContainer(); - _currentHotbarSlot = _vm.Handler.GetCurrentSlot(); - RebuildUi(); - Focus(); - } - - protected override void OnGotFocus(GotFocusEventArgs e) - { - base.OnGotFocus(e); - Focusable = true; - } - - #endregion - - public static bool HasTuiSupport(ContainerType type) - { - return type switch - { - ContainerType.PlayerInventory => true, - ContainerType.Generic_9x1 => true, - ContainerType.Generic_9x2 => true, - ContainerType.Generic_9x3 => true, - ContainerType.Generic_9x4 => true, - ContainerType.Generic_9x5 => true, - ContainerType.Generic_9x6 => true, - ContainerType.Generic_3x3 => true, - ContainerType.Crafter => true, - ContainerType.ShulkerBox => true, - ContainerType.Crafting => true, - ContainerType.Furnace => true, - ContainerType.BlastFurnace => true, - ContainerType.Smoker => true, - ContainerType.Enchantment => true, - ContainerType.BrewingStand => true, - ContainerType.Hopper => true, - ContainerType.Grindstone => true, - _ => false, - }; - } - - public static ContainerViewBase CreateView(ContainerType type, McClient handler, int windowId) - { - return type switch - { - ContainerType.PlayerInventory => new PlayerInventoryView(handler, windowId), - ContainerType.Generic_9x3 or ContainerType.ShulkerBox => new GridContainerView(handler, windowId, type, 3, 9), - ContainerType.Generic_9x6 => new GridContainerView(handler, windowId, type, 6, 9), - ContainerType.Generic_3x3 or ContainerType.Crafter - => new GridContainerView(handler, windowId, type, 3, 3), - ContainerType.Generic_9x1 => new GridContainerView(handler, windowId, type, 1, 9), - ContainerType.Generic_9x2 => new GridContainerView(handler, windowId, type, 2, 9), - ContainerType.Generic_9x4 => new GridContainerView(handler, windowId, type, 4, 9), - ContainerType.Generic_9x5 => new GridContainerView(handler, windowId, type, 5, 9), - ContainerType.Crafting => new CraftingView(handler, windowId), - ContainerType.Furnace or ContainerType.BlastFurnace or ContainerType.Smoker - => new FurnaceView(handler, windowId, type), - ContainerType.Enchantment => new EnchantingTableView(handler, windowId), - ContainerType.BrewingStand => new BrewingStandView(handler, windowId), - ContainerType.Hopper => new HopperView(handler, windowId), - ContainerType.Grindstone => new GrindstoneView(handler, windowId), - _ => throw new ArgumentException($"No TUI view for {type}"), - }; - } - } -} diff --git a/MinecraftClient/Tui/ContainerViewModel.cs b/MinecraftClient/Tui/ContainerViewModel.cs deleted file mode 100644 index 1effcdae54..0000000000 --- a/MinecraftClient/Tui/ContainerViewModel.cs +++ /dev/null @@ -1,271 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Text; -using MinecraftClient.Inventory; -using MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; - -namespace MinecraftClient.Tui -{ - public class ContainerViewModel : INotifyPropertyChanged - { - private SlotViewModel? _hoveredSlot; - private string _title = ""; - private string _statusText = ""; - private string _cursorItemInfo = ""; - private bool _hasCursorItem; - - public McClient Handler { get; } - public int WindowId { get; } - public ContainerType ContainerType { get; } - - public ObservableCollection ContainerSlots { get; } = new(); - public ObservableCollection MainInventorySlots { get; } = new(); - public ObservableCollection HotbarSlots { get; } = new(); - - public string Title - { - get => _title; - set { _title = value; OnPropertyChanged(); } - } - - public string StatusText - { - get => _statusText; - set { _statusText = value; OnPropertyChanged(); } - } - - public string CursorItemInfo - { - get => _cursorItemInfo; - set { _cursorItemInfo = value; OnPropertyChanged(); } - } - - public bool HasCursorItem - { - get => _hasCursorItem; - set { _hasCursorItem = value; OnPropertyChanged(); } - } - - public SlotViewModel? HoveredSlot - { - get => _hoveredSlot; - set - { - if (_hoveredSlot != null) - _hoveredSlot.IsHovered = false; - _hoveredSlot = value; - if (_hoveredSlot != null) - _hoveredSlot.IsHovered = true; - OnPropertyChanged(); - OnPropertyChanged(nameof(HoveredSlotDetailText)); - } - } - - public string HoveredSlotDetailText - { - get - { - if (_hoveredSlot == null) - return Translations.tui_inventory_hover_hint; - - if (_hoveredSlot.IsEmpty) - return $"Slot #{_hoveredSlot.SlotId}\n{Translations.tui_inventory_slot_empty}"; - - var sb = new StringBuilder(); - sb.AppendLine(_hoveredSlot.ItemTypeName); - sb.AppendLine(string.Format(Translations.tui_inventory_slot_detail, _hoveredSlot.SlotId, _hoveredSlot.ItemCount)); - - var item = _hoveredSlot.RawItem; - if (item != null) - AppendItemExtras(sb, item); - - return sb.ToString().TrimEnd(); - } - } - - protected Dictionary SlotMap { get; } = new(); - - public ContainerViewModel(McClient handler, int windowId, ContainerType containerType) - { - Handler = handler; - WindowId = windowId; - ContainerType = containerType; - - InitializeSlots(); - RefreshFromContainer(); - } - - public void SetSlotDisplayParams(int maxWidth, int maxLines) - { - foreach (var kvp in SlotMap) - { - kvp.Value.NameMaxWidth = maxWidth; - kvp.Value.NameMaxLines = maxLines; - } - RefreshFromContainer(); - } - - protected virtual void InitializeSlots() - { - SlotMap.Clear(); - - int slotCount = ContainerType.SlotCount(); - if (slotCount == 0) return; - - int playerInvStart = slotCount - 36; - - for (int i = 0; i < playerInvStart; i++) - { - var slot = new SlotViewModel(i); - ContainerSlots.Add(slot); - SlotMap[i] = slot; - } - - for (int i = playerInvStart; i < playerInvStart + 27; i++) - { - var slot = new SlotViewModel(i); - MainInventorySlots.Add(slot); - SlotMap[i] = slot; - } - - for (int i = playerInvStart + 27; i < slotCount; i++) - { - int hotbarIdx = i - (playerInvStart + 27); - var slot = new SlotViewModel(i, isHotbar: true, hotbarIndex: hotbarIdx); - HotbarSlots.Add(slot); - SlotMap[i] = slot; - } - } - - public virtual void RefreshFromContainer() - { - Inventory.Container? container = Handler.GetInventory(WindowId); - if (container == null) - { - StatusText = Translations.tui_inventory_container_not_found; - return; - } - - Title = string.Format(Translations.tui_inventory_title, WindowId, container.Title); - - foreach (var kvp in SlotMap) - { - Item? item = container.Items.TryGetValue(kvp.Key, out var it) ? it : null; - kvp.Value.Update(item); - } - - UpdateCursorItem(container); - int itemCount = 0; - foreach (var kvp in container.Items) - { - if (kvp.Key >= 0 && !kvp.Value.IsEmpty) - itemCount++; - } - StatusText = string.Format(Translations.tui_inventory_item_count, itemCount); - - OnPropertyChanged(nameof(HoveredSlotDetailText)); - } - - protected void UpdateCursorItem(Inventory.Container _) - { - var playerInv = Handler.GetInventory(0); - if (playerInv != null && playerInv.Items.TryGetValue(-1, out var cursorItem) && !cursorItem.IsEmpty) - { - CursorItemInfo = FormatItemDetail(cursorItem); - HasCursorItem = true; - } - else - { - CursorItemInfo = ""; - HasCursorItem = false; - } - } - - protected static string FormatItemDetail(Item item) - { - var sb = new StringBuilder(); - sb.AppendLine($"x{item.Count} {item.GetTypeString()}"); - AppendItemExtras(sb, item); - if (sb.Length > 0 && sb[sb.Length - 1] == '\n') - sb.Remove(sb.Length - 1, 1); - return sb.ToString(); - } - - private static void AppendItemExtras(StringBuilder sb, Item item) - { - int damage = item.Damage; - if (damage != 0) - { - int maxDamage = item.Components?.OfType().FirstOrDefault()?.MaxDamage ?? 0; - if (maxDamage > 0) - sb.AppendLine($"{Translations.tui_inventory_durability}: {maxDamage - damage}/{maxDamage}"); - else - sb.AppendLine($"{Translations.cmd_inventory_damage}: {damage}"); - } - - try - { - var enchList = item.EnchantmentList; - if (enchList is not null) - { - bool isFirstEnchantment = true; - foreach (var ench in enchList) - { - string name = EnchantmentMapping.GetEnchantmentName(ench.Type); - string level = EnchantmentMapping.ConvertLevelToRomanNumbers(ench.Level); - if (isFirstEnchantment) - { - isFirstEnchantment = false; - sb.Append($"{name} {level}"); - } - else - { - sb.Append($" | {name} {level}"); - } - } - } - else if (item.NBT is not null && - (item.NBT.TryGetValue("Enchantments", out object? enchantments) || - item.NBT.TryGetValue("StoredEnchantments", out enchantments))) - { - bool isFirstEnchantment = true; - foreach (Dictionary enchantment in (object[])enchantments) - { - short level = (short)enchantment["lvl"]; - string id = ((string)enchantment["id"]).Replace(':', '.'); - string name = Protocol.Message.ChatParser.TranslateString("enchantment." + id) ?? id; - string levelStr = Protocol.Message.ChatParser.TranslateString("enchantment.level." + level) ?? level.ToString(); - if (isFirstEnchantment) - { - isFirstEnchantment = false; - sb.Append($"{name} {levelStr}"); - } - else - { - sb.Append($" | {name} {levelStr}"); - } - } - } - } - catch { } - } - - public bool PerformAction(int slotId, WindowActionType action) - { - bool result = Handler.DoWindowAction(WindowId, slotId, action); - RefreshFromContainer(); - return result; - } - - public event PropertyChangedEventHandler? PropertyChanged; - - protected void OnPropertyChanged([CallerMemberName] string? name = null) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); - } - } -} diff --git a/MinecraftClient/Tui/CraftingView.cs b/MinecraftClient/Tui/CraftingView.cs deleted file mode 100644 index dbbfc508e3..0000000000 --- a/MinecraftClient/Tui/CraftingView.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System.Collections.ObjectModel; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Layout; -using Avalonia.Media; -using MinecraftClient.Inventory; - -namespace MinecraftClient.Tui -{ - public class CraftingView : ContainerViewBase - { - private readonly CraftingViewModel _craftVm; - - public CraftingView(McClient handler, int windowId) - : base(new CraftingViewModel(handler, windowId)) - { - _craftVm = (CraftingViewModel)_vm; - Initialize(); - } - - protected override int GetTotalSlotRows() - { - return 3 + 3 + 1; - } - - protected override Control BuildContainerSpecificArea() - { - var row = new StackPanel - { - Orientation = Orientation.Horizontal, - HorizontalAlignment = HorizontalAlignment.Center, - }; - - var gridPanel = new StackPanel { Spacing = 0 }; - gridPanel.Children.Add(new TextBlock - { - Text = Translations.tui_crafting_grid, - Foreground = BrEquipLbl, - FontWeight = FontWeight.Bold, - HorizontalAlignment = HorizontalAlignment.Center, - }); - gridPanel.Children.Add(BuildSlotGrid(_craftVm.CraftingGridSlots, 3)); - row.Children.Add(gridPanel); - - row.Children.Add(new TextBlock - { - Text = " \u2192 ", - Foreground = Brushes.White, - FontWeight = FontWeight.Bold, - VerticalAlignment = VerticalAlignment.Center, - }); - - var outPanel = new StackPanel - { - VerticalAlignment = VerticalAlignment.Center, - }; - outPanel.Children.Add(new TextBlock - { - Text = Translations.tui_inventory_output, - Foreground = BrEquipLbl, - FontWeight = FontWeight.Bold, - HorizontalAlignment = HorizontalAlignment.Center, - }); - outPanel.Children.Add(CreateSlotCell(_craftVm.OutputSlot, 0, 0)); - row.Children.Add(outPanel); - - return row; - } - } - - public class CraftingViewModel : ContainerViewModel - { - public ObservableCollection CraftingGridSlots { get; } = new(); - public SlotViewModel OutputSlot { get; private set; } = null!; - - public CraftingViewModel(McClient handler, int windowId) - : base(handler, windowId, ContainerType.Crafting) - { - OutputSlot = SlotMap[0]; - } - - protected override void InitializeSlots() - { - SlotMap.Clear(); - - var output = new SlotViewModel(0); - SlotMap[0] = output; - - for (int i = 1; i <= 9; i++) - { - var slot = new SlotViewModel(i); - CraftingGridSlots.Add(slot); - SlotMap[i] = slot; - } - - for (int i = 10; i <= 36; i++) - { - var slot = new SlotViewModel(i); - MainInventorySlots.Add(slot); - SlotMap[i] = slot; - } - - for (int i = 37; i <= 45; i++) - { - int hotbarIdx = i - 37; - var slot = new SlotViewModel(i, isHotbar: true, hotbarIndex: hotbarIdx); - HotbarSlots.Add(slot); - SlotMap[i] = slot; - } - } - } -} diff --git a/MinecraftClient/Tui/DialogTuiHost.cs b/MinecraftClient/Tui/DialogTuiHost.cs deleted file mode 100644 index f94370e64e..0000000000 --- a/MinecraftClient/Tui/DialogTuiHost.cs +++ /dev/null @@ -1,449 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Input; -using Avalonia.Interactivity; -using Avalonia.Layout; -using Avalonia.Media; -using Avalonia.Threading; -using MinecraftClient.Dialogs; - -namespace MinecraftClient.Tui; - -internal interface IOverlayCloseHandler -{ - bool TryCloseByUser(); -} - -public static class DialogTuiHost -{ - public static bool TryOpen(McClient handler, DialogInstance instance, bool force) - { - if (ConsoleIO.Backend is not TuiConsoleBackend) - return false; - - Dispatcher.UIThread.Post(() => - { - var view = TuiConsoleBackend.Instance?.GetView(); - if (view is null) - return; - - if (view.HasOverlay && view.OverlayContent is not DialogView && !force) - { - handler.Log.Info(Translations.dialog_tui_pending); - return; - } - - view.ShowOverlay(new DialogView(handler, instance)); - }); - - return true; - } - - public static void CloseCurrent() - { - if (ConsoleIO.Backend is not TuiConsoleBackend) - return; - - Dispatcher.UIThread.Post(() => - { - var view = TuiConsoleBackend.Instance?.GetView(); - if (view?.OverlayContent is DialogView) - view.HideOverlay(); - }); - } -} - -internal sealed class DialogView : Border, IOverlayCloseHandler -{ - private static readonly Color AccentColor = Color.FromRgb(80, 180, 255); - private static readonly Color BorderColor = Color.FromRgb(70, 70, 70); - private static readonly Color SectionBg = Color.FromRgb(20, 20, 20); - private static readonly Color InputBg = Color.FromRgb(35, 35, 35); - - private readonly McClient _handler; - private readonly DialogInstance _instance; - private readonly TextBlock _status; - private readonly Dictionary _inputControls = new(StringComparer.Ordinal); - private readonly StackPanel _inputsPanel; - private readonly WrapPanel _buttonsPanel; - - public DialogView(McClient handler, DialogInstance instance) - { - _handler = handler; - _instance = instance; - - BorderBrush = new SolidColorBrush(BorderColor); - BorderThickness = new Thickness(1); - Background = new SolidColorBrush(Color.FromRgb(12, 12, 12)); - Padding = new Thickness(2); - HorizontalAlignment = HorizontalAlignment.Stretch; - VerticalAlignment = VerticalAlignment.Stretch; - Focusable = true; - - _status = new TextBlock - { - Foreground = Brushes.Gray, - TextWrapping = TextWrapping.Wrap, - Margin = new Thickness(0, 1, 0, 0) - }; - - _inputsPanel = new StackPanel { Spacing = 0, Margin = new Thickness(0) }; - _buttonsPanel = new WrapPanel { Orientation = Orientation.Horizontal }; - - Child = BuildContent(); - - AttachedToVisualTree += (_, _) => - { - AddHandler(KeyDownEvent, OnTunnelKeyDown, RoutingStrategies.Tunnel, handledEventsToo: true); - FocusFirstInput(); - Focus(); - }; - DetachedFromVisualTree += (_, _) => RemoveHandler(KeyDownEvent, OnTunnelKeyDown); - } - - public bool TryCloseByUser() - { - if (!_instance.Definition.CanCloseWithEscape && _instance.Definition.CancelAction is null) - { - SetStatus(Translations.dialog_cannot_cancel); - return false; - } - - var result = _handler.Dialogs.Cancel(); - SetStatus(result.Message); - if (result.Success) - CloseIfInactive(); - - return false; - } - - private Control BuildContent() - { - var root = new DockPanel { Margin = new Thickness(0) }; - - var scroll = new ScrollViewer - { - HorizontalScrollBarVisibility = Avalonia.Controls.Primitives.ScrollBarVisibility.Disabled, - VerticalScrollBarVisibility = Avalonia.Controls.Primitives.ScrollBarVisibility.Auto - }; - - var main = new StackPanel { Spacing = 0, Margin = new Thickness(0) }; - - // Title - main.Children.Add(McColorParser.CreateColoredTextBlock(_instance.Definition.DisplayTitle())); - - // Separator - main.Children.Add(new Border - { - Height = 1, - Background = new SolidColorBrush(BorderColor), - Margin = new Thickness(0, 1, 0, 1) - }); - - // Body - foreach (var body in _instance.Definition.Body) - { - if (string.IsNullOrWhiteSpace(body.Text)) - continue; - main.Children.Add(McColorParser.CreateColoredTextBlock(body.Text)); - } - - // Build action buttons - EnsureActionButtons(); - - // Inputs - foreach (var input in _instance.Definition.Inputs) - main.Children.Add(BuildInput(input)); - - // Action buttons - if (_buttonsPanel.Children.Count > 0) - main.Children.Add(_buttonsPanel); - - // Cancel hint - if (_instance.Definition.CancelAction is not null || _instance.Definition.CanCloseWithEscape) - { - main.Children.Add(new TextBlock - { - Text = Translations.dialog_render_cancel_hint, - Foreground = new SolidColorBrush(Color.FromRgb(120, 120, 120)), - TextWrapping = TextWrapping.Wrap - }); - } - - main.Children.Add(new TextBlock - { - Text = Translations.dialog_render_help_hint, - Foreground = new SolidColorBrush(Color.FromRgb(120, 120, 120)), - TextWrapping = TextWrapping.Wrap - }); - - main.Children.Add(_status); - scroll.Content = main; - root.Children.Add(scroll); - - return root; - } - - private void EnsureActionButtons() - { - if (_buttonsPanel.Children.Count > 0) - return; - - foreach (var action in _instance.Definition.Actions) - { - var btn = new Button - { - Content = McColorParser.CreateColoredTextBlock(action.Label), - Padding = new Thickness(1), - BorderThickness = new Thickness(1), - BorderBrush = new SolidColorBrush(Color.FromRgb(60, 60, 60)), - Background = new SolidColorBrush(Color.FromRgb(40, 40, 40)), - Margin = new Thickness(0, 0, 1, 1) - }; - btn.Click += (_, _) => Click(action.Index); - _buttonsPanel.Children.Add(btn); - } - - if (_instance.Definition.CancelAction is not null || _instance.Definition.CanCloseWithEscape) - { - var cancel = new Button - { - Content = McColorParser.CreateColoredTextBlock(Translations.tui_dialog_cancel), - Padding = new Thickness(1), - BorderThickness = new Thickness(1), - BorderBrush = new SolidColorBrush(Color.FromRgb(80, 40, 40)), - Background = new SolidColorBrush(Color.FromRgb(50, 25, 25)) - }; - cancel.Click += (_, _) => TryCloseByUser(); - _buttonsPanel.Children.Add(cancel); - } - } - - private Control BuildInput(DialogInput input) - { - _instance.Values.TryGetValue(input.Key, out var value); - value ??= input.InitialValue; - - var panel = new StackPanel { Spacing = 0, Margin = new Thickness(0) }; - - if (input.LabelVisible && !string.IsNullOrWhiteSpace(input.Label)) - panel.Children.Add(McColorParser.CreateColoredTextBlock(input.Label)); - - Control inner = input.Kind switch - { - DialogInputKind.Boolean => BuildBooleanInput(value, input), - DialogInputKind.SingleOption => BuildOptionInput(input, value), - DialogInputKind.NumberRange => BuildNumberInput(input, value), - _ => BuildTextInput(input, value) - }; - - _inputControls[input.Key] = inner; - - if (input.Kind == DialogInputKind.Boolean) - { - panel.Children.Add(inner); - } - else - { - panel.Children.Add(new Border - { - Background = new SolidColorBrush(InputBg), - BorderBrush = new SolidColorBrush(Color.FromRgb(55, 55, 55)), - BorderThickness = new Thickness(1), - Padding = new Thickness(1), - Child = inner - }); - } - - return panel; - } - - private Control BuildTextInput(DialogInput input, string value) - { - var tb = new TextBox - { - Text = value, - AcceptsReturn = input.Multiline, - TextWrapping = input.Multiline ? TextWrapping.Wrap : TextWrapping.NoWrap, - MaxLength = input.MaxLength, - Foreground = Brushes.White, - Background = new SolidColorBrush(InputBg), - BorderThickness = new Thickness(0), - Padding = new Thickness(0) - }; - - return tb; - } - - private Control BuildBooleanInput(string value, DialogInput input) - { - return new CheckBox - { - IsChecked = value.Equals("true", StringComparison.OrdinalIgnoreCase), - Foreground = Brushes.White, - Padding = new Thickness(0) - }; - } - - private Control BuildOptionInput(DialogInput input, string value) - { - var combo = new ComboBox - { - ItemsSource = input.Options ?? [], - Foreground = Brushes.White, - Background = new SolidColorBrush(InputBg), - BorderThickness = new Thickness(0), - Padding = new Thickness(1, 0) - }; - - combo.SelectedItem = input.Options?.FirstOrDefault(option => option.Id.Equals(value, StringComparison.Ordinal)) - ?? input.Options?.FirstOrDefault(); - - return combo; - } - - private Control BuildNumberInput(DialogInput input, string value) - { - double numValue = double.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out var parsed) - ? parsed - : input.InitialNumber ?? input.Start; - - double min = Math.Min(input.Start, input.End); - double max = Math.Max(input.Start, input.End); - - var panel = new DockPanel { LastChildFill = true }; - - var slider = new Slider - { - Minimum = min, - Maximum = max, - Value = numValue, - TickFrequency = input.Step ?? 1, - IsSnapToTickEnabled = input.Step is not null, - Foreground = new SolidColorBrush(AccentColor) - }; - - var label = new TextBlock - { - Text = numValue.ToString(CultureInfo.InvariantCulture), - Foreground = Brushes.White, - VerticalAlignment = VerticalAlignment.Center, - Margin = new Thickness(2, 0, 0, 0), - MinWidth = 16 - }; - - slider.PropertyChanged += (_, e) => - { - if (e.Property == Slider.ValueProperty) - label.Text = ((float)slider.Value).ToString(CultureInfo.InvariantCulture); - }; - - DockPanel.SetDock(label, Dock.Right); - panel.Children.Add(slider); - panel.Children.Add(label); - - return panel; - } - - private void Click(int index) - { - if (!StoreInputs()) - return; - - var result = _handler.Dialogs.Click(index); - SetStatus(result.Message); - if (result.Success) - CloseIfInactive(); - } - - private bool StoreInputs() - { - foreach (var input in _instance.Definition.Inputs) - { - if (!_inputControls.TryGetValue(input.Key, out var control)) - continue; - - var value = control switch - { - TextBox textBox => textBox.Text ?? string.Empty, - CheckBox checkBox => checkBox.IsChecked == true ? "true" : "false", - ComboBox comboBox when comboBox.SelectedItem is DialogOption option => option.Id, - Slider slider => NumberToString((float)slider.Value), - _ => input.InitialValue - }; - - var result = _handler.Dialogs.SetInput(input.Key, value); - if (!result.Success) - { - SetStatus(result.Message); - return false; - } - } - - return true; - } - - private void FocusFirstInput() - { - var first = _inputControls.Values.FirstOrDefault(); - if (first is TextBox tb) - { - tb.Focus(); - tb.SelectAll(); - } - else - { - first?.Focus(); - } - } - - private void CloseIfInactive() - { - var current = _handler.Dialogs.Current; - if (current is null) - { - DialogTuiHost.CloseCurrent(); - return; - } - - if (current.Revision != _instance.Revision) - DialogTuiHost.TryOpen(_handler, current, force: true); - } - - private void SetStatus(string text) - { - _status.Text = text; - } - - private void OnTunnelKeyDown(object? sender, KeyEventArgs e) - { - if (e.Key == Key.Escape) - { - TryCloseByUser(); - e.Handled = true; - return; - } - - if (e.Key == Key.Enter) - { - var focused = TopLevel.GetTopLevel(this)?.FocusManager?.GetFocusedElement(); - if (focused is TextBox && _instance.Definition.Actions.Count > 0) - { - Click(_instance.Definition.Actions[0].Index); - e.Handled = true; - } - } - } - - private static string NumberToString(float value) - { - var integer = (int)value; - return integer == value - ? integer.ToString(CultureInfo.InvariantCulture) - : value.ToString(CultureInfo.InvariantCulture); - } -} diff --git a/MinecraftClient/Tui/EnchantingTableView.cs b/MinecraftClient/Tui/EnchantingTableView.cs deleted file mode 100644 index c1386d7acc..0000000000 --- a/MinecraftClient/Tui/EnchantingTableView.cs +++ /dev/null @@ -1,198 +0,0 @@ -using System.Collections.ObjectModel; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Layout; -using Avalonia.Media; -using MinecraftClient.Inventory; - -namespace MinecraftClient.Tui -{ - public class EnchantingTableView : ContainerViewBase - { - private readonly EnchantingViewModel _enchantVm; - private readonly TextBlock[] _enchantNameLabels = new TextBlock[3]; - private readonly TextBlock[] _enchantCostLabels = new TextBlock[3]; - - public EnchantingTableView(McClient handler, int windowId) - : base(new EnchantingViewModel(handler, windowId)) - { - _enchantVm = (EnchantingViewModel)_vm; - Initialize(); - } - - private void RefreshEnchantOptions() - { - var container = _vm.Handler.GetInventory(_vm.WindowId); - if (container == null) return; - - int protocolVersion = _vm.Handler.GetProtocolVersion(); - - for (int i = 0; i < 3; i++) - { - if (_enchantNameLabels[i] == null) continue; - - short levelReq = container.Properties.TryGetValue(i, out var lr) ? lr : (short)0; - short enchantId = container.Properties.TryGetValue(i + 4, out var eid) ? eid : (short)-1; - short enchantLevel = container.Properties.TryGetValue(i + 7, out var el) ? el : (short)0; - - if (levelReq > 0 && enchantId >= 0) - { - try - { - var enchant = EnchantmentMapping.GetEnchantmentById(protocolVersion, enchantId); - string name = EnchantmentMapping.GetEnchantmentName(enchant); - string roman = EnchantmentMapping.ConvertLevelToRomanNumbers(enchantLevel); - _enchantNameLabels[i].Text = $"{name} {roman}"; - _enchantCostLabels[i].Text = $" ({levelReq})"; - } - catch - { - _enchantNameLabels[i].Text = string.Format(Translations.tui_enchanting_option_slot, i + 1); - _enchantCostLabels[i].Text = levelReq > 0 ? $" ({levelReq})" : ""; - } - } - else - { - _enchantNameLabels[i].Text = string.Format(Translations.tui_enchanting_option_slot, i + 1); - _enchantCostLabels[i].Text = ""; - } - } - } - - protected override void OnContainerDataChanged() - { - RefreshEnchantOptions(); - } - - protected override int GetTotalSlotRows() - { - return 3 + 3 + 1; - } - - protected override Control BuildContainerSpecificArea() - { - var panel = new StackPanel - { - Orientation = Orientation.Horizontal, - HorizontalAlignment = HorizontalAlignment.Center, - Spacing = 0, - }; - - var slotsCol = new StackPanel - { - Spacing = 0, - VerticalAlignment = VerticalAlignment.Center, - }; - - slotsCol.Children.Add(new TextBlock - { - Text = Translations.tui_enchanting_item, - Foreground = BrEquipLbl, - FontWeight = FontWeight.Bold, - HorizontalAlignment = HorizontalAlignment.Center, - }); - slotsCol.Children.Add(CreateSlotCell(_enchantVm.ItemSlot, 0, 0)); - - slotsCol.Children.Add(new TextBlock - { - Text = Translations.tui_enchanting_lapis, - Foreground = new SolidColorBrush(Color.FromRgb(60, 80, 200)), - FontWeight = FontWeight.Bold, - HorizontalAlignment = HorizontalAlignment.Center, - }); - slotsCol.Children.Add(CreateSlotCell(_enchantVm.LapisSlot, 1, 0)); - - panel.Children.Add(slotsCol); - - var optionsCol = new StackPanel - { - VerticalAlignment = VerticalAlignment.Center, - Margin = new Thickness(2, 0, 0, 0), - }; - - optionsCol.Children.Add(new TextBlock - { - Text = Translations.tui_enchanting_options, - Foreground = Brushes.Magenta, - FontWeight = FontWeight.Bold, - }); - - int optionWidth = System.Math.Max(_slotW * 4, 30); - - for (int i = 0; i < 3; i++) - { - var nameLabel = new TextBlock - { - Text = string.Format(Translations.tui_enchanting_option_slot, i + 1), - Foreground = new SolidColorBrush(Color.FromRgb(100, 200, 70)), - TextWrapping = TextWrapping.NoWrap, - }; - _enchantNameLabels[i] = nameLabel; - - var costLabel = new TextBlock - { - Foreground = new SolidColorBrush(Color.FromRgb(100, 200, 70)), - FontWeight = FontWeight.Bold, - VerticalAlignment = VerticalAlignment.Center, - }; - _enchantCostLabels[i] = costLabel; - - var content = new DockPanel(); - DockPanel.SetDock(costLabel, Dock.Right); - content.Children.Add(costLabel); - content.Children.Add(nameLabel); - - optionsCol.Children.Add(new Border - { - Background = new SolidColorBrush(Color.FromRgb(55, 50, 40)), - MinWidth = optionWidth, - MinHeight = _slotH, - Padding = new Thickness(1, 0), - Child = content, - }); - } - - RefreshEnchantOptions(); - - panel.Children.Add(optionsCol); - - return panel; - } - } - - public class EnchantingViewModel : ContainerViewModel - { - public SlotViewModel ItemSlot { get; private set; } = null!; - public SlotViewModel LapisSlot { get; private set; } = null!; - - public EnchantingViewModel(McClient handler, int windowId) - : base(handler, windowId, ContainerType.Enchantment) - { - ItemSlot = SlotMap[0]; - LapisSlot = SlotMap[1]; - } - - protected override void InitializeSlots() - { - SlotMap.Clear(); - - SlotMap[0] = new SlotViewModel(0); - SlotMap[1] = new SlotViewModel(1); - - for (int i = 2; i <= 28; i++) - { - var slot = new SlotViewModel(i); - MainInventorySlots.Add(slot); - SlotMap[i] = slot; - } - - for (int i = 29; i <= 37; i++) - { - int hotbarIdx = i - 29; - var slot = new SlotViewModel(i, isHotbar: true, hotbarIndex: hotbarIdx); - HotbarSlots.Add(slot); - SlotMap[i] = slot; - } - } - } -} diff --git a/MinecraftClient/Tui/FurnaceView.cs b/MinecraftClient/Tui/FurnaceView.cs deleted file mode 100644 index cde8054c56..0000000000 --- a/MinecraftClient/Tui/FurnaceView.cs +++ /dev/null @@ -1,133 +0,0 @@ -using System.Collections.ObjectModel; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Layout; -using Avalonia.Media; -using MinecraftClient.Inventory; - -namespace MinecraftClient.Tui -{ - public class FurnaceView : ContainerViewBase - { - private readonly FurnaceViewModel _furnaceVm; - - public FurnaceView(McClient handler, int windowId, ContainerType type) - : base(new FurnaceViewModel(handler, windowId, type)) - { - _furnaceVm = (FurnaceViewModel)_vm; - Initialize(); - } - - protected override int GetTotalSlotRows() - { - return 3 + 3 + 1; - } - - protected override Control BuildContainerSpecificArea() - { - var panel = new StackPanel - { - Orientation = Orientation.Horizontal, - HorizontalAlignment = HorizontalAlignment.Center, - Spacing = 0, - }; - - var leftCol = new StackPanel - { - Spacing = 0, - VerticalAlignment = VerticalAlignment.Center, - }; - - leftCol.Children.Add(new TextBlock - { - Text = Translations.tui_furnace_input, - Foreground = BrEquipLbl, - FontWeight = FontWeight.Bold, - HorizontalAlignment = HorizontalAlignment.Center, - }); - leftCol.Children.Add(CreateSlotCell(_furnaceVm.InputSlot, 0, 0)); - - leftCol.Children.Add(new TextBlock - { - Text = "\u2592\u2592\u2592", - Foreground = new SolidColorBrush(Color.FromRgb(180, 100, 40)), - HorizontalAlignment = HorizontalAlignment.Center, - }); - - leftCol.Children.Add(new TextBlock - { - Text = Translations.tui_furnace_fuel, - Foreground = BrEquipLbl, - FontWeight = FontWeight.Bold, - HorizontalAlignment = HorizontalAlignment.Center, - }); - leftCol.Children.Add(CreateSlotCell(_furnaceVm.FuelSlot, 1, 0)); - - panel.Children.Add(leftCol); - - panel.Children.Add(new TextBlock - { - Text = " \u2192 ", - Foreground = Brushes.White, - FontWeight = FontWeight.Bold, - VerticalAlignment = VerticalAlignment.Center, - }); - - var rightCol = new StackPanel - { - VerticalAlignment = VerticalAlignment.Center, - }; - rightCol.Children.Add(new TextBlock - { - Text = Translations.tui_furnace_output, - Foreground = BrEquipLbl, - FontWeight = FontWeight.Bold, - HorizontalAlignment = HorizontalAlignment.Center, - }); - rightCol.Children.Add(CreateSlotCell(_furnaceVm.OutputSlot, 0, 1)); - - panel.Children.Add(rightCol); - - return panel; - } - } - - public class FurnaceViewModel : ContainerViewModel - { - public SlotViewModel InputSlot { get; private set; } = null!; - public SlotViewModel FuelSlot { get; private set; } = null!; - public SlotViewModel OutputSlot { get; private set; } = null!; - - public FurnaceViewModel(McClient handler, int windowId, ContainerType type) - : base(handler, windowId, type) - { - InputSlot = SlotMap[0]; - FuelSlot = SlotMap[1]; - OutputSlot = SlotMap[2]; - } - - protected override void InitializeSlots() - { - SlotMap.Clear(); - - SlotMap[0] = new SlotViewModel(0); - SlotMap[1] = new SlotViewModel(1); - SlotMap[2] = new SlotViewModel(2); - - for (int i = 3; i <= 29; i++) - { - var slot = new SlotViewModel(i); - MainInventorySlots.Add(slot); - SlotMap[i] = slot; - } - - for (int i = 30; i <= 38; i++) - { - int hotbarIdx = i - 30; - var slot = new SlotViewModel(i, isHotbar: true, hotbarIndex: hotbarIdx); - HotbarSlots.Add(slot); - SlotMap[i] = slot; - } - } - } -} diff --git a/MinecraftClient/Tui/GridContainerView.cs b/MinecraftClient/Tui/GridContainerView.cs deleted file mode 100644 index c2da293beb..0000000000 --- a/MinecraftClient/Tui/GridContainerView.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Avalonia.Controls; -using Avalonia.Layout; -using Avalonia.Media; -using MinecraftClient.Inventory; - -namespace MinecraftClient.Tui -{ - public class GridContainerView : ContainerViewBase - { - private readonly int _gridRows; - private readonly int _gridCols; - - public GridContainerView(McClient handler, int windowId, ContainerType type, int rows, int cols) - : base(new ContainerViewModel(handler, windowId, type)) - { - _gridRows = rows; - _gridCols = cols; - Initialize(); - } - - protected override int GetTotalSlotRows() - { - return _gridRows + 3 + 1; - } - - protected override Control BuildContainerSpecificArea() - { - return BuildSlotGrid(_vm.ContainerSlots, _gridCols); - } - } -} diff --git a/MinecraftClient/Tui/GrindstoneView.cs b/MinecraftClient/Tui/GrindstoneView.cs deleted file mode 100644 index 04a283a698..0000000000 --- a/MinecraftClient/Tui/GrindstoneView.cs +++ /dev/null @@ -1,126 +0,0 @@ -using System.Collections.ObjectModel; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Layout; -using Avalonia.Media; -using MinecraftClient.Inventory; - -namespace MinecraftClient.Tui -{ - public class GrindstoneView : ContainerViewBase - { - private readonly GrindstoneViewModel _grindVm; - - public GrindstoneView(McClient handler, int windowId) - : base(new GrindstoneViewModel(handler, windowId)) - { - _grindVm = (GrindstoneViewModel)_vm; - Initialize(); - } - - protected override int GetTotalSlotRows() - { - return 2 + 3 + 1; - } - - protected override Control BuildContainerSpecificArea() - { - var row = new StackPanel - { - Orientation = Orientation.Horizontal, - HorizontalAlignment = HorizontalAlignment.Center, - Spacing = 0, - }; - - var inputCol = new StackPanel - { - Spacing = 0, - VerticalAlignment = VerticalAlignment.Center, - }; - - inputCol.Children.Add(new TextBlock - { - Text = Translations.tui_grindstone_input1, - Foreground = BrEquipLbl, - FontWeight = FontWeight.Bold, - HorizontalAlignment = HorizontalAlignment.Center, - }); - inputCol.Children.Add(CreateSlotCell(_grindVm.Input1Slot, 0, 0)); - - inputCol.Children.Add(new TextBlock - { - Text = Translations.tui_grindstone_input2, - Foreground = BrEquipLbl, - FontWeight = FontWeight.Bold, - HorizontalAlignment = HorizontalAlignment.Center, - }); - inputCol.Children.Add(CreateSlotCell(_grindVm.Input2Slot, 1, 0)); - - row.Children.Add(inputCol); - - row.Children.Add(new TextBlock - { - Text = "=>", - Foreground = Brushes.White, - FontWeight = FontWeight.Bold, - VerticalAlignment = VerticalAlignment.Center, - Padding = new Thickness(1, 0), - }); - - var outCol = new StackPanel - { - VerticalAlignment = VerticalAlignment.Center, - }; - outCol.Children.Add(new TextBlock - { - Text = Translations.tui_inventory_output, - Foreground = BrEquipLbl, - FontWeight = FontWeight.Bold, - HorizontalAlignment = HorizontalAlignment.Center, - }); - outCol.Children.Add(CreateSlotCell(_grindVm.OutputSlot, 0, 1)); - row.Children.Add(outCol); - - return row; - } - } - - public class GrindstoneViewModel : ContainerViewModel - { - public SlotViewModel Input1Slot { get; private set; } = null!; - public SlotViewModel Input2Slot { get; private set; } = null!; - public SlotViewModel OutputSlot { get; private set; } = null!; - - public GrindstoneViewModel(McClient handler, int windowId) - : base(handler, windowId, ContainerType.Grindstone) - { - Input1Slot = SlotMap[0]; - Input2Slot = SlotMap[1]; - OutputSlot = SlotMap[2]; - } - - protected override void InitializeSlots() - { - SlotMap.Clear(); - - SlotMap[0] = new SlotViewModel(0); - SlotMap[1] = new SlotViewModel(1); - SlotMap[2] = new SlotViewModel(2); - - for (int i = 3; i <= 29; i++) - { - var slot = new SlotViewModel(i); - MainInventorySlots.Add(slot); - SlotMap[i] = slot; - } - - for (int i = 30; i <= 38; i++) - { - int hotbarIdx = i - 30; - var slot = new SlotViewModel(i, isHotbar: true, hotbarIndex: hotbarIdx); - HotbarSlots.Add(slot); - SlotMap[i] = slot; - } - } - } -} diff --git a/MinecraftClient/Tui/HopperView.cs b/MinecraftClient/Tui/HopperView.cs deleted file mode 100644 index bb69b2ae49..0000000000 --- a/MinecraftClient/Tui/HopperView.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Avalonia.Controls; -using Avalonia.Layout; -using MinecraftClient.Inventory; - -namespace MinecraftClient.Tui -{ - public class HopperView : ContainerViewBase - { - public HopperView(McClient handler, int windowId) - : base(new ContainerViewModel(handler, windowId, ContainerType.Hopper)) - { - Initialize(); - } - - protected override int GetTotalSlotRows() - { - return 1 + 3 + 1; - } - - protected override Control BuildContainerSpecificArea() - { - var grid = BuildSlotGrid(_vm.ContainerSlots, 5); - return new StackPanel - { - HorizontalAlignment = HorizontalAlignment.Center, - Children = { grid }, - }; - } - } -} diff --git a/MinecraftClient/Tui/IconGridBuilder.cs b/MinecraftClient/Tui/IconGridBuilder.cs deleted file mode 100644 index 3d13a8e28d..0000000000 --- a/MinecraftClient/Tui/IconGridBuilder.cs +++ /dev/null @@ -1,125 +0,0 @@ -using System; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Media; - -namespace MinecraftClient.Tui -{ - internal static class IconGridBuilder - { - internal static Grid BuildFromRgba(byte[] rgba, int srcWidth, int srcHeight, int displaySize) - { - int cellCols = displaySize; - int cellRows = displaySize / 2; - - var grid = new Grid(); - for (int c = 0; c < cellCols; c++) - grid.ColumnDefinitions.Add(new ColumnDefinition(1, GridUnitType.Auto)); - for (int r = 0; r < cellRows; r++) - grid.RowDefinitions.Add(new RowDefinition(1, GridUnitType.Auto)); - - for (int row = 0; row < cellRows; row++) - { - for (int col = 0; col < cellCols; col++) - { - int topPixelY = row * 2; - int bottomPixelY = row * 2 + 1; - - var topColor = SamplePixel(rgba, srcWidth, srcHeight, col, topPixelY, cellCols, displaySize); - var bottomColor = SamplePixel(rgba, srcWidth, srcHeight, col, bottomPixelY, cellCols, displaySize); - - var cell = new TextBlock - { - Text = "\u2580", - Foreground = new SolidColorBrush(topColor), - Background = new SolidColorBrush(bottomColor), - Padding = new Thickness(0), - Margin = new Thickness(0), - }; - - Grid.SetRow(cell, row); - Grid.SetColumn(cell, col); - grid.Children.Add(cell); - } - } - - return grid; - } - - internal static Grid BuildFromBase64(string base64Data, int displaySize) - { - byte[] imageBytes; - try - { - imageBytes = Convert.FromBase64String(base64Data); - } - catch - { - return new Grid(); - } - - return BuildFromImageBytes(imageBytes, displaySize) ?? new Grid(); - } - - internal static Grid? BuildFromImageBytes(byte[] imageBytes, int displaySize) - { - int srcWidth, srcHeight; - byte[] rgba; - try - { - (srcWidth, srcHeight, rgba) = DecodeImageToRgba(imageBytes); - } - catch - { - return null; - } - - return BuildFromRgba(rgba, srcWidth, srcHeight, displaySize); - } - - internal static (int Width, int Height, byte[] Rgba) DecodeImageToRgba(byte[] imageData) - { - using var image = new ImageMagick.MagickImage(imageData); - int w = (int)image.Width; - int h = (int)image.Height; - - using var pixels = image.GetPixelsUnsafe(); - var rgba = new byte[w * h * 4]; - - for (int y = 0; y < h; y++) - { - for (int x = 0; x < w; x++) - { - var pixel = pixels.GetPixel(x, y)!; - int idx = (y * w + x) * 4; - var color = pixel.ToColor()!; - rgba[idx] = (byte)(color.R >> 8); - rgba[idx + 1] = (byte)(color.G >> 8); - rgba[idx + 2] = (byte)(color.B >> 8); - rgba[idx + 3] = (byte)(color.A >> 8); - } - } - - return (w, h, rgba); - } - - private static Color SamplePixel(byte[] rgba, int srcW, int srcH, int dstX, int dstY, int dstW, int dstH) - { - int srcX = dstX * srcW / dstW; - int srcY = dstY * srcH / dstH; - srcX = Math.Clamp(srcX, 0, srcW - 1); - srcY = Math.Clamp(srcY, 0, srcH - 1); - - int idx = (srcY * srcW + srcX) * 4; - if (idx + 3 >= rgba.Length) - return Color.FromRgb(0, 0, 0); - - byte r = rgba[idx]; - byte g = rgba[idx + 1]; - byte b = rgba[idx + 2]; - byte a = rgba[idx + 3]; - - return a < 128 ? Color.FromRgb(0, 0, 0) : Color.FromRgb(r, g, b); - } - } -} diff --git a/MinecraftClient/Tui/InventoryApp.cs b/MinecraftClient/Tui/InventoryApp.cs deleted file mode 100644 index ea8663008d..0000000000 --- a/MinecraftClient/Tui/InventoryApp.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Avalonia; -using Avalonia.Controls; -using Avalonia.Controls.ApplicationLifetimes; -using Consolonia.Themes; -using MinecraftClient.Inventory; - -namespace MinecraftClient.Tui -{ - public class InventoryApp : Application - { - public override void Initialize() - { - Styles.Add(new ModernTheme()); - } - - public override void OnFrameworkInitializationCompleted() - { - if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) - { - var handler = InventoryTuiHost.ActiveHandler!; - var windowId = InventoryTuiHost.ActiveWindowId; - var container = handler.GetInventory(windowId); - var containerType = container?.Type ?? ContainerType.PlayerInventory; - var view = ContainerViewBase.CreateView(containerType, handler, windowId); - - desktop.MainWindow = new Window - { - Content = view, - Title = "MCC Inventory" - }; - } - - base.OnFrameworkInitializationCompleted(); - } - } -} diff --git a/MinecraftClient/Tui/InventoryMainView.cs b/MinecraftClient/Tui/InventoryMainView.cs deleted file mode 100644 index d141870db5..0000000000 --- a/MinecraftClient/Tui/InventoryMainView.cs +++ /dev/null @@ -1,129 +0,0 @@ -using Avalonia; -using Avalonia.Controls; -using Avalonia.Layout; -using Avalonia.Media; - -namespace MinecraftClient.Tui -{ - public class PlayerInventoryView : ContainerViewBase - { - private readonly PlayerInventoryViewModel _playerVm; - private int _topGap; - - public PlayerInventoryView(McClient handler, int windowId) - : base(new PlayerInventoryViewModel(handler, windowId)) - { - _playerVm = (PlayerInventoryViewModel)_vm; - Initialize(); - } - - protected override int GetTotalSlotRows() - { - return 6; - } - - protected override void RebuildUi() - { - int availW = 0; - try { availW = System.Console.WindowWidth - 26; } catch { availW = 94; } - int slotW = System.Math.Clamp(availW / 9, 8, 18); - int topUsedW = slotW * 4 + 8 + slotW * 2 + 4 + slotW; - _topGap = System.Math.Max(2, (slotW * 9 - topUsedW) / 2); - - base.RebuildUi(); - } - - protected override Control BuildContainerSpecificArea() - { - var row = new StackPanel - { - Orientation = Orientation.Horizontal, - HorizontalAlignment = HorizontalAlignment.Center, - }; - - var offPanel = new StackPanel - { - VerticalAlignment = VerticalAlignment.Center, - Margin = new Thickness(0, 0, 1, 0), - }; - offPanel.Children.Add(new TextBlock - { - Text = Translations.tui_inventory_offhand, - Foreground = BrEquipLbl, - FontWeight = FontWeight.Bold, - HorizontalAlignment = HorizontalAlignment.Center, - }); - offPanel.Children.Add(CreateSlotCell(_playerVm.OffhandSlot, 0, 0)); - row.Children.Add(offPanel); - - var equipGrid = new Grid - { - RowDefinitions = new RowDefinitions("Auto,Auto"), - ColumnDefinitions = new ColumnDefinitions("Auto,Auto,Auto,Auto"), - }; - - void AddEquipSlot(int r, int gc, string label, int eqIdx) - { - var lbl = MakeLabel(label); - Grid.SetRow(lbl, r); Grid.SetColumn(lbl, gc); - equipGrid.Children.Add(lbl); - var btn = CreateSlotCell(_playerVm.EquipmentSlots[eqIdx], r, gc / 2); - Grid.SetRow(btn, r); Grid.SetColumn(btn, gc + 1); - equipGrid.Children.Add(btn); - } - - AddEquipSlot(0, 0, Translations.tui_inventory_equip_head, 0); - AddEquipSlot(0, 2, Translations.tui_inventory_equip_body, 1); - AddEquipSlot(1, 0, Translations.tui_inventory_equip_legs, 2); - AddEquipSlot(1, 2, Translations.tui_inventory_equip_feet, 3); - - row.Children.Add(equipGrid); - row.Children.Add(new Border { Width = _topGap }); - - var craftGrid = new Grid - { - RowDefinitions = new RowDefinitions("Auto,Auto"), - ColumnDefinitions = new ColumnDefinitions("Auto,Auto,Auto,Auto"), - }; - - for (int ci = 0; ci < 4; ci++) - { - int cr = ci / 2, cc = ci % 2; - var cs = CreateSlotCell(_playerVm.CraftingInputSlots[ci], cr, cc); - Grid.SetRow(cs, cr); - Grid.SetColumn(cs, cc); - craftGrid.Children.Add(cs); - } - - var arrowTb = new TextBlock - { - Text = "=>", - Foreground = Brushes.White, - FontWeight = FontWeight.Bold, - VerticalAlignment = VerticalAlignment.Top, - Padding = new Thickness(1, 0), - }; - Grid.SetRow(arrowTb, 1); Grid.SetColumn(arrowTb, 2); - craftGrid.Children.Add(arrowTb); - - var craftOutPanel = new StackPanel - { - VerticalAlignment = VerticalAlignment.Center, - }; - craftOutPanel.Children.Add(new TextBlock - { - Text = Translations.tui_inventory_output, - Foreground = BrEquipLbl, - FontWeight = FontWeight.Bold, - HorizontalAlignment = HorizontalAlignment.Center, - }); - craftOutPanel.Children.Add(CreateSlotCell(_playerVm.CraftingOutputSlot, 0, 1)); - Grid.SetRow(craftOutPanel, 0); Grid.SetColumn(craftOutPanel, 3); - Grid.SetRowSpan(craftOutPanel, 2); - craftGrid.Children.Add(craftOutPanel); - - row.Children.Add(craftGrid); - return row; - } - } -} diff --git a/MinecraftClient/Tui/InventoryTuiHost.cs b/MinecraftClient/Tui/InventoryTuiHost.cs deleted file mode 100644 index f740ffd40e..0000000000 --- a/MinecraftClient/Tui/InventoryTuiHost.cs +++ /dev/null @@ -1,209 +0,0 @@ -using System; -using System.Threading; -using Avalonia; -using Avalonia.Threading; -using Consolonia; -using MinecraftClient.Inventory; - -namespace MinecraftClient.Tui -{ - /// - /// Manages the lifecycle of the inventory TUI. - /// In TUI mode: opens as a Consolonia dialog window. - /// In classic mode: launches standalone Consolonia on a dedicated thread. - /// - public static class InventoryTuiHost - { - private static volatile bool _isRunning; - private static bool _classicEverLaunched; - - public static McClient? ActiveHandler { get; private set; } - public static int ActiveWindowId { get; private set; } - - public static bool IsRunning => _isRunning; - - /// - /// Called by McClient.OnInventoryClose when the server closes a container. - /// If the closed window matches the active TUI window, auto-close the TUI. - /// - public static void NotifyInventoryClosed(int windowId) - { - if (!_isRunning || windowId != ActiveWindowId) - return; - - if (ConsoleIO.Backend is TuiConsoleBackend) - { - Dispatcher.UIThread.Post(() => - { - var view = TuiConsoleBackend.Instance?.GetView(); - view?.HideOverlay(); - }); - } - else - { - (Avalonia.Application.Current?.ApplicationLifetime - as Avalonia.Controls.ApplicationLifetimes.IControlledApplicationLifetime)?.Shutdown(); - } - } - - /// - /// Whether the TUI can be launched (classic mode has a one-shot limit). - /// - public static bool CanLaunch - { - get - { - if (_isRunning) return false; - if (ConsoleIO.Backend is TuiConsoleBackend) return true; - return !_classicEverLaunched; - } - } - - /// - /// Called before standalone TUI takes over the terminal (classic mode only). - /// - public static Action? OnSuspendConsole { get; set; } - - /// - /// Called after standalone TUI releases the terminal (classic mode only). - /// - public static Action? OnResumeConsole { get; set; } - - public static bool Launch(McClient handler, int windowId) - { - if (_isRunning) - return false; - - Container? container = handler.GetInventory(windowId); - if (container == null) - return false; - - _isRunning = true; - ActiveHandler = handler; - ActiveWindowId = windowId; - - if (ConsoleIO.Backend is TuiConsoleBackend) - { - LaunchAsDialog(); - } - else - { - if (_classicEverLaunched) - { - _isRunning = false; - ActiveHandler = null; - return false; - } - var tuiThread = new Thread(RunClassicTui) { Name = "InventoryTUI", IsBackground = false }; - tuiThread.Start(); - } - - return true; - } - - /// - /// Open inventory as an overlay panel within the main TUI view. - /// - private static void LaunchAsDialog() - { - Dispatcher.UIThread.Post(() => - { - try - { - var view = TuiConsoleBackend.Instance?.GetView(); - if (view != null) - { - var container = ActiveHandler!.GetInventory(ActiveWindowId); - var content = ContainerViewBase.CreateView( - container?.Type ?? ContainerType.PlayerInventory, - ActiveHandler, ActiveWindowId); - view.ShowOverlay(content, () => - { - ActiveHandler = null; - _isRunning = false; - }); - } - else - { - ActiveHandler = null; - _isRunning = false; - } - } - catch (Exception ex) - { - ConsoleIO.WriteLineFormatted($"§c[InventoryTUI] Error: {ex.Message}"); - ConsoleIO.WriteLineFormatted($"§c[InventoryTUI] Stack: {ex.StackTrace}"); - if (ex.InnerException != null) - ConsoleIO.WriteLineFormatted($"§c[InventoryTUI] Inner: {ex.InnerException.Message}"); - ActiveHandler = null; - _isRunning = false; - } - }); - } - - /// - /// Classic mode: run standalone Consolonia on a dedicated thread. - /// - private static void RunClassicTui() - { - try - { - OnSuspendConsole?.Invoke(); - _classicEverLaunched = true; - - AppBuilder builder = AppBuilder.Configure() - .UseConsolonia() - .UseAutoDetectedConsole() - .LogToException(); - - builder.StartWithConsoleLifetime(Array.Empty()); - } - catch (Exception ex) - { - System.Console.Error.WriteLine($"[InventoryTUI] Error: {ex.Message}"); - System.Console.Error.WriteLine($"[InventoryTUI] Stack: {ex.StackTrace}"); - if (ex.InnerException != null) - System.Console.Error.WriteLine($"[InventoryTUI] Inner: {ex.InnerException}"); - } - finally - { - RestoreTerminalState(); - OnResumeConsole?.Invoke(); - ActiveHandler = null; - _isRunning = false; - } - } - - private static void RestoreTerminalState() - { - try - { - System.Console.Write("\x1b[?1049l"); - System.Console.Write("\x1b[?25h"); - System.Console.Write("\x1b[?1000l"); - System.Console.Write("\x1b[?1002l"); - System.Console.Write("\x1b[?1003l"); - System.Console.Write("\x1b[?1006l"); - System.Console.Write("\x1b[?2004l"); - System.Console.Write("\x1b[0m"); - System.Console.Write("\x1b(B"); - System.Console.Out.Flush(); - - try - { - using var proc = System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo - { - FileName = "stty", - Arguments = "sane", - UseShellExecute = false, - RedirectStandardOutput = true, - RedirectStandardError = true, - }); - proc?.WaitForExit(2000); - } - catch { } - } - catch { } - } - } -} diff --git a/MinecraftClient/Tui/InventoryViewModel.cs b/MinecraftClient/Tui/InventoryViewModel.cs deleted file mode 100644 index 3b29928fe4..0000000000 --- a/MinecraftClient/Tui/InventoryViewModel.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System.Collections.ObjectModel; -using MinecraftClient.Inventory; - -namespace MinecraftClient.Tui -{ - public class PlayerInventoryViewModel : ContainerViewModel - { - public ObservableCollection EquipmentSlots { get; } = new(); - public ObservableCollection CraftingInputSlots { get; } = new(); - public SlotViewModel CraftingOutputSlot { get; } - public SlotViewModel OffhandSlot { get; } - - public PlayerInventoryViewModel(McClient handler, int windowId) - : base(handler, windowId, ContainerType.PlayerInventory) - { - CraftingOutputSlot = SlotMap[0]; - OffhandSlot = SlotMap[45]; - } - - protected override void InitializeSlots() - { - SlotMap.Clear(); - - var craftOut = new SlotViewModel(0); - SlotMap[0] = craftOut; - - for (int i = 1; i <= 4; i++) - { - var slot = new SlotViewModel(i); - CraftingInputSlots.Add(slot); - SlotMap[i] = slot; - } - - for (int i = 5; i <= 8; i++) - { - var slot = new SlotViewModel(i); - EquipmentSlots.Add(slot); - SlotMap[i] = slot; - } - - for (int i = 9; i <= 35; i++) - { - var slot = new SlotViewModel(i); - MainInventorySlots.Add(slot); - SlotMap[i] = slot; - } - - for (int i = 36; i <= 44; i++) - { - int hotbarIdx = i - 36; - var slot = new SlotViewModel(i, isHotbar: true, hotbarIndex: hotbarIdx); - HotbarSlots.Add(slot); - SlotMap[i] = slot; - } - - var offhand = new SlotViewModel(45); - SlotMap[45] = offhand; - } - } -} diff --git a/MinecraftClient/Tui/MainTuiView.cs b/MinecraftClient/Tui/MainTuiView.cs deleted file mode 100644 index 78ec25924f..0000000000 --- a/MinecraftClient/Tui/MainTuiView.cs +++ /dev/null @@ -1,1250 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Runtime.InteropServices; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Controls.Primitives; -using Avalonia.Controls.Templates; -using Avalonia.Input; -using Avalonia.Layout; -using Avalonia.Media; -using Avalonia.Threading; -using MinecraftClient.Inventory; - -namespace MinecraftClient.Tui -{ - public class MainTuiView : UserControl - { - private static readonly int MaxLogLines = ResolveMaxLogLines(); - private const int CtrlCDoublePressMsec = 1500; - - private static int ResolveMaxLogLines() - { - int configured = Settings.Config.Console.General.TUI_Log_Scrollback; - if (configured > 0) - return configured; - - return 3000; - } - - private readonly ObservableCollection _logLines = new(); - private readonly ObservableCollection _logControls = new(); - private readonly ItemsControl _logItemsControl; - private readonly ScrollViewer _logScrollViewer; - private readonly TextBox _commandInput; - private bool _autoScroll = true; - private bool _programmaticScroll; - private readonly ObservableCollection _commandHistory = new(); - private int _historyIndex = -1; - - private readonly Panel _rootPanel; - private readonly DockPanel _mainContent; - private Control? _overlayContent; - private Action? _overlayCloseCallback; - - private readonly TextBlock _statusBar; - private readonly Border _notificationBorder; - private readonly TextBlock _notificationText; - private long _lastCtrlCTicks; - private long _lastLogClickTicks; - private const int DoubleClickMsec = 500; - - private readonly Border _minimapBorder; - private readonly MinimapControl _minimapControl; - private volatile bool _minimapVisible; - - private TuiTooltipService? _tooltipService; - - private readonly Border _suggestionBorder; - private readonly StackPanel _suggestionPanel; - private CommandSuggestion[] _suggestions = Array.Empty(); - private (int Start, int End) _suggestionRange; - private int _selectedSuggestionIndex = -1; - private int _suggestionViewTop; - private bool _acceptingSuggestion; - private bool _tabCycling; - - private int MaxVisibleSuggestions => - Math.Max(1, Settings.Config.Console.CommandSuggestion.Max_Displayed_Suggestions); - - public TuiTooltipService? TooltipService => _tooltipService; - - public MainTuiView() - { - Background = Brushes.Black; - - _statusBar = new TextBlock - { - Foreground = Brushes.Gray, - Background = Brushes.Black, - Padding = new Thickness(0), - Margin = new Thickness(0), - IsVisible = false, - }; - - _logItemsControl = new ItemsControl - { - ItemsSource = _logControls, - Focusable = false, - ItemsPanel = new FuncTemplate(() => new VirtualizingStackPanel()), - }; - - _logScrollViewer = new ScrollViewer - { - Content = _logItemsControl, - Background = Brushes.Black, - HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled, - VerticalScrollBarVisibility = ScrollBarVisibility.Auto, - Padding = new Thickness(0), - Focusable = false, - }; - - _logScrollViewer.ScrollChanged += OnLogScrollChanged; - _logScrollViewer.PointerPressed += OnLogAreaPointerPressed; - - _commandInput = new TextBox - { - Watermark = "", - Foreground = Brushes.White, - Background = Brushes.Black, - BorderThickness = new Thickness(0), - Padding = new Thickness(0), - Margin = new Thickness(0), - MinHeight = 1, - }; - - _commandInput.AddHandler(KeyDownEvent, OnCommandKeyDown, Avalonia.Interactivity.RoutingStrategies.Tunnel); - _commandInput.AddHandler(TextInputEvent, OnCommandTextInput, Avalonia.Interactivity.RoutingStrategies.Tunnel); - _commandInput.TextChanged += OnCommandTextChanged; - - var promptLabel = new TextBlock - { - Text = "> ", - Foreground = Brushes.Cyan, - VerticalAlignment = VerticalAlignment.Center, - FontWeight = FontWeight.Bold, - }; - - var inputRow = new DockPanel - { - Background = Brushes.Black, - Children = - { - SetDock(promptLabel, Dock.Left), - _commandInput - } - }; - - _notificationText = new TextBlock - { - Foreground = Brushes.Yellow, - Padding = new Thickness(1, 0), - }; - _notificationBorder = new Border - { - Background = new SolidColorBrush(Color.FromRgb(60, 50, 20)), - BorderBrush = Brushes.Yellow, - BorderThickness = new Thickness(1), - Child = _notificationText, - IsVisible = false, - HorizontalAlignment = HorizontalAlignment.Right, - VerticalAlignment = VerticalAlignment.Top, - }; - - _suggestionPanel = new StackPanel - { - Orientation = Avalonia.Layout.Orientation.Vertical, - }; - _suggestionPanel.PointerWheelChanged += OnSuggestionWheelChanged; - _suggestionBorder = new Border - { - Background = new SolidColorBrush(Color.FromRgb(30, 30, 30)), - BorderBrush = new SolidColorBrush(Color.FromRgb(80, 80, 80)), - BorderThickness = new Thickness(1), - Child = _suggestionPanel, - IsVisible = false, - HorizontalAlignment = HorizontalAlignment.Left, - VerticalAlignment = VerticalAlignment.Bottom, - Margin = new Thickness(0, 0, 0, 1), - }; - - var mmCfg = Settings.Config.Console.Minimap; - mmCfg.OnSettingUpdate(); - _minimapControl = new MinimapControl(mmCfg.Width, mmCfg.Height); - _minimapControl.BlocksPerPixel = mmCfg.Zoom; - _minimapControl.RefreshIntervalMs = mmCfg.RefreshInterval; - _minimapControl.NameConfig.Players = mmCfg.ShowPlayerNames; - _minimapControl.NameConfig.Hostile = mmCfg.ShowHostileNames; - _minimapControl.NameConfig.Neutral = mmCfg.ShowNeutralNames; - _minimapControl.NameConfig.Passive = mmCfg.ShowPassiveNames; - _minimapControl.CaveMode = mmCfg.CaveMode; - - var (hAlign, vAlign, margin) = GetMinimapAlignment(mmCfg.Position); - _minimapBorder = new Border - { - Background = new SolidColorBrush(Color.FromArgb(220, 15, 15, 15)), - BorderBrush = new SolidColorBrush(Color.FromRgb(80, 80, 80)), - BorderThickness = new Thickness(1), - Child = _minimapControl, - IsVisible = false, - HorizontalAlignment = hAlign, - VerticalAlignment = vAlign, - Margin = margin, - }; - - _mainContent = new DockPanel - { - Background = Brushes.Black, - Children = - { - SetDock(_statusBar, Dock.Top), - SetDock(inputRow, Dock.Bottom), - _logScrollViewer - } - }; - - _rootPanel = new Panel - { - Background = Brushes.Black, - Children = { _mainContent, _minimapBorder, _notificationBorder, _suggestionBorder } - }; - - _tooltipService = new TuiTooltipService(_rootPanel); - _minimapControl.TooltipService = _tooltipService; - _minimapControl.Position = mmCfg.Position; - - Content = _rootPanel; - - if (mmCfg.Enabled) - { - _minimapVisible = true; - _minimapBorder.IsVisible = true; - _minimapControl.Start(); - } - - StartStatusBarTimer(); - } - - private static Control SetDock(Control control, Dock dock) - { - DockPanel.SetDock(control, dock); - return control; - } - - #region Log output - - public void AppendLogLine(string text) - { - _logLines.Add(text); - - var tb = new TextBlock - { - Text = text, - Foreground = Brushes.White, - Padding = new Thickness(0), - Margin = new Thickness(0), - TextWrapping = TextWrapping.Wrap, - }; - _logControls.Add(tb); - - TrimLog(); - - if (_autoScroll) - ScheduleScrollToEnd(); - } - - public void AppendFormattedLogLine(string text) - { - _logLines.Add(text); - - var tb = McColorParser.CreateColoredTextBlock(text, TextWrapping.Wrap); - _logControls.Add(tb); - - TrimLog(); - - if (_autoScroll) - ScheduleScrollToEnd(); - } - - public void ClearLog() - { - _logLines.Clear(); - _logControls.Clear(); - ScheduleScrollToEnd(); - } - - private void TrimLog() - { - while (_logLines.Count > MaxLogLines) - { - _logLines.RemoveAt(0); - _logControls.RemoveAt(0); - } - } - - private void ScheduleScrollToEnd() - { - Dispatcher.UIThread.Post(() => - { - _programmaticScroll = true; - var sv = _logScrollViewer; - sv.Offset = new Vector(0, sv.Extent.Height); - _programmaticScroll = false; - }, DispatcherPriority.Background); - } - - public string LatestLogLine => _logLines.Count > 0 ? _logLines[^1] : ""; - - public ObservableCollection GetRecentLogLines(int _) => _logLines; - - private void OnLogAreaPointerPressed(object? sender, PointerPressedEventArgs e) - { - var props = e.GetCurrentPoint(null).Properties; - if (!props.IsLeftButtonPressed) - { - Dispatcher.UIThread.Post(() => _commandInput.Focus()); - return; - } - - bool shift = (e.KeyModifiers & KeyModifiers.Shift) != 0; - if (shift) - return; - - long now = Environment.TickCount64; - long elapsed = now - _lastLogClickTicks; - _lastLogClickTicks = now; - - if (elapsed < DoubleClickMsec) - { - ShowNotification(Translations.tui_select_copy_hint, 3000); - _lastLogClickTicks = 0; - } - - Dispatcher.UIThread.Post(() => _commandInput.Focus()); - } - - #endregion - - #region Input - - public void ClearInput() - { - _commandInput.Text = string.Empty; - } - - private void OnCommandKeyDown(object? sender, KeyEventArgs e) - { - if (_tabCycling && e.Key is not Key.Tab) - _tabCycling = false; - - bool ctrl = (e.KeyModifiers & KeyModifiers.Control) != 0; - - if (e.Key == Key.C && ctrl) - { - HandleCtrlC(); - e.Handled = true; - return; - } - - if ((e.Key == Key.Back || e.Key == Key.W) && ctrl) - { - DeleteWordBackward(); - e.Handled = true; - return; - } - - if (e.Key == Key.Left && ctrl) - { - MoveCaretWordLeft(); - e.Handled = true; - return; - } - - if (e.Key == Key.Right && ctrl) - { - MoveCaretWordRight(); - e.Handled = true; - return; - } - - if (e.Key == Key.A && ctrl) - { - _commandInput.CaretIndex = 0; - e.Handled = true; - return; - } - - if (e.Key == Key.E && ctrl) - { - _commandInput.CaretIndex = _commandInput.Text?.Length ?? 0; - e.Handled = true; - return; - } - - if (e.Key == Key.U && ctrl) - { - _commandInput.Text = string.Empty; - e.Handled = true; - return; - } - - if (e.Key == Key.Escape && SuggestionsVisible) - { - ClearSuggestions(); - e.Handled = true; - return; - } - - if (e.Key == Key.Tab && SuggestionsVisible) - { - if (_tabCycling) - { - MoveSuggestionSelection(1); - ApplySuggestionInPlace(_selectedSuggestionIndex); - } - else - { - ApplySuggestionInPlace(_selectedSuggestionIndex); - _tabCycling = true; - } - e.Handled = true; - return; - } - - if (e.Key == Key.Tab) - { - e.Handled = true; - return; - } - - switch (e.Key) - { - case Key.Enter: - SubmitCommand(); - e.Handled = true; - break; - - case Key.Up: - if (SuggestionsVisible) - MoveSuggestionSelection(-1); - else - NavigateHistory(-1); - e.Handled = true; - break; - - case Key.Down: - if (SuggestionsVisible) - MoveSuggestionSelection(1); - else - NavigateHistory(1); - e.Handled = true; - break; - - case Key.PageUp: - ScrollLog(-10); - e.Handled = true; - break; - - case Key.PageDown: - ScrollLog(10); - e.Handled = true; - break; - } - } - - private void DeleteWordBackward() - { - string text = _commandInput.Text ?? ""; - int caret = _commandInput.CaretIndex; - if (caret == 0 || text.Length == 0) return; - - int pos = caret - 1; - while (pos > 0 && text[pos - 1] == ' ') pos--; - while (pos > 0 && text[pos - 1] != ' ') pos--; - - _commandInput.Text = text[..pos] + text[caret..]; - _commandInput.CaretIndex = pos; - } - - private void MoveCaretWordLeft() - { - string text = _commandInput.Text ?? ""; - int pos = _commandInput.CaretIndex; - if (pos == 0) return; - - pos--; - while (pos > 0 && text[pos - 1] == ' ') pos--; - while (pos > 0 && text[pos - 1] != ' ') pos--; - - _commandInput.CaretIndex = pos; - } - - private void MoveCaretWordRight() - { - string text = _commandInput.Text ?? ""; - int pos = _commandInput.CaretIndex; - if (pos >= text.Length) return; - - while (pos < text.Length && text[pos] != ' ') pos++; - while (pos < text.Length && text[pos] == ' ') pos++; - - _commandInput.CaretIndex = pos; - } - - private void OnCommandTextInput(object? sender, TextInputEventArgs e) - { - string? incoming = e.Text; - if (string.IsNullOrEmpty(incoming) || (!incoming.Contains('\n') && !incoming.Contains('\r'))) - return; - - e.Handled = true; - - string[] lines = incoming.Split(["\r\n", "\r", "\n"], StringSplitOptions.None); - - string prefix = _commandInput.Text ?? ""; - for (int i = 0; i < lines.Length; i++) - { - string line = lines[i]; - bool isLast = i == lines.Length - 1; - - if (line.Length > 0 || prefix.Length > 0) - { - _acceptingSuggestion = true; - try { _commandInput.Text = prefix + line; } - finally { _acceptingSuggestion = false; } - } - - if (!isLast) - { - SubmitCommand(); - prefix = ""; - } - } - } - - private void OnCommandTextChanged(object? sender, TextChangedEventArgs e) - { - string text = _commandInput.Text ?? string.Empty; - - if (_acceptingSuggestion || _tabCycling) - return; - - if (string.IsNullOrEmpty(text)) - { - ClearSuggestions(); - return; - } - - var backend = TuiConsoleBackend.Instance; - if (backend == null) return; - int cursor = _commandInput.CaretIndex; - backend.OnInputChanged(text, cursor); - } - - private void SubmitCommand() - { - string command = _commandInput.Text?.Trim() ?? string.Empty; - if (string.IsNullOrEmpty(command)) - return; - - ClearSuggestions(); - _tabCycling = false; - - _commandHistory.Add(command); - _historyIndex = _commandHistory.Count; - - _acceptingSuggestion = true; - try { _commandInput.Text = string.Empty; } - finally { _acceptingSuggestion = false; } - - _autoScroll = true; - - AppendLogLine($"> {command}"); - - TuiConsoleBackend.Instance?.OnCommandSubmitted(command); - } - - private void NavigateHistory(int direction) - { - if (_commandHistory.Count == 0) - return; - - _historyIndex += direction; - if (_historyIndex < 0) _historyIndex = 0; - if (_historyIndex >= _commandHistory.Count) - { - _historyIndex = _commandHistory.Count; - _commandInput.Text = string.Empty; - return; - } - - string historyText = _commandHistory[_historyIndex]; - SetCommandText(historyText); - } - - private void SetCommandText(string text) - { - _commandInput.TextChanged -= OnCommandTextChanged; - try - { - _commandInput.Text = text; - _commandInput.CaretIndex = text.Length; - } - finally - { - _commandInput.TextChanged += OnCommandTextChanged; - } - - Dispatcher.UIThread.Post(() => - { - var endKeyEvent = new KeyEventArgs - { - RoutedEvent = KeyDownEvent, - Key = Key.End, - Source = _commandInput, - }; - _commandInput.RaiseEvent(endKeyEvent); - }, DispatcherPriority.Input); - } - - #endregion - - #region Suggestions - - private const int PromptWidth = 2; // "> " - private const int BorderAndPadding = 2; // 1 border + 1 padding on each side - - internal void UpdateSuggestions(CommandSuggestion[] suggestions, (int Start, int End) range) - { - if (suggestions.Length == 0) - { - ClearSuggestions(); - return; - } - - _suggestions = suggestions; - _suggestionRange = range; - _selectedSuggestionIndex = 0; - _suggestionViewTop = 0; - - int leftOffset = PromptWidth + range.Start - BorderAndPadding; - double screenWidth = Bounds.Width; - if (screenWidth < 1) - screenWidth = 80; - - if (leftOffset < 0) - leftOffset = 0; - - _suggestionBorder.Margin = new Thickness(leftOffset, 0, 0, 1); - _suggestionBorder.MaxWidth = Math.Max(10, screenWidth - leftOffset); - - RebuildSuggestionItems(); - _suggestionBorder.IsVisible = true; - } - - internal void ClearSuggestions() - { - if (!_suggestionBorder.IsVisible && _suggestions.Length == 0) - return; - - _suggestions = Array.Empty(); - _selectedSuggestionIndex = -1; - _suggestionBorder.IsVisible = false; - _suggestionPanel.Children.Clear(); - } - - private bool SuggestionsVisible => _suggestionBorder.IsVisible && _suggestions.Length > 0; - - private void RebuildSuggestionItems() - { - _suggestionPanel.Children.Clear(); - - int visibleCount = Math.Min(_suggestions.Length, MaxVisibleSuggestions); - int viewBottom = _suggestionViewTop + visibleCount; - - for (int i = _suggestionViewTop; i < viewBottom && i < _suggestions.Length; i++) - { - var sug = _suggestions[i]; - int index = i; - - string label = sug.Text; - if (!string.IsNullOrEmpty(sug.Tooltip)) - label += " " + sug.Tooltip; - - var tb = new TextBlock - { - Text = label, - Padding = new Thickness(1, 0), - Foreground = Brushes.White, - TextTrimming = TextTrimming.CharacterEllipsis, - Background = i == _selectedSuggestionIndex - ? new SolidColorBrush(Color.FromRgb(0, 90, 160)) - : Brushes.Transparent, - }; - - var row = new Border - { - Child = tb, - Background = Brushes.Transparent, - }; - - row.PointerPressed += (_, _) => - { - _selectedSuggestionIndex = index; - ApplySuggestionInPlace(index); - _tabCycling = true; - }; - row.PointerEntered += (_, _) => - { - if (_selectedSuggestionIndex != index) - { - _selectedSuggestionIndex = index; - UpdateSuggestionHighlight(); - } - }; - - _suggestionPanel.Children.Add(row); - } - - if (_suggestions.Length > MaxVisibleSuggestions) - { - string scrollHint = $"[{_suggestionViewTop + 1}-{viewBottom}/{_suggestions.Length}]"; - var hintTb = new TextBlock - { - Text = scrollHint, - Foreground = new SolidColorBrush(Color.FromRgb(120, 120, 120)), - Padding = new Thickness(1, 0), - TextAlignment = TextAlignment.Right, - HorizontalAlignment = HorizontalAlignment.Stretch, - }; - _suggestionPanel.Children.Add(hintTb); - } - } - - private void UpdateSuggestionHighlight() - { - int visibleCount = Math.Min(_suggestions.Length, MaxVisibleSuggestions); - for (int i = 0; i < visibleCount && i < _suggestionPanel.Children.Count; i++) - { - if (_suggestionPanel.Children[i] is Border border && border.Child is TextBlock tb) - { - int dataIndex = _suggestionViewTop + i; - tb.Background = dataIndex == _selectedSuggestionIndex - ? new SolidColorBrush(Color.FromRgb(0, 90, 160)) - : Brushes.Transparent; - } - } - } - - private void MoveSuggestionSelection(int direction) - { - if (_suggestions.Length == 0) return; - - _selectedSuggestionIndex += direction; - if (_selectedSuggestionIndex < 0) - _selectedSuggestionIndex = _suggestions.Length - 1; - else if (_selectedSuggestionIndex >= _suggestions.Length) - _selectedSuggestionIndex = 0; - - int visibleCount = Math.Min(_suggestions.Length, MaxVisibleSuggestions); - if (_selectedSuggestionIndex < _suggestionViewTop) - { - _suggestionViewTop = _selectedSuggestionIndex; - RebuildSuggestionItems(); - } - else if (_selectedSuggestionIndex >= _suggestionViewTop + visibleCount) - { - _suggestionViewTop = _selectedSuggestionIndex - visibleCount + 1; - RebuildSuggestionItems(); - } - else - { - UpdateSuggestionHighlight(); - } - } - - private void OnSuggestionWheelChanged(object? sender, PointerWheelEventArgs e) - { - if (!SuggestionsVisible) return; - - int direction = e.Delta.Y > 0 ? -1 : 1; - ScrollSuggestionViewport(direction); - e.Handled = true; - } - - private void ScrollSuggestionViewport(int direction) - { - if (_suggestions.Length <= MaxVisibleSuggestions) return; - - int newTop = _suggestionViewTop + direction; - int maxTop = _suggestions.Length - MaxVisibleSuggestions; - newTop = Math.Clamp(newTop, 0, maxTop); - - if (newTop == _suggestionViewTop) return; - _suggestionViewTop = newTop; - - int viewBottom = _suggestionViewTop + MaxVisibleSuggestions; - if (_selectedSuggestionIndex < _suggestionViewTop) - _selectedSuggestionIndex = _suggestionViewTop; - else if (_selectedSuggestionIndex >= viewBottom) - _selectedSuggestionIndex = viewBottom - 1; - - RebuildSuggestionItems(); - } - - private void ApplySuggestionText(int index) - { - if (index < 0 || index >= _suggestions.Length) return; - - string text = _commandInput.Text ?? ""; - string selected = _suggestions[index].Text; - - int start = Math.Min(_suggestionRange.Start, text.Length); - int end = Math.Min(_suggestionRange.End, text.Length); - - string before = text[..start]; - string after = text[end..]; - string newText = before + selected + after; - - _commandInput.Text = newText; - _commandInput.CaretIndex = before.Length + selected.Length; - - _suggestionRange = (start, start + selected.Length); - } - - private void ApplySuggestionInPlace(int index) - { - if (index < 0 || index >= _suggestions.Length) return; - - _acceptingSuggestion = true; - try - { - ApplySuggestionText(index); - } - finally - { - _acceptingSuggestion = false; - } - UpdateSuggestionHighlight(); - } - - #endregion - - #region Ctrl+C - - internal void HandleCtrlC() - { - long now = Environment.TickCount64; - long elapsed = now - _lastCtrlCTicks; - - if (_lastCtrlCTicks > 0 && elapsed < CtrlCDoublePressMsec) - { - HideNotification(); - TuiConsoleBackend.Instance?.Shutdown(); - return; - } - - _lastCtrlCTicks = now; - - string inputText = _commandInput.Text?.Trim() ?? ""; - if (inputText.Length > 0) - { - _commandInput.Text = string.Empty; - ShowNotification(Translations.tui_ctrlc_input_cleared, CtrlCDoublePressMsec); - } - else - { - ShowNotification(Translations.tui_ctrlc_quit_hint, CtrlCDoublePressMsec); - } - } - - private void ShowNotification(string message, int autoHideMs) - { - _notificationText.Text = message; - _notificationBorder.IsVisible = true; - - var timer = new Avalonia.Threading.DispatcherTimer - { - Interval = TimeSpan.FromMilliseconds(autoHideMs), - }; - timer.Tick += (_, _) => - { - timer.Stop(); - HideNotification(); - }; - timer.Start(); - } - - private void HideNotification() - { - _notificationBorder.IsVisible = false; - } - - #endregion - - #region Scrolling - - private void ScrollLog(int delta) - { - var sv = _logScrollViewer; - var newY = sv.Offset.Y + delta; - newY = Math.Max(0, Math.Min(newY, sv.Extent.Height - sv.Viewport.Height)); - sv.Offset = new Vector(0, newY); - - _autoScroll = newY >= sv.Extent.Height - sv.Viewport.Height - 2; - } - - private void OnLogScrollChanged(object? sender, ScrollChangedEventArgs e) - { - if (_programmaticScroll) return; - - var sv = _logScrollViewer; - _autoScroll = sv.Offset.Y >= sv.Extent.Height - sv.Viewport.Height - 2; - } - - #endregion - - #region Status Bar (Health / Food) - - private void StartStatusBarTimer() - { - var timer = new DispatcherTimer - { - Interval = TimeSpan.FromSeconds(1), - }; - timer.Tick += (_, _) => UpdateStatusBar(); - timer.Start(); - } - - private void UpdateStatusBar() - { - if (McClient.Instance is not McClient client) - { - _statusBar.IsVisible = false; - return; - } - - int gamemode = client.GetGamemode(); - if (gamemode != 0 && gamemode != 2) - { - _statusBar.IsVisible = false; - return; - } - - float health = client.GetHealth(); - int food = client.GetSaturation(); - - int heartsFilled = (int)Math.Ceiling(health / 20f * 10); - heartsFilled = Math.Clamp(heartsFilled, 0, 10); - int foodFilled = (int)Math.Ceiling(food / 20f * 10); - foodFilled = Math.Clamp(foodFilled, 0, 10); - - _statusBar.Inlines?.Clear(); - _statusBar.Inlines ??= new Avalonia.Controls.Documents.InlineCollection(); - - var healthText = BuildBarText(heartsFilled, 10, "\u2764\ufe0f", " \u2661 "); - var foodText = BuildBarText(foodFilled, 10, "\ud83c\udf56", " \u25cb "); - - _statusBar.Inlines.Add(new Avalonia.Controls.Documents.Run(healthText) - { - Foreground = new SolidColorBrush(Color.FromRgb(255, 85, 85)), - }); - _statusBar.Inlines.Add(new Avalonia.Controls.Documents.Run($" {health:F1} ") - { - Foreground = new SolidColorBrush(Color.FromRgb(255, 150, 150)), - }); - _statusBar.Inlines.Add(new Avalonia.Controls.Documents.Run(foodText) - { - Foreground = new SolidColorBrush(Color.FromRgb(200, 160, 80)), - }); - _statusBar.Inlines.Add(new Avalonia.Controls.Documents.Run($" {food}") - { - Foreground = new SolidColorBrush(Color.FromRgb(220, 190, 100)), - }); - - // Add effects display - var effects = client.GetPlayerEffects().Values - .Where(effectData => !effectData.IsExpired) - .OrderBy(effectData => effectData.Effect) - .ToArray(); - if (effects.Length > 0) - { - bool showEffectNamesInTui = Settings.Config.Main.Advanced.ShowEffectNamesInTUI; - - _statusBar.Inlines.Add(new Avalonia.Controls.Documents.Run(" | ") - { - Foreground = Brushes.Gray, - }); - - bool first = true; - foreach (var effectData in effects) - { - if (!first) - { - _statusBar.Inlines.Add(new Avalonia.Controls.Documents.Run(", ") - { - Foreground = Brushes.Gray, - }); - } - first = false; - - var color = GetEffectIconAndColor(effectData.Effect).Color; - var displayText = showEffectNamesInTui - ? effectData.GetDisplayName() - : GetCompactEffectLabel(effectData); - displayText = $"{displayText} ({effectData.GetRemainingDurationText()})"; - - _statusBar.Inlines.Add(new Avalonia.Controls.Documents.Run(displayText) - { - Foreground = color, - }); - } - } - - _statusBar.IsVisible = true; - } - - private static string BuildBarText(int filled, int total, string filledChar, string emptyChar) - { - var sb = new System.Text.StringBuilder(); - for (int i = 0; i < filled; i++) - { - if (i > 0) sb.Append(' '); - sb.Append(filledChar); - } - for (int i = filled; i < total; i++) - { - sb.Append(emptyChar); - } - return sb.ToString(); - } - - private static string GetCompactEffectLabel(EffectData effectData) - { - var icon = GetEffectIconAndColor(effectData.Effect).Icon; - return effectData.Amplifier > 0 - ? $"{icon}{effectData.Amplifier + 1}" - : icon; - } - - private static (string Icon, IBrush Color) GetEffectIconAndColor(Effects effect) - { - return effect switch - { - Effects.Speed => ("⚡", new SolidColorBrush(Color.FromRgb(135, 206, 235))), - Effects.Slowness => ("🐢", new SolidColorBrush(Color.FromRgb(139, 139, 139))), - Effects.Haste => ("⛏", new SolidColorBrush(Color.FromRgb(255, 215, 0))), - Effects.MiningFatigue => ("🔨", new SolidColorBrush(Color.FromRgb(64, 64, 64))), - Effects.Strength => ("⚔", new SolidColorBrush(Color.FromRgb(255, 99, 71))), - Effects.InstantHealth => ("❤", new SolidColorBrush(Color.FromRgb(255, 182, 193))), - Effects.InstantDamage => ("💀", new SolidColorBrush(Color.FromRgb(139, 0, 0))), - Effects.JumpBoost => ("🦘", new SolidColorBrush(Color.FromRgb(50, 205, 50))), - Effects.Nausea => ("💫", new SolidColorBrush(Color.FromRgb(85, 107, 47))), - Effects.Regeneration => ("✨", new SolidColorBrush(Color.FromRgb(255, 105, 180))), - Effects.Resistance => ("🛡", new SolidColorBrush(Color.FromRgb(112, 128, 144))), - Effects.FireResistance => ("🔥", new SolidColorBrush(Color.FromRgb(255, 140, 0))), - Effects.WaterBreathing => ("🐟", new SolidColorBrush(Color.FromRgb(0, 191, 255))), - Effects.Invisibility => ("👻", new SolidColorBrush(Color.FromRgb(200, 200, 200))), - Effects.Blindness => ("🕶", new SolidColorBrush(Color.FromRgb(50, 50, 50))), - Effects.NightVision => ("👁", new SolidColorBrush(Color.FromRgb(0, 255, 127))), - Effects.Hunger => ("🍔", new SolidColorBrush(Color.FromRgb(139, 69, 19))), - Effects.Weakness => ("💪", new SolidColorBrush(Color.FromRgb(128, 128, 128))), - Effects.Poison => ("☠", new SolidColorBrush(Color.FromRgb(75, 0, 130))), - Effects.Wither => ("🥀", new SolidColorBrush(Color.FromRgb(0, 0, 0))), - Effects.HealthBoost => ("💖", new SolidColorBrush(Color.FromRgb(255, 20, 147))), - Effects.Absorption => ("💛", new SolidColorBrush(Color.FromRgb(255, 215, 0))), - Effects.Saturation => ("🍖", new SolidColorBrush(Color.FromRgb(255, 165, 0))), - Effects.Glowing => ("💡", new SolidColorBrush(Color.FromRgb(255, 255, 150))), - Effects.Levitation => ("🎈", new SolidColorBrush(Color.FromRgb(147, 112, 219))), - Effects.Luck => ("🍀", new SolidColorBrush(Color.FromRgb(50, 205, 50))), - Effects.BadLuck => ("🐈‍⬛", new SolidColorBrush(Color.FromRgb(128, 0, 0))), - Effects.SlowFalling => ("🪶", new SolidColorBrush(Color.FromRgb(255, 182, 193))), - Effects.ConduitPower => ("🐡", new SolidColorBrush(Color.FromRgb(0, 255, 255))), - Effects.DolphinsGrace => ("🐬", new SolidColorBrush(Color.FromRgb(135, 206, 235))), - Effects.BadOmen => ("🏴", new SolidColorBrush(Color.FromRgb(0, 100, 0))), - Effects.HerooftheVillage => ("🎉", new SolidColorBrush(Color.FromRgb(255, 215, 0))), - _ => ("✦", new SolidColorBrush(Color.FromRgb(200, 200, 200))), - }; - } - - #endregion - - #region Minimap - - public void ShowMinimap() - { - if (_minimapVisible) return; - _minimapVisible = true; - _minimapBorder.IsVisible = true; - _minimapControl.Start(); - Settings.Config.Console.Minimap.Enabled = true; - } - - public void HideMinimap() - { - if (!_minimapVisible) return; - _minimapVisible = false; - _minimapControl.Stop(); - _minimapBorder.IsVisible = false; - Settings.Config.Console.Minimap.Enabled = false; - } - - public void ToggleMinimap() - { - if (_minimapVisible) - HideMinimap(); - else - ShowMinimap(); - } - - public bool IsMinimapVisible => _minimapVisible; - - public void SetMinimapZoom(int level) - { - _minimapControl.BlocksPerPixel = level; - Settings.Config.Console.Minimap.Zoom = level; - } - - public int GetMinimapZoom() => _minimapControl.BlocksPerPixel; - - public NameDisplayConfig GetMinimapNameConfig() => _minimapControl.NameConfig; - - public void SyncMinimapNameConfig() - { - var nc = _minimapControl.NameConfig; - var cfg = Settings.Config.Console.Minimap; - cfg.ShowPlayerNames = nc.Players; - cfg.ShowHostileNames = nc.Hostile; - cfg.ShowNeutralNames = nc.Neutral; - cfg.ShowPassiveNames = nc.Passive; - } - - public void ResizeMinimap(int width, int height) - { - _minimapControl.Resize(width, height); - Settings.Config.Console.Minimap.Width = width; - Settings.Config.Console.Minimap.Height = height; - } - - public void SetMinimapPosition(MinimapPosition pos) - { - var (hAlign, vAlign, margin) = GetMinimapAlignment(pos); - _minimapBorder.HorizontalAlignment = hAlign; - _minimapBorder.VerticalAlignment = vAlign; - _minimapBorder.Margin = margin; - _minimapControl.Position = pos; - Settings.Config.Console.Minimap.Position = pos; - } - - public MinimapPosition GetMinimapPosition() => Settings.Config.Console.Minimap.Position; - - public void SetMinimapCaveMode(CaveModeOption mode) - { - _minimapControl.CaveMode = mode; - Settings.Config.Console.Minimap.CaveMode = mode; - } - - public CaveModeOption GetMinimapCaveMode() => _minimapControl.CaveMode; - - private static (HorizontalAlignment h, VerticalAlignment v, Thickness margin) GetMinimapAlignment(MinimapPosition pos) => pos switch - { - MinimapPosition.top_left => (HorizontalAlignment.Left, VerticalAlignment.Top, new Thickness(1, 1, 0, 0)), - MinimapPosition.top_right => (HorizontalAlignment.Right, VerticalAlignment.Top, new Thickness(0, 1, 1, 0)), - MinimapPosition.center => (HorizontalAlignment.Center, VerticalAlignment.Center, new Thickness(0)), - MinimapPosition.bottom_left => (HorizontalAlignment.Left, VerticalAlignment.Bottom, new Thickness(1, 0, 0, 2)), - MinimapPosition.bottom_right => (HorizontalAlignment.Right, VerticalAlignment.Bottom, new Thickness(0, 0, 1, 2)), - _ => (HorizontalAlignment.Right, VerticalAlignment.Top, new Thickness(0, 1, 1, 0)), - }; - - public void ApplyMinimapConfig() - { - var cfg = Settings.Config.Console.Minimap; - if (cfg.Enabled && !_minimapVisible) - ShowMinimap(); - else if (!cfg.Enabled && _minimapVisible) - HideMinimap(); - } - - #endregion - - #region Overlay - - public void ShowOverlay(Control content, Action? onClose = null) - { - if (_overlayContent != null) - HideOverlay(); - - _overlayContent = content; - _overlayCloseCallback = onClose; - _mainContent.IsVisible = false; - - _rootPanel.Children.Add(_overlayContent); - } - - public void HideOverlay() - { - if (_overlayContent == null) return; - - _rootPanel.Children.Remove(_overlayContent); - - _overlayContent = null; - _mainContent.IsVisible = true; - - var cb = _overlayCloseCallback; - _overlayCloseCallback = null; - cb?.Invoke(); - - _commandInput.Focus(); - } - - public bool HasOverlay => _overlayContent != null; - - public Control? OverlayContent => _overlayContent; - - protected override void OnKeyDown(KeyEventArgs e) - { - if (e.Key == Key.Escape && _overlayContent != null) - { - if (_overlayContent is IOverlayCloseHandler closeHandler) - { - if (closeHandler.TryCloseByUser()) - HideOverlay(); - - e.Handled = true; - return; - } - - HideOverlay(); - e.Handled = true; - return; - } - base.OnKeyDown(e); - } - - #endregion - - protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) - { - base.OnAttachedToVisualTree(e); - Dispatcher.UIThread.Post(() => - { - _commandInput.Focus(); - }, DispatcherPriority.Loaded); - } - - #region Custom Control Append - - public void AppendControlToLog(Control control) - { - _logLines.Add(string.Empty); - _logControls.Add(control); - TrimLog(); - if (_autoScroll) - ScheduleScrollToEnd(); - } - - #endregion - } -} diff --git a/MinecraftClient/Tui/MapOverlay.cs b/MinecraftClient/Tui/MapOverlay.cs deleted file mode 100644 index a52096f60b..0000000000 --- a/MinecraftClient/Tui/MapOverlay.cs +++ /dev/null @@ -1,499 +0,0 @@ -using System; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Controls.Documents; -using Avalonia.Input; -using Avalonia.Interactivity; -using Avalonia.Layout; -using Avalonia.Media; -using MinecraftClient.ChatBots; - -namespace MinecraftClient.Tui -{ - /// - /// Fullscreen overlay that renders a Minecraft map with interactive zoom and pan. - /// Uses Unicode half-block characters where each terminal cell displays two vertical - /// pixels (foreground = top, background = bottom). Supports mouse wheel zoom with - /// center-anchoring, mouse drag panning, and keyboard navigation. - /// At 100% one terminal column = one map pixel wide; at 200% two columns = one pixel. - /// - internal sealed class MapOverlay : Panel - { - private const double MaxScale = 2.0; - private const double ZoomStep = 0.125; - private const double KeyPanStep = 4.0; - private const double OffsetEpsilon = 0.5; - - private readonly TextBlock _mapBlock; - private readonly TextBlock _headerBlock; - private readonly TextBlock _controlsBlock; - private readonly TextBlock _cornerTL; - private readonly TextBlock _cornerTR; - private readonly TextBlock _cornerBL; - private readonly TextBlock _cornerBR; - - private McMap _map = null!; - private double _scale = 1.0; - private double _offsetX; - private double _offsetY; - private double _fitScale = 1.0; - - private bool _isDragging; - private double _dragStartX; - private double _dragStartY; - private double _dragStartOffsetX; - private double _dragStartOffsetY; - private bool _initialLayoutDone; - - private static readonly IBrush IndicatorActive = Brushes.Yellow; - private static readonly IBrush IndicatorDim = new SolidColorBrush(Color.FromRgb(60, 60, 60)); - - public MapOverlay(McMap map) - { - ArgumentNullException.ThrowIfNull(map); - - HorizontalAlignment = HorizontalAlignment.Stretch; - VerticalAlignment = VerticalAlignment.Stretch; - Focusable = true; - Background = Brushes.Black; - - _mapBlock = new TextBlock - { - TextWrapping = TextWrapping.NoWrap, - Padding = new Thickness(0), - Margin = new Thickness(0), - HorizontalAlignment = HorizontalAlignment.Center, - VerticalAlignment = VerticalAlignment.Center, - }; - - var border = new Border - { - BorderBrush = Brushes.White, - BorderThickness = new Thickness(1), - Padding = new Thickness(0), - Child = _mapBlock, - }; - - _headerBlock = new TextBlock - { - Foreground = Brushes.White, - Background = Brushes.Black, - HorizontalAlignment = HorizontalAlignment.Center, - VerticalAlignment = VerticalAlignment.Top, - Padding = new Thickness(1, 0), - }; - - _controlsBlock = new TextBlock - { - Text = Translations.bot_map_tui_controls, - Foreground = Brushes.Gray, - Background = Brushes.Black, - HorizontalAlignment = HorizontalAlignment.Center, - VerticalAlignment = VerticalAlignment.Bottom, - Padding = new Thickness(1, 0), - }; - - _cornerTL = CreateCornerIndicator(HorizontalAlignment.Left, VerticalAlignment.Top, "\u25E4"); - _cornerTR = CreateCornerIndicator(HorizontalAlignment.Right, VerticalAlignment.Top, "\u25E5"); - _cornerBL = CreateCornerIndicator(HorizontalAlignment.Left, VerticalAlignment.Bottom, "\u25E3"); - _cornerBR = CreateCornerIndicator(HorizontalAlignment.Right, VerticalAlignment.Bottom, "\u25E2"); - - Children.Add(border); - Children.Add(_headerBlock); - Children.Add(_controlsBlock); - Children.Add(_cornerTL); - Children.Add(_cornerTR); - Children.Add(_cornerBL); - Children.Add(_cornerBR); - - AttachedToVisualTree += (_, _) => - { - AddHandler(KeyDownEvent, OnTunnelKeyDown, RoutingStrategies.Tunnel); - AddHandler(TextInputEvent, OnTunnelTextInput, RoutingStrategies.Tunnel); - Focus(); - }; - - DetachedFromVisualTree += (_, _) => - { - RemoveHandler(KeyDownEvent, OnTunnelKeyDown); - RemoveHandler(TextInputEvent, OnTunnelTextInput); - }; - - _map = map; - _scale = double.MinValue; - UpdateHeaderText(); - } - - private static TextBlock CreateCornerIndicator(HorizontalAlignment hAlign, VerticalAlignment vAlign, string glyph) - { - return new TextBlock - { - Text = glyph, - Background = Brushes.Black, - Foreground = IndicatorDim, - HorizontalAlignment = hAlign, - VerticalAlignment = vAlign, - Padding = new Thickness(0), - }; - } - - public void UpdateMap(McMap map) - { - _map = map; - - if (map.Colors is null || map.Width == 0 || map.Height == 0) - return; - - RecalculateFitScale(); - _scale = _fitScale; - _offsetX = 0; - _offsetY = 0; - UpdateHeaderText(); - RenderViewport(); - } - - private void UpdateHeaderText() - { - string zoomText = _scale > 0 ? (_scale * 100).ToString("F1") : "0.0"; - _headerBlock.Text = string.Format(Translations.bot_map_tui_header, - _map.MapId, _map.Width, _map.Height, zoomText); - } - - protected override void OnSizeChanged(SizeChangedEventArgs e) - { - base.OnSizeChanged(e); - - if (_map?.Colors is null || _map.Width == 0 || _map.Height == 0) - return; - - RecalculateFitScale(); - - if (!_initialLayoutDone) - { - _scale = _fitScale; - _offsetX = 0; - _offsetY = 0; - _initialLayoutDone = true; - } - else - { - _scale = Math.Clamp(_scale, _fitScale, MaxScale); - } - - ClampOffset(); - UpdateHeaderText(); - RenderViewport(); - } - - #region Scale / Offset - - private void GetViewportCells(out int viewW, out int viewH) - { - viewW = Math.Max(1, (int)Bounds.Width - 2); - viewH = Math.Max(1, (int)Bounds.Height - 2); - } - - private void RecalculateFitScale() - { - GetViewportCells(out int viewW, out int viewH); - int viewPixelsH = viewH * 2; - - double scaleX = (double)viewW / _map.Width; - double scaleY = (double)viewPixelsH / _map.Height; - _fitScale = Math.Min(scaleX, scaleY); - - if (_fitScale > MaxScale) - _fitScale = MaxScale; - } - - private void ClampOffset() - { - GetViewportCells(out int viewW, out int viewH); - int viewPixelsH = viewH * 2; - - double visibleMapW = viewW / _scale; - double visibleMapH = viewPixelsH / _scale; - - double maxOffX = Math.Max(0, _map.Width - visibleMapW); - double maxOffY = Math.Max(0, _map.Height - visibleMapH); - - _offsetX = Math.Clamp(_offsetX, 0, maxOffX); - _offsetY = Math.Clamp(_offsetY, 0, maxOffY); - } - - private double NextStepScale(bool zoomIn) - { - if (zoomIn) - { - double next = Math.Floor(_scale / ZoomStep + 1.0 - 1e-9) * ZoomStep; - if (next <= _scale + 1e-9) - next += ZoomStep; - return Math.Clamp(next, _fitScale, MaxScale); - } - else - { - double prev = Math.Ceiling(_scale / ZoomStep - 1.0 + 1e-9) * ZoomStep; - if (prev >= _scale - 1e-9) - prev -= ZoomStep; - return Math.Clamp(prev, _fitScale, MaxScale); - } - } - - private void ZoomAtCenter(bool zoomIn) - { - if (_map?.Colors is null) return; - - GetViewportCells(out int viewW, out int viewH); - int viewPixelsH = viewH * 2; - - double centerMapX = _offsetX + (viewW / 2.0) / _scale; - double centerMapY = _offsetY + (viewPixelsH / 2.0) / _scale; - - double newScale = NextStepScale(zoomIn); - if (Math.Abs(newScale - _scale) < 1e-12) - return; - - _scale = newScale; - - _offsetX = centerMapX - (viewW / 2.0) / _scale; - _offsetY = centerMapY - (viewPixelsH / 2.0) / _scale; - ClampOffset(); - UpdateHeaderText(); - RenderViewport(); - } - - #endregion - - #region Rendering - - private void RenderViewport() - { - if (_map?.Colors is null || _map.Width == 0 || _map.Height == 0) - return; - - GetViewportCells(out int viewW, out int viewH); - int viewPixelsH = viewH * 2; - - int mapW = _map.Width; - int mapH = _map.Height; - byte[] colors = _map.Colors; - - int renderCols = Math.Min(viewW, (int)Math.Ceiling(mapW * _scale)); - int renderPixelRows = Math.Min(viewPixelsH, (int)Math.Ceiling(mapH * _scale)); - int renderTextRows = (renderPixelRows + 1) / 2; - - _mapBlock.Inlines ??= []; - _mapBlock.Inlines.Clear(); - - double invScale = 1.0 / _scale; - - for (int r = 0; r < renderTextRows; r++) - { - if (r > 0) - _mapBlock.Inlines.Add(new LineBreak()); - - IBrush? batchFg = null; - IBrush? batchBg = null; - int batchLen = 0; - - for (int c = 0; c < renderCols; c++) - { - int srcX = Math.Clamp((int)(_offsetX + c * invScale), 0, mapW - 1); - int srcTopY = Math.Clamp((int)(_offsetY + (r * 2) * invScale), 0, mapH - 1); - int srcBotY = Math.Clamp((int)(_offsetY + (r * 2 + 1) * invScale), 0, mapH - 1); - - ColorRGBA top = MapColors.ColorByteToRGBA(colors[srcX + srcTopY * mapW]); - ColorRGBA bot = MapColors.ColorByteToRGBA(colors[srcX + srcBotY * mapW]); - - var fg = new SolidColorBrush(Color.FromRgb(top.R, top.G, top.B)); - var bg = new SolidColorBrush(Color.FromRgb(bot.R, bot.G, bot.B)); - - if (batchLen > 0 && ColorsEqual(batchFg!, fg) && ColorsEqual(batchBg!, bg)) - { - batchLen++; - } - else - { - if (batchLen > 0) - FlushBatch(batchFg!, batchBg!, batchLen); - - batchFg = fg; - batchBg = bg; - batchLen = 1; - } - } - - if (batchLen > 0) - FlushBatch(batchFg!, batchBg!, batchLen); - } - - UpdateCornerIndicators(); - } - - private void FlushBatch(IBrush fg, IBrush bg, int count) - { - _mapBlock.Inlines!.Add(new Run(new string('\u2580', count)) - { - Foreground = fg, - Background = bg, - }); - } - - private static bool ColorsEqual(IBrush a, IBrush b) - { - if (a is SolidColorBrush sa && b is SolidColorBrush sb) - return sa.Color == sb.Color; - return false; - } - - private void UpdateCornerIndicators() - { - GetViewportCells(out int viewW, out int viewH); - int viewPixelsH = viewH * 2; - - double visibleW = viewW / _scale; - double visibleH = viewPixelsH / _scale; - - bool moreLeft = _offsetX > OffsetEpsilon; - bool moreTop = _offsetY > OffsetEpsilon; - bool moreRight = _offsetX + visibleW < _map.Width - OffsetEpsilon; - bool moreBottom = _offsetY + visibleH < _map.Height - OffsetEpsilon; - - _cornerTL.Foreground = (moreLeft || moreTop) ? IndicatorActive : IndicatorDim; - _cornerTR.Foreground = (moreRight || moreTop) ? IndicatorActive : IndicatorDim; - _cornerBL.Foreground = (moreLeft || moreBottom) ? IndicatorActive : IndicatorDim; - _cornerBR.Foreground = (moreRight || moreBottom) ? IndicatorActive : IndicatorDim; - } - - #endregion - - #region Mouse interaction - - protected override void OnPointerWheelChanged(PointerWheelEventArgs e) - { - ZoomAtCenter(e.Delta.Y > 0); - e.Handled = true; - } - - protected override void OnPointerPressed(PointerPressedEventArgs e) - { - var props = e.GetCurrentPoint(this).Properties; - if (!props.IsLeftButtonPressed) - return; - - _isDragging = true; - var pos = e.GetPosition(this); - _dragStartX = pos.X; - _dragStartY = pos.Y; - _dragStartOffsetX = _offsetX; - _dragStartOffsetY = _offsetY; - e.Pointer.Capture(this); - e.Handled = true; - } - - protected override void OnPointerMoved(PointerEventArgs e) - { - if (!_isDragging) return; - - var pos = e.GetPosition(this); - double dxCells = pos.X - _dragStartX; - double dyCells = pos.Y - _dragStartY; - - _offsetX = _dragStartOffsetX - dxCells / _scale; - _offsetY = _dragStartOffsetY - dyCells * 2.0 / _scale; - ClampOffset(); - RenderViewport(); - e.Handled = true; - } - - protected override void OnPointerReleased(PointerReleasedEventArgs e) - { - if (!_isDragging) return; - - _isDragging = false; - e.Pointer.Capture(null); - e.Handled = true; - } - - #endregion - - #region Keyboard interaction - - private void OnTunnelKeyDown(object? sender, KeyEventArgs e) - { - if (e.Key is Key.Escape or Key.E) - { - TuiConsoleBackend.Instance?.DismissOverlay(); - e.Handled = true; - } - } - - private void OnTunnelTextInput(object? sender, TextInputEventArgs e) - { - if (e.Text is "+" or "=") - { - ZoomAtCenter(true); - e.Handled = true; - } - else if (e.Text is "-") - { - ZoomAtCenter(false); - e.Handled = true; - } - } - - protected override void OnKeyDown(KeyEventArgs e) - { - switch (e.Key) - { - case Key.Escape: - case Key.E: - TuiConsoleBackend.Instance?.DismissOverlay(); - e.Handled = true; - return; - - case Key.Add: - ZoomAtCenter(true); - e.Handled = true; - return; - - case Key.Subtract: - ZoomAtCenter(false); - e.Handled = true; - return; - - case Key.Left: - _offsetX -= KeyPanStep / _scale; - ClampOffset(); - RenderViewport(); - e.Handled = true; - return; - - case Key.Right: - _offsetX += KeyPanStep / _scale; - ClampOffset(); - RenderViewport(); - e.Handled = true; - return; - - case Key.Up: - _offsetY -= KeyPanStep / _scale; - ClampOffset(); - RenderViewport(); - e.Handled = true; - return; - - case Key.Down: - _offsetY += KeyPanStep / _scale; - ClampOffset(); - RenderViewport(); - e.Handled = true; - return; - } - - base.OnKeyDown(e); - } - - #endregion - } -} diff --git a/MinecraftClient/Tui/McColorParser.cs b/MinecraftClient/Tui/McColorParser.cs deleted file mode 100644 index 8f3ac5f248..0000000000 --- a/MinecraftClient/Tui/McColorParser.cs +++ /dev/null @@ -1,165 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using Avalonia.Controls; -using Avalonia.Controls.Documents; -using Avalonia.Media; - -namespace MinecraftClient.Tui -{ - /// - /// Parses Minecraft § color codes and produces Avalonia Inlines for rich text display. - /// - public static class McColorParser - { - private static readonly Dictionary ColorMap = new() - { - { '0', new SolidColorBrush(Color.FromRgb(0, 0, 0)) }, - { '1', new SolidColorBrush(Color.FromRgb(0, 0, 170)) }, - { '2', new SolidColorBrush(Color.FromRgb(0, 170, 0)) }, - { '3', new SolidColorBrush(Color.FromRgb(0, 170, 170)) }, - { '4', new SolidColorBrush(Color.FromRgb(170, 0, 0)) }, - { '5', new SolidColorBrush(Color.FromRgb(170, 0, 170)) }, - { '6', new SolidColorBrush(Color.FromRgb(255, 170, 0)) }, - { '7', new SolidColorBrush(Color.FromRgb(170, 170, 170)) }, - { '8', new SolidColorBrush(Color.FromRgb(85, 85, 85)) }, - { '9', new SolidColorBrush(Color.FromRgb(85, 85, 255)) }, - { 'a', new SolidColorBrush(Color.FromRgb(85, 255, 85)) }, - { 'b', new SolidColorBrush(Color.FromRgb(85, 255, 255)) }, - { 'c', new SolidColorBrush(Color.FromRgb(255, 85, 85)) }, - { 'd', new SolidColorBrush(Color.FromRgb(255, 85, 255)) }, - { 'e', new SolidColorBrush(Color.FromRgb(255, 255, 85)) }, - { 'f', Brushes.White }, - }; - - public static TextBlock CreateColoredTextBlock(string text, TextWrapping wrapping = TextWrapping.Wrap) - { - var tb = new TextBlock - { - TextWrapping = wrapping, - Padding = new Avalonia.Thickness(0), - Margin = new Avalonia.Thickness(0), - }; - - if (string.IsNullOrEmpty(text) || !text.Contains('§')) - { - tb.Text = text ?? ""; - tb.Foreground = Brushes.White; - return tb; - } - - tb.Background = Brushes.Black; - - IBrush currentColor = Brushes.White; - bool bold = false; - bool italic = false; - bool underline = false; - bool strikethrough = false; - int start = 0; - - for (int i = 0; i < text.Length; i++) - { - if (text[i] == '§' && i + 1 < text.Length) - { - if (i > start) - AddRun(tb, text[start..i], currentColor, bold, italic, underline, strikethrough); - - if (text[i + 1] == '#' && i + 8 <= text.Length - && TryParseHexColor(text.AsSpan(i + 2, 6), out var hexBrush)) - { - currentColor = hexBrush; - bold = false; - italic = false; - underline = false; - strikethrough = false; - i += 7; - start = i + 1; - continue; - } - - char code = char.ToLower(text[i + 1]); - - if (ColorMap.TryGetValue(code, out var brush)) - { - currentColor = brush; - bold = false; - italic = false; - underline = false; - strikethrough = false; - } - else - { - switch (code) - { - case 'l': bold = true; break; - case 'o': italic = true; break; - case 'n': underline = true; break; - case 'm': strikethrough = true; break; - case 'r': - currentColor = Brushes.White; - bold = false; - italic = false; - underline = false; - strikethrough = false; - break; - } - } - - i++; - start = i + 1; - } - } - - if (start < text.Length) - AddRun(tb, text[start..], currentColor, bold, italic, underline, strikethrough); - - if (tb.Inlines?.Count == 0) - { - tb.Text = ""; - tb.Foreground = Brushes.White; - } - - return tb; - } - - private static bool TryParseHexColor(ReadOnlySpan hex, out IBrush brush) - { - if (hex.Length == 6 - && byte.TryParse(hex[..2], NumberStyles.HexNumber, CultureInfo.InvariantCulture, out byte r) - && byte.TryParse(hex[2..4], NumberStyles.HexNumber, CultureInfo.InvariantCulture, out byte g) - && byte.TryParse(hex[4..6], NumberStyles.HexNumber, CultureInfo.InvariantCulture, out byte b)) - { - brush = new SolidColorBrush(Color.FromRgb(r, g, b)); - return true; - } - brush = Brushes.White; - return false; - } - - private static void AddRun(TextBlock tb, string text, IBrush color, - bool bold, bool italic, bool underline, bool strikethrough) - { - if (text.Length == 0) return; - - tb.Inlines ??= new InlineCollection(); - - TextDecorationCollection? decorations = null; - if (underline || strikethrough) - { - decorations = []; - if (underline) - decorations.Add(new TextDecoration { Location = TextDecorationLocation.Underline }); - if (strikethrough) - decorations.Add(new TextDecoration { Location = TextDecorationLocation.Strikethrough }); - } - - tb.Inlines.Add(new Run(text) - { - Foreground = color, - FontWeight = bold ? FontWeight.Bold : FontWeight.Normal, - FontStyle = italic ? FontStyle.Italic : FontStyle.Normal, - TextDecorations = decorations, - }); - } - } -} diff --git a/MinecraftClient/Tui/MccBannerPanelBuilder.cs b/MinecraftClient/Tui/MccBannerPanelBuilder.cs deleted file mode 100644 index 2ebab67311..0000000000 --- a/MinecraftClient/Tui/MccBannerPanelBuilder.cs +++ /dev/null @@ -1,183 +0,0 @@ -using Avalonia; -using Avalonia.Controls; -using Avalonia.Controls.Documents; -using Avalonia.Layout; -using Avalonia.Media; - -namespace MinecraftClient.Tui -{ - internal static class MccBannerPanelBuilder - { - internal static Border Build(string? buildInfo) - { - var contentPanel = new DockPanel { Background = Brushes.Black }; - - var icon = BuildIcon(); - icon.VerticalAlignment = VerticalAlignment.Center; - DockPanel.SetDock(icon, Dock.Left); - contentPanel.Children.Add(icon); - - var infoPanel = new StackPanel - { - Orientation = Orientation.Vertical, - Margin = new Thickness(1, 0, 0, 0), - VerticalAlignment = VerticalAlignment.Center, - }; - - AddTitle(infoPanel); - AddVersionRange(infoPanel); - AddGithub(infoPanel); - - if (Settings.Config.Main.Advanced.ShowGithubStarReminder) - AddStarReminder(infoPanel); - - if (buildInfo is not null) - AddBuildInfo(infoPanel, buildInfo); - - contentPanel.Children.Add(infoPanel); - - return new Border - { - BorderBrush = new SolidColorBrush(Color.FromRgb(80, 80, 80)), - BorderThickness = new Thickness(1), - Background = new SolidColorBrush(Color.FromArgb(240, 20, 20, 20)), - Padding = new Thickness(1, 0), - Child = contentPanel, - Margin = new Thickness(0), - }; - } - - private static void AddTitle(StackPanel panel) - { - var row = new TextBlock(); - row.Inlines!.Add(new Run("Minecraft Console Client") - { Foreground = Pal.Gold, FontWeight = FontWeight.Bold }); - row.Inlines.Add(new Run($" v{Program.Version}") { Foreground = Pal.Aqua }); - panel.Children.Add(row); - } - - private static void AddVersionRange(StackPanel panel) - { - var row = new TextBlock(); - row.Inlines!.Add(Lbl(Translations.mcc_banner_label_mc_versions)); - row.Inlines.Add(Val(Program.MCLowestVersion, Pal.Green)); - row.Inlines.Add(new Run(" - ") { Foreground = Pal.Gray }); - row.Inlines.Add(Val(Program.MCHighestVersion, Pal.Green)); - panel.Children.Add(row); - } - - private static void AddGithub(StackPanel panel) - { - var row = new TextBlock(); - row.Inlines!.Add(Val("https://github.com/MCCTeam", Pal.Gray)); - panel.Children.Add(row); - } - - private static void AddStarReminder(StackPanel panel) - { - var row = new TextBlock(); - row.Inlines!.Add(new Run("\u2b50 ") { Foreground = Pal.Gold }); - row.Inlines.Add(Val("Star us on GitHub!", Pal.Gold)); - panel.Children.Add(row); - } - - private static void AddBuildInfo(StackPanel panel, string buildInfo) - { - panel.Children.Add(new TextBlock - { - Text = buildInfo, - Foreground = Pal.DarkGray, - }); - } - - #region Icon - - private static readonly Color B1 = Color.FromRgb(200, 200, 200); // bezel bright - private static readonly Color B2 = Color.FromRgb(160, 160, 160); // bezel mid - private static readonly Color B3 = Color.FromRgb(120, 120, 120); // bezel dark - private static readonly Color S = Color.FromRgb(20, 20, 20); // screen bg - private static readonly Color C = Color.FromRgb(55, 200, 55); // creeper green - - // @formatter:off - private static readonly Color[,] Pixels = - { - { B1, B1, B1, B1, B1, B1, B1, B1, B1, B1, B1, B1, B1, B1, B1, B1, B2 }, - { B1, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, B3 }, - { B1, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, B3 }, - { B1, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, B3 }, - { B1, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, B3 }, - { B1, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, B3 }, - { B1, S, S, S, S, S, S, S, S, C, C, S, S, C, C, S, B3 }, - { B1, S, S, S, S, S, S, S, S, C, C, S, S, C, C, S, B3 }, - { B1, S, S, S, S, S, S, S, S, S, S, C, C, S, S, S, B3 }, - { B1, S, S, S, S, S, S, S, S, S, C, C, C, C, S, S, B3 }, - { B1, S, S, S, S, S, S, S, S, S, C, C, C, C, S, S, B3 }, - { B1, S, S, S, S, S, S, S, S, S, C, S, S, C, S, S, B3 }, - { B1, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, B3 }, - { B2, B3, B3, B3, B3, B3, B3, B3, B3, B3, B3, B3, B3, B3, B3, B3, B3 }, - }; - // @formatter:on - - private static Control BuildIcon() - { - int cols = Pixels.GetLength(1); - int textRows = Pixels.GetLength(0) / 2; - - var panel = new StackPanel - { - Orientation = Orientation.Vertical, - Margin = new Thickness(0), - }; - - for (int row = 0; row < textRows; row++) - { - var line = new TextBlock { Padding = new Thickness(0), Margin = new Thickness(0) }; - - for (int col = 0; col < cols; col++) - { - var topColor = Pixels[row * 2, col]; - var bottomColor = Pixels[row * 2 + 1, col]; - - if (row == 1 && col == 1) - { - line.Inlines!.Add(new Run(" \uff1e_") - { - Foreground = new SolidColorBrush(Color.FromRgb(255, 255, 255)), - Background = new SolidColorBrush(S), - }); - col += 4; - topColor = Pixels[row * 2, col]; - bottomColor = Pixels[row * 2 + 1, col]; - } - - line.Inlines!.Add(new Run("\u2580") - { - Foreground = new SolidColorBrush(topColor), - Background = new SolidColorBrush(bottomColor), - }); - } - - panel.Children.Add(line); - } - - return panel; - } - - #endregion - - private static Run Lbl(string text) => - new(text + " ") { Foreground = Pal.Gray }; - - private static Run Val(string text, IBrush color) => - new(text) { Foreground = color }; - - private static class Pal - { - public static readonly IBrush Gray = new SolidColorBrush(Color.FromRgb(170, 170, 170)); - public static readonly IBrush DarkGray = new SolidColorBrush(Color.FromRgb(85, 85, 85)); - public static readonly IBrush Aqua = new SolidColorBrush(Color.FromRgb(85, 255, 255)); - public static readonly IBrush Green = new SolidColorBrush(Color.FromRgb(85, 255, 85)); - public static readonly IBrush Gold = new SolidColorBrush(Color.FromRgb(255, 170, 0)); - } - } -} diff --git a/MinecraftClient/Tui/MccTuiApp.cs b/MinecraftClient/Tui/MccTuiApp.cs deleted file mode 100644 index 3db7702942..0000000000 --- a/MinecraftClient/Tui/MccTuiApp.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Avalonia; -using Avalonia.Controls; -using Avalonia.Controls.ApplicationLifetimes; -using Avalonia.Media; -using Consolonia.Themes; - -namespace MinecraftClient.Tui -{ - public class MccTuiApp : Application - { - public override void Initialize() - { - Styles.Add(new ModernTheme()); - } - - public override void OnFrameworkInitializationCompleted() - { - if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) - { - var view = new MainTuiView(); - TuiConsoleBackend.Instance?.SetView(view); - - desktop.MainWindow = new Window - { - Content = view, - Title = "Minecraft Console Client", - Background = Brushes.Black, - Padding = new Thickness(0), - }; - } - - base.OnFrameworkInitializationCompleted(); - } - } -} diff --git a/MinecraftClient/Tui/MinimapColorMap.cs b/MinecraftClient/Tui/MinimapColorMap.cs deleted file mode 100644 index b0b09596a3..0000000000 --- a/MinecraftClient/Tui/MinimapColorMap.cs +++ /dev/null @@ -1,191 +0,0 @@ -using System; -using System.Collections.Frozen; -using System.Collections.Generic; -using System.Reflection; -using System.Text.Json; -using Avalonia.Media; -using MinecraftClient.Mapping; - -namespace MinecraftClient.Tui -{ - /// - /// Maps block Materials to minimap colors using data extracted from Minecraft's - /// official MapColor table. Colors are loaded from the embedded MinimapBlockColors.json - /// resource generated by tools/gen_block_color_map.py. - /// - public static class MinimapColorMap - { - public static readonly Color WaterColor = Color.FromRgb(64, 64, 255); - public static readonly Color IceColor = Color.FromRgb(160, 160, 255); - public static readonly Color LavaColor = Color.FromRgb(255, 100, 0); - public static readonly Color DefaultColor = Color.FromRgb(60, 60, 60); - public static readonly Color VoidColor = Color.FromRgb(0, 0, 0); - public static readonly Color CaveBorderColor = Color.FromRgb(16, 16, 16); - public static readonly Color CaveSolidColor = Color.FromRgb(24, 20, 18); - - private static readonly FrozenDictionary ColorTable; - private static readonly FrozenSet FullyTransparentMats; - private static readonly FrozenSet WaterMats; - private static readonly FrozenSet IceMats; - - static MinimapColorMap() - { - var colors = new Dictionary(); - var transparent = new HashSet(); - var water = new HashSet(); - var ice = new HashSet(); - - try - { - using var stream = Assembly.GetExecutingAssembly() - .GetManifestResourceStream("MinimapBlockColors.json"); - if (stream is not null) - { - using var doc = JsonDocument.Parse(stream); - var root = doc.RootElement; - - if (root.TryGetProperty("colors", out var colorsEl)) - { - foreach (var prop in colorsEl.EnumerateObject()) - { - if (!Enum.TryParse(prop.Name, out var mat)) - continue; - var arr = prop.Value; - if (arr.GetArrayLength() < 3) continue; - byte r = (byte)arr[0].GetInt32(); - byte g = (byte)arr[1].GetInt32(); - byte b = (byte)arr[2].GetInt32(); - colors[mat] = Color.FromRgb(r, g, b); - } - } - - if (root.TryGetProperty("transparent", out var transEl)) - { - foreach (var item in transEl.EnumerateArray()) - { - if (Enum.TryParse(item.GetString(), out var mat)) - transparent.Add(mat); - } - } - - if (root.TryGetProperty("water", out var waterEl)) - { - foreach (var item in waterEl.EnumerateArray()) - { - if (Enum.TryParse(item.GetString(), out var mat)) - water.Add(mat); - } - } - - if (root.TryGetProperty("ice", out var iceEl)) - { - foreach (var item in iceEl.EnumerateArray()) - { - if (Enum.TryParse(item.GetString(), out var mat)) - ice.Add(mat); - } - } - } - } - catch (Exception ex) - { - ConsoleIO.WriteLineFormatted($"\u00a7e[Minimap] Failed to load color data: {ex.Message}"); - } - - if (transparent.Count == 0) - { - transparent.Add(Material.Air); - transparent.Add(Material.CaveAir); - transparent.Add(Material.VoidAir); - } - if (water.Count == 0) - water.Add(Material.Water); - if (ice.Count == 0) - { - ice.Add(Material.Ice); - ice.Add(Material.PackedIce); - ice.Add(Material.BlueIce); - ice.Add(Material.FrostedIce); - } - - ColorTable = colors.ToFrozenDictionary(); - FullyTransparentMats = transparent.ToFrozenSet(); - WaterMats = water.ToFrozenSet(); - IceMats = ice.ToFrozenSet(); - } - - public static bool IsFullyTransparent(Material m) => FullyTransparentMats.Contains(m); - - /// - /// Returns true for materials that block light propagation (solid, liquids), - /// used by cave mode to find the surface from the player's Y level. - /// Mirrors VoxelMap's lightDampening > 0 check. - /// - public static bool IsLightBlocking(Material m) - => (m == Material.Lava) || (!FullyTransparentMats.Contains(m) && m.IsSolid()); - - public static bool IsWater(Material m) => WaterMats.Contains(m); - - public static bool IsIce(Material m) => IceMats.Contains(m); - - public static Color GetBaseColor(Material m) - { - if (m == Material.Lava) - return LavaColor; - return ColorTable.GetValueOrDefault(m, DefaultColor); - } - - /// - /// Apply Minecraft-style height shading. The shade multiplier depends on - /// the height difference between the current block and the block to its north. - /// Vanilla maps use four brightness levels: LOW (180/255), NORMAL (220/255), - /// HIGH (255/255), and LOWEST (135/255). We use NORMAL as baseline and shift - /// up/down based on delta. - /// - public static Color ApplyHeightShade(Color baseColor, int heightDelta) - { - int multiplier = heightDelta switch - { - > 0 => 255, // higher than neighbor: brightest - 0 => 220, // same height: normal - _ => 180, // lower than neighbor: darker - }; - byte r = (byte)(baseColor.R * multiplier / 255); - byte g = (byte)(baseColor.G * multiplier / 255); - byte b = (byte)(baseColor.B * multiplier / 255); - return Color.FromRgb(r, g, b); - } - - public static Color BlendWaterColor(Color bottomColor, int waterDepth) - { - double alpha = Math.Min(0.85, 0.35 + waterDepth * 0.08); - return Blend(WaterColor, bottomColor, alpha); - } - - public static Color BlendIceColor(Color bottomColor) - { - return Blend(IceColor, bottomColor, 0.35); - } - - /// - /// Darken a color to simulate underground lighting. Cave floors receive - /// a minimum brightness of ~32/255 for non-solid blocks (matching VoxelMap), - /// while solid/unreachable columns render as near-black. - /// - public static Color ApplyCaveDarkening(Color baseColor, double factor = 0.55) - { - byte r = (byte)(baseColor.R * factor); - byte g = (byte)(baseColor.G * factor); - byte b = (byte)(baseColor.B * factor); - return Color.FromRgb(r, g, b); - } - - private static Color Blend(Color top, Color bottom, double topAlpha) - { - byte r = (byte)(top.R * topAlpha + bottom.R * (1.0 - topAlpha)); - byte g = (byte)(top.G * topAlpha + bottom.G * (1.0 - topAlpha)); - byte b = (byte)(top.B * topAlpha + bottom.B * (1.0 - topAlpha)); - return Color.FromRgb(r, g, b); - } - } -} diff --git a/MinecraftClient/Tui/MinimapControl.cs b/MinecraftClient/Tui/MinimapControl.cs deleted file mode 100644 index 616b44e54a..0000000000 --- a/MinecraftClient/Tui/MinimapControl.cs +++ /dev/null @@ -1,1267 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Input; -using Avalonia.Layout; -using Avalonia.Media; -using Avalonia.Threading; -using MinecraftClient.Mapping; - -namespace MinecraftClient.Tui -{ - public enum CaveModeOption { auto, on, off } - - /// - /// TUI minimap control rendered as a grid of TextBlocks using half-block characters. - /// Zoom is expressed as blocks-per-pixel (1 = 1:1, 16 = 16 blocks per pixel). - /// Entity names are drawn directly on the map below their icon. - /// - public class MinimapControl : UserControl - { - public const int MinZoom = 1; - public const int MaxZoom = 16; - public const int DefaultZoom = 2; - public const int DefaultWidth = 40; - public const int DefaultHeight = 40; - public const int DefaultRefreshMs = 1000; - public const int MinRefreshMs = 100; - public const int MaxRefreshMs = 5000; - - private int _mapWidth; - private int _mapHeight; - private int _cellRows; - - private int _blocksPerPixel = DefaultZoom; - private volatile bool _sampling; - private CancellationTokenSource? _cts; - - private readonly NameDisplayConfig _nameConfig = new(); - - private TextBlock[,] _cells; - private readonly StackPanel _infoRow; - private readonly StackPanel _legendPanel; - private readonly Grid _mapGrid; - private readonly DispatcherTimer _timer; - - private SampleResult? _lastResult; - private int _hoverCol = -1; - private int _hoverRow = -1; - private double _hoverGlobalX; - private double _hoverGlobalY; - - public int BlocksPerPixel - { - get => _blocksPerPixel; - set => _blocksPerPixel = Math.Clamp(value, MinZoom, MaxZoom); - } - - public NameDisplayConfig NameConfig => _nameConfig; - - public TuiTooltipService? TooltipService { get; set; } - - public MinimapPosition Position { get; set; } = MinimapPosition.top_right; - - public CaveModeOption CaveMode { get; set; } = CaveModeOption.auto; - - public int MapPixelWidth => _mapWidth; - public int MapPixelHeight => _mapHeight; - - public int RefreshIntervalMs - { - get => (int)_timer.Interval.TotalMilliseconds; - set => _timer.Interval = TimeSpan.FromMilliseconds(Math.Clamp(value, MinRefreshMs, MaxRefreshMs)); - } - - public MinimapControl() : this(DefaultWidth, DefaultHeight) { } - - public MinimapControl(int width, int height) - { - _mapWidth = Math.Max(10, width); - _mapHeight = Math.Max(4, height % 2 == 0 ? height : height + 1); - _cellRows = _mapHeight / 2; - - _mapGrid = new Grid(); - _cells = BuildGrid(_mapGrid, _cellRows, _mapWidth); - - _infoRow = new StackPanel { Orientation = Orientation.Horizontal }; - _legendPanel = new StackPanel { Orientation = Orientation.Horizontal }; - - var root = new StackPanel - { - Orientation = Orientation.Vertical, - Children = { _mapGrid, _infoRow, _legendPanel }, - }; - - Content = root; - - _mapGrid.PointerMoved += OnMapPointerMoved; - _mapGrid.PointerExited += OnMapPointerExited; - - _timer = new DispatcherTimer - { - Interval = TimeSpan.FromMilliseconds(DefaultRefreshMs), - }; - _timer.Tick += (_, _) => RequestSample(); - } - - public void Resize(int width, int height) - { - _mapWidth = Math.Max(10, width); - _mapHeight = Math.Max(4, height % 2 == 0 ? height : height + 1); - _cellRows = _mapHeight / 2; - - _mapGrid.Children.Clear(); - _mapGrid.RowDefinitions.Clear(); - _mapGrid.ColumnDefinitions.Clear(); - _cells = BuildGrid(_mapGrid, _cellRows, _mapWidth); - } - - private static TextBlock[,] BuildGrid(Grid grid, int rows, int cols) - { - var cells = new TextBlock[rows, cols]; - for (int r = 0; r < rows; r++) - grid.RowDefinitions.Add(new RowDefinition(GridLength.Auto)); - for (int c = 0; c < cols; c++) - grid.ColumnDefinitions.Add(new ColumnDefinition(GridLength.Auto)); - - for (int r = 0; r < rows; r++) - { - for (int c = 0; c < cols; c++) - { - var tb = new TextBlock - { - Text = "\u2580", - Foreground = Brushes.Black, - Background = Brushes.Black, - Padding = new Thickness(0), - Margin = new Thickness(0), - FontSize = 1, - }; - Grid.SetRow(tb, r); - Grid.SetColumn(tb, c); - grid.Children.Add(tb); - cells[r, c] = tb; - } - } - return cells; - } - - public void Start() - { - _cts = new CancellationTokenSource(); - _timer.Start(); - RequestSample(); - } - - public void Stop() - { - _timer.Stop(); - _cts?.Cancel(); - _cts?.Dispose(); - _cts = null; - } - - private void RequestSample() - { - if (_sampling) return; - if (McClient.Instance is not McClient client) return; - if (!client.GetTerrainEnabled()) return; - - _sampling = true; - var ct = _cts?.Token ?? CancellationToken.None; - int bpp = _blocksPerPixel; - int w = _mapWidth; - int h = _mapHeight; - - bool showPlayers = _nameConfig.Players; - bool showHostile = _nameConfig.Hostile; - bool showNeutral = _nameConfig.Neutral; - bool showPassive = _nameConfig.Passive; - var caveOpt = CaveMode; - - Task.Run(() => - { - try - { - var result = SampleTerrain(client, bpp, w, h, - showPlayers, showHostile, showNeutral, showPassive, caveOpt, ct); - if (ct.IsCancellationRequested) return; - - Dispatcher.UIThread.Post(() => - { - ApplyPixelBuffer(result, w, h); - UpdateInfoBarAndLegend(client, bpp, result.VisibleCategories, w, - result.CaveModeActive); - }); - } - catch (OperationCanceledException) { } - catch (Exception ex) - { - ConsoleIO.WriteLineFormatted($"\u00a7e[Minimap] Sample error: {ex.Message}"); - } - finally - { - _sampling = false; - } - }, ct); - } - - internal sealed class EntityLabel - { - public string Name = ""; - public Color LabelColor; - public int PixelX; - public int PixelY; - } - - internal sealed class PixelEntityInfo - { - public string Name = ""; - public MobCategory Category; - public double X, Y, Z; - public float Health; - public float MaxHealth; - public int Priority; - } - - private sealed class SampleResult - { - public Color[,] Pixels = null!; - public (char Ch, Color Fg, Color Bg)?[,] CharOverlay = null!; - public HashSet VisibleCategories = []; - public int[,] Heights = null!; - public Material[,]? BlockTypes; - public List<(Material Mat, int Count)>?[,]? BlockSummary; - public List?[,]? EntityMap; - public int PlayerBlockX; - public int PlayerBlockZ; - public int CenterX; - public int CenterY; - public int Bpp; - public bool CaveModeActive; - } - - private static bool ShouldShowNameLocal(MobCategory cat, - bool showPlayers, bool showHostile, bool showNeutral, bool showPassive) - { - return cat switch - { - MobCategory.Player => showPlayers, - MobCategory.Hostile => showHostile, - MobCategory.Neutral => showNeutral, - MobCategory.Passive => showPassive, - _ => false, - }; - } - - private static SampleResult SampleTerrain(McClient client, int bpp, int mapW, int mapH, - bool showPlayers, bool showHostile, bool showNeutral, bool showPassive, - CaveModeOption caveOpt, CancellationToken ct) - { - var result = new SampleResult - { - Pixels = new Color[mapW, mapH], - CharOverlay = new (char, Color, Color)?[mapW, mapH / 2], - Heights = new int[mapW, mapH], - EntityMap = new List?[mapW, mapH], - BlockTypes = bpp == 1 ? new Material[mapW, mapH] : null, - BlockSummary = bpp > 1 ? new List<(Material, int)>?[mapW, mapH] : null, - Bpp = bpp, - }; - var world = client.GetWorld(); - var playerLoc = client.GetCurrentLocation(); - - int playerBlockX = (int)Math.Floor(playerLoc.X); - int playerBlockZ = (int)Math.Floor(playerLoc.Z); - int playerBlockY = (int)Math.Floor(playerLoc.Y); - - result.PlayerBlockX = playerBlockX; - result.PlayerBlockZ = playerBlockZ; - result.CenterX = mapW / 2; - result.CenterY = mapH / 2; - - var dim = World.GetDimension(); - int minY = dim.minY; - int scanTop = Math.Min(playerBlockY + 32, dim.maxY - 1); - - bool caveMode = ResolveCaveMode(caveOpt, world, dim, playerBlockX, playerBlockY, playerBlockZ, scanTop); - result.CaveModeActive = caveMode; - - var entities = client.GetEntityHandlingEnabled() - ? client.GetEntities() - : null; - - var entityPixels = new Dictionary<(int, int), (Color Color, int Priority)>(); - int centerX = mapW / 2; - int centerY = mapH / 2; - - var nameLabels = new List(); - var uuidNameMap = client.GetOnlinePlayersWithUUID(); - - if (entities is not null) - { - int playerEntityId = client.GetPlayerEntityID(); - foreach (var kvp in entities) - { - if (ct.IsCancellationRequested) return result; - var entity = kvp.Value; - var cat = MinimapEntityClassifier.Classify(entity.Type); - if (cat == MobCategory.NonLiving) continue; - if (kvp.Key == playerEntityId) continue; - - if (!MinimapEntityClassifier.ShouldDisplay(cat, playerLoc.Y, entity.Location.Y)) - continue; - - double relX = (entity.Location.X - playerLoc.X) / bpp; - double relZ = (entity.Location.Z - playerLoc.Z) / bpp; - int px = (int)Math.Floor(relX) + centerX; - int py = (int)Math.Floor(relZ) + centerY; - - if (px < 0 || px >= mapW || py < 0 || py >= mapH) continue; - - var baseColor = MinimapEntityClassifier.GetBaseColor(cat); - Color color; - if (cat == MobCategory.Player) - color = baseColor; - else - color = MinimapEntityClassifier.ApplyDepthFade(baseColor, playerLoc.Y, entity.Location.Y); - int priority = MinimapEntityClassifier.GetPriority(cat); - - var key = (px, py); - if (!entityPixels.TryGetValue(key, out var existing) || priority > existing.Priority) - entityPixels[key] = (color, priority); - - result.VisibleCategories.Add(cat); - - string eName = ResolveEntityName(client, entity, cat, uuidNameMap); - var pixelList = result.EntityMap![px, py] ??= []; - pixelList.Add(new PixelEntityInfo - { - Name = eName, - Category = cat, - X = entity.Location.X, - Y = entity.Location.Y, - Z = entity.Location.Z, - Health = entity.Health, - MaxHealth = -1, - Priority = priority, - }); - - if (ShouldShowNameLocal(cat, showPlayers, showHostile, showNeutral, showPassive)) - { - string name = ResolveEntityName(client, entity, cat, uuidNameMap); - nameLabels.Add(new EntityLabel - { - Name = name, - LabelColor = color, - PixelX = px, - PixelY = py, - }); - } - } - } - - entityPixels[(centerX, centerY)] = (MinimapEntityClassifier.PlayerColor, 5); - result.VisibleCategories.Add(MobCategory.Player); - - var selfList = result.EntityMap![centerX, centerY] ??= []; - selfList.Add(new PixelEntityInfo - { - Name = client.GetUsername(), - Category = MobCategory.Player, - X = playerLoc.X, - Y = playerLoc.Y, - Z = playerLoc.Z, - Health = client.GetHealth(), - MaxHealth = 20f, - Priority = 5, - }); - - ChunkColumn? cachedColumn = null; - int cachedChunkX = int.MinValue, cachedChunkZ = int.MinValue; - - bool[,]? caveMask = caveMode ? new bool[mapW, mapH] : null; - - for (int px = 0; px < mapW; px++) - { - for (int py = 0; py < mapH; py++) - { - if (ct.IsCancellationRequested) return result; - - int baseX = playerBlockX + (px - centerX) * bpp; - int baseZ = playerBlockZ + (py - centerY) * bpp; - - if (caveMode) - { - if (bpp == 1) - { - var (color, surfY, surfMat, inCave) = SampleColumnCave( - world, baseX, baseZ, playerBlockY, minY, dim.maxY - 1, - ref cachedColumn, ref cachedChunkX, ref cachedChunkZ); - result.Pixels[px, py] = color; - result.Heights[px, py] = surfY; - result.BlockTypes![px, py] = surfMat; - caveMask![px, py] = inCave; - } - else - { - var (color, surfY, matSum, inCave) = SampleAreaDominantCave( - world, baseX, baseZ, bpp, playerBlockY, minY, dim.maxY - 1, - result.BlockSummary is not null, - ref cachedColumn, ref cachedChunkX, ref cachedChunkZ); - result.Pixels[px, py] = color; - result.Heights[px, py] = surfY; - if (result.BlockSummary is not null) - result.BlockSummary[px, py] = matSum; - caveMask![px, py] = inCave; - } - } - else - { - if (bpp == 1) - { - var (color, surfY, surfMat) = SampleColumn(world, baseX, baseZ, scanTop, minY, - ref cachedColumn, ref cachedChunkX, ref cachedChunkZ); - result.Pixels[px, py] = color; - result.Heights[px, py] = surfY; - result.BlockTypes![px, py] = surfMat; - } - else - { - var (color, surfY, matSum) = SampleAreaDominant(world, baseX, baseZ, bpp, - scanTop, minY, result.BlockSummary is not null, - ref cachedColumn, ref cachedChunkX, ref cachedChunkZ); - result.Pixels[px, py] = color; - result.Heights[px, py] = surfY; - if (result.BlockSummary is not null) - result.BlockSummary[px, py] = matSum; - } - } - } - } - - for (int px = 0; px < mapW; px++) - { - for (int py = 0; py < mapH; py++) - { - if (entityPixels.ContainsKey((px, py))) continue; - - int northHeight = py > 0 ? result.Heights[px, py - 1] : result.Heights[px, py]; - int delta = result.Heights[px, py] - northHeight; - result.Pixels[px, py] = MinimapColorMap.ApplyHeightShade(result.Pixels[px, py], delta); - } - } - - if (caveMask is not null) - ApplyCaveBorder(result, caveMask, mapW, mapH, entityPixels); - - foreach (var (key, info) in entityPixels) - { - var (px, py) = key; - if (px >= 0 && px < mapW && py >= 0 && py < mapH) - result.Pixels[px, py] = info.Color; - } - - BakeNameLabels(result, nameLabels, mapW, mapH); - - return result; - } - - private static string ResolveEntityName(McClient client, Entity entity, - MobCategory cat, Dictionary? uuidNameMap) - { - if (cat == MobCategory.Player) - { - if (!string.IsNullOrWhiteSpace(entity.Name)) - return entity.Name; - - if (entity.UUID != System.Guid.Empty) - { - var playerInfo = client.GetPlayerInfo(entity.UUID); - if (!string.IsNullOrWhiteSpace(playerInfo?.Name)) - return playerInfo.Name; - - if (uuidNameMap is not null && - uuidNameMap.TryGetValue(entity.UUID.ToString(), out string? mapped) && - !string.IsNullOrWhiteSpace(mapped)) - return mapped; - } - - return "Player"; - } - - if (!string.IsNullOrWhiteSpace(entity.Name)) - return entity.Name; - - return entity.Type.ToString(); - } - - private static void BakeNameLabels(SampleResult result, List labels, - int mapW, int mapH) - { - if (labels.Count == 0) return; - int cellRows = mapH / 2; - - var occupied = new HashSet<(int col, int row)>(); - - labels.Sort((a, b) => - { - int pa = MinimapEntityClassifier.GetPriority( - a.LabelColor == MinimapEntityClassifier.PlayerColor ? MobCategory.Player : - a.LabelColor == MinimapEntityClassifier.HostileColor ? MobCategory.Hostile : - a.LabelColor == MinimapEntityClassifier.NeutralColor ? MobCategory.Neutral : MobCategory.Passive); - int pb = MinimapEntityClassifier.GetPriority( - b.LabelColor == MinimapEntityClassifier.PlayerColor ? MobCategory.Player : - b.LabelColor == MinimapEntityClassifier.HostileColor ? MobCategory.Hostile : - b.LabelColor == MinimapEntityClassifier.NeutralColor ? MobCategory.Neutral : MobCategory.Passive); - return pb.CompareTo(pa); - }); - - foreach (var lbl in labels) - { - int cellRow = (lbl.PixelY / 2) + 1; - if (cellRow >= cellRows) cellRow = lbl.PixelY / 2 - 1; - if (cellRow < 0 || cellRow >= cellRows) continue; - - int startCol = lbl.PixelX - lbl.Name.Length / 2; - startCol = Math.Clamp(startCol, 0, mapW - 1); - - bool fits = true; - int endCol = Math.Min(startCol + lbl.Name.Length, mapW); - for (int c = startCol; c < endCol; c++) - { - if (occupied.Contains((c, cellRow))) - { - fits = false; - break; - } - } - if (!fits) continue; - - for (int i = 0; i < lbl.Name.Length && startCol + i < mapW; i++) - { - int col = startCol + i; - occupied.Add((col, cellRow)); - - var bgTop = result.Pixels[col, cellRow * 2]; - var bgBot = (cellRow * 2 + 1 < mapH) - ? result.Pixels[col, cellRow * 2 + 1] - : bgTop; - - var avgBg = Color.FromRgb( - (byte)((bgTop.R + bgBot.R) / 2), - (byte)((bgTop.G + bgBot.G) / 2), - (byte)((bgTop.B + bgBot.B) / 2)); - - result.CharOverlay[col, cellRow] = (lbl.Name[i], lbl.LabelColor, avgBg); - } - } - } - - private static (Color color, int surfaceY, Material surfaceMat) SampleColumn(World world, int x, int z, - int scanTop, int minY, - ref ChunkColumn? cachedColumn, ref int cachedChunkX, ref int cachedChunkZ) - { - int chunkX = x >> 4; - int chunkZ = z >> 4; - if (chunkX != cachedChunkX || chunkZ != cachedChunkZ) - { - cachedColumn = world[chunkX, chunkZ]; - cachedChunkX = chunkX; - cachedChunkZ = chunkZ; - } - - if (cachedColumn is null) - return (MinimapColorMap.VoidColor, minY, Material.Air); - - int waterDepth = 0; - bool inIce = false; - int surfaceY = minY; - Material topMat = Material.Air; - - for (int y = scanTop; y >= minY; y--) - { - var loc = new Mapping.Location(x, y, z); - var chunk = cachedColumn.GetChunk(loc); - if (chunk is null) continue; - - var block = chunk.GetBlock(loc); - var mat = block.Type; - - if (MinimapColorMap.IsFullyTransparent(mat)) - continue; - - if (MinimapColorMap.IsWater(mat)) - { - if (waterDepth == 0) { surfaceY = y; topMat = mat; } - waterDepth++; - continue; - } - - if (MinimapColorMap.IsIce(mat) && !inIce) - { - if (waterDepth == 0) { surfaceY = y; topMat = mat; } - inIce = true; - continue; - } - - if (waterDepth == 0 && !inIce) { surfaceY = y; topMat = mat; } - - var baseColor = MinimapColorMap.GetBaseColor(mat); - - if (waterDepth > 0) - baseColor = MinimapColorMap.BlendWaterColor(baseColor, waterDepth); - if (inIce) - baseColor = MinimapColorMap.BlendIceColor(baseColor); - - return (baseColor, surfaceY, topMat); - } - - if (waterDepth > 0) - return (MinimapColorMap.WaterColor, surfaceY, topMat); - - return (MinimapColorMap.VoidColor, minY, Material.Air); - } - - private static (Color color, int surfaceY, List<(Material Mat, int Count)>? matSummary) - SampleAreaDominant(World world, int baseX, int baseZ, - int size, int scanTop, int minY, bool collectMats, - ref ChunkColumn? cachedColumn, ref int cachedChunkX, ref int cachedChunkZ) - { - var colorCounts = new Dictionary(); - Dictionary? matCounts = collectMats ? [] : null; - - int step = Math.Max(1, size / 3); - for (int dx = 0; dx < size; dx += step) - { - for (int dz = 0; dz < size; dz += step) - { - var (c, surfY, surfMat) = SampleColumn(world, baseX + dx, baseZ + dz, scanTop, minY, - ref cachedColumn, ref cachedChunkX, ref cachedChunkZ); - - if (colorCounts.TryGetValue(c, out var existing)) - colorCounts[c] = (existing.Count + 1, existing.SumY + surfY); - else - colorCounts[c] = (1, surfY); - - if (matCounts is not null) - { - if (matCounts.TryGetValue(surfMat, out int mc)) - matCounts[surfMat] = mc + 1; - else - matCounts[surfMat] = 1; - } - } - } - - Color best = MinimapColorMap.VoidColor; - int bestCount = 0; - int avgY = minY; - foreach (var kvp in colorCounts) - { - if (kvp.Value.Count > bestCount) - { - bestCount = kvp.Value.Count; - best = kvp.Key; - avgY = kvp.Value.SumY / kvp.Value.Count; - } - } - - List<(Material, int)>? summary = null; - if (matCounts is not null && matCounts.Count > 0) - { - summary = matCounts - .OrderByDescending(kv => kv.Value) - .Select(kv => (kv.Key, kv.Value)) - .ToList(); - } - - return (best, avgY, summary); - } - - /// - /// Determine whether cave mode should be active for this frame. - /// Mirrors VoxelMap's detection: hasCeiling dimensions always use cave mode, - /// otherwise check whether the player's column has a solid block above. - /// - private static bool ResolveCaveMode(CaveModeOption opt, World world, Dimension dim, - int playerX, int playerY, int playerZ, int scanTop) - { - if (opt == CaveModeOption.off) return false; - if (opt == CaveModeOption.on) return true; - - if (dim.hasCeiling) return true; - - for (int y = playerY + 2; y <= scanTop; y++) - { - var mat = world.GetBlock(new Mapping.Location(playerX, y, playerZ)).Type; - if (MinimapColorMap.IsLightBlocking(mat)) - return true; - } - return false; - } - - /// - /// Cave-mode column sampler. Starting from playerY, scans down through air - /// to find the first light-blocking block (the cave floor), or scans up if - /// the player is embedded in solid. Returns the floor block color with cave - /// darkening applied, plus an inCave flag indicating the column has a reachable - /// air pocket at the player's Y level. - /// - private static (Color color, int surfaceY, Material surfaceMat, bool inCave) SampleColumnCave( - World world, int x, int z, int playerY, int minY, int maxY, - ref ChunkColumn? cachedColumn, ref int cachedChunkX, ref int cachedChunkZ) - { - int chunkX = x >> 4; - int chunkZ = z >> 4; - if (chunkX != cachedChunkX || chunkZ != cachedChunkZ) - { - cachedColumn = world[chunkX, chunkZ]; - cachedChunkX = chunkX; - cachedChunkZ = chunkZ; - } - - if (cachedColumn is null) - return (MinimapColorMap.VoidColor, minY, Material.Air, false); - - int caveFloorY = FindCaveFloorY(cachedColumn, x, z, playerY, minY, maxY); - - if (caveFloorY == int.MinValue) - { - var fallback = SampleColumn(world, x, z, maxY, minY, - ref cachedColumn, ref cachedChunkX, ref cachedChunkZ); - return (MinimapColorMap.CaveSolidColor, fallback.surfaceY, fallback.surfaceMat, false); - } - - var loc = new Mapping.Location(x, caveFloorY, z); - var chunk = cachedColumn.GetChunk(loc); - if (chunk is null) - return (MinimapColorMap.CaveSolidColor, caveFloorY, Material.Air, false); - - var block = chunk.GetBlock(loc); - var mat = block.Type; - var color = MinimapColorMap.GetBaseColor(mat); - color = MinimapColorMap.ApplyCaveDarkening(color); - - return (color, caveFloorY, mat, true); - } - - /// - /// Find the cave floor Y at (x, z) by scanning from playerY. - /// If the block at playerY is air-like, scan down for the first solid block. - /// If the block at playerY is solid, scan up (up to playerY + 10) for the - /// first air block, then return that Y (the cave ceiling opening). - /// Returns int.MinValue if no cave floor is found. - /// - private static int FindCaveFloorY(ChunkColumn column, int x, int z, int playerY, int minY, int maxY) - { - var startLoc = new Mapping.Location(x, playerY, z); - var startChunk = column.GetChunk(startLoc); - - bool startIsAir; - if (startChunk is null) - { - startIsAir = true; - } - else - { - var startMat = startChunk.GetBlock(startLoc).Type; - startIsAir = !MinimapColorMap.IsLightBlocking(startMat); - } - - if (startIsAir) - { - for (int y = playerY - 1; y >= minY; y--) - { - var loc = new Mapping.Location(x, y, z); - var chunk = column.GetChunk(loc); - if (chunk is null) continue; - - var mat = chunk.GetBlock(loc).Type; - if (MinimapColorMap.IsLightBlocking(mat)) - return y; - } - return minY; - } - else - { - int upLimit = Math.Min(playerY + 10, maxY); - for (int y = playerY + 1; y <= upLimit; y++) - { - var loc = new Mapping.Location(x, y, z); - var chunk = column.GetChunk(loc); - if (chunk is null) continue; - - var mat = chunk.GetBlock(loc).Type; - if (!MinimapColorMap.IsLightBlocking(mat)) - { - for (int y2 = y - 1; y2 >= minY; y2--) - { - var loc2 = new Mapping.Location(x, y2, z); - var chunk2 = column.GetChunk(loc2); - if (chunk2 is null) continue; - - var mat2 = chunk2.GetBlock(loc2).Type; - if (MinimapColorMap.IsLightBlocking(mat2)) - return y2; - } - return minY; - } - } - return int.MinValue; - } - } - - private static (Color color, int surfaceY, List<(Material Mat, int Count)>? matSummary, bool inCave) - SampleAreaDominantCave(World world, int baseX, int baseZ, - int size, int playerY, int minY, int maxY, bool collectMats, - ref ChunkColumn? cachedColumn, ref int cachedChunkX, ref int cachedChunkZ) - { - var colorCounts = new Dictionary(); - Dictionary? matCounts = collectMats ? [] : null; - int caveCount = 0; - - int step = Math.Max(1, size / 3); - for (int dx = 0; dx < size; dx += step) - { - for (int dz = 0; dz < size; dz += step) - { - var (c, surfY, surfMat, inCave) = SampleColumnCave( - world, baseX + dx, baseZ + dz, playerY, minY, maxY, - ref cachedColumn, ref cachedChunkX, ref cachedChunkZ); - - if (inCave) caveCount++; - - if (colorCounts.TryGetValue(c, out var existing)) - colorCounts[c] = (existing.Count + 1, existing.SumY + surfY); - else - colorCounts[c] = (1, surfY); - - if (matCounts is not null) - { - if (matCounts.TryGetValue(surfMat, out int mc)) - matCounts[surfMat] = mc + 1; - else - matCounts[surfMat] = 1; - } - } - } - - Color best = MinimapColorMap.VoidColor; - int bestCount = 0; - int avgY = minY; - foreach (var kvp in colorCounts) - { - if (kvp.Value.Count > bestCount) - { - bestCount = kvp.Value.Count; - best = kvp.Key; - avgY = kvp.Value.SumY / kvp.Value.Count; - } - } - - List<(Material, int)>? summary = null; - if (matCounts is not null && matCounts.Count > 0) - { - summary = matCounts - .OrderByDescending(kv => kv.Value) - .Select(kv => (kv.Key, kv.Value)) - .ToList(); - } - - int totalSamples = 0; - foreach (var kvp in colorCounts) - totalSamples += kvp.Value.Count; - - bool majorityInCave = caveCount * 2 >= totalSamples; - return (best, avgY, summary, majorityInCave); - } - - /// - /// Draw a 1-pixel dark border around the boundary between cave-reachable pixels - /// and non-cave (solid/surface) pixels, giving the cave region a visible edge. - /// - private static void ApplyCaveBorder(SampleResult result, bool[,] caveMask, - int mapW, int mapH, Dictionary<(int, int), (Color, int)> entityPixels) - { - for (int px = 0; px < mapW; px++) - { - for (int py = 0; py < mapH; py++) - { - if (entityPixels.ContainsKey((px, py))) continue; - if (caveMask[px, py]) continue; - - bool neighborInCave = false; - if (px > 0 && caveMask[px - 1, py]) neighborInCave = true; - if (!neighborInCave && px < mapW - 1 && caveMask[px + 1, py]) neighborInCave = true; - if (!neighborInCave && py > 0 && caveMask[px, py - 1]) neighborInCave = true; - if (!neighborInCave && py < mapH - 1 && caveMask[px, py + 1]) neighborInCave = true; - - if (neighborInCave) - result.Pixels[px, py] = MinimapColorMap.CaveBorderColor; - } - } - } - - private void ApplyPixelBuffer(SampleResult result, int w, int h) - { - int rows = h / 2; - for (int row = 0; row < rows && row < _cellRows; row++) - { - for (int col = 0; col < w && col < _mapWidth; col++) - { - var overlay = result.CharOverlay[col, row]; - if (overlay is not null) - { - var (ch, fg, bg) = overlay.Value; - _cells[row, col].Text = ch.ToString(); - _cells[row, col].Foreground = new SolidColorBrush(fg); - _cells[row, col].Background = new SolidColorBrush(bg); - } - else - { - var topColor = result.Pixels[col, row * 2]; - var bottomColor = result.Pixels[col, row * 2 + 1]; - - _cells[row, col].Text = "\u2580"; - _cells[row, col].Foreground = new SolidColorBrush(topColor); - _cells[row, col].Background = new SolidColorBrush(bottomColor); - } - } - } - - _lastResult = result; - - if (_hoverCol >= 0 && _hoverRow >= 0) - UpdateTooltip(_hoverCol, _hoverRow); - } - - private void OnMapPointerMoved(object? sender, PointerEventArgs e) - { - var pos = e.GetPosition(_mapGrid); - int col = (int)pos.X; - int row = (int)pos.Y; - - if (col < 0 || col >= _mapWidth || row < 0 || row >= _cellRows) - { - HideTooltip(); - return; - } - - _hoverCol = col; - _hoverRow = row; - - if (this.VisualRoot is Visual root - && _mapGrid.TranslatePoint(pos, root) is { } gp) - { - _hoverGlobalX = gp.X; - _hoverGlobalY = gp.Y; - } - else - { - _hoverGlobalX = pos.X; - _hoverGlobalY = pos.Y; - } - - UpdateTooltip(col, row); - } - - private void OnMapPointerExited(object? sender, PointerEventArgs e) - { - HideTooltip(); - } - - private void HideTooltip() - { - _hoverCol = -1; - _hoverRow = -1; - TooltipService?.Hide(); - } - - private void UpdateTooltip(int col, int row) - { - var svc = TooltipService; - var result = _lastResult; - if (svc is null || result is null) { svc?.Hide(); return; } - - int bpp = result.Bpp; - int centerX = result.CenterX; - int centerY = result.CenterY; - - int topPixelY = row * 2; - int botPixelY = row * 2 + 1; - - int baseX = result.PlayerBlockX + (col - centerX) * bpp; - int baseZ_top = result.PlayerBlockZ + (topPixelY - centerY) * bpp; - int baseZ_bot = result.PlayerBlockZ + (botPixelY - centerY) * bpp; - - var lines = new List(); - - if (bpp == 1) - { - int surfY_top = (topPixelY < result.Heights.GetLength(1)) ? result.Heights[col, topPixelY] : 0; - int surfY_bot = (botPixelY < result.Heights.GetLength(1)) ? result.Heights[col, botPixelY] : 0; - - string coordLine = baseZ_top == baseZ_bot - ? $"{baseX}, {surfY_top}, {baseZ_top}" - : $"{baseX}, {surfY_top}, {baseZ_top} / {baseX}, {surfY_bot}, {baseZ_bot}"; - lines.Add(new TuiTooltipLine { Text = coordLine, Foreground = Brushes.White }); - - if (result.BlockTypes is not null) - { - var mat_top = result.BlockTypes[col, topPixelY]; - var mat_bot = (botPixelY < result.BlockTypes.GetLength(1)) - ? result.BlockTypes[col, botPixelY] : mat_top; - string blockLine = mat_top == mat_bot - ? FormatMaterialName(mat_top) - : $"{FormatMaterialName(mat_top)} / {FormatMaterialName(mat_bot)}"; - lines.Add(new TuiTooltipLine { Text = blockLine, Foreground = Brushes.LightGray }); - } - } - else - { - int endX = baseX + bpp - 1; - int endZ_bot = baseZ_bot + bpp - 1; - string coordLine = $"X {baseX}~{endX} Z {baseZ_top}~{endZ_bot}"; - lines.Add(new TuiTooltipLine { Text = coordLine, Foreground = Brushes.White }); - - AppendBlockSummaryLines(result, col, topPixelY, botPixelY, lines); - } - - AppendEntityInfoLines(result, col, topPixelY, botPixelY, lines); - - if (lines.Count == 0) - { - svc.Hide(); - return; - } - - bool preferRight = Position switch - { - MinimapPosition.top_left or MinimapPosition.bottom_left => true, - MinimapPosition.top_right or MinimapPosition.bottom_right => false, - _ => true, - }; - - double mx = _hoverGlobalX; - double my = _hoverGlobalY; - - if (Position == MinimapPosition.center - && this.VisualRoot is Visual root) - { - preferRight = mx < root.Bounds.Width / 2; - } - - svc.Show(mx, my, lines, preferRight); - } - - private void AppendBlockSummaryLines(SampleResult result, int col, int topPy, int botPy, - List lines) - { - if (result.BlockSummary is null) return; - - var merged = new Dictionary(); - MergeBlockCounts(result.BlockSummary, col, topPy, merged); - if (botPy < result.BlockSummary.GetLength(1)) - MergeBlockCounts(result.BlockSummary, col, botPy, merged); - - if (merged.Count == 0) return; - - var sorted = merged.OrderByDescending(kv => kv.Value).Take(4); - - var parts = new List(); - foreach (var kv in sorted) - { - if (kv.Key == Material.Air && merged.Count > 1) continue; - parts.Add(kv.Value > 1 - ? $"{FormatMaterialName(kv.Key)} x{kv.Value}" - : FormatMaterialName(kv.Key)); - } - - if (parts.Count == 0) return; - - lines.Add(new TuiTooltipLine - { - Text = string.Join(", ", parts), - Foreground = Brushes.LightGray, - }); - } - - private static void MergeBlockCounts(List<(Material Mat, int Count)>?[,] summary, - int px, int py, Dictionary target) - { - var list = summary[px, py]; - if (list is null) return; - foreach (var (mat, count) in list) - { - if (target.TryGetValue(mat, out int c)) - target[mat] = c + count; - else - target[mat] = count; - } - } - - private static void AppendEntityInfoLines(SampleResult result, int col, int topPy, int botPy, - List lines) - { - var entityMap = result.EntityMap; - if (entityMap is null) return; - - var combined = new List(); - AddEntitiesFromPixel(entityMap, col, topPy, combined); - if (botPy < entityMap.GetLength(1)) - AddEntitiesFromPixel(entityMap, col, botPy, combined); - - if (combined.Count == 0) return; - - combined.Sort((a, b) => b.Priority.CompareTo(a.Priority)); - int shown = 0; - var seen = new HashSet(); - foreach (var ent in combined) - { - if (shown >= 4) break; - string key = $"{ent.Name}_{ent.Health:F0}"; - if (!seen.Add(key)) continue; - - var catColor = MinimapEntityClassifier.GetBaseColor(ent.Category); - string coordStr = $"({ent.X:F1}, {ent.Y:F1}, {ent.Z:F1})"; - string hpStr = ""; - if (ent.Health > 0) - { - hpStr = ent.MaxHealth > 0 - ? $" HP:{ent.Health:F0}/{ent.MaxHealth:F0}" - : $" HP:{ent.Health:F0}"; - } - - lines.Add(new TuiTooltipLine - { - Text = $"{ent.Name} {coordStr}{hpStr}", - Foreground = new SolidColorBrush(catColor), - }); - shown++; - } - } - - private static void AddEntitiesFromPixel(List?[,] map, - int px, int py, List target) - { - if (px >= 0 && px < map.GetLength(0) && py >= 0 && py < map.GetLength(1)) - { - var list = map[px, py]; - if (list is not null) - target.AddRange(list); - } - } - - private static string FormatMaterialName(Material mat) - { - if (mat == Material.Air) return "Air"; - string raw = mat.ToString(); - return raw.Replace('_', ' '); - } - - private void UpdateInfoBarAndLegend(McClient client, int bpp, - HashSet categories, int mapW, bool caveModeActive) - { - var loc = client.GetCurrentLocation(); - float yaw = client.GetYaw(); - string arrow = GetDirectionArrow(yaw); - - int x = (int)Math.Floor(loc.X); - int y = (int)Math.Floor(loc.Y); - int z = (int)Math.Floor(loc.Z); - - string caveSuffix = caveModeActive ? " \u25bc" : ""; - string coordPart = $"{x}, {y}, {z} {arrow} {bpp}:1{caveSuffix}"; - - var legendParts = new List(); - var legendColors = new List(); - - var sorted = categories - .Where(c => c != MobCategory.NonLiving) - .OrderByDescending(MinimapEntityClassifier.GetPriority); - - int catCount = 0; - foreach (var cat in sorted) - { - if (catCount >= 4) break; - legendParts.Add(MinimapEntityClassifier.GetCategoryLabel(cat)); - legendColors.Add(MinimapEntityClassifier.GetBaseColor(cat)); - catCount++; - } - - int legendLen = 0; - for (int i = 0; i < legendParts.Count; i++) - legendLen += 1 + legendParts[i].Length + (i > 0 ? 1 : 0); - - bool fitsOnOneLine = legendParts.Count > 0 - && coordPart.Length + 2 + legendLen <= mapW; - - _infoRow.Children.Clear(); - _infoRow.Children.Add(new TextBlock - { - Text = coordPart, - Foreground = Brushes.Gray, - Padding = new Thickness(0), - }); - - if (fitsOnOneLine) - { - AppendLegendItems(_infoRow, legendParts, legendColors, leftMargin: 2); - _legendPanel.Children.Clear(); - _legendPanel.IsVisible = false; - } - else - { - _legendPanel.IsVisible = legendParts.Count > 0; - _legendPanel.Children.Clear(); - AppendLegendItems(_legendPanel, legendParts, legendColors, leftMargin: 0); - } - } - - private static void AppendLegendItems(StackPanel panel, - List parts, List colors, int leftMargin) - { - for (int i = 0; i < parts.Count; i++) - { - int ml = i == 0 ? leftMargin : 1; - panel.Children.Add(new TextBlock - { - Text = "\u25cf", - Foreground = new SolidColorBrush(colors[i]), - Padding = new Thickness(0), - Margin = ml > 0 ? new Thickness(ml, 0, 0, 0) : new Thickness(0), - }); - panel.Children.Add(new TextBlock - { - Text = parts[i], - Foreground = Brushes.Gray, - Padding = new Thickness(0), - Margin = new Thickness(0), - }); - } - } - - private static string GetDirectionArrow(float yaw) - { - double normalized = ((yaw % 360) + 360) % 360; - int index = (int)Math.Round(normalized / 45.0) % 8; - return index switch - { - 0 => "\u2193", // S - 1 => "\u2199", // SW - 2 => "\u2190", // W - 3 => "\u2196", // NW - 4 => "\u2191", // N - 5 => "\u2197", // NE - 6 => "\u2192", // E - 7 => "\u2198", // SE - _ => "\u2193", - }; - } - } -} diff --git a/MinecraftClient/Tui/MinimapEntityClassifier.cs b/MinecraftClient/Tui/MinimapEntityClassifier.cs deleted file mode 100644 index 2daf1ea6c4..0000000000 --- a/MinecraftClient/Tui/MinimapEntityClassifier.cs +++ /dev/null @@ -1,178 +0,0 @@ -using System; -using System.Collections.Frozen; -using System.Collections.Generic; -using System.Reflection; -using System.Text.Json; -using Avalonia.Media; -using MinecraftClient.Mapping; - -namespace MinecraftClient.Tui -{ - public enum MobCategory - { - Hostile, - Passive, - Neutral, - Player, - NonLiving, - } - - public enum MinimapPosition - { - top_left, - top_right, - center, - bottom_left, - bottom_right, - } - - public sealed class NameDisplayConfig - { - public volatile bool Players = false; - public volatile bool Hostile = false; - public volatile bool Neutral = false; - public volatile bool Passive = false; - - public bool AnyEnabled => Players || Hostile || Neutral || Passive; - - public void SetAll(bool value) - { - Players = value; - Hostile = value; - Neutral = value; - Passive = value; - } - - public bool ShouldShowName(MobCategory category) => category switch - { - MobCategory.Player => Players, - MobCategory.Hostile => Hostile, - MobCategory.Neutral => Neutral, - MobCategory.Passive => Passive, - _ => false, - }; - } - - /// - /// Classifies entities into minimap categories using data extracted from - /// Minecraft's MobCategory assignments. Categories are loaded from the - /// embedded MinimapEntityCategories.json resource generated by - /// tools/gen_entity_category_map.py. - /// - public static class MinimapEntityClassifier - { - public static readonly Color HostileColor = Color.FromRgb(255, 68, 68); - public static readonly Color PassiveColor = Color.FromRgb(68, 255, 68); - public static readonly Color NeutralColor = Color.FromRgb(255, 170, 0); - public static readonly Color PlayerColor = Color.FromRgb(255, 255, 255); - public static readonly Color FadedGray = Color.FromRgb(100, 100, 100); - - private static readonly FrozenDictionary CategoryTable; - - static MinimapEntityClassifier() - { - var table = new Dictionary(); - - try - { - using var stream = Assembly.GetExecutingAssembly() - .GetManifestResourceStream("MinimapEntityCategories.json"); - if (stream is not null) - { - using var doc = JsonDocument.Parse(stream); - var root = doc.RootElement; - - LoadCategory(root, "hostile", MobCategory.Hostile, table); - LoadCategory(root, "passive", MobCategory.Passive, table); - LoadCategory(root, "neutral", MobCategory.Neutral, table); - LoadCategory(root, "non_living", MobCategory.NonLiving, table); - } - } - catch (Exception ex) - { - ConsoleIO.WriteLogLine($"[Minimap] Failed to load entity categories: {ex.Message}"); - } - - CategoryTable = table.ToFrozenDictionary(); - } - - private static void LoadCategory(JsonElement root, string key, - MobCategory category, Dictionary table) - { - if (!root.TryGetProperty(key, out var arr)) - return; - - foreach (var el in arr.EnumerateArray()) - { - var name = el.GetString(); - if (name is not null && Enum.TryParse(name, out var et)) - table.TryAdd(et, category); - } - } - - public static MobCategory Classify(EntityType type) - { - if (type == EntityType.Player) - return MobCategory.Player; - return CategoryTable.GetValueOrDefault(type, MobCategory.NonLiving); - } - - public static Color GetBaseColor(MobCategory category) => category switch - { - MobCategory.Hostile => HostileColor, - MobCategory.Passive => PassiveColor, - MobCategory.Neutral => NeutralColor, - MobCategory.Player => PlayerColor, - _ => FadedGray, - }; - - public static Color ApplyDepthFade(Color baseColor, double playerY, double entityY) - { - double depth = playerY - entityY; - - if (depth <= 5.0) - return baseColor; - - if (depth >= 15.0) - return FadedGray; - - double t = (depth - 5.0) / 10.0; - return Lerp(baseColor, FadedGray, t); - } - - public static bool ShouldDisplay(MobCategory category, double playerY, double entityY) - { - if (category == MobCategory.Player) - return true; - if (entityY >= playerY) - return true; - return playerY - entityY <= 15.0; - } - - public static int GetPriority(MobCategory category) => category switch - { - MobCategory.Hostile => 4, - MobCategory.Player => 3, - MobCategory.Neutral => 2, - MobCategory.Passive => 1, - _ => 0, - }; - - public static string GetCategoryLabel(MobCategory category) => category switch - { - MobCategory.Hostile => Translations.tui_minimap_legend_hostile, - MobCategory.Passive => Translations.tui_minimap_legend_passive, - MobCategory.Neutral => Translations.tui_minimap_legend_neutral, - MobCategory.Player => Translations.tui_minimap_legend_player, - _ => "?", - }; - - private static Color Lerp(Color a, Color b, double t) - { - byte r = (byte)(a.R + (b.R - a.R) * t); - byte g = (byte)(a.G + (b.G - a.G) * t); - byte bl = (byte)(a.B + (b.B - a.B) * t); - return Color.FromRgb(r, g, bl); - } - } -} diff --git a/MinecraftClient/Tui/ServerStatusPanelBuilder.cs b/MinecraftClient/Tui/ServerStatusPanelBuilder.cs deleted file mode 100644 index bff8fe7c9c..0000000000 --- a/MinecraftClient/Tui/ServerStatusPanelBuilder.cs +++ /dev/null @@ -1,196 +0,0 @@ -using System; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Controls.Documents; -using Avalonia.Layout; -using Avalonia.Media; - -namespace MinecraftClient.Tui -{ - internal static class ServerStatusPanelBuilder - { - private const int MaxSamplePlayers = 10; - private const int FaviconDisplaySize = 16; - - internal static Border Build(Protocol.ServerStatusInfo info) - { - var contentPanel = new DockPanel { Background = Brushes.Black }; - - if (info.FaviconBase64 is not null) - { - var iconGrid = BuildFaviconGrid(info.FaviconBase64, FaviconDisplaySize); - iconGrid.VerticalAlignment = VerticalAlignment.Center; - DockPanel.SetDock(iconGrid, Dock.Left); - contentPanel.Children.Add(iconGrid); - } - - var infoPanel = new StackPanel - { - Orientation = Orientation.Vertical, - Margin = new Thickness(1, 0, 0, 0), - VerticalAlignment = VerticalAlignment.Center, - }; - - AddMotd(infoPanel, info); - AddAddress(infoPanel, info); - AddVersion(infoPanel, info); - AddConnectingAs(infoPanel, info); - AddPing(infoPanel, info); - AddPlayers(infoPanel, info); - AddSamplePlayers(infoPanel, info); - - contentPanel.Children.Add(infoPanel); - - return new Border - { - BorderBrush = new SolidColorBrush(Color.FromRgb(80, 80, 80)), - BorderThickness = new Thickness(1), - Background = new SolidColorBrush(Color.FromArgb(240, 20, 20, 20)), - Padding = new Thickness(1, 0), - Child = contentPanel, - Margin = new Thickness(0), - }; - } - - private static void AddMotd(StackPanel panel, Protocol.ServerStatusInfo info) - { - if (string.IsNullOrEmpty(info.MotdRaw)) - return; - - try - { - string motdFormatted = Protocol.Message.ChatParser.ParseText(info.MotdRaw); - foreach (string line in motdFormatted.Split('\n')) - panel.Children.Add(McColorParser.CreateColoredTextBlock(line, TextWrapping.NoWrap)); - } - catch - { - panel.Children.Add(new TextBlock - { - Text = info.MotdRaw, - Foreground = Brushes.White, - TextWrapping = TextWrapping.NoWrap, - }); - } - } - - private static void AddAddress(StackPanel panel, Protocol.ServerStatusInfo info) - { - var row = new TextBlock(); - row.Inlines!.Add(Label(Translations.mcc_server_info_label_server)); - row.Inlines.Add(Value(info.Host, McColors.Aqua)); - row.Inlines.Add(new Run($":{info.Port}") { Foreground = McColors.Gray }); - panel.Children.Add(row); - } - - private static void AddVersion(StackPanel panel, Protocol.ServerStatusInfo info) - { - string versionClean = Scripting.ChatBot.GetVerbatim(info.VersionName); - var row = new TextBlock(); - row.Inlines!.Add(Label(Translations.mcc_server_info_label_version)); - row.Inlines.Add(Value(versionClean, McColors.Aqua)); - row.Inlines.Add(new Run(" (") { Foreground = McColors.Gray }); - row.Inlines.Add(new Run(string.Format(Translations.mcc_server_info_label_protocol, info.ProtocolVersion)) - { Foreground = McColors.Gray }); - row.Inlines.Add(new Run(")") { Foreground = McColors.Gray }); - panel.Children.Add(row); - } - - private static void AddConnectingAs(StackPanel panel, Protocol.ServerStatusInfo info) - { - if (info.ResolvedProtocol == 0) - return; - - string resolvedMcVer = Protocol.ProtocolHandler.ProtocolVersion2MCVer(info.ResolvedProtocol); - var row = new TextBlock(); - row.Inlines!.Add(Label(Translations.mcc_server_info_label_connecting_as)); - row.Inlines.Add(Value(resolvedMcVer, McColors.Green)); - row.Inlines.Add(new Run(" (") { Foreground = McColors.Gray }); - row.Inlines.Add(new Run(string.Format(Translations.mcc_server_info_label_protocol, info.ResolvedProtocol)) - { Foreground = McColors.Gray }); - row.Inlines.Add(new Run(")") { Foreground = McColors.Gray }); - panel.Children.Add(row); - } - - private static void AddPing(StackPanel panel, Protocol.ServerStatusInfo info) - { - if (info.PingMs < 0) - return; - - var pingColor = info.PingMs < 100 - ? McColors.Green - : info.PingMs < 300 - ? McColors.Yellow - : McColors.Red; - - var row = new TextBlock(); - row.Inlines!.Add(Label(Translations.mcc_server_info_label_ping)); - row.Inlines.Add(new Run(string.Format(Translations.mcc_server_info_label_ping_ms, info.PingMs)) - { Foreground = pingColor }); - panel.Children.Add(row); - } - - private static void AddPlayers(StackPanel panel, Protocol.ServerStatusInfo info) - { - var row = new TextBlock(); - row.Inlines!.Add(Label(Translations.mcc_server_info_label_players)); - row.Inlines.Add(Value($"{info.OnlinePlayers}", McColors.Green)); - row.Inlines.Add(new Run("/") { Foreground = McColors.Gray }); - row.Inlines.Add(Value($"{info.MaxPlayers}", McColors.Red)); - panel.Children.Add(row); - } - - private static void AddSamplePlayers(StackPanel panel, Protocol.ServerStatusInfo info) - { - if (info.SamplePlayers.Count == 0) - return; - - panel.Children.Add(new TextBlock - { - Text = Translations.mcc_server_info_label_online, - Foreground = McColors.Gray, - }); - - int shown = Math.Min(info.SamplePlayers.Count, MaxSamplePlayers); - for (int i = 0; i < shown; i++) - { - string name = info.SamplePlayers[i].Name; - if (name.Contains('\u00a7')) - panel.Children.Add(McColorParser.CreateColoredTextBlock($" {name}", TextWrapping.NoWrap)); - else - panel.Children.Add(new TextBlock - { - Text = $" {name}", - Foreground = McColors.Green, - }); - } - - if (info.SamplePlayers.Count > shown) - { - panel.Children.Add(new TextBlock - { - Text = $" {string.Format(Translations.mcc_server_info_sample_more, info.SamplePlayers.Count - shown)}", - Foreground = McColors.Gray, - }); - } - } - - private static Run Label(string text) => - new(text + " ") { Foreground = McColors.Gray }; - - private static Run Value(string text, IBrush color) => - new(text) { Foreground = color }; - - private static Grid BuildFaviconGrid(string base64Png, int displaySize) => - IconGridBuilder.BuildFromBase64(base64Png, displaySize); - - private static class McColors - { - public static readonly IBrush Gray = new SolidColorBrush(Color.FromRgb(170, 170, 170)); - public static readonly IBrush Aqua = new SolidColorBrush(Color.FromRgb(85, 255, 255)); - public static readonly IBrush Green = new SolidColorBrush(Color.FromRgb(85, 255, 85)); - public static readonly IBrush Red = new SolidColorBrush(Color.FromRgb(255, 85, 85)); - public static readonly IBrush Yellow = new SolidColorBrush(Color.FromRgb(255, 255, 85)); - } - } -} diff --git a/MinecraftClient/Tui/SlotViewModel.cs b/MinecraftClient/Tui/SlotViewModel.cs deleted file mode 100644 index 2a8f6bdafa..0000000000 --- a/MinecraftClient/Tui/SlotViewModel.cs +++ /dev/null @@ -1,157 +0,0 @@ -using System.ComponentModel; -using System.Runtime.CompilerServices; -using MinecraftClient.Inventory; - -namespace MinecraftClient.Tui -{ - public class SlotViewModel : INotifyPropertyChanged - { - private bool _isSelected; - private bool _isHovered; - - public int SlotId { get; } - public string ItemDisplayText { get; private set; } - public string CountDisplay { get; private set; } - public string FullInfo { get; private set; } - public string ItemTypeName { get; private set; } - public bool IsEmpty { get; private set; } - public bool IsHotbar { get; } - public int HotbarIndex { get; } - public ItemType ItemType { get; private set; } - public int ItemCount { get; private set; } - public Item? RawItem { get; private set; } - public int NameMaxWidth { get; set; } = 9; - public int NameMaxLines { get; set; } = 1; - - public bool IsSelected - { - get => _isSelected; - set { _isSelected = value; OnPropertyChanged(); } - } - - public bool IsHovered - { - get => _isHovered; - set { _isHovered = value; OnPropertyChanged(); } - } - - public SlotViewModel(int slotId, bool isHotbar = false, int hotbarIndex = -1) - { - SlotId = slotId; - IsHotbar = isHotbar; - HotbarIndex = hotbarIndex; - ItemDisplayText = ""; - CountDisplay = ""; - FullInfo = ""; - ItemTypeName = ""; - IsEmpty = true; - ItemType = ItemType.Air; - ItemCount = 0; - } - - public void Update(Item? item) - { - RawItem = item; - if (item == null || item.IsEmpty) - { - ItemDisplayText = ""; - CountDisplay = ""; - FullInfo = ""; - ItemTypeName = ""; - IsEmpty = true; - ItemType = ItemType.Air; - ItemCount = 0; - } - else - { - ItemType = item.Type; - ItemCount = item.Count; - string typeName = item.GetTypeString(); - ItemTypeName = typeName; - ItemDisplayText = FormatMultiLine(typeName, NameMaxWidth, NameMaxLines); - CountDisplay = item.Count > 1 ? $"x{item.Count}" : ""; - FullInfo = item.ToFullString(); - IsEmpty = false; - } - - OnPropertyChanged(nameof(ItemDisplayText)); - OnPropertyChanged(nameof(CountDisplay)); - OnPropertyChanged(nameof(FullInfo)); - OnPropertyChanged(nameof(IsEmpty)); - OnPropertyChanged(nameof(ItemType)); - OnPropertyChanged(nameof(ItemTypeName)); - OnPropertyChanged(nameof(ItemCount)); - } - - /// - /// Format item name into multi-line display text that fits within - /// maxWidth columns and maxLines lines. Breaks at word boundaries. - /// - private static string FormatMultiLine(string name, int maxWidth, int maxLines) - { - if (string.IsNullOrEmpty(name)) - return ""; - - int colonIdx = name.LastIndexOf(':'); - if (colonIdx >= 0 && colonIdx < name.Length - 1) - name = name[(colonIdx + 1)..]; - - name = name.Replace("_", " ").Trim(); - name = InsertCamelCaseSpaces(name); - - if (maxLines <= 1 || name.Length <= maxWidth) - return name.Length <= maxWidth ? name : name[..maxWidth]; - - var lines = new System.Collections.Generic.List(); - string remaining = name; - - for (int line = 0; line < maxLines && remaining.Length > 0; line++) - { - if (remaining.Length <= maxWidth) - { - lines.Add(remaining); - break; - } - - int breakAt = -1; - for (int i = maxWidth; i >= 1; i--) - { - if (remaining[i] == ' ') - { - breakAt = i; - break; - } - } - - if (breakAt < 0) - breakAt = maxWidth; - - lines.Add(remaining[..breakAt].TrimEnd()); - remaining = remaining[breakAt..].TrimStart(); - } - - return string.Join("\n", lines); - } - - private static string InsertCamelCaseSpaces(string s) - { - if (s.Length < 2) return s; - var sb = new System.Text.StringBuilder(s.Length + 4); - sb.Append(s[0]); - for (int i = 1; i < s.Length; i++) - { - if (char.IsUpper(s[i]) && char.IsLower(s[i - 1])) - sb.Append(' '); - sb.Append(s[i]); - } - return sb.ToString(); - } - - public event PropertyChangedEventHandler? PropertyChanged; - - private void OnPropertyChanged([CallerMemberName] string? name = null) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); - } - } -} diff --git a/MinecraftClient/Tui/TabListOverlay.cs b/MinecraftClient/Tui/TabListOverlay.cs deleted file mode 100644 index 6e4c5c2963..0000000000 --- a/MinecraftClient/Tui/TabListOverlay.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Controls.Primitives; -using Avalonia.Input; -using Avalonia.Interactivity; -using Avalonia.Layout; -using Avalonia.Media; -using Avalonia.Threading; - -namespace MinecraftClient.Tui -{ - internal sealed class TabListOverlay : Border - { - private readonly McClient _handler; - private readonly ScrollViewer _scrollViewer; - private readonly DispatcherTimer _refreshTimer; - - public TabListOverlay(McClient handler) - { - ArgumentNullException.ThrowIfNull(handler); - _handler = handler; - - BorderBrush = Brushes.White; - BorderThickness = new Thickness(1); - Background = Brushes.Black; - Padding = new Thickness(1); - HorizontalAlignment = HorizontalAlignment.Stretch; - VerticalAlignment = VerticalAlignment.Stretch; - Focusable = true; - - _scrollViewer = new ScrollViewer - { - HorizontalScrollBarVisibility = ScrollBarVisibility.Auto, - VerticalScrollBarVisibility = ScrollBarVisibility.Auto, - Focusable = true, - }; - - Child = _scrollViewer; - - _refreshTimer = new DispatcherTimer(TimeSpan.FromMilliseconds(500), DispatcherPriority.Background, static (_, _) => { }) - { - IsEnabled = false - }; - _refreshTimer.Tick += (_, _) => Refresh(); - - AttachedToVisualTree += (_, _) => - { - AddHandler(KeyDownEvent, OnTunnelKeyDown, RoutingStrategies.Tunnel); - Refresh(); - _refreshTimer.Start(); - Focus(); - Dispatcher.UIThread.Post(() => _scrollViewer.Focus(), DispatcherPriority.Input); - }; - - DetachedFromVisualTree += (_, _) => - { - RemoveHandler(KeyDownEvent, OnTunnelKeyDown); - _refreshTimer.Stop(); - }; - } - - private void OnTunnelKeyDown(object? sender, KeyEventArgs e) - { - if (e.Key != Key.Escape) - return; - - TuiConsoleBackend.Instance?.DismissOverlay(); - e.Handled = true; - } - - protected override void OnKeyDown(KeyEventArgs e) - { - if (e.Key == Key.Escape) - { - TuiConsoleBackend.Instance?.DismissOverlay(); - e.Handled = true; - return; - } - - base.OnKeyDown(e); - } - - private void Refresh() - { - string text = TabListFormatter.Render(_handler.GetTabListSnapshot(), includeOverlayHint: true); - var block = McColorParser.CreateColoredTextBlock(text, TextWrapping.NoWrap); - block.Margin = new Thickness(0); - _scrollViewer.Content = block; - } - } -} diff --git a/MinecraftClient/Tui/TuiConsoleBackend.cs b/MinecraftClient/Tui/TuiConsoleBackend.cs deleted file mode 100644 index 9579cd2306..0000000000 --- a/MinecraftClient/Tui/TuiConsoleBackend.cs +++ /dev/null @@ -1,326 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Diagnostics; -using System.Runtime.InteropServices; -using System.Threading; -using Avalonia; -using Avalonia.Threading; -using Consolonia; - -namespace MinecraftClient.Tui -{ - /// - /// Console backend that uses Avalonia/Consolonia for a full-screen TUI. - /// Avalonia Dispatcher runs on the main thread; MCC logic runs on background threads. - /// - public class TuiConsoleBackend : IConsoleBackend - { - public event EventHandler? MessageReceived; - public event EventHandler? OnInputChange; - - private MainTuiView? _view; - - public bool DisplayUserInput { get; set; } = true; - - internal static TuiConsoleBackend? Instance { get; private set; } - - private Program.StartupState? _pendingStartupState; - private readonly ManualResetEventSlim _viewReady = new(false); - - /// - /// Initializes the Avalonia app and starts the main UI loop. - /// This blocks the calling thread until the TUI exits. - /// Before blocking, it starts MCC's remaining initialization on a background thread. - /// - internal void RunTuiMainLoop(string[] args, Program.StartupState startupState) - { - Instance = this; - _pendingStartupState = startupState; - - AppDomain.CurrentDomain.ProcessExit += (_, _) => RestoreTerminalState(); - - System.Console.CancelKeyPress += (_, e) => - { - e.Cancel = true; - var view = _view; - if (view != null) - Dispatcher.UIThread.Post(() => view.HandleCtrlC()); - }; - - new Thread(() => - { - _viewReady.Wait(); - ContinueMccStartup(args); - }) - { Name = "MCC-Main", IsBackground = true }.Start(); - - AppBuilder builder = AppBuilder.Configure() - .UseConsolonia() - .UseAutoDetectedConsole() - .LogToException(); - - try - { - builder.StartWithConsoleLifetime(Array.Empty()); - } - finally - { - RestoreTerminalState(); - } - } - - private static volatile bool _terminalRestored; - - private static void RestoreTerminalState() - { - if (_terminalRestored) return; - _terminalRestored = true; - - try - { - System.Console.Write("\x1b[?1000l"); // disable X11 mouse - System.Console.Write("\x1b[?1001l"); // disable highlight mouse - System.Console.Write("\x1b[?1002l"); // disable button-event mouse - System.Console.Write("\x1b[?1003l"); // disable any-event mouse - System.Console.Write("\x1b[?1004l"); // disable focus events - System.Console.Write("\x1b[?1005l"); // disable UTF-8 mouse encoding - System.Console.Write("\x1b[?1006l"); // disable SGR mouse encoding - System.Console.Write("\x1b[?1015l"); // disable urxvt mouse encoding - System.Console.Write("\x1b[?1049l"); // leave alternate screen - System.Console.Write("\x1b[?25h"); // show cursor - System.Console.Write("\x1b[?7h"); // re-enable line wrap - System.Console.Write("\x1b[0m"); // reset attributes - System.Console.Write("\x1b[2J"); // clear entire screen - System.Console.Write("\x1b[H"); // cursor to home - System.Console.Out.Flush(); - } - catch { } - - if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - try - { - using var proc = Process.Start(new ProcessStartInfo - { - FileName = "stty", - Arguments = "sane", - UseShellExecute = false, - }); - proc?.WaitForExit(500); - } - catch { } - } - } - - private static void ContinueMccStartup(string[] args) - { - try - { - var instance = Instance; - if (instance?._pendingStartupState is { } state) - { - instance._pendingStartupState = null; - if (!Program.ProcessStartupState(state)) - return; - } - - Program.RunStartupSequence(args); - } - catch (Exception ex) - { - ConsoleIO.WriteLineFormatted($"§c[MCC] Fatal: {ex.Message}"); - } - } - - internal void SetView(MainTuiView view) - { - _view = view; - _viewReady.Set(); - } - - internal MainTuiView? GetView() => _view; - - public void Init() - { - } - - public void WriteLine(string text) - { - var view = _view; - if (view == null) - { - System.Console.WriteLine(text); - return; - } - - if (Dispatcher.UIThread.CheckAccess()) - view.AppendLogLine(text); - else - Dispatcher.UIThread.Post(() => view.AppendLogLine(text)); - } - - public void WriteLineFormatted(string text) - { - var view = _view; - if (view == null) - { - System.Console.WriteLine(Scripting.ChatBot.GetVerbatim(text)); - return; - } - - if (Dispatcher.UIThread.CheckAccess()) - view.AppendFormattedLogLine(text); - else - Dispatcher.UIThread.Post(() => view.AppendFormattedLogLine(text)); - } - - public void BeginReadThread() - { - } - - public void StopReadThread() - { - DismissOverlay(); - } - - /// - /// Close any open overlay (e.g. inventory) so the user can interact - /// with the main console again. Safe to call from any thread. - /// - internal void DismissOverlay() - { - var view = _view; - if (view == null) return; - - if (Dispatcher.UIThread.CheckAccess()) - { - view.HideOverlay(); - } - else - { - Dispatcher.UIThread.Post(() => view.HideOverlay()); - } - } - - public string RequestImmediateInput() - { - if (_shutdownRequested) - { - Thread.Sleep(Timeout.Infinite); - return string.Empty; - } - - var mre = new ManualResetEventSlim(false); - string? result = null; - - void Handler(object? sender, string e) - { - result = e; - mre.Set(); - } - - MessageReceived += Handler; - mre.Wait(); - MessageReceived -= Handler; - - return result ?? string.Empty; - } - - public string? ReadPassword() - { - return RequestImmediateInput(); - } - - public void ClearInputBuffer() - { - if (_view == null) return; - if (Dispatcher.UIThread.CheckAccess()) - _view.ClearInput(); - else - Dispatcher.UIThread.Post(() => _view?.ClearInput()); - } - - public void ClearScreen() - { - if (_view == null) return; - if (Dispatcher.UIThread.CheckAccess()) - _view.ClearLog(); - else - Dispatcher.UIThread.Post(() => _view?.ClearLog()); - } - - public void SetInputVisible(bool visible) - { - } - - public void SetBackreadBufferLimit(int limit) - { - } - - public void Shutdown() - { - _shutdownRequested = true; - RestoreTerminalState(); - - var lifetime = Application.Current?.ApplicationLifetime - as Avalonia.Controls.ApplicationLifetimes.IControlledApplicationLifetime; - - if (lifetime != null) - { - if (Dispatcher.UIThread.CheckAccess()) - lifetime.Shutdown(); - else - Dispatcher.UIThread.Post(() => lifetime.Shutdown()); - } - - new Thread(() => - { - Thread.Sleep(1000); - Environment.Exit(0); - }) - { Name = "TUI-Exit-Guard", IsBackground = true }.Start(); - } - - private volatile bool _shutdownRequested; - - /// - /// Called from the TUI view when user presses Enter in the command input. - /// Always fires MessageReceived so that both the normal read-thread path - /// and RequestImmediateInput (used by offline prompt) receive the input. - /// - internal void OnCommandSubmitted(string command) - { - MessageReceived?.Invoke(this, command); - } - - /// - /// Called from the TUI view when user types in the command input. - /// - internal void OnInputChanged(string text, int cursorPos) - { - OnInputChange?.Invoke(this, new ConsoleInputBuffer(text, cursorPos)); - } - - internal void UpdateSuggestions(CommandSuggestion[] suggestions, (int Start, int End) range) - { - var view = _view; - if (view == null) return; - - if (Dispatcher.UIThread.CheckAccess()) - view.UpdateSuggestions(suggestions, range); - else - Dispatcher.UIThread.Post(() => view.UpdateSuggestions(suggestions, range)); - } - - internal void ClearSuggestions() - { - var view = _view; - if (view == null) return; - - if (Dispatcher.UIThread.CheckAccess()) - view.ClearSuggestions(); - else - Dispatcher.UIThread.Post(() => view.ClearSuggestions()); - } - } -} diff --git a/MinecraftClient/Tui/TuiTooltipService.cs b/MinecraftClient/Tui/TuiTooltipService.cs deleted file mode 100644 index 0ae51607ef..0000000000 --- a/MinecraftClient/Tui/TuiTooltipService.cs +++ /dev/null @@ -1,114 +0,0 @@ -using System; -using System.Collections.Generic; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Media; - -namespace MinecraftClient.Tui -{ - public sealed class TuiTooltipLine - { - public string Text { get; init; } = ""; - public IBrush Foreground { get; init; } = Brushes.White; - } - - /// - /// Global tooltip that floats above all TUI content. - /// Owned by MainTuiView, used by minimap / chat / other components. - /// - public sealed class TuiTooltipService - { - private readonly Panel _rootPanel; - private readonly Canvas _canvas; - private readonly Border _border; - private readonly StackPanel _content; - - internal TuiTooltipService(Panel rootPanel) - { - _content = new StackPanel { Orientation = Avalonia.Layout.Orientation.Vertical }; - _border = new Border - { - Background = new SolidColorBrush(Color.FromArgb(230, 20, 20, 20)), - BorderBrush = new SolidColorBrush(Color.FromRgb(120, 120, 120)), - BorderThickness = new Thickness(1), - Padding = new Thickness(1), - Child = _content, - IsVisible = false, - }; - - _canvas = new Canvas - { - IsHitTestVisible = false, - Children = { _border }, - }; - - _rootPanel = rootPanel; - rootPanel.Children.Add(_canvas); - } - - /// Global X of the mouse cursor. - /// Global Y of the mouse cursor. - /// - /// If true, try placing tooltip to the right of mouseX; - /// if false, try placing to the left. - /// The service auto-flips when the tooltip would overflow the screen. - /// - public void Show(double mouseX, double mouseY, IReadOnlyList lines, - bool preferRight = true) - { - _content.Children.Clear(); - - if (lines.Count == 0) - { - _border.IsVisible = false; - return; - } - - int maxChars = 0; - foreach (var line in lines) - { - _content.Children.Add(new TextBlock - { - Text = line.Text, - Foreground = line.Foreground, - TextWrapping = TextWrapping.Wrap, - Padding = new Thickness(0), - Margin = new Thickness(0), - FontSize = 1, - }); - if (line.Text.Length > maxChars) - maxChars = line.Text.Length; - } - - double tipW = maxChars + 4; - double screenW = _rootPanel.Bounds.Width; - - const double gap = 1; - double gx; - if (preferRight) - { - gx = mouseX + gap; - if (gx + tipW > screenW) - gx = mouseX - tipW - gap; - } - else - { - gx = mouseX - tipW - gap; - if (gx < 0) - gx = mouseX + gap; - } - - Canvas.SetLeft(_border, Math.Max(0, gx)); - Canvas.SetTop(_border, Math.Max(0, mouseY)); - _border.IsVisible = true; - } - - public void Hide() - { - _border.IsVisible = false; - _content.Children.Clear(); - } - - public bool IsVisible => _border.IsVisible; - } -} diff --git a/MinecraftClient/UpgradeHelper.cs b/MinecraftClient/UpgradeHelper.cs deleted file mode 100644 index cd08a1a73d..0000000000 --- a/MinecraftClient/UpgradeHelper.cs +++ /dev/null @@ -1,360 +0,0 @@ -using System; -using System.IO; -using System.IO.Compression; -using System.Net; -using System.Net.Http; -using System.Net.Http.Handlers; -using System.Runtime.InteropServices; -using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; - -namespace MinecraftClient -{ - internal static class UpgradeHelper - { - private const string GithubReleaseUrl = "https://github.com/MCCTeam/Minecraft-Console-Client/releases"; - - private static int running = 0; // Type: bool; 1 for running; 0 for stopped; - private static CancellationTokenSource cancellationTokenSource = new(); - private static CancellationToken cancellationToken = CancellationToken.None; - - private static long lastBytesTransferred = 0, minNotifyThreshold = 5 * 1024 * 1024; - private static DateTime downloadStartTime = DateTime.Now, lastNotifyTime = DateTime.Now; - private static TimeSpan minNotifyInterval = TimeSpan.FromMilliseconds(3000); - - public static void CheckUpdate(bool forceUpdate = false) - { - bool needPromptUpdate = true; - if (!forceUpdate && CompareVersionInfo(Settings.Config.Head.CurrentVersion, Settings.Config.Head.LatestVersion)) - { - needPromptUpdate = false; - ConsoleIO.WriteLineFormatted("§e" + string.Format(Translations.mcc_has_update, GithubReleaseUrl), true); - } - Task.Run(() => - { - DoCheckUpdate(CancellationToken.None); - if (needPromptUpdate) - { - if (CompareVersionInfo(Settings.Config.Head.CurrentVersion, Settings.Config.Head.LatestVersion)) - { - ConsoleIO.WriteLineFormatted("§e" + string.Format(Translations.mcc_has_update, GithubReleaseUrl), true); - } - else if (forceUpdate) - { - ConsoleIO.WriteLine(Translations.mcc_update_already_latest + ' ' + Translations.mcc_update_promote_force_cmd); - } - } - }); - } - - public static bool DownloadLatestBuild(bool forceUpdate, bool isCommandLine = false) - { - if (Interlocked.Exchange(ref running, 1) == 1) - { - return false; - } - else - { - if (!cancellationTokenSource.TryReset()) - cancellationTokenSource = new(); - cancellationToken = cancellationTokenSource.Token; - Task.Run(async () => - { - string OSInfo = GetOSIdentifier(); - if (Settings.Config.Logging.DebugMessages || string.IsNullOrEmpty(OSInfo)) - ConsoleIO.WriteLine(string.Format("OS: {0}, Arch: {1}, Framework: {2}", - RuntimeInformation.OSDescription, RuntimeInformation.ProcessArchitecture, RuntimeInformation.FrameworkDescription)); - if (string.IsNullOrEmpty(OSInfo)) - { - ConsoleIO.WriteLine(Translations.mcc_update_platform_not_support); - } - else - { - string latestVersion = DoCheckUpdate(cancellationToken); - if (cancellationToken.IsCancellationRequested) - { - } - else if (string.IsNullOrEmpty(latestVersion)) - { - ConsoleIO.WriteLine(Translations.mcc_update_check_fail); - } - else if (!forceUpdate && !CompareVersionInfo(Settings.Config.Head.CurrentVersion, Settings.Config.Head.LatestVersion)) - { - ConsoleIO.WriteLine(Translations.mcc_update_already_latest + ' ' + - (isCommandLine ? Translations.mcc_update_promote_force_cmd : Translations.mcc_update_promote_force)); - } - else - { - ConsoleIO.WriteLine(string.Format(Translations.mcc_update_exist_update, latestVersion, OSInfo)); - - HttpClientHandler httpClientHandler = new() { AllowAutoRedirect = true }; - AddProxySettings(httpClientHandler); - - ProgressMessageHandler progressMessageHandler = new(httpClientHandler); - progressMessageHandler.HttpReceiveProgress += (_, info) => - { - DateTime now = DateTime.Now; - if (now - lastNotifyTime > minNotifyInterval || info.BytesTransferred - lastBytesTransferred > minNotifyThreshold) - { - lastNotifyTime = now; - lastBytesTransferred = info.BytesTransferred; - if (info.TotalBytes.HasValue) - { - ConsoleIO.WriteLine(string.Format(Translations.mcc_update_progress, - (double)info.BytesTransferred / info.TotalBytes * 100.0, - (double)info.BytesTransferred / 1024 / 1024, - (double)info.TotalBytes / 1024 / 1024, - (double)info.BytesTransferred / 1024 / (now - downloadStartTime).TotalSeconds, - TimeSpan.FromMilliseconds( - (double)(info.TotalBytes - info.BytesTransferred) / (info.BytesTransferred / (now - downloadStartTime).TotalMilliseconds) - ).ToString("hh\\:mm\\:ss")) - ); - } - else - { - ConsoleIO.WriteLine(string.Format(Translations.mcc_update_progress_type2, - (double)info.BytesTransferred / 1024 / 1024, - (double)info.BytesTransferred / 1024 / (now - downloadStartTime).TotalSeconds) - ); - } - } - }; - - HttpClient httpClient = new(progressMessageHandler); - - try - { - string downloadUrl = $"{GithubReleaseUrl}/download/{latestVersion}/"; - string fileNameWithoutExtension = $"MinecraftClient-{latestVersion}-{OSInfo}"; - string fileName = fileNameWithoutExtension + GetExecutableFileExtension(); - downloadStartTime = DateTime.Now; - lastNotifyTime = DateTime.MinValue; - lastBytesTransferred = 0; - - bool hasFile = true; - HttpResponseMessage response = await httpClient.GetAsync(downloadUrl + fileName, HttpCompletionOption.ResponseHeadersRead, cancellationToken); - if (!response.IsSuccessStatusCode) - { - fileName = fileNameWithoutExtension + ".zip"; - response = await httpClient.GetAsync(downloadUrl + fileName, HttpCompletionOption.ResponseHeadersRead, cancellationToken); - if (!response.IsSuccessStatusCode) - { - hasFile = false; - ConsoleIO.WriteLine($"{Translations.mcc_update_download_fail} File {fileNameWithoutExtension}{GetExecutableFileExtension()} not found."); - } - } - - if (hasFile) - { - using (FileStream fileStream = File.Create(fileName)) - { - await response.Content.CopyToAsync(fileStream); - } - - ConsoleIO.WriteLineFormatted("§e" + string.Format(Translations.mcc_update_save_as, fileName), true); - - if (!OperatingSystem.IsWindows()) - File.SetUnixFileMode(fileName, UnixFileMode.UserRead - | UnixFileMode.UserWrite - | UnixFileMode.UserExecute - | UnixFileMode.GroupRead - | UnixFileMode.GroupExecute - | UnixFileMode.OtherRead - | UnixFileMode.OtherExecute); - } - - response.Dispose(); - } - catch (TaskCanceledException) { } - catch (Exception e) - { - ConsoleIO.WriteLine($"{Translations.mcc_update_download_fail}\n{e.GetType().Name}: {e.Message}\n{e.StackTrace}"); - } - - httpClient.Dispose(); - progressMessageHandler.Dispose(); - httpClientHandler.Dispose(); - } - } - Interlocked.Exchange(ref running, 0); - }, cancellationToken); - return true; - } - } - - public static void CancelDownloadUpdate() - { - if (!cancellationTokenSource.IsCancellationRequested) - cancellationTokenSource.Cancel(); - } - - public static void HandleBlockingUpdate(bool forceUpgrade) - { - minNotifyInterval = TimeSpan.FromMilliseconds(500); - DownloadLatestBuild(forceUpgrade, true); - while (running == 1) - Thread.Sleep(500); - } - - private static string DoCheckUpdate(CancellationToken cancellationToken) - { - string latestBuildInfo = string.Empty; - HttpClientHandler httpClientHandler = new() { AllowAutoRedirect = false }; - AddProxySettings(httpClientHandler); - HttpClient httpClient = new(httpClientHandler); - Task? httpWebRequest = null; - try - { - httpWebRequest = httpClient.GetAsync(GithubReleaseUrl + "/latest", HttpCompletionOption.ResponseHeadersRead, cancellationToken); - httpWebRequest.Wait(); - if (!cancellationToken.IsCancellationRequested) - { - HttpResponseMessage res = httpWebRequest.Result; - if (res.Headers.Location is not null) - { - Match match = Regex.Match(res.Headers.Location.ToString(), GithubReleaseUrl + @"/tag/(\d{4})(\d{2})(\d{2})-(\d+)"); - if (match.Success && match.Groups.Count == 5) - { - string year = match.Groups[1].Value, month = match.Groups[2].Value, day = match.Groups[3].Value, run = match.Groups[4].Value; - string latestVersion = string.Format("GitHub build {0}, built on {1}-{2}-{3}", run, year, month, day); - latestBuildInfo = string.Format("{0}{1}{2}-{3}", year, month, day, run); - if (latestVersion != Settings.Config.Head.LatestVersion) - { - Settings.Config.Head.LatestVersion = latestVersion; - Program.WriteBackSettings(false); - } - } - } - res.Dispose(); - } - httpWebRequest.Dispose(); - } - catch (Exception) { } - finally { httpWebRequest?.Dispose(); } - httpClient.Dispose(); - httpClientHandler.Dispose(); - return latestBuildInfo; - } - - private static string GetOSIdentifier() - { - string OSPlatformName; - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - OSPlatformName = "win"; - else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - OSPlatformName = "linux"; - else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - OSPlatformName = "osx"; - else if (RuntimeInformation.IsOSPlatform(OSPlatform.FreeBSD)) - OSPlatformName = "freebsd"; - else - return string.Empty; - - string architecture = RuntimeInformation.ProcessArchitecture switch - { - Architecture.X86 => "x86", - Architecture.X64 => "x64", - Architecture.Arm => "arm32", - Architecture.Arm64 => "arm64", - Architecture.Wasm => "wasm", - Architecture.S390x => "s390x", - Architecture.LoongArch64 => "loongarch64", - Architecture.Armv6 => "armv6", - Architecture.Ppc64le => "ppc64le", - _ => RuntimeInformation.ProcessArchitecture.ToString(), - }; - - return OSPlatformName + '-' + architecture; - } - - private static string GetExecutableFileExtension() - { - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - return ".exe"; - else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - return string.Empty; - else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - return string.Empty; - else if (RuntimeInformation.IsOSPlatform(OSPlatform.FreeBSD)) - return string.Empty; - else - return string.Empty; - } - - private static bool CompareVersionInfo(string? current, string? latest) - { - if (current is null || latest is null) - return false; - Regex reg = new(@"\w+\sbuild\s(\d+),\sbuilt\son\s(\d{4})[-\/\.\s]?(\d{2})[-\/\.\s]?(\d{2}).*"); - Regex reg2 = new(@"\w+\sbuild\s(\d+),\sbuilt\son\s\w+\s(\d{2})[-\/\.\s]?(\d{2})[-\/\.\s]?(\d{4}).*"); - - DateTime? curTime = null, latestTime = null; - - Match curMatch = reg.Match(current); - if (curMatch.Success && curMatch.Groups.Count == 5) - { - try { curTime = new(int.Parse(curMatch.Groups[2].Value), int.Parse(curMatch.Groups[3].Value), int.Parse(curMatch.Groups[4].Value)); } - catch { curTime = null; } - } - if (curTime is null) - { - curMatch = reg2.Match(current); - try { curTime = new(int.Parse(curMatch.Groups[4].Value), int.Parse(curMatch.Groups[3].Value), int.Parse(curMatch.Groups[2].Value)); } - catch { curTime = null; } - } - if (curTime is null) - return false; - - Match latestMatch = reg.Match(latest); - if (latestMatch.Success && latestMatch.Groups.Count == 5) - { - try { latestTime = new(int.Parse(latestMatch.Groups[2].Value), int.Parse(latestMatch.Groups[3].Value), int.Parse(latestMatch.Groups[4].Value)); } - catch { latestTime = null; } - } - if (latestTime is null) - { - latestMatch = reg2.Match(latest); - try { latestTime = new(int.Parse(latestMatch.Groups[4].Value), int.Parse(latestMatch.Groups[3].Value), int.Parse(latestMatch.Groups[2].Value)); } - catch { latestTime = null; } - } - if (latestTime is null) - return false; - - int curBuildId, latestBuildId; - try - { - curBuildId = int.Parse(curMatch.Groups[1].Value); - latestBuildId = int.Parse(latestMatch.Groups[1].Value); - } - catch { return false; } - - if (latestTime > curTime) - return true; - else if (latestTime >= curTime && latestBuildId > curBuildId) - return true; - else - return false; - } - - private static void AddProxySettings(HttpClientHandler httpClientHandler) - { - if (Settings.Config.Proxy.Enabled_Update) - { - string proxyAddress; - if (!string.IsNullOrWhiteSpace(Settings.Config.Proxy.Username) && !string.IsNullOrWhiteSpace(Settings.Config.Proxy.Password)) - proxyAddress = string.Format("{0}://{3}:{4}@{1}:{2}", - Settings.Config.Proxy.Proxy_Type.ToString().ToLower(), - Settings.Config.Proxy.Server.Host, - Settings.Config.Proxy.Server.Port, - Settings.Config.Proxy.Username, - Settings.Config.Proxy.Password); - else - proxyAddress = string.Format("{0}://{1}:{2}", - Settings.Config.Proxy.Proxy_Type.ToString().ToLower(), - Settings.Config.Proxy.Server.Host, Settings.Config.Proxy.Server.Port); - httpClientHandler.Proxy = new WebProxy(proxyAddress, true); - } - } - } -} diff --git a/MinecraftClient/WinAPI/ConsoleIcon.cs b/MinecraftClient/WinAPI/ConsoleIcon.cs deleted file mode 100644 index cc243dda60..0000000000 --- a/MinecraftClient/WinAPI/ConsoleIcon.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System; -using System.Drawing; -using System.IO; -using System.Net.Http; -using System.Runtime.InteropServices; -using System.Runtime.Versioning; -using System.Threading; -using System.Threading.Tasks; - -namespace MinecraftClient.WinAPI -{ - /// - /// Allow to set the player skin as console icon, on Windows only. - /// See StackOverflow no. 2986853 - /// - [SupportedOSPlatform("windows")] - public static class ConsoleIcon - { - [DllImport("kernel32.dll", SetLastError = true)] - private static extern bool SetConsoleIcon(IntPtr hIcon); - - [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)] - private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, IntPtr lParam); - - /// - /// An application sends the WM_SETICON message to associate a new large or small icon with a window. - /// The system displays the large icon in the ALT+TAB dialog box, and the small icon in the window caption. - /// - public enum WinMessages : uint - { - SETICON = 0x0080, - } - - private static void SetWindowIcon(System.Drawing.Icon icon) - { - IntPtr mwHandle = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle; - SendMessage(mwHandle, (int)WinMessages.SETICON, 0, icon.Handle); - SendMessage(mwHandle, (int)WinMessages.SETICON, 1, icon.Handle); - } - - /// - /// Asynchronously download the player's skin and set the head as console icon - /// - public static void SetPlayerIconAsync(string playerName) - { - Thread t = new(new ThreadStart(delegate - { - HttpClient httpClient = new(); - try - { - Task httpWebRequest = httpClient.GetStreamAsync("https://minotar.net/helm/" + playerName + "/100.png"); - httpWebRequest.Wait(); - Stream imageStream = httpWebRequest.Result; - try - { - Bitmap skin = new(Image.FromStream(imageStream)); //Read skin from network - SetWindowIcon(Icon.FromHandle(skin.GetHicon())); // Windows 10+ (New console) - SetConsoleIcon(skin.GetHicon()); // Windows 8 and lower (Older console) - } - catch (ArgumentException) - { - /* Invalid image in HTTP response */ - } - imageStream.Dispose(); - httpWebRequest.Dispose(); - } - catch (AggregateException ae) - { - bool needRevert = false; - foreach (var ex in ae.InnerExceptions) - { - if (ex is HttpRequestException || ex is TaskCanceledException) //Skin not found? Reset to default icon - needRevert = true; - } - if (needRevert) - RevertToMCCIcon(); - } - catch (HttpRequestException) //Skin not found? Reset to default icon - { - RevertToMCCIcon(); - } - finally - { - httpClient.Dispose(); - } - } - )) - { - Name = "Player skin icon setter" - }; - t.Start(); - } - - /// - /// Set the icon back to the default MCC icon - /// - public static void RevertToMCCIcon() - { - try - { - Icon defaultIcon = Icon.ExtractAssociatedIcon(Environment.ProcessPath!)!; - SetWindowIcon(Icon.FromHandle(defaultIcon.Handle)); // Windows 10+ (New console) - SetConsoleIcon(defaultIcon.Handle); // Windows 8 and lower (Older console) - } - catch { } - } - } -} diff --git a/MinecraftClient/WinAPI/ExitCleanUp.cs b/MinecraftClient/WinAPI/ExitCleanUp.cs deleted file mode 100644 index 98f93fe1cb..0000000000 --- a/MinecraftClient/WinAPI/ExitCleanUp.cs +++ /dev/null @@ -1,96 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; - -namespace MinecraftClient.WinAPI -{ - /// - /// Perform clean up before quitting application - /// - /// - /// Only ctrl+c/ctrl+break will be captured when running on mono - /// - public static class ExitCleanUp - { - /// - /// Store codes to run before quitting - /// - private static readonly List actions = new(); - - static ExitCleanUp() - { - try - { - // Capture all close event - _handler += CleanUp; - // Use delegate directly cause program to crash - SetConsoleCtrlHandler(_handler, true); - } - catch (DllNotFoundException) - { - // Probably on mono, fallback to ctrl+c only - static void value(object sender, ConsoleCancelEventArgs e) - { - RunCleanUp(); - } - - Console.CancelKeyPress += value!; - } - } - - /// - /// Add a new action to be performed before application exit - /// - /// Action to run - public static void Add(Action cleanUpCode) - { - actions.Add(cleanUpCode); - } - - /// - /// Run all actions - /// - /// - /// For .Net native - /// - private static void RunCleanUp() - { - foreach (Action action in actions) - { - action(); - } - } - - /// - /// Run all actions - /// - /// - /// - /// - /// For win32 API - /// - private static bool CleanUp(CtrlType sig) - { - foreach (Action action in actions) - { - action(); - } - return false; - } - - [DllImport("Kernel32")] - private static extern bool SetConsoleCtrlHandler(EventHandler handler, bool add); - - private delegate bool EventHandler(CtrlType sig); - static EventHandler? _handler; - - enum CtrlType - { - CTRL_C_EVENT = 0, - CTRL_BREAK_EVENT = 1, - CTRL_CLOSE_EVENT = 2, - CTRL_LOGOFF_EVENT = 5, - CTRL_SHUTDOWN_EVENT = 6 - } - } -} diff --git a/MinecraftClient/config/ChatBots/AutoLeaveOnLowHp.cs b/MinecraftClient/config/ChatBots/AutoLeaveOnLowHp.cs deleted file mode 100644 index 1e5dfacc32..0000000000 --- a/MinecraftClient/config/ChatBots/AutoLeaveOnLowHp.cs +++ /dev/null @@ -1,22 +0,0 @@ -//MCCScript 1.0 - -MCC.LoadBot(new AutoLeaveOnLowHp()); - -//MCCScript Extensions - -namespace MinecraftClient.ChatBots -{ - public class AutoLeaveOnLowHp : ChatBot - { - private float HEALTH_BOUNDARY = 10.0f; // 10 HP - - public override void OnHealthUpdate(float health, int food) - { - if (health <= HEALTH_BOUNDARY) - { - LogToConsole("Leaving because of low HP (Reconnecting in 5 minutes)!"); - ReconnectToTheServer(-1, 300); // Disconnect and reconnect after 5 minutes (300 seconds) - } - } - } -} diff --git a/MinecraftClient/config/ChatBots/AutoLook.cs b/MinecraftClient/config/ChatBots/AutoLook.cs deleted file mode 100644 index d182edb1c4..0000000000 --- a/MinecraftClient/config/ChatBots/AutoLook.cs +++ /dev/null @@ -1,64 +0,0 @@ -//MCCScript 1.0 - -MCC.LoadBot(new AutoLook()); - -//MCCScript Extensions - -public class AutoLook : ChatBot -{ - private Entity _entityToLookAt; - public override void Initialize() - { - if (GetEntityHandlingEnabled() && GetTerrainEnabled()) return; - LogToConsole("Entity Handling or Terrain Handling is not enabled in the config file!"); - LogToConsole("This bot will be unloaded."); - UnloadBot(); - } - - public override void OnEntityDespawn(Entity entity) - { - if (entity == _entityToLookAt) - { - _entityToLookAt = null; - } - } - public override void OnEntitySpawn(Entity entity) - { - HandleEntity(entity); - } - public override void OnEntityMove(Entity entity) - { - var tempBool = HandleEntity(entity); - //LogDebugToConsole(tempBool); - if (!tempBool) return; - LookAtLocation(entity.Location); - } - - /// - /// Handles an entity, and tracks it if it is closer then the one we are currently tracking - /// - /// True if found - private bool HandleEntity(Entity entity) - { - if (entity.Type != EntityType.Player) - { - return false; - } - if (_entityToLookAt == null) - { - _entityToLookAt = entity; - return true; - } - if (GetCurrentLocation().Distance(entity.Location) < GetCurrentLocation().Distance(_entityToLookAt.Location)) - { - _entityToLookAt = entity; - return true; - } - - if (entity.ID != _entityToLookAt.ID) return false; - _entityToLookAt = entity; //Handle looking at the same entity - return true; - - } - -} \ No newline at end of file diff --git a/MinecraftClient/config/ChatBots/AutoTree.cs b/MinecraftClient/config/ChatBots/AutoTree.cs deleted file mode 100644 index 21d731b77d..0000000000 --- a/MinecraftClient/config/ChatBots/AutoTree.cs +++ /dev/null @@ -1,201 +0,0 @@ -//MCCScript 1.0 -//using Brigadier.NET; -//using Brigadier.NET.Builder; -//using MinecraftClient; -//using MinecraftClient.CommandHandler; -//using MinecraftClient.CommandHandler.Patch; -//using MinecraftClient.Inventory; -//using MinecraftClient.Mapping; -//using MinecraftClient.Scripting; -//using System.Collections.Generic; -//using System.Linq; -//using static MinecraftClient.ChatBots.AutoCraft.Configs; -//using System.Text; - -MCC.LoadBot(new AutoTree()); - -//MCCScript Extensions - -public class AutoTree : ChatBot -{ - public const string CommandName = "autotree"; - - // Auto sapling placer - made for auto tree machine - // Put your bot in designed position for placing sapling - // Set the tree type by "/autotree type " - // Toggle on and off by "/autotree toggle" - - // Hard-code the location of the sapling (dirt coordinate with y-axis plus 1) - // Or use the in-game command "/autotree set x y z" - Location sapling = new Location(-6811, 79, -9935); - - Material[] saplingBlocks = - { - Material.AcaciaSapling, - Material.BirchSapling, - Material.DarkOakSapling, - Material.JungleSapling, - Material.OakSapling, - Material.SpruceSapling - }; - - ItemType[] saplingItems = - { - ItemType.AcaciaSapling, - ItemType.BirchSapling, - ItemType.DarkOakSapling, - ItemType.JungleSapling, - ItemType.OakSapling, - ItemType.SpruceSapling - }; - - bool running = false; - int treeTypeIndex = 1; // Default birch tree - - public override void Update() - { - if (running) - { - Material blockType = GetWorld().GetBlock(sapling).Type; - if (blockType == saplingBlocks[treeTypeIndex]) // Tree not yet grown - return; - switch (blockType) - { - case Material.Air: - // No tree, plant something - if (!SwitchToSapling()) - { - LogToConsole("No sapling in hotbar. Refill and start again."); - Toggle(); - break; - } - SendPlaceBlock(sapling, Direction.Up); - break; - } - } - } - - public override void Initialize() - { - if (!GetTerrainEnabled()) - { - LogToConsoleTranslated("extra.terrainandmovement_required"); - UnloadBot(); - } - else if (!GetInventoryEnabled()) - { - LogToConsoleTranslated("extra.inventory_required"); - UnloadBot(); - } - else - { - McClient.dispatcher.Register(l => l.Literal("help") - .Then(l => l.Literal(CommandName) - .Executes(r => OnCommandHelp(r.Source, string.Empty)) - .Then(l => l.Literal("set") - .Executes(r => OnCommandHelp(r.Source, "set"))) - .Then(l => l.Literal("type") - .Executes(r => OnCommandHelp(r.Source, "type"))) - ) - ); - - McClient.dispatcher.Register(l => l.Literal(CommandName) - .Then(l => l.Literal("toggle") - .Executes(r => { return r.Source.SetAndReturn(CmdResult.Status.Done, Toggle() ? "Now is running" : "Now is stopping"); })) - .Then(l => l.Literal("set") - .Then(l => l.Argument("Location", MccArguments.Location()) - .Executes(r => OnCommandSet(r.Source, MccArguments.GetLocation(r, "Location"))))) - .Then(l => l.Literal("type") - .Then(l => l.Argument("TreeType", Arguments.String()) - .Executes(r => OnCommandType(r.Source, Arguments.GetString(r, "TreeType"))))) - .Then(l => l.Literal("_help") - .Redirect(McClient.dispatcher.GetRoot().GetChild("help").GetChild(CommandName))) - ); - - LogToConsole("Loaded."); - } - } - - public override void OnUnload() - { - McClient.dispatcher.Unregister(CommandName); - McClient.dispatcher.GetRoot().GetChild("help").RemoveChild(CommandName); - } - - private int OnCommandHelp(CmdResult r, string? cmd) - { - return r.SetAndReturn(cmd switch - { -#pragma warning disable format // @formatter:off - "set" => "Set the location for placing sapling. Usage: set ", - "type" => "Set the tree type. Usage: type ", - _ => "Available commands: toggle, set, type" - + '\n' + McClient.dispatcher.GetAllUsageString(CommandName, false), -#pragma warning restore format // @formatter:on - }); - } - - private int OnCommandSet(CmdResult r, Location location) - { - SetLocation(location.ToAbsolute(GetCurrentLocation())); - return r.SetAndReturn(CmdResult.Status.Done, "Location set to " + location.ToString()); - } - - private int OnCommandType(CmdResult r, string treeType) - { - for (int i = 0; i < saplingItems.Length; i++) - { - if (saplingItems[i].ToString().ToLower().StartsWith(treeType)) - { - treeTypeIndex = i; - break; - } - } - return r.SetAndReturn(CmdResult.Status.Done, "Tree sapling type set to " + saplingItems[treeTypeIndex].ToString()); - } - - public bool SetTreeType(int index) - { - if (index >= 0 && index < saplingItems.Length) - { - treeTypeIndex = index; - return true; - } - else return false; - } - - public void SetLocation(Location l) - { - sapling = l; - } - - public bool Toggle() - { - running = !running; - return running; - } - - public bool SwitchToSapling() - { - Container p = GetPlayerInventory(); - if (p.Items.ContainsKey(GetCurrentSlot() - 36) - && p.Items[GetCurrentSlot() - 36].Type == saplingItems[treeTypeIndex]) - { - // Already selected - return true; - } - // Search sapling in hotbar - List result = new List(p.SearchItem(saplingItems[treeTypeIndex])) - .Where(slot => slot >= 36 && slot <= 44) - .ToList(); - if (result.Count <= 0) - { - return false; - } - else - { - ChangeSlot((short)(result[0] - 36)); - return true; - } - } -} diff --git a/MinecraftClient/config/ChatBots/DiscordWebhook.cs b/MinecraftClient/config/ChatBots/DiscordWebhook.cs deleted file mode 100644 index ce0e6d2260..0000000000 --- a/MinecraftClient/config/ChatBots/DiscordWebhook.cs +++ /dev/null @@ -1,813 +0,0 @@ -//MCCScript 1.0 -//using System.Collections.Specialized; -//using MinecraftClient.Protocol; -//using MinecraftClient.Scripting; -//using MinecraftClient; -//using static MinecraftClient.Scripting.ChatBot; -//using System.Collections.Generic; -//using System.Linq; -//using System.Text; -//using System; -//using Brigadier.NET.Builder; -//using MinecraftClient.CommandHandler.Patch; -//using MinecraftClient.CommandHandler; -//using Brigadier.NET; - -MCC.LoadBot(new DiscordWebhook()); - -//MCCScript Extensions -/// -/// Stores all settings for the script. -/// -class WebhoookSettings -{ - #region All variables for the main class - public string WebhookURL { get; set; } - public int SecondsToSaveInCache { get; set; } - public bool SendPrivateMsg { get; set; } - public bool CustomChatDetection { get; set; } - public bool SendServerMsg { get; set; } - public bool GetUUIDDirectlyFromMojang { get; set; } - public bool Togglesending { get; set; } - public bool AllowMentions { get; set; } - public bool NormalChatDetection { get; set; } - private Dictionary> messageCache = new Dictionary>(); - private Dictionary messageContains = new Dictionary(); - private Dictionary messageFrom = new Dictionary(); - private Dictionary namesToUuidMojangCache = new Dictionary(); - private List ignoredPlayers = new List(); - #endregion - - #region All variables for the API class - private string currentSkinMode; - private int size; - private int scale; - private bool overlay; - private bool checkUUID; - private string fallbackSkin; - - private Dictionary skinModes = new Dictionary(); - public string CurrentSkinMode - { - set { if (skinModes.ContainsKey(value)) { currentSkinMode = value; } } - get { return currentSkinMode; } - } - public int Size - { - set { if (value <= 512) { size = value; } } - get { return size; } - } - public int Scale - { - set { if (value <= 10) { this.scale = value; } } - get { return scale; } - } - public bool Overlay - { - set { overlay = value; } - get { return overlay; } - } - public bool CheckUUID - { - set { checkUUID = value; } - get { return checkUUID; } - } - public string FallbackSkin - { - set { if (value == "MHF_Steve" || value == "MHF_Alex") { fallbackSkin = value; } } - get { return fallbackSkin; } - } - #endregion - - /// - /// Setup standard settings. - /// - public WebhoookSettings() - { - // Set preconfigured skinModes - skinModes.Add("flatFace", "https://crafatar.com/avatars/{0}"); - skinModes.Add("cubeHead", "https://crafatar.com/renders/head/{0}"); - skinModes.Add("fullSkin", "https://crafatar.com/renders/body/{0}"); - - // Define standard values for main class - WebhookURL = "https://discord.com/api/webhooks/SomeNumber/RandomStuff"; // Enter your Webhook URL here to start the bot with it predefined. - SendPrivateMsg = true; - CustomChatDetection = true; - SendServerMsg = true; - GetUUIDDirectlyFromMojang = false; - NormalChatDetection = true; - Togglesending = true; - checkUUID = true; - AllowMentions = false; - currentSkinMode = "flatFace"; - SecondsToSaveInCache = 10; - - // Define standard values for API class - size = 100; - scale = 4; - overlay = true; - fallbackSkin = "MHF_Steve"; - } - - public Dictionary GetMessageContains() { return this.messageContains; } - public Dictionary GetMessageFrom() { return this.messageFrom; } - public Dictionary> GetCachedMessages() { return this.messageCache; } - public Dictionary GetSkinModes() { return this.skinModes; } - public Dictionary GetNamesToUuidMojangCache() { return this.namesToUuidMojangCache; } - public void resetUUIDCache() { namesToUuidMojangCache.Clear(); } - public List GetIgnoredPlayers() { return ignoredPlayers; } -} - -class SkinAPI -{ - WebhoookSettings settings = new WebhoookSettings(); - - public SkinAPI(WebhoookSettings s) - { - settings = s; - } - - /// - /// Sends a request with the minecraft name to the mojang servers to optain its UUID. - /// Fails if there are invalid names, due to titles getting in it. - /// - /// Minecraft IGN - /// - public string GetUUIDFromMojang(string name) - { - if (settings.GetNamesToUuidMojangCache().ContainsKey(name)) - return settings.GetNamesToUuidMojangCache()[name]; - - try - { - var request = new ProxiedWebRequest("https://api.mojang.com/users/profiles/minecraft/" + name); - request.Accept = "application/json"; - var response = request.Get(); - string uuid = Json.ParseJson(response.Body)!["id"]!.GetStringValue(); - settings.GetNamesToUuidMojangCache().Add(name, uuid); - return uuid; - } - catch (Exception) { return "00000000000000000000000000000000"; } - } - - /// - /// Gets the UUID from the internal bot command, which is faster and should be safer on servers with titles. - /// Fails on cracked servers. - /// - /// Minecraft IGN - /// Dictionary of UUID's matched with the playername. - /// - public string GetUUIDFromPlayerList(string name, Dictionary playerList) - { - foreach (KeyValuePair player in playerList) - { - if (name.ToLower().Contains(player.Value.ToLower())) - { - return player.Key.Replace("-", ""); - } - } - - // Falback if player leaves the server. - return GetUUIDFromMojang(name); - } - - /// - /// Creates the url which is forewarded to the webhook. - /// - /// Player UUID - /// - public string GetSkinURLCrafatar(string UUID) - { - string parameters = string.Join("&", "size=" + settings.Size, "scale=" + settings.Scale, "default=" + settings.FallbackSkin, (settings.Overlay ? "overlay" : "")); - return string.Format(settings.GetSkinModes()[settings.CurrentSkinMode], UUID + "?" + parameters); - } -} - -/// -/// Stores messages in a uniform format. -/// -class Message -{ - private string senderName; - private string senderUUID; - private string content; - private DateTime time; - - /// - /// Initialize a Message. - /// - /// Player IGN - /// Player UUID - /// Message content - /// - public Message(string sN, string sU, string c, DateTime t) - { - senderName = sN; - senderUUID = sU; - content = c; - time = t; - } - - public string SenderName - { - get { return senderName; } - } - public string SenderUUID - { - get { return senderUUID; } - } - public DateTime Time - { - get { return time; } - } - public string Content - { - get { return content; } - set { content = value; } - } -} - -/// -/// Caches messages, until it is emptied by update(), or -/// a message from another user is entered. -/// -class MessageCache -{ - private WebhoookSettings settings; - private Message msg; - public Message Msg { get { return msg; } } - - public MessageCache(WebhoookSettings s) - { - msg = null; - settings = s; - } - - /// - /// Add a Message to cache. - /// Current message gets appended, if the new message is from the same sender. - /// Otherwise the current message is given back and the new message is saved. - /// - /// New message to add. - /// Current saved message, if the new message is from another player. - public Message Add(Message newMsg) - { - if (msg == null) - { - msg = newMsg; - return null; - } - else - { - if (((msg.SenderUUID == newMsg.SenderUUID && settings.CheckUUID) - || (msg.SenderName == newMsg.SenderName && !settings.CheckUUID)) - && msg.Content.Length + newMsg.Content.Length <= 2000) - { - msg.Content += "\n" + newMsg.Content; - return null; - } - else - { - Message temp = msg; - msg = newMsg; - return temp; - } - } - } - - /// - /// Clears the cache. - /// - /// Current message - public Message Clear() - { - Message temp = msg; - msg = null; - return temp; - } -} - -class DiscordWebhook : ChatBot -{ - public const string CommandName = "discordWebhook"; - - private WebhoookSettings settings = new WebhoookSettings(); - private SkinAPI sAPI; - private MessageCache cache; - - public DiscordWebhook() - { - sAPI = new SkinAPI(settings); - cache = new MessageCache(settings); - } - - public override void Initialize() - { - LogToConsole("Made by Daenges.\nSpecial thanks to Crafatar for providing the beautiful avatars!"); - LogToConsole("Please set a Webhook with '/dw changeurl [URL]'. For further information type '/discordwebhook help'."); - - McClient.dispatcher.Register(l => l.Literal(CommandName) - .Then(l => l.Argument("Commands", Arguments.GreedyString()) - .Executes(r => { - CommandHandler(Arguments.GetString(r, "Commands").Split(' ', StringSplitOptions.TrimEntries)); - return r.Source.SetAndReturn(CmdResult.Status.Done); - })) - ); - } - - public override void OnUnload() - { - McClient.dispatcher.Unregister(CommandName); - } - - public override void Update() - { - if (cache.Msg != null && (DateTime.Now - cache.Msg.Time).TotalSeconds >= settings.SecondsToSaveInCache) - { - SendWebhook(cache.Clear()); - LogDebugToConsole("Cleared cache!"); - } - } - - public override void OnPlayerJoin(Guid uuid, string name) - { - if (uuid.ToString() != string.Empty && name != string.Empty && - uuid.ToString() != null && name != null) - { - if (settings.GetNamesToUuidMojangCache().ContainsKey(name)) - { - settings.GetNamesToUuidMojangCache().Remove(name); - } - } - else - { - LogDebugToConsole(string.Format("Invalid player joined the game! UUID: {0}, Playername: {1}", uuid.ToString(), name)); - } - } - - public override void OnPlayerLeave(Guid uuid, string name) - { - if (uuid.ToString() != string.Empty && name != string.Empty && - uuid.ToString() != null && name != null) - { - if (!settings.GetNamesToUuidMojangCache().ContainsKey(name)) - { - settings.GetNamesToUuidMojangCache().Add(name, uuid.ToString()); - } - } - else - { - LogDebugToConsole(string.Format("Invalid player left the game! UUID: {0}, Playername: {1}", uuid.ToString(), name)); - } - } - - public override bool OnDisconnect(DisconnectReason reason, string message) - { - settings.resetUUIDCache(); - return false; - } - - public override void GetText(string text) - { - if (settings.Togglesending) - { - string message = ""; - string username = ""; - text = settings.AllowMentions ? GetVerbatim(text) : GetVerbatim(text).Replace("@", "[at]"); - Message msg = null; - - if (IsChatMessage(text, ref message, ref username) && settings.NormalChatDetection) - { - if (!settings.GetIgnoredPlayers().Contains(username)) - { - msg = cache.Add(new Message(username, - settings.CheckUUID ? settings.GetUUIDDirectlyFromMojang ? sAPI.GetUUIDFromMojang(username) : sAPI.GetUUIDFromPlayerList(username, GetOnlinePlayersWithUUID()) : "00000000000000000000000000000000", - message, - DateTime.Now)); - } - - } - else if (IsPrivateMessage(text, ref message, ref username) && settings.SendPrivateMsg) - { - if (!settings.GetIgnoredPlayers().Contains(username)) - { - msg = cache.Add(new Message(username, - settings.CheckUUID ? settings.GetUUIDDirectlyFromMojang ? sAPI.GetUUIDFromMojang(username) : sAPI.GetUUIDFromPlayerList(username, GetOnlinePlayersWithUUID()) : "00000000000000000000000000000000", - message, - DateTime.Now)); - } - } - else if (text.Contains(":") && settings.CustomChatDetection) // Some servers have strange chat formats. - { - var messageArray = text.Split(new[] { ':' }, 2); - if (!settings.GetIgnoredPlayers().Contains(messageArray[0])) - { - msg = cache.Add(new Message(messageArray[0], - settings.CheckUUID ? settings.GetUUIDDirectlyFromMojang ? sAPI.GetUUIDFromMojang(messageArray[0]) : sAPI.GetUUIDFromPlayerList(messageArray[0], GetOnlinePlayersWithUUID()) : "00000000000000000000000000000000", - messageArray[1], - DateTime.Now)); - } - } - else if (settings.SendServerMsg) - { - msg = cache.Add(new Message("[Server]", - "", - text, - DateTime.Now)); - - } - if (msg == null) - { - LogDebugToConsole("Saved message to cache."); - } - else { SendWebhook(msg); } - } - } - - /// - /// Appends pings to the discord message content, if - /// given keywords are included. - /// - /// Minecraft IGN - /// Message content - /// Message plus appended pings - public string AddPingsToMessage(string username, string msg) - { - string pings = ""; - if (settings.GetMessageContains().Count > 0) - { - msg = new string(msg.Where(c => !char.IsPunctuation(c)).ToArray()).ToLower(); - - foreach (KeyValuePair keyPhrase in settings.GetMessageContains()) - { - if (msg.Contains(keyPhrase.Key)) { pings += string.Join(" ", keyPhrase.Value); } - } - } - if (settings.GetMessageFrom().ContainsKey(username.ToLower())) - { - pings += settings.GetMessageFrom()[username.ToLower()]; - } - return pings; - } - - public string Sanizize(string input) - { - return string.Join(" ", - input.Replace("\"", "'") - .Replace("\n", "\\n") - .Replace("{", "") - .Replace("}", "") - .Trim() - .Split(' ') - .Where(s => !string.IsNullOrWhiteSpace(s))) - .Replace("\\n ", "\\n"); - } - - /// - /// Sends the message to the discord webhook. - /// - /// Message that will be sent. - public void SendWebhook(Message msg) - { - msg.Content += " " + AddPingsToMessage(msg.SenderName, msg.Content); - - if (settings.WebhookURL != "" && settings.WebhookURL != "https://discord.com/api/webhooks/SomeNumber/RandomStuff") - { - LogDebugToConsole("Send webhook request to Discord."); - try - { - StringBuilder requestData = new StringBuilder(); - - requestData.Append('{'); - requestData.Append("\"username\": \"" + msg.SenderName + "\", "); - requestData.Append("\"content\": \"" + Sanizize(msg.Content) + "\", "); - requestData.Append("\"avatar_url\": \"" + (msg.SenderName == "[Server]" ? sAPI.GetSkinURLCrafatar("f78a4d8dd51b4b3998a3230f2de0c670") : sAPI.GetSkinURLCrafatar(msg.SenderUUID)) + "\""); - requestData.Append("}"); - - PostRequest(settings.WebhookURL, "application/json", requestData.ToString()); - } - catch (Exception e) - { - LogToConsole("An error occured while posting messages to Discord! (Enable Debug to view it.)"); - LogDebugToConsole(string.Format("Requested Link {0}; Username {1}; message: {2}; error: {3}", - msg.SenderName == "[Server]" ? sAPI.GetSkinURLCrafatar("f78a4d8dd51b4b3998a3230f2de0c670") : sAPI.GetSkinURLCrafatar(msg.SenderUUID), msg.SenderName, msg.Content, e.ToString())); - } - } - else - { - LogToConsole("No webhook link provided. Please enter one with '/discordwebhook changeurl [link]'"); - } - } - - /// - /// Help Page - /// - /// Help Page - public string GetHelp() - { - return "/discordWebhook or /dw 'avatar', 'secondstosaveincache', " + - "'ping', 'uuidfrommojang'," + - " 'normalchatdetection', 'customchatdetection'," + - " 'toggleignored', 'checkuuid'," + - " 'sendprivate', 'changeurl'," + - " 'togglesending', 'allowmentions'," + - " 'onlyprivate', 'help'," + - " 'getsettings', 'quit'"; - } - - /// - /// Returns an array of strings, which are in quotes. - /// "\"Hello\" \"There\"" => ["Hello", "There"] - /// - /// Raw string - /// Array with words in quotes. - public List GetStringsInQuotes(string rawData) - { - List result = new List { "" }; - int currentResultPos = 0; - bool startCopy = false; - - foreach (char c in rawData) - { - if (c == '\"') - { - if (startCopy) { result[currentResultPos] = result[currentResultPos].Replace("\"", ""); currentResultPos++; result.Add(""); } - startCopy = !startCopy; - } - if (startCopy) - { - result[currentResultPos] += c.ToString(); - } - } - - return result; - } - - public string PostRequest(string url, string contentType, string content) - { - var request = new ProxiedWebRequest(url); - request.Accept = contentType; - var response = request.Post(contentType, content); - return response.Body; - } - - /// - /// Handles all commands. - /// - /// Only arguments - /// - public string CommandHandler(string[] args) - { - if (args.Length > 0) - { - switch (args[0]) - { - case "avatar": - if (args.Length > 1) - { - if (args[1] == "size") - { - - try - { - settings.Size = int.Parse(args[2]); - return "Changed avatarsize to " + args[2] + " pixel."; - } - catch (Exception) - { - return "That was not a number."; - } - } - - if (args[1] == "scale") - { - try - { - settings.Scale = int.Parse(args[2]); - return "Changed scale to " + args[2] + "."; - } - catch (Exception) - { - return "That was not a number."; - } - } - - if (args[1] == "fallbackskin") - { - settings.FallbackSkin = settings.FallbackSkin == "MHF_Steve" ? "MHF_Alex" : "MHF_Steve"; - return "Changed fallback skin to: " + settings.FallbackSkin; - } - - if (args[1] == "overlay") - { - settings.Overlay = !settings.Overlay; - return "Changed the overlay to: " + settings.Overlay; - } - - if (args[1] == "skintype") - { - if (args.Length > 2) - { - if (settings.GetSkinModes().ContainsKey(args[2])) - { - settings.CurrentSkinMode = args[2]; - return "Changed skin mode to " + args[2]; - } - else - { - return "This mode does not exsist. ('flatFace', 'cubeHead', 'fullSkin')"; - } - } - else - { - return "Enter a value! ('flatFace', 'cubeHead', 'fullSkin')"; - } - } - } - return "This was not a valid option! Try '/dw avatar size/scale/skintype [value]' or '/dw avatar overlay/fallbackskin'."; - - case "secondstosaveincache": - try - { - settings.SecondsToSaveInCache = int.Parse(args[1]); - return "Changed the maximum time for a message in cache to " + args[1] + " seconds."; - } - catch (Exception) - { - return "That was not a number."; - } - - case "ping": - if (args.Length > 1) - { - if (args[1] == "message") - { - if (args[2] == "add") - { - List tempList = GetStringsInQuotes(string.Join(" ", args)); - if (tempList.Count >= 2) - { - if (!settings.GetMessageContains().ContainsKey(tempList[0].ToLower())) - { - settings.GetMessageContains().Add(tempList[0].ToLower(), string.Join(" ", tempList[1])); - return "Added " + tempList[0].ToLower() + " " + string.Join(" ", tempList[1]); - } - else - { - return "This ping already exists"; - } - } - else - { - return "Too many arguments"; - } - } - else - { - List tempList = GetStringsInQuotes(string.Join(" ", args)); - if (settings.GetMessageContains().ContainsKey(tempList[0].ToLower())) - { - settings.GetMessageContains().Remove(tempList[0].ToLower()); - return "Removed " + tempList[0].ToLower(); - } - else - { - return "This key does not exsist."; - } - } - } - if (args[1] == "sender") - { - if (args[2] == "add") - { - List tempList = GetStringsInQuotes(string.Join(" ", args)); - if (tempList.Count >= 2) - { - if (!settings.GetMessageFrom().ContainsKey(tempList[0].ToLower())) - { - settings.GetMessageFrom().Add(tempList[0].ToLower(), string.Join(" ", tempList[1])); - return "Added " + tempList[0].ToLower() + " " + string.Join(" ", tempList[1]); - } - else - { - return "This ping already exists"; - } - } - else - { - return "Too many arguments"; - } - } - else - { - List tempList = GetStringsInQuotes(string.Join(" ", args)); - if (settings.GetMessageFrom().ContainsKey(tempList[0].ToLower())) - { - settings.GetMessageFrom().Remove(tempList[0].ToLower()); - return "Removed " + tempList[0].ToLower(); - } - else - { - return "This key does not exsist."; - } - } - } - else - { - return "This is not a valid option. /discordwebhook ping message/sender add/remove \"Keywords in message\" \"@here <@DiscordID> <@&RoleID>\""; - } - } - else { return "This is not a valid option. /discordwebhook ping message/sender add/remove \"Keywords in message\" \"@here <@DiscordID> <@&RoleID>\""; } - - case "uuidfrommojang": - settings.GetUUIDDirectlyFromMojang = !settings.GetUUIDDirectlyFromMojang; - return "Getting UUID's from Mojang: " + settings.GetUUIDDirectlyFromMojang.ToString(); - - case "checkuuid": - settings.CheckUUID = !settings.CheckUUID; - return "Getting UUID's: " + settings.CheckUUID.ToString(); - - case "sendprivate": - settings.SendPrivateMsg = !settings.SendPrivateMsg; - return "Send private messages: " + settings.SendPrivateMsg.ToString(); - - case "allowmentions": - settings.AllowMentions = !settings.AllowMentions; - return "People can @Members: " + settings.AllowMentions.ToString(); - - case "normalchatdetection": - settings.NormalChatDetection = !settings.NormalChatDetection; - return "Detect messages with the regular chat detection: " + settings.NormalChatDetection.ToString(); - - case "customchatdetection": - settings.CustomChatDetection = !settings.CustomChatDetection; - return "Detect messages with the custom chat detection: " + settings.CustomChatDetection.ToString(); - - case "sendservermsg": - settings.SendServerMsg = !settings.SendServerMsg; - return "Server messages get forewarded: " + settings.SendServerMsg.ToString(); - - case "togglesending": - settings.Togglesending = !settings.Togglesending; - return "Forewarding messages to Discord: " + settings.Togglesending.ToString(); - - case "toggleignored": - if (args.Length >= 2) - { - if (settings.GetIgnoredPlayers().Contains(args[1])) - { - settings.GetIgnoredPlayers().Remove(args[1]); - return "Unignored: " + args[1]; - } - else - { - settings.GetIgnoredPlayers().Add(args[1]); - return "Ignored: " + args[1]; - } - } - else { return "Enter a playername."; } - - case "changeurl": - if (args.Length > 1) - { - settings.WebhookURL = args[1]; - return "Changed webhook URL to: " + args[1]; - } - else - { - return "Enter a valid Discord Webhook link."; - } - - case "getsettings": - return "WebhookURL: " + settings.WebhookURL + "\r\n" + - "SecondsToSaveInCache: " + settings.SecondsToSaveInCache.ToString() + "\r\n" + - "SendPrivateMsg: " + settings.SendPrivateMsg.ToString() + "\r\n" + - "SendPublicMsg: " + settings.CustomChatDetection.ToString() + "\r\n" + - "SendServerMsg: " + settings.SendServerMsg.ToString() + "\r\n" + - "GetUUIDDirectlyFromMojang: " + settings.GetUUIDDirectlyFromMojang.ToString() + "\r\n" + - "ToggleSending: " + settings.Togglesending.ToString() + "\r\n" + - "AllowMentions: " + settings.AllowMentions.ToString() + "\r\n" + - "NormalChatDetection: " + settings.NormalChatDetection.ToString() + "\r\n" + - "CustomChatDetection: " + settings.CustomChatDetection.ToString() + "\r\n" + - "CurrentSkinMode: " + settings.CurrentSkinMode + "\r\n" + - "Size: " + settings.Size.ToString() + "\r\n" + - "Scale: " + settings.Scale.ToString() + "\r\n" + - "Overlay: " + settings.Overlay.ToString() + "\r\n" + - "CheckUUID: " + settings.CheckUUID.ToString() + "\r\n" + - "IgnoredPlayers: " + string.Join(" ;", settings.GetIgnoredPlayers()) + "\r\n" + - "FallbackSkin: " + settings.FallbackSkin; - - case "help": - return GetHelp(); - - case "quit": - UnloadBot(); - return "Turned discordwebhook off!"; - - default: - return GetHelp(); - } - } - else { return GetHelp(); } - } -} diff --git a/MinecraftClient/config/ChatBots/EntityCount.cs b/MinecraftClient/config/ChatBots/EntityCount.cs deleted file mode 100644 index a41d5d751e..0000000000 --- a/MinecraftClient/config/ChatBots/EntityCount.cs +++ /dev/null @@ -1,49 +0,0 @@ -//MCCScript 1.0 - -MCC.LoadBot(new EntityCount()); - -//MCCScript Extensions - -class EntityCount : ChatBot -{ - public override void Initialize() - { - LogToConsole("Entity Count chat bot loaded!"); - RegisterChatBotCommand("entitycount", "Counts entities of a provided type", "entitycount [ ]", OnCommand); - } - - public string OnCommand(string cmd, string[] args) - { - if (args.Length < 1) - return "Invalid usage! Usage: /entitycount [ ]"; - - if (!Enum.TryParse(args[0], out EntityType entityType)) - return "Invalid entity type provided!\nSee: https://bit.ly/3NgSIFu"; - - Location? location = null; - - if (args.Length >= 4) - { - if (!Location.TryParse(GetCurrentLocation().ToFloor(), args[1], args[2], args[3], out location)) - return "Invalid location provided, check your input!"; - } - - int counter = 0; - - foreach (var (id, entity) in GetEntities()) - { - if (entity.Type == entityType) - { - if (location != null) - { - if (entity.Location.ToFloor() != ((Location)location).ToFloor()) - continue; - } - - counter++; - } - } - - return $"Found {counter} of entity type: {args[0]}"; - } -} diff --git a/MinecraftClient/config/ChatBots/MineCube.cs b/MinecraftClient/config/ChatBots/MineCube.cs deleted file mode 100644 index 1f64f0daac..0000000000 --- a/MinecraftClient/config/ChatBots/MineCube.cs +++ /dev/null @@ -1,520 +0,0 @@ -//MCCScript 1.0 - -//using MinecraftClient.Inventory; -//using MinecraftClient.Mapping; -//using MinecraftClient.Scripting; -//using MinecraftClient; -//using System.Collections.Generic; -//using System.Linq; -//using System.Threading.Tasks; -//using System.Threading; -//using System; -//using Brigadier.NET.Builder; -//using MinecraftClient.CommandHandler.Patch; -//using Brigadier.NET; -//using MinecraftClient.CommandHandler; - -MCC.LoadBot(new MineCube()); - -//MCCScript Extensions - -//using System.Threading.Tasks; - -class MineCube : ChatBot -{ - public const string CommandName = "mineup"; - - private CancellationTokenSource cts; - private Task currentMiningTask; - private TimeSpan breakTimeout; - private bool toolHandling; - private int cacheSize; - - public override void Initialize() - { - if (!GetTerrainEnabled()) - { - LogToConsole(Translations.extra_terrainandmovement_required); - UnloadBot(); - return; - } - - currentMiningTask = null; - breakTimeout = TimeSpan.FromSeconds(15); - cacheSize = 10; - toolHandling = true; - - LogToConsole("Mining bot created by Daenges."); - - McClient.dispatcher.Register(l => l.Literal(CommandName) - .Then(l => l.Argument("Commands", Arguments.GreedyString()) - .Executes(r => { - EvaluateMineCommand(CommandName + ' ' + Arguments.GetString(r, "Commands"), Arguments.GetString(r, "Commands").Split(' ', StringSplitOptions.TrimEntries)); - return r.Source.SetAndReturn(CmdResult.Status.Done); - })) - ); - } - - public override void OnUnload() - { - McClient.dispatcher.Unregister(CommandName); - } - - /// - /// Walks in a 2 high area under an area of blocks and mines anything above its head. - /// - /// The current world - /// The start corner of walking - /// The stop corner of walking - /// CancellationToken to stop the task on cancel - public void MineUp(World currentWorld, Location startBlock, Location stopBlock, CancellationToken ct) - { - if (startBlock.Y != stopBlock.Y) - { - LogToConsole("Command FAILED. Both coordinates must be on the same y level."); - } - - IEnumerable xLocationRange = GetNumbersFromTo(Convert.ToInt32(Math.Round(startBlock.X)), Convert.ToInt32(Math.Round(stopBlock.X))); - IEnumerable zLocationRange = GetNumbersFromTo(Convert.ToInt32(Math.Round(startBlock.Z)), Convert.ToInt32(Math.Round(stopBlock.Z))); - - foreach (int currentXLoc in xLocationRange) - { - foreach (int currentZLoc in zLocationRange) - { - Location standLocation = new Location(currentXLoc, startBlock.Y, currentZLoc); - - // Walk to the new location. - waitForMoveToLocation(standLocation, maxOffset: 1); - - for (int height = Convert.ToInt32(startBlock.Y) + 2; height < Convert.ToInt32(startBlock.Y) + 7; height++) - { - if (ct.IsCancellationRequested) - { - currentMiningTask = null; - LogToConsole("Cancellation requested. STOP MINING."); - return; - } - - Location mineLocation = new Location(currentXLoc, height, currentZLoc); - Material mineLocationMaterial = currentWorld.GetBlock(mineLocation).Type; - - // Stop mining process if breaking the next block could endager the bot - // through falling blocks or liquids. - if (!IsGravitySave(currentWorld, mineLocation) || IsSorroundedByLiquid(currentWorld, mineLocation)) { break; } - // Skip this block if it can not be mined. - if (Material2Tool.IsUnbreakable(mineLocationMaterial)) { continue; } - - if (GetInventoryEnabled() && toolHandling) - { - // Search this tool in hotbar and select the correct slot - SelectCorrectSlotInHotbar( - // Returns the correct tool for this type - Material2Tool.GetCorrectToolForBlock( - // returns the type of the current block - mineLocationMaterial)); - } - - // If we are able to reach the block && break sucessfully sent - if (GetCurrentLocation().EyesLocation().DistanceSquared(mineLocation) <= 25 && DigBlock(mineLocation)) - { - AutoTimeout.Perform(() => - { - while (GetWorld().GetBlock(mineLocation).Type != Material.Air) - { - Thread.Sleep(100); - - if (ct.IsCancellationRequested) - break; - } - }, breakTimeout); - } - else - { - LogDebugToConsole("Unable to break this block: " + mineLocation.ToString()); - } - } - } - } - LogToConsole("Finished mining up."); - } - - /// - /// Mine a cube of blocks from top to bottom between start and stop location - /// - /// The current world - /// The upper corner of the cube to mine - /// The lower corner of the cube to mine - /// CancellationToken to stop the task on cancel - public void Mine(World currentWorld, Location startBlock, Location stopBlock, CancellationToken ct) - { - // Turn the cube around, so the bot always starts from the top. - if (stopBlock.Y > startBlock.Y) - { - Location temp = stopBlock; - stopBlock = startBlock; - startBlock = temp; - } - - IEnumerable xLocationRange = GetNumbersFromTo(Convert.ToInt32(Math.Round(startBlock.X)), Convert.ToInt32(Math.Round(stopBlock.X))); - IEnumerable yLocationRange = GetNumbersFromTo(Convert.ToInt32(Math.Round(startBlock.Y)), Convert.ToInt32(Math.Round(stopBlock.Y))); - IEnumerable zLocationRange = GetNumbersFromTo(Convert.ToInt32(Math.Round(startBlock.Z)), Convert.ToInt32(Math.Round(stopBlock.Z))); - - foreach (int currentYLoc in yLocationRange) - { - foreach (int currentXLoc in xLocationRange) - { - - if (ct.IsCancellationRequested) - { - currentMiningTask = null; - LogToConsole("Cancellation requested. STOP MINING."); - return; - } - - List blocksToMine = null; - - // If the end of the new row is closer than the start, reverse the line and start here - Location currentStandingLoc = GetCurrentLocation(); - Queue currentZLocationRangeQueue = new Queue(currentStandingLoc.DistanceSquared(new Location(currentXLoc, currentYLoc, zLocationRange.Last())) < currentStandingLoc.DistanceSquared(new Location(currentXLoc, currentYLoc, zLocationRange.First())) ? - zLocationRange.Reverse() : - zLocationRange); - - while (!ct.IsCancellationRequested && (currentZLocationRangeQueue.Count > 0 || blocksToMine.Count > 0)) - { - // Evaluate the next blocks to mine, while mining - Task> cacheEval = Task>.Factory.StartNew(() => // Get a new chunk of blocks that can be mined - EvaluateBlocks(currentWorld, currentXLoc, currentYLoc, currentZLocationRangeQueue, ct, cacheSize)); - - // On the first run, we need the task to finish, otherwise we would not have any results - if (blocksToMine != null) - { - // For all blocks in this block chunk - foreach (Location mineLocation in blocksToMine) - { - if (ct.IsCancellationRequested) - break; - - Location currentLoc = GetCurrentLocation(); - Location currentBlockUnderFeet = new Location(Math.Floor(currentLoc.X), Math.Floor(currentLoc.Y) - 1, Math.Floor(currentLoc.Z)); - - // If we are too far away from the mining location - if (currentLoc.EyesLocation().DistanceSquared(mineLocation) > 25) - { - // Walk to the new location - waitForMoveToLocation(mineLocation, maxOffset: 3); - } - - // Prevent falling into danger - if (mineLocation == currentBlockUnderFeet && !Movement.IsSafe(currentWorld, currentBlockUnderFeet)) - waitForMoveToLocation(mineLocation, maxOffset: 4, minOffset: 3); - - // Is inventoryhandling activated? - if (GetInventoryEnabled() && toolHandling) - { - // Search this tool in hotbar and select the correct slot - SelectCorrectSlotInHotbar( - // Returns the correct tool for this type - Material2Tool.GetCorrectToolForBlock( - // returns the type of the current block - currentWorld.GetBlock(mineLocation).Type)); - } - - // If we are able to reach the block && break sucessfully sent - if (GetCurrentLocation().EyesLocation().DistanceSquared(mineLocation) <= 25 && DigBlock(mineLocation)) - { - // Wait until the block is broken (== Air) - AutoTimeout.Perform(() => - { - while (GetWorld().GetBlock(mineLocation).Type != Material.Air) - { - Thread.Sleep(100); - - if (ct.IsCancellationRequested) - break; - } - }, breakTimeout); - } - else - { - LogDebugToConsole("Unable to break this block: " + mineLocation.ToString()); - } - - } - } - - if (!ct.IsCancellationRequested) - { - // Wait for the block evaluation task to finish (if not already) and save the result - if (!cacheEval.IsCompleted) - { - cacheEval.Wait(); - } - blocksToMine = cacheEval.Result; - } - } - } - } - currentMiningTask = null; - LogToConsole("MINING FINISHED."); - } - - /// - /// This function selects a certain amount of minable blocks in a row - /// - /// The current world - /// The current x location of the row - /// The current y location of the row - /// All Z blocks that will be mined - /// CancellationToken to stop the task on cancel - /// Maximum amount of blocks to return - /// - private List EvaluateBlocks(World currentWorld, int xLoc, int yLoc, Queue zLocationQueue, CancellationToken ct, int cacheSize = 10) - { - List blockMiningCache = new List(); - int i = 0; - while (zLocationQueue.Count > 0 && i < cacheSize && !ct.IsCancellationRequested) - { - // Get the block to mine, relative to the startblock of the row - Location mineLocation = new Location(xLoc, yLoc, zLocationQueue.Dequeue()); - - // Add the current location to the mining cache if it is safe to mine - if (currentWorld.GetBlock(mineLocation).Type != Material.Air && - IsGravitySave(currentWorld, mineLocation) && - !IsSorroundedByLiquid(currentWorld, mineLocation) && - !Material2Tool.IsUnbreakable(currentWorld.GetBlock(mineLocation).Type)) - { - blockMiningCache.Add(mineLocation); - i++; - } - } - return blockMiningCache; - } - - /// - /// Generates a sequence of numbers between a start and a stop number, including both - /// - /// Number to start from - /// Number to end with - /// a sequence of numbers between a start and a stop number, including both - private static IEnumerable GetNumbersFromTo(int start, int stop) - { - return start <= stop ? Enumerable.Range(start, stop - start + 1) : Enumerable.Range(stop, start - stop + 1).Reverse(); - } - - /// - /// Starts walk and waits until the client arrives - /// - /// Location to reach - /// Allow possible but unsafe locations thay may hurt the player: lava, cactus... - /// Allow non-vanilla direct teleport instead of computing path, but may cause invalid moves and/or trigger anti-cheat plugins - /// If no valid path can be found, also allow locations within specified distance of destination - /// Do not get closer of destination than specified distance - /// How long to wait before stopping computation (default: 5 seconds) - private void waitForMoveToLocation(Location goal, bool allowUnsafe = false, bool allowDirectTeleport = false, int maxOffset = 0, int minOffset = 0, TimeSpan? timeout = null) - { - if (MoveToLocation(goal, allowUnsafe, allowDirectTeleport, maxOffset, minOffset, timeout)) - { - // Wait till the client stops moving - while (ClientIsMoving()) - { - Thread.Sleep(200); - } - } - else - { - LogDebugToConsole("Unable to walk to: " + goal.ToString()); - } - } - - /// - /// Checks all slots of the hotbar for an Item and selects it if found - /// - /// List of items that may be selected, from worst to best - private void SelectCorrectSlotInHotbar(ItemType[] tools) - { - if (GetInventoryEnabled()) - { - foreach (ItemType tool in tools) - { - int[] tempArray = GetPlayerInventory().SearchItem(tool); - // Check whether an item could be found and make sure that it is in - // a hotbar slot (36-44). - if (tempArray.Length > 0 && tempArray[0] > 35) - { - // Changeslot takes numbers from 0-8 - ChangeSlot(Convert.ToInt16(tempArray[0] - 36)); - break; - } - } - } - else - { - LogToConsole("Activate Inventory Handling."); - } - } - - /// - /// Check if mining the current block would update others - /// - /// Current World - /// The block to be checked - /// true if mining the current block would not update others - public bool IsGravitySave(World currentWorld, Location blockToMine) - { - Location currentLoc = GetCurrentLocation(); - Location block = new Location(Math.Round(blockToMine.X), Math.Round(blockToMine.Y), Math.Round(blockToMine.Z)); - List gravityBlockList = new List(new Material[] { Material.Gravel, Material.Sand, Material.RedSand, Material.Scaffolding, Material.Anvil, }); - Func isGravityBlock = (Location blockToCheck) => gravityBlockList.Contains(currentWorld.GetBlock(blockToCheck).Type); - Func isBlockSolid = (Location blockToCheck) => currentWorld.GetBlock(blockToCheck).Type.IsSolid(); - - return - // Block can not fall down on player e.g. Sand, Gravel etc. - !isGravityBlock(Movement.Move(block, Direction.Up)) && - (Movement.Move(currentLoc, Direction.Down) != blockToMine || currentWorld.GetBlock(Movement.Move(currentLoc, Direction.Down, 2)).Type.IsSolid()) && - // Prevent updating flying sand/gravel under player - !isGravityBlock(Movement.Move(block, Direction.Down)) || isBlockSolid(Movement.Move(block, Direction.Down, 2)); - } - - /// - /// Checks if the current block is sorrounded by liquids - /// - /// Current World - /// The block to be checked - /// true if mining the current block results in liquid flow change - public bool IsSorroundedByLiquid(World currentWorld, Location blockToMine) - { - Location block = new Location(Math.Round(blockToMine.X), Math.Round(blockToMine.Y), Math.Round(blockToMine.Z)); - Func isLiquid = (Location blockToCheck) => currentWorld.GetBlock(blockToCheck).Type.IsLiquid(); - - return // Liquid can not flow down the hole. Liquid is unable to flow diagonally. - isLiquid(block) || - isLiquid(Movement.Move(block, Direction.Up)) || - isLiquid(Movement.Move(block, Direction.North)) || - isLiquid(Movement.Move(block, Direction.South)) || - isLiquid(Movement.Move(block, Direction.East)) || - isLiquid(Movement.Move(block, Direction.West)); - } - - /// - /// The Help page for this command. - /// - /// a help page - private string getHelpPage() - { - return - "Usage of the mine bot:\n" + - "/mine OR /mine \n" + - "to excavate a cube of blocks from top to bottom. (There must be a 2 high area of air above the cube you want to mine.)\n" + - "/mineup OR /mineup \n" + - "to walk over a quadratic field of blocks and simultaniously mine everything above the head. \n" + - "(Mines up to 5 Blocks, stops if gravel or lava would fall. There must be a 2 high area of air below the cube you want to mine.)\n" + - "/mine OR /mineup cancel\n" + - "to cancel the current mining process.\n" + - "/mine OR /mineup cachesize\n" + - "to set the current cache size\n" + - "/mine OR /mineup breaktimeout\n" + - "to set the time to wait until a block is broken."; ; - - } - - private string EvaluateMineCommand(string command, string[] args) - { - for (int i = 0; i < args.Length; i++) - { - switch (args[i]) - { - case "breaktimeout": - int temp; - if (int.TryParse(args[i + 1], out temp)) - breakTimeout = TimeSpan.FromMilliseconds(temp); - else return "Please enter a valid number."; - return string.Format("Set the break timout to {0} ms.", breakTimeout); - - case "cachesize": - return int.TryParse(args[i + 1], out cacheSize) ? string.Format("Set cache size to {0} blocks.", cacheSize) : "Please enter a valid number"; - - case "cancel": - cts.Cancel(); - currentMiningTask = null; - return "Cancelled current mining process."; - - case "toolHandling": - toolHandling = !toolHandling; - return string.Format("Tool handling was set to: {0}", toolHandling.ToString()); - } - } - - if (args.Length > 2) - { - Location startBlock; - Location stopBlock; - - if (args.Length > 5) - { - try - { - startBlock = new Location( - double.Parse(args[0]), - double.Parse(args[1]), - double.Parse(args[2]) - ); - - stopBlock = new Location( - double.Parse(args[3]), - double.Parse(args[4]), - double.Parse(args[5]) - ); - - } - catch (Exception e) - { - LogDebugToConsole(e.ToString()); - return "Please enter correct coordinates as numbers.\n" + getHelpPage(); - } - } - else - { - Location tempLoc = GetCurrentLocation(); - startBlock = new Location(Math.Round(tempLoc.X), - Math.Round(tempLoc.Y), - Math.Round(tempLoc.Z)); - - try - { - stopBlock = new Location( - double.Parse(args[0]), - double.Parse(args[1]), - double.Parse(args[2]) - ); - } - catch (Exception e) - { - LogDebugToConsole(e.ToString()); - return "Please enter correct coordinates as numbers.\n" + getHelpPage(); - } - } - - if (currentMiningTask == null) - { - if (command.Contains("mineup")) - { - cts = new CancellationTokenSource(); - - currentMiningTask = Task.Factory.StartNew(() => MineUp(GetWorld(), startBlock, stopBlock, cts.Token)); - return "Start mining up."; - } - else if (command.Contains("mine")) - { - - cts = new CancellationTokenSource(); - - currentMiningTask = Task.Factory.StartNew(() => Mine(GetWorld(), startBlock, stopBlock, cts.Token)); - return "Start mining cube."; - } - } - else return "You are already mining. Cancel it with '/minecancel'"; - } - - return "Invalid command syntax.\n" + getHelpPage(); - } -} diff --git a/MinecraftClient/config/ChatBots/PayKassa.cs b/MinecraftClient/config/ChatBots/PayKassa.cs deleted file mode 100644 index b225ae4a88..0000000000 --- a/MinecraftClient/config/ChatBots/PayKassa.cs +++ /dev/null @@ -1,101 +0,0 @@ -//MCCScript 1.0 -//using System.Threading.Tasks; - -//==== CONFIG START ==== -string merchant_id = ""; -string merchant_password = ""; -//==== CONFIG END ==== - -MCC.LoadBot(new PayKassaBot(merchant_id, merchant_password)); - -//MCCScript Extensions - -public class PayKassaBot : ChatBot -{ - private PayKassaSCI paykassa { get; set; } - - /// - /// This bot forwarding messages between Minecraft and VKonrakte chats. - /// Shares only messages that starts with dot ("."). Example: .Hello! - /// Also, send message to VK when any player joins or leaves. - /// - /// VK Community token - /// VK ChatId - /// Bot's CommunityId - public PayKassaBot(string merchant_id, string merchant_password) - { - paykassa = new PayKassaSCI(merchant_id, merchant_password); - } - -} - -/// -/// Client for VK Community (bot) LongPool API. -/// Also can send messages. -/// - -internal class PayKassaSCI -{ - private string _merchant_id = ""; - private string _merchant_password = ""; - public PayKassaSCI(string merchant_id, string merchant_password) - { - this._merchant_id = merchant_id; - this._merchant_password = merchant_password; - } - - public enum SystemID - { - Payeer = 1, - PerfectMoney = 2, - AdvCash = 4, - Berty = 7, - BitCoin = 11, - Ethereum = 12, - LiteCoin = 14, - DogeCoin = 15, - Dash = 16, - BitcoinCash = 18, - Zcash = 19, - EthereumClassic = 21, - Ripple = 22, - TRON = 27, - Stellar = 28, - - } - - public string[] sci_create_order(float ammount, string currency, string order_id, string comment, SystemID systemID) - { - using (WebClient web = new WebClient()) - { - string url = "https://paykassa.pro/sci/0.4/index.php?func=sci_create_order&sci_id" + _merchant_id + "&sci_id=" + _merchant_id + "&sci_key=" + _merchant_password + "&order_id=" + order_id + "&amount=" + ammount + "¤cy=" + currency + "&system=" + (int)systemID + "&comment=" + comment; - string response = web.DownloadString(url); - string urlresponse = Regex.Match(response, "{\"url\":\"(.*)\",\"method\"").Groups[1].Value; - urlresponse = urlresponse.Replace(@"\/", "/"); - string hash = Regex.Match(response, "\"hash\":\"(.*)\"}}}").Groups[1].Value; - return new string[] { urlresponse, hash }; - } - } - - public string[] sci_confirm_order(string private_hash) - { - using (WebClient web = new WebClient()) - { - string url = "https://paykassa.pro/sci/0.4/index.php?func=sci_confirm_order&sci_id" + _merchant_id + "&sci_id=" + _merchant_id + "&sci_key=" + _merchant_password + "&private_hash=" + private_hash + "&test=true"; - string response = web.DownloadString(url); - Console.WriteLine(response); - string error =Regex.Match(response, "\"error\":(.*),\"message\"").Groups[1].Value; - - string message = Regex.Match(response, "\"message\":\"(.*)\",\"data\"").Groups[1].Value; - - string transaction = Regex.Match(response, "\"transaction\":\"(.*)\",").Groups[1].Value; - string shop_id = Regex.Match(response, "\"shop_id\":\"(.*)\",").Groups[1].Value; - string order_id = Regex.Match(response, "\"order_id\":\"(.*)\",").Groups[1].Value; - string amount = Regex.Match(response, "\"amount\":\"(.*)\",").Groups[1].Value; - string currency = Regex.Match(response, "\"currency\":\"(.*)\",").Groups[1].Value; - string system = Regex.Match(response, "\"system\":\"(.*)\",").Groups[1].Value; - string hash = Regex.Match(response, "\"hash\":\"(.*)\",").Groups[1].Value; - return new string[] { error.ToString(), message, transaction, shop_id, order_id, amount, currency, system, hash }; - } - } -} diff --git a/MinecraftClient/config/ChatBots/QIWIAPI.cs b/MinecraftClient/config/ChatBots/QIWIAPI.cs deleted file mode 100644 index 4c2a9fddc9..0000000000 --- a/MinecraftClient/config/ChatBots/QIWIAPI.cs +++ /dev/null @@ -1,317 +0,0 @@ -//MCCScript 1.0 -//using System.Threading.Tasks; - -MCC.LoadBot(new QIWI_DonationBot()); - -//MCCScript Extensions - -public class QIWI_DonationBot : ChatBot -{ - //More info: https://github.com/Nekiplay/QIWI-API - public override void Initialize() - { - QIWI.Donation donation = new QIWI.Donation("token", OnDonate); - QIWI.Wallet wallet = new QIWI.Wallet("token"); - Console.WriteLine("Phone: " + wallet.Identification.Phone() - + "\nMail: " + wallet.Identification.Mail() - + "\nBalance: " + wallet.Balance.RUB(wallet.Identification.Phone()) + " RUB" - ); - Console.WriteLine("Name: " + wallet.Identification.Last_Name(wallet.Identification.Phone()) + " " + wallet.Identification.First_Name(wallet.Identification.Phone()) + " " + wallet.Identification.Middle_Name(wallet.Identification.Phone())); - LogToConsole("Bot enabled"); - } - - private void OnDonate(string nickname, float ammount, string currency, string message) - { - LogToConsole("Nickname: " + nickname); - LogToConsole("Ammount: " + ammount); - LogToConsole("Currency: " + currency); - LogToConsole("Message: " + message); - } - - public override void Update() - { - - } - public override void AfterGameJoined() - { - - } - public override void GetText(string text, string json) - { - string text1 = GetVerbatim(text); - } -} - -public class QIWI -{ - public class Wallet - { - public _Balance_ Balance; - public _Identification_ Identification; - - private string token; - public enum Currency - { - RUB = 643, - USD = 840, - }; - public Wallet(string token) - { - this.token = token; - this.Balance = new _Balance_(this.token); - this.Identification = new _Identification_(this.token); - } - - public class _Identification_ - { - private string token; - public _Identification_(string token) - { - this.token = token; - } - public string Nickname(string phone) - { - using (WebClient wc = new WebClient()) - { - wc.Encoding = Encoding.UTF8; - wc.Headers.Set("authorization", "Bearer " + this.token); - string response = wc.DownloadString("https://edge.qiwi.com//qw-nicknames/v1/persons/" + phone + "/nickname"); - string First_Name = Regex.Match(response, "\"nickname\":\"(.*)\",\"canChange\":(.*)").Groups[1].Value; - if (First_Name != "") - { - return First_Name; - } - } - return ""; - } - public string First_Name(string phone) - { - using (WebClient wc = new WebClient()) - { - wc.Encoding = Encoding.UTF8; - wc.Headers.Set("authorization", "Bearer " + this.token); - string response = wc.DownloadString("https://edge.qiwi.com/identification/v1/persons/" + phone + "/identification"); - string First_Name = Regex.Match(response, "\"firstName\":\"(.*)\",\"middleName\":\"(.*)\",\"lastName\":\"(.*)\"").Groups[1].Value; - if (First_Name != "") - { - return First_Name; - } - } - return ""; - } - public string Middle_Name(string phone) - { - using (WebClient wc = new WebClient()) - { - wc.Encoding = Encoding.UTF8; - wc.Headers.Set("authorization", "Bearer " + this.token); - string response = wc.DownloadString("https://edge.qiwi.com/identification/v1/persons/" + phone + "/identification"); - string Middle_Name = Regex.Match(response, "\"firstName\":\"(.*)\",\"middleName\":\"(.*)\",\"lastName\":\"(.*)\"").Groups[2].Value; - if (Middle_Name != "") - { - return Middle_Name; - } - } - return ""; - } - public string Last_Name(string phone) - { - using (WebClient wc = new WebClient()) - { - wc.Encoding = Encoding.UTF8; - wc.Headers.Set("authorization", "Bearer " + this.token); - string response = wc.DownloadString("https://edge.qiwi.com/identification/v1/persons/" + phone + "/identification"); - string Last_Name = Regex.Match(response, "\"lastName\":\"(.*)\",\"birthDate\":\"(.*)\"").Groups[1].Value; - if (Last_Name != "") - { - return Last_Name; - } - } - return ""; - } - public string Phone() - { - using (WebClient wc = new WebClient()) - { - wc.Headers.Set("authorization", "Bearer " + this.token); - string response = wc.DownloadString("https://edge.qiwi.com/person-profile/v1/profile/current?authInfoEnabled=true&contractInfoEnabled=true&userInfoEnabled=true"); - string phone = Regex.Match(response, "\"personId\":(.*),\"registrationDate\":\"(.*)\"").Groups[1].Value; - if (phone != "") - { - return phone; - } - } - return ""; - } - public string Mail() - { - using (WebClient wc = new WebClient()) - { - wc.Headers.Set("authorization", "Bearer " + this.token); - string response = wc.DownloadString("https://edge.qiwi.com/person-profile/v1/profile/current?authInfoEnabled=true&contractInfoEnabled=true&userInfoEnabled=true"); - string mail = Regex.Match(response, "\"boundEmail\":\"(.*)\",\"emailSettings\"").Groups[1].Value; - if (mail != "") - { - return mail; - } - } - return ""; - } - } - public class _Balance_ - { - private string token; - public _Transfer_ Transfer; - - public _Balance_(string token) - { - this.token = token; - this.Transfer = new _Transfer_(this.token); - } - public class _Transfer_ - { - private string token; - public _Transfer_(string token) - { - this.token = token; - } - - public bool QIWIRUB(string phone, double ammount, string comment) - { - Int32 unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; - - string jsonv2 = "{\"id\":\"" + 1000 * unixTimestamp + "\",\"sum\":{\"amount\":" + ammount + ",\"currency\":\"" + "643" + "\"},\"paymentMethod\":{\"type\":\"Account\",\"accountId\":\"643\"},\"comment\":\"" + comment + "\",\"fields\":{\"account\":\"" + phone + "\"}}"; - - /* Отправка */ - try - { - WebRequest request = WebRequest.Create("https://edge.qiwi.com/sinap/api/v2/terms/99/payments"); - request.Method = "POST"; - byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(jsonv2); - request.ContentType = "application/json"; - request.Headers["Authorization"] = "Bearer " + this.token; - request.ContentLength = byteArray.Length; - - //записываем данные в поток запроса - using (Stream dataStream = request.GetRequestStream()) - { - dataStream.Write(byteArray, 0, byteArray.Length); - } - - WebResponse response = request.GetResponse(); - using (Stream stream = response.GetResponseStream()) - { - using (StreamReader reader = new StreamReader(stream)) - { - reader.ReadToEnd(); - return true; - } - } - response.Close(); - } - catch (WebException ex) - { - return false; - } - return false; - } - } - - public double RUB(string phone) - { - using (WebClient wc = new WebClient()) - { - wc.Headers.Set("authorization", "Bearer " + this.token); - string response = wc.DownloadString("https://edge.qiwi.com/funding-sources/v2/persons/" + phone + "/accounts"); - string rubles = Regex.Match(response, "\"balance\":{\"amount\":(.*),\"currency\":643}").Groups[1].Value; - if (rubles != "") - { - rubles = rubles.Replace(".", ",").Replace(" ", ""); - double rub = double.Parse(rubles); - return rub; - } - else - return 0.0; - } - } - public double USD(string phone) - { - using (WebClient wc = new WebClient()) - { - wc.Headers.Set("authorization", "Bearer " + this.token); - string response = wc.DownloadString("https://edge.qiwi.com/funding-sources/v2/persons/" + phone + "/accounts"); - //Console.WriteLine(response); - string usds = Regex.Match(response, "{\"alias\":\"qw_wallet_usd\",\"fsAlias\":\"qb_wallet\",\"bankAlias\":\"QIWI\",\"title\":\"Qiwi Account\",\"type\":{\"id\":\"WALLET\",\"title\":\"Visa QIWI Wallet\"},\"hasBalance\":(.*),\"balance\":{\"amount\":(.*),\"currency\":840},\"currency\":840,\"defaultAccount\":(.*)}").Groups[2].Value; - //Console.WriteLine("Доларров: " + usds); - if (usds != "") - { - usds = usds.Replace(" ", "").Replace(".", ","); - //Console.WriteLine("Доларров: " + usds); - double usd = double.Parse(usds); - return usd; - } - else - return 0.0; - } - return 0.0; - } - } - - } - public class Donation - { - private string token; - private List> onDonation { get; set; } - public Donation(string token, List> onDonation) - { - this.token = token; - this.onDonation = onDonation; - StartAsync(); - } - public Donation(string token, Action onDonation) - { - this.token = token; - this.onDonation = new List>(); - this.onDonation.Add(onDonation); - StartAsync(); - } - private void StartAsync() - { - ServicePointManager.Expect100Continue = true; - ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; - Task.Factory.StartNew(() => - { - while (true) - { - using (WebClient wc = new WebClient()) - { - wc.Encoding = Encoding.UTF8; - string response = wc.DownloadString("https://donate.qiwi.com/api/stream/v1/widgets/" + token + "/events?&limit=1"); - - string type = Regex.Match(response, "\"type\":\"(.*)\",\"status\":\"(.*)\"").Groups[1].Value; - if (type == "DONATION") - { - string nickname = Regex.Match(response, "\"DONATION_SENDER\":\"(.*)\",\"DONATION_AMOUNT\"").Groups[1].Value; - string ammountst = Regex.Match(response, "\"DONATION_AMOUNT\":(.*)},\"voteResults\"").Groups[1].Value; - double ammount = 0; - if (ammountst != "") - { - ammountst = ammountst.Replace(".", ",").Replace(" ", ""); - ammount = double.Parse(ammountst); - } - string currency = Regex.Match(response, "\"DONATION_CURRENCY\":\"(.*)\",\"DONATION_SENDER\"").Groups[1].Value; - string message = Regex.Match(response, "\"DONATION_MESSAGE\":\"(.*)\",\"DONATION_CURRENCY\":\"(.*)\"").Groups[1].Value; - if (nickname != "") - { - foreach (Action action in onDonation) - { - action(nickname, ammount, currency, message); - } - } - } - } - } - }); - } - } -} diff --git a/MinecraftClient/config/ChatBots/SugarCaneFarmer.cs b/MinecraftClient/config/ChatBots/SugarCaneFarmer.cs deleted file mode 100644 index 9b670b4864..0000000000 --- a/MinecraftClient/config/ChatBots/SugarCaneFarmer.cs +++ /dev/null @@ -1,261 +0,0 @@ -//MCCScript 1.0 -//using MinecraftClient.Inventory; -//using MinecraftClient.Mapping; -//using MinecraftClient.Scripting; -//using System.Collections.Generic; -//using System.Threading; -//using System; -//using Brigadier.NET.Builder; -//using MinecraftClient.CommandHandler.Patch; -//using Brigadier.NET; -//using MinecraftClient.CommandHandler; -//using System.Linq; - -MCC.LoadBot(new SugarCaneFarmer()); - -//MCCScript Extensions - -class SugarCaneFarmerBase : ChatBot -{ - /// - /// MoveToLocation() + waiting until the bot is near the location. - /// - /// Location to walk to - /// Distance of blocks from the goal that is accepted as "arrived" - /// True if walking was successful - public bool WaitForMoveToLocation(Location pos, float tolerance = 2f) - { - if (MoveToLocation(new Location(pos.X, pos.Y, pos.Z))) - { - while (GetCurrentLocation().Distance(pos) > tolerance) - { - Thread.Sleep(200); - } - return true; - } - else - { - return false; - } - } - - /// - /// DigBlock + waiting until the block is broken - /// - /// Location of the block that should be broken - /// Switch to the correct tool, if it is in hotbar - /// Minimum time until the client gives up - /// True if mining was successful - public bool WaitForDigBlock(Location block, bool useCorrectTool = false, int digTimeout = 1000) - { - if (Material2Tool.IsUnbreakable(GetWorld().GetBlock(block).Type)) - return false; - - if (useCorrectTool && GetInventoryEnabled()) - { - // Search this tool in hotbar and select the correct slot - SelectCorrectSlotInHotbar( - // Returns the correct tool for this type - Material2Tool.GetCorrectToolForBlock( - // returns the type of the current block - GetWorld().GetBlock(block).Type)); - } - - // Unable to check when breaking is over. - if (DigBlock(block)) - { - short i = 0; // Maximum wait time of 10 sec. - while (GetWorld().GetBlock(block).Type != Material.Air && i <= digTimeout) - { - Thread.Sleep(100); - i++; - } - return i <= digTimeout; - } - else - { - return false; - } - } - - /// - /// Selects the corect tool in the hotbar - /// - /// List of tools that can be applied to mine a block - public void SelectCorrectSlotInHotbar(ItemType[] tools) - { - if (GetInventoryEnabled()) - { - foreach (ItemType tool in tools) - { - int[] tempArray = GetPlayerInventory().SearchItem(tool); - // Check whether an item could be found and make sure that it is in - // a hotbar slot (36-44). - if (tempArray.Length > 0 && tempArray[0] > 35) - { - // Changeslot takes numbers from 0-8 - ChangeSlot(Convert.ToInt16(tempArray[0] - 36)); - break; - } - } - } - else - { - LogToConsole("Activate Inventory Handling."); - } - } - - /// - /// Returns the head position from the current location - /// - public static Func GetHeadLocation = locFeet => new Location(locFeet.X, locFeet.Y + 1, locFeet.Z); -} - -class SugarCaneFarmer : SugarCaneFarmerBase -{ - public const string CommandName = "sugarcane"; - - public enum CoordinateType { X, Y, Z }; - - /// - /// Used to stop the farming process on demand. - /// - private bool farming = true; - - /// - /// Returns all sugar canes that are above a solid block and another sugar cane - /// - /// Radius of the search - /// Order of the returned sugar canes - /// list of sugar canes, sorted after given parameter - private List collectSugarCaneBlocks(int radius, CoordinateType coordinateOrder = CoordinateType.X) - { - IEnumerable breakingCoordinates = GetWorld().FindBlock( - new Location(Math.Floor(GetCurrentLocation().X), Math.Floor(GetCurrentLocation().Y), Math.Floor(GetCurrentLocation().Z)), - Material.SugarCane, radius).Where(block => - GetWorld().GetBlock(new Location(block.X, block.Y - 1, block.Z)).Type == Material.SugarCane && - GetWorld().GetBlock(new Location(block.X, block.Y - 2, block.Z)).Type.IsSolid()); - - switch (coordinateOrder) - { - case CoordinateType.Z: - return breakingCoordinates.OrderBy(coordinate => coordinate.Z).ToList(); - case CoordinateType.Y: - return breakingCoordinates.OrderBy(coordinate => coordinate.Y).ToList(); - default: - return breakingCoordinates.OrderBy(coordinate => coordinate.X).ToList(); - } - } - - public override void Initialize() - { - LogToConsole("Sugar Cane farming bot created by Daenges."); - - McClient.dispatcher.Register(l => l.Literal(CommandName) - .Then(l => l.Argument("Commands", Arguments.GreedyString()) - .Executes(r => { - CommandHandler(Arguments.GetString(r, "Commands").Split(' ', StringSplitOptions.TrimEntries)); - return r.Source.SetAndReturn(CmdResult.Status.Done); - })) - ); - } - - public override void OnUnload() - { - McClient.dispatcher.Unregister(CommandName); - } - - /// - /// Start the farming process - /// - /// Range of farming - /// In which order the plants should be farmed - private void startBot(int range, CoordinateType sortOrder) - { - List sugarCanePositions; - - // create a loop so the bot keeps farming if nothing else is stated - // uses the same range as initially given - do - { - sugarCanePositions = collectSugarCaneBlocks(range, sortOrder); - - LogToConsole(string.Format("Found: {0} Sugar Cane", sugarCanePositions.Count)); - - if (sugarCanePositions.Count > 0) - { - foreach (Location loc in sugarCanePositions) - { - if (!farming) - break; - - if (GetHeadLocation(GetCurrentLocation()).Distance(loc) > 5) - { - if (!WaitForMoveToLocation(new Location(loc.X, loc.Y - 1, loc.Z))) - { - LogToConsole("Moving failed."); - continue; - } - } - - if (!WaitForDigBlock(new Location(loc.X, loc.Y, loc.Z))) - LogDebugToConsole("Unable to break this block: " + loc.ToString()); - } - } - else { LogToConsole("Nothing found. Stop farming..."); } - - if (farming && sugarCanePositions.Count > 0) - LogToConsole("Finished farming. Searching for further work... Use '/sugarcane stop' to stop farming."); - - } while (farming && sugarCanePositions.Count > 0); - - farming = true; - LogToConsole("[FARMING STOPPED]"); - } - - private string CommandHandler(string[] args) - { - if (args.Length == 1) - { - if (args[0] == "stop") - { - farming = false; - return "Stop farming..."; - } - else - { - int range; - - try { range = Convert.ToInt32(args[0]); } - catch (Exception) { return "Range must be a number"; } - - Thread workThread = new Thread(() => startBot(range, CoordinateType.X)); - workThread.Start(); - - return "Start farming."; - } - } - else if (args.Length == 2) - { - int range; - - try { range = Convert.ToInt32(args[0]); } - catch (Exception) { return "Range must be a number"; } - - Thread workThread; - - if (args[1].ToLower() == "x") - workThread = new Thread(() => startBot(range, CoordinateType.X)); - else if (args[1].ToLower() == "y") - workThread = new Thread(() => startBot(range, CoordinateType.Y)); - else - workThread = new Thread(() => startBot(range, CoordinateType.Z)); - - workThread.Start(); - - return "Start farming."; - } - else - return "Usage: /sugarcane [range x|y|z]/[stop]"; - } -} diff --git a/MinecraftClient/config/ChatBots/SugarCaneMiner.cs b/MinecraftClient/config/ChatBots/SugarCaneMiner.cs deleted file mode 100644 index 2bdb391366..0000000000 --- a/MinecraftClient/config/ChatBots/SugarCaneMiner.cs +++ /dev/null @@ -1,53 +0,0 @@ -//MCCScript 1.0 - -//using MinecraftClient.CommandHandler; -//using MinecraftClient.Mapping; -//using MinecraftClient.Scripting; - -MCC.LoadBot(new SugarCaneMiner()); - -//MCCScript Extensions - -public class SugarCaneMiner : ChatBot -{ - // === CONFIG - REPLACE SURGAR CANE LOCATION x y z VALUES HERE === - // You need to stand in front of the sugar cane - Location sugarCane = new Location(x, y, z); - bool fullHeight = true; - // === END OF CONFIG === - - public override void Initialize() - { - LogToConsole("Bot enabled!"); - } - - public override void Update() - { - if (DetectSugarCane(sugarCane, fullHeight)) - { - DigBlock(sugarCane); - } - } - - public bool DetectSugarCane(Location sugarCaneLoc, bool fullHeight) - { - Material blockType = GetWorld().GetBlock(sugarCaneLoc).Type; - if (blockType == Material.SugarCane) - { - blockType = GetWorld().GetBlock(new Location(sugarCaneLoc.X, sugarCaneLoc.Y - 1, sugarCaneLoc.Z)).Type; - if (blockType == Material.SugarCane) - { - blockType = GetWorld().GetBlock(new Location(sugarCaneLoc.X, sugarCaneLoc.Y - 2, sugarCaneLoc.Z)).Type; - if (blockType != Material.SugarCane) - { - if (!fullHeight) - return true; - blockType = GetWorld().GetBlock(new Location(sugarCaneLoc.X, sugarCaneLoc.Y + 1, sugarCaneLoc.Z)).Type; - if (blockType == Material.SugarCane) - return true; - } - } - } - return false; - } -} diff --git a/MinecraftClient/config/ChatBots/TreeFarmer.cs b/MinecraftClient/config/ChatBots/TreeFarmer.cs deleted file mode 100644 index f19975a781..0000000000 --- a/MinecraftClient/config/ChatBots/TreeFarmer.cs +++ /dev/null @@ -1,64 +0,0 @@ -//MCCScript 1.0 - -//using MinecraftClient.CommandHandler; -//using MinecraftClient.Mapping; -//using MinecraftClient.Scripting; -//using System.Threading; - -MCC.LoadBot(new TreeFarmer()); - -//MCCScript Extensions - -public class TreeFarmer : ChatBot -{ - // You need to stand in front of the sapling and put items in your inventory hotbar: - // - First slot on the left (Slot 0): Axe for digging the tree - // - Second slot on the left (Slot 1): Sapling stack for planting the tree - // Then set sapling location below, login with MCC and load this script - - // === CONFIG - REPLACE SAPLING LOCATION x y z VALUES HERE === - Location sapling = new Location(x, y, z); - // === END OF CONFIG === - - public override void Update() - { - Material blockType = GetWorld().GetBlock(sapling).Type; - switch (blockType) - { - case Material.OakSapling: - // Still a sapling, nothing to do - break; - case Material.OakLog: - // Tree has grown, dig 4 blocks - ChangeSlot(0); - DigBlock(sapling); - Thread.Sleep(100); - // 1 - DigBlock(new Location(sapling.X, sapling.Y + 1, sapling.Z)); - Thread.Sleep(100); - // 2 - DigBlock(new Location(sapling.X, sapling.Y + 2, sapling.Z)); - Thread.Sleep(100); - // 3 - DigBlock(new Location(sapling.X, sapling.Y + 3, sapling.Z)); - Thread.Sleep(100); - // 4 - DigBlock(new Location(sapling.X, sapling.Y + 4, sapling.Z)); - Thread.Sleep(100); - break; - case Material.Air: - // No tree, plant something - ChangeSlot(1); - SendPlaceBlock(sapling, Direction.Up); - break; - default: - // Other block, cannot grow trees here - LogToConsole("Block at " + sapling + " is not a sapling: " + blockType + "..."); - break; - } - } - public override void Initialize() - { - - } -} diff --git a/MinecraftClient/config/ChatBots/VkMessager.cs b/MinecraftClient/config/ChatBots/VkMessager.cs deleted file mode 100644 index f57b2efa7e..0000000000 --- a/MinecraftClient/config/ChatBots/VkMessager.cs +++ /dev/null @@ -1,497 +0,0 @@ -//MCCScript 1.0 -//using System.Threading.Tasks; -//dll Newtonsoft.Json.dll -//using Newtonsoft.Json; -//using Newtonsoft.Json.Linq; -//using Brigadier.NET; -//using MinecraftClient.CommandHandler; -//using MinecraftClient.Scripting; -//using MinecraftClient; -//using Newtonsoft.Json.Linq; -//using Newtonsoft.Json; -//using System.Collections.Generic; -//using System.Net; -//using System.Text.RegularExpressions; -//using System.Text; -//using System.Threading.Tasks; -//using System; -//using System.Linq; - -//==== INFO START ==== -// Download Newtonsoft.Json.dll and install it into the program folder Link: https://www.newtonsoft.com/json -//==== INFO END ==== - -//==== CONFIG START ==== -string vkToken = ""; -string chatId = ""; -string botCommunityId = ""; -//==== CONFIG END ==== - -MCC.LoadBot(new VkMessager(vkToken, chatId, botCommunityId)); - -//MCCScript Extensions - -/// -/// This bot forwarding messages between Minecraft and VKonrakte chats. -/// Shares only messages that starts with dot ("."). Example: .Hello! -/// -/// Needs: -/// - VK Community token (also LongPool API with NewMessageEvent, api >= 5.80), -/// - VK ChatId (typically 2000000001, etc.) -/// - Bot's CommunityId -/// -public class VkMessager : ChatBot -{ - private VkLongPoolClient VkLongPoolClient { get; set; } - private readonly string ChatId; - - public VkMessager(string vkToken, string chatId, string botCommunityId) - { - VkLongPoolClient = new VkLongPoolClient(vkToken, botCommunityId, ProcessMsgFromVk); - ChatId = chatId; - } - - public override void Initialize() - { - LogToConsole("Bot enabled!"); - } - - public override void GetText(string text) - { - // Here you can process a message coming from the Minecraft chat - // Example below: Forward a message to VKonrakte if it starts with a dot - - string message = ""; - string username = ""; - text = GetVerbatim(text); - - if (IsChatMessage(GetVerbatim(text), ref message, ref username) && message.StartsWith(".")) - { - this.VkLongPoolClient.Messages_Send_Text(this.ChatId, text); - } - } - - private void ProcessMsgFromVk(string senderId, string peer_id, string text, string conversation_message_id, string id, string event_id) - { - // Here you can process a message coming from VKonrakte - // Example below: Forward a message to Minecraft if it starts wit a dot - - if (text.StartsWith(".")) - { - SendText(text); - } - } -} - -/// -/// Client for VK Community (bot) LongPool API. -/// Also can send messages. -/// -internal class VkLongPoolClient -{ - /* VK Client*/ - public VkLongPoolClient(string token, string botCommunityId, Action onMessageReceivedCallback, IWebProxy webProxy = null) - { - Token = token; - BotCommunityId = botCommunityId; - OnMessageReceivedCallback = onMessageReceivedCallback; - ReceiverWebClient = new WebClient() { Proxy = webProxy, Encoding = Encoding.UTF8 }; - SenderWebClient = new WebClient() { Proxy = webProxy, Encoding = Encoding.UTF8 }; - - Init(); - StartLongPoolAsync(); - } - - private WebClient ReceiverWebClient { get; set; } - private WebClient SenderWebClient { get; set; } - private string Token { get; set; } - private int LastTs { get; set; } - private string Server { get; set; } - private string Key { get; set; } - private Action OnMessageReceivedCallback { get; set; } - private string BotCommunityId { get; set; } - private Random rnd = new Random(); - - /* Utils */ - public string Utils_GetShortLink(string url) - { - if (Uri.IsWellFormedUriString(url, UriKind.Absolute)) - { - string json = CallVkMethod("utils.getShortLink", "url=" + url); - var j = JsonConvert.DeserializeObject(json) as JObject; - var link = j["response"]["short_url"].ToString(); - if (link == "") - return Utils_GetShortLink(url); - else - return link; - } - else - return "Invalid link format"; - } - - /* Docs */ - public string Docs_GetMessagesUploadServer(string peer_id, string type, string file) - { - string string1 = CallVkMethod("docs.getMessagesUploadServer", "peer_id=" + peer_id + "&type=" + type); - if (string1 != "") - { - string uploadurl = Regex.Match(string1, "\"upload_url\":\"(.*)\"").Groups[1].Value.Replace(@"\/", "/"); - return uploadurl; - } - else - return Docs_GetMessagesUploadServer(peer_id, type, file); - } - - public string Docs_Upload(string url, string file) - { - var c = new WebClient(); - var r2 = Encoding.UTF8.GetString(c.UploadFile(url, "POST", file)); - if (r2 != "") return r2; - else return Docs_Upload(url, file); - } - - public string Docs_Save(string file, string title) - { - var j2 = JsonConvert.DeserializeObject(file) as JObject; - if (j2 != null) - { - string json = CallVkMethod("docs.save", "&file=" + j2["file"].ToString() + "&title=" + title); - if (json != "") - return json; - else return ""; - } - else return ""; - } - - public string Docs_Get_Send_Attachment(string file) - { - var j3 = JsonConvert.DeserializeObject(file) as JObject; - var at = "doc" + j3["response"]["doc"]["owner_id"].ToString() + "_" + j3["response"]["doc"]["id"].ToString(); - return at; - } - - /* Groups */ - public void Groups_Online(bool enable = true) - { - if (enable) - CallVkMethod("groups.enableOnline", "group_id=" + BotCommunityId); - else - CallVkMethod("groups.disableOnline", "group_id=" + BotCommunityId); - } - - public string Groups_GetById_GetName(string group_id) - { - try - { - string js = CallVkMethod("groups.getById", "group_id=" + group_id); - if (js != "") - { - var j3 = JsonConvert.DeserializeObject(js) as JObject; - string name = j3["response"][0]["name"].ToString(); - return name; - } - else return ""; - } - catch { return ""; } - } - - /* Messages */ - public void Messages_Kick_Group(string chat_id, string user_id) - { - if (user_id != BotCommunityId) - { - string json = CallVkMethod("messages.removeChatUser", "chat_id=" + chat_id + "&member_id=" + "-" + user_id); - } - } - - public void Messages_Kick_User(string chat_id, string user_id) - { - string json = CallVkMethod("messages.removeChatUser", "chat_id=" + chat_id + "&user_id=" + user_id + "&member_id=" + user_id); - } - - public void Messages_SetActivity(string chatId, string type = "typing") - { - string id3 = chatId; - id3 = id3.Substring(1); - int ind = Convert.ToInt32(id3); - CallVkMethod("messages.setActivity", "user_id=" + BotCommunityId + "&peer_id=" + chatId + "&group_id=" + "&type=" + type + "&group_id=" + BotCommunityId); - CallVkMethod("messages.setActivity", "user_id=" + BotCommunityId + "&peer_id=" + ind + "&type=" + type + "&group_id=" + BotCommunityId); - } - - public string Messages_GetInviteLink(string chatId, bool reset) - { - try - { - string json = CallVkMethod("messages.getInviteLink", "peer_id=" + chatId + "&group_id=" + BotCommunityId); - if (json != "") - { - var j = JsonConvert.DeserializeObject(json) as JObject; - var link = j["response"]["link"].ToString(); - return link; - } - return ""; - } - catch { return ""; } - } - - /* Users */ - public string Users_Get_First_Name(string user_id, string name_case = "nom") - { - try - { - string json = CallVkMethod("users.get", "user_ids=" + user_id + "&name_case=" + name_case); - if (json != "") - { - var firstname = Regex.Match(json, "{\"first_name\":\"(.*)\",\"id\":(.*)").Groups[1].Value; - return firstname; - } - return ""; - } - catch { return ""; } - } - - public string Users_Get_Last_Name(string user_id) - { - try - { - string json = CallVkMethod("users.get", "user_ids=" + user_id); - if (json != "") - { - var firstname = Regex.Match(json, "\"id\":(.*),\"last_name\":\"(.*)\",\"can_access_closed\":(.*)").Groups[2].Value; - return firstname; - } - return ""; - } - catch { return ""; } - } - - /* Messages Send */ - public void Messages_Send_Text(string chatId, string text, int disable_mentions = 0) - { - string reply = CallVkMethod("messages.send", "peer_id=" + chatId + "&random_id=" + rnd.Next() + "&message=" + text + "&disable_mentions=" + disable_mentions); - } - - public void Messages_Send_Keyboard(string chatId, Keyboard keyboard) - { - string kb = keyboard.GetKeyboard(); - string reply = CallVkMethod("messages.send", "peer_id=" + chatId + "&random_id=" + rnd.Next() + "&keyboard=" + kb); - } - - public void Messages_Send_TextAndKeyboard(string chatId, string text, Keyboard keyboard) - { - string kb = keyboard.GetKeyboard(); - string reply = CallVkMethod("messages.send", "peer_id=" + chatId + "&random_id=" + rnd.Next() + "&message=" + text + "&keyboard=" + kb); - } - - public void Messages_Send_Sticker(string chatId, int sticker_id) - { - string reply = CallVkMethod("messages.send", "peer_id=" + chatId + "&random_id=" + rnd.Next() + "&sticker_id=" + sticker_id); - } - - public void Messages_Send_TextAndDocument(string chatId, string text, string file, string title) - { - string u2 = Docs_GetMessagesUploadServer(chatId, "doc", file); - string r2 = Docs_Upload(u2, file); - string r3 = Docs_Save(r2, title); - string at = Docs_Get_Send_Attachment(r3); - string reply = CallVkMethod("messages.send", "peer_id=" + chatId + "&random_id=" + rnd.Next() + "&message=" + text + "&attachment=" + at); - } - - public void Messages_Send_Custom(string chatId, string custom) - { - string reply = CallVkMethod("messages.send", "peer_id=" + chatId + "&random_id=" + rnd.Next() + custom); - } - - /* Messages GetConversationMembers*/ - public int Messages_GetConversationMembers_GetCount(string chatId) - { - var json = CallVkMethod("messages.getConversationMembers", "peer_id=" + chatId + "&group_id=" + BotCommunityId); - if (json != "") - { - var j = JsonConvert.DeserializeObject(json) as JObject; - int u2 = int.Parse(j["response"]["count"].ToString()); - return u2; - } - else return -1; - } - - public string Messages_GetConversationMembers_GetProfiles(string chatId) - { - var json = CallVkMethod("messages.getConversationMembers", "peer_id=" + chatId + "&group_id=" + BotCommunityId); - if (json != "") - { - string ids = ""; - JObject json1 = JObject.Parse(json); - IList results = json1["response"]["profiles"].Children().ToList(); - foreach (JToken result in results) - { - string id = result["id"].ToString(); - if (!id.Contains("-")) - ids += id + ", "; - } - return ids; - } - return ""; - } - - public string Messages_GetConversationMembers_GetItems_member_id(string chatId) - { - var json = CallVkMethod("messages.getConversationMembers", "peer_id=" + chatId + "&group_id=" + BotCommunityId); - if (json != "") - { - string ids = ""; - JObject json1 = JObject.Parse(json); - IList results = json1["response"]["items"].Children().ToList(); - foreach (JToken result in results) - { - string id = result["member_id"].ToString(); - if (!id.Contains("-")) - ids += id + ", "; - } - return ids; - } - return ""; - } - - public class Keyboard - { - public enum Color - { - Negative, - Positive, - Primary, - Secondary - } - - public bool one_time = false; - public List> buttons = new List>(); - public bool inline = false; - - public Keyboard(bool one_time2, bool line = false) - { - if (line == true && one_time2 == true) - one_time2 = false; - one_time = one_time2; - inline = line; - } - - public void AddButton(string label, string payload, Color color) - { - string color2 = ""; - if (color == Color.Negative) - color2 = "Negative"; - else if (color == Color.Positive) - color2 = "Positive"; - else if (color == Color.Primary) - color2 = "Primary"; - else - color2 = "Secondary"; - Buttons button = new Buttons(label, payload, color2); - buttons.Add(new List() { button }); - } - - public string GetKeyboard() - { - return JsonConvert.SerializeObject(this, Formatting.Indented); ; - } - - public class Buttons - { - public Action action; - public string color; - public Buttons(string labe11, string payload1, string color2) - { - action = new Action(labe11, payload1); - color = color2; - } - - public class Action - { - public string type; - public string payload; - public string label; - public Action(string label3, string payload3) - { - type = "text"; - payload = "{\"button\": \"" + payload3 + "\"}"; - label = label3; - } - } - } - } - - /* LoongPool */ - private void Init() - { - var jsonResult = CallVkMethod("groups.getLongPollServer", "group_id=" + BotCommunityId); - var data = Json.ParseJson(jsonResult); - - Key = data!["response"]!["key"]!.GetStringValue(); - Server = data["response"]!["server"]!.GetStringValue(); - LastTs = Convert.ToInt32(data["response"]!["ts"].GetStringValue()); - } - - private void StartLongPoolAsync() - { - Task.Factory.StartNew(() => - { - while (true) - { - try - { - string baseUrl = String.Format("{0}?act=a_check&version=2&wait=25&key={1}&ts=", Server, Key); - var data = ReceiverWebClient.DownloadString(baseUrl + LastTs); - var messages = ProcessResponse(data); - - foreach (var message in messages) - { - OnMessageReceivedCallback(message.Item1, message.Item2, message.Item3, message.Item4, message.Item5, message.Item6); - } - } - catch { } - } - }); - } - - private IEnumerable> ProcessResponse(string jsonData) - { - var j = JsonConvert.DeserializeObject(jsonData) as JObject; - var data = Json.ParseJson(jsonData); - if (data?.AsObject().ContainsKey("failed") == true) - { - Init(); - } - LastTs = Convert.ToInt32(data!["ts"].GetStringValue()); - var updates = data["updates"]!.AsArray(); - List> messages = new List>(); - foreach (var str in updates) - { - if (str!["type"]!.GetStringValue() != "message_new") continue; - - var msgData = str["object"]!.AsObject(); - - var id = msgData["from_id"]!.GetStringValue(); - var userId = msgData["from_id"]!.GetStringValue(); - var peer_id = msgData["peer_id"]!.GetStringValue(); - string event_id = ""; - var msgText = msgData["text"]!.GetStringValue(); - var conversation_message_id = msgData["conversation_message_id"]!.GetStringValue(); - - messages.Add(new Tuple(userId, peer_id, msgText, conversation_message_id, id, event_id)); - } - - return messages; - } - - public string CallVkMethod(string methodName, string data) - { - try - { - var url = String.Format("https://api.vk.com/method/{0}?v=5.124&access_token={1}&{2}", methodName, Token, data); - var jsonResult = SenderWebClient.DownloadString(url); - - return jsonResult; - } - catch { return String.Empty; } - } -} diff --git a/MinecraftClient/config/ChatBots/WebSocketBot.cs b/MinecraftClient/config/ChatBots/WebSocketBot.cs deleted file mode 100644 index 4983aeb88c..0000000000 --- a/MinecraftClient/config/ChatBots/WebSocketBot.cs +++ /dev/null @@ -1,1188 +0,0 @@ -//MCCScript 1.0 -//using System.Collections.Concurrent; -//using System.Net.Sockets; -//using System.Net.WebSockets; -//using System.Text.Json; -//using System.Text.Json.Serialization; -//using System.Threading.Tasks; -//using MinecraftClient.CommandHandler; - -// IMPORTANT: Change the password below before use! -MCC.LoadBot(new WebSocketBot("127.0.0.1", 8043, "CHANGE_THIS_PASSWORD")); - -//MCCScript Extensions - -public class WebSocketSession -{ - public string SessionId { get; set; } - public WebSocket WebSocket { get; } - public bool IsAuthenticated { get; set; } - - public WebSocketSession(string sessionId, WebSocket webSocket) - { - SessionId = sessionId; - WebSocket = webSocket; - IsAuthenticated = false; - } -} - -public class WebSocketServer -{ - private HttpListener? _listener; - private CancellationTokenSource? _cts; - private readonly ConcurrentDictionary _sessions = new(); - - public event Action? NewSession; - public event Action? SessionDropped; - public event Action? MessageReceived; - - public IReadOnlyDictionary Sessions => _sessions; - - public async Task Start(string ip, int port) - { - _cts = new CancellationTokenSource(); - _listener = new HttpListener(); - _listener.Prefixes.Add($"http://{ip}:{port}/"); - _listener.Start(); - - while (!_cts.Token.IsCancellationRequested) - { - try - { - var context = await _listener.GetContextAsync().ConfigureAwait(false); - - if (context.Request.IsWebSocketRequest) - _ = Task.Run(() => ProcessWebSocketSession(context, _cts.Token)); - else - { - context.Response.StatusCode = 400; - context.Response.Close(); - } - } - catch (ObjectDisposedException) { break; } - catch (HttpListenerException) { break; } - catch { /* ignore transient errors */ } - } - } - - private async Task ProcessWebSocketSession(HttpListenerContext context, CancellationToken ct) - { - WebSocketContext wsContext; - try - { - wsContext = await context.AcceptWebSocketAsync(null).ConfigureAwait(false); - } - catch { return; } - - var ws = wsContext.WebSocket; - var sessionId = Guid.NewGuid().ToString("D"); - var session = new WebSocketSession(sessionId, ws); - - _sessions.TryAdd(sessionId, session); - NewSession?.Invoke(sessionId, session); - - var buffer = new byte[4096]; - var messageBuffer = new List(); - - try - { - while (ws.State == WebSocketState.Open && !ct.IsCancellationRequested) - { - var result = await ws.ReceiveAsync(new ArraySegment(buffer), ct).ConfigureAwait(false); - - if (result.MessageType == WebSocketMessageType.Close) - break; - - messageBuffer.AddRange(new ArraySegment(buffer, 0, result.Count)); - - if (result.EndOfMessage) - { - var message = Encoding.UTF8.GetString(messageBuffer.ToArray()); - messageBuffer.Clear(); - MessageReceived?.Invoke(session.SessionId, message); - } - } - } - catch { /* connection dropped */ } - finally - { - _sessions.TryRemove(session.SessionId, out _); - SessionDropped?.Invoke(session.SessionId); - - if (ws.State == WebSocketState.Open || ws.State == WebSocketState.CloseReceived) - { - try - { - await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "Session ended", CancellationToken.None) - .ConfigureAwait(false); - } - catch { /* best effort */ } - } - - ws.Dispose(); - } - } - - public bool RenameSession(string oldId, string newId) - { - if (!_sessions.TryRemove(oldId, out var session)) - return false; - - if (_sessions.ContainsKey(newId)) - { - _sessions.TryAdd(oldId, session); - return false; - } - - session.SessionId = newId; - _sessions.TryAdd(newId, session); - return true; - } - - public async Task SendToSession(string sessionId, string message) - { - if (!_sessions.TryGetValue(sessionId, out var session)) - return; - - if (session.WebSocket.State != WebSocketState.Open) - return; - - var bytes = Encoding.UTF8.GetBytes(message); - - try - { - await session.WebSocket.SendAsync( - new ArraySegment(bytes), - WebSocketMessageType.Text, - true, - CancellationToken.None).ConfigureAwait(false); - } - catch { /* send failed, session will be cleaned up */ } - } - - public void Stop() - { - _cts?.Cancel(); - - foreach (var kvp in _sessions) - { - try - { - var ws = kvp.Value.WebSocket; - if (ws.State == WebSocketState.Open) - ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "Server stopping", CancellationToken.None) - .GetAwaiter().GetResult(); - ws.Dispose(); - } - catch { /* best effort */ } - } - - _sessions.Clear(); - - try { _listener?.Stop(); } catch { } - try { _listener?.Close(); } catch { } - } -} - -public class WebSocketBot : ChatBot -{ - private readonly string _ip; - private readonly int _port; - private readonly string _password; - private readonly bool _debugMode; - - private WebSocketServer? _server; - private JsonSerializerOptions _jsonOptions = null!; - private readonly List _waitingEvents = new(); - private bool _gameJoined; - - private static readonly Regex Ipv4Regex = new( - @"^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.){3}(25[0-5]|(2[0-4]|1\d|[1-9]|)\d)$", - RegexOptions.Compiled); - - public WebSocketBot(string ip, int port, string password, bool debugMode = false) - { - if (!Ipv4Regex.IsMatch(ip) && ip != "+" && ip != "*") - throw new ArgumentException($"Invalid IP address: {ip}"); - - if (port is < 1 or > 65535) - throw new ArgumentException($"Invalid port: {port}. Must be between 1 and 65535."); - - _ip = ip; - _port = port; - _password = password; - _debugMode = debugMode; - } - - public override void Initialize() - { - _jsonOptions = new JsonSerializerOptions - { - PropertyNamingPolicy = JsonNamingPolicy.CamelCase, - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, - IncludeFields = true, - Converters = { new JsonStringEnumConverter() } - }; - - _server = new WebSocketServer(); - _server.NewSession += OnNewSession; - _server.SessionDropped += OnSessionDropped; - _server.MessageReceived += OnMessageReceived; - - _ = Task.Run(async () => - { - try - { - await _server.Start(_ip, _port); - } - catch (Exception ex) - { - LogToConsole($"[WebSocketBot] Server failed to start: {ex.Message}"); - } - }); - - LogToConsole($"[WebSocketBot] Starting on {_ip}:{_port}"); - } - - public override void AfterGameJoined() - { - _gameJoined = true; - _waitingEvents.Add("OnGameJoined"); - } - - public override void Update() - { - if (_waitingEvents.Count > 0) - { - var events = _waitingEvents.ToList(); - _waitingEvents.Clear(); - - foreach (var evt in events) - BroadcastEvent(evt, "N/A"); - } - } - - public override void OnUnload() - { - BroadcastEvent("OnWsConnectionClose", "N/A"); - _server?.Stop(); - } - - // --- Event Overrides --- - - public override void GetText(string text) - { - text = GetVerbatim(text); - string message = "", username = ""; - - if (IsPrivateMessage(text, ref message, ref username)) - BroadcastEvent("OnChatPrivate", SerializeData(new { sender = username, message, rawText = text })); - else if (IsChatMessage(text, ref message, ref username)) - BroadcastEvent("OnChatPublic", SerializeData(new { sender = username, message, rawText = text })); - - string tpSender = ""; - if (IsTeleportRequest(text, ref tpSender)) - BroadcastEvent("OnTeleportRequest", SerializeData(new { sender = tpSender, rawText = text })); - } - - public override void GetText(string text, string? json) - { - BroadcastEvent("OnChatRaw", SerializeData(new { text, json })); - } - - public override bool OnDisconnect(DisconnectReason reason, string message) - { - BroadcastEvent("OnDisconnect", SerializeData(new { reason = reason.ToString(), message })); - return false; - } - - public override void OnBlockBreakAnimation(Entity entity, Location location, byte stage) - { - BroadcastEvent("OnBlockBreakAnimation", SerializeData(new { entity, location, stage })); - } - - public override void OnEntityAnimation(Entity entity, byte animation) - { - BroadcastEvent("OnEntityAnimation", SerializeData(new { entity, animation })); - } - - public override void OnPlayerProperty(Dictionary prop) - { - BroadcastEvent("OnPlayerProperty", SerializeData(prop)); - } - - public override void OnServerTpsUpdate(double tps) - { - BroadcastEvent("OnServerTpsUpdate", SerializeData(new { tps })); - } - - public override void OnTimeUpdate(long worldAge, long timeOfDay) - { - BroadcastEvent("OnTimeUpdate", SerializeData(new { worldAge, timeOfDay })); - } - - public override void OnEntityMove(Entity entity) - { - BroadcastEvent("OnEntityMove", SerializeData(entity)); - } - - public override void OnInternalCommand(string commandName, string commandParams, CmdResult result) - { - BroadcastEvent("OnInternalCommand", SerializeData(new - { - commandName, - commandParams, - result = new { status = result.status.ToString(), result = result.result } - })); - } - - public override void OnEntitySpawn(Entity entity) - { - BroadcastEvent("OnEntitySpawn", SerializeData(entity)); - } - - public override void OnEntityDespawn(Entity entity) - { - BroadcastEvent("OnEntityDespawn", SerializeData(entity)); - } - - public override void OnHeldItemChange(byte slot) - { - BroadcastEvent("OnHeldItemChange", SerializeData(new { slot })); - } - - public override void OnHealthUpdate(float health, int food) - { - BroadcastEvent("OnHealthUpdate", SerializeData(new { health, food })); - } - - public override void OnExplosion(Location explode, float strength, int recordcount) - { - BroadcastEvent("OnExplosion", SerializeData(new { location = explode, strength, recordcount })); - } - - public override void OnSetExperience(float experienceBar, int level, int totalExperience) - { - BroadcastEvent("OnSetExperience", SerializeData(new { experienceBar, level, totalExperience })); - } - - public override void OnGamemodeUpdate(string playerName, Guid uuid, int gamemode) - { - BroadcastEvent("OnGamemodeUpdate", SerializeData(new { playerName, uuid, gamemode })); - } - - public override void OnLatencyUpdate(string playerName, Guid uuid, int latency) - { - BroadcastEvent("OnLatencyUpdate", SerializeData(new { playerName, uuid, latency })); - } - - public override void OnMapData(int mapId, byte scale, bool trackingPosition, bool locked, - List icons, byte columnsUpdated, byte rowsUpdated, byte mapColumnX, - byte mapRowZ, byte[]? colors) - { - BroadcastEvent("OnMapData", SerializeData(new - { - mapId, scale, trackingPosition, locked, icons, - columnsUpdated, rowsUpdated, mapColumnX, mapRowZ, - colors = colors != null ? Convert.ToBase64String(colors) : null - })); - } - - public override void OnTradeList(int windowId, List trades, VillagerInfo villagerInfo) - { - BroadcastEvent("OnTradeList", SerializeData(new { windowId, trades, villagerInfo })); - } - - public override void OnTitle(int action, string titleText, string subtitleText, - string actionBarText, int fadeIn, int stay, int fadeOut, string json) - { - BroadcastEvent("OnTitle", SerializeData(new - { - action, titleText, subtitleText, actionBarText, - fadeIn, stay, fadeOut, json - })); - } - - public override void OnEntityEquipment(Entity entity, int slot, Item? item) - { - BroadcastEvent("OnEntityEquipment", SerializeData(new { entity, slot, item })); - } - - public override void OnEntityEffect(Entity entity, Effects effect, int amplifier, int duration, byte flags) - { - BroadcastEvent("OnEntityEffect", SerializeData(new - { - entity, effect = effect.ToString(), amplifier, duration, flags - })); - } - - public override void OnScoreboardObjective(string objectiveName, byte mode, - string objectiveValue, int type, string json, int numberFormat) - { - BroadcastEvent("OnScoreboardObjective", SerializeData(new - { - objectiveName, mode, objectiveValue, type, json, numberFormat - })); - } - - public override void OnUpdateScore(string entityName, int action, string objectiveName, - string objectiveDisplayName, int value, int numberFormat) - { - BroadcastEvent("OnUpdateScore", SerializeData(new - { - entityName, action, objectiveName, objectiveDisplayName, value, numberFormat - })); - } - - public override void OnInventoryUpdate(int inventoryId) - { - BroadcastEvent("OnInventoryUpdate", SerializeData(new { inventoryId })); - } - - public override void OnInventoryOpen(int inventoryId) - { - BroadcastEvent("OnInventoryOpen", SerializeData(new { inventoryId })); - } - - public override void OnInventoryClose(int inventoryId) - { - BroadcastEvent("OnInventoryClose", SerializeData(new { inventoryId })); - } - - public override void OnPlayerJoin(Guid uuid, string name) - { - BroadcastEvent("OnPlayerJoin", SerializeData(new { uuid, name })); - } - - public override void OnPlayerLeave(Guid uuid, string? name) - { - BroadcastEvent("OnPlayerLeave", SerializeData(new { uuid, name })); - } - - public override void OnDeath() - { - BroadcastEvent("OnDeath", "N/A"); - } - - public override void OnRespawn() - { - BroadcastEvent("OnRespawn", "N/A"); - } - - public override void OnEntityHealth(Entity entity, float health) - { - BroadcastEvent("OnEntityHealth", SerializeData(new { entity, health })); - } - - public override void OnEntityMetadata(Entity entity, Dictionary metadata) - { - BroadcastEvent("OnEntityMetadata", SerializeData(new { entity, metadata })); - } - - public override void OnPlayerStatus(byte statusId) - { - BroadcastEvent("OnPlayerStatus", SerializeData(new { statusId })); - } - - public override void OnNetworkPacket(int packetID, List packetData, bool isLogin, bool isInbound) - { - BroadcastEvent("OnNetworkPacket", SerializeData(new - { - packetID, - data = Convert.ToBase64String(packetData.ToArray()), - isLogin, - isInbound - })); - } - - // --- Serialization helpers --- - - private string SerializeData(object data) - { - return JsonSerializer.Serialize(data, _jsonOptions); - } - - private void BroadcastEvent(string eventName, string data) - { - if (_server == null) return; - - var envelope = new Dictionary { ["event"] = eventName, ["data"] = data }; - var json = JsonSerializer.Serialize(envelope); - - foreach (var kvp in _server.Sessions) - { - if (!kvp.Value.IsAuthenticated) continue; - _ = _server.SendToSession(kvp.Key, json); - } - } - - private void SendSessionEvent(string sessionId, string eventName, string data) - { - if (_server == null) return; - - var envelope = new Dictionary { ["event"] = eventName, ["data"] = data }; - var json = JsonSerializer.Serialize(envelope); - - _ = _server.SendToSession(sessionId, json); - } - - // --- Session event handlers --- - - private void OnNewSession(string sessionId, WebSocketSession session) - { - if (_debugMode) - LogToConsole($"[WebSocketBot] New session: {sessionId}"); - } - - private void OnSessionDropped(string sessionId) - { - if (_debugMode) - LogToConsole($"[WebSocketBot] Session dropped: {sessionId}"); - } - - private void OnMessageReceived(string sessionId, string message) - { - if (_debugMode) - LogToConsole($"[WebSocketBot] [{sessionId}] Received: {message}"); - - if (_server == null || !_server.Sessions.TryGetValue(sessionId, out var session)) - return; - - try - { - using var doc = JsonDocument.Parse(message); - var root = doc.RootElement; - - if (root.TryGetProperty("command", out var commandElement)) - { - var command = commandElement.GetString() ?? ""; - var requestId = root.TryGetProperty("requestId", out var rid) ? rid.GetString() ?? "" : ""; - - var parameters = new List(); - if (root.TryGetProperty("parameters", out var paramsElement) && - paramsElement.ValueKind == JsonValueKind.Array) - { - foreach (var p in paramsElement.EnumerateArray()) - { - parameters.Add(p.ValueKind switch - { - JsonValueKind.String => p.GetString(), - JsonValueKind.Number => p.TryGetInt64(out var l) ? (object)l : p.GetDouble(), - JsonValueKind.True => true, - JsonValueKind.False => false, - JsonValueKind.Null => null, - _ => p.GetRawText() - }); - } - } - - HandleCommand(sessionId, session, command, requestId, parameters); - return; - } - } - catch - { - // Not valid JSON, treat as plain text - } - - HandlePlainText(sessionId, session, message); - } - - private void HandlePlainText(string sessionId, WebSocketSession session, string text) - { - if (!session.IsAuthenticated) - { - SendSessionEvent(sessionId, "OnWsCommandResponse", - SerializeData(new { success = false, message = "Not authenticated", requestId = "" })); - return; - } - - if (text.StartsWith('/')) - { - var cmd = text[1..]; - var result = new CmdResult(); - PerformInternalCommand("send " + cmd, ref result); - SendSessionEvent(sessionId, "OnMccCommandResponse", - SerializeData(new { command = cmd, status = result.status.ToString(), result = result.result ?? "" })); - } - else - { - SendText(text); - } - } - - // --- Command processing --- - - private void HandleCommand(string sessionId, WebSocketSession session, string command, - string requestId, List parameters) - { - // Protocol commands available without auth - switch (command) - { - case "Authenticate": - HandleAuthenticate(sessionId, session, requestId, parameters); - return; - case "ChangeSessionId": - HandleChangeSessionId(sessionId, session, requestId, parameters); - return; - } - - if (!session.IsAuthenticated) - { - SendCommandResponse(sessionId, requestId, false, "Not authenticated"); - return; - } - - try - { - switch (command) - { - case "LogToConsole": - LogToConsole(GetParam(parameters, 0)); - SendCommandResponse(sessionId, requestId, true); - break; - - case "LogDebugToConsole": - LogDebugToConsole(GetParam(parameters, 0)); - SendCommandResponse(sessionId, requestId, true); - break; - - case "LogToConsoleTranslated": - LogToConsoleTranslated(GetParam(parameters, 0)); - SendCommandResponse(sessionId, requestId, true); - break; - - case "LogDebugToConsoleTranslated": - LogDebugToConsoleTranslated(GetParam(parameters, 0)); - SendCommandResponse(sessionId, requestId, true); - break; - - case "ReconnectToTheServer": - { - var extra = parameters.Count > 0 ? Convert.ToInt32(parameters[0]) : 3; - var delay = parameters.Count > 1 ? Convert.ToInt32(parameters[1]) : 0; - ReconnectToTheServer(extra, delay); - SendCommandResponse(sessionId, requestId, true); - break; - } - - case "DisconnectAndExit": - SendCommandResponse(sessionId, requestId, true); - DisconnectAndExit(); - break; - - case "SendPrivateMessage": - SendPrivateMessage(GetParam(parameters, 0), GetParam(parameters, 1)); - SendCommandResponse(sessionId, requestId, true); - break; - - case "RunScript": - RunScript(GetParam(parameters, 0)); - SendCommandResponse(sessionId, requestId, true); - break; - - case "GetTerrainEnabled": - SendCommandResponse(sessionId, requestId, true, SerializeData(new { enabled = GetTerrainEnabled() })); - break; - - case "SetTerrainEnabled": - SetTerrainEnabled(GetParam(parameters, 0)); - SendCommandResponse(sessionId, requestId, true); - break; - - case "GetEntityHandlingEnabled": - SendCommandResponse(sessionId, requestId, true, - SerializeData(new { enabled = GetEntityHandlingEnabled() })); - break; - - case "Sneak": - { - var on = GetParam(parameters, 0); - var result = Sneak(on); - SendCommandResponse(sessionId, requestId, result); - break; - } - - case "SendEntityAction": - { - var actionType = ParseEnum(parameters[0]); - var result = SendEntityAction(actionType); - SendCommandResponse(sessionId, requestId, result); - break; - } - - case "DigBlock": - { - var x = Convert.ToDouble(parameters[0]); - var y = Convert.ToDouble(parameters[1]); - var z = Convert.ToDouble(parameters[2]); - var direction = parameters.Count > 3 ? ParseEnum(parameters[3]) : Direction.Down; - var loc = new Location(x, y, z); - - if (!GetTerrainEnabled()) - { - SendCommandResponse(sessionId, requestId, false, "Terrain not enabled"); - break; - } - - var current = GetCurrentLocation(); - if (current.Distance(loc) > 6.0) - { - SendCommandResponse(sessionId, requestId, false, "Block too far away (max 6 blocks)"); - break; - } - - var world = GetWorld(); - var block = world.GetBlock(loc); - if (block.Type == Material.Air) - { - SendCommandResponse(sessionId, requestId, false, "Block is air"); - break; - } - - var digResult = DigBlock(loc, direction); - SendCommandResponse(sessionId, requestId, digResult); - break; - } - - case "SetSlot": - { - var slot = Convert.ToInt32(parameters[0]); - SetSlot(slot); - SendCommandResponse(sessionId, requestId, true); - break; - } - - case "GetWorld": - { - if (!GetTerrainEnabled()) - { - SendCommandResponse(sessionId, requestId, false, "Terrain not enabled"); - break; - } - // Return basic world info rather than full world data - SendCommandResponse(sessionId, requestId, true, SerializeData(new { available = true })); - break; - } - - case "GetEntities": - { - if (!GetEntityHandlingEnabled()) - { - SendCommandResponse(sessionId, requestId, false, "Entity handling not enabled"); - break; - } - var entities = GetEntities(); - SendCommandResponse(sessionId, requestId, true, SerializeData(entities)); - break; - } - - case "GetPlayersLatency": - { - var latency = GetPlayersLatency(); - SendCommandResponse(sessionId, requestId, true, SerializeData(latency)); - break; - } - - case "GetCurrentLocation": - SendCommandResponse(sessionId, requestId, true, SerializeData(GetCurrentLocation())); - break; - - case "MoveToLocation": - { - var x = Convert.ToDouble(parameters[0]); - var y = Convert.ToDouble(parameters[1]); - var z = Convert.ToDouble(parameters[2]); - var allowUnsafe = parameters.Count > 3 && GetParam(parameters, 3); - var allowDirectTp = parameters.Count > 4 && GetParam(parameters, 4); - var maxOffset = parameters.Count > 5 ? Convert.ToInt32(parameters[5]) : 0; - var minOffset = parameters.Count > 6 ? Convert.ToInt32(parameters[6]) : 0; - var result = MoveToLocation(new Location(x, y, z), allowUnsafe, allowDirectTp, maxOffset, minOffset); - SendCommandResponse(sessionId, requestId, result); - break; - } - - case "ClientIsMoving": - SendCommandResponse(sessionId, requestId, true, - SerializeData(new { moving = ClientIsMoving() })); - break; - - case "LookAtLocation": - { - var x = Convert.ToDouble(parameters[0]); - var y = Convert.ToDouble(parameters[1]); - var z = Convert.ToDouble(parameters[2]); - LookAtLocation(new Location(x, y, z)); - SendCommandResponse(sessionId, requestId, true); - break; - } - - case "GetTimestamp": - SendCommandResponse(sessionId, requestId, true, - SerializeData(new { timestamp = GetTimestamp() })); - break; - - case "GetServerPort": - SendCommandResponse(sessionId, requestId, true, - SerializeData(new { port = GetServerPort() })); - break; - - case "GetServerHost": - SendCommandResponse(sessionId, requestId, true, - SerializeData(new { host = GetServerHost() })); - break; - - case "GetUsername": - SendCommandResponse(sessionId, requestId, true, - SerializeData(new { username = GetUsername() })); - break; - - case "GetGamemode": - SendCommandResponse(sessionId, requestId, true, - SerializeData(new { gamemode = GetGamemode() })); - break; - - case "GetYaw": - SendCommandResponse(sessionId, requestId, true, - SerializeData(new { yaw = GetYaw() })); - break; - - case "GetPitch": - SendCommandResponse(sessionId, requestId, true, - SerializeData(new { pitch = GetPitch() })); - break; - - case "GetUserUUID": - SendCommandResponse(sessionId, requestId, true, - SerializeData(new { uuid = GetUserUUID() })); - break; - - case "GetOnlinePlayers": - SendCommandResponse(sessionId, requestId, true, - SerializeData(GetOnlinePlayers())); - break; - - case "GetOnlinePlayersWithUUID": - SendCommandResponse(sessionId, requestId, true, - SerializeData(GetOnlinePlayersWithUUID())); - break; - - case "GetServerTPS": - SendCommandResponse(sessionId, requestId, true, - SerializeData(new { tps = GetServerTPS() })); - break; - - case "InteractEntity": - { - var entityId = Convert.ToInt32(parameters[0]); - var interactType = ParseEnum(parameters[1]); - var hand = parameters.Count > 2 ? ParseEnum(parameters[2]) : Hand.MainHand; - var result = InteractEntity(entityId, interactType, hand); - SendCommandResponse(sessionId, requestId, result); - break; - } - - case "CreativeGive": - { - var slot = Convert.ToInt32(parameters[0]); - var itemType = ParseEnum(parameters[1]); - var count = Convert.ToInt32(parameters[2]); - var result = CreativeGive(slot, itemType, count); - SendCommandResponse(sessionId, requestId, result); - break; - } - - case "CreativeDelete": - { - var slot = Convert.ToInt32(parameters[0]); - var result = CreativeDelete(slot); - SendCommandResponse(sessionId, requestId, result); - break; - } - - case "SendAnimation": - { - var hand = parameters.Count > 0 ? ParseEnum(parameters[0]) : Hand.MainHand; - var result = SendAnimation(hand); - SendCommandResponse(sessionId, requestId, result); - break; - } - - case "SendPlaceBlock": - { - var x = Convert.ToDouble(parameters[0]); - var y = Convert.ToDouble(parameters[1]); - var z = Convert.ToDouble(parameters[2]); - var direction = ParseEnum(parameters[3]); - var hand = parameters.Count > 4 ? ParseEnum(parameters[4]) : Hand.MainHand; - var result = SendPlaceBlock(new Location(x, y, z), direction, hand); - SendCommandResponse(sessionId, requestId, result); - break; - } - - case "UseItemInHand": - { - var result = UseItemInHand(); - SendCommandResponse(sessionId, requestId, result); - break; - } - - case "GetInventoryEnabled": - SendCommandResponse(sessionId, requestId, true, - SerializeData(new { enabled = GetInventoryEnabled() })); - break; - - case "GetPlayerInventory": - { - if (!GetInventoryEnabled()) - { - SendCommandResponse(sessionId, requestId, false, "Inventory not enabled"); - break; - } - var inv = GetPlayerInventory(); - SendCommandResponse(sessionId, requestId, true, SerializeData(inv)); - break; - } - - case "GetInventories": - { - if (!GetInventoryEnabled()) - { - SendCommandResponse(sessionId, requestId, false, "Inventory not enabled"); - break; - } - var inventories = GetInventories(); - SendCommandResponse(sessionId, requestId, true, SerializeData(inventories)); - break; - } - - case "WindowAction": - { - var inventoryId = Convert.ToInt32(parameters[0]); - var slot = Convert.ToInt32(parameters[1]); - var actionType = ParseEnum(parameters[2]); - var result = WindowAction(inventoryId, slot, actionType); - SendCommandResponse(sessionId, requestId, result); - break; - } - - case "ChangeSlot": - { - var slot = Convert.ToInt16(parameters[0]); - var result = ChangeSlot(slot); - SendCommandResponse(sessionId, requestId, result); - break; - } - - case "GetCurrentSlot": - SendCommandResponse(sessionId, requestId, true, - SerializeData(new { slot = GetCurrentSlot() })); - break; - - case "ClearInventories": - { - var result = ClearInventories(); - SendCommandResponse(sessionId, requestId, result); - break; - } - - case "UpdateSign": - { - var x = Convert.ToDouble(parameters[0]); - var y = Convert.ToDouble(parameters[1]); - var z = Convert.ToDouble(parameters[2]); - var line1 = GetParam(parameters, 3); - var line2 = GetParam(parameters, 4); - var line3 = GetParam(parameters, 5); - var line4 = GetParam(parameters, 6); - var result = UpdateSign(new Location(x, y, z), line1, line2, line3, line4); - SendCommandResponse(sessionId, requestId, result); - break; - } - - case "SelectTrade": - { - var selectedSlot = Convert.ToInt32(parameters[0]); - var result = SelectTrade(selectedSlot); - SendCommandResponse(sessionId, requestId, result); - break; - } - - case "UpdateCommandBlock": - { - var x = Convert.ToDouble(parameters[0]); - var y = Convert.ToDouble(parameters[1]); - var z = Convert.ToDouble(parameters[2]); - var cmd = GetParam(parameters, 3); - var mode = ParseEnum(parameters[4]); - var flags = ParseEnum(parameters[5]); - var result = UpdateCommandBlock(new Location(x, y, z), cmd, mode, flags); - SendCommandResponse(sessionId, requestId, result); - break; - } - - case "CloseInventory": - { - var inventoryId = Convert.ToInt32(parameters[0]); - var result = CloseInventory(inventoryId); - SendCommandResponse(sessionId, requestId, result); - break; - } - - case "GetMaxChatMessageLength": - SendCommandResponse(sessionId, requestId, true, - SerializeData(new { length = GetMaxChatMessageLength() })); - break; - - case "Respawn": - { - var result = Respawn(); - SendCommandResponse(sessionId, requestId, result); - break; - } - - case "GetProtocolVersion": - SendCommandResponse(sessionId, requestId, true, - SerializeData(new { protocolVersion = GetProtocolVersion() })); - break; - - case "GetItemTypeMappings": - { - var mappings = new Dictionary(); - foreach (ItemType value in Enum.GetValues(typeof(ItemType))) - mappings[value.ToString()] = (int)value; - SendCommandResponse(sessionId, requestId, true, SerializeData(mappings)); - break; - } - - case "GetEntityTypeMappings": - { - var mappings = new Dictionary(); - foreach (EntityType value in Enum.GetValues(typeof(EntityType))) - mappings[value.ToString()] = (int)value; - SendCommandResponse(sessionId, requestId, true, SerializeData(mappings)); - break; - } - - default: - SendCommandResponse(sessionId, requestId, false, $"Unknown command: {command}"); - break; - } - } - catch (Exception ex) - { - SendCommandResponse(sessionId, requestId, false, $"Error: {ex.Message}"); - } - } - - private void HandleAuthenticate(string sessionId, WebSocketSession session, string requestId, - List parameters) - { - if (parameters.Count == 0) - { - SendCommandResponse(sessionId, requestId, false, "Invalid password"); - return; - } - - var provided = GetParam(parameters, 0); - var expected = _password; - - // Fixed-time comparison to prevent timing attacks - var diff = provided.Length ^ expected.Length; - for (int i = 0; i < expected.Length; i++) - diff |= expected[i] ^ (i < provided.Length ? provided[i] : 0xFF); - - if (diff != 0) - { - SendCommandResponse(sessionId, requestId, false, "Invalid password"); - return; - } - - session.IsAuthenticated = true; - SendCommandResponse(sessionId, requestId, true, "Authenticated"); - } - - private void HandleChangeSessionId(string sessionId, WebSocketSession session, string requestId, - List parameters) - { - if (parameters.Count == 0) - { - SendCommandResponse(sessionId, requestId, false, "New session ID required"); - return; - } - - var newId = GetParam(parameters, 0); - if (string.IsNullOrWhiteSpace(newId)) - { - SendCommandResponse(sessionId, requestId, false, "New session ID cannot be empty"); - return; - } - - if (_server == null) - { - SendCommandResponse(sessionId, requestId, false, "Server not initialized"); - return; - } - - if (_server.RenameSession(sessionId, newId)) - SendCommandResponse(newId, requestId, true, $"Session renamed to {newId}"); - else - SendCommandResponse(sessionId, requestId, false, $"Failed to rename session to {newId}"); - } - - // --- Response helpers --- - - private void SendCommandResponse(string sessionId, string requestId, bool success, string? message = null) - { - var response = new Dictionary - { - ["success"] = success, - ["requestId"] = requestId - }; - - if (message != null) - response["message"] = message; - - SendSessionEvent(sessionId, "OnWsCommandResponse", SerializeData(response)); - } - - // --- Parsing helpers --- - - private static T ParseEnum(object? param) where T : struct, Enum - { - if (param is string s) - { - if (Enum.TryParse(s, ignoreCase: true, out var parsed)) - return parsed; - } - - try - { - var numeric = Convert.ToInt32(param); - return (T)Enum.ToObject(typeof(T), numeric); - } - catch - { - throw new ArgumentException($"Cannot parse '{param}' as {typeof(T).Name}"); - } - } - - private static T GetParam(List parameters, int index) - { - if (index >= parameters.Count) - throw new ArgumentException($"Missing parameter at index {index}"); - - var val = parameters[index]; - - if (val is T typed) - return typed; - - if (typeof(T) == typeof(bool) && val != null) - return (T)(object)Convert.ToBoolean(val); - - if (typeof(T) == typeof(string)) - return (T)(object)(val?.ToString() ?? ""); - - return (T)Convert.ChangeType(val!, typeof(T)); - } -} diff --git a/MinecraftClient/config/README.md b/MinecraftClient/config/README.md deleted file mode 100644 index b2278fe6d6..0000000000 --- a/MinecraftClient/config/README.md +++ /dev/null @@ -1,4 +0,0 @@ -Minecraft Console Client User Manual -====== - -This page has been moved to appropriate sections on our new [Documentation website](https://mccteam.github.io/guide/configuration.html). \ No newline at end of file diff --git a/MinecraftClient/config/hangman-en.txt b/MinecraftClient/config/hangman-en.txt deleted file mode 100644 index 8b63285d7d..0000000000 --- a/MinecraftClient/config/hangman-en.txt +++ /dev/null @@ -1,323 +0,0 @@ -HOUSE -BLUE -PLANE -JUKEBOX -BEE -BUILDING -AXE -SNOW -ZERO -BROWN -TELEPHONE -COMPUTER -WINDOW -SUN -LINDEN -TINTAMARRE -PROLIFIC -CLOCK -CHURCH -OFFICE -APRICOT -PLANISPHERE -WORLD MAP -FISHING -CASE -SADDLE -BAG -ROOM -PUDDING -BANANA -MANGO -KIWI -HUMMINGBIRD -BEDSIDE -ALARM -NEW -LAUNDRY -OPERATION -PRINCESS -GARDEN -DEMON -DENT -CASH -VILLAGE -ESTATE -YAK -RIVER -ISLAND -ENTRY -PALISSADE -ARBALETTE -CANDY -TAPESTRY -PAQUEBOT -PAQUERETTE -SUNFLOWER -CALENDAR -HIGHWAY -KNIFE -TORNADO -CREEK -HUNG -BROCCOLI -ARTICHOKE -MAGMA -LICHEN -CALCULATOR -DICTIONARY -SUPERETTE -PULLEY -GEAR -RAFT -BAG -SECATEUR -TIMER -HOURGLASS -SPIRIT -DRAWER -ORE -INGOT -BADGE -PILLOW -COVER -BASKET -MAIL -FRESCO -LIBRARY -TABLE -CHAIR -TILE -TOWEL -AREA -CHEST -PLUSH -TEMPLATE -PONTOON -ALMOST -WICK -PEEL -NERD -TRACTOR -AGRICULTURE -DOOR -CERF -SOURCE -FONTAINE -BOAR -DOVE -PHARAOH -ELECTRIC -NEW -PAJAMA -NEON -PEACOCK -FAWN -ACTIVITY -ENCYCLOPEDIA -MESSENGER -MICROSCOPE -TELESCOPE -TELEPHERIQUE -LOCATION -TERRIER -BOWL -PAINTING -WATERCOLOR -GROVE -GRAVEL -CANDLE -CANDLESTICK -DESTINATION -VEHICLE -EPERVIER -DART -SOFA -NARRATOR -REWARD -VICTORY -BATTLE -BLAZE -COAL -EMBER -VACHERIE -BARN -TIGRE -TOMCAT -DEFORESTATION -ELEPHANT -RADIATOR -TREASURE -GUM -TRIANGLE -PENTAGRAM -SPIRAL -BLAZON -ABACUS -SHIELD -STOOL -PUZZLE -LABYRINTH -SPACE -POSTER -CINEMA -ANTICIPATION -ASTRE -PLANET -UNIVERSE -CURIOSITY -GUIDE -VALLEY -SUMMIT -WALL -MONUMENT -PIGEON -PIANO -GUITAR -VIOLIN -VIOLET -CLARION -TRUMPET -CLAIRIERE -BUSH -FOLIAGE -ARCH -FERN -CALENDAR -THERMOMETER -PAN -CASSOULET -LADYBUG -PUCERON -ANT -DRAGONFLY -BUTTERFLY -VIEWPOINT -ERUPTION -RUDDER -SAIL -CATAMARAN -SCREEN -LIGHTNING -CLOSING -PHILOSOPHER -STAMP -ENVELOPE -POETRY -CRAFTS -TWIN -FOAL -MARE -BUCKET -WATERING -ROSIER -GARDENER -FOREST -GENDARME -DREAM -WONDER -STAR -CORAL -FAN -GOODS -LIFT -ELEVATOR -STAIRS -BALLOON -LIGHT -LAMP -PACHYDERM -WATERMELON -MELON -CEREAL -POPPY -DANDELION -GRAZING -BOOT -BATH -BANKRUPTCY -BOUQUET -SWEATER -NAIN -CUMULONIMBUS -YELLOW -WIND -ECLAT -BRIGHTNESS -DIAMOND -CRYSTAL -ROCK -CAPITAL -INVOICE -PAPER -DIARY -SCREEN -WAGON -LOCOMOTIVE -TIMER -CLOWN -SCREWDRIVER -BOWLS -PANCARTE -SHELF -WAND -DODGE -TUB -HUGE -DUNGEON -BANQUET -BOOK -BOILER -TRAIL -STABLES -WHIMSICAL -TAPAGE -PENCIL -CANYON -SAVATE -SAVANNAH -AIRPORT -QUESTION -GARLAND -INFORMATION -ARMCHAIR -CHAMPAGNE -BOTTLE -RIPPLE -WAVE -LUNCH -CULTURE -CUBE -PANEL -PAPYRUS -DIMENSION -FUNCTION -ECLUSE -PISTON -PIRATE -PEAK -FURNACE -FABULOUS -BOOKLET -MAGAZINE -STORE -RINK -LAWYER -SALAD -WOOL -MINECRAFT -CREEPER -SKELETON -GHAST -NETHER -TORCH -LANTERN -FACTION -GLOWSTONE -MINECART -CONSTRUCTION -BACTERIA -ACHIEVEMENT -HEROBRINE -NOTCH -BOW \ No newline at end of file diff --git a/MinecraftClient/config/hangman-fr.txt b/MinecraftClient/config/hangman-fr.txt deleted file mode 100644 index 65a8eecf98..0000000000 --- a/MinecraftClient/config/hangman-fr.txt +++ /dev/null @@ -1,322 +0,0 @@ -MAISON -BLEU -AVION -XYLOPHONE -ABEILLE -IMMEUBLE -GOURDIN -NEIGE -ZERO -MARRON -TELEPHONE -ORDINATEUR -FENETRE -SOLEIL -TILLEUL -TINTAMARRE -PROLIFIQUE -HORLOGE -EGLISE -BUREAU -ABRICOT -PLANISPHERE -MAPPEMONDE -PECHE -ETUI -SELLE -CABAS -MANGER -BOUDIN -BANANE -MANGUE -KIWI -COLIBRI -CHOUCROUTE -CHEVET -REVEIL -NOUVELLE -BUANDERIE -FONCTIONNEMENT -PRINCESSE -POTAGER -DEMON -DENT -CAISSE -VILLAGE -URBANISATION -YACK -RIVIERE -ILOT -ENTREE -PALISSADE -ARBALETTE -SUCRERIE -TAPISSERIE -PAQUEBOT -PAQUERETTE -TOURNESOL -CALENDRIER -AUTOROUTE -COUTEAU -TORNADE -RUISSEAU -DELTAPLANE -PARAPENTE -PENDU -BROCOLI -TOPINAMBOUR -MAGMA -LICHEN -CALCULATRICE -DICTIONNAIRE -SUPERETTE -POULIE -ENGRENAGE -RADEAU -SACOCHE -SECATEUR -CHRONOMETRE -SABLIER -ESPRIT -TIROIR -MINERAI -LINGOT -BADGE -OREILLER -COUETTE -EDREDON -CORBEILLE -COURRIER -FRESQUE -BIBLIOTHEQUE -TABLE -CHAISE -CARRELAGE -SERVIETTE -SUPERFICIE -COMMODE -PELUCHE -GABARIT -PONTON -PRESQUE -MECHE -PELURE -BALLOT -TRACTEUR -AGRICULTURE -PORTILLON -CERF -SOURCE -FONTAINE -SANGLIER -TOURTERELLE -PHARAON -ELECTRIQUE -NOUVEAUTE -PYJAMA -NEON -PAON -FAON -ACTIVITE -ENCYCLOPEDIE -MESSAGER -MICROSCOPE -TELESCOPE -TELEPHERIQUE -EMPLACEMENT -TERRIER -TERRINE -PEINTURE -AQUARELLE -BOSQUET -GRAVIER -BOUGIE -CHANDELIER -DESTINATION -VEHICULE -EPERVIER -FLECHETTE -CANAPE -NARRATEUR -RECOMPENSE -VICTOIRE -BATAILLE -BRASIER -CHARBON -BRAISE -VACHERIE -POULAILLER -TIGRE -MATOU -DEFORESTATION -ELEPHANT -RADIATEUR -TRESOR -GOMME -TRIANGLE -PENTAGRAMME -SPIRALE -BLASON -BOULIER -BOUCLIER -TABOURET -PUZZLE -LABYRINTHE -ESPACE -AFFICHE -CINEMA -ANTICIPATION -ASTRE -PLANETE -UNIVERS -CURIOSITE -GUIDE -VALLEE -SOMMET -MURAILLE -MONUMENT -PIGEON -PIANO -GUITARE -VIOLON -VIOLET -CLAIRON -TROMPETTE -CLAIRIERE -BUISSON -FEUILLAGE -VOUTE -FOUGERE -CALENDRIER -THERMOMETRE -CASSEROLE -CASSOULET -COCCINELLE -PUCERON -FOURMI -LIBELLULE -PAPILLON -MIRADOR -ERUPTION -GOUVERNAIL -VOILE -CATAMARAN -PARAVENT -PARATONNERRE -CLOTURE -PHILOSOPHE -TIMBRE -ENVELOPPE -POESIE -ARTISANAT -JUMELLES -POULAIN -JUMENT -SEAU -ARROSOIR -ROSIER -JARDINIER -FORESTIER -GENDARME -SONGE -REVE -ETOILE -CORAIL -EVENTAIL -MARCHANDISE -ELEVATEUR -ASCENSEUR -ESCALIER -MONTGOLFIERE -LUMINAIRE -LAMPADAIRE -PACHYDERME -PASTEQUE -MELON -CEREALE -COQUELICOT -PISSENLIT -PATURAGE -BOTTE -BAIGNOIRE -BANQUEROUTE -BOUQUET -CHANDAIL -NAIN -CUMULONIMBUS -JAUNE -VENT -ECLAT -ECLAIR -DIAMANT -CRISTAL -ROCHER -CAPITALE -FACTURE -FEUILLETON -JOURNAL -GRILLAGE -WAGON -LOCOMOTIVE -CHRONOMETRE -CLOWN -TOURNEVIS -PETANQUE -PANCARTE -ETAGERE -BAGUETTE -ESQUIVE -BAQUET -ENORME -DONJON -BANQUET -CARNET -CHAUDIERE -SENTIER -MANEGE -LUNATIQUE -TAPAGE -CRAYON -CANYON -SAVATE -SAVANE -AEROPORT -QUESTION -GUIRLANDE -INFORMATION -FAUTEUIL -CHAMPAGNE -BOUTEILLE -CLAPOTIS -VAGUE -DEJEUNER -CULTURE -CUBE -PANNEAU -PAPYRUS -DIMENSION -FONCTION -ECLUSE -PISTON -PIRATE -PITON -FOURNAISE -FABULEUX -BOUQUIN -MAGAZINE -MAGASIN -PATINOIRE -AVOCAT -SALADE -LAINE -MINECRAFT -CREEPER -SQUELETTE -GHAST -NETHER -LANTERNE -FACTION -GLOWSTONE -MINECART -CONSTRUCTION -BACTERIE \ No newline at end of file diff --git a/MinecraftClient/config/sample-matches.ini b/MinecraftClient/config/sample-matches.ini deleted file mode 100644 index 523e17d794..0000000000 --- a/MinecraftClient/config/sample-matches.ini +++ /dev/null @@ -1,74 +0,0 @@ -# Minecraft Console Client -# AutoRespond matches -# Example config file - -# Structure of a match: [Match] Followed by the match and action -# The match can be a simple match or an advanced regular expression -# You can use $u for username of the player triggering the match -# You can define an action if the match was in a private message -# You can define an action if the match was not sent by a player -# Regex matches are also supported eg $1, $2, $3.. in actions -# Matches can optionally be restricted to bot owners only -# Matches can have a cooldown, specified in seconds - -# When running a script from an AutoRespond match, -# additional %variables% are available from within your script: -# %match_u% will hold username of the player triggering the match -# %match_1%, %match_2%, %match_3%.. will hold regex matches - -# Simple example: Respond to a message containing a keyword - -[Match] -match=hi -action=send hi, $u! -actionprivate=send /tell $u Hello! -actionother=log detected "hi" message -ownersonly=false -cooldown=0 - -# You do not need to specify all the "action" fields -# Only one of them is required for each match - -# Advanced example: Use a regular expression -# Here a "regex" field is used instead of "match" field -# Do not use both "regex" and "match" fields... - -[Match] -regex=^.*hello ([a-zA-Z0-9_]+).*$ -action=send hello too, $1! - -# Example of using a script - -[Match] -match=dotest -action=script test - -# Example of matching a server announcement - -[Match] -match=server is restarting -actionother=script restart - -# Example of custom remote control command - -[Match] -match=gohome -actionprivate=send /home -ownersonly=true - -# Example of match with 1-minute cooldown - -[Match] -match=hello -action=send hello! -cooldown=60 - -# Example of matching colored text when "matchcolors" is set to "true" -# §a stands for green text -# List of all color codes: https://minecraft.tools/en/color-code.php -[Match] -match=§ahello -action=send Hello back! - -# Enjoy! -# - ORelio diff --git a/MinecraftClient/config/sample-script-extended.cs b/MinecraftClient/config/sample-script-extended.cs deleted file mode 100644 index bf5e7c32e3..0000000000 --- a/MinecraftClient/config/sample-script-extended.cs +++ /dev/null @@ -1,31 +0,0 @@ -//MCCScript 1.0 - -/* This script demonstrates how to use methods and arguments */ - -string text = "hello"; - -if (args.Length > 0) - text = args[0]; - -for (int i = 0; i < 5; i++) -{ - int count = MCC.GetVarAsInt("test") + 1; - MCC.SetVar("test", count); - SendHelloWorld(count, text); - SleepBetweenSends(); -} - -//MCCScript Extensions - -/* Here you can define methods for use into your script */ - -void SendHelloWorld(int count, string text) -{ - MCC.SendText("Hello World no. " + count + ": " + text); -} - -void SleepBetweenSends() -{ - MCC.LogToConsole("Sleeping for 5 seconds..."); - Thread.Sleep(5000); -} diff --git a/MinecraftClient/config/sample-script-packet-capture.cs b/MinecraftClient/config/sample-script-packet-capture.cs deleted file mode 100644 index aa8b15ff23..0000000000 --- a/MinecraftClient/config/sample-script-packet-capture.cs +++ /dev/null @@ -1,178 +0,0 @@ -//MCCScript 1.0 - -MCC.LoadBot(new PacketCadenceCaptureBot()); - -//MCCScript Extensions - -public class PacketCadenceCaptureBot : ChatBot -{ - private const int CaptureDurationSeconds = 5; - private const int CaptureDurationTicks = CaptureDurationSeconds * 20; - - private readonly Lock _countsLock = new(); - private readonly Dictionary _counts = new() - { - { "PlayerMovement", 0 }, - { "PlayerPosition", 0 }, - { "PlayerPositionAndRotation", 0 }, - { "PlayerRotation", 0 } - }; - private readonly Dictionary _rawOutgoingCounts = new(); - - private bool _captureStarted; - private bool _captureSupported; - private bool _networkPacketEventEnabled; - private int _ticksRemaining; - private int _playerMovementPacketId = -1; - private int _playerPositionPacketId = -1; - private int _playerPositionAndRotationPacketId = -1; - private int _playerRotationPacketId = -1; - private string _profileName = "unsupported"; - - public override void AfterGameJoined() - { - int protocolVersion = GetProtocolVersion(); - _captureSupported = TryConfigureProfile(protocolVersion); - - LogToConsole($"Packet cadence profile: {_profileName} (protocol v{protocolVersion})"); - - if (!_captureSupported) - { - LogToConsole("Packet cadence capture does not know the outgoing movement IDs for this protocol."); - UnloadBot(); - return; - } - - SetNetworkPacketEventEnabled(true); - _networkPacketEventEnabled = true; - - _captureStarted = true; - _ticksRemaining = CaptureDurationTicks; - LogToConsole($"Capturing outgoing movement packets for {CaptureDurationSeconds} seconds."); - } - - public override void Update() - { - if (!_captureStarted) - return; - - if (--_ticksRemaining > 0) - return; - - FinishCapture(); - } - - private void FinishCapture() - { - if (!_captureStarted) - return; - - _captureStarted = false; - - int movementCount; - int positionCount; - int positionAndRotationCount; - int rotationCount; - - lock (_countsLock) - { - movementCount = _counts["PlayerMovement"]; - positionCount = _counts["PlayerPosition"]; - positionAndRotationCount = _counts["PlayerPositionAndRotation"]; - rotationCount = _counts["PlayerRotation"]; - } - - int totalPackets = movementCount + positionCount + positionAndRotationCount + rotationCount; - - LogToConsole($"Packet cadence summary ({_profileName}): total={totalPackets}, " + - $"movement={movementCount}, position={positionCount}, " + - $"posrot={positionAndRotationCount}, rotation={rotationCount}"); - - if (totalPackets == 0) - { - string rawSummary; - lock (_countsLock) - { - var entries = new List(); - foreach (var entry in _rawOutgoingCounts.OrderBy(entry => entry.Key)) - entries.Add($"0x{entry.Key:X2}={entry.Value}"); - rawSummary = entries.Count > 0 ? string.Join(", ", entries) : "none"; - } - - LogToConsole($"Packet cadence raw outbound IDs: {rawSummary}"); - } - - UnloadBot(); - } - - public override void OnNetworkPacket(int packetID, List packetData, bool isLogin, bool isInbound) - { - if (!_captureStarted || isLogin || isInbound) - return; - - lock (_countsLock) - { - _rawOutgoingCounts.TryGetValue(packetID, out int rawCount); - _rawOutgoingCounts[packetID] = rawCount + 1; - - if (packetID == _playerMovementPacketId) - _counts["PlayerMovement"]++; - else if (packetID == _playerPositionPacketId) - _counts["PlayerPosition"]++; - else if (packetID == _playerPositionAndRotationPacketId) - _counts["PlayerPositionAndRotation"]++; - else if (packetID == _playerRotationPacketId) - _counts["PlayerRotation"]++; - } - } - - public override void OnUnload() - { - if (!_networkPacketEventEnabled) - return; - - SetNetworkPacketEventEnabled(false); - _networkPacketEventEnabled = false; - } - - private bool TryConfigureProfile(int protocolVersion) - { - switch (protocolVersion) - { - case 47: - _profileName = "1.8/1.8.9"; - _playerMovementPacketId = 0x03; - _playerPositionPacketId = 0x04; - _playerPositionAndRotationPacketId = 0x06; - _playerRotationPacketId = 0x05; - return true; - - case 766: - case 767: - case 768: - case 769: - case 770: - case 771: - case 772: - _profileName = "1.20.6-1.21.8"; - _playerMovementPacketId = 0x1D; - _playerPositionPacketId = 0x1A; - _playerPositionAndRotationPacketId = 0x1B; - _playerRotationPacketId = 0x1C; - return true; - - case 773: - case 774: - case 775: - _profileName = "1.21.9+"; - _playerMovementPacketId = 0x20; - _playerPositionPacketId = 0x1D; - _playerPositionAndRotationPacketId = 0x1E; - _playerRotationPacketId = 0x1F; - return true; - - default: - return false; - } - } -} diff --git a/MinecraftClient/config/sample-script-pm-forwarder.cs b/MinecraftClient/config/sample-script-pm-forwarder.cs deleted file mode 100644 index c131e11cbe..0000000000 --- a/MinecraftClient/config/sample-script-pm-forwarder.cs +++ /dev/null @@ -1,39 +0,0 @@ -//MCCScript 1.0 - -MCC.LoadBot(new PMForwarder()); - -//MCCScript Extensions - -/// -/// This bot can forward received PMs to other players -/// -public class PMForwarder : ChatBot -{ - private const string PMRecipientsFile = "pm-forward-to.txt"; - private string[] pmRecipients; - - public PMForwarder() - { - pmRecipients = LoadDistinctEntriesFromFile(PMRecipientsFile); - if (Settings.Bots_Owners.Count == 0) - LogToConsole("No Bot owners in Settings INI file. Unloading."); - else if (pmRecipients.Length == 0) - LogToConsole("No PM Recipients in '" + PMRecipientsFile + "'. Unloading."); - else LogToConsole(String.Format( - "Forwarding PMs from owners {0} to recipients {1}", - String.Join(", ", Settings.Bots_Owners), String.Join(", ", pmRecipients))); - } - - public override void GetText(string text) - { - text = GetVerbatim(text); - string message = "", sender = ""; - if (IsPrivateMessage(text, ref message, ref sender) && Settings.Bots_Owners.Contains(sender.ToLower().Trim())) - { - LogToConsole("Forwarding PM to " + String.Join(", ", pmRecipients)); - foreach (string recipient in pmRecipients) - SendPrivateMessage(recipient, message); - } - } -} -} diff --git a/MinecraftClient/config/sample-script-random-command.cs b/MinecraftClient/config/sample-script-random-command.cs deleted file mode 100644 index a6cced52ea..0000000000 --- a/MinecraftClient/config/sample-script-random-command.cs +++ /dev/null @@ -1,11 +0,0 @@ -//MCCScript 1.0 - -string[] commands = new[] { - "send command1", - "send command2", - "send command3" -}; - -int randomIndex = new Random().Next(0, commands.Length); -string randomCommand = commands[randomIndex]; -MCC.PerformInternalCommand(randomCommand); diff --git a/MinecraftClient/config/sample-script-tick-counter.cs b/MinecraftClient/config/sample-script-tick-counter.cs deleted file mode 100644 index 29dbb6da3b..0000000000 --- a/MinecraftClient/config/sample-script-tick-counter.cs +++ /dev/null @@ -1,40 +0,0 @@ -//MCCScript 1.0 - -MCC.LoadBot(new TickCounterBot()); - -//MCCScript Extensions - -public class TickCounterBot : ChatBot -{ - private const int CaptureDurationSeconds = 5; - - private DateTime _captureEndsAt = DateTime.MaxValue; - private bool _captureStarted; - private int _updateCount; - - public override void AfterGameJoined() - { - _captureEndsAt = DateTime.UtcNow.AddSeconds(CaptureDurationSeconds); - _captureStarted = true; - _updateCount = 0; - LogToConsole($"Counting MCC update ticks for {CaptureDurationSeconds} seconds."); - } - - public override void Update() - { - if (!_captureStarted) - return; - - _updateCount++; - - if (DateTime.UtcNow < _captureEndsAt) - return; - - _captureStarted = false; - - double ticksPerSecond = _updateCount / (double)CaptureDurationSeconds; - LogToConsole($"Tick counter summary: updates={_updateCount}, seconds={CaptureDurationSeconds}, tps={ticksPerSecond:F2}"); - - UnloadBot(); - } -} diff --git a/MinecraftClient/config/sample-script-with-chatbot.cs b/MinecraftClient/config/sample-script-with-chatbot.cs deleted file mode 100644 index 19a23e9bfc..0000000000 --- a/MinecraftClient/config/sample-script-with-chatbot.cs +++ /dev/null @@ -1,35 +0,0 @@ -//MCCScript 1.0 - -/* This is a sample script that will load a ChatBot into Minecraft Console Client - * Simply execute the script once with /script or the script scheduler to load the bot */ - -MCC.LoadBot(new ExampleBot()); - -//MCCScript Extensions - -/* The ChatBot class must be defined as an extension of the script in the Extensions section - * The class can override common methods from ChatBot.cs, take a look at MCC's source code */ - -public class ExampleBot : ChatBot -{ - public override void Initialize() - { - LogToConsole("Sucessfully Initialized!"); - } - - public override void GetText(string text) - { - string message = ""; - string username = ""; - text = GetVerbatim(text); - - if (IsChatMessage(text, ref message, ref username)) - { - LogToConsole("Public message from " + username + ": " + message); - } - else if (IsPrivateMessage(text, ref message, ref username)) - { - LogToConsole("Private message from " + username + ": " + message); - } - } -} diff --git a/MinecraftClient/config/sample-script-with-http-request.cs b/MinecraftClient/config/sample-script-with-http-request.cs deleted file mode 100644 index 60e6d27d3a..0000000000 --- a/MinecraftClient/config/sample-script-with-http-request.cs +++ /dev/null @@ -1,23 +0,0 @@ -//MCCScript 1.0 - -string mojangStatus = PerformHttpRequest("https://status.mojang.com/check"); -MCC.LogToConsole(mojangStatus); - -//MCCScript Extensions - -private static readonly System.Net.Http.HttpClient s_httpClient = new(); - -string PerformHttpRequest(string uri) -{ - return s_httpClient.GetStringAsync(uri).GetAwaiter().GetResult(); -} - -void SendHttpPostAsync(string uri, string text) -{ - new Thread(() => { - using var content = new System.Net.Http.StringContent(text, System.Text.Encoding.UTF8, "text/plain"); - using var response = s_httpClient.PostAsync(uri, content).GetAwaiter().GetResult(); - string responseString = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); - //LogToConsole(responseString); - }).Start(); -} diff --git a/MinecraftClient/config/sample-script-with-task.cs b/MinecraftClient/config/sample-script-with-task.cs deleted file mode 100644 index c8a17be745..0000000000 --- a/MinecraftClient/config/sample-script-with-task.cs +++ /dev/null @@ -1,32 +0,0 @@ -//MCCScript 1.0 - -MCC.LoadBot(new PeriodicTask()); - -//MCCScript Extensions - -/// -/// The ChatBot API is not thread-safe so tasks must occur on the main thread. -/// This bot shows an example of running a task periodically without using threads. -/// -public class PeriodicTask : ChatBot -{ - private DateTime nextTaskRun = DateTime.Now; - - /// - /// Called on each MCC tick, around 20 times per second - /// - public override void Update() - { - DateTime dateNow = DateTime.Now; - if (nextTaskRun < dateNow) - { - LogDebugToConsole("Running task @ " + dateNow); - - // Your task here - SendText("/ping"); - - // Schedule next run - nextTaskRun = dateNow.AddSeconds(60); - } - } -} diff --git a/MinecraftClient/config/sample-script-with-world-access.cs b/MinecraftClient/config/sample-script-with-world-access.cs deleted file mode 100644 index 65e0638510..0000000000 --- a/MinecraftClient/config/sample-script-with-world-access.cs +++ /dev/null @@ -1,61 +0,0 @@ -//MCCScript 1.0 - -MCC.LoadBot(new WatchLamp()); - -//MCCScript Extensions - -/* The ChatBot will access the world on a regular basis to watch for a lamp. - * This is an example of how the world around the player can be accessed from a C# script. */ - -class WatchLamp : ChatBot -{ - /* == CONFIG == */ - - int lampX = 0; - int lampY = 64; - int lampZ = 0; - - /* == CODE == */ - - int checkCount = 0; - Location lampLoc; - - public WatchLamp() - { - if (!Settings.TerrainAndMovements) - { - LogToConsole("WARNING: Terrain handling is disabled in INI file."); - LogToConsole("WARNING: This means this bot cannot watch for lamps."); - UnloadBot(); - } - else - { - lampLoc = new Location(lampX, lampY, lampZ); - LogToConsole("Watching lamp at " + lampLoc); - } - } - - public override void Update() - { - if (checkCount > 10) - { - checkCount = 0; - Material blockType = GetWorld().GetBlock(lampLoc).Type; - switch (blockType) - { - case Material.RedstoneLampOn: - //Lamp is on. All right. Nothing to say here. - break; - case Material.RedstoneLampOff: - LogToConsole("Lamp at " + lampLoc + " is currently turned OFF !!!"); - for (int i = 0; i < 3; i++) - Console.Beep(); - break; - default: - LogToConsole("Block at " + lampLoc + " is not a lamp: " + blockType + "..."); - break; - } - } - else checkCount++; - } -} diff --git a/MinecraftClient/config/sample-script.cs b/MinecraftClient/config/sample-script.cs deleted file mode 100644 index 9884986f14..0000000000 --- a/MinecraftClient/config/sample-script.cs +++ /dev/null @@ -1,14 +0,0 @@ -//MCCScript 1.0 - -/* This is a sample script for Minecraft Console Client - * The code provided in this file will be compiled at runtime and executed - * Allowed instructions: Any C# code AND methods provided by the MCC API */ - -for (int i = 0; i < 5; i++) -{ - int count = MCC.GetVarAsInt("test") + 1; - MCC.SetVar("test", count); - MCC.SendText("Hello World no. " + count); - MCC.LogToConsole("Sleeping for 5 seconds..."); - Thread.Sleep(5000); -} diff --git a/MinecraftClient/config/sample-script.txt b/MinecraftClient/config/sample-script.txt deleted file mode 100644 index b03611cb0f..0000000000 --- a/MinecraftClient/config/sample-script.txt +++ /dev/null @@ -1,8 +0,0 @@ -# This is a sample script for Minecraft Console Client -# Any line beginning with "#" is ignored and treated as a comment. -# Allowed instructions: see README file for an updated list of instructions. - -send Hello World! I'm a bot scripted using Minecraft Console Client. -wait 60 -send Now quitting. Bye :) -exit \ No newline at end of file diff --git a/MinecraftClientGUI.sln b/MinecraftClientGUI.sln deleted file mode 100644 index 9a2d7184f7..0000000000 --- a/MinecraftClientGUI.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MinecraftClientGUI", "MinecraftClientGUI\MinecraftClientGUI.csproj", "{B9E600B3-C8F0-4BF8-85E1-C164956B0B0D}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x86 = Debug|x86 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B9E600B3-C8F0-4BF8-85E1-C164956B0B0D}.Debug|x86.ActiveCfg = Debug|x86 - {B9E600B3-C8F0-4BF8-85E1-C164956B0B0D}.Debug|x86.Build.0 = Debug|x86 - {B9E600B3-C8F0-4BF8-85E1-C164956B0B0D}.Release|x86.ActiveCfg = Release|x86 - {B9E600B3-C8F0-4BF8-85E1-C164956B0B0D}.Release|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/MinecraftClientGUI/AppIcon.ico b/MinecraftClientGUI/AppIcon.ico deleted file mode 100644 index c0821195f9..0000000000 Binary files a/MinecraftClientGUI/AppIcon.ico and /dev/null differ diff --git a/MinecraftClientGUI/Form1.Designer.cs b/MinecraftClientGUI/Form1.Designer.cs deleted file mode 100644 index e31ea78b5d..0000000000 --- a/MinecraftClientGUI/Form1.Designer.cs +++ /dev/null @@ -1,47 +0,0 @@ -namespace MinecraftClientGUI -{ - partial class Form1 - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.SuspendLayout(); - // - // Form1 - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1100, 700); - this.Name = "Form1"; - this.Text = "MCC Multibox Commander"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.ResumeLayout(false); - } - - #endregion - } -} diff --git a/MinecraftClientGUI/Form1.cs b/MinecraftClientGUI/Form1.cs deleted file mode 100644 index 6069898204..0000000000 --- a/MinecraftClientGUI/Form1.cs +++ /dev/null @@ -1,794 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.IO; -using System.Linq; -using System.Runtime.InteropServices; -using System.Threading; -using System.Windows.Forms; - -namespace MinecraftClientGUI -{ - static class Theme - { - public static Color BgDark = Color.FromArgb(15, 15, 18); - public static Color BgPanel = Color.FromArgb(22, 22, 28); - public static Color BgHeader = Color.FromArgb(28, 28, 36); - public static Color BgCard = Color.FromArgb(32, 32, 42); - public static Color BgInput = Color.FromArgb(20, 20, 26); - public static Color TabActive = Color.FromArgb(38, 38, 52); - public static Color TabInactive = Color.FromArgb(22, 22, 28); - public static Color Accent = Color.FromArgb(82, 130, 255); - public static Color AccentHover = Color.FromArgb(110, 155, 255); - public static Color AccentRed = Color.FromArgb(220, 70, 70); - public static Color AccentGreen = Color.FromArgb(60, 200, 100); - public static Color Text = Color.FromArgb(220, 220, 230); - public static Color TextDim = Color.FromArgb(120, 120, 140); - public static Color TextMuted = Color.FromArgb(70, 70, 90); - public static Color Border = Color.FromArgb(40, 40, 55); - } - - class DarkComboBox : ComboBox - { - public DarkComboBox() - { - DrawMode = DrawMode.OwnerDrawFixed; - FlatStyle = FlatStyle.Flat; - BackColor = Theme.BgInput; - ForeColor = Theme.Text; - Font = new Font("Segoe UI", 9f); - } - protected override void OnDrawItem(DrawItemEventArgs e) - { - if (e.Index < 0) return; - e.Graphics.FillRectangle( - new SolidBrush((e.State & DrawItemState.Selected) != 0 ? Theme.TabActive : Theme.BgInput), - e.Bounds); - TextRenderer.DrawText(e.Graphics, Items[e.Index].ToString(), Font, e.Bounds, - Theme.Text, TextFormatFlags.VerticalCenter | TextFormatFlags.Left); - } - } - - class FlatBtn : Button - { - private Color _back, _hover; - public FlatBtn(string text, Color back, Color? hover = null) - { - Text = text; - _back = back; - _hover = hover ?? ControlPaint.Light(back, 0.2f); - FlatStyle = FlatStyle.Flat; - FlatAppearance.BorderSize = 0; - BackColor = _back; - ForeColor = Theme.Text; - Font = new Font("Segoe UI", 9f, FontStyle.Bold); - Cursor = Cursors.Hand; - MouseEnter += (s, e) => BackColor = _hover; - MouseLeave += (s, e) => BackColor = _back; - } - } - - public partial class Form1 : Form - { - private const string SettingsFile = "settings_v3.txt"; - private const string MacrosFile = "macros.txt"; - private static readonly string[] DefaultSettingsContent = new[] { "", "", "" }; - private static readonly string[] DefaultMacrosContent = new[] - { - "Creative|/gamemode creative|Gold", - "Survival|/gamemode survival|Gray", - "Hello|Hello everyone!|Green", - "Login|/login password123|Purple", - "Spawn|/spawn|Blue" - }; - private string currentLang = "en"; - - private Panel tabBar, contentArea, topPanel, bottomPanel, rightPanel; - private Label lblLogin, lblPass, lblIP, lblActive; - private DarkComboBox cmbLogin, cmbIP; - private TextBox txtPassword; - private FlatBtn btnAddBot; - private TextBox boxGlobalInput; - private FlatBtn btnGlobalSend; - private CheckBox chkSendToAll; - private Label lblMacrosTitle; - private FlowLayoutPanel macroPanel; - private FlatBtn btnEditMacros, btnRefreshMacros, btnLangSwitch; - - private List historyLogins = new List(); - private List historyIPs = new List(); - private List tabs = new List(); - private ConsoleTab activeTab = null; - - public Form1(string[] args) - { - InitializeComponent(); - BuildUI(); - EnsureRuntimeFiles(); - LoadSettings(); - LoadMacros(); - UpdateLanguage(); - if (args.Length > 0) AddNewTab("Auto-Bot", args); - this.FormClosing += (s, e) => { foreach (var t in tabs.ToList()) t.CloseTab(); }; - } - - private static void EnsureRuntimeFiles() - { - EnsureFileExists(SettingsFile, DefaultSettingsContent); - EnsureFileExists(MacrosFile, DefaultMacrosContent); - } - - private static void EnsureFileExists(string path, string[] defaultContent) - { - if (!File.Exists(path)) - { - File.WriteAllLines(path, defaultContent); - } - } - - private void BuildUI() - { - this.Text = "MCC Multibox Commander"; - this.Size = new Size(1200, 780); - this.MinimumSize = new Size(900, 600); - this.BackColor = Theme.BgDark; - this.ForeColor = Theme.Text; - this.Font = new Font("Segoe UI", 9f); - this.StartPosition = FormStartPosition.CenterScreen; - - // TOP PANEL - topPanel = new Panel { Dock = DockStyle.Top, Height = 60, BackColor = Theme.BgHeader, Padding = new Padding(12, 0, 12, 0) }; - topPanel.Paint += PaintBottomBorder; - this.Controls.Add(topPanel); - - int y = 17; - lblLogin = MkLabel("Username / Email:", 10, 2); topPanel.Controls.Add(lblLogin); - cmbLogin = new DarkComboBox { Location = new Point(10, y), Size = new Size(195, 26) }; topPanel.Controls.Add(cmbLogin); - - lblPass = MkLabel("Password:", 215, 2); topPanel.Controls.Add(lblPass); - txtPassword = new TextBox { Location = new Point(215, y), Size = new Size(155, 26), BackColor = Theme.BgInput, ForeColor = Theme.Text, BorderStyle = BorderStyle.FixedSingle, UseSystemPasswordChar = true, Font = new Font("Segoe UI", 9f) }; - topPanel.Controls.Add(txtPassword); - - lblIP = MkLabel("Server IP:", 380, 2); topPanel.Controls.Add(lblIP); - cmbIP = new DarkComboBox { Location = new Point(380, y), Size = new Size(215, 26) }; topPanel.Controls.Add(cmbIP); - - btnAddBot = new FlatBtn("+ Add Account", Theme.Accent, Theme.AccentHover) { Location = new Point(608, y - 1), Size = new Size(148, 28) }; - btnAddBot.Click += BtnAddBot_Click; - topPanel.Controls.Add(btnAddBot); - - lblActive = new Label { Location = new Point(770, y), AutoSize = true, ForeColor = Theme.AccentGreen, Font = new Font("Segoe UI", 9f, FontStyle.Bold) }; - topPanel.Controls.Add(lblActive); - - var timer = new System.Windows.Forms.Timer { Interval = 1000 }; - timer.Tick += (s, e) => lblActive.Text = (currentLang == "en" ? "Active accounts: " : "Aktywne konta: ") + tabs.Count; - timer.Start(); - - // RIGHT PANEL - rightPanel = new Panel { Dock = DockStyle.Right, Width = 185, BackColor = Theme.BgPanel }; - rightPanel.Paint += PaintLeftBorder; - this.Controls.Add(rightPanel); - - // Language toggle - large button at the top - btnLangSwitch = new FlatBtn("PL", Color.FromArgb(45, 75, 145), Color.FromArgb(60, 100, 185)) - { - Dock = DockStyle.Top, - Height = 36, - Font = new Font("Segoe UI", 11f, FontStyle.Bold), - ForeColor = Color.White - }; - btnLangSwitch.Click += (s, e) => { currentLang = currentLang == "en" ? "pl" : "en"; UpdateLanguage(); }; - rightPanel.Controls.Add(btnLangSwitch); - - // Macro header - var macroHeader = new Panel { Dock = DockStyle.Top, Height = 52, BackColor = Theme.BgPanel }; - macroHeader.Paint += PaintBottomBorder; - rightPanel.Controls.Add(macroHeader); - - lblMacrosTitle = new Label { Text = "Quick Actions", Location = new Point(8, 8), Size = new Size(169, 18), ForeColor = Theme.Text, Font = new Font("Segoe UI", 9f, FontStyle.Bold) }; - macroHeader.Controls.Add(lblMacrosTitle); - - btnEditMacros = new FlatBtn("Edit", Color.FromArgb(40, 40, 58)) { Location = new Point(8, 28), Size = new Size(76, 20), Font = new Font("Segoe UI", 8f, FontStyle.Bold) }; - btnEditMacros.Click += BtnEditMacros_Click; - macroHeader.Controls.Add(btnEditMacros); - - btnRefreshMacros = new FlatBtn("Reload", Color.FromArgb(40, 40, 58)) { Location = new Point(90, 28), Size = new Size(76, 20), Font = new Font("Segoe UI", 8f, FontStyle.Bold) }; - btnRefreshMacros.Click += (s, e) => LoadMacros(); - macroHeader.Controls.Add(btnRefreshMacros); - - macroPanel = new FlowLayoutPanel { Dock = DockStyle.Fill, FlowDirection = FlowDirection.TopDown, WrapContents = false, AutoScroll = true, BackColor = Theme.BgPanel, Padding = new Padding(8, 8, 0, 8) }; - rightPanel.Controls.Add(macroPanel); - - rightPanel.Controls.SetChildIndex(macroPanel, 0); - rightPanel.Controls.SetChildIndex(macroHeader, 1); - rightPanel.Controls.SetChildIndex(btnLangSwitch, 2); - - // BOTTOM PANEL - bottomPanel = new Panel { Dock = DockStyle.Bottom, Height = 40, BackColor = Theme.BgHeader, Padding = new Padding(6, 6, 6, 0) }; - bottomPanel.Paint += PaintTopBorder; - this.Controls.Add(bottomPanel); - - btnGlobalSend = new FlatBtn("Send", Color.FromArgb(50, 90, 160), Theme.Accent) { Dock = DockStyle.Right, Width = 80 }; - btnGlobalSend.Click += BtnGlobalSend_Click; - bottomPanel.Controls.Add(btnGlobalSend); - - chkSendToAll = new CheckBox { Text = "Send to all", Dock = DockStyle.Right, Width = 120, ForeColor = Color.FromArgb(255, 160, 90), Padding = new Padding(8, 0, 0, 0), Font = new Font("Segoe UI", 9f, FontStyle.Bold) }; - bottomPanel.Controls.Add(chkSendToAll); - - boxGlobalInput = new TextBox { Dock = DockStyle.Fill, BackColor = Theme.BgInput, ForeColor = Theme.Text, BorderStyle = BorderStyle.FixedSingle, Font = new Font("Consolas", 11f) }; - boxGlobalInput.KeyDown += (s, e) => { if (e.KeyCode == Keys.Enter) { BtnGlobalSend_Click(s, e); e.SuppressKeyPress = true; } }; - bottomPanel.Controls.Add(boxGlobalInput); - - // TAB BAR - tabBar = new Panel { Dock = DockStyle.Top, Height = 38, BackColor = Theme.BgPanel }; - tabBar.Paint += PaintBottomBorder; - this.Controls.Add(tabBar); - - // CONTENT AREA - contentArea = new Panel { Dock = DockStyle.Fill, BackColor = Theme.BgDark }; - this.Controls.Add(contentArea); - - this.Controls.SetChildIndex(contentArea, 0); - this.Controls.SetChildIndex(tabBar, 1); - this.Controls.SetChildIndex(bottomPanel, 2); - this.Controls.SetChildIndex(rightPanel, 3); - this.Controls.SetChildIndex(topPanel, 4); - } - - private void AddNewTab(string title, string[] args) - { - var tab = new ConsoleTab(title, args, currentLang) { Dock = DockStyle.Fill }; - tabs.Add(tab); - contentArea.Controls.Add(tab); - RebuildTabBar(); - ActivateTab(tab); - } - - private void ActivateTab(ConsoleTab tab) - { - activeTab = tab; - foreach (Control c in contentArea.Controls) c.Visible = (c == tab); - RebuildTabBar(); - } - - private void RebuildTabBar() - { - tabBar.Controls.Clear(); - int x = 4; - foreach (var tab in tabs) - { - var t = tab; - bool active = (t == activeTab); - - var btn = new Panel { Location = new Point(x, active ? 2 : 5), Size = new Size(148, active ? 32 : 27), BackColor = active ? Theme.TabActive : Theme.TabInactive, Cursor = Cursors.Hand }; - btn.Paint += (s, e) => { - if (t == activeTab) - e.Graphics.FillRectangle(new SolidBrush(Theme.Accent), 0, btn.Height - 2, btn.Width, 2); - }; - - var lbl = new Label - { - Text = t.TabTitle, - Location = new Point(8, 0), - Size = new Size(108, 30), - ForeColor = active ? Theme.Text : Theme.TextDim, - Font = new Font("Segoe UI", 9f, active ? FontStyle.Bold : FontStyle.Regular), - TextAlign = ContentAlignment.MiddleLeft, - Cursor = Cursors.Hand - }; - lbl.Click += (s, e) => ActivateTab(t); - btn.Click += (s, e) => ActivateTab(t); - btn.Controls.Add(lbl); - - var btnX = new Label - { - Text = "x", - Location = new Point(120, 0), - Size = new Size(25, 30), - ForeColor = Theme.TextMuted, - Font = new Font("Segoe UI", 9f), - TextAlign = ContentAlignment.MiddleCenter, - Cursor = Cursors.Hand - }; - btnX.MouseEnter += (s, e) => btnX.ForeColor = Theme.AccentRed; - btnX.MouseLeave += (s, e) => btnX.ForeColor = Theme.TextMuted; - btnX.Click += (s, e) => { - t.CloseTab(); - tabs.Remove(t); - contentArea.Controls.Remove(t); - if (activeTab == t) { activeTab = tabs.LastOrDefault(); if (activeTab != null) ActivateTab(activeTab); } - RebuildTabBar(); - }; - btn.Controls.Add(btnX); - tabBar.Controls.Add(btn); - x += 152; - } - } - - private void UpdateLanguage() - { - bool en = currentLang == "en"; - btnLangSwitch.Text = en ? "Switch to PL" : "Switch to EN"; - lblLogin.Text = en ? "Username / Email:" : "Login / Email:"; - lblPass.Text = en ? "Password:" : "Haslo:"; - lblIP.Text = en ? "Server IP:" : "IP Serwera:"; - btnAddBot.Text = en ? "+ Add Account" : "+ Dodaj Konto"; - lblMacrosTitle.Text = en ? "Quick Actions" : "Szybkie Akcje"; - btnEditMacros.Text = en ? "Edit" : "Edytuj"; - btnRefreshMacros.Text = en ? "Reload" : "Odswiez"; - btnGlobalSend.Text = en ? "Send" : "Wyslij"; - chkSendToAll.Text = en ? "Send to all" : "Wyslij do wszystkich"; - foreach (var tab in tabs) tab.UpdateLang(currentLang); - } - - private void BtnEditMacros_Click(object sender, EventArgs e) - { - EnsureFileExists(MacrosFile, DefaultMacrosContent); - Process.Start("notepad.exe", MacrosFile); - } - - private void LoadMacros() - { - macroPanel.Controls.Clear(); - if (!File.Exists(MacrosFile)) return; - try - { - foreach (var line in File.ReadAllLines(MacrosFile)) - { - if (string.IsNullOrWhiteSpace(line)) continue; - var parts = line.Split('|'); - if (parts.Length >= 2) - { - Color c = parts.Length > 2 ? Color.FromName(parts[2]) : Theme.Accent; - if (c.IsEmpty) c = Theme.Accent; - AddMacroBtn(parts[1], parts[0], c); - } - } - } - catch (Exception ex) { MessageBox.Show("Error loading macros: " + ex.Message); } - } - - private void AddMacroBtn(string cmd, string label, Color color) - { - Color bg = Color.FromArgb(32, 32, 48); - Color hov = Color.FromArgb(44, 44, 64); - var btn = new Button - { - Text = " " + label, - Width = macroPanel.Width - 22, - Height = 34, - FlatStyle = FlatStyle.Flat, - BackColor = bg, - ForeColor = Theme.Text, - Font = new Font("Segoe UI", 9f, FontStyle.Bold), - Cursor = Cursors.Hand, - Margin = new Padding(0, 0, 0, 4), - TextAlign = ContentAlignment.MiddleLeft, - Tag = color - }; - btn.FlatAppearance.BorderSize = 0; - btn.MouseEnter += (s, e) => btn.BackColor = hov; - btn.MouseLeave += (s, e) => btn.BackColor = bg; - btn.Paint += (s, e) => e.Graphics.FillRectangle(new SolidBrush(color), 0, 0, 4, btn.Height); - btn.Click += (s, e) => { - if (chkSendToAll.Checked) foreach (var tab in tabs) tab.Send(cmd); - else activeTab?.Send(cmd); - }; - macroPanel.Controls.Add(btn); - } - - private void BtnAddBot_Click(object sender, EventArgs e) - { - string user = cmbLogin.Text.Trim(), pass = txtPassword.Text.Trim(), ip = cmbIP.Text.Trim(); - if (string.IsNullOrEmpty(user) || string.IsNullOrEmpty(ip)) - { - MessageBox.Show(currentLang == "en" ? "Please enter username and IP!" : "Podaj login i IP serwera!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); - return; - } - SaveSettings(user, ip); - string tabTitle = user.Contains("@") ? user.Split('@')[0] : user; - AddNewTab(tabTitle, new[] { user, pass, ip }); - } - - private void BtnGlobalSend_Click(object sender, EventArgs e) - { - string cmd = boxGlobalInput.Text.Trim(); - if (string.IsNullOrEmpty(cmd)) return; - if (chkSendToAll.Checked) foreach (var tab in tabs) tab.Send(cmd); - else activeTab?.Send(cmd); - boxGlobalInput.Clear(); - } - - private void LoadSettings() - { - try - { - if (!File.Exists(SettingsFile)) return; - var lines = File.ReadAllLines(SettingsFile).ToList(); - while (lines.Count < 3) - { - lines.Add(string.Empty); - } - if (lines.Count > 0) txtPassword.Text = lines[0]; - if (lines.Count > 1) { historyLogins = lines[1].Split('|').ToList(); cmbLogin.Items.AddRange(historyLogins.ToArray()); if (cmbLogin.Items.Count > 0) cmbLogin.SelectedIndex = 0; } - if (lines.Count > 2) { historyIPs = lines[2].Split('|').ToList(); cmbIP.Items.AddRange(historyIPs.ToArray()); if (cmbIP.Items.Count > 0) cmbIP.SelectedIndex = 0; } - } - catch { } - } - - private void SaveSettings(string user, string ip) - { - historyLogins.Remove(user); historyLogins.Insert(0, user); if (historyLogins.Count > 10) historyLogins.RemoveAt(10); - historyIPs.Remove(ip); historyIPs.Insert(0, ip); if (historyIPs.Count > 10) historyIPs.RemoveAt(10); - cmbLogin.Items.Clear(); cmbLogin.Items.AddRange(historyLogins.ToArray()); cmbLogin.Text = user; - cmbIP.Items.Clear(); cmbIP.Items.AddRange(historyIPs.ToArray()); cmbIP.Text = ip; - try { File.WriteAllLines(SettingsFile, new[] { txtPassword.Text, string.Join("|", historyLogins), string.Join("|", historyIPs) }); } catch { } - } - - private void PaintBottomBorder(object sender, PaintEventArgs e) { var c = (Control)sender; e.Graphics.DrawLine(new Pen(Theme.Border), 0, c.Height - 1, c.Width, c.Height - 1); } - private void PaintTopBorder(object sender, PaintEventArgs e) { var c = (Control)sender; e.Graphics.DrawLine(new Pen(Theme.Border), 0, 0, c.Width, 0); } - private void PaintLeftBorder(object sender, PaintEventArgs e) { var c = (Control)sender; e.Graphics.DrawLine(new Pen(Theme.Border), 0, 0, 0, c.Height); } - private Label MkLabel(string text, int x, int y) => new Label { Text = text, Location = new Point(x, y), AutoSize = true, ForeColor = Theme.TextDim, Font = new Font("Segoe UI", 8f) }; - } - - // ===================================================== - // LINE TYPES (for filtering) - // ===================================================== - enum LineType { Chat, System, Error } - - struct LogLine - { - public string Raw; - public string Display; - public LineType Type; - public DateTime Time; - } - - public class ConsoleTab : Panel - { - private MinecraftClient Client; - private Thread t_read; - private RichTextBox boxOutput; - private Button btnDisconnect; - private Label lblStatus; - private Label lblTimer; - private CheckBox chkAutoScroll; - private bool autoScroll = true; - - private Button btnFilterAll, btnFilterChat, btnFilterSystem, btnFilterError; - private LineType? activeFilter = null; - - private List allLines = new List(); - private object logLock = new object(); - - private StreamWriter logWriter; - private DateTime connectedAt; - private System.Windows.Forms.Timer timerClock; - private bool isConnected = false; - - public string TabTitle { get; set; } - - [DllImport("user32.dll")] public static extern IntPtr SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam); - [DllImport("uxtheme.dll", ExactSpelling = true, CharSet = CharSet.Unicode)] - private static extern int SetWindowTheme(IntPtr hwnd, string pszSubAppName, string pszSubIdList); - private const int WM_VSCROLL = 0x115, SB_BOTTOM = 7; - - public ConsoleTab(string title, string[] args, string lang) - { - this.TabTitle = title; - this.BackColor = Theme.BgDark; - - InitLogFile(title); - - // Top bar - var topBar = new Panel { Dock = DockStyle.Top, Height = 36, BackColor = Theme.BgCard }; - topBar.Paint += (s, e) => e.Graphics.DrawLine(new Pen(Theme.Border), 0, topBar.Height - 1, topBar.Width, topBar.Height - 1); - - btnDisconnect = new Button - { - Text = lang == "en" ? "Disconnect" : "Rozlacz", - Dock = DockStyle.Right, - Width = 105, - FlatStyle = FlatStyle.Flat, - BackColor = Color.FromArgb(160, 45, 45), - ForeColor = Color.White, - Font = new Font("Segoe UI", 9f, FontStyle.Bold), - Cursor = Cursors.Hand - }; - btnDisconnect.FlatAppearance.BorderSize = 0; - btnDisconnect.Click += (s, e) => CloseTab(); - topBar.Controls.Add(btnDisconnect); - - chkAutoScroll = new CheckBox - { - Text = "Auto-scroll", - Dock = DockStyle.Right, - Width = 95, - ForeColor = Theme.TextDim, - Font = new Font("Segoe UI", 8f), - Checked = true, - Padding = new Padding(0, 0, 12, 0) - }; - chkAutoScroll.CheckedChanged += (s, e) => autoScroll = chkAutoScroll.Checked; - topBar.Controls.Add(chkAutoScroll); - - lblTimer = new Label - { - Text = "00:00:00", - Dock = DockStyle.Right, - Width = 70, - ForeColor = Theme.TextDim, - Font = new Font("Consolas", 8f), - TextAlign = ContentAlignment.MiddleCenter - }; - topBar.Controls.Add(lblTimer); - - lblStatus = new Label - { - Text = " ● " + title, - Dock = DockStyle.Fill, - ForeColor = Theme.TextMuted, - Font = new Font("Segoe UI", 9f, FontStyle.Bold), - TextAlign = ContentAlignment.MiddleLeft - }; - topBar.Controls.Add(lblStatus); - this.Controls.Add(topBar); - - // Filter bar - var filterBar = new Panel { Dock = DockStyle.Top, Height = 30, BackColor = Theme.BgPanel }; - filterBar.Paint += (s, e) => e.Graphics.DrawLine(new Pen(Theme.Border), 0, filterBar.Height - 1, filterBar.Width, filterBar.Height - 1); - - btnFilterAll = MakeFilterBtn("All", null, filterBar, 4); - btnFilterChat = MakeFilterBtn("Chat", LineType.Chat, filterBar, 54); - btnFilterSystem = MakeFilterBtn("System", LineType.System, filterBar, 118); - btnFilterError = MakeFilterBtn("Errors", LineType.Error, filterBar, 192); - SetFilterActive(btnFilterAll); - this.Controls.Add(filterBar); - - // Console - boxOutput = new RichTextBox - { - Dock = DockStyle.Fill, - BackColor = Theme.BgDark, - ForeColor = Color.FromArgb(200, 200, 215), - Font = new Font("Consolas", 10f), - BorderStyle = BorderStyle.None, - ReadOnly = true, - ScrollBars = RichTextBoxScrollBars.Vertical - }; - var ctx = new ContextMenuStrip { BackColor = Theme.BgCard, ForeColor = Theme.Text }; - ctx.Items.Add("Disconnect / Close", null, (s, e) => CloseTab()); - ctx.Items.Add("Clear Console", null, (s, e) => { boxOutput.Clear(); lock (logLock) allLines.Clear(); }); - boxOutput.ContextMenuStrip = ctx; - this.Controls.Add(boxOutput); - - try { SetWindowTheme(boxOutput.Handle, "DarkMode_Explorer", null); } catch { } - - timerClock = new System.Windows.Forms.Timer { Interval = 1000 }; - timerClock.Tick += (s, e) => { - if (isConnected && !lblTimer.IsDisposed) - { - var elapsed = DateTime.Now - connectedAt; - lblTimer.Text = elapsed.ToString(@"hh\:mm\:ss"); - } - }; - timerClock.Start(); - - PrintSystem("Initializing...", LineType.System); - if (args.Length == 3) new Thread(() => InitClient(new MinecraftClient(args[0], args[1], args[2]))).Start(); - else new Thread(() => InitClient(new MinecraftClient(args))).Start(); - } - - private void InitLogFile(string title) - { - try - { - string dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs"); - Directory.CreateDirectory(dir); - string safeName = string.Concat(title.Split(Path.GetInvalidFileNameChars())); - string date = DateTime.Now.ToString("yyyy-MM-dd_HH-mm"); - string path = Path.Combine(dir, safeName + "_" + date + ".txt"); - logWriter = new StreamWriter(path, append: true, encoding: System.Text.Encoding.UTF8) { AutoFlush = true }; - logWriter.WriteLine("=== Session started: " + DateTime.Now + " | Account: " + title + " ==="); - } - catch { } - } - - private void WriteLog(string text, LineType type) - { - try { logWriter?.WriteLine("[" + DateTime.Now.ToString("HH:mm:ss") + "][" + type + "] " + text); } catch { } - } - - private Button MakeFilterBtn(string label, LineType? type, Panel parent, int x) - { - int w = label == "All" ? 44 : label == "System" ? 68 : 58; - var btn = new Button - { - Text = label, - Location = new Point(x, 4), - Size = new Size(w, 22), - FlatStyle = FlatStyle.Flat, - BackColor = Theme.BgCard, - ForeColor = Theme.TextDim, - Font = new Font("Segoe UI", 8f, FontStyle.Bold), - Cursor = Cursors.Hand - }; - btn.FlatAppearance.BorderSize = 1; - btn.FlatAppearance.BorderColor = Theme.Border; - btn.Click += (s, e) => { activeFilter = type; SetFilterActive(btn); RedrawFiltered(); }; - parent.Controls.Add(btn); - return btn; - } - - private void SetFilterActive(Button active) - { - foreach (var b in new[] { btnFilterAll, btnFilterChat, btnFilterSystem, btnFilterError }) - { - if (b == null) continue; - b.BackColor = b == active ? Theme.Accent : Theme.BgCard; - b.ForeColor = b == active ? Color.White : Theme.TextDim; - } - } - - private void RedrawFiltered() - { - InvokeUI(() => { - boxOutput.Clear(); - List snapshot; - lock (logLock) snapshot = new List(allLines); - foreach (var line in snapshot) - if (activeFilter == null || line.Type == activeFilter) - RenderLine(line); - if (autoScroll) SendMessage(boxOutput.Handle, WM_VSCROLL, (IntPtr)SB_BOTTOM, IntPtr.Zero); - }); - } - - private void RenderLine(LogLine line) - { - if (line.Type == LineType.System || line.Type == LineType.Error) - { - boxOutput.SelectionColor = line.Type == LineType.Error ? Color.FromArgb(220, 80, 80) : Color.FromArgb(85, 85, 105); - boxOutput.AppendText(line.Display + "\n"); - } - else - { - string[] subs = line.Raw.Split('\u00a7'); - boxOutput.SelectionColor = Color.FromArgb(200, 200, 215); - if (subs.Length > 0) boxOutput.AppendText(subs[0]); - for (int i = 1; i < subs.Length; i++) - { - if (subs[i].Length > 1) - { - boxOutput.SelectionColor = GetColor(subs[i][0]); - boxOutput.SelectionFont = GetFont(subs[i][0], boxOutput.Font); - boxOutput.AppendText(subs[i].Substring(1)); - } - } - boxOutput.AppendText("\n"); - } - } - - public void UpdateLang(string lang) { if (btnDisconnect != null) btnDisconnect.Text = lang == "en" ? "Disconnect" : "Rozlacz"; } - - private void InitClient(MinecraftClient client) - { - Client = client; - t_read = new Thread(ReadLoop) { IsBackground = true }; - t_read.Start(); - connectedAt = DateTime.Now; - isConnected = true; - InvokeUI(() => { - lblStatus.Text = " ● " + TabTitle; - lblStatus.ForeColor = Color.FromArgb(100, 210, 130); - PrintSystem("Connected.", LineType.System); - }); - } - - private void ReadLoop() - { - try - { - while (Client != null && !Client.Disconnected) - { - string line = Client.ReadLine(); - if (!string.IsNullOrEmpty(line)) PrintChat(line); - } - } - catch (ThreadAbortException) - { - } - catch (Exception ex) { InvokeUI(() => PrintSystem("Error: " + ex.Message, LineType.Error)); } - finally - { - isConnected = false; - InvokeUI(() => { - PrintSystem("Disconnected.", LineType.Error); - if (lblStatus != null) { lblStatus.Text = " ● " + TabTitle; lblStatus.ForeColor = Color.FromArgb(220, 80, 80); } - }); - } - } - - public void Send(string text) - { - if (Client != null && !Client.Disconnected) - { - Client.SendText(text); - InvokeUI(() => PrintSystem("> " + text, LineType.System, Color.FromArgb(100, 180, 255))); - } - } - - public void CloseTab() - { - try - { - isConnected = false; - timerClock?.Stop(); - logWriter?.WriteLine("=== Session ended: " + DateTime.Now + " ==="); - logWriter?.Close(); - if (Client != null) { Client.Close(); Client = null; } - if (t_read != null && t_read.IsAlive) { t_read.Abort(); t_read = null; } - } - catch { } - } - - private void PrintSystem(string text, LineType type, Color? color = null) - { - string prefix = type == LineType.Error ? "[ERR] " : "[SYS] "; - Color c = color ?? (type == LineType.Error ? Color.FromArgb(220, 80, 80) : Color.FromArgb(85, 85, 105)); - var entry = new LogLine { Raw = prefix + text, Display = prefix + text, Type = type, Time = DateTime.Now }; - lock (logLock) allLines.Add(entry); - WriteLog(text, type); - InvokeUI(() => { - if (activeFilter == null || activeFilter == type) - { - boxOutput.SelectionColor = c; - boxOutput.AppendText(entry.Display + "\n"); - if (autoScroll) SendMessage(boxOutput.Handle, WM_VSCROLL, (IntPtr)SB_BOTTOM, IntPtr.Zero); - } - }); - } - - private void PrintChat(string raw) - { - string plain = System.Text.RegularExpressions.Regex.Replace(raw, @"§.", ""); - var entry = new LogLine { Raw = raw, Display = plain, Type = LineType.Chat, Time = DateTime.Now }; - lock (logLock) allLines.Add(entry); - WriteLog(plain, LineType.Chat); - InvokeUI(() => { - if (activeFilter == null || activeFilter == LineType.Chat) - { - boxOutput.SuspendLayout(); - RenderLine(entry); - if (autoScroll) SendMessage(boxOutput.Handle, WM_VSCROLL, (IntPtr)SB_BOTTOM, IntPtr.Zero); - boxOutput.ResumeLayout(); - } - }); - } - - private void InvokeUI(Action a) { if (!boxOutput.IsDisposed) { if (boxOutput.InvokeRequired) try { boxOutput.Invoke(a); } catch { } else a(); } } - private Font GetFont(char c, Font f) => c == 'l' ? new Font(f, FontStyle.Bold) : f; - private Color GetColor(char c) - { - switch (c) - { - case '0': return Color.FromArgb(20, 20, 20); - case '1': return Color.FromArgb(85, 85, 255); - case '2': return Color.FromArgb(85, 200, 85); - case '3': return Color.FromArgb(85, 220, 220); - case '4': return Color.FromArgb(220, 85, 85); - case '5': return Color.FromArgb(200, 85, 200); - case '6': return Color.FromArgb(255, 180, 30); - case '7': return Color.Silver; - case '8': return Color.FromArgb(120, 120, 140); - case '9': return Color.FromArgb(100, 130, 255); - case 'a': return Color.FromArgb(85, 255, 85); - case 'b': return Color.FromArgb(85, 255, 255); - case 'c': return Color.FromArgb(255, 85, 85); - case 'd': return Color.FromArgb(255, 130, 255); - case 'e': return Color.FromArgb(255, 255, 85); - case 'f': return Color.White; - default: return Color.FromArgb(200, 200, 215); - } - } - } -} diff --git a/MinecraftClientGUI/Form1.resx b/MinecraftClientGUI/Form1.resx deleted file mode 100644 index b45be6ec86..0000000000 --- a/MinecraftClientGUI/Form1.resx +++ /dev/null @@ -1,6293 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAYAEBAAAAAAIABoBAAAZgAAACAgAAAAACAAqBAAAM4EAAAwMAAAAAAgAKglAAB2FQAAQEAAAAAA - IAAoQgAAHjsAAICAAAAAACAAKAgBAEZ9AAAAAAAAAAAgACggBABuhQEAKAAAABAAAAAgAAAAAQAgAAAA - AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvazFDxIhZm7l8Rpy5ekGcuXpBnLp6RZy9fkmcv39JnL9/ - S5y9fkmcunpFnLl5QZy3ekGct3pBnLh7RZutZy0+5NTG8fHx8f/29vb/9/f3//f3+P/4+Pj/+Pj4//j4 - +P/4+Pj/+Pj4//j4+P/39/f/9/f3//f39//09PT/0a+R4O3m4P7S0tL/8/Pz//Pz8//z8/P/8vLy/+7u - 7v/z8/P/7+/v/+3t7f/09PT/9PT0//T09P/09PT/+Pj4/9W2menr49z+y8vL//Pz8//z8/P/8/Pz/9fX - 1/8yMjL/6Ojo/7q6uv8rKyv/7e3t//T09P/09PT/9PT0//v7+//Utpnp6eHb/sjIyP/09PT/8/Pz//Pz - 8//Q0ND/AgIC/wYGBv8EBAT/AgIC/+Pj4//09PT/9PT0//T09P/7+/v/1baZ6enh2v7Hx8f/8/Pz//Pz - 8//z8/P/2NjY/w4ODv8CAgL/AQEB/xAQEP/w8PD/9PT0//T09P/09PT//Pz8/9W2meno4Nr+x8fH//Pz - 8//09PT/9PT0/9bW1v/Ozs7/YWFh/0pKSv/Kysr/4+Pj//T09P/09PT/9PT0//z8/P/Utpnp6eHa/snJ - yf/09PT/9PT0//T09P8vLy//BgYG/8jIyP/S0tL/CAgI/yQkJP/z8/P/8/Pz//Pz8//7+/v/1LaZ6evj - 3f7Ozs7/9PT0//T09P/09PT/goKC/2xsbP/Y2Nj/29vb/2ZmZv9lZWX/8/Pz//T09P/z8/P/+vr6/9W2 - mOnu5t/+29vb/+Hh4f/c3Nz/2dnZ/9nZ2f/Y2Nj/2NjY/9jY2P/Y2Nj/2dnZ/9nZ2f/d3d3/4uLi//T0 - 9P/Ts5bq7uPb/vPu6v/z7ur/8+7q//Pu6v/z7en/8ezo//Dr5//w6+f/8ezo//Lt6f/z7ur/8+7p//Pu - 6f/y7ur/0ayK++2/mf7zuYr/9LmJ//O5iv/zuYr/87mJ//O5iv/zuYr/9LmK//O5iv/0uYn/87mK//S5 - iv/0uYr/9LiJ/9GGSv/urHT+9Ld8//W6fP/1vHz/9bx8//a9fP/1v3z/9b58//W+fP/2vnz/9r58//W9 - fP/1vHz/9bt8//S3ev/ShknY0ItOucF1M6TEdDGlwnQxpcJ0MaXFdTSlyXg5pcp7O6XJezulyXg5pcV1 - NKXCdDGlwnQxpcR4NqXEf0Oks2gqNgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAD//wAAKAAAACAAAABAAAAAAQAgAAAAAAAAIAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA349gELFOABexTgAXsU4AF7FOABexTgsXsU4LF7FO - CxexTgsXsU4LF7FOCxexWQsXsVkLF7FZCxexWQsXsVkLF7FZCxexWQsXsVkLF7FOCxexTgsXsU4LF7FO - CxexTgsXsU4LF7FOCxexTgAXsU4AF8x/QBQAAAAAAAAAAKtnKm28hVX+0KmH/9Ktjf/OpIH/yqB7/8qh - e//KoXv/yqF7/8qhe//Monz/zaN+/86kgP/PpYH/z6aC/8+ngv/Pp4L/z6aC/8+lgf/OpID/zaN+/8yh - ff/KoHv/yqB6/8qhe//KoXv/yqF7/8qhe//Lo3//x5t0/7mBT+WoZy0+v4xe6fHy8f/08/P/8/P0//Pz - 8//z8/P/8/T0//P09P/z9PT/8/Pz//P09P/z8/P/8/P0//Pz8//z9PT/8/T0//P09P/z9PT/8/T0//P0 - 9P/z9PT/8/T0//P09P/z8/P/8/T0//P09P/09PT/9PT0//P09P/09PP/8O/t/7h9Sr7avaP98/Pz/+7u - 7v/39/f/+vr6//r6+v/7+/v/+/v7//v7+//7+/v/+/v7//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8 - /P/8/Pz//Pz8//z8/P/8/Pz/+/v8//v7+//7+/v/+/v7//r6+v/5+fn/9vb2//T09P/z8fH/vIRS09zE - rf7z8/P/2dnZ/+Pj4//09PT/9PT0//b29v/19fX/9vb2//b29v/29vb/9/f3//f39//39/f/9/f3//f3 - 9//39/f/9/f3//f39//39/f/9/f3//b29v/29vb/9vb2//b29v/19fX/9PT0//T09P/09PT/+Pj4//Px - 8f+8hFHT27+m/vPz8//U1NT/3t7e//T09P/09PT/9PT0//Pz8//09PT/8/Pz//T09P/z8/P/8/Pz//Pz - 8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//b2 - 9v/5+fn/8/Hx/7uEUtPavKL+8vLy/9PT0//Z2dn/8/Pz//Pz8//z8/P/8vLy//T09P/09PT/9PT0/9fX - 1/9ZWVn/a2tr/+fn5//09PT/9PT0/6Ojo/9VVVX/XFxc//Hx8f/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/+Pj4//r6+v/z8fH/vIRS09q8ov7z8/P/0dHR/9fX1//09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/wsLC/w8PD/8gICD/wcHB/8nJyf/Jycn/eXl5/wAAAP8fHx//5eXl//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/5+fn/+vr6//Px8f+7hFHT2r2i/vPz8//Q0ND/1dXV//T09P/09PT/8/Pz//Pz - 8//09PT/8/Pz//Pz8//BwcH/ExMT/wAAAP8HBwf/BgYG/wYGBv8EBAT/AAAA/yAgIP/c3Nz/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//n5+f/7+/v/8/Hx/7yEUdPavKL+8/Pz/8/Pz//V1dX/9PT0//T0 - 9P/09PT/9PT0//T09P/z8/P/9PT0/8HBwf8SEhL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ISEh/93d - 3f/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/+vr6//v7+//z8fH/u4RS09q9ov7z8/P/0NDQ/9PT - 0//z8/P/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/xcXF/w0NDf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8fHx//5+fn//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/6+vr/+/v7//Px8f+7hFHT2r2j/vPz - 8//Pz8//09PT//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T09P/j4+P/gICA/35+fv8cHBz/AAAA/wAA - AP8dHR3/oaGh/6SkpP/z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//r6+v/7+/v/8/Hx/7uE - UdPavaL+8vLy/9DQ0P/U1NT/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8/Pz/0hI - SP8AAAD/AAAA/xwcHP/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/+vr6//v7 - +//z8fH/vIRR09q8ov7z8/P/0NDQ/9XV1f/09PT/8/Pz//T09P/09PT/9PT0//Dw8P+1tbX/pqam/6am - pv+pqan/kJCQ/3l5ef95eXn/cXFx/7CwsP+oqKj/ra2t/9DQ0P/z8/P/9PT0//T09P/09PT/9PT0//T0 - 9P/6+vr/+/v7//Px8f+7hFHT2ryi/vPz8//Q0ND/1dXV//T09P/09PT/9PT0//T09P/09PT/7+/v/0lJ - Sf8DAwP/AwMD/wYGBv+3t7f/8fHx//Hx8f/Dw8P/BAQE/wUFBf8EBAT/Nzc3/+/v7//09PT/9PT0//T0 - 9P/z8/P/9PT0//r6+v/7+/v/8/Hx/7uEUdPavKL+8/Pz/9HR0f/X19f/9PT0//T09P/09PT/9PT0//T0 - 9P/v7+//S0tL/wAAAP8AAAD/BwcH/66urv/z8/P/8/Pz/8TExP8AAAD/AAAA/wAAAP83Nzf/6enp//Pz - 8//09PT/9PT0//Pz8//09PT/+fn5//v7+//z8fH/u4RR09q8ov7z8/P/09PT/9ra2v/09PT/9PT0//T0 - 9P/09PT/9PT0/+/v7/9SUlL/Dg4O/w4ODv8QEBD/ubm5//T09P/09PT/x8fH/wkJCf8NDQ3/CwsL/zk5 - Of/t7e3/9PT0//T09P/09PT/9PT0//T09P/4+Pj/+/r7//Px8f+8hFHT2ryi/vPz8//U1NT/3t7e//T0 - 9P/09PT/9PT0//T09P/09PT/8/Pz/9zc3P/Ozs7/zs7O/9DQ0P/q6ur/9PT0//T09P/q6ur/xsbG/8XF - xf/FxcX/yMjI//Pz8//z8/P/9PT0//T09P/09PT/9PT0//j4+P/6+vr/8/Hx/7uEUdPavKL+8/Pz/9ra - 2v/k5OT/9PT0//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//y8vL/8vLy//Ly8v/x8fH/8fHx//Ly - 8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//09PT/9vb2//n5+f/z8fH/u4JR09q8 - ov7z8/P/5eXl/97e3v/Z2dn/0dHR/8/Pz//Ly8v/x8fH/8XFxf/FxcX/xcXF/8TExP/ExMT/xcXF/8TE - xP/ExMT/xMTE/8TExP/ExMT/xcXF/8XFxf/FxcX/x8fH/8vLy//Ozs7/0dHR/9ra2v/n5+f/+Pj4//Px - 8f+3fEnX2ryi/vPz8//z8/P/7+/v/+3t7f/s7Oz/6urq/+rq6v/p6en/6Ojo/+jo6P/o6Oj/5+fn/+fn - 5//l5eX/5OTk/+Tk5P/l5eX/5+fn/+fn5//o6Oj/6Ojo/+jo6P/p6en/6urq/+vr6//s7Oz/7e3t//Dw - 8P/09PT/8/Hx/7t/SvHau5/+8uzn//Pt6P/z7ej/8+3o//Pu6P/z7ej/8+3o//Pt6P/z7ej/8+3o//Pu - 6P/z7ej/8+3o//Pt6P/z7ej/8+3o//Pt6P/z7ej/8+3o//Pt6P/z7ej/8+3o//Pt6P/z7ej/8+3o//Pt - 6P/z7ej/8+3o//Lu6v/w7Of/unpD/9ukc/70s37/9LJ9//Syff/0s33/9LN+//Szfv/0s37/9LJ9//Sy - ff/0s37/9LJ9//Syff/0sn3/9LN+//Szfv/0s37/9LN+//Syff/0sn3/9LJ+//Syff/0sn3/9LJ9//Sz - fv/0s37/9LN9//Syff/0s33/8q14/++fZf+4ZSH/3p1l/vSzfv/0sn3/9LJ9//Wyff/1s33/9bN+//Wz - fv/0sn3/9LJ9//Wzfv/0sn3/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9LJ9//Syff/1s37/9bN9//Wz - ff/0sn3/9bN+//Wzfv/1s33/9bJ9//Wzff/zrXb/8J9l/7trKf/enWT+9LN9//Syff/0sn3/9LJ9//Sy - fP/0s33/9LN9//SyfP/1s33/9bN9//Wyff/0s33/9LN9//Szff/0s33/9LN9//Wzff/1s33/9bN9//Wz - ff/1s33/9bN9//Wzff/1s33/9LN9//Syff/1s33/9LN9//Otdv/wn2X/u28x29eRVf7ysXr/9sN7//jL - fP/5zXz/+M98//jPe//40Hz/+NF7//jRe//40Xv/+NF7//jTfP/403v/+NJ8//jSfP/40nz/+NJ8//jT - e//40nv/+NJ8//jRfP/40Xz/99F8//jRfP/40Hz/+c98//nOfP/4zHz/9sN3/+6naP+6bzSTs2wvt8F6 - PfbSik7/1YxQ/9WMTv/Wjk7/1o5P/9WOTf/VkE7/1pFP/9iST//Zk1D/2ZVT/9qVU//bllP/25dV/9uX - Vf/bllP/2pZS/9mVUv/Yk1H/2JJP/9eRTv/WkE//1Y9O/9WOTv/Wjk//15BR/9eYYf/SiEv/v3Ey5qpk - JyGqYyoS27aSB6pbFCemTAAopkwGKKZTBiimUwYoplMGKKZTBiimTAYoplMGKKZZBiisWQ0orFkTKLJZ - EyiyWRMoslkTKLJZEyisWRMorFkNKKZZBiimUwYopkwGKKZTBiimUwYoplMGKKZMBiimTAYopkwGKKpb - GieqVVUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////+AAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///////////////ygAAAAwAAAAYAAAAAEAIAAAAAAAAEgAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAcx/ - MwqxTgANsU4ADbFOAA2xTgANsU4ADbFOAA2xTgANsU4ADbFOAA2xTgANsU4ADbFOAA2xTgANsU4ADbFO - AA2xTgANsU4UDbFOFA2xThQNsU4UDbFOFA2xThQNsU4UDbFOFA2xThQNsU4UDbFOAA2xTgANsU4ADbFO - AA2xTgANsU4ADbFOAA2xTgANsU4ADbFOAA2xTgANsU4ADbFOAA2xTgANsU4UDeOOVQn/f38CAAAAAAAA - AACuazYTqGIkW69oK4e7fUeLwohWi8CGUou7fkeLt3c+i7d3Pou3dz6Lt3c+i7d3Pou3dz6Lt3c+i7d3 - QIu5d0CLuXlCi7l7RIu7fUaLvX1Hi71+R4u/fkmLv35Ji7+ASYu/gEmLv4BJi79+SYu/fkmLvX1Hi7t9 - Rou5e0SLuXlCi7l3Qou3dUCLt3U+i7d3Pou3dz6Lt3c+i7d3Pou3dz6Lt3c+i7d3Pou3d0KLuXtEi7V2 - PYapZCVupWMqNn8AAAKoZClwtHZB5NKxk//cxK7/4Mm2/97ItP/cxK//28Gr/9rBqv/awar/2sGq/9rB - qv/awar/2sGq/9rBq//bwqv/3MOs/9vDrP/bw63/3cSu/93Erv/dxa//3cWv/93Fr//dxa//3cWv/93F - r//dxK//3cSu/9zDrf/cw6z/3MKs/9vCrP/awav/2sGq/9rBqv/awar/2sGq/9rBqv/awar/2sGq/9rB - qv/bwqz/2sGs/9e8o//Mp4f0rm00xKppNzOvbTLU07WZ//Hw7v/08/P/8/Pz//Pz9P/z8/P/8/Pz//Pz - 8//z8/P/8/T0//P09P/z9PT/8/Pz//Pz8//z9PT/8/T0//Pz8//z8/P/8/Pz//Pz8//z9PT/8/T0//P0 - 9P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/Pz//Pz8//z9PT/8/T0//T0 - 9P/09PT/9PT0//T09P/z9PT/8/T0//T08//u6ub/x5x1/6tnK426f0z47OPb//P09P/x8fH/7u7u//Pz - 8//09PT/9PT0//T09P/19fX/9vb2//b29//29vf/9vb2//b29v/39/f/9/f3//f39//39/f/9/f3//j4 - +P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/9/j4//f39//39/f/9/f3//f39//39/f/9/f3//f3 - 9//29vb/9vb2//X19f/09PT/9PT0//Pz8//z8/P/8/Pz//T09P/z8/P/2b6m/6xnKbzAjWD99PHu//Pz - 9P/w8PH/8vLy//r6+v/8/Pz//Pz8//z8/P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/8/Pz//Pz8//v7+//5+fn/9vb2//T09P/z8/P/3MOr/61l - KcLAj2L+9PPv//Pz9P/l5eX/1NTU/+rq6v/09PT/9fX1//X19f/29vb/9vb2//b29v/39/f/9/f3//j4 - +P/4+Pj/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5 - +f/5+fn/+fn5//j4+P/39/f/9/f3//f39//39/f/9/f3//b29v/19fX/9PT0//T09P/09PT/9/f3//X1 - 9f/08/P/3MOr/61lJ8LBjF3+8u7p//Pz8//i4uL/zs7O/+fn5//09PT/9PT0//T09P/09PT/8/Pz//Pz - 8//09PT/8/Pz//Pz8//09PT/9PT0//Pz8//z8/P/8/Pz//T09P/z8/P/8/Pz//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/19fX/+fn6//b29v/z8/P/3MOr/6xlJ8LAiFf+8ezn//Ly8v/g4OD/zMzM/+bm5v/09PT/8/Pz//Pz - 8//09PT/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//Dw8P/q6ur/6+vr/+vr6//w8PD/9PT0//T0 - 9P/09PT/8/Pz/+Pj4//p6en/6+vr/+fn5//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/29vb/+/v7//f39//z8/P/3MOr/6xlKcLAiFb+8evm//Hx8f/e3t7/ysrK/+Pj - 4//z8/P/8vLy//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0/9XV1f+QkJD/jY2N/6Ki - ov/k5OT/9PT0//T09P/09PT/8vLy/4qKiv+IiIj/jY2N/42Njf/y8vL/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/29vb//Pz8//f39//08/P/3MOr/61lKsLAiFb+8evm//Dw - 8P/c3Nz/yMjI/+Li4v/z8/P/8vLy//Pz8//z8/P/8/Pz//Ly8v/09PT/9PT0//T09P/09PT/9PT0/7Cw - sP8bGxv/AQEB/0VFRf/c3Nz/9PT0//T09P/09PT/8vLy/1hYWP8FBQX/AAAA/zExMf/p6en/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/29vb//Pz8//j4+P/08/P/3MOr/6xl - J8LAiFb+8ezn//Dw8P/a2tr/x8fH/+Li4v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0/6mpqf8eHh7/AAAA/ywsLP+Xl5f/mZmZ/5eXl/+Wlpb/mZmZ/z09Pf8EBAT/AAAA/zQ0 - NP/a2tr/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/39/f//f39//j4 - +P/08/P/3MOq/6xlJ8LAiFb+8ezn//Dw8P/a2tr/xsbG/+Hh4f/09PT/9PT0//T09P/09PT/8/Pz//Pz - 8//09PT/8/Pz//Pz8//z8/P/8/Pz/6ioqP8hISH/AAAA/wcHB/8gICD/Ghoa/xgYGP8XFxf/GRkZ/wwM - DP8BAQH/AAAA/zQ0NP/S0tL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/39/f//f39//j4+P/08/P/3MOq/61lJ8LAiFb+8evm//Dw8P/a2tr/xsbG/+Hh4f/09PT/9PT0//T0 - 9P/09PT/8/Pz//Pz8//09PT/8/Pz//Pz8//z8/P/8/Pz/6ioqP8iIiL/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/zU1Nf/Q0ND/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/39/f//f39//j4+P/08/P/3MOr/6xlKcLAiFb+8evm//Dw8P/Z2dn/xcXF/+Hh - 4f/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//Pz8//09PT/9PT0/6ioqP8gICD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/zU1Nf/S0tL/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/39/f//f39//j4+P/08/P/3MOr/6xlKcLAiFb+8ezn/+/v - 7//Y2Nj/xcXF/+Dg4P/z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/6qq - qv8dHR3/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/zQ0NP/d3d3/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/39/f//f39//j4+f/09PT/3MOr/6xl - J8LAiFb+8ezn/+/v7//X19f/xMTE/9/f3//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T0 - 9P/09PT/9PT0/7i4uP8dHR3/BAQE/wMDA/8BAQH/AAAA/wAAAP8AAAD/AAAA/wEBAf8EBAT/BQUF/zU1 - Nf/v7+//9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/39/f//f39//n5 - +f/09PT/3MOr/61lJ8LAiFb+8ezn/+/v7//X19f/xMTE/9/f3//z8/P/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0/+Pj4/+lpaX/oKCg/5WVlf88PDz/AAAA/wAAAP8AAAD/AAAA/zQ0 - NP+xsbH/xcXF/8XFxf/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/39/f//f39//n5+f/09PT/3MOr/6xlJ8LAiFb+8ezn/+/v7//Y2Nj/xcXF/+Dg4P/z8/P/8/Pz//Pz - 8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz/+bm5v9xcXH/AAAA/wAA - AP8AAAD/AAAA/y0tLf/a2tr/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/39/f//f39//n5+f/09PT/3MOr/6xlJ8LAiFb+8evm/+/v7//Z2dn/xsbG/+Dg - 4P/z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//Hx8f/o6Oj/4+Pj/+Pj4//j4+P/4+Pj/9vb - 2/9/f3//ISEh/yEhIf8hISH/ISEh/z4+Pv/S0tL/5OTk/+Pj4//k5OT/6urq//Ly8v/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/39/f//f39//n5+f/09PT/3MOr/61lJ8LAiFb+8evm//Dw - 8P/a2tr/xsbG/+Hh4f/09PT/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0/+rq6v+pqan/enp6/3Z2 - dv93d3f/dnZ2/3t7e/+hoaH/np6e/56env+enp7/np6e/3t7e/98fHz/enp6/3p6ev97e3v/hoaG/7m5 - uf/z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/39/f//f39//n5+f/09PT/3MOr/6xl - J8LAiFb+8evm//Dw8P/a2tr/xsbG/+Hh4f/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/+fn - 5/92dnb/FRUV/wkJCf8KCgr/CQkJ/xoaGv+dnZ3/7+/v/+7u7v/u7u7/7u7u/6Ojo/8dHR3/DAwM/w0N - Df8MDAz/ExMT/29vb//t7e3/9PT0//T09P/09PT/9PT0//T09P/z8/P/8/Pz//T09P/39/f//f39//j4 - +f/08/T/3MOr/6xlJ8LAiFb+8evm//Dw8P/a2tr/x8fH/+Li4v/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0/+np6f94eHj/Dw8P/wAAAP8AAAD/AAAA/xQUFP+Kior/9PT0//T09P/z8/P/8/Pz/6ys - rP8UFBT/AAAA/wAAAP8AAAD/CQkJ/2VlZf/i4uL/8/Pz//Pz8//z8/P/9PT0//T09P/z8/P/8/Pz//T0 - 9P/39/f//f39//j4+P/08/P/3MOr/6xlJ8LAiFX+8evm//Hx8f/b29v/yMjI/+Pj4//09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0/+np6f95eXn/EBAQ/wAAAP8AAAD/AAAA/xUVFf+Ghob/9PT0//Pz - 8//z8/P/8/Pz/6urq/8UFBT/AAAA/wAAAP8AAAD/CgoK/2RkZP/e3t7/8/Pz//Pz8//z8/P/9PT0//Pz - 8//z8/P/9PT0//T09P/39/f//f39//j4+P/08/P/3MOr/6xlJ8LAiFb+8evm//Hx8f/d3d3/ycnJ/+Tk - 5P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/+rq6v94eHj/Dw8P/wAAAP8AAAD/AAAA/xMT - E/+RkZH/9PT0//Pz8//z8/P/8/Pz/6urq/8UFBT/AAAA/wAAAP8AAAD/CQkJ/2RkZP/i4uL/9PT0//T0 - 9P/09PT/9PT0//Pz8//z8/P/9PT0//T09P/29vb//Pz8//j4+P/08/P/3MOr/61lJ8LAiFb+8evm//Ly - 8v/f39//y8vL/+Xl5f/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/+3t7f+mpqb/aGho/2Fh - Yf9iYmL/YGBg/2RkZP+urq7/9PT0//T09P/09PT/9PT0/7u7u/9RUVH/WVlZ/11dXf9YWFj/R0dH/4OD - g//y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/29vb//Pz8//j4+P/08/P/3MOr/61l - J8LAiFX+8evm//Pz8//i4uL/zc3N/+fn5//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/y8vL/7Ozs/+np6f/p6en/6urq/+7u7v/09PT/9PT0//T09P/09PT/9PT0//Dw8P/p6en/4+Pj/+Dg - 4P/i4uL/5ubm/+vr6//09PT/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/29vb/+/v7//f3 - 9//z8/P/3MOr/6xlJ8LAiFb+8evm//T09P/l5eX/0tLS/+np6f/09PT/9PT0//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/9PT0//T0 - 9P/19fX/+vr6//b29v/z8/P/3MOr/6xlJ8LAiFb+8evm//T09P/o6Oj/2dnZ/+fn5//s7Oz/6+vr/+np - 6f/p6en/5+fn/+fn5//m5ub/5ubm/+bm5v/l5eX/5eXl/+Xl5f/l5eX/5OTk/+Pj4//j4+P/4+Pj/+Pj - 4//j4+P/4+Pj/+Pj4//k5OT/5OTk/+Tk5P/l5eX/5eXl/+Xl5f/m5ub/5ubm/+bm5v/n5+f/6Ojo/+jo - 6P/p6en/6+vr/+zs7P/w8PD/9/f3//b29v/z8/P/3MOs/6lgIsLAiFb+8evm//T09P/t7e3/4uLi/97e - 3v/a2tr/1dXV/9DQ0P/Q0ND/zMzM/8rKyv/IyMj/xsbG/8XFxf/FxcX/xcXF/8XFxf/FxcX/xMTE/8TE - xP/FxcX/xcXF/8TExP/ExMT/xcXF/8TExP/ExMT/xMTE/8XFxf/FxcX/xcXF/8XFxf/FxcX/xsbG/8jI - yP/Kysr/zc3N/8/Pz//Q0ND/1tbW/9vb2//k5OT/8vLy//X19f/08/P/3MOs/6lgIM+/iFb+8evm//T0 - 9P/z8/P/7+/v/+np6f/m5ub/4+Pj/+Li4v/h4eH/39/f/97e3v/d3d3/3Nzc/9zc3P/b29v/29vb/9vb - 2//b29v/2tra/9ra2v/a2tr/2tra/9nZ2f/Z2dn/2tra/9ra2v/a2tr/2tra/9vb2//b29v/29vb/9vb - 2//c3Nz/3Nzc/93d3f/e3t7/39/f/+Hh4f/i4uL/5OTk/+bm5v/r6+v/8vLy//T09P/08/P/3MOs/61l - JOi/iFb+8ezm//T08//09PP/9PTz//T08//09PP/9PTz//T09P/09PP/9PTz//T08//09PP/9PTz//T0 - 8//z8/P/8/Pz//Pz8//z8/L/8/Py//Ly8v/y8vH/8vLx//Hx8f/x8fH/8vLx//Ly8f/y8vL/8/Py//Pz - 8v/z8/P/8/Pz//Pz8//09PP/9PTz//T08//09PP/9PTz//T09P/09PP/9PTz//T08//09PP/8vTz//Lz - 8//y8/P/28Os/69lI/i/h1T+8OTX//Lp4f/z6eL/8+ni//Pp4v/z6eL/8+nh//Pq4f/z6eH/8+ni//Pp - 4v/z6eL/8+ni//Pp4v/z6eL/8+nh//Pq4f/z6eH/8uni//Lp4f/y6eH/8unh//Lp4f/y6eH/8unh//Lp - 4f/y6eH/8unh//Lp4f/y6eH/8unh//Lp4f/y6eH/8unh//Lp4f/y6eH/8unh//Lp4f/y6eH/8unh//Lp - 4v/y6eL/8eni//Ls5//x6uT/3MCn/65fG//BfUL+87yP//O8j//zu5D/87uQ//O8kP/zvJD/87yP//O8 - j//zvI//87yQ//O8kP/zvJD/87yQ//O8kP/zvJD/87yP//O8j//zvI//87yQ//O8j//zvI//87yP//O8 - j//zvI//87yP//O8j//zvI//87yP//O8j//zu4//87uP//O7j//zu4//87uP//O7j//zu4//87yP//O8 - j//zvI//87yP//O8kP/zvJD/87yP//C1iv/vr4D/25di/6tYEP/EfT/+9LSB//Szfv/0sn3/9LJ9//Sy - ff/0s33/9LN+//Szfv/0s37/9LN+//Syff/0sn3/9LJ9//Syff/0s37/9LJ9//Syff/0sn3/9LJ9//Sy - ff/0s37/9LN+//Szfv/0s37/9LN+//Szfv/0s37/9LJ9//Szfv/0sn7/9LJ9//Syff/0sn3/9LJ9//Sy - ff/0sn3/9LN+//Szfv/0s33/9LJ9//Syff/0s33/9LJ9//Kpcv/xoWf/3oxP/61YEP/Hg0f+87WB//Sy - ff/0sn3/9bN9//Wyff/1sn3/9bN+//Wzff/1s33/9bN+//Wzff/1s33/9bN9//Wzff/1s37/9bN9//Wz - ff/1s33/9bN9//Wzff/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN9//Wzfv/1s37/9bN+//Wz - fv/1s33/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9bN9//Wzff/1s33/9bN9//Kocf/xoWf/3Y9V/7Fh - HP7GgkX+87SA//Syff/0sn3/9bJ9//Syff/0sn3/9LJ9//SyfP/0snz/9LN9//SyfP/0snz/9bN9//Wz - ff/1s33/9bN9//Wyff/1sn3/9LN9//Wzff/0s33/9LN9//Szff/0s33/9LN9//Wzff/1s33/9bN9//Wz - ff/1s33/9bN9//Wzff/1s33/9bN9//Wzff/1s33/9bN9//Syff/0sn3/9bJ9//Wzff/0s33/9LN9//Go - cf/woGf/3pJY/6teHtnDeDj98a95//Sze//0tXv/9bZ7//W4fP/1uHz/9bh8//W4fP/0uHv/9Ll8//W5 - fP/1uXz/9bl8//W5fP/1uXz/9bl8//W5fP/1unz/9bp8//W6fP/0unz/9Lp8//W6fP/1unz/9bp8//W6 - fP/1unz/9bp8//W6ff/1un3/9bl9//W5ff/1uX3/9bl8//W5fP/1uXz/9bl8//W4fP/1uHz/9rh8//a5 - fP/1uHz/9Lh8//Gtcf/womf/14lN/6tgJKS6bi3135xi//O0e//1vHv/98F7//fFfP/3xnz/98h8//fJ - fP/4yXv/+Mp8//jLfP/4zHv/+Mx7//jNe//4zXv/+M17//jNe//4znz/+M97//jQe//4z3z/+M98//jP - fP/4z3z/+M98//jPfP/4z3v/+NB7//jOfP/4znz/+M18//jNfP/4zXz/+Mx8//fMfP/3zHz/+Mt8//jJ - fP/4yXz/+Mh8//jHfP/3xnz/9sJ6//O2cf/up2f/x3k596lmM1CuZimovXY5z9aRV/zfmF//4Zti/+Cb - YP/gnGD/4Z1g/+KeYP/in2D/4qBg/+KiX//iol//4qNf/+OkYP/kpWD/5aZh/+WmYf/lp2L/5ahi/+Wp - Yv/mqWL/5qlj/+aqY//mqmT/5qpj/+apY//lqWL/5ali/+SnYv/kpmH/5KZg/+SmYP/jpV//46Ng/+Oj - YP/iomD/4qFg/+KfYP/in2D/4p9h/+KfZP/homr/351m/92QU//Ug0b0sWkqpbl0LguqaTsnpmAlRbJr - LYG/dDSXwXMymcFxL5nBcS+ZwXMvmcFzL5nBcS+ZwXEvmcFzL5nBcy+ZwXEwmcFxMJnDczKZw3Q0mcN2 - NJnEdjWZxng5mcZ5OZnIeTmZyHk6mch5OpnIeTqZyHk5mch5OZnGeTmZxng3mcR2NZnDdjSZw3QymcNz - MJnBcS+ZwXEvmcFzMJnBcy+ZwXMvmcFxMJnBczCZw3MymcN2N5nDfUOZv3k+mb5yMZazZid2pWktIgAA - AAEAAAAAAAAAAKpxOQm2YSQVrlEAFq5RABauUQAWrlEAFq5RABauUQAWrlEAFq5RABauUQAWolEAFqJR - ABaiUQAWrlEMFq5RDBauUQwWrlEMFq5dDBauXQwWrl0XFq5dFxauXQwWrl0MFq5dDBauXQwWrlEMFq5R - DBauUQwWrlEMFq5RABaiUQAWolEAFq5RABauUQAWrlEAFq5RABauUQAWrlEAFq5RABaiUQAWolEAFrJm - JhSqf1UGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAMAAAAAABwAAgAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAMAAAAAABwAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAQAAAAIAAAAABACAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/Ikg7GdzktpE8GLapVBi2wVQYtsE8GLapPBi2qTwYtqk8GLapP - Cy2qTwstqk8LLapPCy2qTwstqk8LLapPCy2qTwstqk8LLapVCy2qVQstsFURLbBVES2wVREtsFURLbBV - ES2wWxctsFsXLbBbFy2wWxctsFsXLbBbFy2wWxcttVsXLbBbFy2wWxctsFsXLbBVES2wVREtsFURLbBV - ES2wVQstqk8LLapPCy2qTwstqk8LLapPCy2qTwstqk8LLapPCy2qTwstqk8LLapPCy2qTwstqk8GLapP - Bi2qTwYtu2YoLeGygiv/qqoDAAAAAAAAAAAAAAAAv79/BK10O1qjXBzsql4c/7FvMP+2czr/uHQ7/7Vy - Of+zbjP/smss/7BqK/+waiv/sWor/7FqK/+xaiv/sWor/7FqK/+xaiv/sWor/7FqLP+zbC7/tG4w/7Ru - MP+1bzH/tnAz/7ZxNP+3cTb/uHI2/7hzN/+5czf/uXQ4/7l0OP+5dDj/uXQ4/7lzOP+5czf/uXI2/7dx - Nv+2cTT/tnAz/7VvMv+1bjD/tW0w/7RsLv+yaiz/sWkr/7FqK/+xaiv/sWor/7FqK/+waiv/sGor/7Bq - K/+waiv/sGor/7BqK/+xai7/sWwv/7BoLP+oYiT/p18j8KllLZKwdk4aAAAAAK1zQFSpUwz7xJhu/+/p - 4P/v7Or/8e/t//Hu7v/x7u7/7+7r//Ds6f/u7On/7+3q/+7t6v/u7er/7u3q/+7t6v/u7er/7u3q/+7t - 6v/u7er/7u3q/+7t6v/u7ev/7uzq/+/s6v/w7er/7+zq/+7t6v/v7uv/7u3r/+7t6//u7ev/7u3r/+7t - 6//u7ev/7u3r/+7t6//u7er/7u3r/+7t6v/u7er/7e3q/+7t6v/u7er/7uzq/+7t6v/u7On/7u3q/+7t - 6v/u7er/7u3q/+/t6v/v7er/7+3q/+/t6v/v7en/7+3r/+7t6//v7Or/8Ork/+bVw/+vbjf/oFkV762F - XBmjWhnIrWkw/+7r5f/z8/P/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8/Pz//Ly8v/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/z8/P/8/Pz//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//Pz8//z8/P/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//Pz - 8//x8fP/5t7Q/6NTDv6saDFipVYU8ti4nv/y8vH/9PT0//T09P/z8/P/8/Pz//Pz8//z8/P/8/Pz//Ly - 8v/09PT/9PT0//T09P/z8/P/8/Pz//Ly8v/09PT/8/Pz//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//Pz - 8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/z8/P/8/Pz//Pz8//09PT/8/Pz//Pz8//09PT/9PT0//Pz8//z8/P/9PT0//Pz8//09PT/9PT0//T0 - 9P/z8/P/8/Pz//T09P/z9PP/8vLz//Ty8P+wcjn/rGcsl6VWEvzy49n/8fLy//T09P/09PT/3t7e/+3t - 7f/z8/P/9PT0//X19f/19vb/9vb2//j4+P/5+fn/+vr6//r6+//6+vv//Pz8//v7+//7+/v//Pz8//z8 - /P/8/Pz//P39//z8/P/8/Pz//Pz8//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/8/f3//P39//z8/P/8/Pz//Pz8//z8/P/7+/v//Pz8//v7+//7+/v/+vr6//n5+v/5+fn/+Pj4//f3 - 9//29vb/9PT0//T09P/z8/P/8vLy//Ly8v/z8/P/9PPz//Ly8f/08vL/un9M/6pnLKikWBb+8u/n//Pz - 8//z8/P/8vLz/+vr6//29vb//Pz8//7+/v/9/f3//f39//7+/v/+/v7//v7+//39/f/+/v7//v7+//7+ - /v/+/v7//v7+//39/f/9/f3//f39//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//f39//39/f/9/f3//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//f39//39/f/9/f3//Pz8//r6+v/39/f/9fX1//Tz9P/z8/H/9fLy/7qA - TP+rZyyopFgW/vLv6P/y8/L/8/Pz//Pz8//Ly8v/1dXV//Ly8v/09PT/9fX1//X19f/39/f/9/f3//f3 - 9//4+Pj/+Pj4//n5+f/5+fn/+fn5//r6+v/7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7 - +//7+/z/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//r6 - +v/5+fn/+fn5//n5+f/4+Pj/+Pj4//f39//39/f/9/f3//X19f/09PT/9PT0//Ly8v/y8vL/9PT0//n5 - +f/08/T/8/Px//Xy8v+5gEz/q2cqqKRWE/706d//8vPy//Pz8//z8/P/x8fH/8/Pz//z8/P/9PT0//Pz - 8//z8/P/9PT0//T09P/z8/P/8vLy//Ly8v/z8/P/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//T09P/09PT/8vLy//Pz9P/z8/P/8vLz//Pz8//09PT/9PT0//T09P/09PT/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8vLy//Ly8v/y8vL/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8/Pz//j4+P/7+/v/8/Pz//Pz8f/18vL/uYBL/6pnKqilVA/+7+LW//Lz8//z8/P/8fHx/8TE - xP/Nzc3/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/9PT0//T09P/z8/P/8/Pz//T0 - 9P/09PT/9PT0//Pz8//09PT/8vLy//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Pz8//5+fn//Pz8//Ly8v/z8vH/9fLy/7mAS/+qZyqopVQN/u3f - 0v/z8/P/8vLy/+3t7f/ExMT/y8vL//Ly8v/09PT/8/Pz//Pz8//09PT/9PT0//T09P/z8/P/8/Pz//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/7e3t/+3t7f/t7e3/7u7u//Ly8v/09PT/9PT0//T0 - 9P/09PT/9PT0//Pz8//o6Oj/7Ozs/+3t7f/t7e3/8fHx//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/+/v7//39/f/z8/P/8/Px//Ty - 8v+6gEz/q2ctqKZTDf7t39L/8vLy//Ly8v/o6Oj/xMTE/8nJyf/y8vL/9PT0//Pz8//z8/P/9PT0//T0 - 9P/09PT/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/2tra/6mpqf/IyMj/yMjI/7m5 - uf/l5eX/9PT0//T09P/09PT/9PT0//T09P/y8vL/Wlpa/8XFxf/IyMj/vLy8/5CQkP/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//v7 - +//9/f3/8/Lz//Py8f/08vL/uoBO/6tnLaimUw3+7d/S//Ly8v/y8vL/5OTk/8XFxf/Jycn/7+/v//Pz - 8//z8/P/8vLy//T09P/y8vL/8/Pz//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/7Ky - sv8bGxv/AAAA/wAAAP9iYmL/2tra//T09P/09PT/9PT0//T09P/09PT/8PDw/y4uLv8BAQH/AAAA/wIC - Av82Njb/7u7u//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/7+/v//v7+//T09P/z8/H/9PLy/7qATP+qZyyoplMN/u3f0v/y8vL/8/Pz/+Dg - 4P/ExMT/x8fH//Hx8f/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8/Pz//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P+pqan/IyMj/wAAAP8AAAD/YmJi/9zc3P/09PT/9PT0//T09P/09PT/9PT0//Dw - 8P8vLy//AQEB/wAAAP8GBgb/NDQ0/+Xl5f/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P//Pz8//7+/v/19fX/8/Px//Xy8v+5gEv/qmcqqKZT - Df7t39L/8/Pz//Pz8//d3d3/xMTE/8fHx//x8fH/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/paWl/ykpKf8AAAD/AAAA/zo6Ov+VlZX/iIiI/3Jy - cv9sbGz/a2tr/3Fxcf+Li4v/Kioq/wAAAP8AAAD/BgYG/zQ0NP/Z2dn/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//z8/P/+/v7/9vb2//Py - 8f/18vL/uoFL/6pnKqimUw3+7d/S//Pz8//z8/P/3Nzc/8XFxf/Gxsb/8fHx//T09P/09PT/9PT0//T0 - 9P/09PT/8/Pz//Pz8//z8/P/9PT0//T09P/z8/P/8/Pz//Pz8//z8/P/9PT0/6Wlpf8tLS3/AAAA/wAA - AP8BAQH/ExMT/xEREf8aGhr/Gxsb/xsbG/8YGBj/EBAQ/wgICP8AAAD/AAAA/wcHB/80NDT/zs7O//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz - 8//8/Pz//v7+//f39//z8vH/9fLy/7qAS/+rZyqoplMN/u3f0v/z8/P/8/Pz/9nZ2f/FxcX/xcXF//Dw - 8P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8/Pz//T09P/09PT/8/Pz//Pz8//z8/P/8/Pz//T0 - 9P+lpaX/Ly8v/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8HBwf/NDQ0/8/Pz//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/z8/P//f39//7+/v/4+Pj/8vLx//Ty8v+5gEv/q2cqqKZTDf7t39L/8/Pz//Pz - 8//Z2dn/xcXF/8bGxv/w8PD/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//Pz8//09PT/9PT0//Pz - 8//z8/P/8/Pz//Pz8//09PT/paWl/y4uLv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/BwcH/zQ0NP/Ozs7/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//39/f/+/v7/+Pj4//Ly8f/08vL/uoBN/6pn - LKimUw3+7d/R//Pz8//z8/P/2NjY/8TExP/FxcX/8PDw//Pz8//z8/P/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/z8/P/8/Pz//T09P/09PT/9PT0/6Wlpf8qKir/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wcHB/80NDT/0dHR//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//9/f3//v7+//n5 - +f/y8vH/9PLy/7qBTf+qZyyoplMN/u3f0v/z8/P/8/Pz/9bW1v/ExMT/xcXF/+/v7//z8/P/8/Pz//Pz - 8//09PT/9PT0//T09P/09PT/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P+oqKj/JSUl/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8GBgb/NDQ0/9ra - 2v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/z8/P//f39//7+/v/5+fn/8vLx//Ty8v+6gU3/qmcqqKZTDf7t39L/8/Pz//Pz8//V1dX/xcXF/8TE - xP/u7u7/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/rKys/x4eHv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/BQUF/zQ0NP/p6en/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//39/f/+/v7/+vr6//Py8f/08vL/uoFM/6tnKqimUw3+7d/S//Pz - 8//z8/P/1NTU/8TExP/ExMT/7u7u//Pz8//z8/P/8vLy//T09P/y8vL/8/Pz//Pz8//z8/P/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0/8XFxf8yMjL/JSUl/yUlJf8jIyP/AgIC/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wsLC/86Ojr/RkZG/0dHR/9bW1v/8fHx//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/9/f3//v7+//r6+v/y8vH/9PLy/7qB - TP+rZyqoplMN/u3f0v/z8/P/8/Pz/9XV1f/ExMT/xMTE/+7u7v/z8/P/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/w8PD/z8/P/8bGxv/Hx8f/y8vL/2Ji - Yv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP9BQUH/zs7O/8vLy//Kysr/3t7e//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT//f39//7+ - /v/7+/v/8vLx//Xy8v+6gUz/qmcqqKZTDf7t39L/8/Pz//Pz8//V1dX/xMTE/8XFxf/u7u7/8/Pz//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz - 8//z8/P/8/Pz//Dw8P+BgYH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Nzc3/+vr6//09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//39/f/+/v7/+/v7//Ly8f/18vL/uoBM/6tnKqimUw3+7d/S//Ly8v/y8vL/19fX/8XF - xf/FxcX/7u7u//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/x8fH/gYGB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/zU1 - Nf/r6+v/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/9/f3//v7+//r6+v/y8vH/9fLy/7qATP+rZyqoplMN/u3f - 0v/y8vL/8vLy/9jY2P/FxcX/xcXF/+/v7//z8/P/8/Pz//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/7+/v/4GBgf8DAwP/AwMD/wMD - A/8DAwP/AwMD/wMDA/9AQED/7Ozs//Ly8v/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz8//09PT/9PT0//T0 - 9P/09PT/9PT0//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT//f39//7+/v/6+vr/8vLx//Xy - 8v+6gEz/q2cqqKZTDf7t39L/8/Pz//Pz8//Z2dn/xcXF/8XFxf/w8PD/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/jY2N/0xMTP9PT0//UVFR/1FRUf9QUFD/TExM/0tL - S//AwMD/1NTU/9TU1P/U1NT/1NTU/9TU1P/X19f/dHR0/2JiYv9YWFj/VlZW/1ZWVv9XV1f/XFxc/2Nj - Y//Dw8P/9PT0//T09P/09PT/9PT0//T09P/z8/P/8vLy//Pz8//z8/P/9PT0//T09P/09PT/8/Pz//39 - /f/+/v7/+vr6//Ly8f/18vL/uoFM/6pmKqimUw3+7d/S//Pz8//z8/P/2tra/8XFxf/Gxsb/8PDw//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/6Wlpf8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8HBwf/qqqq//T09P/09PT/9PT0//Pz8//z8/P/8/Pz/6+vr/8EBAT/AQEB/wQE - BP8FBQX/AgIC/wAAAP8FBQX/lpaW//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz - 8//z8/P/9PT0//Pz8//9/f3//v7+//n5+f/y8vH/9fLy/7qBTP+qZyqoplMN/u3f0v/z8/P/8/Pz/9zc - 3P/FxcX/xsbG//Hx8f/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P+ioqL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Dw8P/4SEhP/09PT/9PT0//T09P/z8/P/8vLy//Pz - 8/+qqqr/BAQE/wAAAP8AAAD/AAAA/wAAAP8AAAD/DAwM/3p6ev/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Pz8//y8vL/8/Pz//T09P/z8/P//f39//7+/v/5+fn/8vLx//Xy8v+6gUz/q2cqqKZT - Df7t39L/8/Pz//Pz8//e3t7/xcXF/8fHx//x8fH/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/oqKi/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xMTE/93d3f/9PT0//T0 - 9P/09PT/8/Pz//Pz8//09PT/qKio/wQEBP8AAAD/AAAA/wAAAP8AAAD/AAAA/xEREf9zc3P/8vLy//Ly - 8v/z8/P/8vLy//Pz8//09PT/9PT0//T09P/09PT/8/Pz//Pz8//09PT/8/Pz//z8/P/+/v7/+Pj4//Ly - 8f/18vL/uoFM/6pnKqimUw3+7d/S//Pz8//z8/P/4ODg/8XFxf/IyMj/8fHx//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/6Kiov8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8TExP/dnZ2//T09P/09PT/8/Pz//Pz8//z8/P/8vLy/6ioqP8EBAT/AAAA/wAAAP8AAAD/AAAA/wAA - AP8SEhL/cnJy//Ly8v/z8/P/8/Pz//Pz8//z8/P/9PT0//T09P/z8/P/8vLy//T09P/09PT/9PT0//Pz - 8//7+/v//v7+//f39//z8vH/9fLy/7qBTP+qZyqoplMN/u3f0v/z8/P/8/Pz/+Tk5P/FxcX/ycnJ//Hx - 8f/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P+jo6P/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/Dg4O/4KCgv/09PT/9PT0//Pz8//z8/P/8/Pz//Ly8v+pqan/BAQE/wAA - AP8AAAD/AAAA/wAAAP8AAAD/Dw8P/3R0dP/z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//Ly - 8v/09PT/9PT0//T09P/z8/P/+/v7//7+/v/39/f/8/Lx//Xy8v+6gUz/q2cqqKZTDf7t39L/8/Pz//Pz - 8//p6en/xMTE/8rKyv/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/o6Oj/wICAv8DAwP/BAQE/wQEBP8EBAT/AgIC/wgICP+qqqr/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/r6+v/wQEBP8AAAD/AAAA/wAAAP8AAAD/AAAA/wgICP+Pj4//9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//v7+//+/v7/9vb2//Py8f/18vL/uoFM/6tn - KqimUw3+7d/S//Pz8//z8/P/7u7u/8TExP/Ly8v/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0/+Dg4P/Pz8//y8vL/8rKyv/Kysr/ysrK/8vLy/+/v7//0NDQ//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0/9LS0v+hoaH/tbW1/76+vv/Hx8f/vr6+/7CwsP+Xl5f/tLS0//T0 - 9P/z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//7+/v//v7+//T0 - 9P/z8vH/9fLy/7qBTP+rZyqoplMN/u3f0v/z8/P/8/Pz//Hx8f/FxcX/zc3N//Pz8//09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8vLy//Ly8v/y8vL/8vLy//Ly - 8v/y8vL/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//Pz8//x8fH/8fHx//Hx8f/w8PD/8PDw//Dw - 8P/x8fH/8vLy//Ly8v/09PT/8/Pz//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/z8/P/+/v7//7+/v/z8/P/8/Lx//Xy8v+6gUz/qmcqqKZTDf7t39L/8/Pz//Pz8//z8/P/x8fH/9DQ - 0P/z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8/Pz//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8/Pz//r6+v/9/f3/8vLy//Ly8f/18vL/uoFM/6tnKqimUw3+7d/S//Pz - 8//09PT/9PT0/8vLy//Y2Nj/8/Pz//T09P/09PT/9PT0//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Pz - 8//y8vP/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/x8fH/8fHx//Hx8v/w8PD/8PDw//Hx - 8f/x8fH/8fHx//Hx8f/x8fH/8vLy//Hx8f/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vP/8vLy//Ly - 8v/y8vL/8vLy//Ly8v/y8vL/8/Pz//T09P/09PT/9PT0//Pz8//4+Pj//Pz8//Ly8v/z8/H/9fLy/7qA - Tf+oYyaoplMN/u3f0v/z8/P/9PT0//T09P/R0dH/4uLi//Ly8v/w8PD/6+vr/+Pj4//c3Nz/29vb/9nZ - 2f/V1dX/0tLS/9DQ0P/MzMz/ycnJ/8nJyf/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jI - yP/Jycn/yMjI/8jIyP/IyMj/yMjI/8fHx//Hx8f/x8fH/8jIyP/Hx8f/yMjI/8jIyP/IyMj/yMjI/8jI - yP/Jycn/ycnJ/8zMzP/R0dH/09PT/9bW1v/Z2dn/29vb/93d3f/k5OT/7Ozs//Hx8f/y8vL/9/f3//v7 - +//z8/P/8/Px//Xy8v+5gE3/n1gYqKZTDf7t39L/8/Pz//T09P/09PT/5eXl/9fX1//Kysr/xMTE/8PD - w//Dw8P/w8PD/8TExP/ExMT/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE - xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE - xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/w8PD/8PD - w//ExMT/zc3N/+Tk5P/5+fn/9PP0//Pz8f/18vL/uYBN/6ljJcGmUw3+7d/S//Pz8//09PT/9PT0//T0 - 9P/y8vL/8vLz//Hx8f/r6+v/5OTk/+Li4v/f39//3Nzc/9jY2P/V1dX/09PT/9HR0f/Pz9D/z8/P/87O - zv/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/ysrK/8rKyv/MzMz/zMzM/8zM - zP/MzMz/zMzM/8zMzP/MzMz/zc3N/83Nzf/Nzc3/zs7O/8/Pz//Pz9D/0dHR/9PT0//V1dX/2dnZ/93d - 3f/g4OD/4uLi/+bm5v/t7e3/8fHx//Pz8//z8/P/9fX1//Tz9P/z8/H/9fLy/7mBTf+pXyHTpVMM/u3f - 0v/z8/P/9PT0//T09P/09PT/8/Pz//Pz8//z8/P/8/P0//Pz8//z8/P/8/P0//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/P0//Pz9P/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//y8vL/8vLy//Ly - 8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//08/T/8/Px//Xy - 8v+5gU7/sGoq+KZTDP7t3tL/8vPy//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Lz - 8//x8/H/8/Lx//Dy8f/z8vL/uoBN/61kIv+kVA/+7+DR/+/t6v/y7er/8u7r//Lu6//y7uv/8u7r//Lu - 6//y7er/8u7p//Lu6f/y7uv/8u7r//Lu6//y7uv/8u7r//Lu6//y7uv/8u7r//Lu6//y7er/8u7p//Lu - 6f/y7uv/8u7r//Lu6//y7ur/8u7q//Lt6v/y7uv/8u3p//Lt6f/x7en/8u3q//Ht6v/x7er/8u3q//Lu - 6v/y7ur/8u7q//Lt6f/y7en/8u7p//Lu6v/y7ur/8u7q//Lu6v/y7ur/8e3q//Lt6f/x7un/8u3p//Lu - 6v/y7ur/8u7r//Lu6//y7ev/8uzr//Hv8f/x7uj/8u/s/7l/TP+tXBj/p1UQ/u+4if/xuIn/8riK//K4 - iv/yuIr/8rmK//K5iv/yuYr/8riK//K4iv/yuIr/8rmK//K5iv/yuYr/8rmK//K5iv/yuYr/8rmK//K5 - iv/yuYr/8riK//K4iv/yuIr/8rmK//K5iv/yuYr/8rmK//K5iv/yuIr/8rmK//K4iv/yuIr/8riK//K4 - iv/yuIr/8riK//K4iv/xuIr/8biK//K5iv/yuIr/8riK//K4iv/yuIr/8riK//K4iv/yuIr/8riK//K4 - iv/yuIr/8riK//K4iv/yuYr/8rmK//K5iv/yuYr/8riK//G4h//uupP/7ad2/+ure/++djn/qVUN/6ha - Ff7xtoP/9LJ9//Wzfv/1s37/9LJ9//Syff/0sn3/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Sy - ff/0sn3/9bN+//Syff/0sn3/9bN+//Syff/0sn3/9bN+//Syff/0sn3/9LJ9//Syff/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/0sn3/9LJ9//Wzfv/1s37/9LJ9//Syff/0sn3/9LJ9//Sy - ff/0sn3/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9LJ9//Syff/1s37/9bN+//Wyff/0sn3/8adw//Gf - Zv/xn2X/xHIy/6pUDP+uYB7+8LaH//Wyff/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/0sn3/9LJ9//Wzfv/0sn3/9LJ9//Syff/0sn3/9LJ9//Wzfv/0sn3/9LJ9//Sy - ff/0sn3/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9LJ9//Syff/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/0sn3/9LJ9//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Syff/0sn3/9LJ9//Sy - ff/1sn3/9LJ9//Gocf/xn2b/8J5l/8RyMf+sWRP/r2Mj/vC2h//1sn3/9LJ9//Syff/0sn3/9LJ9//Sy - ff/0sn3/9bN+//Wzfv/0sn3/9bN+//Wzfv/1s37/9LJ9//Syff/1s37/9LJ9//Syff/0sn3/9LJ9//Sy - ff/1s37/9LJ9//Syff/0sn3/9LJ9//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Sy - ff/0sn3/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/0sn3/9LJ9//Syff/0sn3/9bN+//Syff/wp3D/8J9m/++fZv/GfUL/sGUk/69jIv7wt4X/9LJ+//Wz - fv/1s37/9bN+//Wzfv/1s37/9LJ9//Wzfv/1s37/9LJ9//Wzfv/1s37/9bN+//Syff/0sn3/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9LJ9//Wzfv/0sn3/9LJ9//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/0s33/8KZw//CfZv/vn2b/yYJG/6he - ItCpWhb+8rOA//Oye//zsnz/87J8//SyfP/0snz/87J9//SxfP/0snz/9LJ8//OyfP/zsnz/87J8//Sy - fP/0sX3/9LF9//WyfP/1sn3/9bJ9//Wyff/1sn3/9bJ9//SyfP/1s33/9LJ9//Syff/1s33/9bN9//Oz - e//zs3z/87N8//SzfP/0s3z/9bN8//Wze//1snz/9bJ9//Wzff/1s33/9bN9//Wzff/1sn3/9bJ9//Wz - ff/1sn3/9bJ9//Wyff/1sn3/9bJ9//SyfP/0snz/9LJ8//WyfP/1snz/9LN8//SzfP/zsnz/87J8/++m - bv/wnmb/7p5l/8B3O/+rYyqkqFQM/uincP/0sXv/9Ld8//bAfP/3wnz/9sR8//bEe//3xHv/98V8//fF - fP/3xXz/98Z8//fGfP/3xnz/98Z8//fGfP/4x3v/+Md7//fHe//3x3v/98d7//fHe//4x3z/+Ml8//jJ - fP/4yXz/+Ml8//jJff/4yX3/+Ml8//jJfP/4yX3/+Ml9//jJff/4yX3/+Ml8//jJfP/4yHz/+Mh8//jI - fP/4yHz/+Md8//jHfP/4x3z/+Md8//jHff/3xn3/98Z9//fGff/3xnz/98Z8//fFfP/4xXz/+MR8//fE - fP/3xXz/9sR8//bDfP/yunT/8rRw/++haf+vXxz+p2MqWqRWFPPDgET/8rF9//Gye//0uHr/9b17//bB - ff/2xHz/98d7//bJev/2y3r/98x7//jOev/4znv/99B7//jRe//40nz/+NN9//jTff/41H3/+dR9//nV - ff/41H3/+dV9//nWff/41X3/+NV9//jWff/41n3/+dV+//jVff/41X3/+NV9//nVfv/41X3/+dV9//jV - ff/41n3/+NV9//nVfv/41X3/+dV+//nVff/51X3/+dR9//jUfP/41Hz/99N7//fSe//30Xv/99B7//jO - e//4zXv/+Mt7//jLe//3yHz/9sV8//XDfP/0v3n/8K9q/+yjZf/klFj/pFYV/KVwQyKraTWbp1MO9tSS - Vv/yrHb/8LB6//Oxff/0sn3/8rJ8//KwfP/ysHz/87F8//OxfP/ysHr/8bB6//Kwev/0sHn/87F4//Gx - eP/xsXj/8bJ4//KzeP/ztHj/87R4//O1eP/ztnn/87Z5//S3ef/0t3n/9Ld5//O4ef/zuHn/9Lh5//O4 - ef/zuHn/9bh4//O4ef/0uHn/87h5//O2ef/ztnn/87V4//O0eP/ztHj/8rN4//KyeP/xsnf/9LJ4//Ow - d//zsHr/9LB7//Owev/ysHr/8rB6//KxfP/ysX3/8rJ8//Czf//us4D/8Kt3//CcZP/tmWD/vW4r/ad0 - QYYAAAAA1NSqBqFkNy6lYye/qF8e/7JlIv+1aCf/tmkn/7dpJf+4aCT/uGgl/7hoJf+4aCX/t2gl/7do - Jf+3aCP/uGgk/7hoJP+5aCX/uWgl/7tpJv+8aif/vWwp/71sKv+9bSr/vm0t/75uLf/Aby7/wXAu/8Fw - Lv/BcS//wnIx/8JyMf/CcjH/wnIx/8FxMP/BcC7/wHAu/8BvLv+/bi3/vm0t/71tK/+9bCr/vGwp/7xr - Jv+7aSX/umgk/7loJf+5aCX/uGgk/7hpJP+3aCT/t2cl/7doJf+4aSf/uWkn/7hsKv+5dDr/unY7/7ht - Lv+zZB7/rF0c+KdoMX0AAAAAAAAAAAAAAAAAAAAAAAAAAMaZcS2yaCxMqVMDTalPA02pTwdNqU8KTalT - Ck2pUwpNqVMKTalTCk2pUwpNqVMKTalTCk2pUwpNqVMKTaVPB02lTwdNqVMKTalWDU2pVg1NrFYNTaxW - EU2sVhFNr1kUTa9dFE2vXRRNr10XTa9dF02vXRdNr10XTa9dFE2vXRRNr10UTa9dFE2sXRRNrFkRTaxW - EU2sVg1NqVYNTalWDU2pUwpNpVMKTaVPCk2pUwpNqVMKTalTCk2pUwpNqVMKTalTCk2pUwdNpU8HTalT - B02pTwdNpU8KTaVPB02lTwpNq2EsTLqTYhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// - /////////////////////////////////////////////////////////////8AAAAAAAAADgAAAAAAA - AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAcAAAAAAAAAH//////////////////////// - ////////////////////////////////////////KAAAAIAAAAAAAQAAAQAgAAAAAAAAAAIAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/VoTHaj1RSt1oZUqVRDFKlVAZSq1QGUqtUBlKrVAZSq1QGUqtR - BlKuUQlSrlEJUqhUBlKoVAZSqFEGUqhRDFKoUQxSqFEMUqhRDFKoUQxSqFEMUqhRDFKoUQxSqFEMUqhR - DFKoUQxSqFEMUqhRDFKoUQxSqFEMUqhRDFKoUQxSqFEMUqhRDFKoUQxSqFQMUqtUDFKrVAxSq1QQUqtX - EFKrVxBSq1cQUq5XE1KrVxNSq1cWUq5XFlKuVxZSrlcWUrFaFlKxWhZSsVoWUrFaFlKxWhZSsV0WUrFd - FlKxXRlSsV0ZUrFdFlKxXRZSsV0ZUrFdGVKxXRlSsV0ZUrFdGVKxXRZSsV0WUrFdFlKxWhZSsVoWUrFa - FlKxWhZSrlcWUq5XFlKuVxZSrlcWUq5XFlKrVxBSq1cQUqtXEFKrVBBSq1QMUqtUDFKrUQxSqFEMUqhR - DFKoUQxSqFEMUqhRDFKoUQxSqFEMUqhRDFKoUQxSqFEMUqhRDFKoUQxSqFEMUqhRDFKoUQxSqFEMUqhR - DFKoUQxSqFEMUqhRDFKoUQxSqFEMUqhRCVKrUQlSq1EJUqhRCVKoUQlSq1QMUrRaGVLNfztS159jUvfU - nkIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMeeeDegazipn1wh/6FR - C/+pUgf/p1QI/6VUCf+pUwr/qlIK/6pSCv+qUgr/qFIM/6hSDP+oUwv/qFQJ/6hUCP+oVAr/qFQL/6hU - C/+oVAv/qFQL/6hUC/+oVAv/qFQL/6hUC/+oVAv/qFQL/6hUC/+oVAv/qFQL/6hUC/+oVAv/qFQL/6hU - C/+oVAv/qFQL/6lUC/+qVQ7/q1YO/6tWD/+sVxD/rFgQ/6xYEP+tWRH/rloS/65aFP+uWhT/rlsU/69b - FP+vXBb/sVwW/7FdFv+xXRb/sl0Y/7JeGP+xXhj/sV4Y/7JfGf+yXxn/sl8Z/7JfGf+yXxn/sl8Z/7Jf - Gf+yXxn/s18Z/7JeGP+yXhj/sl4Y/7JdF/+yXRf/sV0X/7BcFv+wWxb/sFsV/69bFP+vWhT/rloU/61Z - E/+tWBD/rVgQ/6xXEP+sVg//rFYO/6tVDv+rVAz/q1QM/6pTC/+oUwv/qFQL/6hUC/+oVAv/qFQL/6hU - C/+oVAv/qFQL/6hUC/+oVAv/qFQL/6hUC/+oVAv/qFQL/6hUC/+oVAv/qFQL/6hUC/+oVAv/qFQL/6pU - Cf+pUwr/p1ML/6ZTC/+mUgv/p1IL/6RSDP+dUg//mVYY/6RkLf+jZjjCuYRaW8Gech0AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAC9l2xxm1ca9KlRDf+lVAj/olER/5lOF/+kbDr/t4xh/8qfe//Oo3//zqSA/9Gm - g//Knnb/wZJm/7mFWP+yeEr/q249/6NlMf+bXif/mV0m/5peJ/+aXif/nF4n/5xeJ/+cXif/nF4n/5xe - J/+cXif/nF4n/5xeJ/+cXif/nF4n/5xeJ/+cXif/nF4n/5xeKP+dXyn/nmAq/59hK/+gYiv/oGIr/59j - Lf+fZC7/n2Qu/6BkL/+hZTD/oWUw/6JlMP+jZjL/o2Yy/6NmMv+kaDP/pGgz/6RoM/+laTT/pWk0/6Np - NP+jaTT/o2k0/6RqNf+kajX/pGo1/6RpNP+kaTT/pGk0/6RpNP+laTT/pWk0/6VpNP+laTT/pWk0/6Ro - M/+kaDP/o2cz/6NnM/+jZzP/omYy/6FlMP+hZTD/oGQv/6FlLv+gZC3/oWMs/6BiK/+gYiv/n2Er/55g - Kv+dXyn/nF4o/5tdJv+bXSb/m10m/5tdJv+bXSb/m10m/5tdJv+bXSb/m10m/5tdJv+aXSb/ml4m/5pe - Jv+aXib/ml4m/5peJv+aXib/ml4m/5peJv+ZXib/mV8p/59kMf+kajb/qHA8/6huPv+gZzT/nFwm/5hR - Ev+hUg//pVIJ/6dVCP+oVQz/nlsg77uTbnEAAAAAAAAAAAAAAAAAAAAA2aZ/KKFgJ/arUAf/olIK/7d8 - Sv/Zv6P/8ObZ//bx6//28PH/9fLu//Xy7//18u7/9fLu//Py7//z8u7/9PLt//bz7f/38ur/9/Hq//jx - 6f/48er/+PHq//jx6v/38en/9/Hp//fx6f/38en/9/Hp//fx6f/38en/9/Hp//fx6f/38en/9/Hp//fx - 6f/38en/9/Hq//fx6f/38en/9/Hp//fx6f/38er/9/Hq//fx6//38ev/9/Hr//fx6//38er/+PHq//jx - 6v/48er/+PHq//fx6v/38er/9/Hq//jy6//48uv/9/Hr//fx6//38er/9/Hq//fx6v/38ev/9/Hr//fx - 6//38ev/9/Hr//fx6//38ev/9/Hr//fx6//38er/+PLr//fy6v/38er/9/Hq//jy6//48er/9/Hq//fx - 6v/38er/9vLq//bx6v/38er/9/Hq//fx6v/38er/9/Hq//fx6v/38er/9/Hq//fy6v/38ur/9/Lq//fy - 6v/38ur/9/Lq//fy6v/38ur/9/Lq//fy6v/48ur/+PLq//jy6v/48ur/+PLq//jy6v/48ur/+PLq//jy - 6v/48uv/9/Lr//fx7P/28uz/9/Ls//jy6v/28un/8ujc/+jXxf/Ut5r/t4RX/6FUE/+mUgf/n1YY/6h2 - RnsAAAAAAAAAAL+/fwSlbjrTp1EO/6RVDf+1jGH/9e3l//Pz8v/z8/P/8/Tw//Lz8P/y8fP/8vH0//Ly - 9P/y8vT/8/Pz//T08//09PP/8/Py//T08v/09PP/8/T0//Lz8//z9PT/8/T0//H09P/x9PT/8fT0//H0 - 9P/x9PT/8fT0//H09P/x9PT/8fT0//H09P/x9PT/8fT0//H09P/x9PT/8fT0//H09P/x9PT/8fT0//H0 - 9P/x9PT/8fT0//H09P/w8/P/8fPz//Ly8v/z9PT/8/T0//P09P/z9PT/8PLy//H09P/x9PT/8fT0//H0 - 9P/x9PT/8fT0//H09P/x9PT/8fT0//H09P/x9PT/8fT0//H09P/x9PT/8fT0//H09P/x9PT/8fT0//H0 - 9P/x9PT/8fT0//H09P/x9PT/8fT0//H09P/x9PT/8fT0//H09P/x9PT/8fT0//H09P/z9PT/8/T0//H0 - 9P/x8/P/8PPz//H09P/x9PT/8fT0//Dy8v/x9PT/8fT0//H09P/x9PT/8fT0//H09P/x9PT/8/T0//P0 - 9P/z9PT/8/T0//Lz8//y8/P/8vPz//Lz8//z9PT/8/Pz//Lz8v/y9PP/8vPz//Lz9P/x8/P/8/Pz//L0 - 9P/x8/P/8/Pz//Pz7v/z8+v/3cCp/55YG/+sVQb/n2Ag/8KSbRUAAAAAtIpkPZhUE/ynUAz/rHM///bv - 4v/z8/L/8vLy//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/8vLy//Pz - 8//09PT/8/Pz//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//z8/P/8vLy//T0 - 9P/09PT/9PT0//T09P/z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9fLy/+zx9P/y8u3/59Cs/6ZW - F/+jUgv/rX5Y5QAAAACvdkeppVQL/6RSD//avKL/7PPw//Hy8v/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8vLy//Pz8//y8vL/8vLy//Ly8v/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8/Pz//Pz8//z8/P/9PT0//Ly8v/09PT/9PT0//T09P/09PT/8vLy//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/z8/P/8/Pz//T09P/08fT/8PH1/+vy8f/w8ur/r3dH/6lUCP+cVSD7yaJ8IaZjMtqnUQv/pGEl//rw - 5f/s8vD/8/T0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8/Pz//Pz - 8//09PT/9PT0//T09P/y8vL/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Lz8v/z8vP/9fPw//Dw - 9P/Ho33/pVMJ/6ZSDvymbz0uplkk6apRC/+4hVD/8/Dy//Py7//09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8vLy//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8vLy//T09P/09PT/9PT0//Ly8v/z8/P/8vLy//Ly - 8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8vLy//Ly8v/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8/Px//Hw9//y8vD/8/Dy/9q6n/+kURD/pVYM/7eJWlKpWxz8qFIJ/82i - fv/08fL/8PLy//Pz8//09PT/9PT0//T09P/z8/P/8vLy/+Xl5f/x8fH/8fHx//Pz8//z8/P/8/Pz//Ly - 8//z8/P/8vLy//Ly8v/z8/P/8/Pz//Pz8//09PT/9PT0//X19f/09PT/9PT0//b29v/29vb/9vb2//b2 - 9v/29vb/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//j4+P/4+Pj/+Pj4//j4+P/5+fn/+fn5//n5 - +f/4+fn/+Pn5//j5+f/5+fn/+fn5//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+/v7//v7 - +//7+/v/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/5+fr/+fn6//n5+f/5+fn/+fn5//n5 - +f/5+fn/+Pj4//j4+P/4+Pj/+Pj4//j4+P/39/f/9/f3//b29v/4+Pj/9/f3//f39//39/f/9vb2//b2 - 9v/19fb/9vb2//b29v/19fX/9fX1//T09P/09PX/8/P0//Pz8//09PT/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Ly8v/z8/P/8vLy//T09P/09PT/9PT0//T09P/z8/L/8vLy//Py - 8//y8/H/4cSp/6JRD/+oVA7/rnlLUqpYFv6lUwv/2bSU//Lx8v/y8vP/9PT0//Pz8//z8/P/9PT0//Pz - 8//y8vP/x8fH/+Pj4//z8/P/9PT1//b29v/29vf/+Pj4//r6+v/7+/v/+/z8//z8/P/8/Pz//f39//39 - /f/+/v7//v7+//7+/v/9/f3//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/9/f3//f39//39/f/9/f3//f39//39/f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//39/f/9/f3//f39//39 - /f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//f39//39/f/9/f3//Pz8//v7+//7+/v/+fn5//f39//29vb/9vb2//T09P/z8/P/8vLy//Ly - 8v/y8vL/9PT0//Ly8v/z8/P/9PT0//Pz8//z8/H/9fL0//L08f/gxaj/olIP/6lTD/+ueUtSqlUQ/qRT - C//YvZ7/8fLz//Xw8v/09PT/8/Pz//Ly8v/y8vL/9vb3//j4+P/09PT/+fn5//v7+//8/Pz//f39//7+ - /v/+/v7//v7+//39/f/9/f3//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//39/f/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//39/f/9/f3//f39//39/f/9/f3//f39//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//f39//39/f/9/f3//f39//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//f39//39 - /f/+/v7//v7+//39/f/9/f3//f39//39/f/8/Pz/+vr6//n5+f/19fX/8vLy//Pz8//09PT/8/Pz//Pz - 8f/18vT/8vTx/+DFqP+iUg//qVMP/655S1KqUwz+olIL/9vBpf/v8vT/9vLy//T09P/09PT/8/Pz//Ly - 8v/z8/T/6Ojp/+rq6v/x8fH/+vr6//39/f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/9/f3//f39//7+/v/+/v7//v7+//39/f/8/Pz/+/v8//r6 - +v/5+fn/+Pj4//v7+//y8vP/8/Pz//T09P/z8/P/8/Px//Xy9P/y9PH/4MWo/6JSD/+pUxD/rnlLUqhT - Cv6jUwv/2r+k/+7y9P/y8/H/9PT0//T09P/y8vL/8/Pz//Hx8f/IyMj/xMTE/8jIyP/u7u7/8vLy//Pz - 8//09PT/9fX1//f39//4+Pj/+fn5//r6+v/7+/v//Pz8//z8/P/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//z8/P/8/Pz//Pz8//z8/P/7+/v/+fn5//j4 - +f/4+Pj/9fX1//T09f/09PT/8vLy//Ly8v/y8vL/8vLy//Ly8v/39/f//f39//b29v/z8/P/9PT0//Pz - 8//z8/H/9fL0//L08f/gxKj/olIP/6lTEP+ueUtSq1MK/qNTC//ZvqH/8PL0//Lz8f/09PT/9PT0//T0 - 9P/09PT/7+/v/8XFxf/ExMT/xcXF/+zs7P/z8/P/8/Pz//Pz8//09PT/9PT0//Pz8//z8/P/8/Pz//T0 - 9P/09PT/9PT0//T09P/z8/P/9PT0//T09P/z8/P/8/Pz//Pz8//09PT/9fX1//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//X19f/19fX/9fX1//b29v/29/f/9vf3//f39//39/f/9/f3//f39//39/f/9/f3//f3 - 9//39/j/9/f4//f3+P/39/j/9/f4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//f3+P/39/j/9/f4//f3 - +P/39/j/9/f4//f3+P/39/j/9/f4//f3+P/39/f/9/f3//b39//29/f/9vf3//b39//29/f/9fb2//X1 - 9f/19fX/9fX1//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/T/8/Pz//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//Pz8//09PT/8/Pz//Pz8//z8/P/9PT0//T0 - 9P/z8/P/8/Pz//r6+v/+/v7/+vr6//Pz8//09PT/8/Pz//Pz8f/18vT/8vTx/+DEqP+iUw3/qVQO/655 - S1KsUwn+pFQL/9m5m//y8fL/8vLy//T09P/09PT/9PT0//T09P/t7e3/xcXF/8TExP/ExMT/6enp//Pz - 8//09PT/9PT0//T09P/09PT/8vLy//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//Ly - 8v/y8vL/8/Pz//T09P/09PT/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/9PT0//Ly8v/z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8vLy//Pz8//z8/P/8/Pz//T09P/09PT/8/Pz//Pz8//z8/P/8vLy//Ly - 8v/y8vL/8/Pz//Pz8//z8/T/8vLz//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/9PT0//T09P/z8/P/9PT0//Pz8//z8/P/8/Pz//Ly - 8v/y8vL/8vLy//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P//Pz8//39/f/8/Pz/9PT0//T0 - 9P/z8/P/8/Px//Xy9P/y9PL/4MSo/6JTDf+pVA7/rnlLUqxTCv6lVAn/1rOS//Py8f/x8vL/9PT0//T0 - 9P/09PT/8/Pz/+vr6//ExMT/xMTE/8XFxf/j4+P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//y8vL/8/Pz//Pz8//09PT/8/Pz//Pz8//09PT/9PT0//T09P/y8vL/8vLy//Pz8//z8/P/9PT0//T0 - 9P/y8vL/9PT0//T09P/09PT/9PT0//T09P/z8/P/8/Pz//Pz8//09PT/8/Pz//Pz8//z8/P/8/Pz//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8/Pz//Pz8//z8/P/9PT0//Pz - 8//z8/P/8/Pz//Pz8//09PT/9PT0//T09P/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8/Pz//Ly8v/8/Pz//f39//z8/P/09PT/8/Pz//Pz8//z8/H/9fL0//L08v/gxKj/olMN/6hT - Df+ueUtSq1MK/qdTCf/TrYv/8/Lw//Hz8//09PT/9PT0//T09P/z8/P/6enp/8PDw//Dw8P/xcXF/97e - 3v/z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/y8vL/8vLy//Pz8//09PT/9PT0//T09P/09PT/9PT0//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Ly8v/y8vL/8/Pz//T09P/z8/P/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8vLz//z8/f/+/v7//f39//T0 - 9P/z8/P/8/Pz//Pz8f/18vT/8vTy/+DEqP+iUw3/qFMN/655S1KqUwv+qFQI/8ynhf/08vD/8PPz//T0 - 9P/09PT/8vLy//Pz8//m5ub/xcXF/8PDw//ExMT/2NjY//Pz8//09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8/Pz//T09P/09PT/9PT0//T0 - 9P/09PT/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//Pz8//z8/P/9PT0//Pz - 8//y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Pz8//19fX//f39//7+/v/9/f3/9PT0//Ly8v/z8vL/8/Px//Xy9P/y9PH/4MSo/6JT - Df+oUw3/rnlLUqtUCf6qVAr/yqSC//bz8P/z8/P/9PT0//T09P/y8vL/8vLy/+Li4v/FxcX/xMTE/8PD - w//U1NT/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//X19f/+/v7//v7+//39 - /f/19fX/8/Pz//Py8v/z8/H/9fL0//L08f/gxaj/olIP/6lTEP+ueUtSrFQJ/qpUCv/KpIL/9vPw//Pz - 8//09PT/9PT0//Pz8//y8vL/3d3d/8TExP/FxcX/w8PD/8zMzP/z8/P/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/6+vr/+Pj - 4//f39//5OTk/+Hh4f/f39//5+fn/+/v7//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Pz8//v7+//5OTk/9/f3//g4OD/4uLi/9/f3//k5OT/7u7u//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/z8/P/9vb2//7+/v/+/v7//f39//b29v/z8/P/8/Ly//Pz8f/18vT/8vTx/+DF - qP+iUg//qVMQ/655S1KsVAn+qlQK/8qkgf/28+//8vLy//T09P/y8vL/8vLy//Ly8v/a2tr/xMTE/8XF - xf/ExMT/yMjI//Pz8//09PT/9PT0//T09P/09PT/8vLy//T09P/y8vL/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Ly8v/y8vL/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0/+vr6//ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/y8vL/9ra - 2v/z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/XV1d/2xs - bP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/4ODg//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//39/j//v7+//7+ - /v/9/f3/9/f3//Ly8v/z8vL/8/Px//Ty9P/x8/H/4MSo/6JTEP+pUxD/rnlLUqxTCf6qVAr/y6SB//bz - 7//y8vL/8vLy//T09P/z8/P/8vLz/9bW1v/FxcX/xcXF/8TExP/ExMT/8/Pz//T09P/09PT/9PT0//T0 - 9P/y8vL/9PT0//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/wsLC/0pK - Sv+3t7f/ycnJ/8zMzP/Nzc3/ycnJ/6+vr/+rq6v/x8fH//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0/+/v7/82Njb/Nzc3/8HBwf/Jycn/zMzM/8nJyf/Jycn/p6en/zEx - Mf97e3v/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8/Pz//n5+f/+/v7//v7+//7+/v/4+Pj/8vLy//Py8v/z8/H/9PL0//Lz - 8f/hxan/o1QQ/6lTEP+ueUtSrFMJ/qpUCv/KpIH/9vPv//Ly8v/y8vL/8/Pz//Ly8v/y8vL/0tLS/8XF - xf/FxcX/xMTE/8PDw//w8PD/8vLy//Ly8v/09PT/9PT0//Ly8v/y8vL/8vLy//T09P/09PT/8vLy//Ly - 8v/y8vL/9PT0//T09P/y8vL/8vLy//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Ly8v+Pj4//Nzc3/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/7+/ - v//Gxsb/7Ozs//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/7u7u/zg4 - OP81NTX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/IyMj/1paWv/x8fH/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/+fr6//7+ - /v/+/v7//v7+//n5+f/y8vL/8/Ly//Pz8f/08vT/8vPx/+DEqP+jUw//qFMP/655S1KsVAn+qlQK/8qk - gf/28+//8vLy//Ly8v/09PT/8vLy//Ly8v/Q0ND/xcXF/8XFxf/ExMT/w8PD/+7u7v/y8vL/8vLy//T0 - 9P/09PT/8vLy//Ly8v/y8vL/9PT0//T09P/y8vL/8vLy//Ly8v/09PT/9PT0//Ly8v/y8vL/8/Pz//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy/1pa - Wv83Nzf/BQUF/wAAAP8AAAD/AAAA/wAAAP8AAAD/v7+//8XFxf/s7Oz/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/u7u7/Nzc3/zQ0NP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8sLCz/VVVV/+7u7v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Pz8//7+/v//v7+//7+/v/+/v7/+vr6//Ly8v/z8vL/8/Px//Xy - 9P/z9PL/4MSo/6NTDv+oUw//rnlLUqxUCf6qVAr/yqSB//bz7//y8vL/8vLy//T09P/x8fL/8vLy/83N - zf/FxcX/xcXF/8PDw//Dw8P/7u7u//Pz8//z8/P/9PT0//T09P/z8/P/8/Pz//Pz8//09PT/9PT0//Pz - 8//z8/P/8/Pz//T09P/09PT/8vLy//Pz8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/TU1N/zg4OP8HBwf/AAAA/wAAAP8AAAD/AAAA/wAA - AP/BwcH/xsbG/+/v7//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/+7u - 7v84ODj/NTU1/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/zIyMv9PT0//6+vr//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//z8 - /P/+/v7//v7+//7+/v/6+vr/8/Pz//Py8v/z8/H/9fL0//P08v/gxKj/o1MO/6hTD/+ueUtSrFQJ/qpU - Cv/KpIH/9vPv//Lz8//z8/P/9PT0//Pz8//z8/P/ysrK/8TExP/ExMT/xMTE/8TExP/s7Oz/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P9NTU3/Nzc3/w0NDf8AAAD/AAAA/wAAAP8AAAD/AAAA/7+/v//Gxsb/6+vr//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/7u7u/zg4OP82Njb/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/NDQ0/0VFRf/i4uL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P//f39//7+/v/+/v7//v7+//v7+//z8/P/8/Ly//Pz - 8f/18vT/8vTx/+DEqP+iUw3/qFMP/655S1KsVAn+qlQK/8qkgf/28+//8/Pz//T09P/09PT/8vLy//Hx - 8f/Jycn/xMTE/8TExP/ExMT/w8PD/+vr6//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/zw8PP84ODj/EBAQ/wAAAP8AAAD/AAAA/wAA - AP8AAAD/urq6/8PDw//d3d3/4eHh/+Hh4f/Ozs7/0NDQ/8/Pz//Kysr/ycnJ/8/Pz//Pz8//09PT/+Li - 4v/c3Nz/NjY2/zQ0NP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBAf81NTX/QkJC/97e3v/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz - 8//9/f3//v7+//7+/v/+/v7//Pz8//Pz8//z8vL/8/Px//Xy9P/y9PH/4MWo/6JTDf+oUw//rnlLUqxU - Cf6qVAr/yqSB//bz7//z8/P/9PT0//T09P/z8/P/8PDw/8fHx//ExMT/xMTE/8TExP/Dw8P/6urq//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/PDw8/zc3N/8TExP/AAAA/wAAAP8AAAD/AAAA/wAAAP9KSkr/QkJC/0VFRf8/Pz//QEBA/zs7 - O/88PDz/Ozs7/zo6Ov86Ojr/Ozs7/zs7O/88PDz/QUFB/z4+Pv8tLS3/ISEh/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AQEB/zY2Nv9CQkL/39/f//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//39/f/+/v7//v7+//7+/v/8/Pz/8vLz//Py - 8v/z8/H/9fL0//L08f/gxaj/olMN/6lUDv+ueUtSrFMJ/qpUCv/LpIH/9vPv//Pz8//09PT/9PT0//Pz - 8//w8PD/x8fH/8XFxf/FxcX/xMTE/8TExP/o6Oj/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P8+Pj7/ODg4/xYWFv8AAAD/AAAA/wAA - AP8AAAD/AAAA/yIiIv8pKSn/ExMT/xsbG/8iIiL/Kysr/zAwMP8zMzP/NDQ0/zQ0NP8yMjL/Li4u/ycn - J/8bGxv/GBgY/xEREf8GBgb/AAAA/wAAAP8AAAD/AAAA/wAAAP8CAgL/ODg4/zk5Of/V1dX/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT//v7+//7+/v/+/v7//v7+//39/f/z8/P/8/Ly//Pz8f/18vT/8vTx/+DFqP+iUw3/qVQO/655 - S1KsUwn+qlQK/8qkgf/28+//8vPz//T09P/09PT/8vLy/+/v7//Gxsb/xcXF/8XFxf/Dw8P/w8PD/+bm - 5v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/z8/P/8/Pz//T09P/09PT/9PT0//Pz8//09PT/8/Pz//T0 - 9P/09PT/8/Pz/z4+Pv84ODj/FxcX/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wICAv83Nzf/Ojo6/9XV1f/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//+/v7//v7+//7+/v/+/v7//f39//T0 - 9P/z8vL/8/Px//Xy9P/y9PH/4MSo/6JTDf+pVA7/rnlLUqxTCf6qVAr/yqSB//bz7//y8vL/9PT0//T0 - 9P/y8vL/7+/v/8XFxf/FxcX/xcXF/8PDw//Dw8P/5ubm//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8/Pz//Ly8v/y8vL/8vLy//Pz8//z8/P/9PT0//T09P/09PT/9PT0//Pz - 8//y8vL/9PT0//T09P/09PT/8vLy//T09P/z8/P/9PT0//T09P/z8/P/Pz8//zg4OP8YGBj/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AgIC/zg4OP86Ojr/1dXV//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//7+/v/+/v7//v7+//7+/v/9/f3/8/T0//Py8v/z8/H/9fL0//L08f/gxKj/olMN/6lU - Dv+ueUtSrFMJ/qpUCv/KpIH/9vPv//Ly8v/09PT/9PT0//Ly8v/v7+//xcXF/8XFxf/FxcX/w8PD/8PD - w//m5ub/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8/Pz//Pz - 8//y8vL/8/Pz//Pz8//09PT/9PT0//T09P/09PT/8/Pz//Ly8v/09PT/9PT0//T09P/y8vL/9PT0//Pz - 8//09PT/9PT0//Pz8/8/Pz//Nzc3/xkZGf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8CAgL/ODg4/zk5Of/W1tb/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/19fX//v7+//7+/v/+/v7//v7+//7+ - /v/09PT/8/Pz//Pz8f/18vT/8vTy/+DEqP+iUw3/qVQO/655S1KsVAn+qlQK/8qkgf/28+//8vLy//T0 - 9P/09PT/8/Pz/+7u7v/ExMT/xcXF/8XFxf/ExMT/xMTE/+Tk5P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T0 - 9P/z8/P/8vLy//T09P/09PT/9PT0//Pz8//09PT/8/Pz//T09P/09PT/8/Pz/z8/P/83Nzf/GBgY/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wICAv84ODj/OTk5/9bW - 1v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//X19f/+/v7//v7+//7+/v/+/v7//v7+//Pz8//z8vL/8/Px//Xy9P/x8/L/4MSo/6JS - D/+oUw//rnlLUqxUCf6qVAr/yqSB//bz7//y8vL/9PT0//T09P/09PT/7u7u/8TExP/FxcX/xcXF/8TE - xP/ExMT/5OTk//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/Pj4+/zc3N/8XFxf/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AgIC/zg4OP85OTn/1dXV//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9fX1//7+/v/+/v7//v7+//7+ - /v/+/v7/9PT0//Py8v/z8/H/9fL0//Lz8//hxan/o1MQ/6hTD/+ueUtSrFQJ/qpUCv/Ko4D/9vPv//Pz - 8//09PT/9PT0//Ly8v/t7e3/xMTE/8TExP/ExMT/xMTE/8TExP/k5OT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P8/Pz//ODg4/xUV - Ff8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8CAgL/Nzc3/zk5 - Of/V1dX/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/19fX//v7+//7+/v/+/v7//v7+//7+/v/09PT/8/Ly//Pz8f/08vT/8vPx/+HF - qf+jUxD/qFMP/655S1KsVAn+qlQK/8qkgf/28+//8/Pz//T09P/09PT/8vLy/+3t7f/ExMT/xMTE/8TE - xP/ExMT/xMTE/+Tk5P/09PT/9PT0//Ly8v/y8vL/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0/zw8PP83Nzf/EhIS/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBAf83Nzf/Pj4+/9vb2//09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//b29v/+/v7//v7+//7+ - /v/+/v7//v7+//T09f/z8vL/8/Px//Ty9P/y8/H/4cWp/6NTEP+oUg//rnlLUqxUCf6qVAr/yqSB//bz - 7//z8/P/9PT0//T09P/y8vL/7e3t/8TExP/ExMT/xMTE/8TExP/ExMT/4+Pj//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/QEBA/zc3 - N/8PDw//AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/zY2 - Nv9CQkL/3t7e//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9vb2//7+/v/+/v7//v7+//7+/v/+/v7/9PT1//Py8v/z8/H/9PL0//Lz - 8f/hxan/o1MQ/6hSD/+ueUtSrFQJ/qpUCv/KpIH/9vPv//Ly8v/09PT/9PT0//Ly8v/s7Oz/xMTE/8TE - xP/ExMT/xMTE/8TExP/i4uL/8/Pz//Pz8//z8/P/8/Pz//Ly8v/09PT/8vLy//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P9NTU3/ODg4/wsLC/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/NDQ0/0RERP/g4OD/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/19fb//v7+//7+ - /v/+/v7//v7+//7+/v/19fb/8/Ly//Pz8f/08vT/8vPx/+HFqf+iUw3/qFQO/655S1KsUwn+qlQK/8uk - gf/28+//8vLy//T09P/09PT/8/Pz/+vr6//ExMT/xcXF/8XFxf/Dw8P/w8PD/+Hh4f/z8/P/8/Pz//T0 - 9P/09PT/8vLy//T09P/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/0xM - TP84ODj/BwcH/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8yMjL/T09P/+vr6//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//b29v/+/v7//v7+//7+/v/+/v7//v7+//b29v/z8vL/8/Px//Ty - 9P/y8/H/4cWp/6JTDf+pVA7/rnlLUqxTCf6qVAr/yqSB//bz7//y8vL/9PT0//T09P/z8/P/6urq/8TE - xP/FxcX/xcXF/8PDw//Dw8P/4ODg//Pz8//y8vL/9PT0//T09P/y8vL/9PT0//Ly8v/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8vLy//Pz8//z8/P/9PT0//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/X19f/zg4OP8DAwP/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/y4uLv9UVFT/7u7u//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9vb2//7+ - /v/+/v7//v7+//7+/v/+/v7/9fX1//Py8v/z8/H/9PL0//Lz8f/hxan/olMN/6lUDv+ueUtSrFMJ/qpU - Cv/KpIH/9/Pw//Pz8//09PT/9PT0//Pz8//p6en/xcXF/8XFxf/FxcX/w8PD/8TExP/f39//8/Pz//Ly - 8v/09PT/9PT0//Ly8v/y8vL/8vLy//T09P/09PT/8vLy//Ly8v/y8vL/9PT0//T09P/y8vL/8/Pz//Pz - 8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P+hoaH/NTU1/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/JSUl/1paWv/x8fH/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/29vb//v7+//7+/v/+/v7//v7+//7+/v/19fX/8/Pz//Pz - 8f/08vT/8vPx/+HFqf+iUw3/qVQO/655S1KsUwn+qlQK/8qkgf/28+//8/Pz//T09P/09PT/8/Pz/+np - 6f/ExMT/xMTE/8TExP/ExMT/w8PD/9/f3//z8/P/8vLy//T09P/09PT/8/Pz//Pz8//z8/P/9PT0//T0 - 9P/z8/P/8/Pz//Pz8//09PT/9PT0//Ly8v/z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/9TU1P80NDT/FBQU/xUVFf8VFRX/FRUV/xUV - Ff8VFRX/Dg4O/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wwMDP9QUFD/oqKi/7u7u/+fn5//o6Oj/5+fn/+Dg4P/gICA//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//b2 - 9v/+/v7//v7+//7+/v/+/v7//v7+//X19f/z8vL/8/Px//Ty9P/y8/H/4cWp/6JTDf+oVA7/rnlLUqxU - Cf6qVAr/yqSB//bz7//z8/P/9PT0//T09P/z8/P/6enp/8TExP/ExMT/xMTE/8PDw//Dw8P/39/f//Pz - 8//y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//Pz - 8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/6enp/7a2tv/CwsL/xMTE/8PDw//ExMT/xMTE/8PDw/+4uLj/hoaG/wEBAf8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8JCQn/goKC/8bGxv/ExMT/w8PD/8TE - xP/ExMT/xMTE/8XFxf/Y2Nj/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9vb2//7+/v/+/v7//v7+//7+/v/+/v7/9vb2//Py - 8v/z8/H/9PL0//Lz8v/hxan/o1MO/6hTDf+ueUtSrFQJ/qpUCv/KpIH/9vPv//Pz8//09PT/9PT0//Pz - 8//p6en/xMTE/8TExP/ExMT/w8PD/8TExP/f39//8/Pz//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/6+vr/9vb2//X19f/19fX/9ra - 2v/X19f/2tra/9ra2v/ExMT/NjY2/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/xsbG/84ODj/1NTU/+Dg4P/c3Nz/4eHh/9zc3P/b29v/6+vr//Pz8//09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/29vb//v7+//7+/v/+/v7//v7+//7+/v/29vb/8/Ly//Pz8f/18vT/8vPz/+HFqf+jUw7/qFMN/655 - S1KsVAn+qlQK/8qkgf/28+//8/Pz//T09P/09PT/8/Pz/+vr6//ExMT/xMTE/8TExP/ExMT/xMTE/+Dg - 4P/z8/P/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/39/f/8TExP85OTn/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/MDAw/zc3N/+zs7P/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//b29v/+/v7//v7+//7+/v/+/v7//v7+//b2 - 9v/z8vL/8/Px//Xy9P/y8/H/4MSo/6NTDf+pVA7/rnlLUqxTCf6qVAr/y6SB//bz7//z8/P/9PT0//T0 - 9P/z8/P/6+vr/8TExP/FxcX/xcXF/8TExP/ExMT/4eHh//Pz8//z8/P/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/f39//xMTE/zo6Ov8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8xMTH/Nzc3/7S0tP/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9vb2//7+/v/+/v7//v7+//7+/v/+/v7/9vb2//Py8v/z8/H/9fL0//Lz8f/gxKj/o1MN/6lU - Dv+ueUtSrFMJ/qpUCv/LpIH/9vPv//Lz8//09PT/8/Pz//Ly8v/s7Oz/xMTE/8XFxf/FxcX/xMTE/8TE - xP/i4uL/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/+Dg4P/ExMT/OTk5/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ycnJ/83Nzf/t7e3//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/29vb//v7+//7+/v/+/v7//v7+//7+ - /v/29vb/8/Ly//Pz8f/18vT/8vPx/+DEqP+jUw3/qVQO/655S1KsUwn+qlQK/8ukgf/28+//8vLy//Ly - 8v/z8/P/8vLy/+3t7f/ExMT/xcXF/8XFxf/ExMT/xMTE/+Li4v/y8vL/8vLy//T09P/09PT/8vLy//Ly - 8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/39/f/8TExP86Ojr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/MjIy/zc3N/+jo6P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//b29v/+/v7//v7+//7+/v/+/v7//v7+//X19f/z8/P/8/Px//Xy9P/y8/H/4MSo/6NT - Df+pVA7/rnlLUqxTCf6qVAr/y6SB//bz7//y8vL/8/Pz//Ly8v/y8vL/7e3t/8TExP/FxcX/xcXF/8TE - xP/ExMT/4+Pj//Pz8//z8/P/9PT0//T09P/y8vL/8/Pz//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/f39//xMTE/zk5 - Of8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8sLCz/Nzc3/7W1 - tf/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9vb2//7+/v/+/v7//v7+//7+ - /v/+/v7/9fX1//Pz8//z8/H/9fL0//Lz8f/gxKj/o1MN/6lUDv+ueUtSrFQJ/qpUCv/KpIH/9vPv//Ly - 8v/z8/P/9PT0//Pz8//u7u7/xMTE/8XFxf/FxcX/xMTE/8PDw//j4+P/8/Pz//Pz8//09PT/9PT0//Pz - 8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0/+Pj4//ExMT/bW1t/0ZGRv9GRkb/RkZG/0ZGRv9GRkb/RkZG/0ZG - Rv9GRkb/RkZG/0ZGRv9GRkb/SEhI/zg4OP82Njb/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/z8/P/9PT0//T09P/z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/29vb//v7+//7+/v/+/v7//v7+//7+/v/19fb/8/Ly//Pz8f/18vT/8vPy/+DE - qP+jUw3/qFMO/655S1KsVAn+qlQK/8qkgf/28+//8vLy//T09P/09PT/9PT0/+/v7//ExMT/xcXF/8XF - xf/ExMT/xMTE/+Tk5P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/oaGh/1hY - WP82Njb/ODg4/zg4OP84ODj/Nzc3/zc3N/83Nzf/Nzc3/zg4OP84ODj/ODg4/zg4OP89PT3/lpaW/8TE - xP/ExMT/xcXF/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8XFxf/ExMT/xcXF/8XFxf/ExMT/np6e/21t - bf+IiIj/fHx8/0VFRf9BQUH/NTU1/zY2Nv83Nzf/NTU1/zU1Nf9CQkL/SEhI/4WFhf+RkZH/3d3d//Dw - 8P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//y8vL/8vLy//Pz - 8//09PT/8/Pz//Ly8v/y8vL/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//b29v/+/v7//v7+//7+ - /v/+/v7//v7+//b29v/z8vL/8/Px//Xy9P/y8/P/4cWp/6NTDf+oUw//rnlLUqxUCf6qVAr/yqSB//bz - 7//y8vL/9PT0//T09P/y8vP/7u7u/8XFxf/FxcX/xcXF/8TExP/ExMT/5OTk//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P+ysrL/aGho/x4eHv8lJSX/Jycn/ywsLP8uLi7/MDAw/zEx - Mf8vLy//Li4u/ysrK/8mJib/JCQk/xYWFv8fHx//cXFx/+3t7f/l5eX/5eXl/+Tk5P/k5OT/5OTk/+Tk - 5P/k5OT/5OTk/+Tk5P/l5eX/5eXl/+jo6P+srKz/ZWVl/zAwMP84ODj/ODg4/zg4OP84ODj/ODg4/zg4 - OP84ODj/ODg4/zg4OP84ODj/Nzc3/ysrK/8lJSX/TExM//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8/Pz//Pz8//z8/P/8/Pz//T09P/z8/P/8/Pz//Pz8//z8/P/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9vb2//7+/v/+/v7//v7+//7+/v/+/v7/9PT0//Py8v/z8/H/9fL0//Lz - 8//gxKn/o1MO/6hTDf+ueUtSrFMJ/qpUCv/KpIH/9vPv//Ly8v/09PT/9PT0//Ly8v/v7+//xcXF/8XF - xf/FxcX/xcXF/8PDw//l5eX/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/9LS - 0v+enp7/AgIC/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xoa - Gv9BQUH/7u7u//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz/9zc - 3P+/v7//AAAA/wAAAP8AAAD/BwcH/wkJCf8KCgr/DAwM/wkJCf8ICAj/BAQE/wAAAP8AAAD/AAAA/wsL - C/8uLi7/7+/v//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/29vb//v7+//7+ - /v/+/v7//v7+//7+/v/09PX/8/Ly//Pz8f/18vT/8vPz/+DEqf+jUw7/qFMN/655S1KsUwn+qlQK/8qk - gf/28+//8vLy//T09P/09PT/8vLy/+/v7//FxcX/xcXF/8XFxf/FxcX/w8PD/+bm5v/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/0NDQ/52dnf8CAgL/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ICAg/0RERP/r6+v/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/1NTU/8HBwf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Ghoa/zY2Nv/u7u7/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//b29v/+/v7//v7+//7+/v/+/v7//v7+//T09f/z8vL/8/Px//Xy - 9P/y8/P/4MSp/6NTDv+oUw3/rnlLUqxUCf6qVAr/yqSB//bz7//y8vL/9PT0//T09P/09PT/8PDw/8bG - xv/FxcX/xcXF/8TExP/ExMT/5+fn//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/MzMz/nZ2d/wMDA/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8jIyP/OTk5/8fHx//09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8vLy//Ly8v/y8vL/9PT0//T0 - 9P/Pz8//wsLC/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8cHBz/NjY2/7CwsP/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Pz8//y8vL/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9fX1//7+ - /v/+/v7//v7+//7+/v/+/v7/9PT0//Py8v/z8/H/9fL0//Lz8//hxan/o1MN/6lUDv+ueUtSrFQJ/qpU - Cv/KpIH/9vPv//Ly8v/09PT/9PT0//Pz8//w8PH/yMjI/8XFxf/FxcX/w8PD/8PDw//p6en/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/8nJyf+enp7/AwMD/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yoqKv85OTn/x8fH//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Pz8//y8vL/8vLy//Ly8v/09PT/9PT0/8rKyv/ExMT/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yYmJv83Nzf/p6en//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//Ly - 8v/y8vL/8vLy//T09P/09PT/9PT0//T09P/19fX//v7+//7+/v/+/v7//v7+//7+/v/09PT/8/Ly//Pz - 8f/18vT/8vPz/+HFqf+jUw3/qVQO/655S1KsVAn+qlQK/8qkgf/28+//8vLy//T09P/09PT/8vLy//Dw - 8P/IyMj/xcXF/8XFxf/Dw8P/w8PD/+rq6v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/ycnJ/56env8DAwP/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/Kysr/zc3N/+/v7//9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//z8/P/9PT0//T0 - 9P/09PT/x8fH/8TExP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/KCgo/zc3N/+Wlpb/8/Pz//Pz8//z8/P/8/Pz//T09P/z8/P/8/Pz//Pz8//z8/P/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/+/v7//v7+//7+/v/+/v7//v7+//T09P/z8vL/8/Px//Xy9P/y8/P/4cWp/6NTDv+oUw3/rnlLUqxU - Cf6qVAr/yqSB//bz7//y8vL/9PT0//T09P/y8vL/8vLy/8rKyv/FxcX/xcXF/8TExP/ExMT/7Ozs//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/Jycn/n5+f/wMDA/8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8tLS3/Nzc3/8DAwP/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/Gxsb/xcXF/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8rKyv/Nzc3/5eXl//z8/P/8vLy//Ly - 8v/y8vL/9PT0//Pz8//y8vL/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//7+/v/+/v7//v7+//7+/v/9/f3/8/T0//Pz - 8//z8/H/9fL0//Lz8//hxan/o1MO/6hTDf+ueUtSrFQJ/qpUCv/KpIH/9vPv//Ly8v/09PT/9PT0//Pz - 8//y8vL/y8vL/8XFxf/FxcX/xMTE/8TExP/t7e7/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0/8nJyf+enp7/AwMD/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/y0tLf83Nzf/wMDA//T09P/09PT/9PT0//T09P/z8/P/8/Pz//Pz8//z8/P/9PT0//Pz - 8//z8/P/8/Pz/8XFxf/FxcX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/ywsLP83Nzf/l5eX//Ly8v/y8vL/8vLy//Ly8v/09PT/8/Pz//Ly8v/y8vL/8vLy//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT//v7+//39/f/+/v7//v7+//39/f/z8/P/8/Lz//Pz8f/18vT/8vPz/+HFqf+jUw7/qFMN/655 - S1KsVAn+qlQK/8qkgf/28+//8vLy//T09P/09PT/8/Pz//Hx8f/Ozs7/xcXF/8XFxf/ExMT/xMTE/+7u - 7v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/ycnJ/56env8DAwP/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Kysr/zc3N/+/v7//9PT0//T0 - 9P/09PT/9PT0//Pz8//z8/P/8/Pz//Pz8//09PT/8vLy//Ly8v/z8/P/x8fH/8TExP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/KSkp/zc3N/+Wlpb/8vLy//Pz - 8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//Pz - 8//y8vL/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/+/v7//v7+//7+/v/+/v7//f39//T0 - 9P/z8vL/8/Px//Xy9P/y8/P/4cWp/6NTDf+oUw3/rnlLUqxUCf6qVAr/yqSB//bz7//y8vL/9PT0//T0 - 9P/z8/P/8vLy/9LS0v/FxcX/xcXF/8TExP/ExMT/8PDw//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/Ly8v/np6e/wMDA/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8pKSn/ODg4/8TExP/09PT/9PT0//T09P/09PT/8/Pz//Pz8//z8/P/8/Pz//T0 - 9P/y8vL/8vLy//T09P/Jycn/xMTE/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8nJyf/Nzc3/5eXl//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8/Pz//Ly8v/z8/P/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8/Pz//7+/v/+/v7//v7+//7+/v/9/f3/9PT0//Py8v/z8/H/9fL0//Lz8//hxan/o1MN/6hT - Df+ueUtSrFQJ/qpUCv/KpIH/9vPv//Ly8v/09PT/9PT0//Pz8//y8vL/1dXV/8XFxf/FxcX/w8PD/8TE - xP/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/83Nzf+cnJz/AgIC/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yMjI/86Ojr/yMjI//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/87Ozv/Dw8P/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yAgIP83Nzf/oaGh//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z9PT//f39//39/f/+/v7//v7+//v7 - +//z8/P/8/Pz//Pz8f/18vT/8vPz/+HFqf+jUw3/qVQO/655S1KsVAn+qlQK/8qkgf/28+//8vLy//T0 - 9P/09PT/8/Pz//Ly8v/Y2Nj/xcXF/8XFxf/Dw8P/x8fH//Pz8//09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/z8/P/5ubm/8CAgL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/ICAg/0RERP/r6+v/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/1NTU/8HBwf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/Gxsb/zY2Nv+6urr/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Pz8//9/f3//f39//7+/v/+/v7/+/v7//Pz8//z8/P/8/Px//Xy9P/y8/P/4cWp/6NT - Df+pVA7/rnlLUqxUCf6qVAr/yqSB//bz7//y8vL/9PT0//T09P/z8/P/8vLy/9zc3P/FxcX/xMTE/8XF - xf/MzMz/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/V1dX/k5OT/wUF - Bf8FBQX/BAQE/wgICP8ICAj/CAgI/woKCv8KCgr/CAgI/wgICP8GBgb/AwMD/wMDA/8bGxv/QkJC/+7u - 7v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/Z2dn/xMTE/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8TExP/NDQ0/+7u - 7v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//z8/P/+/v7//v7+//7+ - /v/7+/v/8/Pz//Pz9P/z8/H/9fL0//Lz8//hxan/o1MN/6lUDv+ueUtSrFQJ/qpUCv/KpIH/9vPv//Ly - 8v/09PT/9PT0//Pz8//y8vL/4ODg/8TExP/ExMT/w8PD/8/Pz//z8/P/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0/97e3v/W1tb/z8/P/8XFxf/ExMT/xMTE/8TExP/ExMT/xMTE/8TE - xP/ExMT/xMTE/8TExP/ExMT/x8fH/2xsbP9vb2//8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0/+bm5v/FxcX/TExM/3R0dP9zc3P/tra2/7Gxsf+ysrL/ycnJ/8nJ - yf+0tLT/sbGx/62trf90dHT/dnZ2/zExMf9ISEj/7+/v//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/z8/P/+/v7//7+/v/+/v7//v7+//r6+v/y8vP/8/Pz//Pz8f/18vT/8vPz/+HF - qf+jUw3/qVQO/655S1KsVAn+qlQK/8qkgf/28+//8vLy//T09P/09PT/8/Pz//Ly8v/l5eX/w8PD/8TE - xP/Dw8P/1tbW//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8fHx/+zs - 7P/k5OT/0dHR/87Ozv/Ly8v/x8fH/8bGxv/FxcX/xcXF/8bGxv/Hx8f/ysrK/9DQ0P/T09P/4eHh/+Pj - 4//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8fHx/+bm - 5v/IyMj/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/FxcX/vb29/66u - rv/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//6+vr//v7+//7+ - /v/+/v7/+vr6//Ly8//z8vL/8/Px//Xy9P/y8/P/4cWp/6NTDf+pVA7/rnlLUqxUCf6qVAr/yqSB//bz - 7//y8vL/9PT0//T09P/y8vL/8/Pz/+fn5//ExMT/xMTE/8PDw//c3Nz/8/Pz//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8vLy//Pz8//09PT/7+/v/+np6f/k5OT/4+Pj/+Hh - 4f/i4uL/4+Pj/+Tk5P/q6ur/7+/v//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/8vLy//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8/Pz//n5+f/9/f3//v7+//7+/v/39/j/8vLy//Py8v/z8/H/9fL0//Lz - 8//hxan/o1MO/6hTDf+ueUtSrFQJ/qpUCv/KpIH/9vPv//Ly8v/09PT/9PT0//Pz8//y8vL/6enp/8TE - xP/ExMT/xMTE/+Li4v/z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//Ly - 8v/z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/+Pj4//39 - /f/+/v7//v7+//f39//z8/P/8/Pz//Pz8f/18vT/8vPz/+HFqf+jUw7/qFMN/655S1KsVAn+qlQK/8qk - gf/28+//8vLy//T09P/09PT/8/Pz//Pz8//s7Oz/xcXF/8PDw//ExMT/5+fn//Pz8//09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz - 8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Pz8//29vb//f39//7+/v/+/v7/9fX1//Ly8v/z8vL/8/Px//Xy - 9P/y8/P/4cWp/6NTDf+oVA7/rnlLUqxTCf6qVAr/yqSB//bz7//y8vL/9PT0//T09P/09PT/9PT0/+/v - 7//Gxsb/xMTE/8TExP/r6+v/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//b2 - 9v/9/f3//v7+//39/f/19fX/8/Pz//Py8v/z8/H/9fL0//Lz8//hxan/o1MN/6lUDv+ueUtSrFMJ/qpU - Cv/KpIH/9vPv//Ly8v/09PT/9PT0//T09P/09PT/8vLy/8jIyP/Dw8P/xsbG/+3t7f/z8/P/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/T/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz9P/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//Pz9P/z8/T/8/P0//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/P0//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//Pz - 8//z8/P/9PT0//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/9PT0//Pz8//z8/P/8/Pz//Pz - 9P/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/9PX1//z8/P/+/v7//f39//T09P/z8/P/8/Ly//Pz - 8f/18vT/8vPz/+HFqf+jUw7/qFQO/655S1KsVAn+qlQK/8qkgf/28+//8vLy//T09P/09PT/9PT0//T0 - 9P/z8/P/zMzM/8PDw//Jycn/7u7u//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8/Pz//Pz - 9P/y8vL/8vLy//Ly8//y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8/Pz//Ly8v/y8vL/8/Pz//Ly - 8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Ly8//y8vP/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//T0 - 9P/09PT/8vLy//Pz8//z8/P/8/P0//Pz9P/z8/P/8vLy//Ly8v/z8/P/8/Pz//Pz8//z8/P/8vLy//Ly - 8v/z8/P/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/8/Pz//Ly8v/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz - 8//z8/P/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8vLz//Ly8v/y8vP/8vLy//Pz8//y8vL/8vLy//Ly - 8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz - 8//09PT//Pz8//7+/v/9/f3/9PT0//Ly8v/z8/P/8/Px//Xy9P/y8/P/4cWp/6JSEP+oUwz/pXA7UqxU - Cf6qVAr/yqSB//bz7//y8vL/9PT0//T09P/09PT/9PT0//Pz8//Z2dn/w8PD/83Nzf/w8PD/8/Pz//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Pz8//z8/P/8PDw//Dw8P/u7u7/7e3t/+zs7P/r6+v/6urq/+np - 6f/o6Oj/5ubm/+Tk5P/h4eH/39/f/97e3v/e3t7/3d3d/93d3f/b29v/29vb/9ra2v/a2tv/2tra/9ra - 2v/a2tr/2tra/9ra2v/Z2dn/2dnZ/9jY2P/Y2Nj/2NjY/9jY2P/X19f/19fX/9bW1v/W1tb/1tbW/9XV - 1f/U1NT/1NTU/9TU1P/U1NT/1NTU/9XV1f/V1dX/1tbW/9bW1v/W1tb/19fX/9fX1//Y2Nj/2NjY/9jY - 2P/Y2Nj/2NjY/9nZ2f/a2tr/2tra/9ra2v/a2tr/29vb/9ra2v/a2tr/3Nzc/9vb2//d3d3/3d3d/97e - 3v/d3d3/4ODg/+Hh4f/l5eX/5ubm/+fn5//o6Oj/6enp/+zs7P/t7e3/7u7u//Dw8P/w8PD/8fHx//Ly - 8v/z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//Pz8//8/Pz//v7+//z8/P/09PT/9PT0//Pz - 8//z8/H/9fL0//Lz8//hxan/oVIQ/6pUC/+YYC9SrFQJ/qpUCv/KpIH/9vPv//Ly8v/09PT/9PT0//T0 - 9P/09PT/8/Pz/+zs7P/CwsL/29vb//Hx8f/u7u7/7e3t/+np6f/o6Oj/4uLi/9zc3P/U1NT/y8vL/8XF - xf/ExMT/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xMTE/8TExP/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xMTE/8TExP/ExMT/xMTE/8XFxf/ExMT/xMTE/8TExP/ExMT/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/xMTE/8TExP/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/xsbG/83Nzf/X19f/3t7e/+Pj4//q6ur/6+vr/+3t - 7v/v7+//9PT0//v7+//9/f3/+/v7//T09P/09PT/8/Pz//Pz8f/18vT/8vPz/+HFqf+iUw//qlQJ/5Va - JVKsVAn+qlQK/8qkgf/28+//8vLy//T09P/09PT/9PT0//T09P/z8/P/8vLy/87Ozv/Nzc3/zMzM/8nJ - yf/Gxsb/xcXF/8TExP/ExMT/wsLC/8PDw//ExMT/w8PD/8TExP/FxcX/xcXF/8XFxf/FxcX/xcXF/8TE - xP/ExMT/xMTE/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xMTE/8TE - xP/ExMT/xMTE/8PDw//CwsL/w8PD/8TExP/FxcX/xsbG/8nJyf/Nzc3/8fHx//39/f/6+vr/9PT0//T0 - 9P/z8/P/8/Px//Xy9P/y8/P/4cWp/6JTD/+sUwj/omgxXaxUCf6qVAr/yqSB//bz7//y8vL/9PT0//T0 - 9P/09PT/9PT0//Pz8//x8fH/7e3t/9nZ2f/T09P/zMzM/8bGxv/FxcX/w8PD/8TExP/ExMT/xMTE/8PD - w//ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/w8PD/8XFxf/ExMT/xMTE/8TExP/ExMT/xMTE/8TE - xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/FxcX/xMTE/8TE - xP/ExMT/xMTE/8TExP/ExMT/xMTE/8XFxf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE - xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8XFxf/ExMT/xMTE/8TE - xP/FxcX/xcXF/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE - xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8PDw//Dw8P/xMTE/8TExP/ExMT/xMTE/8XF - xf/Jycn/z8/P/9bW1v/u7u7//f39//f39//z8/P/9PT0//Pz8//z8/H/9fL0//Lz8//hxan/oVMO/6pS - Cf+9jl+orFQJ/qpUCv/KpIH/9vPv//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//Ly - 8v/y8vL/8vLz//Hx8f/w8PD/5ubn/93d3f/W1tb/0dHR/8/Pz//MzMz/ysrK/8fHx//FxcX/xsbG/8bG - xv/Gxsb/xcXF/8XFxf/Gxsb/xsbG/8XFxf/FxcX/xMTE/8TExP/ExMT/w8PD/8TExP/FxcX/xcXF/8XF - xf/ExMT/xMTE/8XFxf/FxcX/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8XF - xf/ExMT/xMTE/8XFxf/ExMT/w8PD/8PDw//ExMT/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/xMTE/8TE - xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xcXF/8TExP/ExMT/xMTE/8TExP/FxcX/xMTE/8TE - xP/ExMT/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/Gxsb/xsbG/8bGxv/Gxsb/ycnJ/8vL - y//Nzc3/0NDQ/9HR0f/Z2dr/4eHh/+vr6//w8PD/8vLy//Pz8//z8/T/8vLy//T09P/7+/v/8/Pz//T0 - 9P/09PT/8/Pz//Pz8f/18vT/8vPz/+HFqf+hUw7/qFIN/7R7R6isVAn+qlQK/8qkgf/28+//8vLy//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vP/8/Pz//Pz8//y8vL/8fHx//Ly8v/z8/T/8/Pz//Ly - 8//y8vL/8/Pz//Ly8v/y8vP/8vLy//Dw8P/v7+//7+/v/+3t7f/t7e3/6+vr/+np6f/p6en/6Ojo/+fn - 5//n5+j/6Ojo/+fn6P/n5+j/5ubm/+Xl5f/k5OT/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//h4eL/4eHh/+Hh - 4f/h4eH/4ODg/9/f3//f39//3t7e/97e3v/e3t7/3Nzc/9vb2//b29v/2tra/9nZ2f/Y2Nj/2NjY/9nZ - 2f/a2tr/29vb/9zc3P/c3Nz/3d3d/97e3v/f39//39/f/9/f3//f39//4ODg/+Dg4P/h4eH/4uLi/+Li - 4v/j4+P/4+Pj/+Tk5P/j4+P/4+Pj/+Xl5f/m5ub/5+fn/+fn5//o6Oj/5+fn/+fn5//o6On/6enp/+rq - 6v/r6+v/7e3t/+3t7f/v7+//7+/v//Hx8f/y8vP/8vLz//Ly8v/z8/P/8vLy//Ly8v/y8vL/8vLy//Ly - 8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Pz9P/z8/P/8/Pz//T09P/z8/P/8/Px//Xy9P/y8/P/4cWp/6JT - Dv+tUw7/rW81qKxTCf6pUwj/yqSB//bz7//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Pz8//z8/H/9fL0//Lz8//gxKn/olMP/61SC/+zeD7KrFMJ/qlTCf/KpIH/9vPv//Lz - 8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/T/8vPz//Pz8f/18vT/8vPy/+DE - qP+hUhD/rVML/7aCSP+rUwn+qlQH/8ujgP/z8e//8PPy//T08v/09PL/9PTy//T08v/09PL/9PTy//T0 - 8v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTz//T09P/09PT/9PT0//T09P/09PL/9PTy//T0 - 8v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T0 - 8v/09PL/9PTz//T09P/09PT/9PT0//T09P/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T0 - 8v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PT/9PT0//T09P/09PT/9PTy//T08v/09PL/9PTy//T0 - 8v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PT0//T09P/09PT/9PT0//T0 - 8//09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T0 - 8//09PT/9PT0//T09P/09PP/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PPy//by - 9P/08vP/9PTy//Ly9P/v8/P/8fTw//Xy8//y8/L/4sSo/6RSD/+sVAv/snk+/6tTCv6qUwb/zaWC//Xy - 8f/x8/H/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/L/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/L/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz - 8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//x8/P/7vTy/+708f/z9PD/9PLx//Ly8//x8/P/8/D2/+3z - 8//exKn/olMP/6tTC/+0cTT/q1ML/qVTCf/Pqor/8/Hw/+7x9f/x8vP/8vLz//Ly8//z8/T/8/P0//Pz - 9P/z8/T/8/P0//Pz9P/z8/T/8/P0//Pz9P/z8/T/8/L0//Py8P/z8/D/8/Pw//Pz8P/z8/D/8/P0//Pz - 9P/z8/T/8/P0//Pz9P/z8/T/8/P0//Pz9P/z8/T/8/P0//Pz9P/z8/T/8/P0//Pz9P/z8/T/8/P0//Pz - 9P/z8/T/8/P0//Py8f/z8/D/8/Pw//Pz8P/z8/D/8/Pz//Pz9P/z8/T/8/P0//Pz9P/z8/T/8/P0//Pz - 8//z8/P/8/Pz//Ly8//y8vP/8vLz//Pz9P/y8/P/8vPw//Lz8P/y8/D/8/Pw//Ly8v/y8vP/8vLz//Pz - 9P/z8/T/8vLz//Ly8//y8vP/8/P0//Pz8//z8/P/8/Pz//Pz8//z8/T/8/Pz//Pz8P/z8/D/8/Pw//Pz - 8P/z8/H/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz9P/z8/T/8/Pz//Pz8//y8vP/8vLz//Ly - 8//y8/H/8/Pw//Lz8P/y8/D/8vPw//Lz8v/z8/P/8/Pz//Pz9P/z8/T/8/P0//Pz9P/z8/T/8/P0//Py - 9P/38PT/9vLz//Dy9P/w8vT/8/Ly//Hz8P/x8fP/8vPy/+LFpf+hVA7/qVML/7VqKv+qUwn+o1ML/9Sw - if/68+j/9/Pu//Xy7//18vD/9fLw//bz8f/28/H/9vPx//bz8f/28/H/9vPx//bz8f/28/H/9vPx//bz - 8f/28vH/9vLv//bz7//28+//9vPv//bz7//28/H/9vPx//bz8f/28/H/9vPx//bz8f/28/H/9vPx//bz - 8f/28/H/9vPx//bz8f/28/H/9vPx//bz8f/28/H/9vPx//bz8f/28/H/9vLv//bz7//28+//9vPv//bz - 7//28/D/9vPx//bz8f/28/H/9vPx//Xy8P/18vD/9fLw//Xy8P/18vD/9fLw//Xy8P/18vD/9fLw//Xy - 7//18+//9fLv//Xy7//18u//9PLv//Xy8P/18u//9fLw//Xy8P/08vD/9fLw//Xy7//18vD/9fLw//Xy - 8P/18vD/9fLw//bz8f/28vD/9fLv//Xy7//18+//9vPv//by7//18vD/9fLw//Xy8P/18vD/9fLw//Xy - 8P/18vD/9vPx//bz8f/18vD/9fLw//Ty7//18vD/9fLw//Xy7//18+//9PPv//Xz7//18u//9fLv//Xy - 8P/18vD/9fLw//Xy8P/28/H/9vPx//Xy8P/18vD/9fLv//bz6//38ur/9PLy//bw8P/58ev/8/Xr//Xy - 7f/58O7/4MGr/6FREP+qUwv/sWIe/6pSDP6mUgv/05hk/+a4kP/nt4//7biM/+64jP/uuIz/7riM/+64 - jP/uuY3/7rmN/+65jf/uuY3/7rmN/+65jf/uuY3/7rmN/+65jf/uuY3/7riN/+64jf/uuI3/7riN/+65 - jf/uuY3/7rmN/+65jf/uuY3/7rmN/+65jf/uuY3/7rmN/+65jf/uuY3/7rmN/+65jf/uuY3/7rmN/+65 - jf/uuY3/7rmN/+65jf/uuY3/7riN/+64jf/uuI3/7riN/+64jf/uuY3/7rmN/+65jf/uuY3/7rmN/+65 - jf/uuY3/7rmN/+65jf/uuIz/7riM/+64jP/uuY3/7riN/+64jf/uuI3/7riN/+64jf/uuIz/7riM/+64 - jP/uuY3/7rmN/+64jP/uuIz/7riM/+65jf/uuIz/7biM/+24jP/tuIz/7rmN/+65jf/uuI3/7riN/+64 - jf/uuI3/7riN/+65jf/uuY3/7rmN/+65jf/uuY3/7rmN/+65jf/uuY3/7rmN/+65jf/uuY3/7riN/+64 - jP/uuIz/7riN/+64jf/uuI3/7riN/+64jf/uuY3/7rmN/+65jf/uuY3/7rmN/+65jf/uuY3/7rmN/+65 - jf/quI//6biP/+a5j//t0bT/8NG1/+mzkf/krYT/6LWO/+vJrf/euZP/oVMN/6hUCP+sWhX/qlMM/qZS - Cv/VmmP/9bJ+//Sxfv/zsn7/87J+//Oyfv/zsn7/87J9//Oyff/zsn3/87N+//Ozfv/zs37/87N+//Oz - fv/zs37/87N+//Ozfv/zsn7/87J+//Oyfv/zsn7/87N+//Ozfv/zs37/87N+//Ozfv/zs37/87N+//Oz - fv/zs37/87N+//Ozfv/zs37/87N+//Ozfv/zs37/87N+//Ozfv/zs37/87N+//Ozfv/zsn7/87J+//Oy - fv/zsn7/87J+//Ozfv/zs37/87N+//Ozfv/zs37/87N+//Ozfv/zs37/87N+//Oyfv/zsn7/87J+//Oz - fv/zsn7/87J+//Oyfv/zsn7/87J+//Oyfv/zsn7/87J+//Ozfv/zs37/87J+//Oyfv/zsn7/87N+//Oy - fv/zsn7/87J+//Oyfv/zs37/87N+//Oyfv/zsn7/87J9//Oyff/zsn3/87J+//Oyff/zsn3/87J9//Oz - ff/zs37/87J+//Oyff/zsn3/87N9//Ozfv/zsn7/87J+//Oyfv/zsn7/87J+//Oyfv/zsn7/87J+//Oz - fv/zs37/87N+//Ozfv/zs37/87N+//Ozfv/zs37/87N+//Oyfv/2s3z/87J9//OvfP/pnmj/8Z5m//Gf - Zf/wn2X/7J5l/96RVf+lUw7/qFMK/6lUDf+pUwn+plMK/9ega//0sX3/9LF+//Wzfv/1s37/9bN+//Wz - fv/0sn3/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9LJ9//Wzfv/0sn3/9LJ9//Syff/0sn3/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/0s33/9rB7/+6fZ//yn2b/8qBm//KgZ//xnmX/6Zhb/6ZTDv+pUwv/q1UN/6lT - CP6lUwv/26Zy//Oyff/2sX7/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Syff/0sn3/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/0sn3/9bN+//Syff/1s37/9bN+//Syff/1s37/9LJ9//Wzfv/1s37/9bN+//Wzfv/0sn3/9bN+//Sy - ff/1s37/9bN+//Syff/1s37/9LJ9//Wzfv/1s37/9LJ9//Syff/0sn3/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Sy - ff/0sn3/9LJ9//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Syff/0sn3/9LJ9//Syff/0sn3/9LJ9//Sy - ff/0sn3/9bN+//Syff/0sn3/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Syff/0sn3/9bN+//Wzfv/1s37/9bN+//Wzfv/1sn3/9bJ9//Szff/2sXv/7qBn//Kf - Zv/yoGb/8Z9m//CeZP/ollr/qFMO/6xSC/+sVQ7/qlQJ/qRTDP/gq3n/87J+//axfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Syff/1s37/9LJ9//Wzfv/1s37/9LJ9//Wz - fv/0sn3/9bN+//Wzfv/1s37/9bN+//Syff/1s37/9LJ9//Wzfv/1s37/9LJ9//Wzfv/0sn3/9bN+//Wz - fv/0sn3/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9LJ9//Syff/0sn3/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9LJ9//Syff/1s37/9bN+//Wz - fv/1s37/9bN+//Wyff/1sn3/9LN9//exe//voGj/8p9m//KgZv/xn2b/8Z9l/+WUV/+oVA3/q1ML/61a - Ff+qVAn+o1IO/+Csff/ysn//9rF9//Wzfv/1s37/9bN+//Wzfv/0sn3/9LJ9//Syff/0sn3/9LJ9//Sy - ff/0sn3/9LJ9//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9LJ9//Wzfv/0sn3/9bN+//Wzfv/0sn3/9bN+//Syff/1s37/9bN+//Syff/1s37/9LJ9//Wz - fv/0sn3/9bN+//Wzfv/0sn3/9bN+//Syff/1s37/9bN+//Syff/0sn3/9LJ9//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/0sn3/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/1s37/9bN+//Wyff/0sn3/97F7/++g - aP/yn2b/8qBm//GfZv/wnWT/65ld/6dUDP+pUwv/s2Uj/6pTCv6iVA3/4Kt///Kzfv/3s33/9bN+//Wz - fv/0sn3/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9bN+//Syff/0sn3/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/0sn3/9LJ9//Syff/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Szff/2sXv/7p9n//GfZ//woGb/8KBm/++eZv/roWr/nlQR/61V - CP+1cDL/qVML/qJUDf/grYD/8rN+//ezff/1s37/9bN+//Syff/0sn3/9LJ9//Wzfv/1s37/9bN+//Wz - fv/1s37/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9LJ9//Syff/0sn3/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Syff/0sn3/9LJ9//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9LN9//Ww - ev/tn2f/8Z9n//CgZv/woGb/755m//Cocv+jVBL/rVQI/7l/S/+pVAz+olQM/+Ktf//ysnz/97J9//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/0sn3/9LJ9//Wzfv/1s37/9bN+//Wz - fv/0sn3/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Syff/0sn3/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/0s33/9a96/+2fZ//xnmb/8KBm//CgZf/wnmb/8q13/6RU - EP+rVAr/p2k3qKlTC/6lVAv/36l4//KzfP/0snz/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/0sn3/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/0sn3/9LJ9//Syff/1s37/9LJ9//Syff/0sn3/9LJ9//Syff/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Sz - ff/1r3r/7p9n//GfZ//woGb/8KBm//CfZ//xqnT/pFYR/6VSDP+2f1GhqVML/qRTCf/YoW7/9LN8//Sy - fP/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/0s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Syff/0sn3/9LJ9//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Syff/0sn3/9LJ9//Wz - fv/0sn3/9LJ9//Syff/0sn3/9LJ9//Wzfv/1s37/9bN+//Wzff/1s33/9bN9//Wzff/1s33/9bN9//Wz - ff/1s33/9bN9//Wzff/1s33/9bN9//Wzff/1s33/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9LN+//Szfv/0s37/9LN+//Wvev/tn2b/8Z9n//CfZv/woGb/8J9m/+eh - a/+jUw7/pFMN/6ltPFmoVQn+p1MI/9aQXP/2snz/8rN7//Szff/0sn3/9LF8//Sxff/0sXz/9bJ8//Wy - fv/1sX3/9bF9//Kyfv/0sn7/9LN+//WxfP/1sXz/9LF9//Syfv/0sn3/9LJ9//Syff/0sn3/9LJ9//Sy - ff/0sn3/9LJ9//Wxff/1sX3/9bF9//Wxff/1sX3/9bF+//Wxfv/1sX7/9bF+//Wxfv/1sX7/9bF+//Wx - fv/1sX7/9bF+//Wyfv/1sn7/9bJ+//Wyfv/1sn7/9bN+//Wyfv/1sn7/9bJ+//Wzfv/1s37/9bN+//az - fv/2s37/9LN9//Szff/0s33/9LN9//Szff/0s33/9LN9//Szff/0s33/9bN9//azff/1s33/9bN9//Wz - ff/1s37/9bJ+//Wyfv/1s37/9bJ+//Wyfv/1sn//9bJ///ayf//2sn//9rJ///ayf//1sn7/9bJ+//Wy - fv/1sn7/9bJ+//Wyfv/1sn7/9bF9//Wyff/1sn3/9bJ9//Wyff/1sn3/9bJ9//Wyff/1sn3/9bJ9//Sy - ff/0sn3/9LJ9//Syff/0sX3/9bF+//axfv/2sn3/9rJ9//ayfP/1snz/9bJ8//Syff/zsn3/87J9//Sy - fv/zsnz/9a54/+yeZv/wnWb/8J5l//GeZf/sn2X/4Jpg/6NTDv+lURL+rntRPKpWD/6qVAf/yoNK//Oy - fP/0sXz/9rJ8//Sze//0s3v/8rR6//K1ef/ztXn/9LV6//S1ev/0tXr/87V6//O2ev/0tnr/87V6//S2 - e//ztnr/87Z6//O2ev/ztnr/87Z6//K3ef/yt3n/8rd5//K3ef/yt3n/9Ld5//S3ef/zt3j/87d5//S3 - ef/0t3r/9Ld7//S3e//0t3v/9Ld7//S3e//0t3v/9Ld7//S3e//0t3v/9Ld7//S3e//0t3v/9Ld7//S4 - e//0uXz/9Lh7//S4e//0uHv/9Lh7//S4e//0uHv/9bh7//W4e//yuHv/8rh7//K4e//zuHv/87h7//O4 - e//zuHv/87h7//O4e//0uHv/9bh7//S4e//zuHv/87h7//S4e//zt3r/87d6//S5fP/0uHv/9Lh7//S4 - e//0uHv/9Lh8//S4fP/0uHz/9Lh8//S3e//0t3v/9Ld7//S3e//0t3v/9Ld7//S3e//0t3r/9Lh6//S4 - ev/0uHr/9Lh6//S3ef/0t3n/9Ld5//S3ef/0t3n/9LZ5//S2ef/0tnn/9LZ5//S2ef/0tnr/9LZ6//S3 - ev/zt3n/87d5//W2e//1tnv/9bZ6//O2ev/ztnr/87Z6//O2ev/0snf/6aFo/+ykZP/to2L/759l//Cd - Zv/ThEn/pVMK/5xXH/zRqoshplsd/KtSBP/JgkT/8bJ8//Wxff/0sX3/87V8//rHhP/8zYL/+89///vP - fv/7z37/+tF+//rRfv/60X3/+tJ9//vTfv/60nz/+tJ9//rRff/70X3/+tB9//vRff/70X7/+tF9//rR - ff/50X3/+dF9//rSfv/50X3/+dF9//nRff/60n7/+tJ+//rTe//603v/+tN7//rTe//503v/+dN7//nT - e//603z/+tN8//nTe//503v/+dN7//rTfP/603z/+tR8//rVfP/61Xz/+tV8//rVfP/61Xz/+tV8//rV - fP/61Xz/+tV8//rVfP/61Xz/+tR8//rVfP/61Hv/+tV8//rVfP/61Xz/+tV8//rVfP/61Xz/+tV8//rV - fP/61Xz/+tV8//rVfP/61Xz/+tV8//rVfP/61Hz/+tR8//rUfP/61Hz/+tR8//rUfP/61Hz/+tN8//rT - fP/603z/+tN8//rTfP/603z/+tN8//rSff/60n7/+tJ+//nSfv/50n7/+dJ+//rSfv/60n7/+tJ+//rS - fv/60X3/+tF9//rRff/60X3/+9F9//zRfv/80X7//NF+//zQfv/70H7/+tJ9//rSff/70n3/+tJ9//rR - ff/60H3/+c99//vNff/7y33/+8p+//rEf//xqXD/755n/8BwMP+jUwz/tH9Z1AAAAACaYS/kqVII/7Fm - Jv/ytX//8rF9//Oxff/ys3v/8LV4//G7eP/zwHj/9cR6//jIfP/5zH3/+c5+//nQff/60X3/+9J+//rT - ff/51Hv/+NV7//jVe//41Xv/+NV7//nWfP/41nr/+NZ6//jVev/41Xr/+dZ7//jWe//41nv/+NZ7//jW - e//41nv/+NZ9//jWff/41n3/+NZ9//jWff/41n3/+NZ9//jWfv/41n7/+NZ+//fVff/31X3/+NZ+//jW - fv/41n3/+Nd9//jXff/4133/+Nd9//jXff/4133/+Nd9//jXff/4133/+NZ+//jWfv/41n7/99V9//jW - fv/41n7/+NZ+//jWfv/41n7/+NZ+//jWfv/41n7/+NZ+//jWfv/41n3/+Nd9//jXff/4133/+NZ9//jW - ff/41n7/+NZ+//jWfv/41n7/+NZ+//jWfv/41n7/+NZ+//jWfv/41n7/+NZ+//jWfv/41n7/+Nd8//jX - e//413v/99d6//fXev/313r/+Nd7//jXe//413v/+Nd7//jWe//41nr/+NZ6//nWe//51Xv/+tV7//rV - fP/61Hz/+tR9//rTff/6033/+tN9//rSfv/50H//+M5+//fMfP/5yXr/88Bz//C1a//trmf/6aNl/+qf - ZP/unmL/sWEe/59YGf/No4Y9AAAAAK1/U5yiVBD9oFEP/9qbY//vsn7/9rJ9//Syff/ysH3/9LGA//ax - gP/2sn7/9bJ8//Oyev/zs3r/8bR6//K1ef/0t3r/9Lp6//e+ev/0w3r/9cV6//jHfP/4yH3/+st///rM - ff/6zH7/+81+//vOf//8z4D/+dB9//rSff/60X7/+tF+//rSff/61Hv/+tR7//rUe//61Hz/+tR7//vV - e//71Xv/+9V8//vVe//71Xv/+9V7//rVe//71Xv/+9Z7//vWe//71nz/+tZ7//rWe//61nv/+tZ7//rW - e//61nv/+tZ7//vWe//71n3/+9Z9//vVfP/71n3/+tV8//rWff/61n3/+tZ9//vWff/71n3/+tZ9//rW - ff/71n3/+9Z9//rWe//61nv/+tZ7//rWe//61nv/+tZ7//vWfP/71nz/+tZ7//rVe//71nz/+9Z8//vW - fP/71Xv/+9V7//vVe//71Xv/+9V7//rVe//703v/+9N+//rTfv/60n3/+dJ9//rSfv/60n7/+tF+//nR - ff/50X3/+89///vNf//6zH//+sx9//rKff/6yX3/+Md9//fFff/2w3v/9cB7//W8e//yuXr/8rZ5//Cz - ef/vs3n/8rJ6//WweP/vomj/8J9m//KeZf/vnWT/8Z5k/+KOTv+oUxD/qWQqygAAAAAAAAAA3rGQF7eG - XNOmUg3/q10a/+mtd//xsn3/9LF8//WwfP/1sXz/9bJ9//Wyfv/1sn7/9bN+//Wzfv/0s33/9LN9//Sz - ff/0snz/9LJ8//SyfP/0s33/9LN9//Szff/0s33/9LN6//S0ev/0tXv/9LV7//S0e//ztnr/9LZ5//S2 - ef/0uHn/87h4//K5eP/yuXj/8rl3//K5eP/yunf/8rx3//K8d//yvHf/87x4//S9eP/1vXj/9b14//a/ - ef/2v3n/9sB6//bBe//1wXv/9cF7//bCe//3w3v/98N7//fDe//3xHv/98R7//fFe//3xXv/98V7//fF - e//3xXv/+cV8//jFfP/3xXv/98V7//jFe//4xXv/+MV6//jFe//4xXv/98R7//fEe//2xHv/9cN7//XC - e//1wXv/9sF7//bBev/1wXr/9L95//W+eP/1vnj/9b54//S9d//zvXf/87x3//G7d//xu3f/8Lp2//K5 - d//zuHj/87h4//S4d//zuHf/9Ld5//S3e//0tnr/9LZ6//O2ev/0tHv/9LR7//S0e//0s3r/87R6//Oz - e//zs3z/9LN8//SzfP/0s3z/9bN9//Wzff/0snz/87J8//Gyff/zsX//8qVx/++eZv/un2b/76Bk//Cd - Zv/nlVv/rFgS/5hSEv/DlGhiAAAAAAAAAAAAAAAAAAAAAKlxQuCkUgv/plgO/8qESP/qpGz/+LJ8//Ky - fv/xsn7/9bN+//azfv/2s37/9rN+//Ozff/zs33/87N9//Ozff/zs33/87N9//Szff/0s33/9LN9//Sz - ff/zsn3/87J9//KxfP/ysnz/8rJ8//axfv/2sX3/9rF9//axff/2sn3/9LF9//Sxff/0sX3/9LF+//Wx - fP/1snz/9bJ8//Wyff/1sn3/9LJ8//SyfP/0snz/9LJ8//SyfP/zsnz/87J8//Oye//zsnv/9LJ7//Sz - e//0s3v/87N6//Sze//0s3v/8rJ6//Kyev/ysnr/8rJ6//Kyev/0s3v/87J6//Kyev/ysnr/8rJ6//Sz - e//0snr/8rJ6//Kyev/zs3r/9LN7//Sze//0s3v/9LN7//Sye//0snz/87J7//Oye//zsnz/9LJ8//Sy - fP/0snz/9LJ8//SxfP/1sn//9rJ///Wyf//1sX7/9bF+//ayfv/2sn7/9bF9//Wxff/1sH3/9rB+//aw - fv/2sX7/9rF+//Oxff/zsn3/87J9//Oyff/zsn3/87J+//Oyfv/zsn7/8rN+//Kzff/ys3v/8LN+/+uy - gP/tt4b/8LyM/+utfP/onmf/8p5m//OeZf/xnmP/24tO/7hlHP+iVQn9oW88kAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAKlwRsCfWBf9pVMM/6NUDP+rXxr/wXY3/9KJTv/YkFT/35dc/+CZXv/dlVn/3JNV/9qQ - Uf/Yjk//2I5P/9iOT//Zjk//2o5P/9qOT//ajk//2o5P/9qNUP/ajVD/2o1Q/9qNUP/YjVD/1Y5P/9WP - T//Vj0//1Y9P/9WPT//VjlD/1Y5Q/9WOUP/VjlD/1o5R/9mPUv/Zj1L/2pBS/9qQUv/ZkFL/2JBS/9iQ - Uv/YkVL/2ZFT/9iRVP/YkVX/2ZFW/9mRVv/Zklb/2pJV/9qSVf/bk1b/25NW/9uTVv/ak1j/2pNY/9qT - V//ak1f/2pNX/9qTV//ak1f/2pNX/9qTV//ak1f/3JNX/9yTV//bk1f/25NX/9qTVv/Zk1X/2ZNV/9mT - Vf/ZklX/2ZFV/9qSVv/ZkVX/2JFV/9iQVP/ZkFP/2JBS/9iQUv/YkFL/2JBS/9qQUf/Yj1H/2I9Q/9iP - UP/WjlD/1o5Q/9aOUP/WjlD/1o5Q/9WOT//Vjk//1Y5P/9WOT//Vjk//2I1Q/9qNUP/ZjVD/2Y5R/9uP - Uv/dkFT/4ZVZ/+OZXP/jml3/4Zxh/96ldf/ntIr/78Se/+q8mP/aqIL/3ad7/9yibv/Yk1f/zXg6/7Zb - F/+pVQf/olUS/KFuPqzy2bIUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv39ABKFyRDGodkLGlVYe/51S - D/+iUwv/oVML/6NSDP+iUgz/pFMM/6RTDP+lUwv/p1ML/6dTCf+nUwv/p1ML/6dTC/+nUwv/p1ML/6dT - C/+nUwv/plML/6ZTC/+mUwv/plML/6ZTC/+nVAj/qFQL/6hUC/+oUwv/qFML/6lTC/+pUwv/qVML/6lT - C/+rVQz/rFUM/61WDv+uVw7/rlcP/61YEP+tWBD/rlkQ/65ZEf+vWhL/sFsT/7BaFP+wWxX/sVsV/7Jc - Fv+yXBb/sl0X/7NdF/+zXRf/s10X/7ReGP+0Xhj/tF4Y/7VfGf+1Xxn/tV8Z/7VfGf+1Xxn/tV8Z/7Vf - Gf+0Xxn/tF4Y/7NdGP+zXRf/s10X/7NdF/+yXBb/slwW/7FcFv+xWxX/sFoV/7BaFP+wWhT/rlkS/65Z - EP+uWRD/rVgQ/61YEP+tVg7/rFYM/6tVC/+rVAn/qlQJ/6lTC/+pUwv/qVML/6pTC/+qUwv/qFML/6hU - C/+oVAv/qFQL/6hUC/+mUwv/plML/6ZSCv+mUwv/plML/6ZTDP+mUwv/plIL/6ZTC/+nUwr/qFQJ/6ZV - EP+kVRL/p1gS/6hXD/+pVw7/qFUK/6VTCP+kVAn/nFMQ/6BfLOOzfltXAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADewaA2vpRmbrV1PIuyYx+LqVIFi6lSBYupVAeLqVIHi6pS - B4uqUguLqlILi6xSC4usUguLqVILi6lUC4upVAuLqVQLi6lUC4upVAuLqVQLi6lUC4upVAuLqVQLi6dU - C4unUguLp1ILi6dSC4unUguLp1QLi6dUC4unVAuLp1ILi6VSB4unUguLp1QLi6lWC4upVguLqlgNi6pY - DYuqWA+LrFgPi6xaD4usWA+LrFgQi65aEIuuWhKLrloSi7BcEouwXBSLsFwWi7BcFouwXBaLsF0Yi7Bd - GIuwXRiLsF0Yi7BdGIuwXRiLsF0Yi7BdGIuwXRiLsF0Wi7BdFouwXRaLsFwWi7BcFouuXBaLrlwSi65c - EousXBKLrFoSi6xaEousWBCLrFgQi6xYEIusWA+LrFgPi6pYDYuqWA2LqVYNi6lWDYunUguLp1ILi6dS - C4unUguLp1ILi6lUC4upVAuLqVQLi6lUC4unVAuLp1QLi6dUC4unVAuLp1QLi6dUC4upVAuLqVQLi6lU - C4upUgmLp1IHi6lSB4upVAeLqlIHi6xSB4uqUQmLp1ELi6VRDYunUgmLqVIHi6VRC4usUQ+LrFghi7B1 - QIuuiF5P6LmiCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAA/4AAAAAAA - AAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAQAA - AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA - AAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA - AAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAA - AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAA - AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA - AAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA - AAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAA - AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAA - AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA - AAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA - AAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAA - AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAA - AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA - AAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA - AAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAA - AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAA - AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA - AAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA - AAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA - AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA - AAMAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAA - AAAAAAAP+AAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAP////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////ygAAAAAAQAAAAIAAAEAIAAAAAAAAAAIAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/dKhg+elb4PKezyDwWcjg7NYE4OpUg6DpVQOg6VU - CoOnVAqDq1QIg6tUCIOrVAiDq1QIg6tUCIOrVAiDq1QIg6tUCIOrVAiDr1QKg69UCoOtVAqDrVQKg6tU - CIOrVAiDqVQIg6lUCIOpVAiDqVQKg6lUDoOpVA6DqVQOg6lUDoOpVA6DqVQOg6lUDoOpVA6DqVQOg6lU - DoOpVA6DqVQOg6lUDoOpVA6DqVQOg6lUDoOpVA6DqVQOg6lUDoOpVA6DqVQOg6lUDoOpVA6DqVQOg6lU - DoOpVA6DqVQOg6lUDoOpVA6DqVQOg6lUDoOpVA6DqVQOg6lUDoOpVA6DqVQOg6lUDoOpVA6DqVQOg6lU - DoOpVA6DqVQQg6lUEIOrVhCDq1YQg6tWEIOrVhKDq1YSg6tWEoOtWBKDrVgSg61YEoOtWBKDrVgTg61Y - E4OtWBODrVgTg61YE4OtWBWDrVgVg61YFYOtWRWDrVkVg61ZFYOtWRWDrVkVg69ZF4OxWReDsVkXg7Fb - F4OxWxeDsVsXg7FbF4OxWxeDs1sXg7NbF4OxWxeDsVsXg7FbF4OxWxeDsVsXg7FdGYOxXRmDsV0Zg7Fd - GYOxXRmDsVsXg7FbF4OxXRmDsV0Zg7FdGYOxXRmDsV0Zg7FdGYOxXRmDsV0Zg7NdGYOzXRmDs1sXg7Nb - F4OzWxeDs1sXg7NbF4OzWxeDs1sXg7FbF4OxWxeDsVsXg7FbF4OxWxeDsVkXg7FZF4OxWReDsVkXg7FZ - F4OvWRWDr1kVg69ZFYOvWRWDr1gVg69YFYOvWBWDr1gVg61YE4OtWBODrVgSg61YEoOtWBKDrVgSg6tW - EoOrVhKDrVYSg6tUEIOrVBCDq1QQg6tUEIOrVBCDq1QQg6tUEIOpUg6DqVIOg6lSDoOpUg6DqVIOg6lU - DoOpVA6DqVQOg6lUDoOpVA6DqVQOg6lUDoOpVA6DqVQOg6lUDoOpVA6DqVQOg6lUDoOpVA6DqVQOg6lU - DoOpVA6DqVQOg6lUDoOpVA6DqVQOg6lUDoOpVA6DqVQOg6lUDoOpVA6DqVQOg6lUDoOpVA6DqVQOg6lU - DoOpVA6DqVQOg6lUDoOpVA6DqVQOg6lUDoOpVA6DqVQKg6tUCoOrVAqDq1QKg6tUCoOpUgqDqVIKg6lU - CoOrVA6DrVgQg61SDoOxVhKDu2Uhg8h3NYPQhkaD0JJWg96rdYPxzJqD/OCwdQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMuuhSy1ilxkr4BP/5NZIv+ZUxT/pFMP/6pTDP+rUwn/qlQL/6hW - Cv+kVAr/qVQK/6xTCf+sUwj/rFMI/6xTCf+sUwr/rFMK/6xTCf+sUwj/rFML/61UC/+tUwv/q1QL/6tU - C/+qVAv/qVUI/6lVCP+pVQj/qVUI/6lUCv+pVAv/qVQL/6lUDP+pVAz/qVQM/6lUC/+pVAv/qVQL/6lU - DP+pVAz/qVQM/6lUC/+pVAv/qVQL/6lUDP+pVAz/qVQM/6lUC/+pVAv/qVQL/6lUDP+pVAz/qVQM/6lU - C/+pVAv/qVQL/6lUDP+pVAz/qVQM/6lUC/+pVAv/qVQL/6lUDP+pVAz/qVQM/6lUC/+pVAv/qVQM/6lU - Df+pVA7/qlUN/6pVDv+rVg7/q1YP/6tWD/+sVhD/rFYQ/61YEP+tWBD/rVgQ/61YEf+tWBH/rVgR/65Z - Ef+uWRL/r1oS/69aFP+uWhT/rloV/65aFf+uWhX/rloV/65aFf+uWhX/rlsV/69bF/+vWxf/slwX/7Jc - GP+yXRj/sl0Y/7JcF/+yXRj/s10Y/7NdGP+zXRj/sl4Y/7JeGP+xXRj/sV0Y/7JeGv+yXhr/sl4Z/7Je - Gf+yXhn/sl4a/7JeGv+yXhr/sl4Z/7JeGf+yXhr/sl4a/7JeGv+yXhn/sl4Z/7JeGf+0Xhr/tF4a/7Re - Gv+0Xhj/s14Y/7NdGP+zXRj/s10Y/7NdGP+zXRj/s10Y/7NdGP+zXRj/s10Y/7FbGP+xWxf/sVsX/7Fb - F/+xWxf/sVsX/7FbF/+wWhX/sFoV/7BaFf+wWhX/sFoV/69ZFf+uWRT/rlgT/65ZEf+uWRL/rVgR/61Y - Ef+tWBD/rVgQ/61WEP+tVhD/rFUP/6xWD/+sVQ7/q1UO/6tUDf+rVA7/q1QO/6tUDf+qUwv/qlML/6pT - DP+pUwz/qVQM/6lUC/+pVAv/qVQL/6lUDP+pVAz/qVQM/6lUC/+pVAv/qVQL/6lUDP+pVAz/qVQM/6lU - C/+pVAv/qVQL/6lUDP+pVAz/qVQM/6lUC/+pVAv/qVQL/6lUDP+pVAz/qVQM/6lUC/+pVAv/qVQL/6lU - DP+pVAz/qVQM/6lUC/+pVAv/qVQL/6lUDP+pVAz/qVQM/6pUC/+sVAr/rFQK/6xUC/+rVAv/qlQL/6lT - C/+pUwv/qVML/6lTC/+sVA//rFQP/6hSDP+jUgz/oFMP/51WFv+QURb/ilQb/5VlMf+nfEr/uJFk/9O2 - kOycbksszrqTGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMKfesqVYzT/l1QZ/6FQDf+oUxD/p1IK/6hUCP+pVQf/qFUH/6hW - CP+mVAX/plYI/6hUCv+pUw7/qVMN/6lTDf+pUw3/qVMO/6lTDv+pUw3/qVMN/6lTD/+lVA//pVMP/6VU - D/+lUw//p1QN/6dUC/+pVAv/qVQK/6lVCv+pVQr/qVQL/6lUC/+pVAv/qVQL/6lUC/+pVAv/qVQL/6lU - C/+pVAv/qVQL/6lUC/+pVAv/qVQL/6lUC/+pVAv/qVQL/6lUC/+pVAv/qVQL/6lUC/+pVAv/qVQL/6lU - C/+pVAv/qVQL/6lUC/+pVAv/qVQL/6lUC/+pVAv/qVQL/6lUC/+pVAv/qVQL/6lUC/+pVAv/qVQL/6lU - C/+qVQv/qlUN/6tWDf+rVg7/rFcO/6xXDv+sVw7/rVgP/61YEP+tWRD/rFkQ/6xZEP+sWRH/rFkR/6xa - EP+tWhH/rVoS/65bEv+uWxT/rlsU/69cFP+vXBT/r1wU/69cFP+wXRX/sF0V/7BdFf+xXhf/sV4X/7Fe - F/+xXhf/sV4X/7FeF/+xXhf/sV4X/7JfGP+yXxj/sl8Y/7JfGP+zYBj/sl8Y/7JfGP+zYBj/s2AZ/7Rh - Gf+0YRn/tGEZ/7RhGf+0YRn/tGEZ/7RhGf+0YRn/tGEZ/7RhGf+0YRn/tGEZ/7RhGf+0YRn/s2AZ/7Ng - Gf+zYBn/s2AY/7NgGP+zYBj/s2AY/7NgGP+zYBj/sl8Y/7JfF/+yXxf/sl8X/7JfF/+xXhf/sV4X/7Fe - F/+xXhf/sV4X/7BdFv+wXRX/r1wU/69cFP+vXBT/r1wU/69cFP+uWxT/rVoT/61aEv+vWRH/rloR/65Z - EP+uWRD/rlkQ/61ZEP+uWBD/rVcP/61XDv+tVw7/rVcO/6xWDv+sVQ3/rFYO/6tVC/+rVQv/qlQL/6pU - C/+qVAv/qVQL/6lUC/+pVAv/qVQL/6lUC/+pVAv/qVQL/6lUC/+pVAv/qVQL/6lUC/+pVAv/qVQL/6lU - C/+pVAv/qVQL/6lUC/+pVAv/qVQL/6lUC/+pVAv/qVUL/6lUC/+pVAv/qVQL/6lUC/+pVAv/qVQL/6lU - C/+pVAv/qVQL/6lUC/+pVAv/qVQL/6lUC/+pVAv/qVQL/6lUC/+pVAv/qVQK/6lVCv+pVAv/qVQL/6lU - C/+nVAv/p1QL/6dUC/+nUw3/plMN/6dUD/+nUgr/qFIK/6pUDv+qVA3/qFML/6dSDv+mUg//pE8N/6dP - Ef+iUBf/mlUl/5NfNO2zjWrV6c+rOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA2LiRT7OJXf+VVB7/n1ES/6NSDf+iVgv/o1UL/6ZUDf+oUQv/qVEN/6ZQ - Df+jUw//nFIP/5lVEv+bWB3/n10l/6NhKP+kYSr/pGIq/6ViKv+kYir/pWIr/6ZjK/+iYCj/oV0k/55X - IP+eVR3/nFIZ/5pOEv+eURX/oFAT/6NRE/+kUBP/oVIR/55UD/+eUw7/nlMO/59UD/+eUw7/nlMO/55T - Dv+eUw7/nlMO/6BUDv+gVA7/oFQO/6BUDv+gVA7/oFQO/6BUDv+gVA7/oFQO/6BUDv+gVA7/oFQO/6BU - Dv+gVA7/oFQO/6BUDv+gVA7/oFQO/6BUDv+gVA7/oFQO/6BUDv+gVA7/oFQO/6BUD/+hVBD/olUR/6JV - Ef+iVRH/olYR/6NWEf+jVhL/pFcT/6RYE/+lWBP/pVgT/6VZFP+lWRT/olkU/6JaFv+iWhb/oloW/6Ja - Fv+iWhf/pFwY/6RcGP+lXBn/pV0a/6ZcGv+oXBv/qFwb/6hcG/+oXRv/qV0c/6ldHP+pXRz/qV0c/6ld - HP+oYB3/qGAd/6hgHf+oYB3/qGAd/6lhHv+pYR7/qWEe/6lhHv+pYR7/qWEe/6lhHv+pYR7/qWEe/6lh - Hv+qYR//qmEf/6phH/+qYR//qmEf/6piH/+qYh//qmIf/6piH/+qYh//qmIf/6piH/+qYh//qmIf/6lh - Hv+pYR7/qWEe/6lhHv+pYR7/qWEe/6lhHv+pYR7/qWEe/6lhHv+pYR7/qWAe/6hgHf+oYB3/qGAd/6hf - Hf+nXxz/p18c/6dfHP+nXxz/p18c/6ZeG/+mXhv/pl0a/6VdGv+lXRr/pFwZ/6RcGf+kWxj/plsX/6Vb - Fv+lWhb/pFkU/6ZZFP+mWRT/pVkU/6VYFP+lWBT/pFgT/6VYE/+lWBP/pFcT/6RXE/+jVhL/o1YS/6JV - EP+iVRD/olUQ/6BUD/+gVA//oFQP/6BUD/+gVA//oFQP/6BUD/+gVA//oFQP/6BUD/+gVA//oFQP/6BU - D/+gVA//oFQP/6BUD/+gVA//oFQP/59UD/+eVA//nlQP/55UD/+eVA//nlQP/55UD/+eVA//nlQP/55U - D/+eVA//n1QP/59UD/+fVA//n1QP/59UD/+eVA//nlQP/55UD/+eVA//nVQQ/5xUEP+bUw//nFIQ/5pS - EP+aUhD/mVIP/5lSEP+aUhH/m1IS/55SEv+hUhP/oVAR/6RSEf+lUg3/qFQK/6lUCf+rUwf/rFMG/65V - CP+rVQj/rlMI/69SC/+sUA7/pFEU/6NiL/+3imHN8Nm9eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA3MieJap+T/+XTg//qVAI/61QCf+xVwz/qFUC/6ZTDP+fThL/nlIf/59c - Lv+dYzv/qn9c/8iqiv/Ywab/4865/+zXxf/z3sz/8t3L//TezP/z3sz/9d/N//ji0P/34c//893H/+/Y - uv/q0bL/5cur/+LEpP/dvZz/0q+P/82nhf/Gnnv/vpVy/7qOaf+yh17/rYFW/6h8U/+nfFL/qHxT/6l9 - VP+pfVT/qX1U/6l9VP+rfVT/q31U/6t9VP+rfVT/q31U/6t9VP+rfVT/q31U/6t9VP+rfVT/q31U/6t9 - VP+rfVT/q31U/6t9VP+rfVT/q31U/6t9VP+rfVT/q31U/6t9VP+rfVT/q31U/6t9VP+pe1L/qXtT/6p8 - VP+qfFT/qnxU/61/Vv+tf1b/rX9W/62AVv+tgFb/rYBW/62AVv+tgFf/roFY/66BWP+ugVn/roFZ/66B - Wf+ugVn/roFZ/66BWf+ugVn/r4Ja/6+CWv+vglr/r4Ja/6+CWv+vglr/sINc/7CDXP+wg1z/sINc/7CD - XP+wg1z/sYRd/7GEXf+xhF3/sYRd/7GEXf+yhV3/soVd/7KFXf+yhV3/sYVd/7CFXv+whV7/sIVe/7CF - Xv+whV7/sYZe/7GGXv+xhl7/sYZe/7GGXv+xhl7/sYZe/7GGXv+xhl7/sIVe/7CFXv+whV7/sIVe/7CF - Xv+yhV7/soVe/7KFXv+yhV7/soVe/7KFXv+yhV7/soVe/7KFXv+yhV3/soVd/7KFXf+xhF3/sYRd/7GE - Xf+xhF3/sYRd/7GEXf+xhF3/sYRd/7GEXf+wg1z/sINc/7CDXP+vglr/r4Ja/6+CWv+ugVn/roFZ/66C - Wf+ugln/roJZ/66CWf+vgVn/r4FZ/66AWP+ugFj/rYBW/62AVv+tgFb/rX9W/61/Vv+tf1b/q31U/6t9 - VP+qfFT/qnxU/6p8VP+pe1L/qXtS/6l7Uv+pe1L/qXtS/6l7Uv+pe1L/qXtS/6l7Uv+pe1L/qXtS/6l7 - Uv+pe1L/qXtS/6l7Uv+pe1L/qXtS/6l7Uv+pe1L/qXtS/6h8Uv+ofFL/qHxS/6h8Uv+ofFL/qHxS/6h8 - Uv+ofFL/qHxS/6h8Uv+ofFL/qHxS/6h8Uv+ofFL/qHxS/6h8Uv+ofFL/qHxS/6h8Uv+qflX/rYNc/7KH - YP+3jGb/u5Js/8GXcf/CmnX/xZx4/8adef+8l3P/tJJr/7CMY/+thFr/oXJE/5tkMv+cXSn/n1oi/59X - Hf+bThH/olYP/6JXC/+hVgX/p1gF/6hWBf+jUwr/k1AW/5RlPf/NpYdmAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA89u7QKJ7Uv2WUhT/qlAH/7JUCP+tVAn/pU8G/6dSDP+aVhz/q3pO/+DD - ov/y4sv/+u7d//3z6//68O7/+u3y//vy8P/49Ov/9/Tq//j06//49e3/+/bt//j06v/39Or/+PTr//j0 - 7P/z8+7/8vPt//T07f/29O3/+PTt//v07f/88+z//fPr//3x6f/98ef//vPn//7x5f/+8uf//vLo//7y - 5//+8uf//vLn//7y5//+8uf//vLn//7y5//+8uf//vLn//7y5//+8uf//vLn//7y5//+8uf//vLn//7y - 5//+8uf//vLn//7y5//+8uf//vLn//7y5//+8uf//vLn//7y5//+8uf//vLn//7y5//+8uf//vLn//7y - 5//+8uf//vLo//7y6P/+8uf//vLn//7y5//+8uf//vLn//7y5//+8uj//vLo//7y6P/+8uf//vLn//7y - 5//+8uf//vLn//7y5//+8uf//vLn//7y5//+8uf//vLn//7y5//+8uf//vLn//7y5//+8uf//vLn//7y - 5//+8uf//vLn//7x5f/+8eX//vHl//7x5f/+8eX//vLn//7y5//+8uf//vLn//7y5//+8uf//vLn//7y - 5//+8uf//vLn//7y5//+8uf//vLn//7y5//+8uf//vLn//7y5//+8uf//vLn//7y5//+8uf//vLn//7y - 5//+8uf//vLn//7y5//+8uf//vLn//7y5//+8uf//vLn//7y5//+8uf//vLn//7y5//+8uf//vLn//7y - 5//+8uf//vLn//7x5f/+8uf//vLn//7y5//+8uf//vLn//7w5f/+8OX//vLn//7y5//+8uf//vLn//7y - 5//+8uf//vLn//7y5//+8uj//vLo//7y5//+8uf//vLn//7y5//+8uf//vLo//7y6P/+8uj//vLn//7y - 5//+8uj//vLo//7y6P/+8uj//vLo//7y6P/+8uj//vLo//7y6P/+8uj//vLo//7y6P/+8uj//vLo//7y - 6P/+8uj//vLo//7y6P/+8uj//vLo//7y6P/+8uj//vLo//7y6P/+8uj//vLo//7y6P/+8uj//vLo//7y - 6P/+8uj//vLo//7y6P/+8uj//vLo//7y6P/+8uj//vLo//7y6P/+8uj//vLo//7y6P/+8uj//vTo//7z - 6P/+8uf//vHn//7x6P/+8+n//vLp//7z6f/+9Or//vTq//316P/88ub//fXn//3x4v/78N3/9ejS//Dg - yP/mxqr/wZt7/6ZxRP+LSxb/oVca/6RRCv+tVgb/qlYH/6BQCv+aUxn/nl0v/8yWcYMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAALyNZKKTUhz/p1QQ/6tRBf+tVgz/olIK/5tVFv+td0r/4L2d//3x - 3f/38+j/8/fv//H17//x8u//9fLz//bx9v/18fL/9PLw//X08f/29PL/9PPw//Ty7//08/D/9fPx//Tz - 8f/z8/H/8fPz//Hz9f/x8/P/8fPz//Lz8//y8/T/8vLz//Pz8v/z8/L/8/Lx//Ty8v/08/P/9PPz//Lx - 8v/z8vL/9PPz//Tz8//08/P/9PPz//Lz8//y8/P/8vPz//Lz8//y8/P/8vPz//Lz8//y8/P/8vPz//Lz - 8//y8/P/8vPz//Lz8//y8/P/8vPz//Lz8//y8/P/8vPz//Lz8//y8/P/8vPz//Lz8//y8/P/8vPz//Ly - 8v/z8vL/8/Ly//Py8v/z8vL/8vPz//Lz8//y8/P/8vPz//Lz8//y8/P/8vPz//Lz8//z8/P/8/Pz//Pz - 9P/z8/T/8/P0//Pz9P/z8/T/8/P0//Pz9P/z8/T/8/P0//Pz8//08/P/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/z8/P/8vPz//Lz - 8//y8/P/8vPz//Lz8//y8/P/8vPz//Lz8//y8/P/8vPz//Lz8//y8/P/8vPz//Lz8//y8/P/8vPz//Lz - 8//y8/P/8vPz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T0 - 9P/09PT/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8fTz//H08//x8/P/8vPz//Lz8//z8/P/8/Pz//Tz8//08/P/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8vP/8/Lz//Py8//z8vP/9PPz//Py8//z8vP/8/Lz//Py8//z8vP/8/Lz//Py8//z8vP/8/Lz//Py - 8//z8vP/8/Lz//Py8//z8vP/8/Lz//Py8//z8vP/8/Lz//Py8//z8vP/9PLz//Ty8//08vP/9PLz//Ty - 8//08vP/9PLz//Ty8//08vP/9PLz//Ty8//08vP/9PLz//Ty8//08vP/9PLz//Ty8//08vP/8/Ly//Pz - 8v/08/L/9PTz//Tz8//z8vT/8vL0//Ly9P/w8vT/8vL0//Pw8f/28/P/9PLz//Pz9P/y9PP/8/Px//Xz - 8P/59O7/+/Xs//v15//76db/4MWt/7aGYf+aWCX/olIR/6hSCP+tVgv/plIL/6BRDP+aYy//z7CSdQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMWXaBacXSv/oVAR/6hRCv+tWAv/oFIL/5ZVF/+nfVL/+unY//z0 - 6v/39PH/9fT2//Dx8v/09PP/9PTv//P17f/x9O//8PLx//Dy9P/w8PT/8PD0//Hy9f/w8vT/8PL0//Dy - 9P/w8vT/8/P0//by8v/29PL/9vTy//T08v/19PP/9PLy//L08f/09PL/9PTz//T08v/z9PT/8vT0//L0 - 9P/w8vL/8fPz//L09P/y9PT/8vT0//L09P/x9PT/8fT0//D09P/w9PT/8PT0//H09P/x9PT/8fT0//D0 - 9P/w9PT/8PT0//H09P/x9PT/8fT0//D09P/w9PT/8PT0//H09P/x9PT/8fT0//D09P/w9PT/8PT0//H0 - 9P/x9PT/8fT0//D09P/w9PT/8fT0//H09P/x9PT/8PT0//D09P/w9PT/8fT0//H09P/x9PT/8PT0//D0 - 9P/w9PT/8fT0//H09P/x9PT/8PP0//Dz9P/w9PT/8fT0//Lz8//y8/P/8vP0//L09P/y9PT/8vT0//L0 - 9P/y9PT/8vT0//L09P/y9PT/8fPz//Hz8//x9PT/8PT0//D09P/w9PT/8fT0//H09P/x9PT/8PT0//D0 - 9P/w9PT/8fT0//H09P/x9PT/8PT0//D09P/w9PT/8fT0//H09P/x9PT/8PT0//D09P/x9PT/8fT0//H0 - 9P/w9PT/8PT0//D09P/x9PT/8fT0//H09P/w9PT/8PT0//D09P/x9PT/8fT0//H09P/w9PT/8PT0//D0 - 9P/x9PT/8fT0//H09P/w9PT/8PT0//D09P/x9PT/8fT0//H09P/w9PT/8PT0//D09P/x9PT/8fT0//H0 - 9P/w9PT/8PT0//D09P/w9PT/8PT0//H09P/w9PT/8PT0//L09P/y9PT/8vT0//L09P/w9PT/8PT0//D0 - 9P/x9PT/8PLy/+7z8v/w9PT/8PT0//H09P/x9PT/8fT0//D09P/w8/P/8PPz//H09P/x9PT/8fT0//D0 - 9P/w9PT/8PT0//H09P/x9PT/8fT0//D09P/w9PT/8PT0//H09P/y9PT/8vT0//L09P/y9PT/8vT0//L0 - 9P/y9PT/8vT0//L09P/y9PT/8vT0//Dy8v/w8vL/8PLy//Dy8v/w8vL/8vT0//L09P/y9PT/8vT0//Lz - 8//y8vD/8vPx//D08v/y9PP/8PLy//Dy8v/y9PT/8PT0//Dy8//z8vL/9fTy//Ly8v/y8/T/8fT0//Hz - 9P/x8vL/8vLy//fz8//38/H/8/Ts//P06f/89OT/5cSq/51lOf+aUBP/q1UM/69UBf+qVgX/lVMQ/5Rn - Ov/yy6tPAAAAAAAAAAAAAAAAAAAAAAAAAACqf0ylmFMR/6pTDP+oUAv/qVUG/5dQEf+1iF//9+vY//Py - 8P/z8vH/9PTz//T09P/09PT/9PTz//T08//09PP/9PTz//T08//08/T/9PP0//Tz9P/08/T/9PP0//Tz - 9P/08/T/9PP0//Tz9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PP/9PTz//T08//09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/T0//P0 - 9P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/T0//P0 - 9P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/T0//P0 - 9P/z9PT/8/T0//P09P/z9PT/8/T0//Lz8//x8vL/8/T0//P09P/y8vL/8vLy//Pz8//09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/z8/P/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/T0//P0 - 9P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/T0//P0 - 9P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/T0//P0 - 9P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/T0//P0 - 9P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/09PT/9PT0//T09P/09PT/8/T0//P0 - 9P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/Pz//Hy8v/z9PT/8/T0//P0 - 9P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/8/T0//P09P/z9PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//P09P/09PT/9PT0//T09P/09PT/9PT0//P0 - 9P/09PT/9PT0//T09P/08/P/8vPx//L16//v+fP/7e7w//vy7//33sz/rX9S/5VPDP+yWQz/q1QG/6NW - Cv+YUxH/1Z942wAAAAAAAAAAAAAAAAAAAAAAAAAAnW0+/59UD/+sVA7/qVIN/59UDP+eZjX/8tu///n2 - 6P/y8vH/8vLy//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8vLy//T09P/09PT/8vLy//Pz8//09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T08v/28/D/7fLy/+7z9//18PL//PXp//Xkwv+odT//n04N/6tT - DP+mVQn/nFMO/5pcMf/q07hLAAAAAAAAAAAAAAAA9sikHJVZIf+jUwr/q1IL/6VQDf+XVh3/6cOm//z3 - 6//z9PD/8/Py//Pz8//y8vL/8vLy//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8vLy//Ly8v/y8vL/8vLy//Ly - 8v/09PT/9PT0//T09P/09PT/8vLy//Ly8v/y8vL/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//Ly8v/09PT/9PT0//Ly8v/z8/P/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/+fL1/+/x9f/r8fb/7fLz//T38f/6+OP/5Mil/5dW - I/+qVBP/qFII/6JTCv+VTxv/tZFvpQAAAAAAAAAAAAAAANGhefyZUBD/plQI/6tUDP+jURH/qHJG//zy - 5f/y8/D/7vTz//Hy8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//Ly8v/y8vL/8vLy//Ly - 8v/y8vL/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8vLy//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//y8vL/9PT0//T09P/y8vL/8/Pz//T0 - 9P/09PT/9PT0//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/y8vL/9PT0//T09P/09PT/9PT0//jx9f/x8Pf/7/P3/+vz8//n8e//7PXu//ry - 4P+qelP/nU8Q/6tWCf+lVAX/oE4U/6p8VeoAAAAAAAAAAOXRsCehZTn9o1IQ/6lVCv+oVAv/n1IW/9uz - kv/68Ov/7vX2/+fw7//x8vL/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//y8vL/8vLy//Ly - 8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//y8vL/8vLy//Ly8v/y8vL/8vLy//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8vLy//T09P/09PT/8vLy//Pz - 8//09PT/9PT0//T09P/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8vLy//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/z8/P/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8vLy//Pz8//09PT/9PT0//T09P/28vT/8vL1/+/x8//u8vH/7fX1/+r0 - 9f/28u3/9du+/5lUGf+nVAf/r1sN/6hSD/+kaTv/AAAAAAAAAADRupqYk1Ih/6dPD/+oVAr/olQK/6Bc - Jv/+5M7/+fP0/+vy8v/u9PT/8/T0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Pz8//y8vL/8vLy//Ly8v/y8vL/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Tz//Ty9P/08vT/9fTx//Pz - 8f/u8PP/9fP0//rt1v+cYyr/o1QJ/6tUCP+sUgv/oVwn/wAAAAAAAAAAq41omJdMGv+rUBD/plQK/5tU - Cv+6glb//fPm//Xy8v/u8fD/8vTx//P09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8vLy//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PTy//L08P/08vT/9fL0//jy - 8f/48/D/9PDy//Xz9f/98eD/rHlF/6BTDf+rUwn/q1MI/51TFv/w1ri/AAAAAJx3SpihTxv/rU4P/6ZV - CP+bWg//z6N8//rv7f/y8PD/9/Xy//T08f/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//Ly - 8v/y8vL/8vLy//Ly8v/z8/P/9PT0//T09P/09PT/9PT0//T09P/y8vL/8vLy//Ly8v/09PT/8vLy//Ly - 8v/y8vL/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//Ly8v/y8vL/8vLy//Ly8v/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T08v/09PD/9PH3//Lx - +P/z8vL/9/Pw//jw8//y8PT//fPk/7eHWv+fURL/rlUP/6lWCP+bURH/5Mqp/AAAAACvh1Papk8Y/7BP - Dv+mVQb/lFcK/9y5mv/08fb/8/Hy//Xy7v/z8fH/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Pz8//y8vL/8vLy//Ly8v/y8vL/8/Pz//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz - 8//y8vL/8vLy//Ly8v/y8vL/8/Pz//T09P/09PT/9PT0//T09P/09PT/8vLy//Ly8v/y8vL/9PT0//Ly - 8v/y8vL/8vLy//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8vLy//Ly8v/y8vL/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PL/9/Tw//Tx - 9//v8Pn/7vT0//T17f/28vD/8fL1//3y5//CkWv/oE8X/6hRDP+nWAr/nVMQ/9S4lvwAAAAAt39C/qJR - Ev+rUQv/p1QK/5NSF//o0Lj/9/Hz/+7v7//19vb/7/Dx//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Hx8f/y8vL/9PT0//T09P/y8vL/8vLy//Ly8v/z8/P/8fHx//T09P/09PT/9PT0//T0 - 9P/09PT/8/Pz//Pz8//09PT/9PT0//T09P/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/8vLy//T09P/09PT/9PT0//T0 - 9P/z8/P/8vLy//Ly8v/y8vL/8vLy//Pz8//09PT/9PT0//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//T0 - 9P/y8vL/8vLy//Ly8v/z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/29vb/9vb2//b2 - 9v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vf/9vb3//b29//29vf/9vb3//f3 - 9//39/f/9/f3//f39//39/f/9/f3//f39//39/f/+Pj4//f39//39/f/9/f3//f39//39/f/+Pj4//n5 - +f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//j4+P/4+Pj/+Pj4//j4+P/4+Pj/9/f3//f3 - 9//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9vb3//b29//29vf/9vb3//b29//29vb/9vb2//b2 - 9v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/09PT/9PT0//T0 - 9P/09PT/8/Pz//Ly8v/y8vL/8vLy//Ly8v/z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8vLy//Ly8v/y8vL/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly - 8v/y8vL/9PT0//T09P/z8/P/8vLy//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz - 8//09PT/9PT0//Ly8v/y8vL/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PTz//X0 - 8//y8vP/8vL1//Ly9f/09PL/8vPx//Lz8//99ej/xpdw/55RFP+oUgr/plQN/6FTEf/Hp4b8AAAAALtz - Mv6iUg//qVQM/6hTDv+cWCj/8uDO//rz8f/w8vL/8PPz//Dy8//z8/P/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/y8vL/8/Pz//Dw8P/f39//19fX/+/v8P/x8fH/8vLz//Dw8P/y8vL/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//y8vL/8vLy//Ly8v/y8vL/8vLy//T09P/y8vP/8vLz//Pz - 8//z8/P/9fX1//X19f/19fX/9fX1//X19f/19fb/9fX2//X19v/29vb/9vb2//b29v/5+fn/+fn5//n5 - +f/5+fn/+fn5//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//v7+//8/Pz//Pz8//z8 - /P/8/Pz//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//39/f/9/f3//f39//39/f/9/f3//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//39/f/9/f3//f39//39/f/9/f3//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//Pz8//z8/P/8/Pz//Pz8//z8/P/7+/v/+/v7//v7 - +//7+/v/+/v7//r6+v/6+vr/+vr6//r6+v/6+vr/9/f3//f39//39/f/9/f3//b29v/29vb/9vb2//b2 - 9v/19fb/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/8/Pz//Ly8//y8vP/8vLy//Ly - 8v/y8vL/9PT0//T09P/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8vLy//Ly8v/y8vL/8vLy//Pz - 8//y8vL/8vLy//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/08vT/8vXw//by8v/28vX/9PL0//L08v/y9PL//ffo/8WYb/+eUhH/qVQL/6hSDv+jVBH/xqSD/AAA - AAC3ayj+pVIQ/6hTDP+lUw3/oWEx//rq2P/28O//8vP0/+/y8v/09PX/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Pz8//r6+v/yMjI/8XFxf/d3d3/9fX1//T09P/z8/T/8vLy//T0 - 9P/09PT/9PT0//T09f/09PT/9PT0//T09f/19fX/9/f3//f4+P/3+Pj/9/j4//j4+f/5+fn/+fn5//r6 - +v/8/Pz//Pz8//z8/P/9/f3//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//f39//39/f/9/f3//Pz8//z8/P/8/Pz/+vr6//n5 - +f/5+fn/+Pj5//f39//39/f/9fX1//T09f/09PX/9PT1//T09P/09PT/9PT0//T09P/09PX/9PT0//T0 - 9P/z8/P/8/Pz//Pz9P/z8/P/8vLy//Ly8v/z8/P/9PT0//T09P/09PT/8/Pz//T09P/09PT/9PT0//T0 - 9P/09PT/9PL0//L18P/28vL/9vL1//Ty9P/y9PL/8vTy//336P/FmG//nlIR/6lUC/+oUg7/o1QR/8ak - g/wAAAAAtGYh/qRRDv+oUwz/o1QO/6JmN//87dr/9fP0//Hz9P/z8vP/9vL0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vP/5+fn/8XFxf/Dw8P/zc3N//Pz8//09PT/+Pj4//j4 - +P/6+vr/+/v7//v7+//8/Pz//Pz8//z8/P/8/Pz//f39//39/f/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//f39//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//v7+//39 - /f/9/f3//f39//39/f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/9/f3//f39//39/f/9/f3//f39//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//f39//39/f/9/f3//f39//z8/P/8/Pz/+/v7//r6+v/6+vr/+/v7//j4 - +P/29vf/9fb2//P09P/z8/T/8/Pz//Ly8v/y8vL/8/Pz//T09P/09PT/9PT0//Ly8v/09PT/9PT0//T0 - 9P/09PT/9PT0//Ty9P/y9fD/9vLy//by9f/08vT/8vTy//L08v/99+j/xZhv/55SEf+pVAv/qFIO/6NU - Ef/GpIP8AAAAALFfGv6mUQ7/qFQM/59TD/+hbDv//PHh//Py8//z9PT/9fLz//fx9P/09PT/9PT0//T0 - 9P/z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PX/9vb2/+zs7P/q6ur/9fX1//j4+f/7+/z//v7+//39 - /f/8/Pz//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//f39//39/f/9/f3//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/9/f3//Pz8//r6+v/5+fn/9/f3//T09f/09PT/9PT0//Ly8v/y8vL/9PT0//T0 - 9P/09PT/9PT0//T09P/08vT/8vXw//by8v/28vX/9PL0//L08v/y9PL//ffo/8WYb/+eUhH/qVQL/6hS - Dv+jVBH/xqSD/AAAAACvWhP+qFEL/6dTC/+eVBD/p3RG//n15f/y8/T/8fP0//Xy8//38vT/9PT0//T0 - 9P/09PT/9PT0//Ly8v/z8/P/8vLy//Pz8//39/j//f39//39/f/+/v7//v7+//39/f/9/f3//f39//v7 - +//+/v7//Pz8//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//39/f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//39 - /f/9/f3//v7+//7+/v/+/v7//f39//7+/v/9/f3//v7+//39/f/9/f3/+vr7//T09P/z8/P/8vLy//T0 - 9P/09PT/9PT0//T09P/09PT/9PL0//L18P/28vL/9vL1//Ty9P/y9PL/8vTy//336P/FmG//nlIR/6lU - C/+pUxD/olMR/8SigPwAAAAArVcP/qpSDf+nUwv/nFMQ/7B+Uv/59eb/8PP0/+/z9P/18vP/9/L0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/9PT1//j4+f/7+/v/+fn6//39/f/9/f3//f39//39 - /f/8/Pz/+vr6//39/f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/9/f3//f39//7+/v/+/v7//v7+//7+/v/+/v7//f39//39/f/9/f3/+vr6//39/f/6+vr/8vLy//Ly - 8v/09PT/9PT0//T09P/09PT/9PT0//Ty9P/y9fD/9vLy//by9f/08vT/8vTy//L08v/99+j/xZhv/55S - Ef+pVAv/qVMQ/6JTEf/EooD8AAAAAKtWDf6nUgr/p1QL/51REP+zf1T/+fTn//Dz9P/u8/T/8/Ly//fy - 8//09PT/9PT0//T09P/09PT/8vLy//Pz8//09PT/8vLy//Ly8v/w8PD/5ubm/9PT0//Z2dn/4ODg/+rq - 6v/x8fH/+/v7//v7+//+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//f39//39/f/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//f39//39/f/9/f3//Pz8//v7/P/5+fn/9/f3//b29//19fX/9PT0//f3+P/9/f3//f39//X1 - 9v/y8vL/9PT0//T09P/09PT/9PT0//T09P/08vT/8vXw//by8v/28vX/9PL0//L08v/y9PL//ffo/8WY - b/+eUhH/qVQL/6lTEP+iUxH/xKKA/AAAAACoVQj+p1MK/6ZTC/+fUxH/rHZN//n06P/w8vf/7vP0//H0 - 8v/09PL/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8/Pz//T09P/y8vL/8/Pz/97e3v/Dw8P/w8PD/8PD - w//AwMD/yMjI/+7u7v/y8vL/8/P0//b29v/29/f/9/f4//j4+P/5+fn/+fn5//v7+//8/Pz//Pz8//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//7+/v/9/f3//f39//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//39/f/9/f3//f39//7+ - /v/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//Pz8//r6+v/5+fn/+fn5//j4 - +P/39/j/9vf3//X29v/z8/T/8/P0//Pz9P/z8/P/8/Pz//Ly8v/z8/P/8vLy//T09P/8/Pz//v7+//39 - /f/5+fn/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PL0//L18P/28vL/9vL1//Ty9P/y9PL/8vTy//33 - 6P/FmG//nlIR/6lUC/+pUxD/olMR/8SigPwAAAAAp1YH/qtWDP+mUwn/n1MS/6x1TP/69Of/8PL1/+7z - 9P/x9PL/9PTy//T09P/09PT/9PT0//T09P/09PT/8/Pz//Pz8//09PT/8vLy//Hx8f/Y2Nj/xMTE/8bG - xv/Dw8P/xMTE/8LCwv/t7e3/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//X19f/19fX/9fX2//X19v/29vf/9/f3//j4+P/5+fn/+fn6//n5+v/6+vr/+vr6//v7 - +//9/f3//f39//39/f/9/f3//f39//39/f/9/f3//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//f39//39/f/9/f3//f39//39/f/8/Pz/+/v7//v7+//6+vr/+vr6//n5 - +f/5+fn/+Pj4//f39//29vf/9fX2//X19v/19fX/9fX1//X19f/z8/T/8/Pz//T09P/09PT/9PT0//Ly - 8v/y8vL/8/Pz//Pz8//y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//y8vL/8/Pz//Ly8v/09PX//Pz9//7+ - /v/+/v7/+vr6//X19f/09PT/9PT0//T09P/09PT/9PT0//Ty9P/y9fD/9vLy//by9f/08vT/8vTy//L0 - 8v/99+j/xZhv/55SEf+pVAv/qVMQ/6JTEf/Eon/8AAAAAKpUB/6qUgr/p1QL/59UEP+mcUT/+vPl//Lx - 8//w9PT/9PXz//Lx8f/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/0tLS/8PD - w//Dw8P/xcXF/8TExP/CwsL/5ubm//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8/Pz//Ly8v/y8vL/8vLy//Ly8v/z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8vLy//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09f/09PX/9PT1//X29v/29vf/9vb3//b2 - 9//29vf/9/f3//f39//39/f/9/f3//f39//5+fn/+fn5//n5+f/5+fn/+vr6//r6+v/6+vr/+/v7//v7 - +//6+vr/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v8//v7/P/7+/z/+/v8//v7 - /P/7+/z/+/v8//v7/P/7+/z/+/v8//v7/P/7+/z/+/v8//v7/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8 - /P/8/Pz//Pz8//z8/P/8/Pz//f39//39/f/9/f3//f39//39/f/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8 - /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz/+/v8//v7/P/7+/z/+/v8//v7/P/7+/v/+/v7//v7 - +//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//r6 - +v/6+vr/+fn5//n5+f/5+fn/+fn5//n5+f/39/f/9/f3//f39//39/f/9/f3//f39//39/f/9vb3//b2 - 9//29vf/9PT1//T09f/09PX/9PT1//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//Pz9P/y8vL/9/f3//39 - /f/+/v7//v7+//39/f/29vb/9PT0//T09P/09PT/9PT0//T09P/08vT/8vXw//by8v/28vX/9PL0//L0 - 8v/y9PP//ffo/8WYb/+eUxD/qVQI/6lUD/+iUw//xKJ//AAAAACsVAf+rVMK/6hUC/+eVA//pXFB//v0 - 5f/z8vP/8PT0//P08//08vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy/8/P - z//CwsL/xMTE/8TExP/FxcX/xMTE/+Li4v/y8vL/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//T09P/09PT/9PT0//Ly8v/y8vL/8/Pz//T0 - 9P/09PT/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly - 8v/y8vL/8vLy//Ly8v/y8vL/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT1//T09f/09PX/9PT1//T0 - 9f/09PX/9PT1//T09f/09PX/9PT1//T09f/09PX/9PT1//T09f/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT1//T09f/09PX/9PT1//T09f/09PX/9PT1//T09f/09PX/9PT1//T0 - 9f/09PX/9PT1//T09f/09PX/9PT1//T09f/09PX/9PT1//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly - 8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/09PT/9PT0//Ly - 8v/y8vL/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/z8/T/9PT0//j4 - +P/+/v7//v7+//7+/v/+/v7/9/f3//T09P/09PT/9PT0//T09P/09PT/9PL0//L18P/28vL/9vL1//Ty - 9P/y9PL/8vTz//336P/FmG//nlMQ/6lUCP+pVA//olMP/8WhgP0AAAAArFQH/q1TCv+oVAv/n1QR/6Ft - Pv/+8uL/9fL0//Hz9P/y9PP/9PLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/+7u - 7v/Kysr/w8PD/8bGxv/ExMT/xcXF/8TExP/b29v/8vLy//Pz8//09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/z8/P/8vLy//Ly8v/y8vL/8vLy//Pz8//09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/z8/P/9PT0//Ly8v/y8vL/9PT0//T0 - 9P/09PT/9PT0//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Pz8//09PT/9PT0//T09P/y8vL/9PT0//T0 - 9P/09PT/9PT0//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T0 - 9P/09PT/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Ly - 8v/y8vL/8vLy//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly - 8v/y8vL/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/4+Pn//v7+//39/f/+/v7//v7+//n5+f/09PT/9PT0//T09P/09PT/9PT0//Ty9P/y9fD/9vLy//by - 9f/08vT/8vTy//L08//99+j/xZhv/55TEP+pVAj/qVQP/6JTD//Eon/8AAAAAKxUB/6tUwr/qVQJ/6BU - D/+gajr//O7d//by8//y8/P/8fPy//Py8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/q6ur/x8fH/8XFxf/FxcX/xMTE/8TExP/ExMT/1dXV//Pz9P/z8/P/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8/Pz//Ly8v/y8vL/8vLy//Ly8v/z8/P/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//09PT/9PT0//T09P/y8vL/8vLy//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8vLy//Pz8//09PT/8vLy//Ly - 8v/09PT/9PT0//T09P/y8vL/8vLy//Pz8//09PT/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/T/8/P0//Pz9P/z8/T/8/P0//Ly8v/y8vL/8vLy//Ly - 8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8vLy//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//Pz - 8//y8vL/9PT0//T09P/09PT/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/9PT0//T09P/09PT/9PT0//Ly - 8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly - 8v/z8/P/+vr6//7+/v/9/f3//v7+//7+/v/6+/v/9PT0//T09P/09PT/9PT0//T09P/08vT/8vXw//by - 8v/28vX/9PL0//L08v/y9PP//ffo/8WYb/+eUxD/qVQI/6lUD/+iUw//xKJ//AAAAACrVAn+q1MK/6lU - Cf+hVA7/oGk5//rq2P/28vP/8fP0//Dy8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/5ubm/8XFxf/FxcX/xMTE/8XFxf/ExMT/xMTE/9LS0v/z8/T/8/Pz//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//y8vL/8vLy//T09P/y8vL/8vLy//Ly - 8v/09PT/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/9PT0//T09P/09PT/9PT0//Ly - 8v/z8/P/9PT0//T09P/09PT/8vLy//Ly8v/z8/P/9PT0//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T0 - 9P/09PT/9PT0//T09P/09PT/8/Pz//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//Ly8v/y8vL/8vLy//Ly8v/z8/P/9PT0//T0 - 9P/09PT/9PT0//Ly8v/y8vL/8vLy//Ly8v/y8vL/8/P0//Pz9P/z8/T/8/P0//Pz9P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8vLy//Ly8v/y8vL/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8vLy//Ly - 8v/y8vL/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//Ly8v/y8vL/8vLy//Ly - 8v/y8vL/8/Pz//T09P/09PT/9PT0//Ly8v/y8vL/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/y8vL/9PT0//z8/P/+/v7//f39//7+/v/+/v7/+/v7//T09P/09PT/9PT0//T09P/09PT/9PL0//L1 - 8P/28vL/9vL1//Ty9P/y9PL/8vTz//336P/FmG//nlMQ/6lUCP+pVA//olMP/8Sif/wAAAAAqVQJ/qtT - Cv+qVAn/oVMM/51jMv/46Nb/9/Py/+/x8f/x9PP/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//Ly - 8v/09PT/9PT0/+Li4v/ExMT/xMTE/8TExP/ExMT/w8PD/8TExP/Ozs7/8/P0//Pz8//09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8vLy//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//y8vL/8vLy//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly - 8v/09PT/8vLy//X29v/9/f3//v7+//7+/v/+/v7//v7+//z8/P/09PT/9PT0//T09P/y8vL/8/P0//Ty - 9P/y9fD/9vLy//by9f/08vT/8vTy//L08//99+j/xZhv/55TEP+pVAj/p1IM/6JTEP/Fo4D8AAAAAKlU - Cf6qUwr/qlQJ/6RUDf+dYC7/9eTS//j08f/y9PT/8fTz//L09P/09PT/9PT0//T09P/09PT/9PT0//Pz - 8//y8vL/9PT0//Ly8v/d3d3/w8PD/8TExP/FxcX/xcXF/8TExP/ExMT/zc3N//Pz8//09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/8vLy//Ly - 8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8vLy//Ly - 8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/y8vL/9PT0//Ly8v/29vb//v7+//7+/v/+/v7//v7+//7+/v/9/f3/9PT0//Pz8//09PT/8vLy//Pz - 8//08vT/8vXw//by8v/28vX/9PL0//L08v/y9PP//ffo/8WYb/+eUxD/qVQI/6dSDP+iUxD/xaOA/AAA - AACoVAr+qlQN/6pUCf+kUw3/m10q//Pjz//38vD/8vPy//Dz8//y9PT/9PT0//T09P/09PT/9PT0//T0 - 9P/z8/P/8/Pz//T09P/y8vL/2dnZ/8TExP/ExMT/xcXF/8PDw//ExMT/xMTE/8rKyv/u7u7/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//Ly - 8v/y8vL/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//Ly - 8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8/Pz//Ly8v/y8vL/8vLy//Ly8v/z8/P/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8vLy//Pz - 8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/y8vL/9vb3//7+/v/+/v7//v7+//7+/v/+/v7//f39//X19f/y8vL/9PT0//Ly - 8v/z8/P/9PL0//L18P/28vL/9vL1//Ty9P/y9PL/8vTz//336P/FmG//nlMQ/6lUCP+nUgz/olMQ/8Wj - gPwAAAAAqFQK/qpUDf+qVAn/pVQL/5haJ//w4Mz/+PLv//P18//u8/H/8vT0//T09P/09PT/9PT0//T0 - 9P/y8vL/8vLy//Pz8//09PT/8fHx/9TU1P/ExMT/xMTE/8XFxf/Dw8P/xMTE/8TExP/IyMj/7Ozs//Ly - 8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly - 8v/y8vL/8vLy//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly - 8v/y8vL/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/8vLy//Ly - 8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//n5+f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/29/f/8vLy//Ly - 8v/09PT/9PT0//Ty9P/y9fD/9vLy//by9f/08vT/8vTy//L08//99+j/xZhv/55TEP+pVAj/p1IM/6JT - EP/Fo4D8AAAAAKhUCv6rVAv/q1QI/6ZTDP+XVyT/7dvI//ny7v/09fT/8PTy//L09P/09PT/9PT0//T0 - 9P/09PT/8vLy//Ly8v/z8/P/8/Pz//Hx8f/Ozs7/w8PD/8TExP/FxcX/w8PD/8XFxf/ExMT/xsbG/+rq - 6v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/y8vL/8vLy//Ly8v/y8vL/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/y8vL/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/z8/P/8vLy//Ly8v/y8vL/8vLy//Pz8//09PT/9PT0//T09P/09PT/8vLy//Ly - 8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8/Pz//Pz8//6+vr//v7+//7+/v/+/v7//v7+//7+/v/+/v7/9/f4//Ly - 8v/y8vL/9PT0//Pz8//08vT/8vXw//by8v/28vX/9PL0//L08v/y9PL//ffo/8WYb/+eUhD/qVQI/6dS - Df+iUxH/xaKA/AAAAACqVQr+q1QL/6xVCf+mUwv/lFQe/+vZyP/69O7/8vLy//L09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/y8vL/9vb2//Ly8v/y8vL/ycnJ/8XFxf/FxcX/xMTE/8TExP/FxcX/xcXF/8TE - xP/o6Oj/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/+/v7//7+/v/+/v7//v7+//7+/v/+/v7//v7+//n5 - +f/y8vL/8/Pz//T09P/y8vL/9PL0//L18P/28vL/9vL1//Ty9P/y9PL/8vTy//336P/FmG//nlIR/6lU - C/+pUxD/olMR/8SigPwAAAAAq1UK/qtUC/+tVQn/plQL/5RVHv/r2cj/+vTu//Ly8v/z9PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8vLy//Pz9P/y8vL/8fHx/8nJyf/FxcX/xcXF/8XFxf/ExMT/xMTE/8XF - xf/Dw8P/4uLi//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/z8/T/8vLy//v7+//+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/7+/v/8vLy//Pz8//09PT/8vLy//Ty9P/y9fD/9vLy//by9f/08vT/8vTy//L08v/99+j/xZhv/55S - Ef+pVAv/qVMQ/6JTEf/EooD8AAAAAKtVCv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r07v/y8vL/8/T0//T0 - 9P/09PT/9PT0//T09P/09PT/8/Pz//Pz8//z8/P/8/Pz/+7u7v/Hx8f/xcXF/8XFxf/FxcX/xcXF/8TE - xP/FxcX/w8PD/9vb2//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/8/P0//Pz8//8/Pz//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//Pz8//Ly8v/z8/P/9PT0//Ly8v/08vT/8vXw//by8v/28vX/9PL0//L08v/y9PL//ffo/8WY - b/+eUhH/qVQL/6lTEP+iUxH/xKKA/AAAAACrVQr+q1QL/61VCf+mVAv/lFUe/+vZyP/69O7/8vLy//P0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/z8/P/8/Pz//Pz8//t7e3/xsbG/8TExP/FxcX/xcXF/8XF - xf/ExMT/xcXF/8PDw//X19f/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//u7u7/4eHh/9nZ - 2f/T09P/0NDQ/9DQ0P/T09P/2tra/9TU1P/R0dH/0NDQ/9LS0v/W1tb/4ODg/+np6f/z8/P/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy/+Tk - 5P/e3t7/09PT/9DQ0P/Q0ND/09PT/9jY2P/X19f/0tLS/9DQ0P/Q0ND/09PT/97e3v/j4+P/8vLy//Pz - 8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//T09P/09PT//Pz8//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//39/f/09PT/8/Pz//T09P/y8vL/9PL0//L18P/28vL/9vL1//Ty9P/y9PL/8vTy//33 - 6P/FmG//nlIR/6lUC/+pUxD/olMR/8SigPwAAAAAq1UK/qtUC/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly - 8f/z9PT/8vLy//T09P/09PT/8/Pz//Ly8v/y8vL/8/Pz//Ly8v/z8/P/7e3t/8bGxv/ExMT/xcXF/8XF - xf/FxcX/xMTE/8TExP/ExMT/1NTU//Ly8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/z8/P/8vLy//T09P/09PT/8vLy//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8vLy//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/m5ub/zc3N/8TE - xP/ExMT/xMTE/8XFxf/FxcX/xcXF/8TExP/ExMT/xcXF/8XFxf/FxcX/xMTE/8XFxf/Jycn/2dnZ/9/f - 3//y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8/+0tLT/OTk5/0tL - S/+4uLj/xMTE/8TExP/FxcX/xcXF/8XFxf/FxcX/xMTE/8XFxf/FxcX/xcXF/8XFxf/ExMT/xsbG/9PT - 0//s7Oz/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//z8/P/8/P0//39/f/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/8/Pz/9PT0//Ly8v/09PT/8/Pz//Ty9P/y9fD/9vLy//by9f/z8vP/8vPy//Hy - 8v/79eb/xZdv/55TE/+pVAv/qVMQ/6JTEf/EooD8AAAAAKpUCv6rVAv/rVUJ/6ZUC/+VVh//69nI//r0 - 7f/y8vH/8/T0//Ly8v/09PT/9PT0//T09P/09PT/8vLy//T09P/y8vL/9PT0/+3t7f/Gxsb/xcXF/8XF - xf/FxcX/xcXF/8XFxf/Dw8P/xcXF/9HR0f/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8/Pz//Ly8v/09PT/9PT0//Ly8v/z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/x8fH/8PD - w//FxcX/xMTE/8TExP/ExMT/w8PD/8TExP/FxcX/xMTE/8TExP/ExMT/w8PD/8TExP/ExMT/xsbG/83N - zf/FxcX/5ubm//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/x8fH/UlJS/zg4 - OP83Nzf/m5ub/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8PDw//ExMT/xMTE/8bG - xv+/v7//0dHR//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//b29v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//f39//X19f/y8vL/9PT0//Pz8//08vT/8vXw//by8v/28vX/8/Lz//Pz - 8v/y8/P//PTm/8WXb/+fVBT/qVQL/6lTEP+iUxH/xKKA/AAAAACqVAr+q1QL/61VCf+mVAv/lVYf/+vZ - yP/69O3/8vLx//P09P/y8vL/8vLy//Pz8//09PT/9PT0//Ly8v/09PT/8/Pz//Ly8//q6ur/xsbG/8XF - xf/FxcX/xcXF/8XFxf/FxcX/w8PD/8TExP/Pz8//8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Pz8//y8vL/9PT0//T09P/y8vL/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/1xc - XP+JiYn/oKCg/7a2tv/IyMj/xsbG/8bGxv/Hx8f/ycnJ/8rKyv/Gxsb/xsbG/8bGxv+9vb3/qKio/6Oj - o//Hx8f/xMTE/8jIyP/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/5ubm/0BA - QP84ODj/Nzc3/1hYWP+4uLj/ysrK/8bGxv/Gxsb/xsbG/8nJyf/IyMj/xsbG/8bGxv/Gxsb/yMjI/7e3 - t/+FhYX/UVFR/1tbW//m5ub/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//29vb//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//39/f/29vb/8vLy//Pz8//y8vL/9PL0//L18P/28vL/9vL1//Py - 8//z8/L/8vPz//z05v/Fl2//n1QU/6lUC/+pUxD/olMR/8SigPwAAAAAqlQK/qtUC/+tVQn/plQL/5VW - H//r2cj/+vTt//Ly8f/z9PT/8vLy//Pz8//z8/P/9PT0//T09P/z8/P/9PT0//Ly8v/y8vP/6Ojo/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8PDw//ExMT/zMzM//Hx8f/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/z8/P/8vLy//T09P/09PT/8vLy//Pz8//09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8vLy//Ly8v/y8vL/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/93d - 3f83Nzf/OTk5/0BAQP9FRUX/W1tb/1hYWP9ZWVn/Wlpa/1lZWf9dXV3/WVlZ/1hYWP9ZWVn/TExM/zMz - M/+lpaX/w8PD/8XFxf/ExMT/7+/v//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/+Li - 4v84ODj/ODg4/zg4OP8iIiL/R0dH/11dXf9ZWVn/WFhY/1lZWf9aWlr/Wlpa/1lZWf9YWFj/WVlZ/1pa - Wv9FRUX/Dg4O/zc3N/9CQkL/zc3N//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9vf3//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/9/f3/9vb2//Ly8v/z8/P/8vLy//Ty9P/y9fD/9vLy//by - 9f/z8vP/8/Py//Lz8//89Ob/xZdv/59UFP+pVAv/qVMQ/6JTEf/EooD8AAAAAKpUCv6rVAv/rVUJ/6ZU - C/+VVh//69nI//r07f/y8vH/8/T0//Ly8v/09PT/9PT0//Pz8//z8/P/8/Pz//Pz9P/y8vL/8vLy/+fn - 5//FxcX/xcXF/8XFxf/FxcX/xcXF/8PDw//ExMT/xcXF/8rKyv/x8fH/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8/Pz//Ly8v/09PT/9PT0//Ly8v/z8/P/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/W1tb/Ojo6/zc3N/8sLCz/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/xsbG/8PDw//FxcX/xcXF/+np6f/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/i4uL/NjY2/zg4OP83Nzf/KSkp/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/xISEv82Njb/NjY2/6ysrP/z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//b3 - 9//+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//f39//b29v/y8vL/9PT0//Ly8v/08vT/8vXw//by - 8v/28vX/8/Lz//Pz8v/y8/P//PTm/8WXb/+fVBT/qVQL/6lTEP+iUxH/xKKA/AAAAACrVQr+q1QL/61V - Cf+mVAv/lFUe/+vZyP/69O3/8vLx//P09P/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//y8vL/8vLy//Pz - 8//g4OD/xcXF/8XFxf/FxcX/xcXF/8XFxf/Dw8P/w8PD/8XFxf/IyMj/8PDw//Ly8v/y8vL/8vLy//Ly - 8v/y8vL/9PT0//T09P/09PT/9PT0//Pz8//y8vL/8vLy//Ly8v/y8vL/8/Pz//T09P/09PT/9PT0//T0 - 9P/y8vL/8vLy//Ly8v/y8vL/8vLy//T09P/09PT/9PT0//T09P/09PT/8vLy//Ly8v/y8vL/8vLy//Ly - 8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//Ly - 8v/y8vL/y8vL/zg4OP84ODj/MDAw/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/8DAwP/Dw8P/xcXF/8XFxf/m5ub/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/4uLi/zc3N/84ODj/Nzc3/ywsLP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8aGhr/NjY2/zg4OP9/f3//8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly - 8v/4+Pj//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//39/f/3+Pj/8vLy//T09P/y8vL/9PL0//L1 - 8P/28vL/9vL1//Py8//z8/L/8vPy//z25//El2//n1MR/6lUCP+oUw7/olMQ/8WigPwAAAAAq1UK/qtU - C/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly8f/z9PT/8vLy//Ly8v/y8vL/9PT0//T09P/09PT/8vLy//Ly - 8v/z8/P/39/f/8XFxf/FxcX/xcXF/8XFxf/FxcX/xMTE/8TExP/FxcX/yMjI/+/v7//y8vL/8vLy//Ly - 8v/y8vL/8vLy//T09P/09PT/9PT0//T09P/z8/P/8vLy//Ly8v/y8vL/8vLy//Pz8//09PT/9PT0//T0 - 9P/09PT/8vLy//Ly8v/y8vL/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/9PT0//Ly - 8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz - 8//y8vL/8vLy/7W1tf82Njb/ODg4/zIyMv8DAwP/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP+/v7//w8PD/8XFxf/FxcX/5+fn//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0/+Li4v83Nzf/ODg4/zc3N/8mJib/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/IiIi/zc3N/84ODj/goKC//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/y8vL/+fn5//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/9/f3/+Pn5//Ly8v/09PT/8vLy//Ty - 9P/y9fD/9vLy//by9f/08vT/9PTy//L08//99+j/xZhv/59TEf+pVAj/qFMO/6JTEP/Fo4D8AAAAAKtV - Cv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r07f/y8vH/8/T0//Ly8v/y8vL/8vLy//T09P/09PT/9PT0//Ly - 8v/09PT/8/Pz/93d3f/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/xMTE/8fHx//u7u7/8vLy//Ly - 8v/y8vL/8vLy//Ly8v/09PT/9PT0//T09P/09PT/8/Pz//Ly8v/y8vL/8vLy//Ly8v/z8/P/9PT0//T0 - 9P/09PT/9PT0//Ly8v/y8vL/8vLy//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/y8vL/9PT0//T0 - 9P/y8vL/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/z8/P/8vLy//Ly8v+cnJz/ODg4/zg4OP81NTX/BwcH/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/w8PD/8PDw//ExMT/xcXF/+rq6v/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/i4uL/NDQ0/zg4OP83Nzf/Hx8f/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/ykpKf83Nzf/ODg4/21tbf/y8vL/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8vLy//r6+v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//f39//j5+f/z8/P/9PT0//Ly - 8v/08vT/8vXw//by8v/28vX/9PL0//T08v/y9PP//ffo/8WYb/+fUxH/qVQI/6hTDv+iUxD/xaOA/AAA - AACrVQr+q1QL/61VCf+mVAv/lFUe/+vZyP/69O3/8vLx//P09P/y8vL/8vLy//Ly8v/09PT/9PT0//T0 - 9P/y8vL/9PT0//Ly8v/b29v/xcXF/8XFxf/FxcX/xcXF/8XFxf/ExMT/xcXF/8TExP/Hx8f/7+/v//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//T0 - 9P/09PT/8/Pz//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/h4eH/zg4OP84ODj/NjY2/wkJCf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/8HBwf/FxcX/xMTE/8XFxf/u7u7/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/4uLi/zQ0NP84ODj/ODg4/x0dHf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBAf8uLi7/ODg4/zg4OP9aWlr/8fHx//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Ly8v/6+vr//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//39/f/4+fn/8/Pz//T0 - 9P/y8vL/9PL0//L18P/28vL/9vL1//Ty9P/09PL/8vTz//336P/FmG//n1MR/6lUCP+oUw7/olMQ/8Wj - gPwAAAAAq1UK/qtUC/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly8f/z9PT/8vLy//Ly8v/y8vL/9PT0//T0 - 9P/09PT/8PDw//T09P/y8vP/2tra/8XFxf/FxcX/xcXF/8XFxf/FxcX/xMTE/8bGxv/ExMT/x8fH/+7u - 7v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz - 8//09PT/9PT0//T09P/z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0/4qKiv84ODj/ODg4/zg4OP8NDQ3/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP/FxcX/w8PD/8XFxf/ExMT/6+vr//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0/+Li4v82Njb/ODg4/zc3N/8mJib/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8DAwP/MDAw/zg4OP84ODj/Xl5e//Hx8f/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/y8vL/+/v7//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/9/f3/+Pn5//Pz - 8//09PX/8vLy//Ty9P/y9fD/9vLy//by9f/08vT/9PTy//L08//99+j/xZhv/59TEf+pVAj/qFMO/6JT - EP/Fo4D8AAAAAKtVCv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r07f/y8vH/8/T0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Pz8//z8/P/9PT0/9TU1P/ExMT/xcXF/8XFxf/FxcX/xMTE/8XFxf/ExMT/xcXF/8fH - x//t7e3/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P+Pj4//ODg4/zg4OP83Nzf/FhYW/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wcHB/8PDw//FxcX/xcXF/+fn5//09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/i4uL/Nzc3/zg4OP83Nzf/LCws/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BQUF/zExMf84ODj/ODg4/1NTU//v7+//9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/y8vL/9PT0//z8/P/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//r6 - +v/z8/P/9PT0//Ly8v/08vT/8vXw//by8v/28vX/9PL0//L08v/y9PL//ffo/8WYb/+eUxD/qVQI/6hT - Dv+iUxD/xaOA/AAAAACrVQr+q1QL/61VCf+mVAv/lFUe/+vZyP/69O3/8vLx//P09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/z8/P/8/Pz//Pz8//T09P/xMTE/8XFxf/FxcX/xcXF/8TExP/FxcX/xMTE/8XF - xf/Gxsb/7Ozs//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/hoaG/zg4OP84ODj/ODg4/xkZGf8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/7+/v//ExMT/xcXF/8XFxf/m5ub/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/4uLi/zc3N/84ODj/ODg4/yoqKv8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wcHB/8zMzP/ODg4/zc3N/9GRkb/7e3t//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8vLy//T09P/8/Pz//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/6+vr/8/Pz//T09P/y8vL/9PL0//L18P/28vL/9vL1//Ty9P/y9PL/8vTy//336P/FmG//nlMQ/6lU - CP+oUw7/olMQ/8WjgPwAAAAAq1UK/qtUC/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly8f/z9PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8vLy//Pz9P/y8vL/09PT/8TExP/FxcX/xcXF/8XFxf/ExMT/xcXF/8TE - xP/FxcX/xcXF/+rq6v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/2JiYv84ODj/ODg4/zg4OP8bGxv/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP/BwcH/w8PD/8XFxf/FxcX/6Ojo//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/+Li4v83Nzf/ODg4/zc3N/8iIiL/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8LCwv/NDQ0/zg4OP84ODj/SEhI/+3t - 7f/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/09PT//Pz8//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7/+vr6//Pz8//09PX/8vLy//Ty9P/y9fD/9vLy//by9f/08vT/8vTy//L08v/99+j/xZhv/55T - EP+pVAj/qFMO/6JTEP/Fo4D8AAAAAKtVCv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r07f/y8vH/8/T0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/09PT/8PDw/9HR0f/ExMT/xcXF/8XFxf/FxcX/xMTE/8XF - xf/FxcX/xcXF/8TExP/p6en/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P9dXV3/ODg4/zg4OP84ODj/Hh4e/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/rKys/8TExP/CwsL/wsLC/+np - 6f/k5OT/5eXl/+bm5v/g4OD/5OTk/9fX1//Y2Nj/2NjY/9jY2P/Y2Nj/09PT/9TU1P/U1NT/1NTU/9PT - 0//Y2Nj/2NjY/9jY2P/X19f/19fX/+Hh4f/n5+f/5+fn/+Xl5f/Y2Nj/Pz8//zg4OP83Nzf/FBQU/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Dw8P/zU1Nf84ODj/ODg4/0dH - R//t7e3/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT1//z8/P/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//r6+v/z8/P/9PT1//Ly8v/08vT/8vXw//by8v/28vX/9PL0//L08v/y9PL//ffo/8WY - b/+eUxD/qVQI/6hTDv+iUxD/xaOA/AAAAACrVQr+q1QL/61VCf+mVAv/lFUe/+vZyP/69O3/8vLx//P0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/9PT0//Dw8P/Q0ND/xMTE/8XFxf/FxcX/xcXF/8TE - xP/FxcX/xcXF/8XFxf/ExMT/6Ojo//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/X19f/zg4OP84ODj/ODg4/yEh - If8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/2hoaP+7u7v/k5OT/4KC - gv+ioqL/Ozs7/0hISP9MTEz/RUVF/0lJSf87Ozv/Ozs7/zw8PP88PDz/PDw8/zY2Nv83Nzf/Nzc3/zc3 - N/83Nzf/PDw8/zw8PP88PDz/PDw8/zo6Ov9HR0f/TU1N/01NTf9GRkb/QUFB/zs7O/84ODj/Nzc3/wwM - DP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xAQEP82Njb/ODg4/zg4 - OP9BQUH/7Ozs//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09f/8/Pz//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/8/Pz/8/Pz//T09f/y8vL/9PL0//L18P/28vL/9vL1//Ty9P/y9PL/8vTy//33 - 6P/FmG//nlMQ/6lUCP+oUw7/olMQ/8WjgPwAAAAAqlQK/qtUC/+tVQn/plQL/5VWH//r2cj/+vTt//Ly - 8f/z9PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/9fX1//Ly8v/x8fH/zc3N/8TExP/FxcX/xcXF/8XF - xf/FxcX/w8PD/8TExP/FxcX/xsbG/+bm5v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/2FhYf84ODj/ODg4/zc3 - N/8mJib/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8FBQX/hoaG/0ZG - Rv81NTX/Ojo6/zg4OP84ODj/ODg4/zg4OP84ODj/ODg4/zg4OP84ODj/ODg4/zg4OP84ODj/ODg4/zg4 - OP84ODj/ODg4/zg4OP84ODj/ODg4/zg4OP84ODj/ODg4/zg4OP84ODj/ODg4/zk5Of8zMzP/MTEx/zAw - MP8JCQn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8SEhL/Nzc3/zg4 - OP83Nzf/RUVF/+3t7f/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT//f39//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//Pz8//Pz8//y8vL/9PT0//Ty9P/y9fD/9vLy//by9f/08vT/8vTy//L0 - 8v/99+j/xZhv/55TEP+pVAj/qVQP/6JTD//Eon/8AAAAAKpUCv6rVAv/rVUJ/6ZUC/+VVh//69nI//r0 - 7f/y8vH/8/T0//T09P/09PT/9PT0//T09P/09PT/8vLy//T09P/y8vL/8PDw/8zMzP/ExMT/xcXF/8XF - xf/FxcX/xcXF/8PDw//ExMT/xcXF/8bGxv/l5eX/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P9hYWH/ODg4/zg4 - OP84ODj/KSkp/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/3h4 - eP+AgID/JSUl/yYmJv8tLS3/NjY2/zU1Nf82Njb/Nzc3/zc3N/83Nzf/Nzc3/zg4OP84ODj/Nzc3/zg4 - OP83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/82Njb/Nzc3/zY2Nv8vLy//JCQk/yUl - Jf8XFxf/AQEB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/EhIS/zg4 - OP84ODj/ODg4/zQ0NP/q6ur/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//39/f/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//39/f/z8/P/9PT0//Pz8//08vT/8vXw//by8v/28vX/9PL0//L0 - 8v/y9PL//ffo/8WYb/+eUxD/qVQI/6lUD/+iUw//xKJ//AAAAACqVAr+q1QL/61VCf+mVAv/lVYf/+vZ - yP/69O3/8vLx//P09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/z8/T/8/Pz//Dw8P/Ly8v/xMTE/8XF - xf/FxcX/xcXF/8XFxf/Dw8P/w8PD/8XFxf/FxcX/4+Pj//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/YWFh/zg4 - OP84ODj/ODg4/ykpKf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8WFhb/ISEh/wEBAf8BAQH/BAQE/wcHB/8HBwf/ERER/xoaGv8eHh7/Jycn/ysrK/8vLy//MTEx/zEx - Mf8zMzP/NDQ0/zMzM/8yMjL/MDAw/y8vL/8rKyv/JiYm/yAgIP8aGhr/EhIS/wcHB/8ICAj/AwMD/wEB - Af8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xMT - E/84ODj/ODg4/zg4OP80NDT/6urq//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/9/f3//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/9/f3/9PT0//T09P/y8vL/9PL0//L18P/28vL/9vL1//Ty - 9P/y9PL/8vTy//336P/FmG//nlMQ/6lUCP+pVA//olMP/8Sif/wAAAAAqlQK/qtUC/+tVQn/plQL/5VW - H//r2cj/+vTt//Ly8f/z9PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/8/P0//Pz8//t7e3/ysrK/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xMTE/8PDw//ExMT/xcXF/+Hh4f/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/2Ji - Yv84ODj/ODg4/zg4OP8rKyv/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8TExP/Nzc3/zg4OP84ODj/NTU1/+rq6v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT//f39//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//f39//X19f/09PT/8vLy//Ty9P/y9fD/9vLy//by - 9f/08vT/8vTy//L08v/99+j/xZhv/55TEP+pVAj/qVQP/6JTD//Eon/8AAAAAKpUCv6rVAv/rVUJ/6ZU - C/+UVR7/69nI//r07f/y8vH/8/T0//Pz8//09PT/9PT0//T09P/09PT/8vLy//Ly8//z8/T/7e3t/8nJ - yf/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/Dw8P/xMTE/8TExP/f39//9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/9PT0//T09P/z8/P/8/Pz//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//09PT/9PT0//Pz8//09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/z8/P/9PT0//T09P/z8/P/8/Pz//T09P/09PT/9PT0//T09P/z8/P/8/Pz//T0 - 9P9iYmL/ODg4/zg4OP84ODj/LCws/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/FBQU/zg4OP84ODj/ODg4/zU1Nf/q6ur/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/T/9fX1//39 - /f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//39/f/19vb/8/Pz//Ly8v/08vT/8vXw//by - 8v/28vX/9PL0//L08v/y9PL//ffo/8WYb/+eUxD/qVQI/6lUD/+iUw//xKJ//AAAAACqVAr+q1QL/61V - Cf+mVAv/lFUe/+vZyP/69O3/8vLx//P09P/y8vL/9PT0//T09P/09PT/9PT0//T09P/y8vL/9PT0/+7u - 7v/IyMj/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/Dw8P/39/f//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//T09P/09PT/8vLy//Ly - 8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/9PT0//T09P/y8vL/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8vLy//T09P/09PT/8/Pz//Ly8v/09PT/9PT0//T09P/09PT/8/Pz//Ly - 8v/09PT/Y2Nj/zg4OP84ODj/ODg4/y0tLf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/xQUFP84ODj/ODg4/zg4OP81NTX/6urq//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//f3 - 9//9/f3//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/9/f3/9fb2//Ly8v/y8vL/9PL0//L1 - 8P/28vL/9vL1//Ty9P/y9PL/8vTz//336P/FmG//nlMQ/6lUCP+pVA//olMP/8Sif/wAAAAAqlQK/qtU - C/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly8f/z9PT/8vLy//T09P/09PT/9PT0//T09P/09PT/8vLy//T0 - 9P/t7e3/yMjI/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/ExMT/w8PD/97e3v/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/09PT/9PT0//Ly - 8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//T09P/09PT/8vLy//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/09PT/9PT0//Pz8//y8vL/9PT0//T09P/09PT/9PT0//Pz - 8//y8vL/9PT0/2NjY/84ODj/ODg4/zg4OP8vLy//AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8UFBT/ODg4/zg4OP84ODj/NjY2/+rq6v/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly - 8v/39/f//f39//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//X29v/y8vL/8/Pz//Ty - 9P/y9fD/9vLy//by9f/08vT/8vTy//L08//99+j/xZhv/55TEP+pVAj/qVQP/6JTD//Eon/8AAAAAKpU - Cv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r07f/y8vH/8/T0//Ly8v/09PT/9PT0//T09P/09PT/9PT0//Ly - 8v/09PT/7e3t/8fHx//ExMT/xcXF/8XFxf/FxcX/xcXF/8TExP/FxcX/xcXF/8PDw//d3d3/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/9PT0//T0 - 9P/y8vL/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/09PT/9PT0//Ly - 8v/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/9PT0//T09P/z8/P/8vLy//T09P/09PT/9PT0//T0 - 9P/z8/P/8vLy//T09P9jY2P/ODg4/zg4OP83Nzf/MDAw/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/FBQU/zg4OP84ODj/Nzc3/zY2Nv/q6ur/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9/f3//39/f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/29vb/8vLy//T0 - 9P/08vT/8vXw//by8v/28vX/9PL0//L08v/y9PP//ffo/8WYb/+eUxD/qVQI/6lUD/+iUw//xKJ//AAA - AACqVAr+q1QL/61VCf+mVAv/lFUe/+vZyP/69O3/8vLx//P09P/y8vL/9PT0//T09P/09PT/9PT0//T0 - 9P/y8vL/9PT0/+3t7f/Hx8f/xMTE/8XFxf/FxcX/xcXF/8XFxf/ExMT/xcXF/8XFxf/Dw8P/3d3d//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//T0 - 9P/09PT/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/9PT0//T0 - 9P/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//T09P/09PT/8/Pz//Ly8v/09PT/9PT0//T0 - 9P/09PT/8/Pz//Ly8v/09PT/ZGRk/zg4OP84ODj/ODg4/y8vL/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/xQUFP84ODj/ODg4/zc3N/82Njb/6urq//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//f39//9/f3//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/9vb2//Ly - 8v/09PT/9PL0//L18P/28vL/9vL1//Ty9P/y9PL/8vTz//336P/FmG//nlMQ/6lUCP+pVA//olMP/8Si - f/wAAAAAqlQK/qtUC/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly8f/z9PT/8vLy//T09P/09PT/9PT0//T0 - 9P/09PT/8vLy//Pz8//t7e3/xsbG/8TExP/FxcX/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/xMTE/9zc - 3P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly - 8v/09PT/9PT0//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//Pz - 8//z8/P/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/09PT/9PT0//Pz8//y8vL/9PT0//T0 - 9P/09PT/9PT0//Pz8//y8vL/9PT0/2NjY/84ODj/ODg4/zc3N/8uLi7/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8UFBT/ODg4/zg4OP83Nzf/NTU1/+rq6v/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Pz8//39/f//f39//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//X1 - 9v/z8/P/8/Pz//Ty9P/y9fD/9vLy//by9f/08vT/8vTy//Lz8v/89ef/xJdv/55SEf+pVAn/qVMP/6JT - EP/Fon/8AAAAAKtVCv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r07f/y8vH/8/T0//Ly8v/09PT/9PT0//T0 - 9P/09PT/9PT0//Pz8//z8/P/7Ozs/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/Dw8P/xcXF/8XF - xf/a2tr/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/y8vL/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P9iYmL/ODg4/zg4OP83Nzf/LCws/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/FBQU/zg4OP84ODj/Nzc3/zU1Nf/q6ur/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/y8vL/9/f3//39/f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/29vb/8vLy//Ly8v/08vT/8vXw//by8v/28vX/9PL0//T09P/y8/P//PTm/8WXb/+fUxP/qVQL/6hS - D/+iUxL/xaOB/AAAAACrVQr+q1QL/61VCf+mVAv/lFUe/+vZyP/69O3/8vLx//P09P/y8vL/9PT0//T0 - 9P/09PT/9PT0//T09P/z8/P/8/Pz/+zs7P/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/w8PD/8TE - xP/FxcX/2tra//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8vLy//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/YmJi/zg4OP84ODj/ODg4/ywsLP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xQUFP84ODj/ODg4/zc3N/81NTX/6urq//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8vLy//f39//9/f3//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7/9vb2//Ly8v/y8vL/9PL0//L18P/28vL/9vL1//Ty9P/09PT/8vPz//z05v/Fl2//n1MT/6lU - C/+oUg//olMS/8WjgfwAAAAAq1UK/qtUC/+tVQn/plQL/5RVHv/r2cf/+vTt//Ly8f/z9PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8/Pz//Ly8v/s7Oz/xMTE/8TExP/FxcX/xcXF/8XFxf/FxcX/xcXF/8PD - w//ExMT/xcXF/9nZ2f/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Ly8v/y8vL/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/2FhYf84ODj/ODg4/zg4OP8qKir/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8TExP/Nzc3/zg4OP84ODj/NTU1/+rq - 6v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/39/f//f39//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//b29v/y8vL/8vLy//Ty9P/y9fD/9vLy//by9f/08vT/9PT0//Lz8//89Ob/xZdv/59T - E/+pVAv/qFIP/6JTEv/Fo4H8AAAAAKtVCv6rVAv/rVUJ/6ZUC/+UVR7/69jH//r07f/y8vH/8/T0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Pz8//y8vL/6+vr/8TExP/ExMT/xcXF/8XFxf/FxcX/xcXF/8XF - xf/Dw8P/xMTE/8TExP/Z2dn/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/y8vL/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P9hYWH/ODg4/zg4OP84ODj/KSkp/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ExMT/zg4OP84ODj/ODg4/zU1 - Nf/q6ur/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/9/f3//39/f/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/29vb/8vLy//Ly8v/08vT/8vXw//by8v/28vX/9PL0//T09P/y8/P//PTm/8WX - b/+fUxP/qVQL/6hSD/+iUxL/xaOB/AAAAACrVQr+q1QL/61VCf+mVAv/lFUe/+vYx//69O3/8vLx//P0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/8vLy/+rq6//ExMT/xMTE/8XFxf/FxcX/xcXF/8TE - xP/FxcX/w8PD/8TExP/FxcX/2dnZ//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/YWFh/zg4OP84ODj/ODg4/ycn - J/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xMTE/84ODj/ODg4/zg4 - OP80NDT/6urq//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//j4+P/9/f3//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7/9vb2//Ly8v/y8vL/9PL0//L18P/28vL/9vL1//Py8//z8/L/8vPz//z0 - 5v/Fl2//n1MT/6lUC/+nUQ7/olMS/8WjgfwAAAAAq1UK/qtUC/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly - 8f/z9PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//Ly8v/r6+v/xcXF/8TExP/FxcX/xcXF/8XF - xf/ExMT/xcXF/8PDw//FxcX/xcXF/9jY2P/09PT/9PT0//T09P/09PT/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/2BgYP84ODj/ODg4/zg4 - OP8iIiL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8SEhL/ODg4/zg4 - OP84ODj/Ozs7/+vr6//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/5+fn//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//f39//y8vL/8vLy//Ty9P/y9fD/9vLy//by9f/z8vP/8/Py//Lz - 8//89Ob/xZdv/59TE/+pVAv/p1EO/6JTEv/Fo4H8AAAAAKtVCv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r0 - 7f/y8vH/8/T0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/6urq/8TExP/ExMT/xcXF/8XF - xf/FxcX/xMTE/8XFxf/Dw8P/xcXF/8XFxf/X19f/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P9eXl7/ODg4/zg4 - OP83Nzf/Hx8f/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ERER/zY2 - Nv84ODj/Nzc3/0RERP/t7e3/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/+fn5//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/39/f/8vLy//Ly8v/08vT/8vXw//by8v/28vX/8/Lz//Pz - 8v/y8/P//PTm/8WXb/+fUxP/qVQL/6dRDv+iUxL/xaOB/AAAAACrVQr+q1QL/61VCf+mVAv/lFUe/+vZ - yP/69O3/8vLx//P09P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/8vLy/+rq6v/ExMT/xMTE/8XF - xf/FxcX/xcXF/8TExP/ExMT/w8PD/8XFxf/FxcX/1tbW//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/W1tb/zg4 - OP84ODj/ODg4/xwcHP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/w8P - D/82Njb/ODg4/zc3N/9FRUX/7e3t//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//n5+f/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/9/f3//Ly8v/y8vL/9PL0//L18P/28vL/9vL1//Py - 8//z8/L/8vPz//z05v/Fl2//n1MT/6lUC/+nUQ7/olMS/8WjgfwAAAAAq1UK/qtUC/+tVQn/plQL/5RV - Hv/r2cj/+vTt//Ly8f/z9PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//Ly8v/q6ur/xMTE/8TE - xP/FxcX/xcXF/8XFxf/ExMT/xMTE/8PDw//FxcX/xMTE/9bW1v/09PT/9PT0//T09P/09PT/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/3Z2 - dv84ODj/ODg4/zg4OP8aGhr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8NDQ3/NTU1/zg4OP84ODj/SEhI/+3t7f/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/5+fn//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//f39//y8vL/8vLy//Ty9P/y9fD/9vLy//by - 9f/z8vP/8/Py//Lz8//89Ob/xZdv/59TE/+pVAv/p1EO/6JTEv/Fo4H8AAAAAKpUCv6rVAv/rVUJ/6ZU - C/+VVh//69nI//r07f/y8vH/8/T0//Ly8v/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/6Ojo/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/FxcX/xcXF/8TExP/W1tb/8vLy//T09P/09PT/8vLy//T0 - 9P/09PT/9PT0//T09P/09PT/8/Pz//Ly8v/09PT/9PT0//Ly8v/z8/P/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//Ly - 8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P+QkJD/ODg4/zg4OP84ODj/FhYW/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/CAgI/zMzM/84ODj/ODg4/0dHR//t7e3/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/+Pj5//39 - /f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/4+Pj/9PT0//Ly8v/08vT/8vXw//by - 8v/28vX/8/Lz//Pz8v/y8/P//PTm/8WXb/+eUxH/qVUI/6lUD/+iUw//xKJ//AAAAACqVAr+q1QL/61V - Cf+mVAv/lVYf/+vZyP/69O3/8vLx//P09P/y8vL/9PT0//T09P/09PT/9PT0//T09P/y8vL/8vLy/+jo - 6P/ExMT/xcXF/8XFxf/FxcX/xcXF/8XFxf/ExMT/xcXF/8TExP/ExMT/1tbW//Ly8v/09PT/9PT0//Ly - 8v/09PT/9PT0//T09P/09PT/9PT0//Pz8//y8vL/9PT0//T09P/y8vL/8/Pz//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz - 8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/h4eH/zg4OP84ODj/ODg4/w4ODv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wYGBv8zMzP/ODg4/zg4OP9KSkr/7u7u//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//j4 - +f/9/f3//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/+Pj4//T09P/y8vL/9PL0//L1 - 8P/28vL/9vL1//Py8//z8/L/8vPz//z05v/Fl2//nlMR/6lVCP+pVA//olMP/8Sif/wAAAAAqlQK/qtU - C/+tVQn/plQL/5VWH//r2cj/+vTt//Ly8f/z9PT/8vLy//T09P/09PT/9PT0//T09P/y8vL/9PT0//Ly - 8v/n5+f/xMTE/8XFxf/FxcX/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/xMTE/9TU1P/y8vL/9PT0//T0 - 9P/y8vL/9PT0//T09P/09PT/9PT0//T09P/z8/P/8vLy//T09P/09PT/8vLy//Pz8//09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0/4mJif84ODj/ODg4/zY2Nv8KCgr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8DAwP/MDAw/zg4OP84ODj/W1tb//Hx8f/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/5+fn//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//j4+P/09PT/8vLy//Ty - 9P/y9fD/9vLy//by9f/z8vP/8/Py//Lz8//89Ob/xZdv/55TEf+pVQj/qVQP/6JTD//Eon/8AAAAAKpU - Cv6rVAv/rVUJ/6ZUC/+VVh//69nI//r07f/y8vH/8/T0//Ly8v/09PT/9PT0//T09P/09PT/8vLy//T0 - 9P/09PT/5ubm/8TExP/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/xMTE/8TExP/T09P/8vLy//T0 - 9P/09PT/8vLy//T09P/09PT/9PT0//T09P/09PT/8/Pz//Ly8v/09PT/9PT0//Ly8v/z8/P/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P+JiYn/ODg4/zg4OP81NTX/CAgI/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AQEB/y8vL/84ODj/ODg4/1tbW//x8fH/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/+fn5//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/4+Pj/9PT0//Ly - 8v/08vT/8vXw//by8v/28vX/8/Lz//Pz8v/y8/P//PTm/8WXb/+eUxH/qVUI/6lUD/+iUw//xKJ//AAA - AACqVAr+q1QL/61VCf+mVAv/lVYf/+vZyP/69O3/8vLx//P09P/y8vL/9PT0//T09P/09PT/9PT0//Ly - 8v/09PT/9PT0/+bm5v/Dw8P/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/09PT//Ly - 8v/09PT/9PT0//Ly8v/09PT/9PT0//T09P/09PT/9PT0//Pz8//y8vL/9PT0//T09P/y8vL/8/Pz//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/ra2t/zg4OP84ODj/MjIy/wQEBP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8sLCz/ODg4/zg4OP9gYGD/8fHx//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//n5+f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/+Pj4//T0 - 9P/y8vL/9PL0//L18P/28vL/9vL1//Py8//z8/L/8vPz//z05v/Fl2//nlMR/6lVCP+pVA//olMP/8Si - f/wAAAAAqlQK/qtUC/+tVQn/plQL/5VWH//r2cf/+/Tu//Ly8v/z9PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8/Pz//Ly8v/l5eX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/xcXF/9LS - 0v/w8PD/9PT0//Ly8v/09PT/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly - 8v/09PT/9PT0//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0/729vf84ODj/ODg4/zExMf8BAQH/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Jycn/zc3N/84ODj/fX19//Ly8v/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/5+fn//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//j4 - +P/z8/T/8/Pz//Ty9P/y9fD/9vLy//by9f/z8vP/8/Py//Lz8//89Ob/xZdv/55TEf+pVQj/qVQP/6JT - D//Eon/8AAAAAKpUCv6rVAv/rVUJ/6ZUC/+VVh//69nH//v07v/y8vL/8/T0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Pz8//y8vL/5eXl/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/xMTE/8XF - xf/S0tL/8PDw//T09P/y8vL/9PT0//Ly8v/09PT/9PT0//T09P/09PT/8/Pz//Ly8v/y8vL/8vLy//Ly - 8v/z8/P/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8vLy//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T0 - 9P/y8vL/9PT0//T09P/y8vL/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/X19f/Ojo6/zc3N/8uLi7/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yAgIP83Nzf/ODg4/39/f//y8vL/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/+fn5//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/4+Pj/8/P0//Pz8//08vT/8vXw//by8v/28vX/8/Lz//Pz8v/y8/P//PTm/8WXb/+eUxH/qVUI/6lU - D/+iUw//xKJ//AAAAACqVAr+q1QL/61VCf+mVAv/lVYf/+vZx//79O7/8vLy//P09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Ly8v/09PT/8vLy/+Tk5f/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/ExMT/xcXF/8TE - xP/ExMT/0dHR//Dw8P/09PT/8vLy//T09P/y8vL/9PT0//T09P/09PT/9PT0//Pz8//y8vL/8vLy//Ly - 8v/y8vL/8/Pz//T09P/09PT/9PT0//T09P/y8vL/8vLy//Ly8v/y8vL/8vLy//T09P/09PT/9PT0//T0 - 9P/09PT/8vLy//T09P/09PT/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/2dnZ/zk5Of83Nzf/JiYm/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8YGBj/Nzc3/zc3N/+np6f/8/Pz//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//n5+f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7/+Pj4//Pz9P/z8/P/9PL0//L18P/28vL/9vL1//Py8//z8/L/8vPz//z05v/Fl2//nlMR/6lV - CP+pVA//olMP/8Sif/wAAAAAqlQK/qtUC/+tVQn/plQL/5VWH//r2cf/+/Tu//Ly8v/z9PT/9PT0//T0 - 9P/09PT/9PT0//T09P/y8vL/9PT0//Ly8v/k5OT/xMTE/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/ExMT/xMTE/9HR0f/w8PD/9PT0//Ly8v/09PT/8vLy//T09P/09PT/9PT0//T09P/z8/P/8vLy//Ly - 8v/y8vL/8vLy//Pz8//09PT/9PT0//T09P/09PT/8vLy//Ly8v/y8vL/8vLy//Ly8v/09PT/9PT0//T0 - 9P/09PT/9PT0//Ly8v/09PT/9PT0//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P87Ozv/ODg4/xwcHP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/FRUV/xUV - Ff8zMzP/Nzc3/z8/P/82Njb/MzMz/zQ0NP8yMjL/Pz8//z8/P/8yMjL/ODg4/0VFRf9ERET/w8PD//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/5+fn//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//j4+P/z8/T/8/Pz//Ty9P/y9fD/9vLy//by9f/z8vP/8/Py//Lz8//89Ob/xZdv/55T - Ef+pVQj/qVQP/6JTD//Eon/8AAAAAKpUCv6rVAv/rVUJ/6ZUC/+VVh//69nH//v07v/y8vL/8/T0//T0 - 9P/09PT/9PT0//T09P/09PT/8vLy//T09P/y8vL/4+Pj/8TExP/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xMTE/8TExP/R0dH/8PDw//T09P/y8vL/9PT0//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/y8vL/9PT0//T09P/y8vL/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/rKys/zg4OP85OTn/QEBA/6Ki - ov+srKz/x8fH/6ysrP+hoaH/qKio/56env/IyMj/yMjI/56env+IiIj/Pj4+/xwcHP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8CAgL/PT09/87O - zv/CwsL/w8PD/8TExP/FxcX/xMTE/8TExP/Dw8P/w8PD/8XFxf/FxcX/xMTE/8PDw//Dw8P/np6e/9zc - 3P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/+fn5//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/4+Pj/8/P0//Pz8//08vT/8vXw//by8v/28vX/8/Lz//Pz8v/y8/P//PTm/8WX - b/+eUxH/qVUI/6lUD/+iUw//xKJ//AAAAACrVQr+q1QL/61VCf+mVAv/lFUe/+vZyP/69O3/8vLx//P0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/09PT/8vLy/+Tk5f/ExMT/xMTE/8XFxf/FxcX/xcXF/8TE - xP/FxcX/xcXF/8PDw//ExMT/0dHR//Dw8P/09PT/8vLy//T09P/y8vL/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/+zs7P9OTk7/u7u7/8TE - xP/ExMT/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/xcXF/8XFxf/FxcX/xMTE/8XFxf+tra3/TU1N/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8KCgr/Jycn/8HB - wf/ExMT/xMTE/8XFxf/FxcX/xMTE/8TExP/ExMT/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/xMTE/8bG - xv/c3Nz/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//n5+f/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7/+fn5//Ly8v/y8vL/9PL0//L18P/28vL/9vL1//Ty9P/09PT/8vPz//z0 - 5v/Fl2//n1MR/6lUCP+nUgz/olMQ/8WjgPwAAAAAq1UK/qtUC/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly - 8f/z9PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/9PT0//Ly8v/k5OX/xcXF/8TExP/FxcX/xcXF/8XF - xf/ExMT/xMTE/8XFxf/ExMT/xMTE/9HR0f/w8PD/9PT0//Ly8v/09PT/8vLy//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/z8/P/8bG - xv/ExMT/xMTE/8TExP/ExMT/w8PD/8TExP/FxcX/xMTE/8TExP/Dw8P/xMTE/8TExP/ExMT/x8fH/83N - zf+enp7/CgoK/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ISEh/zw8 - PP+EhIT/0dHR/8fHx//FxcX/xMTE/8TExP/Dw8P/xsbG/8bGxv/ExMT/xMTE/8PDw//ExMT/xsbG/8zM - zP/a2tr/6urq//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/5+fn//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//n5+f/y8vL/8vLy//Ty9P/y9fD/9vLy//by9f/08vT/9PT0//Lz - 8//89Ob/xZdv/59TEf+pVAj/p1IM/6JTEP/Fo4D8AAAAAKtVCv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r0 - 7f/y8vH/8/T0//T09P/09PT/9PT0//T09P/09PT/8/Pz//T09P/y8vL/5eXl/8XFxf/ExMT/xcXF/8XF - xf/FxcX/xMTE/8TExP/FxcX/xMTE/8TExP/R0dH/8PDw//T09P/y8vL/9PT0//Ly8v/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz/+zs - 7P/h4eH/zs7O/8nJyf/FxcX/xcXF/8XFxf/IyMj/zMzM/8bGxv/FxcX/xcXF/8bGxv/Nzc3/2dnZ/9vb - 2//Gxsb/w8PD/1hYWP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BAQE/zMz - M/84ODj/NjY2//Dw8P/k5OT/19fX/83Nzf/Kysr/y8vL/9TU1P/Y2Nj/0NDQ/8vLy//Kysr/z8/P/93d - 3f/u7u7/8vLy//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/+fn5//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/5+fn/8vLy//Ly8v/08vT/8vXw//by8v/28vX/9PL0//T0 - 9P/y8/P//PTm/8WXb/+fUxH/qVQI/6dSDP+iUxD/xaOA/AAAAACrVQr+q1QL/61VCf+mVAv/lFUe/+vZ - yP/69O3/8vLx//P09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PX/8vLy/+Xl5f/FxcX/xMTE/8XF - xf/FxcX/xcXF/8TExP/ExMT/xcXF/8TExP/FxcX/0tLS//Dw8P/09PT/8vLy//T09P/y8vL/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8/Pz/+3t7f/o6Oj/5OTk/+Pj4//k5OT/5+fn/+np6f/m5ub/4+Pj/+Pj4//l5eX/6+vr//Hx - 8f/U1NT/w8PD/8TExP9kZGT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xUV - Ff83Nzf/ODg4/zg4OP+urq7/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//n5+f/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/+fn5//Ly8v/y8vL/9PL0//L18P/28vL/9vL1//Ty - 9P/09PT/8vPz//z05v/Fl2//n1MR/6lUCP+nUgz/olMQ/8WjgPwAAAAAq1UK/qtUC/+tVQn/plQL/5RV - Hv/r2cj/+vTt//Ly8f/z9PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/9PT0//Ly8v/l5eX/xcXF/8TE - xP/FxcX/xcXF/8XFxf/ExMT/xMTE/8XFxf/ExMT/xMTE/9HR0f/w8PD/9PT0//Ly8v/z8/P/8vLy//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/zMzM/8TExP/FxcX/rKys/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8fHx//OTk5/zg4OP83Nzf/mZmZ//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/5+fn//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//n5+f/y8vL/8vLy//Ty9P/y9fD/9vLy//by - 9f/08vT/9PTz//Lz8//79Ob/xJZu/59TEf+pVAj/p1IM/6JTEP/FooD8AAAAAKpUCv6rVAv/rVUJ/6ZU - C/+VVh//69nI//r07f/y8vH/8/T0//T09P/09PT/9PT0//T09P/09PT/8vLy//T09P/09PT/5ubm/8TE - xP/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/xcXF/8TExP/U1NT/8vLy//T09P/09PT/8vLy//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0/8fHx//ExMT/xcXF/7Kysv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/JCQk/zk5Of84ODj/Nzc3/3p6ev/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/+fn5//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/5+fn/8vLy//Ly8v/08vT/8vXw//by - 8v/28vX/9PL0//T08v/z8/P/+/Tm/8SWbv+fUxH/qVQI/6lUD/+iUw//xKJ//AAAAACqVAr+q1QL/61V - Cf+mVAv/lVYf/+vZyP/69O3/8vLx//P09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy/+fn - 5//ExMT/xcXF/8XFxf/FxcX/xcXF/8XFxf/ExMT/xMTE/8XFxf/ExMT/1NTU//Ly8v/09PT/9PT0//Ly - 8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/Gxsb/xMTE/8XFxf/Nzc3/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/yQkJP85OTn/ODg4/zg4OP9/f3//9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//n5 - +f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/+fn5//Ly8v/y8vL/9PL0//L1 - 8P/28vL/9vL1//Ty9P/09PL/8/Pz//v05v/Elm7/n1MR/6lUCP+pVA//olMP/8Sif/wAAAAAqlQK/qtU - C/+tVQn/plQL/5VWH//r2cj/+vTt//Ly8f/z9PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//Ly - 8v/o6Oj/xMTE/8TExP/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/FxcX/xcXF/9XV1f/y8vL/9PT0//T0 - 9P/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/xsbG/8PDw//FxcX/u7u7/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8hISH/OTk5/zg4OP83Nzf/nJyc//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/5+fn//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//n5+f/y8vL/8vLy//Ty - 9P/y9fD/9vLy//by9f/08vT/9PTy//Pz8//79Ob/xJZu/59TEf+pVAj/qVQP/6JTD//Eon/8AAAAAKpU - Cv6rVAv/rVUJ/6ZUC/+VVh//69nI//r07f/y8vH/8/T0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly - 8v/y8vL/6Ojo/8TExP/ExMT/xcXF/8XFxf/FxcX/xcXF/8XFxf/ExMT/xcXF/8XFxf/W1tb/8vLy//T0 - 9P/09PT/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0/8rKyv/ExMT/xMTE/6urq/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/FxcX/zY2Nv84ODj/Nzc3/5SUlP/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/+fn5//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/5+fn/8vLy//Ly - 8v/08vT/8vXw//by8v/28vX/9PL0//T08v/z8/P/+/Tm/8SWbv+fUxH/qVQI/6lUD/+iUw//xKJ//AAA - AACqVAr+q1QL/61VCf+mVAv/lVYf/+vZyP/69O3/8vLx//P09P/y8vL/9PT0//T09P/y8vL/8vLy//Ly - 8v/z8/P/8/Pz/+jo6f/Dw8P/xcXF/8XFxf/FxcX/xcXF/8XFxf/ExMT/xMTE/8TExP/ExMT/1tbW//Pz - 8//09PT/9PT0//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/Ozs7/xMTE/8XFxf+urq7/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/xsbG/84ODj/ODg4/zg4OP+ZmZn/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//n5+f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/+fn5//Ly - 8v/y8vL/9PL0//L18P/28vL/9vL1//Ty9P/09PL/8/Pz//v05v/Elm7/n1MR/6lUCP+pVA//olMP/8Si - f/wAAAAAqlQK/qtUC/+tVQn/plQL/5VWH//r2cj/+vTt//Ly8f/z9PT/8vLy//Ly8v/y8vL/9PT0//T0 - 9P/y8vL/9PT0//T09P/q6ur/w8PD/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/w8PD/9fX - 1//y8vL/8vLy//Ly8v/y8vL/8vLy//T09P/09PT/9PT0//T09P/z8/P/8vLy//Pz8//z8/P/8vLy//Pz - 8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/ycnJ/8TExP/FxcX/q6ur/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8jIyP/OTk5/zg4OP83Nzf/jIyM//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/5+fn//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//j4 - +P/z8/T/8/Pz//Ty9P/y9fD/9vLy//by9f/08vT/9PTy//Pz8//79Ob/xJZu/59TEf+pVAj/qVQP/6JT - D//Eon/8AAAAAKpUCv6rVAv/rVUJ/6ZUC/+VVh//69nI//r07f/y8vH/8/T0//Ly8v/y8vL/8vLy//T0 - 9P/09PT/8/Pz//Pz8//z8/P/6urq/8PDw//FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/xMTE/8PD - w//X19f/8vLy//Ly8v/y8vL/8vLy//Ly8v/09PT/9PT0//T09P/09PT/8/Pz//Ly8v/y8vL/8vLy//Ly - 8v/z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/8bGxv/ExMT/xcXF/8vLy/8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/JCQk/zk5Of84ODj/Nzc3/3h4eP/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/+fn5//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/4+Pj/8/P0//Pz8//08vT/8vXw//by8v/28vX/9PL0//T08v/z8/P/+/Tm/8SWbv+fUxH/qVQI/6lU - D/+iUw//xKJ//AAAAACqVAr+q1QL/61VCf+mVAv/lVYf/+vZyP/69O3/8vLx//P09P/y8vL/9PT0//T0 - 9P/y8vL/8vLy//Pz8//y8vL/8/Pz/+vr6//ExMT/xcXF/8XFxf/FxcX/xcXF/8XFxf/ExMT/xMTE/8TE - xP/Dw8P/2NjY//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//09PT/9PT0//T0 - 9P/z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/Gxsb/w8PD/8XFxf/Hx8f/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yMjI/85OTn/ODg4/zc3N/+RkZH/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//n5+f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7/+Pj4//Pz9P/z8/P/9PL0//L18P/28vL/9vL1//Ty9P/09PL/8/Pz//v05v/Elm7/n1MR/6lU - CP+pVA//olMP/8Sif/wAAAAAqlQK/qtUC/+tVQn/plQL/5VWH//r2cj/+vTt//Ly8f/z9PT/8vLy//Pz - 8//z8/P/8vLy//Ly8v/z8/P/8vLy//Pz8//r6+v/xMTE/8XFxf/FxcX/xcXF/8XFxf/FxcX/xMTE/8TE - xP/ExMT/xMTE/9jY2P/z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/z8/P/8vLy//Pz - 8//z8/P/8vLy//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/x8fH/8TExP/ExMT/qKio/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8bGxv/ODg4/zg4OP84ODj/np6e//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/5+fn//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//j4+P/z8/T/8/Pz//Ty9P/y9fD/9vLy//by9f/08vT/9PTy//Pz8//79Ob/xJZu/59T - Ef+pVAj/qVQP/6JTD//Eon/8AAAAAKpVCv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r07f/y8vH/8/T0//Ly - 8v/z8/P/8/Pz//T09P/09PT/9PT0//Pz8//z8/P/6+vr/8TExP/ExMT/xcXF/8XFxf/FxcX/xcXF/8XF - xf/ExMT/xMTE/8TExP/Y2Nj/8/Pz//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/8/Pz//ExMT/xMTE/5eX - l/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/DQ0N/zY2Nv84ODj/NjY2/+rq - 6v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/+fn5//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/4+Pj/8vLy//Ly8v/08vT/8vXw//by8v/28vX/9PL0//T08//y8/P/+/Tm/8SW - bv+fUxH/qVQI/6hTDv+iUxD/x6SD/AAAAACrVQr+q1QL/61VCf+mVAv/lFUe/+vZyP/69O3/8vLx//P0 - 9P/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/+zs7P/ExMT/xMTE/8XFxf/FxcX/xcXF/8XF - xf/Dw8P/w8PD/8TExP/ExMT/2tra//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/Z2dn/w8PD/8TE - xP91dXX/m5ub/5CQkP+MjIz/nJyc/5aWlv+7u7v/ubm5/7i4uP+3t7f/t7e3/8bGxv/IyMj/yMjI/8jI - yP/Jycn/t7e3/7e3t/+4uLj/ubm5/7y8vP+ampr/jY2N/42Njf+RkZH/lpaW/1BQUP8zMzP/Nzc3/0BA - QP/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//09PT/9PT0//T09P/z8/P/8/Pz//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//n5+f/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7/+Pj5//Ly8v/y8vL/9PL0//L18P/28vL/9vL1//Ty9P/09PT/8vPz//z0 - 5v/Fl2//n1MR/6lUCP+oUw7/olMQ/8elg/wAAAAAq1UK/qtUC/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly - 8f/z9PT/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/t7e3/xMTE/8TExP/FxcX/xcXF/8XF - xf/FxcX/xMTE/8PDw//ExMT/xcXF/9ra2v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/o6Oj/0NDQ/7u7 - u/97e3v/d3d3/35+fv9+fn7/R0dH/0JCQv9DQ0P/R0dH/zg4OP80NDT/NTU1/zU1Nf82Njb/NjY2/zY2 - Nv81NTX/NTU1/zQ0NP82Njb/QUFB/0NDQ/9DQ0P/TExM/3h4eP+AgID/dnZ2/5WVlf/Ly8v/0tLS/8jI - yP/Gxsb/ysrK/8TExP/FxcX/xcXF/8XFxf/FxcX/xMTE/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/eXl5/zU1 - Nf+ysrL/3t7e/+Dg4P/h4eH/1tbW/9LS0v/S0tL/09PT/9DQ0P/Pz8//z8/P/8/Pz//Pz8//z8/P/8/P - z//Pz8//z8/P/8/Pz//Pz8//0dHR/9LS0v/S0tL/09PT/93d3f/h4eH/39/f/+Hh4f/t7e3/8PDw//Ly - 8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8vLy//T09P/09PT/8vLy//Pz - 8//09PT/9PT0//T09P/09PT/8/Pz//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/5+fn//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//j4+f/y8vL/8vLy//Ty9P/y9fD/9vLy//by9f/08vT/9PT0//Lz - 8//89Ob/xZdv/59TEf+pVAj/qFMO/6JTEP/HpYP8AAAAAKtVCv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r0 - 7f/y8vH/8/T0//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/7e3t/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8TExP/ExMT/xMTE/8XFxf/a2tr/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/cXFx/0pK - Sv9AQED/ODg4/zc3N/84ODj/ODg4/zg4OP84ODj/ODg4/zg4OP84ODj/ODg4/zg4OP84ODj/ODg4/zg4 - OP84ODj/ODg4/zg4OP84ODj/ODg4/zk5Of84ODj/ODg4/zk5Of84ODj/ODg4/zc3N/88PDz/Q0ND/1tb - W//MzMz/zs7O/8LCwv/ExMT/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE - xP/FxcX/xMTE/8PDw//ExMT/xcXF/8TExP/ExMT/xMTE/8PDw//ExMT/xMTE/8TExP/Dw8P/w8PD/7+/ - v/+zs7P/S0tL/z09Pf9ERET/R0dH/z4+Pv87Ozv/Ojo6/zs7O/84ODj/Nzc3/zc3N/84ODj/Nzc3/zc3 - N/83Nzf/Nzc3/zc3N/84ODj/ODg4/zk5Of86Ojr/Ozs7/zs7O/9DQ0P/R0dH/0FBQf9HR0f/f39//5SU - lP/CwsL/7+/v//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//Ly8v/z8/P/8/Pz//Ly - 8v/z8/P/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8vLy//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/+fn5//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/4+Pn/8vLy//Ly8v/08vT/8vXw//by8v/28vX/9PL0//T0 - 9P/y8/P//PTm/8WXb/+fUxH/qVQI/6hTDv+iUxD/x6WD/AAAAACrVQr+q1QL/61VCf+mVAv/lFUe/+vZ - yP/69O3/8vLx//P09P/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/+3t7f/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/Dw8P/w8PD/8TExP/FxcX/29vb//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/6ur - q/9iYmL/U1NT/y0tLf8xMTH/NTU1/zg4OP84ODj/ODg4/zg4OP84ODj/ODg4/zg4OP84ODj/ODg4/zg4 - OP84ODj/ODg4/zg4OP84ODj/ODg4/zg4OP84ODj/ODg4/zg4OP84ODj/ODg4/zU1Nf8wMDD/LCws/yYm - Jv8qKir/R0dH/9DQ0P/w8PD/6enp/93d3f/d3d3/29vb/9bW1v/T09P/z8/P/83Nzf/Kysr/ycnJ/8nJ - yf/IyMj/yMjI/8fHx//Jycn/ysrK/8rKyv/MzMz/z8/P/9PT0//V1dX/3Nzc/97e3v/f39//5+fn/6Wl - pf9OTk7/NDQ0/zk5Of85OTn/ODg4/zg4OP84ODj/ODg4/zg4OP84ODj/ODg4/zg4OP84ODj/ODg4/zg4 - OP84ODj/ODg4/zg4OP84ODj/ODg4/zg4OP84ODj/ODg4/zg4OP84ODj/ODg4/zg4OP84ODj/OTk5/zg4 - OP8yMjL/UFBQ/6ioqP/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//y8vL/8vLy//Ly - 8v/y8vL/8/Pz//T09P/09PT/9PT0//T09P/y8vL/8vLy//Ly8v/y8vL/8vLy//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//n5+f/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/+Pj5//Ly8v/y8vL/9PL0//L18P/28vL/9vL1//Ty - 9P/09PT/8vPz//z05v/Fl2//n1MR/6lUCP+oUw7/olMQ/8elg/wAAAAAqlQK/qtUC/+tVQn/plQL/5RV - Hv/r2cj/+vTt//Ly8f/z9PT/8vLy//T09P/09PT/9PT0//T09P/09PT/8vLy//Pz9P/t7e3/xsbG/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xMTE/8PDw//FxcX/xcXF/9zc3P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/t7e3/xsbG/7Ozs/8GBgb/CwsL/xQUFP8YGBj/GBgY/xkZGf8fHx//IyMj/yUlJf8mJib/JiYm/ygo - KP8pKSn/Kioq/ykpKf8nJyf/JiYm/yYmJv8kJCT/IiIi/x4eHv8aGhr/GBgY/xgYGP8UFBT/CQkJ/wAA - AP8AAAD/Kioq/0RERP+6urr/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz - 8//n5+f/np6e/39/f/86Ojr/IiIi/y4uLv8yMjL/NDQ0/zQ0NP80NDT/NTU1/zU1Nf81NTX/NTU1/zU1 - Nf82Njb/NjY2/zY2Nv82Njb/NTU1/zU1Nf81NTX/NTU1/zQ0NP8zMzP/MzMz/zMzM/8wMDD/Jycn/xwc - HP8WFhb/HR0d/zY2Nv8VFRX/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/5+fn//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//f39//y8vL/8vLy//Ty9P/y9fD/9vLy//by - 9f/08vT/9PT0//Lz8//68+X/xZdv/59TEf+pVAj/p1IM/6JTEP/Fo4D8AAAAAKpUCv6rVAv/rVUJ/6ZU - C/+UVR7/69nI//r07f/y8vH/8/T0//Ly8v/09PT/9PT0//T09P/09PT/9PT0//Ly8v/z8/T/7e3t/8fH - x//FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/Dw8P/xcXF/8XFxf/c3Nz/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/5OTk/8XFxf/ExMT/cXFx/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/wEBAf8CAgL/AgIC/wIC - Av8CAgL/AwMD/wMDA/8DAwP/AgIC/wICAv8CAgL/AgIC/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AgIC/y0tLf84ODj/aGho/+/v7//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/z8/P/7+/v/8vLy//ExMT/Pz8//wEBAf8DAwP/BAQE/wUFBf8FBQX/CgoK/w4ODv8RERH/EhIS/xMT - E/8UFBT/FhYW/xcXF/8YGBj/FRUV/xMTE/8TExP/ERER/w8PD/8MDAz/BwcH/wUFBf8FBQX/BAQE/wEB - Af8AAAD/AAAA/xwcHP86Ojr/HR0d/+/v7//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/+fn5//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/39/f/8vLy//Ly8v/08vT/8vXw//by - 8v/28vX/9PL0//T09P/y8/P/+vPl/8WXb/+fUxH/qVQI/6dSDP+iUxD/xaOA/AAAAACqVAr+q1QL/61V - Cf+mVAv/lFUe/+vZyP/69O3/8vLx//P09P/y8vL/9PT0//T09P/09PT/9PT0//T09P/y8vL/9PT0/+3t - 7f/Hx8f/xMTE/8XFxf/FxcX/xcXF/8XFxf/FxcX/w8PD/8XFxf/ExMT/3d3d//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0/9ra2v/ExMT/xcXF/3h4eP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wsLC/80NDT/Nzc3/2tra//v7+//9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8/Pz/+bm5v/Gxsb/xcXF/6Ghof8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wMDA/8mJib/ODg4/ygoKP/r6+v/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//n5 - +f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/9/f3//Ly8v/y8vL/9PL0//L1 - 8P/28vL/9vL1//Ty9P/09PT/8vPz//rz5f/Fl2//n1MR/6lUCP+nUgz/olMQ/8WjgPwAAAAAqlQK/qtU - C/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly8f/z9PT/8vLy//T09P/09PT/9PT0//T09P/y8vL/8vLy//T0 - 9P/u7u7/x8fH/8TExP/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/FxcX/xMTE/9/f3//09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/a2tr/xMTE/8XFxf92dnb/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8RERH/Nzc3/zg4OP9wcHD/7+/v//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Pz8//i4uL/xMTE/8XFxf+Wlpb/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8ICAj/MzMz/zg4OP8wMDD/6+vr//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly - 8v/5+fn//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//f39//y8vL/8vLy//Ty - 9P/y9fD/9vLy//by9f/08vT/9PT0//Lz8//68+X/xZdv/59TEf+pVAj/p1IM/6JTEP/Fo4D8AAAAAKpU - Cv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r07f/y8vH/8/T0//Ly8v/09PT/9PT0//T09P/09PT/8vLy//Ly - 8v/y8vL/7u7u/8jIyP/ExMT/xcXF/8XFxf/FxcX/xcXF/8XFxf/ExMT/xcXF/8TExP/f39//9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/1tbW/8TExP/FxcX/eHh4/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/ERER/zg4OP84ODj/WFhY/8/Pz//09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/z8/P/4uLi/8TExP/FxcX/p6en/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/CQkJ/zg4OP84ODj/MTEx/+Li4v/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/y8vL/+fn5//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/39/f/8vLy//Ly - 8v/08vT/8vXw//by8v/28vX/9PL0//T09P/y8/P/+vPl/8WXb/+fUxH/qVQI/6dSDP+iUxD/xaOA/AAA - AACrVQr+q1QL/61VCf+mVAv/lFUe/+vZyP/69O3/8vLx//P09P/y8vL/9PT0//T09P/09PT/9PT0//T0 - 9P/z8/T/8/P0/+7u7v/Kysr/xMTE/8XFxf/FxcX/xcXF/8XFxf/ExMT/xcXF/8XFxf/ExMT/39/f//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0/9LS0v/ExMT/xcXF/4mJif8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/xEREf84ODj/ODg4/z8/P/+urq7/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8vLy//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0/9/f3//ExMT/xcXF/5SUlP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/woKCv84ODj/ODg4/zIyMv+Ghob/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/y8vL/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8vLy//f39//9/f3//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/9vb2//Ly - 8v/y8vL/9PL0//L18P/28vL/9vL1//Ty9P/09PT/8vPz//z05v/Fl2//n1MR/6lUCP+pVA//olMP/8Si - f/wAAAAAq1UK/qtUC/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly8f/z9PT/8vLy//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Pz8//w8PD/y8vL/8XFxf/FxcX/xcXF/8XFxf/FxcX/xMTE/8XFxf/FxcX/xcXF/+Li - 4v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/Q0ND/xMTE/8XFxf+hoaH/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8XFxf/ODg4/zg4OP9BQUH/srKy//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/z8/P/9PT0//Pz - 8//y8vL/9PT0//T09P/09PT/9PT0//T09P/b29v/xMTE/8XFxf+9vb3/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8LCwv/ODg4/zg4OP80NDT/cnJy//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/y8vL/8/Pz//T09P/z8/P/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Ly8v/39/f//f39//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//b2 - 9v/y8vL/8vLy//Ty9P/y9fD/9vLy//by9f/08vT/9PT0//Lz8//89Ob/xZdv/59TEf+pVAj/qVQP/6JT - D//Eon/8AAAAAKtVCv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r07f/y8vH/8/T0//Ly8v/09PT/9PT0//T0 - 9P/09PT/8vLy//T09P/z8/P/8PDw/8zMzP/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/FxcX/xMTE/8XF - xf/k5OT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/y8vL/8TExP/FxcX/oKCg/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQH/ICAg/zg4OP84ODj/Q0ND/7S0tP/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/8/Pz//T0 - 9P/z8/P/8vLy//T09P/09PT/9PT0//T09P/09PT/2NjY/8TExP/FxcX/u7u7/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/EhIS/zg4OP84ODj/NDQ0/3d3d//09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8vLy//Pz8//09PT/8/Pz//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/y8vL/9/f3//39/f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/29vb/8vLy//Ly8v/08vT/8vXw//by8v/28vX/9PL0//T09P/y8/P//PTm/8WXb/+fUxH/qVQI/6lU - D/+iUw//xKJ//AAAAACrVQr+q1QL/61VCf+mVAv/lFUe/+vZyP/69O3/8vLx//P09P/y8vL/9PT0//T0 - 9P/09PT/9PT0//Ly8v/09PT/8vLy//Hx8v/Ozs7/xcXF/8XFxf/FxcX/xcXF/8XFxf/ExMT/xsbG/8TE - xP/FxcX/5ubm//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/8rKyv/ExMT/xcXF/5+fn/8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AgIC/yIiIv84ODj/ODg4/zk5Of+mpqb/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//Ly - 8v/z8/P/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PT0/9bW1v/ExMT/xcXF/7q6uv8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xYWFv84ODj/ODg4/zU1Nf9xcXH/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8/Pz//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8vLy//f39//9/f3//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7/9vb2//Ly8v/y8vL/9PL0//L18P/28vL/9vL1//Ty9P/09PT/8vPz//z05v/Fl2//n1MR/6lU - CP+pVA//olMP/8Sif/wAAAAAq1UK/qtUC/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly8f/z9PT/8vLy//T0 - 9P/09PT/9PT0//T09P/y8vL/8/Pz//Ly8v/x8fL/z8/P/8XFxf/FxcX/xcXF/8XFxf/FxcX/xMTE/8TE - xP/Dw8P/xcXF/+np6f/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/Jycn/xcXF/8XFxf+fn5//AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wICAv8kJCT/ODg4/zg4OP81NTX/oqKi//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/y8vL/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/V1dX/xMTE/8XFxf+5ubn/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8YGBj/ODg4/zg4OP82Njb/U1NT//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/39/f//f39//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//X19f/y8vL/8vLy//Ty9P/y9fD/9vLy//by9f/08vT/9PT0//Lz8//89Ob/xZdv/59T - Ef+pVAj/qVQO/6JTD//Eon/8AAAAAKtVCv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r07f/y8vH/8/T0//Ly - 8v/09PT/9PT0//T09P/09PT/8vLy//Ly8v/z8/T/8PDw/9HR0f/FxcX/xcXF/8XFxf/FxcX/xcXF/8TE - xP/FxcX/xMTE/8XFxf/p6en/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/yMjI/8XFxf/FxcX/ra2t/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8CAgL/JCQk/zg4OP84ODj/NjY2/6Oj - o//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/1NTU/8XFxf/FxcX/ubm5/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/GRkZ/zg4OP84ODj/NjY2/1ZW - Vv/09PT/9PT0//T09P/y8vL/8vLy//Ly8v/y8vL/8vLy//T09P/09PT/9PT0//T09P/09PT/8vLy//Ly - 8v/y8vL/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9vb2//39/f/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/29vb/8vLy//Pz8//08vT/8vXw//by8v/28vX/9PL0//T09P/y8/P//PTm/8WX - b/+fUxH/qVQI/6dSDP+iUxD/xaOA/AAAAACrVQr+q1QL/61VCf+mVAv/lFUe/+vZyP/69O3/8vLx//P0 - 9P/y8vL/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8/P0//Ly8v/S0tL/xcXF/8XFxf/FxcX/xcXF/8XF - xf/ExMT/xcXF/8TExP/FxcX/6urq//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/8fHx//ExMT/xcXF/7Gx - sf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AwMD/ycnJ/84ODj/ODg4/zc3 - N/+jo6P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/9PT0//ExMT/xcXF/8jI - yP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xoaGv84ODj/ODg4/zY2 - Nv9XV1f/9PT0//T09P/09PT/8vLy//Ly8v/y8vL/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PT0//Ly - 8v/y8vL/8vLy//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//X19v/9/f3//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7/9fb2//Ly8v/09PT/9PL0//L18P/28vL/9vL1//Ty9P/09PT/8vPz//z0 - 5v/Fl2//n1MR/6lUCP+nUgz/olMQ/8WjgPwAAAAAq1UK/qtUC/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly - 8f/z9PT/8vLy//T09P/09PT/9PT0//T09P/y8vL/8/Pz//Pz8//z8/P/09PT/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xMTE/8TExP/ExMT/xsbG/+zs7P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/Hx8f/xcXF/8XF - xf+wsLD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wMDA/8oKCj/ODg4/zg4 - OP82Njb/pKSk//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/T09P/xMTE/8XF - xf/Hx8f/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8cHBz/ODg4/zg4 - OP83Nzf/WFhY//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9PT0//T0 - 9P/z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/19fX//f39//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//f39//X29v/y8vL/9PT0//Ty9P/y9fD/9vLy//by9f/08vT/9PT0//Lz - 8//89Ob/xZdv/59TEf+pVAj/p1IM/6JTEP/Fo4D8AAAAAKtVCv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r0 - 7f/y8vH/8/T0//Ly8v/09PT/9PT0//T09P/09PT/8vLy//Pz8//z8/P/9PT0/9TU1P/FxcX/xcXF/8XF - xf/FxcX/xcXF/8TExP/ExMT/xMTE/8fHx//t7e3/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/xsbG/8TE - xP/FxcX/sLCw/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8DAwP/KCgo/zg4 - OP84ODj/NjY2/6SkpP/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/0tLS/8XF - xf/FxcX/x8fH/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/HBwc/zg4 - OP84ODj/NjY2/1lZWf/09PT/9PT0//T09P/y8vL/8vLy//Ly8v/y8vL/8vLy//T09P/09PT/9PT0//T0 - 9P/09PT/8vLy//Ly8v/y8vL/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9fX1//39/f/+/v7//f39//39 - /f/+/v7//v7+//7+/v/+/v7//v7+//39/f/09fX/8vLy//T09P/08vT/8vXw//by8v/28vX/9PL0//T0 - 9P/y8/P//PTm/8WXb/+fUxH/qVQI/6dSDP+iUxD/xaOA/AAAAACrVQr+q1QL/61VCf+mVAv/lFUe/+vZ - yP/69O3/8vLx//P09P/y8vL/9PT0//T09P/09PT/9PT0//Ly8v/z8/P/8vLy//Pz8//X19f/xMTE/8XF - xf/FxcX/xcXF/8XFxf/ExMT/xcXF/8PDw//Hx8f/7u7v//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/8jI - yP/ExMT/xcXF/6urq/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AwMD/ycn - J/83Nzf/ODg4/zY2Nv+jo6P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz - 8//z8/P/9PT0//T09P/z8/P/9PT0//T09P/09PT/9PT0//T09P/z8/P/8/Pz//Pz8//09PT/8/Pz/9LS - 0v/ExMT/xcXF/8jIyP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xwc - HP84ODj/ODg4/zc3N/9YWFj/9PT0//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8/Pz//T09P/09PT/8/Pz//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/9/f3//v7+//39 - /f/9/f3//v7+//7+/v/+/v7//v7+//7+/v/9/f3/9PT0//Ly8v/z8/P/9PL0//L18P/28vL/9vL1//Ty - 9P/09PT/8vPz//z05v/Fl2//n1MR/6lUCP+nUgz/olMQ/8WigPwAAAAAq1UK/qtUC/+tVQn/plQL/5RV - Hv/r2cj/+vTt//Ly8f/z9PT/8vLy//T09P/09PT/9PT0//T09P/z8/P/8/Pz//T09P/x8fH/29vb/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xMTE/8bGxv/Dw8P/x8fH/+/v7//09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/Jycn/xMTE/8XFxf+fn5//AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wIC - Av8kJCT/ODg4/zg4OP82Njb/oqKi//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/y8vL/8/Pz//T09P/09PT/8vLy//T09P/09PT/9PT0//T09P/09PT/8vLy//Ly8v/z8/P/9PT0//Pz - 8//U1NT/xMTE/8XFxf+8vLz/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8aGhr/Nzc3/zg4OP82Njb/V1dX//T09P/y8vL/8vLy//Pz8//09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//Pz8//09PT/9PT0//Ly8v/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT//f39//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//f39//T09P/09PT/8vLy//Ty9P/y9fD/9vLy//by - 9f/08vT/9PT0//Lz8//89Ob/xZdv/59TEf+pVAj/qFMO/6JTD//Eon/8AAAAAKtVCv6rVAv/rVUJ/6ZU - C/+UVR7/69nI//r07f/y8vH/8/T0//Ly8v/09PT/9PT0//T09P/09PT/8vLy//Pz8//z8/T/8vLy/93d - 3f/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/FxcX/xMTE/8fHx//v7/D/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/ysrK/8XFxf/FxcX/n5+f/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8CAgL/IyMj/zg4OP84ODj/NjY2/6Kiov/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8vLy//Pz8//09PT/9PT0//Ly8v/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8/Pz//T0 - 9P/z8/P/1NTU/8TExP/FxcX/ubm5/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/GRkZ/zg4OP84ODj/Nzc3/1ZWVv/09PT/8vLy//Ly8v/z8/P/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/z8/P/9PT0//T09P/y8vL/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//39 - /f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//39/f/09PT/9PT0//Ly8v/08vT/8vXw//by - 8v/28vX/9PL0//T09P/y8/P//PTm/8WXb/+fUxH/qVQI/6hTDv+iUw//xKJ//AAAAACrVQr+q1QL/61V - Cf+mVAv/lFUe/+vZyP/69O3/8vLx//P09P/y8vL/9PT0//T09P/09PT/9PT0//Ly8v/z8/T/8/Pz//Ly - 8v/g4OD/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xMTE/8XFxf/IyMj/8PDw//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0/8vLy//ExMT/xcXF/6CgoP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AgIC/yIiIv84ODj/ODg4/zc3N/+ioqL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Ly8v/z8/P/9PT0//T09P/y8vL/9PT0//T09P/09PT/9PT0//T09P/y8vL/8vLy//Pz - 8//09PT/9PT0/9bW1v/ExMT/xcXF/7q6uv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/xcXF/84ODj/ODg4/zc3N/9TU1P/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/8/Pz//T09P/09PT/8vLy//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//T0 - 9P/9/f3//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/9/f3/9PT0//T09P/y8vL/9PL0//L1 - 8P/28vL/9vL1//Ty9P/09PT/8vPz//z05v/Fl2//n1MR/6lUCP+oUw7/olMP/8Sif/wAAAAAq1UK/qtU - C/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly8f/z9PT/8vLy//T09P/09PT/9PT0//T09P/y8vL/9PT0//Ly - 8v/z8/P/4uLi/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8PDw//FxcX/ycnJ//Hx8f/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/Ozs7/xMTE/8XFxf+hoaH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wEBAf8eHh7/Nzc3/zg4OP9BQUH/sbGx//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/y8vL/8/Pz//T09P/09PT/8vLy//T09P/09PT/9PT0//T09P/09PT/8vLy//Ly - 8v/z8/P/9PT0//T09P/X19f/xMTE/8XFxf+6urr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8WFhb/ODg4/zg4OP81NTX/W1tb//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//Pz8//09PT/9PT0//Ly - 8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly - 8v/z8/P//f39//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//f39//T09P/09PT/8vLy//Ty - 9P/y9fD/9vLy//by9f/08vT/9PT0//Lz8//89Ob/xZdv/59TEf+pVAj/qFMO/6JTD//Eon/8AAAAAKtV - Cv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r07f/y8vH/8/T0//Ly8v/09PT/9PT0//T09P/09PT/8vLy//T0 - 9P/y8vL/8/P0/+bm5v/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/Gxsb/w8PD/8rKyv/y8vL/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/0dHR/8TExP/FxcX/lpaW/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/GBgY/zg4OP84ODj/QEBA/6+vr//09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8/Pz//Pz8//09PT/9PT0//Pz8//09PT/9PT0//T09P/09PT/9PT0//Pz - 8//z8/P/8/Pz//T09P/09PT/2tra/8TExP/FxcX/vLy8/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/EhIS/zc3N/84ODj/NDQ0/2lpaf/z8/P/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//z8/P/9PT0//T0 - 9P/z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/z8/T/8/Pz//39/f/9/f3//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//r6+v/z8/T/8/Pz//Ly - 8v/08vT/8vXw//by8v/28vX/9PL0//T09P/y8/P//PTm/8WXb/+fUxH/qVQI/6hTDv+iUw//xKJ//AAA - AACrVQr+q1QL/61VCf+mVAv/lFUe/+vZyP/69O3/8vLx//P09P/y8vL/9PT0//T09P/09PT/9PT0//Ly - 8v/09PX/8vLy//Pz8//o6Oj/xcXF/8XFxf/FxcX/xcXF/8XFxf/ExMT/xsbG/8PDw//MzMz/8vLy//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0/9XV1f/ExMT/xcXF/3Nzc/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/xEREf84ODj/ODg4/0BAQP+vr6//9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0/9zc3P/Dw8P/xcXF/6SkpP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wwMDP84ODj/ODg4/zMzM/9ycnL/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Pz8//9/f3//f39//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/6+vr/9PT1//Pz - 8//z8/P/9PL0//L18P/28vL/9vL1//Ty9P/09PT/8vPz//z05v/Fl2//n1MR/6lUCP+pVA//olMP/8Si - f/wAAAAAq1UK/qtUC/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly8f/z9PT/8vLy//T09P/09PT/9PT0//T0 - 9P/y8vL/9PT0//Ly8v/y8vP/6urq/8bGxv/FxcX/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/z8/P//Pz - 8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/Z2dn/xMTE/8XFxf9ycnL/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8RERH/ODg4/zg4OP9PT0//wsLC//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/i4uL/xMTE/8XFxf+UlJT/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8JCQn/ODg4/zg4OP8zMzP/cHBw//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/y8vL//Pz8//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/+vr6//T0 - 9P/z8/P/8/Pz//Ty9P/y9fD/9vLy//by9f/08vT/9PT0//Lz8//89Ob/xZdv/59TEf+pVAj/qVQP/6JT - D//Eon/8AAAAAKtVCv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r07f/y8vH/8/T0//Ly8v/09PT/9PT0//T0 - 9P/09PT/8/Pz//T09P/y8vL/8vLy/+3t7f/Gxsb/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/xMTE/9TU - 1P/z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/2dnZ/8TExP/FxcX/dnZ2/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/EBAQ/zc3N/84ODj/cXFx//Dw8P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/4uLi/8TExP/FxcX/lJSU/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/CQkJ/zg4OP84ODj/MDAw/8/Pz//09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8vLy//z8/P/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//r6 - +v/09PT/8/Pz//Pz9P/08vT/8vXw//by8v/28vX/9PL0//T09P/y8/P//PTm/8WXb/+fUxH/qVQI/6lU - D/+iUw//xKJ//AAAAACrVQr+q1QL/61VCf+mVAv/lFUe/+vZyP/69O3/8vLx//P09P/y8vL/9PT0//T0 - 9P/09PT/9PT0//T09P/z8/P/8vLy//Ly8v/u7u7/x8fH/8XFxf/FxcX/xcXF/8XFxf/ExMT/w8PD/8XF - xf/W1tb/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/+Li4v/FxcX/xsbG/4WFhf8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/woKCv8zMzP/Nzc3/2tra//v7+//9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/+Xl5f/FxcX/xcXF/5ubm/8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wgICP80NDT/ODg4/zAwMP/s7Oz/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Hx8f/8/Pz//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/6+vr/9PT0//Pz8//z8/T/9PL0//L18P/28vL/9vL1//Ty9P/09PT/8vPz//z05v/Fl2//n1MR/6lU - CP+pVA//olMP/8Sif/wAAAAAq1UK/qtUC/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly8f/z9PT/8vLy//T0 - 9P/09PT/9PT0//T09P/y8vL/8/P0//Ly8v/09PT/7Ozs/8jIyP/FxcX/xMTE/8TExP/ExMT/w8PD/8PD - w//FxcX/29vb//Pz9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/s7Oz/xsbG/7m5uf8DAwP/AAAA/wEB - Af8BAQH/AQEB/wEBAf8BAQH/AgIC/wICAv8CAgL/AgIC/wICAv8DAwP/AwMD/wMDA/8DAwP/AwMD/wIC - Av8CAgL/AgIC/wICAv8CAgL/AQEB/wEBAf8BAQH/AQEB/wEBAf8BAQH/LCws/zc3N/9eXl7/7+/v//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/s7Oz/ysrK/8TExP+rq6v/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8DAwP/Jycn/zk5Of8xMTH/6+vr//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/+vr6//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7/+Pn5//T09P/y8vL/8/P0//Ty9P/y9fD/9vLy//by9f/08vT/9PT0//Lz8//89Ob/xZdv/59T - Ef+pVAj/qVQP/6JTD//Eon/8AAAAAKtVCv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r07f/y8vH/8/T0//Ly - 8v/09PT/9PT0//T09P/09PT/8vLy//Pz9P/y8vL/9PT0/+7u7v/Hx8f/xMTE/8TExP/ExMT/xMTE/8PD - w//CwsL/xcXF/93d3f/z8/T/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8PDw/8rKyv/Pz8//rKys/6Ki - ov+ysrL/ra2t/6mpqf+qqqr/oqKi/7+/v/+9vb3/vLy8/7y8vP+8vLz/x8fH/8fHx//Hx8f/x8fH/8fH - x/+7u7v/vLy8/7y8vP+8vLz/vb29/66urv+goKD/n5+f/6Ghof+qqqr/VlZW/zw8PP9BQUH/ra2t//Ly - 8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz/83Nzf/ExMT/OTk5/wEB - Af8oKCj/PT09/zk5Of9NTU3/ODg4/3l5ef92dnb/dHR0/3Nzc/9ycnL/goKC/4qKiv+JiYn/iYmJ/4uL - i/9xcXH/cnJy/3Nzc/90dHT/dnZ2/2xsbP85OTn/ODg4/zk5Of89PT3/Hh4e/x4eHv85OTn/UVFR/+vr - 6//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//r6+v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//j5+f/09PT/8vLy//Pz9P/08vT/8vXw//by8v/28vX/9PL0//T09P/y8/P//PTm/8WX - b/+fUxH/qVQI/6lUD/+iUw//xKJ//AAAAACrVQr+q1QL/61VCf+mVAv/lFUe/+vZyP/69O3/8vLx//P0 - 9P/y8vL/9PT0//T09P/09PT/9PT0//Ly8v/z8/T/8/Pz//Pz8//v7/D/yMjI/8TExP/ExMT/xcXF/8TE - xP/ExMT/w8PD/8TExP/h4eH/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//T09P/ysrK/8bG - xv/Dw8P/xMTE/8TExP/ExMT/xcXF/8TExP/ExMT/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/ExMT/xMTE/8TExP/FxcX/xcXF/8XFxf/FxcX/xMTE/8TExP9bW1v/RUVF/7m5 - uf/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/Y2Nj/xcXF/7e3 - t/+RkZH/tbW1/8jIyP/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/FxcX/ycnJ/6urq/9fX1//Nzc3/5ub - m//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/5+fn//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/4+Pj/8vLz//Pz8//z8/P/9PL0//L18P/28vL/9vL1//Ty9P/09PT/8vPz//z0 - 5v/Fl2//n1MR/6lUCP+pVA//olMP/8Sif/wAAAAAq1UK/qtUC/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly - 8f/z9PT/8vLy//T09P/09PT/9PT0//T09P/y8vL/8/P0//Pz8//y8vL/8fHy/8nJyf/ExMT/xMTE/8XF - xf/ExMT/xMTE/8TExP/ExMT/5ubm//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz/+zs - 7P/U1NT/x8fH/8XFxf/ExMT/xMTE/8TExP/Dw8P/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE - xP/ExMT/xMTE/8TExP/FxcX/xMTE/8TExP/ExMT/xMTE/8PDw//ExMT/xMTE/8bGxv/Gxsb/kZGR/3Fx - cf/u7u7/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/4uLi/8jI - yP/Dw8P/xMTE/8TExP/FxcX/xMTE/8XFxf/FxcX/xMTE/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/kZGR/0ND - Q/+ampr/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/+Pj4//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/9/f3/+Pj4//Ly8//z8/P/8/Pz//Ty9P/y9fD/9vLy//by9f/08vT/9PT0//Lz - 8//89Ob/xZdv/59TEf+pVAj/qVQP/6JTD//Eon/8AAAAAKtVCv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r0 - 7f/y8vH/8/T0//Ly8v/09PT/9PT0//T09P/09PT/8vLy//Pz8//z8/P/8vLy//T09P/Nzc3/xMTE/8PD - w//FxcX/xMTE/8TExP/FxcX/xsbG/+vr6//y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8/Pz//Pz8//t7e3/5+fn/+fn5//k5OT/3Nzc/9jY2P/U1NT/z8/P/8zMzP/MzMz/ysrK/8nJ - yf/IyMj/ycnJ/8rKyv/Ly8v/zc3N/87Ozv/Q0ND/1tbW/9ra2v/f39//5ubm/+fn5//q6ur/7+/v//Pz - 8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/x8fH/6urq/+Tk5P/b29v/zs7O/8zMzP/Ly8v/ycnJ/8jIyP/IyMj/x8fH/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8bGxv/Gxsb/x8fH/8jIyP/IyMj/zMzM/8vLy//Pz8//29vb/9zc - 3P+/v7//6+vr//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//j4+P/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//f39//b29v/y8vP/8/P0//Ly8v/08vT/8vXw//by8v/28vX/9PL0//T0 - 9P/y8/P//PTm/8WXb/+fUxH/qVQI/6lUD/+iUw//xKJ//AAAAACrVQr+q1QL/61VCf+mVAv/lFUe/+vZ - yP/69O3/8vLx//P09P/y8vL/9PT0//T09P/09PT/9PT0//T09P/y8vL/8/Pz//T09P/x8fH/1dXV/8PD - w//Dw8P/xMTE/8TExP/ExMT/xcXF/8jIyP/s7Oz/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8vLy//Ly8v/y8vL/9PT0//T09P/09PT/8/Pz/+vr6//m5ub/4uLi/97e3v/b29v/29vb/9nZ - 2f/Z2dn/19fX/9fX1//Z2dn/2dnZ/9ra2v/c3Nz/3d3d/+Li4v/m5ub/6urq//Ly8v/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/8vLy//Ly - 8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//T09P/29/f//v7+//39 - /f/+/v7//v7+//7+/v/+/v7//v7+//39/f/29vb/8vLy//T09P/y8vL/9PL0//L18P/28vL/9vL1//Ty - 9P/09PT/8vPz//z05v/Fl2//n1MR/6lUCP+nUgz/olMQ/8WjgPwAAAAAq1UK/qtUC/+tVQn/plQL/5RV - Hv/r2cj/+vTt//Ly8f/z9PT/8vLy//T09P/09PT/9PT0//T09P/09PT/8vLy//Pz8//09PT/8fHx/9ra - 2v/FxcX/xMTE/8TExP/ExMT/xMTE/8TExP/Kysr/7u7u//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Ly8v/y8vL/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//Ly - 8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//09PT/9vf3//7+ - /v/9/f3//v7+//7+/v/+/v7//v7+//7+/v/9/f3/9fX2//Ly8v/09PT/8vLy//Ty9P/y9fD/9vLy//by - 9f/08vT/9PT0//Lz8//89Ob/xZdv/59TEf+pVAj/p1IM/6JTEP/Fo4D8AAAAAKtVCv6rVAv/rVUJ/6ZU - C/+UVR7/69nI//r07f/y8vH/8/T0//Ly8v/09PT/9PT0//T09P/09PT/8vLy//T09P/09PT/8vLy//Ly - 8v/d3d3/xcXF/8PDw//ExMT/xMTE/8TExP/ExMT/zc3N//Hx8f/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/z8/P/8vLy//Ly8v/z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz - 8//z8/P/8vLy//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//b2 - 9v/+/v7//f39//7+/v/+/v7//v7+//7+/v/+/v7//f39//X19f/z8/P/8/Pz//Pz8//08vT/8vXw//by - 8v/28vX/9PL0//T09P/y8/P//PTm/8WXb/+fUxH/qVQI/6dSDP+iUxD/xaOA/AAAAACrVQr+q1QL/61V - Cf+mVAv/lFUe/+vZyP/69O3/8vLx//P09P/y8vL/9PT0//T09P/09PT/9PT0//Ly8v/09PT/9PT0//Ly - 8v/09PT/4eHh/8TExP/Dw8P/xMTE/8XFxf/ExMT/w8PD/8/Pz//y8vL/8/P0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8/Pz//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Pz8//y8vL/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz - 8//19fX//f39//39/f/+/v7//v7+//7+/v/+/v7//v7+//39/f/z9PT/9PT0//Ly8v/z8/P/9PL0//L1 - 8P/28vL/9vL1//Ty9P/09PT/8vPz//z05v/Fl2//n1MR/6lUCP+nUgz/olMQ/8WjgPwAAAAAq1UK/qtU - C/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly8f/z9PT/8vLy//T09P/09PT/9PT0//T09P/y8vL/9PT0//T0 - 9P/y8vL/9PT0/+bm5v/Gxsb/w8PD/8TExP/ExMT/xMTE/8PDw//R0dH/8/P0//Pz9P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Pz8//y8vL/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/z8/P/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/z8/P/9PT0//39/f/9/f3//v7+//7+/v/+/v7//v7+//7+/v/9/f3/8/Pz//T09P/y8vL/8/P0//Ty - 9P/y9fD/9vLy//by9f/08vT/9PT0//Lz8//89Ob/xZdv/59TEf+pVAj/p1IM/6JTEP/Fo4D8AAAAAKpU - Cv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r07f/y8vH/8/T0//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/s7Oz/x8fH/8LCwv/Dw8P/xcXF/8XFxf/ExMT/1tbW//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/z8/P/9PT0//T09P/7+/v//v7+//7+/v/+/v7//v7+//7+/v/+/v7//Pz8//Ly8v/z8/P/8vLy//Ly - 8v/08vT/8vXw//by8v/28vX/9PL0//T09P/y8/P//PTm/8WXb/+fUxH/qVQI/6lUD/+iUw//xKJ//AAA - AACqVAr+q1QL/61VCf+mVAv/lFUe/+vZyP/69O3/8vLx//P09P/y8vL/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8PDw/8jIyP/ExMT/w8PD/8TExP/FxcX/xcXF/9vb2//y8vL/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Pz8//z8/P/+/v7//7+/v/+/v7//v7+//7+/v/+/v7//v7+//z8/P/y8vL/9PT0//Ly - 8v/y8vL/9PL0//L18P/28vL/9vL1//Ty9P/09PT/8vPz//z05v/Fl2//n1MR/6lUCP+pVA//olMP/8Si - f/wAAAAAqlQK/qtUC/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly8f/z9PT/8vLy//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Pz9P/MzMz/xcXF/8TExP/ExMT/xcXF/8XFxf/i4uL/8vLy//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/z8/P/8/Pz//r7+//+/v7//v7+//7+/v/+/v7//v7+//7+/v/7+/z/8vLy//T0 - 9P/y8vL/8vLy//Ty9P/y9fD/9vLy//by9f/08vT/9PT0//Lz8//89Ob/xZdv/59TEf+pVAj/qVQP/6JT - D//Eon/8AAAAAKpUCv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r07f/y8vH/8/T0//Ly8v/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/09PT/8TExP/ExMT/xMTE/8TExP/ExMT/6Ojo//Ly - 8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/8/Pz//Ly8v/6+vr//v7+//7+/v/+/v7//v7+//7+/v/+/v7/+/v7//Ly - 8v/09PT/9PT0//Ly8v/08vT/8vXw//by8v/28vX/9PL0//T09P/y8/P//PTm/8WXb/+fUxH/qVQI/6lU - D/+iUw//xKJ//AAAAACqVAr+q1QL/61VCf+mVAv/lFUe/+vZyP/69O3/8vLx//P09P/y8vL/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz/9jY2P/Dw8P/xMTE/8TExP/Dw8P/w8PD/+zs - 7P/y8vL/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8/Pz//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//Pz8//z8/P/8/Pz//T09P/z8/P/8/Pz//Pz - 8//z8/P/9PT0//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/9PT0//T0 - 9P/09PT/9PT0//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//09PT/9PT0//T09P/z8/P/8/Pz//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/z8/P/8/Pz//Pz8//09PT/8/Pz//Pz8//z8/P/9PT0//T09P/z8/P/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8/Pz//Pz8//09PT/9PT0//T09P/z8/P/8/Pz//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz - 8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//z8/P/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T0 - 9P/z8/P/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Pz8//y8vL/+fn6//39/f/9/f3//v7+//7+/v/+/v7//v7+//j4 - +P/y8vL/8/P0//T09P/y8vL/9PL0//L18P/28vL/9vL1//Ty9P/09PT/8vPz//z05v/Fl2//nlIT/6pU - C/+qUw3/oVMP/8SgfPwAAAAAq1UK/qtUC/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly8f/z9PT/8vLy//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/e3t7/w8PD/8TExP/Dw8P/xMTE/8jI - yP/u7u7/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//Pz8//09PT/8/Pz//Ly8v/x8fH/8/P0//Pz8//09PT/8vLy//Ly8v/09PT/9PT0//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//y8vL/8vLy//Pz8//z8/P/8/Pz//Ly8v/y8vL/8vLy//Pz - 8//z8/T/8vLy//T09P/z8/P/8vLy//Ly8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//Ly8v/y8vL/8vLy//Ly - 8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz9P/09PT/8/Pz//Pz8//z8/P/8/Pz//Pz - 9P/y8vL/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8vLy//Ly8v/y8vL/8vLy//Ly - 8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly - 8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/9PT0//Pz8//y8vL/8vLy//Ly8v/y8vL/8vLy//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//z8/P/9PT0//T09P/09PT/8/P0//Pz - 9P/09PT/9PT0//T09P/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/9PT0//T0 - 9P/z8/P/8/Pz//Pz8//09PT/8vLy//Ly8v/x8fH/9PT0//T09P/y8vL/8vLy//Ly8v/z8/T/8/Pz//Ly - 8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/9PT0//T09P/z8/P/8/Pz//Ly8v/y8vL/8vLy//Pz - 8//09PT/8/P0//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/9PT0//j4+P/9/f3//f39//7+/v/+/v7//v7+//7+ - /v/29vb/8vLy//Ly8v/09PX/9PT0//Ty9P/y9fD/9vLy//by9f/08vT/9PT0//Lz8//89Ob/xZdv/55S - FP+qVA3/qlML/59SD/+8lW/8AAAAAKtVCv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r07f/y8vH/8/T0//Ly - 8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/4+Pj/8XFxf/Dw8P/xMTE/8TE - xP/Q0ND/8vLy//Dw8P/z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/y8vL/8vLy//T09P/09PX/9PT1//Pz8//z8/P/8/Pz//Pz8//09PT/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/8/Pz//Ly8v/z8/P/9PT0//T0 - 9P/y8vL/8vLy//Ly8v/y8vP/8vLz//Ly8v/y8vL/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8/Pz//Ly8v/y8vL/8vLz//Ly8//y8vP/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Pz8//09PT/9PT0//T09P/09PT/8/Pz//T09P/09PT/9PT0//T0 - 9P/z8/P/8vLz//Ly8//y8vP/8vLz//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly - 8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8//09PT/9PT0//T09P/09PT/9PT0//Pz - 8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8/Pz//Pz8//z8/P/8/Pz//T0 - 9P/z8/P/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/09PT/9PT0//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Pz8//x8fH/8vLy//Ly8v/z8/P/9PT0//Ly8v/y8vL/8/Pz//T09P/09PT/8vLy//Ly - 8v/z8/P/9PT0//Pz8//y8vL/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//T09P/z8/P/8/Pz//Pz - 8//z8/P/8/Pz//Ly8v/y8vL/8vLy//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8vLy//T09P/29vb//f39//39/f/+/v7//v7+//7+ - /v/+/v7/9PT1//Pz8//z8/P/9PT0//T09P/08vT/8vXw//by8v/28vX/9PL0//T09P/y8/P//PTm/8WX - b/+dUhX/qlML/6tTC/+hUg7/rohg/AAAAACrVQr+q1QL/61VCf+mVAv/lFUe/+vZyP/69O3/8vLx//P0 - 9P/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0/+np6f/Hx8f/wsLC/8XF - xf/Dw8P/2dnZ//Ly8//w8PD/8/P0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8vLy//Dw8P/y8vL/8vLy//Ly8v/w8PH/8PDx//Ly - 8v/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//y8vP/8vLy//Ly - 8v/y8vL/8/Pz//Ly8//y8vP/8/Pz//Ly8//y8vP/8vLy//Hx8f/x8fH/8PDw/+/v7//v7+//7+/v/+7u - 7v/t7e3/7Ozs/+zs7P/t7e3/7Ozs/+vr6//q6ur/6urq/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/+np - 6f/p6en/6enp/+np6f/p6en/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//m5ub/5eXl/+Xl - 5f/k5OT/4+Pj/+Li4v/i4uL/4uLi/+Li4v/h4eH/4eHh/+Hh4f/g4OD/4ODg/+Dg4P/h4eH/4eHh/+Hh - 4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/j4+P/4+Pj/+Pj4//k5OT/5OTk/+Tk5P/k5OT/5eXl/+Xl - 5f/m5ub/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/6Ojo/+np6f/p6en/6+vr/+vr - 6//q6ur/6urq/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7Ozs/+3t7f/t7e3/7e3t/+3t7f/u7u7/7+/v/+/v - 7//v7+//7+/v//Dw8P/x8fH/8fHy//Ly8//y8vL/8vLy//Hx8f/z8/P/8/Pz//Hx8f/y8vL/8vLy//Ly - 8//z8/P/8/Pz//Pz8//y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8fHx//Dw - 8f/y8vL/8vLy//T09P/09PT/9PT0//T09P/09PT/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/09PT/9fX1//7+/v/+/v7//v7+//7+ - /v/+/v7//Pz8//T09P/09PT/9PT0//T09P/09PT/9PL0//L18P/28vL/9vL1//Ty9P/09PT/8vPz//z0 - 5v/Fl2//nVIV/6hTC/+rUwv/olMO/6J5UvwAAAAAq1UK/qtUC/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly - 8f/z9PT/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/w8PD/zc3N/8LC - wv/FxcX/xcXF/+bm5v/y8vL/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/9PT0//Ly8v/y8vL/9PT0//T09P/y8vL/8vLy//Ly - 8v/u7u7/7e3t/+vr7P/r6+v/6urq/+fn5//m5ub/5ubm/+Xl5f/j4+P/4eHh/+Dg4P/d3d3/29vb/9fX - 1//U1NT/0tLS/8/Pz//Nzc3/y8vL/8vLy//Kysr/ycnJ/8jIyP/IyMj/yMjI/8fHx//Gxsb/xsbG/8jI - yP/Hx8f/xsbG/8bGxv/FxcX/xsbG/8bGxv/FxcX/xcXF/8XFxf/Gxsb/xsbG/8XFxf/FxcX/xcXF/8XF - xf/ExMT/xMTE/8TExP/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE - xP/ExMT/w8PD/8PDw//FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE - xP/ExMT/xMTE/8XFxf/FxcX/xcXF/8XFxf/FxcX/w8PD/8TExP/ExMT/xMTE/8PDw//Dw8P/xMTE/8TE - xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/xcXF/8XF - xf/FxcX/xsbG/8bGxv/Gxsb/xsbG/8bGxv/ExMT/xcXF/8XFxf/Hx8f/xsbG/8bGxv/Gxsb/x8fH/8fH - x//Gxsb/xsbG/8fHx//IyMj/ycnJ/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zs7O/8/Pz//R0dH/1NTU/9XV - 1f/a2tr/3Nzc/97e3v/g4OD/4eHh/+Pj4//k5OT/5eXl/+bm5v/n5+f/6+vr/+zs7P/t7e3/8PDw//Hx - 8f/y8vL/8vLy//Ly8v/y8vL/8PDw//Hx8f/y8vL/9PT0//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/y8vL/8/Pz//T09P/9/f3//v7+//7+ - /v/+/v7//v7+//z8/P/y8vL/9PT0//T09P/09PT/9PT0//Ty9P/y9fD/9vLy//by9f/08vT/9PT0//Lz - 8//89Ob/xZdv/51SFf+oUwv/q1ML/6RUDf+WbEP8AAAAAKtVCv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r0 - 7f/y8vH/8/T0//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/P/8fHy/9ra - 2v/CwsL/xMTE/8fHx//t7e3/8fHx//Pz8//y8vL/8vLy//T09P/09PT/8/Pz//Ly8v/09PT/8fHx//Dw - 8P/u7u7/7e3t/+rq6v/n5+f/4+Pj/+Dg4P/c3Nz/2trb/9jY2P/V1dX/09PT/9HR0f/Q0ND/zs7O/83N - zf/MzMz/ysrK/8rKyv/IyMj/x8fH/8fHx//Hx8f/xsbG/8XFxf/ExMT/xMTE/8TExP/ExMT/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/ExMT/xMTE/8TExP/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/xMTE/8TE - xP/FxcX/xcXF/8XFxf/FxcX/xMTE/8TExP/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/ExMT/xMTE/8TE - xP/ExMT/xMTE/8TExP/FxcX/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/xcXF/8XFxf/ExMT/xMTE/8TExP/ExMT/xMTE/8TE - xP/ExMT/xMTE/8XFxf/FxcX/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE - xP/ExMT/xcXF/8XFxf/ExMT/xMTE/8TExP/FxcX/xcXF/8bGxv/Hx8f/x8fH/8jIyP/IyMj/ycnJ/8rK - yv/Ly8v/zMzM/8/Pz//Q0ND/0tLS/9PT0//V1dX/19fX/9nZ2f/c3Nz/4ODg/+Li4v/m5ub/6urq/+zs - 7P/u7u7/8PDw//Dw8P/09PT/8/Pz//Pz8//09PT/9PT0//Ly8v/y8vL/8fHx//X19f/z8/P//f39//7+ - /v/+/v7//v7+//7+/v/7+/v/8/Pz//T09P/09PT/9PT0//T09P/08vT/8vXw//by8v/28vX/9PL0//T0 - 9P/y8/P//PTm/8WXb/+dUxP/qVQL/6pSCf+lVQ3/kWU8/AAAAACrVQr+q1QL/61VCf+mVAv/lFUe/+vZ - yP/69O3/8vLx//P09P/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly - 8v/l5eX/xsbG/8LCwv/Ozs7/8/T0//Pz8//x8fH/8vLy/+7u7v/p6en/4uLi/9zc3P/Y2Nj/09PT/9DQ - 0P/MzMz/ysrK/8bGxv/FxcX/xMTE/8TExP/Dw8P/w8PD/8TExP/ExMT/xMTE/8TExP/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xMTE/8TExP/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/xsbG/8TExP/ExMT/xMTE/8bG - xv/Gxsb/ycnJ/8zMzP/Q0ND/1NTU/9bW1v/b29v/4eHh/+jo6P/u7u7/8PDw//Ly8v/x8fH/8vLy//39 - /f/9/f3//v7+//39/f/+/v7/+fn5//T09P/09PT/9PT0//T09P/09PT/9PL0//L18P/28vL/9vL1//Ty - 9P/09PT/8vPz//z05v/Fl2//nVIT/6lVC/+sUwv/plUM/5FjOPwAAAAAq1UK/qtUC/+tVQn/plQL/5RV - Hv/r2cj/+vTt//Ly8f/z9PT/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//X1 - 9f/y8vL/7+/v/8jIyP/Dw8P/29vb/+Tk5P/Y2Nj/0dHR/8XFxf/Hx8f/xMTE/8LCwv/CwsL/w8PD/8LC - wv/Dw8P/xcXF/8XFxf/Gxsb/xsbG/8XFxf/FxcX/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/ExMT/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/xMTE/8TExP/FxcX/xcXF/8XF - xf/Gxsb/x8fH/8bGxv/FxcX/xMTE/8PDw//Dw8P/w8PD/8PDw//ExMT/x8fH/8bGxv/Nzc3/19fX/+Hh - 4f/09PT//f39//7+/v/9/f3//v7+//f39//09PT/9PT0//T09P/09PT/9PT0//Ty9P/y9fD/9vLy//by - 9f/08vT/9PT0//Lz8//89Ob/xZdv/5xSE/+oVQv/rVMJ/6dUC/+RYTb8AAAAAKtVCv6rVAv/rVUJ/6ZU - C/+UVR7/69nI//r07f/y8vH/8/T0//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/x8fL/8/Pz//Dw8f/h4eH/yMjI/8jIyP/Gxsb/w8PD/8XFxf/ExMT/xcXF/8XFxf/FxcX/xMTE/8TE - xP/FxcX/xcXF/8TExP/ExMT/w8PD/8PDw//Dw8P/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/ExMT/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/xMTE/8XFxf/FxcX/xMTE/8TE - xP/ExMT/xMTE/8PDw//Dw8P/xMTE/8TExP/FxcX/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8PD - w//ExMT/3Nzc//z8/P/+/v7//v7+//7+/v/29vb/9PT0//T09P/09PT/9PT0//T09P/08vT/8vXw//by - 8v/28vX/9PL0//T09P/y8/P//PTm/8WXb/+dUxP/p1UL/61TCP+nVAr/kmEy/fPWuSyrVQr+q1QL/61V - Cf+mVAv/lFUe/+vZyP/69O3/8vLx//P09P/y8vL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/8vLy//T09P/u7u7/8/Pz/+Pj4//MzMz/yMjI/8bGxv/ExMT/wsLC/8TExP/ExMT/xMTE/8TE - xP/ExMT/w8PD/8PDw//ExMT/xMTE/8XFxf/FxcX/xcXF/8TExP/Dw8P/w8PD/8TExP/ExMT/xMTE/8TE - xP/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xMTE/8TExP/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8TE - xP/ExMT/xMTE/8TExP/ExMT/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/xMTE/8TE - xP/ExMT/xMTE/8XFxf/FxcX/xcXF/8XFxf/ExMT/xMTE/8TExP/ExMT/xMTE/8XFxf/FxcX/xcXF/8XF - xf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/FxcX/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/xMTE/8TE - xP/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8XFxf/FxcX/xMTE/8PD - w//ExMT/xMTE/8XFxf/FxcX/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8XF - xf/ExMT/x8fH/9PT0//7+/v//f39//7+/v/8/Pz/9PT0//T09P/09PT/9PT0//T09P/09PT/9PL0//L1 - 8P/28vL/9vL1//Ty9P/09PT/8vPz//z05v/Fl2//nVMT/6VUCv+tUwj/qFQM/45cLv/my6xTq1UK/qtU - C/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly8f/z9PT/8vLy//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/z8/P/8/Pz//Pz8//z8/P/8vLy/+3t7f/n5+f/39/f/9jY2P/Ozs7/ycnJ/8TE - xP/Dw8P/xcXF/8XFxf/FxcX/xMTE/8TExP/Dw8P/xMTE/8TExP/ExMT/xMTE/8TExP/FxcX/xcXF/8TE - xP/ExMT/xMTE/8TExP/ExMT/w8PD/8PDw//FxcX/xcXF/8XFxf/ExMT/xMTE/8PDw//ExMT/xMTE/8XF - xf/FxcX/xcXF/8XFxf/ExMT/xMTE/8TExP/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/w8PD/8TExP/FxcX/xcXF/8TE - xP/ExMT/xMTE/8XFxf/FxcX/xMTE/8TExP/FxcX/xcXF/8XFxf/ExMT/xMTE/8XFxf/FxcX/xcXF/8TE - xP/ExMT/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8XFxf/FxcX/xMTE/8TExP/ExMT/xcXF/8XF - xf/FxcX/xcXF/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8XFxf/FxcX/xMTE/8TExP/ExMT/xMTE/8TE - xP/ExMT/xMTE/8TExP/FxcX/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/xMTE/8TExP/FxcX/xcXF/8XF - xf/FxcX/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/FxcX/xcXF/8TExP/ExMT/xMTE/8TE - xP/ExMT/xMTE/8TExP/FxcX/xcXF/8XFxf/ExMT/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/xMTE/8TE - xP/ExMT/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/FxcX/xcXF/8XF - xf/FxcX/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Hx8f/zs7O/9bW - 1v/d3d3/5ubm/+3t7f/x8fL//Pz8//39/f/+/v7/+vr6//T09P/09PT/9PT0//T09P/09PT/9PT0//Ty - 9P/y9fD/9vLy//by9f/08vT/9PT0//Lz8//89Ob/xZdv/51UE/+lVAj/qVII/6VUEP+SWiP/4LuTU6tV - Cv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r07f/y8vH/8/T0//Ly8v/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Ly8v/y8vL/8vLy//Ly8v/y8vL/8fHx/+7u - 7//q6ur/5eXl/+Li4v/f39//3Nzc/9fX1//U1NT/0dHR/83Nzf/Ly8v/yMjI/8bGxv/Gxsb/xsbG/8XF - xf/FxcX/xMTE/8XFxf/FxcX/xMTE/8TExP/Dw8P/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8XF - xf/FxcX/xMTE/8TExP/ExMT/xcXF/8XFxf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8XF - xf/FxcX/xMTE/8TExP/ExMT/xMTE/8TExP/FxcX/xcXF/8TExP/ExMT/xMTE/8XFxf/ExMT/xMTE/8TE - xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/xMTE/8XF - xf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/xMTE/8TExP/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/FxcX/xcXF/8TExP/ExMT/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/xMTE/8TExP/ExMT/xcXF/8XF - xf/FxcX/xMTE/8TExP/ExMT/xMTE/8XFxf/FxcX/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/xcXF/8XF - xf/FxcX/xMTE/8XFxf/FxcX/xcXF/8TExP/ExMT/xcXF/8TExP/ExMT/w8PD/8PDw//FxcX/xcXF/8TE - xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF - xf/Gxsb/xsbG/8fHx//Ly8v/zs7O/8/Pz//U1NT/1tbW/9ra2v/e3t7/4ODg/+Tk5P/q6ur/7+/v//Dw - 8P/y8vL/8vLy//Pz8//09PT/8/Pz//n5+f/+/v7//f39//f39//z8/P/9PT0//T09P/09PT/9PT0//T0 - 9P/08vT/8vXw//by8v/28vX/9PL0//T09P/y8/P//PTm/8WXb/+dVBP/plQI/6tTC/+jUhH/k1QZ/9es - gVOrVQr+q1QL/61VCf+mVAv/lFUe/+vZyP/69O3/8vLx//P09P/y8vL/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8/T/9PT0//Ly8v/y8vL/8/Pz//Ly - 8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Ly8v/y8vL/8PDw//Hx8f/z8/P/8PDw/+3t7f/q6ur/6Ojo/+bm - 5//k5OT/4eHh/9/f3//a2tr/2NjY/9XV1f/T09P/0NDQ/8zMzP/Ly8v/ysrK/8nJyf/Jycn/ycnJ/8jI - yP/Hx8f/xsbG/8bGxv/Gxsb/xsbG/8bGxv/Gxsb/xsbG/8bGxv/Gxsb/xcXF/8XFxf/ExMT/xMTE/8TE - xP/ExMT/w8PD/8PDw//Dw8P/xMTE/8XFxf/FxcX/xMTE/8TExP/ExMT/xcXF/8TExP/Dw8P/xMTE/8TE - xP/FxcX/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE - xP/ExMT/xcXF/8TExP/FxcX/xcXF/8XFxf/ExMT/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/xMTE/8TE - xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/FxcX/xcXF/8XFxf/FxcX/xMTE/8TExP/ExMT/xMTE/8TE - xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xcXF/8XFxf/FxcX/xcXF/8XFxf/ExMT/xcXF/8TE - xP/ExMT/xMTE/8TExP/FxcX/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/FxcX/xcXF/8TE - xP/ExMT/xMTE/8TExP/ExMT/xcXF/8TExP/ExMT/xMTE/8TExP/FxcX/xcXF/8TExP/ExMT/w8PD/8PD - w//Dw8P/w8PD/8TExP/FxcX/xcXF/8XFxf/Gxsb/xsbG/8XFxf/FxcX/xsbG/8bGxv/Gxsb/xsbG/8fH - x//IyMj/ycnJ/8nJyf/Kysr/y8vL/8zMzP/Nzc3/z8/P/9HR0f/V1dX/19fX/9ra2v/e3t7/4ODg/+Li - 4v/l5eb/5+fn/+vr6//t7e3/8fHx//Pz9P/19fX/7+/v//Ly8v/z8/P/8/P0//Pz8//z8/P/8/Pz//Ly - 8v/z8/P/8vLy//Ly8v/y8vL/8vLy//Pz8//19vb/+/v7//z8/P/z8/P/8vLy//T09P/09PT/9PT0//T0 - 9P/09PT/9PL0//L18P/28vL/9vL1//Ty9P/09PT/8vPz//z05v/Fl2//nVMT/6ZUCP+sUw3/pVEQ/5NU - F//InW9Tq1UK/qtUC/+tVQn/plQL/5RVHv/r2cj/+vTt//Ly8f/z9PT/8vLy//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/8PDw//Hx8f/y8vL/8vLy//Ly - 8v/y8vL/8/P0//Pz9P/z8/T/8/P0//T09P/z8/T/8vLy//Ly8v/w8PD/8vLy//Ly8v/z8/P/8/Pz//Ly - 8v/y8vL/8vLy//T09P/09PT/8vLy//Ly8v/x8fH/8fHx//Hx8f/19fX/9PT0//Hx8f/v7+//7+/v//Dw - 8f/v7/D/7e3t/+3t7f/r6+v/7Ozs/+rq6v/p6en/6Ojo/+Xl5f/j4+P/4+Pj/+Hh4f/g4OD/3Nzc/9zc - 3P/a2tr/2tra/9nZ2f/X19f/1tbW/9TU1P/U1NT/1NTU/9PT0//R0dH/0NDQ/8/Pz//Ozs7/ysrK/8rK - yv/Kysr/ysrK/8nJyf/Jycn/ycnJ/8nJyf/Jycn/x8fH/8fHx//Hx8f/x8fH/8fHx//Gxsb/xsbG/8XF - xf/FxcX/xcXF/8XFxf/ExMT/xMTE/8TExP/ExMT/xcXF/8TExP/ExMT/xMTE/8TExP/Gxsb/xcXF/8XF - xf/ExMT/xMTE/8TExP/ExMT/w8PD/8PDw//Dw8P/xMTE/8TExP/ExMT/xMTE/8PDw//Dw8P/xMTE/8TE - xP/ExMT/xcXF/8XFxf/FxcX/xcXF/8TExP/ExMT/xMTE/8TExP/FxcX/xMTE/8TExP/ExMT/xMTE/8XF - xf/FxcX/xcXF/8XFxf/FxcX/xsbG/8bGxv/Hx8f/x8fH/8fHx//IyMj/yMjI/8jIyP/Jycn/ycnJ/8nJ - yf/Kysr/ysrK/8rKyv/Ly8v/zMzM/8/Pz//Q0ND/0tLS/9PT0//T09P/1NTU/9TU1P/V1dX/1tbW/9jY - 2P/Z2dn/2tra/9vb2//c3Nz/4ODg/+Dg4P/i4uL/5OTk/+Xl5f/o6Oj/6urq/+vr6//s7Oz/7e3t/+3t - 7f/t7e3/7+/v//Dw8P/v7/D/7+/v//Hx8f/y8vP/9fX1//Ly8v/x8fH/8vLy//Ly8v/y8vL/8/Pz//T0 - 9P/y8vL/8vLy//Ly8v/09PT/9PT0//Pz8//y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/9PT0//T0 - 9P/y8vL/8vLy//Pz8//09PT/9PT0//Pz8//y8vL/8vLy//X19v/29vb/8vLy//Ly8v/09PT/9PT0//T0 - 9P/09PT/9PT0//Ty9P/y9fD/9vLy//by9f/08vT/9PT0//Lz8//89Ob/xZdv/51TE/+pVQj/rlMM/6dS - D/+YVRj/wZBiU6tVCv6rVAv/rVUJ/6ZUC/+UVR7/69nI//r07f/y8vH/8/T0//Ly8v/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//Pz - 8//z8/P/8/Pz//T09P/z8/P/8vLy//Ly8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/9PT0//Pz - 8//z8/P/9PT0//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/8vLy//Pz8//z8/P/9PT0//T0 - 9P/z8/P/9PT0//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz - 8//z8/P/9PT0//T09P/09PT/8/Pz//Pz8//z8/P/8/Pz//Pz8//x8fH/8vLy//Ly8v/x8fH/8PDw//Hx - 8f/x8fH/8PDw//Dw8P/v7+//8PDw/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v - 7//v7+//7u7u/+7u7v/u7u7/7u7u/+7u7v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/r6+v/6+vr/+vr - 6//q6ur/6enp/+np6f/p6en/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo - 6P/p6en/6urq/+rq6v/q6ur/6urq/+vr6//r6+v/6+vr/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u - 7v/u7u7/7e3t/+3t7f/u7u7/7+/v/+/v7//u7u7/7u7u/+/v7//v7+//8PDx/+/v7//v7+//7+/v/+/v - 7//x8fH/8PDw//Dw8P/x8fH/8fHx//Dw8P/v7+//8PDw//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Pz - 8//z8/P/9PT0//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8vLy//Pz - 8//09PT/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Ly8v/z8/P/9PT0//T09P/z8/P/8/Pz//Ly - 8v/y8vL/8vLy//Pz8//09PT/8/Pz//Ly8v/z8/P/8/Pz//Pz8//z8/P/8vLy//Ly8v/09PT/8/P0//Ly - 8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//Ly8v/z8/P/9PT0//Pz8//z8/P/8/Pz//T09P/z8/P/9PT0//T0 - 9P/09PT/9PT0//T09P/08vT/8vXw//by8v/28vX/9PL0//T09P/y8/P//PTm/8WXb/+dUxP/qlUK/7BU - DP+oUg7/mVMS/7iHU1OqVAr+qlML/6xUCP+lUwj/lFUe/+vZyP/69O3/8vLx//P09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PL0//L18P/28vL/9vL1//Ty9P/09PT/8vPz//rz5f/Fl2//nlMT/6dT - CP+tUQj/rFQP/5xVEP+ve0RTqlQK/qtTC/+sVAj/pVMJ/5RVHv/r2cj/+vTt//Ly8f/z9PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//Ty9P/y9fD/9vLy//by9f/08vT/9PT0//Lz8//68+X/xZdv/51T - E/+nUwj/rVII/6xUDv+bUw7/2rWK36pUCv6rUwv/rFQI/6ZUC/+UVR7/69nI//r07f/y8vH/8/T0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/08vT/8vXw//by8v/28vX/9PL0//T09P/y8/P/+vPl/8WX - b/+dUxP/plQL/65TC/+rUwz/nFQL/9axhf+qVAr+q1QL/61VCf+mVAv/lFUe/+vZyP/69O3/8vLx//P0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PL0//L18P/28vL/9vL1//Ty9P/09PT/8vPz//rz - 5f/Fl2//nFMV/6ZUC/+tUwv/qlML/59VC//OqHn/qlUL/qtUC/+tVQj/plQJ/5RVHv/r2cj/+fLu//Ly - 8f/y9PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/z8vT/8vT0//Py9P/w9fD/9vLy//by9f/08vP/9PTz//Pz - 8v/88+X/xpdv/51SFf+nVQv/rVML/6pUC/+fVw//y6Rz/6dVDP6oUwv/rVYG/6hVCf+VUx//7NnG//fy - 8P/z9PT/7vLx//L08//09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T0 - 8v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T0 - 8v/09PL/9PTy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T08v/09PL/9PTy//T0 - 8v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T0 - 8v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T0 - 8v/09PL/9PTy//T08v/09PL/9PTy//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 8v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T0 - 8v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTz//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T08v/09PL/9PTy//T08v/09PL/9PTy//T0 - 8v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T0 - 8v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T0 - 8v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T0 - 8v/09PP/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PTy//T08v/09PL/9PTy//T0 - 8v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//T08v/09PL/9PTy//fy - 8//48vT/9vL1//Ty9P/08vT/9fTy//b08v/08/T/8fL3/+7y9//w9PP/7vbw//X08f/48vT/9fTz//X0 - 8//z8/L//vTm/8iWb/+iUhP/qlUI/65UCv+pUwz/mlMS/82cZv+mVA3+qlML/65VBv+nVAf/l1Ui/+3Z - xf/68vD/9Pb0//L08P/z8/P/8vT0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz - 9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz - 9P/y8/T/8vP0//L09P/y9PL/8vTy//L08v/y9PL/8vTy//L08v/y9PL/8vTy//L08v/y9PT/8vP0//Lz - 9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz - 9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz - 9P/y8/T/8vP0//Lz9P/y8/T/8vP0//L09P/y9PL/8vTy//L08v/y9PL/8vTy//L08v/y9PL/8vTy//L0 - 8v/y9PT/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz - 9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//L0 - 9P/y9PL/8vTy//L08v/y9PL/8vTy//L08v/y9PL/8vTy//L08//y9PT/8vP0//Lz9P/y8/T/8vP0//Lz - 9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz - 9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//L08v/y9PL/8vTy//L08v/y9PL/8vTy//L0 - 8v/y9PL/8vTy//L09P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz - 9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz - 9P/y8/T/8vT0//L08v/y9PL/8vTy//L08v/y9PL/8vTy//L08v/y9PL/8vTz//L09P/y8/T/8vP0//Lz - 9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Lz - 9P/v9PT/7vTy/+309P/t9PT/7/Ty//T08P/29PD/9/Px//fy9P/18vX/9PL0//P08v/28vT/+PD3//Ly - 9v/w8/T/7PP1//f26P/Bl3H/nFMU/6lUCP+tVAv/qVMM/5tSEv/MlV3/qVMM/qpSDP+tVQn/p1MK/5lX - JP/v28j//PLv//T09P/y9fL/8vLy//T08v/08/L/9PPz//Tz8//08/P/9PPy//Tz8v/08/L/9PPz//Tz - 8//08/P/9PPy//Tz8v/08/L/9PPz//Tz8//08/L/9PPy//Tz8v/08/P/9PPz//Tz8//08/L/9PPy//Tz - 8v/08/P/9PPz//Tz8//08/T/9PL0//Ty9P/08vT/9PL0//Ty9P/08vT/9PL0//Ty9P/08vT/9PTz//Tz - 8//08/L/9PPy//Tz8v/08/P/9PPz//Tz8//08/L/9PPy//Tz8v/08/P/9PPz//Tz8//08/L/9PPy//Tz - 8v/08/P/9PPz//Tz8//08/L/9PPy//Tz8v/08/P/9PPz//Tz8//08/L/9PPy//Tz8//08/P/9PPz//Tz - 8v/08/L/9PPy//Tz8//08/P/9PPz//Tz8v/08/T/9PL0//Ty9P/08vT/9PL0//Ty9P/08vT/9PL0//Ty - 9P/08vT/9PP0//Tz8v/08/L/9PPy//Tz8//08/P/9PPz//Tz8v/08/L/9PPy//Tz8//08/P/9PPz//Tz - 8v/08/L/9PPy//Tz8//08/P/9PPz//Tz8v/08/L/9PPy//Tz8//08/P/9PPz//Tz8v/08/L/9PPy//Tz - 9P/08vT/9PL0//Ty9P/08vT/9PL0//Ty9P/08vT/9PL0//Ty9P/08vT/9PTz//Tz8//08/P/9PPy//Tz - 8v/08/L/9PPz//Tz8//08/P/9PPy//Tz8v/08/L/9PPz//Tz8//08/P/9PPy//Tz8v/08/L/9PPz//Tz - 8//08/P/9PPy//Tz8v/08/L/9PPz//Tz8//08/P/9PPy//Tz9P/08vT/9PL0//Ty9P/08vT/9PL0//Ty - 9P/08vT/9PL0//Ty9P/08/T/9PPy//Tz8v/08/L/9PPz//Tz8//08/L/9PPy//Tz8v/08/P/9PPz//Tz - 8//08/L/9PPy//Tz8v/08/P/9PPz//Tz8//08/L/9PPy//Tz8v/08/P/9PPz//Tz8//08/L/9PPy//Tz - 8v/08/P/9PP0//Ty9P/08vT/9PL0//Ty9P/08vT/9PL0//Ty9P/08vT/9PL0//Ty9P/09PP/9PPz//Tz - 8//08/L/9PPy//Tz8v/08/P/9PPz//Tz8//08/L/9PPy//Tz8v/08/P/9PPz//Tz8//08/L/9PPy//Tz - 8v/08/T/8fT0//D08v/v9PL/7/Ty/+/08v/y9PD/9PTw//T08P/08/L/8vP0//Dy9f/u9PT/8fL1//Lx - +P/w8vf/8PP1/+/z9P/69Ob/xpdv/55TE/+nVAr/qlQL/6hTDP+eUhL/zI1U/6pUCv6qUgv/rFUJ/6RT - C/+YWSn/8d7L//vy8f/y8/L/8fX0//Dx8//z9PL/9PPy//Tz8//08/P/9PPz//Tz8v/08/L/9PPy//Tz - 8//08/P/9PPz//Tz8v/08/L/9PPy//Tz8//08/P/9PPy//Tz8v/08/L/9PPz//Tz8//08/P/9PPy//Tz - 8v/08/L/9PPz//Tz8//08/P/9PTz//Ty8v/08vL/9PLy//Ty8v/08vL/9PLy//Ty8v/08vL/9PLy//T0 - 8//08/P/9PPy//Tz8v/08/L/9PPz//Tz8//08/P/9PPy//Tz8v/08/L/9PPz//Tz8//08/P/9PPy//Tz - 8v/08/L/9PPz//Tz8//08/P/9PPy//Tz8v/08/L/9PPz//Tz8//08/P/9PPy//Tz8v/08/P/9PPz//Tz - 8//08/L/9PPy//Tz8v/08/P/9PPz//Tz8//08/L/9PTz//Ty8v/08vL/9PLy//Ty8v/08vL/9PLy//Ty - 8v/08vL/9PLy//T08//08/L/9PPy//Tz8v/08/P/9PPz//Tz8//08/L/9PPy//Tz8v/08/P/9PPz//Tz - 8//08/L/9PPy//Tz8v/08/P/9PPz//Tz8//08/L/9PPy//Tz8v/08/P/9PPz//Tz8//08/L/9PPy//Tz - 8v/08/T/9PTz//Ty8v/08vL/9PLy//Ty8v/08vL/9PLy//Ty8v/08vL/9PPy//T08//08/P/9PPz//Tz - 8v/08/L/9PPy//Tz8//08/P/9PPz//Tz8v/08/L/9PPy//Tz8//08/P/9PPz//Tz8v/08/L/9PPy//Tz - 8//08/P/9PPz//Tz8v/08/L/9PPy//Tz8//08/P/9PPz//Tz8v/08/T/9PLy//Ty8v/08vL/9PLy//Ty - 8v/08vL/9PLy//Ty8v/08vL/9PTz//Tz8v/08/L/9PPy//Tz8//08/P/9PPy//Tz8v/08/L/9PPz//Tz - 8//08/P/9PPy//Tz8v/08/L/9PPz//Tz8//08/P/9PPy//Tz8v/08/L/9PPz//Tz8//08/P/9PPy//Tz - 8v/08/L/9PPz//Tz9P/09PP/9PLy//Ty8v/08vL/9PLy//Ty8v/08vL/9PLy//Ty8v/08/L/9PTz//Tz - 8//08/P/9PPy//Tz8v/08/L/9PPz//Tz8//08/P/9PPy//Tz8v/08/L/9PPz//Tz8//08/P/9PPy//Tz - 8v/08/L/9PP0//Xz9P/38vT/9vPy//Xz8v/08/L/8vPy//H08v/x9PP/8fT0//H09P/x9PP/7fXx//D0 - 8//x8vb/8PL2//L09P/y8/L//vTk/8iYbP+gUxH/p1UL/6lVC/+oUwz/oVIQ/8qGSv+rVQr+qlMK/6lV - Cv+fUgv/l1ss//Hhzv/38vD/7fLy/+709v/u8PT/8fPz//Lz8//y8/P/8vPz//Lz8//y9PT/8vT0//L0 - 9P/y9PT/8vT0//L09P/y9PT/8vT0//L09P/y9PT/8vT0//L09P/y9PT/8vT0//L09P/y9PT/8vT0//L0 - 9P/y9PT/8vT0//L09P/y9PT/8vT0//Lz8//y8/D/8vPw//Lz8f/y8/H/8vPx//Lz8P/y8/D/8vPw//Lz - 8v/y8/T/8vT0//L09P/y9PT/8vT0//L09P/y9PT/8vT0//L09P/y9PT/8vT0//L09P/y9PT/8vT0//L0 - 9P/y9PT/8vT0//L09P/y9PT/8vT0//L09P/y9PT/8vT0//L09P/y9PT/8vT0//L09P/y9PT/8vT0//L0 - 9P/y9PT/8vT0//L09P/y9PT/8vT0//L09P/y9PT/8vT0//Lz8//y8/D/8vPx//Lz8f/y8/H/8vPw//Lz - 8P/y8/D/8vPx//Lz8v/y8/P/8vT0//L09P/y9PT/8vT0//L09P/y9PT/8vT0//L09P/y9PT/8vT0//L0 - 9P/y9PT/8vT0//L09P/y9PT/8vT0//L09P/y9PT/8vPz//Lz8//y8/P/8vPz//Lz8//y8/P/8vT0//L0 - 9P/y9PT/8vT0//Lz8v/y8/H/8vPw//Lz8P/y8/H/8vPx//Lz8f/y8/D/8vPw//Lz8v/y8/P/8vPz//Lz - 8//y8/P/8vPz//L09P/y9PT/8vT0//L09P/y8/P/8vPz//Lz8//y8/P/8vPz//Lz8//y9PT/8vT0//L0 - 9P/y9PT/8vT0//L09P/y9PT/8vT0//L09P/y9PT/8vT0//L09P/y9PT/8vP0//Lz8P/y8/H/8vPx//Lz - 8f/y8/D/8vPw//Lz8P/y8/H/8vPx//Lz8//y9PT/8vT0//L09P/y9PT/8vT0//L09P/y9PT/8vT0//L0 - 9P/y9PT/8vT0//L09P/y9PT/8vT0//L09P/y9PT/8vT0//L09P/y9PT/8vT0//L09P/y9PT/8vT0//Lz - 8//y8/P/8vPz//Lz8//y8/P/8vPy//L08P/y9PD/8vTw//L08f/y8/H/8vPx//Lz8P/y8/D/8vPy//Lz - 9P/y9PT/8vT0//L09P/y9PT/8vT0//L09P/y9PT/8vT0//L09P/y9PT/8vT0//L09P/y9PT/8vT0//L0 - 9P/y9PT/8vT0//Lz9P/28vb/9/L3//fy9P/38vT/9fL0//Hy9//w8vj/8PH3//Lx9v/08fT/9vHx//L1 - 8P/z9PH/8vPz//Hz8//z9PP/8vTw//z34//FmGv/nFMQ/6hUC/+qVAv/qVML/6JSDv/GfUD/rFQH/qtV - Cv+mVAr/nlQO/5deLf/05s//+vPt//bz8P/x8/L/8fLz//Hy8v/y8vL/8vLy//Ly8v/z8/P/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/08vT/9PL0//Ty9P/08vX/9PL2//Ty9v/08vX/9PL0//Ty - 9P/08vX/9PP0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 - 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/08vT/9PL0//Ty9f/08vb/9PL2//Ty - 9f/08vT/9PL0//Ty9f/08vb/9PL0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Py - 8v/z8vL/8/Ly//Ly8v/y8vL/8vLy//Py8v/z8vL/8/Ly//Ly8v/y8vL/8vLy//Ly8v/y8vL/8/Ly//Ly - 8v/y8vL/8vLy//Py8v/y8vP/8vD0//Lx9P/y8fT/8vD0//Pw9P/z8PT/8vH0//Lx9P/y8fT/8vLy//Ly - 8v/y8vL/8vLy//Ly8v/y8vL/8/Ly//Py8v/z8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8vL/8vLy//Ly - 8v/y8vL/8/Ly//Py8v/z8vL/8vLy//Ly8v/y8vL/9PT0//T09P/09PT/9PT0//Tz9P/y8vT/8/D0//Pw - 9P/z8PT/8vL0//Ty9P/08vX/9PL2//Ty9v/08vL/8vLy//Ly8v/y8vL/8/Ly//Py8v/y8vL/8vLy//Ly - 8v/z8vL/8/Ly//Py8v/y8vL/8vLy//Ly8v/09PT/9PT0//T09P/09PT/9PPz//Ly8v/z8vL/8/Ly//Py - 8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Py8//y8fT/8vL0//Lx9P/z8PT/8vD0//Lw9P/y8fT/8vH0//Lx - 9P/z8vL/8/Ly//Py8v/y8vL/8vLy//Ly8v/z8vL/8/Ly//Py8v/y8vL/9PT0//T09P/09PT/9PT0//Ty - 8v/y8vL/8vLy//Ly8v/z8vL/8vLz//Hz8//08/D/9fTw//Pz8v/x8vf/8PD3//Pv9f/78/f//PLz//bz - 8f/x9u3/8vXv//Pz8//z9PP/+Pf1//by8v/58eX/wJRv/55UFf+oVAv/q1QL/6lUC/+jUw7/wnc1/6xU - B/6rVA3/plQM/59TD/+eYi3/+ubJ//705P/+9+b//fXn//v07f/49O3/+PPu//ny7v/58u7/+fLu//jz - 7v/48+7/+PPu//ny7v/58u7/+fLu//jz7v/48+7/+PPu//ny7v/58u7/+PPu//jz7v/48+7/+fLu//ny - 7v/58u7/+PPu//jz7v/48+7/+fLu//ny7v/58u7/+PTt//j06//49Ov/+fTr//n06//59Ov/+PTr//j0 - 6//49Ov/+fTs//ny7v/58u7/+PPu//jz7v/48+7/+fLu//ny7v/58u7/+PPu//jz7v/48+7/+fLu//ny - 7v/58u7/+PPu//jz7v/48+7/+fLu//ny7v/58u7/+PPu//jz7v/48+7/+fLu//ny7v/58u7/+PPu//jz - 7v/58+7/+fLu//ny7v/48+7/+PPu//jz7v/58u7/+fLu//ny7v/48+7/+PTt//j06//59Ov/+fTr//n0 - 6//49Ov/+PTr//j06//59Ov/+fTs//ny7f/48+7/+PPu//jz7v/58u7/+fLu//ny7v/48+7/+PPu//jz - 7v/48u3/+PLt//jy7f/48u3/+PLt//jy7f/48u3/+PLt//jy7f/48u3/+PPu//jz7v/58u7/+fLu//jy - 7f/48u3/+PLt//jy7f/48u3/+fPs//n06//49Ov/+PTr//n06//48+v/+PPr//jz6//48+v/+PPs//ny - 7v/58u7/+fLu//jz7v/48+3/+PLt//jy7f/48u3/+PLt//jy7f/48+7/+PPu//ny7v/58u7/+PLt//jy - 7f/48u3/+PLt//jy7f/48u3/+PLt//jy7f/48u3/+PLt//ny7v/58u7/+fLu//jz7v/48+7/+PPr//jz - 6//48+v/+PPr//j06//49Or/+PTq//n06//59Ov/+PLs//jy7f/48u3/+PLt//jy7f/48u3/+PLt//jy - 7f/48u3/+PLt//jy7f/48u3/+PLt//jy7f/48u3/+fLu//ny7v/58u7/+PPu//jz7f/48u3/+PLt//jy - 7f/48u3/+PLt//jz7v/48+7/+fLu//ny7v/48+z/+PPr//j06//48+v/+PPr//n06//59Ov/+PTr//j0 - 6//49Oz/+PLt//jy7f/48u3/+PLt//jy7f/48u3/+PLt//jy7f/48u3/+PLt//jz7v/48+7/+fLu//ny - 7v/48u3/+PLt//jy7f/48u3/+fLt//nz7P/59Oj/+/Xl//z15f/69ef/9fLr//f18v/38u//+vLq//vx - 5//59Oz/9fbn//j36f/49Ov/+PLr//zx6v/88O///vLp/8STdf+dThb/qVQL/6tUC/+pVAv/pVMO/7xu - LP+rVAn+qVMP/6hTDv+kUwz/q2Yt/+a9lv/lvqD/5L+e/+O9nv/ku5v/7L6X/+2+l//tvpf/7b6X/+2+ - l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+ - l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+mP/tvpj/7b6Y/+2+mP/tvpj/7b6Y/+2+ - mP/tvpj/7b6Y/+2+mP/tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+ - l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+ - l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+mP/tvpj/7b6Y/+2+ - mP/tvpj/7b6Y/+2+mP/tvpj/7b6Y/+2+mP/tvpj/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+ - l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+ - l//tvpf/7b6X/+2+l//tvpf/7b6Y/+2+mP/tvpj/7b6Y/+2+mP/tvpj/7b6Y/+2+mP/tvpj/7b6Y/+2+ - mP/tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+ - l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6Y/+2+ - mP/tvpj/7b6Y/+2+mP/tvpj/7b6Y/+2+mP/tvpj/7b6Y/+2+mP/tvpf/7b6X/+2+l//tvpf/7b6X/+2+ - l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+ - l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpj/7b6Y/+2+mP/tvpj/7b6Y/+2+mP/tvpj/7b6Y/+2+ - mP/tvpj/7b6Y/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+l//tvpf/7b6X/+2+ - l//tvpf/7b6X/+2+l//tvpf/7b6X/+y+mP/mvp7/5L2f/+a/m//kv5v/3L+g/93HsP/57Nn//fXg//nn - zv/y1bn/776o/+K7m//ju53/7MSn/+/LsP/55s//++3f//735f+9k2v/mlMU/6hUCv+pVQj/qVUL/6VT - Df+1ZSL/qlIM/qlSD/+pUw7/qFMJ/7dpKv/stYT/6rGE/+20gv/ws4L/77KC//Czgf/ws4H/8LOB//Cz - gf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Cz - gf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LKC//Cygv/wsoL/8LKC//Cy - gv/wsoL/8LKC//Cygv/wsoL/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Cz - gf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Cz - gf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOC//Cy - gv/wsoL/8LKC//Cygv/wsoL/8LKC//Cygv/wsoL/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Cz - gf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Cz - gf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LKC//Cygv/wsoL/8LKC//Cygv/wsoL/8LKB//Cy - gf/wsoH/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Cz - gf/ws4H/8LOB//Czgf/ws4H/8LOB/++ygP/vsoD/77KA/++ygP/vsoD/8LOB//Czgf/ws4H/8LOB//Cz - gf/ws4H/8LKC//Cygv/wsoL/8LKB//Cygf/wsoH/8LKC//Cygv/ws4H/8LOB//Czgf/ws4H/8LOB//Cz - gf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Cz - gf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/wsoH/8LOB//Cygf/wsoL/8LKC//Cy - gv/wsoL/8LKC//Cygv/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/ws4H/8LOB//Cz - gf/ws4H/8LOB//Czgf/ws4H/8LOB//Czgf/vs4H/7bGC/+2ygf/xs33/8LN9/+mygv/drYf/+uHB/+/D - ov/Tnnf/3J5z/+uab//mnmr/56Bq/+Keav/dnGn/26Bz/9qriP/vz6v/z5dg/6BUDf+mVAr/qFYI/6lV - Cf+nUwv/sV0a/6pSDf6pUw3/qlMM/6VSDP+zay7/8riD//W0gf/0s3v/97J7//axfv/xsX7/8bF+//Kx - fv/ysX7/8rF+//Gxfv/xsX7/8bF+//Kxfv/zsX7/87F+//Kxfv/ysX7/8rF+//Oxf//zsX//8rF+//Kx - fv/ysX7/87F///Oxf//zsX//8rF+//Kxfv/ysX7/87F///Oxf//zsX//8rF+//Kxfv/ysX7/87F///Ox - f//zsX//8rF+//Kxfv/ysX7/87F///Oxf//zsX//8rF+//Kxfv/ysX7/87F///Oxf//zsX//8rF+//Kx - fv/ysX7/87F///Oxf//zsX//8rF+//Kxfv/ysX7/87F///Oxf//zsX//8rF+//Kxfv/ysX7/87F///Ox - f//zsX//8rF+//Kxfv/zsX//87F///Oxf//ysX7/8rF+//Kxfv/zsX//87F///Oxf//ysX7/8rF+//Kx - fv/zsX//87F///Oxf//ysX7/8rF+//Kxfv/zsX//87F///Oxf//ysX7/8rF+//Kxfv/zsX//87F///Ox - f//ysX7/8rF+//Kxfv/zsn//87J///Oyf//ysn//8rJ///Kxfv/zsX//87F///Oxf//ysX7/8bF+//Gx - fv/ysX7/8rF+//Kyf//ysn//8rJ///Kyf//zsn//8rF///Kxfv/xsX7/8bF+//Kxfv/zsX//87F///Kx - fv/ysX7/8rF+//Kxfv/ysX7/8rF+//Gxfv/xsn7/8rJ///Oyf//zsn//87J///Kyf//xsX7/8bF+//Kx - fv/ysX7/87J///Kyf//ysn//8rJ///Oyf//zsX//87F///Kxfv/ysX7/8rF+//Oxf//zsX//87F///Kx - fv/ysX7/8rF+//Oxf//zsX//87F///Kxfv/ysX7/8rF+//Oxf//zsX//87F///Kxfv/ysX7/8rF+//Ox - fv/zsX//8rF+//Kxfv/ysX7/87F///Oxf//zsX//8rF+//Kxfv/ysX7/87F///Oxf//zsX//8rF+//Kx - fv/ysX7/87F///Oxf//zsX//8rF+//Gxfv/xsX7/8rF+//Kxfv/zsn//8rJ///Kzf//ysn//87J///Kx - f//ysX7/8bF+//Gxfv/xsX7/87F///Oxf//zsX//8rF+//Kxfv/ysn//87J///Oyf//zsn//8rJ///Kx - fv/ysX7/87F///Oxf//zsn//8rJ///Kyf//ysn//9LJ///Szfv/4s3z/+rR6//m0ev/1s33/9bSD//a6 - jP/loHL/6J5r/+6eaf/2n2f/8qBj//KgYv/zoGT/8aNm/+mcY//jnmv/3p9s/8+ESP+lVAz/plQL/6ZU - Cf+pVAv/qFML/6xWEf+sUw3+qFQI/6pVCP+eUg7/qW40//G7iP/3tID/9LJ8//Syfv/1sH7/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9LJ9//Syff/0sn3/9LJ9//Syff/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/1s37/9bN+//Sy - ff/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9bN+//Syff/0sn3/9LJ9//Sy - ff/0sn3/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/3s37/9rN+//Szfv/0tH7/9LR+//iz - fv/1rXf/7aBo/+6eZv/ynmb/8qFm//KgZ//yoGf/8qBn//KgZ//vnmX/8qBm//OhZP/WhUf/pFQR/6ZT - C/+oUwv/qlQL/6lTC/+rVg7/rFQN/qhTCP+pVQn/n1IP/691Pv/zvov/9rN///SzfP/0sn7/9bB+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Syff/0sn3/9LJ9//Syff/0sn3/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9bN+//Wz - fv/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9bN+//Wzfv/1s37/9bN+//Wzfv/0sn3/9LJ9//Sy - ff/0sn3/9LJ9//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/97N+//azfv/0s37/9LR+//S0 - fv/4s37/9a13/+2gaP/wn2b/8p5m//KhZv/yoGf/8qBn//KgZ//yoGf/8aBn//GfZf/wnmH/4ZBT/6VT - Ef+mUwv/qFML/6tUC/+pUwv/rFcP/6tTDP6oUwj/qVUJ/51SD/+8g0z/8r6N//Syfv/0s3z/9LN///ey - gP/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9LJ9//Sy - ff/0sn3/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//ezfv/2s37/9LN+//S0 - fv/0tH7/97J9//Wtd//toWn/8J9m//KeZv/yoWb/8qBn//KgZ//yoGf/8qBn//KgZ//yn2X/8J5h/+WU - V/+mUxH/qVML/6lTC/+sVAv/q1ML/61YEf+rUwv+qlUI/6hUCP+dUhD/ypBb//C9jP/0sn//9LN9//Sw - ff/3s4D/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/0sn3/9LJ9//Syff/0sn3/9LJ9//Sy - ff/0sn3/9LJ9//Wzfv/1s37/9LJ9//Syff/0sn3/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9bN+//Sy - ff/0sn3/9LJ9//Syff/0sn3/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/3s37/9rN+//Sz - fv/0tH7/9LR+//eyff/2rnj/7qJq//CfZv/ynmb/8qFm//KgZ//yoGf/8qBn//KgZ//vnWT/8qBm//Kg - Y//gj1L/p1QR/6lTC/+rUwv/rlML/6tTC/+vWRH/q1MK/qtWCv+nUwf/nlMS/9SbaP/xvo7/9LJ///Sz - ff/0sX3/+LJ///Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9LJ9//Syff/0sn3/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/0sn3/9LJ9//Wzfv/1s37/9LJ9//Sy - ff/1s37/9bN+//Wzfv/1s37/9LJ9//Syff/1s37/9bN+//Syff/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Syff/0sn3/9LJ9//Wzfv/1s37/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9LJ9//Sy - ff/1s37/9bN+//Syff/1s37/9bN+//Wzfv/1s37/9bN+//Syff/0sn3/9LJ9//Wzfv/0sn3/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Syff/0sn3/9LJ9//Syff/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9LJ9//Syff/0sn3/9LJ9//Sy - ff/0sn3/9LJ9//Syff/1s37/9bN+//Syff/0sn3/9LJ9//Syff/0sn3/9bN+//Wzfv/1s37/9bN+//Wz - fv/0sn3/9LJ9//Syff/0sn3/9LJ9//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Sy - ff/0sn3/9LJ9//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9rJ9//ay - ff/0s37/9LR+//S0fv/3sn3/9695/+2gaP/xoGf/8p5m//KhZv/yoGf/8qBn//KgZ//yoGf/8J9m//Kf - Zf/yoGP/2YhL/6hUEv+qUwv/q1ML/61SC/+rUwv/rloT/6tTCv6qVQr/p1MI/51UE//hqnb/8L2P//Ky - gP/0tH//9bJ+//iyf//1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Syff/0sn3/9LJ9//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9LJ9//Syff/1s37/9bN+//Sy - ff/0sn3/9bN+//Wzfv/1s37/9bN+//Syff/0sn3/9bN+//Wzfv/0sn3/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9LJ9//Syff/1s37/9bN+//Syff/0sn3/9bN+//Wzfv/1s37/9bN+//Sy - ff/0sn3/9bN+//Wzfv/0sn3/9bN+//Wzfv/1s37/9bN+//Wzfv/0sn3/9LJ9//Syff/1s37/9LJ9//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/0sn3/9LJ9//Syff/0sn3/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/0sn3/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//ay - ff/2sn3/9LN+//S0fv/0tH7/97J9//iwev/toWn/8qFo//KeZv/yoWb/8qBn//KgZ//yoGf/8Z9m//Gf - Zv/xn2X/8qBj/9mIS/+nVBH/qlQL/6xUC/+sUwv/qFMM/69dGf+rUwr+qlUK/6hTCf+bURP/77eE/+6+ - kP/ysoH/9LR///Wyfv/4sn//9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9LJ9//Sy - ff/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/1s37/9bN+//Syff/0sn3/9LJ9//Syff/0sn3/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Syff/0sn3/9bN+//Wz - fv/0sn3/9LJ9//Wzfv/1s37/9bN+//Wzfv/0sn3/9LJ9//Wzfv/1s37/9LJ9//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Syff/0sn3/9bN+//Wzfv/0sn3/9LJ9//Wzfv/1s37/9bN+//Wz - fv/0sn3/9LJ9//Wzfv/1s37/9LJ9//Wzfv/1s37/9bN+//Wzfv/1s37/9LJ9//Syff/0sn3/9bN+//Sy - ff/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9LJ9//Syff/0sn3/9LJ9//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9LJ9//Syff/0sn3/9bN+//Syff/0sn3/9LJ9//Syff/0sn3/9LJ9//Wzfv/1s37/9bN+//Wz - fv/2sn3/9bJ9//Syff/0s33/9LN9//eyff/4sHr/7aFp//KhaP/ynmb/8qFm//KgZ//yoGf/8qBn//Kg - Z//yoGf/8p9l//KgY//djE//pVIO/6pUCv+rVAv/qlML/6dTDv+4aSX/rFIJ/qpVCv+pVQv/mVAS//K5 - iP/uvpD/8rKB//S0f//1sn7/+LJ///Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Sy - ff/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9bN+//Wzfv/0sn3/9LJ9//Syff/0sn3/9LJ9//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/0sn3/9LJ9//Wz - fv/1s37/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9LJ9//Syff/1s37/9bN+//Syff/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/0sn3/9LJ9//Wzfv/1s37/9LJ9//Syff/1s37/9bN+//Wz - fv/1s37/9LJ9//Syff/1s37/9bN+//Syff/1s37/9bN+//Wzfv/1s37/9bN+//Syff/0sn3/9LJ9//Wz - fv/0sn3/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Syff/0sn3/9LJ9//Sy - ff/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Syff/0sn3/9LJ9//Wzfv/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/1s37/9bN+//Wz - fv/1s37/97N+//ayff/0sn3/9LN9//Szff/3sn3/+LB6/+2haf/yoWj/8p5m//KhZv/yoGf/8qBn//Kg - Z//yoGf/8qBn//GfZf/yoGP/4ZBT/6VSDv+qVQj/qlUL/6lTC/+lUg7/v3My/61TC/6rVQv/p1QL/5pS - FP/xvIv/7r2S//Gygf/0tH//9bJ9//iyfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9LJ9//Wzfv/1s37/9LJ9//Syff/0sn3/9LJ9//Sy - ff/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9LJ9//Sy - ff/1s37/9bN+//Syff/0sn3/9bN+//Wzfv/1s37/9bN+//Syff/0sn3/9bN+//Wzfv/0sn3/9bN+//Wz - fv/1s37/9bN+//Wzfv/0sn3/9bN+//Wzfv/1s37/9LJ9//Syff/1s37/9bN+//Syff/0sn3/9bN+//Wz - fv/1s37/9bN+//Syff/0sn3/9bN+//Wzfv/0sn3/9bN+//Wzfv/1s37/9bN+//Wzfv/0sn3/9LJ9//Sy - ff/1s37/9LJ9//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/0sn3/9LJ9//Sy - ff/0sn3/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/0sn3/9LJ9//Syff/1s37/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9bN+//Wz - fv/1s37/9bN+//ezfv/2sn3/9LJ9//Szff/0s33/97J9//iwev/toWn/8qFo//KeZv/yoWb/8qBn//Kg - Z//yoGf/8Z9m//GfZv/wnmT/8qFk/+aWWf+nVRH/qVUJ/6pVC/+oUwv/pFIO/8l/P/+tUwv+qVQL/6VU - C/+ZUxT/9cCT/+28kv/xs4D/8rN///azfv/4s33/9bN+//Wzfv/1s37/9bN+//Syff/0sn3/9LJ9//Sy - ff/0sn3/9LJ9//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9LJ9//Sy - ff/0sn3/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/0sn3/9LJ9//Syff/0sn3/9LJ9//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/3s37/9rN+//Szfv/0tH7/9LR+//izfv/2rnj/7aFp//CfZv/ynmb/8qBn//Cg - Z//woGb/8KFm//KgZv/xnmX/8J5n/+ugaP/pomv/m1UV/6FUC/+tVgv/q1MG/6lUEP/IiVH/rVMK/qlU - Df+lVAv/mFMU//bBlv/tvJL/8bOA//Kzf//2s37/+LN9//Wzfv/1s37/9bN+//Wzfv/0sn3/9LJ9//Sy - ff/0sn3/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Sy - ff/0sn3/9LJ9//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9LJ9//Syff/0sn3/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/97N+//azfv/0s37/9LR+//S0fv/3sn3/9q54/+2haf/wn2b/8p5m//Kg - Z//woGf/8KBm//ChZv/yoGb/8J5l//CfaP/roWv/7Kdy/5tVGP+hUw3/rFQJ/61VBv+mUw3/yJJf/61T - Cv6pUw3/plQL/5tTFP/5w5f/7byS//G0f//ys3//9rN+//izff/1s37/9bN+//Wzfv/1s37/9LJ9//Sy - ff/0sn3/9LJ9//Syff/0sn3/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/0sn3/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/0sn3/9LJ9//Sy - ff/0sn3/9LJ9//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Syff/0sn3/9LJ9//Syff/0sn3/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//ezfv/2s37/9LN+//S0fv/0tH7/97J9//aueP/toWn/7p5m//Ke - Zv/yoGf/8KBn//CgZv/woWb/8qBm//CeZf/vnmf/6qBq//Ouef+fVhn/plML/61SCP+tVgn/n1AO/9Gi - c/+tUwr+qVMN/6ZUC/+aUxL/+saY/+68kv/xtH//8rN///azfv/4s33/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9LJ9//Syff/0sn3/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9LJ9//Sy - ff/0sn3/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/3s37/9rN+//Szfv/0tH7/9LR+//WxfP/1rXf/7aFp/+6e - Zv/ynmb/8qBn//CgZ//woGb/8KFm//KgZv/xn2b/7p5m/+mfaf/3snz/oFcY/6hSC/+uUgj/qlUJ/5tQ - FP/asor/q1QK/qlUDf+mVAv/m1MS//rJmf/uvJD/8rR+//Ozf//2s37/+LN9//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Syff/0sn3/9LJ9//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Sy - ff/0sn3/9LJ9//Syff/0sn3/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/97N+//azfv/0s37/9LR+//S0fv/1sXz/9a13/+2h - af/unmb/859n//KgZ//woGf/8KBm//ChZv/yoGb/8p9n/++eZ//pn2n/+baB/6JYGP+nTwb/rlII/6dT - Cv+ZUhv/rHVNU6tUCv6pVA3/p1QK/5tTEv/6xpb/7r2P//K0ff/zsn7/9rN+//ezff/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/0sn3/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//ezfv/2s37/9LN+//S0fv/0tH7/97J9//Ws - dv/toWn/8J9m//KeZv/yoGf/8KBn//CgZv/woWb/8aBl//GfZv/vn2f/6J5o//q7hf+gVhf/rFUJ/61S - Cv+lVQ7/k08b/7uNZVOrUwr+qFML/6dVCf+dVBL/7rWE//C9j//ztH3/87J+//Szfv/3s33/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9LJ9//Syff/0sn3/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/3s37/9rN+//Szfv/0tH7/9LR+//ey - ff/1rHb/7aBo//CfZv/ynmb/8qBn//CgZ//woGb/8KFm//KgZv/yn2b/759n/+ieaP/6toH/oVgY/6hT - CP+tVAz/n1IM/5NTI//ImnhTrFQM/qlUC/+oUwn/nlQQ/92jcf/vvI7/9LV8//Szf//0sn7/9rN8//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Syff/0sn3/9LJ9//Syff/0sn3/9LJ9//Wzfv/1s37/9bN+//Wz - fv/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9LJ9//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/97N+//azfv/0s37/9LR+//S0 - fv/4s37/9ax2/+2gaP/wn2b/8p5m//KgZ//woGf/8KBm//ChZv/yoGb/8p9n/+6eZ//pn2n/8ax3/6FX - F/+rVgv/q1QN/55TD/+PUyT/78SmU6pSCv6qVA3/qFMJ/51UD//KkV3/8LyN//S0fP/0s3//9LJ+//ay - fP/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/1s37/9bN+//Wz - fv/1s37/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//ezfv/2s37/9LN+//S0 - fv/0tH7/+LN+//Wsdv/toGj/8J9n//OfZ//yoGf/8KBn//CgZv/woWb/8qBm//KfZ//unmf/6qBq/+ah - bP+eVRT/r1gM/6lSCv+eVBL/oGc6/AAAAACqUgv+qVQK/6hTCf+dUg3/tnpG//K8jP/0s3z/9LN9//Sy - fv/0sn3/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Szfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Syfv/0sn3/9LJ9//Syff/0sn3/9LJ9//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9bN+//Wz - fv/1s37/9bN+//Syff/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzff/1s33/9bN9//Wzff/1s33/9bN9//Wzff/1s33/9bN9//Wzff/1s33/9bN9//Wz - ff/1s33/9bN9//Wzff/1s33/9bN9//Wzff/1s33/9bN9//Wzff/1s33/9bN9//Wzff/1s33/9bN9//Wz - ff/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9LN+//Wzfv/1s37/9bN+//Sz - fv/0tH7/9LR+//izff/1rHb/659n//CfZ//zn2f/8p9n//GfZ//xoGb/8aFm//GgZv/wn2b/7Z9n/+ig - av/fmmX/nlMT/6xVCv+pVAz/nVIT/7yMYfwAAAAApVQN/qhVCP+qVQj/olMO/7BoMf/3tIX/+LKA//Sx - ev/0tX3/8bN7//Ozff/0s33/9LN9//Syff/0sn3/9LJ9//Wzfv/1s37/9rN+//SxfP/zsXv/9LF8//Sx - fP/0sn3/9LF8//SxfP/0sXz/9LJ9//Syff/xsX7/8rF+//KxfP/ysnz/8rJ8//Syff/0snz/9LJ8//Sy - fP/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9LJ9//Sy - ff/0sn3/9LJ9//Syff/0sn3/9LJ9//exf//3sX//97F///exf//3sX//97F///exf//3sX//97F///iy - fv/4s33/+LN9//izff/4s33/+LN9//izff/4s33/+LN9//izff/4s33/+LN9//izff/4s33/+LN9//iz - ff/4s33/+LN9//izff/3s33/97N9//ezff/3s33/97N9//ezff/3s33/97N9//ezff/3s33/97N9//ez - ff/3s33/97N9//ezff/3sn3/97J9//eyff/3sn3/97J9//eyff/3sn3/97J9//eyff/3sn3/+LN9//iz - ff/4s33/+LN9//ezfP/0s3v/9LN7//Sze//0s3v/9LN7//Sze//0s3v/9LN7//Sze//0tHz/9bR8//W0 - fP/1tHz/9bR8//W0fP/1tHz/9bR8//W0fP/1tHz/+LR8//i0fP/4tHz/+LR8//ezfP/3s3v/97N7//ez - e//3s3v/97N8//ezff/3s33/97J8//eyfP/3snz/97N9//ezff/3s33/97N9//eyff/3sn3/97J9//ey - ff/3sn3/+LN9//izff/4s33/+LN9//izff/4s33/+LN9//izff/4s33/97N9//ezff/3s33/97N9//ez - ff/3s33/97N9//ezff/3s33/97N9//ezff/3s33/97N9//ezff/3sn3/97F///exf//3sX//97F///ex - f//3sX//97F///exf//3sX//97F///exf//3sX//97F///exf//3sX//97F///exf//3sX//97F///Sx - ff/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/3sX//97F///exf//3sX7/97J9//ey - ff/4s37/+LN9//i0ff/3s3z/9LN8//SzfP/2tH3/9bR9//Szff/0s33/9LN9//Kzff/0s33/8rF9//Sy - fv/ys33/8rN9//SzfP/3s3z/9a10/+qfZv/xoGf/8p5m//GdaP/0nmj/855m//GdZf/xoGX/76Bl/+qg - Zv/moGf/2JVe/59VFf+oUwf/p1IJ/59RGf/nyan8AAAAAKdYFf6oVQn/qlQG/6RSC/+qYCf/8Kt7//ey - f//1snv/87N7//O0ff/2tH3/9rR9//Wzfv/1s37/9LF8//SxfP/0sX7/9LF+//Sxfv/2sn//97J///ey - f//3sn//97J///exf//3sX//97J///eyf//2sn//9bN///azf//2s3//9rN///Wyfv/2sX7/97F+//ex - fv/3sX7/9rF+//Wzf//1s3//9bN///Wzf//0sn7/9LJ+//Syfv/0sn7/9LJ+//Syff/0sn3/9LJ9//Sy - ff/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9LJ9//SyfP/0snz/9LJ9//Wz - fv/0sX//9LGA//SxgP/0sYD/9LGA//SxgP/0sYD/9LGA//SxgP/0sYD/9LGA//SxgP/0sYD/9LGA//Sx - gP/0sYD/9LGA//SxgP/0sYD/9LGA//Wygf/1soH/9bKB//Wygf/1soH/9bKB//Wygf/1soH/9bKB//Wy - gP/1s4D/9bOA//WzgP/1s4D/9LJ///Syf//0sn//9LJ///Syf//1s4D/9bOA//WzgP/1s4D/9bOA//Wz - gP/1s4D/9bOA//WzgP/1s4D/9LOA//SzgP/0s4D/9LOA//WzgP/2s4D/9rOA//azgP/2s4D/9bOA//Sz - gP/0s4D/9LOA//SzgP/0s4D/9LOA//SzgP/0s4D/9bOA//WzgP/1s4D/9bOA//WzgP/1s4D/9bOA//Wz - gP/1s4D/9bOA//WzgP/2s4D/9rOA//WzgP/1s4D/9bOA//WzgP/1s4D/9bOA//WzgP/1soD/9bKB//Wy - gf/1soH/9bKB//Wygf/1soH/9bKB//Wygf/1soH/9bKB//Wygf/1soH/9bKB//Wygf/1soH/9bKB//Wy - gf/1soH/9bKB//Wygf/1soH/9bKB//Wygf/1soH/9bKB//Wygf/1soH/9bKA//Wzfv/1s37/9bN9//Wz - ff/1s33/9bN+//Wzfv/1s37/9bN9//Wzff/1s33/9bN+//Wzfv/1s37/9bN9//Wzff/1s33/9bN+//Wz - fv/1s33/9bN9//Wzff/1s33/9bN9//Wzff/1s33/9bN9//Wzff/1s37/97J///eyf//3sn//97J+//ez - ff/2sn3/9rJ9//ayff/2snz/97J8//eyff/3sn3/97J9//izfv/0sn//9LJ+//Syfv/0sn7/9LJ+//Wy - f//2s4D/9LOA//Szfv/3tH//9rF8//Srdf/rnmj/8J9o//GeZ//woGb/8p9m//GfZf/yn2X/8qBm//Gh - aP/rnWP/7KJo/8+HTf+gVBP/qVMI/6hSCv+eWSX/AAAAAAAAAACrXBz+qlUO/6xVB/+kUgj/oVgb/+el - cf/0sn//9rJ8//Oyev/1tH7/9rN8//i0ff/3s33/9LN8//WzfP/0s3z/9LN8//SzfP/0snz/9LJ9//Wy - ff/0sXz/9LF8//SxfP/0sXz/9LF8//SyfP/1sn3/9LJ9//Syff/0s33/9LJ9//Syff/0sn3/9LJ8//Sy - fP/1sn3/97J9//azfP/0s3z/9LN8//SzfP/0s3z/9LJ8//SyfP/0snz/9LJ8//SyfP/zs3v/87N7//Kz - ev/ys3r/8rN6//Oze//zs3v/87N7//Kzev/0s3r/9LR6//S0ev/0tHr/9LR6//Ozef/ys3n/87N5//Sz - ev/0tHr/9LJ7//Syff/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9LJ9//Sy - ff/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9LJ9//Sy - ff/0sn3/9LN+//Szfv/0s37/9LN+//Szff/0s33/9LN9//Szff/0s33/9LN9//Szff/0s33/9LN9//Sz - ff/0s33/9LN9//Szff/0s33/87J8//CyfP/wsnz/8bJ8//GyfP/ysnz/8rN9//Kzff/ys33/87N9//Oz - ff/zs33/8rN9//Kzff/zs33/87N9//Ozff/ys33/8rN9//Szff/0s33/9LN9//Szff/0s33/87J8//Ky - fP/ysnz/8rJ8//KyfP/ysnz/9LN9//KyfP/ysnz/8rJ8//Oyff/0s37/9LN+//Szfv/0s37/9LN9//Sz - ff/0s33/9LN9//Szff/0s37/9LN+//Szfv/0s37/9LN+//Szfv/0s37/9LN+//Szfv/0sn3/9LJ9//Sy - ff/0sn3/9LJ9//Syff/0s37/9LN+//Szfv/0s37/9LN+//Szfv/0s37/9LN+//Szff/0tHv/9LR7//S0 - e//0tHv/9LR7//S0e//0tHv/9LR7//S0e//0tHr/9LR6//S0ev/0tHr/9LR6//S0ev/0tHr/9LR6//S0 - ev/0tHr/9LR6//Szev/0tHr/9LN6//Sze//0s3v/9LN7//Szev/0s3r/9LN8//SzfP/0s3z/9LN8//Sz - fP/0s3r/9bR8//a0ff/1tHv/9LR7//W0e//4tH3/97R+//e0fv/3tH7/9rN+//azfv/2s37/9bR+//W0 - fv/0s33/9LN9//Szff/0s33/9LN9//m1fv/0rHb/6p9p/+6fav/woGj/76Nj//ChYv/woWP/8J9l//Ce - Zv/yn2j/7pxk//ChaP++cTf/n1IN/6hUBf+pUg//oWw8/wAAAAAAAAAAtWgv/qVTEP+tVAj/qVQK/5tS - EP/npW//87F8//WzfP/1snz/97N+//izff/1sn3/9LN8//SzfP/0tHr/8rV5//C1ef/xtnj/8bZ3//C1 - d//wtXb/8LZ2//G3d//yt3f/8rd3//K3d//xt3f/8bd3//G3d//yuHf/8rh3//K4d//yuHf/8rh3//O4 - eP/zuXn/87l5//O5ef/zuXn/87p5//O6ef/zunn/87p5//O6ef/zunn/87p5//O6ef/zunn/8rt6//K7 - ev/yu3n/8rt5//K7ef/yu3r/8rt6//K7ev/yu3n/8rt5//O8eP/zvHj/87x4//O8eP/zvHj/87x4//O8 - eP/0vXn/9L15//S9ef/0vHn/9Lx5//S8ef/0vHn/9L15//S9ef/0vXn/9L15//S9ef/0vXn/9L15//S9 - ef/0vXn/9L15//S9ef/0vXn/9L15//S9ef/0vXn/9Lx5//S8ef/0vHn/9Lx5//S8ef/0vHn/9Lx5//S8 - ef/0vHn/9L15//W+ev/1vnr/9b56//W+ev/1v3r/9b96//W/ev/1v3r/9b96//W/ev/1v3r/9b96//W/ - ev/1v3r/9sB7//bAe//2wHv/9sB7//bAe//2wHv/9sB7//bAe//2wHv/9sB7//bAe//2wHv/9sB7//bA - e//2wHv/9sB7//bAe//2wHv/9sB7//bAe//2wHv/9sB7//bAe//2wHv/9sB7//bAe//2wHv/9sB7//bA - e//2wHv/9sB7//bAe//2wHv/9sB7//a/e//1v3r/9b96//W/ev/1vnr/9b56//W+ev/1vnr/9b56//W+ - ev/1vnr/9b56//W+ev/1vnr/9b16//W9ev/1vXr/9b16//W9ev/1vXr/9b16//W9ev/1vXr/9L16//S8 - ef/0vHn/9Lx5//S8ef/0vHn/9Lx5//S8ef/0vHn/9Lx5//S8ef/0vHn/9Lx5//S8ef/0vHn/9L14//S9 - ef/0vXj/9L14//S9eP/0vXn/9L15//S9ef/0vXj/87x4//O8eP/zvHj/87x4//O8eP/zvHj/87x4//O8 - eP/zvHj/87x5//O8ef/zu3n/87x5//O7ef/zu3r/87t6//O7ev/zu3n/87t5//O7e//0unr/9Lp6//S6 - ef/0unn/9Lp5//O6eP/yuXn/8rl3//K5d//zuXf/9Ll5//O5ef/zuXn/87h4//O4eP/zuHf/87h3//K4 - d//yuXf/8Lh3//C4eP/wt3f/8Ld3//K3d//xtXX/7K1v/+SjZf/noGT/56Jk/+elXv/ppV//66Rj/+6g - Zv/unWb/75xn//KeZ//xn2X/tmUo/6NUDf+nVAb/ok0R/6t/VMsAAAAAAAAAALx4R/6cURL/qlIH/61W - Cf+cUAz/6adv//CyfP/0s3z/9rJ8//eyfv/0sn3/9LF8//SzfP/4uX//+b+C//nCgP/5xID/+cd+//nI - fv/7yn///MuA//3Mgf/+zYD//s6B//7Ogf/+zoH//c6B//3Pgf/9z4D//s+B//7Qgf/+0IH//tCB//3P - gP/9zoD//c6A//3OgP/9z4H//c+B//7Pgf/+z4H//s+B//3Pgf/9z4H//s+B//7Qgf/+0IH//tCB//3Q - gv/90IL//dCC//3Qgv/90IL//dCC//3Qgv/90IL//dCC//3Qgv/90IL//dCC//3Qgv/90IL//dCC//3R - g//90YP//dGD//3ShP/90oH//dJ///3Sf//90n///dJ///3Sf//90n///dJ///3Sf//90n///dJ///3S - f//90n///dJ///3Sf//904D//dOA//3TgP/904D//dOA//3Tf//903///dN///3Tf//903///dOA//3T - gP/904D//dOA//3UgP/91YD//dWA//3VgP/91YD//dSA//3UgP/91ID//dSA//3UgP/91ID//dSA//3U - gP/91ID//dSA//3UgP/91ID//dSA//3UgP/91ID//dSA//3UgP/91ID//dSA//3UgP/91YD//dWA//3V - gP/91YD//dSA//3UgP/91ID//dSA//3UgP/91ID//dSA//3UgP/91ID//dSA//3UgP/91ID//dSA//3U - gP/91ID//dSA//3UgP/91ID//dSA//3UgP/91ID//dSA//3UgP/903///dR///3VgP/91YD//dWA//3V - gP/91ID//dOA//3TgP/904D//dOA//3TgP/904D//dOA//3TgP/904D//dOA//3TgP/904D//dOA//3T - gP/904D//dOA//3TgP/904D//dKA//3Sf//90n///dJ///3Sf//90n///dJ///3Sf//90n///dKA//3R - gv/90YP//dGD//3Rg//90YP//dGD//3Rg//90YP//dGD//3Rg//90YP//dGD//3Rg//90YP//dCC//3Q - gv/90IL//dCC//3Qgv/90IL//tCC//7Qgv/90IL//dCC//3Qgv/90IL//tCC//7Qgv/+0IL//s+B//7P - gf/+z4H//c6B//3Ogf/+z4L//c6B//3Ogf/9zoD//s6A//7Pgv/9zoH//c6A//3OgP/9zoD//c6A//3P - gP/9z3///c9///zPf//8z4D/+85///vOf//9zX///syB//rIff/4wnj/+L93//jAd//3v3L/97xz//i4 - dv/1rnP/8KJr/+2cZ//yn2f/755j/6xcHf+jVQz/pVMI/5xOGf/Fon+lAAAAAAAAAACxelDGk1AX/6dS - Cf+sVAX/olMP/+CeZP/vsXv/87N9//Wwff/0sn//9LF///Szfv/wsnv/87l8//rCgf/+yoT//tCF//7S - g//+04L//tOB//3UgP/803///NN///nSff/41Hz/+NR8//jUfP/41Hz/+NR7//jVe//41Xv/+NV7//nW - fP/51nz/+tZ7//nWfP/51nz/+NV7//jVe//61n3/+tZ9//vWff/81n3//NZ9//vWff/61n3/+tV8//rV - fP/61n3/+tZ9//rWff/61n3/+tZ9//nVfP/51Xz/+dV8//rWff/61n3/+NR9//jUff/41H3/+NR9//jU - ff/41H3/+NR9//jUff/41H3/+NV8//jWev/41nr/+NZ6//jWe//41nv/+NZ7//jWev/41nr/+NZ7//jV - e//41Xv/+NV6//jVev/41Xr/+dZ8//nWfP/51nz/+dZ7//nWe//51nv/+NV7//jVe//41Xv/+NZ7//nW - e//51nv/+dZ8//nWfP/513z/+dd7//nXe//513v/+dd8//nXfP/513z/+dd7//nXe//513v/+dd8//nX - fP/513z/+dd7//nXe//513v/+dd8//nXfP/513z/+dd7//nXe//513v/+dd8//nXfP/51nv/+dd7//nX - e//513v/+dd8//nXfP/513z/+dd7//nXe//513z/+dd8//nXfP/513v/+dd7//nXe//513z/+dd8//nX - fP/513v/+dd7//nXe//513z/+dd8//nXfP/513v/+dd7//nXe//513z/+dd8//nXfP/513v/+dd7//nX - e//513z/+dd8//nWfP/51nv/+dZ7//nWe//51nz/+dZ8//nWfP/51nv/+dZ7//nWe//51nz/+dZ8//nW - fP/51nv/+dZ7//nWe//51nz/+dZ8//nWfP/51nv/+dZ7//nWe//51nz/+dZ8//nWe//51nv/+dZ7//nW - ff/51X7/+dV+//nVfv/51X7/+dV+//nVfv/51X7/+dV+//nVfv/51X7/+dV+//nVfv/51X7/+dV+//nV - fv/51X7/+dV+//nVfv/61X7/+tV+//vWff/61n3/+9Z9//vVfP/71Xz/+tV8//rWff/61n3//dZ9//7X - fv/+1n7//td///3Xf//913///td+//3Wf//91n///dZ///vVfv/41Xz/+dZ9//rWff/8137//Nd+//zX - fv/8137//Nd+//rWff/71n///NZ///vVfv/61X7//NN///rRfP/+0X///tKB//7Ugv/+04L//tOE//7J - gf/9vXv/8axw/+edZf/tn2f/8J9m//inZ/+lVRL/o1QL/6RWEP+ZWC7//9u2DgAAAAAAAAAAvJJymIZP - IP+kUw7/rVMG/6JRC//PjFH/8rV+//Gzff/2s3//8rB9//Sxf//ys37/8rR9//G0ef/utXb/77p1//G/ - dv/1xXj/+Ml7//nLfP/6zn3/+9F///3SgP/90oD/+tR///rUf//51H7/+NV+//jVfP/51Xz/+NV7//jV - e//41nz/+NV6//jWef/413r/+Nh6//jYev/413r/+Nd6//jXev/413r/+Nd6//jWef/31nn/+dh7//nY - e//52Hv/+Nd5//jXef/413n/+Nd5//jXef/413n/+Nd5//jXev/52Hr/+dh7//fWev/31nr/99Z6//fW - ev/31nr/99Z6//fWev/31nr/99Z6//fWfP/31nz/99Z8//fWfP/31nz/99Z8//fWfP/31nz/99Z8//fW - fP/31nz/99Z8//fWfP/31nz/99Z8//jXff/4133/+Nd9//jXff/4133/+Nd9//fXff/31nz/99Z8//fW - fP/4133/+Nd9//jXff/4133/+Nd9//jXff/4133/+Nd9//jXff/4133/+Nd9//jXff/4133/+Nd9//jX - ff/4133/+Nd9//jXff/4133/+Nd9//jXff/4133/+Nd9//jXff/4133/+Nd9//jXff/4133/+Nd9//jX - ff/31n3/99Z9//jXfv/4137/+Nd9//jXff/4133/+Nd9//jXff/4133/+Nd9//jXff/4133/+Nd9//jX - ff/4133/+Nd9//jXff/4133/+Nd9//jXff/4133/+Nd9//jXff/4133/+Nd9//jXff/4133/+Nd9//jX - ff/4133/+Nd9//jXff/4133/+Nd9//jXff/4133/+Nd9//jXff/4133/+Nd9//jXff/4133/+Nd9//jX - ff/4133/+Nd9//jXff/4133/+Nd9//jXff/4133/+Nd9//jXff/4133/+Nd9//jXff/4133/+Nd9//jX - ff/4133/+Nd8//jXe//413v/+Nd7//jXe//313v/99d7//fXe//313v/99d7//jXe//413v/+Nd7//jX - e//413v/+Nd7//jXe//413v/+Nd7//jYe//52Hr/+dh6//jXef/413n/+Nd5//jXef/413n/+Nd5//nY - e//62Hv/+td8//nWe//51nv/+dZ7//nWe//51nz/+tZ9//nWff/51nz/+Nd7//jWe//41nv/+NZ7//jV - e//41Xv/+dV+//nVfv/61n//+dV+//nUfv/71H///dR///7Tf//+0n///c99//nIdv/3w3L/9Lxt/+6y - av/qq2b/5aJj/+afZP/soWf/7qBm/++hZP/MfDz/o1QP/6NTDP+ZUhP/u5Fv/wAAAAAAAAAAAAAAAOTI - rYORZTv+nlIR/61SBv+mUwv/rmgs//i+hv/vsnz/87J+//Kwff/0sn3/9LJ9//azfv/1tH7/8rV7//G2 - ev/vtnf/7rV2/+63dv/vuXb/8bp2//O8eP/1v3r/9sJ6//rIgP/6yX//+suA//vNgf/7zoH//M6A//zP - gP/90IH//tGB//7Sgf/+04H//dOA//vTfv/603z/+tR8//rWff/61n3/+dV8//nVfP/51Xz/+NV8//nW - ff/51n3/+dV8//nWe//51nv/+dZ6//nWev/51nr/+dV7//nVe//51nv/+tZ7//nWe//513v/+dd7//nX - e//513v/+dd7//nXe//513v/+dd7//nXe//51n3/+dZ///nWf//51n//+dZ///nWf//51n//+dZ///nW - f//51n//+dZ///nWf//51n//+dZ///nWf//51n//+dZ///nWf//51n//+dZ///nWf//51n//+NV+//jV - fv/41X7/+dZ///nWf//51n//+dZ///nWff/5133/+dd9//nXff/5133/+dd9//nXff/5133/+dd9//nX - ff/5133/+dd9//nXff/5133/+dd9//nXff/5133/+dd9//nXff/51n3/+dZ///nWf//51n//+dZ///nW - f//51n//+NV+//jVfv/51n//+dZ///nWf//51n//+dZ///nWf//51n//+dZ///nWf//51n//+dZ///nW - f//51n//+dZ///nWf//51n//+dZ///nWf//51n//+dZ///nWfv/5133/+dd9//nXff/5133/+dd9//nX - ff/5133/+dd9//nXff/51n7/+dZ///nWf//51n//+dZ///nWf//51n//+dZ///nWf//51n//+dZ///nW - f//51n//+dZ///nWf//51n//+dZ///nWf//51n//+dZ///nWf//51n//+dZ///nWf//51n//+dZ///nW - f//51n//+dZ+//nXfP/513v/+dd7//nXe//513v/+Nd6//jXev/413r/+Nd6//jXev/513v/+dd7//nX - e//513v/+dd7//nXe//513v/+dd7//nXe//513v/+tZ7//rXe//51nr/+dZ7//nWfP/61nz/+tZ7//rW - e//61n3//NZ9//zVff/81X7//dV+//zUff/81X7//NR///3UgP/803//+tJ+//vSf//804D//tOC//7T - gv/90YL//dGC//zQg//8zoH/+s2A//rLgP/5yX7/+Md8//jEev/5wnj/87px/+eqZP/oqGP/5qRf/+ej - X//po2L/7KFk/+yhZv/rn2X/7p5l//CgZf/tnV//p1YT/6RTDv+kUw//kFEb/6uOZ08AAAAAAAAAAAAA - AAAAAAAA1LCM/JtTFP+tUgj/rFYR/5lRFv/anmb/8LN9//Kyfv/2tH//97N9//ayfP/2sn3/9rJ9//Gv - fP/ysHz/9LKA//Szgf/0s4H/9LN///ezff/2snz/87J8//Oyev/xsnf/8bJ3//K0ef/0t3v/9Ll7//G4 - ef/zuXr/9Lt7//W+fP/2v3v/9sJ8//jFfv/8yID//cqA//3NgP/50H//+tF///zRgP/80oD//NGA//vR - gP/80oH//NOB//zTgP/8037//NR+//vUfv/71H7/+9R+//zUfv/81H7//NR+//zVf//81X//+tZ8//vW - fP/71nz/+tZ8//nWfP/51nz/+tZ8//vWfP/71nz/+tZ7//nWe//51nv/+tZ7//vWe//71nv/+tZ7//nW - e//51nv/+tZ7//vWe//71nv/+tZ7//nWe//51nv/+tZ7//vWe//71nv/+tZ7//nWe//51nv/+tZ7//vW - e//61Xr/+dZ6//nWe//51nv/+tZ7//vWe//713v/+td7//nXe//513v/+td7//vXe//613v/+dd7//nX - e//613v/+9d7//vXe//613v/+dd7//nXe//613v/+9d7//vXe//613v/+dZ7//nWff/61n3/+9Z9//vW - ff/61n3/+dZ9//nWff/61n3/+9Z9//vWff/61n3/+dZ9//nWff/61n3/+9Z9//vWff/61n3/+dZ9//nW - ff/61n3/+9Z9//vWff/61n3/+dZ9//nWff/61n3/+9Z9//vWff/61nv/+dd7//nXe//613v/+9d7//vX - e//613v/+dd7//nXe//713v/+9Z7//rWe//51nv/+dZ7//rWe//71nv/+9Z7//rWe//51nv/+dZ7//rW - e//71nv/+9Z7//rWe//51nv/+dZ7//rWe//71nv/+9Z7//rWe//51nv/+dZ7//rWe//71nv/+9Z7//rW - e//51nv/+dZ7//rWe//713z/+9Z8//rWfP/51nz/+dZ8//rWfP/71nz/+9Z8//rWfP/51nz/+dZ8//rW - fP/71nz/+9Z8//rWfP/51nz/+dZ8//rWfP/81n3//NV+//zVf//81X///NV///zUfv/81H7//NR+//vU - fv/71H7//dJ+//3Tgf/904H//dGB//3Rgv/90YH//tGC//3Pgv/9z4L/+86B//zMgf/7yID/+MV+//bC - e//1wHv/9b16//O7ev/yuXr/8Ld5/+62eP/vtHj/8bR5//O0ef/2tHr/+bR6//Kpb//rn2X/76Fn//Cg - Zv/zoWj/8J1l//CdZf/wnWX/8Z9m//GfZf/zoGL/14VD/6VRDv+nVQ3/o1IQ/611Qvjfv58IAAAAAAAA - AAAAAAAAAAAAAAAAAACnazn/olIN/6dUC/+dUg3/rWkt//W2g//usoL/7rGB//mzfv/2sn7/9LF+//Sz - gP/zsoD/9LKB//SwgP/4sID/+bGB//exgP/3sn//9rJ///ayf//2sn7/9rN+//Wzfv/0s33/9LN9//Sz - fP/zs3v/87N7//S0e//0tXr/87R5//O0ef/ztXj/87V3//O2d//ytnb/8bl2//K5d//zunj/9Lp4//S7 - ev/1vXr/9r97//i/ff/4v33/+cN8//nEff/6xH3/+sR9//rFfv/7xoD/+8eA//zIgf/+yYL//cmC//rM - gP/6zYD/+86B//zPgf/+0IL//tCC//7Rgf/+0YL//tKC//3SgP/903///dN///3Tf//91ID//dN///3T - f//903///dSA//3Uf//91X///dV///3Vf//91X///dV///3Vf//91X///NR+//zUfv/81H7//NR9//zU - ff/81H3//NR9//zUfP/81X3//dV9//3Vfv/91X7/+9V+//vVff/71X3/+9V9//vVfv/61X3/+tV9//rV - ff/61X3/+tV9//rVff/61X3/+tV9//rVff/61X3/+tV9//rVff/71X3/+9V9//vVff/71n3/+9Z9//vW - ff/71n3/+tZ9//vWff/71n3/+9Z9//rWff/61X3/+tV9//rVff/61X3/+tV9//vWff/71n3/+9Z9//vW - ff/71n3/+9Z9//rVff/61X3/+tV9//rVff/71n3/+9Z9//vWff/71n3/+9V9//vVff/71X3/+9V9//vV - ff/61X3/+tV9//rVff/61X3/+tV9//rVff/71X7/+9V9//vVff/71X3/+9V+//vVfv/61X3/+tR9//rU - fP/91X3//dV+//3Vfv/91X7//dV9//3Vff/81X3//NR9//zUff/81H3//dV9//3Vff/91X3//dV+//3V - fv/91X3//dV9//3Vff/91X///dSC//3Tgv/90oL//dKC//3Sgv/90oH//dKB//3Sgf/90oH//tGC//7R - g//+0IP//c+C//zPgv/7zoH/+82B//vNgf/6zH//+st///rIf//7x4D/+8d///rGfv/6xX7/+sR+//rE - ff/4w3z/+MJ7//fBe//1v3r/9b57//S8ev/0u3n/9Lt5//O5d//yuHf/8bd2//G3dv/xtXf/8rV6//O0 - ev/ztHr/8rR6//Ozev/0s3v/9bR9//Szff/zsnz/8rJ9//Kyff/1snz/9rF7//atdf/rn2f/8Z9m//Kf - Zv/1nmb/9Z5m//OhZv/un2b/7J1j//OfZf/2nmL/9Z1f/7hjIf+kUA3/qVIP/59aJv/vwZxvAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAuIZgpZZTGv+fUAf/qFQK/6RTEf+5czz/87mJ/+qwgP/ysX7/9bN///Oz - f//ysn//9LJ///Syf//3sn3/+rN///uzgP/3s37/9bN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9LN9//azff/2s33/9bN9//Szff/0snz/9bJ8//WyfP/1snz/9bN8//Szff/0s33/9bN9//az - ff/2s33/9bN9//Szff/0s33/9bN9//Szef/0tHr/9LR6//W1ev/2tXv/9LN4//SzeP/0tHn/9LR5//S0 - ev/utXb/7rZ2/++3dv/wuHf/8Ll3//C5eP/xunb/8rt3//K7d//zvnj/88B5//PAef/zwHr/88B6//bC - fP/2w33/9sN9//bEff/3xH3/98d9//fHff/2x3z/9sd8//bHfP/5yX//+sqA//rKgP/5yn//+ct///vM - f//7zH//+8x///vMf//7zH//+8yA//vMgP/7zID/+8yA//vNgf/8zoH//M6B//zOgf/8zoH//M6B//zO - gf/8zoH//M+C//zPgv/90IH//dCB//3Qgf/90IH//dCB//3PgP/9z4H//c+B//3Qgv/90IH//NCA//zQ - gP/80ID//NCA//zQgP/80ID//NCA//zQgP/80ID//NCA//zQgP/80ID//NCA//zQgP/80ID//NCA//zQ - gP/80ID//dCA//3Rgf/90YH//dGB//3RgP/90YD//dCA//3QgP/90ID//dCA//3PgP/7z4D/+8+A//zP - gf/8z4H/+9CB//vQgP/70ID/+9CA//zQgv/8z4L//M+C//zPgv/8z4L//M+C//zOgf/8zoH/+82A//rM - gP/6zH//+82A//vNgP/7zYD/+82A//vNgP/7zYD/+8x///vMf//6zH//+st///nLf//5y3//+Mp+//nJ - fv/4yX3/9sh8//XHe//0xnr/9sZ6//bCe//2wXv/9sF7//XAev/1wHr/8755//O+eP/zvXj/8bx3//K7 - d//yuXn/8bl5//C4eP/wuHj/8Lh4//C4eP/vt3f/77d3/+62dv/0tnr/9rV6//a2ev/0tXr/9LR6//S0 - ev/0tHr/9LN5//Szef/0s3n/9LR7//S0fP/0tHz/9LR7//S0e//3s3v/97N8//ezfP/3s3z/+LJ9//Wy - f//1s33/+LJ+//izff/4tH7/9rJ9//Swe//1sn3/9bN+//Kyf//ysX//8a55//mzff/to2v/7Z9m//Gg - Zv/woGb/8KBm//CgZP/voGH/6p5h//Ciaf/wn2b/9J1h/8x0NP+sVhL/olAO/6RTFP+se1HrAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPOqhWvfVX/oFAX/7BTDP+qUgn/nFEJ/718Pv/6won/7rJ8//O0 - fv/6toH/9697//yyf//5sXz/+LN8//Oye//xsnz/9LN+//Wzfv/1s37/9bN+//Wzfv/1s37/9bN+//Wz - fv/1s37/9bN+//Szf//0s3//9LN///Szf//0sn//9LJ+//Syfv/0sn7/9LJ+//Syfv/0s3//9LN///Sz - f//0s3//9LN///Szf//0s3//9LN///Szf//0s3z/9LN8//SzfP/0s3z/9LR8//S0fP/0tHz/9LR8//Sz - e//0s3v/9LR8//a0fP/2tHz/9bN5//S0ef/0tHr/9bR6//a0ev/1tHj/87V4//O1eP/ztXj/87V4//O1 - eP/ztHf/87V4//O1eP/ztXj/87V4//O1d//ztnf/87Z3//O2d//ztnf/8bV2//K1d//ztnf/87Z4//O3 - eP/0t3b/9Ld3//S3d//0t3f/87Z2//K2df/ytnX/8rZ2//S3d//0t3j/8rh3//K4d//yuHf/87h4//O3 - d//zt3f/8rd2//K4d//yuHf/9Ll3//S5d//0uXf/9Ll3//S5d//0uXf/9Ll4//a6eP/1unj/9bt4//S7 - eP/0u3j/9Lt4//S7eP/0u3j/9Lt4//S7eP/0u3j/9Lt4//W7eP/1vHn/9bx5//W8ef/1vHn/9Lt4//S7 - eP/0u3j/9Lt4//W7eP/1u3j/9rt4//a7eP/1unf/9bt3//W7eP/2u3j/9rt4//a7eP/0unf/9Lp3//S6 - d//0unf/9Lp3//K5d//yuXb/8rl2//K5dv/yuXf/8rh2//O3d//yt3b/8rd2//K3dv/zuHj/87d3//O3 - d//yt3b/9Ld2//S3dv/0t3f/9Ld3//S3d//0t3b/9Ld2//S3dv/zt3f/8rZ2//O2d//ytXf/8rV3//G0 - d//xtHf/8bR3//G0d//ztXj/87V4//O1eP/ztXj/9bR4//S0eP/ztHj/87R4//W1ef/2tXn/9rV5//a1 - ev/2tHr/9LR8//W0fP/2tHz/9rR8//Sze//0s3v/9LR8//W0fP/2tHz/9LR8//SzfP/0tHz/9LR9//S0 - ff/0s33/9LN8//S0fP/0tH3/9LR+//S0ff/0s37/9LN+//Szff/0s33/9LN9//Szfv/0s37/9LN+//Wz - ff/1s33/9rN9//Wzff/1s33/9LR9//Szff/ys33/8LJ8//Kyf//usoD/77B///y6h//zqnb/7Zxm//Gf - aP/xn2j/8J9n/+ygaP/soGf/9KJk//agaP/umWb/7J1m/9yOUP+pVxD/plMK/51VE/+KVBz/786joQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA27SWTp1nPP+gURT/q1QK/6dVBf+kVgn/rmkm/9ub - Yv/3t3//9rF6//uzfv/5sHz/+bN+//W0fv/xs37/7rSA//OzgP/1s4D/9bOA//WzgP/1s4D/9bOA//Wz - gP/1s4D/9bOA//WzgP/zs3//8rN///Kzf//ys37/8rN+//Kzfv/ys3//8rN///Kzf//zs37/9LN+//Sz - fv/0s3//9LN///Szf//0s37/9LN+//Szfv/0s4D/87N///Ozf//zsn7/87J+//Oyfv/ysn7/8rJ+//Ky - fv/ysn7/8rJ///exgP/3sYD/97GA//exfv/3sn7/+LN///eyf//4sn//+LJ///exfv/0sX7/9LF+//Wx - fv/0sH3/9bF9//Wxfv/0sX7/9LF+//Wxff/1snz/9bJ8//WyfP/1snz/9bJ8//ezff/2snz/9bJ8//Wy - fP/1snz/9LJ7//Sye//0snv/9LJ7//Sye//0s3z/9LN8//WzfP/1s3z/9LN8//SzfP/0s3z/9LN8//Sz - fP/zsnv/87J7//SzfP/0s3z/9LN8//Sze//0tHv/9LR7//S0e//0tHv/87N6//S0e//0tHv/9LR7//Oz - ev/zs3r/87J6//Oyev/zsnr/87J6//Oyev/zsnr/87J6//Oyev/zs3r/9LN7//Sze//0s3v/9LN7//Oy - ev/zsnr/87J6//Oyev/zsnr/9LR7//S0e//0s3v/9LN7//Syev/zsnr/87J6//Oyev/zsnr/87N6//W0 - e//1tHv/9bR7//W0e//0tHv/9LR7//S0e//0tHv/9LR7//S0e//1s3z/9bN8//WzfP/1s3z/9LN8//Sz - fP/0s3z/9LN8//SzfP/0snz/9bJ8//WyfP/1snz/9LJ8//SyfP/0snz/9LJ7//Sye//1sX3/9bF///ax - f//3sn//97KA//eyf//2sX//9bF///Wxf//1sX7/+LJ///iyf//4sn//+LJ///iyf//3sn7/97F+//ex - fv/2sX7/9rF+//exgP/3sYD/+LGA//iygP/4sYD/97GA//exgP/3sYD/97F///Sxf//zsn7/87J+//Oy - f//0s3//87J///Oyfv/zsn7/87J+//Oyf//zs4D/87KA//OygP/zsoD/8rKA//KygP/ys4D/8rOA//Kz - gP/ys3//9LR7//Szff/zs37/8LOA/+2yf//rsYD/67KA/+yygv/psYH/77eF//nGkv/vsXv/6J9o//Ge - Z//3nmb/+J5m//eeZv/1n2b/9J9m//KgZv/0nmf/8Jxm/9OCRP+oVw3/qlcG/59TCf+MUxv/uJNonwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADq1brIlGU4/51SFv+qUgn/rFUG/6dW - DP+eTxT/tGou/+WdYf/zr3X/9LJ6//i4gf/ysn//8bF///KygP/0sn7/+LN9//izff/4s33/+LN9//iz - ff/4s33/+LN9//izff/1s33/9LN8//SzfP/0s3z/9LN8//SzfP/0s3z/9LN8//SzfP/0s3z/9bN8//Wz - fP/1s3z/9rN8//ezfP/3s3z/9rN8//WzfP/1s3z/9rN9//Wyff/1sn3/9bJ9//Wyff/1sn3/9LJ8//Sy - fP/0snz/9LJ8//SyfP/0sX7/9LB9//Swff/0sXz/9LF8//SxfP/0sXz/9rJ9//ayff/0sn7/9LN///Sy - fv/0sn7/9LJ+//Wyf//1s4D/9LOA//SzgP/2s4D/9bJ///Wyf//1sn//9bJ///Wyf//0sX7/9bJ///Wy - f//1s3//9LJ///Syf//0sn//9LJ///Syf//0sn7/9LJ+//Syfv/0sn7/9LJ+//Kxfv/ysX7/8rF+//Kx - fv/ysX7/9LJ+//Syfv/0sn7/9LJ+//Syff/0s33/9LN9//Szff/0s33/9LN9//Szff/0s33/9LN9//S0 - ff/0s33/9LN9//Syff/0sn3/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9LJ+//Syfv/0sn3/9LJ9//Sy - fv/0sn3/9LJ9//Syff/0sn3/9LJ9//Syfv/0sn7/9LJ9//Syff/0sn3/9LJ9//Syff/0sn3/9LJ9//Sz - ff/0s33/9LN9//Szff/0s33/9LN9//Szff/0s33/9LN9//Szff/0sn3/9LJ+//Syfv/0sn7/9LJ+//Kx - ff/ysX3/8rF+//Kxfv/ysX7/9LJ///Syf//0sn//9LJ///Syf//0s3//9LJ///Syf//0sn//9LF///Wy - gP/1soD/9bKA//eygf/2soD/9bKA//WygP/1soD/9LF///Syfv/0sn7/9LJ+//Syfv/0sn7/9bJ///Sy - f//0sn//9LJ+//Sxff/0sX3/9LB9//Swff/0sH3/9bF9//Sxfv/0sX7/9bF+//Swff/0sX7/9bJ9//Wy - ff/1sn3/9bJ9//Wyff/1sn3/9bJ9//Wyff/1sn3/9bN9//Wzfv/1s37/9bN9//Szff/0s33/9LN+//Sz - fv/0s37/9LR8//S0ev/ztHv/8bN9/++zfv/ss4H/7bWD/+y1hf/vvYz/+saY//jNoP/op3r/4p9v/+Wd - av/qnWj/8J9n//CfZv/xoGX/8qFk//KhZP/unWH/35FT/75vLP+qVQr/s1cF/6dSA/+YWRn/rINcxQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMOhfyajcEr/mVEc/6JU - D/+kUwr/qFEL/6VSDf+jVA//p10Z/7RuK//BfD3/1pFW//Src//8toH//LR8//ixeP/3sXj/+LF4//iz - ev/6s3v/+rN7//izev/4snn/+LJ4//iydv/5snb/+bJ2//mydv/4sXX/+LF1//ixdf/4sXX/+LF1//ix - df/5sXX/+bF1//mxdf/5sXX/+bF1//mxdf/5sXX/+bF1//mxdf/5sHb/+bB2//mwdv/5sHb/+bB2//mw - dv/5sHb/+bB2//mwdv/4sHb/9rF2//Wxdv/1snb/9bJ2//Wydv/1snb/9bJ2//Wydv/1snb/9bF2//Wx - d//0sXf/9LF3//Sxd//0sXf/9LF3//Sxd//0sXf/9LF3//eyd//3snf/97J3//eyd//3snf/97F2//ex - d//3sXf/+LF3//exd//0sXf/9LF3//Sxd//0sXf/9LF3//Wxd//1sXf/9bF3//ayeP/1sHj/9bB4//Ww - eP/2sXj/9rF4//Swd//0sHf/9LB3//WweP/1sHj/9bF3//Wxd//2snf/9rJ3//ayd//2snf/9rJ3//ay - d//2snf/9bJ3//Wyef/1snn/9bJ5//Wyef/0sXj/9LF4//SxeP/0sXj/9LF4//SxeP/0sXj/9LF4//Sx - eP/0sXj/9LF4//SxeP/0sXj/9LF4//SxeP/3sXn/9rF4//axeP/2sXj/9rF4//axeP/2sXj/9rF4//ax - eP/1sXf/9LJ3//Syd//0snf/9LF2//Sxdv/0sXf/9LF3//Sxd//0sXf/9LB3//WweP/2sXj/9rF4//ax - eP/1sHf/9LB3//WweP/1sHj/9bB4//ayd//1sXf/9LF3//Sxd//0sXf/9bF3//Sxd//0sXf/9LF3//Wx - d//3snf/97F3//exd//3sXf/97F3//exd//3sXf/97F3//ixd//0sXf/9LF3//Wxd//1sXf/9bF3//Sx - dv/0sXb/9LF3//Sxd//1sXf/9bF2//Wxdv/1sXb/9bF2//Wxdv/1sXb/9bF2//Wxdv/1sXf/+LB2//mw - dv/5sHb/+bB2//mwdv/4r3b/+K92//mwdv/5sHb/+rB2//uxd//7sXf//LJ4//yzef/9tHr/+rN5//q0 - ev/6tHr/+rR6//Szff/qtIT/6rSJ/+m1jf/vvZf/98ql//rTsP/8z67/576d/9eti//UoXz/1aB3/9eh - eP/cpHb/3qJv/+ejbf/qoGf/7p1i//GZYP/Vez7/u2Qg/6tYD/+qWAr/qlUH/6pVDP+UTxL/vZRs/wAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA47icJJ9u - RX2WYDD/lFAS/6VUC/+nVgz/p1QJ/6hVCv+mUwj/plQL/6RUDv+hUg3/olQS/6lfH/+tZCX/s2oq/7du - MP+5cDH/vHMz/7pxMv+4bzD/tWwt/7VrKv+2aSf/tGcl/7JmJP+wZCH/r2Mg/7BjIf+wYyH/sGMh/7Bj - If+wYyH/sWMh/7FjIf+xYyH/sWMh/7FjIf+xYyH/sWMh/7FjIf+xYyH/sWIh/7FiIf+xYiH/sWIh/7Fi - If+xYiH/sWIh/7FiIf+xYiH/sGIh/69jIP+vZCD/r2Qg/69kIP+vZCD/r2Qg/69jIf+vYyH/r2Mh/69j - If+vYyH/r2Mh/69jIf+vYyH/r2Mh/69jIf+vYyH/r2Mh/7BkIv+zZSP/s2Uj/7NlI/+zZSP/s2Uj/7Vn - Jv+1Zyb/tWcm/7ZoJ/+1aCf/tWgn/7VoJ/+2aSf/tmkn/7ZpJ/+2aSf/tmko/7dqKf+3ain/tmop/7Zq - Kv+3ayv/t2sr/7drK/+4ayz/uGss/7hrLP+4bCz/uGws/7hsLP+4bCz/uWwt/7ltLf+6bS3/uW0t/7lt - Lf+5bS3/uW0t/7ltLf+5bS7/uW0u/7ltLv+5bS7/uW0u/7puL/+6bi//um4v/7puL/+6bi//um4v/7pu - L/+6bi//um4v/7puL/+6bi//um4v/7puL/+6bi//um0u/7ptLv+6bS7/um0u/7ptLv+6bi//um0u/7pt - Lv+6bS7/uW0t/7ltLf+4bS3/uG0t/7htLf+4bCz/uGws/7hsLP+4bCz/uGws/7drK/+3ayv/t2sr/7dr - K/+3ayv/tmoq/7ZqKv+2aSr/tmkq/7VpKP+2aSj/tmkn/7ZpJ/+2aSf/tWgn/7VoJ/+1aCf/tWgn/7Vo - Jv+1ZyX/tWck/7RnI/+0ZiP/tGYj/7JlIf+yZSH/smUh/7JkIf+yZCH/sGMh/7BjIf+wYyH/sGMh/7Bj - If+wYyH/sGMh/7BjIf+wYyH/r2Mh/69jIP+vZCD/r2Qg/69kIP+vZCD/r2Qg/69kIP+vZCD/r2Mg/7Bi - If+xYiH/sWIh/7FiIf+xYiH/sGEg/7BiIf+yYyP/s2Uk/7VnJ/+3aCf/t2kp/7psLP+7bi3/vW8v/71w - L/++cS//vnIy/8B0M/++dTn/vX1G/8uLV//Tl2b/1KBx/9ajd//XpXr/1qN4/9aid//YoHb/2Z9z/9qf - cP/Ynmv/0pVd/8aHTP+8fDz/t28s/6hZFP+pUw//rlML/69TB/+vVAb/qlUI/51SEf+MUSH/soRgoAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA786ugah6S9+cYST/klIQ/6BWFP+iUg//q1UO/6tUDP+oVAj/plUJ/6JTCf+hUwv/olMP/6FT - Dv+hUw7/olQQ/6FSDv+hUg7/oFIO/6BSDf+gUg3/pFIL/6VSC/+lUwz/plML/6ZTCv+mUwv/plMM/6ZT - DP+mUwz/plML/6ZTC/+mUwv/plMM/6ZTDP+mUwz/plML/6ZTC/+mUwv/plMN/6VTDf+lUw3/pFMN/6RT - Df+kUw3/pVMN/6VTDf+lUw3/pFMN/6ZTDf+nVAr/qFML/6hTC/+oUwv/qFML/6hTC/+oUwz/qFMN/6hT - Df+oUw3/qFML/6hTC/+oUwv/qFMM/6hTDP+oUwz/qVQL/6pUDf+qVQ7/rFUO/6xVDv+tVQ//rVYP/61W - D/+tVhD/rVYQ/65XEP+uVxD/rlgQ/65YEf+uWBL/rlgS/65YEv+uWRH/r1kR/69ZEv+wWhT/sFoV/7Bb - Fv+xWhf/sVoX/7FbF/+yWxf/slsX/7JbF/+yXBf/slwY/7NcGP+zXBj/s1wY/7NdGf+0XRj/tF4Y/7Rd - GP+0XRn/tF0Z/7RdGf+0Xhj/tF4Y/7ReGP+0Xhn/tF4Z/7VfGf+2Xxv/tl8b/7ZfG/+2Xxv/tl8b/7Zf - G/+2Xxv/tl8b/7ZfG/+2Xxv/tl8b/7ZfG/+2Xxv/tl8b/7VfGv+1Xxr/tV4a/7VeGv+1Xhr/tV4a/7Re - Gv+0XRn/tF0Z/7RdGP+0XRj/s10Y/7NdGP+zXRj/s1wY/7NcGP+zXBj/s1wY/7JcF/+yWxf/slsX/7Jb - F/+yWxf/sVoX/7FaF/+xWhf/sFoV/7BaFf+wWhX/r1kR/65YEv+uWBL/rlgS/65YEf+tVxD/rVcQ/61X - EP+tVxD/rVYP/61XDf+tVg3/rFYN/6xWDf+rVA3/q1QL/6tUCv+rVAr/q1QN/6lTC/+pUgz/qVIL/6lS - C/+pUgv/qlMM/6pTDP+qUwz/qlML/6hTC/+oUwv/qFML/6hTC/+oUwv/qFML/6hTC/+oUwv/qFML/6dT - C/+mUwz/pFMN/6RTDf+kUw3/pVMN/6dTDv+mVA3/pVMN/6NSC/+jUQv/plMO/6ZTDf+mVA3/plMN/6ZT - Dv+oVA//pVMO/6RTDf+jUgv/pVML/6ZVDP+iUgv/oFIO/59TEP+dUhL/mlIR/5tREf+eUxH/nlEO/6JQ - Dv+kUBD/pFQQ/6JVDv+gUwr/oVcK/6JWCv+kVgf/plQF/6lVCP+mVAv/pU8N/5xRF/+eZzzt4cOpxQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAADouaILvpRlK8CZcqiabEL/iFEf/5RUHf+ZUhP/nFIN/6BUDv+gUgr/plQL/6hU - C/+nUwv/plMJ/6NQB/+mUgn/plMJ/6dUC/+oVAv/qFUL/6dSCf+oUwn/qVQL/6lUC/+pVAr/qVQL/6lU - C/+pVAv/qVQL/6lUC/+pVAv/qVQL/6lUC/+pVAv/qVQL/6lUC/+pVAv/qVQL/6lUC/+oVAv/qFQL/6hU - C/+oVAv/qFQL/6hUC/+oVAv/qFQL/6hUC/+oVAv/qVQI/6lUCP+pVAr/qVQL/6lUC/+pVAv/qVQL/6lT - C/+pUwv/qlML/6tTC/+rUwv/q1ML/6tTC/+rUwv/q1ML/6xUC/+sVAv/rVUL/61VC/+tVQv/rVUM/65W - Dv+uVg7/r1cO/69XDv+vVw//sFgQ/69YEP+uWBD/rlgQ/69ZEP+vWRD/r1kQ/69aEP+wWhL/sFoS/7Fb - Ev+xWxP/sVoU/7FaFP+xWhT/sVsU/7JcFf+yXBX/s1wW/7NcFv+zXBb/s10W/7NdFv+0Xhf/tF4X/7Re - GP+0Xhf/tF4X/7ReF/+0Xhf/tF4X/7VfGP+1Xxj/tV8Y/7VfGP+1Xxj/tl8Z/7ZfGf+2Xxn/tl8Z/7Zf - Gf+2Xxn/tl8Z/7ZfGf+2Xxn/tl8Z/7ZfGf+2Xxn/tl8Z/7ZfGf+2Xxn/tl8Z/7VfGf+1Xxj/tV4Y/7Ve - GP+0Xhf/tF4X/7RdFv+0Xhb/tF4X/7ReFv+0XRb/s10W/7NdFv+zXRb/s1wW/7NcFv+zXBb/slsU/7Jb - FP+xWxT/sVsU/7FaFP+xWhT/sVoU/7FaFP+wWhL/sFoS/69ZEP+vWRD/r1kQ/69ZEP+uWRD/rlkQ/65Y - EP+uWBD/rlgQ/65WDv+uVgv/rlYL/61VC/+tVQv/rFQL/6xUCf+sVAj/rFQI/6tTC/+rUwv/q1ML/6tT - C/+rUwv/q1ML/6xUC/+sVAv/rFQL/6xUC/+rUwv/qVML/6lUC/+pVAv/qVQL/6lUC/+pVAv/qVQL/6lU - C/+pVAv/qVQL/6hUC/+oVAv/qFQL/6hUC/+nUwj/p1QL/6dUC/+oVAv/qFUL/6pWDf+qVQ3/qVQL/6hU - C/+oUwn/qVQL/6pVC/+qVQv/rFUN/61WCv+uVgf/rFUK/6lUC/+nUw3/plMN/6dVDv+pVQ7/qFMJ/6lT - CP+rVgr/qlYJ/6tVCP+sVQj/rVQI/6lRCP+mUQj/pVQO/6BUDf+XUBD/i1Id/51rQP+1glpgzKOFGQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA99+/INi2lYKwh1yCzaNy/8GFTv+5dTr/uGos/7dj - Gv+vWg3/qFMG/6pUB/+rVQj/q1UJ/6pVCP+qVAj/qVQI/6lTBv+sVAz/rFQL/6xUC/+rUwv/q1ML/6xU - C/+sVAv/rFQL/6xUC/+rVAv/qlUL/6pVC/+qVQv/qlUL/6pVC/+qVQv/qlUL/6pVC/+qVQv/qlUL/6pV - C/+qVQv/qlUL/6pVC/+qVQv/qlUL/6pVC/+qVQv/qVUL/6hVC/+oVQv/qFUL/6hUC/+oVAv/qFQL/6hU - C/+oVA7/qFQO/6hUC/+oVQv/qFUL/6hVC/+oVQv/qFUL/6hVC/+nVAv/p1QL/6ZTCf+nVAv/p1QL/6hV - C/+pVgv/qVYM/6lWC/+pVgv/qVYN/6pWDv+rWA7/q1gO/6tYDv+rWA7/rFkQ/6xZEP+sWRD/rFkQ/61a - EP+tWhD/rVkR/61ZEv+tWRL/rVkS/65aEv+vWxT/r1sU/69bFP+vWxT/r1wU/7BcFP+wXBT/sF0V/7Fd - Fv+xXRb/sV0W/7FdFv+xXRb/sV0W/7BdFv+wXxj/sF8Y/7BfGP+wXxj/sF8Y/7BfGP+wXxj/sF8Y/7Bf - GP+wXxj/sF8Y/7BfGP+wXxj/sF8Y/7BfGP+wXxj/sF8Y/7BfGP+wXxj/sl4W/7JeFv+xXhb/sV4W/7Fe - Fv+yXhb/sV0W/7FdFv+xXRb/sF0W/69eFv+vXhb/rl0V/65dFP+uXRT/rl0U/61cFP+tXBT/rVwU/65b - FP+uWhL/rloS/65aEv+tWRL/rVkS/61ZEv+tWRL/rFgQ/6xYEP+sWRD/rFkQ/6xZEP+rWA7/q1gO/6tY - Dv+rWA7/qlYO/6pWDv+pVgz/qVUM/6lUDP+oVAz/qFQM/6hUC/+oVAv/p1QL/6dUC/+nUwv/qVUL/6lV - C/+pVQv/qVUL/6lVC/+pVQv/qVUL/6lVC/+pVQv/qFUL/6hVC/+oVQv/qFUL/6hVC/+oVQv/qFUL/6hV - C/+oVQv/qFUL/6lVC/+qVQv/qlUL/6pVC/+qVQv/qlUL/6pVDP+qVQv/qlUL/6pVC/+nVAb/p1MI/6lU - CP+qVQj/qlUJ/6xVCP+rVAj/q1QI/6xUCf+tVAn/rVQJ/6tSC/+oUQ3/qFIP/6dTD/+lUgz/p1IL/6pT - Cv+sVAj/p1QK/6RUC/+pUgz/rVIN/65SEv+uVxz/r2Ep/7BvOv/Ai1j/sodVn8qriYIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAf///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//+AAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH+AAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//AAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//8A - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - H///+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////8= - - - diff --git a/MinecraftClientGUI/MinecraftClient.cs b/MinecraftClientGUI/MinecraftClient.cs deleted file mode 100644 index fb070136fe..0000000000 --- a/MinecraftClientGUI/MinecraftClient.cs +++ /dev/null @@ -1,164 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.IO; -using System.Diagnostics; -using System.Threading; - -namespace MinecraftClientGUI -{ - /// - /// This class acts as a wrapper for MinecraftClient.exe - /// Allows the rest of the program to consider this class as the Minecraft client itself. - /// - - class MinecraftClient - { - public static string ExePath = "MinecraftClient.exe"; - public bool Disconnected { get { return disconnected; } } - - private LinkedList OutputBuffer = new LinkedList(); - private LinkedList tabAutoCompleteBuffer = new LinkedList(); - private bool disconnected = false; - private Process Client; - private Thread Reader; - - public MinecraftClient(string[] args) - { - initClient("\"" + String.Join("\" \"", args) + "\" BasicIO"); - } - - public MinecraftClient(string username, string password, string serverip) - { - // If the password is empty, pass an empty string to support Microsoft/Browser login - if (password == null) password = ""; - initClient('"' + username + "\" \"" + password + "\" \"" + serverip + "\" BasicIO"); - } - - private void initClient(string arguments) - { - if (File.Exists(ExePath)) - { - Client = new Process(); - Client.StartInfo.FileName = ExePath; - Client.StartInfo.Arguments = arguments; - Client.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; - - // FIX: Forcing UTF-8 fixes Polish characters and colors - Client.StartInfo.StandardOutputEncoding = System.Text.Encoding.UTF8; - - Client.StartInfo.UseShellExecute = false; - Client.StartInfo.RedirectStandardOutput = true; - Client.StartInfo.RedirectStandardInput = true; - Client.StartInfo.CreateNoWindow = true; - Client.Start(); - - Reader = new Thread(new ThreadStart(t_reader)); - Reader.Start(); - } - else throw new FileNotFoundException("Nie znaleziono pliku MinecraftClient.exe!", ExePath); - } - - private void t_reader() - { - while (true) - { - try - { - if (Client.HasExited) { disconnected = true; break; } - - string line = Client.StandardOutput.ReadLine(); - if (line != null) - { - if (line.Trim() != "") - { - if (line.Contains("Server was successfuly joined")) { disconnected = false; } - if (line.Contains("You have left the server")) { disconnected = true; } - - if (line.Length > 0 && line[0] == (char)0x00) - { - string[] command = line.Substring(1).Split((char)0x00); - if (command[0].ToLower() == "autocomplete") - { - if (command.Length > 1) { tabAutoCompleteBuffer.AddLast(command[1]); } - else tabAutoCompleteBuffer.AddLast(""); - } - } - else - { - OutputBuffer.AddLast(line); - } - } - } - else { Thread.Sleep(10); } // Small pause to avoid overloading the CPU - } - catch (Exception) { break; } - } - } - - public string ReadLine() - { - while (OutputBuffer.Count < 1) - { - if (disconnected) return ""; - Thread.Sleep(10); // Save CPU while waiting for data - } - string line = OutputBuffer.First.Value; - OutputBuffer.RemoveFirst(); - return line; - } - - public string tabAutoComplete(string text_behindcursor) - { - tabAutoCompleteBuffer.Clear(); - if (text_behindcursor != null && text_behindcursor.Trim().Length > 0) - { - text_behindcursor = text_behindcursor.Trim(); - SendText((char)0x00 + "autocomplete" + (char)0x00 + text_behindcursor); - int maxwait = 30; - while (tabAutoCompleteBuffer.Count < 1 && maxwait > 0) - { - Thread.Sleep(100); - maxwait--; - } - if (tabAutoCompleteBuffer.Count > 0) - { - string text_completed = tabAutoCompleteBuffer.First.Value; - tabAutoCompleteBuffer.RemoveFirst(); - return text_completed; - } - else return text_behindcursor; - } - else return ""; - } - - public void SendText(string text) - { - if (text != null && !Client.HasExited) - { - text = text.Replace("\t", ""); - text = text.Replace("\r", ""); - text = text.Replace("\n", ""); - text = text.Trim(); - if (text.Length > 0) - { - Client.StandardInput.WriteLine(text); - } - } - } - - public void Close() - { - if (!Client.HasExited) - { - Client.StandardInput.WriteLine("/quit"); - if (Reader.IsAlive) { Reader.Abort(); } - if (!Client.WaitForExit(2000)) - { - try { Client.Kill(); } catch { } - } - } - } - } -} diff --git a/MinecraftClientGUI/MinecraftClientGUI.csproj b/MinecraftClientGUI/MinecraftClientGUI.csproj deleted file mode 100644 index 1066164e44..0000000000 --- a/MinecraftClientGUI/MinecraftClientGUI.csproj +++ /dev/null @@ -1,140 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {B9E600B3-C8F0-4BF8-85E1-C164956B0B0D} - WinExe - Properties - MinecraftClientGUI - MinecraftClientGUI - v4.8 - - - 512 - false - C:\Users\Admin\Desktop\publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 3 - 1.0.0.%2a - false - true - true - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - - AppIcon.ico - - - 4C76A63F11DB91E010AF3039521927BEB537A320 - - - MinecraftClientGUI_TemporaryKey.pfx - - - true - - - true - - - - - - - - - - - - - - - - Form - - - Form1.cs - - - - - - Form1.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - - - - False - Microsoft .NET Framework 4.8 %28x86 i x64%29 - true - - - False - .NET Framework 3.5 SP1 - false - - - - - diff --git a/MinecraftClientGUI/Program.cs b/MinecraftClientGUI/Program.cs deleted file mode 100644 index dd0801981b..0000000000 --- a/MinecraftClientGUI/Program.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Diagnostics; -using System.Windows.Forms; - -namespace MinecraftClientGUI -{ - static class Program - { - private const string ReleasesUrl = "https://github.com/MCCTeam/Minecraft-Console-Client/releases"; - - /// - /// Minecraft Console Client GUI by ORelio (c) 2013. - /// Allows to use Minecraft Console Client in a more user friendly interface - /// This source code is released under the CDDL 1.0 License. - /// - - [STAThread] - static void Main(string[] args) - { - if (!System.IO.File.Exists(MinecraftClient.ExePath)) - { - DialogResult result = MessageBox.Show( - "File not found: " + MinecraftClient.ExePath + Environment.NewLine + Environment.NewLine - + "Place MinecraftClient.exe in the same folder as MinecraftClientGUI.exe." + Environment.NewLine + Environment.NewLine - + "Download MinecraftClient.exe from:" + Environment.NewLine - + ReleasesUrl + Environment.NewLine + Environment.NewLine - + "Open the releases page now?", - "Minecraft client not found", - MessageBoxButtons.YesNo, - MessageBoxIcon.Error); - - if (result == DialogResult.Yes) - { - try - { - Process.Start(new ProcessStartInfo(ReleasesUrl) { UseShellExecute = true }); - } - catch - { - } - } - } - else - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new Form1(args)); - } - } - } -} diff --git a/MinecraftClientGUI/Properties/AssemblyInfo.cs b/MinecraftClientGUI/Properties/AssemblyInfo.cs deleted file mode 100644 index c4781f226f..0000000000 --- a/MinecraftClientGUI/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("MinecraftClientGUI")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("MinecraftClientGUI")] -[assembly: AssemblyCopyright("Copyright © ORelio 2013")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("fc338f38-8ee7-49d8-afca-546a938daa90")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("1.0.0")] diff --git a/MinecraftClientGUI/Properties/Resources.Designer.cs b/MinecraftClientGUI/Properties/Resources.Designer.cs deleted file mode 100644 index a32a90afef..0000000000 --- a/MinecraftClientGUI/Properties/Resources.Designer.cs +++ /dev/null @@ -1,63 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace MinecraftClientGUI.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "18.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MinecraftClientGUI.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - } -} diff --git a/MinecraftClientGUI/Properties/Resources.resx b/MinecraftClientGUI/Properties/Resources.resx deleted file mode 100644 index af7dbebbac..0000000000 --- a/MinecraftClientGUI/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/MinecraftClientGUI/Properties/Settings.Designer.cs b/MinecraftClientGUI/Properties/Settings.Designer.cs deleted file mode 100644 index e41b85837a..0000000000 --- a/MinecraftClientGUI/Properties/Settings.Designer.cs +++ /dev/null @@ -1,26 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace MinecraftClientGUI.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.14.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - } -} diff --git a/MinecraftClientGUI/Properties/Settings.settings b/MinecraftClientGUI/Properties/Settings.settings deleted file mode 100644 index 39645652af..0000000000 --- a/MinecraftClientGUI/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/MinecraftClientGUI/app.config b/MinecraftClientGUI/app.config deleted file mode 100644 index 3e0e37cfc8..0000000000 --- a/MinecraftClientGUI/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/MinecraftClientGUI/screenshot.png b/MinecraftClientGUI/screenshot.png deleted file mode 100644 index 6684c44336..0000000000 Binary files a/MinecraftClientGUI/screenshot.png and /dev/null differ diff --git a/NuGet.Config b/NuGet.Config new file mode 100644 index 0000000000..a57960c973 --- /dev/null +++ b/NuGet.Config @@ -0,0 +1,2 @@ + + diff --git a/NuGet.Local.Config b/NuGet.Local.Config new file mode 100644 index 0000000000..5412e1b2e8 --- /dev/null +++ b/NuGet.Local.Config @@ -0,0 +1,2 @@ + + diff --git a/README.md b/README.md index ca49f033cc..28a7a23814 100644 --- a/README.md +++ b/README.md @@ -1,114 +1,125 @@
-Logo +Minecraft Console Client logo -# Minecraft Console Client (MCC) +# Minecraft Console Client 2.0 (MCC) -[Documentation](https://mccteam.github.io/) | [Download](#download) | [Installation](https://mccteam.github.io/guide/installation.html) | [Configuration](https://mccteam.github.io/guide/configuration.html) | [Usage](https://mccteam.github.io/guide/usage.html) +[Documentation](docs/index.md) | [Download](#download) | [Installation](docs/getting-started/installation.md) | [Configuration](docs/client/configuration.md) | [Usage](docs/getting-started/first-session.md) -
- -
- -[English](https://github.com/MCCTeam/Minecraft-Console-Client/blob/master/README.md) | [Nederlands](https://github.com/MCCTeam/MCCTeam.github.io/blob/master/MCC-README/README-Dutch.md) | [Русский](https://github.com/MCCTeam/MCCTeam.github.io/blob/master/MCC-README/README-Russian.md) | [Српски](https://github.com/MCCTeam/MCCTeam.github.io/blob/master/MCC-README/README-Serbian_Cyrillic.md) | [Türkçe](https://github.com/MCCTeam/MCCTeam.github.io/blob/master/MCC-README/README-Turkish.md) | [Tiếng Việt](https://github.com/MCCTeam/MCCTeam.github.io/blob/master/MCC-README/README-Vietnamese.md) | [简体中文](https://github.com/MCCTeam/MCCTeam.github.io/blob/master/MCC-README/README-Chinese_Simplified.md) | [繁體中文](https://github.com/MCCTeam/MCCTeam.github.io/blob/master/MCC-README/README-Chinese_Traditional.md) +[![Build and tests](https://github.com/MCCTeam/Minecraft-Console-Client/actions/workflows/mcc.yml/badge.svg)](https://github.com/MCCTeam/Minecraft-Console-Client/actions/workflows/mcc.yml) +[![Discord](https://img.shields.io/discord/1018553894831403028?color=5865F2&logo=discord&logoColor=white)](https://discord.gg/sfBv4TtpC9) +[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE.md) +[![.NET 10](https://img.shields.io/badge/.NET-10-512BD4)](https://dotnet.microsoft.com/en-us/download/dotnet/10.0)
-
- -[![GitHub Actions build status](https://github.com/MCCTeam/Minecraft-Console-Client/actions/workflows/build-and-release.yml/badge.svg)](https://github.com/MCCTeam/Minecraft-Console-Client/releases/latest) Discord server +> [!WARNING] +> MCC 2.0 is an early development build. Features can change. Keep a copy of your configuration before an update. -
+## About -> [!IMPORTANT] -> ## 📢 Major News -> -> After 13 years of active development, we are rewriting MCC from the ground up to make development faster and enable powerful new features. The rewrite is currently being led by [@milutinke](https://github.com/milutinke). Along the refactoring, the client is being polished, the UX and UI are being improved, new features are being added and existing ones improved. ✨ -> -> **Update (29.09.2026)** The early access build (No. 10) for the 2.0 client is available for download: [here](https://github.com/MCCTeam/Minecraft-Console-Client/releases/tag/MCC-2.0-early-access-build-10) -> -> Please leave feedback on Discord. -> -> After the release of the Minecraft Console Client 2.0, the old client will remain available to use but will no longer be updated. The new client is expected for public testing in the coming weeks. 🚀 -> -> Follow progress in [#🚀refactor-updates](https://discord.com/channels/1018553894831403028/1543210248439992461) on our [Discord server](https://discord.gg/sfBv4TtpC9)! +**Minecraft Console Client (MCC)** is an open-source terminal client for **Minecraft Java Edition**. Connect to servers, send chat and commands, and automate tasks without opening the graphical Minecraft client. -## **About ℹ️** +MCC runs on Windows, Linux, and macOS. Choose the classic console or the terminal UI (TUI). -**Minecraft Console Client (MCC)** is a lightweight cross-platform open-source Minecraft TUI client for **Java** edition that allows you to connect to any Minecraft Java server, send commands and receive text messages in a fast and easy way without having to open the main Minecraft game. +- Manage accounts, saved servers, and reconnect settings. +- Inspect players, entities, inventories, and world data. +- Use the TUI's menus, inventory views, maps, and entity browser. +- Automate tasks with Beacon `.bcn` scripts and plugins. +- Install source or compiled plugins from versioned marketplaces. +- Run unattended with file input or Docker Compose. ## Download -Get the latest release from the [Releases section](https://github.com/MCCTeam/Minecraft-Console-Client/releases/latest). +Find published builds in the [Releases section](https://github.com/MCCTeam/Minecraft-Console-Client/releases). Follow the [MCC 2.0 installation guide](docs/getting-started/installation.md) to choose your platform and start the client. + +This checkout contains the new MCC 2.0 CLI. Its installers require matching MCC 2.0 release archives. Until those archives are published, [build this checkout from source](#building-from-source). Older builds can use different configuration and plugin formats. -## Quick Install ⚡ +## Quick install -Open a terminal in the folder where you want MCC and run: +Once matching MCC 2.0 assets and the updated installers are published, download the installer for your platform. -Linux / macOS: +Linux or macOS, with [Python](https://www.python.org/downloads/) 3.10 or later: ```bash -curl -fsSL https://mccteam.github.io/install.sh | sh +curl -fsSLo install.sh https://mccteam.github.io/install.sh +sh install.sh ``` -Windows (PowerShell): +Windows PowerShell: ```powershell -iwr -useb https://mccteam.github.io/install.ps1 | iex +Invoke-WebRequest -UseBasicParsing https://mccteam.github.io/install.ps1 -OutFile install.ps1 +.\install.ps1 ``` -The script detects your architecture and downloads the right binary. For more options (including `wget` and manual downloads), see the [installation guide](https://mccteam.github.io/guide/installation.html). +The new installer selects one archive for your platform, checks its SHA-256 checksum, and keeps your existing configuration and plugin data. See [installation](docs/getting-started/installation.md) for manual downloads, version selection, and other options. + +## How to use + +- [Full documentation](docs/index.md) +- [Your first session](docs/getting-started/first-session.md) +- [Configuration](docs/client/configuration.md) +- [Command reference](docs/commands/index.md) +- [Beacon scripts and step-by-step tutorial](docs/beacon/index.md) +- [Official plugins and plugin development](docs/plugins/index.md) +- [Using and creating marketplaces](docs/marketplaces/index.md) +- [Docker Compose](docs/deployment/docker.md) -## How to use 📚 +The [official Marketplace](https://github.com/MCCTeam/Marketplace) is registered by default. Try `/plugins search fishing in official`, then `/plugins install auto-fishing@official`. Read the plugin manual to configure it. Automatic updates start off; existing marketplace choices are preserved. -- 🌐 [Full Documentation](https://mccteam.github.io/) -- 📦 [Installation](https://mccteam.github.io/guide/installation.html) -- 📖 [Usage](https://mccteam.github.io/guide/usage.html) -- ⚙️ [Configuration](https://mccteam.github.io/guide/configuration.html) -- 🤖 [Chat Bots](https://mccteam.github.io/guide/chat-bots.html) -- 📝 [Sample configuration files](MinecraftClient/config/) +## Getting help -## Getting Help 🙋 +Read the documentation and search existing [Discussions](https://github.com/MCCTeam/Minecraft-Console-Client/discussions). If you need help, open a [new discussion](https://github.com/MCCTeam/Minecraft-Console-Client/discussions/new). -Check out the [Website](https://mccteam.github.io/), [README](https://github.com/MCCTeam/Minecraft-Console-Client/tree/master/MinecraftClient/config#minecraft-console-client-user-manual) and existing [Discussions](https://github.com/MCCTeam/Minecraft-Console-Client/discussions): Maybe your question is answered there. If not, please open a [New Discussion](https://github.com/MCCTeam/Minecraft-Console-Client/discussions/new) and ask your question. If you find a bug, please report it in the [Issues](https://github.com/MCCTeam/Minecraft-Console-Client/issues) section. +Report bugs in [Issues](https://github.com/MCCTeam/Minecraft-Console-Client/issues). Include your MCC version, operating system, server version, and steps to reproduce the problem. Remove credentials from any files you share. ## Discord -We now have a Discord server, click [here](https://discord.gg/sfBv4TtpC9) to join. +Join the [MCC Discord server](https://discord.gg/sfBv4TtpC9) to ask questions, share scripts and plugins, and follow development. -## Helping Us ❤️ +## Helping us -We are a small community so we need help to implement upgrades for new Minecraft versions, fixing bugs and expanding the project. We are always looking for motivated people to contribute. If you feel like it could be you, please have a look at the [issues](https://github.com/MCCTeam/Minecraft-Console-Client/issues?q=is%3Aissue+is%3Aopen+label%3Awaiting-for%3Acontributor) section :) +You can help by testing MCC 2.0, reporting bugs, improving the documentation, translating, or writing plugins. Browse the [open issues](https://github.com/MCCTeam/Minecraft-Console-Client/issues) to find work that interests you. -## How to contribute 📝 +## How to contribute -If you'd like to contribute to Minecraft Console Client, great, just fork the repository and submit a pull request on the _Master_ branch. To contribute to the website / online documentation see also the [Website repository](https://github.com/MCCTeam/MCCTeam.github.io). +Fork the repository and submit a pull request. Read the [contribution guide](docs/contributing/index.md) for setup and checks. -![Alt](https://repobeats.axiom.co/api/embed/c8a6c7c47fde8fcbe3727a21eab46e6b39dff60d.svg "Repobeats analytics image") +MCC's documentation lives in this repository. The [Beacon tutorial](docs/beacon/guide/index.md) and [plugin tutorial](docs/plugins/development/tutorial/index.md) provide examples you can build on. -## Translating Minecraft Console Client 🌍 +The checkout includes [MCC Skills](https://github.com/MCCTeam/MCC-Skills) as a pinned submodule for agent-assisted development. Read the [skill guide](docs/contributing/agent-skills.md) for setup, available skills and `npx skills` installation in other projects. -To improve translations for MCC, please visit: [Crowdin - Minecraft Console Client](https://crowdin.com/project/minecraft-console-client). +## Translating MCC -## Building from the source 🏗️ +Help translate the client and its documentation through [Crowdin](https://crowdin.com/project/minecraft-console-client). Read the [translation guide](docs/contributing/translations.md) for resource files, placeholders, and documentation fallback. -This section has been moved to our new [Documentation website](https://mccteam.github.io/guide/installation.html#building-from-the-source-code). +## Building from source -## License ⚖️ +Install the [.NET SDK](https://dotnet.microsoft.com/en-us/download/dotnet/10.0) selected by `global.json`, currently `10.0.401`, and [Git](https://git-scm.com/downloads/). -Unless specifically stated, the code is from the MCC Team or Contributors, and available under CDDL-1.0. Else, the license and original author are mentioned in source file headers. -The main terms of the CDDL-1.0 license are basically the following: +On Linux, macOS, or Windows with WSL: -- You may use the licensed code in whole or in part in any program you desire, regardless of the license of the program as a whole (or rather, as excluding the code you are borrowing). The program itself may be open or closed source, free or commercial. -- However, in all cases, any modifications, improvements, or additions to the CDDL code (any code that is referenced in direct modifications to the CDDL code is considered an addition to the CDDL code, and so is bound by this requirement; e.g. a modification of a math function to use a fast lookup table makes that table itself an addition to the CDDL code, regardless of whether it's in a source code file of its own) must be made publicly and freely available in source, under the CDDL license itself. -- In any program (source or binary) that uses CDDL code, recognition must be given to the source (either project or author) of the CDDL code. As well, modifications to the CDDL code (which must be distributed as source) may not remove notices indicating the ancestry of the code. +```bash +git submodule update --init ConsoleInteractive MCC-Skills +source tools/mcc-env.sh +mcc-build +mcc-test +mcc-run --help +``` -More info at http://qstuff.blogspot.fr/2007/04/why-cddl.html -Full license at http://opensource.org/licenses/CDDL-1.0 +For Windows development, we recommend [WSL](docs/contributing/windows.md#recommended-wsl). Native PowerShell helpers are available in [tools/windows](tools/windows/README.md): -## Uses technologies from -
- - Sentry - -
+```powershell +.\tools\windows\build.ps1 +.\tools\windows\test.ps1 +.\tools\windows\run.ps1 -ClientArguments @('--help') +``` + +See [building from source](docs/getting-started/installation.md#build-the-development-branch) for runtime folders, publishing, and platform requirements. The [Windows guide](docs/contributing/windows.md) covers both WSL and native PowerShell. + +Read the [source architecture guide](src/README.md) for the project layout and runtime flow. + +## License + +MCC 2.0 uses the [MIT license](LICENSE.md). External dependencies retain their own licenses. diff --git a/compose.yml b/compose.yml new file mode 100644 index 0000000000..3546cef94a --- /dev/null +++ b/compose.yml @@ -0,0 +1,20 @@ +services: + mcc: + build: + context: . + dockerfile: Dockerfile + image: mcc:2.0-local + init: true + stdin_open: true + tty: true + working_dir: /data + environment: + MCC_PLUGINS: /data/plugins + TERM: xterm-256color + volumes: + - mcc-data:/data + command: ["--configurations", "/data/configurations", "--console.General.ConsoleMode=classic"] + stop_grace_period: 15s + +volumes: + mcc-data: diff --git a/crowdin.yml b/crowdin.yml index 9d6bbe3a78..cfa5ccfb73 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -1,40 +1,34 @@ -"project_id_env": "CROWDIN_PROJECT_ID" -"api_token_env": "CROWDIN_PERSONAL_TOKEN" -"base_path": "./" -"preserve_hierarchy": true -"base_url": "https://api.crowdin.com" - -"files": [ - { - "source": "/MinecraftClient/Resources/Translations/Translations.resx", - "translation": "/MinecraftClient/Resources/Translations/Translations.%osx_code%.resx" - }, - { - "source": "/MinecraftClient/Resources/ConfigComments/ConfigComments.resx", - "translation": "/MinecraftClient/Resources/ConfigComments/ConfigComments.%osx_code%.resx" - }, - { - "source": "/MinecraftClient/Resources/AsciiArt/AsciiArt.resx", - "translation": "/MinecraftClient/Resources/AsciiArt/AsciiArt.%osx_code%.resx" - }, - { - "source": "/README.md", - "translation": "/docs/.vuepress/public/MCC-README/README-%language%.md" - }, - { - "source": "/docs/.vuepress/translations/en.json", - "translation": "/docs/.vuepress/translations/%osx_code%.json" - }, - { - "source": "/docs/README.md", - "translation": "/docs/l10n/%osx_code%/README.md" - }, - { - "source": "/docs/guide/*.md", - "translation": "/docs/l10n/%osx_code%/guide/%original_file_name%" - }, - { - "source": "/docs/guide/websocket/*.md", - "translation": "/docs/l10n/%osx_code%/guide/websocket/%original_file_name%" - } -] +{ + "project_id_env": "CROWDIN_PROJECT_ID", + "api_token_env": "CROWDIN_PERSONAL_TOKEN", + "base_path": "./", + "preserve_hierarchy": true, + "base_url": "https://api.crowdin.com", + "files": [ + { + "source": "/src/Mcc.Cli/Localization/Resources/MccStrings.resx", + "translation": "/src/Mcc.Cli/Localization/Resources/MccStrings.%locale%.resx" + }, + { + "source": "/src/Mcc.Cli/Resources/TextResources.resx", + "translation": "/src/Mcc.Cli/Resources/TextResources.%locale%.resx" + }, + { + "source": "/src/Mcc.Cli/Localization/Resources/ContainerArt.resx", + "translation": "/src/Mcc.Cli/Localization/Resources/ContainerArt.%locale%.resx" + }, + { + "source": "/docs/**/*.md", + "translation": "/docs/l10n/%locale%/**/%original_file_name%", + "ignore": [ + "/docs/l10n/**", + "/docs/.vuepress/**", + "/docs/node_modules/**" + ] + }, + { + "source": "/docs/.vuepress/ui/en.json", + "translation": "/docs/.vuepress/ui/%locale%.json" + } + ] +} diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts index d03ff77ac4..b61024935e 100644 --- a/docs/.vuepress/config.ts +++ b/docs/.vuepress/config.ts @@ -1,168 +1,59 @@ -import process from 'node:process' - +import fs from 'node:fs' +import path from 'node:path' +import { fileURLToPath } from 'node:url' import { viteBundler } from '@vuepress/bundler-vite' -import { webpackBundler } from '@vuepress/bundler-webpack' -import { markdownChartPlugin } from '@vuepress/plugin-markdown-chart' -import { redirectPlugin } from '@vuepress/plugin-redirect' -import { searchPlugin } from '@vuepress/plugin-search' -import { shikiPlugin } from '@vuepress/plugin-shiki' import { defaultTheme } from '@vuepress/theme-default' +import { searchPlugin } from '@vuepress/plugin-search' +import { markdownChartPlugin } from '@vuepress/plugin-markdown-chart' import { defineUserConfig } from 'vuepress' -import type { Plugin } from 'vite' - -import { headConfig } from './configs/head.js' -import { mainConfig, defaultThemeConfig } from './configs/locales_config.js' - -const isProd = process.env.NODE_ENV === 'production' - -function vueTemplateTolerantPlugin(): Plugin { - let compilerSfc: typeof import('@vue/compiler-sfc') | undefined +const docsRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..') +const labels = JSON.parse(fs.readFileSync(path.join(docsRoot, '.vuepress/ui/en.json'), 'utf8')) +const groups = ['getting-started', 'client', 'commands', 'beacon', 'plugins', 'marketplaces', 'deployment', 'contributing', 'troubleshooting'] +function pages(folder: string): any[] { + if (!fs.existsSync(folder)) return [] + return fs.readdirSync(folder, { withFileTypes: true }) + .filter(item => item.name !== 'node_modules' && !item.name.startsWith('.')) + .sort((a, b) => a.name.localeCompare(b.name)) + .flatMap(item => { + const full = path.join(folder, item.name) + if (item.isDirectory()) return pages(full) + if (!item.name.endsWith('.md')) return [] + const content = fs.readFileSync(full, 'utf8') + const title = content.match(/^# (.+)$/m)?.[1] ?? item.name.replace(/\.md$/, '') + return [{ text: title, link: '/' + path.relative(docsRoot, full).replaceAll(path.sep, '/').replace(/\.md$/, '.html') }] + }) +} +function themeLocale(prefix: string, ui: Record): any { return { - name: 'vue-template-tolerant', - enforce: 'pre', - async transform(code, id) { - if (!id.endsWith('.html.vue') || !id.includes('/l10n/')) return - compilerSfc ??= await import('@vue/compiler-sfc') - const { errors } = compilerSfc.parse(code, { filename: id }) - if (errors.length === 0) return - - const lines = code.split('\n') - const mdPath = id - .replace(/\.vuepress\/\.temp\/pages\//, '') - .replace(/\.html\.vue$/, '.md') - - const yellow = '\x1b[33m' - const red = '\x1b[31m' - const dim = '\x1b[2m' - const cyan = '\x1b[36m' - const reset = '\x1b[0m' - - let output = `${yellow}[vue-template-tolerant]${reset} ${errors.length} error(s) in translation page (replaced with placeholder)\n` - output += ` ${dim}source:${reset} ${cyan}${mdPath}${reset}\n` - - for (const err of errors as any[]) { - const msg = err.message ?? String(err) - const loc = err.loc as { start: { line: number; column: number }; end: { line: number; column: number }; source?: string } | undefined - if (loc) { - output += `\n ${red}error${reset} ${msg}\n` - output += ` ${dim}at ${id}:${loc.start.line}:${loc.start.column}${reset}\n` - const startLine = Math.max(0, loc.start.line - 3) - const endLine = Math.min(lines.length, loc.start.line + 2) - for (let i = startLine; i < endLine; i++) { - const lineNum = String(i + 1).padStart(5) - const marker = i + 1 === loc.start.line ? `${red}>${reset}` : ' ' - const lineContent = lines[i].length > 200 ? lines[i].slice(0, 200) + '...' : lines[i] - output += ` ${marker} ${dim}${lineNum}${reset} | ${lineContent}\n` - if (i + 1 === loc.start.line) { - const col = loc.start.column - output += ` ${' '.repeat(5)} | ${' '.repeat(col)}${red}^${reset}\n` - } - } - } else { - output += `\n ${red}error${reset} ${msg}\n` - } - } - - console.warn(output) - return { - code: '', - map: null, - } - }, + selectLanguageName: ui.language, + navbar: groups.slice(0, 6).map(group => ({ text: ui[group] ?? labels[group], link: prefix + group + '/index.html' })), + sidebar: groups.map(group => ({ text: ui[group] ?? labels[group], collapsible: true, children: pages(path.join(docsRoot, prefix.slice(1), group)) })), + editLink: false, + contributors: false, + lastUpdated: false, + } +} +const locales: Record = { '/': { lang: 'en-US', title: 'MCC 2.0', description: 'Minecraft Console Client guides and reference' } } +const themeLocales: Record = { '/': themeLocale('/', labels) } +const translatedRoot = path.join(docsRoot, 'l10n') +if (fs.existsSync(translatedRoot)) { + for (const language of fs.readdirSync(translatedRoot)) { + if (!fs.existsSync(path.join(translatedRoot, language, 'index.md'))) continue + const prefix = '/l10n/' + language + '/' + const uiPath = path.join(docsRoot, '.vuepress/ui', language + '.json') + const ui = fs.existsSync(uiPath) ? { ...labels, ...JSON.parse(fs.readFileSync(uiPath, 'utf8')) } : { ...labels, language } + locales[prefix] = { lang: language, title: 'MCC 2.0', description: ui.description ?? locales['/'].description } + themeLocales[prefix] = themeLocale(prefix, ui) } } - export default defineUserConfig({ - // set site base to default value - base: '/', - - pagePatterns: ['**/*.md', '!.vuepress', '!node_modules', '!superpowers'], - - // extra tags in `` - head: headConfig, - - // site-level locales config - locales: mainConfig, - - // specify bundler via environment variable - bundler: - process.env.DOCS_BUNDLER === 'webpack' - ? webpackBundler() - : viteBundler({ - viteOptions: { - plugins: [vueTemplateTolerantPlugin()], - }, - }), - - // configure default theme - theme: defaultTheme({ - hostname: 'https://mccteam.github.io', - logo: '/images/MCC_logo.png', - repo: 'MCCTeam/Minecraft-Console-Client', - docsBranch: 'master', - docsDir: 'docs', - - // theme-level locales config - locales: defaultThemeConfig, - - themePlugins: { - // only enable git plugin in production mode - git: isProd, - // use shiki plugin in production mode instead - prismjs: !isProd, - seo: isProd - ? { - canonical: 'https://mccteam.github.io/', - } - : false, - sitemap: isProd - ? { - changefreq: 'weekly', - } - : false, - }, - }), - - // use plugins - plugins: [ - redirectPlugin({ - hostname: 'https://mccteam.github.io', - config: { - '/r/entity.html': 'https://github.com/MCCTeam/Minecraft-Console-Client/blob/master/MinecraftClient/Mapping/EntityType.cs', - '/r/entity/index.html': 'https://github.com/MCCTeam/Minecraft-Console-Client/blob/master/MinecraftClient/Mapping/EntityType.cs', - - '/r/item.html': 'https://github.com/MCCTeam/Minecraft-Console-Client/blob/master/MinecraftClient/Inventory/ItemType.cs', - '/r/item/index.html': 'https://github.com/MCCTeam/Minecraft-Console-Client/blob/master/MinecraftClient/Inventory/ItemType.cs', - - '/r/block.html': 'https://github.com/MCCTeam/Minecraft-Console-Client/blob/master/MinecraftClient/Mapping/Material.cs', - '/r/block/index.html': 'https://github.com/MCCTeam/Minecraft-Console-Client/blob/master/MinecraftClient/Mapping/Material.cs', - - '/r/l-code.html': 'https://github.com/MCCTeam/Minecraft-Console-Client/discussions/2239#discussion-4447461', - '/r/l-code/index.html': 'https://github.com/MCCTeam/Minecraft-Console-Client/discussions/2239#discussion-4447461', - - '/r/dc-fmt.html': 'https://www.writebots.com/discord-text-formatting/', - '/r/dc-fmt/index.html': 'https://www.writebots.com/discord-text-formatting/', - - '/r/tg-fmt.html': 'https://sendpulse.com/blog/telegram-text-formatting', - '/r/tg-fmt/index.html': 'https://sendpulse.com/blog/telegram-text-formatting', - }, - }), - - ...(isProd ? [shikiPlugin({ theme: 'dark-plus' })] : []), - - searchPlugin({ - maxSuggestions: 15, - hotKeys: ['s', '/'], - locales: { - '/': { - placeholder: 'Search', - }, - }, - }), - - markdownChartPlugin({ - mermaid: true, - }), - ], + base: process.env.DOCS_BASE ?? '/', + locales, + pagePatterns: ['**/*.md', '!.vuepress', '!node_modules'], + head: [['link', { rel: 'icon', href: '/icons/favicon-32x32.png' }]], + markdown: { component: false }, + bundler: viteBundler(), + theme: defaultTheme({ logo: '/images/MCC_logo.png', repo: 'MCCTeam/Minecraft-Console-Client', locales: themeLocales }), + plugins: [{ name: "mcc-literal-markdown", extendsMarkdown: (md) => { md.set({ html: false }) } }, searchPlugin({ maxSuggestions: 12 }), markdownChartPlugin({ mermaid: true })], }) diff --git a/docs/.vuepress/configs/gen_configs.py b/docs/.vuepress/configs/gen_configs.py deleted file mode 100644 index 2d7f2cdb9f..0000000000 --- a/docs/.vuepress/configs/gen_configs.py +++ /dev/null @@ -1,110 +0,0 @@ -import os - -LangNameMap = { - "af": "Afrikaans", - "ar": "اللغة العربية", - "ca": "Català", - "cs": " Čeština", - "da": "Dansk", - "de": "Deutsch", - "el": "Ελληνικά", - "en": "English", - "es": "Español", - "fi": "Suomi", - "fr": "Français", - "he": "עברית", - "hu": "Magyar", - "it": "Italiano", - "ja": "日本語", - "ko": "한국어", - "lv": "Latviešu", - "nl": "Nederlands", - "no": "Norsk", - "pl": "Polski", - "pt": "Português (Portugal)", - "pt-BR": "Português (Brasil)", - "ro": "Română", - "ru": "Русский", - "sr-Cyrl": "Српски (Cyrillic)", - "sv": "Svenska", - "tr": "Türkçe", - "uk": "Українська", - "vi": "Tiếng Việt", - "zh-Hans": "简体中文", - "zh-Hant": "繁體中文", -} - -print('Read ../translations/*.json') -LanguageCodeList = [ code.replace('.json', '') for code in os.listdir('../translations/') ] - -print('Read ./l10n_configs/config_templete.ts') -templete = "" -with open('./l10n_configs/config_templete.ts', 'r', encoding='utf-8') as file: - templete = file.read() - -for LanguageCode in LanguageCodeList: - content = templete - - content = content.replace("$LanguageName$", LangNameMap[LanguageCode], -1) - - content = content.replace("$LanguageCode$", LanguageCode, -1) - - content = content.replace("$LanguageCodeEscaped$", LanguageCode.replace('-', '_', -1), -1) - - if (LanguageCode == 'en'): - content = content.replace("$PathToPage$", '', -1) - else: - content = content.replace("$PathToPage$", '/l10n/' + LanguageCode, -1) - - print("Write ./l10n_configs/{}.ts".format(LanguageCode)) - - with open('./l10n_configs/{}.ts'.format(LanguageCode), 'w+', encoding='utf-8') as file: - file.write('/* This file is automatically generated by "gen_configs.py" */\n') - file.write(content) - -print("Write ./locales_config.ts") - -with open('./locales_config.ts', 'w+', encoding='utf-8') as file: - file.write('/* This file is automatically generated by "gen_configs.py" */\n') - file.write(r"import type { SiteLocaleConfig } from '@vuepress/shared'" + '\n') - file.write(r"import type { LocaleConfig } from '@vuepress/shared'" + '\n') - - file.write('\n') - - for LanguageCode in LanguageCodeList: - LanguageCodeEscaped = LanguageCode.replace('-', '_', -1) - file.write(r"import { mainConfig_") - file.write(LanguageCodeEscaped) - file.write(r", defaultThemeConfig_") - file.write(LanguageCodeEscaped) - file.write(r" } from './l10n_configs/") - file.write(LanguageCode) - file.write(".js'\n") - - file.write('\n') - - file.write(r"export const mainConfig: SiteLocaleConfig = {" + '\n') - for LanguageCode in LanguageCodeList: - file.write(r" '") - if (LanguageCode != 'en'): - file.write(r"/l10n/") - file.write(LanguageCode) - file.write(r"/': mainConfig_") - file.write(LanguageCode.replace('-', '_', -1)) - file.write(",\n") - file.write(r"}" + '\n') - - file.write('\n') - - file.write(r"export const defaultThemeConfig: LocaleConfig = {" + '\n') - for LanguageCode in LanguageCodeList: - file.write(r" '") - if (LanguageCode != 'en'): - file.write(r"/l10n/") - file.write(LanguageCode) - file.write(r"/': defaultThemeConfig_") - file.write(LanguageCode.replace('-', '_', -1)) - file.write(",\n") - file.write(r"}" + '\n') - -print("** Done! **") diff --git a/docs/.vuepress/configs/head.ts b/docs/.vuepress/configs/head.ts deleted file mode 100644 index 2873428d9d..0000000000 --- a/docs/.vuepress/configs/head.ts +++ /dev/null @@ -1,32 +0,0 @@ -import type { HeadConfig } from '@vuepress/core' - -export const headConfig: HeadConfig[] = [ - [ - 'link', - { - rel: 'icon', - type: 'image/png', - sizes: '16x16', - href: `/icons/favicon-16x16.png`, - }, - ], - [ - 'link', - { - rel: 'icon', - type: 'image/png', - sizes: '32x32', - href: `/icons/favicon-32x32.png`, - }, - ], - ['link', { rel: 'manifest', href: '/manifest.webmanifest' }], - ['meta', { name: 'application-name', content: 'MCC Doc' }], - ['meta', { name: 'apple-mobile-web-app-title', content: 'MCC Doc' }], - ['meta', { name: 'apple-mobile-web-app-status-bar-style', content: 'black' }], - [ - 'link', - { rel: 'apple-touch-icon', href: `/icons/apple-touch-icon.png` }, - ], - ['meta', { name: 'msapplication-TileColor', content: '#3eaf7c' }], - ['meta', { name: 'theme-color', content: '#3eaf7c' }], -] diff --git a/docs/.vuepress/configs/l10n_configs/af.ts b/docs/.vuepress/configs/l10n_configs/af.ts deleted file mode 100644 index 2b11ba60e2..0000000000 --- a/docs/.vuepress/configs/l10n_configs/af.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/af.json') - -export const mainConfig_af: SiteLocaleData = { - lang: 'af', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_af: DefaultThemeLocaleData = { - selectLanguageName: "Afrikaans", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/af/guide/", - activeMatch: "/l10n/af/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/af/guide/installation.md", - activeMatch: "/l10n/af/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/af/guide/usage.md", - activeMatch: "/l10n/af/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/af/guide/configuration.md", - activeMatch: "/l10n/af/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/af/guide/chat-bots.md", - activeMatch: "/l10n/af/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/af/guide/README.md", - "/l10n/af/guide/installation.md", - "/l10n/af/guide/usage.md", - "/l10n/af/guide/configuration.md", - "/l10n/af/guide/creating-text-script.md", - "/l10n/af/guide/chat-bots.md", - "/l10n/af/guide/creating-bots.md", - "/l10n/af/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/ar.ts b/docs/.vuepress/configs/l10n_configs/ar.ts deleted file mode 100644 index a08352b7fe..0000000000 --- a/docs/.vuepress/configs/l10n_configs/ar.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/ar.json') - -export const mainConfig_ar: SiteLocaleData = { - lang: 'ar', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_ar: DefaultThemeLocaleData = { - selectLanguageName: "اللغة العربية", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/ar/guide/", - activeMatch: "/l10n/ar/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/ar/guide/installation.md", - activeMatch: "/l10n/ar/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/ar/guide/usage.md", - activeMatch: "/l10n/ar/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/ar/guide/configuration.md", - activeMatch: "/l10n/ar/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/ar/guide/chat-bots.md", - activeMatch: "/l10n/ar/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/ar/guide/README.md", - "/l10n/ar/guide/installation.md", - "/l10n/ar/guide/usage.md", - "/l10n/ar/guide/configuration.md", - "/l10n/ar/guide/creating-text-script.md", - "/l10n/ar/guide/chat-bots.md", - "/l10n/ar/guide/creating-bots.md", - "/l10n/ar/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/ca.ts b/docs/.vuepress/configs/l10n_configs/ca.ts deleted file mode 100644 index 90ab4b2cc7..0000000000 --- a/docs/.vuepress/configs/l10n_configs/ca.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/ca.json') - -export const mainConfig_ca: SiteLocaleData = { - lang: 'ca', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_ca: DefaultThemeLocaleData = { - selectLanguageName: "Català", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/ca/guide/", - activeMatch: "/l10n/ca/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/ca/guide/installation.md", - activeMatch: "/l10n/ca/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/ca/guide/usage.md", - activeMatch: "/l10n/ca/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/ca/guide/configuration.md", - activeMatch: "/l10n/ca/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/ca/guide/chat-bots.md", - activeMatch: "/l10n/ca/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/ca/guide/README.md", - "/l10n/ca/guide/installation.md", - "/l10n/ca/guide/usage.md", - "/l10n/ca/guide/configuration.md", - "/l10n/ca/guide/creating-text-script.md", - "/l10n/ca/guide/chat-bots.md", - "/l10n/ca/guide/creating-bots.md", - "/l10n/ca/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/config_templete.ts b/docs/.vuepress/configs/l10n_configs/config_templete.ts deleted file mode 100644 index 3d817b5407..0000000000 --- a/docs/.vuepress/configs/l10n_configs/config_templete.ts +++ /dev/null @@ -1,85 +0,0 @@ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/$LanguageCode$.json') - -export const mainConfig_$LanguageCodeEscaped$: SiteLocaleData = { - lang: '$LanguageCode$', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_$LanguageCodeEscaped$: DefaultThemeLocaleData = { - selectLanguageName: "$LanguageName$", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "$PathToPage$/guide/", - activeMatch: "$PathToPage$/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "$PathToPage$/guide/installation.md", - activeMatch: "$PathToPage$/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "$PathToPage$/guide/usage.md", - activeMatch: "$PathToPage$/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "$PathToPage$/guide/configuration.md", - activeMatch: "$PathToPage$/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "$PathToPage$/guide/chat-bots.md", - activeMatch: "$PathToPage$/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "$PathToPage$/guide/README.md", - "$PathToPage$/guide/installation.md", - "$PathToPage$/guide/usage.md", - "$PathToPage$/guide/configuration.md", - "$PathToPage$/guide/creating-text-script.md", - "$PathToPage$/guide/chat-bots.md", - "$PathToPage$/guide/creating-bots.md", - "$PathToPage$/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/cs.ts b/docs/.vuepress/configs/l10n_configs/cs.ts deleted file mode 100644 index 14bb6893a2..0000000000 --- a/docs/.vuepress/configs/l10n_configs/cs.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/cs.json') - -export const mainConfig_cs: SiteLocaleData = { - lang: 'cs', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_cs: DefaultThemeLocaleData = { - selectLanguageName: " Čeština", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/cs/guide/", - activeMatch: "/l10n/cs/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/cs/guide/installation.md", - activeMatch: "/l10n/cs/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/cs/guide/usage.md", - activeMatch: "/l10n/cs/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/cs/guide/configuration.md", - activeMatch: "/l10n/cs/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/cs/guide/chat-bots.md", - activeMatch: "/l10n/cs/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/cs/guide/README.md", - "/l10n/cs/guide/installation.md", - "/l10n/cs/guide/usage.md", - "/l10n/cs/guide/configuration.md", - "/l10n/cs/guide/creating-text-script.md", - "/l10n/cs/guide/chat-bots.md", - "/l10n/cs/guide/creating-bots.md", - "/l10n/cs/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/da.ts b/docs/.vuepress/configs/l10n_configs/da.ts deleted file mode 100644 index 185a1b5c6a..0000000000 --- a/docs/.vuepress/configs/l10n_configs/da.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/da.json') - -export const mainConfig_da: SiteLocaleData = { - lang: 'da', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_da: DefaultThemeLocaleData = { - selectLanguageName: "Dansk", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/da/guide/", - activeMatch: "/l10n/da/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/da/guide/installation.md", - activeMatch: "/l10n/da/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/da/guide/usage.md", - activeMatch: "/l10n/da/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/da/guide/configuration.md", - activeMatch: "/l10n/da/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/da/guide/chat-bots.md", - activeMatch: "/l10n/da/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/da/guide/README.md", - "/l10n/da/guide/installation.md", - "/l10n/da/guide/usage.md", - "/l10n/da/guide/configuration.md", - "/l10n/da/guide/creating-text-script.md", - "/l10n/da/guide/chat-bots.md", - "/l10n/da/guide/creating-bots.md", - "/l10n/da/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/de.ts b/docs/.vuepress/configs/l10n_configs/de.ts deleted file mode 100644 index c151bcb8b7..0000000000 --- a/docs/.vuepress/configs/l10n_configs/de.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/de.json') - -export const mainConfig_de: SiteLocaleData = { - lang: 'de', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_de: DefaultThemeLocaleData = { - selectLanguageName: "Deutsch", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/de/guide/", - activeMatch: "/l10n/de/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/de/guide/installation.md", - activeMatch: "/l10n/de/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/de/guide/usage.md", - activeMatch: "/l10n/de/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/de/guide/configuration.md", - activeMatch: "/l10n/de/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/de/guide/chat-bots.md", - activeMatch: "/l10n/de/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/de/guide/README.md", - "/l10n/de/guide/installation.md", - "/l10n/de/guide/usage.md", - "/l10n/de/guide/configuration.md", - "/l10n/de/guide/creating-text-script.md", - "/l10n/de/guide/chat-bots.md", - "/l10n/de/guide/creating-bots.md", - "/l10n/de/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/el.ts b/docs/.vuepress/configs/l10n_configs/el.ts deleted file mode 100644 index 1885b04b25..0000000000 --- a/docs/.vuepress/configs/l10n_configs/el.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/el.json') - -export const mainConfig_el: SiteLocaleData = { - lang: 'el', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_el: DefaultThemeLocaleData = { - selectLanguageName: "Ελληνικά", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/el/guide/", - activeMatch: "/l10n/el/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/el/guide/installation.md", - activeMatch: "/l10n/el/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/el/guide/usage.md", - activeMatch: "/l10n/el/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/el/guide/configuration.md", - activeMatch: "/l10n/el/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/el/guide/chat-bots.md", - activeMatch: "/l10n/el/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/el/guide/README.md", - "/l10n/el/guide/installation.md", - "/l10n/el/guide/usage.md", - "/l10n/el/guide/configuration.md", - "/l10n/el/guide/creating-text-script.md", - "/l10n/el/guide/chat-bots.md", - "/l10n/el/guide/creating-bots.md", - "/l10n/el/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/en.ts b/docs/.vuepress/configs/l10n_configs/en.ts deleted file mode 100644 index d3ed87f60d..0000000000 --- a/docs/.vuepress/configs/l10n_configs/en.ts +++ /dev/null @@ -1,96 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/en.json') - -export const mainConfig_en: SiteLocaleData = { - lang: 'en', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_en: DefaultThemeLocaleData = { - selectLanguageName: "English", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/guide/", - activeMatch: "/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/guide/installation.md", - activeMatch: "/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/guide/usage.md", - activeMatch: "/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/guide/configuration.md", - activeMatch: "/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/guide/chat-bots.md", - activeMatch: "/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/guide/README.md", - "/guide/installation.md", - "/guide/usage.md", - "/guide/configuration.md", - "/guide/creating-text-script.md", - "/guide/chat-bots.md", - "/guide/creating-bots.md", - { - text: "WebSocket Bot", - collapsible: true, - children: [ - "/guide/websocket/README.md", - "/guide/websocket/Commands.md", - "/guide/websocket/Events.md", - ], - }, - "/guide/ai-assisted-development.md", - "/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/es.ts b/docs/.vuepress/configs/l10n_configs/es.ts deleted file mode 100644 index 3bfe0adc55..0000000000 --- a/docs/.vuepress/configs/l10n_configs/es.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/es.json') - -export const mainConfig_es: SiteLocaleData = { - lang: 'es', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_es: DefaultThemeLocaleData = { - selectLanguageName: "Español", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/es/guide/", - activeMatch: "/l10n/es/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/es/guide/installation.md", - activeMatch: "/l10n/es/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/es/guide/usage.md", - activeMatch: "/l10n/es/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/es/guide/configuration.md", - activeMatch: "/l10n/es/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/es/guide/chat-bots.md", - activeMatch: "/l10n/es/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/es/guide/README.md", - "/l10n/es/guide/installation.md", - "/l10n/es/guide/usage.md", - "/l10n/es/guide/configuration.md", - "/l10n/es/guide/creating-text-script.md", - "/l10n/es/guide/chat-bots.md", - "/l10n/es/guide/creating-bots.md", - "/l10n/es/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/fi.ts b/docs/.vuepress/configs/l10n_configs/fi.ts deleted file mode 100644 index 55f63c6571..0000000000 --- a/docs/.vuepress/configs/l10n_configs/fi.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/fi.json') - -export const mainConfig_fi: SiteLocaleData = { - lang: 'fi', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_fi: DefaultThemeLocaleData = { - selectLanguageName: "Suomi", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/fi/guide/", - activeMatch: "/l10n/fi/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/fi/guide/installation.md", - activeMatch: "/l10n/fi/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/fi/guide/usage.md", - activeMatch: "/l10n/fi/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/fi/guide/configuration.md", - activeMatch: "/l10n/fi/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/fi/guide/chat-bots.md", - activeMatch: "/l10n/fi/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/fi/guide/README.md", - "/l10n/fi/guide/installation.md", - "/l10n/fi/guide/usage.md", - "/l10n/fi/guide/configuration.md", - "/l10n/fi/guide/creating-text-script.md", - "/l10n/fi/guide/chat-bots.md", - "/l10n/fi/guide/creating-bots.md", - "/l10n/fi/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/fr.ts b/docs/.vuepress/configs/l10n_configs/fr.ts deleted file mode 100644 index daa39ecdd1..0000000000 --- a/docs/.vuepress/configs/l10n_configs/fr.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/fr.json') - -export const mainConfig_fr: SiteLocaleData = { - lang: 'fr', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_fr: DefaultThemeLocaleData = { - selectLanguageName: "Français", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/fr/guide/", - activeMatch: "/l10n/fr/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/fr/guide/installation.md", - activeMatch: "/l10n/fr/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/fr/guide/usage.md", - activeMatch: "/l10n/fr/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/fr/guide/configuration.md", - activeMatch: "/l10n/fr/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/fr/guide/chat-bots.md", - activeMatch: "/l10n/fr/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/fr/guide/README.md", - "/l10n/fr/guide/installation.md", - "/l10n/fr/guide/usage.md", - "/l10n/fr/guide/configuration.md", - "/l10n/fr/guide/creating-text-script.md", - "/l10n/fr/guide/chat-bots.md", - "/l10n/fr/guide/creating-bots.md", - "/l10n/fr/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/he.ts b/docs/.vuepress/configs/l10n_configs/he.ts deleted file mode 100644 index 1211da3650..0000000000 --- a/docs/.vuepress/configs/l10n_configs/he.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/he.json') - -export const mainConfig_he: SiteLocaleData = { - lang: 'he', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_he: DefaultThemeLocaleData = { - selectLanguageName: "עברית", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/he/guide/", - activeMatch: "/l10n/he/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/he/guide/installation.md", - activeMatch: "/l10n/he/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/he/guide/usage.md", - activeMatch: "/l10n/he/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/he/guide/configuration.md", - activeMatch: "/l10n/he/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/he/guide/chat-bots.md", - activeMatch: "/l10n/he/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/he/guide/README.md", - "/l10n/he/guide/installation.md", - "/l10n/he/guide/usage.md", - "/l10n/he/guide/configuration.md", - "/l10n/he/guide/creating-text-script.md", - "/l10n/he/guide/chat-bots.md", - "/l10n/he/guide/creating-bots.md", - "/l10n/he/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/hu.ts b/docs/.vuepress/configs/l10n_configs/hu.ts deleted file mode 100644 index a508580132..0000000000 --- a/docs/.vuepress/configs/l10n_configs/hu.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/hu.json') - -export const mainConfig_hu: SiteLocaleData = { - lang: 'hu', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_hu: DefaultThemeLocaleData = { - selectLanguageName: "Magyar", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/hu/guide/", - activeMatch: "/l10n/hu/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/hu/guide/installation.md", - activeMatch: "/l10n/hu/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/hu/guide/usage.md", - activeMatch: "/l10n/hu/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/hu/guide/configuration.md", - activeMatch: "/l10n/hu/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/hu/guide/chat-bots.md", - activeMatch: "/l10n/hu/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/hu/guide/README.md", - "/l10n/hu/guide/installation.md", - "/l10n/hu/guide/usage.md", - "/l10n/hu/guide/configuration.md", - "/l10n/hu/guide/creating-text-script.md", - "/l10n/hu/guide/chat-bots.md", - "/l10n/hu/guide/creating-bots.md", - "/l10n/hu/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/it.ts b/docs/.vuepress/configs/l10n_configs/it.ts deleted file mode 100644 index 1fb0788ee6..0000000000 --- a/docs/.vuepress/configs/l10n_configs/it.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/it.json') - -export const mainConfig_it: SiteLocaleData = { - lang: 'it', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_it: DefaultThemeLocaleData = { - selectLanguageName: "Italiano", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/it/guide/", - activeMatch: "/l10n/it/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/it/guide/installation.md", - activeMatch: "/l10n/it/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/it/guide/usage.md", - activeMatch: "/l10n/it/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/it/guide/configuration.md", - activeMatch: "/l10n/it/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/it/guide/chat-bots.md", - activeMatch: "/l10n/it/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/it/guide/README.md", - "/l10n/it/guide/installation.md", - "/l10n/it/guide/usage.md", - "/l10n/it/guide/configuration.md", - "/l10n/it/guide/creating-text-script.md", - "/l10n/it/guide/chat-bots.md", - "/l10n/it/guide/creating-bots.md", - "/l10n/it/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/ja.ts b/docs/.vuepress/configs/l10n_configs/ja.ts deleted file mode 100644 index 9e01426056..0000000000 --- a/docs/.vuepress/configs/l10n_configs/ja.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/ja.json') - -export const mainConfig_ja: SiteLocaleData = { - lang: 'ja', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_ja: DefaultThemeLocaleData = { - selectLanguageName: "日本語", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/ja/guide/", - activeMatch: "/l10n/ja/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/ja/guide/installation.md", - activeMatch: "/l10n/ja/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/ja/guide/usage.md", - activeMatch: "/l10n/ja/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/ja/guide/configuration.md", - activeMatch: "/l10n/ja/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/ja/guide/chat-bots.md", - activeMatch: "/l10n/ja/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/ja/guide/README.md", - "/l10n/ja/guide/installation.md", - "/l10n/ja/guide/usage.md", - "/l10n/ja/guide/configuration.md", - "/l10n/ja/guide/creating-text-script.md", - "/l10n/ja/guide/chat-bots.md", - "/l10n/ja/guide/creating-bots.md", - "/l10n/ja/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/ko.ts b/docs/.vuepress/configs/l10n_configs/ko.ts deleted file mode 100644 index fcb27fb0e6..0000000000 --- a/docs/.vuepress/configs/l10n_configs/ko.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/ko.json') - -export const mainConfig_ko: SiteLocaleData = { - lang: 'ko', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_ko: DefaultThemeLocaleData = { - selectLanguageName: "한국어", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/ko/guide/", - activeMatch: "/l10n/ko/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/ko/guide/installation.md", - activeMatch: "/l10n/ko/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/ko/guide/usage.md", - activeMatch: "/l10n/ko/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/ko/guide/configuration.md", - activeMatch: "/l10n/ko/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/ko/guide/chat-bots.md", - activeMatch: "/l10n/ko/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/ko/guide/README.md", - "/l10n/ko/guide/installation.md", - "/l10n/ko/guide/usage.md", - "/l10n/ko/guide/configuration.md", - "/l10n/ko/guide/creating-text-script.md", - "/l10n/ko/guide/chat-bots.md", - "/l10n/ko/guide/creating-bots.md", - "/l10n/ko/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/lv.ts b/docs/.vuepress/configs/l10n_configs/lv.ts deleted file mode 100644 index 8448d1a8fd..0000000000 --- a/docs/.vuepress/configs/l10n_configs/lv.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/lv.json') - -export const mainConfig_lv: SiteLocaleData = { - lang: 'lv', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_lv: DefaultThemeLocaleData = { - selectLanguageName: "Latviešu", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/lv/guide/", - activeMatch: "/l10n/lv/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/lv/guide/installation.md", - activeMatch: "/l10n/lv/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/lv/guide/usage.md", - activeMatch: "/l10n/lv/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/lv/guide/configuration.md", - activeMatch: "/l10n/lv/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/lv/guide/chat-bots.md", - activeMatch: "/l10n/lv/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/lv/guide/README.md", - "/l10n/lv/guide/installation.md", - "/l10n/lv/guide/usage.md", - "/l10n/lv/guide/configuration.md", - "/l10n/lv/guide/creating-text-script.md", - "/l10n/lv/guide/chat-bots.md", - "/l10n/lv/guide/creating-bots.md", - "/l10n/lv/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/nl.ts b/docs/.vuepress/configs/l10n_configs/nl.ts deleted file mode 100644 index d1c0dc2488..0000000000 --- a/docs/.vuepress/configs/l10n_configs/nl.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/nl.json') - -export const mainConfig_nl: SiteLocaleData = { - lang: 'nl', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_nl: DefaultThemeLocaleData = { - selectLanguageName: "Nederlands", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/nl/guide/", - activeMatch: "/l10n/nl/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/nl/guide/installation.md", - activeMatch: "/l10n/nl/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/nl/guide/usage.md", - activeMatch: "/l10n/nl/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/nl/guide/configuration.md", - activeMatch: "/l10n/nl/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/nl/guide/chat-bots.md", - activeMatch: "/l10n/nl/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/nl/guide/README.md", - "/l10n/nl/guide/installation.md", - "/l10n/nl/guide/usage.md", - "/l10n/nl/guide/configuration.md", - "/l10n/nl/guide/creating-text-script.md", - "/l10n/nl/guide/chat-bots.md", - "/l10n/nl/guide/creating-bots.md", - "/l10n/nl/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/no.ts b/docs/.vuepress/configs/l10n_configs/no.ts deleted file mode 100644 index 2b92c00f02..0000000000 --- a/docs/.vuepress/configs/l10n_configs/no.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/no.json') - -export const mainConfig_no: SiteLocaleData = { - lang: 'no', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_no: DefaultThemeLocaleData = { - selectLanguageName: "Norsk", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/no/guide/", - activeMatch: "/l10n/no/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/no/guide/installation.md", - activeMatch: "/l10n/no/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/no/guide/usage.md", - activeMatch: "/l10n/no/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/no/guide/configuration.md", - activeMatch: "/l10n/no/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/no/guide/chat-bots.md", - activeMatch: "/l10n/no/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/no/guide/README.md", - "/l10n/no/guide/installation.md", - "/l10n/no/guide/usage.md", - "/l10n/no/guide/configuration.md", - "/l10n/no/guide/creating-text-script.md", - "/l10n/no/guide/chat-bots.md", - "/l10n/no/guide/creating-bots.md", - "/l10n/no/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/pl.ts b/docs/.vuepress/configs/l10n_configs/pl.ts deleted file mode 100644 index 573ac16ba8..0000000000 --- a/docs/.vuepress/configs/l10n_configs/pl.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/pl.json') - -export const mainConfig_pl: SiteLocaleData = { - lang: 'pl', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_pl: DefaultThemeLocaleData = { - selectLanguageName: "Polski", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/pl/guide/", - activeMatch: "/l10n/pl/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/pl/guide/installation.md", - activeMatch: "/l10n/pl/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/pl/guide/usage.md", - activeMatch: "/l10n/pl/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/pl/guide/configuration.md", - activeMatch: "/l10n/pl/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/pl/guide/chat-bots.md", - activeMatch: "/l10n/pl/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/pl/guide/README.md", - "/l10n/pl/guide/installation.md", - "/l10n/pl/guide/usage.md", - "/l10n/pl/guide/configuration.md", - "/l10n/pl/guide/creating-text-script.md", - "/l10n/pl/guide/chat-bots.md", - "/l10n/pl/guide/creating-bots.md", - "/l10n/pl/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/pt-BR.ts b/docs/.vuepress/configs/l10n_configs/pt-BR.ts deleted file mode 100644 index 3d423d4468..0000000000 --- a/docs/.vuepress/configs/l10n_configs/pt-BR.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/pt-BR.json') - -export const mainConfig_pt_BR: SiteLocaleData = { - lang: 'pt-BR', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_pt_BR: DefaultThemeLocaleData = { - selectLanguageName: "Português (Brasil)", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/pt-BR/guide/", - activeMatch: "/l10n/pt-BR/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/pt-BR/guide/installation.md", - activeMatch: "/l10n/pt-BR/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/pt-BR/guide/usage.md", - activeMatch: "/l10n/pt-BR/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/pt-BR/guide/configuration.md", - activeMatch: "/l10n/pt-BR/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/pt-BR/guide/chat-bots.md", - activeMatch: "/l10n/pt-BR/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/pt-BR/guide/README.md", - "/l10n/pt-BR/guide/installation.md", - "/l10n/pt-BR/guide/usage.md", - "/l10n/pt-BR/guide/configuration.md", - "/l10n/pt-BR/guide/creating-text-script.md", - "/l10n/pt-BR/guide/chat-bots.md", - "/l10n/pt-BR/guide/creating-bots.md", - "/l10n/pt-BR/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/pt.ts b/docs/.vuepress/configs/l10n_configs/pt.ts deleted file mode 100644 index 09d9bc4627..0000000000 --- a/docs/.vuepress/configs/l10n_configs/pt.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/pt.json') - -export const mainConfig_pt: SiteLocaleData = { - lang: 'pt', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_pt: DefaultThemeLocaleData = { - selectLanguageName: "Português (Portugal)", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/pt/guide/", - activeMatch: "/l10n/pt/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/pt/guide/installation.md", - activeMatch: "/l10n/pt/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/pt/guide/usage.md", - activeMatch: "/l10n/pt/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/pt/guide/configuration.md", - activeMatch: "/l10n/pt/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/pt/guide/chat-bots.md", - activeMatch: "/l10n/pt/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/pt/guide/README.md", - "/l10n/pt/guide/installation.md", - "/l10n/pt/guide/usage.md", - "/l10n/pt/guide/configuration.md", - "/l10n/pt/guide/creating-text-script.md", - "/l10n/pt/guide/chat-bots.md", - "/l10n/pt/guide/creating-bots.md", - "/l10n/pt/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/ro.ts b/docs/.vuepress/configs/l10n_configs/ro.ts deleted file mode 100644 index 47d7ee1a9b..0000000000 --- a/docs/.vuepress/configs/l10n_configs/ro.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/ro.json') - -export const mainConfig_ro: SiteLocaleData = { - lang: 'ro', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_ro: DefaultThemeLocaleData = { - selectLanguageName: "Română", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/ro/guide/", - activeMatch: "/l10n/ro/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/ro/guide/installation.md", - activeMatch: "/l10n/ro/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/ro/guide/usage.md", - activeMatch: "/l10n/ro/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/ro/guide/configuration.md", - activeMatch: "/l10n/ro/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/ro/guide/chat-bots.md", - activeMatch: "/l10n/ro/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/ro/guide/README.md", - "/l10n/ro/guide/installation.md", - "/l10n/ro/guide/usage.md", - "/l10n/ro/guide/configuration.md", - "/l10n/ro/guide/creating-text-script.md", - "/l10n/ro/guide/chat-bots.md", - "/l10n/ro/guide/creating-bots.md", - "/l10n/ro/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/ru.ts b/docs/.vuepress/configs/l10n_configs/ru.ts deleted file mode 100644 index e085b7f816..0000000000 --- a/docs/.vuepress/configs/l10n_configs/ru.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/ru.json') - -export const mainConfig_ru: SiteLocaleData = { - lang: 'ru', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_ru: DefaultThemeLocaleData = { - selectLanguageName: "Русский", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/ru/guide/", - activeMatch: "/l10n/ru/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/ru/guide/installation.md", - activeMatch: "/l10n/ru/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/ru/guide/usage.md", - activeMatch: "/l10n/ru/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/ru/guide/configuration.md", - activeMatch: "/l10n/ru/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/ru/guide/chat-bots.md", - activeMatch: "/l10n/ru/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/ru/guide/README.md", - "/l10n/ru/guide/installation.md", - "/l10n/ru/guide/usage.md", - "/l10n/ru/guide/configuration.md", - "/l10n/ru/guide/creating-text-script.md", - "/l10n/ru/guide/chat-bots.md", - "/l10n/ru/guide/creating-bots.md", - "/l10n/ru/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/sr-Cyrl.ts b/docs/.vuepress/configs/l10n_configs/sr-Cyrl.ts deleted file mode 100644 index 0c4399e608..0000000000 --- a/docs/.vuepress/configs/l10n_configs/sr-Cyrl.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/sr-Cyrl.json') - -export const mainConfig_sr_Cyrl: SiteLocaleData = { - lang: 'sr-Cyrl', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_sr_Cyrl: DefaultThemeLocaleData = { - selectLanguageName: "Српски (Cyrillic)", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/sr-Cyrl/guide/", - activeMatch: "/l10n/sr-Cyrl/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/sr-Cyrl/guide/installation.md", - activeMatch: "/l10n/sr-Cyrl/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/sr-Cyrl/guide/usage.md", - activeMatch: "/l10n/sr-Cyrl/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/sr-Cyrl/guide/configuration.md", - activeMatch: "/l10n/sr-Cyrl/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/sr-Cyrl/guide/chat-bots.md", - activeMatch: "/l10n/sr-Cyrl/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/sr-Cyrl/guide/README.md", - "/l10n/sr-Cyrl/guide/installation.md", - "/l10n/sr-Cyrl/guide/usage.md", - "/l10n/sr-Cyrl/guide/configuration.md", - "/l10n/sr-Cyrl/guide/creating-text-script.md", - "/l10n/sr-Cyrl/guide/chat-bots.md", - "/l10n/sr-Cyrl/guide/creating-bots.md", - "/l10n/sr-Cyrl/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/sv.ts b/docs/.vuepress/configs/l10n_configs/sv.ts deleted file mode 100644 index 97764bb04b..0000000000 --- a/docs/.vuepress/configs/l10n_configs/sv.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/sv.json') - -export const mainConfig_sv: SiteLocaleData = { - lang: 'sv', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_sv: DefaultThemeLocaleData = { - selectLanguageName: "Svenska", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/sv/guide/", - activeMatch: "/l10n/sv/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/sv/guide/installation.md", - activeMatch: "/l10n/sv/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/sv/guide/usage.md", - activeMatch: "/l10n/sv/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/sv/guide/configuration.md", - activeMatch: "/l10n/sv/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/sv/guide/chat-bots.md", - activeMatch: "/l10n/sv/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/sv/guide/README.md", - "/l10n/sv/guide/installation.md", - "/l10n/sv/guide/usage.md", - "/l10n/sv/guide/configuration.md", - "/l10n/sv/guide/creating-text-script.md", - "/l10n/sv/guide/chat-bots.md", - "/l10n/sv/guide/creating-bots.md", - "/l10n/sv/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/tr.ts b/docs/.vuepress/configs/l10n_configs/tr.ts deleted file mode 100644 index b1be3c5eee..0000000000 --- a/docs/.vuepress/configs/l10n_configs/tr.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/tr.json') - -export const mainConfig_tr: SiteLocaleData = { - lang: 'tr', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_tr: DefaultThemeLocaleData = { - selectLanguageName: "Türkçe", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/tr/guide/", - activeMatch: "/l10n/tr/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/tr/guide/installation.md", - activeMatch: "/l10n/tr/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/tr/guide/usage.md", - activeMatch: "/l10n/tr/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/tr/guide/configuration.md", - activeMatch: "/l10n/tr/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/tr/guide/chat-bots.md", - activeMatch: "/l10n/tr/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/tr/guide/README.md", - "/l10n/tr/guide/installation.md", - "/l10n/tr/guide/usage.md", - "/l10n/tr/guide/configuration.md", - "/l10n/tr/guide/creating-text-script.md", - "/l10n/tr/guide/chat-bots.md", - "/l10n/tr/guide/creating-bots.md", - "/l10n/tr/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/uk.ts b/docs/.vuepress/configs/l10n_configs/uk.ts deleted file mode 100644 index c2fce2a75a..0000000000 --- a/docs/.vuepress/configs/l10n_configs/uk.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/uk.json') - -export const mainConfig_uk: SiteLocaleData = { - lang: 'uk', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_uk: DefaultThemeLocaleData = { - selectLanguageName: "Українська", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/uk/guide/", - activeMatch: "/l10n/uk/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/uk/guide/installation.md", - activeMatch: "/l10n/uk/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/uk/guide/usage.md", - activeMatch: "/l10n/uk/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/uk/guide/configuration.md", - activeMatch: "/l10n/uk/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/uk/guide/chat-bots.md", - activeMatch: "/l10n/uk/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/uk/guide/README.md", - "/l10n/uk/guide/installation.md", - "/l10n/uk/guide/usage.md", - "/l10n/uk/guide/configuration.md", - "/l10n/uk/guide/creating-text-script.md", - "/l10n/uk/guide/chat-bots.md", - "/l10n/uk/guide/creating-bots.md", - "/l10n/uk/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/vi.ts b/docs/.vuepress/configs/l10n_configs/vi.ts deleted file mode 100644 index 8e34c39618..0000000000 --- a/docs/.vuepress/configs/l10n_configs/vi.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/vi.json') - -export const mainConfig_vi: SiteLocaleData = { - lang: 'vi', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_vi: DefaultThemeLocaleData = { - selectLanguageName: "Tiếng Việt", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/vi/guide/", - activeMatch: "/l10n/vi/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/vi/guide/installation.md", - activeMatch: "/l10n/vi/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/vi/guide/usage.md", - activeMatch: "/l10n/vi/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/vi/guide/configuration.md", - activeMatch: "/l10n/vi/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/vi/guide/chat-bots.md", - activeMatch: "/l10n/vi/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/vi/guide/README.md", - "/l10n/vi/guide/installation.md", - "/l10n/vi/guide/usage.md", - "/l10n/vi/guide/configuration.md", - "/l10n/vi/guide/creating-text-script.md", - "/l10n/vi/guide/chat-bots.md", - "/l10n/vi/guide/creating-bots.md", - "/l10n/vi/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/zh-Hans.ts b/docs/.vuepress/configs/l10n_configs/zh-Hans.ts deleted file mode 100644 index 2de8559bc0..0000000000 --- a/docs/.vuepress/configs/l10n_configs/zh-Hans.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/zh-Hans.json') - -export const mainConfig_zh_Hans: SiteLocaleData = { - lang: 'zh-Hans', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_zh_Hans: DefaultThemeLocaleData = { - selectLanguageName: "简体中文", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/zh-Hans/guide/", - activeMatch: "/l10n/zh-Hans/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/zh-Hans/guide/installation.md", - activeMatch: "/l10n/zh-Hans/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/zh-Hans/guide/usage.md", - activeMatch: "/l10n/zh-Hans/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/zh-Hans/guide/configuration.md", - activeMatch: "/l10n/zh-Hans/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/zh-Hans/guide/chat-bots.md", - activeMatch: "/l10n/zh-Hans/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/zh-Hans/guide/README.md", - "/l10n/zh-Hans/guide/installation.md", - "/l10n/zh-Hans/guide/usage.md", - "/l10n/zh-Hans/guide/configuration.md", - "/l10n/zh-Hans/guide/creating-text-script.md", - "/l10n/zh-Hans/guide/chat-bots.md", - "/l10n/zh-Hans/guide/creating-bots.md", - "/l10n/zh-Hans/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/l10n_configs/zh-Hant.ts b/docs/.vuepress/configs/l10n_configs/zh-Hant.ts deleted file mode 100644 index b13d6053a2..0000000000 --- a/docs/.vuepress/configs/l10n_configs/zh-Hant.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleData } from '@vuepress/shared' -import type { DefaultThemeLocaleData } from '@vuepress/theme-default' -import { headConfig } from '../head.js' - -const Translation = require('../../translations/zh-Hant.json') - -export const mainConfig_zh_Hant: SiteLocaleData = { - lang: 'zh-Hant', - title: Translation.title, - description: Translation.description, - head: headConfig -} - -export const defaultThemeConfig_zh_Hant: DefaultThemeLocaleData = { - selectLanguageName: "繁體中文", - selectLanguageText: Translation.theme.selectLanguageText, - selectLanguageAriaLabel: Translation.theme.selectLanguageAriaLabel, - - navbar: [ - { - text: Translation.navbar.AboutAndFeatures, - link: "/l10n/zh-Hant/guide/", - activeMatch: "/l10n/zh-Hant/index.html", - }, - - { - text: Translation.navbar.Installation, - link: "/l10n/zh-Hant/guide/installation.md", - activeMatch: "/l10n/zh-Hant/guide/installation.html", - }, - - { - text: Translation.navbar.Usage, - link: "/l10n/zh-Hant/guide/usage.md", - activeMatch: "/l10n/zh-Hant/guide/usage.html", - }, - - { - text: Translation.navbar.Configuration, - link: "/l10n/zh-Hant/guide/configuration.md", - activeMatch: "/l10n/zh-Hant/guide/configuration.html", - }, - - { - text: Translation.navbar.ChatBots, - link: "/l10n/zh-Hant/guide/chat-bots.md", - activeMatch: "/l10n/zh-Hant/guide/chat-bots.html", - }, - - { - text: Translation.helpUsTranslate, - link: "https://crowdin.com/project/minecraft-console-client", - }, - ], - - sidebar: [ - "/l10n/zh-Hant/guide/README.md", - "/l10n/zh-Hant/guide/installation.md", - "/l10n/zh-Hant/guide/usage.md", - "/l10n/zh-Hant/guide/configuration.md", - "/l10n/zh-Hant/guide/creating-text-script.md", - "/l10n/zh-Hant/guide/chat-bots.md", - "/l10n/zh-Hant/guide/creating-bots.md", - "/l10n/zh-Hant/guide/contibuting.md" - ], - - // page meta - editLinkText: Translation.theme.editLinkText, - lastUpdatedText: Translation.theme.lastUpdatedText, - contributorsText: Translation.theme.contributorsText, - - // custom containers - tip: Translation.theme.tip, - warning: Translation.theme.warning, - danger: Translation.theme.danger, - - // 404 page - notFound: Translation.theme.notFound, - backToHome: Translation.theme.backToHome, - - // a11y - openInNewWindow: Translation.theme.openInNewWindow, - toggleColorMode: Translation.theme.toggleColorMode, - toggleSidebar: Translation.theme.toggleSidebar, -} diff --git a/docs/.vuepress/configs/locales_config.ts b/docs/.vuepress/configs/locales_config.ts deleted file mode 100644 index 4aae0a8e3c..0000000000 --- a/docs/.vuepress/configs/locales_config.ts +++ /dev/null @@ -1,103 +0,0 @@ -/* This file is automatically generated by "gen_configs.py" */ -import type { SiteLocaleConfig } from '@vuepress/shared' -import type { LocaleConfig } from '@vuepress/shared' - -import { mainConfig_af, defaultThemeConfig_af } from './l10n_configs/af.js' -import { mainConfig_ar, defaultThemeConfig_ar } from './l10n_configs/ar.js' -import { mainConfig_ca, defaultThemeConfig_ca } from './l10n_configs/ca.js' -import { mainConfig_cs, defaultThemeConfig_cs } from './l10n_configs/cs.js' -import { mainConfig_da, defaultThemeConfig_da } from './l10n_configs/da.js' -import { mainConfig_de, defaultThemeConfig_de } from './l10n_configs/de.js' -import { mainConfig_el, defaultThemeConfig_el } from './l10n_configs/el.js' -import { mainConfig_en, defaultThemeConfig_en } from './l10n_configs/en.js' -import { mainConfig_es, defaultThemeConfig_es } from './l10n_configs/es.js' -import { mainConfig_fi, defaultThemeConfig_fi } from './l10n_configs/fi.js' -import { mainConfig_fr, defaultThemeConfig_fr } from './l10n_configs/fr.js' -import { mainConfig_he, defaultThemeConfig_he } from './l10n_configs/he.js' -import { mainConfig_hu, defaultThemeConfig_hu } from './l10n_configs/hu.js' -import { mainConfig_it, defaultThemeConfig_it } from './l10n_configs/it.js' -import { mainConfig_ja, defaultThemeConfig_ja } from './l10n_configs/ja.js' -import { mainConfig_ko, defaultThemeConfig_ko } from './l10n_configs/ko.js' -import { mainConfig_lv, defaultThemeConfig_lv } from './l10n_configs/lv.js' -import { mainConfig_nl, defaultThemeConfig_nl } from './l10n_configs/nl.js' -import { mainConfig_no, defaultThemeConfig_no } from './l10n_configs/no.js' -import { mainConfig_pl, defaultThemeConfig_pl } from './l10n_configs/pl.js' -import { mainConfig_pt_BR, defaultThemeConfig_pt_BR } from './l10n_configs/pt-BR.js' -import { mainConfig_pt, defaultThemeConfig_pt } from './l10n_configs/pt.js' -import { mainConfig_ro, defaultThemeConfig_ro } from './l10n_configs/ro.js' -import { mainConfig_ru, defaultThemeConfig_ru } from './l10n_configs/ru.js' -import { mainConfig_sr_Cyrl, defaultThemeConfig_sr_Cyrl } from './l10n_configs/sr-Cyrl.js' -import { mainConfig_sv, defaultThemeConfig_sv } from './l10n_configs/sv.js' -import { mainConfig_tr, defaultThemeConfig_tr } from './l10n_configs/tr.js' -import { mainConfig_uk, defaultThemeConfig_uk } from './l10n_configs/uk.js' -import { mainConfig_vi, defaultThemeConfig_vi } from './l10n_configs/vi.js' -import { mainConfig_zh_Hans, defaultThemeConfig_zh_Hans } from './l10n_configs/zh-Hans.js' -import { mainConfig_zh_Hant, defaultThemeConfig_zh_Hant } from './l10n_configs/zh-Hant.js' - -export const mainConfig: SiteLocaleConfig = { - '/l10n/af/': mainConfig_af, - '/l10n/ar/': mainConfig_ar, - '/l10n/ca/': mainConfig_ca, - '/l10n/cs/': mainConfig_cs, - '/l10n/da/': mainConfig_da, - '/l10n/de/': mainConfig_de, - '/l10n/el/': mainConfig_el, - '/': mainConfig_en, - '/l10n/es/': mainConfig_es, - '/l10n/fi/': mainConfig_fi, - '/l10n/fr/': mainConfig_fr, - '/l10n/he/': mainConfig_he, - '/l10n/hu/': mainConfig_hu, - '/l10n/it/': mainConfig_it, - '/l10n/ja/': mainConfig_ja, - '/l10n/ko/': mainConfig_ko, - '/l10n/lv/': mainConfig_lv, - '/l10n/nl/': mainConfig_nl, - '/l10n/no/': mainConfig_no, - '/l10n/pl/': mainConfig_pl, - '/l10n/pt-BR/': mainConfig_pt_BR, - '/l10n/pt/': mainConfig_pt, - '/l10n/ro/': mainConfig_ro, - '/l10n/ru/': mainConfig_ru, - '/l10n/sr-Cyrl/': mainConfig_sr_Cyrl, - '/l10n/sv/': mainConfig_sv, - '/l10n/tr/': mainConfig_tr, - '/l10n/uk/': mainConfig_uk, - '/l10n/vi/': mainConfig_vi, - '/l10n/zh-Hans/': mainConfig_zh_Hans, - '/l10n/zh-Hant/': mainConfig_zh_Hant, -} - -export const defaultThemeConfig: LocaleConfig = { - '/l10n/af/': defaultThemeConfig_af, - '/l10n/ar/': defaultThemeConfig_ar, - '/l10n/ca/': defaultThemeConfig_ca, - '/l10n/cs/': defaultThemeConfig_cs, - '/l10n/da/': defaultThemeConfig_da, - '/l10n/de/': defaultThemeConfig_de, - '/l10n/el/': defaultThemeConfig_el, - '/': defaultThemeConfig_en, - '/l10n/es/': defaultThemeConfig_es, - '/l10n/fi/': defaultThemeConfig_fi, - '/l10n/fr/': defaultThemeConfig_fr, - '/l10n/he/': defaultThemeConfig_he, - '/l10n/hu/': defaultThemeConfig_hu, - '/l10n/it/': defaultThemeConfig_it, - '/l10n/ja/': defaultThemeConfig_ja, - '/l10n/ko/': defaultThemeConfig_ko, - '/l10n/lv/': defaultThemeConfig_lv, - '/l10n/nl/': defaultThemeConfig_nl, - '/l10n/no/': defaultThemeConfig_no, - '/l10n/pl/': defaultThemeConfig_pl, - '/l10n/pt-BR/': defaultThemeConfig_pt_BR, - '/l10n/pt/': defaultThemeConfig_pt, - '/l10n/ro/': defaultThemeConfig_ro, - '/l10n/ru/': defaultThemeConfig_ru, - '/l10n/sr-Cyrl/': defaultThemeConfig_sr_Cyrl, - '/l10n/sv/': defaultThemeConfig_sv, - '/l10n/tr/': defaultThemeConfig_tr, - '/l10n/uk/': defaultThemeConfig_uk, - '/l10n/vi/': defaultThemeConfig_vi, - '/l10n/zh-Hans/': defaultThemeConfig_zh_Hans, - '/l10n/zh-Hant/': defaultThemeConfig_zh_Hant, -} diff --git a/docs/.vuepress/public/README.md b/docs/.vuepress/public/README.md deleted file mode 100644 index 81bcaf0518..0000000000 --- a/docs/.vuepress/public/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# About - -A documentation website for Minecraft Console Client (MCC) written using [Vue Press 2.0](https://v2.vuepress.vuejs.org/) - -## How to contribute - -### Requirements: - -- Git -- Node JS >= v12 -- Yarn - -### Install Yarn if you don't have it: - -```bash -npm i yarn -g -``` - -Fork and clone the repository `Minecraft-Console-Client`. - -All of the source is in the `docs` directory. - -### Install dependencies: - -```bash -yarn install -``` - -### Run developer mode: - -```bash -yarn docs:dev -``` - -_If you have the port `8080` taken, use the `--port ` for a custom port._ - -Change things - -Commit, push and open a pull request. diff --git a/docs/.vuepress/public/examples/beacon/census.bcn b/docs/.vuepress/public/examples/beacon/census.bcn new file mode 100644 index 0000000000..2a4df3000e --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/census.bcn @@ -0,0 +1,18 @@ +# beacon 1 +# needs: chat.send entity.read + +function census() + set cows to entities.count("cow", 48) + set sheep to entities.count("sheep", 48) + set pigs to entities.count("pig", 48) + + return "Pasture census: {cows} cows, {sheep} sheep, {pigs} pigs." +end function + +every 300 seconds + say census() +end every + +on chat when message is "!census" + say census() +end on diff --git a/docs/.vuepress/public/examples/beacon/guide/functions.bcn b/docs/.vuepress/public/examples/beacon/guide/functions.bcn new file mode 100644 index 0000000000..8f4b2a7a6d --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/guide/functions.bcn @@ -0,0 +1,8 @@ +# beacon 1 +function subtotal(price, count) + return price * count +end function +set result to subtotal(3, 4) +assert(result is 12, "subtotal") +assert(subtotal(3, 0) is 0, "empty order") +show "Subtotal: {result}" diff --git a/docs/.vuepress/public/examples/beacon/guide/greeter.bcn b/docs/.vuepress/public/examples/beacon/guide/greeter.bcn new file mode 100644 index 0000000000..359bdf0a38 --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/guide/greeter.bcn @@ -0,0 +1,5 @@ +# beacon 1 +# needs: chat.send +on chat as e when trim(lower(e.message)) is "!hello" + whisper e.player "Hello, {e.player}!" +end on diff --git a/docs/.vuepress/public/examples/beacon/guide/hello.bcn b/docs/.vuepress/public/examples/beacon/guide/hello.bcn new file mode 100644 index 0000000000..4937feff2e --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/guide/hello.bcn @@ -0,0 +1,2 @@ +# beacon 1 +show "Hello from Beacon" diff --git a/docs/.vuepress/public/examples/beacon/guide/price.bcn b/docs/.vuepress/public/examples/beacon/guide/price.bcn new file mode 100644 index 0000000000..64bd28e4bb --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/guide/price.bcn @@ -0,0 +1,11 @@ +# beacon 1 +# desc: Calculate the current bread order. +# example: /guide-price bread +command "/guide-price " + set item to lower(arg("item")) + if item is "bread" then + show "Bread costs 3 coins" + else + show "Unknown item: {item}" + end if +end command diff --git a/docs/.vuepress/public/examples/beacon/guide/saved-counter.bcn b/docs/.vuepress/public/examples/beacon/guide/saved-counter.bcn new file mode 100644 index 0000000000..b78c365d2e --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/guide/saved-counter.bcn @@ -0,0 +1,5 @@ +# beacon 1 +set count to saved("count") or 0 +set count to count + 1 +save "count" to count +show "Run count: {count}" diff --git a/docs/.vuepress/public/examples/beacon/guide/schedule.bcn b/docs/.vuepress/public/examples/beacon/guide/schedule.bcn new file mode 100644 index 0000000000..c4fb90d1b3 --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/guide/schedule.bcn @@ -0,0 +1,7 @@ +# beacon 1 +in 5 seconds do + show "One reminder" +end in +every 10 seconds + show "Status check" +end every diff --git a/docs/.vuepress/public/examples/beacon/guide/settings.bcn b/docs/.vuepress/public/examples/beacon/guide/settings.bcn new file mode 100644 index 0000000000..0fb4b933c9 --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/guide/settings.bcn @@ -0,0 +1,3 @@ +# beacon 1 +# setting prefix = "Hello" ; Greeting text +show settings.prefix diff --git a/docs/.vuepress/public/examples/beacon/guide/shop-caller.bcn b/docs/.vuepress/public/examples/beacon/guide/shop-caller.bcn new file mode 100644 index 0000000000..4f2e218be6 --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/guide/shop-caller.bcn @@ -0,0 +1,4 @@ +# beacon 1 +set total to call "shop.subtotal"(3, 4) +assert(total is 12, "provider result") +show "Provider total: {total}" diff --git a/docs/.vuepress/public/examples/beacon/guide/shop.bcn b/docs/.vuepress/public/examples/beacon/guide/shop.bcn new file mode 100644 index 0000000000..7018f4ff35 --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/guide/shop.bcn @@ -0,0 +1,4 @@ +# beacon 1 +export function subtotal(price, count) + return price * count +end function diff --git a/docs/.vuepress/public/examples/beacon/guide/values.bcn b/docs/.vuepress/public/examples/beacon/guide/values.bcn new file mode 100644 index 0000000000..104d8e6ce5 --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/guide/values.bcn @@ -0,0 +1,14 @@ +# beacon 1 +set customer to "Alice" +set prices to [3, 5, 7] +set total to 0 +for each price in prices + set total to total + price +end for +if total >= 10 then + show "{customer}: large order" +else + show "{customer}: small order" +end if +assert(total is 15, "order total") +show "Total: {total}" diff --git a/docs/.vuepress/public/examples/beacon/guide/welcome-helper.bcn b/docs/.vuepress/public/examples/beacon/guide/welcome-helper.bcn new file mode 100644 index 0000000000..a9d62f0370 --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/guide/welcome-helper.bcn @@ -0,0 +1,14 @@ +# beacon 1 +# needs: chat.send +# setting prefix = "Hello" ; Greeting text +# desc: Greet players and count greetings. +# example: /guide-stats +set greetings to saved("greetings") or 0 +on chat as e when trim(lower(e.message)) is "!hello" + set greetings to greetings + 1 + save "greetings" to greetings + whisper e.player "{settings.prefix}, {e.player}!" +end on +command "/guide-stats" + show "Greetings: {greetings}" +end command diff --git a/docs/.vuepress/public/examples/beacon/inventory-report.bcn b/docs/.vuepress/public/examples/beacon/inventory-report.bcn new file mode 100644 index 0000000000..f219c0f4c7 --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/inventory-report.bcn @@ -0,0 +1,13 @@ +# beacon 1 +# needs: inventory.read +on chat when message is "!inventory" + try + show "Carrying {inv.count("torch")} torches." + for each s in inv.list() + show "#{s.slot} {s.count}x {s.name} ({s.type})" + end for + show "Wearing: {inv.armor()}" + catch err + show "Inventory report failed: {err.message}" + end try +end on diff --git a/docs/.vuepress/public/examples/beacon/lib/math.bcn b/docs/.vuepress/public/examples/beacon/lib/math.bcn new file mode 100644 index 0000000000..e1314c5eca --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/lib/math.bcn @@ -0,0 +1,4 @@ +# beacon 1 +function subtotal(price, count) + return price * count +end function diff --git a/docs/.vuepress/public/examples/beacon/nearby-chests.bcn b/docs/.vuepress/public/examples/beacon/nearby-chests.bcn new file mode 100644 index 0000000000..30b97b11e6 --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/nearby-chests.bcn @@ -0,0 +1,16 @@ +# beacon 1 +# needs: chat.send world.read world.search +on chat when message is "!chests" + try + set found to world.find_blocks("chest", 32, 5) + if found is empty + say "No tracked chests within 32 blocks." + else + for each c in found + say "Chest at {c.x} {c.y} {c.z}." + end for + end if + catch err + show "Chest search failed: {err.message}" + end try +end on diff --git a/docs/.vuepress/public/examples/beacon/optional-pricing.bcn b/docs/.vuepress/public/examples/beacon/optional-pricing.bcn new file mode 100644 index 0000000000..29f2ac138c --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/optional-pricing.bcn @@ -0,0 +1,11 @@ +# beacon 1 +# needs: chat.send +# wants: shop.calculate +extern subtotal from "shop-tools" +on chat when message is "!subtotal" + try + say "Four items at three coins each cost {subtotal(3, 4)} coins." + catch err + show "Pricing unavailable: {err.message}" + end try +end on diff --git a/docs/.vuepress/public/examples/beacon/order.bcn b/docs/.vuepress/public/examples/beacon/order.bcn new file mode 100644 index 0000000000..33d633897e --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/order.bcn @@ -0,0 +1,3 @@ +# beacon 1 +import "lib/math.bcn" as math +show math.subtotal(3, 4) diff --git a/docs/.vuepress/public/examples/beacon/price-command.bcn b/docs/.vuepress/public/examples/beacon/price-command.bcn new file mode 100644 index 0000000000..2d6977521e --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/price-command.bcn @@ -0,0 +1,10 @@ +# beacon 1 +# needs: chat.send + +# desc: Look up today's price. +# example: /price bread +command "/price " + set target to arg("item") or "bread" + set p to saved("price_" + target) or 10 + say "{target} costs {p} coins today." +end command diff --git a/docs/.vuepress/public/examples/beacon/quiz.bcn b/docs/.vuepress/public/examples/beacon/quiz.bcn new file mode 100644 index 0000000000..41d177110f --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/quiz.bcn @@ -0,0 +1,23 @@ +# beacon 1 +# needs: chat.send + +set quiz to {running: no, q: "", a: "", wins: {}} + +on chat when message is "!quiz" + if quiz.running is yes + whisper player "A round is already running: {quiz.q}" + stop event + end if + set quiz.running to yes + set quiz.q to "What mob explodes when it gets close?" + set quiz.a to "creeper" + say "Quiz! {quiz.q} First correct whisper wins." +end on + +on whisper when quiz.running is yes and lower(trim(message)) is quiz.a + set quiz.running to no + set wins to quiz.wins + set wins[player] to (wins[player] or 0) + 1 + set quiz.wins to wins + say "{player} got it! Wins total: {wins[player]}. Say !quiz for another round." +end on diff --git a/docs/.vuepress/public/examples/beacon/shared-counter.bcn b/docs/.vuepress/public/examples/beacon/shared-counter.bcn new file mode 100644 index 0000000000..54e13b4636 --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/shared-counter.bcn @@ -0,0 +1,6 @@ +# beacon 1 +lock shared + set n to shared["quiz.plays"] or 0 + set shared["quiz.plays"] to n + 1 +end lock +show "Shared count: {shared["quiz.plays"]}" diff --git a/docs/.vuepress/public/examples/beacon/team-dialog.bcn b/docs/.vuepress/public/examples/beacon/team-dialog.bcn new file mode 100644 index 0000000000..d420cfeac0 --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/team-dialog.bcn @@ -0,0 +1,14 @@ +# beacon 1 +# needs: dialog.read dialog.write +# setting team = "blue" +on dialog as d when d.input_keys contains "team_choice" + try + if dialog.answer({team_choice: settings.team}, 2) + show "Team answer submitted." + else + show "Team answer refused." + end if + catch err + show "Team dialog failed: {err.message}" + end try +end on diff --git a/docs/.vuepress/public/examples/beacon/timers.bcn b/docs/.vuepress/public/examples/beacon/timers.bcn new file mode 100644 index 0000000000..09bc195bd6 --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/timers.bcn @@ -0,0 +1,7 @@ +# beacon 1 +in 5 seconds do + show "One-shot timer" +end in +every 60 seconds + show "Recurring timer" +end every \ No newline at end of file diff --git a/docs/.vuepress/public/examples/beacon/total.bcn b/docs/.vuepress/public/examples/beacon/total.bcn new file mode 100644 index 0000000000..40204f2a40 --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/total.bcn @@ -0,0 +1,8 @@ +# beacon 1 +set prices to [3, 5, 7] +set total to 0 +for each price in prices + set total to total + price +end for +assert(total is 15, "total") +show "Total: {total}" diff --git a/docs/.vuepress/public/examples/beacon/tps-guard.bcn b/docs/.vuepress/public/examples/beacon/tps-guard.bcn new file mode 100644 index 0000000000..17312e4d1d --- /dev/null +++ b/docs/.vuepress/public/examples/beacon/tps-guard.bcn @@ -0,0 +1,6 @@ +# beacon 1 +# needs: chat.send + +on tps cooldown 300 seconds named "tps-warn" when tps < 15 + say "Heads up: server TPS is {tps} ({server.mspt} ms/tick). Easy on the farms." +end on diff --git a/docs/.vuepress/public/install.ps1 b/docs/.vuepress/public/install.ps1 index 31f2e32405..b1b0c29007 100644 --- a/docs/.vuepress/public/install.ps1 +++ b/docs/.vuepress/public/install.ps1 @@ -1,85 +1,63 @@ -# Minecraft Console Client - Installer for Windows -# Downloads the latest MinecraftClient binary for your Windows architecture. -# Usage (PowerShell): iwr -useb https://mccteam.github.io/install.ps1 | iex - +# MCC 2.0 installer for Windows. Save this file, then run it with PowerShell. +param( + [string]$Version = 'latest', + [string]$Destination = (Join-Path $env:LOCALAPPDATA 'MCC'), + [ValidateSet('win-x86','win-x64','win-arm64')][string]$Rid, + [switch]$PrintRid +) $ErrorActionPreference = 'Stop' - -$REPO = "MCCTeam/Minecraft-Console-Client" -$OUTPUT = "MinecraftClient.exe" - -# --- Detect CPU architecture --- -$arch = [System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture -$archId = switch ($arch) { - 'X64' { 'x64' } - 'X86' { 'x86' } - 'Arm64' { 'arm64' } - default { - Write-Error "Unsupported CPU architecture: $arch" - exit 1 - } -} - -$suffix = "win-$archId" - -# --- Fetch latest release metadata from GitHub API --- -$apiUrl = "https://api.github.com/repos/$REPO/releases/latest" -Write-Host "Fetching latest release information..." -$release = Invoke-RestMethod -Uri $apiUrl -UseBasicParsing - -# --- Locate the correct asset --- -$asset = $release.assets | Where-Object { $_.name -match "^MinecraftClient-.*-$([regex]::Escape($suffix))\.exe$" } | Select-Object -First 1 - -if (-not $asset) { - Write-Error "Could not find a release asset for '$suffix'." - exit 1 +if (-not $Rid) { + $arch = [System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture.ToString().ToLowerInvariant() + if ($arch -notin @('x86','x64','arm64')) { throw "Unsupported process architecture: $arch" } + $Rid = "win-$arch" } - -$downloadUrl = $asset.browser_download_url -$tag = $release.tag_name - -Write-Host "Downloading MinecraftClient $tag ($suffix)..." - -# Download with a built-in ASCII progress bar (no external tools required). -# HttpWebRequest streams the body on the main thread so we can update the -# progress bar inline without any Runspace or thread-safety concerns. -$outPath = Join-Path (Get-Location).Path $OUTPUT -$request = [System.Net.HttpWebRequest]::Create($downloadUrl) -$response = $request.GetResponse() -$totalBytes = $response.ContentLength - -$responseStream = $response.GetResponseStream() -$fileStream = [System.IO.File]::Create($outPath) -$buffer = New-Object byte[] 32768 -$totalRead = 0 - +if ($PrintRid) { Write-Output $Rid; exit 0 } +$endpoint = if ($Version -eq 'latest') { 'latest' } else { 'tags/' + [Uri]::EscapeDataString($Version) } +$release = Invoke-RestMethod -Uri "https://api.github.com/repos/MCCTeam/Minecraft-Console-Client/releases/$endpoint" +$tag = $release.tag_name +if ($tag -notmatch '^v?2\.\d+\.\d+(-[0-9A-Za-z.-]+)?$') { throw 'The selected release is not MCC 2.0. Build from source until an MCC 2.0 release is published.' } +$name = "Mcc-$tag-$Rid.zip" +$asset = @($release.assets | Where-Object name -eq $name) +$checksum = @($release.assets | Where-Object name -eq 'SHA256SUMS') +if ($asset.Count -ne 1 -or $checksum.Count -ne 1) { throw "Release must contain $name and SHA256SUMS." } +$Destination = [IO.Path]::GetFullPath($Destination) +$target = Join-Path $Destination "releases/$tag/$Rid" +if (Test-Path $target) { throw "Already installed: $target. Select another version or installation directory." } +$scratch = Join-Path ([IO.Path]::GetTempPath()) ([Guid]::NewGuid().ToString()) +New-Item -ItemType Directory -Path $scratch | Out-Null try { - while ($true) { - $read = $responseStream.Read($buffer, 0, $buffer.Length) - if ($read -le 0) { break } - $fileStream.Write($buffer, 0, $read) - $totalRead += $read - if ($totalBytes -gt 0) { - $pct = [int]($totalRead * 100 / $totalBytes) - $filled = '=' * [int]($pct / 2) - $bar = $filled.PadRight(50) - $recv = [math]::Round($totalRead / 1MB, 1) - $total = [math]::Round($totalBytes / 1MB, 1) - # Use [Console]::Write with an explicit \r so the cursor returns to - # column 0 and overwrites the previous bar. Write-Host -NoNewline - # does not reliably reposition the cursor when the script is run - # via iex (pipe mode), producing multiple bars on one line. - $line = "`r[{0}] {1,3}% {2,6:N1} / {3,6:N1} MB" -f $bar, $pct, $recv, $total - [Console]::Write($line) + $archive = Join-Path $scratch $name + $sumFile = Join-Path $scratch 'SHA256SUMS' + Invoke-WebRequest -Uri $asset[0].browser_download_url -OutFile $archive -UseBasicParsing + Invoke-WebRequest -Uri $checksum[0].browser_download_url -OutFile $sumFile -UseBasicParsing + $line = @(Get-Content $sumFile | Where-Object { $_ -match ('^[0-9a-fA-F]{64}\s+\*?' + [regex]::Escape($name) + '$') }) + if ($line.Count -ne 1) { throw "No unique checksum for $name." } + $expected = ($line[0] -split '\s+')[0] + if ((Get-FileHash $archive -Algorithm SHA256).Hash -ne $expected) { throw 'Archive checksum does not match.' } + Add-Type -AssemblyName System.IO.Compression.FileSystem + $package = [IO.Compression.ZipFile]::OpenRead($archive) + $stage = Join-Path $scratch 'payload' + New-Item -ItemType Directory -Path $stage | Out-Null + try { + foreach ($entry in $package.Entries) { + $entryName = $entry.FullName.Replace('\','/') + if ($entryName.StartsWith('/') -or $entryName.Contains(':') -or ($entryName.Split('/') -contains '..')) { throw "Unsafe archive path: $entryName" } + if (($entry.ExternalAttributes -shr 16 -band 61440) -eq 40960) { throw 'Archive links are not allowed.' } } + } finally { $package.Dispose() } + [IO.Compression.ZipFile]::ExtractToDirectory($archive, $stage) + if (-not (Test-Path (Join-Path $stage 'Mcc.Cli.exe') -PathType Leaf)) { throw 'Archive does not contain the MCC executable.' } + New-Item -ItemType Directory -Path (Split-Path $target) -Force | Out-Null + Move-Item $stage $target + $launcher = Join-Path $Destination 'mcc.cmd' + $binary = "`"%~dp0releases\$tag\$Rid\Mcc.Cli.exe`"" + $content = "@echo off`r`ncd /d `"%~dp0`"`r`n" + foreach ($mode in @('run','lint','format','--validate-plugin','--validate-marketplace','--help','--help-short')) { + $content += "if `"%~1`"==`"$mode`" goto tool`r`n" } -} finally { - $fileStream.Close() - $responseStream.Close() - $response.Close() -} - -[Console]::WriteLine() # end the progress line - -Write-Host "" -Write-Host "Downloaded: .\$OUTPUT" -Write-Host "Run with: .\$OUTPUT --help" + $content += "$binary --configurations `"%~dp0configurations`" %*`r`nexit /b %errorlevel%`r`n:tool`r`n$binary %*`r`n" + [IO.File]::WriteAllText($launcher, $content, [Text.Encoding]::ASCII) + Write-Output "Installed $tag for $Rid." + Write-Output "Run: $launcher --help" + Write-Output 'Existing configuration, plugins and scripts were preserved.' +} finally { Remove-Item -Recurse -Force $scratch } diff --git a/docs/.vuepress/public/install.sh b/docs/.vuepress/public/install.sh index d3e74d3d01..f063cb0b56 100644 --- a/docs/.vuepress/public/install.sh +++ b/docs/.vuepress/public/install.sh @@ -1,106 +1,164 @@ #!/bin/sh -# Minecraft Console Client - Installer -# Downloads the latest MinecraftClient binary for your Linux or macOS platform. -# Usage: curl -fsSL https://mccteam.github.io/install.sh | sh -# or: wget -qO- https://mccteam.github.io/install.sh | sh +# MCC 2.0 installer. Requires Python 3.10 or later. +set -eu +command -v python3 >/dev/null 2>&1 || { echo 'Install Python 3.10 or later, then retry.' >&2; exit 1; } +python3 - "$@" <<'MCC_INSTALL_PYTHON' +#!/usr/bin/env python3 +"""Install one MCC 2.0 release archive and verify its checksum.""" +import argparse +import hashlib +import json +import os +import platform +import re +import shlex +import shutil +import struct +import tarfile +import tempfile +import urllib.request +import urllib.parse +import zipfile +from pathlib import Path, PurePosixPath -set -e +REPOSITORY = "MCCTeam/Minecraft-Console-Client" -REPO="MCCTeam/Minecraft-Console-Client" -OUTPUT="MinecraftClient" +def detect_target(): + system = platform.system() + machine = platform.machine().lower() + bits = struct.calcsize("P") * 8 + if machine in ("aarch64", "arm64"): + arch = "arm64" if bits == 64 else "arm" + elif machine.startswith("arm"): + arch = "arm" + elif machine in ("x86_64", "amd64"): + arch = "x64" if bits == 64 else "x86" + elif machine in ("x86", "i386", "i486", "i586", "i686"): + arch = "x86" + else: + raise ValueError(f"Unsupported process architecture: {machine} ({bits} bit)") + if system == "Darwin" and arch in ("x64", "arm64"): + return "osx-" + arch + if system == "Windows" and arch in ("x86", "x64", "arm64"): + return "win-" + arch + if system == "Linux" and arch in ("x64", "arm64", "arm"): + musl = platform.libc_ver()[0] == "musl" or any(Path("/lib").glob("ld-musl-*.so.1")) + return ("linux-musl-" if musl else "linux-") + arch + raise ValueError(f"Unsupported operating system/process combination: {system}/{arch}") -# --- Detect OS --- -OS=$(uname -s) -case "$OS" in - Linux) PLATFORM="linux" ;; - Darwin) PLATFORM="osx" ;; - *) - echo "Error: Unsupported OS '$OS'. This script supports Linux and macOS." >&2 - exit 1 - ;; -esac +def fetch(url): + request = urllib.request.Request(url, headers={"User-Agent": "MCC-2-installer", "Accept": "application/vnd.github+json"}) + with urllib.request.urlopen(request, timeout=60) as response: + return response.read() -# --- Detect CPU architecture --- -ARCH=$(uname -m) -case "$ARCH" in - x86_64|amd64) ARCH_ID="x64" ;; - aarch64|arm64) ARCH_ID="arm64" ;; - armv7l|armv8l|armhf) ARCH_ID="arm" ;; - arm*) ARCH_ID="arm" ;; - *) - echo "Error: Unsupported CPU architecture '$ARCH'." >&2 - exit 1 - ;; -esac +def unpack(archive, destination): + destination = Path(destination) + def safe(name): + p = PurePosixPath(name.replace("\\", "/")) + if p.is_absolute() or ".." in p.parts or ":" in name: + raise ValueError(f"Unsafe archive path: {name}") + target = destination.joinpath(*p.parts) + if not target.resolve().is_relative_to(destination.resolve()): + raise ValueError(f"Archive path escapes installation: {name}") + return target + if str(archive).endswith(".zip"): + with zipfile.ZipFile(archive) as package: + for entry in package.infolist(): + target = safe(entry.filename) + if (entry.external_attr >> 16) & 0o170000 == 0o120000: + raise ValueError("Archive links are not allowed") + if entry.is_dir(): + target.mkdir(parents=True, exist_ok=True) + else: + target.parent.mkdir(parents=True, exist_ok=True) + with package.open(entry) as source, target.open("xb") as output: + shutil.copyfileobj(source, output) + else: + with tarfile.open(archive, "r:gz") as package: + for entry in package: + target = safe(entry.name) + if entry.isdir(): + target.mkdir(parents=True, exist_ok=True) + elif entry.isfile(): + target.parent.mkdir(parents=True, exist_ok=True) + with package.extractfile(entry) as source, target.open("xb") as output: + shutil.copyfileobj(source, output) + target.chmod(entry.mode & 0o777) + else: + raise ValueError("Archive links and device files are not allowed") -# macOS does not have an arm (32-bit) build -if [ "$PLATFORM" = "osx" ] && [ "$ARCH_ID" = "arm" ]; then - echo "Error: 32-bit ARM is not supported on macOS." >&2 - exit 1 -fi +def install(release, target, destination, download=fetch): + tag = release["tag_name"] + if not re.fullmatch(r"v?2\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?", tag): + raise ValueError("The selected release is not MCC 2.0. Build from source until an MCC 2.0 release is published.") + extension = ".zip" if target.startswith("win-") else ".tar.gz" + name = f"Mcc-{tag}-{target}{extension}" + assets = {asset["name"]: asset["browser_download_url"] for asset in release["assets"]} + if name not in assets or "SHA256SUMS" not in assets: + raise ValueError(f"Release {tag} must contain {name} and SHA256SUMS") + checksums = download(assets["SHA256SUMS"]).decode("utf-8") + hashes = {} + for line in checksums.splitlines(): + match = re.fullmatch(r"([0-9a-fA-F]{64})\s+\*?(.+)", line) + if match: + hashes[match[2]] = match[1].lower() + if name not in hashes: + raise ValueError(f"No checksum for {name}") + destination = Path(destination).expanduser().resolve() + version = destination/"releases"/tag/target + if version.exists(): + raise ValueError(f"Already installed: {version}. Select another version or installation directory.") + payload = download(assets[name]) + if hashlib.sha256(payload).hexdigest() != hashes[name]: + raise ValueError("Archive checksum does not match. No installation files were changed.") + destination.mkdir(parents=True, exist_ok=True) + with tempfile.TemporaryDirectory(prefix=".mcc-install-", dir=destination) as scratch: + archive = Path(scratch)/name + archive.write_bytes(payload) + stage = Path(scratch)/"payload" + stage.mkdir() + unpack(archive, stage) + executable = "Mcc.Cli.exe" if target.startswith("win-") else "Mcc.Cli" + if not (stage/executable).is_file(): + raise ValueError("Archive does not contain the MCC executable") + version.parent.mkdir(parents=True, exist_ok=True) + stage.rename(version) + if target.startswith("win-"): + launcher = destination/"mcc.cmd" + binary = '"%~dp0releases\\' + tag + '\\' + target + '\\Mcc.Cli.exe"' + modes = ['run', 'lint', 'format', '--validate-plugin', '--validate-marketplace', '--help', '--help-short'] + launcher.write_text('@echo off\r\ncd /d "%~dp0"\r\n' + ''.join('if "%~1"=="' + mode + '" goto tool\r\n' for mode in modes) + binary + ' --configurations "%~dp0configurations" %*\r\nexit /b %errorlevel%\r\n:tool\r\n' + binary + ' %*\r\n') + else: + (version/"Mcc.Cli").chmod(0o755) + launcher = destination/"mcc" + binary = shlex.quote(str(version/"Mcc.Cli")) + launcher.write_text('#!/bin/sh\ncd ' + shlex.quote(str(destination)) + ' || exit 1\ncase "${1:-}" in\n run|lint|format|--validate-plugin|--validate-marketplace|--help|--help-short) exec ' + binary + ' "$@" ;;\n *) exec ' + binary + ' --configurations ' + shlex.quote(str(destination/"configurations")) + ' "$@" ;;\nesac\n') + launcher.chmod(0o755) + return launcher -SUFFIX="${PLATFORM}-${ARCH_ID}" +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--version", default="latest", help="Release tag, including prereleases, or latest stable") + parser.add_argument("--dest", default=str(Path.home()/".local/share/mcc")) + parser.add_argument("--rid", help="Override process platform detection") + parser.add_argument("--print-rid", action="store_true") + args = parser.parse_args() + target = args.rid or detect_target() + if not re.fullmatch(r"(?:win-(?:x86|x64|arm64)|osx-(?:x64|arm64)|linux-(?:musl-)?(?:x64|arm64|arm))", target): + raise ValueError("Unsupported RID: " + target) + if args.print_rid: + print(target) + return + endpoint = "latest" if args.version == "latest" else "tags/" + urllib.parse.quote(args.version, safe="") + release = json.loads(fetch(f"https://api.github.com/repos/{REPOSITORY}/releases/{endpoint}")) + launcher = install(release, target, args.dest) + print(f"Installed {release['tag_name']} for {target}.") + print(f"Run: {launcher} --help") + print("Existing configuration, plugins and scripts were preserved.") -# --- Download helpers: prefer curl, fall back to wget --- -_download_stdout() { - if command -v curl >/dev/null 2>&1; then - curl -fsSL "$1" - elif command -v wget >/dev/null 2>&1; then - wget -qO- "$1" - else - echo "Error: Neither 'curl' nor 'wget' is available. Please install one and retry." >&2 - exit 1 - fi -} - -_download_file() { - if command -v curl >/dev/null 2>&1; then - curl -fL --progress-bar -o "$2" "$1" - elif command -v wget >/dev/null 2>&1; then - # --show-progress forces the progress bar even when stdout is not a TTY. - # Fall back silently to default output if the flag is not supported - # (older wget versions, e.g. BusyBox wget). - if wget --show-progress -O "$2" "$1" 2>/dev/null; then - return 0 - fi - wget -O "$2" "$1" - else - echo "Error: Neither 'curl' nor 'wget' is available. Please install one and retry." >&2 - exit 1 - fi -} - -# --- Fetch latest release metadata from GitHub API --- -API_URL="https://api.github.com/repos/${REPO}/releases/latest" -echo "Fetching latest release information..." -RELEASE_JSON=$(_download_stdout "$API_URL") - -# --- Parse asset download URL (no external tools required) --- -# The JSON key "browser_download_url" appears once per asset. -# We match the key followed by the URL, anchoring on the platform-arch suffix -# and the closing quote so that e.g. "linux-arm" does not match "linux-arm64". -# The ' *: *' pattern handles optional spaces around the colon (GitHub API adds spaces). -ASSET_URL=$(printf '%s' "$RELEASE_JSON" \ - | grep -o '"browser_download_url" *: *"[^"]*-'"${SUFFIX}"'"' \ - | grep -o 'https://[^"]*' \ - | head -1) - -if [ -z "$ASSET_URL" ]; then - echo "Error: Could not find a release asset for platform '${SUFFIX}'." >&2 - exit 1 -fi - -# --- Extract tag name for display --- -TAG=$(printf '%s' "$RELEASE_JSON" \ - | grep -o '"tag_name" *: *"[^"]*"' \ - | head -1 \ - | grep -o '"[^"]*"$' \ - | tr -d '"') - -echo "Downloading MinecraftClient ${TAG} (${SUFFIX})..." -_download_file "$ASSET_URL" "$OUTPUT" -chmod +x "$OUTPUT" - -echo "" -echo "Downloaded: ./${OUTPUT}" -echo "Run with: ./${OUTPUT} --help" +if __name__ == "__main__": + try: + main() + except (ValueError, OSError, KeyError) as error: + raise SystemExit("MCC install failed: " + str(error)) +MCC_INSTALL_PYTHON diff --git a/docs/.vuepress/public/redirect.html b/docs/.vuepress/public/redirect.html deleted file mode 100644 index ec0741fcfd..0000000000 --- a/docs/.vuepress/public/redirect.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - Sign-in | Minecraft Console Client - - - - -

- Minecraft Console Client -

-
- - - -
- - - - - diff --git a/docs/.vuepress/public/redirect_assets/wallpaper/1.png b/docs/.vuepress/public/redirect_assets/wallpaper/1.png deleted file mode 100644 index a49ffba533..0000000000 Binary files a/docs/.vuepress/public/redirect_assets/wallpaper/1.png and /dev/null differ diff --git a/docs/.vuepress/public/redirect_assets/wallpaper/2.png b/docs/.vuepress/public/redirect_assets/wallpaper/2.png deleted file mode 100644 index b8885f5c6c..0000000000 Binary files a/docs/.vuepress/public/redirect_assets/wallpaper/2.png and /dev/null differ diff --git a/docs/.vuepress/public/redirect_assets/wallpaper/3.png b/docs/.vuepress/public/redirect_assets/wallpaper/3.png deleted file mode 100644 index 398a9159ef..0000000000 Binary files a/docs/.vuepress/public/redirect_assets/wallpaper/3.png and /dev/null differ diff --git a/docs/.vuepress/public/redirect_assets/wallpaper/4.png b/docs/.vuepress/public/redirect_assets/wallpaper/4.png deleted file mode 100644 index 825e6bb76c..0000000000 Binary files a/docs/.vuepress/public/redirect_assets/wallpaper/4.png and /dev/null differ diff --git a/docs/.vuepress/public/redirect_assets/wallpaper/5.png b/docs/.vuepress/public/redirect_assets/wallpaper/5.png deleted file mode 100644 index 724c52cfa0..0000000000 Binary files a/docs/.vuepress/public/redirect_assets/wallpaper/5.png and /dev/null differ diff --git a/docs/.vuepress/public/redirect_assets/wallpaper/6.png b/docs/.vuepress/public/redirect_assets/wallpaper/6.png deleted file mode 100644 index a851589c18..0000000000 Binary files a/docs/.vuepress/public/redirect_assets/wallpaper/6.png and /dev/null differ diff --git a/docs/.vuepress/public/redirect_assets/wallpaper/7.png b/docs/.vuepress/public/redirect_assets/wallpaper/7.png deleted file mode 100644 index 38d89742c3..0000000000 Binary files a/docs/.vuepress/public/redirect_assets/wallpaper/7.png and /dev/null differ diff --git a/docs/.vuepress/public/redirect_assets/wallpaper/8.png b/docs/.vuepress/public/redirect_assets/wallpaper/8.png deleted file mode 100644 index fc2dc4d14a..0000000000 Binary files a/docs/.vuepress/public/redirect_assets/wallpaper/8.png and /dev/null differ diff --git a/docs/.vuepress/translations/en.json b/docs/.vuepress/translations/en.json deleted file mode 100644 index e21535a459..0000000000 --- a/docs/.vuepress/translations/en.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "title": "Minecraft Console Client", - "description": "Documentation website for the Minecraft Console Client (MCC)", - "helpUsTranslate": "Help us translate", - "theme":{ - "selectLanguageText": "Languages", - "selectLanguageAriaLabel": "Select language", - "editLinkText": "Edit this page", - "lastUpdatedText": "Last Updated", - "contributorsText": "Contributors", - "tip": "Tip", - "warning": "Warning", - "danger": "Danger", - "notFound": [ - "There's nothing here.", - "How did we get here?", - "That's a Four-Oh-Four.", - "Looks like we've got some broken links." - ], - "backToHome": "Take me home", - "openInNewWindow": "open in new window", - "toggleColorMode": "toggle color mode", - "toggleSidebar": "toggle sidebar" - }, - "navbar": { - "AboutAndFeatures": "About & Features", - "Installation": "Installation", - "Usage": "Usage", - "Configuration": "Configuration", - "ChatBots": "ChatBots" - } -} diff --git a/docs/.vuepress/ui/en.json b/docs/.vuepress/ui/en.json new file mode 100644 index 0000000000..85df7363a0 --- /dev/null +++ b/docs/.vuepress/ui/en.json @@ -0,0 +1,13 @@ +{ + "language": "English", + "getting-started": "Start here", + "client": "Use MCC", + "commands": "Commands", + "beacon": "Beacon scripts", + "plugins": "Plugins", + "marketplaces": "Marketplaces", + "deployment": "Deployment", + "contributing": "Contribute", + "troubleshooting": "Troubleshooting", + "description": "Minecraft Console Client guides and reference" +} diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 36bc8c0eeb..0000000000 --- a/docs/README.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Home -home: true -heroImage: /images/MCC_logo_with_edge.png -tagline: Minecraft Console Client (MCC) is a lightweight open-source Minecraft Java client implemented in C# -actions: - - text: Installation - link: ./guide/installation.md - type: primary - - text: Learn More → - link: ./guide/ - type: secondary -actionText: -actionLink: -features: - - title: Chat - details: Chat with other people on the server - - title: Automation - details: Create bots to do automated tasks - - title: Supported Versions - details: 1.4.6 - 26.1 -footer: Made by MCC Team with ❤️ ---- diff --git a/docs/beacon/capabilities.md b/docs/beacon/capabilities.md new file mode 100644 index 0000000000..e3a8724dca --- /dev/null +++ b/docs/beacon/capabilities.md @@ -0,0 +1,94 @@ +# Beacon capabilities and limits + +A capability is a named operation. A script declares required capabilities in `# needs:` and optional capabilities in `# wants:`. + +```beacon +# beacon 1 +# needs: chat.send +on chat as e when e.message is "!rules" + whisper e.player "Read the server rules before building." +end on +``` + +The runtime checks declarations before loading. It examines handlers and functions even when those bodies do not run during loading. + +## Built-in capabilities + +| Capability | Operations | Additional prerequisite | +| --- | --- | --- | +| `chat.send` | `say`, `whisper` | Live chat session for delivery | +| `server.send` | `server` command statement | Live session and server permission | +| `mcc.run` | Internal command statement or expression | MCC's command dispatcher | +| `server.disconnect` | `disconnect` | An active session to leave | +| `inventory.read` | Inventory reads and recipe listing | Inventory tracking | +| `inventory.write` | Inventory changes and crafting | Inventory tracking and supported actions | +| `world.read` | Block, light, biome, and sign reads | Terrain tracking and loaded area | +| `world.search` | Block and sign searches | Terrain tracking and bounded search | +| `world.write` | Dig, place, use, and targeting reads | Terrain tracking and gameplay gates | +| `entity.read` | Entity reads and entity appearance events | Entity tracking | +| `entity.write` | Attack and interact | Entity tracking and supported actions | +| `movement` | Coordinate movement and following | Loaded movement data and action support | +| `dialog.read` | Dialog reads and dialog events | A supported server dialog | +| `dialog.write` | Dialog input and button actions | An active dialog | +| `fs.read` | File reads | Configured restricted data directory | +| `fs.write` | File writes | Configured restricted data directory | +| `net.fetch` | HTTP calls | HTTPS URL and destination allowlist | + +Plugins can provide additional names, such as `shop.calculate`. Read that plugin's documentation for its meaning. + +A declaration permits script use. It does not enable tracking, connect MCC, create a missing plugin, or grant server permissions. + +`econ.read` is a reserved known capability. Its presence does not supply an economy service by itself. + +## Required and optional providers + +Use `# needs:` when the script cannot perform its purpose without a provider. Loading must fail when a required integration is unavailable. + +Use `# wants:` when a missing integration has a useful fallback. Catch the call's failure and show a clear result. + +```beacon +# beacon 1 +# wants: shop.calculate +extern subtotal from "shop-tools" +try + show subtotal(3, 4) +catch err + show "Pricing is unavailable: {err.message}" +end try +``` + +Offline lint reports a warning until the provider exists. Do not remove a valid declaration just to hide that warning. + +## Runtime limits + +| Limit | Current behavior | +| --- | --- | +| Execution fuel | 100,000 units per dispatch. Function calls, loop work, and host actions spend fuel. | +| Wall-clock budget | Five seconds per dispatch, with scheduler-aware handling for yielding work. | +| Call depth | At most 256 nested calls. | +| Shared chat allowance | Eight messages per ten seconds across scripts in one runtime. Excess messages queue. | +| World action allowance | Eight mutations per ten seconds per script. Refusals report a retry delay. | +| Minimum task wait | 100 milliseconds. | +| File size | At most 1 MiB per restricted file. | +| Import/call lint closure | At most 32 files in one lint closure. | +| JSON nesting | At most 32 levels. | +| World search | Radius at most 32 blocks, at most 64 results. | +| Entity search | Radius at most 128 blocks, at most 64 result rows. | + +Fuel exhaustion is not a normal recoverable game error. Keep calculations bounded instead of attempting an endless retry. + +A queued chat request can outlive the event that created it. Limit repeated triggers before they create large amounts of work. + +## Trust and external input + +Only run scripts and plugins from sources you trust. A capability declaration describes operations. It is not a general isolation boundary for arbitrary C# plugin code. + +A chat name is input, not proof of administrative authority. Add an explicit authorization rule before a script accepts remote management commands. + +1. Use a server that you control for action tests. +2. Start with read-only behavior. +3. Add one action at a time. +4. Check the observed server result. +5. Catch session changes and missing targets. + +[State and integrations](state-and-integrations.md) explains restricted files, network allowlists, and provider lifetimes. diff --git a/docs/beacon/commands.md b/docs/beacon/commands.md new file mode 100644 index 0000000000..2c7bfdd30d --- /dev/null +++ b/docs/beacon/commands.md @@ -0,0 +1,118 @@ +# Beacon command reference + +MCC has two Beacon command surfaces. Terminal commands run once and exit. `/scripts` commands operate inside a running MCC client. + +These examples use the default internal command prefix, `/`. Run terminal commands from the application directory. Use full script paths when possible. + +## Terminal commands + +```text +Mcc.Cli lint [--format text|json] [--target-lib N] [--strict] [--fix] +Mcc.Cli run [--seed N] [--tick S] [--format text|json] +Mcc.Cli format [--check] +``` + +All three commands also accept `--stdin` and `--stdin-name `. `--stdin` reads piped source instead of files. + +| Option | Applies to | Meaning | +| --- | --- | --- | +| `--format text` | lint, run | Print a readable report. This is the default. | +| `--format json` | lint, run | Print machine-readable diagnostics and results. | +| `--target-lib N` | lint | Check against an explicit library version. The current library version is `2`. The source header remains `# beacon 1`. | +| `--strict` | lint | Treat unresolved providers and unverifiable cross-script/plugin calls as errors. | +| `--fix` | lint | Apply supported corrections to files. Review the resulting diff. | +| `--seed N` | run | Choose an integer random seed. The default is `1234`. | +| `--tick S` | run | Advance virtual time once after loading. Default: `0` seconds. | +| `--check` | format | Report changes without writing files. | +| `--stdin` | all | Read source from standard input instead of files. | +| `--stdin-name name.bcn` | all | Set the source name used in reports. | + +A one-shot command runs before normal configuration loading. It does not create a login session or generate a configuration directory. + +A `run` command can load event handlers, but it does not deliver Minecraft events. Reads use the offline host's empty observations. + +```sh +./Mcc.Cli lint /full/path/total.bcn --strict +./Mcc.Cli run /full/path/total.bcn --seed 42 --format json +./Mcc.Cli run /full/path/timers.bcn --tick 60 +./Mcc.Cli format /full/path/total.bcn --check +``` + +To pass piped source on a POSIX shell: + +```sh +printf '%s\n' '# beacon 1' 'show 2 + 3' | ./Mcc.Cli run --stdin --stdin-name calculation.bcn +``` + +### Exit codes + +| Code | Meaning | +| --- | --- | +| `0` | The operation succeeded. Warnings do not fail normal lint. Strict lint can escalate provider warnings to errors. | +| `1` | A script failed, lint found errors, or `format --check` found a change. | +| `2` | Arguments were invalid or a file could not be read or written. | + +Normal `format` rewrites files. `format --stdin` returns formatted source on standard output. It does not rewrite a file. + +## Commands inside MCC + +Type these commands at the MCC input prompt. Do not enter them as operating-system commands. + +- `/scripts`, `/scripts list`: List running IDs and mute state. Example: `/scripts list`. +- `/scripts run [--trace]`: Load source and register its handlers. Example: `/scripts run welcome --trace`. +- `/scripts stop `: Stop one script or all scripts. Example: `/scripts stop all`. +- `/scripts reload [id]`: Reload one file, or all running files. Example: `/scripts reload welcome`. +- `/scripts lint [options]`: Check source with the shared lint engine. Example: `/scripts lint welcome --format json`. +- `/scripts new